After analising this assert (see below) I think this is the problem:
The droid is in status MOVEPOINTTOPOINT, but it's target X and target Y
are it's current position.
This results in move.c:3804 moveGetDirection(psDroid, &tx,&ty); to set
tx and ty to NAN
this results in tangle = vectorToAngle(tx,ty); to return NAN and thus
moveDir is NAN

This NAN moveDir gets turned into an angle of -2147483648.000000

A possible solution (in the patch) would be to check the coordinates to
be different from it's current position, but I guess someone with more
insight in the move-code should be able to come up with a more elegant
solution.

Hylke

========================

error   : moveCalcTurn: target out of range -2147483648.000000
error   : Assert in Warzone: move.c:953 : moveCalcTurn (target <
MAKEFRACT(360) && target >= MAKEFRACT(0)), last script event: '22
(CALL_OBJ_SEEN)'
warzone2100: move.c:953: moveCalcTurn: Assertion `target <
((FRACT)(360)) && target >= ((FRACT)(0))' failed.

Program received signal SIGABRT, Aborted.
[Switching to Thread -1225992464 (LWP 18786)]
0xb7fe0410 in ?? ()
(gdb) bt
#0  0xb7fe0410 in ?? ()
#1  0xbfa34a38 in ?? ()
#2  0x00000006 in ?? ()
#3  0x00004962 in ?? ()
#4  0xb7c1cd60 in raise () from /lib/i686/cmov/libc.so.6
#5  0xb7c1e5b1 in abort () from /lib/i686/cmov/libc.so.6
#6  0xb7c1642b in __assert_fail () from /lib/i686/cmov/libc.so.6
#7  0x080c45aa in moveCalcTurn (pCurr=0xbfa34c10,
target=-2.14748365e+09, rate=250) at move.c:952
#8  0x080c7133 in moveUpdateDroidDirection (psDroid=0x956d740,
pSpeed=0xbfa34c74, direction=-2147483648, iSpinAngle=45,
    iSpinSpeed=500, iTurnSpeed=250, pDroidDir=0xbfa34c4c,
pfSpeed=0xbfa34c50) at move.c:2409
#9  0x080c7f7b in moveUpdatePersonModel (psDroid=0x956d740, speed=178,
direction=-2147483648) at move.c:2796
#10 0x080c9123 in moveUpdateCyborgModel (psDroid=0x956d740,
moveSpeed=178, moveDir=-2147483648, oldStatus=4 '\004')
    at move.c:3203
#11 0x080ca48b in moveUpdateDroid (psDroid=0x956d740) at move.c:3977
#12 0x08077dd3 in droidUpdate (psDroid=0x956d740) at droid.c:1315
#13 0x080bac02 in gameLoop () at loop.c:297
#14 0x080bcdd9 in main (argc=1, argv=0xbfa34f44) at main.c:693

(gdb) f 11
#11 0x080ca48b in moveUpdateDroid (psDroid=0x956d740) at move.c:3977
3977                    moveUpdateCyborgModel(psDroid, moveSpeed,
moveDir, oldStatus);

(gdb) p moveDir
$1 = nan(0x400000)

(gdb) p psDroid->sMove.Status
$5 = 4 '\004'

(gdb) p psDroid->sMove.targetX
$26 = 2651
(gdb) p psDroid->x
$27 = 2651
(gdb) p psDroid->sMove.targetY
$28 = 16245
(gdb) p psDroid->y
$29 = 16245
Index: /home/hylke/data/warzone/src/move.c
===================================================================
--- /home/hylke/data/warzone/src/move.c	(revision 1225)
+++ /home/hylke/data/warzone/src/move.c	(working copy)
@@ -3801,22 +3801,29 @@
 //		if ( psDroid->droidType == DROID_TRANSPORTER ) DebugP=TRUE;
 
 		// Calculate a target vector
-		moveGetDirection(psDroid, &tx,&ty);
+		if (psDroid->sMove.targetX == psDroid->x && psDroid->sMove.targetY == psDroid->y) {
+			printf("MOVEPOINTTOPOINT or MOVEPAUSE with src=target: psD->sMove.targetX=%i, psD->x=%i, psD->sMove.targetY=%i, psD->y=%i\n", 
+				psDroid->sMove.targetX, 
+				psDroid->x, 
+				psDroid->sMove.targetY, 
+				psDroid->y);
+		} else {
+			moveGetDirection(psDroid, &tx,&ty);
 
 
 		// Turn the droid if necessary
 		// calculate the difference in the angles
 //		dangle = (float) psDroid->direction;
-		tangle = vectorToAngle(tx,ty);
+			tangle = vectorToAngle(tx,ty);
 
 
 
 
-		moveSpeed = moveCalcDroidSpeed(psDroid);
+			moveSpeed = moveCalcDroidSpeed(psDroid);
 
-		moveDir = tangle;
+			moveDir = tangle;
+		}
 
-
 //if ( psDroid->droidType == DROID_TRANSPORTER )
 //{
 //			DBPRINTF(("dir %d,%d ($%x=%d)\n",tx,ty,tangle,moveDir));
_______________________________________________
Warzone-dev mailing list
Warzone-dev@gna.org
https://mail.gna.org/listinfo/warzone-dev

Reply via email to