mirror of https://github.com/OpenRCT2/OpenRCT2.git
Validate side tunnel calls
This commit is contained in:
parent
a904391a6d
commit
95f68a3e6a
|
@ -211,6 +211,21 @@ namespace Intercept2
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void getTunnelCallReferencePattern(TunnelCall tunnelCalls[4][4], TunnelCall (*out)[4])
|
||||||
|
{
|
||||||
|
for (int side = 0; side < 4; ++side) {
|
||||||
|
for (int direction = 0; direction < 4; ++direction) {
|
||||||
|
if (tunnelCalls[direction][side].call == TUNNELCALL_SKIPPED) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*out)[side].call = tunnelCalls[direction][side].call;
|
||||||
|
(*out)[side].type = tunnelCalls[direction][side].type;
|
||||||
|
(*out)[side].height = tunnelCalls[direction][side].height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static utf8string getTunnelEdgeString(TunnelCall edge) {
|
static utf8string getTunnelEdgeString(TunnelCall edge) {
|
||||||
utf8string out = new utf8[5];
|
utf8string out = new utf8[5];
|
||||||
|
|
||||||
|
@ -224,7 +239,7 @@ namespace Intercept2
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TUNNELCALL_CALL:
|
case TUNNELCALL_CALL:
|
||||||
sprintf(out, " %d ", edge.height);
|
sprintf(out, " %d,%X ", edge.height, edge.type);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,6 +437,20 @@ namespace Intercept2
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool tunnelPatternsMatch(TunnelCall expected[4], TunnelCall actual[4])
|
||||||
|
{
|
||||||
|
for (int side = 0; side < 4; side++) {
|
||||||
|
if (expected[side].call != actual[side].call) return false;
|
||||||
|
|
||||||
|
if (expected[side].call == TUNNELCALL_CALL) {
|
||||||
|
if (expected[side].type != actual[side].type) return false;
|
||||||
|
if (expected[side].height != actual[side].height) return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool testTunnels(uint8 rideType, uint8 trackType)
|
static bool testTunnels(uint8 rideType, uint8 trackType)
|
||||||
{
|
{
|
||||||
uint8 rideIndex = 0;
|
uint8 rideIndex = 0;
|
||||||
|
@ -489,7 +518,6 @@ namespace Intercept2
|
||||||
for (int i = 0; i < 4; ++i) {
|
for (int i = 0; i < 4; ++i) {
|
||||||
tileTunnelCalls[direction][i].call = TUNNELCALL_SKIPPED;
|
tileTunnelCalls[direction][i].call = TUNNELCALL_SKIPPED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gRightTunnelCount == 0) {
|
if (gRightTunnelCount == 0) {
|
||||||
tileTunnelCalls[direction][rightIndex].call = TUNNELCALL_NONE;
|
tileTunnelCalls[direction][rightIndex].call = TUNNELCALL_NONE;
|
||||||
} else if (gRightTunnelCount == 1) {
|
} else if (gRightTunnelCount == 1) {
|
||||||
|
@ -513,11 +541,72 @@ namespace Intercept2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!tunnelCallsLineUp(tileTunnelCalls)) {
|
TunnelCall newTileTunnelCalls[4][4];
|
||||||
printf("Tunnel calls don\'t line up. Skipping tunnel validation [trackSequence:%d].\n", trackSequence);
|
for (int direction = 0; direction < 4; direction++) {
|
||||||
printTunnelCalls(tileTunnelCalls);
|
gLeftTunnelCount = 0;
|
||||||
|
gRightTunnelCount = 0;
|
||||||
|
|
||||||
|
TRACK_PAINT_FUNCTION newPaintFunction = newPaintGetter(trackType, direction);
|
||||||
|
newPaintFunction(rideIndex, trackSequence, direction, height, &mapElement);
|
||||||
|
|
||||||
|
uint8 rightIndex = (4 - direction) % 4;
|
||||||
|
uint8 leftIndex = (rightIndex + 1) % 4;
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
newTileTunnelCalls[direction][i].call = TUNNELCALL_SKIPPED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gRightTunnelCount == 0) {
|
||||||
|
newTileTunnelCalls[direction][rightIndex].call = TUNNELCALL_NONE;
|
||||||
|
} else if (gRightTunnelCount == 1) {
|
||||||
|
newTileTunnelCalls[direction][rightIndex].call = TUNNELCALL_CALL;
|
||||||
|
newTileTunnelCalls[direction][rightIndex].height = gRightTunnels[0].height;
|
||||||
|
newTileTunnelCalls[direction][rightIndex].type = gRightTunnels[0].type;
|
||||||
|
} else {
|
||||||
|
printf("Multiple tunnels on one side aren't supported.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gLeftTunnelCount == 0) {
|
||||||
|
newTileTunnelCalls[direction][leftIndex].call = TUNNELCALL_NONE;
|
||||||
|
} else if (gLeftTunnelCount == 1) {
|
||||||
|
newTileTunnelCalls[direction][leftIndex].call = TUNNELCALL_CALL;
|
||||||
|
newTileTunnelCalls[direction][leftIndex].height = gLeftTunnels[0].height;
|
||||||
|
newTileTunnelCalls[direction][leftIndex].type = gLeftTunnels[0].type;
|
||||||
|
} else {
|
||||||
|
printf("Multiple tunnels on one side aren't supported.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tunnelCallsLineUp(newTileTunnelCalls)) {
|
||||||
|
printf("Decompiled tunnel calls don\'t line up. [trackSequence:%d].\n", trackSequence);
|
||||||
|
printTunnelCalls(newTileTunnelCalls);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!tunnelCallsLineUp(tileTunnelCalls)) {
|
||||||
|
printf("Original tunnel calls don\'t line up. Skipping tunnel validation [trackSequence:%d].\n", trackSequence);
|
||||||
|
printTunnelCalls(tileTunnelCalls);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
TunnelCall referencePattern[4];
|
||||||
|
getTunnelCallReferencePattern(tileTunnelCalls, &referencePattern);
|
||||||
|
|
||||||
|
TunnelCall actualPattern[4];
|
||||||
|
getTunnelCallReferencePattern(newTileTunnelCalls, &actualPattern);
|
||||||
|
|
||||||
|
if(!tunnelPatternsMatch(referencePattern, actualPattern)) {
|
||||||
|
printf("Tunnel calls don't match expected pattern. [trackSequence:%d]\n", trackSequence);
|
||||||
|
printf("expected:\n");
|
||||||
|
printTunnelCalls(tileTunnelCalls);
|
||||||
|
printf("actual:\n");
|
||||||
|
printTunnelCalls(newTileTunnelCalls);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue