mirror of
https://github.com/Relintai/entity_spell_system.git
synced 2025-04-09 21:02:42 +02:00
The bag is now scriptable.
This commit is contained in:
parent
3cce6b0ae8
commit
ee6838d33b
BIN
config.pyc
BIN
config.pyc
Binary file not shown.
@ -1 +0,0 @@
|
||||
../../modules/entity_spell_system
|
@ -12,278 +12,101 @@ void Bag::set_allowed_item_types(const int value) {
|
||||
}
|
||||
|
||||
bool Bag::add_item(Ref<ItemInstance> item) {
|
||||
ERR_FAIL_COND_V(!item.is_valid(), true);
|
||||
|
||||
Ref<ItemTemplate> item_template = item->get_item_template();
|
||||
|
||||
ERR_FAIL_COND_V(!item_template.is_valid(), true);
|
||||
|
||||
int _item_size_x = item_template->get_inventory_size_x();
|
||||
int _item_size_y = item_template->get_inventory_size_y();
|
||||
|
||||
for (int x = 0; x < _size_x - _item_size_x; ++x) {
|
||||
for (int y = 0; y < _size_y - _item_size_y; ++y) {
|
||||
if (_space_map[x * _size_x + y] == 0) {
|
||||
|
||||
bool found = true;
|
||||
for (int xx = x; xx < _item_size_x; ++xx) {
|
||||
for (int yy = y; yy < _item_size_y; ++yy) {
|
||||
if (_space_map[xx * _size_x + yy] != 0) {
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
break;
|
||||
}
|
||||
|
||||
if (found) {
|
||||
item->set_inventory_position_x(x);
|
||||
item->set_inventory_position_y(y);
|
||||
|
||||
_items.push_back(item);
|
||||
|
||||
int index = _items.size() - 1;
|
||||
|
||||
for (int xx = x; xx < _item_size_x; ++xx) {
|
||||
for (int yy = y; yy < _item_size_y; ++yy) {
|
||||
_space_map.set(xx * _size_x + yy, index);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
ERR_FAIL_COND_V(!has_method("_add_item"), false);
|
||||
|
||||
return call("_add_item", item);
|
||||
}
|
||||
|
||||
bool Bag::add_item_to_position(const int x, const int y, Ref<ItemInstance> item) {
|
||||
ERR_FAIL_COND_V(!item.is_valid(), false);
|
||||
ERR_FAIL_COND_V(x < 0 || y < 0, false);
|
||||
ERR_FAIL_COND_V(x > _size_x || y > _size_y, false);
|
||||
|
||||
Ref<ItemTemplate> item_template = item->get_item_template();
|
||||
|
||||
ERR_FAIL_COND_V(!item_template.is_valid(), true);
|
||||
|
||||
int _item_size_x = item_template->get_inventory_size_x();
|
||||
int _item_size_y = item_template->get_inventory_size_y();
|
||||
|
||||
ERR_FAIL_COND_V(x + _item_size_x > _size_x || y + _item_size_y > _size_y, false);
|
||||
|
||||
int sx = x + _item_size_x;
|
||||
int sy = y + _item_size_y;
|
||||
|
||||
for (int xx = x; xx < sx; ++xx) {
|
||||
for (int yy = y; yy < sy; ++yy) {
|
||||
if (_space_map[xx * _size_x + yy] != 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
item->set_inventory_position_x(x);
|
||||
item->set_inventory_position_y(y);
|
||||
|
||||
_items.push_back(item);
|
||||
|
||||
int index = _items.size() - 1;
|
||||
|
||||
for (int xx = x; xx < sx; ++xx) {
|
||||
for (int yy = y; yy < sy; ++yy) {
|
||||
_space_map.set(xx * _size_x + yy, index);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
Ref<ItemInstance> Bag::get_item(const int index) {
|
||||
ERR_FAIL_COND_V(!has_method("_get_item"), Ref<ItemInstance>(NULL));
|
||||
|
||||
return call("_get_item", index);
|
||||
}
|
||||
|
||||
bool Bag::can_add_item_at(const int x, const int y, const Ref<ItemInstance> item) const {
|
||||
ERR_FAIL_COND_V(!item.is_valid(), false);
|
||||
ERR_FAIL_COND_V(x < 0 || y < 0, false);
|
||||
ERR_FAIL_COND_V(x > _size_x || y > _size_y, false);
|
||||
|
||||
int indx = _space_map[x * _size_x + y];
|
||||
|
||||
if (indx != 0) {
|
||||
Ref<ItemInstance> it = _items[indx];
|
||||
|
||||
if (it.is_valid()) {
|
||||
if (it->get_item_template() == item->get_item_template()) {
|
||||
//todo check stacks
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ref<ItemTemplate> item_template = item->get_item_template();
|
||||
|
||||
ERR_FAIL_COND_V(!item_template.is_valid(), true);
|
||||
|
||||
int _item_size_x = item_template->get_inventory_size_x();
|
||||
int _item_size_y = item_template->get_inventory_size_y();
|
||||
|
||||
ERR_FAIL_COND_V(x + _item_size_x > _size_x || y + _item_size_y > _size_y, false);
|
||||
|
||||
int sx = x + _item_size_x;
|
||||
int sy = y + _item_size_y;
|
||||
|
||||
for (int xx = x; xx < sx; ++xx) {
|
||||
for (int yy = y; yy < sy; ++yy) {
|
||||
if (_space_map[xx * _size_x + yy] != 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
int Bag::item_count_under_area(const int x, const int y, const int size_x, const int size_y) const {
|
||||
ERR_FAIL_COND_V(x < 0 || y < 0, false);
|
||||
ERR_FAIL_COND_V(x > _size_x || y > _size_y, false);
|
||||
|
||||
ERR_FAIL_COND_V(x + size_x > _size_x || y + size_y > _size_y, false);
|
||||
|
||||
int count = 0;
|
||||
int sx = x + size_x;
|
||||
int sy = y + size_y;
|
||||
|
||||
for (int xx = x; xx < sx; ++xx) {
|
||||
for (int yy = y; yy < sy; ++yy) {
|
||||
if (_space_map[xx * _size_x + yy] != 0) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
Ref<ItemInstance> Bag::remove_item(const int index) {
|
||||
ERR_FAIL_COND_V(!has_method("_remove_item"), Ref<ItemInstance>(NULL));
|
||||
|
||||
return call("_remove_item", index);
|
||||
}
|
||||
|
||||
Ref<ItemInstance> Bag::get_item(const int index) const {
|
||||
ERR_FAIL_INDEX_V(index, _items.size(), Ref<ItemInstance>(NULL));
|
||||
|
||||
return (_items.get(index));
|
||||
void Bag::swap_items(const int item1_index, const int item2_index) {
|
||||
ERR_FAIL_COND(!has_method("_swap_items"));
|
||||
|
||||
call("_swap_items", item1_index, item2_index);
|
||||
}
|
||||
|
||||
Ref<ItemInstance> Bag::get_and_remove_item(const int index) {
|
||||
ERR_FAIL_INDEX_V(index, _items.size(), Ref<ItemInstance>(NULL));
|
||||
|
||||
Ref<ItemInstance> item = _items.get(index);
|
||||
|
||||
_items.remove(index);
|
||||
|
||||
//Go over everything, to make sure item site changes won't cause bugs.
|
||||
for (int x = 0; x < _size_x; ++x) {
|
||||
for (int y = 0; y < _size_y ; ++y) {
|
||||
int indx = x * _size_x + y;
|
||||
|
||||
if (_space_map[indx] == index) {
|
||||
_space_map.set(indx, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return item;
|
||||
bool Bag::can_add_item(const Ref<ItemInstance> item) {
|
||||
ERR_FAIL_COND_V(!has_method("_can_add_item"), false);
|
||||
|
||||
return call("_can_add_item", item);
|
||||
}
|
||||
|
||||
void Bag::remove_item(const int index) {
|
||||
ERR_FAIL_INDEX(index, _items.size());
|
||||
|
||||
_items.remove(index);
|
||||
|
||||
//Go over everything, to make sure item site changes won't cause bugs.
|
||||
for (int x = 0; x < _size_x; ++x) {
|
||||
for (int y = 0; y < _size_y ; ++y) {
|
||||
int indx = x * _size_x + y;
|
||||
|
||||
if (_space_map[indx] == index) {
|
||||
_space_map.set(indx, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
int Bag::get_item_count() {
|
||||
ERR_FAIL_COND_V(!has_method("_get_item_count"), 0);
|
||||
|
||||
return call("_get_item_count");
|
||||
}
|
||||
|
||||
void Bag::basic_add_item(const Ref<ItemInstance> item) {
|
||||
_items.push_back(item);
|
||||
}
|
||||
void Bag::basic_remove_item(const int index){
|
||||
_items.remove(index);
|
||||
|
||||
int Bag::get_size() {
|
||||
ERR_FAIL_COND_V(!has_method("_get_size"), 0);
|
||||
|
||||
return call("_get_size");
|
||||
}
|
||||
|
||||
int Bag::get_item_count() const {
|
||||
return _items.size();
|
||||
void Bag::set_size(const int size) {
|
||||
ERR_FAIL_COND(!has_method("_set_size"));
|
||||
|
||||
call("_set_size");
|
||||
}
|
||||
|
||||
int Bag::get_space_map_entry(const int index) const {
|
||||
return _space_map[index];
|
||||
}
|
||||
void Bag::set_space_map_entry(const int index, const int value) {
|
||||
_space_map.set(index, value);
|
||||
}
|
||||
|
||||
int Bag::get_size_x() const {
|
||||
return _size_x;
|
||||
}
|
||||
int Bag::get_size_y() const {
|
||||
return _size_y;
|
||||
}
|
||||
|
||||
void Bag::set_size(const int x, const int y) {
|
||||
ERR_FAIL_COND(x == 0 || y == 0);
|
||||
ERR_FAIL_COND(_size_x != 0 || _size_y != 0);
|
||||
|
||||
_size_x = x;
|
||||
_size_y = y;
|
||||
|
||||
_space_map.resize(x * y);
|
||||
|
||||
for (int i = 0; i < _space_map.size(); ++i) {
|
||||
_space_map.set(i, 0);
|
||||
}
|
||||
bool Bag::is_full() {
|
||||
ERR_FAIL_COND_V(!has_method("_is_full"), true);
|
||||
|
||||
return call("_is_full");
|
||||
}
|
||||
|
||||
Bag::Bag() {
|
||||
_allowed_item_types = 0x1FFF;
|
||||
|
||||
_size_x = 0;
|
||||
_size_y = 0;
|
||||
_allowed_item_types = 0xFFFFFF;
|
||||
}
|
||||
|
||||
Bag::~Bag() {
|
||||
_items.clear();
|
||||
_space_map.clear();
|
||||
}
|
||||
|
||||
void Bag::_bind_methods() {
|
||||
ADD_SIGNAL(MethodInfo("changed", PropertyInfo(Variant::OBJECT, "bag", PROPERTY_HINT_RESOURCE_TYPE, "Bag")));
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_allowed_item_types"), &Bag::get_allowed_item_types);
|
||||
ClassDB::bind_method(D_METHOD("set_allowed_item_types", "count"), &Bag::set_allowed_item_types);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "allowed_item_types", PROPERTY_HINT_FLAGS, ItemEnums::BINDING_STRING_ITEM_TYPE_FLAGS), "set_allowed_item_types", "get_allowed_item_types");
|
||||
|
||||
BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::BOOL, "could_add"), "_add_item", PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance")));
|
||||
BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"), "_get_item", PropertyInfo(Variant::INT, "index")));
|
||||
BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance"), "_remove_item", PropertyInfo(Variant::INT, "index")));
|
||||
BIND_VMETHOD(MethodInfo("_swap_items", PropertyInfo(Variant::INT, "item1_index"), PropertyInfo(Variant::INT, "item2_index")));
|
||||
|
||||
BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::BOOL, "can"), "_can_add_item", PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "ItemInstance")));
|
||||
|
||||
BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::INT, "count"), "_get_item_count"));
|
||||
|
||||
BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::INT, "size"), "_get_size"));
|
||||
BIND_VMETHOD(MethodInfo("_set_size", PropertyInfo(Variant::INT, "size")));
|
||||
|
||||
BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::BOOL, "full"), "_is_full"));
|
||||
|
||||
ClassDB::bind_method(D_METHOD("add_item", "item"), &Bag::add_item);
|
||||
ClassDB::bind_method(D_METHOD("add_item_to_position", "x", "y", "item"), &Bag::add_item_to_position);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("can_add_item_at", "x", "y", "item"), &Bag::can_add_item_at);
|
||||
ClassDB::bind_method(D_METHOD("item_count_under_area", "x", "y", "item"), &Bag::item_count_under_area);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_item", "index"), &Bag::get_item);
|
||||
ClassDB::bind_method(D_METHOD("get_and_remove_item", "index"), &Bag::get_and_remove_item);
|
||||
ClassDB::bind_method(D_METHOD("remove_item", "index"), &Bag::remove_item);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("basic_add_item", "item"), &Bag::basic_add_item);
|
||||
ClassDB::bind_method(D_METHOD("basic_remove_item", "index"), &Bag::basic_remove_item);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("swap_items", "item1_index", "item2_index"), &Bag::swap_items);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("can_add_item", "item"), &Bag::can_add_item);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_item_count"), &Bag::get_item_count);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_space_map_entry", "index"), &Bag::get_space_map_entry);
|
||||
ClassDB::bind_method(D_METHOD("set_space_map_entry", "index", "value"), &Bag::set_space_map_entry);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_size_x"), &Bag::get_size_x);
|
||||
ClassDB::bind_method(D_METHOD("get_size_y"), &Bag::get_size_y);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_size", "x", "y"), &Bag::set_size);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_size"), &Bag::get_size);
|
||||
ClassDB::bind_method(D_METHOD("set_size", "size"), &Bag::set_size);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("is_full"), &Bag::is_full);
|
||||
}
|
||||
|
@ -17,27 +17,18 @@ public:
|
||||
void set_allowed_item_types(const int value);
|
||||
|
||||
bool add_item(Ref<ItemInstance> item);
|
||||
bool add_item_to_position(const int x, const int y, Ref<ItemInstance> item);
|
||||
Ref<ItemInstance> get_item(const int index);
|
||||
Ref<ItemInstance> remove_item(const int index);
|
||||
void swap_items(const int item1_index, const int item2_index);
|
||||
|
||||
bool can_add_item(Ref<ItemInstance> item);
|
||||
|
||||
bool can_add_item_at(const int x, const int y, const Ref<ItemInstance> item) const;
|
||||
int item_count_under_area(const int x, const int y, const int size_x, const int size_y) const;
|
||||
|
||||
Ref<ItemInstance> get_item(const int index) const;
|
||||
Ref<ItemInstance> get_and_remove_item(const int index);
|
||||
void remove_item(const int index);
|
||||
|
||||
void basic_add_item(const Ref<ItemInstance> item);
|
||||
void basic_remove_item(const int index);
|
||||
|
||||
int get_item_count() const;
|
||||
int get_item_count();
|
||||
|
||||
int get_space_map_entry(const int index) const;
|
||||
void set_space_map_entry(const int index, const int value);
|
||||
|
||||
int get_size_x() const;
|
||||
int get_size_y() const;
|
||||
|
||||
void set_size(const int x, const int y);
|
||||
int get_size();
|
||||
void set_size(const int size);
|
||||
|
||||
bool is_full();
|
||||
|
||||
//to_dict();
|
||||
//from_dict();
|
||||
@ -50,12 +41,6 @@ protected:
|
||||
|
||||
private:
|
||||
int _allowed_item_types;
|
||||
|
||||
int _size_x;
|
||||
int _size_y;
|
||||
|
||||
Vector<Ref<ItemInstance> > _items;
|
||||
Vector<int> _space_map;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
289
inventory/grid_bag.cpp
Normal file
289
inventory/grid_bag.cpp
Normal file
@ -0,0 +1,289 @@
|
||||
#include "grid_bag.h"
|
||||
|
||||
#include "../data/item_template.h"
|
||||
#include "../data/item_instance.h"
|
||||
|
||||
int GridBag::get_allowed_item_types() const {
|
||||
return _allowed_item_types;
|
||||
}
|
||||
|
||||
void GridBag::set_allowed_item_types(const int value) {
|
||||
_allowed_item_types = value;
|
||||
}
|
||||
|
||||
bool GridBag::add_item(Ref<ItemInstance> item) {
|
||||
ERR_FAIL_COND_V(!item.is_valid(), true);
|
||||
|
||||
Ref<ItemTemplate> item_template = item->get_item_template();
|
||||
|
||||
ERR_FAIL_COND_V(!item_template.is_valid(), true);
|
||||
|
||||
int _item_size_x = item_template->get_inventory_size_x();
|
||||
int _item_size_y = item_template->get_inventory_size_y();
|
||||
|
||||
for (int x = 0; x < _size_x - _item_size_x; ++x) {
|
||||
for (int y = 0; y < _size_y - _item_size_y; ++y) {
|
||||
if (_space_map[x * _size_x + y] == 0) {
|
||||
|
||||
bool found = true;
|
||||
for (int xx = x; xx < _item_size_x; ++xx) {
|
||||
for (int yy = y; yy < _item_size_y; ++yy) {
|
||||
if (_space_map[xx * _size_x + yy] != 0) {
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
break;
|
||||
}
|
||||
|
||||
if (found) {
|
||||
item->set_inventory_position_x(x);
|
||||
item->set_inventory_position_y(y);
|
||||
|
||||
_items.push_back(item);
|
||||
|
||||
int index = _items.size() - 1;
|
||||
|
||||
for (int xx = x; xx < _item_size_x; ++xx) {
|
||||
for (int yy = y; yy < _item_size_y; ++yy) {
|
||||
_space_map.set(xx * _size_x + yy, index);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GridBag::add_item_to_position(const int x, const int y, Ref<ItemInstance> item) {
|
||||
ERR_FAIL_COND_V(!item.is_valid(), false);
|
||||
ERR_FAIL_COND_V(x < 0 || y < 0, false);
|
||||
ERR_FAIL_COND_V(x > _size_x || y > _size_y, false);
|
||||
|
||||
Ref<ItemTemplate> item_template = item->get_item_template();
|
||||
|
||||
ERR_FAIL_COND_V(!item_template.is_valid(), true);
|
||||
|
||||
int _item_size_x = item_template->get_inventory_size_x();
|
||||
int _item_size_y = item_template->get_inventory_size_y();
|
||||
|
||||
ERR_FAIL_COND_V(x + _item_size_x > _size_x || y + _item_size_y > _size_y, false);
|
||||
|
||||
int sx = x + _item_size_x;
|
||||
int sy = y + _item_size_y;
|
||||
|
||||
for (int xx = x; xx < sx; ++xx) {
|
||||
for (int yy = y; yy < sy; ++yy) {
|
||||
if (_space_map[xx * _size_x + yy] != 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
item->set_inventory_position_x(x);
|
||||
item->set_inventory_position_y(y);
|
||||
|
||||
_items.push_back(item);
|
||||
|
||||
int index = _items.size() - 1;
|
||||
|
||||
for (int xx = x; xx < sx; ++xx) {
|
||||
for (int yy = y; yy < sy; ++yy) {
|
||||
_space_map.set(xx * _size_x + yy, index);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GridBag::can_add_item_at(const int x, const int y, const Ref<ItemInstance> item) const {
|
||||
ERR_FAIL_COND_V(!item.is_valid(), false);
|
||||
ERR_FAIL_COND_V(x < 0 || y < 0, false);
|
||||
ERR_FAIL_COND_V(x > _size_x || y > _size_y, false);
|
||||
|
||||
int indx = _space_map[x * _size_x + y];
|
||||
|
||||
if (indx != 0) {
|
||||
Ref<ItemInstance> it = _items[indx];
|
||||
|
||||
if (it.is_valid()) {
|
||||
if (it->get_item_template() == item->get_item_template()) {
|
||||
//todo check stacks
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ref<ItemTemplate> item_template = item->get_item_template();
|
||||
|
||||
ERR_FAIL_COND_V(!item_template.is_valid(), true);
|
||||
|
||||
int _item_size_x = item_template->get_inventory_size_x();
|
||||
int _item_size_y = item_template->get_inventory_size_y();
|
||||
|
||||
ERR_FAIL_COND_V(x + _item_size_x > _size_x || y + _item_size_y > _size_y, false);
|
||||
|
||||
int sx = x + _item_size_x;
|
||||
int sy = y + _item_size_y;
|
||||
|
||||
for (int xx = x; xx < sx; ++xx) {
|
||||
for (int yy = y; yy < sy; ++yy) {
|
||||
if (_space_map[xx * _size_x + yy] != 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
int GridBag::item_count_under_area(const int x, const int y, const int size_x, const int size_y) const {
|
||||
ERR_FAIL_COND_V(x < 0 || y < 0, false);
|
||||
ERR_FAIL_COND_V(x > _size_x || y > _size_y, false);
|
||||
|
||||
ERR_FAIL_COND_V(x + size_x > _size_x || y + size_y > _size_y, false);
|
||||
|
||||
int count = 0;
|
||||
int sx = x + size_x;
|
||||
int sy = y + size_y;
|
||||
|
||||
for (int xx = x; xx < sx; ++xx) {
|
||||
for (int yy = y; yy < sy; ++yy) {
|
||||
if (_space_map[xx * _size_x + yy] != 0) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
Ref<ItemInstance> GridBag::get_item(const int index) const {
|
||||
ERR_FAIL_INDEX_V(index, _items.size(), Ref<ItemInstance>(NULL));
|
||||
|
||||
return (_items.get(index));
|
||||
}
|
||||
|
||||
Ref<ItemInstance> GridBag::get_and_remove_item(const int index) {
|
||||
ERR_FAIL_INDEX_V(index, _items.size(), Ref<ItemInstance>(NULL));
|
||||
|
||||
Ref<ItemInstance> item = _items.get(index);
|
||||
|
||||
_items.remove(index);
|
||||
|
||||
//Go over everything, to make sure item site changes won't cause bugs.
|
||||
for (int x = 0; x < _size_x; ++x) {
|
||||
for (int y = 0; y < _size_y ; ++y) {
|
||||
int indx = x * _size_x + y;
|
||||
|
||||
if (_space_map[indx] == index) {
|
||||
_space_map.set(indx, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
void GridBag::remove_item(const int index) {
|
||||
ERR_FAIL_INDEX(index, _items.size());
|
||||
|
||||
_items.remove(index);
|
||||
|
||||
//Go over everything, to make sure item site changes won't cause bugs.
|
||||
for (int x = 0; x < _size_x; ++x) {
|
||||
for (int y = 0; y < _size_y ; ++y) {
|
||||
int indx = x * _size_x + y;
|
||||
|
||||
if (_space_map[indx] == index) {
|
||||
_space_map.set(indx, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GridBag::basic_add_item(const Ref<ItemInstance> item) {
|
||||
_items.push_back(item);
|
||||
}
|
||||
void GridBag::basic_remove_item(const int index){
|
||||
_items.remove(index);
|
||||
}
|
||||
|
||||
int GridBag::get_item_count() const {
|
||||
return _items.size();
|
||||
}
|
||||
|
||||
int GridBag::get_space_map_entry(const int index) const {
|
||||
return _space_map[index];
|
||||
}
|
||||
void GridBag::set_space_map_entry(const int index, const int value) {
|
||||
_space_map.set(index, value);
|
||||
}
|
||||
|
||||
int GridBag::get_size_x() const {
|
||||
return _size_x;
|
||||
}
|
||||
int GridBag::get_size_y() const {
|
||||
return _size_y;
|
||||
}
|
||||
|
||||
void GridBag::set_size(const int x, const int y) {
|
||||
ERR_FAIL_COND(x == 0 || y == 0);
|
||||
ERR_FAIL_COND(_size_x != 0 || _size_y != 0);
|
||||
|
||||
_size_x = x;
|
||||
_size_y = y;
|
||||
|
||||
_space_map.resize(x * y);
|
||||
|
||||
for (int i = 0; i < _space_map.size(); ++i) {
|
||||
_space_map.set(i, 0);
|
||||
}
|
||||
}
|
||||
|
||||
GridBag::GridBag() {
|
||||
_allowed_item_types = 0x1FFF;
|
||||
|
||||
_size_x = 0;
|
||||
_size_y = 0;
|
||||
}
|
||||
|
||||
GridBag::~GridBag() {
|
||||
_items.clear();
|
||||
_space_map.clear();
|
||||
}
|
||||
|
||||
void GridBag::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("get_allowed_item_types"), &GridBag::get_allowed_item_types);
|
||||
ClassDB::bind_method(D_METHOD("set_allowed_item_types", "count"), &GridBag::set_allowed_item_types);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "allowed_item_types", PROPERTY_HINT_FLAGS, ItemEnums::BINDING_STRING_ITEM_TYPE_FLAGS), "set_allowed_item_types", "get_allowed_item_types");
|
||||
|
||||
ClassDB::bind_method(D_METHOD("add_item", "item"), &GridBag::add_item);
|
||||
ClassDB::bind_method(D_METHOD("add_item_to_position", "x", "y", "item"), &GridBag::add_item_to_position);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("can_add_item_at", "x", "y", "item"), &GridBag::can_add_item_at);
|
||||
ClassDB::bind_method(D_METHOD("item_count_under_area", "x", "y", "item"), &GridBag::item_count_under_area);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_item", "index"), &GridBag::get_item);
|
||||
ClassDB::bind_method(D_METHOD("get_and_remove_item", "index"), &GridBag::get_and_remove_item);
|
||||
ClassDB::bind_method(D_METHOD("remove_item", "index"), &GridBag::remove_item);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("basic_add_item", "item"), &GridBag::basic_add_item);
|
||||
ClassDB::bind_method(D_METHOD("basic_remove_item", "index"), &GridBag::basic_remove_item);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_item_count"), &GridBag::get_item_count);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_space_map_entry", "index"), &GridBag::get_space_map_entry);
|
||||
ClassDB::bind_method(D_METHOD("set_space_map_entry", "index", "value"), &GridBag::set_space_map_entry);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_size_x"), &GridBag::get_size_x);
|
||||
ClassDB::bind_method(D_METHOD("get_size_y"), &GridBag::get_size_y);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_size", "x", "y"), &GridBag::set_size);
|
||||
|
||||
}
|
61
inventory/grid_bag.h
Normal file
61
inventory/grid_bag.h
Normal file
@ -0,0 +1,61 @@
|
||||
#ifndef GRID_BAG_H
|
||||
#define GRID_BAG_H
|
||||
|
||||
#include "core/reference.h"
|
||||
#include "core/vector.h"
|
||||
|
||||
#include "../item_enums.h"
|
||||
|
||||
class itemTemplate;
|
||||
class ItemInstance;
|
||||
|
||||
class GridBag : public Reference {
|
||||
GDCLASS(GridBag, Reference);
|
||||
|
||||
public:
|
||||
int get_allowed_item_types() const;
|
||||
void set_allowed_item_types(const int value);
|
||||
|
||||
bool add_item(Ref<ItemInstance> item);
|
||||
bool add_item_to_position(const int x, const int y, Ref<ItemInstance> item);
|
||||
|
||||
bool can_add_item_at(const int x, const int y, const Ref<ItemInstance> item) const;
|
||||
int item_count_under_area(const int x, const int y, const int size_x, const int size_y) const;
|
||||
|
||||
Ref<ItemInstance> get_item(const int index) const;
|
||||
Ref<ItemInstance> get_and_remove_item(const int index);
|
||||
void remove_item(const int index);
|
||||
|
||||
void basic_add_item(const Ref<ItemInstance> item);
|
||||
void basic_remove_item(const int index);
|
||||
|
||||
int get_item_count() const;
|
||||
|
||||
int get_space_map_entry(const int index) const;
|
||||
void set_space_map_entry(const int index, const int value);
|
||||
|
||||
int get_size_x() const;
|
||||
int get_size_y() const;
|
||||
|
||||
void set_size(const int x, const int y);
|
||||
|
||||
//to_dict();
|
||||
//from_dict();
|
||||
|
||||
GridBag();
|
||||
~GridBag();
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
private:
|
||||
int _allowed_item_types;
|
||||
|
||||
int _size_x;
|
||||
int _size_y;
|
||||
|
||||
Vector<Ref<ItemInstance> > _items;
|
||||
Vector<int> _space_map;
|
||||
};
|
||||
|
||||
#endif
|
112
inventory/normal_bag.cpp
Normal file
112
inventory/normal_bag.cpp
Normal file
@ -0,0 +1,112 @@
|
||||
#include "bag.h"
|
||||
|
||||
#include "../data/item_template.h"
|
||||
#include "../data/item_instance.h"
|
||||
|
||||
int Bag::get_allowed_item_types() const {
|
||||
return _allowed_item_types;
|
||||
}
|
||||
|
||||
void Bag::set_allowed_item_types(const int value) {
|
||||
_allowed_item_types = value;
|
||||
}
|
||||
|
||||
bool Bag::add_item(Ref<ItemInstance> item) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
Ref<ItemInstance> Bag::get_item(const int index) const {
|
||||
ERR_FAIL_INDEX_V(index, _items.size(), Ref<ItemInstance>(NULL));
|
||||
|
||||
return (_items.get(index));
|
||||
}
|
||||
|
||||
Ref<ItemInstance> Bag::remove_item(const int index) {
|
||||
ERR_FAIL_INDEX_V(index, _items.size(), Ref<ItemInstance>(NULL));
|
||||
|
||||
Ref<ItemInstance> item = _items.get(index);
|
||||
|
||||
_items.remove(index);
|
||||
|
||||
//Go over everything, to make sure item site changes won't cause bugs.
|
||||
for (int x = 0; x < _size_x; ++x) {
|
||||
for (int y = 0; y < _size_y ; ++y) {
|
||||
int indx = x * _size_x + y;
|
||||
|
||||
if (_space_map[indx] == index) {
|
||||
_space_map.set(indx, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
bool Bag::can_add_item(const Ref<ItemInstance> item) const {
|
||||
|
||||
}
|
||||
|
||||
int Bag::get_item_count() const {
|
||||
return _items.size();
|
||||
}
|
||||
|
||||
|
||||
int Bag::get_size() const {
|
||||
return _items.size();
|
||||
}
|
||||
|
||||
void Bag::set_size(const int x, const int y) {
|
||||
ERR_FAIL_COND(x == 0 || y == 0);
|
||||
ERR_FAIL_COND(_size_x != 0 || _size_y != 0);
|
||||
|
||||
_size_x = x;
|
||||
_size_y = y;
|
||||
|
||||
_space_map.resize(x * y);
|
||||
|
||||
for (int i = 0; i < _space_map.size(); ++i) {
|
||||
_space_map.set(i, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Bag::Bag() {
|
||||
_allowed_item_types = 0x1FFF;
|
||||
|
||||
_size = 0;
|
||||
}
|
||||
|
||||
Bag::~Bag() {
|
||||
_items.clear();
|
||||
}
|
||||
|
||||
void Bag::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("get_allowed_item_types"), &Bag::get_allowed_item_types);
|
||||
ClassDB::bind_method(D_METHOD("set_allowed_item_types", "count"), &Bag::set_allowed_item_types);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "allowed_item_types", PROPERTY_HINT_FLAGS, ItemEnums::BINDING_STRING_ITEM_TYPE_FLAGS), "set_allowed_item_types", "get_allowed_item_types");
|
||||
|
||||
ClassDB::bind_method(D_METHOD("add_item", "item"), &Bag::add_item);
|
||||
ClassDB::bind_method(D_METHOD("add_item_to_position", "x", "y", "item"), &Bag::add_item_to_position);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("can_add_item_at", "x", "y", "item"), &Bag::can_add_item_at);
|
||||
ClassDB::bind_method(D_METHOD("item_count_under_area", "x", "y", "item"), &Bag::item_count_under_area);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_item", "index"), &Bag::get_item);
|
||||
ClassDB::bind_method(D_METHOD("get_and_remove_item", "index"), &Bag::get_and_remove_item);
|
||||
ClassDB::bind_method(D_METHOD("remove_item", "index"), &Bag::remove_item);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("basic_add_item", "item"), &Bag::basic_add_item);
|
||||
ClassDB::bind_method(D_METHOD("basic_remove_item", "index"), &Bag::basic_remove_item);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_item_count"), &Bag::get_item_count);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_space_map_entry", "index"), &Bag::get_space_map_entry);
|
||||
ClassDB::bind_method(D_METHOD("set_space_map_entry", "index", "value"), &Bag::set_space_map_entry);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_size_x"), &Bag::get_size_x);
|
||||
ClassDB::bind_method(D_METHOD("get_size_y"), &Bag::get_size_y);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_size", "x", "y"), &Bag::set_size);
|
||||
|
||||
}
|
47
inventory/normal_bag.h
Normal file
47
inventory/normal_bag.h
Normal file
@ -0,0 +1,47 @@
|
||||
#ifndef BAG_H
|
||||
#define BAG_H
|
||||
|
||||
#include "core/reference.h"
|
||||
#include "core/vector.h"
|
||||
|
||||
#include "../item_enums.h"
|
||||
|
||||
class itemTemplate;
|
||||
class ItemInstance;
|
||||
|
||||
class Bag : public Reference {
|
||||
GDCLASS(Bag, Reference);
|
||||
|
||||
public:
|
||||
int get_allowed_item_types() const;
|
||||
void set_allowed_item_types(const int value);
|
||||
|
||||
bool add_item(Ref<ItemInstance> item);
|
||||
Ref<ItemInstance> get_item(const int index) const;
|
||||
Ref<ItemInstance> remove_item(const int index);
|
||||
|
||||
bool can_add_item(Ref<ItemInstance> item);
|
||||
|
||||
int get_item_count() const;
|
||||
|
||||
int get_size() const;
|
||||
void set_size(const int size);
|
||||
|
||||
bool is_full() const;
|
||||
|
||||
//to_dict();
|
||||
//from_dict();
|
||||
|
||||
Bag();
|
||||
~Bag();
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
private:
|
||||
int _allowed_item_types;
|
||||
int _item_count;
|
||||
Vector<Ref<ItemInstance> > _items;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user