async def suicide(cmd): resp = await ewcmd.start(cmd) response = "" # Only allowed in the combat zone. if cmd.message.channel.name != ewcfg.channel_combatzone: response = "You must go to the #{} to commit suicide.".format( ewcfg.channel_combatzone) else: # Get the user data. user_data = EwUser(member=cmd.message.author) # The roles assigned to the author of this message. roles_map_user = ewutils.getRoleMap(cmd.message.author.roles) user_iskillers = ewcfg.role_copkillers in roles_map_user or ewcfg.role_copkiller in roles_map_user user_isrowdys = ewcfg.role_rowdyfuckers in roles_map_user or ewcfg.role_rowdyfucker in roles_map_user user_isgeneral = ewcfg.role_copkiller in roles_map_user or ewcfg.role_rowdyfucker in roles_map_user user_isjuvenile = ewcfg.role_juvenile in roles_map_user user_isdead = ewcfg.role_corpse in roles_map_user if user_isdead: response = "Too late for that." elif user_isjuvenile: response = "Juveniles are too cowardly for suicide." elif user_isgeneral: response = "\*click* Alas, your gun has jammed." elif user_iskillers or user_isrowdys: role_corpse = cmd.roles_map[ewcfg.role_corpse] # Assign the corpse role to the player. He dead. await cmd.client.replace_roles(cmd.message.author, role_corpse) # Set the id_killer to the player himself, remove his slime and slime poudrins. user_data.id_killer = cmd.message.author.id user_data.slimes = 0 user_data.slimepoudrins = 0 user_data.persist() response = '{} has willingly returned to the slime. {}'.format( cmd.message.author.display_name, ewcfg.emote_slimeskull) else: # This should never happen. We handled all the role cases. Just in case. response = "\*click* Alas, your gun has jammed." # Send the response to the player. await cmd.client.edit_message( resp, ewutils.formatMessage(cmd.message.author, response))
async def russian_roulette(cmd): time_now = int(time.time()) if cmd.message.channel.name != ewcfg.channel_casino: #Only at the casino response = "You can only play russian roulette at the casino." return await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) if cmd.mentions_count != 1: #Must mention only one player response = "Mention the player you want to challenge." return await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) author = cmd.message.author member = cmd.mentions[0] global last_russianrouletted_times last_used_author = last_russianrouletted_times.get(author.id) last_used_member = last_russianrouletted_times.get(member.id) if last_used_author == None: last_used_author = 0 if last_used_member == None: last_used_member = 0 if last_used_author + ewcfg.cd_rr > time_now or last_used_member + ewcfg.cd_rr > time_now: response = "**ENOUGH**" return await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) if author.id == member.id: response = "You might be looking for !suicide." return await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(author, response)) challenger = EwUser(member = author) challengee = EwUser(member = member) #Players have been challenged if challenger.rr_challenger != "": response = "You are already in the middle of a challenge." return await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(author, response)) if challengee.rr_challenger != "": response = "{} is already in the middle of a challenge.".format(member.display_name).replace("@", "\{at\}") return await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(author, response)) if challenger.poi != challengee.poi: #Challangee must be in the casino response = "Both players must be in the casino." return await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(author, response)) #Players have to be enlisted if challenger.life_state != ewcfg.life_state_enlisted or challengee.life_state != ewcfg.life_state_enlisted: if challenger.life_state == ewcfg.life_state_corpse: response = "You try to grab the gun, but it falls through your hands. Ghosts can't hold weapons.".format(author.display_name).replace("@", "\{at\}") return await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(author, response)) elif challengee.life_state == ewcfg.life_state_corpse: response = "{} tries to grab the gun, but it falls through their hands. Ghosts can't hold weapons.".format(member.display_name).replace("@", "\{at\}") return await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(author, response)) else: response = "Juveniles are too cowardly to gamble their lives." return await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(author, response)) #Assign a challenger so players can't be challenged challenger.rr_challenger = challenger.id_user challengee.rr_challenger = challenger.id_user challenger.persist() challengee.persist() response = "You have been challenged by {} to a game of russian roulette. Do you !accept or !refuse?".format(author.display_name).replace("@", "\{at\}") await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(member, response)) #Wait for an answer accepted = 0 msg = await cmd.client.wait_for_message(timeout = 10, author = member, check = check) if msg != None: if msg.content == "!accept": accepted = 1 #Start game if accepted == 1: for spin in range(1, 7): challenger = EwUser(member = author) challengee = EwUser(member = member) #In case any of the players suicide mid-game if challenger.life_state == ewcfg.life_state_corpse: response = "{} couldn't handle the pressure and killed themselves.".format(author.display_name).replace("@", "\{at\}") await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(member, response)) break if challengee.life_state == ewcfg.life_state_corpse: response = "{} couldn't handle the pressure and killed themselves.".format(member.display_name).replace("@", "\{at\}") await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(author, response)) break #Challenger goes second if spin % 2 == 0: player = author else: player = member response = "You put the gun to your head and pull the trigger..." res = await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(player, response)) await asyncio.sleep(1) #Player dies if random.randint(1, (7 - spin)) == 1: await cmd.client.edit_message(res, ewutils.formatMessage(player, (response + " **BANG**"))) response = "You return to the Casino with {}'s slime.".format(player.display_name).replace("@", "\{at\}") was_suicide = False #Challenger dies if spin % 2 == 0: winner = member challenger = EwUser(member = author) challengee = EwUser(member = member) if challengee.life_state != ewcfg.life_state_corpse: challengee.change_slimes(n = challenger.slimes, source = ewcfg.source_killing) ewitem.item_loot(member = author, id_user_target = member.id) challenger.id_killer = challenger.id_user challenger.die(cause = ewcfg.cause_suicide) #In case the other player killed themselves else: was_suicide = True winner = author response = "You shoot {}'s corpse, adding insult to injury.".format(member.display_name).replace("@", "\{at\}") #Challangee dies else: winner = author challenger = EwUser(member = author) challengee = EwUser(member = member) if challenger.life_state != ewcfg.life_state_corpse: challenger.change_slimes(n = challengee.slimes, source = ewcfg.source_killing) ewitem.item_loot(member = member, id_user_target = author.id) challengee.id_killer = challengee.id_user challengee.die(cause = ewcfg.cause_suicide) #In case the other player killed themselves else: was_suicide = True winner = member response = "You shoot {}'s corpse, adding insult to injury.".format(author.display_name).replace("@", "\{at\}") challenger.rr_challenger = "" challengee.rr_challenger = "" challenger.persist() challengee.persist() await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(winner, response)) await ewrolemgr.updateRoles(client = cmd.client, member = author) await ewrolemgr.updateRoles(client = cmd.client, member = member) if was_suicide == False: deathreport = "You arrive among the dead by your own volition. {}".format(ewcfg.emote_slimeskull) deathreport = "{} ".format(ewcfg.emote_slimeskull) + ewutils.formatMessage(player, deathreport) sewerchannel = ewutils.get_channel(cmd.message.server, ewcfg.channel_sewers) await cmd.client.send_message(sewerchannel, deathreport) break #Or survives else: await cmd.client.edit_message(res, ewutils.formatMessage(player, (response + " but it's empty"))) await asyncio.sleep(1) #track spins? #Or cancel the challenge else: response = "{} was too cowardly to accept your challenge.".format(member.display_name).replace("@", "\{at\}") await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(author, response)) last_russianrouletted_times[author.id] = time_now - 540 last_russianrouletted_times[member.id] = time_now - 540 challenger = EwUser(member = author) challengee = EwUser(member = member) challenger.rr_challenger = "" challengee.rr_challenger = "" challenger.persist() challengee.persist() return
async def burnSlimes(id_server = None): if id_server != None: time_now = int(time.time()) client = get_client() server = client.get_server(id_server) results = {} # Get users with burning effect data = execute_sql_query("SELECT {id_user}, {value}, {source} from status_effects WHERE {id_status} = %s and {id_server} = %s".format( id_user = ewcfg.col_id_user, value = ewcfg.col_value, id_status = ewcfg.col_id_status, id_server = ewcfg.col_id_server, source = ewcfg.col_source ), ( ewcfg.status_burning_id, id_server )) deathreport = "" resp_cont = EwResponseContainer(id_server = id_server) for result in data: user_data = EwUser(id_user = result[0], id_server = id_server) slimes_dropped = user_data.totaldamage + user_data.slimes # Deal 10% of total slime to burn every second slimes_to_burn = math.ceil(int(float(result[1])) * ewcfg.burn_tick_length / ewcfg.time_expire_burn) killer_data = EwUser(id_server = id_server, id_user=result[2]) # Damage stats ewstats.change_stat(user = killer_data, metric = ewcfg.stat_lifetime_damagedealt, n = slimes_to_burn) # Player died if user_data.slimes - slimes_to_burn < 0: weapon = ewcfg.weapon_map.get(ewcfg.weapon_id_molotov) player_data = EwPlayer(id_server = user_data.id_server, id_user = user_data.id_user) killer = EwPlayer(id_server = id_server, id_user=killer_data.id_user) # Kill stats ewstats.increment_stat(user = killer_data, metric = ewcfg.stat_kills) ewstats.track_maximum(user = killer_data, metric = ewcfg.stat_biggest_kill, value = int(slimes_dropped)) if killer_data.slimelevel > user_data.slimelevel: ewstats.increment_stat(user = killer_data, metric = ewcfg.stat_lifetime_ganks) elif killer_data.slimelevel < user_data.slimelevel: ewstats.increment_stat(user = killer_data, metric = ewcfg.stat_lifetime_takedowns) # Collect bounty coinbounty = int(user_data.bounty / ewcfg.slimecoin_exchangerate) # 100 slime per coin if user_data.slimes >= 0: killer_data.change_slimecoin(n = coinbounty, coinsource = ewcfg.coinsource_bounty) # Kill player user_data.id_killer = killer_data.id_user user_data.die(cause = ewcfg.cause_burning) #user_data.change_slimes(n = -slimes_dropped / 10, source = ewcfg.source_ghostification) deathreport = "You were {} by {}. {}".format(weapon.str_killdescriptor, killer.display_name, ewcfg.emote_slimeskull) deathreport = "{} ".format(ewcfg.emote_slimeskull) + formatMessage(server.get_member(user_data.id_user), deathreport) resp_cont.add_channel_response(ewcfg.channel_sewers, deathreport) user_data.trauma = weapon.id_weapon user_data.persist() await ewrolemgr.updateRoles(client = client, member = server.get_member(user_data.id_user)) else: user_data.change_slimes(n = -slimes_to_burn, source = ewcfg.source_damage) user_data.persist() await resp_cont.post()
async def suicide(cmd): response = "" deathreport = "" # Only allowed in the combat zone. if ewmap.channel_name_is_poi(cmd.message.channel.name) == False: response = "You must go into the city to commit suicide." else: # Get the user data. user_data = EwUser(member=cmd.message.author) user_iskillers = user_data.life_state == ewcfg.life_state_enlisted and user_data.faction == ewcfg.faction_killers user_isrowdys = user_data.life_state == ewcfg.life_state_enlisted and user_data.faction == ewcfg.faction_rowdys user_isgeneral = user_data.life_state == ewcfg.life_state_kingpin user_isjuvenile = user_data.life_state == ewcfg.life_state_juvenile user_isdead = user_data.life_state == ewcfg.life_state_corpse if user_isdead: response = "Too late for that." elif user_isjuvenile: response = "Juveniles are too cowardly for suicide." elif user_isgeneral: response = "\*click* Alas, your gun has jammed." elif user_iskillers or user_isrowdys: #Give slime to challenger if player suicides mid russian roulette if user_data.rr_challenger != "": challenger = EwUser(id_user=user_data.rr_challenger, id_server=user_data.id_server) challenger.change_slimes(n=user_data.slimes, source=ewcfg.source_killing) ewitem.item_loot(member=cmd.message.author, id_user_target=user_data.rr_challenger) challenger.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.die(cause=ewcfg.cause_suicide) user_data.persist() # Assign the corpse role to the player. He dead. await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.author) response = '{} has willingly returned to the slime. {}'.format( cmd.message.author.display_name, ewcfg.emote_slimeskull) deathreport = "You arrive among the dead by your own volition. {}".format( ewcfg.emote_slimeskull) deathreport = "{} ".format( ewcfg.emote_slimeskull) + ewutils.formatMessage( cmd.message.author, deathreport) else: # This should never happen. We handled all the role cases. Just in case. response = "\*click* Alas, your gun has jammed." # Send the response to the player. await cmd.client.send_message( cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) if deathreport != "": sewerchannel = ewutils.get_channel(cmd.message.server, ewcfg.channel_sewers) await cmd.client.send_message(sewerchannel, deathreport)
async def attack(cmd): time_now = int(time.time()) response = "" deathreport = "" coinbounty = 0 user_data = EwUser(member=cmd.message.author) slimeoid = EwSlimeoid(member=cmd.message.author) weapon = ewcfg.weapon_map.get(user_data.weapon) if ewmap.channel_name_is_poi(cmd.message.channel.name) == False: response = "You can't commit violence from here." elif ewmap.poi_is_pvp(user_data.poi) == False: response = "You must go elsewhere to commit gang violence." elif cmd.mentions_count > 1: response = "One shot at a time!" elif cmd.mentions_count <= 0: response = "Your bloodlust is appreciated, but ENDLESS WAR didn't understand that name." elif user_data.hunger >= ewutils.hunger_max_bylevel(user_data.slimelevel): response = "You are too exhausted for gang violence right now. Go get some grub!" elif cmd.mentions_count == 1: # Get shooting player's info if user_data.slimelevel <= 0: user_data.slimelevel = 1 user_data.persist() # Get target's info. member = cmd.mentions[0] shootee_data = EwUser(member=member) shootee_slimeoid = EwSlimeoid(member=member) miss = False crit = False strikes = 0 slimes_spent = int(ewutils.slime_bylevel(user_data.slimelevel) / 20) slimes_damage = int( (slimes_spent * 4) * (100 + (user_data.weaponskill * 10)) / 100.0) if weapon is None: slimes_damage /= 2 # penalty for not using a weapon, otherwise fists would be on par with other weapons slimes_dropped = shootee_data.totaldamage + shootee_data.slimes #fumble_chance = (random.randrange(10) - 4) #if fumble_chance > user_data.weaponskill: #miss = True user_iskillers = user_data.life_state == ewcfg.life_state_enlisted and user_data.faction == ewcfg.faction_killers user_isrowdys = user_data.life_state == ewcfg.life_state_enlisted and user_data.faction == ewcfg.faction_rowdys if shootee_data.life_state == ewcfg.life_state_kingpin: # Disallow killing generals. response = "He is hiding in his ivory tower and playing video games like a retard." elif (slimes_spent > user_data.slimes): # Not enough slime to shoot. response = "You don't have enough slime to attack. ({:,}/{:,})".format( user_data.slimes, slimes_spent) elif (time_now - user_data.time_lastkill) < ewcfg.cd_kill: # disallow kill if the player has killed recently response = "Take a moment to appreciate your last slaughter." elif shootee_data.poi != user_data.poi: response = "You can't reach them from where you are." elif ewmap.poi_is_pvp(shootee_data.poi) == False: response = "{} is not mired in the ENDLESS WAR right now.".format( member.display_name) elif user_iskillers == False and user_isrowdys == False: # Only killers, rowdys, the cop killer, and rowdy f****r can shoot people. if user_data.life_state == ewcfg.life_state_juvenile: response = "Juveniles lack the moral fiber necessary for violence." else: response = "You lack the moral fiber necessary for violence." elif (time_now - shootee_data.time_lastrevive) < ewcfg.invuln_onrevive: # User is currently invulnerable. response = "{} has died too recently and is immune.".format( member.display_name) elif shootee_data.life_state == ewcfg.life_state_corpse and user_data.ghostbust == True: # Attack a ghostly target was_busted = False #hunger drain user_data.hunger += ewcfg.hunger_pershot * ewutils.hunger_cost_mod( user_data.slimelevel) # Weaponized flavor text. randombodypart = ewcfg.hitzone_list[random.randrange( len(ewcfg.hitzone_list))] # Weapon-specific adjustments if weapon != None and weapon.fn_effect != None: # Build effect container ctn = EwEffectContainer(miss=miss, crit=crit, slimes_damage=slimes_damage, slimes_spent=slimes_spent, user_data=user_data, shootee_data=shootee_data) # Make adjustments weapon.fn_effect(ctn) # Apply effects for non-reference values miss = ctn.miss crit = ctn.crit slimes_damage = ctn.slimes_damage slimes_spent = ctn.slimes_spent strikes = ctn.strikes # user_data and shootee_data should be passed by reference, so there's no need to assign them back from the effect container. if miss: slimes_damage = 0 # Remove !revive invulnerability. user_data.time_lastrevive = 0 # Spend slimes, to a minimum of zero user_data.change_slimes( n=(-user_data.slimes if slimes_spent >= user_data.slimes else -slimes_spent), source=ewcfg.source_spending) # Damage stats ewstats.track_maximum(user=user_data, metric=ewcfg.stat_max_hitdealt, value=slimes_damage) ewstats.change_stat(user=user_data, metric=ewcfg.stat_lifetime_damagedealt, n=slimes_damage) # Remove repeat killing protection if. if user_data.id_killer == shootee_data.id_user: user_data.id_killer = "" if slimes_damage >= -shootee_data.slimes: was_busted = True if was_busted: # Move around slime as a result of the shot. user_data.change_slimes(n=ewutils.slime_bylevel( shootee_data.slimelevel), source=ewcfg.source_busting) coinbounty = int(shootee_data.bounty / ewcfg.slimecoin_exchangerate) user_data.change_slimecredit( n=coinbounty, coinsource=ewcfg.coinsource_bounty) ewstats.track_maximum(user=user_data, metric=ewcfg.stat_biggest_bust_level, value=shootee_data.slimelevel) # Player was busted. shootee_data.die(cause=ewcfg.cause_busted) response = "{name_target}\'s ghost has been **BUSTED**!!".format( name_target=member.display_name) deathreport = "Your ghost has been busted by {}. {}".format( cmd.message.author.display_name, ewcfg.emote_bustin) deathreport = "{} ".format( ewcfg.emote_bustin) + ewutils.formatMessage( member, deathreport) if coinbounty > 0: response += "\n\n SlimeCorp transfers {} SlimeCoin to {}\'s account.".format( str(coinbounty), cmd.message.author.display_name) #adjust busts ewstats.increment_stat(user=user_data, metric=ewcfg.stat_ghostbusts) else: # A non-lethal blow! shootee_data.change_slimes(n=slimes_damage, source=ewcfg.source_busting) damage = str(slimes_damage) if weapon != None: if miss: response = "{}".format( weapon.str_miss.format( name_player=cmd.message.author.display_name, name_target=member.display_name + "\'s ghost")) else: response = weapon.str_damage.format( name_player=cmd.message.author.display_name, name_target=member.display_name + "\'s ghost", hitzone=randombodypart, strikes=strikes) if crit: response += " {}".format( weapon.str_crit.format( name_player=cmd.message.author. display_name, name_target=member.display_name + "\'s ghost")) response += " {target_name} loses {damage} antislime!".format( target_name=(member.display_name + "\'s ghost"), damage=damage) else: if miss: response = "{}\'s ghost is unharmed.".format( member.display_name) else: response = "{target_name} is hit!! {target_name} loses {damage} antislime!".format( target_name=(member.display_name + "\'s ghost"), damage=damage) # Persist every users' data. user_data.persist() shootee_data.persist() await ewrolemgr.updateRoles(client=cmd.client, member=cmd.message.server.get_member( shootee_data.id_user)) elif shootee_data.life_state == ewcfg.life_state_corpse and shootee_data.busted == True: # Target is already dead and not a ghost. response = "{} is already dead.".format(member.display_name) elif shootee_data.life_state == ewcfg.life_state_corpse and user_data.ghostbust == False: # Target is a ghost but user is not able to bust response = "You don't know how to fight a ghost." else: # Slimes from this shot might be awarded to the boss. role_boss = (ewcfg.role_copkiller if user_iskillers else ewcfg.role_rowdyfucker) boss_slimes = 0 user_inital_level = user_data.slimelevel was_juvenile = False was_killed = False was_shot = False if (shootee_data.life_state == ewcfg.life_state_enlisted) or ( shootee_data.life_state == ewcfg.life_state_juvenile): # User can be shot. if shootee_data.life_state == ewcfg.life_state_juvenile: was_juvenile = True was_shot = True if was_shot: #hunger drain user_data.hunger += ewcfg.hunger_pershot * ewutils.hunger_cost_mod( user_data.slimelevel) # Weaponized flavor text. randombodypart = ewcfg.hitzone_list[random.randrange( len(ewcfg.hitzone_list))] # Weapon-specific adjustments if weapon != None and weapon.fn_effect != None: # Build effect container ctn = EwEffectContainer(miss=miss, crit=crit, slimes_damage=slimes_damage, slimes_spent=slimes_spent, user_data=user_data, shootee_data=shootee_data) # Make adjustments weapon.fn_effect(ctn) # Apply effects for non-reference values miss = ctn.miss crit = ctn.crit slimes_damage = ctn.slimes_damage slimes_spent = ctn.slimes_spent strikes = ctn.strikes # user_data and shootee_data should be passed by reference, so there's no need to assign them back from the effect container. if miss: slimes_damage = 0 # Remove !revive invulnerability. user_data.time_lastrevive = 0 # Spend slimes, to a minimum of zero user_data.change_slimes( n=(-user_data.slimes if slimes_spent >= user_data.slimes else -slimes_spent), source=ewcfg.source_spending) # Damage stats ewstats.track_maximum(user=user_data, metric=ewcfg.stat_max_hitdealt, value=slimes_damage) ewstats.change_stat(user=user_data, metric=ewcfg.stat_lifetime_damagedealt, n=slimes_damage) # Remove repeat killing protection if. if user_data.id_killer == shootee_data.id_user: user_data.id_killer = "" if slimes_damage >= shootee_data.slimes: was_killed = True if was_killed: #adjust statistics ewstats.increment_stat(user=user_data, metric=ewcfg.stat_kills) ewstats.track_maximum(user=user_data, metric=ewcfg.stat_biggest_kill, value=int(slimes_dropped)) if user_data.slimelevel > shootee_data.slimelevel: ewstats.increment_stat( user=user_data, metric=ewcfg.stat_lifetime_ganks) elif user_data.slimelevel < shootee_data.slimelevel: ewstats.increment_stat( user=user_data, metric=ewcfg.stat_lifetime_takedowns) # Collect bounty coinbounty = int( shootee_data.bounty / ewcfg.slimecoin_exchangerate) # 100 slime per coin # Move around slime as a result of the shot. if shootee_data.slimes >= 0: if was_juvenile: user_data.change_slimes( n=slimes_dropped, source=ewcfg.source_killing) else: user_data.change_slimecredit( n=coinbounty, coinsource=ewcfg.coinsource_bounty) user_data.change_slimes( n=slimes_dropped / 2, source=ewcfg.source_killing) boss_slimes += int(slimes_dropped / 2) # Steal items ewitem.item_loot(member=member, id_user_target=cmd.message.author.id) #add bounty user_data.add_bounty(n=(shootee_data.bounty / 2) + (slimes_dropped / 4)) # Give a bonus to the player's weapon skill for killing a stronger player. if shootee_data.slimelevel >= user_data.slimelevel: user_data.add_weaponskill(n=1) # Player was killed. shootee_data.id_killer = user_data.id_user shootee_data.die(cause=ewcfg.cause_killing) shootee_data.change_slimes( n=-slimes_dropped / 10, source=ewcfg.source_ghostification) kill_descriptor = "beaten to death" if weapon != None: response = weapon.str_damage.format( name_player=cmd.message.author.display_name, name_target=member.display_name, hitzone=randombodypart, strikes=strikes) kill_descriptor = weapon.str_killdescriptor if crit: response += " {}".format( weapon.str_crit.format( name_player=cmd.message.author. display_name, name_target=member.display_name)) response += "\n\n{}".format( weapon.str_kill.format( name_player=cmd.message.author.display_name, name_target=member.display_name, emote_skull=ewcfg.emote_slimeskull)) shootee_data.trauma = weapon.id_weapon if slimeoid.level == ewcfg.slimeoid_state_active: brain = ewcfg.brain_map.get(slimeoid.ai) response += "\n\n{}" + brain.str_kill.format( slimeoid_name=shootee_slimeoid.name) if shootee_slimeoid.level == ewcfg.slimeoid_state_active: brain = ewcfg.brain_map.get(shootee_slimeoid.ai) response += "\n\n{}" + brain.str_death.format( slimeoid_name=shootee_slimeoid.name) else: response = "{name_target} is hit!!\n\n{name_target} has died.".format( name_target=member.display_name) shootee_data.trauma = "" if slimeoid.life_state == ewcfg.slimeoid_state_active: brain = ewcfg.brain_map.get(slimeoid.ai) response += "\n\n" + brain.str_kill.format( slimeoid_name=shootee_slimeoid.name) if shootee_slimeoid.life_state == ewcfg.slimeoid_state_active: brain = ewcfg.brain_map.get(shootee_slimeoid.ai) response += "\n\n" + brain.str_death.format( slimeoid_name=shootee_slimeoid.name) deathreport = "You were {} by {}. {}".format( kill_descriptor, cmd.message.author.display_name, ewcfg.emote_slimeskull) deathreport = "{} ".format( ewcfg.emote_slimeskull) + ewutils.formatMessage( member, deathreport) if coinbounty > 0: response += "\n\n SlimeCorp transfers {} SlimeCoin to {}\'s account.".format( str(coinbounty), cmd.message.author.display_name) else: # A non-lethal blow! shootee_data.change_slimes(n=-slimes_damage, source=ewcfg.source_damage) damage = str(slimes_damage) if weapon != None: if miss: response = "{}".format( weapon.str_miss.format( name_player=cmd.message.author. display_name, name_target=member.display_name)) else: response = weapon.str_damage.format( name_player=cmd.message.author.display_name, name_target=member.display_name, hitzone=randombodypart, strikes=strikes) if crit: response += " {}".format( weapon.str_crit.format( name_player=cmd.message.author. display_name, name_target=member.display_name)) response += " {target_name} loses {damage} slime!".format( target_name=member.display_name, damage=damage) else: # unarmed attacks have no miss or crit chance response = "{target_name} is hit!! {target_name} loses {damage} slime!".format( target_name=member.display_name, damage=damage) else: response = 'You are unable to attack {}.'.format( member.display_name) # Add level up text to response if appropriate if user_inital_level < user_data.slimelevel: response += "\n\n{} has been empowered by slime and is now a level {} slimeboi!".format( cmd.message.author.display_name, user_data.slimelevel) # # Give slimes to the boss if possible. # boss_member = None # if boss_slimes > 0: # for member_search in cmd.message.server.members: # if role_boss in ewutils.getRoleMap(member_search.roles): # boss_member = member_search # break # if boss_member != None: # boss_data = EwUser(member = boss_member) # boss_data.change_slimes(n = boss_slimes) # boss_data.persist() kingpin = ewutils.find_kingpin(id_server=cmd.message.server.id, kingpin_role=role_boss) if kingpin: kingpin.change_slimes(n=boss_slimes) kingpin.persist() # Persist every users' data. user_data.persist() shootee_data.persist() # Assign the corpse role to the newly dead player. if was_killed: await ewrolemgr.updateRoles(client=cmd.client, member=member) # Send the response to the player. await cmd.client.send_message( cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) if deathreport != "": sewerchannel = ewutils.get_channel(cmd.message.server, ewcfg.channel_sewers) await cmd.client.send_message(sewerchannel, deathreport)
async def writhe(cmd): resp = await ewcmd.start(cmd=cmd) response = "" user_data = EwUser(member=cmd.message.author) if user_data.life_state != ewcfg.life_state_grandfoe: response = "Only the NEGASLIME {} can do that.".format( ewcfg.emote_negaslime) await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) else: # play animation he = ewcfg.emote_he s_ = ewcfg.emote_s_ ve = ewcfg.emote_ve vt = ewcfg.emote_vt v_ = ewcfg.emote_v_ h_ = ewcfg.emote_h_ va = ewcfg.emote_va ht = ewcfg.emote_ht hs = ewcfg.emote_hs blank = ewcfg.emote_blank writhing1 = he writhing2 = s_ + he + "\n" + ve writhing3 = s_ + h_ + he + "\n" + vt + he writhing4 = s_ + h_ + ht + "\n" + vt + he + ve writhing5 = s_ + h_ + ht + "\n" + va + he + vt + he + "\n" + ve writhing6 = s_ + h_ + ht + "\n" + va + ht + va + ht + "\n" + v_ + ve + ve + ve + "\n" + ve writhing7 = s_ + h_ + ht + "\n" + va + ht + va + hs + he + "\n" + v_ + ve + v_ + vt + he + "\n" + ve + blank + ve writhing8 = s_ + h_ + ht + "\n" + va + ht + va + hs + he + "\n" + v_ + ve + v_ + vt + h_ + he + "\n" + vt + he + vt + he writhing9 = s_ + h_ + ht + "\n" + va + ht + va + hs + h_ + he + "\n" + v_ + ve + v_ + vt + h_ + ht + "\n" + vt + ht + vt + ht + blank + ve + "\n" + blank + ve + blank + ve writhing10 = s_ + h_ + ht + "\n" + va + ht + va + hs + h_ + he + "\n" + v_ + ve + v_ + vt + h_ + ht + "\n" + vt + ht + vt + ht + blank + vt + he + "\n" + blank + ve + blank + vt + he writhings = [ writhing1, writhing2, writhing3, writhing4, writhing5, writhing6, writhing7, writhing8, writhing9, writhing10 ] for writhing in writhings: cur_time = time.time() await ewutils.edit_message(cmd.client, resp, writhing) elapsed = time.time() - cur_time await asyncio.sleep(2.0 - elapsed) id_server = cmd.message.server.id targets = [] # search for players in the negaslime's location in database and put them in a list if id_server != None: try: conn_info = ewutils.databaseConnect() conn = conn_info.get('conn') cursor = conn.cursor() cursor.execute( "SELECT id_user FROM users WHERE id_server = %s AND poi = '{}' AND life_state IN (1, 2);" .format(user_data.poi), (id_server, )) # convert pulled IDs into member objects target_ids = cursor.fetchall() for target_id in target_ids: target = cmd.message.server.get_member(target_id[0]) targets.append(target) conn.commit() finally: # Clean up the database handles. cursor.close() ewutils.databaseClose(conn_info) victim_list = [] # kill everyone in the negaslime's poi and remember their names for target in targets: if target != None: user_data_target = EwUser(member=target) user_data_target.id_killer = cmd.message.author.id user_data_target.die(cause=ewcfg.cause_grandfoe) user_data_target.persist() await ewrolemgr.updateRoles(client=cmd.client, member=target) sewerchannel = ewutils.get_channel(cmd.message.server, ewcfg.channel_sewers) await ewutils.send_message( cmd.client, sewerchannel, "{} ".format(ewcfg.emote_slimeskull) + ewutils.formatMessage( target, "You have been crushed by tendrils. {}".format( ewcfg.emote_slimeskull))) victim_list.append(target) # display result of the writhing if len(victim_list) > 0: victims_string = ewutils.userListToNameString(victim_list) response = "Your tendrils have successfully killed {}.".format( victims_string) else: response = "Your tendrils didn't kill anyone :(" await ewutils.send_message( cmd.client, cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def xfer(cmd): time_now = int(time.time()) if cmd.message.channel.name != ewcfg.channel_stockexchange: # Only allowed in the stock exchange. response = ewcfg.str_exchange_channelreq.format(currency = "SlimeCoin", action = "transfer") await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) return if cmd.mentions_count != 1: # Must have exactly one target to send to. response = "Mention the player you want to send SlimeCoin to." await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) return 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." await cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(cmd.message.author, response)) return user_data = EwUser(member = cmd.message.author) market_data = EwMarket(id_server = cmd.message.author.server.id) if cmd.message.author.id == member.id: user_data.id_killer = cmd.message.author.id user_data.die(cause = ewcfg.cause_suicide) user_data.persist() await cmd.client.send_message(cmd.message.channel, ewutils.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, allow_all = True) if value != None: if value < 0: value = user_data.slimes if value <= 0: value = None if value != None: # Cost including the 5% transfer fee. cost_total = int(value * 1.05) if user_data.slimecredit < cost_total: response = "You don't have enough SlimeCoin. ({:,}/{:,})".format(user_data.slimecredit, cost_total) else: # Do the transfer if the player can afford it. target_data.change_slimecredit(n = value, coinsource = ewcfg.coinsource_transfer) user_data.change_slimecredit(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 cmd.client.send_message(cmd.message.channel, ewutils.formatMessage(cmd.message.author, response))
async def attack(cmd): resp = await ewcmd.start(cmd) time_now = int(time.time()) response = "" user_data = EwUser(member=cmd.message.author) if cmd.message.channel.name != ewcfg.channel_combatzone: response = "You must go to the #{} to commit gang violence.".format( ewcfg.channel_combatzone) elif cmd.mentions_count > 1: response = "One shot at a time!" elif cmd.mentions_count <= 0: response = "Your bloodlust is appreciated, but ENDLESS WAR didn\'t understand that name." elif user_data.stamina >= ewcfg.stamina_max: response = "You are too exhausted for gang violence right now. Go get some grub!" elif cmd.mentions_count == 1: # The roles assigned to the author of this message. roles_map_user = ewutils.getRoleMap(cmd.message.author.roles) # Get shooting player's info try: conn = ewutils.databaseConnect() cursor = conn.cursor() if user_data.slimelevel <= 0: user_data.slimelevel = 1 # Flag the shooter for PvP no matter what happens next. user_data.time_expirpvp = ewutils.calculatePvpTimer( user_data.time_expirpvp, (time_now + ewcfg.time_pvp_kill)) user_data.persist(conn=conn, cursor=cursor) # Get target's info. member = cmd.mentions[0] shootee_data = EwUser(member=member, conn=conn, cursor=cursor) conn.commit() finally: cursor.close() conn.close() miss = False crit = False strikes = 0 # Shot player's assigned Discord roles. roles_map_target = ewutils.getRoleMap(member.roles) # Slime level data. Levels are in powers of 10. slimes_bylevel = int((10**user_data.slimelevel) / 10) slimes_spent = int(slimes_bylevel / 10) slimes_damage = int((slimes_bylevel / 5.0) * (100 + (user_data.weaponskill * 5)) / 100.0) slimes_dropped = shootee_data.totaldamage fumble_chance = (random.randrange(10) - 4) if fumble_chance > user_data.weaponskill: miss = True user_iskillers = ewcfg.role_copkillers in roles_map_user or ewcfg.role_copkillers in roles_map_user user_isrowdys = ewcfg.role_rowdyfuckers in roles_map_user or ewcfg.role_rowdyfucker in roles_map_user # Add the PvP flag role. await ewutils.add_pvp_role(cmd=cmd) if ewcfg.role_copkiller in roles_map_target or ewcfg.role_rowdyfucker in roles_map_target: # Disallow killing generals. response = "He is hiding in his ivory tower and playing video games like a retard." elif (slimes_spent > user_data.slimes): # Not enough slime to shoot. response = "You don't have enough slime to attack. ({:,}/{:,})".format( user_data.slimes, slimes_spent) elif (time_now - user_data.time_lastkill) < ewcfg.cd_kill: # disallow kill if the player has killed recently response = "Take a moment to appreciate your last slaughter." elif shootee_data.id_killer == user_data.id_user: # Don't allow the shootee to be shot by the same player twice. response = "You have already proven your superiority over {}.".format( member.display_name) elif time_now > shootee_data.time_expirpvp: # Target is not flagged for PvP. response = "{} is not mired in the ENDLESS WAR right now.".format( member.display_name) elif user_iskillers == False and user_isrowdys == False: # Only killers, rowdys, the cop killer, and rowdy f****r can shoot people. if ewcfg.role_juvenile in roles_map_user: response = "Juveniles lack the moral fiber necessary for violence." else: response = "You lack the moral fiber necessary for violence." elif ewcfg.role_corpse in roles_map_target: # Target is already dead. response = "{} is already dead.".format(member.display_name) elif (time_now - shootee_data.time_lastrevive) < ewcfg.invuln_onrevive: # User is currently invulnerable. response = "{} has died too recently and is immune.".format( member.display_name) else: # Slimes from this shot might be awarded to the boss. role_boss = (ewcfg.role_copkiller if user_iskillers else ewcfg.role_rowdyfucker) boss_slimes = 0 role_corpse = cmd.roles_map[ewcfg.role_corpse] was_juvenile = False was_killed = False was_shot = False if (user_iskillers and (ewcfg.role_rowdyfuckers in roles_map_target)) or ( user_isrowdys and (ewcfg.role_copkillers in roles_map_target)) or ( ewcfg.role_juvenile in roles_map_target): # User can be shot. if ewcfg.role_juvenile in roles_map_target: was_juvenile = True was_shot = True if was_shot: #stamina drain user_data.stamina += ewcfg.stamina_pershot # Weaponized flavor text. weapon = ewcfg.weapon_map.get(user_data.weapon) randombodypart = ewcfg.hitzone_list[random.randrange( len(ewcfg.hitzone_list))] # Weapon-specific adjustments if weapon != None and weapon.fn_effect != None: # Build effect container ctn = EwEffectContainer(miss=miss, crit=crit, slimes_damage=slimes_damage, slimes_spent=slimes_spent, user_data=user_data, shootee_data=shootee_data) # Make adjustments weapon.fn_effect(ctn) # Apply effects for non-reference values miss = ctn.miss crit = ctn.crit slimes_damage = ctn.slimes_damage slimes_spent = ctn.slimes_spent strikes = ctn.strikes # user_data and shootee_data should be passed by reference, so there's no need to assign them back from the effect container. if miss: slimes_damage = 0 # Remove !revive invulnerability. user_data.time_lastrevive = 0 user_data.slimes -= slimes_spent # Remove repeat killing protection if. if user_data.id_killer == shootee_data.id_user: user_data.id_killer = "" # Don't allow attacking to cause you to go negative. if user_data.slimes < 0: user_data.slimes = 0 if slimes_damage >= shootee_data.slimes: was_killed = True if was_killed: # Move around slime as a result of the shot. if shootee_data.slimes > 0: if was_juvenile: user_data.slimes += (slimes_dropped + shootee_data.slimes) user_data.slimepoudrins += shootee_data.slimepoudrins else: market_data = EwMarket( id_server=cmd.message.server.id) coinbounty = int( shootee_data.bounty / (market_data.rate_exchange / 1000000.0)) user_data.slimecredit += coinbounty user_data.slimes += int(slimes_dropped / 2) user_data.slimepoudrins += shootee_data.slimepoudrins boss_slimes += int(slimes_dropped / 2) # Player was killed. shootee_data.totaldamage += shootee_data.slimes shootee_data.slimes = 0 shootee_data.slimepoudrins = 0 shootee_data.id_killer = user_data.id_user shootee_data.bounty = 0 if weapon != None: response = weapon.str_damage.format( name_player=cmd.message.author.display_name, name_target=member.display_name, hitzone=randombodypart, strikes=strikes) if crit: response += " {}".format( weapon.str_crit.format( name_player=cmd.message.author. display_name, name_target=member.display_name)) response += "\n\n{}".format( weapon.str_kill.format( name_player=cmd.message.author.display_name, name_target=member.display_name, emote_skull=ewcfg.emote_slimeskull)) shootee_data.trauma = weapon.id_weapon else: response = "{name_target} is hit!!\n\n{name_target} has died.".format( name_target=member.display_name) shootee_data.trauma = "" #adjust kills bounty user_data.kills += 1 user_data.bounty += int((shootee_data.bounty / 2) + (shootee_data.totaldamage / 4)) # Give a bonus to the player's weapon skill for killing a stronger player. if shootee_data.slimelevel > user_data.slimelevel: user_data.weaponskill += 1 else: # A non-lethal blow! shootee_data.slimes -= slimes_damage shootee_data.totaldamage += slimes_damage if weapon != None: if miss: response = "{}".format( weapon.str_miss.format( name_player=cmd.message.author. display_name, name_target=member.display_name)) else: response = weapon.str_damage.format( name_player=cmd.message.author.display_name, name_target=member.display_name, hitzone=randombodypart, strikes=strikes) if crit: response += " {}".format( weapon.str_crit.format( name_player=cmd.message.author. display_name, name_target=member.display_name)) else: if miss: response = "{} is unharmed.".format( member.display_name) else: response = "{} is hit!!".format( member.display_name) else: response = 'ENDLESS WAR finds this betrayal stinky. He will not allow you to slaughter {}.'.format( member.display_name) # Level up the player if appropriate. new_level = len(str(int(user_data.slimes))) if new_level > user_data.slimelevel: response += "\n\n{} has been empowered by slime and is now a level {} slimeboi!".format( cmd.message.author.display_name, new_level) user_data.slimelevel = new_level # Give slimes to the boss if possible. boss_member = None if boss_slimes > 0: for member_search in cmd.message.server.members: if role_boss in ewutils.getRoleMap(member_search.roles): boss_member = member_search break # Persist every users' data. try: conn = ewutils.databaseConnect() cursor = conn.cursor() user_data.persist(conn=conn, cursor=cursor) shootee_data.persist(conn=conn, cursor=cursor) if boss_member != None: boss_data = EwUser(member=boss_member, conn=conn, cursor=cursor) boss_data.slimes += boss_slimes boss_data.persist(conn=conn, cursor=cursor) conn.commit() finally: cursor.close() conn.close() # Assign the corpse role to the newly dead player. if was_killed: await cmd.client.replace_roles(member, role_corpse) # Send the response to the player. await cmd.client.edit_message( resp, ewutils.formatMessage(cmd.message.author, response))