def get_fight(id): fight = FightModel.get(id) while fight.enemy.status == 'ALIVE': # time.sleep(1) fight = FightModel.get(id) print( f'Prev HP: {fight.enemy.prev_hp} | Current HP: {fight.enemy.curr_hp}.')
def create(event, context): logger.debug(f'Event received: {json.dumps(event)}') data = _get_body(event) try: characters = data['characters'] character_list = [ Character(id=x['id'], attack_speed=x['attack_speed'], crit_chance=x['crit_chance'], curr_hp=x['curr_hp'], prev_hp=x['curr_hp'], base_hp=x['curr_hp'], min_damage=x['min_damage'], max_damage=x['max_damage']) for x in characters ] fight = FightModel(id=str(uuid4()), created_at=datetime.utcnow(), characters=character_list, connectionId=data.get('connectionId', '')) enemy_data = data['enemy'] enemy = Enemy(id=enemy_data['id'], can_block=enemy_data['can_block'], can_dodge=enemy_data['can_dodge'], block_amt=enemy_data['block_amt'], block_pct=enemy_data['block_pct'], dodge_pct=enemy_data['dodge_pct'], base_hp=enemy_data['hit_points'], curr_hp=enemy_data['hit_points'], prev_hp=enemy_data['hit_points'], min_damage=enemy_data.get('min_damage', 0), max_damage=enemy_data.get('max_damage', 0), can_crit=enemy_data.get('can_crit', False), crit_chance=enemy_data.get('crit_chance', 0), attack_speed=enemy_data.get('attack_speed', 0)) fight.enemy = enemy fight.save() for char in fight.characters: char_fight = CharacterFightModel(char_id=char.id, fight_id=fight.id, enemy_id=fight.enemy.id) char_fight.save() response = _get_response(200, json.dumps(fight, cls=ModelEncoder)) logger.debug(f'Response: {json.dumps(response)}') return response except Exception as ex: logger.error(f'Could not create fight: {ex}') response = _get_response(500, 'Could not create a fight') return response
def handler(event, context): """ handle enemy attack, they select from the characters in the fight randomly""" try: logger.debug(f'Event received: {json.dumps(event)}') fight_id = event['pathParameters']['id'] body = _get_body(event) fight = FightModel.get(fight_id) if not fight.is_active: raise Exception('Fight is over cannot attack') if fight.enemy.status == "DEAD": raise Exception('Enemy cannot attack when dead') enemy = fight.enemy character = random.choice(fight.characters) if character is None: raise Exception('Nobody to attack') if character.status == 'DEAD': raise Exception('Cannot attack a dead character') c_attack = _calc_attack(enemy, character) attack_amt = c_attack['attack_amt'] if attack_amt > 0: fight.update_character_hp(character.id, attack_amt) attack = AttackModel(source_id=enemy.id, source_tp='E', target_id=character.id, target_tp='C', fight_id=fight.id, attack_amt=attack_amt, is_blocked=c_attack['is_blocked'], block_amt=c_attack['block_amt'], is_critical=c_attack['is_critical'], is_missed=c_attack['is_missed'], is_dodged=c_attack['is_dodged'], t_prev_hp=character.prev_hp, t_curr_hp=character.curr_hp, attack_ts=datetime.utcnow()) attack.save() response = _get_response(200, json.dumps(attack, cls=ModelEncoder)) logger.debug(f'Event Response: {json.dumps(response)}') return response except Exception as ex: logger.error(f'Enemy could not attack: {ex}') response = _get_response(500, f'Enemy could not attack: {ex}') return response
def attack(event, context): logger.debug(f'Event received: {json.dumps(event)}') fight_id = event['pathParameters']['id'] data = json.loads(event['body']) character_id = data['character_id'] fight = FightModel.get(fight_id) if fight.enemy.status == "DEAD": raise Exception('Cannot attack a dead target') character = Enumerable( fight.characters).first_or_default(lambda x: x.id == character_id) if character is None: raise Exception('Character not in part') c_attack = calc_attack(character, fight) attack_amt = c_attack['attack_amt'] if attack_amt > 0: fight.update_enemy_hp(attack_amt) attack = AttackModel(source_id=character.id, source_tp='C', target_id=fight.enemy.id, target_tp='E', fight_id=fight.id, attack_amt=attack_amt, is_blocked=c_attack['is_blocked'], block_amt=c_attack['block_amt'], is_critical=c_attack['is_critical'], is_missed=c_attack['is_missed'], is_dodged=c_attack['is_dodged'], t_prev_hp=fight.enemy.prev_hp, t_curr_hp=fight.enemy.curr_hp, attack_ts=datetime.utcnow()) attack.save() response = { 'statusCode': 200, 'body': json.dumps(attack, cls=ModelEncoder), 'headers': { 'Access-Control-Allow-Origin': '*' } } logger.debug(f'Response: {json.dumps(response)}') return response
def get(event, context): logger.debug(f'Event received: {json.dumps(event)}') fight_id = event['pathParameters']['id'] fight = FightModel.get(fight_id) response = { 'statusCode': 200, 'body': json.dumps(fight, cls=ModelEncoder), 'headers': { 'Access-Control-Allow-Origin': '*' } } return response
def handler(event, context): logger.debug(f'Event received: {json.dumps(event)}') try: data = json.loads(event.get('body')) fight_id = event['pathParameters']['id'] fight = FightModel.get(fight_id) if fight is None: raise Exception(f'Could not find a fight for {fight_id}') char_id = data['char_id'] character = Enumerable( fight.characters).first_or_default(lambda c: c.id == char_id) if character is None: raise Exception( f'No character found for {char_id} in fight {fight_id}') character.loot_claimed = True fight.save() response = { 'statusCode': 200, 'body': json.dumps(fight, cls=ModelEncoder), 'headers': { 'Access-Control-Allow-Origin': '*' } } logger.debug(f'Response: {json.dumps(response)}') return response except Exception as e: if hasattr(e, 'message'): logger.error(f'Error: {e.message}') else: logger.error(e) return { 'statusCode': 500, 'body': json.dumps({'error': 'Could not create loot.'}) }
def list (event, context): logger.debug(f'Event received: {json.dumps(event)}') query = None results = [] # query params {enemy_id, char_id, status} char_id = event['pathParameters']['id'] fights = CharacterFightModel.scan( CharacterFightModel.char_id == char_id) for c_fight in fights: fight = FightModel.get(c_fight.fight_id) results.append(fight) response = { 'statusCode': 200, 'body': json.dumps( { "fights": [x for x in results] }, cls=ModelEncoder ), 'headers': { 'Access-Control-Allow-Origin': '*' } } logger.debug(f'Response: {json.dumps(response)}') return response # if (queryParams.get('char_id') is not None): # fights = CharacterFightModel.scan( # CharacterFightModel.char_id == queryParams.get('char_id')) # for fight in fights: # clause = FightModel.id == fight.fight_id # logger.info(f'Fight Id: {fight.fight_id}') # query = clause if query is None else query & clause # logger.info(f'query {query}')
def list(event, context): logger.debug(f'Event received: {json.dumps(event)}') query = None # query params {enemy_id, char_id, status} if 'queryStringParameters' in event: queryParams = event.get('queryStringParameters') if queryParams is not None: if (queryParams.get('enemy_id') is not None): clause = FightModel.enemy.id == queryParams.get('enemy_id') query = clause if query is None else query & clause results = FightModel.scan(query) response = { 'statusCode': 200, 'body': json.dumps({"fights": [x for x in results]}, cls=ModelEncoder), 'headers': { 'Access-Control-Allow-Origin': '*' } } logger.debug(f'Response: {json.dumps(response)}') return response
def get_fight(id): fight = FightModel.get(id) while fight.enemy.status == 'ALIVE': # time.sleep(1) fight = FightModel.get(id) print( f'Prev HP: {fight.enemy.prev_hp} | Current HP: {fight.enemy.curr_hp}.') if __name__ == "__main__": os.environ['ENV'] = '1' if not FightModel.exists(): FightModel.create_table(read_capacity_units=5, write_capacity_units=100, wait=True) if not AttackModel.exists(): AttackModel.create_table(read_capacity_units=5, write_capacity_units=5, wait=True) if not CharacterFightModel.exists(): CharacterFightModel.create_table(read_capacity_units=5, write_capacity_units=5, wait=True) for result in AttackModel.scan(): print(json.dumps(result, cls=ModelEncoder)) # print(AttackModel.scan())
}, "body": json.dumps({ "character_id": character['id'] }) } response = attack(request, None) print (json.dumps(response['body'])) time.sleep(character['attack_speed'] * .001) if __name__ == "__main__": os.environ['ENV'] = '1' # create the tables in dynamodb-local if they don't exist if not FightModel.exists(): FightModel.create_table(read_capacity_units=5, write_capacity_units=100, wait=True) if not AttackModel.exists(): AttackModel.create_table(read_capacity_units=5, write_capacity_units=5, wait=True) # create a fight characters = [ { "id":"1", "attack_speed":1600, "crit_chance": 0.17, "curr_hp": 1000, "min_damage":55, "max_damage": 128 }, { "id":"2", "attack_speed":1500, "crit_chance": 0.27, "curr_hp": 1000, "min_damage":75, "max_damage": 168 }, { "id":"3", "attack_speed":2700, "crit_chance": 0.29, "curr_hp": 1000, "min_damage":85, "max_damage": 228 }, { "id":"4", "attack_speed":1800, "crit_chance": 0.25, "curr_hp": 1000, "min_damage":45, "max_damage": 101 },
def handler(event, context): logger.debug(f'Event received') try: fight_id = event['pathParameters']['id'] data = json.loads(event.get('body')) fight = FightModel.get(fight_id) if fight is None: raise Exception(f'No fight found for id:{fight_id}') loot_list = Enumerable(data) for char in fight.characters: c_loot = loot_list.first_or_default( lambda x: x['char_id'] == char.id) if c_loot is None: continue char.loot_item_id = c_loot['item_id'] char.loot_claimed = False fight.save() response = { 'statusCode': 200, 'body': json.dumps(fight, cls=ModelEncoder), 'headers': { 'Access-Control-Allow-Origin': '*' } } logger.debug(f'Response: {json.dumps(response)}') return response except Exception as e: if hasattr(e, 'message'): logger.error(f'Error: {e.message}') else: logger.error(e) return { 'statusCode': 500, 'body': json.dumps({'error': 'Could not create loot.'}) } # if __name__ == "__main__": # from uuid import uuid4 # if not FightModel.exists(): # FightModel.create_table(read_capacity_units=5, # write_capacity_units=100, # wait=True) # from create import create as create_fight # characters = [ # { "id":"1", "attack_speed":1600, "crit_chance": 0.17, "curr_hp": 1000, "min_damage":55, "max_damage": 128 }, # { "id":"2", "attack_speed":1500, "crit_chance": 0.27, "curr_hp": 1000, "min_damage":75, "max_damage": 168 }, # { "id":"3", "attack_speed":2700, "crit_chance": 0.29, "curr_hp": 1000, "min_damage":85, "max_damage": 228 }, # { "id":"4", "attack_speed":1800, "crit_chance": 0.25, "curr_hp": 1000, "min_damage":45, "max_damage": 101 }, # { "id":"5", "attack_speed":2100, "crit_chance": 0.24, "curr_hp": 1000, "min_damage":65, "max_damage": 128 } # ] # fight_req = { # "enemy": { # "id": "111", # "can_block": True, # "can_dodge": True, # "block_pct": 0.05, # "block_amt": 0.51, # "dodge_pct": 0.07, # "hit_points": 3000 # }, # "characters": characters # } # fight_req = { # 'body': json.dumps(fight_req) # } # fight_response = create_fight(fight_req, None) # # print(fight_response) # fight_data = json.loads(fight_response.get('body')) # fight_id = fight_data['id'] # c_loot = [] # for c in characters: # loot_i = { # 'char_id': c.get('id'), # 'item_id': str(uuid4()) # } # c_loot.append(loot_i) # cr_loot_request = { # 'pathParameters': { # 'id': fight_id # }, # 'body': json.dumps(c_loot) # } # response = handler(cr_loot_request, None) # print(response)