OpenRCT2/test/testpaint/FunctionCall.cpp

187 lines
5.4 KiB
C++
Raw Normal View History

2016-10-16 19:22:02 +02:00
/*****************************************************************************
* Copyright (c) 2014-2018 OpenRCT2 developers
2016-10-16 19:22:02 +02:00
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
2016-10-16 19:22:02 +02:00
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
2016-10-16 19:22:02 +02:00
*****************************************************************************/
#include "FunctionCall.hpp"
2016-12-28 14:16:15 +01:00
#include <openrct2/sprites.h>
2016-12-19 18:45:08 +01:00
2018-06-22 22:29:03 +02:00
enum SpriteGroup
{
2016-10-16 19:22:02 +02:00
SPRITEGROUP_NONE,
2018-06-22 22:29:03 +02:00
SPRITEGROUP_FENCE_METAL_A, // 14568
SPRITEGROUP_FENCE_METAL_B, // 14990
2016-10-16 19:22:02 +02:00
SPRITEGROUP_FENCE_SPIRAL_SLIDE, // 20564
2018-06-22 22:29:03 +02:00
SPRITEGROUP_FLOOR_CORK, // 22134
SPRITEGROUP_FENCE_ROPE, // 22138
2016-10-16 19:22:02 +02:00
};
2018-06-22 22:29:03 +02:00
static void canonicalizeFunctionCall(function_call* call);
static SpriteGroup getSpriteGroup(uint16_t spriteIndex);
2016-10-16 19:22:02 +02:00
2018-06-22 22:29:03 +02:00
bool FunctionCall::AssertsEquals(std::vector<function_call> expected, std::vector<function_call> actual)
{
if (expected.size() != actual.size())
{
2016-10-16 21:15:40 +02:00
return false;
}
2018-06-22 22:29:03 +02:00
for (size_t i = 0; i < expected.size(); i++)
{
2016-10-16 21:15:40 +02:00
function_call expectedCall = expected[i];
function_call actualCall = actual[i];
2018-06-22 22:29:03 +02:00
if (!AssertsEquals(expectedCall, actualCall))
{
2016-10-16 21:15:40 +02:00
return false;
}
}
return true;
}
2018-06-22 22:29:03 +02:00
bool FunctionCall::AssertsEquals(function_call expected, function_call actual)
{
2016-10-16 19:22:02 +02:00
canonicalizeFunctionCall(&actual);
canonicalizeFunctionCall(&expected);
2018-06-22 22:29:03 +02:00
if (expected.function != actual.function)
{
2016-10-16 19:22:02 +02:00
return false;
}
uint8_t function = expected.function;
2016-10-16 19:22:02 +02:00
2018-06-22 22:29:03 +02:00
if (function == SUPPORTS_WOOD_A || function == SUPPORTS_WOOD_B)
{
if (expected.supports.type != actual.supports.type)
return false;
if (expected.supports.special != actual.supports.special)
return false;
if (expected.supports.height != actual.supports.height)
return false;
if (expected.supports.colour_flags != actual.supports.colour_flags)
return false;
2016-10-16 19:22:02 +02:00
2018-06-22 22:29:03 +02:00
if (expected.supports.special == 14 || expected.supports.special == 15 || expected.supports.special == 18
|| expected.supports.special == 19 || expected.supports.special == 22 || expected.supports.special == 23)
2016-12-19 18:45:08 +01:00
{
2018-06-22 22:29:03 +02:00
if (expected.supports.prepend_to != actual.supports.prepend_to)
return false;
2016-12-19 18:45:08 +01:00
}
2016-10-16 19:22:02 +02:00
return true;
}
2018-06-22 22:29:03 +02:00
if (function == SUPPORTS_METAL_A || function == SUPPORTS_METAL_B)
{
if (expected.supports.type != actual.supports.type)
return false;
if (expected.supports.segment != actual.supports.segment)
return false;
if (expected.supports.special != actual.supports.special)
return false;
if (expected.supports.height != actual.supports.height)
return false;
if (expected.supports.colour_flags != actual.supports.colour_flags)
return false;
2016-10-16 19:22:02 +02:00
return true;
}
2018-06-22 22:29:03 +02:00
if (function == SET_SEGMENT_HEIGHT)
{
2016-10-16 19:22:02 +02:00
return true;
}
2018-06-22 22:29:03 +02:00
if (expected.paint.image_id != actual.paint.image_id)
{
2016-10-16 19:22:02 +02:00
SpriteGroup expectedSpriteGroup = getSpriteGroup(expected.paint.image_id & 0x7FFFF);
SpriteGroup actualSpriteGroup = getSpriteGroup(actual.paint.image_id & 0x7FFFF);
2018-06-22 22:29:03 +02:00
if (expectedSpriteGroup != actualSpriteGroup)
return false;
2016-10-16 19:22:02 +02:00
2018-06-22 22:29:03 +02:00
if (expectedSpriteGroup == SPRITEGROUP_NONE)
return false;
2016-10-16 19:22:02 +02:00
return true;
}
2018-06-22 22:29:03 +02:00
if (expected.paint.offset.x != actual.paint.offset.x)
return false;
if (expected.paint.offset.y != actual.paint.offset.y)
return false;
if (expected.paint.bound_box_length.x != actual.paint.bound_box_length.x)
return false;
if (expected.paint.bound_box_length.y != actual.paint.bound_box_length.y)
return false;
if (expected.paint.bound_box_length.z != actual.paint.bound_box_length.z)
return false;
if (function != PAINT_98196C)
{
if (expected.paint.bound_box_offset.x != actual.paint.bound_box_offset.x)
return false;
if (expected.paint.bound_box_offset.y != actual.paint.bound_box_offset.y)
return false;
if (expected.paint.bound_box_offset.z != actual.paint.bound_box_offset.z)
return false;
2016-10-16 19:22:02 +02:00
}
2018-06-22 22:29:03 +02:00
if (expected.paint.z_offset != actual.paint.z_offset)
return false;
if (expected.paint.rotation != actual.paint.rotation)
return false;
2016-10-16 19:22:02 +02:00
return true;
}
2018-06-22 22:29:03 +02:00
static void canonicalizeFunctionCall(function_call* call)
{
if (call->function != PAINT_98197C)
return;
if (call->paint.offset.x != call->paint.bound_box_offset.x)
return;
if (call->paint.offset.y != call->paint.bound_box_offset.y)
return;
if (call->paint.z_offset != call->paint.bound_box_offset.z)
return;
2016-10-16 19:22:02 +02:00
call->function = PAINT_98196C;
}
2018-06-22 22:29:03 +02:00
static SpriteGroup getSpriteGroup(uint16_t spriteIndex)
{
if (spriteIndex >= 14568 && spriteIndex <= 14571)
{
2016-10-16 19:22:02 +02:00
return SPRITEGROUP_FENCE_METAL_A;
}
2018-06-22 22:29:03 +02:00
if (spriteIndex >= 14990 && spriteIndex <= 14993)
{
2016-10-16 19:22:02 +02:00
return SPRITEGROUP_FENCE_METAL_B;
}
2018-06-22 22:29:03 +02:00
if (spriteIndex >= 20564 && spriteIndex <= 20567)
{
2016-10-16 19:22:02 +02:00
return SPRITEGROUP_FENCE_SPIRAL_SLIDE;
}
2018-06-22 22:29:03 +02:00
if (spriteIndex >= 22134 && spriteIndex <= 22137)
{
2016-10-16 19:22:02 +02:00
return SPRITEGROUP_FLOOR_CORK;
}
2018-06-22 22:29:03 +02:00
if (spriteIndex >= 22138 && spriteIndex <= 22141)
{
2016-10-16 19:22:02 +02:00
return SPRITEGROUP_FENCE_ROPE;
}
return SPRITEGROUP_NONE;
}