DSZI_Survival/src/game/Map.py

158 lines
6.9 KiB
Python
Raw Normal View History

2020-04-05 22:49:50 +02:00
import json
import pygame
2020-04-06 10:35:58 +02:00
from src.entities.Interactable import Interactable
2020-04-05 23:42:41 +02:00
from src.game.TerrainTile import TerrainTile
from src.game.Screen import Locations
2020-04-05 22:49:50 +02:00
from src.entities.Entity import Entity
from src.entities.Pickupable import Pickupable
from src.entities.Statistics import Statistics
2020-05-09 22:30:21 +02:00
# TODO: Map should determine entities' position
2020-03-31 21:47:09 +02:00
class Map:
2020-04-03 23:09:00 +02:00
def __init__(self, filename, screen):
2020-05-09 22:30:21 +02:00
# TODO: Should map be self-aware of its own loacation?
self.screen = screen
# tekstowa macierz terenów
self.terrain = []
# tereny bez kolizji
2020-04-26 01:37:27 +02:00
self.terrainTilesList = []
# grupa objektów kolizyjnych (tereny kolizyjne i entities)
self.collidables = pygame.sprite.Group()
# lista wszystkich entity
2020-04-26 03:59:09 +02:00
self.entities = []
with open(filename, 'rt') as f:
for line in f:
self.terrain.append(line)
2020-04-03 23:07:12 +02:00
self.tileSize = int(self.screen.mapSize/20)
self.tileWidth = len(self.terrain[0])
self.tileHeight = len(self.terrain)
self.width = self.tileWidth * self.tileSize
self.height = self.tileHeight * self.tileSize
self.terrainDraw()
2020-04-05 14:53:54 +02:00
2020-04-05 23:14:21 +02:00
for entity in self.loadEntities(filename):
self.addEntity(entity)
2020-04-05 22:49:50 +02:00
# Returns a list of entities loaded from mapfile
def loadEntities(self, mapFileName):
2020-04-05 23:14:21 +02:00
mapFile = mapFileName.split('.txt')[0]
entitiesFilePath = mapFile + "Entities.json"
2020-04-05 22:49:50 +02:00
actualEntities = []
2020-04-05 23:14:21 +02:00
with open(entitiesFilePath, 'rt') as file:
entityListJson = json.loads(file.read())
for entity in entityListJson:
try:
2020-04-06 10:35:58 +02:00
# Creates a pickupable object
2020-04-05 23:14:21 +02:00
if entity["isPickupable"]:
2020-04-06 00:43:20 +02:00
actualEntities.append(Pickupable(entity["name"] + ".png",
2020-04-05 23:14:21 +02:00
self.tileSize,
(entity["position"]["x"] * self.tileSize, entity["position"]["y"] * self.tileSize),
Statistics(entity["effect"]["hp"],
entity["effect"]["hunger"],
entity["effect"]["thirst"],
entity["effect"]["stamina"])))
2020-04-06 10:35:58 +02:00
# Creates an interactable object
elif "effect" in entity:
actualEntities.append(Interactable(entity["name"] + ".png",
self.tileSize,
(entity["position"]["x"] * self.tileSize,
entity["position"]["y"] * self.tileSize),
Statistics(entity["effect"]["hp"],
entity["effect"]["hunger"],
entity["effect"]["thirst"],
entity["effect"]["stamina"])))
# Creates plain entity
2020-04-05 23:14:21 +02:00
else:
2020-04-06 00:43:20 +02:00
actualEntities.append(Entity(entity["name"] + ".png",
2020-04-05 23:14:21 +02:00
self.tileSize,
(entity["position"]["x"] * self.tileSize, entity["position"]["y"] * self.tileSize)))
except KeyError:
print("Failed to load entity " + entity)
2020-04-05 22:49:50 +02:00
return actualEntities
def terrainDraw(self):
for row, tiles in enumerate(self.terrain):
for col, tile in enumerate(tiles):
2020-04-05 22:07:37 +02:00
if tile == 's':
2020-04-26 01:37:27 +02:00
object = TerrainTile(col, row, 'sand.png', self.tileSize, 15)
self.screen.draw(object, Locations.MAP, 0, 0)
self.terrainTilesList.append(object)
2020-04-03 23:07:12 +02:00
elif tile == ',':
2020-04-26 01:37:27 +02:00
object = TerrainTile(col, row, 'floor.png', self.tileSize, 0)
self.screen.draw(object, Locations.MAP, 0, 0)
self.terrainTilesList.append(object)
2020-04-03 23:07:12 +02:00
elif tile == '.':
2020-04-26 01:37:27 +02:00
object = TerrainTile(col, row, 'grass.png', self.tileSize, 10)
self.screen.draw(object, Locations.MAP, 0, 0)
2020-04-26 01:37:27 +02:00
self.terrainTilesList.append(object)
2020-04-25 23:34:49 +02:00
elif tile == 'c':
2020-04-26 01:37:27 +02:00
object = TerrainTile(col, row, 'clay.png', self.tileSize, 20)
self.screen.draw(object, Locations.MAP, 0, 0)
self.terrainTilesList.append(object)
2020-04-05 21:46:04 +02:00
elif tile == 'x':
2020-04-25 23:34:49 +02:00
object = TerrainTile(col, row, 'water.png', self.tileSize, 0)
2020-04-05 21:46:04 +02:00
self.screen.draw(object, Locations.MAP, 0, 0)
self.collidables.add(object)
2020-04-05 22:07:37 +02:00
elif tile == 'w':
2020-04-25 23:34:49 +02:00
object = TerrainTile(col, row, 'wall.png', self.tileSize, 0)
2020-04-05 22:07:37 +02:00
self.screen.draw(object, Locations.MAP, 0, 0)
self.collidables.add(object)
2020-04-05 14:53:54 +02:00
2020-04-05 23:42:41 +02:00
def getEntityOnCoord(self, coord):
result = None
2020-04-26 03:59:09 +02:00
for entity in self.entities:
2020-04-05 23:43:15 +02:00
if entity.rect.x == coord[0] and entity.rect.y == coord[1]:
2020-04-05 23:42:41 +02:00
result = entity
return result
# W przypadku podania kordynatów playera, powinno zwrócić teren na którym jest player
def getTileOnCoord_old(self, coord):
2020-04-25 22:49:57 +02:00
result = None
for tile in self.terrainTilesList:
if tile.rect.x == coord[0] and tile.rect.y == coord[1]:
result = tile
2020-04-25 22:49:57 +02:00
return result
def getTileOnCoord(self, coord):
result = None
for tile in self.terrainTilesList:
if tile.rect.collidepoint(coord[0], coord[1]):
result = tile
break
return result
2020-04-26 03:59:09 +02:00
# TODO: REMOVE DONT ADD
def addEntity(self, entity, DONTADD=False):
2020-05-09 22:30:21 +02:00
# TODO: This method should set entities coords
2020-04-05 14:53:54 +02:00
self.screen.draw(entity, Locations.MAP, 0, 0)
# dodajemy bo wszystkie entity są kolizyjne
self.collidables.add(entity)
2020-04-26 03:59:09 +02:00
if not DONTADD:
self.entities.append(entity)
# Usuwa entity lub teren z mapy
def removeSpriteFromMap(self, sprite):
if self.collidables.has(sprite):
self.collidables.remove(sprite)
if sprite in self.entities:
self.entities.remove(sprite)
if sprite in self.terrainTilesList:
self.terrainTilesList.remove(sprite)
2020-05-09 22:30:21 +02:00
# TODO: Suspicious?
self.screen.removeSprite(sprite)
2020-04-05 20:20:37 +02:00
# add object to map.collidables list to be collidable
def collision(self, x, y):
for b in self.collidables:
if b.rect.x == x and b.rect.y == y:
return True
2020-04-05 22:49:50 +02:00
return False