Beispiel #1
0
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))
Beispiel #2
0
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))