You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.7 KiB
102 lines
2.7 KiB
|
2 years ago
|
#ifdef _DEBUG
|
||
|
|
#include "lua/modules/dev/player/gold.hpp"
|
||
|
|
|
||
|
|
#include <cstdint>
|
||
|
|
#include <optional>
|
||
|
|
#include <string>
|
||
|
|
|
||
|
|
#include <sol/sol.hpp>
|
||
|
|
|
||
|
|
#include "items.h"
|
||
|
|
#include "lua/metadoc.hpp"
|
||
|
|
#include "player.h"
|
||
|
|
|
||
|
|
namespace devilution {
|
||
|
|
namespace {
|
||
|
|
|
||
|
|
std::string DebugCmdGiveGoldCheat(std::optional<int> amount)
|
||
|
|
{
|
||
|
|
int goldToAdd = amount.value_or(GOLD_MAX_LIMIT * InventoryGridCells);
|
||
|
|
if (goldToAdd <= 0) return "amount must be positive";
|
||
|
|
Player &myPlayer = *MyPlayer;
|
||
|
|
const int goldAmountBefore = myPlayer._pGold;
|
||
|
|
for (int8_t &itemIndex : myPlayer.InvGrid) {
|
||
|
|
if (itemIndex < 0)
|
||
|
|
continue;
|
||
|
|
|
||
|
|
Item &item = myPlayer.InvList[itemIndex != 0 ? itemIndex - 1 : myPlayer._pNumInv];
|
||
|
|
|
||
|
|
if (itemIndex != 0) {
|
||
|
|
if ((!item.isGold() && !item.isEmpty()) || (item.isGold() && item._ivalue == GOLD_MAX_LIMIT))
|
||
|
|
continue;
|
||
|
|
} else {
|
||
|
|
if (item.isEmpty()) {
|
||
|
|
MakeGoldStack(item, 0);
|
||
|
|
myPlayer._pNumInv++;
|
||
|
|
itemIndex = myPlayer._pNumInv;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
int goldThatCanBeAdded = (GOLD_MAX_LIMIT - item._ivalue);
|
||
|
|
if (goldThatCanBeAdded >= goldToAdd) {
|
||
|
|
item._ivalue += goldToAdd;
|
||
|
|
myPlayer._pGold += goldToAdd;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
item._ivalue += goldThatCanBeAdded;
|
||
|
|
goldToAdd -= goldThatCanBeAdded;
|
||
|
|
myPlayer._pGold += goldThatCanBeAdded;
|
||
|
|
}
|
||
|
|
|
||
|
|
CalcPlrInv(myPlayer, true);
|
||
|
|
|
||
|
|
return StrCat("Set your gold to ", myPlayer._pGold, ", added ", myPlayer._pGold - goldAmountBefore, ".");
|
||
|
|
}
|
||
|
|
|
||
|
|
std::string DebugCmdTakeGoldCheat(std::optional<int> amount)
|
||
|
|
{
|
||
|
|
Player &myPlayer = *MyPlayer;
|
||
|
|
int goldToRemove = amount.value_or(GOLD_MAX_LIMIT * InventoryGridCells);
|
||
|
|
if (goldToRemove <= 0) return "amount must be positive";
|
||
|
|
|
||
|
|
const int goldAmountBefore = myPlayer._pGold;
|
||
|
|
for (auto itemIndex : myPlayer.InvGrid) {
|
||
|
|
itemIndex -= 1;
|
||
|
|
|
||
|
|
if (itemIndex < 0)
|
||
|
|
continue;
|
||
|
|
|
||
|
|
Item &item = myPlayer.InvList[itemIndex];
|
||
|
|
if (!item.isGold())
|
||
|
|
continue;
|
||
|
|
|
||
|
|
if (item._ivalue >= goldToRemove) {
|
||
|
|
myPlayer._pGold -= goldToRemove;
|
||
|
|
item._ivalue -= goldToRemove;
|
||
|
|
if (item._ivalue == 0)
|
||
|
|
myPlayer.RemoveInvItem(itemIndex);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
myPlayer._pGold -= item._ivalue;
|
||
|
|
goldToRemove -= item._ivalue;
|
||
|
|
myPlayer.RemoveInvItem(itemIndex);
|
||
|
|
}
|
||
|
|
|
||
|
|
return StrCat("Set your gold to ", myPlayer._pGold, ", removed ", goldAmountBefore - myPlayer._pGold, ".");
|
||
|
|
}
|
||
|
|
|
||
|
|
} // namespace
|
||
|
|
|
||
|
|
sol::table LuaDevPlayerGoldModule(sol::state_view &lua)
|
||
|
|
{
|
||
|
|
sol::table table = lua.create_table();
|
||
|
|
SetDocumented(table, "give", "(amount: number = MAX)", "Gives the player gold.", &DebugCmdGiveGoldCheat);
|
||
|
|
SetDocumented(table, "take", "(amount: number = MAX)", "Takes the player's gold away.", &DebugCmdTakeGoldCheat);
|
||
|
|
return table;
|
||
|
|
}
|
||
|
|
|
||
|
|
} // namespace devilution
|
||
|
|
#endif // _DEBUG
|