Example #1
0
 def __init__(self):
     self.farms = []
     self.gameseed = int(time.time())
     self.gametime = int(time.time())
     self.current_farm = 0
     self.player = Player()
Example #2
0
class GameManager:

    def __init__(self):
        self.farms = []
        self.gameseed = int(time.time())
        self.gametime = int(time.time())
        self.current_farm = 0
        self.player = Player()

    def getfarm(self, farmid=None):
        if farmid is None:
            farmid = self.current_farm
        if len(self.farms) == 0:
            self.addfarm()
        try:
            return self.farms[farmid]
        except IndexError:
            return None

    def getfarmcount(self):
        return len(self.farms)

    def getcurrentfarmid(self):
        return self.current_farm

    def getnextfarmcost(self):
        farmcount = self.getfarmcount() - 1
        cost = 10000 + 12000 * farmcount
        return cost

    def addfarm(self):
        newfarm = FarmField(self)
        self.farms.append(newfarm)
        return newfarm

    def setcurrentfarm(self, farmid):
        if farmid > self.getfarmcount():
            farmid = self.getfarmcount() - 1
        self.current_farm = farmid
        return farmid

    def getgameseed(self):
        return self.gameseed

    def setgameseed(self, newseed):
        self.gameseed = newseed

    def getplayer(self):
        return self.player

    def update(self):
        """should be called 20 times per second"""
        # update selected item
        if self.player.selecteditem is not None and \
                not self.player.item_in_inventory(self.player.selecteditem):
            # clear selected item if player dont have it
            self.player.selecteditem = None
        # update farms
        for farm in self.farms:
            farm.update()

    def start_new_game(self):
        #self.farms = []
        farm = self.getfarm(0)
        farm.generate_random_stones()
        farm.generate_random_planks()

    def savegame(self):
        self.save_gamestate('field.json', self.player)

    def loadgame(self):
        result = self.load_gamestate('field.json', self.player)
        return result

    def timeforward(self):
        farm = self.getfarm(0)
        if farm.seconds_to_update > 1000:
            farm.seconds_to_update = 1000
        if farm.seconds_to_update:
            # 1 second is equal 20 updates
            for _ in xrange(farm.seconds_to_update):
                self.update()

    def save_gamestate(self, filename, player):
        print("Saveing game state...")
        data = DictMapper()
        # Save player data
        data["inventory"] = player.inventory
        data["itemscounter"] = player.itemscounter
        data["money"] = player.money
        data["watercanuses"] = player.watercanuses
        data["exp"] = player.exp
        data["nextlvlexp"] = player.nextlvlexp
        data["level"] = player.level
        # Save time
        data["gametime"] = int(time.time())
        data["gameseed"] = self.getgameseed()
        # save tiles
        data["fields"] = []

        # fill tiles
        for farmid in xrange(self.getfarmcount()):
            farm = self.getfarm(farmid)
            data["fields"].append({"tiles": []})
            for ftt in farm.farmtiles.keys():
                ft = farm.farmtiles[ftt]
                # skip when no seed
                if not ft['object']:
                    continue

                gameobject = ft['object']
                tile = {}
                tile["px"] = int(ftt.split('x')[0])
                tile["py"] = int(ftt.split('x')[1])
                tile["water"] = ft["water"]

                tile["object"] = {}
                # seed data
                tile["object"]["type"] = gameobject.type
                tile["object"]['id'] = gameobject.id

                if gameobject.type == "seed":
                    tile["object"]['growstarttime'] = gameobject.growstarttime
                    tile["object"]['growendtime'] = gameobject.growendtime
                    tile["object"]['growing'] = bool(gameobject.growing)
                    tile["object"]['to_harvest'] = bool(gameobject.to_harvest)
                    tile["object"]['harvestcount'] = gameobject.harvestcount
                # set tile
                data["fields"][farmid]["tiles"].append(tile)
        # save data
        data.save("field.json")
        return True

    def load_gamestate(self, filename, player):
        if not os.path.isfile(filename):
            return False
        print("Loading game state...")
        data = DictMapper()
        data.load(filename)
        player.inventory = data["inventory"]
        player.itemscounter = data["itemscounter"]
        player.watercanuses = data.get("watercanuses", 100)
        player.exp = data.get("exp", 0.0)
        player.nextlvlexp = data.get("nextlvlexp", 100.0)
        player.money = int(data.get("money", 1))
        player.level = int(data.get("level", 1))
        # loda game time
        self.seconds_to_update = int(time.time()) - data.get("gametime",
                                                             int(time.time()))
        seed = data.get("gameseed", int(time.time()))
        self.setgameseed(seed)

        # Migrate old farm
        if "fields" not in data.keys():
            data["fields"] = []
            data['fields'].append({})
            data['fields'][0]["tiles"] = data["tiles"]
        # load tiles
        for farmid in xrange(len(data["fields"])):
            farm = self.getfarm(farmid)
            if farm is None:
                farm = self.addfarm()
            # Restore tiles
            for tile in data["fields"][farmid]["tiles"]:
                px = tile["px"]
                py = tile["py"]
                # Avoid null objects
                if not tile["object"]:
                    continue

                # Restore seed or object
                if tile["object"]["type"] == "seed":
                    objectdata = tile["object"]
                    newobject = Seed()

                    newobject.id = objectdata["id"]
                    newobject.type = objectdata["type"]

                    newobject.to_harvest = objectdata["to_harvest"]
                    newobject.growing = objectdata["growing"]
                    newobject.growendtime = objectdata["growendtime"]
                    newobject.growstarttime = objectdata["growstarttime"]

                    farmtile = FarmTile(newobject)
                    farmtile["water"] = tile["water"]

                    # Apply global object data
                    newobject.apply_dict(objects[newobject.id])

                    # Restore harvest count
                    newobject.harvestcount = objectdata.get("harvestcount", 1)
                    newobject.requiredlevel = objectdata.get(
                        "requiredlevel", 1)
                else:
                    newobject = FarmObject()

                    newobject.id = tile["object"]["id"]
                    newobject.type = tile["object"]["type"]
                    # apply dict
                    newobject.apply_dict(objects[newobject.id])
                    farmtile = FarmTile(newobject)
                # set farmtile
                farm.set_farmtile(px, py, farmtile)
        # return
        return True