class ZomFrame(object):
    def __init__(self):
        self.racoonCity = World()
        self.new_game("./zom/eric_Zombie.zom", "./zom/deer.zom")

    def generate_zombies(self, city, file_path):
        # generate zombies
        assert isinstance(city, World)
        for i in range(settings.NUMBER_OF_ZOMBIES):
            zombieMachineState = MachineState()
            zombieMachineState.m_Traits = ZombieTraits()
            # get a passable random location
            while True:
                x = random.randrange(0, settings.CITY_SIZE)
                y = random.randrange(0, settings.CITY_SIZE)
                if city.isPassable(x, y):
                    break
            zombieMachineState.m_X = x
            zombieMachineState.m_Y = y
            zombieMachineState.m_Facing = random.choice(["Up", "Right", "Down", "Left"])

            # load machine
            zombieMachineState.m_Machine = Machine()
            zombieMachineState.m_Machine.LoadMachine(file_path)

            city.zombies.append(zombieMachineState)

    def generate_humans(self, city, file_path):
        # generate humans
        assert isinstance(city, World)
        for i in range(settings.NUMBER_OF_HUMANS):
            humanMachineState = MachineState()
            humanMachineState.m_Traits = HumanTraits()
            # get a passable random location
            while True:
                x = random.randrange(0, settings.CITY_SIZE)
                y = random.randrange(0, settings.CITY_SIZE)
                if city.isPassable(x, y):
                    break
            humanMachineState.m_X = x
            humanMachineState.m_Y = y
            humanMachineState.m_Facing = random.choice(["Up", "Right", "Down", "Left"])
            humanMachineState.m_Memory = [0 for i in range(settings.HUMAN_MEMORY)]
            # load machine
            humanMachineState.m_Machine = Machine()
            humanMachineState.m_Machine.LoadMachine(file_path)

            city.humans.append(humanMachineState)

    def start(self):
        #while self.racoonCity.zombies and self.racoonCity.humans:
        while True:
            self.take_turn()
            time.sleep(1)

    def take_turn(self):
        # zombies take turn
        for zombie in self.racoonCity.zombies:
            zombie.m_Machine.TakeTurn(zombie, self.racoonCity)

        # humans take turn
        for human in self.racoonCity.humans:
            human.m_Machine.TakeTurn(human, self.racoonCity)

        self.racoonCity.month += 1

    def new_game(self, zom_path, hum_path):
        self.racoonCity.newGame()
        self.generate_zombies(self.racoonCity, zom_path)
        self.generate_humans(self.racoonCity, hum_path)