mirror of
https://github.com/illiumst/marl-factory-grid.git
synced 2025-05-23 15:26:43 +02:00
83 lines
2.3 KiB
Python
83 lines
2.3 KiB
Python
from collections import deque
|
|
|
|
from marl_factory_grid.environment.entity.entity import Entity
|
|
from marl_factory_grid.environment import constants as c
|
|
from marl_factory_grid.utils.utility_classes import RenderEntity
|
|
from marl_factory_grid.modules.items import constants as i
|
|
|
|
|
|
class Item(Entity):
|
|
|
|
var_can_collide = False
|
|
|
|
def render(self):
|
|
return RenderEntity(i.ITEM, self.pos) if self.pos != c.VALUE_NO_POS else None
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self._auto_despawn = -1
|
|
|
|
@property
|
|
def auto_despawn(self):
|
|
return self._auto_despawn
|
|
|
|
@property
|
|
def encoding(self):
|
|
# Edit this if you want items to be drawn in the ops differently
|
|
return 1
|
|
|
|
def set_auto_despawn(self, auto_despawn):
|
|
self._auto_despawn = auto_despawn
|
|
|
|
def set_pos_to(self, no_pos):
|
|
self._pos = no_pos
|
|
|
|
def summarize_state(self) -> dict:
|
|
super_summarization = super(Item, self).summarize_state()
|
|
super_summarization.update(dict(auto_despawn=self.auto_despawn))
|
|
return super_summarization
|
|
|
|
|
|
class DropOffLocation(Entity):
|
|
|
|
@property
|
|
def var_can_collide(self):
|
|
return False
|
|
|
|
@property
|
|
def var_can_move(self):
|
|
return False
|
|
|
|
@property
|
|
def var_is_blocking_light(self):
|
|
return False
|
|
|
|
@property
|
|
def var_has_position(self):
|
|
return True
|
|
|
|
def render(self):
|
|
return RenderEntity(i.DROP_OFF, self.pos)
|
|
|
|
@property
|
|
def encoding(self):
|
|
return i.SYMBOL_DROP_OFF
|
|
|
|
def __init__(self, *args, storage_size_until_full: int = 5, auto_item_despawn_interval: int = 5, **kwargs):
|
|
super(DropOffLocation, self).__init__(*args, **kwargs)
|
|
self.auto_item_despawn_interval = auto_item_despawn_interval
|
|
self.storage = deque(maxlen=storage_size_until_full or None)
|
|
|
|
def place_item(self, item: Item):
|
|
if self.is_full:
|
|
raise RuntimeWarning("There is currently no way to clear the storage or make it unfull.")
|
|
return bc.NOT_VALID
|
|
else:
|
|
self.storage.append(item)
|
|
item.set_auto_despawn(self.auto_item_despawn_interval)
|
|
return c.VALID
|
|
|
|
@property
|
|
def is_full(self):
|
|
return False if not self.storage.maxlen else self.storage.maxlen == len(self.storage)
|