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)
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))