akimbo bug fixed; some new bugs added
git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@4598 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
+91
-2
@@ -487,6 +487,94 @@ void newent(char *what, char *a1, char *a2, char *a3, char *a4)
|
||||
newentity(-1, sel.x, sel.y, (int)camera1->o.z, what, ATOI(a1), ATOI(a2), ATOI(a3), ATOI(a4));
|
||||
}
|
||||
|
||||
void movemap(int xo, int yo, int zo) // move whole map
|
||||
{
|
||||
EDITMP;
|
||||
if(!worldbordercheck(MINBORD + max(-xo, 0), MINBORD + max(xo, 0), MINBORD + max(-yo, 0), MINBORD + max(yo, 0), max(zo, 0), max(-zo, 0)))
|
||||
{
|
||||
conoutf("not enough space to move the map");
|
||||
return;
|
||||
}
|
||||
if(xo || yo)
|
||||
{
|
||||
block b = { max(-xo, 0), max(-yo, 0), ssize - abs(xo), ssize - abs(yo) }, *cp = blockcopy(b);
|
||||
cp->x = max(xo, 0);
|
||||
cp->y = max(yo, 0);
|
||||
blockpaste(*cp);
|
||||
freeblock(cp);
|
||||
}
|
||||
if(zo)
|
||||
{
|
||||
loop(x, ssize) loop(y, ssize)
|
||||
{
|
||||
S(x,y)->floor = max(-128, S(x,y)->floor + zo);
|
||||
S(x,y)->ceil = min(127, S(x,y)->ceil + zo);
|
||||
}
|
||||
hdr.waterlevel += zo;
|
||||
}
|
||||
loopv(ents)
|
||||
{
|
||||
ents[i].x += xo;
|
||||
ents[i].y += yo;
|
||||
ents[i].z += zo;
|
||||
if(OUTBORD(ents[i].x, ents[i].y)) ents[i].type = NOTUSED;
|
||||
}
|
||||
player1->o.x += xo;
|
||||
player1->o.y += yo;
|
||||
entinmap(player1);
|
||||
calclight();
|
||||
resetmap(false);
|
||||
}
|
||||
|
||||
void selfliprotate(int dir)
|
||||
{
|
||||
makeundo();
|
||||
block *org = blockcopy(sel);
|
||||
const sqr *q = (const sqr *)(org + 1);
|
||||
int x1 = sel.x, x2 = sel.x + sel.xs - 1, y1 = sel.y, y2 = sel.y + sel.ys - 1, x, y;
|
||||
switch(dir)
|
||||
{
|
||||
case 1: // 90 degree clockwise
|
||||
for(x = x2; x >= x1; x--) for(y = y1; y <= y2; y++) *S(x,y) = *q++;
|
||||
break;
|
||||
case 2: // 180 degree
|
||||
for(y = y2; y >= y1; y--) for(x = x2; x >= x1; x--) *S(x,y) = *q++;
|
||||
break;
|
||||
case 3: // 90 degree counterclockwise
|
||||
for(x = x1; x <= x2; x++) for(y = y2; y >= y1; y--) *S(x,y) = *q++;
|
||||
break;
|
||||
case 11: // flip x-axis
|
||||
for(y = y1; y <= y2; y++) for(x = x2; x >= x1; x--) *S(x,y) = *q++;
|
||||
break;
|
||||
case 12: // flip y-axis
|
||||
for(y = y2; y >= y1; y--) for(x = x1; x <= x2; x++) *S(x,y) = *q++;
|
||||
break;
|
||||
}
|
||||
remipmore(sel);
|
||||
freeblock(org);
|
||||
}
|
||||
|
||||
void selectionrotate(int dir)
|
||||
{
|
||||
EDITSELMP;
|
||||
dir %= 4;
|
||||
if(dir < 0) dir += 4;
|
||||
if(!dir) return;
|
||||
if(sel.xs != sel.ys) dir = 2;
|
||||
selfliprotate(dir);
|
||||
}
|
||||
|
||||
void selectionflip(char *axis)
|
||||
{
|
||||
EDITSELMP;
|
||||
if(!axis || !*axis) return;
|
||||
switch(toupper(*axis))
|
||||
{
|
||||
case 'X': selfliprotate(11); break;
|
||||
case 'Y': selfliprotate(12); break;
|
||||
}
|
||||
}
|
||||
|
||||
COMMANDN(select, selectpos, ARG_4INT);
|
||||
COMMAND(edittag, ARG_1INT);
|
||||
COMMAND(replace, ARG_NONE);
|
||||
@@ -500,5 +588,6 @@ COMMAND(paste, ARG_NONE);
|
||||
COMMAND(edittex, ARG_2INT);
|
||||
COMMAND(newent, ARG_5STR);
|
||||
COMMAND(perlin, ARG_3INT);
|
||||
|
||||
|
||||
COMMAND(movemap, ARG_3INT);
|
||||
COMMAND(selectionrotate, ARG_1INT);
|
||||
COMMAND(selectionflip, ARG_1STR);
|
||||
|
||||
Reference in New Issue
Block a user