async def set_title(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)) title = cmd.message.content[(len(cmd.tokens[0])):].strip() poi = poi_static.id_to_poi.get(user_data.poi) if not poi.write_manuscript: 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 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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def set_pen_name(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)) poi = poi_static.id_to_poi.get(user_data.poi) if not poi.write_manuscript: 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 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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def flutter(cmd): user_data = EwUser(member=cmd.message.author) if user_data.race == ewcfg.race_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_rowdys: excuses.append("you end up thrashing with your wings in an unorganized fashion.") if user_data.faction == ewcfg.faction_killers: 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 fe_utils.send_response(response, cmd)
async def autocannibalize(cmd): user_data = EwUser(member=cmd.message.author) response = "" if user_data.race == ewcfg.race_food: time_now = int(time.time()) if time_now > user_data.time_racialability or ewutils.DEBUG_OPTIONS['no_race_cooldown'] == True: #pass cooldown check when debug racecooldown is on 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 = "Slow down! You don't want to eat yourself into oblivion." else: response = "You people are not allowed to do that." return await fe_utils.send_response(response, cmd)
async def begin_manuscript(cmd): user_data = EwUser(member=cmd.message.author) title = cmd.message.content[(len(cmd.tokens[0])):].strip() 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)) cost = 20000 poi = poi_static.id_to_poi.get(user_data.poi) if not poi.write_manuscript or poi.id_poi == ewcfg.poi_id_clinicofslimoplasty: 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 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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def set_genre(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)) genre = cmd.message.content[(len(cmd.tokens[0])):].strip() poi = poi_static.id_to_poi.get(user_data.poi) if not poi.write_manuscript: 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 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) if id_genre == 10 and not cmd.message.author.guild_permissions.administrator: response = "You're not a doctor. The publishing company's gonna skin your ass, so you better not." else: book.genre = id_genre book.persist() response = "You scribble {} onto the back cover.".format(genre) await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def cast(cmd): time_now = round(time.time()) has_reeled = False user_data = EwUser(member=cmd.message.author) mutations = user_data.get_mutations() if ewutils.channel_name_is_poi(cmd.message.channel.name) == False: return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, "You must {} in a zone's channel.".format(cmd.tokens[0]))) market_data = EwMarket(id_server=cmd.message.author.guild.id) statuses = user_data.getStatusEffects() if cmd.message.author.id not in fishutils.fishers.keys(): fishutils.fishers[cmd.message.author.id] = EwFisher() fisher = fishutils.fishers[cmd.message.author.id] # Ghosts cannot fish. if user_data.life_state == ewcfg.life_state_corpse: response = "You can't fish while you're dead. Try {}.".format(ewcfg.cmd_revive) # Players who are already cast a line cannot cast another one. elif fisher.fishing == True: response = "You've already cast a line." # Only fish at The Pier elif user_data.poi in poi_static.piers: poi = poi_static.id_to_poi.get(user_data.poi) district_data = EwDistrict(district=poi.id_poi, id_server=user_data.id_server) rod_possession = user_data.get_possession('rod') if rod_possession: fisher.inhabitant_id = rod_possession[0] elif user_data.hunger >= user_data.get_hunger_max(): response = "You're too hungry to fish right now." elif (not fisher.inhabitant_id) and (poi.id_poi == ewcfg.poi_id_blackpond): response = "You cast your fishing line into the pond, but your hook bounces off its black waters like hard concrete." else: has_fishingrod = False if user_data.weapon >= 0: weapon_item = EwItem(id_item=user_data.weapon) weapon = static_weapons.weapon_map.get(weapon_item.item_props.get("weapon_type")) if weapon.id_weapon == "fishingrod": has_fishingrod = True if ewcfg.status_high_id in statuses: fisher.high = True fisher.fishing = True fisher.bait = False fisher.bait_id = 0 fisher.pier = poi fisher.current_fish = gen_fish(market_data, fisher, has_fishingrod) high_value_bait_used = False # global fishing_counter fishutils.fishing_counter += 1 current_fishing_id = fisher.fishing_id = fishutils.fishing_counter item_search = ewutils.flattenTokenListToString(cmd.tokens[1:]) author = cmd.message.author server = cmd.guild item_sought = bknd_item.find_item(item_search=item_search, id_user=author.id, id_server=server.id) if item_sought: item = EwItem(id_item=item_sought.get('id_item')) if item.item_type == ewcfg.it_food: str_name = item.item_props['food_name'] id_food = item.item_props.get('id_food') fisher.bait = True if id_food in static_food.plebe_bait: fisher.current_fish = "plebefish" elif id_food == "doublestuffedcrust": if random.randrange(5) == 3: fisher.current_fish = "doublestuffedflounder" elif id_food in ["chickenbucket", "familymeal"]: if random.randrange(5) == 3: fisher.current_fish = "seacolonel" elif id_food in ["steakvolcanoquesomachorito", "nachosupreme"]: if random.randrange(5) == 3: fisher.current_fish = "marlinsupreme" elif id_food in "blacklimesour": if random.randrange(2) == 1: fisher.current_fish = "blacklimesalmon" elif id_food in "pinkrowdatouille": if random.randrange(2) == 1: fisher.current_fish = "thrash" elif id_food in "purplekilliflowercrustpizza": if random.randrange(2) == 1: fisher.current_fish = "dab" elif id_food == "kingpincrab": if random.randrange(5) == 1: fisher.current_fish = "uncookedkingpincrab" elif id_food == "masterbait": high_value_bait_used = True elif id_food == "ferroslimeoid": fisher.current_fish = "seaitem" elif float(item.time_expir if item.time_expir is not None else 0) < time.time(): if random.randrange(2) == 1: fisher.current_fish = "plebefish" fisher.bait_id = item_sought.get('id_item') if fisher.current_fish == "item": fisher.current_size = "item" else: mastery_bonus = 0 # Git gud. if has_fishingrod: mastery_bonus += user_data.weaponskill - 4 # else: mastery_bonus += -4 if rod_possession: mastery_bonus += 1 mastery_bonus = max(0, mastery_bonus) fisher.length = gen_fish_size(mastery_bonus) fisher.current_size = length_to_size(fisher.length) if fisher.bait == False: response = "You cast your fishing line into the " else: response = "You attach your {} to the hook as bait and then cast your fishing line into the ".format(str_name) if fisher.pier.pier_type == ewcfg.fish_slime_saltwater: response += "vast Slime Sea." elif fisher.pier.pier_type == ewcfg.fish_slime_freshwater: response += "glowing Slime Lake." elif fisher.pier.pier_type == ewcfg.fish_slime_void: response += "pond's black waters." user_data.hunger += ewcfg.hunger_perfish * ewutils.hunger_cost_mod(user_data.slimelevel) user_data.persist() await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) bite_text = gen_bite_text(fisher.current_size) # User has a 1/10 chance to get a bite fun = 100 if fisher.bait == True: # Bait attatched, chance to get a bite increases from 1/10 to 1/7 fun -= 30 if fisher.pier == ewcfg.poi_id_ferry: # Fisher is on the ferry, chance to get a bite increases from 1/10 to 1/9 fun -= 10 if ewcfg.mutation_id_lucky in mutations: fun -= 20 if fisher.inhabitant_id: # Having your rod possessed increases your chance to get a bite by 50% fun = int(fun // 2) if high_value_bait_used: fun = 5 bun = 0 while not ewutils.TERMINATE: if fun <= 0: fun = 1 else: damp = random.randrange(fun) if fisher.high: await asyncio.sleep(30) elif high_value_bait_used: await asyncio.sleep(5) else: await asyncio.sleep(60) # Cancel if fishing was interrupted if current_fishing_id != fisher.fishing_id: return if fisher.fishing == False: return user_data = EwUser(member=cmd.message.author) if fisher.pier == "" or user_data.poi != fisher.pier.id_poi: fisher.stop() return if user_data.life_state == ewcfg.life_state_corpse: fisher.stop() return if damp > 10: await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, random.choice(comm_cfg.void_fishing_text if fisher.pier.pier_type == ewcfg.fish_slime_void else comm_cfg.normal_fishing_text))) fun -= 2 bun += 1 if bun >= 5: fun -= 1 if bun >= 15: fun -= 1 continue else: break fisher.bite = True await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, bite_text)) await asyncio.sleep(8) if fisher.bite != False: response = "The fish got away..." response += cancel_rod_possession(fisher, user_data) fisher.stop() return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: has_reeled = True else: response = "You can't fish here. Go to a pier." # Don't send out a response if the user actually reeled in a fish, since that gets sent by the reel command instead. if has_reeled == False: await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def scavenge(cmd): market_data = EwMarket(id_server=cmd.message.author.guild.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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, "Slow down, you filthy hyena.")) if user_data.poi == ewcfg.poi_id_slimesea: if user_data.life_state == ewcfg.life_state_shambler: return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, "Are you trying to grab random trash instead of !searchingforbrainz? Pretty cringe bro...")) else: return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, "You consider diving down to the bottom of the sea to grab some sick loot, but quickly change your mind when you {}.".format(random.choice(ewcfg.sea_scavenge_responses)))) # Scavenge only in location channels if ewutils.channel_name_is_poi(cmd.message.channel.name) == True: if user_data.hunger >= user_data.get_hunger_max(): return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, "You are too exhausted to scrounge up scraps of slime off the street! Go get some grub!")) else: if juviecmdutils.scavenge_combos.get(user_data.id_user) == None: juviecmdutils.scavenge_combos[user_data.id_user] = 0 combo = juviecmdutils.scavenge_combos.get(user_data.id_user) district_data = EwDistrict(district=user_data.poi, id_server=cmd.message.author.guild.id) user_initial_level = user_data.slimelevel # add scavenged slime to user if ewcfg.mutation_id_trashmouth in mutations: combo += 5 time_since_last_scavenge = min(max(1, time_since_last_scavenge), ewcfg.soft_cd_scavenge) # scavenge_mod = 0.003 * (time_since_last_scavenge ** 0.9) scavenge_mod = 0.005 * combo if (ewcfg.mutation_id_whitenationalist in mutations or ewcfg.mutation_id_airlock in mutations) and market_data.weather == "snow": scavenge_mod *= 1.5 if ewcfg.mutation_id_airlock 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:]) has_comboed = False if juviecmdutils.scavenge_combos.get(user_data.id_user) > 0 and (time_now - user_data.time_lastscavenge) < 60: if juviecmdutils.scavenge_captchas.get(user_data.id_user).lower() == item_search.lower(): juviecmdutils.scavenge_combos[user_data.id_user] += 1 new_captcha = gen_scavenge_captcha(n=juviecmdutils.scavenge_combos.get(user_data.id_user), user_data=user_data) response += "New captcha: **" + ewutils.text_to_regional_indicator(new_captcha) + "**" if ewcfg.mutation_id_webbedfeet in mutations: response += "\nYour flippers pick up {:,} slime.".format(scavenge_yield) juviecmdutils.scavenge_captchas[user_data.id_user] = new_captcha has_comboed = True if ewcfg.mutation_id_dumpsterdiver in mutations: has_comboed = False item_search = item_search[random.randrange(len(item_search))] else: juviecmdutils.scavenge_combos[user_data.id_user] = 0 if not has_comboed: loot_resp = itm_utils.item_lootspecific( user_data=user_data, item_search=item_search ) if loot_resp != "": response = loot_resp + "\n\n" + response else: loot_multiplier = 1.0 + bknd_item.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 = itm_utils.item_lootrandom( user_data ) if loot_resp != "": response += loot_resp + "\n\n" juviecmdutils.scavenge_combos[user_data.id_user] = 1 new_captcha = gen_scavenge_captcha(n=1, user_data=user_data) response += "New captcha: **" + ewutils.text_to_regional_indicator(new_captcha) + "**" if ewcfg.mutation_id_webbedfeet in mutations: response += "\nYour flippers pick up {:,} slime.".format(scavenge_yield) juviecmdutils.scavenge_captchas[user_data.id_user] = new_captcha # 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() # gangsters don't need their roles updated if user_data.life_state == ewcfg.life_state_juvenile: await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.author) if not response == "": return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.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."))
async def flag(cmd): market_data = EwMarket(id_server=cmd.message.author.guild.id) user_data = EwUser(member=cmd.message.author) mutations = user_data.get_mutations() 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)) 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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.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) and ewcfg.mutation_id_lightminer not in mutations: return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.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) and ewcfg.mutation_id_lightminer not in mutations: return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.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.mining_channels: 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.hunger >= user_data.get_hunger_max(): return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, "You've exhausted yourself from mining. You'll need some refreshment before getting back to work.")) else: printgrid = True 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 mining_type = ewcfg.mines_mining_type_map.get(user_data.poi) if mining_type != ewcfg.mining_type_minesweeper: response = "What do you think you can flag here?" return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) if user_data.poi not in juviecmdutils.mines_map: response = "You can't mine here! Go to the mines in Juvie's Row, Toxington, or Cratersville!" return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif user_data.id_server not in juviecmdutils.mines_map.get(user_data.poi): init_grid(user_data.poi, user_data.id_server) printgrid = True grid_cont = juviecmdutils.mines_map.get(user_data.poi).get(user_data.id_server) grid = grid_cont.grid grid_type = ewcfg.grid_type_by_mining_type.get(mining_type) if grid_type != grid_cont.grid_type: init_grid(user_data.poi, user_data.id_server) printgrid = True grid_cont = juviecmdutils.mines_map.get(user_data.poi).get(user_data.id_server) grid = grid_cont.grid row = -1 col = -1 if cmd.tokens_count < 2: response = "Please specify which Minesweeper vein to flag." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) for token in cmd.tokens[1:]: coords = token.lower() if col < 1: for char in coords: if char in ewcfg.alphabet: col = ewcfg.alphabet.index(char) coords = coords.replace(char, "") if row < 1: 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 Minesweeper vein." elif 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 elif grid[row][col] == ewcfg.cell_empty_open: response = "This vein has already been mined dry." elif grid[row][col] == ewcfg.cell_mine: grid[row][col] = ewcfg.cell_mine_marked elif grid[row][col] == ewcfg.cell_empty: grid[row][col] = ewcfg.cell_empty_marked 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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def mine(cmd): market_data = EwMarket(id_server=cmd.message.author.guild.id) 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)) mutations = user_data.get_mutations() cosmetic_abilites = itm_utils.get_cosmetic_abilities(id_user=cmd.message.author.id, id_server=cmd.guild.id) time_now = int(time.time()) poi = poi_static.id_to_poi.get(user_data.poi) 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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.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.mining_channels: 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.hunger >= user_data.get_hunger_max(): return await mismine(cmd, user_data, "exhaustion") # return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, "You've exhausted yourself from mining. You'll need some refreshment before getting back to work.")) else: printgrid = True 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 world_events = bknd_worldevent.get_world_events(id_server=cmd.guild.id) mining_type = ewcfg.mines_mining_type_map.get(user_data.poi) for id_event in world_events: if world_events.get(id_event) == ewcfg.event_type_minecollapse: event_data = EwWorldEvent(id_event=id_event) if int(event_data.event_props.get('id_user')) == user_data.id_user and event_data.event_props.get('poi') == user_data.poi: captcha = event_data.event_props.get('captcha').lower() tokens_lower = [] for token in cmd.tokens[1:]: tokens_lower.append(token.lower()) if captcha in tokens_lower: bknd_worldevent.delete_world_event(id_event=id_event) response = "You escape from the collapsing mineshaft." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif ewcfg.mutation_id_lightminer in mutations: bknd_worldevent.delete_world_event(id_event=id_event) response = "You nimbly step outside the collapse without even thinking about it." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: return await mismine(cmd, user_data, ewcfg.event_type_minecollapse) if user_data.poi not in juviecmdutils.mines_map: response = "You can't mine here! Go to the mines in Juvie's Row, Toxington, or Cratersville!" return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif user_data.id_server not in juviecmdutils.mines_map.get(user_data.poi): init_grid(user_data.poi, user_data.id_server) printgrid = True grid_cont = juviecmdutils.mines_map.get(user_data.poi).get(user_data.id_server) grid = grid_cont.grid grid_type = ewcfg.grid_type_by_mining_type.get(mining_type) if grid_type != grid_cont.grid_type: init_grid(user_data.poi, user_data.id_server) printgrid = True grid_cont = juviecmdutils.mines_map.get(user_data.poi).get(user_data.id_server) grid = grid_cont.grid # minesweeper = True # grid_multiplier = grid_cont.cells_mined ** 0.4 # flag = False mining_yield = get_mining_yield_by_grid_type(cmd, grid_cont) if type(mining_yield) == type(""): response = mining_yield if len(response) > 0: await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) if time_now > grid_cont.time_last_posted + 10: await print_grid(cmd) return 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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.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 = static_weapons.weapon_map.get(weapon_item.item_props.get("weapon_type")) if (weapon.id_weapon == ewcfg.weapon_id_pickaxe or weapon.id_weapon == ewcfg.weapon_id_diamondpickaxe) and user_data.life_state != ewcfg.life_state_juvenile: has_pickaxe = True # if user_data.sidearm >= 0: # sidearm_item = EwItem(id_item=user_data.sidearm) # sidearm = static_weapons.weapon_map.get(sidearm_item.item_props.get("weapon_type")) # if sidearm.id_weapon == ewcfg.weapon_id_pickaxe: # has_pickaxe = True # Determine if an item is found. unearthed_item = False unearthed_item_amount = (random.randrange(3) + 5) # anywhere from 5-7 drops # 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 ewcfg.cosmeticAbility_id_lucky in cosmetic_abilites: unearthed_item_chance *= 1.33 # event bonus for id_event in world_events: if world_events.get(id_event) == ewcfg.event_type_slimefrenzy: event_data = EwWorldEvent(id_event=id_event) if event_data.event_props.get('poi') == user_data.poi and int(event_data.event_props.get('id_user')) == user_data.id_user: mining_yield *= 2 if world_events.get(id_event) == ewcfg.event_type_poudrinfrenzy: event_data = EwWorldEvent(id_event=id_event) if event_data.event_props.get('poi') == user_data.poi and int(event_data.event_props.get('id_user')) == user_data.id_user: unearthed_item_chance = 1 unearthed_item_amount = 1 if random.random() < 0.05: id_event = create_mining_event(cmd) event_data = EwWorldEvent(id_event=id_event) if event_data.id_event == -1: return ewutils.logMsg("Error couldn't find world event with id {}".format(id_event)) if event_data.event_type == ewcfg.event_type_slimeglob: mining_yield *= 4 bknd_worldevent.delete_world_event(id_event=id_event) if event_data.time_activate <= time.time(): event_def = poi_static.event_type_to_def.get(event_data.event_type) if event_def == None: return ewutils.logMsg("Error, couldn't find event def for event type {}".format(event_data.event_type)) str_event_start = event_def.str_event_start if event_data.event_type == ewcfg.event_type_minecollapse: str_event_start = str_event_start.format(cmd=ewcfg.cmd_mine, captcha=ewutils.text_to_regional_indicator(event_data.event_props.get('captcha'))) await fe_utils.send_response(str_event_start, cmd) event_data.time_expir = time_now + 60 event_data.persist() str_event_start = "" if str_event_start != "": response += str_event_start + "\n" if random.random() < unearthed_item_chance: unearthed_item = True if unearthed_item == True: # If there are multiple possible products, randomly select one. item = random.choice(vendors.mine_results) if bknd_item.check_inv_capacity(user_data=user_data, item_type=item.item_type): item_props = itm_utils.gen_item_props(item) for creation in range(unearthed_item_amount): bknd_item.item_create( item_type=item.item_type, id_user=cmd.message.author.id, id_server=cmd.guild.id, item_props=item_props ) if unearthed_item_amount == 1: response += "You unearthed a {}! ".format(item.str_name) else: response += "You unearthed {} {}s! ".format(unearthed_item_amount, 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) controlling_faction = poi_utils.get_subzone_controlling_faction(user_data.poi, user_data.id_server) if controlling_faction != "" and controlling_faction == user_data.faction: mining_yield *= 2 if has_pickaxe == True: mining_yield *= 2 if user_data.life_state == ewcfg.life_state_juvenile: mining_yield *= 2 # trauma = se_static.trauma_map.get(user_data.trauma) # if trauma != None and trauma.trauma_class == ewcfg.trauma_class_slimegain: # mining_yield *= (1 - 0.5 * user_data.degradation / 100) mining_yield = max(0, round(mining_yield)) # 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) # gangsters don't need their roles updated if user_data.life_state == ewcfg.life_state_juvenile: await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.author) else: return await mismine(cmd, user_data, "channel") # response = "You can't mine here! Go to the mines in Juvie's Row, Toxington, or Cratersville!" if len(response) > 0: await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def edit_page(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)) response = "" poi = poi_static.id_to_poi.get(user_data.poi) if not poi.write_manuscript: 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 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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) try: message = await cmd.client.wait_for('message', timeout=20, check=lambda message: message.author == cmd.message.author and message.content.lower() in [ewcfg.cmd_accept, ewcfg.cmd_refuse]) if message != None: if message.content.lower() == ewcfg.cmd_accept: accepted = True if message.content.lower() == ewcfg.cmd_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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def set_length(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)) poi = poi_static.id_to_poi.get(user_data.poi) if not poi.write_manuscript: 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 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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) try: message = await cmd.client.wait_for('message', timeout=20, check=lambda message: message.author == cmd.message.author and message.content.lower() in [ewcfg.cmd_accept, ewcfg.cmd_refuse]) if message != None: if message.content.lower() == ewcfg.cmd_accept: accepted = True if message.content.lower() == ewcfg.cmd_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 fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))