コード例 #1
0
ファイル: tests.py プロジェクト: bsmi021/aws_rpggame
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}.')
コード例 #2
0
ファイル: create.py プロジェクト: bsmi021/aws_rpggame
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
コード例 #3
0
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
コード例 #4
0
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
コード例 #5
0
ファイル: get.py プロジェクト: bsmi021/aws_rpggame
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
コード例 #6
0
ファイル: claim_loot.py プロジェクト: bsmi021/aws_rpggame
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.'})
        }
コード例 #7
0
ファイル: charlist.py プロジェクト: bsmi021/aws_rpggame
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}')
コード例 #8
0
ファイル: list.py プロジェクト: bsmi021/aws_rpggame
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
コード例 #9
0
ファイル: tests.py プロジェクト: bsmi021/aws_rpggame
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())
コード例 #10
0
            },
            "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 },
コード例 #11
0
ファイル: create_loot.py プロジェクト: bsmi021/aws_rpggame
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)