ref: 12a568ab18771c9dd4d6aa47365ae2c4530b0c55
parent: 651a9debe5f055dfc10b59197896c43398d46560
author: qwx <qwx@sciops.net>
date: Thu Dec 2 21:51:39 EST 2021
path: use Points for distances and move nodemap related stuff to path.c
--- a/drw.c
+++ b/drw.c
@@ -289,46 +289,6 @@
}
}
-static void
-drawmap(Rectangle r)
-{
- int x, y;
- u64int *row, v, m;
- Point *p;
- Path *pp;
- Node *n;
- Mobj *mo;
-
- r = Rpt(mulpt(r.min, Node2Tile), mulpt(r.max, Node2Tile));
- for(y=r.min.y, n=nodemap+y*nodemapwidth+r.min.x; y<r.max.y; y++){
- x = r.min.x;
- row = baddr(x, y);
- v = *row++;
- m = 1ULL << 63 - (x & Bmask);
- for(; x<r.max.x; x++, n++, m>>=1){
- if(m == 0){
- v = *row++;
- m = 1ULL << 63;
- }
- if(v & m)
- compose(x, y, 0xff0000);
- if(n->closed)
- compose(x, y, 0x000077);
- else if(n->open)
- compose(x, y, 0x007777);
- }
- n += nodemapwidth - (r.max.x - r.min.x);
- }
- if((mo = selected[0]) != nil){
- pp = &mo->path;
- if(pp->step == nil)
- return;
- for(p=pp->step; p>=pp->moves.p; p--)
- compose(p->x / Nodewidth, p->y / Nodeheight, 0x00ff00);
- compose(pp->target.x, pp->target.y, 0x00ff77);
- }
-}
-
static Pic *
frm(Mobj *mo, int type)
{
@@ -467,7 +427,7 @@
}
drawmobjs();
if(debugmap)
- drawmap(r);
+ drawnodemap(r, selected[0]);
drawhud();
}
--- a/fns.h
+++ b/fns.h
@@ -43,7 +43,7 @@
void drawfb(void);
void initimg(void);
void initfs(void);
-double octdist(Node*, Node*);
+double octdist(Point, Point);
void setgoal(Point*, Mobj*, Mobj*);
Mobj* unitat(int, int);
int isblocked(Point, Obj*);
@@ -50,6 +50,7 @@
void markmobj(Mobj*, int);
int isnextto(Mobj*, Mobj*);
int findpath(Point, Mobj*);
+void drawnodemap(Rectangle, Mobj*);
Mobj* mapspawn(Point, Obj*);
void initmap(void);
Mobj* derefmobj(int, long);
--- a/path.c
+++ b/path.c
@@ -58,6 +58,45 @@
static Pairheap *queue;
static Node *nearest;
+void
+drawnodemap(Rectangle r, Mobj *sel)
+{
+ int x, y;
+ u64int *row, v, m;
+ Point *p;
+ Path *pp;
+ Node *n;
+
+ r = Rpt(mulpt(r.min, Node2Tile), mulpt(r.max, Node2Tile));
+ for(y=r.min.y, n=nodemap+y*nodemapwidth+r.min.x; y<r.max.y; y++){
+ x = r.min.x;
+ row = baddr(x, y);
+ v = *row++;
+ m = 1ULL << 63 - (x & Bmask);
+ for(; x<r.max.x; x++, n++, m>>=1){
+ if(m == 0){
+ v = *row++;
+ m = 1ULL << 63;
+ }
+ if(v & m)
+ compose(x, y, 0xff0000);
+ if(n->closed)
+ compose(x, y, 0x000077);
+ else if(n->open)
+ compose(x, y, 0x007777);
+ }
+ n += nodemapwidth - (r.max.x - r.min.x);
+ }
+ if(sel != nil){
+ pp = &sel->path;
+ if(pp->step == nil)
+ return;
+ for(p=pp->step; p>=pp->moves.p; p--)
+ compose(p->x / Nodewidth, p->y / Nodeheight, 0x00ff00);
+ compose(pp->target.x, pp->target.y, 0x00ff77);
+ }
+}
+
static void
clearpath(void)
{
@@ -131,13 +170,13 @@
}
double
-octdist(Node *a, Node *b)
+octdist(Point a, Point b)
{
int dx, dy;
- dx = abs(a->x - b->x);
- dy = abs(a->y - b->y);
- return 1 * (dx + dy) + (SQRT2 - 2 * 1) * min(dx, dy);
+ dx = abs(a.x - b.x);
+ dy = abs(a.y - b.y);
+ return 1 * (dx + dy) + min(dx, dy) * (SQRT2 - 2 * 1);
}
/* FIXME: horrendous. use fucking tables you moron */
@@ -369,7 +408,7 @@
return nil;
}
x = a;
- a->h = octdist(a, b);
+ a->h = octdist(a->Point, b->Point);
pushqueue(a, &queue);
while((pn = popqueue(&queue)) != nil){
x = pn->n;
@@ -386,7 +425,7 @@
if(!n->open){
n->from = x;
n->g = g;
- n->h = octdist(n, b);
+ n->h = octdist(n->Point, b->Point);
n->len = x->len + n->Δlen;
n->open = 1;
n->step = x->step + 1;
@@ -470,7 +509,7 @@
m = nodemap + y * nodemapwidth + x;
m->x = x;
m->y = y;
- m->h = octdist(m, b);
+ m->h = octdist(m->Point, b->Point);
if(min->h < m->h)
break;
min = m;
@@ -510,7 +549,7 @@
for(e=x+block->o->w; x<e; x++, n1++, n2++){
n1->x = x;
n1->y = y;
- Δ´ = octdist(pm, n1);
+ Δ´ = octdist(pm->Point, n1->Point);
if(Δ´ < Δ){
Δ = Δ´;
p->x = x;
@@ -518,7 +557,7 @@
}
n2->x = x;
n2->y = y + block->o->h - 1;
- Δ´ = octdist(pm, n2);
+ Δ´ = octdist(pm->Point, n2->Point);
if(Δ´ < Δ){
Δ = Δ´;
p->x = x;
@@ -532,7 +571,7 @@
for(e=y+block->o->h-2; y<e; y++, n1+=nodemapwidth, n2+=nodemapwidth){
n1->x = x;
n1->y = y;
- Δ´ = octdist(pm, n1);
+ Δ´ = octdist(pm->Point, n1->Point);
if(Δ´ < Δ){
Δ = Δ´;
p->x = x;
@@ -540,7 +579,7 @@
}
n2->x = x + block->o->w - 1;
n2->y = y;
- Δ´ = octdist(pm, n2);
+ Δ´ = octdist(pm->Point, n2->Point);
if(Δ´ < Δ){
Δ = Δ´;
p->x = x + block->o->w - 1;
--- a/sim.return.c
+++ b/sim.return.c
@@ -49,7 +49,6 @@
double d, d´;
Team *t;
Mobj *wo, *w, **wp, **we;
- Node *a, *b;
t = teams + mo->team;
if(t->drops.n < 1){
@@ -56,16 +55,10 @@
werrstr("no drops");
return nil;
}
- a = nodemap + mo->y * nodemapwidth + mo->x;
- a->x = mo->x;
- a->y = mo->y;
d = nodemapwidth * nodemapheight;
for(wp=t->drops.p, we=wp+t->drops.n, wo=nil; wp<we; wp++){
w = *wp;
- b = nodemap + w->y * nodemapwidth + w->x;
- b->x = w->x;
- b->y = w->y;
- d´ = octdist(a, b);
+ d´ = octdist(mo->Point, w->Point);
if(d´ < d){
wo = w;
d = d´;