More tile placing fixes.
This commit is contained in:
parent
98f5d97825
commit
c30edd71a0
1 changed files with 71 additions and 19 deletions
|
@ -231,7 +231,6 @@ local int TileFromQuad(unsigned fixed, unsigned quad)
|
|||
int type2;
|
||||
int base;
|
||||
int direction;
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
||||
char table[16] = { 0, 7, 3, 11, 1, 9, 5, 13, 0, 8, 4, 12, 2, 10, 6, 0 };
|
||||
|
||||
|
@ -259,9 +258,9 @@ local int TileFromQuad(unsigned fixed, unsigned quad)
|
|||
fixed >>= 8;
|
||||
}
|
||||
if (type1 == type2) { // Oooh a solid tile.
|
||||
find_solid:
|
||||
find_solid:
|
||||
//
|
||||
// Find the solid tile
|
||||
// Find the solid tile
|
||||
//
|
||||
for (i = 0; i < TheMap.Tileset->NumTiles;) {
|
||||
if (type1 == TheMap.Tileset->BasicNameTable[i]
|
||||
|
@ -275,9 +274,61 @@ find_solid:
|
|||
i += 256;
|
||||
}
|
||||
}
|
||||
DebugCheck( i >= TheMap.Tileset->NumTiles );
|
||||
DebugCheck(i >= TheMap.Tileset->NumTiles);
|
||||
return i;
|
||||
}
|
||||
} else {
|
||||
char *marks;
|
||||
|
||||
marks = alloca(TheMap.Tileset->NumNames);
|
||||
memset(marks, 0, TheMap.Tileset->NumNames);
|
||||
marks[type1] = type1;
|
||||
marks[type2] = type2;
|
||||
|
||||
//
|
||||
// What fixed tile-type should replace the non useable tile-types.
|
||||
// FIXME: write a loop.
|
||||
//
|
||||
fixed = (quad >> 0) & 0xFF;
|
||||
if (fixed != type1 && fixed != type2) {
|
||||
quad &= 0xFFFFFF00;
|
||||
if (FindTilePath(type1, fixed, 0, marks, &i)
|
||||
< FindTilePath(type2, fixed, 0, marks, &i)) {
|
||||
quad |= type1 << 0;
|
||||
} else {
|
||||
quad |= type2 << 0;
|
||||
}
|
||||
}
|
||||
fixed = (quad >> 8) & 0xFF;
|
||||
if (fixed != type1 && fixed != type2) {
|
||||
quad &= 0xFFFF00FF;
|
||||
if (FindTilePath(type1, fixed, 0, marks, &i)
|
||||
< FindTilePath(type2, fixed, 0, marks, &i)) {
|
||||
quad |= type1 << 8;
|
||||
} else {
|
||||
quad |= type2 << 8;
|
||||
}
|
||||
}
|
||||
fixed = (quad >> 16) & 0xFF;
|
||||
if (fixed != type1 && fixed != type2) {
|
||||
quad &= 0xFF00FFFF;
|
||||
if (FindTilePath(type1, fixed, 0, marks, &i)
|
||||
< FindTilePath(type2, fixed, 0, marks, &i)) {
|
||||
quad |= type1 << 16;
|
||||
} else {
|
||||
quad |= type2 << 16;
|
||||
}
|
||||
}
|
||||
fixed = (quad >> 24) & 0xFF;
|
||||
if (fixed != type1 && fixed != type2) {
|
||||
quad &= 0x00FFFFFF;
|
||||
if (FindTilePath(type1, fixed, 0, marks, &i)
|
||||
< FindTilePath(type2, fixed, 0, marks, &i)) {
|
||||
quad |= type1 << 24;
|
||||
} else {
|
||||
quad |= type2 << 24;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DebugLevel3Fn("type1 %x type2 %x\n" _C_ type1 _C_ type2);
|
||||
|
@ -307,20 +358,20 @@ find_solid:
|
|||
}
|
||||
|
||||
if (i >= TheMap.Tileset->NumTiles) {
|
||||
char* marks;
|
||||
char *marks;
|
||||
|
||||
DebugLevel3Fn("No good mix found\n");
|
||||
DebugLevel0Fn("No good mix found\n");
|
||||
//
|
||||
// Find the best tile path.
|
||||
// Find the best tile path.
|
||||
//
|
||||
marks=alloca(TheMap.Tileset->NumNames);
|
||||
memset(marks,0,TheMap.Tileset->NumNames);
|
||||
marks[type1]=type1;
|
||||
if (FindTilePath(type1,type2,0,marks,&i) == INT_MAX) {
|
||||
marks = alloca(TheMap.Tileset->NumNames);
|
||||
memset(marks, 0, TheMap.Tileset->NumNames);
|
||||
marks[type1] = type1;
|
||||
if (FindTilePath(type1, type2, 0, marks, &i) == INT_MAX) {
|
||||
DebugLevel0Fn("Huch, no mix found!!!!!!!!!!!\n");
|
||||
goto find_solid;
|
||||
}
|
||||
if ( type1 == TheMap.Tileset->MixedNameTable[i]) {
|
||||
if (type1 == TheMap.Tileset->MixedNameTable[i]) {
|
||||
// Other mixed
|
||||
type1 ^= type2;
|
||||
type2 ^= type1;
|
||||
|
@ -344,7 +395,8 @@ find_solid:
|
|||
direction |= 1;
|
||||
}
|
||||
|
||||
DebugLevel3Fn("%08x %x %x %d\n" _C_ quad _C_ type1 _C_ type2 _C_ direction);
|
||||
DebugLevel3Fn("%08x %x %x %d\n" _C_ quad _C_ type1 _C_ type2 _C_
|
||||
direction);
|
||||
|
||||
return base | (table[direction] << 4);
|
||||
}
|
||||
|
@ -420,7 +472,7 @@ local void EditorTileChanged2(int x, int y, int d)
|
|||
MapField* mf;
|
||||
|
||||
quad = QuadFromTile(x, y);
|
||||
DebugLevel3Fn("%d,%d %08x %d\n" _C_ x _C_ y _C_ quad _C_
|
||||
DebugLevel2Fn("%d,%d %08x %d\n" _C_ x _C_ y _C_ quad _C_
|
||||
TheMap.Fields[y * TheMap.Width + x].Tile);
|
||||
|
||||
//
|
||||
|
@ -452,9 +504,9 @@ local void EditorTileChanged2(int x, int y, int d)
|
|||
q2 = QuadFromTile(x, y - 1);
|
||||
u = (q2 & TH_QUAD_M) | ((quad >> 16) & BH_QUAD_M);
|
||||
if (u != q2) {
|
||||
DebugLevel3Fn("U+ %08x -> %08x\n" _C_ q2 _C_ u);
|
||||
DebugLevel2Fn("U+ %08x -> %08x\n" _C_ q2 _C_ u);
|
||||
tile = TileFromQuad(u & BH_QUAD_M, u);
|
||||
DebugLevel3Fn("= %08x\n" _C_ tile);
|
||||
DebugLevel2Fn("= %08x\n" _C_ tile);
|
||||
EditorChangeTile(x, y - 1, tile, d&~D_DOWN);
|
||||
}
|
||||
}
|
||||
|
@ -465,7 +517,7 @@ local void EditorTileChanged2(int x, int y, int d)
|
|||
q2 = QuadFromTile(x, y + 1);
|
||||
u = (q2 & BH_QUAD_M) | ((quad << 16) & TH_QUAD_M);
|
||||
if (u != q2) {
|
||||
DebugLevel3Fn("D+ %08x -> %08x\n" _C_ q2 _C_ u);
|
||||
DebugLevel2Fn("D+ %08x -> %08x\n" _C_ q2 _C_ u);
|
||||
tile = TileFromQuad(u & TH_QUAD_M, u);
|
||||
EditorChangeTile(x, y + 1, tile, d&~D_UP);
|
||||
}
|
||||
|
@ -477,7 +529,7 @@ local void EditorTileChanged2(int x, int y, int d)
|
|||
q2 = QuadFromTile(x - 1, y);
|
||||
u = (q2 & LH_QUAD_M) | ((quad >> 8) & RH_QUAD_M);
|
||||
if (u != q2) {
|
||||
DebugLevel3Fn("L+ %08x -> %08x\n" _C_ q2 _C_ u);
|
||||
DebugLevel2Fn("L+ %08x -> %08x\n" _C_ q2 _C_ u);
|
||||
tile = TileFromQuad(u & RH_QUAD_M, u);
|
||||
EditorChangeTile(x - 1, y, tile, d&~D_RIGHT);
|
||||
}
|
||||
|
@ -489,7 +541,7 @@ local void EditorTileChanged2(int x, int y, int d)
|
|||
q2 = QuadFromTile(x + 1, y);
|
||||
u = (q2 & RH_QUAD_M) | ((quad << 8) & LH_QUAD_M);
|
||||
if (u != q2) {
|
||||
DebugLevel3Fn("R+ %08x -> %08x\n" _C_ q2 _C_ u);
|
||||
DebugLevel2Fn("R+ %08x -> %08x\n" _C_ q2 _C_ u);
|
||||
tile = TileFromQuad(u & LH_QUAD_M, u);
|
||||
EditorChangeTile(x + 1, y, tile, d&~D_LEFT);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue