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))
async def revive(cmd): resp = await ewcmd.start(cmd=cmd) time_now = int(time.time()) response = "" if cmd.message.channel.name != ewcfg.channel_endlesswar and cmd.message.channel.name != ewcfg.channel_sewers: response = "Come to me. I hunger. #{}.".format(ewcfg.channel_sewers) else: roles_map_user = ewutils.getRoleMap(cmd.message.author.roles) if ewcfg.role_corpse in roles_map_user: player_is_pvp = False try: conn = ewutils.databaseConnect() cursor = conn.cursor() player_data = EwUser(member=cmd.message.author, conn=conn, cursor=cursor) market_data = EwMarket(id_server=cmd.message.server.id, conn=conn, cursor=cursor) # Endless War collects his fee. fee = (player_data.slimecredit / 10) player_data.slimecredit -= fee market_data.slimes_revivefee += fee # Preserve negaslime if player_data.slimes < 0: market_data.negaslime += player_data.slimes # Give player some initial slimes. player_data.slimes = ewcfg.slimes_onrevive # Clear fatigue, totaldamage, bounty, killcount. player_data.stamina = 0 player_data.totaldamage = 0 player_data.bounty = 0 player_data.kills = 0 # Clear PvP flag. player_data.time_expirpvp = time_now - 1 # Clear weapon and weaponskill. player_data.weapon = "" player_data.weaponskill = 0 ewutils.weaponskills_clear(member=cmd.message.author, conn=conn, cursor=cursor) # Set time of last revive. This used to provied spawn protection, but currently isn't used. player_data.time_lastrevive = time_now if (player_data.time_expirpvp > time_now): player_is_pvp = True # Set initial slime level. It's probably 2. player_data.slimelevel = len(str(player_data.slimes)) player_data.persist(conn=conn, cursor=cursor) market_data.persist(conn=conn, cursor=cursor) # Give some slimes to every living player (currently online) for member in cmd.message.server.members: if member.id != cmd.message.author.id and member.id != cmd.client.user.id: if ewcfg.role_corpse not in ewutils.getRoleMap( member.roles): member_data = EwUser(member=member, conn=conn, cursor=cursor) member_data.slimes += ewcfg.slimes_onrevive_everyone member_data.persist(conn=conn, cursor=cursor) # Commit all transactions at once. conn.commit() finally: cursor.close() conn.close() if player_is_pvp: await cmd.client.replace_roles( cmd.message.author, cmd.roles_map[ewcfg.role_juvenile], cmd.roles_map[ewcfg.role_juvenile_pvp]) else: await cmd.client.replace_roles( cmd.message.author, cmd.roles_map[ewcfg.role_juvenile]) response = '{slime4} A geyser of fresh slime erupts, showering Rowdy, Killer, and Juvenile alike. {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.' # Send the response to the player. await cmd.client.edit_message( resp, ewutils.formatMessage(cmd.message.author, response))