2021-03-28 18:42:04 +02:00
|
|
|
import random
|
|
|
|
|
2021-05-23 14:33:21 +02:00
|
|
|
from survival import GameMap
|
2021-06-19 00:04:34 +02:00
|
|
|
from survival.components.on_collision_component import OnCollisionComponent
|
2021-05-24 13:10:10 +02:00
|
|
|
from survival.components.inventory_component import InventoryComponent
|
2021-06-06 19:55:55 +02:00
|
|
|
from survival.components.learning_component import LearningComponent
|
2021-03-28 18:42:04 +02:00
|
|
|
from survival.components.position_component import PositionComponent
|
2021-05-24 13:10:10 +02:00
|
|
|
from survival.components.resource_component import ResourceComponent
|
2021-03-28 18:42:04 +02:00
|
|
|
from survival.components.sprite_component import SpriteComponent
|
2021-05-23 14:33:21 +02:00
|
|
|
from survival.esper import World
|
2021-05-24 17:20:08 +02:00
|
|
|
from survival.generators.resource_type import ResourceType
|
2021-06-06 19:55:55 +02:00
|
|
|
from survival.settings import RESOURCES_AMOUNT, PLAYER_START_POSITION
|
2021-03-28 18:42:04 +02:00
|
|
|
|
|
|
|
|
|
|
|
class ResourceGenerator:
|
2021-06-06 19:55:55 +02:00
|
|
|
resources_amount = 0
|
|
|
|
|
2021-03-28 18:42:04 +02:00
|
|
|
def __init__(self, world, game_map):
|
|
|
|
self.world = world
|
|
|
|
self.map = game_map
|
|
|
|
|
2021-05-24 13:10:10 +02:00
|
|
|
def generate_resources(self, player: int):
|
2021-06-06 19:55:55 +02:00
|
|
|
ResourceGenerator.resources_amount = RESOURCES_AMOUNT
|
2021-03-28 18:56:32 +02:00
|
|
|
for x in range(RESOURCES_AMOUNT):
|
2021-03-28 18:42:04 +02:00
|
|
|
obj = self.world.create_entity()
|
2021-05-24 13:10:10 +02:00
|
|
|
sprites = {
|
|
|
|
ResourceType.FOOD: 'apple.png',
|
|
|
|
ResourceType.WATER: 'water.png',
|
|
|
|
ResourceType.WOOD: 'wood.png'
|
|
|
|
}
|
2021-03-28 18:42:04 +02:00
|
|
|
|
|
|
|
empty_grid_pos = self.get_empty_grid_position()
|
|
|
|
empty_pos = [empty_grid_pos[0] * 32, empty_grid_pos[1] * 32]
|
|
|
|
pos = PositionComponent(empty_pos, empty_grid_pos)
|
2021-05-24 13:10:10 +02:00
|
|
|
resource_type = random.choice(list(ResourceType))
|
|
|
|
sprite = SpriteComponent(sprites[resource_type])
|
2021-05-21 20:14:00 +02:00
|
|
|
col = OnCollisionComponent()
|
2021-06-19 00:04:34 +02:00
|
|
|
col.add_callback(self.remove_resource, world=self.world, game_map=self.map, resource_ent=obj, player=player)
|
2021-03-28 18:42:04 +02:00
|
|
|
self.world.add_component(obj, pos)
|
|
|
|
self.world.add_component(obj, sprite)
|
2021-05-21 20:14:00 +02:00
|
|
|
self.world.add_component(obj, col)
|
2021-05-24 13:10:10 +02:00
|
|
|
self.world.add_component(obj, ResourceComponent(resource_type))
|
2021-03-28 18:42:04 +02:00
|
|
|
self.map.add_entity(obj, pos)
|
|
|
|
|
|
|
|
def get_empty_grid_position(self):
|
|
|
|
free_pos = [random.randrange(self.map.width), random.randrange(self.map.height)]
|
2021-06-06 19:55:55 +02:00
|
|
|
while self.map.is_colliding(free_pos) or (
|
|
|
|
free_pos[0] == PLAYER_START_POSITION[0] and free_pos[1] == PLAYER_START_POSITION[1]):
|
2021-03-28 18:42:04 +02:00
|
|
|
free_pos = [random.randrange(self.map.width), random.randrange(self.map.height)]
|
|
|
|
return free_pos
|
2021-05-23 14:33:21 +02:00
|
|
|
|
|
|
|
@staticmethod
|
2021-06-06 19:55:55 +02:00
|
|
|
def remove_resource(world: World, game_map: GameMap, resource_ent: int, player: int):
|
2021-05-24 17:20:08 +02:00
|
|
|
pos = world.component_for_entity(resource_ent, PositionComponent)
|
|
|
|
resource = world.component_for_entity(resource_ent, ResourceComponent)
|
2021-05-24 13:10:10 +02:00
|
|
|
inventory = world.component_for_entity(player, InventoryComponent)
|
2021-06-06 19:55:55 +02:00
|
|
|
inventory.add_item(resource.resource_type, 1)
|
2021-05-23 14:33:21 +02:00
|
|
|
game_map.remove_entity(pos.grid_position)
|
2021-05-24 17:20:08 +02:00
|
|
|
world.delete_entity(resource_ent, immediate=True)
|
2021-06-06 19:55:55 +02:00
|
|
|
if world.has_component(player, LearningComponent):
|
|
|
|
learning = world.component_for_entity(player, LearningComponent)
|
2021-06-07 13:39:32 +02:00
|
|
|
learning.reward += 10
|
2021-06-06 19:55:55 +02:00
|
|
|
learning.score += 1
|
|
|
|
ResourceGenerator.resources_amount -= 1
|
|
|
|
if ResourceGenerator.resources_amount == 0:
|
|
|
|
learning.reward += 50
|
|
|
|
learning.done = True
|
|
|
|
|