diff --git a/survival/ai/graph_search.py b/survival/ai/graph_search.py index 295c6d1..6c4b58b 100644 --- a/survival/ai/graph_search.py +++ b/survival/ai/graph_search.py @@ -8,6 +8,7 @@ from survival.components.position_component import PositionComponent from survival.components.resource_component import ResourceComponent from survival.game.enums import Direction from survival.esper import World +from survival.systems.consumption_system import ConsumeComponent class Action(Enum): @@ -35,9 +36,11 @@ class Action(Enum): if action == Action.ROTATE_LEFT: world.add_component(entity, DirectionChangeComponent( Direction.rotate_left(world.component_for_entity(entity, PositionComponent).direction))) + world.add_component(entity, ConsumeComponent(0.2)) elif action == Action.ROTATE_RIGHT: world.add_component(entity, DirectionChangeComponent( Direction.rotate_right(world.component_for_entity(entity, PositionComponent).direction))) + world.add_component(entity, ConsumeComponent(0.2)) else: world.add_component(entity, MovingComponent()) return action diff --git a/survival/components/consumption_component.py b/survival/components/consumption_component.py index 7294a29..7a0a3c1 100644 --- a/survival/components/consumption_component.py +++ b/survival/components/consumption_component.py @@ -1,5 +1,6 @@ +from survival.generators.resource_type import ResourceType + + class ConsumptionComponent: - def __init__(self, inventory_state=0): - self.timer_value: float = 2000 - self.timer: float = self.timer_value - self.last_inventory_state = inventory_state + def __init__(self): + self.status = {ResourceType.FOOD: 1, ResourceType.WOOD: 1, ResourceType.WATER: 1} diff --git a/survival/components/inventory_component.py b/survival/components/inventory_component.py index 72b2f73..20a795e 100644 --- a/survival/components/inventory_component.py +++ b/survival/components/inventory_component.py @@ -17,6 +17,9 @@ class InventoryComponent: if self.items[item] < 0: self.items[item] = 0 + def count(self, item): + return self.items[item] + def has_item(self, item): return item in self.items and self.items[item] != 0 diff --git a/survival/generators/player_generator.py b/survival/generators/player_generator.py index 9f1f033..3fca0e5 100644 --- a/survival/generators/player_generator.py +++ b/survival/generators/player_generator.py @@ -25,7 +25,7 @@ class PlayerGenerator: inv = InventoryComponent() for resource in ResourceType: inv.add_item(resource, STARTING_RESOURCES_AMOUNT) - world.add_component(player, ConsumptionComponent(inv.total_items_count())) + world.add_component(player, ConsumptionComponent()) world.add_component(player, inv) camera_target = CameraTargetComponent(pos) world.add_component(player, camera_target) diff --git a/survival/systems/collision_system.py b/survival/systems/collision_system.py index e6ef9c3..5ae7ec0 100644 --- a/survival/systems/collision_system.py +++ b/survival/systems/collision_system.py @@ -5,6 +5,7 @@ from survival.components.on_collision_component import OnCollisionComponent from survival.components.moving_component import MovingComponent from survival.components.position_component import PositionComponent from survival.game.enums import Direction +from survival.systems.consumption_system import ConsumeComponent class CollisionSystem(esper.Processor): @@ -34,6 +35,7 @@ class CollisionSystem(esper.Processor): else: self.map.move_entity(pos.grid_position, moving.target) + self.world.add_component(ent, ConsumeComponent(self.map.get_cost(moving.target))) pos.grid_position = moving.target def check_collision(self, pos): diff --git a/survival/systems/consumption_system.py b/survival/systems/consumption_system.py index 1bad298..b60db06 100644 --- a/survival/systems/consumption_system.py +++ b/survival/systems/consumption_system.py @@ -1,30 +1,64 @@ +import random + from survival import esper from survival.components.consumption_component import ConsumptionComponent from survival.components.inventory_component import InventoryComponent from survival.components.learning_component import LearningComponent +from survival.components.moving_component import MovingComponent from survival.generators.resource_type import ResourceType +class ConsumeComponent: + def __init__(self, cost): + self.cost = cost + + class ConsumptionSystem(esper.Processor): + CONSUMPTION_FACTOR = 0.05 + CONSUMPTION_RANGE = 0.07 + def __init__(self, callback): self.callback = callback def process(self, dt): - for ent, (cons, inventory) in self.world.get_components(ConsumptionComponent, InventoryComponent): - cons.timer -= dt - if cons.timer > 0: - continue - cons.timer = cons.timer_value + cons: ConsumptionComponent + inventory: InventoryComponent + c: ConsumeComponent + for ent, (cons, inventory, c) in self.world.get_components(ConsumptionComponent, InventoryComponent, + ConsumeComponent): + for resource in cons.status.keys(): + cons.status[resource] -= c.cost * self.CONSUMPTION_FACTOR + random.uniform(-self.CONSUMPTION_RANGE, + self.CONSUMPTION_RANGE) + if cons.status[resource] < 0: + inventory.items[resource] -= 1 + cons.status[resource] = 1 if self.world.has_component(ent, LearningComponent): - # If no item was picked up - if cons.last_inventory_state == inventory.total_items_count(): - learning: LearningComponent = self.world.component_for_entity(ent, LearningComponent) - learning.reward += -10 - learning.done = True - cons.last_inventory_state = inventory.total_items_count() + for resource in cons.status.keys(): + if inventory.items[resource] <= 0 and self.world.has_component(ent, LearningComponent): + # If entity has run out of items + learning: LearningComponent = self.world.component_for_entity(ent, LearningComponent) + learning.reward -= 1 + learning.done = True + break else: - if inventory.has_item(ResourceType.FOOD): - inventory.remove_item(ResourceType.FOOD, 1) - else: - self.callback() + self.callback(ent) + + self.world.remove_component(ent, ConsumeComponent) + # cons.timer -= dt + # if cons.timer > 0: + # continue + # cons.timer = cons.timer_value + # + # if self.world.has_component(ent, LearningComponent): + # # If no item was picked up + # if cons.last_inventory_state == inventory.total_items_count(): + # learning: LearningComponent = self.world.component_for_entity(ent, LearningComponent) + # learning.reward += -10 + # learning.done = True + # cons.last_inventory_state = inventory.total_items_count() + # else: + # if inventory.has_item(ResourceType.FOOD): + # inventory.remove_item(ResourceType.FOOD, 1) + # else: + # self.callback()