async def capture_progress(cmd): user_data = EwUser(member=cmd.message.author) response = "" poi = poi_static.id_to_poi.get(user_data.poi) response += "**{}**: ".format(poi.str_name) if not user_data.poi in poi_static.capturable_districts: response += "This zone cannot be captured." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) district_data = EwDistrict(id_server=user_data.id_server, district=user_data.poi) percent_progress_after = int(district_data.capture_points / district_data.max_capture_points * 100) if district_data.capturing_faction not in ["", district_data.controlling_faction] and district_data.controlling_faction != '': response += "{} have been de-capturing this district. ".format(district_data.capturing_faction.capitalize()) elif district_data.controlling_faction == district_data.capturing_faction and district_data.controlling_faction != '': response += "{} have been tightening control of this district. ".format(district_data.capturing_faction.capitalize()) elif district_data.controlling_faction != "": response += "{} control this district. ".format(district_data.controlling_faction.capitalize()) elif district_data.capturing_faction != "": response += "{} have been capturing this district. ".format(district_data.capturing_faction.capitalize()) else: response += "Nobody has staked a claim to this district yet. " if district_data.time_unlock > 0: response += "\n\n**It's impossible to capture at the moment.**" if not district_data.all_neighbors_friendly(): response += "But the lock is starting to decay..." response += "Current progress: {progress}%".format(progress=percent_progress_after) return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def check_farm(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 = "" levelup_response = "" mutations = user_data.get_mutations() # Checking availability of check farm 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 = "Do you remember planting anything here in this barren wasteland? No, you don’t. Idiot." 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 missed a step, you haven’t planted anything here yet." elif farm.action_required == ewcfg.farm_action_none: if farm.phase == ewcfg.farm_phase_reap: response = "Your crop is ready for the harvest." elif farm.phase == ewcfg.farm_phase_sow: response = "You only just planted the seeds. Check back later." else: if farm.slimes_onreap < ewcfg.reap_gain: response = "Your crop looks frail and weak." elif farm.slimes_onreap < ewcfg.reap_gain + 3 * ewcfg.farm_slimes_peraction: response = "Your crop looks small and generally unremarkable." elif farm.slimes_onreap < ewcfg.reap_gain + 6 * ewcfg.farm_slimes_peraction: response = "Your crop seems to be growing well." else: response = "Your crop looks powerful and bursting with nutrients." else: farm_action = farm_static.id_to_farm_action.get(farm.action_required) response = farm_action.str_check await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def send_gangbase_messages(server_id, clock): # this can be added onto for events and such lucky_lucy = 0 casino_response = "**Lucky Lucy has arrived!** Now's the time to make your fortune!" casino_end = "Aww, Lucy left." highnoon = 0 response = "" #if clock == 3: # response = "The police are probably asleep, the lazy f***s. It's a good time for painting the town!" #elif clock == 11: # response = "Spray time's over, looks like the cops are back out. F**k those guys." if random.randint(1, 50) == 2: lucky_lucy = 1 if clock == 11: highnoon = 1 if clock == 12: highnoon = 2 client = ewutils.get_client() server = client.get_guild(server_id) channels = ewcfg.hideout_channels casino_channel = fe_utils.get_channel(server=server, channel_name=ewcfg.channel_casino) dueling_channel = fe_utils.get_channel(server=server, channel_name='hang-em-square') if response != "": for channel in channels: post_channel = fe_utils.get_channel(server, channel) await fe_utils.send_message(client, post_channel, response) if lucky_lucy == 1: pass #taking this out until we have a better method #await fe_utils.send_message(client, casino_channel, casino_response) #await asyncio.sleep(300) #await fe_utils.send_message(client, casino_channel, casino_end) if highnoon != 0: district = EwDistrict(district='hangemsquare', id_server=server_id) if len( district.get_players_in_district( min_slimes=0, life_states=[ ewcfg.life_state_enlisted, ewcfg.life_state_juvenile, ewcfg.life_state_shambler, ewcfg.life_state_corpse ], ignore_offline=True)) > 0: if highnoon == 1: response = "It's almost high noon..." else: response = "**DRAW!!!!**" await fe_utils.send_message(client, dueling_channel, response)
async def ufo_observe(cmd): user_data = EwUser(member = cmd.message.author) 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') == 'skinsuit': if cosmetic_data.item_props.get('adorned') == 'true': protected = True shipstate = EwGamestate(id_state='shipstate', id_server=cmd.guild.id) if user_data.poi != 'ufoufo': return await ewdebug.scrutinize(cmd=cmd) elif not protected: response = "Those aliens would probably ass-probe the f**k out of you if you messed with their equipment. Better not." elif shipstate.bit == 1: response = "The ship is grounded. Can't see much from here." elif cmd.tokens_count <= 1: response = "Observe what?" elif not ewcfg.dh_active or ewcfg.dh_stage != 3: response = "Wait, your alien espionage is waaaay out of season." else: poi_seek = ewutils.flattenTokenListToString(cmd.tokens[1:]) poi_sought = poi_static.id_to_poi.get(poi_seek) if poi_sought is None: response = "The aliens know all the district names. You don't have to make up weird shit." elif poi_sought.id_poi == 'ufoufo': return await ewdebug.scrutinize(cmd=cmd) elif poi_sought.is_street: response = "You try to zoom in on a specific street, but you're a little too high up to get that level of detail." elif poi_sought.id_poi == 'blackpond' or (not poi_sought.is_district and not poi_sought.is_outskirts and not poi_sought.is_pier and poi_sought.id_poi not in [ewcfg.poi_id_slimesendcliffs, ewcfg.poi_id_ferry, ewcfg.poi_id_sodafountain, ewcfg.poi_id_stockexchange, ewcfg.poi_id_ab_farms, ewcfg.poi_id_og_farms, ewcfg.poi_id_jr_farms]): response = "The X-ray vision on this viewport sucks. You can't really see indoors." elif poi_sought.id_poi in [ewcfg.poi_id_rowdyroughhouse, ewcfg.poi_id_copkilltown]: response = "Do you want to blow your cover, dumbass? Stop acting like a gangster. The gang bases are mostly indoors anyway." else: new_permissions = {"ufo-ufo": ["read", "send", "connect"]} new_permissions[poi_sought.channel] = ["read"] current_poi = poi_static.id_to_poi.get('ufoufo') response = "" if current_poi is not None: response = 'You point the observation reticle over at {}.'.format(poi_sought.str_name) district_data = EwDistrict(id_server=cmd.guild.id, district='ufoufo') poi_static.id_to_poi['ufoufo'].permissions = new_permissions players_in_district = district_data.get_players_in_district(min_slimes=0, life_states=[ewcfg.life_state_enlisted, ewcfg.life_state_corpse, ewcfg.life_state_juvenile, ewcfg.life_state_shambler], ignore_offline=True) server = ewcfg.server_list[cmd.guild.id] for playerid in players_in_district: member_object = server.get_member(playerid) await ewrolemgr.updateRoles(client=cmd.client, member=member_object) return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def cultivate(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 = "" levelup_response = "" mutations = user_data.get_mutations() # Checking availability of irrigate action if user_data.life_state != ewcfg.life_state_juvenile: response = "Only Juveniles of pure heart and with nothing better to do can tend to their crops." elif cmd.message.channel.name not in [ewcfg.channel_jr_farms, ewcfg.channel_og_farms, ewcfg.channel_ab_farms]: response = "Do you remember planting anything here in this barren wasteland? No, you don’t. Idiot." 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 ) farm_action = farm_static.cmd_to_farm_action.get(cmd.tokens[0].lower()) if farm.time_lastsow == 0: response = "You missed a step, you haven’t planted anything here yet." elif farm.action_required != farm_action.id_action: response = farm_action.str_execute_fail farm.slimes_onreap -= ewcfg.farm_slimes_peraction farm.slimes_onreap = max(farm.slimes_onreap, 0) farm.persist() else: response = farm_action.str_execute # gvs - farm actions award more slime farm.slimes_onreap += ewcfg.farm_slimes_peraction * 2 farm.action_required = ewcfg.farm_action_none farm.persist() 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 capture_progress(cmd): user_data = EwUser(member=cmd.message.author) response = "" poi = poi_static.id_to_poi.get(user_data.poi) response += "**{}**: ".format(poi.str_name) if not user_data.poi in poi_static.capturable_districts: response += "This zone cannot be captured." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) district_data = EwDistrict(id_server=user_data.id_server, district=user_data.poi) if district_data.controlling_faction != "": response += "{} control this district. ".format(district_data.controlling_faction.capitalize()) elif district_data.capturing_faction != "" and district_data.cap_side != district_data.capturing_faction: response += "{} are de-capturing this district. ".format(district_data.capturing_faction.capitalize()) elif district_data.capturing_faction != "": response += "{} are capturing this district. ".format(district_data.capturing_faction.capitalize()) else: response += "Nobody has staked a claim to this district yet." response += "\n\n**Current influence: {:,}**\nMinimum influence: {:,}\nMaximum influence: {:,}\nPercentage to maximum influence: {:,}%".format(abs(district_data.capture_points), int(ewcfg.min_influence[district_data.property_class]), int(ewcfg.limit_influence[district_data.property_class]), round((abs(district_data.capture_points) * 100 / (ewcfg.limit_influence[district_data.property_class])), 1)) # if district_data.time_unlock > 0: # response += "\nThis district cannot be captured currently. It will unlock in {}.".format(ewutils.formatNiceTime(seconds = district_data.time_unlock, round_to_minutes = True)) return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
def path_step(path, poi_next, cost_next, user_data, poi_end, landmark_mode = False): next_poi = poi_next if inaccessible(user_data=user_data, poi=next_poi): return False else: # check if we already got the movement bonus/malus for this district if not poi_next.id_poi in path.pois_visited: path.pois_visited.add(next_poi.id_poi) if len(user_data.faction) > 0 and next_poi.id_poi != poi_end.id_poi and next_poi.id_poi != path.steps[0].id_poi: district = EwDistrict( id_server=user_data.id_server, district=next_poi.id_poi ) if district != None and len(district.controlling_faction) > 0: if user_data.faction == district.controlling_faction: cost_next -= ewcfg.territory_time_gain else: cost_next += ewcfg.territory_time_gain # Slimecorp gets a bonus in unclaimed territory elif user_data.faction == ewcfg.faction_slimecorp: cost_next -= ewcfg.territory_time_gain path.steps.append(poi_next) if landmark_mode and cost_next > ewcfg.territory_time_gain: cost_next -= ewcfg.territory_time_gain path.cost += cost_next return True
async def rate(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 = "" if cmd.message.channel.name != ewcfg.channel_stockexchange: # Only allowed in the stock exchange. response = "You must go to the Slime Stock Exchange to check the current stock exchange rates ." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) 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)) stock = "" if cmd.tokens_count > 0: stock = ewutils.flattenTokenListToString(cmd.tokens[1:]) if stock in ewcfg.stocks: stock = EwStock(id_server=cmd.guild.id, stock=stock) response = "The current value of {stock} stocks is {cred:,} SlimeCoin per 1000 Shares.".format(stock=ewcfg.stock_names.get(stock.id_stock), cred=stock.exchange_rate) elif stock == "": for stock in ewcfg.stocks: stock = EwStock(id_server=cmd.guild.id, stock=stock) response += "\nThe current value of {stock} stocks is {cred:,} SlimeCoin per 1000 Shares.".format(stock=ewcfg.stock_names.get(stock.id_stock), cred=stock.exchange_rate) else: response = "That's not a valid stock name, please use a proper one, you c**t: {}".format(ewutils.formatNiceList(ewcfg.stocks)) # Send the response to the player. await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def stocks(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)) if cmd.message.channel.name != ewcfg.channel_stockexchange: # Only allowed in the stock exchange. response = "You must go to the Slime Stock Exchange to check the currently available stocks." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) 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)) response = "Here are the currently available stocks: {}".format(ewutils.formatNiceList(ewcfg.stocks)) # Send the response to the player. await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
def item_off(id_item, id_server, item_name="", is_pushed_off=False): item_obj = EwItem(id_item=id_item) districtmodel = EwDistrict(id_server=id_server, district=ewcfg.poi_id_slimesendcliffs) slimetotal = 0 if item_obj.item_props.get('id_furniture') == 'sord': response = "You toss the sord off the cliff, but for whatever reason, the damn thing won't go down. It just keeps going up and up, as though gravity itself blocked this piece of shit jpeg artifact on Twitter. It eventually goes out of sight, where you assume it flies into the sun." bknd_item.item_delete(id_item=id_item) elif random.randrange(500) < 125 or item_obj.item_type in ([ ewcfg.it_questitem, item_obj.item_type == ewcfg.it_medal, ewcfg.it_relic ]) or item_obj.item_props.get( 'rarity') == ewcfg.rarity_princeps or item_obj.item_props.get( 'id_cosmetic' ) == "soul" or item_obj.item_props.get( 'id_furniture' ) == "propstand" or item_obj.item_props.get( 'id_furniture' ) in static_items.furniture_collection or item_obj.item_props.get( 'acquisition') == 'relic': response = "You toss the {} off the cliff. It sinks into the ooze disappointingly.".format( item_name) if item_obj.item_props.get('id_item') in [ ewcfg.item_id_oldboot, ewcfg.item_id_seaweed, ewcfg.item_id_tincan, ewcfg.item_id_slimepoudrin ] or item_obj.item_props.get( 'acquisition') == ewcfg.acquisition_fishing: bknd_item.item_delete(id_item=id_item) else: bknd_item.give_item(id_item=id_item, id_server=id_server, id_user=ewcfg.poi_id_slimesea) elif random.randrange(500) < 498: response = "You toss the {} off the cliff. A nearby kraken swoops in and chomps it down with the cephalapod's equivalent of a smile. Your new friend kicks up some sea slime for you. Sick!".format( item_name) slimetotal = 2000 + random.randrange(10000) bknd_item.item_delete(id_item=id_item) else: response = "{} Oh f**k. FEEDING FRENZY!!! Sea monsters lurch down on the spoils like it's f*****g christmas, and a ridiculous level of slime debris covers the ground. {}".format( ewcfg.emote_slime1, ewcfg.emote_slime1) slimetotal = 100000 + random.randrange(900000) bknd_item.item_delete(id_item=id_item) districtmodel.change_slimes(n=slimetotal) districtmodel.persist() return response
async def bleedout(cmd): user_data = EwUser(member=cmd.message.author) mutations = user_data.get_mutations() if ewcfg.mutation_id_bleedingheart not in mutations: response = "You don't have an open enough wound to just gush your blood everywhere." elif user_data.bleed_storage == 0: response = "There's nothing to bleed. Sounds like someone has a persecution complex..." elif user_data.bleed_storage > user_data.slimes: # don't think this is possible, but just in case response = "Wait, wouldn't that kill you? Better not." else: response = "You clutch your malformed heart and squeeze as hard as you can. The intense pain makes you fall to your knees, and your slime drops in spurts to the floor under you as you gasp desperately for relief. You have been bled dry." poi = poi_static.id_to_poi.get(user_data.poi) district_data = EwDistrict(id_server=cmd.message.guild.id, district=poi.id_poi) user_data.change_slimes(n=-user_data.bleed_storage, source=ewcfg.source_bleeding) district_data.change_slimes(n=user_data.bleed_storage, source=ewcfg.source_bleeding) user_data.bleed_storage = 0 user_data.persist() district_data.persist() return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def scrub(cmd): user_data = EwUser(member=cmd.message.author) poi = poi_static.id_to_poi.get(user_data.poi) district = EwDistrict(id_server=cmd.guild.id, district=poi.id_poi) if user_data.life_state != ewcfg.life_state_juvenile: response = "You wouldn't stoop that low. Only Juvies would be that needlessly obedient." elif not poi.is_capturable: response = "No need to scrub, scrub. The gangs don't really mark up this place." elif district.capture_points == 0: response = "{} is clean. Good job, assuming you actually did anything.".format(poi.str_name) elif district.all_neighbors_friendly(): response = "You're too deep into enemy territory. Scrub here and you might wet yourself." else: if random.randint(0, 2) == 0: district.change_capture_points(progress=-1, actor=ewcfg.actor_decay) district.persist() if user_data.crime >= 1: user_data.change_crime(n = -1) user_data.persist() response = "-" if response != "-": return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def advertise(cmd): time_now = int(time.time()) 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)) if user_data.poi != ewcfg.poi_id_slimecorphq: response = "To buy ad space, you'll need to go SlimeCorp HQ." 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) 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)) cost = ewcfg.slimecoin_toadvertise if user_data.slimecoin < cost: response = "Your don't have enough slimecoin to advertise. ({:,}/{:,})".format( user_data.slimecoin, cost) return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) ads = bknd_ads.get_ads(cmd.guild.id) if len(ads) >= ewcfg.max_concurrent_ads: first_ad = EwAd(id_ad=ads[0]) first_expire = first_ad.time_expir secs_to_expire = int(first_expire - time_now) mins_to_expire = int(secs_to_expire / 60) hours_to_expire = int(mins_to_expire / 60) days_to_expire = int(hours_to_expire / 24) expire_list = [] if hours_to_expire > 0: expire_list.append("{} days".format(days_to_expire)) if hours_to_expire > 0: expire_list.append("{} hours".format(hours_to_expire % 24)) if mins_to_expire > 0: expire_list.append("{} minutes".format(mins_to_expire % 60)) else: expire_list.append("{} seconds".format(secs_to_expire % 60)) time_to_expire = ewutils.formatNiceList(names=expire_list, conjunction="and") response = "Sorry, but all of our ad space is currently in use. The next vacancy will be in {}.".format( time_to_expire) return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) if cmd.tokens_count < 2: response = "Please specify the content of your ad." return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) content = cmd.message.content[len(cmd.tokens[0]):].strip() if len(content) > ewcfg.max_length_ads: response = "Your ad is too long, we can't fit that on a billboard. ({:,}/{:,})".format( len(content), ewcfg.max_length_ads) return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) sponsor_disclaimer = "Paid for by {}".format( cmd.message.author.display_name) response = "This is what your ad is going to look like." await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) response = "{}\n\n*{}*".format(content, sponsor_disclaimer) await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) response = "It will cost {:,} slimecoin to stay up for 4 weeks. Is this fine? {} or {}".format( cost, ewcfg.cmd_confirm, ewcfg.cmd_cancel) await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) accepted = False try: msg = await cmd.client.wait_for( 'message', timeout=30, check=lambda message: message.author == cmd.message.author and message.content.lower() in [ewcfg.cmd_confirm, ewcfg.cmd_cancel]) if msg != None: if msg.content.lower() == ewcfg.cmd_confirm: accepted = True except: accepted = False if accepted: bknd_ads.create_ad( id_server=cmd.guild.id, id_sponsor=cmd.message.author.id, content=content, time_expir=time_now + ewcfg.uptime_ads, ) user_data.change_slimecoin(n=-cost, coinsource=ewcfg.coinsource_spending) user_data.persist() response = "Your ad will be put up immediately. Thank you for your business." return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: response = "Good luck raising awareness by word of mouth." return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
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))
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 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 withdraw(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)) time_now = round(time.time()) market_data = EwMarket(id_server=cmd.message.author.guild.id) if market_data.clock < 6 or market_data.clock >= 20: response = ewcfg.str_exchange_closed return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) if cmd.message.channel.name != ewcfg.channel_stockexchange: # or user_data.poi != ewcfg.poi_id_downtown: # Only allowed in the stock exchange. response = ewcfg.str_exchange_channelreq.format(currency="SlimeCoin", action="withdraw") 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) 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.life_state == ewcfg.life_state_corpse: # Disallow withdraws from ghosts. response = "Your slimebroker can't confirm your identity while you're dead." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: value = None stock = None if cmd.tokens_count > 1: value = ewutils.getIntToken(cmd.tokens[1:], allow_all=True) for token in cmd.tokens[1:]: if token.lower() in ewcfg.stocks: stock = token.lower() break if stock != None: stock = EwStock(id_server=cmd.guild.id, stock=stock) total_shares = market_utils.getUserTotalShares(id_server=user_data.id_server, stock=stock.id_stock, id_user=user_data.id_user) if value != None: if value < 0: value = total_shares if value <= 0: value = None if value != None: if value <= total_shares: exchange_rate = (stock.exchange_rate / 1000.0) shares = value slimecoin = round(value * exchange_rate) if user_data.time_lastinvest + ewcfg.cd_invest > time_now: # Limit frequency of withdrawals response = ewcfg.str_exchange_busy.format(action="withdraw") else: user_data.change_slimecoin(n=slimecoin, coinsource=ewcfg.coinsource_withdraw) total_shares -= shares user_data.time_lastinvest = time_now stock.total_shares -= shares response = "You exchange {shares:,} shares in {stock} for {coins:,} SlimeCoin.".format(coins=slimecoin, shares=shares, stock=ewcfg.stock_names.get(stock.id_stock)) user_data.persist() stock.timestamp = round(time.time()) stock.persist() market_utils.updateUserTotalShares(id_server=user_data.id_server, stock=stock.id_stock, id_user=user_data.id_user, shares=total_shares) else: response = "You don't have that many shares in {stock} to exchange.".format(stock=ewcfg.stock_names.get(stock.id_stock)) else: response = ewcfg.str_exchange_specify.format(currency="SlimeCoin", action="withdraw") else: response = "That's not a valid stock name, please use a proper one, you c**t: {}".format(ewutils.formatNiceList(names=ewcfg.stocks)) await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def invest(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)) time_now = round(time.time()) market_data = EwMarket(id_server=cmd.message.author.guild.id) if cmd.message.channel.name != ewcfg.channel_stockexchange: # or user_data.poi != ewcfg.poi_id_downtown: # Only allowed in the stock exchange. response = ewcfg.str_exchange_channelreq.format(currency="SlimeCoin", action="invest") 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) 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 market_data.clock < 6 or market_data.clock >= 20: response = ewcfg.str_exchange_closed return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) if user_data.time_lastinvest + ewcfg.cd_invest > time_now: # Limit frequency of investments. response = ewcfg.str_exchange_busy.format(action="invest") return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) if user_data.life_state == ewcfg.life_state_corpse: # Disallow invests from ghosts. response = "Your slimebroker can't confirm your identity while you're dead." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) if user_data.life_state == ewcfg.life_state_kingpin: # Disallow investments by RF and CK kingpins. response = "You need that money to buy more videogames." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: value = None stock = None if cmd.tokens_count > 1: value = ewutils.getIntToken(cmd.tokens, allow_all=True) for token in cmd.tokens[1:]: if token.lower() in ewcfg.stocks: stock = token.lower() break if value != None: if value < 0: value = user_data.slimecoin if value <= 0: value = None if value != None: if stock != None: stock = EwStock(id_server=cmd.guild.id, stock=stock) # basic exchange rate / 1000 = 1 share exchange_rate = (stock.exchange_rate / 1000.0) cost_total = round(value * 1.05) # gets the highest value possible where the player can still pay the fee if value == user_data.slimecoin: while cost_total > user_data.slimecoin: value -= cost_total - value cost_total = round(value * 1.05) # The user can only buy a whole number of shares, so adjust their cost based on the actual number of shares purchased. net_shares = round(value / exchange_rate) if user_data.slimecoin < cost_total: response = "You don't have enough SlimeCoin. ({:,}/{:,})".format(user_data.slimecoin, cost_total) elif value > user_data.slimecoin: response = "You don't have that much SlimeCoin to invest." elif net_shares == 0: response = "You don't have enough SlimeCoin to buy a share in {stock}".format(stock=ewcfg.stock_names.get(stock.id_stock)) else: user_data.change_slimecoin(n=-cost_total, coinsource=ewcfg.coinsource_invest) shares = market_utils.getUserTotalShares(id_server=user_data.id_server, stock=stock.id_stock, id_user=user_data.id_user) shares += net_shares market_utils.updateUserTotalShares(id_server=user_data.id_server, stock=stock.id_stock, id_user=user_data.id_user, shares=shares) user_data.time_lastinvest = time_now stock.total_shares += net_shares response = "You invest {coin:,} SlimeCoin and receive {shares:,} shares in {stock}. Your slimebroker takes his nominal fee of {fee:,} SlimeCoin.".format(coin=value, shares=net_shares, stock=ewcfg.stock_names.get(stock.id_stock), fee=(cost_total - value)) user_data.persist() stock.timestamp = round(time.time()) stock.persist() else: response = "That's not a valid stock name, please use a proper one, you c**t: {}".format(ewutils.formatNiceList(names=ewcfg.stocks)) else: response = ewcfg.str_exchange_specify.format(currency="SlimeCoin", action="invest") # Send the response to the player. await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def xfer(cmd): time_now = round(time.time()) 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)) if cmd.message.channel.name != ewcfg.channel_stockexchange: # Only allowed in the stock exchange. response = ewcfg.str_exchange_channelreq.format(currency="SlimeCoin", action="transfer") 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) 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 cmd.mentions_count != 1: # Must have exactly one target to send to. response = "Mention the player you want to send SlimeCoin to." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) if user_data.time_lastinvest + ewcfg.cd_invest > time_now: # Limit frequency of transfers response = ewcfg.str_exchange_busy.format(action="transfer slimecoin") return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) if user_data.life_state == ewcfg.life_state_corpse: # Disallow transfers from ghosts. response = "Your slimebroker can't confirm your identity while you're dead." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) member = cmd.mentions[0] target_data = EwUser(member=member) if target_data.life_state == ewcfg.life_state_kingpin: # Disallow transfers to RF and CK kingpins. response = "You can't transfer SlimeCoin to a known criminal warlord." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) market_data = EwMarket(id_server=cmd.message.author.guild.id) if cmd.message.author.id == member.id: slimes_total = user_data.slimes slimes_drained = int(slimes_total * 0.1) slimes_todistrict = slimes_total - slimes_drained sewer_data = EwDistrict(district=ewcfg.poi_id_thesewers, id_server=user_data.id_server) sewer_data.change_slimes(n=slimes_drained) sewer_data.persist() district_data = EwDistrict(district=user_data.poi, id_server=cmd.guild.id) district_data.change_slimes(n=slimes_todistrict, source=ewcfg.source_killing) district_data.persist() # Set the id_killer to the player himself, remove his slime and slime poudrins. user_data.id_killer = cmd.message.author.id user_data.visiting = ewcfg.location_id_empty user_data.trauma = ewcfg.trauma_id_environment user_data.die(cause=ewcfg.cause_suicide) user_data.persist() await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, "Gaming the slimeconomy is punishable by death. SlimeCorp soldiers execute you immediately.")) await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.author) return # Parse the slime value to send. value = None if cmd.tokens_count > 1: value = ewutils.getIntToken(tokens=cmd.tokens) if value != None: if value < 0: value = user_data.slimes if value <= 0: value = None if value != None: # Cost including the transfer fee. cost_total = round(value * 1.1) if user_data.slimecoin < cost_total: response = "You don't have enough SlimeCoin. ({:,}/{:,})".format(user_data.slimecoin, cost_total) else: # Do the transfer if the player can afford it. target_data.change_slimecoin(n=value, coinsource=ewcfg.coinsource_transfer) user_data.change_slimecoin(n=-cost_total, coinsource=ewcfg.coinsource_transfer) user_data.time_lastinvest = time_now # Persist changes response = "You transfer {slime:,} SlimeCoin to {target_name}. Your slimebroker takes his nominal fee of {fee:,} SlimeCoin.".format(slime=value, target_name=member.display_name, fee=(cost_total - value)) target_data.persist() user_data.persist() else: response = ewcfg.str_exchange_specify.format(currency="SlimeCoin", action="transfer") # Send the response to the player. await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def donate(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)) market_data = EwMarket(id_server=user_data.id_server) time_now = round(time.time()) if user_data.poi == ewcfg.poi_id_slimecorphq: 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)) value = None if cmd.tokens_count > 1: value = ewutils.getIntToken(tokens=cmd.tokens, allow_all=True) if value != None: if value < 0: value = user_data.slimes if value <= 0: value = None if value != None and value < ewcfg.slimecoin_exchangerate: response = "You must volunteer to donate at least %d slime to receive compensation." % ewcfg.slimecoin_exchangerate elif value != None: # Amount of slime invested. cost_total = round(value) coin_total = round(value / ewcfg.slimecoin_exchangerate) if user_data.slimes < cost_total: response = "Acid-green flashes of light and bloodcurdling screams emanate from small window of SlimeCorp HQ. Unfortunately, you did not survive the procedure. Your body is dumped down a disposal chute to the sewers." market_data.donated_slimes += user_data.slimes market_data.persist() user_data.trauma = ewcfg.trauma_id_environment die_resp = user_data.die(cause=ewcfg.cause_donation) user_data.persist() # Assign the corpse role to the player. He dead. await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.author) await die_resp.post() else: # Do the transfer if the player can afford it. market_data.donated_slimes += cost_total market_data.persist() user_data.change_slimes(n=-cost_total, source=ewcfg.source_spending) user_data.change_slimecoin(n=coin_total, coinsource=ewcfg.coinsource_donation) user_data.slime_donations += cost_total # Persist changes user_data.persist() response = "You stumble out of a Slimecorp HQ vault room in a stupor. You don't remember what happened in there, but your body hurts and you've got {slimecoin:,} shiny new SlimeCoin in your pocket.".format(slimecoin=coin_total) else: response = ewcfg.str_exchange_specify.format(currency="slime", action="donate") elif user_data.poi == ewcfg.poi_id_slimeoidlab: 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)) poudrins = bknd_item.find_item(item_search="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 poudrins == None: response = "You have to own a poudrin in order to donate a poudrin. Duh." else: bknd_item.item_delete(id_item=poudrins.get('id_item')) # Remove Poudrins market_data.donated_poudrins += 1 market_data.persist() user_data.poudrin_donations += 1 user_data.persist() response = "You hand off one of your hard-earned poudrins to the front desk receptionist, who is all too happy to collect it. Pretty uneventful, but at the very least you’re glad donating isn’t physically painful anymore." else: response = "To donate slime, go to the SlimeCorp HQ in Downtown. To donate poudrins, go to the N.L.A.C.U. Lab in Brawlden." # Send the response to the player. await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def redeem(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)) time_now = round(time.time()) market_data = EwMarket(id_server=cmd.message.author.guild.id) if market_data.clock < 6 or market_data.clock >= 20: response = ewcfg.str_exchange_closed return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) if user_data.time_lastinvest + ewcfg.cd_invest > time_now: response = ewcfg.str_exchange_busy.format(action="redeem") if cmd.message.channel.name != ewcfg.channel_stockexchange: # or user_data.poi != ewcfg.poi_id_downtown: # Only allowed in the stock exchange. response = ewcfg.str_exchange_channelreq.format(currency="SlimeCoin", action="redeem") 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) 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.life_state == ewcfg.life_state_corpse: # Disallow withdraws from ghosts. response = "Your slimebroker can't confirm your identity while you're dead." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: slimecoin_exchange_rate = 25000000000000 # 25 trillion slime redeem_value = round(user_data.slimecoin / slimecoin_exchange_rate) if redeem_value <= 0: response = "Sadly, you haven't made enough Slimecoin to reedeem any slime!" else: response = "" if user_data.life_state == ewcfg.life_state_enlisted: response = "After you dot all the i’s and cross all the t’s, you immediately send your Kingpin half of your earnings." role_boss = (ewcfg.role_copkiller if user_data.faction == ewcfg.faction_killers else ewcfg.role_rowdyfucker) kingpin = fe_utils.find_kingpin(id_server=cmd.guild.id, kingpin_role=role_boss) kingpin = EwUser(id_server=cmd.guild.id, id_user=kingpin.id_user) if kingpin: kingpin.change_slimes(n=int(redeem_value / 2)) kingpin.persist() else: response = "Your slimebroker pulls a fast one on you and gets you to sign a waiver that lets SlimeCorp keep half of your supposedly redeemed slime. Damn." response += "You walk out with {:,}.".format(int(redeem_value / 2)) user_data.slimes += int(redeem_value / 2) user_data.slimecoin = round(user_data.slimecoin % slimecoin_exchange_rate) user_data.persist() await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def mill(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)) market_data = EwMarket(id_server=user_data.id_server) item_search = ewutils.flattenTokenListToString(cmd.tokens[1:]) 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=ewcfg.it_food) # Checking availability of milling if user_data.life_state != ewcfg.life_state_juvenile: response = "Only Juveniles of pure heart and with nothing better to do can mill their vegetables." elif cmd.message.channel.name not in [ ewcfg.channel_jr_farms, ewcfg.channel_og_farms, ewcfg.channel_ab_farms ]: response = "Alas, there doesn’t seem to be an official SlimeCorp milling station anywhere around here. Probably because you’re in the middle of the f*****g city. Try looking where you reaped your vegetable in the first place, dumbass." # elif user_data.slimes < ewcfg.slimes_permill: # response = "It costs {} to !mill, and you only have {}.".format(ewcfg.slimes_permill, user_data.slimes) elif item_sought: 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)) items = [] vegetable = EwItem(id_item=item_sought.get('id_item')) for result in vendors.mill_results: if type(result.ingredients) == str: if vegetable.item_props.get('id_food') != result.ingredients: pass else: items.append(result) elif type(result.ingredients) == list: if vegetable.item_props.get( 'id_food') not in result.ingredients: pass else: items.append(result) if len(items) > 0: item = random.choice(items) item_props = itm_utils.gen_item_props(item) bknd_item.item_create(item_type=item.item_type, id_user=cmd.message.author.id, id_server=cmd.guild.id, item_props=item_props) response = "You walk up to the official ~~SlimeCorp~~ Garden Gankers Milling Station and shove your irradiated produce into the hand-crank. You begin slowly churning them into a glorious, pastry goo. As the goo tosses and turns inside the machine, it solidifies, and after a few moments a {} pops out!".format( item.str_name) # market_data.donated_slimes += ewcfg.slimes_permill market_data.persist() bknd_item.item_delete(id_item=item_sought.get('id_item')) # user_data.change_slimes(n = -ewcfg.slimes_permill, source = ewcfg.source_spending) # user_data.slime_donations += ewcfg.slimes_permill user_data.persist() else: response = "You can only mill fresh vegetables! SlimeCorp obviously wants you to support local farmers." else: if item_search: # if they didn't forget to specify an item and it just wasn't found response = "You don't have one." else: response = "Mill which item? (check **!inventory**)" await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def order(cmd): user_data = EwUser(member=cmd.message.author) mutations = user_data.get_mutations() if user_data.life_state == ewcfg.life_state_shambler and user_data.poi != ewcfg.poi_id_nuclear_beach_edge: 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)) market_data = EwMarket(id_server=cmd.guild.id) currency_used = 'slime' current_currency_amount = user_data.slimes # poi = ewmap.fetch_poi_if_coordless(cmd.message.channel.name) poi = poi_static.id_to_poi.get(user_data.poi) if poi is None or len(poi.vendors) == 0 or ewutils.channel_name_is_poi(cmd.message.channel.name) == False: # Only allowed in the food court. response = "There’s nothing to buy here. If you want to purchase some items, go to a sub-zone with a vendor in it, like the food court, the speakeasy, or the bazaar." else: poi = poi_static.id_to_poi.get(user_data.poi) district_data = EwDistrict(district=poi.id_poi, id_server=user_data.id_server) shambler_multiplier = 1 # for speakeasy during shambler times if district_data.is_degraded(): if poi.id_poi == ewcfg.poi_id_speakeasy: shambler_multiplier = 4 else: 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)) # value = ewutils.flattenTokenListToString(cmd.tokens[1:2]) # if cmd.tokens_count > 1: # value = cmd.tokens[1] # value = value.lower() value = None togo = False if cmd.tokens_count > 1: for token in cmd.tokens[1:]: if token.startswith('<@') == False and token.lower() not in "togo": # togo can be spelled together or separate value = token break for token in cmd.tokens[1:]: if token.lower() in "togo": # lets people get away with just typing only to or only go (or only t etc.) but whatever togo = True break # Finds the item if it's an EwGeneralItem. if value == "mylittleponyfigurine": value = random.choice(static_items.furniture_pony) item = static_items.item_map.get(value) item_type = ewcfg.it_item if item != None: item_id = item.id_item name = item.str_name # Finds the item if it's an EwFood item. if item == None: item = static_food.food_map.get(value) item_type = ewcfg.it_food if item != None: item_id = item.id_food name = item.str_name # Finds the item if it's an EwCosmeticItem. if item == None: item = static_cosmetics.cosmetic_map.get(value) item_type = ewcfg.it_cosmetic if item != None: item_id = item.id_cosmetic name = item.str_name if item == None: item = static_items.furniture_map.get(value) item_type = ewcfg.it_furniture if item != None: item_id = item.id_furniture name = item.str_name if item_id in static_items.furniture_pony: item.vendors = [ewcfg.vendor_bazaar] if item == None: item = static_weapons.weapon_map.get(value) item_type = ewcfg.it_weapon if item != None: item_id = item.id_weapon name = item.str_weapon if item == None: item = static_relic.relic_map.get(value) item_type = ewcfg.it_relic if item != None and relic_utils.canCreateRelic(item.id_relic, cmd.guild.id): item_id = item.id_relic name = item.str_name elif item != None: item = None if item != None: item_type = item.item_type # Gets a vendor that the item is available and the player currently located in try: current_vendor = (set(item.vendors).intersection(set(poi.vendors))).pop() except: current_vendor = None # Check if the item is available in the current bazaar item rotation if current_vendor == ewcfg.vendor_bazaar: if item_id not in market_data.bazaar_wares.values(): if item_id in static_items.furniture_pony and "mylittleponyfigurine" in market_data.bazaar_wares.values(): pass else: current_vendor = None if current_vendor is None or len(current_vendor) < 1: response = "Check the {} for a list of items you can {}.".format(ewcfg.cmd_menu, ewcfg.cmd_order) else: response = "" value = item.price premium_purchase = True if item_id in ewcfg.premium_items else False if premium_purchase: togo = True # Just in case they order a premium food item, don't make them eat it right then and there. if ewcfg.cd_premium_purchase > (int(time.time()) - user_data.time_lastpremiumpurchase): response = "That item is in very limited stock! The vendor asks that you refrain from purchasing it for a day or two." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif ewcfg.cd_new_player > (int(time.time()) - user_data.time_joined): response = "You've only been in the city for a few days. The vendor doesn't trust you with that item very much..." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) stock_data = None company_data = None # factor in the current stocks for vendor in item.vendors: if vendor in ewcfg.vendor_stock_map: stock = ewcfg.vendor_stock_map.get(vendor) company_data = EwCompany(id_server=user_data.id_server, stock=stock) stock_data = EwStock(id_server=user_data.id_server, stock=stock) if stock_data is not None: value *= (stock_data.exchange_rate / ewcfg.default_stock_exchange_rate) ** 0.2 controlling_faction = poi_utils.get_subzone_controlling_faction(user_data.poi, user_data.id_server) if controlling_faction != "": # prices are halved for the controlling gang if controlling_faction == user_data.faction: value /= 2 # and 4 times as much for enemy gangsters elif user_data.faction != "": value *= 4 # raise shambled speakeasy price 4 times value *= shambler_multiplier # Raise the price for togo ordering. This gets lowered back down later if someone does togo ordering on a non-food item by mistake. if togo: value *= 1.5 if current_vendor == ewcfg.vendor_breakroom and user_data.faction == ewcfg.faction_slimecorp: value = 0 value = int(value) food_ordered = False target_data = None # Kingpins eat free. if (user_data.life_state == ewcfg.life_state_kingpin or user_data.life_state == ewcfg.life_state_grandfoe) and item_type == ewcfg.it_food: value = 0 if value > current_currency_amount: # Not enough money. response = "A {} costs {:,} {}, and you only have {:,}.".format(name, value, currency_used, current_currency_amount) else: mutations = user_data.get_mutations() if random.randrange(5) == 0 and ewcfg.mutation_id_stickyfingers in mutations: value = 0 user_data.change_crime(n=ewcfg.cr_larceny_points) inv_response = bknd_item.check_inv_capacity(user_data=user_data, item_type=item_type, return_strings=True, pronoun="You") if inv_response != "" and (item_type != ewcfg.it_food or togo): return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, inv_response)) if item_type == ewcfg.it_food: food_ordered = True target = None target_data = None if not togo: # cant order togo for someone else, you can just give it to them in person if cmd.mentions_count == 1: target = cmd.mentions[0] if target.id == cmd.message.author.id: target = None if target != None: target_data = EwUser(member=target) if target_data.life_state == ewcfg.life_state_corpse and target_data.get_possession(): response = "How are you planning to feed them while they're possessing you?" return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif target_data.poi != user_data.poi: response = "You can't order anything for them because they aren't here!" return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) elif item_type == ewcfg.it_weapon: if user_data.life_state == ewcfg.life_state_corpse: response = "Ghosts can't hold weapons." return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) item_props = itm_utils.gen_item_props(item) # Only food should have the value multiplied. If someone togo orders a non-food item by mistake, lower it back down. if not food_ordered and togo: value = int(value / 1.5) if currency_used == 'slime': user_data.change_slimes(n=-value, source=ewcfg.source_spending) if company_data is not None: company_data.recent_profits += value company_data.persist() if item.str_name == "arcade cabinet": item_props['furniture_desc'] = random.choice(ewcfg.cabinets_list) elif item.item_type == ewcfg.it_furniture: if "custom" in item_props.get('id_furniture'): if cmd.tokens_count < 4 or cmd.tokens[2] == "" or cmd.tokens[3] == "": response = "You need to specify the customization text before buying a custom item. Come on, isn't that self-evident? (!order [custom item] \"custom name\" \"custom description\")" return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) else: customname = cmd.tokens[2] if len(customname) > 32: response = "That name is too long. ({:,}/32)".format(len(customname)) return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) customdesc = cmd.tokens[3] if len(customdesc) > 500: response = "That description is too long. ({:,}/500)".format(len(customdesc)) return await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) name = item_props['furniture_name'] = item_props['furniture_name'].format(custom=customname) item_props['furniture_desc'] = customdesc item_props['furniture_look_desc'] = item_props['furniture_look_desc'].format(custom=customname) item_props['furniture_place_desc'] = item_props['furniture_place_desc'].format(custom=customname) id_item = bknd_item.item_create( item_type=item_type, id_user=cmd.message.author.id, id_server=cmd.guild.id, stack_max=-1, stack_size=0, item_props=item_props ) if value == 0: response = "You swipe a {} from the counter at {}.".format(name, current_vendor) else: response = "You slam {:,} {} down on the counter at {} for {}.".format(value, currency_used, current_vendor, name) if food_ordered and not togo: item_data = EwItem(id_item=id_item) # Eat food on the spot! if target_data != None: target_player_data = EwPlayer(id_user=target_data.id_user) if value == 0: response = "You swipe a {} from the counter at {} and give it to {}.".format(name, current_vendor, target_player_data.display_name) else: response = "You slam {:,} slime down on the counter at {} for {} and give it to {}.".format(value, current_vendor, name, target_player_data.display_name) response += "\n\n*{}*: ".format(target_player_data.display_name) + target_data.eat(item_data) target_data.persist() else: if value == 0: response = "You swipe a {} from the counter at {} and eat it right on the spot.".format(name, current_vendor) else: response = "You slam {:,} slime down on the counter at {} for {} and eat it right on the spot.".format(value, current_vendor, name) user_player_data = EwPlayer(id_user=user_data.id_user) response += "\n\n*{}*: ".format(user_player_data.display_name) + user_data.eat(item_data) user_data.persist() if premium_purchase: user_data.time_lastpremiumpurchase = int(time.time()) user_data.persist() else: response = "Check the {} for a list of items you can {}.".format(ewcfg.cmd_menu, ewcfg.cmd_order) # Send the response to the player. await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def slimeball(cmd): user_data = EwUser(member=cmd.message.author) if not ewutils.channel_name_is_poi(cmd.message.channel.name): response = "You have to go into the city to play Slimeball." return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) poi_data = poi_static.id_to_poi.get(user_data.poi) if poi_data.id_poi != ewcfg.poi_id_vandalpark: response = "You have to go Vandal Park to play {}.".format(cmd.cmd[1:]) return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) if poi_data.is_subzone or poi_data.is_transport: response = "This place is too cramped for playing {}. Go outside!".format( cmd.cmd[1:]) return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) district_data = EwDistrict(district=poi_data.id_poi, id_server=cmd.message.guild.id) # global sb_userid_to_player slimeball_player = sportsutils.sb_userid_to_player.get( cmd.message.author.id) game_data = None if slimeball_player != None: # global sb_games game_data = sports_utils.sb_games.get(slimeball_player.id_game) if game_data != None and game_data.poi != poi_data.id_poi: game_data.players.remove(slimeball_player) game_data = None if game_data == None: # global sb_idserver_to_gamemap gamemap = sportsutils.sb_idserver_to_gamemap.get(cmd.guild.id) if gamemap != None: game_data = gamemap.get(poi_data.id_poi) team = ewutils.flattenTokenListToString(cmd.tokens[1:]) if team not in ["purple", "pink"]: response = "Please choose if you want to play on the pink team or the purple team." return await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response)) if game_data == None: game_data = EwSlimeballGame(poi_data.id_poi, cmd.message.guild.id) response = "You grab a stray ball and start a new game of {game} as a {team} team player." else: response = "You join the {game} game on the {team} team." slimeball_player = EwSlimeballPlayer(cmd.message.author.id, cmd.message.guild.id, game_data.id_game, team) else: response = "You are playing {game} on the {team} team. You are currently at {player_coords} going in direction {player_vel}. The ball is currently at {ball_coords} going in direction {ball_vel}. The score is purple {score_purple} : {score_pink} pink." response = response.format(game=cmd.cmd[1:], team=slimeball_player.team, player_coords=slimeball_player.coords, ball_coords=game_data.ball_coords, player_vel=slimeball_player.velocity, ball_vel=game_data.ball_velocity, score_purple=game_data.score_purple, score_pink=game_data.score_pink) return 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))
def create_mining_event(cmd): randomn = random.random() time_now = int(time.time()) user_data = EwUser(member=cmd.message.author) mine_district_data = EwDistrict(district=user_data.poi, id_server=user_data.id_server) life_states = [ewcfg.life_state_enlisted, ewcfg.life_state_juvenile] num_miners = len( mine_district_data.get_players_in_district(life_states=life_states, ignore_offline=True)) common_event_chance = 0.7 # 7/10 uncommon_event_chance = 0.3 # 3/10 rare_event_chance = 0.1 / num_miners # 1/10 for 1 miner, 1/20 for 2 miners, etc. common_event_triggered = False uncommon_event_triggered = False rare_event_triggered = False # This might seem a bit confusing, so let's run through an example. # The random number is 0.91, and the number of valid miners is 2. # 0.91 < (0.6 + 0.05), condition not met # 0.91 < (0.9 + 0.05), condition met, uncommon event used if randomn < common_event_chance: # + (0.1 - rare_event_chance)): common_event_triggered = True else: # randomn < (common_event_chance + uncommon_event_chance + (0.1 - rare_event_chance)): uncommon_event_triggered = True # else: # rare_event_triggered = True # common event if common_event_triggered: randomn = random.random() # 4x glob of slime if randomn < 0.5: event_props = {} event_props['id_user'] = cmd.message.author.id event_props['poi'] = user_data.poi event_props['channel'] = cmd.message.channel.name return bknd_worldevent.create_world_event( id_server=cmd.guild.id, event_type=ewcfg.event_type_slimeglob, time_activate=time_now, event_props=event_props) # 30 seconds slimefrenzy else: event_props = {} event_props['id_user'] = cmd.message.author.id event_props['poi'] = user_data.poi event_props['channel'] = cmd.message.channel.name return bknd_worldevent.create_world_event( id_server=cmd.guild.id, event_type=ewcfg.event_type_slimefrenzy, time_activate=time_now, time_expir=time_now + 30, event_props=event_props) # uncommon event elif uncommon_event_triggered: randomn = random.random() # gap into the void if randomn < 0.05: event_props = {} event_props['id_user'] = cmd.message.author.id event_props['poi'] = user_data.poi event_props['channel'] = cmd.message.channel.name return bknd_worldevent.create_world_event( id_server=cmd.guild.id, event_type=ewcfg.event_type_voidhole, time_activate=time_now, time_expir=time_now + 10, event_props=event_props) # mine shaft collapse elif randomn < 0.5: event_props = {} event_props['id_user'] = cmd.message.author.id event_props['poi'] = user_data.poi event_props['captcha'] = ewutils.generate_captcha( length=8, user_data=user_data) event_props['channel'] = cmd.message.channel.name return bknd_worldevent.create_world_event( id_server=cmd.guild.id, event_type=ewcfg.event_type_minecollapse, time_activate=time_now, event_props=event_props) # 10 second poudrin frenzy else: if bknd_item.check_inv_capacity(user_data=user_data, item_type=ewcfg.it_item): event_props = {} event_props['id_user'] = cmd.message.author.id event_props['poi'] = user_data.poi event_props['channel'] = cmd.message.channel.name return bknd_worldevent.create_world_event( id_server=cmd.guild.id, event_type=ewcfg.event_type_poudrinfrenzy, time_activate=time_now, time_expir=time_now + 5, event_props=event_props) """
async def reap(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)) forcereap = False if cmd.tokens[0] == ewcfg.cmd_reap_alt: if cmd.message.author.guild_permissions.administrator: forcereap = True else: return response = "" levelup_response = "" mutations = user_data.get_mutations() cosmetic_abilites = itm_utils.get_cosmetic_abilities( id_user=cmd.message.author.id, id_server=cmd.guild.id) poi = poi_static.id_to_poi.get(user_data.poi) # 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 reap 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 = "Do you remember planting anything here in this barren wasteland? No, you don’t. Idiot." 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 missed a step, you haven’t planted anything here yet." else: cur_time_min = time.time() / 60 time_grown = cur_time_min - farm.time_lastsow if farm.phase != ewcfg.farm_phase_reap and not forcereap: response = "Patience is a virtue and you are morally bankrupt. Just wait, asshole." else: # Reaping if (time_grown > ewcfg.crops_time_to_grow * 16) and not forcereap: # about 2 days response = "You eagerly cultivate your crop, but what’s this? It’s dead and wilted! It seems as though you’ve let it lay fallow for far too long. Pay better attention to your farm next time. You gain no slime." farm.time_lastsow = 0 # 0 means no seeds are currently planted farm.persist() else: user_initial_level = user_data.slimelevel slime_gain = farm.slimes_onreap controlling_faction = poi_utils.get_subzone_controlling_faction( user_data.poi, user_data.id_server) if controlling_faction != "" and controlling_faction == user_data.faction: slime_gain *= 2 if has_tool and weapon.id_weapon == ewcfg.weapon_id_hoe: slime_gain *= 1.5 if ewcfg.mutation_id_greenfingers in mutations: slime_gain *= 1.2 if user_data.poi == ewcfg.poi_id_jr_farms: slime_gain = int(slime_gain / 4) # trauma = se_static.trauma_map.get(user_data.trauma) # if trauma != None and trauma.trauma_class == ewcfg.trauma_class_slimegain: # slime_gain *= (1 - 0.5 * user_data.degradation / 100) slime_gain = max(0, round(slime_gain)) response = "You reap what you’ve sown. Your investment has yielded {:,} slime, ".format( slime_gain) # Determine if an item is found. unearthed_item = False unearthed_item_amount = 0 unearthed_item_chance = 50 / ewcfg.unearthed_item_rarity # 1 in 30 chance if ewcfg.mutation_id_lucky in mutations: unearthed_item_chance *= 1.33 # 1 in 22.5 chance if ewcfg.cosmeticAbility_id_lucky in cosmetic_abilites: unearthed_item_chance *= 1.33 # 1 in ~17 chance with both if has_tool and weapon.id_weapon == ewcfg.weapon_id_shovel: # 1 in 6 chance unearthed_item_chance *= 5 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(vendors.mine_results) item_props = itm_utils.gen_item_props(item) if item is not None: 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 += "a {}, ".format(item.str_name) elif unearthed_item_amount == 2: response += "two {}s, ".format(item.str_name) # Determine what crop is grown. vegetable = static_food.food_map.get(farm.crop) if vegetable is None: vegetable = random.choice(static_food.vegetable_list) item_props = itm_utils.gen_item_props(vegetable) # Create and give a bushel of whatever crop was grown, unless it's a metal crop. if item_props.get('id_food') in [ ewcfg.item_id_metallicaps, ewcfg.item_id_steelbeans, ewcfg.item_id_aushucks ]: metallic_crop_ammount = 1 if random.randrange(10) == 0: metallic_crop_ammount = 5 if random.randrange( 2) == 0 else 6 if has_tool and weapon.id_weapon == ewcfg.weapon_id_pitchfork: metallic_crop_ammount *= 2 for vcreate in range(metallic_crop_ammount): bknd_item.item_create( id_user=cmd.message.author.id, id_server=cmd.guild.id, item_type=vegetable.item_type, item_props=item_props) if metallic_crop_ammount == 1: response += "and a single {}!".format( vegetable.str_name) else: response += "and a bushel or two of {}!".format( vegetable.str_name) # if random.randrange(10) == 0: # for vcreate in range(6): # bknd_item.item_create( # id_user=cmd.message.author.id, # id_server=cmd.guild.id, # item_type=vegetable.item_type, # item_props=item_props # ) # # response += "and a bushel of {}!".format(vegetable.str_name) # else: # response += "and a bushel of... hey, what the hell! You didn't reap anything! Must've been some odd seeds..." else: unearthed_vegetable_amount = 3 if has_tool and weapon.id_weapon == ewcfg.weapon_id_pitchfork: unearthed_vegetable_amount *= 2 for vcreate in range(unearthed_vegetable_amount): bknd_item.item_create( id_user=cmd.message.author.id, id_server=cmd.guild.id, item_type=vegetable.item_type, item_props=item_props) response += "and a bushel of {}!".format( vegetable.str_name) levelup_response = user_data.change_slimes( n=slime_gain, source=ewcfg.source_farming) was_levelup = True if user_initial_level < user_data.slimelevel else False # Tell the player their slime level increased. if was_levelup: response += "\n\n" + levelup_response user_data.hunger += ewcfg.hunger_perfarm user_data.persist() farm.time_lastsow = 0 # 0 means no seeds are currently planted farm.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) await fe_utils.send_message( cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
async def menu(cmd): user_data = EwUser(member=cmd.message.author, data_level=2) if user_data.life_state == ewcfg.life_state_shambler and user_data.poi != ewcfg.poi_id_nuclear_beach_edge: 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)) market_data = EwMarket(id_server=cmd.guild.id) # poi = ewmap.fetch_poi_if_coordless(cmd.message.channel.name) poi = poi_static.id_to_poi.get(user_data.poi) if user_data.poi == ewcfg.poi_id_clinicofslimoplasty: response = "Try {}browse. The menu is in the zines.".format(ewcfg.cmd_prefix) elif poi is None or len(poi.vendors) == 0 or ewutils.channel_name_is_poi(cmd.message.channel.name) == False: # Only allowed in the food court. response = "There’s nothing to buy here. If you want to purchase some items, go to a sub-zone with a vendor in it, like the food court, the speakeasy, or the bazaar." else: poi = poi_static.id_to_poi.get(user_data.poi) mother_district_data = None for mother_poi in poi.mother_districts: mother_poi_data = poi_static.id_to_poi.get(mother_poi) if mother_poi_data.is_district: # One of the mother pois was a district, get its controlling faction mother_district_data = EwDistrict(district=mother_poi, id_server=user_data.id_server) break else: # One of the mother pois was a street, get the father district of that street and its controlling faction father_poi = mother_poi_data.father_district mother_district_data = EwDistrict(district=father_poi, id_server=user_data.id_server) break district_data = EwDistrict(district=poi.id_poi, id_server=user_data.id_server) # mother_district_data = EwDistrict(district = destination_poi.id_poi, id_server = user_data.id_server) shambler_multiplier = 1 # for speakeasy during shambler times if district_data.is_degraded() and poi.id_poi != ewcfg.poi_id_nuclear_beach_edge: if poi.id_poi == ewcfg.poi_id_speakeasy: shambler_multiplier = 4 else: 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)) controlling_faction = poi_utils.get_subzone_controlling_faction(user_data.poi, user_data.id_server) response = "{} Menu:\n\n".format(poi.str_name) vendors_list = poi.vendors for vendor in vendors_list: if vendor == ewcfg.vendor_secretbodega: if user_data.freshness < ewcfg.freshnesslevel_4: continue else: response += '\nThe hipster behind the counter nearly falls out of his chair after laying eyes on the sheer, unadulterated freshness before him.\n"S-Sir! Your outfit... i-it is positively ***on fleek!!*** As I see you are a fashion enthusiast like myself, let me show you the good stuff…"\n' items = [] # If the vendor is the bazaar get the current rotation of items from the market_data vendor_inv = vendors.vendor_inv[vendor] if vendor != ewcfg.vendor_bazaar else market_data.bazaar_wares.values() for item_name in vendor_inv: item_item = static_items.item_map.get(item_name) food_item = static_food.food_map.get(item_name) cosmetic_item = static_cosmetics.cosmetic_map.get(item_name) furniture_item = static_items.furniture_map.get(item_name) weapon_item = static_weapons.weapon_map.get(item_name) relic_item = static_relic.relic_map.get(item_name) if relic_item is not None: if relic_utils.canCreateRelic(item_name, cmd.guild.id) == None: continue # increase profits for the stock market stock_data = None if vendor in ewcfg.vendor_stock_map: stock = ewcfg.vendor_stock_map.get(vendor) stock_data = EwStock(id_server=user_data.id_server, stock=stock) value = 0 if item_item: value = item_item.price if food_item: value = food_item.price if cosmetic_item: value = cosmetic_item.price if furniture_item: value = furniture_item.price if weapon_item: value = weapon_item.price if relic_item: value = relic_item.price if stock_data != None: value *= (stock_data.exchange_rate / ewcfg.default_stock_exchange_rate) ** 0.2 # multiply by 4 is speakeasy is shambled value *= shambler_multiplier if mother_district_data != None: if controlling_faction != "": # prices are halved for the controlling gang if controlling_faction == user_data.faction: value /= 2 # and 4 times as much for enemy gangsters elif user_data.faction != "": value *= 4 if vendor == ewcfg.vendor_breakroom and user_data.faction == ewcfg.faction_slimecorp: value = 0 value = int(value) if value != 0: items.append('{} ({:,})'.format(item_name, value)) else: items.append(item_name) response += "**{}**: *{}*\n".format(vendor, ewutils.formatNiceList(names=items)) if vendor == ewcfg.vendor_bodega: if user_data.freshness < ewcfg.freshnesslevel_1: response += "\nThe hipster behind the counter is utterly repulsed by the fashion disaster in front of him. Looks like you just aren’t fresh enough for him." if user_data.has_soul == 0: if vendor == ewcfg.vendor_dojo: response += "\n\nThe Dojo master looks at your soulless form with pity." elif vendor == ewcfg.vendor_bar: response += "\n\nThe bartender, sensing your misery, asks if you're okay." elif vendor == ewcfg.vendor_diner: response += "\n\nThe cook gives you a concerned look as he throws down another helping of flapjacks." elif vendor == ewcfg.vendor_seafood: response += "\n\nThe waiter sneers at how soulless and unkempt you look. You try to ignore him." elif vendor == ewcfg.vendor_bazaar: response += "\n\nAll the shops seem so lively. You wish you had a soul so you could be like them." elif vendor == ewcfg.vendor_beachresort or vendor == ewcfg.vendor_countryclub: response += "\n\nEverything looks so fancy here, but it doesn't really appeal to you since you don't have a soul." elif vendor == ewcfg.vendor_bodega: if user_data.freshness < ewcfg.freshnesslevel_1: response += ".. and you probably never will be." elif vendor == ewcfg.vendor_glocksburycomics: response += "\n\nThe cashier here tries to start up a conversation about life being worth living. You're having none of it." elif vendor == ewcfg.vendor_basedhardware: response += "\n\nSo many industrial metals here... You contemplate which you could use to kill yourself..." elif vendor == ewcfg.vendor_wafflehouse: response += "\n\nNot even waffles could hope to make your emptiness go away." elif vendor == ewcfg.vendor_greencakecafe: response += "\n\nThe barista behind the counter pauses to look at your soulless misery for a second, but decides you're not worth it and gets back to work." elif vendor == ewcfg.vendor_slimypersuits: response += "\n\nYour mere presence in here ruins the cheery atmosphere." # Send the response to the player. await fe_utils.send_message(cmd.client, cmd.message.channel, fe_utils.formatMessage(cmd.message.author, response))
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))