Exemple #1
0
async def set_genre(cmd = None, dm = False):
	user_data = EwUser(member = cmd.message.author)
	genre = cmd.message.content[(len(cmd.tokens[0])):].strip()

	if not dm:
		poi = ewcfg.chname_to_poi.get(cmd.message.channel.name)
	else:
		poi = ewcfg.id_to_poi.get(user_data.poi)

	if not poi.write_manuscript and not dm:
		response = "You'd love to work on your zine, however your current location doesn't strike you as a particularly good place to write. Try heading over the the Cafe, the Comic Shop, or one of the colleges (NLACU/NMS)."

	elif poi not in ewcfg.zine_mother_districts and dm:
		response = "You'd love to work on your zine, however your current location doesn't strike you as a particularly good place to write. Try heading over the the Cafe, the Comic Shop, or one of the colleges (NLACU/NMS). Keep in mind, once you're there you can work on your manuscript in DMs."

	elif user_data.hunger >= user_data.get_hunger_max() and user_data.life_state != ewcfg.life_state_corpse:
		response = "You are just too hungry to alter the title of your masterpiece!"

	elif user_data.manuscript == -1:
		response = "You have yet to create a manuscript. Try !createmanuscript"

	elif genre not in ewcfg.book_genres:
		response = "Please specify the genre you want to change it to. You can choose from {}.".format(ewutils.formatNiceList(ewcfg.book_genres))

	else:
		for i in [i for i, x in enumerate(ewcfg.book_genres) if x == genre]:
			id_genre = i

		book = EwBook(member = cmd.message.author, book_state = 0)
		book.genre = id_genre
		book.persist()

		response = "You scribble {} onto the back cover.".format(genre)

	await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
Exemple #2
0
async def set_pen_name(cmd = None, dm = False):
	user_data = EwUser(member = cmd.message.author)

	if not dm:
		poi = ewcfg.chname_to_poi.get(cmd.message.channel.name)
	else:
		poi = ewcfg.id_to_poi.get(user_data.poi)

	if not poi.write_manuscript and not dm:
		response = "You'd love to work on your zine, however your current location doesn't strike you as a particularly good place to write. Try heading over the the Cafe, the Comic Shop, or one of the colleges (NLACU/NMS)."

	elif poi not in ewcfg.zine_mother_districts and dm:
		response = "You'd love to work on your zine, however your current location doesn't strike you as a particularly good place to write. Try heading over the the Cafe, the Comic Shop, or one of the colleges (NLACU/NMS). Keep in mind, once you're there you can work on your manuscript in DMs."

	elif user_data.hunger >= user_data.get_hunger_max() and user_data.life_state != ewcfg.life_state_corpse:
		response = "You are just too hungry to alter the pen name of your masterpiece!"

	elif user_data.manuscript == -1:
		response = "You have yet to create a manuscript. Try !createmanuscript"

	else:
		book = EwBook(member = cmd.message.author, book_state = 0)
		if book.author != cmd.message.author.display_name:
			book.author = cmd.message.author.display_name

			book.persist()

			response = "You scratch out the author name and scrawl \"{}\" under it.".format(book.author)
		else:
			response = "If you would like to change your pen name, you must change your nickname."

	await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
Exemple #3
0
async def flutter(cmd):
	user_data = EwUser(member = cmd.message.author)
	if user_data.race == ewcfg.races["avian"]:
		district_data = EwDistrict(district = user_data.poi, id_server = cmd.guild.id)
		market_data = EwMarket(id_server=cmd.guild.id)
		response = "You flap your wings in an attempt to fly, but "
		excuses = []

		if market_data.weather == ewcfg.weather_lightning:
			excuses.append("the current weather would make that a bit dangerous, so you decide not to.")
		if ewcfg.mutation_id_bigbones in user_data.get_mutations():
			excuses.append("your bones are too big for you to get off the ground.")
		if ewcfg.mutation_id_lightasafeather in user_data.get_mutations():
			excuses.append("your wings are too skinny to generate enough lift.")

		if 6 <= market_data.clock >= 20:
			excuses.append("it's not safe to fly at night, so you decide not to.")
		else:
			excuses.append("flying in plain daylight might get you shot off the sky, so you decide not to.")

		if user_data.slimes > 1000000:
			excuses.append("you have too much slime on you, so you don't even get off the ground.")
		else:
			excuses.append("you're too weak for this right now, gonna need to get more slime.")

		if user_data.life_state == ewcfg.life_state_corpse:
			excuses.append("your incorporeal wings generate no lift.")
		elif user_data.life_state == ewcfg.life_state_juvenile:
			excuses.append("you lack the moral fiber to do so.")
		else:
			if user_data.faction == ewcfg.faction_boober:
				excuses.append("you end up thrashing with your wings in an unorganized fashion.")
			if user_data.faction == ewcfg.faction_milkers:
				excuses.append("you end up doing rapid dabs instead.")

		if len(district_data.get_players_in_district()) > 1:
			excuses.append("it's embarassing to do so with other people around.")
		else:
			excuses.append("you can't be bothered if there's no one here to see you do it.")

		if user_data.hunger / user_data.get_hunger_max() < 0.5:
			excuses.append("you're too hungry, and end up looking for worms instead.")
		else:
			excuses.append("you're too full from your last meal for such vigorous exercise.")

		response += random.choice(excuses)
	else:
		response = "You people are not allowed to do that."

	return await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
Exemple #4
0
async def autocannibalize(cmd):
	user_data = EwUser(member = cmd.message.author)
	response = ""
	if user_data.race == ewcfg.races["food"]:
		time_now = int(time.time())
		if time_now > user_data.time_racialability:
			response = "You give in to the the existential desire all foods have, and take a small bite out of yourself. It hurts like a bitch, but God **DAMN** you're tasty."
			user_data.time_racialability = time_now + ewcfg.cd_autocannibalize
			user_data.hunger = max(user_data.hunger - (user_data.get_hunger_max() * 0.01), 0)
			user_data.change_slimes(n = -user_data.slimes * 0.001)
			user_data.persist()
		else:
			response = "You're too full of yourself right now, try again later."
	else:
		response = "You people are not allowed to do that."
	return await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
Exemple #5
0
async def begin_manuscript(cmd = None, dm = False):
	user_data = EwUser(member = cmd.message.author)
	title = cmd.message.content[(len(cmd.tokens[0])):].strip()

	cost = 20000

	if not dm:
		poi = ewcfg.chname_to_poi.get(cmd.message.channel.name)
	else:
		poi = ewcfg.id_to_poi.get(user_data.poi)

	if not poi.write_manuscript and not dm:
		response = "You'd love to work on your zine, however your current location doesn't strike you as a particularly good place to write. Try heading over the the Cafe, the Comic Shop, or one of the colleges (NLACU/NMS)."

	elif poi not in ewcfg.zine_mother_districts and dm:
		response = "You'd love to work on your zine, however your current location doesn't strike you as a particularly good place to write. Try heading over the the Cafe, the Comic Shop, or one of the colleges (NLACU/NMS). Keep in mind, once you're there you can work on your manuscript in DMs."

	elif user_data.slimes < cost:
		 response = "You don't have enough slime to create a manuscript. ({:,}/{:,})".format(user_data.slimes, cost)

	elif user_data.hunger >= user_data.get_hunger_max() and user_data.life_state != ewcfg.life_state_corpse:
		response = "You are just too hungry to begin your masterpiece!"

	elif title == "":
		response = "Specify a title."

	elif len(title) > 50:
		response = "Alright buddy, reel it in. That title is just too long. ({:,}/50)".format(len(title))

	else:
		if user_data.manuscript != -1:
			response = "You already have a manuscript deployed you eager beaver!"
		else:
			book = EwBook(member = cmd.message.author, book_state = 0)
			book.author = cmd.message.author.display_name
			book.title = title
			user_data.manuscript = book.id_book
			user_data.change_slimes(n=-cost, source=ewcfg.source_spending)

			book.persist()
			user_data.persist()

			response = "You exchange 20,000 slime for a shoddily-bound manuscript. You scrawl the name \"{} by {}\" into the cover.".format(book.title, book.author)

	await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
Exemple #6
0
async def set_title(cmd = None, dm = False):
	user_data = EwUser(member = cmd.message.author)
	title = cmd.message.content[(len(cmd.tokens[0])):].strip()

	if not dm:
		poi = ewcfg.chname_to_poi.get(cmd.message.channel.name)
	else:
		poi = ewcfg.id_to_poi.get(user_data.poi)

	if not poi.write_manuscript and not dm:
		response = "You'd love to work on your zine, however your current location doesn't strike you as a particularly good place to write. Try heading over the the Cafe, the Comic Shop, or one of the colleges (NLACU/NMS)."

	elif poi not in ewcfg.zine_mother_districts and dm:
		response = "You'd love to work on your zine, however your current location doesn't strike you as a particularly good place to write. Try heading over the the Cafe, the Comic Shop, or one of the colleges (NLACU/NMS). Keep in mind, once you're there you can work on your manuscript in DMs."

	elif user_data.hunger >= user_data.get_hunger_max() and user_data.life_state != ewcfg.life_state_corpse:
		response = "You are just too hungry to alter the title of your masterpiece!"

	elif user_data.manuscript == -1:
		response = "You have yet to create a manuscript. Try !createmanuscript"

	elif title == "":
		response = "Please specify the title you want to change it to."

	elif len(title) > 50:
		response = "Alright buddy, reel it in. That title is just too long. ({:,}/50)".format(len(title))

	else:
		book = EwBook(member = cmd.message.author, book_state = 0)
		book.title = title

		book.persist()

		response = "You scratch out the title and scrawl \"{}\" over it.".format(book.title)

	await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
Exemple #7
0
async def data(cmd):
    response = ""
    user_data = None
    member = None
    resp_cont = ewutils.EwResponseContainer(id_server=cmd.message.server.id)

    if len(cmd.tokens) > 1 and cmd.mentions_count == 0:
        user_data = EwUser(member=cmd.message.author)

        soughtenemy = " ".join(cmd.tokens[1:]).lower()
        enemy = find_enemy(soughtenemy, user_data)
        if enemy != None:
            if enemy.attacktype != ewcfg.enemy_attacktype_unarmed:
                response = "{} is a level {} enemy. They have {} slime, and attack with their {}.".format(
                    enemy.display_name, enemy.level, enemy.slimes,
                    enemy.attacktype)
            else:
                response = "{} is a level {} enemy. They have {} slime.".format(
                    enemy.display_name, enemy.level, enemy.slimes)
        else:
            response = "ENDLESS WAR didn't understand that name."

        resp_cont.add_channel_response(cmd.message.channel.name, response)

    elif cmd.mentions_count == 0:

        user_data = EwUser(member=cmd.message.author)
        slimeoid = EwSlimeoid(member=cmd.message.author)
        mutations = user_data.get_mutations()

        cosmetics = ewitem.inventory(id_user=cmd.message.author.id,
                                     id_server=cmd.message.server.id,
                                     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 = ewcfg.hue_map.get(cos.item_props.get('hue'))
                adorned_cosmetics.append((hue.str_name +
                                          " " if hue != None else "") +
                                         cosmetic.get('name'))

        poi = ewcfg.id_to_poi.get(user_data.poi)
        if poi != None:
            response = "You find yourself {} {}. ".format(
                poi.str_in, poi.str_name)

        # return my data
        if user_data.life_state == ewcfg.life_state_corpse:
            response += "You are a level {} deadboi.".format(
                user_data.slimelevel)
        else:
            response += "You are a level {} slimeboi.".format(
                user_data.slimelevel)

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

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

        if weapon != None:
            response += " {} {}{}.".format(
                ewcfg.str_weapon_married_self if user_data.weaponmarried
                == True else ewcfg.str_weapon_wielding_self,
                ("" 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_self.format(
                        rank=(user_data.weaponskill - 4)))

        trauma = ewcfg.weapon_map.get(user_data.trauma)
        # if trauma is not gathered from weapon_map, get it from attack_type_map
        if trauma == None:
            trauma = ewcfg.attack_type_map.get(user_data.trauma)

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

        response_block = ""
        for mutation in mutations:
            mutation_flavor = ewcfg.mutations_map[mutation]
            response_block += "{} ".format(mutation_flavor.str_describe_self)

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

        resp_cont.add_channel_response(cmd.message.channel.name, response)

        response = ""
        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)

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

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

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

        if user_data.hunger > 0:
            response_block += "You are {}% hungry. ".format(
                round(user_data.hunger * 100.0 / user_data.get_hunger_max(),
                      1))

        if user_data.busted and user_data.life_state == ewcfg.life_state_corpse:
            response_block += "You are busted and therefore cannot leave the sewers until your next !haunt. "

        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 = ewcfg.status_effects_def_map.get(status)
                if status_flavor is not None:
                    response_block += status_flavor.str_describe_self + " "

        if (slimeoid.life_state == ewcfg.slimeoid_state_active) and (
                user_data.life_state != ewcfg.life_state_corpse):
            response_block += "You are accompanied by {}, a {}-foot-tall Slimeoid. ".format(
                slimeoid.name, str(slimeoid.level))

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

        response += "\n\nhttps://ew.krakissi.net/stats/player.html?pl={}".format(
            user_data.id_user)

        resp_cont.add_channel_response(cmd.message.channel.name, response)
    else:
        member = cmd.mentions[0]
        resp_cont = gen_data_text(id_user=member.id,
                                  id_server=member.server.id,
                                  display_name=member.display_name,
                                  channel_name=cmd.message.channel.name)

    # Send the response to the player.
    resp_cont.format_channel_response(cmd.message.channel.name,
                                      cmd.message.author)
    await resp_cont.post()

    await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.author)
    if member != None:
        await ewrolemgr.updateRoles(client=cmd.client, member=member)
Exemple #8
0
async def scavenge(cmd):
    market_data = EwMarket(id_server=cmd.message.author.server.id)
    user_data = EwUser(member=cmd.message.author)
    mutations = user_data.get_mutations()

    time_now = int(time.time())
    response = ""

    time_since_last_scavenge = time_now - user_data.time_lastscavenge

    # Kingpins can't scavenge.
    if user_data.life_state == ewcfg.life_state_kingpin or user_data.life_state == ewcfg.life_state_grandfoe:
        return

    # ghosts cant scavenge
    if user_data.life_state == ewcfg.life_state_corpse:
        return await ewutils.send_message(
            cmd.client, cmd.message.channel,
            ewutils.formatMessage(
                cmd.message.author,
                "What would you want to do that for? You're a ghost, you have no need for such lowly materialistic possessions like slime. You only engage in intellectual pursuits now. {} if you want to give into your base human desire to see numbers go up."
                .format(ewcfg.cmd_revive)))
    # currently not active - no cooldown
    if time_since_last_scavenge < ewcfg.cd_scavenge:
        return await ewutils.send_message(
            cmd.client, cmd.message.channel,
            ewutils.formatMessage(cmd.message.author,
                                  "Slow down, you filthy hyena."))

    # Scavenge only in location channels
    if ewmap.channel_name_is_poi(cmd.message.channel.name) == True:
        if user_data.hunger >= user_data.get_hunger_max():
            return await ewutils.send_message(
                cmd.client, cmd.message.channel,
                ewutils.formatMessage(
                    cmd.message.author,
                    "You are too exhausted to scrounge up scraps of slime off the street! Go get some grub!"
                ))
        else:
            district_data = EwDistrict(district=user_data.poi,
                                       id_server=cmd.message.author.server.id)

            user_initial_level = user_data.slimelevel
            # add scavenged slime to user
            if ewcfg.mutation_id_trashmouth in mutations:
                time_since_last_scavenge *= 3

            time_since_last_scavenge = min(max(1, time_since_last_scavenge),
                                           30)

            scavenge_mod = 0.003 * (time_since_last_scavenge**0.9)

            if ewcfg.mutation_id_whitenationalist in mutations and market_data.weather == "snow":
                scavenge_mod *= 1.5

            if ewcfg.mutation_id_webbedfeet in mutations:
                district_slimelevel = len(str(district_data.slimes))
                scavenge_mod *= max(1, min(district_slimelevel - 3, 4))

            scavenge_yield = math.floor(scavenge_mod * district_data.slimes)

            levelup_response = user_data.change_slimes(
                n=scavenge_yield, source=ewcfg.source_scavenging)
            district_data.change_slimes(n=-1 * scavenge_yield,
                                        source=ewcfg.source_scavenging)
            district_data.persist()

            if levelup_response != "":
                response += levelup_response + "\n\n"
            #response += "You scrape together {} slime from the streets.\n\n".format(scavenge_yield)
            if cmd.tokens_count > 1:
                item_search = ewutils.flattenTokenListToString(cmd.tokens[1:])
                loot_resp = ewitem.item_lootspecific(
                    id_server=user_data.id_server,
                    id_user=user_data.id_user,
                    item_search=item_search)

                response += loot_resp

            else:
                loot_multiplier = 1.0 + ewitem.get_inventory_size(
                    owner=user_data.poi, id_server=user_data.id_server)
                loot_chance = loot_multiplier / ewcfg.scavenge_item_rarity
                if ewcfg.mutation_id_dumpsterdiver in mutations:
                    loot_chance *= 10
                if random.random() < loot_chance:
                    loot_resp = ewitem.item_lootrandom(
                        id_server=user_data.id_server,
                        id_user=user_data.id_user)
                    response += loot_resp

            # Fatigue the scavenger.
            hunger_cost_mod = ewutils.hunger_cost_mod(user_data.slimelevel)
            extra = hunger_cost_mod - int(
                hunger_cost_mod
            )  # extra is the fractional part of hunger_cost_mod

            user_data.hunger += ewcfg.hunger_perscavenge * int(hunger_cost_mod)
            if extra > 0:  # if hunger_cost_mod is not an integer
                # there's an x% chance that an extra stamina is deducted, where x is the fractional part of hunger_cost_mod in percent (times 100)
                if random.randint(1, 100) <= extra * 100:
                    user_data.hunger += ewcfg.hunger_perscavenge

            user_data.time_lastscavenge = time_now

            user_data.persist()

            if not response == "":
                await ewutils.send_message(
                    cmd.client, cmd.message.channel,
                    ewutils.formatMessage(cmd.message.author, response))
    else:
        return await ewutils.send_message(
            cmd.client, cmd.message.channel,
            ewutils.formatMessage(
                cmd.message.author,
                "You'll find no slime here, this place has been picked clean. Head into the city to try and scavenge some slime."
            ))
Exemple #9
0
async def flag(cmd):
    market_data = EwMarket(id_server=cmd.message.author.server.id)
    user_data = EwUser(member=cmd.message.author)
    mutations = user_data.get_mutations()
    time_now = int(time.time())

    response = ""
    # Kingpins can't mine.
    if user_data.life_state == ewcfg.life_state_kingpin or user_data.life_state == ewcfg.life_state_grandfoe:
        return

    # ghosts cant mine (anymore)
    if user_data.life_state == ewcfg.life_state_corpse:
        return await ewutils.send_message(
            cmd.client, cmd.message.channel,
            ewutils.formatMessage(
                cmd.message.author,
                "You can't mine while you're dead. Try {}.".format(
                    ewcfg.cmd_revive)))

    # Enlisted players only mine at certain times.
    if user_data.life_state == ewcfg.life_state_enlisted:
        if user_data.faction == ewcfg.faction_rowdys and (
                market_data.clock < 8 or market_data.clock > 17):
            return await ewutils.send_message(
                cmd.client, cmd.message.channel,
                ewutils.formatMessage(
                    cmd.message.author,
                    "Rowdies only mine in the daytime. Wait for full daylight at 8am."
                    .format(ewcfg.cmd_revive)))

        if user_data.faction == ewcfg.faction_killers and (
                market_data.clock < 20 and market_data.clock > 5):
            return await ewutils.send_message(
                cmd.client, cmd.message.channel,
                ewutils.formatMessage(
                    cmd.message.author,
                    "Killers only mine under cover of darkness. Wait for nightfall at 8pm."
                    .format(ewcfg.cmd_revive)))

    # Mine only in the mines.
    if cmd.message.channel.name in [
            ewcfg.channel_mines, ewcfg.channel_cv_mines, ewcfg.channel_tt_mines
    ]:

        if user_data.hunger >= user_data.get_hunger_max():
            return await ewutils.send_message(
                cmd.client, cmd.message.channel,
                ewutils.formatMessage(
                    cmd.message.author,
                    "You've exhausted yourself from mining. You'll need some refreshment before getting back to work."
                ))

        else:
            if user_data.poi not in mines_map:
                response = "You can't mine here! Go to the mines in Juvie's Row, Toxington, or Cratersville!"
                return await ewutils.send_message(
                    cmd.client, cmd.message.channel,
                    ewutils.formatMessage(cmd.message.author, response))
            elif user_data.id_server not in mines_map.get(user_data.poi):
                init_grid_ms(user_data.poi, user_data.id_server)
            grid_cont = mines_map.get(user_data.poi).get(user_data.id_server)
            grid = grid_cont.grid

            if cmd.tokens_count < 2:
                response = "Please specify which vein to mine."
                await ewutils.send_message(
                    cmd.client, cmd.message.channel,
                    ewutils.formatMessage(cmd.message.author, response))
                return await print_grid_ms(cmd)

            grid_multiplier = grid_cont.cells_mined**0.4
            row = -1
            col = -1
            for token in cmd.tokens[1:]:

                if row < 1 or col < 1:
                    coords = token.lower()

                    for char in coords:
                        if char in ewcfg.alphabet:
                            col = ewcfg.alphabet.index(char)
                            coords = coords.replace(char, "")

                    try:
                        row = int(coords)
                    except:
                        row = -1

            row -= 1

            if row not in range(len(grid)):
                response = "Invalid vein."
                await ewutils.send_message(
                    cmd.client, cmd.message.channel,
                    ewutils.formatMessage(cmd.message.author, response))
                return await print_grid_ms(cmd)
            if col not in range(len(grid[row])):
                response = "Invalid vein."
                await ewutils.send_message(
                    cmd.client, cmd.message.channel,
                    ewutils.formatMessage(cmd.message.author, response))
                return await print_grid_ms(cmd)

            if grid[row][col] in [
                    ewcfg.cell_empty_marked, ewcfg.cell_mine_marked
            ]:
                if grid[row][col] == ewcfg.cell_empty_marked:
                    grid[row][col] = ewcfg.cell_empty
                elif grid[row][col] == ewcfg.cell_mine_marked:
                    grid[row][col] = ewcfg.cell_mine
                return await print_grid_ms(cmd)
            if grid[row][col] == ewcfg.cell_empty_open:
                response = "This vein has already been mined dry."
                await ewutils.send_message(
                    cmd.client, cmd.message.channel,
                    ewutils.formatMessage(cmd.message.author, response))
                return await print_grid_ms(cmd)

            if grid[row][col] == ewcfg.cell_mine:
                grid[row][col] = ewcfg.cell_mine_marked
                return await print_grid_ms(cmd)

            grid[row][col] = ewcfg.cell_empty_marked
            return await print_grid_ms(cmd)

    else:
        response = "You can't mine here! Go to the mines in Juvie's Row, Toxington, or Cratersville!"

    if len(response) > 0:
        await ewutils.send_message(
            cmd.client, cmd.message.channel,
            ewutils.formatMessage(cmd.message.author, response))
Exemple #10
0
async def mine(cmd):
    market_data = EwMarket(id_server=cmd.message.author.server.id)
    user_data = EwUser(member=cmd.message.author)
    mutations = user_data.get_mutations()
    time_now = int(time.time())

    response = ""
    # Kingpins can't mine.
    if user_data.life_state == ewcfg.life_state_kingpin or user_data.life_state == ewcfg.life_state_grandfoe:
        return

    # ghosts cant mine (anymore)
    if user_data.life_state == ewcfg.life_state_corpse:
        return await ewutils.send_message(
            cmd.client, cmd.message.channel,
            ewutils.formatMessage(
                cmd.message.author,
                "You can't mine while you're dead. Try {}.".format(
                    ewcfg.cmd_revive)))

    # Enlisted players only mine at certain times.
    if user_data.life_state == ewcfg.life_state_enlisted:
        if user_data.faction == ewcfg.faction_rowdys and (
                market_data.clock < 8 or market_data.clock > 17):
            return await ewutils.send_message(
                cmd.client, cmd.message.channel,
                ewutils.formatMessage(
                    cmd.message.author,
                    "Rowdies only mine in the daytime. Wait for full daylight at 8am."
                    .format(ewcfg.cmd_revive)))

        if user_data.faction == ewcfg.faction_killers and (
                market_data.clock < 20 and market_data.clock > 5):
            return await ewutils.send_message(
                cmd.client, cmd.message.channel,
                ewutils.formatMessage(
                    cmd.message.author,
                    "Killers only mine under cover of darkness. Wait for nightfall at 8pm."
                    .format(ewcfg.cmd_revive)))

    # Mine only in the mines.
    if cmd.message.channel.name in [
            ewcfg.channel_mines, ewcfg.channel_cv_mines, ewcfg.channel_tt_mines
    ]:

        if user_data.hunger >= user_data.get_hunger_max():
            return await ewutils.send_message(
                cmd.client, cmd.message.channel,
                ewutils.formatMessage(
                    cmd.message.author,
                    "You've exhausted yourself from mining. You'll need some refreshment before getting back to work."
                ))

        else:
            printgrid = False
            hunger_cost_mod = ewutils.hunger_cost_mod(user_data.slimelevel)
            extra = hunger_cost_mod - int(
                hunger_cost_mod
            )  # extra is the fractional part of hunger_cost_mod

            if user_data.poi not in mines_map:
                response = "You can't mine here! Go to the mines in Juvie's Row, Toxington, or Cratersville!"
                return await ewutils.send_message(
                    cmd.client, cmd.message.channel,
                    ewutils.formatMessage(cmd.message.author, response))
            elif user_data.id_server not in mines_map.get(user_data.poi):
                init_grid(user_data.poi, user_data.id_server)
                printgrid = True
            grid_cont = mines_map.get(user_data.poi).get(user_data.id_server)
            grid = grid_cont.grid

            #minesweeper = False
            if cmd.tokens_count < 2:
                response = "Please specify which vein to mine."
                await ewutils.send_message(
                    cmd.client, cmd.message.channel,
                    ewutils.formatMessage(cmd.message.author, response))
                return await print_grid(cmd)

            else:
                #minesweeper = True
                #grid_multiplier = grid_cont.cells_mined ** 0.4
                #flag = False
                row = -1
                col = -1
                for token in cmd.tokens[1:]:

                    if token.lower() == "reset":
                        user_data.hunger += ewcfg.hunger_perminereset * int(
                            hunger_cost_mod)
                        if random.random() < extra:
                            user_data.hunger += ewcfg.hunger_perminereset
                        user_data.persist()
                        init_grid(user_data.poi, user_data.id_server)
                        return await print_grid(cmd)

                    if row < 1 or col < 1:
                        coords = token.lower()

                        for char in coords:
                            if char in ewcfg.alphabet:
                                col = ewcfg.alphabet.index(char)
                                coords = coords.replace(char, "")

                        try:
                            row = int(coords)
                        except:
                            row = -1

                row -= 1

                if row not in range(len(grid)) or col not in range(
                        len(grid[row])):
                    response = "Invalid vein."
                    await ewutils.send_message(
                        cmd.client, cmd.message.channel,
                        ewutils.formatMessage(cmd.message.author, response))
                    return await print_grid(cmd)

                mining_yield = 0
                mining_accident = False

                slimes_pertile = ewcfg.slimes_pertile
                for current_row in range(max(0, row - 1),
                                         min(row + 2, len(grid))):
                    for current_col in range(
                            max(0, col - 1),
                            min(col + 2, len(grid[current_row]))):
                        symbol_prev = get_cell_symbol(
                            grid[current_row][current_col])
                        slimes_fromtile = slimes_pertile
                        if current_row == row and current_col == col:
                            slimes_fromtile *= 2
                        mining_yield += max(
                            0,
                            min(slimes_fromtile,
                                grid[current_row][current_col]))
                        grid[current_row][current_col] -= slimes_fromtile
                        if grid[current_row][
                                current_col] < -60 * ewcfg.slimes_pertile:
                            mining_accident = True
                        if get_cell_symbol(
                                grid[current_row][current_col]) != symbol_prev:
                            printgrid = True

                if mining_accident:
                    user_data.change_slimes(n=-(user_data.slimes * 0.5))
                    user_data.persist()

                    init_grid(user_data.poi, user_data.id_server)
                    response = "You have lost an arm and a leg in a mining accident. Tis but a scratch."

                    await ewutils.send_message(
                        cmd.client, cmd.message.channel,
                        ewutils.formatMessage(cmd.message.author, response))
                    return await print_grid(cmd)

                if mining_yield == 0:
                    user_data.hunger += ewcfg.hunger_permine * int(
                        hunger_cost_mod)
                    user_data.persist()
                    response = "This vein has already been mined dry."
                    await ewutils.send_message(
                        cmd.client, cmd.message.channel,
                        ewutils.formatMessage(cmd.message.author, response))
                    if printgrid:
                        return await print_grid(cmd)
                    else:
                        return

            has_pickaxe = False

            if user_data.weapon >= 0:
                weapon_item = EwItem(id_item=user_data.weapon)
                weapon = ewcfg.weapon_map.get(
                    weapon_item.item_props.get("weapon_type"))
                if weapon.id_weapon == ewcfg.weapon_id_pickaxe:
                    has_pickaxe = True

            # Determine if an item is found.
            unearthed_item = False
            unearthed_item_amount = 0

            # juvies get items 4 times as often as enlisted players
            unearthed_item_chance = 1 / ewcfg.unearthed_item_rarity
            if user_data.life_state == ewcfg.life_state_juvenile:
                unearthed_item_chance *= 2
            if has_pickaxe == True:
                unearthed_item_chance *= 1.5
            if ewcfg.mutation_id_lucky in mutations:
                unearthed_item_chance *= 1.33

            if random.random() < unearthed_item_chance:
                unearthed_item = True
                unearthed_item_amount = 1 if random.randint(
                    1, 3) != 1 else 2  # 33% chance of extra drop

            if unearthed_item == True:
                # If there are multiple possible products, randomly select one.
                item = random.choice(ewcfg.mine_results)

                item_props = ewitem.gen_item_props(item)

                for creation in range(unearthed_item_amount):
                    ewitem.item_create(item_type=item.item_type,
                                       id_user=cmd.message.author.id,
                                       id_server=cmd.message.server.id,
                                       item_props=item_props)

                if unearthed_item_amount == 1:
                    response = "You unearthed a {}! ".format(item.str_name)
                elif unearthed_item_amount == 2:
                    response = "You unearthed two (2) {}! ".format(
                        item.str_name)

                ewstats.change_stat(user=user_data,
                                    metric=ewcfg.stat_lifetime_poudrins,
                                    n=unearthed_item_amount)

                ewutils.logMsg('{} has found {} {}(s)!'.format(
                    cmd.message.author.display_name, item.str_name,
                    unearthed_item_amount))

            user_initial_level = user_data.slimelevel

            # Add mined slime to the user.
            slime_bylevel = ewutils.slime_bylevel(user_data.slimelevel)

            #mining_yield = math.floor((slime_bylevel / 10) + 1)
            #alternate_yield = math.floor(200 + slime_bylevel ** (1 / math.e))

            #mining_yield = min(mining_yield, alternate_yield)

            if has_pickaxe == True:
                mining_yield *= 2

            # Fatigue the miner.

            user_data.hunger += ewcfg.hunger_permine * int(hunger_cost_mod)
            if extra > 0:  # if hunger_cost_mod is not an integer
                # there's an x% chance that an extra stamina is deducted, where x is the fractional part of hunger_cost_mod in percent (times 100)
                if random.randint(1, 100) <= extra * 100:
                    user_data.hunger += ewcfg.hunger_permine

            levelup_response = user_data.change_slimes(
                n=mining_yield, source=ewcfg.source_mining)

            was_levelup = True if user_initial_level < user_data.slimelevel else False

            # Tell the player their slime level increased and/or they unearthed an item.
            if was_levelup:
                response += levelup_response

            user_data.persist()

            if printgrid:
                await print_grid(cmd)

    else:
        response = "You can't mine here! Go to the mines in Juvie's Row, Toxington, or Cratersville!"

    if len(response) > 0:
        await ewutils.send_message(
            cmd.client, cmd.message.channel,
            ewutils.formatMessage(cmd.message.author, response))
Exemple #11
0
async def edit_page(cmd = None, dm = False):
	user_data = EwUser(member = cmd.message.author)
	response = ""

	if not dm:
		poi = ewcfg.chname_to_poi.get(cmd.message.channel.name)
	else:
		poi = ewcfg.id_to_poi.get(user_data.poi)

	if not poi.write_manuscript and not dm:
		response = "You'd love to work on your zine, however your current location doesn't strike you as a particularly good place to write. Try heading over the the Cafe, the Comic Shop, or one of the colleges (NLACU/NMS)."

	elif poi not in ewcfg.zine_mother_districts and dm:
		response = "You'd love to work on your zine, however your current location doesn't strike you as a particularly good place to write. Try heading over the the Cafe, the Comic Shop, or one of the colleges (NLACU/NMS). Keep in mind, once you're there you can work on your manuscript in DMs."

	elif user_data.manuscript == -1:
		response = "You have yet to create a manuscript. Try !createmanuscript"

	elif user_data.hunger >= user_data.get_hunger_max() and user_data.life_state != ewcfg.life_state_corpse:
		response = "You are just too hungry to write your masterpiece!"

	elif cmd.tokens_count == 1:
		response = "You must specify a valid page to edit."

	elif cmd.tokens_count < 3:
		response = "What are you writing down exactly?"

	else:
		page = cmd.tokens[1]
		content = cmd.message.content[(len(cmd.tokens[0])+len(cmd.tokens[1])+2):]
		max_length_page = 1500

		if page == "cover":
			page = '0'

		if not page.isdigit():
			response = "You must specify a valid page to edit."

		elif content == "":
			response = "What are you writing down exactly?"

		elif len(content) > max_length_page:
			response = "Alright buddy, reel it in. That just won't fit on a single page. ({:,}/{:,})".format(len(content), max_length_page)

		else:
			page = int(page)
			book = EwBook(member = cmd.message.author, book_state = 0)

			if page not in range(0, book.pages + 1):
				response = "You must specify a valid page to edit."

			else:
				accepted = True

				if book.book_pages.get(page, "") != "":
					accepted = False
					response = "There is already writing on this page. Are you sure you want to overwrite it? **!accept** or **!refuse**"

					await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))

					try:
						message = await cmd.client.wait_for_message(timeout=20, author=cmd.message.author, check=check)

						if message != None:
							if message.content.lower() == "!accept":
								accepted = True
							if message.content.lower() == "!refuse":
								accepted = False
					except:
						accepted = False
				if not accepted:
					response = "The page remains unchanged."
				else:
					book.book_pages[page] = content

					book.persist()
					response = "You spend some time contemplating your ideas before scribbling them onto the page."

	await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
Exemple #12
0
async def set_length(cmd = None, dm = False):
	user_data = EwUser(member=cmd.message.author)

	if not dm:
		poi = ewcfg.chname_to_poi.get(cmd.message.channel.name)
	else:
		poi = ewcfg.id_to_poi.get(user_data.poi)

	if not poi.write_manuscript and not dm:
		response = "You'd love to work on your zine, however your current location doesn't strike you as a particularly good place to write. Try heading over the the Cafe, the Comic Shop, or one of the colleges (NLACU/NMS)."

	elif poi not in ewcfg.zine_mother_districts and dm:
		response = "You'd love to work on your zine, however your current location doesn't strike you as a particularly good place to write. Try heading over the the Cafe, the Comic Shop, or one of the colleges (NLACU/NMS). Keep in mind, once you're there you can work on your manuscript in DMs."

	elif user_data.hunger >= user_data.get_hunger_max() and user_data.life_state != ewcfg.life_state_corpse:
		response = "You are just too hungry to alter the length of your masterpiece!"

	elif user_data.manuscript == -1:
		response = "You have yet to create a manuscript. Try !createmanuscript"

	elif len(cmd.tokens) == 1:
		response = "Specify how many pages you want it to be ({} and {} pages).".format(ewcfg.minimum_pages, ewcfg.maximum_pages)

	else:
		length = cmd.tokens[1]

		if not length.isdigit():
			response = "Your manuscript can be between {} and {} pages".format(ewcfg.minimum_pages, ewcfg.maximum_pages)

		else:
			book = EwBook(member = cmd.message.author, book_state = 0)
			length = int(length)

			if book.pages == length:
				response = "Your manuscript is already {} pages long.".format(length)

			elif length > ewcfg.maximum_pages or length < ewcfg.minimum_pages:
				response = "Your manuscript can be between {} and {} pages".format(ewcfg.minimum_pages, ewcfg.maximum_pages)

			else:
				pages_with_content = []

				for page in book.book_pages.keys():
					if book.book_pages.get(page) is not None:
						if page > length:
							pages_with_content.append(page)

				accepted = True

				if len(pages_with_content) != 0:
					accepted = False
					page_list = ewutils.formatNiceList(pages_with_content)
					response = "There is writing on these pages: {}. If you change the number of pages to {}, you will cut these pages out. Will you still do it? **!accept** or **!refuse**".format(page_list, length)

					await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))

					try:
						message = await cmd.client.wait_for_message(timeout=20, author=cmd.message.author, check=check)

						if message != None:
							if message.content.lower() == "!accept":
								accepted = True
							if message.content.lower() == "!refuse":
								accepted = False

					except:
						accepted = False

				if not accepted:
					response = "The pages remain unchanged."

				else:
					if length > book.pages:
						response = "You haphazardly slap on a few extra pages at the end of your manuscript so you can write more bullshit."

					else:
						response = "You violently tear some pages out of your manuscript."

					book.pages = length

					if len(pages_with_content) != 0:
						for page in pages_with_content:
							del book.book_pages[page]

					book.persist()

	await ewutils.send_message(cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))