From 33e8fff2f401a20e77cd722b0066dc90ec63b2d8 Mon Sep 17 00:00:00 2001 From: Jumitti Date: Fri, 28 Jun 2024 22:11:36 +0200 Subject: [PATCH] (v3.1.12d) Commenting and fix bugs --- panel/ID_card.py | 12 ++-- panel/battle.py | 38 ++++++----- panel/community.py | 11 +++- panel/shop.py | 9 ++- probabilities/probabilities_letter.py | 3 +- probabilities/probabilities_number.py | 3 +- scheduled_tasks.py | 2 +- starwalkers/func.py | 14 +++-- starwalkers/sound_effects.py | 11 ++-- starwalkers/sql.py | 91 ++++++++++----------------- 10 files changed, 93 insertions(+), 101 deletions(-) diff --git a/panel/ID_card.py b/panel/ID_card.py index e2cf68f..8939365 100644 --- a/panel/ID_card.py +++ b/panel/ID_card.py @@ -7,17 +7,17 @@ from starwalkers.func import get_d_sym, get_cost +# Display Commander Grade with stars def display_stars(grade): full_star = '⭐' empty_star = '☆' max_stars = 5 - stars = full_star * grade + empty_star * (max_stars - grade) return stars +# Reformatting money def format_money(value): - """Format money value into a more readable string with suffixes.""" if value >= 1_000_000_000: return f"{value / 1_000_000_000:.2f}B" elif value >= 1_000_000: @@ -29,7 +29,7 @@ def format_money(value): def ID_card(username, display="community_info"): - user_info = sql.get_user(username) + user_info = sql.get_user(username) # Some elements are not necessary money = user_info[2] ship_list = user_info[3] enemy_list = user_info[4] @@ -61,10 +61,11 @@ def ID_card(username, display="community_info"): navigation_time_bonus = user_info[30] grade_token = user_info[31] token_bonus = user_info[32] - + if user_info: st.header(f"🧑🏽‍🚀 Captain {username}'s ID Card {display_stars(grade)}") + # Resources (money) st.subheader("💲 Resources") colres1, colres2, colres3, colres4 = st.columns(4, gap="small") colres1.metric(f"💲 Money", f"{format_money(money)}$") @@ -74,6 +75,7 @@ def ID_card(username, display="community_info"): if display == "player_info": colres4.progress(battle_played) + # Space fleet st.subheader("🚀 Space Fleet") with st.expander(f"Space fleet capacity: {fleet_size} ships", expanded=True): ship_data = [] @@ -99,12 +101,14 @@ def ID_card(username, display="community_info"): else: df = pd.DataFrame() + # Stats battles st.subheader("⚔️ Battles") colbattle1, colbattle2, colbattle3 = st.columns(3, gap="small") colbattle1.metric(f"🏆 Win", f"{win}") colbattle2.metric(f"💥 Loose", f"{loose}") colbattle3.metric(f"⚖️ Win/Loss Ratio", f"{ratio_WL}") + # Skills and trophies st.subheader("🏆 Skills and trophies") if display == "player_info": colsu1, colsu2, colsu3 = st.columns(3, gap="small") diff --git a/panel/battle.py b/panel/battle.py index 3a17e12..7df583d 100644 --- a/panel/battle.py +++ b/panel/battle.py @@ -10,7 +10,7 @@ def battle(username, df): - user_info = sql.get_user(username) + user_info = sql.get_user(username) # Some elements are not necessary money = user_info[2] ship_list = user_info[3] enemy_list = user_info[4] @@ -43,15 +43,27 @@ def battle(username, df): grade_token = user_info[31] token_bonus = user_info[32] + # Header st.header("⚔️ Space war") colwar1, colwar2 = st.columns(2, gap="small") if 'selected_ships_enemy' not in st.session_state or not st.session_state.selected_ships_enemy: st.session_state.selected_ships_enemy = [] + # Begin the battle + if colwar1.button("💥 Look for enemies !", disabled=True if len(enemy_list) > 2 else False): + for _ in range(random.randint(1, 10)): + ship = roll(proba_letter=p_letter, proba_number=p_number) + sql.add_ship(username, ship, "enemies") + st.toast("⚔️ The enemies enter the battles") + time.sleep(0.75) & st.rerun() + + # During the battle if enemy_list: enemy_data = [] colfight1, colfight2 = st.columns(2, gap="small") + + # Display enemies and selected enemies for ship in json.loads(enemy_list): enemy_data.append( {"Ship": ship, "Value": get_d_sym(get_cost(ship)).replace('$', '💲')}) @@ -68,12 +80,10 @@ def battle(username, df): colfight1.write("Enemies list:") colfight1.dataframe(styled_df_enemy, use_container_width=True, hide_index=True) - # Vérifiez et sélectionnez aléatoirement les navires ennemis si nécessaire if not st.session_state.selected_ships_enemy: num_ships_to_select = random.randint(1, 4 if len(enemy_data) >= 4 else len(enemy_data)) st.session_state.selected_ships_enemy = random.sample(enemy_data, num_ships_to_select) - # Affichage des navires sélectionnés dans le deuxième tableau colfight2.write("Fight against:") styled_df_enemy = pd.DataFrame(st.session_state.selected_ships_enemy).sort_values(by="Value", ascending=False) @@ -83,6 +93,7 @@ def battle(username, df): ]).set_properties(**{'text-align': 'left'}) colfight2.dataframe(styled_selected_df_enemy, use_container_width=True, hide_index=True) + # Selection of shuttles to fight if not df.empty and enemy_data: colselectfight1, colselectfight2 = st.columns([2, 1], gap="small") shuttles_for_fight = colselectfight1.multiselect("Select shuttles to fight", df["Ship"].tolist(), @@ -91,10 +102,10 @@ def battle(username, df): max_selections=4, default=df["Ship"].tolist()[:4]) value_player = int(sum(get_cost(ship) for ship in shuttles_for_fight) * random.uniform(1, damage_bonus)) value_enemies = int(sum(get_cost(ship) for ship in styled_df_enemy["Ship"])) - # colselectfight2.write(value_enemies) - # colselectfight2.write(value_player) if colselectfight2.button(f"FIGHT !"): damage = random.randint(0, 100) + + # Win if value_player > value_enemies: sql.trade_token(username, len(styled_df_enemy['Ship']) + int(random.randint(0, token_bonus))) money_win = int((sum(get_cost(ship) for ship in styled_df_enemy['Ship']) // 1.5) * random.uniform(1, treasure_money_bonus)) @@ -105,16 +116,17 @@ def battle(username, df): for ship in shuttles_for_fight: player_let, player_int = ship.split("-") new_number = int(player_int) - (int((damage * random.uniform(resistance_bonus, 1))) // len(shuttles_for_fight)) - if new_number >= 0: + if new_number >= 0: # Shuttles operational update_ship = roll(letter=player_let, number=new_number) sql.add_ship(username, update_ship, "player", fight=True) sql.remove_ship(username, ship, "player") - else: + else: # Shuttles broken sql.remove_ship(username, ship, "player", fight=True) st.toast(f"💥 You loose {ship} in the battle.") st.toast(f'🏆 You win the battle. 💲 Money win: {money_win}$. 🛠️ Damage: {damage}.') time.sleep(2) & st.rerun() + # Loose if value_player <= value_enemies: sql.trade_token(username, len(shuttles_for_fight) + int(random.randint(0, token_bonus))) for ship in shuttles_for_fight: @@ -122,17 +134,18 @@ def battle(username, df): for ship in styled_df_enemy['Ship']: enemy_let, enemy_int = ship.split("-") new_number = int(enemy_int) - (int((damage / random.uniform(1, resistance_bonus))) // len(styled_df_enemy)) - if new_number >= 0: + if new_number >= 0: # Shuttles operational update_ship = roll(letter=enemy_let, number=new_number) sql.add_ship(username, update_ship, "enemies", fight=True) sql.remove_ship(username, ship, "enemies") - else: + else: # Shuttles broken sql.remove_ship(username, ship, "enemies", fight=True) st.session_state.pop('selected_ships_enemy', None) st.toast( f'💥 You lost the battle and {" ".join(ship for ship in shuttles_for_fight)} shuttle(s)') time.sleep(0.75) & st.rerun() + # Leave (coward) if colwar2.button("🏃‍♂️Leave fight"): if random.random() <= agility_bonus: for ship in json.loads(enemy_list): @@ -145,10 +158,3 @@ def battle(username, df): elif df.empty: st.warning("You don't have shuttles") - - if colwar1.button("💥 Look for enemies !", disabled=True if len(enemy_list) > 2 else False): - for _ in range(random.randint(1, 10)): - ship = roll(proba_letter=p_letter, proba_number=p_number) - sql.add_ship(username, ship, "enemies") - st.toast("⚔️ The enemies enter the battles") - time.sleep(0.75) & st.rerun() diff --git a/panel/community.py b/panel/community.py index 350968e..1effbf5 100644 --- a/panel/community.py +++ b/panel/community.py @@ -7,7 +7,7 @@ def community(username): - user_info = sql.get_user(username) + user_info = sql.get_user(username) # Some elements are not necessary money = user_info[2] ship_list = user_info[3] enemy_list = user_info[4] @@ -40,18 +40,23 @@ def community(username): grade_token = user_info[31] token_bonus = user_info[32] + # Header st.header("👨🏼‍🚀 Community") usernames = sql.get_user() default_user = username if username in sql.get_user() else usernames[0] + colcom1, colcom2 = st.columns([2, 1], gap="small") selected_username = colcom1.selectbox('👨🏽‍🚀 See a Captain', usernames, placeholder="Choose a captain") + if selected_username: colcom2.markdown("") colcom2.markdown("") if colcom2.toggle(f"{selected_username} ID card"): - ID_card.ID_card(selected_username) + ID_card.ID_card(selected_username) # See selected user colsm1, colsm2 = st.columns([2, 1], gap="small") + + # Send money send_money = colsm1.slider("💸 Send money", step=1, min_value=0, max_value=money if money > 0 else 1, disabled=True if money < 1 or selected_username == username else False) @@ -62,4 +67,4 @@ def community(username): sql.update_money(selected_username, send_money, context="receiver") sql.update_money(username, send_money, context="sender") st.toast(f"💸 {send_money}$ sends to {selected_username}") - time.sleep(0.75) & st.rerun() \ No newline at end of file + time.sleep(0.75) & st.rerun() diff --git a/panel/shop.py b/panel/shop.py index 4235729..68efb08 100644 --- a/panel/shop.py +++ b/panel/shop.py @@ -8,7 +8,7 @@ def shop(username, df, value_list): - user_info = sql.get_user(username) + user_info = sql.get_user(username) # Some elements are not necessary money = user_info[2] ship_list = user_info[3] enemy_list = user_info[4] @@ -41,6 +41,7 @@ def shop(username, df, value_list): grade_token = user_info[31] token_bonus = user_info[32] + # Header st.header("🏪 Store") # Open case @@ -53,9 +54,10 @@ def shop(username, df, value_list): if "buy_shuttles" not in st.session_state: st.session_state.buy_shuttles = False - if st.session_state.buy_shuttles is True: + if st.session_state.buy_shuttles is True and st.session_state.effect_sound: sound_effects.shuttles() st.session_state.buy_shuttles = False + colopencase2.markdown("") if colopencase2.button(f"Open {open_case} case(s) for {open_case * ((10 + 10 * grade) * commerce_bonus)}$", disabled=True if money < ((10 + 10 * grade) * commerce_bonus) or len(df) >= fleet_size else False): @@ -71,6 +73,8 @@ def shop(username, df, value_list): colsellship1, colsellship2 = st.columns([2, 1], gap="small") if not df.empty: + + # Select shuttles to sell sell = colsellship1.multiselect("Sell ship", df["Ship"].tolist(), label_visibility="collapsed", placeholder="Select shuttles for sale") price = sum(get_cost(ship) for ship in sell) @@ -82,6 +86,7 @@ def shop(username, df, value_list): st.toast("The shuttles have been sold!") time.sleep(0.75) & st.rerun() + # Sell by value st.markdown("Sell shuttles of the same value") sorted_values = sorted(value_list, reverse=True) num_columns = 3 diff --git a/probabilities/probabilities_letter.py b/probabilities/probabilities_letter.py index dc2ef19..4085094 100644 --- a/probabilities/probabilities_letter.py +++ b/probabilities/probabilities_letter.py @@ -12,9 +12,8 @@ total = sum(probabilities) probabilities = [p / total for p in probabilities] - # Sauvegarde des probabilités dans un fichier JSON with open(f'probabilities_letter_{value}.json', 'w') as f: json.dump(probabilities, f) - print(f"Probabilités pour value={value} sauvegardées avec succès.") + print(f"Probabilities for value={value} saved successfully.") diff --git a/probabilities/probabilities_number.py b/probabilities/probabilities_number.py index 326402f..b702d40 100644 --- a/probabilities/probabilities_number.py +++ b/probabilities/probabilities_number.py @@ -11,8 +11,7 @@ total_probability = sum(probabilities_number) probabilities_number = [p / total_probability for p in probabilities_number] - # Sauvegarde des probabilités dans un fichier JSON with open(f'probabilities_number_{value}.json', 'w') as f: json.dump(probabilities_number, f) - print("Probabilités sauvegardées avec succès.") + print(f"Probabilities for value={value} saved successfully.") diff --git a/scheduled_tasks.py b/scheduled_tasks.py index 622e6c8..1ffac69 100644 --- a/scheduled_tasks.py +++ b/scheduled_tasks.py @@ -24,7 +24,7 @@ def create_backup(): backup_filename = f'users_{now}.db' backup_path = os.path.join(backup_dir, backup_filename) shutil.copy2(db_path, backup_path) - print(f'Sauvegarde créée : {backup_path}') + print(f'Backup created : {backup_path}') # Clean old backups if more than 10 present backups = sorted(os.listdir(backup_dir), key=lambda x: os.path.getmtime(os.path.join(backup_dir, x))) diff --git a/starwalkers/func.py b/starwalkers/func.py index 8386ffb..08b95ff 100644 --- a/starwalkers/func.py +++ b/starwalkers/func.py @@ -5,7 +5,7 @@ def got_let_int(letter): # Letter value letters = { - "*": 100, + "*": 100, # This one not accessible by random buy of shuttles "A": 26, "B": 25, "C": 24, @@ -39,6 +39,7 @@ def roll(proba_letter=None, proba_number=None, number_min=None, number_max=None, letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] + # To manage categories if letter_min or letter_max: min_index = letters.index(letter_min.upper()) max_index = letters.index(letter_max.upper()) @@ -48,24 +49,27 @@ def roll(proba_letter=None, proba_number=None, number_min=None, number_max=None, sub_letters = letters[max_index:min_index + 1] ship_let = random.choice(sub_letters) + # Specific letter elif letter is not None: ship_let = letter + # Random letter else: - letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', - 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] with open(f'probabilities/probabilities_letter_{proba_letter}.json', 'r') as f: probabilities = json.load(f) ship_let = random.choices(letters, weights=probabilities)[0] + # To manage categories if number_min or number_max: number_min = 0 if number_min is None else number_min number_max = 9999 if number_max is None else number_max ran = random.randint(number_min, number_max) if number is None else number + # Specific number elif number is not None: ran = number + # Random number else: digits = list(range(10000)) with open(f'probabilities/probabilities_number_{proba_number}.json', 'r') as f: @@ -91,7 +95,7 @@ def get_cost(a): # Get cost of a ship return cost -def upgrade_fleet(fleet_size): +def upgrade_fleet(fleet_size): # Price for upgrade fleet size x1 = 10 y1 = 0.5 x2 = 40 @@ -102,6 +106,6 @@ def upgrade_fleet(fleet_size): return price -def upgrade(grade, coefficient, multiplier): +def upgrade(grade, coefficient, multiplier): # Price for skills and others capacities price = math.floor(multiplier * math.exp(coefficient * (grade + 1))) return price diff --git a/starwalkers/sound_effects.py b/starwalkers/sound_effects.py index 022b32c..1ef6ba8 100644 --- a/starwalkers/sound_effects.py +++ b/starwalkers/sound_effects.py @@ -4,36 +4,33 @@ import streamlit as st -def shuttles(): +def shuttles(): # Effects for shuttles audio_files = [os.path.join('./sounds/effect/shuttles/', f) for f in os.listdir('./sounds/effect/shuttles/') if f.endswith('.mp3')] effect(audio_files) -def battle(): +def battle(): # Effects for battle audio_files = [os.path.join('./sounds/effect/battle/', f) for f in os.listdir('./sounds/effect/battle/') if f.endswith('.mp3')] effect(audio_files) -def effect(audio_files): +def effect(audio_files): # Output for effect sound st.markdown(f""" """, unsafe_allow_html=True) -def ambient(): +def ambient(): # Ambient sound audio_files = [os.path.join('./sounds/ambient/', f) for f in os.listdir('./sounds/ambient/') if f.endswith('.mp3')] concatenated_audio = b"" for file_path in audio_files: with open(file_path, 'rb') as f: concatenated_audio += f.read() - - # Encoder le fichier audio en base64 audio_data = base64.b64encode(concatenated_audio).decode() - # Inclure le fichier audio dans st.markdown() st.markdown(f"""