tibia-rme/source/spawn_monster_brush.cpp
Eduardo Dantas 6d501a5ad2
feat: support reading assets from client 11 or higher (#70)
feat: migrate Remeres to 12.x assets system and modernized item handling

• Migrated old Remeres .dat/.spr system to new 12.x client /assets/ appearance & sprite format
• Removed OTB dependency and outdated client version structures
• Integrated Protobuf-based sprite reader (credit: @nekiro)
• Major refactor on graphics.cpp structure and brush icon handling
• Updated brushes and tags system
• Fixed top order drawing bugs and missing brushes icons
• Fixed outfit color paint and correct offset handling for non-32x32 sprites
• Re-enabled map saving and loading
• Improved creature sprite rendering and brush previews
• Added new item properties window with toggle for legacy/new layout

Co-authored-by: Marcos <66353315+marcosvf132@users.noreply.github.com>
Co-authored-by: Pedro Henrique Alves Cruz <phac@cin.ufpe.br>
2025-05-10 16:38:45 -03:00

106 lines
3.1 KiB
C++

//////////////////////////////////////////////////////////////////////
// This file is part of Remere's Map Editor
//////////////////////////////////////////////////////////////////////
// Remere's Map Editor is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Remere's Map Editor is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//////////////////////////////////////////////////////////////////////
#include "main.h"
#include "spawn_monster_brush.h"
#include "basemap.h"
#include "spawn_monster.h"
#include "monster_brush.h"
//=============================================================================
// SpawnMonster brush
SpawnMonsterBrush::SpawnMonsterBrush() :
Brush() {
////
}
SpawnMonsterBrush::~SpawnMonsterBrush() {
////
}
int SpawnMonsterBrush::getLookID() const {
return 0;
}
std::string SpawnMonsterBrush::getName() const {
return "SpawnMonster Brush";
}
bool SpawnMonsterBrush::canDraw(BaseMap* map, const Position &position) const {
Tile* tile = map->getTile(position);
if (tile && tile->ground) {
if (tile->spawnMonster) {
return false;
}
}
return true;
}
void SpawnMonsterBrush::undraw(BaseMap* map, Tile* tile) {
delete tile->spawnMonster;
tile->spawnMonster = nullptr;
}
void SpawnMonsterBrush::draw(BaseMap* map, Tile* tile, void* parameter) {
ASSERT(tile);
ASSERT(parameter); // Should contain an int which is the size of the newd monster spawn
if (!tile->ground) {
return;
}
auto size = std::max(1, *(int*)parameter);
auto side = size * 2 + 1;
uint16_t spawnTime = g_settings.getInteger(Config::DEFAULT_SPAWN_MONSTER_TIME);
int density = g_settings.getInteger(Config::SPAWN_MONSTER_DENSITY);
if (tile && tile->spawnMonster == nullptr) {
tile->spawnMonster = newd SpawnMonster(size);
auto toSpawn = (int)std::ceil((side * side) * (density / 100.0));
std::set<Position> positions;
for (int i = 0; i < side; i++) {
for (int j = 0; j < side; j++) {
positions.insert(Position(tile->getPosition().x - size + i, tile->getPosition().y - size + j, tile->getPosition().z));
}
}
if (monsters.empty()) {
return;
}
for (int i = 0; i < toSpawn; ++i) {
Tile* tileSpawn = nullptr;
auto iter = positions.begin();
while (!positions.empty() && (!tileSpawn || !tileSpawn->ground)) {
std::advance(iter, rand() % positions.size());
tileSpawn = map->getTile(*iter);
if (tileSpawn) {
tileSpawn = tileSpawn->getPosition() == tile->getPosition() ? tile : tileSpawn;
}
positions.erase(iter);
iter = positions.begin();
}
if (tileSpawn) {
auto monsterBrush = monsters[rand() % monsters.size()];
monsterBrush->drawMonster(map, tileSpawn, &spawnTime);
}
}
}
}