diff --git a/src/game/scripting/array.cpp b/src/game/scripting/array.cpp index 39c50ef..ef65854 100644 --- a/src/game/scripting/array.cpp +++ b/src/game/scripting/array.cpp @@ -110,14 +110,41 @@ namespace scripting return result; } - int array::size() const + unsigned int array::size() const { return game::Scr_GetSelf(this->id_); } - void array::push(script_value value) const + unsigned int array::push(script_value value) const { this->set(this->size(), value); + return this->size(); + } + + void array::erase(const unsigned int index) const + { + const auto variable_id = game::FindVariable(this->id_, (index - 0x800000) & 0xFFFFFF); + if (variable_id) + { + game::RemoveVariableValue(this->id_, variable_id); + } + } + + void array::erase(const std::string& key) const + { + const auto string_value = game::SL_GetString(key.data(), 0); + const auto variable_id = game::FindVariable(this->id_, string_value); + if (variable_id) + { + game::RemoveVariableValue(this->id_, variable_id); + } + } + + script_value array::pop() const + { + const auto value = this->get(this->size() - 1); + this->erase(this->size() - 1); + return value; } script_value array::get(const std::string& key) const @@ -155,35 +182,6 @@ namespace scripting return variable; } - unsigned int array::get_entity_id() const - { - return this->id_; - } - - unsigned int array::get_value_id(const std::string& key) const - { - const auto string_value = game::SL_GetString(key.data(), 0); - const auto variable_id = game::FindVariable(this->id_, string_value); - - if (!variable_id) - { - return game::GetNewVariable(this->id_, string_value); - } - - return variable_id; - } - - unsigned int array::get_value_id(const unsigned int index) const - { - const auto variable_id = game::FindVariable(this->id_, (index - 0x800000) & 0xFFFFFF); - if (!variable_id) - { - return game::GetNewArrayVariable(this->id_, index); - } - - return variable_id; - } - void array::set(const std::string& key, const script_value& _value) const { const auto value = _value.get_raw(); @@ -224,6 +222,35 @@ namespace scripting variable->u.u = value.u; } + unsigned int array::get_entity_id() const + { + return this->id_; + } + + unsigned int array::get_value_id(const std::string& key) const + { + const auto string_value = game::SL_GetString(key.data(), 0); + const auto variable_id = game::FindVariable(this->id_, string_value); + + if (!variable_id) + { + return game::GetNewVariable(this->id_, string_value); + } + + return variable_id; + } + + unsigned int array::get_value_id(const unsigned int index) const + { + const auto variable_id = game::FindVariable(this->id_, (index - 0x800000) & 0xFFFFFF); + if (!variable_id) + { + return game::GetNewArrayVariable(this->id_, index); + } + + return variable_id; + } + entity array::get_raw() const { return entity(this->id_); diff --git a/src/game/scripting/array.hpp b/src/game/scripting/array.hpp index 131e465..18e4e05 100644 --- a/src/game/scripting/array.hpp +++ b/src/game/scripting/array.hpp @@ -30,21 +30,24 @@ namespace scripting array(std::unordered_map); std::vector get_keys() const; + unsigned int size() const; - int size() const; - void push(script_value) const; + unsigned int push(script_value) const; + void erase(const unsigned int index) const; + void erase(const std::string& key) const; + script_value pop() const; script_value get(const std::string&) const; script_value get(const unsigned int) const; + void set(const std::string&, const script_value&) const; + void set(const unsigned int, const script_value&) const; + unsigned int get_entity_id() const; unsigned int get_value_id(const std::string&) const; unsigned int get_value_id(const unsigned int) const; - void set(const std::string&, const script_value&) const; - void set(const unsigned int, const script_value&) const; - entity get_raw() const; array_value array::operator[](const int index) const diff --git a/src/game/symbols.hpp b/src/game/symbols.hpp index 647c1f6..1eddf34 100644 --- a/src/game/symbols.hpp +++ b/src/game/symbols.hpp @@ -33,6 +33,7 @@ namespace game WEAK symbol GetNewVariable{0x566390}; WEAK symbol GetNewArrayVariable{0x5668C0}; WEAK symbol SetNewVariableValue{0x5658D0}; + WEAK symbol RemoveVariableValue{0x566500}; WEAK symbol Scr_AllocVector{0x565680}; WEAK symbol Scr_ClearOutParams{0x569010};