Spaces:
Running
Running
| import gradio as gr | |
| import json | |
| import os | |
| import uuid | |
| import time | |
| import re | |
| from datasets import Dataset, load_dataset | |
| # ---------------------------- | |
| # SAVE / LOAD (HF DATASET) | |
| # ---------------------------- | |
| def save_to_hf(dataset_repo, state_json, history_json): | |
| data = { | |
| "state": [state_json], | |
| "history": [history_json] | |
| } | |
| ds = Dataset.from_dict(data) | |
| ds.push_to_hub( | |
| dataset_repo, | |
| private=True | |
| ) | |
| return "Game Saved ☁️" | |
| def load_from_hf(dataset_repo): | |
| ds = load_dataset( | |
| dataset_repo, | |
| split="train" | |
| ) | |
| state_json = ds[0]["state"] | |
| history_json = ds[0]["history"] | |
| return state_json, history_json | |
| def load_and_enter_game(dataset_repo, from_char_screen=True): | |
| """ | |
| Load saved game and switch to game screen. | |
| If from_char_screen=True, also hide stat_screen and show game_screen. | |
| If False, assume we are already in game screen (just refresh data). | |
| """ | |
| try: | |
| state_json, history_json = load_from_hf(dataset_repo) | |
| state = json.loads(state_json) | |
| history = json.loads(history_json) if history_json else [] | |
| # EKSİK STATLARI DOLDUR (eski kayıtlar için) | |
| default_stats = { | |
| "strength": 5, "agility": 5, "intelligence": 5, | |
| "charisma": 5, "willpower": 5, | |
| "light_dark": 0, "order_chaos": 0, "notoriety": 0 | |
| } | |
| for key, default in default_stats.items(): | |
| if key not in state: | |
| state[key] = default | |
| # Statları formatla | |
| stats_md = f""" | |
| **Strength:** {state['strength']} | |
| **Agility:** {state['agility']} | |
| **Intelligence:** {state['intelligence']} | |
| **Charisma:** {state['charisma']} | |
| **Willpower:** {state['willpower']} | |
| """ | |
| # Kaydedilmiş model seçimini al (yoksa "Auto") | |
| saved_model = state.get("saved_model", "Auto (Language Routing)") | |
| # Eğer karakter ekranından geliyorsak, stat_screen'i gizleyip game_screen'i göster | |
| if from_char_screen: | |
| char_screen_update = gr.update(visible=False) | |
| stat_screen_update = gr.update(visible=False) | |
| game_screen_update = gr.update(visible=True) | |
| else: | |
| char_screen_update = gr.update() | |
| stat_screen_update = gr.update() | |
| game_screen_update = gr.update() | |
| return ( | |
| json.dumps(state), # player_state | |
| history, # chatbot | |
| char_screen_update, # char_screen visibility | |
| stat_screen_update, # stat_screen visibility | |
| game_screen_update, # game_screen visibility | |
| state.get("avatar"), # profile_pic | |
| f"### {state.get('name', 'Unknown')}", # profile_info | |
| state["light_dark"], # light_dark_slider | |
| state["order_chaos"], # order_chaos_slider | |
| stats_md, # stat_display | |
| gr.update(), # scene_image (temizle) | |
| saved_model # model_selector value | |
| ) | |
| except Exception as e: | |
| print(f"--- DEBUG INFO [SAVE SYSTEM]: Load error: {e}") | |
| # Hata durumunda mevcut ekranda kal, uyarı göster (isteğe bağlı) | |
| if from_char_screen: | |
| return ( | |
| "{}", [], | |
| gr.update(visible=True), gr.update(visible=False), | |
| None, "### Error loading game", 0, 0, | |
| "Load failed. No saved game found.", gr.update(), "Auto (Language Routing)" | |
| ) | |
| else: | |
| # Oyun içinde hata olursa sadece state'i değiştirme | |
| return ( | |
| "{}", [], gr.update(), gr.update(), None, "### Error", 0, 0, | |
| "Load failed.", gr.update(), "Auto (Language Routing)" | |
| ) | |
| def load_in_game(dataset_repo): | |
| """Oyun içindeki load butonu için - from_char_screen=False ile çağır""" | |
| return load_and_enter_game(dataset_repo, from_char_screen=False) |