fix game bugs

This commit is contained in:
SpudGunMan
2025-10-12 13:05:54 -07:00
parent 8d6a95b5da
commit 8c1cbaf442
5 changed files with 120 additions and 99 deletions
+92 -83
View File
@@ -549,23 +549,30 @@ def handle_llm(message_from_id, channel_number, deviceID, message, publicChannel
def handleDopeWars(message, nodeID, rxNode):
global dwPlayerTracker, dwHighScore
# get player's last command
last_cmd = None
for i in range(0, len(dwPlayerTracker)):
if dwPlayerTracker[i].get('userID') == nodeID:
last_cmd = dwPlayerTracker[i].get('cmd')
# welcome new player
if not last_cmd and nodeID != 0:
# Find player in tracker
player = next((p for p in dwPlayerTracker if p.get('userID') == nodeID), None)
# If not found, add new player
if not player and nodeID != 0:
player = {
'userID': nodeID,
'last_played': time.time(),
'cmd': 'new',
# ... add other fields as needed ...
}
dwPlayerTracker.append(player)
msg = 'Welcome to 💊Dope Wars💉 You have ' + str(total_days) + ' days to make as much 💰 as possible! '
high_score = getHighScoreDw()
msg += 'The High Score is $' + "{:,}".format(high_score.get('cash')) + ' by user ' + get_name_from_number(high_score.get('userID') , 'short', rxNode) +'\n'
msg += 'The High Score is $' + "{:,}".format(high_score.get('cash')) + ' by user ' + get_name_from_number(high_score.get('userID'), 'short', rxNode) + '\n'
msg += playDopeWars(nodeID, message)
else:
logger.debug(f"System: {nodeID} PlayingGame dopewars last_cmd: {last_cmd}")
# Update last_played
for p in dwPlayerTracker:
if p.get('userID') == nodeID:
p['last_played'] = time.time()
msg = playDopeWars(nodeID, message)
# wait a second to keep from message collision
time.sleep(responseDelay + 1)
return msg
@@ -594,26 +601,27 @@ def handleLemonade(message, nodeID, deviceID):
msg = ""
def create_player(nodeID):
# create new player
logger.debug("System: Lemonade: New Player: " + str(nodeID))
lemonadeTracker.append({'nodeID': nodeID, 'cups': 0, 'lemons': 0, 'sugar': 0, 'cash': lemon_starting_cash, 'start': lemon_starting_cash, 'cmd': 'new', 'time': time.time()})
lemonadeTracker.append({'nodeID': nodeID, 'cups': 0, 'lemons': 0, 'sugar': 0, 'cash': lemon_starting_cash, 'start': lemon_starting_cash, 'cmd': 'new', 'last_played': time.time()})
lemonadeCups.append({'nodeID': nodeID, 'cost': 2.50, 'count': 25, 'min': 0.99, 'unit': 0.00})
lemonadeLemons.append({'nodeID': nodeID, 'cost': 4.00, 'count': 8, 'min': 2.00, 'unit': 0.00})
lemonadeSugar.append({'nodeID': nodeID, 'cost': 3.00, 'count': 15, 'min': 1.50, 'unit': 0.00})
lemonadeScore.append({'nodeID': nodeID, 'value': 0.00, 'total': 0.00})
lemonadeWeeks.append({'nodeID': nodeID, 'current': 1, 'total': lemon_total_weeks, 'sales': 99, 'potential': 0, 'unit': 0.00, 'price': 0.00, 'total_sales': 0})
#initalize player variables
if lemonadeTracker == []:
lemonadeTracker = []
# get player's last command from tracker if not new player
last_cmd = ""
for i in range(len(lemonadeTracker)):
if lemonadeTracker[i]['nodeID'] == nodeID:
last_cmd = lemonadeTracker[i]['cmd']
logger.debug(f"System: {nodeID} PlayingGame lemonstand last_cmd: {last_cmd}")
# create new player if not in tracker
if last_cmd == "" and nodeID != 0:
if last_cmd == "" and nodeID != 0 and "lemonstand" in message.lower():
create_player(nodeID)
msg += "Welcome🍋🥤"
last_cmd = "new"
# high score
highScore = {"userID": 0, "cash": 0, "success": 0}
highScore = getHighScoreLemon()
@@ -624,87 +632,79 @@ def handleLemonade(message, nodeID, deviceID):
logger.debug(f"System: TODO is multiple interface fix mention this please nodeName: {nodeName}")
#nodeName = get_name_from_number(highScore['userID'], 'long', 2)
msg += f" HighScore🥇{nodeName} 💰{round(highScore['cash'], 2)}k "
msg += start_lemonade(nodeID=nodeID, message=message, celsius=False)
# wait a second to keep from message collision
time.sleep(responseDelay + 1)
if last_cmd != "":
msg += playLemonstand(nodeID=nodeID, message=message, celsius=False)
return msg
def handleBlackJack(message, nodeID, deviceID):
global jackTracker
msg = ""
# get player's last command from tracker
last_cmd = ""
for i in range(len(jackTracker)):
if jackTracker[i]['nodeID'] == nodeID:
last_cmd = jackTracker[i]['cmd']
# Find player in tracker
player = next((p for p in jackTracker if p['nodeID'] == nodeID), None)
# if player sends a L for leave table
# Handle leave command
if message.lower().startswith("l"):
logger.debug(f"System: BlackJack: {nodeID} is leaving the table")
msg = "You have left the table."
for i in range(len(jackTracker)):
if jackTracker[i]['nodeID'] == nodeID:
jackTracker.pop(i)
jackTracker[:] = [p for p in jackTracker if p['nodeID'] != nodeID]
return msg
else:
# Play BlackJack
msg = playBlackJack(nodeID=nodeID, message=message)
if last_cmd != "" and nodeID != 0:
logger.debug(f"System: {nodeID} PlayingGame blackjack last_cmd: {last_cmd}")
else:
highScore = {'nodeID': 0, 'highScore': 0}
highScore = loadHSJack()
if highScore != 0:
if highScore['nodeID'] != 0:
nodeName = get_name_from_number(highScore['nodeID'])
if nodeName.isnumeric() and multiple_interface:
logger.debug(f"System: TODO is multiple interface fix mention this please nodeName: {nodeName}")
#nodeName = get_name_from_number(highScore['nodeID'], 'long', 2)
msg += f" HighScore🥇{nodeName} with {highScore['highScore']} chips. "
time.sleep(responseDelay + 1) # short answers with long replies can cause message collision added wait
# Create new player if not found
if not player and nodeID != 0:
jackTracker.append({'nodeID': nodeID, 'cmd': 'new', 'last_played': time.time()})
msg += "Welcome to 🃏BlackJack!🃏\n"
# Show high score if available
highScore = loadHSJack()
if highScore and highScore.get('nodeID', 0) != 0:
nodeName = get_name_from_number(highScore['nodeID'])
if nodeName.isnumeric() and multiple_interface:
logger.debug(f"System: TODO is multiple interface fix mention this please nodeName: {nodeName}")
msg += f" HighScore🥇{nodeName} with {highScore['highScore']} chips. "
player = next((p for p in jackTracker if p['nodeID'] == nodeID), None)
# Always update last_played for existing player
if player:
player['last_played'] = time.time()
# Play BlackJack
msg += playBlackJack(nodeID=nodeID, message=message)
return msg
def handleVideoPoker(message, nodeID, deviceID):
global vpTracker
msg = ""
# if player sends a L for leave table
# Find player in tracker
player = next((p for p in vpTracker if p['nodeID'] == nodeID), None)
# Handle leave command
if message.lower().startswith("l"):
logger.debug(f"System: VideoPoker: {nodeID} is leaving the table")
msg = "You have left the table."
for i in range(len(vpTracker)):
if vpTracker[i]['nodeID'] == nodeID:
vpTracker.pop(i)
vpTracker[:] = [p for p in vpTracker if p['nodeID'] != nodeID]
return msg
else:
# Play Video Poker
msg = playVideoPoker(nodeID=nodeID, message=message)
# get player's last command from tracker
last_cmd = ""
for i in range(len(vpTracker)):
if vpTracker[i]['nodeID'] == nodeID:
last_cmd = vpTracker[i]['cmd']
# Create new player if not found
if not player and nodeID != 0:
vpTracker.append({'nodeID': nodeID, 'cmd': 'new', 'last_played': time.time()})
msg += "Welcome to 🎰Video Poker!🎰\n"
# Show high score if available
highScore = loadHSVp()
if highScore and highScore.get('nodeID', 0) != 0:
nodeName = get_name_from_number(highScore['nodeID'])
if nodeName.isnumeric() and multiple_interface:
logger.debug(f"System: TODO is multiple interface fix mention this please nodeName: {nodeName}")
msg += f" HighScore🥇{nodeName} with {highScore['highScore']} coins. "
player = next((p for p in vpTracker if p['nodeID'] == nodeID), None)
# find higest dollar amount in tracker for high score
if last_cmd == "new":
highScore = {'nodeID': 0, 'highScore': 0}
highScore = loadHSVp()
if highScore != 0:
if highScore['nodeID'] != 0:
nodeName = get_name_from_number(highScore['nodeID'])
if nodeName.isnumeric() and multiple_interface:
logger.debug(f"System: TODO is multiple interface fix mention this please nodeName: {nodeName}")
#nodeName = get_name_from_number(highScore['nodeID'], 'long', 2)
msg += f" HighScore🥇{nodeName} with {highScore['highScore']} coins. "
if last_cmd != "" and nodeID != 0:
logger.debug(f"System: {nodeID} PlayingGame videopoker last_cmd: {last_cmd}")
time.sleep(responseDelay + 1) # short answers with long replies can cause message collision added wait
# Always update last_played for existing player
if player:
player['last_played'] = time.time()
# Play Video Poker
msg += playVideoPoker(nodeID=nodeID, message=message)
return msg
def handleMmind(message, nodeID, deviceID):
@@ -717,10 +717,18 @@ def handleMmind(message, nodeID, deviceID):
for i in range(len(mindTracker)):
if mindTracker[i]['nodeID'] == nodeID:
mindTracker.pop(i)
highscore = getHighScoreMMind(0, 0, 'n')
if highscore != 0:
nodeName = get_name_from_number(highscore[0]['nodeID'],'long',deviceID)
msg += f"🧠HighScore🥇{nodeName} with {highscore[0]['turns']} turns difficulty {highscore[0]['diff'].upper()}"
hscore = getHighScoreMMind(0, 0, 'n')
if hscore and isinstance(hscore[0], dict):
highNode = hscore[0].get('nodeID', 0)
highTurns = hscore[0].get('turns', 0)
highDiff = hscore[0].get('diff', 'n')
else:
highNode = 0
highTurns = 0
highDiff = 'n'
nodeName = get_name_from_number(int(highNode),'long',deviceID)
if highNode != 0 and highTurns > 1:
msg += f"🧠HighScore🥇{nodeName} with {highTurns} turns difficulty {highDiff}"
return msg
# get player's last command from tracker if not new player
@@ -1317,17 +1325,18 @@ def check_and_play_game(tracker, message_from_id, message_string, rxNode, channe
global llm_enabled
for i in range(len(tracker)):
if tracker[i].get('nodeID') == message_from_id or tracker[i].get('userID') == message_from_id:
# Use 'userID'
id_key = 'userID' if game_name == "DopeWars" else 'nodeID' # DopeWars uses 'userID'
id_key = 'id' if game_name == "Survey" else id_key # Survey uses 'id'
if tracker[i].get(id_key) == message_from_id:
last_played_key = 'last_played' if 'last_played' in tracker[i] else 'time'
if tracker[i].get(last_played_key) > (time.time() - GAMEDELAY):
if llm_enabled:
logger.debug(f"System: LLM Disabled for {message_from_id} for duration of {game_name}")
# play the game
send_message(handle_game_func(message_string, message_from_id, rxNode), channel_number, message_from_id, rxNode)
return True, game_name
else:
# pop if the time exceeds 8 hours
tracker.pop(i)
return False, game_name
return False, "None"
+4 -4
View File
@@ -7,8 +7,8 @@ import time
import pickle
jack_starting_cash = 100 # Replace 100 with your desired starting cash value
jackTracker= [{'nodeID': 0, 'cmd': 'new', 'time': time.time(), 'cash': jack_starting_cash,\
'bet': 0, 'gameStats': {'p_win': 0, 'd_win': 0, 'draw': 0}, 'p_cards':[], 'd_cards':[], 'p_hand':[], 'd_hand':[], 'next_card':[]}]
jackTracker= [{'nodeID': 0, 'cmd': 'new', 'cash': jack_starting_cash,\
'bet': 0, 'gameStats': {'p_win': 0, 'd_win': 0, 'draw': 0}, 'p_cards':[], 'd_cards':[], 'p_hand':[], 'd_hand':[], 'next_card':[],'last_played': time.time()}]
SUITS = ("♥️", "♦️", "♠️", "♣️")
RANKS = (
@@ -268,7 +268,7 @@ def playBlackJack(nodeID, message):
if last_cmd is None:
# create new player if not in tracker
logger.debug(f"System: BlackJack: New Player {nodeID}")
jackTracker.append({'nodeID': nodeID, 'cmd': 'new', 'time': time.time(), 'cash': jack_starting_cash,\
jackTracker.append({'nodeID': nodeID, 'cmd': 'new', 'last_played': time.time(), 'cash': jack_starting_cash,\
'bet': 0, 'gameStats': {'p_win': p_win, 'd_win': d_win, 'draw': draw}, 'p_cards':p_cards, 'd_cards':d_cards, 'p_hand':p_hand.cards, 'd_hand':d_hand.cards, 'next_card':next_card})
return f"Welcome to ♠️♥️BlackJack♣️♦️ you have {p_chips.total} chips. Whats your bet?"
@@ -468,6 +468,6 @@ def playBlackJack(nodeID, message):
jackTracker[i]['d_cards'] = []
jackTracker[i]['p_hand'] = []
jackTracker[i]['d_hand'] = []
jackTracker[i]['time'] = time.time()
jackTracker[i]['last_played'] = time.time()
return msg
+1
View File
@@ -680,6 +680,7 @@ def playDopeWars(nodeID, cmd):
for i in range(0, len(dwPlayerTracker)):
if dwPlayerTracker[i].get('userID') == nodeID:
dwPlayerTracker[i]['cmd'] = 'ask_bsf'
dwPlayerTracker[i]['last_played'] = time.time()
# Game end
if game_day == total_days + 1:
+1
View File
@@ -133,6 +133,7 @@ def playGolf(nodeID, message, finishedHole=False):
total_strokes = 0
total_to_par = 0
par = 0
hole = 1
# get player's last command from tracker if not new player
last_cmd = ""
+22 -12
View File
@@ -18,7 +18,7 @@ locale.setlocale(locale.LC_ALL, '')
lemon_starting_cash = 30.00
lemon_total_weeks = 7
lemonadeTracker = [{'nodeID': 0, 'cups': 0, 'lemons': 0, 'sugar': 0, 'cash': lemon_starting_cash, 'start': lemon_starting_cash, 'cmd': 'new', 'time': time.time()}]
lemonadeTracker = [{'nodeID': 0, 'cups': 0, 'lemons': 0, 'sugar': 0, 'cash': lemon_starting_cash, 'start': lemon_starting_cash, 'cmd': 'new', 'last_played': time.time()}]
lemonadeCups = [{'nodeID': 0, 'cost': 2.50, 'count': 25, 'min': 0.99, 'unit': 0.00}]
lemonadeLemons = [{'nodeID': 0, 'cost': 4.00, 'count': 8, 'min': 2.00, 'unit': 0.00}]
lemonadeSugar = [{'nodeID': 0, 'cost': 3.00, 'count': 15, 'min': 1.50, 'unit': 0.00}]
@@ -50,8 +50,9 @@ def getHighScoreLemon():
pickle.dump(high_score, file)
return high_score
def start_lemonade(nodeID, message, celsius=False):
def playLemonstand(nodeID, message, celsius=False):
global lemonadeTracker, lemonadeCups, lemonadeLemons, lemonadeSugar, lemonadeWeeks, lemonadeScore
msg = ""
potential = 0
unit = 0.0
price = 0.0
@@ -213,7 +214,7 @@ def start_lemonade(nodeID, message, celsius=False):
inventory.sugar = lemonadeTracker[i]['sugar']
inventory.cash = lemonadeTracker[i]['cash']
inventory.start = lemonadeTracker[i]['start']
last_cmd = lemonadeTracker[i]['cmd']
lemonsLastCmd = lemonadeTracker[i]['cmd']
for i in range(len(lemonadeCups)):
if lemonadeCups[i]['nodeID'] == nodeID:
cups.cost = lemonadeCups[i]['cost']
@@ -240,10 +241,17 @@ def start_lemonade(nodeID, message, celsius=False):
score.value = lemonadeScore[i]['value']
score.total = lemonadeScore[i]['total']
#handle last command
lemonsLastCmd = 'new'
for i in range(len(lemonadeTracker)):
if lemonadeTracker[i]['nodeID'] == nodeID:
lemonsLastCmd = lemonadeTracker[i]['cmd']
# Start the main loop
if (weeks.current <= weeks.total):
if "new" in last_cmd:
if "new" in lemonsLastCmd:
logger.debug("System: Lemonade: New Game: " + str(nodeID))
# set the last command to cups in the inventory db
for i in range(len(lemonadeTracker)):
if lemonadeTracker[i]['nodeID'] == nodeID:
@@ -329,7 +337,7 @@ def start_lemonade(nodeID, message, celsius=False):
saveValues(nodeID, inventory, cups, lemons, sugar, weeks, score)
return buffer
if "cups" in last_cmd:
if "cups" in lemonsLastCmd:
# Read the number of cup boxes to purchase
newcups = -1
if "n" in message.lower():
@@ -358,7 +366,7 @@ def start_lemonade(nodeID, message, celsius=False):
return msg
if "lemons" in last_cmd:
if "lemons" in lemonsLastCmd:
# Read the number of lemon bags to purchase
newlemons = -1
if "n" in message.lower():
@@ -387,7 +395,7 @@ def start_lemonade(nodeID, message, celsius=False):
msg += f"\n 🍚 to buy? You have {inventory.sugar}🥤 of 🍚, Cost {locale.currency(sugar.cost, grouping=True)} a bag for {str(sugar.count)}🥤"
return msg
if "sugar" in last_cmd:
if "sugar" in lemonsLastCmd:
# Read the number of sugar bags to purchase
newsugar = -1
if "n" in message.lower():
@@ -418,7 +426,7 @@ def start_lemonade(nodeID, message, celsius=False):
saveValues(nodeID, inventory, cups, lemons, sugar, weeks, score)
return msg
if "price" in last_cmd:
if "price" in lemonsLastCmd:
# set the last command to sales in the inventory db
for i in range(len(lemonadeTracker)):
if lemonadeTracker[i]['nodeID'] == nodeID:
@@ -428,7 +436,7 @@ def start_lemonade(nodeID, message, celsius=False):
msg = f"#of🥤 to buy? Have {inventory.cups} Cost {locale.currency(cups.cost, grouping=True)} a 📦 of {str(cups.count)}"
return msg
else:
last_cmd = "sales"
lemonsLastCmd = "sales"
# Read the actual price
price = 0.00
@@ -440,7 +448,7 @@ def start_lemonade(nodeID, message, celsius=False):
return "The price must be greater than zero."
except Exception as e:
price = 0.00
last_cmd = "price"
lemonsLastCmd = "price"
return "⛔️Invalid input, enter the price of the lemonade per 🥤"
# this isnt sent to the user, not needed
@@ -448,7 +456,7 @@ def start_lemonade(nodeID, message, celsius=False):
saveValues(nodeID, inventory, cups, lemons, sugar, weeks, score)
if "sales" in last_cmd:
if "sales" in lemonsLastCmd:
# Calculate the weekly sales based on price and lowest inventory level
# (higher markup price = fewer sales, limited by the inventory on-hand)
sales = get_sales_amount(potential, unit, price)
@@ -567,7 +575,7 @@ def start_lemonade(nodeID, message, celsius=False):
for i in range(len(lemonadeTracker)):
if lemonadeTracker[i]['nodeID'] == nodeID:
lemonadeTracker[i]['cmd'] = "new"
lemonadeTracker[i]['time'] = time.time()
lemonadeTracker[i]['last_played'] = time.time()
weeks.current = weeks.current + 1
@@ -575,3 +583,5 @@ def start_lemonade(nodeID, message, celsius=False):
saveValues(nodeID, inventory, cups, lemons, sugar, weeks, score)
return msg
else:
return "Game Over! Start a (N)ew Game or (E)xit"