shithub: sce

Download patch

ref: 3a7a70853c38b79291760a4a0b923d1964139c90
parent: be4306b3a29b736001c2aad5326837be44e3f1cc
author: qwx <qwx@sciops.net>
date: Thu Dec 2 15:35:07 EST 2021

move: avoid issuing a command to move to itself

forced to do it at multiple places:
- when issuing a mouse command
- when receiving a command to move
- when initiating pathfinding if goal was set to itself
and as a sanity check

the original tries to move anyway, but it wouldn't
work with our system

--- a/com.c
+++ b/com.c
@@ -115,6 +115,10 @@
 	&click.x, &click.y,
 	&reqt.idx, &reqt.uuid, &reqt.x, &reqt.y)) < 0)
 		return -1;
+	if(eqpt(reqm.Point, reqt.Point) || eqpt(reqm.Point, click)){
+		dprint("reqmovenear: %P [%#ux,%ld] → %P [%#ux,%ld] (%P), not moving to itself\n", reqm.Point, reqm.idx, reqm.uuid, reqt.Point, reqt.idx, reqt.uuid, click);
+		return n;
+	}
 	if((mo = mobjfromreq(&reqm)) == nil)
 		return -1;
 	if((mo->o->f & Fimmutable) || mo->o->speed == 0.0){
@@ -143,6 +147,10 @@
 	&reqm.idx, &reqm.uuid, &reqm.x, &reqm.y,
 	&tgt.x, &tgt.y)) < 0)
 		return -1;
+	if(eqpt(reqm.Point, tgt)){
+		dprint("reqmove: %P [%#ux,%ld] → %P, not moving to itself\n", reqm.Point, reqm.idx, reqm.uuid, tgt);
+		return n;
+	}
 	if((mo = mobjfromreq(&reqm)) == nil)
 		return -1;
 	if((mo->o->f & Fimmutable) || mo->o->speed == 0.0){
--- a/drw.c
+++ b/drw.c
@@ -80,15 +80,15 @@
 	vp = divpt(subpt(p, selr.min), scale);
 	i = fbvis[vp.y * fbw + vp.x];
 	mo = i == -1 ? nil : visbuf[i];
-	if(mo == it){
-		dprint("doaction: %M targeting itself\n", it);
-		return;
-	}
 	p = divpt(addpt(subpt(p, selr.min), pan), scale);
 	p.x /= Nodewidth;
 	p.y /= Nodeheight;
 	if(nodemapwidth - p.x < it->o->w || nodemapheight - p.y < it->o->h){
 		dprint("doaction: %M destination beyond map edge\n", it);
+		return;
+	}
+	if(mo == it || eqpt(it->Point, p)){
+		dprint("doaction: %M targeting itself\n", it);
 		return;
 	}
 	if(clearcmds)
--- a/path.c
+++ b/path.c
@@ -555,7 +555,11 @@
 {
 	Node *a, *b, *n;
 
-	dprint("%M findpath to %d,%d\n", mo, p.x, p.y);
+	dprint("%M findpath to %P\n", mo, p);
+	if(eqpt(p, mo->Point)){
+		werrstr("not moving to itself");
+		return -1;
+	}
 	clearpath();
 	a = nodemap + mo->y * nodemapwidth + mo->x;
 	a->x = mo->x;
@@ -576,7 +580,7 @@
 			markmobj(mo, 1);
 			return -1;
 		}
-		dprint("%M nearest: %#p %d,%d dist %f\n", mo, n, n->x, n->y, n->h);
+		dprint("%M nearest: %#p %P dist %f\n", mo, n, n->Point, n->h);
 		b = nearestnonjump(n, b, mo);
 		if(b == a){
 			werrstr("a∗: really can't move");
--- a/sim.move.c
+++ b/sim.move.c
@@ -31,6 +31,8 @@
 	dx = p.x - mo->px;
 	dy = p.y - mo->py;
 	d = sqrt(dx * dx + dy * dy);
+	if(d == 0.0)
+		sysfatal("facegoal: %M → %P: moving in place, shouldn't happen", mo, p);
 	vx = dx / d;
 	vy = dy / d;
 	/* angle in radians [0;2π[ with 0 facing north */
@@ -336,14 +338,13 @@
 	c = mo->cmds;
 	c->cleanupfn = cleanup;
 	goal = c->goal;
-	/* FIXME: shitty */
+	setgoal(&goal, mo, c->target1);
+	if(repath(goal, mo) < 0)
+		return -1;
 	if(eqpt(goal, mo->Point)){
 		mo->state = OSskymaybe;
 		return 0;
 	}
-	setgoal(&goal, mo, c->target1);	/* FIXME: target[12] might be a problem for returns */
-	if(repath(goal, mo) < 0)
-		return -1;
 	c->stepfn = step;
 	mo->state = OSmove;
 	return 0;