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