Browse Source

Expose lua methods for items and restore life and mana (#8369)

pull/8317/head^2
Yuri Pourre 3 months ago committed by GitHub
parent
commit
1c0987115d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 11
      Source/lua/modules/items.cpp
  2. 66
      Source/lua/modules/player.cpp
  3. 12
      assets/lua/repl_prelude.lua

11
Source/lua/modules/items.cpp

@ -485,6 +485,17 @@ sol::table LuaItemModule(sol::state_view &lua)
LuaSetDocFn(table, "addItemDataFromTsv", "(path: string, baseMappingId: number)", AddItemDataFromTsv); LuaSetDocFn(table, "addItemDataFromTsv", "(path: string, baseMappingId: number)", AddItemDataFromTsv);
LuaSetDocFn(table, "addUniqueItemDataFromTsv", "(path: string, baseMappingId: number)", AddUniqueItemDataFromTsv); LuaSetDocFn(table, "addUniqueItemDataFromTsv", "(path: string, baseMappingId: number)", AddUniqueItemDataFromTsv);
// Expose enums through the module table
table["ItemIndex"] = lua["ItemIndex"];
table["ItemType"] = lua["ItemType"];
table["ItemClass"] = lua["ItemClass"];
table["ItemEquipType"] = lua["ItemEquipType"];
table["ItemMiscID"] = lua["ItemMiscID"];
table["SpellID"] = lua["SpellID"];
table["ItemEffectType"] = lua["ItemEffectType"];
table["ItemSpecialEffect"] = lua["ItemSpecialEffect"];
table["ItemSpecialEffectHf"] = lua["ItemSpecialEffectHf"];
return table; return table;
} }

66
Source/lua/modules/player.cpp

@ -5,11 +5,15 @@
#include <sol/sol.hpp> #include <sol/sol.hpp>
#include "engine/point.hpp" #include "engine/point.hpp"
#include "engine/random.hpp"
#include "inv.h"
#include "items.h"
#include "lua/metadoc.hpp" #include "lua/metadoc.hpp"
#include "player.h" #include "player.h"
namespace devilution { namespace devilution {
namespace { namespace {
void InitPlayerUserType(sol::state_view &lua) void InitPlayerUserType(sol::state_view &lua)
{ {
sol::usertype<Player> playerType = lua.new_usertype<Player>(sol::no_constructor); sol::usertype<Player> playerType = lua.new_usertype<Player>(sol::no_constructor);
@ -28,6 +32,67 @@ void InitPlayerUserType(sol::state_view &lua)
LuaSetDocProperty(playerType, "characterLevel", "number", LuaSetDocProperty(playerType, "characterLevel", "number",
"Character level (writeable)", "Character level (writeable)",
&Player::getCharacterLevel, &Player::setCharacterLevel); &Player::getCharacterLevel, &Player::setCharacterLevel);
LuaSetDocFn(playerType, "addItem", "(itemId: integer, count: integer = 1)",
"Add an item to the player's inventory",
[](Player &player, int itemId, std::optional<int> count) -> bool {
const _item_indexes itemIndex = static_cast<_item_indexes>(itemId);
const int itemCount = count.value_or(1);
for (int i = 0; i < itemCount; i++) {
Item tempItem {};
SetupAllItems(player, tempItem, itemIndex, AdvanceRndSeed(), 1, 1, true, false);
if (!AutoPlaceItemInInventory(player, tempItem, true)) {
return false;
}
}
CalcPlrInv(player, true);
return true;
});
LuaSetDocFn(playerType, "hasItem", "(itemId: integer)",
"Check if the player has an item with the given ID",
[](const Player &player, int itemId) -> bool {
return HasInventoryOrBeltItemWithId(player, static_cast<_item_indexes>(itemId));
});
LuaSetDocFn(playerType, "removeItem", "(itemId: integer, count: integer = 1)",
"Remove an item from the player's inventory",
[](Player &player, int itemId, std::optional<int> count) -> int {
const _item_indexes targetId = static_cast<_item_indexes>(itemId);
const int itemCount = count.value_or(1);
int removed = 0;
// Remove from inventory
for (int i = player._pNumInv - 1; i >= 0 && removed < itemCount; i--) {
if (player.InvList[i].IDidx == targetId) {
player.RemoveInvItem(i);
removed++;
}
}
// Remove from belt if needed
for (int i = MaxBeltItems - 1; i >= 0 && removed < itemCount; i--) {
if (!player.SpdList[i].isEmpty() && player.SpdList[i].IDidx == targetId) {
player.RemoveSpdBarItem(i);
removed++;
}
}
if (removed > 0) {
CalcPlrInv(player, true);
}
return removed;
});
LuaSetDocFn(playerType, "restoreFullLife", "()",
"Restore player's HP to maximum",
[](Player &player) {
player._pHitPoints = player._pMaxHP;
player._pHPBase = player._pMaxHPBase;
});
LuaSetDocFn(playerType, "restoreFullMana", "()",
"Restore player's mana to maximum",
[](Player &player) {
player._pMana = player._pMaxMana;
player._pManaBase = player._pMaxManaBase;
});
} }
} // namespace } // namespace
@ -45,6 +110,7 @@ sol::table LuaPlayerModule(sol::state_view &lua)
[](int x, int y) { [](int x, int y) {
NetSendCmdLoc(MyPlayerId, true, CMD_WALKXY, Point { x, y }); NetSendCmdLoc(MyPlayerId, true, CMD_WALKXY, Point { x, y });
}); });
return table; return table;
} }

12
assets/lua/repl_prelude.lua

@ -1,5 +1,6 @@
events = require('devilutionx.events') events = require('devilutionx.events')
i18n = require('devilutionx.i18n') i18n = require('devilutionx.i18n')
items = require('devilutionx.items')
log = require('devilutionx.log') log = require('devilutionx.log')
audio = require('devilutionx.audio') audio = require('devilutionx.audio')
player = require('devilutionx.player') player = require('devilutionx.player')
@ -8,3 +9,14 @@ towners = require('devilutionx.towners')
message = require('devilutionx.message') message = require('devilutionx.message')
if _DEBUG then dev = require('devilutionx.dev') end if _DEBUG then dev = require('devilutionx.dev') end
inspect = require('inspect') inspect = require('inspect')
-- Expose item enums from items module for easy access in console
ItemIndex = items.ItemIndex
ItemType = items.ItemType
ItemClass = items.ItemClass
ItemEquipType = items.ItemEquipType
ItemMiscID = items.ItemMiscID
SpellID = items.SpellID
ItemEffectType = items.ItemEffectType
ItemSpecialEffect = items.ItemSpecialEffect
ItemSpecialEffectHf = items.ItemSpecialEffectHf

Loading…
Cancel
Save