2018-09-25 01:12:29 +01:00
|
|
|
#include "block.h"
|
2023-12-13 07:30:22 +00:00
|
|
|
#include "bitpacker.h"
|
|
|
|
#include "config.h"
|
|
|
|
|
2023-12-15 19:33:36 +00:00
|
|
|
// Upper limit for metatile ID, collision, and elevation masks. Used externally.
|
|
|
|
const uint16_t Block::maxValue = 0xFFFF;
|
|
|
|
|
2023-12-13 07:30:22 +00:00
|
|
|
static BitPacker bitsMetatileId = BitPacker(0x3FF);
|
|
|
|
static BitPacker bitsCollision = BitPacker(0xC00);
|
|
|
|
static BitPacker bitsElevation = BitPacker(0xF000);
|
2018-09-23 00:47:28 +01:00
|
|
|
|
2023-12-12 23:32:54 +00:00
|
|
|
Block::Block() :
|
|
|
|
m_metatileId(0),
|
|
|
|
m_collision(0),
|
2023-12-16 08:36:26 +00:00
|
|
|
m_elevation(0)
|
2023-12-12 23:32:54 +00:00
|
|
|
{ }
|
2018-09-23 00:47:28 +01:00
|
|
|
|
2021-11-24 04:53:41 +00:00
|
|
|
Block::Block(uint16_t metatileId, uint16_t collision, uint16_t elevation) :
|
2023-12-12 23:32:54 +00:00
|
|
|
m_metatileId(metatileId),
|
|
|
|
m_collision(collision),
|
|
|
|
m_elevation(elevation)
|
2021-02-14 17:37:51 +00:00
|
|
|
{ }
|
2020-04-27 01:38:20 +01:00
|
|
|
|
2023-12-13 07:30:22 +00:00
|
|
|
Block::Block(uint16_t data) :
|
|
|
|
m_metatileId(bitsMetatileId.unpack(data)),
|
|
|
|
m_collision(bitsCollision.unpack(data)),
|
|
|
|
m_elevation(bitsElevation.unpack(data))
|
2021-02-14 17:37:51 +00:00
|
|
|
{ }
|
|
|
|
|
|
|
|
Block::Block(const Block &other) :
|
2023-12-12 23:32:54 +00:00
|
|
|
m_metatileId(other.m_metatileId),
|
|
|
|
m_collision(other.m_collision),
|
|
|
|
m_elevation(other.m_elevation)
|
2021-02-14 17:37:51 +00:00
|
|
|
{ }
|
2018-09-23 00:47:28 +01:00
|
|
|
|
2021-02-14 17:37:51 +00:00
|
|
|
Block &Block::operator=(const Block &other) {
|
2023-12-12 23:32:54 +00:00
|
|
|
m_metatileId = other.m_metatileId;
|
|
|
|
m_collision = other.m_collision;
|
|
|
|
m_elevation = other.m_elevation;
|
2021-02-14 17:37:51 +00:00
|
|
|
return *this;
|
2018-09-23 00:47:28 +01:00
|
|
|
}
|
|
|
|
|
2021-02-14 20:10:03 +00:00
|
|
|
uint16_t Block::rawValue() const {
|
2023-12-13 07:30:22 +00:00
|
|
|
return bitsMetatileId.pack(m_metatileId)
|
|
|
|
| bitsCollision.pack(m_collision)
|
|
|
|
| bitsElevation.pack(m_elevation);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Block::setLayout() {
|
|
|
|
bitsMetatileId.setMask(projectConfig.getBlockMetatileIdMask());
|
|
|
|
bitsCollision.setMask(projectConfig.getBlockCollisionMask());
|
|
|
|
bitsElevation.setMask(projectConfig.getBlockElevationMask());
|
2018-09-23 00:47:28 +01:00
|
|
|
}
|
|
|
|
|
2021-02-14 20:10:03 +00:00
|
|
|
bool Block::operator ==(Block other) const {
|
2023-12-13 07:30:22 +00:00
|
|
|
return (m_metatileId == other.m_metatileId)
|
|
|
|
&& (m_collision == other.m_collision)
|
|
|
|
&& (m_elevation == other.m_elevation);
|
2018-09-23 00:47:28 +01:00
|
|
|
}
|
|
|
|
|
2021-02-14 20:10:03 +00:00
|
|
|
bool Block::operator !=(Block other) const {
|
2018-09-23 00:47:28 +01:00
|
|
|
return !(operator ==(other));
|
|
|
|
}
|
2023-12-13 07:30:22 +00:00
|
|
|
|
|
|
|
void Block::setMetatileId(uint16_t metatileId) {
|
|
|
|
m_metatileId = bitsMetatileId.clamp(metatileId);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Block::setCollision(uint16_t collision) {
|
|
|
|
m_collision = bitsCollision.clamp(collision);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Block::setElevation(uint16_t elevation) {
|
|
|
|
m_elevation = bitsElevation.clamp(elevation);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint16_t Block::getMaxMetatileId() {
|
|
|
|
return bitsMetatileId.maxValue();
|
|
|
|
}
|
|
|
|
|
|
|
|
uint16_t Block::getMaxCollision() {
|
|
|
|
return bitsCollision.maxValue();
|
|
|
|
}
|
|
|
|
|
|
|
|
uint16_t Block::getMaxElevation() {
|
|
|
|
return bitsElevation.maxValue();
|
|
|
|
}
|