Ejemplo n.º 1
0
Archivo: World.py Proyecto: wkta/ld30
class World:
    '''this class models the world where the player is located'''

    @classmethod
    def __populate_universe(cls, pl_list ):
        ''' populating the list of nodes+associated radii '''
        while( len(pl_list) < NB_PLANETS):
            tmp = Planet()
            # if this doesnt fit our goals, we roll dices again!
            while cls.__is_bad_pick(tmp,pl_list):
                tmp = Planet()
            pl_list.append(tmp)

    @classmethod
    def __is_bad_pick(cls, t_planet, pl_list):
        if (t_planet.x+t_planet.rad>=DISP_W-1) or (t_planet.x-t_planet.rad<=0):
            return True
        if (t_planet.y+t_planet.rad>=DISP_H-1) or (t_planet.y-t_planet.rad<=BORDER_UP):
            return True
        for oth_planet in pl_list:
            if t_planet.overlaps( oth_planet):
                return True
        return False


    #
    #   CONSTRUCTOR ---------------------------------------------
    #
    def __init__(self):
        self.game_restart = False
        self.__info_o2 = None
        self.__info_food = None
        self.__info_water = None
        self.__bars_init = False
        self.paused = False
        self.__lost = False
        self.__rewards = dict()
        self.__game_exit = False;
        self.__bars_init = False
        #the player has not landed at the beginning
        self.__id_p_player = None

        self.resetLinks()

        self.__l_planets = list()
        World.__populate_universe(  self.__l_planets )


    def signalQuit(self):
        self.__game_exit = True;

    def isGameLost(self):
        return self.__lost

    def getDefeatCause(self):
        if(not self.__lost):
            raise Exception('bad usage, player did not loose yet')

        if( self.__info_o2.isFinished() ):
            return "You died of hypoxemia!"
        if( self.__info_water.isFinished() ):
            return "You died of dehydration!"
        if( self.__info_food.isFinished() ):
            return "You died of starvation!"
        
    def gameRestart(self):
        return self.game_restart

    def gameExit(self):
        return self.__game_exit

    def resetLinks(self):
        self.__assoc_id_lk = dict()
        self.__ids_reachable_planets = list()
        #there are no teleport links in the beginning
        self.__links = list()


    def produceReward(self):

        #generating
        res = None
        if( self.__id_p_player in self.__rewards ):
            res = self.__rewards[ self.__id_p_player]
        else:
            res = random.choice(REWARDS)
            self.__rewards[ self.__id_p_player ] = res

        #updating bars
        if res==None:
            raise Exception('cannot produce reward!')
        if( res==REWARD_O2):
            self.incrOxygen()
        elif( res==REWARD_FOOD):
            self.incrFood()
        elif( res==REWARD_WATER):
            self.incrAmmu()
        self.last_reward = res

    def getDescLastReward(self):
        if( self.last_reward==REWARD_O2):
            return "oxygen."
        if( self.last_reward==REWARD_FOOD):
            return "food."
        if( self.last_reward==REWARD_WATER):
            return "water."


    def getPlanets(self):
        return self.__l_planets

    def getLinks(self):
        return self.__links

    def isPaused(self):
        return self.paused


    def isPlayerHere(self, planet):
        return planet.getId()==self.__id_p_player

    def getIdPlayersPlanet(self):
        return self.__id_p_player

    #landing  / teleporting 
    def setIdPlayersPlanet(self,p_id): 
        if not (p_id in self.__ids_reachable_planets):
            self.__ids_reachable_planets.append(p_id )
        else:
            #sound
            SfxPlayer.teleport()

        found = False
        for pl in self.__l_planets:
            if pl.getId()==p_id:
                found = True
                self.current_coords = (pl.x,pl.y)
                self.__id_p_player = p_id
                break
        if(not found ):
            raise Exception('cannot set players planet to '+str(p_id) )

        #init bars if the player just landed
        if not self.__bars_init:
            self.__info_o2 = ProgressBar( RESSOURCE_DUR ,False)
            self.__info_food = ProgressBar( RESSOURCE_DUR ,False)
            self.__info_water = ProgressBar( RESSOURCE_DUR ,False)
            self.__bars_init =True

    def pause(self):
        self.__info_o2.pause() 
        self.__info_food.pause() 
        self.__info_water.pause()
        self.paused = True
 
    def unpause(self):
        self.__info_o2.unpause() 
        self.__info_food.unpause() 
        self.__info_water.unpause()
        self.paused = False
 
        


    def incrOxygen(self):
        self.__info_o2.addDuration( INCREMENT_DURATION)

    def incrFood(self):
        self.__info_food.addDuration( INCREMENT_DURATION)

    def incrAmmu(self):
        self.__info_water.addDuration( INCREMENT_DURATION)

    def update(self):
        self.__info_o2.update()
        self.__info_food.update()
        self.__info_water.update()

        # if a progress bar arrived to 0, the player lost
        if( self.__info_o2.isFinished() ):
            self.__lost = True
        if( self.__info_food.isFinished() ):
            self.__lost = True
        if( self.__info_water.isFinished() ):
            self.__lost = True

    def getInfo(self):
        res = list()
        res.append( compl("Oxygen:")+ str(self.__info_o2) )
        res.append( compl("Water:")+ str(self.__info_water) )
        res.append( compl("Food:")+ str(self.__info_food) )
        return res

    def addLink(self, lk_dest, id_p  ):
        ''' lk_dest represents a pair of coord for the dest planet'''

        tmp_lk = (self.current_coords, lk_dest) 
        if( id_p in self.__assoc_id_lk.keys() and
            tmp_lk in self.__assoc_id_lk[id_p ]  ):
            return

        if(len(self.__links) >= NB_EDGES ):
            raise Exception('max nb edges')

        #add a new edge
        try:
            self.__assoc_id_lk[ id_p ]
        except Exception:
            self.__assoc_id_lk[ id_p ]= list()
        self.__assoc_id_lk[ id_p ].append( tmp_lk)
        self.__links.append( tmp_lk )
        self.__ids_reachable_planets.append( id_p )

        #sound
        SfxPlayer.buildStuff()
    


    def hasMaxTeleporters(self):
        return (len(self.__links) >= NB_EDGES )

    def getIdsRP(self):
        return self.__ids_reachable_planets

    def getCurrentCoord(self):
        return self.current_coords