Skip to content

Commit cb40b56

Browse files
committed
feat: allow sprite creation in map overlay, improve listener prevents
1 parent 0866af2 commit cb40b56

4 files changed

Lines changed: 51 additions & 2 deletions

File tree

source/lua/lua_script_manager.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "main.h"
1919
#include "lua_script_manager.h"
2020
#include "lua_api.h"
21+
#include "lua_api_image.h"
2122
#include "../gui.h"
2223
#include "../tile.h"
2324

@@ -362,6 +363,32 @@ void LuaScriptManager::collectMapOverlayCommands(const MapViewInfo& view, std::v
362363
}
363364
};
364365

366+
ctx["image"] = [&, getOptsTable](sol::variadic_args va) {
367+
sol::table opts = getOptsTable(va);
368+
if (!opts.valid()) {
369+
return;
370+
}
371+
372+
if (opts["image"].valid() && opts["image"].is<LuaAPI::LuaImage>()) {
373+
LuaAPI::LuaImage img = opts["image"].get<LuaAPI::LuaImage>();
374+
if(img.isSpriteSource()) {
375+
MapOverlayCommand cmd;
376+
cmd.type = MapOverlayCommand::Type::Sprite;
377+
cmd.sprite_id = img.getSpriteId();
378+
cmd.screen_space = opts.get_or(std::string("screen"), false);
379+
cmd.x = opts.get_or(std::string("x"), 0);
380+
cmd.y = opts.get_or(std::string("y"), 0);
381+
cmd.z = opts.get_or(std::string("z"), view.floor);
382+
383+
// Opacity handling
384+
double opacity = opts.get_or(std::string("opacity"), 1.0);
385+
cmd.color = wxColor(255, 255, 255, static_cast<uint8_t>(opacity * 255));
386+
387+
out.push_back(cmd);
388+
}
389+
}
390+
};
391+
365392
std::vector<MapOverlay> sorted = mapOverlays;
366393
std::sort(sorted.begin(), sorted.end(), [](const MapOverlay& a, const MapOverlay& b) {
367394
if (a.order == b.order) {

source/lua/lua_script_manager.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,9 @@ class LuaScriptManager {
111111
return;
112112
}
113113

114-
for (auto& listener : eventListeners) {
114+
// Iterate over a copy to allow callbacks to modify the listener list safely
115+
std::vector<EventListener> listenersCopy = eventListeners;
116+
for (const auto& listener : listenersCopy) {
115117
if (listener.eventName == eventName && listener.callback.valid()) {
116118
try {
117119
listener.callback(std::forward<Args>(args)...);
@@ -128,8 +130,10 @@ class LuaScriptManager {
128130
return false;
129131
}
130132

133+
// Iterate over a copy to allow callbacks to modify the listener list safely
134+
std::vector<EventListener> listenersCopy = eventListeners;
131135
bool consumed = false;
132-
for (auto& listener : eventListeners) {
136+
for (const auto& listener : listenersCopy) {
133137
if (listener.eventName == eventName && listener.callback.valid()) {
134138
try {
135139
sol::object result = listener.callback(std::forward<Args>(args)...);

source/map_drawer.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,21 @@ bool MapDrawer::drawOverlayCommands(const std::vector<MapOverlayCommand>& comman
380380
if (cmd.dashed) {
381381
glDisable(GL_LINE_STIPPLE);
382382
}
383+
} else if (cmd.type == MapOverlayCommand::Type::Sprite) {
384+
if (cmd.sprite_id != 0) {
385+
if (isScreenSpace) {
386+
// Screen space sprite drawing - not implemented fully yet
387+
// Need to setup matrix, etc.
388+
} else {
389+
int screen_x = 0;
390+
int screen_y = 0;
391+
if (mapToScreen(this, cmd.x, cmd.y, cmd.z, screen_x, screen_y)) {
392+
glEnable(GL_TEXTURE_2D);
393+
BlitSpriteType(screen_x, screen_y, cmd.sprite_id, cmd.color.Red(), cmd.color.Green(), cmd.color.Blue(), cmd.color.Alpha());
394+
glDisable(GL_TEXTURE_2D);
395+
}
396+
}
397+
}
383398
} else if (cmd.type == MapOverlayCommand::Type::Text) {
384399
if (!cmd.text.empty()) {
385400
if (isScreenSpace) {

source/map_overlay.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ struct MapOverlayCommand {
4141
Rect,
4242
Line,
4343
Text,
44+
Sprite,
4445
};
4546

4647
Type type = Type::Rect;
@@ -58,6 +59,8 @@ struct MapOverlayCommand {
5859
int y2 = 0;
5960
int z2 = 0;
6061

62+
uint32_t sprite_id = 0;
63+
6164
std::string text;
6265
wxColor color = wxColor(255, 255, 255, 255);
6366
};

0 commit comments

Comments
 (0)