Example #1
0
async def name_slimeoid(cmd):
    user_data = EwUser(member=cmd.message.author)
    slimeoid_data = EwSlimeoid(member=cmd.message.author)
    command_used = ""

    # Check if player is in the labs and has a slimeoid incubating
    response = basic_slimeoid_incubation_checks(
        channel_name=cmd.message.channel.name,
        user_data=user_data,
        slimeoid_data=slimeoid_data)
    # If response returns None go to final response

    # Lifestate check for flavor text
    if slimeoid_data.sltype == ewcfg.sltype_nega:
        slimeoidtype = "Negaslimeoid"
    else:
        slimeoidtype = "Slimeoid"

    if response is None:  # Slimeoid is incubating

        # Check if player has specified a name
        if cmd.tokens_count < 2:
            response = "You must specify a name."
            # Go to final response

        else:

            # Turn entire message minus "!nameslimeoid" in to name variable
            command_used = ewutils.flattenTokenListToString(cmd.tokens[0])
            name = cmd.message.content[(len(command_used) +
                                        len(ewcfg.cmd_prefix)):].strip()

            # Limit name length to 32 characters
            if len(name) > 32:
                response = "That name is too long. ({:,}/32)".format(len(name))
                # Go to final response

            else:
                # Save slimeoid name
                slimeoid_data.name = str(name)

                user_data.persist()
                slimeoid_data.persist()

                if slimeoidtype == "Slimeoid":
                    response = "You enter the name {} into the console.".format(
                        str(name))
                else:
                    response = "You move the planchette between letters, spelling out the name {}.".format(
                        str(name))
                # Go to final response

    # Final response
    await send_response(response, cmd)
Example #2
0
def delete_enemy(enemy_data):
    # print("DEBUG - {} - {} DELETED".format(enemy_data.id_enemy, enemy_data.display_name))
    enemy_data.clear_allstatuses()

    # If the enemy is a Slimeoid Trainer, delete its slimeoid.
    if enemy_data.enemytype in ewcfg.slimeoid_trainers:
        trainer_slimeoid = EwSlimeoid(id_user=enemy_data.id_enemy,
                                      id_server=enemy_data.id_server)
        trainer_slimeoid.delete()

    bknd_core.execute_sql_query(
        "DELETE FROM enemies WHERE {id_enemy} = %s".format(
            id_enemy=ewcfg.col_id_enemy), (enemy_data.id_enemy, ))
Example #3
0
def get_slimeoid_count(user_id=None, server_id=None):
    if user_id != None and server_id != None:
        count = 0
        slimeoid_data = EwSlimeoid(id_user=user_id, id_server=server_id)
        secondary_user = str(user_id) + "freeze"
        name_list = []
        if slimeoid_data.name != "":
            count += 1

        items = bknd_item.inventory(id_user=user_id,
                                    id_server=server_id,
                                    item_type_filter=ewcfg.it_item)

        bottles = []
        for item in items:
            item_data = EwItem(id_item=item.get('id_item'))
            if item_data.item_props.get(
                    'context') == ewcfg.context_slimeoidbottle:
                count += 1

        try:
            conn_info = bknd_core.databaseConnect()
            conn = conn_info.get('conn')
            cursor = conn.cursor()

            sql = "SELECT {} FROM slimeoids WHERE {} = %s"
            cursor.execute(sql.format(ewcfg.col_name, ewcfg.col_id_user),
                           [secondary_user])

            count += cursor.rowcount
        finally:
            # Clean up the database handles.
            cursor.close()
            bknd_core.databaseClose(conn_info)
            return count
Example #4
0
def get_slimeoids_resp(id_server, poi):
    slimeoids_resp = ""

    slimeoids_in_district = ewutils.get_slimeoids_in_poi(id_server=id_server, poi=poi.id_poi)

    for id_slimeoid in slimeoids_in_district:
        slimeoid_data = EwSlimeoid(id_slimeoid=id_slimeoid)
        if slimeoid_data.sltype == ewcfg.sltype_nega:
            slimeoids_resp += "\n{} is here.".format(slimeoid_data.name)

    return slimeoids_resp
Example #5
0
async def name_slimeoid(cmd):
    user_data = EwUser(member=cmd.message.author)
    slimeoid_data = EwSlimeoid(member=cmd.message.author)

    # Check if player is in the labs and has a slimeoid incubating
    response = basic_slimeoid_incubation_checks(
        channel_name=cmd.message.channel.name,
        user_data=user_data,
        slimeoid_data=slimeoid_data)
    # If response returns None go to final response

    if response is None:  # Slimeoid is incubating

        # Check if player has specified a name
        if cmd.tokens_count < 2:
            response = "You must specify a name."
            # Go to final response

        else:

            # Turn entire message minus "!nameslimeoid" in to name variable
            name = cmd.message.content[(len(ewcfg.cmd_nameslimeoid)):].strip()

            # Limit name length to 32 characters
            if len(name) > 32:
                response = "That name is too long. ({:,}/32)".format(len(name))
                # Go to final response

            else:
                # Save slimeoid name
                slimeoid_data.name = str(name)

                user_data.persist()
                slimeoid_data.persist()

                response = "You enter the name {} into the console.".format(
                    str(name))
                # Go to final response

    # Final response
    await send_response(response, cmd)
Example #6
0
def can_slimeoid_battle(challenger: EwUser = None,
                        challengee=None,
                        challenger_slimeoid: EwSlimeoid = None,
                        challengee_slimeoid: EwSlimeoid = None,
                        bet: int = 0):
    response = ""
    time_now = int(time.time())
    # Gotta have a challenger, otherwise do nothing
    if challenger:
        challenger_data = challenger
        challenger_player = EwPlayer(id_user=challenger_data.id_user)
        ally_slimeoid = None
        target_slimeoid = None

        # If supplied a slimeoid, use that - otherwise we just grab it
        if challenger_slimeoid:
            ally_slimeoid = challenger_slimeoid
        else:
            ally_slimeoid = EwSlimeoid(member=challenger)

        # Challenger

        if ally_slimeoid.life_state != ewcfg.slimeoid_state_active:
            response = "You do not have a Slimeoid ready to battle with!"

        elif challenger_data.life_state == ewcfg.life_state_corpse:
            response = "Your Slimeoid won't battle for you while you're dead."

        elif (time_now -
              ally_slimeoid.time_defeated) < ewcfg.cd_slimeoiddefeated:
            time_until = ewcfg.cd_slimeoiddefeated - (
                time_now - ally_slimeoid.time_defeated)
            response = "Your Slimeoid is still recovering from its last defeat! It'll be ready in {} seconds.".format(
                int(time_until))

        elif ewutils.active_slimeoidbattles.get(ally_slimeoid.id_slimeoid):
            response = "You are already in the middle of a challenge."

        elif challengee:
            if isinstance(challengee, EwEnemy):
                challengee_data = challengee
                is_pvp = False
            else:
                challengee_data = challengee
                challengee_player = EwPlayer(id_user=challengee.id_user)

            if challengee_slimeoid:
                target_slimeoid = challengee_slimeoid
            else:
                target_slimeoid = EwSlimeoid(member=challengee)

            if target_slimeoid.life_state != ewcfg.slimeoid_state_active:
                response = "{} does not have a Slimeoid ready to battle with!".format(
                    challengee_player.
                    display_name if is_pvp else challengee_data.display_name)

            elif challenger_data.poi != challengee_data.poi:
                response = "Both slimeoid trainers must be in the same place."

            elif challenger_data.slimes < bet or challenger_data.slimes < 0:
                response = "You don't have enough slime!"
            elif challengee_data.slimes < bet or challengee_data.slimes < 0:
                response = "They don't have enough slime!"

            elif challengee_data.life_state == ewcfg.life_state_corpse:
                response = "{}'s Slimeoid won't battle for them while they're dead.".format(
                    challengee_player.display_name).replace("@", "\{at\}")

            elif (time_now -
                  target_slimeoid.time_defeated) < ewcfg.cd_slimeoiddefeated:
                time_until = ewcfg.cd_slimeoiddefeated - (
                    time_now - target_slimeoid.time_defeated)
                response = "{}'s Slimeoid is still recovering from its last defeat! It'll be ready in {} seconds.".format(
                    challengee_player.display_name, int(time_until))

            elif ewutils.active_slimeoidbattles.get(
                    target_slimeoid.id_slimeoid):
                response = "They are already in the middle of a challenge."

        return response
Example #7
0
async def battle_slimeoids(id_s1, id_s2, challengee_name, challenger_name,
                           channel, battle_type):
    # fetch slimeoid data
    challengee_slimeoid = EwSlimeoid(id_slimeoid=id_s1)
    challenger_slimeoid = EwSlimeoid(id_slimeoid=id_s2)

    client = ewutils.get_client()

    # calculate starting hp
    s1hpmax = 50 + (challengee_slimeoid.level * 20)
    s2hpmax = 50 + (challenger_slimeoid.level * 20)

    # calculate starting sap
    s1sapmax = challengee_slimeoid.level * 2
    s2sapmax = challenger_slimeoid.level * 2

    # initialize combat data for challengee
    s1_combat_data = EwSlimeoidCombatData(
        name=str(challengee_slimeoid.name),
        weapon=sl_static.offense_map.get(challengee_slimeoid.weapon),
        armor=sl_static.defense_map.get(challengee_slimeoid.armor),
        special=sl_static.special_map.get(challengee_slimeoid.special),
        legs=sl_static.mobility_map.get(challengee_slimeoid.legs),
        brain=sl_static.brain_map.get(challengee_slimeoid.ai),
        hue=hue_static.hue_map.get(challengee_slimeoid.hue),
        coating=challengee_slimeoid.coating,
        moxie=challengee_slimeoid.atk + 1,
        grit=challengee_slimeoid.defense + 1,
        chutzpah=challengee_slimeoid.intel + 1,
        hpmax=s1hpmax,
        hp=s1hpmax,
        sapmax=s1sapmax,
        sap=s1sapmax,
        slimeoid=challengee_slimeoid,
        owner=challengee_name,
    )

    # initialize combat data for challenger
    s2_combat_data = EwSlimeoidCombatData(
        name=str(challenger_slimeoid.name),
        weapon=sl_static.offense_map.get(challenger_slimeoid.weapon),
        armor=sl_static.defense_map.get(challenger_slimeoid.armor),
        special=sl_static.special_map.get(challenger_slimeoid.special),
        legs=sl_static.mobility_map.get(challenger_slimeoid.legs),
        brain=sl_static.brain_map.get(challenger_slimeoid.ai),
        hue=hue_static.hue_map.get(challenger_slimeoid.hue),
        coating=challenger_slimeoid.coating,
        moxie=challenger_slimeoid.atk + 1,
        grit=challenger_slimeoid.defense + 1,
        chutzpah=challenger_slimeoid.intel + 1,
        hpmax=s2hpmax,
        hp=s2hpmax,
        sapmax=s2sapmax,
        sap=s2sapmax,
        slimeoid=challenger_slimeoid,
        owner=challenger_name,
    )

    s1_combat_data.apply_weapon_matchup(s2_combat_data)
    s2_combat_data.apply_weapon_matchup(s1_combat_data)

    s1_combat_data.apply_hue_matchup(s2_combat_data)
    s2_combat_data.apply_hue_matchup(s1_combat_data)

    # decide which slimeoid gets to move first
    s1_active = False
    in_range = False

    if challengee_slimeoid.defense > challenger_slimeoid.defense:
        s1_active = True
    elif challengee_slimeoid.defense == challenger_slimeoid.defense:
        coinflip = random.randrange(1, 3)
        if coinflip == 1:
            s1_active = True

    # flavor text for arena battles
    if battle_type == ewcfg.battle_type_arena:
        response = "**{} sends {} out into the Battle Arena!**".format(
            challenger_name, s2_combat_data.name)
        await fe_utils.send_message(client, channel, response)
        await asyncio.sleep(1)
        response = "**{} sends {} out into the Battle Arena!**".format(
            challengee_name, s1_combat_data.name)
        await fe_utils.send_message(client, channel, response)
        await asyncio.sleep(1)
        response = "\nThe crowd erupts into cheers! The battle between {} and {} has begun! :crossed_swords:".format(
            s1_combat_data.name, s2_combat_data.name)
        #		response += "\n{} {} {} {} {} {}".format(str(s1moxie),str(s1grit),str(s1chutzpah),str(challengee_slimeoid.weapon),str(challengee_slimeoid.armor),str(challengee_slimeoid.special))
        #		response += "\n{} {} {} {} {} {}".format(str(s2moxie),str(s2grit),str(s2chutzpah),str(challenger_slimeoid.weapon),str(challenger_slimeoid.armor),str(challenger_slimeoid.special))
        #		response += "\n{}, {}".format(str(challengee_resistance),str(challengee_weakness))
        #		response += "\n{}, {}".format(str(challenger_resistance),str(challenger_weakness))
        await fe_utils.send_message(client, channel, response)
        await asyncio.sleep(3)

    turncounter = 100
    # combat loop
    while s1_combat_data.hp > 0 and s2_combat_data.hp > 0 and turncounter > 0:
        # Limit the number of turns in battle.
        turncounter -= 1

        response = ""
        battlecry = random.randrange(1, 4)

        first_turn = (turncounter % 2) == 1

        # slimeoids regenerate their sap every odd turn
        if first_turn:
            s1_combat_data.sap = s1_combat_data.sapmax - s1_combat_data.hardened_sap
            s2_combat_data.sap = s2_combat_data.sapmax - s2_combat_data.hardened_sap

        # assign active and passive role for the turn
        if s1_active:
            active_data = s1_combat_data
            passive_data = s2_combat_data
        else:
            active_data = s2_combat_data
            passive_data = s1_combat_data

        # obtain action and how much sap to spend on it for both slimeoids
        active_strat, active_sap_spend = active_data.brain.get_strat(
            combat_data=active_data,
            active=True,
            in_range=in_range,
            first_turn=first_turn)
        passive_strat, passive_sap_spend = passive_data.brain.get_strat(
            combat_data=passive_data,
            active=False,
            in_range=in_range,
            first_turn=first_turn)

        # potentially add brain-based flavor text
        if active_strat == ewcfg.slimeoid_strat_attack and battlecry == 1:
            if (active_data.hpmax / active_data.hp) > 3:
                response = active_data.brain.str_battlecry_weak.format(
                    slimeoid_name=active_data.name)
            else:
                response = active_data.brain.str_battlecry.format(
                    slimeoid_name=active_data.name)
            await fe_utils.send_message(client, channel, response)
            await asyncio.sleep(1)

        elif active_strat == ewcfg.slimeoid_strat_evade and battlecry == 1:
            if (active_data.hpmax / active_data.hp) > 3:
                response = active_data.brain.str_movecry_weak.format(
                    slimeoid_name=active_data.name)
            else:
                response = active_data.brain.str_movecry.format(
                    slimeoid_name=active_data.name)
            await fe_utils.send_message(client, channel, response)
            await asyncio.sleep(1)

        # announce active slimeoid's chosen action
        response = ""
        if active_strat == ewcfg.slimeoid_strat_attack:
            if in_range:
                response = "{} attempts to strike {} in close combat!".format(
                    active_data.name, passive_data.name)
            else:
                response = "{} attempts to strike {} from a distance!".format(
                    active_data.name, passive_data.name)

        elif active_strat == ewcfg.slimeoid_strat_evade:
            if in_range:
                response = "{} attempts to avoid being hit, while gaining distance from {}.".format(
                    active_data.name, passive_data.name)
            else:
                response = "{} attempts to avoid being hit, while closing the distance to {}.".format(
                    active_data.name, passive_data.name)

        elif active_strat == ewcfg.slimeoid_strat_block:
            response = "{} focuses on blocking incoming attacks.".format(
                active_data.name)

        response += " (**{} sap**)".format(active_sap_spend)

        await fe_utils.send_message(client, channel, response)
        await asyncio.sleep(1)

        # announce passive slimeoid's chosen action
        response = ""
        if passive_strat == ewcfg.slimeoid_strat_attack:
            if in_range:
                response = "{} attempts to strike {} in close combat!".format(
                    passive_data.name, active_data.name)
            else:
                response = "{} attempts to strike {} from a distance!".format(
                    passive_data.name, active_data.name)

        elif passive_strat == ewcfg.slimeoid_strat_evade:
            if in_range:
                response = "{} attempts to avoid being hit, while gaining distance from {}.".format(
                    passive_data.name, active_data.name)
            else:
                response = "{} attempts to avoid being hit, while closing the distance to {}.".format(
                    passive_data.name, active_data.name)

        elif passive_strat == ewcfg.slimeoid_strat_block:
            response = "{} focuses on blocking incoming attacks.".format(
                passive_data.name)

        response += " (**{} sap**)".format(passive_sap_spend)

        await fe_utils.send_message(client, channel, response)
        await asyncio.sleep(1)

        # if the chosen actions are in direct competition, the roll is opposed. only one of them can succeed
        # otherwise both actions are resolved separately
        roll_opposed = False

        if active_strat == ewcfg.slimeoid_strat_attack:
            roll_opposed = passive_strat in [
                ewcfg.slimeoid_strat_evade, ewcfg.slimeoid_strat_block
            ]
        elif active_strat == ewcfg.slimeoid_strat_evade:
            roll_opposed = passive_strat in [
                ewcfg.slimeoid_strat_attack, ewcfg.slimeoid_strat_evade
            ]
        elif active_strat == ewcfg.slimeoid_strat_block:
            roll_opposed = passive_strat in [ewcfg.slimeoid_strat_attack]

        active_dos = active_data.attempt_action(strat=active_strat,
                                                sap_spend=active_sap_spend,
                                                in_range=in_range)

        # simultaneous attacks are a special case. the passive slimeoid only rolls the dice, after the active slimeoid's attack has been resolved
        if passive_strat != ewcfg.slimeoid_strat_attack:
            passive_dos = passive_data.attempt_action(
                strat=passive_strat,
                sap_spend=passive_sap_spend,
                in_range=in_range)
            if roll_opposed:
                active_dos -= passive_dos
                passive_dos = -active_dos

                # on an opposed roll, priority for the next turn (the active role) is passed to the winner of the roll
                if active_dos < 0:
                    s1_active = not s1_active
        else:
            passive_dos = 0

        # resolve active slimeoid's attack
        if active_strat == ewcfg.slimeoid_strat_attack:
            # the attack was successful
            if active_dos > 0:
                # calculate damage
                if in_range:
                    damage = int(active_dos * 30 /
                                 (passive_data.hardened_sap + 1))
                else:
                    damage = int(active_dos * 20)

                response = active_data.execute_attack(passive_data, damage,
                                                      in_range)
                await fe_utils.send_message(client, channel, response)
                await asyncio.sleep(1)

                response = passive_data.take_damage(active_data, damage,
                                                    active_dos, in_range)
                if len(response) > 0:
                    await fe_utils.send_message(client, channel, response)
                    await asyncio.sleep(1)

            elif not roll_opposed:
                response = "{} whiffs its attack!".format(active_data.name)
                await fe_utils.send_message(client, channel, response)
                await asyncio.sleep(1)
            elif passive_strat == ewcfg.slimeoid_strat_evade:
                response = "{} dodges {}'s attack!".format(
                    passive_data.name, active_data.name)
                await fe_utils.send_message(client, channel, response)
                await asyncio.sleep(1)
            elif passive_strat == ewcfg.slimeoid_strat_block:
                response = "{} blocks {}'s attack!".format(
                    passive_data.name, active_data.name)
                await fe_utils.send_message(client, channel, response)
                await asyncio.sleep(1)

        # if the active slimeoid's attack killed the passive slimeoid
        if passive_data.hp <= 0:
            break

        if passive_strat == ewcfg.slimeoid_strat_attack:
            passive_dos = passive_data.attempt_action(
                strat=passive_strat,
                sap_spend=passive_sap_spend,
                in_range=in_range)

            if roll_opposed:
                active_dos -= passive_dos
                passive_dos = -active_dos

                if active_dos < 0:
                    s1_active = not s1_active

        # resolve passive slimeoid's attack
        if passive_strat == ewcfg.slimeoid_strat_attack:
            # attack was successful
            if passive_dos > 0:
                # calculate damage
                if in_range:
                    damage = int(passive_dos * 30 /
                                 (active_data.hardened_sap + 1))
                else:
                    damage = int(passive_dos * 20)

                response = passive_data.execute_attack(active_data, damage,
                                                       in_range)
                await fe_utils.send_message(client, channel, response)
                await asyncio.sleep(1)

                response = active_data.take_damage(passive_data, damage,
                                                   passive_dos, in_range)
                if len(response) > 0:
                    await fe_utils.send_message(client, channel, response)
                    await asyncio.sleep(1)

            elif not roll_opposed:
                response = "{} whiffs its attack!".format(passive_data.name)
                await fe_utils.send_message(client, channel, response)
                await asyncio.sleep(1)
            elif active_strat == ewcfg.slimeoid_strat_evade:
                response = "{} dodges {}'s attack!".format(
                    active_data.name, passive_data.name)
                await fe_utils.send_message(client, channel, response)
                await asyncio.sleep(1)
            elif active_strat == ewcfg.slimeoid_strat_block:
                response = "{} blocks {}'s attack!".format(
                    active_data.name, passive_data.name)
                await fe_utils.send_message(client, channel, response)
                await asyncio.sleep(1)

        # resolve active slimeoid's movement
        if active_strat == ewcfg.slimeoid_strat_evade:
            if active_dos > 0:
                response = active_data.change_distance(passive_data, in_range)
                in_range = not in_range
                await fe_utils.send_message(client, channel, response)
                await asyncio.sleep(1)
            elif active_dos == 0 and passive_strat == ewcfg.slimeoid_strat_evade:
                in_range = not in_range
                response = "{} and {} circle each other, looking for an opening...".format(
                    active_data.name, passive_data.name)
                await fe_utils.send_message(client, channel, response)
                await asyncio.sleep(1)

        # resolve active slimeoid's defense
        if active_strat == ewcfg.slimeoid_strat_block:
            if active_dos > 0:
                response = active_data.harden_sap(active_dos)
                await fe_utils.send_message(client, channel, response)
                await asyncio.sleep(1)

        # resolve passive slimeoid's movement
        if passive_strat == ewcfg.slimeoid_strat_evade:
            if passive_dos > 0:
                response = passive_data.change_distance(active_data, in_range)
                in_range = not in_range
                await fe_utils.send_message(client, channel, response)
                await asyncio.sleep(1)

        # resolve passive slimeoid's defense
        if passive_strat == ewcfg.slimeoid_strat_block:
            if passive_dos > 0:
                response = passive_data.harden_sap(passive_dos)
                await fe_utils.send_message(client, channel, response)
                await asyncio.sleep(1)

        # re-fetch slimeoid data
        challenger_slimeoid = EwSlimeoid(id_slimeoid=id_s2)
        challengee_slimeoid = EwSlimeoid(id_slimeoid=id_s1)

        s1_combat_data.slimeoid = challengee_slimeoid
        s2_combat_data.slimeoid = challenger_slimeoid

        # Check if slimeoids have died during the fight
        if challenger_slimeoid.life_state == ewcfg.slimeoid_state_dead:
            s2_combat_data.hp = 0
        elif challengee_slimeoid.life_state == ewcfg.slimeoid_state_dead:
            s1_combat_data.hp = 0

        await asyncio.sleep(2)

    # the challengee has lost
    if s1_combat_data.hp <= 0:
        result = 1
        response = "\n" + s1_combat_data.legs.str_defeat.format(
            slimeoid_name=s1_combat_data.name)
        response += " {}".format(ewcfg.emote_slimeskull)
        response += "\n" + s2_combat_data.brain.str_victory.format(
            slimeoid_name=s2_combat_data.name)

        challenger_slimeoid = EwSlimeoid(id_slimeoid=id_s2)
        challengee_slimeoid = EwSlimeoid(id_slimeoid=id_s1)

        # Losing slimeoid loses clout and has a time_defeated cooldown.
        if channel.name == ewcfg.channel_arena:
            challengee_slimeoid.clout = calculate_clout_loss(
                challengee_slimeoid.clout)
            challengee_slimeoid.time_defeated = int(time.time())
            challengee_slimeoid.persist()

        if channel.name == ewcfg.channel_arena:
            challenger_slimeoid.clout = calculate_clout_gain(
                challenger_slimeoid.clout)
            challenger_slimeoid.persist()

        await fe_utils.send_message(client, channel, response)
        await asyncio.sleep(2)
    # the challenger has lost
    else:
        result = -1
        response = "\n" + s2_combat_data.legs.str_defeat.format(
            slimeoid_name=s2_combat_data.name)
        response += " {}".format(ewcfg.emote_slimeskull)
        response += "\n" + s1_combat_data.brain.str_victory.format(
            slimeoid_name=s1_combat_data.name)

        challenger_slimeoid = EwSlimeoid(id_slimeoid=id_s2)
        challengee_slimeoid = EwSlimeoid(id_slimeoid=id_s1)

        # store defeated slimeoid's defeat time in the database
        if channel.name == ewcfg.channel_arena:
            challenger_slimeoid.clout = calculate_clout_loss(
                challenger_slimeoid.clout)
            challenger_slimeoid.time_defeated = int(time.time())
            challenger_slimeoid.persist()

        if channel.name == ewcfg.channel_arena:
            challengee_slimeoid.clout = calculate_clout_gain(
                challengee_slimeoid.clout)
            challengee_slimeoid.persist()

        await fe_utils.send_message(client, channel, response)
        await asyncio.sleep(2)
    return result
Example #8
0
def gen_data_text(id_user=None,
                  id_server=None,
                  display_name=None,
                  channel_name=None):
    user_data = EwUser(id_user=id_user, id_server=id_server, data_level=2)
    slimeoid = EwSlimeoid(id_user=id_user, id_server=id_server)

    cosmetics = bknd_item.inventory(id_user=user_data.id_user,
                                    id_server=user_data.id_server,
                                    item_type_filter=ewcfg.it_cosmetic)
    adorned_cosmetics = []
    for cosmetic in cosmetics:
        cos = EwItem(id_item=cosmetic.get('id_item'))
        if cos.item_props['adorned'] == 'true':
            hue = hue_static.hue_map.get(cos.item_props.get('hue'))
            adorned_cosmetics.append((hue.str_name +
                                      " " if hue != None else "") +
                                     cosmetic.get('name'))

    if user_data.life_state == ewcfg.life_state_grandfoe:
        poi = poi_static.id_to_poi.get(user_data.poi)
        if poi != None:
            response = "{} is {} {}.".format(display_name, poi.str_in,
                                             poi.str_name)
        else:
            response = "You can't discern anything useful about {}.".format(
                display_name)

    else:

        # return somebody's score
        # get race flavor text
        player_race = ewcfg.defined_races.get(user_data.race)
        if player_race != None:
            race_prefix = player_race.get("race_prefix", "")
            race_suffix = player_race.get("race_suffix", "")
        else:
            race_prefix = ""
            race_suffix = ""

        if user_data.life_state == ewcfg.life_state_corpse:
            response = "{} is a {}level {} {}dead{}.".format(
                display_name, race_prefix, user_data.slimelevel, race_suffix,
                user_data.gender)
        elif user_data.life_state == ewcfg.life_state_shambler:
            response = "{} is a {}level {} {}shambler.".format(
                display_name, race_prefix, user_data.slimelevel, race_suffix)
        else:
            response = "{} is a {}level {} {}slime{}.".format(
                display_name, race_prefix, user_data.slimelevel, race_suffix,
                user_data.gender)
            """if user_data.degradation < 20:
                pass
            elif user_data.degradation < 40:
                response += " Their bodily integrity is starting to slip."
            elif user_data.degradation < 60:
                response += " Their face seems to be melting and they periodically have to put it back in place."
            elif user_data.degradation < 80:
                response += " They are walking a bit funny, because their legs are getting mushy."
            elif user_data.degradation < 100:
                response += " Their limbs keep falling off. It's really annoying."
            else:
                response += " They almost look like a shambler already."""

        coinbounty = int(user_data.bounty / ewcfg.slimecoin_exchangerate)

        weapon_item = EwItem(id_item=user_data.weapon)
        weapon = static_weapons.weapon_map.get(
            weapon_item.item_props.get("weapon_type"))

        if weapon != None:
            response += " {} {}{}.".format(
                ewcfg.str_weapon_married if user_data.weaponmarried == True
                else ewcfg.str_weapon_wielding,
                ("" if len(weapon_item.item_props.get("weapon_name")) == 0 else
                 "{}, ".format(weapon_item.item_props.get("weapon_name"))),
                weapon.str_weapon)
            if user_data.weaponskill >= 5:
                response += " {}".format(
                    weapon.str_weaponmaster.format(
                        rank=(user_data.weaponskill - 4), title="master"))
            else:
                response += " {}".format(
                    weapon.str_weaponmaster.format(rank=user_data.weaponskill,
                                                   title="rookie"))

        sidearm_item = EwItem(id_item=user_data.sidearm)
        sidearm = static_weapons.weapon_map.get(
            sidearm_item.item_props.get("weapon_type"))

        if sidearm != None:
            response += " They have sidearmed {}{}.".format(
                ("" if len(sidearm_item.item_props.get("weapon_name"))
                 == 0 else "{}, ".format(
                     sidearm_item.item_props.get("weapon_name"))),
                sidearm.str_weapon)

        trauma = se_static.trauma_map.get(user_data.trauma)

        if trauma != None:
            response += " {}".format(trauma.str_trauma)

        response_block = ""

        user_kills = ewstats.get_stat(user=user_data, metric=ewcfg.stat_kills)

        enemy_kills = ewstats.get_stat(user=user_data,
                                       metric=ewcfg.stat_pve_kills)

        response_block += "{}{}".format(
            get_crime_level(num=user_data.crime, forYou=0), " ")

        if user_kills > 0 and enemy_kills > 0:
            response_block += "They have {:,} confirmed kills, and {:,} confirmed hunts. ".format(
                user_kills, enemy_kills)
        elif user_kills > 0:
            response_block += "They have {:,} confirmed kills. ".format(
                user_kills)
        elif enemy_kills > 0:
            response_block += "They have {:,} confirmed hunts. ".format(
                enemy_kills)

        if coinbounty != 0:
            response_block += "SlimeCorp offers a bounty of {:,} SlimeCoin for their death. ".format(
                coinbounty)

        if len(adorned_cosmetics) > 0:
            response_block += "They have a {} adorned. ".format(
                ewutils.formatNiceList(adorned_cosmetics, 'and'))

            if user_data.freshness < ewcfg.freshnesslevel_1:
                response_block += "Their outfit is starting to look pretty fresh, but They’ve got a long way to go if they wanna be NLACakaNM’s next top model. "
            elif user_data.freshness < ewcfg.freshnesslevel_2:
                response_block += "Their outfit is low-key on point, not gonna lie. They’re goin’ places, kid. "
            elif user_data.freshness < ewcfg.freshnesslevel_3:
                response_block += "Their outfit is lookin’ fresh as hell, goddamn! They shop so much they can probably speak Italian. "
            elif user_data.freshness < ewcfg.freshnesslevel_4:
                response_block += "Their outfit is straight up **GOALS!** Like, honestly. I’m being, like, totally sincere right now. Their Instragrime has attracted a small following. "
            else:
                response_block += "Holy shit! Their outfit is downright, positively, without a doubt, 100% **ON FLEEK!!** They’ve blown up on Instragrime, and they’ve got modeling gigs with fashion labels all across the city. "

        statuses = user_data.getStatusEffects()

        for status in statuses:
            status_effect = EwStatusEffect(id_status=status,
                                           user_data=user_data)
            if status_effect.time_expire > time.time(
            ) or status_effect.time_expire == -1:
                status_flavor = se_static.status_effects_def_map.get(status)

                severity = ""
                try:
                    value_int = int(status_effect.value)
                    if value_int < 3:
                        severity = "lightly injured."
                    elif value_int < 7:
                        severity = "battered and bruised."
                    elif value_int < 11:
                        severity = "severely damaged."
                    else:
                        severity = "completely f****d up, holy shit!"
                except:
                    pass

                format_status = {'severity': severity}

                if status_flavor is not None:
                    response_block += status_flavor.str_describe.format_map(
                        format_status) + " "

        if (slimeoid.life_state == ewcfg.slimeoid_state_active):
            # If the user isn't a corpse
            if user_data.life_state != ewcfg.life_state_corpse:
                response_block += "They are accompanied by {}, a {}-foot-tall Slimeoid. ".format(
                    slimeoid.name, str(slimeoid.level))
            # If the user is a corpse, but has a negaslimeoid
            elif slimeoid.sltype == ewcfg.sltype_nega:
                response_block += "They are accompanied by {}, a {}-foot-tall Negaslimeoid. ".format(
                    slimeoid.name, str(slimeoid.level))

        # if user_data.swear_jar >= 500:
        # 	response_block += "They're going to The Underworld for the things they've said."
        # elif user_data.swear_jar >= 100:
        # 	response_block += "They swear like a sailor!"
        # elif user_data.swear_jar >= 50:
        # 	response_block += "They have quite a profane vocabulary."
        # elif user_data.swear_jar >= 10:
        # 	response_block += "They've said some naughty things in the past."
        # elif user_data.swear_jar >= 5:
        # 	response_block += "They've cussed a handful of times here and there."
        # elif user_data.swear_jar > 0:
        # 	response_block += "They've sworn only a few times."
        # else:
        # 	response_block += "Their mouth is clean as a whistle."

        if len(response_block) > 0:
            response += "\n" + response_block

    return response
Example #9
0
async def incubate_slimeoid(cmd):
    user_data = EwUser(member=cmd.message.author)
    slimeoid_data = EwSlimeoid(member=cmd.message.author)

    if cmd.message.channel.name != ewcfg.channel_slimeoidlab:
        response = "You must go to the NLACU Laboratories in Brawlden to create a Slimeoid."
        # Go to final response

    elif user_data.life_state == ewcfg.life_state_corpse:
        response = "Ghosts cannot interact with the NLACU Lab apparati."
        # Go to final response

    #TODO: change this because player can have more than one slimeoid now
    # this is f*****g brutal. poor slimeoid
    elif slimeoid_data.life_state == ewcfg.slimeoid_state_active:
        response = "You have already created a Slimeoid. Bottle or dissolve your current slimeoid before incubating a new one."
        # Go to final response

    elif slimeoid_data.life_state == ewcfg.slimeoid_state_forming:
        response = "You are already in the process of incubating a Slimeoid."
        # Go to final response

    else:

        #Check if player has too many slimeoids
        slimeoid_count = get_slimeoid_count(user_id=cmd.message.author.id,
                                            server_id=cmd.guild.id)

        if slimeoid_count >= 3:
            response = "You have too many slimeoids."
            # Go to final response

        else:
            #Check if player has a poudrin
            poudrin = bknd_item.find_item(
                item_search=ewcfg.item_id_slimepoudrin,
                id_user=cmd.message.author.id,
                id_server=cmd.guild.id if cmd.guild is not None else None,
                item_type_filter=ewcfg.it_item)
            if poudrin is None:
                response = "You need a slime poudrin."
                # Go to final response

            else:
                # Get arguement for how big the slimeoid should be made
                injected_slime = None
                if cmd.tokens_count > 1:
                    injected_slime = ewutils.getIntToken(tokens=cmd.tokens,
                                                         allow_all=True)
                    # -1 from getIntToken() means use all slime
                    if injected_slime == -1:
                        injected_slime = user_data.slimes

                if injected_slime == None:
                    response = "You must contribute some of your own slime to create a Slimeoid. Specify how much slime you will sacrifice."
                    # Go to final response

                elif injected_slime > user_data.slimes:
                    response = "You do not have that much slime to sacrifice."
                    # Go to final response

                else:
                    # delete a slime poudrin from the player's inventory
                    bknd_item.item_delete(id_item=poudrin.get('id_item'))

                    # Remove slime
                    user_data.change_slimes(n=-injected_slime)

                    # Setup gestating slimeoid
                    level = len(str(injected_slime))
                    slimeoid_data.life_state = ewcfg.slimeoid_state_forming
                    slimeoid_data.level = level
                    slimeoid_data.id_user = str(user_data.id_user)
                    slimeoid_data.id_server = user_data.id_server

                    # Save changes
                    slimeoid_data.persist()
                    user_data.persist()

                    response = "You place a poudrin into a small opening on the console. As you do, a needle shoots up and pricks your finger, intravenously extracting {injected_slime:,} slime from your body. The poudrin is then dropped into the gestation tank. Looking through the observation window, you see what was once your slime begin to seep into the tank and accrete around the poudrin. The incubation of a new Slimeoid has begun! {slime_emote}".format(
                        injected_slime=injected_slime,
                        slime_emote=ewcfg.emote_slime2)
                    # Go to final response

    # Final response
    await send_response(response, cmd)
Example #10
0
async def change_body_part(cmd):
    user_data = EwUser(member=cmd.message.author)
    slimeoid_data = EwSlimeoid(member=cmd.message.author)

    # Checks whether slimeoid is a Negaslimeoid or not. For flavor text.
    if slimeoid_data.sltype == ewcfg.sltype_nega:
        slimeoidtype = "Negaslimeoid"
    else:
        slimeoidtype = "Slimeoid"

    # Check if player is in the labs and has a slimeoid incubating
    response = basic_slimeoid_incubation_checks(
        channel_name=cmd.message.channel.name,
        user_data=user_data,
        slimeoid_data=slimeoid_data)
    # If response returns None go to final response

    if response is None:  # Slimeoid is incubating

        button_pressed = None

        # If player does not provide an argument for the button they pressed# Interperate which part player is trying to grow by command name

        cmd_to_change_type = {
            ewcfg.cmd_growbody: ("body", sl_static.body_map),
            ewcfg.cmd_growhead: ("head", sl_static.head_map),
            ewcfg.cmd_growlegs: ("leg", sl_static.mobility_map),
            ewcfg.cmd_growweapon: ("weapon", sl_static.offense_map),
            ewcfg.cmd_growarmor: ("armor", sl_static.defense_map),
            ewcfg.cmd_growspecial: ("special", sl_static.special_map),
            ewcfg.cmd_growbrain: ("brain", sl_static.brain_map),
        }

        # Gets part_map based on command used
        desired_change, part_map = cmd_to_change_type.get(cmd.tokens[0])

        if cmd.tokens_count == 1:
            if slimeoidtype == "Slimeoid":
                response = f"You must specify a {desired_change} type. Choose an option from the buttons on the body console labelled A through G."
            else:
                response = f"You must specify a {desired_change} type. Choose an option with your planchette, from A through G."
            # Go to final response

        else:

            pressed_button = cmd.tokens[1].lower()

            # If it's a negaslimeoid and the desired part is a brain, change letter to the corresponding Negaslimeoid brain.
            if desired_change == "brain" and slimeoidtype == "Negaslimeoid":

                # This is done to keep abcdefg parity with between !growbrain and the other grow commands with negaslimeoids.
                cmd_abcdefg_to_hijklmn = {
                    "a": ("h"),
                    "b": ("i"),
                    "c": ("j"),
                    "d": ("k"),
                    "e": ("l"),
                    "f": ("m"),
                    "g": ("n"),
                }

                pressed_button = cmd_abcdefg_to_hijklmn.get(pressed_button)

            # Check if desired part is in part map
            part = part_map.get(pressed_button)

            # If no part is found
            if part == None:
                if slimeoidtype == "Slimeoid":
                    response = "Choose an option from the buttons on the body console labelled A through G."
                else:
                    response = "Choose an option with your planchette, from A through G."
                # Go to final response

            else:

                #TODO: this could be simplified if slimeoid part id variables to one name
                # e.g. EwSlimeoidBody.id_body and EwSlimeoidBody.id_head were called EwSlimeoidBody.part_id and EwSlimeoidBody.part_id instead
                if desired_change == "body":
                    slimeoid_data.body = part.id_body

                elif desired_change == "head":
                    slimeoid_data.head = part.id_head

                elif desired_change == "leg":
                    slimeoid_data.legs = part.id_mobility

                elif desired_change == "weapon":
                    slimeoid_data.weapon = part.id_offense

                elif desired_change == "armor":
                    slimeoid_data.armor = part.id_defense

                elif desired_change == "special":
                    slimeoid_data.special = part.id_special

                elif desired_change == "brain":
                    slimeoid_data.ai = part.id_brain

                else:
                    response = f"Some thing when wrong with {cmd.tokens[0]} command. Please report bug."  # something when wrong in cmd_to_change_type
                    return await send_response(response, cmd)
                    # Break out of command early because of error

                slimeoid_data.persist()
                response = "{}".format(part.str_create_nega if (
                    user_data.life_state == ewcfg.life_state_corpse
                    and desired_change != "brain") else part.str_create)
                # Go to final response

    # Final response
    await send_response(response, cmd)
Example #11
0
async def change_stat(cmd):
    user_data = EwUser(member=cmd.message.author)
    slimeoid_data = EwSlimeoid(member=cmd.message.author)

    # Check if player is in the labs and has a slimeoid incubating
    response = basic_slimeoid_incubation_checks(
        channel_name=cmd.message.channel.name,
        user_data=user_data,
        slimeoid_data=slimeoid_data)
    # If response returns None go to final response

    if response is None:  # Slimeoid is incubating

        # Interperate which stat player is trying to change by command name

        cmd_to_change_type = {
            ewcfg.cmd_raisemoxie: "+ moxie",
            ewcfg.cmd_raisegrit: "+ grit",
            ewcfg.cmd_raisechutzpah: "+ chutzpah",
            ewcfg.cmd_lowermoxie: "- moxie",
            ewcfg.cmd_lowergrit: "- grit",
            ewcfg.cmd_lowerchutzpah: "- chutzpah",
        }
        desired_change = cmd_to_change_type.get(cmd.tokens[0])

        moxie_mod = 0
        grit_mod = 0
        chutzpah_mod = 0

        # Plus one stat
        if desired_change == "+ moxie":
            moxie_mod = 1
            changed_stat = "moxie"

        elif desired_change == "+ grit":
            grit_mod = 1
            changed_stat = "grit"

        elif desired_change == "+ chutzpah":
            chutzpah_mod = 1
            changed_stat = "chutzpah"

        # Minus one stat
        elif desired_change == "- moxie":
            moxie_mod = -1
            changed_stat = "moxie"

        elif desired_change == "- grit":
            grit_mod = -1
            changed_stat = "grit"

        elif desired_change == "- chutzpah":
            chutzpah_mod = -1
            changed_stat = "chutzpah"

        else:
            response = f"Some thing when wrong with {cmd.tokens[0]} command. Please report bug."  # something when wrong in cmd_to_change_type
            return await send_response(response, cmd)
            # Break out of command early because of error

        # Now that we no what stat is trying to be changed do the final checks

        available_points = slimeoid_data.level - (
            slimeoid_data.atk +
            moxie_mod) - (slimeoid_data.defense +
                          grit_mod) - (slimeoid_data.intel + chutzpah_mod)

        # Check if stat points are available
        if (available_points < 0):
            response = "You have allocated all of your Slimeoid's potential. Try !lowering some of its attributes first."
            response += stat_breakdown_str(slimeoid_data.atk,
                                           slimeoid_data.defense,
                                           slimeoid_data.intel,
                                           available_points + 1)
            # Go to final response

        # Check if player is trying to lower a stat below zero
        elif ((slimeoid_data.atk + moxie_mod < 0)
              or (slimeoid_data.defense + grit_mod < 0)
              or (slimeoid_data.intel + chutzpah_mod < 0)):
            response = f"You cannot reduce your slimeoid's {changed_stat} any further."
            response += stat_breakdown_str(slimeoid_data.atk,
                                           slimeoid_data.defense,
                                           slimeoid_data.intel,
                                           available_points - 1)

        elif (available_points >= slimeoid_data.level):
            response = f"You cannot reduce your slimeoid's {changed_stat} any further."
            response += stat_breakdown_str(slimeoid_data.atk,
                                           slimeoid_data.defense,
                                           slimeoid_data.intel,
                                           available_points - 1)
            # Go to final response

        # Command successful
        else:

            # Change slimeoid stats
            slimeoid_data.atk += moxie_mod
            slimeoid_data.defense += grit_mod
            slimeoid_data.intel += chutzpah_mod
            # Save changes
            slimeoid_data.persist()

            # Generate response
            if (moxie_mod + grit_mod + chutzpah_mod > 0):
                response = f"Your gestating slimeoid gains more {changed_stat}."
            else:
                response = f"Your gestating slimeoid loses some {changed_stat}."
            response += stat_breakdown_str(slimeoid_data.atk,
                                           slimeoid_data.defense,
                                           slimeoid_data.intel,
                                           available_points)
            # Go to final response

    # Final response
    await send_response(response, cmd)
Example #12
0
async def change_body_part(cmd):
    user_data = EwUser(member=cmd.message.author)
    slimeoid_data = EwSlimeoid(member=cmd.message.author)

    # Check if player is in the labs and has a slimeoid incubating
    response = basic_slimeoid_incubation_checks(
        channel_name=cmd.message.channel.name,
        user_data=user_data,
        slimeoid_data=slimeoid_data)
    # If response returns None go to final response

    if response is None:  # Slimeoid is incubating

        button_pressed = None

        # If player does not provide an argument for the button they pressed# Interperate which part player is trying to grow by command name

        cmd_to_change_type = {
            ewcfg.cmd_growbody: ("body", sl_static.body_map),
            ewcfg.cmd_growhead: ("head", sl_static.head_map),
            ewcfg.cmd_growlegs: ("leg", sl_static.mobility_map),
            ewcfg.cmd_growweapon: ("weapon", sl_static.offense_map),
            ewcfg.cmd_growarmor: ("armor", sl_static.defense_map),
            ewcfg.cmd_growspecial: ("special", sl_static.special_map),
            ewcfg.cmd_growbrain: ("brain", sl_static.brain_map),
        }

        # Gets part_map based on command used
        desired_change, part_map = cmd_to_change_type.get(cmd.tokens[0])

        if cmd.tokens_count == 1:
            response = f"You must specify a {desired_change} type. Choose an option from the buttons on the body console labelled A through G."
            # Go to final response

        else:

            pressed_button = cmd.tokens[1].lower()

            # Check if desired part is in part map
            part = part_map.get(pressed_button)

            # If no part is found
            if part == None:
                response = "Choose an option from the buttons on the body console labelled A through G."
                # Go to final response

            else:

                #TODO: this could be simplified if slimeoid part id variables to one name
                # e.g. EwSlimeoidBody.id_body and EwSlimeoidBody.id_head were called EwSlimeoidBody.part_id and EwSlimeoidBody.part_id instead
                if desired_change == "body":
                    slimeoid_data.body = part.id_body

                elif desired_change == "head":
                    slimeoid_data.head = part.id_head

                elif desired_change == "leg":
                    slimeoid_data.legs = part.id_mobility

                elif desired_change == "weapon":
                    slimeoid_data.weapon = part.id_offense

                elif desired_change == "armor":
                    slimeoid_data.armor = part.id_defense

                elif desired_change == "special":
                    slimeoid_data.special = part.id_special

                elif desired_change == "brain":
                    slimeoid_data.ai = part.id_brain

                else:
                    response = f"Some thing when wrong with {cmd.tokens[0]} command. Please report bug."  # something when wrong in cmd_to_change_type
                    return await send_response(response, cmd)
                    # Break out of command early because of error

                slimeoid_data.persist()
                response = "{}".format(part.str_create)
                # Go to final response

    # Final response
    await send_response(response, cmd)
async def piss(cmd):
    user_data = EwUser(member=cmd.message.author)
    mutations = user_data.get_mutations()

    if ewcfg.mutation_id_enlargedbladder in mutations:

        user_data.change_crime(n=1)
        user_data.persist()

        cosmetics = bknd_item.inventory(id_user=user_data.id_user, id_server=cmd.guild.id,
                                        item_type_filter=ewcfg.it_cosmetic)
        protected = False
        for cosmetic in cosmetics:
            cosmetic_data = EwItem(id_item=cosmetic.get('id_item'))
            if cosmetic_data.item_props.get('id_cosmetic') == 'chastitybelt':
                if cosmetic_data.item_props.get('adorned') == 'true':
                    protected = True

        if protected == True:
            response = "Reaching for your weewee, you instead hear the desolate metal clank of your hand against a steel groincage. Damn you, chastity belt. DAMN YOU TO HELL!!! "
            return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))

        if cmd.mentions_count == 0:
            response = "You unzip your dick and just start pissing all over the goddamn f*****g floor. God, you’ve waited so long for this moment, and it’s just as perfect as you could have possibly imagined. You love pissing so much."
            if random.randint(1, 100) < 2:
                slimeoid = EwSlimeoid(member=cmd.message.author)
                if slimeoid.life_state == ewcfg.slimeoid_state_active:
                    hue = hue_static.hue_map.get("yellow")
                    response = "CONGRATULATIONS. You suddenly lose control of your HUGE C**K and saturate your {} with your PISS. {}".format(slimeoid.name, hue.str_saturate)
                    slimeoid.hue = (hue_static.hue_map.get("yellow")).id_hue
                    slimeoid.persist()
            return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))

        if cmd.mentions_count == 1:
            target_member = cmd.mentions[0]
            target_user_data = EwUser(member=target_member)

            if user_data.id_user == target_user_data.id_user:
                response = "Your love for piss knows no bounds. You aim your urine stream sky high, causing it to land right back into your own mouth. Mmmm, tasty~!"
                return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))

            if user_data.poi == target_user_data.poi:

                if target_user_data.life_state == ewcfg.life_state_corpse:
                    response = "You piss right through them! Their ghostly form ripples as the stream of urine pours endlessly unto them."
                    return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))

                response = "You piss HARD and FAST right onto {}!!".format(target_member.display_name)
            else:
                response = "You can't !piss on someone who isn't there! Moron!"

        elif cmd.mentions_count > 1:
            response = "Whoa, one water-sports fetishist at a time, pal!"

    elif user_data.life_state == ewcfg.life_state_corpse:
        if cmd.mentions_count == 0:
            response = "You grow a ghost dick, unzip it, and just start ghost pissing all over the goddamn f*****g floor. God, you’ve waited so long for this moment, and it’s just as perfect as you could have possibly imagined. You love ghost pissing so much."
            if random.randint(1, 100) < 3:
                response = "You grow a gussy, unzip it, and just start ghost pissing all over the goddamn f*****g floor. God, you've waited so long for this moment, and it's just as perfect as you could have possibly imagined. You love ghost pissing so much."
            return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))

        if cmd.mentions_count == 1:
            target_member = cmd.mentions[0]
            target_user_data = EwUser(member=target_member)

            if user_data.id_user == target_user_data.id_user:
                response = "Your love for negapiss knows no bounds. You aim your antiurine stream sky high, causing it to land right back into your own ghastly mouth. Mmmm, tasty~!"
                return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))

            if user_data.poi == target_user_data.poi:

                if target_user_data.life_state == ewcfg.life_state_corpse:
                    response = "You ghost piss HARD and FAST right onto {}!!".format(target_member.display_name)
                    return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))

                response = "Your ghost piss passes right through them! {} seems annoyed at the negapiss you're streaming at them, but they're entirely unaffected.".format(target_member.display_name)
            else:
                response = "You can't !piss on someone who isn't there! Moron!"

        elif cmd.mentions_count > 1:
            response = "Whoa, one necrophiliac at a time, pal!"

    else:
        response = "You lack the moral fiber necessary for urination."

    return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
Example #14
0
def can_slimeoid_battle(challenger: EwUser = None,
                        challengee=None,
                        challenger_slimeoid: EwSlimeoid = None,
                        challengee_slimeoid: EwSlimeoid = None,
                        bet: int = 0):
    response = ""
    time_now = int(time.time())
    # Gotta have a challenger, otherwise do nothing
    if challenger:
        challenger_data = challenger
        challenger_player = EwPlayer(id_user=challenger_data.id_user)
        ally_slimeoid = None
        target_slimeoid = None

        # If supplied a slimeoid, use that - otherwise we just grab it
        if challenger_slimeoid:
            ally_slimeoid = challenger_slimeoid
        else:
            ally_slimeoid = EwSlimeoid(member=challenger)

        # Challenger

        # Check for slimeoid's type - for flavor text
        if ally_slimeoid.sltype == ewcfg.sltype_nega:
            slimeoidtype = "Negaslimeoid"
        else:
            slimeoidtype = "Slimeoid"

        if ally_slimeoid.life_state != ewcfg.slimeoid_state_active:
            response = "You do not have a Slimeoid ready to battle with!"

        # Checks if the player is dead and if they're trying to battle with a slimeoid
        elif challenger_data.life_state == ewcfg.life_state_corpse and ally_slimeoid.sltype != ewcfg.sltype_nega:
            response = "Your Slimeoid won't battle for you while you're dead."

        elif (time_now -
              ally_slimeoid.time_defeated) < ewcfg.cd_slimeoiddefeated:
            time_until = ewcfg.cd_slimeoiddefeated - (
                time_now - ally_slimeoid.time_defeated)
            response = "Your {} is still recovering from its last defeat! It'll be ready in {} seconds.".format(
                slimeoidtype, int(time_until))

        elif ewutils.active_slimeoidbattles.get(ally_slimeoid.id_slimeoid):
            response = "You are already in the middle of a challenge."

        elif challengee:
            # If the opponent isn't a player, set pvp to false. Set data.
            if isinstance(challengee, EwEnemy):
                challengee_data = challengee
                is_pvp = False
            else:
                challengee_data = challengee
                challengee_player = EwPlayer(id_user=challengee.id_user)
                is_pvp = True

            if challengee_slimeoid:
                target_slimeoid = challengee_slimeoid
            else:
                target_slimeoid = EwSlimeoid(member=challengee)

            # Check for slimeoid's type - for flavor text.
            if target_slimeoid.sltype == ewcfg.sltype_nega:
                slimeoidtype = "Negaslimeoid"
            else:
                slimeoidtype = "Slimeoid"

            # If slimeoid isn't alive, then they can't battle.
            if target_slimeoid.life_state != ewcfg.slimeoid_state_active:
                response = "{} does not have a Slimeoid ready to battle with!".format(
                    challengee_player.
                    display_name if is_pvp else challengee_data.display_name)

            elif challenger_data.poi != challengee_data.poi:
                response = "Both players must be in the same place."

            # Checks if each player has enough slime if there is a bet
            elif (challenger_data.slimes < bet
                  or challenger_data.slimes < 0) and bet != 0:
                response = "You don't have enough slime!"
            elif (challengee_data.slimes < bet
                  or challengee_data.slimes < 0) and bet != 0:
                response = "They don't have enough slime!"

            # If a player is a ghost and has a living slimeoid, then they can't battle.
            elif challengee_data.life_state == ewcfg.life_state_corpse and challengee_slimeoid.sltype != ewcfg.sltype_nega:
                response = "{}'s Slimeoid won't battle for them while they're dead.".format(
                    challengee_player.display_name).replace("@", "\{at\}")

            elif (time_now -
                  target_slimeoid.time_defeated) < ewcfg.cd_slimeoiddefeated:
                time_until = ewcfg.cd_slimeoiddefeated - (
                    time_now - target_slimeoid.time_defeated)
                response = "{}'s {} is still recovering from its last defeat! It'll be ready in {} seconds.".format(
                    challengee_player.display_name, slimeoidtype,
                    int(time_until))

            elif ewutils.active_slimeoidbattles.get(
                    target_slimeoid.id_slimeoid):
                response = "They are already in the middle of a challenge."

        return response
Example #15
0
async def destroy_slimeoid(cmd):
    user_data = EwUser(member=cmd.message.author)
    slimeoid_data = EwSlimeoid(member=cmd.message.author)

    # Check of the player is alive
    if user_data.life_state != ewcfg.life_state_corpse:
        response = "You... want to destroy your Slimeoid? That's, like, sorta illegal."

    # Check if the player isn't at Waffle House as a ghost
    elif user_data.life_state == ewcfg.life_state_corpse and cmd.message.channel.name != ewcfg.channel_wafflehouse:
        response = "Slimeoids don't f**k with ghosts."

    # Check if the player has a slimeoid
    elif slimeoid_data.life_state == ewcfg.slimeoid_state_none:
        response = "Good news! You don't have a Slimeoid. So no need to destroy one."

    # If all of those don't work
    else:
        # Creates each type-specific heart. Also turns the slimeoid's type into a string, for flavor text purposes.
        if slimeoid_data.sltype == ewcfg.sltype_lab:
            # Creates string "Slimeoid"
            slimeoid_type = "Slimeoid"

            # Forming slimeoids DON'T drop hearts
            if slimeoid_data.life_state != ewcfg.slimeoid_state_forming:
                # Creates the item props for the slimeoid heart
                item_props = {
                    'context':
                    ewcfg.context_slimeoidheart,
                    'subcontext':
                    slimeoid_data.id_slimeoid,
                    'item_name':
                    "Heart of {}".format(slimeoid_data.name),
                    'item_desc':
                    "A poudrin-like crystal. If you listen carefully you can hear something that sounds like a faint heartbeat."
                }
                # Creates the item in downtown
                bknd_item.item_create(id_user=ewcfg.channel_downtown,
                                      id_server=cmd.guild.id,
                                      item_type=ewcfg.it_item,
                                      item_props=item_props)
        else:
            # Creates string "Negaslimeoid"
            slimeoid_type = "Negaslimeoid"

            # Forming negaslimeoids DON'T drop cores
            if slimeoid_data.life_state != ewcfg.slimeoid_state_forming:
                # Creates the item props for the negaslimeoid core
                item_props = {
                    'context':
                    ewcfg.context_negaslimeoidheart,
                    'subcontext':
                    slimeoid_data.id_slimeoid,
                    'item_name':
                    "Core of {}".format(slimeoid_data.name),
                    'item_desc':
                    "A smooth, inert rock. If you listen carefully you can hear otherworldly whispering."
                }
                # Creates the item at Waffle House
                bknd_item.item_create(id_user=ewcfg.channel_wafflehouse,
                                      id_server=cmd.guild.id,
                                      item_type=ewcfg.it_item,
                                      item_props=item_props)

        cosmetics = bknd_item.inventory(id_user=cmd.message.author.id,
                                        id_server=cmd.guild.id,
                                        item_type_filter=ewcfg.it_cosmetic)

        # get the cosmetics worn by the slimeoid
        for item in cosmetics:
            cos = EwItem(id_item=item.get('id_item'))
            if cos.item_props.get('slimeoid') == 'true':
                cos.item_props['slimeoid'] = 'false'
                cos.persist()

        # Craft the response
        response = "You think upon your past and spiritually connect with {} the {}. With the Ouija® Board in front of you, you spell out the forbidden words: \n\n\"lol\" \"lmao\" \n\nYour former companion is rended across space and time. All that remains is their {}, though unobtainable by you. {}".format(
            slimeoid_data.name, slimeoid_type,
            "heart" if slimeoid_type == "Slimeoid" else "core",
            ewcfg.emote_slimeskull)

        # Kill the slimeoid and persist
        slimeoid_data.die()
        slimeoid_data.persist()
        user_data.active_slimeoid = -1

        # Take some of the player's negaslime for destroying a slimeoid.
        if user_data.slimes < 0:
            user_data.slimes -= user_data.slimes / 10
            user_data.persist()

        # Go to final response

    # Final response
    await send_response(response, cmd)
Example #16
0
async def spawn_slimeoid(cmd):
    user_data = EwUser(member=cmd.message.author)
    slimeoid_data = EwSlimeoid(member=cmd.message.author)

    # Check if player is in the appropriate POI and has a slimeoid incubating
    response = basic_slimeoid_incubation_checks(
        channel_name=cmd.message.channel.name,
        user_data=user_data,
        slimeoid_data=slimeoid_data)
    # If response returns None go to final response

    if response is None:  # Slimeoid is incubating

        incomplete = False
        required_parts_explanation = ""

        # Check for flavor text purposes
        if slimeoid_data.sltype == ewcfg.sltype_nega:
            slimeoidtype = "Negaslimeoid"
        else:
            slimeoidtype = "Slimeoid"

        # Check if parts are missing
        # Bold missing part names for visual clarity
        if (slimeoid_data.body == ""):
            incomplete = True
            required_parts_explanation += "\nIts **BODY** has not yet been given a distinct form."

        if (slimeoid_data.head == ""):
            incomplete = True
            required_parts_explanation += "\nIt does not yet have a **HEAD**."

        if (slimeoid_data.legs == ""):
            incomplete = True
            required_parts_explanation += "\nIt has no **LEGS** or means of locomotion."

        if (slimeoid_data.weapon == ""):
            incomplete = True
            required_parts_explanation += "\nIt lacks a means of **WEAPON**."

        if (slimeoid_data.armor == ""):
            incomplete = True
            required_parts_explanation += "\nIt lacks any form of **ARMOR**."

        if (slimeoid_data.special == ""):
            incomplete = True
            required_parts_explanation += "\nIt lacks a **SPECIAL** ability."

        if (slimeoid_data.ai == ""):
            incomplete = True
            required_parts_explanation += "\nIt does not yet have a **BRAIN**."

        if ((slimeoid_data.atk + slimeoid_data.defense + slimeoid_data.intel) <
            (slimeoid_data.level)):
            incomplete = True
            required_parts_explanation += "\nIt still has potential that must be distributed between **MOXIE**, **GRIT** and **CHUTZPAH**."

        if (slimeoid_data.name == ""):
            incomplete = True
            required_parts_explanation += "\nIt needs a **NAME**."

        if incomplete:
            # Add explanation of which parts need to be added
            if slimeoidtype == "Slimeoid":
                response = f"Your Slimeoid is not yet ready to be spawned from the gestation vat. {required_parts_explanation}"
            else:
                response = f"Your Negaslimeoid is not yet fully conjured by the Ancient Ones. {required_parts_explanation}"
            # Go to final response

        else:
            # Set slimeoid as active
            slimeoid_data.life_state = ewcfg.slimeoid_state_active
            # Save slimeoid
            slimeoid_data.persist()

            # Generate spawning flavor text
            if slimeoidtype == "Slimeoid":
                response = "You press the big red button labelled 'SPAWN'. The console lights up and there is a rush of mechanical noise as the fluid drains rapidly out of the gestation tube. The newly born Slimeoid within writhes in confusion before being sucked down an ejection chute and spat out messily onto the laboratory floor at your feet. Happy birthday, {slimeoid_name} the Slimeoid!! {slime_heart_emote}".format(
                    slimeoid_name=slimeoid_data.name,
                    slime_heart_emote=ewcfg.emote_slimeheart)
            else:
                response = "You move the Ouija® planchette to 'GOOD BYE'. The whispering around you explodes into a roaring chorus, nearly deafening your ghost ears. The pile of negaslime in front of you, now resembling a Negaslimeoid, ambles towards you. With a blood-curdling screech, the chorus around you dies. Your unholy abomination {slimeoid_name} the Negaslimeoid has been conjured!! {negaslime_emote}".format(
                    slimeoid_name=slimeoid_data.name,
                    negaslime_emote=ewcfg.emote_negaslime)

            # Add slimeoid description
            response += "\n\n{} is a {}-foot-tall {}.".format(
                slimeoid_data.name, str(slimeoid_data.level), slimeoidtype)
            response += slimeoid_utils.slimeoid_describe(slimeoid_data)

            # Add slimeoid's reaction based on brain type
            brain = sl_static.brain_map.get(slimeoid_data.ai)
            response += "\n\n" + brain.str_spawn.format(
                slimeoid_name=slimeoid_data.name)
            # Go to final response

    # Final response
    await send_response(response, cmd)
Example #17
0
async def sow(cmd):
    user_data = EwUser(member=cmd.message.author)
    if user_data.life_state == ewcfg.life_state_shambler:
        response = "You lack the higher brain functions required to {}.".format(
            cmd.tokens[0])
        return await fe_utils.send_message(
            cmd.client, cmd.message.channel,
            fe_utils.formatMessage(cmd.message.author, response))

    # check if the user has a farming tool equipped
    weapon_item = EwItem(id_item=user_data.weapon)
    weapon = static_weapons.weapon_map.get(
        weapon_item.item_props.get("weapon_type"))
    has_tool = False
    if weapon is not None:
        if ewcfg.weapon_class_farming in weapon.classes:
            has_tool = True

    # Checking availability of sow action
    if user_data.life_state != ewcfg.life_state_juvenile:
        response = "Only Juveniles of pure heart and with nothing better to do can farm."

    elif cmd.message.channel.name not in [
            ewcfg.channel_jr_farms, ewcfg.channel_og_farms,
            ewcfg.channel_ab_farms
    ]:
        response = "The cracked, filthy concrete streets around you would be a pretty terrible place for a farm. Try again on more arable land."

    else:
        poi = poi_static.id_to_poi.get(user_data.poi)
        district_data = EwDistrict(district=poi.id_poi,
                                   id_server=user_data.id_server)

        if district_data.is_degraded():
            response = "{} has been degraded by shamblers. You can't {} here anymore.".format(
                poi.str_name, cmd.tokens[0])
            return await fe_utils.send_message(
                cmd.client, cmd.message.channel,
                fe_utils.formatMessage(cmd.message.author, response))
        if user_data.poi == ewcfg.poi_id_jr_farms:
            farm_id = ewcfg.poi_id_jr_farms
        elif user_data.poi == ewcfg.poi_id_og_farms:
            farm_id = ewcfg.poi_id_og_farms
        else:  # if it's the farm in arsonbrook
            farm_id = ewcfg.poi_id_ab_farms

        farm = EwFarm(id_server=cmd.guild.id,
                      id_user=cmd.message.author.id,
                      farm=farm_id)

        if farm.time_lastsow > 0:
            response = "You’ve already sown something here. Try planting in another farming location. If you’ve planted in all three farming locations, you’re shit out of luck. Just wait, asshole."
        else:
            it_type_filter = None

            # gangsters can only plant poudrins
            if cmd.tokens_count > 1 and user_data.life_state == ewcfg.life_state_juvenile:
                item_search = ewutils.flattenTokenListToString(cmd.tokens[1:])

                # if the item selected was a vegetable, use a food only filter in find_item
                for v in static_food.vegetable_list:
                    if item_search in v.id_food or item_search in v.str_name:
                        it_type_filter = ewcfg.it_food
                        break
            else:
                item_search = "slimepoudrin"

            item_sought = bknd_item.find_item(
                item_search=item_search,
                id_user=cmd.message.author.id,
                id_server=cmd.guild.id if cmd.guild is not None else None,
                item_type_filter=it_type_filter)

            if item_sought == None:
                response = "You don't have anything to plant! Try collecting a poudrin."
            else:
                slimes_onreap = ewcfg.reap_gain
                item_data = EwItem(id_item=item_sought.get("id_item"))
                if item_data.item_type == ewcfg.it_item:
                    if item_data.item_props.get(
                            "id_item") == ewcfg.item_id_slimepoudrin:
                        vegetable = random.choice(static_food.vegetable_list)
                        slimes_onreap *= 2
                    elif item_data.item_props.get(
                            "context") == ewcfg.context_slimeoidheart:
                        vegetable = random.choice(static_food.vegetable_list)
                        slimes_onreap *= 2

                        slimeoid_data = EwSlimeoid(
                            id_slimeoid=item_data.item_props.get("subcontext"))
                        slimeoid_data.delete()

                    else:
                        response = "The soil has enough toxins without you burying your trash here."
                        return await fe_utils.send_message(
                            cmd.client, cmd.message.channel,
                            fe_utils.formatMessage(cmd.message.author,
                                                   response))
                elif item_data.item_type == ewcfg.it_food:
                    food_id = item_data.item_props.get("id_food")
                    vegetable = static_food.food_map.get(food_id)
                    if ewcfg.vendor_farm not in vegetable.vendors:
                        response = "It sure would be nice if {}s grew on trees, but alas they do not. Idiot.".format(
                            item_sought.get("name"))
                        return await fe_utils.send_message(
                            cmd.client, cmd.message.channel,
                            fe_utils.formatMessage(cmd.message.author,
                                                   response))
                    elif user_data.life_state != ewcfg.life_state_juvenile:
                        response = "You lack the knowledge required to grow {}.".format(
                            item_sought.get("name"))
                        return await fe_utils.send_message(
                            cmd.client, cmd.message.channel,
                            fe_utils.formatMessage(cmd.message.author,
                                                   response))

                else:
                    response = "The soil has enough toxins without you burying your trash here."
                    return await fe_utils.send_message(
                        cmd.client, cmd.message.channel,
                        fe_utils.formatMessage(cmd.message.author, response))

                mutations = user_data.get_mutations()
                growth_time = ewcfg.crops_time_to_grow
                if user_data.life_state == ewcfg.life_state_juvenile:
                    growth_time /= 2
                if ewcfg.mutation_id_greenfingers in mutations:
                    growth_time /= 1.5

                hours = int(growth_time / 60)
                minutes = int(growth_time % 60)

                str_growth_time = "{} hour{}{}".format(
                    hours, "s" if hours > 1 else "",
                    " and {} minutes".format(minutes) if minutes > 0 else "")

                # Sowing
                response = "You sow a {} into the fertile soil beneath you. It will grow in about {}.".format(
                    item_sought.get("name"), str_growth_time)

                farm.time_lastsow = int(time.time() /
                                        60)  # Grow time is stored in minutes.
                farm.time_lastphase = int(time.time())
                farm.slimes_onreap = slimes_onreap
                farm.crop = vegetable.id_food
                farm.phase = ewcfg.farm_phase_sow
                farm.action_required = ewcfg.farm_action_none
                farm.sow_life_state = user_data.life_state
                if ewcfg.mutation_id_greenfingers in mutations:
                    if user_data.life_state == ewcfg.life_state_juvenile:
                        farm.sow_life_state = ewcfg.farm_life_state_juviethumb
                    else:
                        farm.sow_life_state = ewcfg.farm_life_state_thumb

                bknd_item.item_delete(
                    id_item=item_sought.get('id_item'))  # Remove Poudrins

                farm.persist()

    await fe_utils.send_message(
        cmd.client, cmd.message.channel,
        fe_utils.formatMessage(cmd.message.author, response))
Example #18
0
async def spawn_slimeoid(cmd):
    user_data = EwUser(member=cmd.message.author)
    slimeoid_data = EwSlimeoid(member=cmd.message.author)

    # Check if player is in the labs and has a slimeoid incubating
    response = basic_slimeoid_incubation_checks(
        channel_name=cmd.message.channel.name,
        user_data=user_data,
        slimeoid_data=slimeoid_data)
    # If response returns None go to final response

    if response is None:  # Slimeoid is incubating
        incomplete = False
        required_parts_explanation = ""

        # Check if parts are missing
        # Bold missing part names for visual clarity
        if (slimeoid_data.body == ""):
            incomplete = True
            required_parts_explanation += "\nIts **BODY** has not yet been given a distinct form."

        if (slimeoid_data.head == ""):
            incomplete = True
            required_parts_explanation += "\nIt does not yet have a **HEAD**."

        if (slimeoid_data.legs == ""):
            incomplete = True
            required_parts_explanation += "\nIt has no **LEGS** or means of locomotion."

        if (slimeoid_data.weapon == ""):
            incomplete = True
            required_parts_explanation += "\nIt lacks a means of **WEAPON**."

        if (slimeoid_data.armor == ""):
            incomplete = True
            required_parts_explanation += "\nIt lacks any form of **ARMOR**."

        if (slimeoid_data.special == ""):
            incomplete = True
            required_parts_explanation += "\nIt lacks a **SPECIAL** ability."

        if (slimeoid_data.ai == ""):
            incomplete = True
            required_parts_explanation += "\nIt does not yet have a **BRAIN**."

        if ((slimeoid_data.atk + slimeoid_data.defense + slimeoid_data.intel) <
            (slimeoid_data.level)):
            incomplete = True
            required_parts_explanation += "\nIt still has potential that must be distributed between **MOXIE**, **GRIT** and **CHUTZPAH**."

        if (slimeoid_data.name == ""):
            incomplete = True
            required_parts_explanation += "\nIt needs a **NAME**."

        if incomplete:
            # Add explanation of which parts need to be added
            response = f"Your slimeoid is not yet ready to be spawned from the gestation vat. {required_parts_explanation}"
            # Go to final response

        else:
            # Set slimeoid as active
            slimeoid_data.life_state = ewcfg.slimeoid_state_active
            # Save slimeoid
            slimeoid_data.persist()

            # Generate spawning flavor text
            response = "You press the big red button labelled 'SPAWN'. The console lights up and there is a rush of mechanical noise as the fluid drains rapidly out of the gestation tube. The newly born Slimeoid within writhes in confusion before being sucked down an ejection chute and spat out messily onto the laboratory floor at your feet. Happy birthday, {slimeoid_name} the Slimeoid!! {slime_heart_emote}".format(
                slimeoid_name=slimeoid_data.name,
                slime_heart_emote=ewcfg.emote_slimeheart)

            # Add slimeoid description
            response += "\n\n{} is a {}-foot-tall Slimeoid.".format(
                slimeoid_data.name, str(slimeoid_data.level))
            response += slimeoid_utils.slimeoid_describe(slimeoid_data)

            # Add slimeoid's reaction based on brain type
            brain = sl_static.brain_map.get(slimeoid_data.ai)
            response += "\n\n" + brain.str_spawn.format(
                slimeoid_name=slimeoid_data.name)
            # Go to final response

    # Final response
    await send_response(response, cmd)
Example #19
0
async def revive(cmd, player_auto=None):
    time_now = int(time.time())
    response = ""

    if cmd.message.channel.name != ewcfg.channel_endlesswar and cmd.message.channel.name != ewcfg.channel_sewers and player_auto is None:
        response = "Come to me. I hunger. #{}.".format(ewcfg.channel_sewers)
    else:
        if player_auto:
            player_data = EwUser(id_server=cmd.guild.id, id_user=player_auto)
        else:
            player_data = EwUser(member=cmd.message.author)

        # time_until_revive = (player_data.time_lastdeath + 600) - time_now
        time_until_revive = (player_data.time_lastdeath) - time_now

        if time_until_revive > 0 and player_auto is None:
            response = "ENDLESS WAR is not ready to {} you yet ({}s).".format(
                cmd.tokens[0], time_until_revive)
            return await fe_utils.send_message(
                cmd.client, cmd.message.channel,
                fe_utils.formatMessage(cmd.message.author, response))

        slimeoid = EwSlimeoid(member=cmd.message.author)

        if player_data.life_state == ewcfg.life_state_corpse:
            market_data = EwMarket(id_server=cmd.guild.id)

            # Endless War collects his fee.
            # fee = (player_data.slimecoin / 10)
            # player_data.change_slimecoin(n = -fee, coinsource = ewcfg.coinsource_revival)
            # market_data.slimes_revivefee += fee
            # player_data.busted = False

            # Preserve negaslime
            if player_data.slimes < 0:
                # market_data.negaslime += player_data.slimes
                player_data.change_slimes(n=-player_data.slimes)  # set to 0

            # reset slimelevel to zero
            player_data.slimelevel = 0

            # Set time of last revive. This used to provied spawn protection, but currently isn't used.
            player_data.time_lastrevive = time_now

            if False:  #player_data.degradation >= 100:
                player_data.life_state = ewcfg.life_state_shambler
                player_data.change_slimes(n=0.5 * ewcfg.slimes_shambler)
                player_data.trauma = ""
                poi_death = poi_static.id_to_poi.get(player_data.poi_death)
                if move_utils.inaccessible(poi=poi_death,
                                           user_data=player_data):
                    player_data.poi = ewcfg.poi_id_endlesswar
                else:
                    player_data.poi = poi_death.id_poi
            else:
                # Set life state. This is what determines whether the player is actually alive.
                player_data.life_state = ewcfg.life_state_juvenile
                # Give player some initial slimes.
                player_data.change_slimes(n=ewcfg.slimes_onrevive)
                # Get the player out of the sewers.
                player_data.poi = ewcfg.poi_id_endlesswar

            # Give newly spawned juvies a foul odour
            player_data.applyStatus(ewcfg.status_repelled_id)

            player_data.persist()
            market_data.persist()

            # Shower every district in the city with slime from the sewers.
            sewer_data = EwDistrict(district=ewcfg.poi_id_thesewers,
                                    id_server=cmd.guild.id)
            # the amount of slime showered is divided equally amongst the districts
            districts_amount = len(poi_static.capturable_districts)
            geyser_amount = int(0.5 * sewer_data.slimes / districts_amount)
            # Get a list of all the districts
            for poi in poi_static.capturable_districts:
                district_data = EwDistrict(district=poi,
                                           id_server=cmd.guild.id)

                district_data.change_slimes(n=geyser_amount)
                sewer_data.change_slimes(n=-1 * geyser_amount)

                district_data.persist()
                sewer_data.persist()

            sewer_inv = bknd_item.inventory(id_user=sewer_data.name,
                                            id_server=sewer_data.id_server)
            for item in sewer_inv:
                district = ewcfg.poi_id_slimesea
                if random.random() < 0.5:
                    district = random.choice(poi_static.capturable_districts)
                bknd_item.give_item(id_item=item.get("id_item"),
                                    id_user=district,
                                    id_server=sewer_data.id_server)

            await ewrolemgr.updateRoles(client=cmd.client,
                                        member=cmd.message.author)

            response = '{slime4} Geysers of fresh slime erupt from every manhole in the city, showering their surrounding districts. {slime4} {name} has been reborn in slime. {slime4}'.format(
                slime4=ewcfg.emote_slime4,
                name=cmd.message.author.display_name)
        else:
            response = 'You\'re not dead just yet.'

        #	deathreport = "You were {} by {}. {}".format(kill_descriptor, cmd.message.author.display_name, ewcfg.emote_slimeskull)
        #	deathreport = "{} ".format(ewcfg.emote_slimeskull) + fe_utils.formatMessage(member, deathreport)

        if slimeoid.life_state == ewcfg.slimeoid_state_active:
            reunite = ""
            brain = sl_static.brain_map.get(slimeoid.ai)
            reunite += brain.str_revive.format(slimeoid_name=slimeoid.name)
            new_poi = poi_static.id_to_poi.get(player_data.poi)
            revivechannel = fe_utils.get_channel(cmd.guild, new_poi.channel)
            reunite = fe_utils.formatMessage(cmd.message.author, reunite)
            await fe_utils.send_message(cmd.client, revivechannel, reunite)

    # Send the response to the player.
    await fe_utils.send_message(
        cmd.client, cmd.message.channel,
        fe_utils.formatMessage(cmd.message.author, response))
Example #20
0
async def incubate_negaslimeoid(cmd):
    user_data = EwUser(member=cmd.message.author)
    slimeoid_data = EwSlimeoid(member=cmd.message.author)

    # Check for if the player is a corpse
    if user_data.life_state != ewcfg.life_state_corpse:
        if cmd.message.channel.name == ewcfg.channel_wafflehouse:
            response = "You feel as though there is some ancient power here, but the slime coursing through your veins prevents you from using it."
        else:
            response = "Huh? What'd you say?"

    # Check for if the player is at Waffle House
    elif cmd.message.channel.name != ewcfg.channel_wafflehouse:
        response = "You can't exactly summon anything in {}. Go to Waffle House first.".format(
            cmd.message.channel.name)

    # Check if the player already has a Slimeoid or a Negaslimeoid.
    elif slimeoid_data.life_state == ewcfg.slimeoid_state_active:
        if slimeoid_data.sltype == ewcfg.sltype_nega:
            response = "You already have a Negaslimeoid by your side. Destroy your current Negaslimeoid before you commune with the Ancient Ones yet again."
        else:
            response = "You wish to summon a Negaslimeoid, yet you have a Slimeoid that still calls you its master. !destroyslimeoid if you wish to commune with the Ancient Ones properly."

    # Check if the player is already incubating a Slimeoid or Negaslimeoid
    elif slimeoid_data.life_state == ewcfg.slimeoid_state_forming:
        if slimeoid_data.sltype == ewcfg.sltype_nega:
            response = "You are already in the process of conjuring a Negaslimeoid."
        else:
            response = "You wish to summon a Negaslimeoid, yet you have a Slimeoid that is still yet to call you its master. !destroyslimeoid if you wish to commune with the Ancient Ones properly."

    else:

        #Check if player has too many slimeoids
        slimeoid_count = get_slimeoid_count(user_id=cmd.message.author.id,
                                            server_id=cmd.guild.id)

        if slimeoid_count >= 3:
            response = "You have too many slimeoids."
            # Go to final response

        else:
            #Check if player has a negapoudrin
            negapoudrin = bknd_item.find_item(
                item_search=ewcfg.item_id_negapoudrin,
                id_user=cmd.message.author.id,
                id_server=cmd.guild.id if cmd.guild is not None else None,
                item_type_filter=ewcfg.it_item)
            if negapoudrin is None:
                response = "You need a negapoudrin to bind a Negaslimeoid to your command."
                # Go to final response

            else:
                # Get argument for how big the negaslimeoid should be made
                sacrificed_negaslime = None
                if cmd.tokens_count > 1:
                    # -1 from getIntToken() could possibly be gotten from player input, so do a check here.
                    if cmd.tokens[1] == "all":
                        if user_data.slimes < 0:
                            sacrificed_negaslime = -user_data.slimes

                    else:
                        print(cmd.tokens[0])
                        sacrificed_negaslime = ewutils.getIntToken(
                            tokens=cmd.tokens)
                        if sacrificed_negaslime < 0:
                            sacrificed_negaslime = -sacrificed_negaslime

                # Check if player sacrificed any negaslime or if they have enough to sacrifice.
                if sacrificed_negaslime == None:
                    response = "You must sacrifice your own negaslime to conjure a Negaslimeoid. Specify how much negaslime you will sacrifice."
                    # Go to final response

                elif -sacrificed_negaslime < user_data.slimes:
                    response = "You do not have that much negaslime to sacrifice."
                    # Go to final response

                else:
                    # delete a negapoudrin from the player's inventory
                    bknd_item.item_delete(id_item=negapoudrin.get('id_item'))

                    # Remove negaslime
                    user_data.change_slimes(n=+sacrificed_negaslime)

                    # Establish these stats for conjuring the negaslimeoid
                    level = len(str(sacrificed_negaslime))
                    slimeoid_data.life_state = ewcfg.slimeoid_state_forming
                    slimeoid_data.level = level
                    slimeoid_data.sltype = ewcfg.sltype_nega
                    slimeoid_data.hue = ewcfg.hue_id_negative
                    slimeoid_data.id_user = str(user_data.id_user)
                    slimeoid_data.id_server = user_data.id_server

                    # Save changes
                    slimeoid_data.persist()
                    user_data.persist()

                    response = "Floating in front of the Ouija® Board, you place both of your ghastly appendages on the planchette. {sacrificed_negaslime:,} negaslime rises from your body, flowing towards your negapoudrin. The negapoudrin appears to lift into the air, held up by a pool of rising negaslime. Whispers awake around you, indiscernible and unknowable. It feels as though the planchette beneath your ghastly fingers has more than one set of hands on it. \n\nThe conjuration of a Negaslimeoid has begun! {negaslime_emote}".format(
                        sacrificed_negaslime=sacrificed_negaslime,
                        negaslime_emote=ewcfg.emote_negaslime)
                    # Go to final response

    # Final response
    await send_response(response, cmd)