Skip to content

Commit

Permalink
Replace LuaVariant with std::variant (otland#3981)
Browse files Browse the repository at this point in the history
(cherry picked from commit 1cef0ea)
  • Loading branch information
ranisalt authored and Codinablack committed Apr 5, 2022
1 parent 812666d commit d795705
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 102 deletions.
72 changes: 40 additions & 32 deletions src/luascript.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
#include "globalevent.h"
#include "script.h"
#include "weapons.h"
#include "iomarket.h"
#include "luavariant.h"

extern Chat* g_chat;
extern Game g_game;
Expand Down Expand Up @@ -562,17 +564,20 @@ void LuaScriptInterface::callVoidFunction(int params)
void LuaScriptInterface::pushVariant(lua_State* L, const LuaVariant& var)
{
lua_createtable(L, 0, 2);
setField(L, "type", var.type);
switch (var.type) {
setField(L, "type", var.type());
switch (var.type()) {
case VARIANT_NUMBER:
setField(L, "number", var.number);
setField(L, "number", var.getNumber());
break;
case VARIANT_STRING:
setField(L, "string", var.text);
setField(L, "string", var.getString());
break;
case VARIANT_TARGETPOSITION:
pushPosition(L, var.getTargetPosition());
lua_setfield(L, -2, "pos");
break;
case VARIANT_POSITION: {
pushPosition(L, var.pos);
pushPosition(L, var.getPosition());
lua_setfield(L, -2, "pos");
break;
}
Expand Down Expand Up @@ -782,32 +787,37 @@ Outfit LuaScriptInterface::getOutfitClass(lua_State* L, int32_t arg)
return Outfit(name, lookType, premium, unlocked);
}

LuaVariant LuaScriptInterface::getVariant(lua_State* L, int32_t arg)
static LuaVariant getVariant(lua_State* L, int32_t arg)
{
LuaVariant var;
switch (var.type = getField<LuaVariantType_t>(L, arg, "type")) {
switch (LuaScriptInterface::getField<LuaVariantType_t>(L, arg, "type")) {
case VARIANT_NUMBER: {
var.number = getField<uint32_t>(L, arg, "number");
var.setNumber(LuaScriptInterface::getField<uint32_t>(L, arg, "number"));
lua_pop(L, 2);
break;
}

case VARIANT_STRING: {
var.text = getFieldString(L, arg, "string");
var.setString(LuaScriptInterface::getFieldString(L, arg, "string"));
lua_pop(L, 2);
break;
}

case VARIANT_POSITION:
lua_getfield(L, arg, "pos");
var.setPosition(LuaScriptInterface::getPosition(L, lua_gettop(L)));
lua_pop(L, 2);
break;

case VARIANT_TARGETPOSITION: {
lua_getfield(L, arg, "pos");
var.pos = getPosition(L, lua_gettop(L));
var.setTargetPosition(LuaScriptInterface::getPosition(L, lua_gettop(L)));
lua_pop(L, 2);
break;
}

default: {
var.type = VARIANT_NONE;
var = {};
lua_pop(L, 1);
break;
}
Expand Down Expand Up @@ -4706,18 +4716,14 @@ int LuaScriptInterface::luaVariantCreate(lua_State* L)
LuaVariant variant;
if (isUserdata(L, 2)) {
if (Thing* thing = getThing(L, 2)) {
variant.type = VARIANT_TARGETPOSITION;
variant.pos = thing->getPosition();
variant.setTargetPosition(thing->getPosition());
}
} else if (isTable(L, 2)) {
variant.type = VARIANT_POSITION;
variant.pos = getPosition(L, 2);
variant.setPosition(getPosition(L, 2));
} else if (isNumber(L, 2)) {
variant.type = VARIANT_NUMBER;
variant.number = getNumber<uint32_t>(L, 2);
variant.setNumber(getNumber<uint32_t>(L, 2));
} else if (isString(L, 2)) {
variant.type = VARIANT_STRING;
variant.text = getString(L, 2);
variant.setString(getString(L, 2));
}
pushVariant(L, variant);
return 1;
Expand All @@ -4727,8 +4733,8 @@ int LuaScriptInterface::luaVariantGetNumber(lua_State* L)
{
// Variant:getNumber()
const LuaVariant& variant = getVariant(L, 1);
if (variant.type == VARIANT_NUMBER) {
lua_pushnumber(L, variant.number);
if (variant.isNumber()) {
lua_pushnumber(L, variant.getNumber());
} else {
lua_pushnumber(L, 0);
}
Expand All @@ -4739,8 +4745,8 @@ int LuaScriptInterface::luaVariantGetString(lua_State* L)
{
// Variant:getString()
const LuaVariant& variant = getVariant(L, 1);
if (variant.type == VARIANT_STRING) {
pushString(L, variant.text);
if (variant.isString()) {
pushString(L, variant.getString());
} else {
pushString(L, std::string());
}
Expand All @@ -4751,8 +4757,10 @@ int LuaScriptInterface::luaVariantGetPosition(lua_State* L)
{
// Variant:getPosition()
const LuaVariant& variant = getVariant(L, 1);
if (variant.type == VARIANT_POSITION || variant.type == VARIANT_TARGETPOSITION) {
pushPosition(L, variant.pos);
if (variant.isPosition()) {
pushPosition(L, variant.getPosition());
} else if (variant.isTargetPosition()) {
pushPosition(L, variant.getTargetPosition());
} else {
pushPosition(L, Position());
}
Expand Down Expand Up @@ -12804,9 +12812,9 @@ int LuaScriptInterface::luaCombatExecute(lua_State* L)
Creature* creature = getCreature(L, 2);

const LuaVariant& variant = getVariant(L, 3);
switch (variant.type) {
switch (variant.type()) {
case VARIANT_NUMBER: {
Creature* target = g_game.getCreatureByID(variant.number);
Creature* target = g_game.getCreatureByID(variant.getNumber());
if (!target) {
pushBoolean(L, false);
return 1;
Expand All @@ -12821,22 +12829,22 @@ int LuaScriptInterface::luaCombatExecute(lua_State* L)
}

case VARIANT_POSITION: {
combat->doCombat(creature, variant.pos);
combat->doCombat(creature, variant.getPosition());
break;
}

case VARIANT_TARGETPOSITION: {
if (combat->hasArea()) {
combat->doCombat(creature, variant.pos);
combat->doCombat(creature, variant.getTargetPosition());
} else {
combat->postCombatEffects(creature, variant.pos);
g_game.addMagicEffect(variant.pos, CONST_ME_POFF);
combat->postCombatEffects(creature, variant.getTargetPosition());
g_game.addMagicEffect(variant.getTargetPosition(), CONST_ME_POFF);
}
break;
}

case VARIANT_STRING: {
Player* target = g_game.getPlayerByName(variant.text);
Player* target = g_game.getPlayerByName(variant.getString());
if (!target) {
pushBoolean(L, false);
return 1;
Expand Down
19 changes: 2 additions & 17 deletions src/luascript.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
#include "enums.h"
#include "position.h"
#include "outfit.h"
#include "mounts.h"
#include "luavariant.h"
#include <fmt/format.h>

class Thing;
Expand All @@ -44,15 +46,6 @@ enum {
EVENT_ID_USER = 1000,
};

enum LuaVariantType_t {
VARIANT_NONE,

VARIANT_NUMBER,
VARIANT_POSITION,
VARIANT_TARGETPOSITION,
VARIANT_STRING,
};

enum LuaDataType {
LuaData_Unknown,

Expand All @@ -65,13 +58,6 @@ enum LuaDataType {
LuaData_Tile,
};

struct LuaVariant {
LuaVariantType_t type = VARIANT_NONE;
std::string text;
Position pos;
uint32_t number = 0;
};

struct LuaTimerEventDesc {
int32_t scriptId = -1;
int32_t function = -1;
Expand Down Expand Up @@ -349,7 +335,6 @@ class LuaScriptInterface
static Position getPosition(lua_State* L, int32_t arg);
static Outfit_t getOutfit(lua_State* L, int32_t arg);
static Outfit getOutfitClass(lua_State* L, int32_t arg);
static LuaVariant getVariant(lua_State* L, int32_t arg);
static InstantSpell* getInstantSpell(lua_State* L, int32_t arg);
static Reflect getReflect(lua_State* L, int32_t arg);

Expand Down
38 changes: 38 additions & 0 deletions src/luavariant.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#ifndef FS_LUAVARIANT_H
#define FS_LUAVARIANT_H

#include <variant>

enum LuaVariantType_t {
VARIANT_NUMBER = 0,
VARIANT_POSITION = 1,
VARIANT_TARGETPOSITION = 2,
VARIANT_STRING = 3,

VARIANT_NONE = std::variant_npos,
};

class LuaVariant {
public:
uint32_t getNumber() const { return std::get<VARIANT_NUMBER>(variant); }
const Position& getPosition() const { return std::get<VARIANT_POSITION>(variant); }
const Position& getTargetPosition() const { return std::get<VARIANT_TARGETPOSITION>(variant); }
const std::string& getString() const { return std::get<VARIANT_STRING>(variant); }

bool isNumber() const { return variant.index() == VARIANT_NUMBER; }
bool isPosition() const { return variant.index() == VARIANT_POSITION; }
bool isTargetPosition() const { return variant.index() == VARIANT_TARGETPOSITION; }
bool isString() const { return variant.index() == VARIANT_STRING; }

void setNumber(uint32_t value) { variant.emplace<VARIANT_NUMBER>(value); }
void setPosition(const Position& value) { variant.emplace<VARIANT_POSITION>(value); }
void setTargetPosition(const Position& value) { variant.emplace<VARIANT_TARGETPOSITION>(value); }
void setString(const std::string& value) { variant.emplace<VARIANT_STRING>(value); }

auto type() const { return static_cast<LuaVariantType_t>(variant.index()); }

private:
std::variant<uint32_t, Position, Position, std::string> variant;
};

#endif
Loading

0 comments on commit d795705

Please sign in to comment.