Exemplo n.º 1
0
 def get(self, player_party_key, monster_party_key):
     _trace = TRACE+'LootHandler.get() '
     logging.info(_trace)   
     keys = [player_party_key, monster_party_key]
     parties = db.get(keys)
     _party = None
     npc_party = None
     for p in parties:
         if p.class_name() == 'NonPlayerParty':
             npc_party = p
         elif p.class_name() == 'PlayerParty':
             _party = p
     
     party_key = str(_party.key())
     _player = character.getJSONPlayer(_party.leader)
     gold, entities = party.getGoldLoot(npc_party, _party)
     db.put(entities)
     user = users.get_current_user()
                     
     template_values = {
         'player': _player,
         'party_key': party_key,
         'gold': gold,
         'user': user
     }        
     generate(self, 'character_quest.html', template_values)
Exemplo n.º 2
0
    def post(self, key, action):
        '''Invokes an action on a particular Party.
        '''
        _trace = TRACE+'APIParties:: post() '
        logging.info(_trace)  
        logging.info(_trace+'body = '+str(self.request.body))        
        _party = db.get(str(key))
        if _party is not None or _party.class_name() == 'Party':
            
            #Character attacks character(s) in Party Z using Item or Power      
            if action == 'attack':
                player_key = self.request.get('player_key')
                monster_keys = self.request.get_all('monster')
                attack_key = self.request.get('attack_key')
                location = self.request.get('location')
                monster_party_key = self.request.get('monster_party_key')
                missing = utils.findMissingParams(self, 
                                                  'player_key', 
                                                  'monster_keys',
                                                  'attack_key',                                                  
                                                  'location',
                                                  'monster_party_key')

                if missing is not None:
                    r = API400
                    r[MSG] = 'Required parameters not found:'+str(missing) 
                
                # Get Player    
                player = db.get(player_key)
                if player is None or player.class_name() != 'Player':
                    r = API404
                    r[MSG] = 'Player not found for player_key '+player_key+' .'                            
                    return self.response.out.write(simplejson.dumps(r))   
                
                
                monster_party = db.get(monster_party_key)
                if monster_party is None or monster_party.class_name() != 'NonPlayerParty':
                    r = API404
                    r[MSG] = 'Party not found for monster_party_key '+monster_party_key+' .'                            
                    return self.response.out.write(simplejson.dumps(r))                
                
                # Both Power.Attack and Item.Weapon are considered an 'attack'
                
                # Get Power-Attack or Item-Weapon from attack_key
                logging.info(_trace+'getting Attack!')
                attack = db.get(attack_key)             
                class_name = attack.class_name()
                if class_name != 'Attack' and class_name != 'Weapon':
                    r = API404
                    r[MSG] = 'Power or Item not found for attack_key '+attack_key+' .'                            
                    return self.response.out.write(simplejson.dumps(r))
                
                # Get Monsters  
                monsters = db.get(monster_keys)
                for m in monsters:
                    if m is None or m.class_name() != 'Monster':
                        r = API404
                        r[MSG] = 'Monster not found for monster_key '+str(m)+'.'                            
                        return self.response.out.write(simplejson.dumps(r))
                        monsters.remove(m)
                
                json_damage, entities = party.getJSONAttack(monster_party, 
                                                            monsters, 
                                                            player, 
                                                            attack)
                
                r = API200
                r[MSG] = 'Smite thy enemies!'
                r['monsters'] = json_damage 
                db.put(entities)                                                                              
                    
            # Character checkins in at a location seeking Parties, Traps or
            # Events.
            elif action == 'quest':
                logging.info(_trace+'action = quest')      
                player_key = self.request.get('player_key')
                location = self.request.get('location')
                if location is None or player_key is None:
                    r = API400
                    r[MSG] = 'Request is missing one or more parameters.' 
                    
                # Build location                
                geo_loc = utils.parseLocation(location)
                
                # Get Player
                player = db.get(str(player_key))
                logging.info(_trace+'player.class_name = '+player.class_name()) 
                if player is None or player.class_name() != 'Player':
                    r = API404
                    r[MSG] = 'Player not found for player_key '+player_key+' .'                            
                    return self.response.out.write(simplejson.dumps(r)) 
                    
                monster_party = party.getJSONQuest(_party, player, geo_loc)
                r = API200
                r[MSG] = 'Seeking fortune.'
                data = monster_party.json
                data['key'] = str(monster_party.key())
                r['NonPlayerParty'] = data

            #Character sends a message to character(s) in a Party.
            elif action == 'loot':
                monster_party_key = self.request.get('monster_party_key')
                monster_party = db.get(monster_party_key)
                if monster_party is None or monster_party.class_name() != 'NonPlayerParty':
                    r = API404
                    r[MSG] = 'Party not found for monster_party_key '+monster_party_key+' .'                            
                    return self.response.out.write(simplejson.dumps(r))
                                    
                gold, entities = party.getGoldLoot(monster_party, _party)
                db.put(entities)
                r = API200
                r['gold'] = gold
                r[MSG] = 'Treasure for a king!'
            
            #Character sends a message to character(s) in a Party.
            elif action == 'greet':
                # TODO:: get character a, party a, party b, location, skill.                 
            
                party.sendPartyMessage(party, player, message)
                r = API200
                r[MSG] = 'Do you speak Draconic?'
                
            else:
                r = API400
                r[MSG] = 'Invalid action \'action\'.'       

        else:
            r = API404
            r[MSG] = 'Party not found for key '+key+' .'
         

        return self.response.out.write(simplejson.dumps(r))