Skip to content

Commit a91f80f

Browse files
authored
Minor updates to map rendering. (#74)
* Minor updates to map rendering. * Increased buffer to prevent error on slower machines.
1 parent 4ae3ac7 commit a91f80f

File tree

19 files changed

+495
-133
lines changed

19 files changed

+495
-133
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,4 @@ compile_flags.txt
2121
backends.txt
2222
lldb-vscode.json
2323
run.sh
24+
build.sh

apps/abyssengine/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
1010
set(APP_NAME abyssengine)
1111

1212
if (MSVC)
13-
set(OPTIONS WIN32)
13+
set(OPTIONS WIN32 src/node/inputlistener.cpp src/node/inputlistener.h)
1414
set(SOURCE_EXTRA resource.rc)
1515
set(APP_NAME "AbyssEngine")
1616
add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_HAS_DEPRECATED_RESULT_OF=1)
@@ -54,6 +54,7 @@ target_sources(${APP_NAME} PRIVATE
5454
src/node/label.cpp
5555
src/node/button.cpp
5656
src/node/maprenderer.cpp
57+
src/node/inputlistener.cpp
5758

5859
# Scripting ----------------------------------------------------
5960
src/engine/scripthost.cpp
@@ -191,4 +192,3 @@ if (APPLE)
191192
endif(APPLE)
192193

193194
target_compile_features(${APP_NAME} PRIVATE cxx_std_20)
194-

apps/abyssengine/src/engine/scripthost.cpp

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "scripthost.h"
22
#include "../node/d2rsprite.h"
33
#include "../node/dc6sprite.h"
4+
#include "../node/inputlistener.h"
45
#include "cascprovider.h"
56
#include "engine.h"
67
#include "filesystemprovider.h"
@@ -58,6 +59,7 @@ AbyssEngine::ScriptHost::ScriptHost(Engine *engine) : _engine(engine), _lua() {
5859

5960
module.set_function("addLoaderProvider", &ScriptHost::LuaAddLoaderProvider, this);
6061
module.set_function("createButton", &ScriptHost::LuaCreateButton, this);
62+
module.set_function("createInputListener", &ScriptHost::LuaCreateInputListener, this);
6163
module.set_function("createLabel", &ScriptHost::LuaCreateLabel, this);
6264
module.set_function("createMapRenderer", &ScriptHost::LuaCreateMapRenderer, this);
6365
module.set_function("createPalette", &ScriptHost::LuaCreatePalette, this);
@@ -80,6 +82,8 @@ AbyssEngine::ScriptHost::ScriptHost(Engine *engine) : _engine(engine), _lua() {
8082
module.set_function("setCursor", &ScriptHost::LuaSetCursor, this);
8183
module.set_function("showSystemCursor", &ScriptHost::LuaShowSystemCursor, this);
8284
module.set_function("shutdown", &ScriptHost::LuaFuncShutdown, this);
85+
module.set_function("worldToOrtho", &ScriptHost::LuaWorldToOrtho, this);
86+
module.set_function("orthoToWorld", &ScriptHost::LuaOrthoToWorld, this);
8387

8488
// User Types -------------------------------------------------------------------------------------------------------------------------
8589

@@ -134,6 +138,11 @@ AbyssEngine::ScriptHost::ScriptHost(Engine *engine) : _engine(engine), _lua() {
134138
spriteType["playMode"] = sol::property(&Sprite::LuaGetPlayMode, &Sprite::LuaSetPlayMode);
135139
spriteType["currentFrameIndex"] = sol::property(&Sprite::GetCurrentFrameIndex, &Sprite::SetCurrentFrameIndex);
136140

141+
// InputListener
142+
auto inputListenerType = CreateLuaObjectType<InputListener>(module, "InputListener", sol::no_constructor);
143+
inputListenerType["onMouseButton"] = &InputListener::LuaSetMouseButtonCallback;
144+
inputListenerType["onMouseMove"] = &InputListener::LuaSetMouseMoveCallback;
145+
137146
// Sound Effect
138147
auto soundEffect = module.new_usertype<SoundEffect>("SoundEffect", sol::no_constructor);
139148
soundEffect["play"] = &SoundEffect::Play;
@@ -185,10 +194,19 @@ AbyssEngine::ScriptHost::ScriptHost(Engine *engine) : _engine(engine), _lua() {
185194
ds1.set("width", sol::property(&LibAbyss::DS1::Width, &LibAbyss::DS1::Width));
186195
ds1.set("height", sol::property(&LibAbyss::DS1::Height, &LibAbyss::DS1::Height));
187196

197+
// DT1 Tile
198+
auto dt1TileType = module.new_usertype<LibAbyss::DT1::Tile>("DT1Tile", sol::no_constructor);
199+
dt1TileType["type"] = sol::readonly_property(&LibAbyss::DT1::Tile::Type);
200+
dt1TileType["mainIndex"] = sol::readonly_property(&LibAbyss::DT1::Tile::MainIndex);
201+
dt1TileType["subIndex"] = sol::readonly_property(&LibAbyss::DT1::Tile::SubIndex);
202+
188203
// Zone
189204
auto zoneType = module.new_usertype<LibAbyss::Zone>("Zone", sol::no_constructor);
190205
zoneType["resetMap"] = &LibAbyss::Zone::ResetMap;
191206
zoneType["stamp"] = &LibAbyss::Zone::Stamp;
207+
zoneType["getTileInfo"] = &LibAbyss::Zone::GetTileInfo;
208+
zoneType["width"] = sol::readonly_property(&LibAbyss::Zone::WidthInTiles);
209+
zoneType["height"] = sol::readonly_property(&LibAbyss::Zone::HeightInTiles);
192210

193211
_environment.add(module);
194212
}
@@ -365,9 +383,7 @@ std::unique_ptr<AbyssEngine::Image> AbyssEngine::ScriptHost::LuaLoadImage(std::s
365383
throw std::runtime_error(absl::StrCat("Unknowns sprite format for file: ", spritePath));
366384
}
367385

368-
std::unique_ptr<AbyssEngine::Sprite> AbyssEngine::ScriptHost::LuaCreateSprite(AbyssEngine::Image& image) {
369-
return std::make_unique<Sprite>(image);
370-
}
386+
std::unique_ptr<AbyssEngine::Sprite> AbyssEngine::ScriptHost::LuaCreateSprite(AbyssEngine::Image &image) { return std::make_unique<Sprite>(image); }
371387

372388
std::unique_ptr<AbyssEngine::Button> AbyssEngine::ScriptHost::LuaCreateButton(Image &image) { return std::make_unique<Button>(image); }
373389

@@ -485,3 +501,15 @@ std::unique_ptr<LibAbyss::DS1> AbyssEngine::ScriptHost::LuaLoadDS1(std::string_v
485501
auto stream = _engine->GetLoader().Load(fileName);
486502
return std::make_unique<LibAbyss::DS1>(stream);
487503
}
504+
505+
std::unique_ptr<AbyssEngine::InputListener> AbyssEngine::ScriptHost::LuaCreateInputListener() { return std::make_unique<InputListener>(); }
506+
507+
std::tuple<int, int> AbyssEngine::ScriptHost::LuaWorldToOrtho(int x, int y) {
508+
MapRenderer::WorldToOrtho(x, y);
509+
return {x, y};
510+
}
511+
512+
std::tuple<int, int> AbyssEngine::ScriptHost::LuaOrthoToWorld(int x, int y) {
513+
MapRenderer::OrthoToWorld(x, y);
514+
return {x, y};
515+
}

apps/abyssengine/src/engine/scripthost.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "../node/maprenderer.h"
1414
#include "../node/sprite.h"
1515
#include "provider.h"
16+
#include "../node/inputlistener.h"
1617
#include <filesystem>
1718
#include <libabyss/formats/d2/ds1.h>
1819
#include <libabyss/zone/zone.h>
@@ -141,6 +142,10 @@ class ScriptHost {
141142
/// \return The created DS1 stamp.
142143
std::unique_ptr<LibAbyss::DS1> LuaLoadDS1(std::string_view fileName);
143144

145+
/// Creates a new input listener
146+
/// \return The input listener
147+
std::unique_ptr<InputListener> LuaCreateInputListener();
148+
144149
/// \brief Sets the cursor sprite and offsets
145150
/// \param sprite The sprite to use for the cursor.
146151
/// \param offsetX The X offset of the cursor.
@@ -152,11 +157,23 @@ class ScriptHost {
152157
/// \param callback The callback to call when the video is finished.
153158
void LuaPlayVideo(std::string_view videoPath, const sol::safe_function &callback);
154159

155-
/// \brief Plays video and audio (for videos with seperate audio tracks)
160+
/// \brief Plays video and audio (for videos with separate audio tracks)
156161
/// \param videoPath The path to the video file.
157162
/// \param audioPath The path to the audio file.
158163
/// \param callback The callback to call when the video is finished.
159164
void LuaPlayVideoAndAudio(std::string_view videoPath, std::string_view audioPath, const sol::safe_function &callback);
165+
166+
/// Converts world coordinates to orthographic coordinates
167+
/// \param x The world X coordinate.
168+
/// \param y The world Y coordinate.
169+
/// \return The X/Y ortho coordinates.
170+
std::tuple<int, int> LuaWorldToOrtho(int x, int y);
171+
172+
/// Converts orthographic coordinates to world coordinates
173+
/// \param x The ortho X coordinate.
174+
/// \param y The ortho Y coordinate.
175+
/// \return The X/Y world coordinates.
176+
std::tuple<int, int> LuaOrthoToWorld(int x, int y);
160177
};
161178

162179
} // namespace AbyssEngine
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#include "inputlistener.h"
2+
#include "../common/overload.h"
3+
#include "../engine/engine.h"
4+
#include <utility>
5+
#include <variant>
6+
7+
void AbyssEngine::InputListener::MouseEventCallback(const AbyssEngine::MouseEvent &event) {
8+
std::visit(Overload{[this](const MouseMoveEvent &evt) {
9+
if (!this->_luaMouseMoveCallback.valid())
10+
return;
11+
12+
auto result = this->_luaMouseMoveCallback(evt.X, evt.Y);
13+
14+
if (result.valid())
15+
return;
16+
17+
sol::error err = result;
18+
Engine::Get()->Panic(err.what());
19+
},
20+
[this](const MouseButtonEvent &evt) {
21+
if (!this->_luaMouseButtonCallback.valid())
22+
return;
23+
24+
auto result = this->_luaMouseButtonCallback(evt.Button, evt.IsPressed);
25+
26+
if (result.valid())
27+
return;
28+
29+
sol::error err = result;
30+
Engine::Get()->Panic(err.what());
31+
}},
32+
event);
33+
34+
Node::MouseEventCallback(event);
35+
}
36+
37+
void AbyssEngine::InputListener::LuaSetMouseButtonCallback(sol::safe_function func) { this->_luaMouseButtonCallback = std::move(func); }
38+
39+
void AbyssEngine::InputListener::LuaSetMouseMoveCallback(sol::safe_function func) { this->_luaMouseMoveCallback = std::move(func); }
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ifndef ABYSS_INPUTLISTENER_H
2+
#define ABYSS_INPUTLISTENER_H
3+
4+
#include "node.h"
5+
namespace AbyssEngine {
6+
7+
class InputListener : public Node {
8+
public:
9+
void MouseEventCallback(const MouseEvent &event) override;
10+
11+
void LuaSetMouseButtonCallback(sol::safe_function func);
12+
void LuaSetMouseMoveCallback(sol::safe_function func);
13+
14+
private:
15+
sol::safe_function _luaMouseButtonCallback;
16+
sol::safe_function _luaMouseMoveCallback;
17+
};
18+
19+
}
20+
21+
#endif // ABYSS_INPUTLISTENER_H

0 commit comments

Comments
 (0)