summaryrefslogtreecommitdiff
path: root/cogs/adv_inc/Resting.py
blob: b425abbda8b02f83010d8aca52aa89adda08becc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#Python modules
import math
import re
import sys
import os
import importlib
import utils

from cogs.adv_inc import PlayerStats
from cogs.adv_inc import Enemy
from cogs.adv_inc import Items

importlib.reload(utils)
importlib.reload(PlayerStats)
importlib.reload(Enemy)
importlib.reload(Items)


async def player_resting(params, player_stats):
    # Inventory
    if params["cmd1"].lower() == 'i' or params["cmd1"].lower() == 'inventory':
        try:
            params["cmd2"] = int(params["cmd2"])
        except ValueError:
            params["cmd2"] = 1

        obj_player_inventory = await utils.sql_postgres("SELECT adventurersinc.get_player_inventory(%s, %s);", (params["nick"], (int(params["cmd2"]) * 5) - 5,), True)
        # print(f"obj_player_inventory {obj_player_inventory}")
        if not obj_player_inventory:
            return "You have no items."
        int_total_pages = int(math.ceil(obj_player_inventory[0][0]["total_items"] / 5))

        str_output = ""
        # print("#total pages", int_total_pages)
        if 0 < params["cmd2"] <= int_total_pages:
            str_output = f'Page {params["cmd2"]} of {int_total_pages}. (http://adventurersinc.lelong.uk/inventory/{params["nick"]})\n'
            # print(str_output)

            for item in obj_player_inventory:
                str_equipped = 'Equipped    ' if item[0]["equipped"] == 1 else 'Unequipped'
                str_hands = "--" if str(item[0]["hands_req"]) == '0' else str(item[0]["hands_req"]) + "H"

                str_output = f"{str_output}{item[0]['item_id']} {str_equipped} {str_hands} {item[0]['equipment_colour']} {item[0]['equipment_name']}\n"
            return str_output
    
    # Equip WIP
    elif params["cmd1"].lower() == 'e' or params["cmd1"].lower() == 'equip':
        # Check to un-equip
        if params["cmd2"] == 'u' or params["cmd2"] == 'unequip':
            await utils.sql_postgres("CALL adventurersinc.set_player_unequip_all(%s)", (params["nick"],), False)
            return "All items have been unequipped."

        elif params["cmd2"].isdigit():
            # Check to see if an ID was supplied
            sql_item = await utils.sql_postgres("SELECT adventurersinc.get_player_inventory_item(%s,%s);", (params["nick"], params["cmd2"],), True)
            if sql_item[0][0] is not None:
                # If selected item is weapon
                if sql_item[0][0]['equipment_type'] == 'weapon':
                    sql_hands_used = await utils.sql_postgres("SELECT adventurersinc.get_player_equip_hands_used(%s)", (params["nick"],), True)
                    if sql_hands_used[0][0] is None:
                        sql_hands_used[0][0]["hands_req"] = 0

                    if sql_hands_used[0][0]["hands_req"] + sql_item[0][0]['hands_req'] <= 2 and sql_item[0][0]['equipped'] == 0:
                        await utils.sql_postgres("CALL adventurersinc.set_player_equipped_item(%s, %s, %s);", (params["cmd2"], True, params["nick"],), False)
                        return f"Equipping your {sql_item[0][0]['equipment_colour']}{sql_item[0][0]['equipment_name']}."

                    elif sql_item[0][0]['equipped'] == 1:
                        await utils.sql_postgres("CALL adventurersinc.set_player_equipped_item(%s, %s, %s);", (params["cmd2"], False, params["nick"],), False)
                        return f"Unequipping your {sql_item[0][0]['equipment_colour']}{sql_item[0][0]['equipment_name']}."

                    else:
                        return "You can only wield one two-handed weapon, or two one-handed weapons."
    
                # If selected item is Armor
                elif sql_item[0][0]['equipment_type'] == 'armour':
                    sql_armour = await utils.sql_postgres("SELECT adventurersinc.get_player_equip_armour_slot(%s, %s)", (params["nick"], sql_item[0][0]['equipment_slot'],), True)

                    # print(sql_armour)
                    if sql_item[0][0]['equipped'] is False and sql_armour[0][0] is None:
                        await utils.sql_postgres("CALL adventurersinc.set_player_equipped_item(%s, %s, %s);", (params["cmd2"], True, params["nick"],), False)
                        return f"Equipping your {sql_item[0][0]['equipment_colour']}{sql_item[0][0]['equipment_name']}."

                    elif sql_item[0][0]['equipped'] is True:
                        await utils.sql_postgres("CALL adventurersinc.set_player_equipped_item(%s, %s, %s);", (params["cmd2"], False, params["nick"],), False)
                        return f"Unequipping your {sql_item[0][0]['equipment_colour']}{sql_item[0][0]['equipment_name']}."

                    else:
                        return "You already have an item in this slot."
            else:
                return "This item does not exist."
    
        # All other checks failed, print help message
        else:
            return "Available commands: e (u)nequip all, e <ID to equip/unequip>"
    
    # Destroy WIP
    elif params["cmd1"].lower() == 'd' or params["cmd1"].lower() == 'destroy':
        if re.match("^[0-9]+$", params["cmd2"]):
            c.execute("SELECT ID,nick,EquipmentColour,EquipmentSlot,equipment_type,EquipmentName,equipped,hands_req FROM Items_PlayerInventory WHERE nick='%s' AND ID=%s",(params["nick"], params["cmd2"],))
            sql_item = c.fetchone()
            item_name = sql_item['EquipmentName']
            item_colour = sql_item['EquipmentColour']
            if sql_item is not None:
                c.execute("DELETE FROM Items_PlayerInventory WHERE nick='%s' AND ID=%s",(params["nick"], params["cmd2"]));db.commit();
                return f"Your {item_name} has been destroyed."
    
    # Battle
    elif params["cmd1"].lower() == 'b' or params["cmd1"].lower() == 'battle':
        enemy = {}
        if player_stats['challenge_rating'] == int(math.ceil(player_stats['challenge_rating'] / 4) * 4):
            enemy = await Enemy.create_enemy(enemy, player_stats, params)
            return f"Your fighting has caught the attention of the {enemy['enemy_name']}."
        else:
            enemy = await Enemy.create_enemy(enemy, player_stats, params)
            return f"You've been attacked by {enemy['enemy_name']}."
    
    # Character
    elif params["cmd1"].lower() == 'c' or params["cmd1"].lower() == 'character':
        return await PlayerStats.print_stats(params)
    
    # Shop
    elif params["cmd1"].lower() == 's' or params["cmd1"].lower() == 'shop':
        if params["cmd2"] is '':
            sql_shop_inventory = await utils.sql_postgres("SELECT adventurersinc.get_player_shop_all(%s, %s);", (params["nick"], '%'), True)
            str_output = f"You have {player_stats['currency']} gold.\n"
            for sql_itm in sql_shop_inventory:
                str_output = f"{str_output}" + \
                             f"{sql_itm[0]['shop_id']} " + \
                             f"{sql_itm[0]['equipment_colour']} " + \
                             f"{sql_itm[0]['equipment_name']} " + \
                             f"{sql_itm[0]['shop_cost']} gold\n"
            return str_output
        else:
            sql_shop_items = await utils.sql_postgres("SELECT adventurersinc.get_player_shop_all(%s, %s);", (params["nick"], params["cmd2"],), True)
            # Check is sql_shop_items returns None
            if not sql_shop_items:
                return "The shopkeep doesn't know what item you ask for."
            else:
                chosen_item = None
                for item in sql_shop_items:
                    if int(item[0]['shop_id']) == int(params['cmd2']):
                        chosen_item = item[0]

            # Check if chosen item cost can be purchased
            if player_stats['currency'] < chosen_item['shop_cost']:
                return "You cannot afford this item."

            # Proceed with purchase
            await Items.add_to_inventory(params, chosen_item)
            await utils.sql_postgres("CALL adventurersinc.del_player_shop_item(%s, %s);", (str(params["nick"]), params["cmd2"],), False)
            await utils.sql_postgres("CALL adventurersinc.set_player_gold(%s, %s);", (chosen_item['shop_cost'], params["nick"],), False)
            return f"The {chosen_item['equipment_colour']}{chosen_item['equipment_name']} has been added to your inventory."
    
    # Heal
    elif params["cmd1"].lower() == 'r' or params["cmd1"].lower() == 'rest':
        player_stats = await PlayerStats.refresh_stats(params)
        if player_stats['rested_heal'] == 0:
            if player_stats['hp'] >= player_stats['max_hp']:
                await utils.sql_postgres("CALL adventurersinc.set_player_health(%s, %s)", (player_stats['hp'], params["nick"],), False)
                return "You rest. You are already at max HP."

            # If heal is an over-heal, heal to max instead
            elif round(player_stats['max_hp']/2 + player_stats['hp']) > player_stats['max_hp']:
                int_hp_gained = player_stats['max_hp']
                await utils.sql_postgres("CALL adventurersinc.set_player_health(%s, %s)", (int_hp_gained, params["nick"],), False)
                return "You rest and your wounds heal completely."

            # Otherwise heal 50%
            elif player_stats['hp'] < player_stats['max_hp']:
                int_hp_gained = round(player_stats['max_hp']/2 + player_stats['hp'])
                await utils.sql_postgres("CALL adventurersinc.set_player_health(%s, %s)", (int_hp_gained, params["nick"],), False)
                return f"You rest and you recover {round(player_stats['max_hp']/2)}HP."

        else:
            return "You rest."
    
    # DEBUG - CREATE WEAPON
    elif params["cmd1"].lower() == '_viewitem':
        return await Items.generate_equipment(params, params["cmd2"])

    # DEBUG - TEST ITEM GEN WEAPON
    elif params["cmd1"].lower() == '_fabled':
        return await Items.item_test()
    
    # DEBUG - Resolve an itemcode
    elif params["cmd1"].lower() == '_mergeitemcodes':
        item_codes = params["cmd2"].split('_')
        return Items.MergeItemCodes(item_codes[0], item_codes[1])
    
    # Version
    elif params["cmd1"].lower() == 'v' or params["cmd1"].lower() == 'version':
        return "Version 1.3 - Notes can be found at: http://www.lexicade.uk/dev.php?view=patchnotes"
    
    # Admin commands
    elif params["cmd1"].lower() == 'genitem' and params["nick"] == 182588470135488512:
        await Items.add_to_inventory(params, await Items.generate_equipment(params, '0:0:0:0:1'))
    
    # Death
    elif params["cmd1"].lower() == 'suicide':
        CharacterDeath(player_stats, params)
        return "You committed suicide."
    
    else:
        return "Available commands: (i)nventory, (e)quip, (b)attle, (c)haracter, (s)hop, (r)est, (v)ersion, (d)estroy."