Create a premium currency that all money exchanges operate with

This commit is contained in:
Joseph Ferano 2023-02-24 14:52:20 +07:00
parent d8ade16b96
commit 5d05ee372a
3 changed files with 77 additions and 48 deletions

View File

@ -12,16 +12,18 @@ INSERT INTO users(name) VALUES
('Plug'),
('Upgrade');
INSERT INTO bank_account(user_id, resource_id, balance) VALUES
INSERT INTO resource_account(user_id, resource_id, balance) VALUES
(1, 1, 200),
(1, 2, 175),
(1, 3, 0),
(1, 4, 25),
(1, 5, 10);
INSERT INTO store_item(name, currency, target_resource, price, claim_amount) VALUES
('Drill 1A', 1, 1, 25, 500),
('Drill 1B', 1, 2, 25, 500),
('Drill 1C', 1, 3, 25, 500),
('Drill 1D', 1, 4, 25, 500),
('Drill 1E', 1, 5, 25, 500);
INSERT INTO bank_account(user_id, balance) VALUES (1, 500);
INSERT INTO store_item(name, price, claim_amount) VALUES
('Drill 1A', 25, 50),
('Drill 1B', 25, 50),
('Drill 1C', 25, 50),
('Drill 1D', 25, 50),
('Drill 1E', 25, 50);

93
mm.py
View File

@ -11,20 +11,20 @@ import datetime
def get_bank():
cursor = conn.cursor()
cursor.execute("""
SELECT resource.name,balance FROM bank_account
INNER JOIN resource ON resource.id = bank_account.resource_id
SELECT resource_account.id,resource.name,balance FROM resource_account
INNER JOIN resource ON resource.id = resource_account.resource_id
WHERE user_id = ?
""", (world.current_user_id,))
bank = {name: balance for name,balance in cursor.fetchall()}
resources = {id:(name, balance) for id,name,balance in cursor.fetchall()}
cursor.execute("SELECT bank_account.id,balance FROM bank_account WHERE user_id = ?",
(world.current_user_id,))
bank = cursor.fetchone()
cursor.close()
return bank
return (bank, resources)
def get_store_items():
cursor = conn.cursor()
cursor.execute("""
SELECT store_item.id,store_item.name,resource.name,price,claim_amount FROM store_item
INNER JOIN resource ON resource.id = currency
""")
cursor.execute("SELECT store_item.id,store_item.name,price,claim_amount FROM store_item")
items = {item[0]:item[1:] for item in cursor.fetchall()}
cursor.close()
return items
@ -142,16 +142,48 @@ def mint():
def buy_item(item_id):
cursor = conn.cursor()
cursor.execute("""
INSERT INTO inventory_item (user_id, store_item_id)
VALUES (?, ?)
""", (world.current_user_id, item_id))
cost = world.store[item_id][1]
if cost > world.bank[0][1]:
print(f"Not enough money: Bank {world.bank[0][1]} < Cost {cost}")
return -1
item_id = cursor.lastrowid
conn.commit()
cursor.close()
world.inventory = get_inventory()
return item_id
cursor.execute('BEGIN')
try:
cursor.execute("""
INSERT INTO inventory_item (user_id, store_item_id) VALUES (?, ?)
""", (world.current_user_id, item_id))
cursor.execute("""
UPDATE bank_account SET balance = balance - ? WHERE bank_account.id = ?
""", (cost, world.bank[0][0]))
except sql.Error as error:
conn.rollback()
finally:
item_id = cursor.lastrowid
conn.commit()
cursor.close()
world.inventory = get_inventory()
world.bank = get_bank()
return item_id
def sell_item(item_id):
cursor = conn.cursor()
cost = world.store[world.inventory[item_id][0]][1]
cursor.execute('BEGIN')
try:
# TODO: We have to cascade delete stakes and claims after this
cursor.execute("DELETE FROM inventory_item WHERE user_id = ? AND id = ?",
(world.current_user_id, item_id))
cursor.execute("""
UPDATE bank_account SET balance = balance + ? WHERE bank_account.id = ?
""", (cost, world.bank[0][0]))
except sql.Error as error:
conn.rollback()
finally:
conn.commit()
cursor.close()
world.inventory = get_inventory()
world.bank = get_bank()
def mine(well_id, item_id):
cursor = conn.cursor()
@ -196,16 +228,6 @@ def destroy(source_id):
cursor.close()
world.staking_sources = get_moons()
def sell(item_id):
cursor = conn.cursor()
cursor.execute("DELETE FROM inventory_item WHERE user_id = ? AND id = ?",
(world.current_user_id, item_id))
conn.commit()
cursor.close()
world.inventory = get_inventory()
def sell_all():
cursor = conn.cursor()
@ -217,24 +239,27 @@ def sell_all():
def draw_dashboard():
im.text(f"Current User: {world.current_user}")
for _ in range(5):
im.spacing()
im.text(f"Moon Bucks: {world.bank[0][1]}")
for _ in range(10):
im.spacing()
for name,balance in world.bank.items():
for id,(name,balance) in world.bank[1].items():
im.text(f"{name.capitalize()}: {balance}")
def draw_store():
for id,(name,resource,price,claim) in world.store.items():
for id,(name,price,claim) in world.store.items():
owned = False
for (store_item_id,_) in world.inventory.values():
if id == store_item_id:
owned = True
im.text(f"{name}: Mine {claim} {resource.capitalize()}")
im.text(f"{name}: Mine {claim}")
if owned:
im.text_disabled(f"Buy {price} {resource[0:3]}")
im.text_disabled(f"Buy {price}")
else:
im.push_id(f"Buy{id}")
if im.button(f"Buy {price} {resource[0:3]}"):
if im.button(f"Buy {price}"):
buy_item(id)
im.pop_id()
for _ in range(5):
@ -242,7 +267,7 @@ def draw_store():
def draw_inventory():
for id,(sid,tier) in world.inventory.items():
im.text(f"{id} - {world.store[sid][0]} - Tier {tier+1}")
im.text(f"{world.store[sid][0]} - Tier {tier+1}")
im.push_id(f"Upgrade{id}")
if im.button("Upgrade"):
upgrade(id)
@ -250,7 +275,7 @@ def draw_inventory():
im.same_line()
im.push_id(f"Sell{id}")
if im.button("Sell"):
sell(id)
sell_item(id)
im.pop_id()
for _ in range(5):
im.spacing()

View File

@ -63,14 +63,8 @@ CREATE TABLE upgrade_event(
CREATE TABLE store_item(
id integer primary key autoincrement,
name varchar(128) not null,
currency int not null,
price int not null,
target_resource int not null,
claim_amount int not null,
CONSTRAINT fk_rid FOREIGN KEY(currency)
REFERENCES resource(id)
CONSTRAINT fk_targetid FOREIGN KEY(target_resource)
REFERENCES resource(id)
claim_amount int not null
);
CREATE TABLE inventory_item(
@ -85,6 +79,14 @@ CREATE TABLE inventory_item(
);
CREATE TABLE bank_account(
id integer primary key autoincrement,
user_id int not null,
balance int not null default 0 CHECK (balance >= 0),
CONSTRAINT fk_user FOREIGN KEY(user_id)
REFERENCES users(id)
);
CREATE TABLE resource_account(
id integer primary key autoincrement,
user_id int not null,
resource_id int not null,