import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext, font
import threading
import random
import pygame

class SoundManager:
    def __init__(self):
        pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=512)
        self.sounds = {}
        self.enabled = True
        
    def load_sounds(self):
        try:
            sound_effects = {
                'typewriter': self.create_typewriter_sound(),
                'decision': self.create_decision_sound(),
                'battle': self.create_battle_sound(),
                'victory': self.create_victory_sound(),
                'defeat': self.create_defeat_sound(),
                'click': self.create_click_sound(),
                'page_turn': self.create_page_turn_sound()
            }
            
            for name, sound in sound_effects.items():
                if sound:
                    self.sounds[name] = sound
                    
        except Exception as e:
            print(f"Sound load failed: {e}")
            
    def create_typewriter_sound(self):
        try:
            sound = pygame.mixer.Sound(buffer=bytes([random.randint(128, 255) for _ in range(1000)]))
            sound.set_volume(0.3)
            return sound
        except:
            return None
            
    def create_decision_sound(self):
        try:
            sound = pygame.mixer.Sound(buffer=bytes([random.randint(200, 255) for _ in range(1500)]))
            sound.set_volume(0.5)
            return sound
        except:
            return None
            
    def create_battle_sound(self):
        try:
            sound = pygame.mixer.Sound(buffer=bytes([random.randint(150, 255) for _ in range(2000)]))
            sound.set_volume(0.4)
            return sound
        except:
            return None
            
    def create_victory_sound(self):
        try:
            data = []
            for i in range(44100 // 4):
                t = float(i) / 44100.0
                freq = 440 + i * 2
                data.append(int(127 * (1 + 0.5 * (t * freq * 2 * 3.14159))))
            sound = pygame.mixer.Sound(buffer=bytes(data[:1000]))
            sound.set_volume(0.6)
            return sound
        except:
            return None
            
    def create_defeat_sound(self):
        try:
            sound = pygame.mixer.Sound(buffer=bytes([random.randint(50, 150) for _ in range(2000)]))
            sound.set_volume(0.5)
            return sound
        except:
            return None
            
    def create_click_sound(self):
        try:
            sound = pygame.mixer.Sound(buffer=bytes([random.randint(200, 255) for _ in range(500)]))
            sound.set_volume(0.2)
            return sound
        except:
            return None
            
    def create_page_turn_sound(self):
        try:
            sound = pygame.mixer.Sound(buffer=bytes([random.randint(100, 200) for _ in range(800)]))
            sound.set_volume(0.3)
            return sound
        except:
            return None
            
    def play_sound(self, sound_name):
        if self.enabled and sound_name in self.sounds and self.sounds[sound_name]:
            try:
                self.sounds[sound_name].play()
            except:
                pass
                
    def toggle(self):
        self.enabled = not self.enabled
        
    def set_volume(self, volume):
        for sound in self.sounds.values():
            if sound:
                sound.set_volume(volume)

class AchievementSystem:
    def __init__(self):
        self.achievements = {
            'first_decision': {'name': '第一次抉择', 'desc': '做出第一个历史决策', 'unlocked': False},
            'battle_victory': {'name': '初战告捷', 'desc': '赢得第一场战斗', 'unlocked': False},
            'strategist': {'name': '战略大师', 'desc': '战略眼光达到80以上', 'unlocked': False},
            'iron_will': {'name': '钢铁意志', 'desc': '士气保持100超过3个事件', 'unlocked': False},
            'military_genius': {'name': '军事天才', 'desc': '军事才能达到90以上', 'unlocked': False},
            'complete_story': {'name': '传奇人生', 'desc': '完成所有历史事件', 'unlocked': False},
            'survivor': {'name': '生存专家', 'desc': '健康状况从未低于50', 'unlocked': False},
            'politician': {'name': '政治智慧', 'desc': '政治智慧达到80以上', 'unlocked': False}
        }
        self.unlocked_history = []
        self.morale_high_count = 0
        
    def check_achievements(self, stats, current_event, total_events):
        unlocked = []
        
        if stats.get('decisions_made', 0) >= 1 and not self.achievements['first_decision']['unlocked']:
            self.achievements['first_decision']['unlocked'] = True
            unlocked.append('first_decision')
            
        if stats.get('battles_won', 0) >= 1 and not self.achievements['battle_victory']['unlocked']:
            self.achievements['battle_victory']['unlocked'] = True
            unlocked.append('battle_victory')
            
        if stats.get('strategic_insight', 0) >= 80 and not self.achievements['strategist']['unlocked']:
            self.achievements['strategist']['unlocked'] = True
            unlocked.append('strategist')
            
        if stats.get('morale', 0) >= 100:
            self.morale_high_count += 1
        else:
            self.morale_high_count = 0
            
        if self.morale_high_count >= 3 and not self.achievements['iron_will']['unlocked']:
            self.achievements['iron_will']['unlocked'] = True
            unlocked.append('iron_will')
            
        if stats.get('military_skill', 0) >= 90 and not self.achievements['military_genius']['unlocked']:
            self.achievements['military_genius']['unlocked'] = True
            unlocked.append('military_genius')
            
        if stats.get('min_health', 100) >= 50 and not self.achievements['survivor']['unlocked']:
            self.achievements['survivor']['unlocked'] = True
            unlocked.append('survivor')
            
        if stats.get('political_wisdom', 0) >= 80 and not self.achievements['politician']['unlocked']:
            self.achievements['politician']['unlocked'] = True
            unlocked.append('politician')
            
        if current_event >= total_events - 1 and not self.achievements['complete_story']['unlocked']:
            self.achievements['complete_story']['unlocked'] = True
            unlocked.append('complete_story')
            
        for achievement_id in unlocked:
            if achievement_id not in self.unlocked_history:
                self.unlocked_history.append(achievement_id)
                
        return unlocked
        
    def get_achievement_count(self):
        return sum(1 for a in self.achievements.values() if a['unlocked'])
        
    def get_all_achievements(self):
        return self.achievements

class SuYuLifeGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("粟裕将军人生体验")
        self.root.geometry("1600x900")
        
        self.colors = {
            'bg': '#0a0a0a',
            'fg': '#f0f0f0',
            'accent': '#8b0000',
            'accent_light': '#b22222',
            'button': '#2a2a2a',
            'button_hover': '#3a3a3a',
            'text_bg': '#1a1a1a',
            'border': '#444',
            'highlight': '#8b4513',
            'text_highlight': '#d2691e',
            'achievement': '#ffd700',
            'achievement_bg': '#2a2a2a'
        }
        
        self.root.configure(bg=self.colors['bg'])
        
        self.sound_manager = SoundManager()
        self.sound_manager.load_sounds()
        
        self.achievement_system = AchievementSystem()
        
        self.fonts = {
            'title': ("Microsoft YaHei", 24, "bold"),
            'subtitle': ("Microsoft YaHei", 18, "bold"),
            'text': ("Microsoft YaHei", 12),
            'text_bold': ("Microsoft YaHei", 12, "bold"),
            'small': ("Microsoft YaHei", 10)
        }
        
        self.year = 1907
        self.age = 0
        self.current_event = 0
        self.health = 100
        self.min_health = 100
        self.military_skill = 0
        self.strategic_insight = 0
        self.political_wisdom = 0
        self.morale = 50
        self.decisions = []
        self.decisions_made = 0
        self.battles_won = 0
        self.is_typing = False
        self.typewriter_speed = 0.01
        
        self.setup_ui()
        self.load_events()
        self.display_event(0)
        
    def setup_ui(self):
        main_container = tk.Frame(self.root, bg=self.colors['bg'])
        main_container.pack(fill='both', expand=True, padx=20, pady=20)
        
        title_frame = tk.Frame(main_container, bg=self.colors['bg'])
        title_frame.pack(fill='x', pady=(0, 20))
        
        title_label = tk.Label(
            title_frame,
            text="粟裕将军人生体验,东台市实验中学城东分校805刁俊逸",
            font=self.fonts['title'],
            fg=self.colors['accent_light'],
            bg=self.colors['bg']
        )
        title_label.pack()
        
        top_panel = tk.Frame(main_container, bg=self.colors['bg'], height=350)
        top_panel.pack(fill='x', pady=(0, 20))
        
        bottom_panel = tk.Frame(main_container, bg=self.colors['bg'])
        bottom_panel.pack(fill='both', expand=True)
        
        self.create_status_panel(top_panel)
        self.create_event_panel(top_panel)
        self.create_decision_panel(top_panel)
        
        self.create_timeline_panel(bottom_panel)
        self.create_achievement_panel(bottom_panel)
        self.create_control_panel(bottom_panel)
        
    def create_status_panel(self, parent):
        status_frame = tk.LabelFrame(
            parent,
            text="👤 将军状态",
            font=self.fonts['subtitle'],
            fg=self.colors['accent_light'],
            bg=self.colors['bg'],
            relief='ridge',
            borderwidth=2
        )
        status_frame.pack(side='left', fill='both', expand=True, padx=(0, 20))
        
        info_card = tk.Frame(status_frame, bg=self.colors['text_bg'])
        info_card.pack(fill='x', padx=10, pady=10)
        
        info_items = [
            ("姓名", "粟裕"),
            ("出生", "1907年"),
            ("籍贯", "湖南会同"),
            ("军衔", "大将")
        ]
        
        for label, value in info_items:
            item_frame = tk.Frame(info_card, bg=self.colors['text_bg'])
            item_frame.pack(fill='x', pady=3)
            
            tk.Label(
                item_frame,
                text=f"{label}：",
                font=self.fonts['text_bold'],
                fg=self.colors['accent'],
                bg=self.colors['text_bg']
            ).pack(side='left')
            
            tk.Label(
                item_frame,
                text=value,
                font=self.fonts['text'],
                fg=self.colors['fg'],
                bg=self.colors['text_bg']
            ).pack(side='left')
        
        abilities = [
            ("❤️ 健康状况", self.health, "#ff4444"),
            ("⚔️ 军事才能", self.military_skill, self.colors['accent']),
            ("🎯 战略眼光", self.strategic_insight, "#4169e1"),
            ("🏛️ 政治智慧", self.political_wisdom, "#32cd32"),
            ("💪 士气", self.morale, "#ffd700")
        ]
        
        for label, value, color in abilities:
            ability_frame = tk.Frame(status_frame, bg=self.colors['bg'])
            ability_frame.pack(fill='x', padx=10, pady=5)
            
            tk.Label(
                ability_frame,
                text=label,
                font=self.fonts['text'],
                fg=self.colors['fg'],
                bg=self.colors['bg'],
                width=10,
                anchor='w'
            ).pack(side='left')
            
            bar_canvas = tk.Canvas(
                ability_frame,
                width=150,
                height=20,
                bg=self.colors['text_bg'],
                highlightthickness=0
            )
            bar_canvas.pack(side='left', padx=(10, 5))
            
            bar_width = int(150 * value / 100)
            bar_canvas.create_rectangle(0, 0, bar_width, 20, fill=color, outline='')
            
            value_label = tk.Label(
                ability_frame,
                text=f"{value}/100",
                font=self.fonts['text_bold'],
                fg=color,
                bg=self.colors['bg'],
                width=8
            )
            value_label.pack(side='right')
            
            if label == "❤️ 健康状况":
                self.health_bar = bar_canvas
                self.health_label = value_label
            elif label == "⚔️ 军事才能":
                self.military_bar = bar_canvas
                self.military_label = value_label
            elif label == "🎯 战略眼光":
                self.strategy_bar = bar_canvas
                self.strategy_label = value_label
            elif label == "🏛️ 政治智慧":
                self.politics_bar = bar_canvas
                self.politics_label = value_label
            elif label == "💪 士气":
                self.morale_bar = bar_canvas
                self.morale_label = value_label
        
        self.year_label = tk.Label(
            status_frame,
            text=f"当前时间：{self.year}年 | 年龄：{self.age}岁",
            font=("Microsoft YaHei", 16, "bold"),
            fg=self.colors['text_highlight'],
            bg=self.colors['bg']
        )
        self.year_label.pack(pady=(5, 10))
        
    def create_event_panel(self, parent):
        event_frame = tk.LabelFrame(
            parent,
            text="📖 历史时刻",
            font=self.fonts['subtitle'],
            fg=self.colors['accent_light'],
            bg=self.colors['bg'],
            relief='ridge',
            borderwidth=2
        )
        event_frame.pack(side='left', fill='both', expand=True, padx=(0, 20))
        
        self.event_title = tk.Label(
            event_frame,
            text="",
            font=("Microsoft YaHei", 20, "bold"),
            fg=self.colors['accent'],
            bg=self.colors['bg']
        )
        self.event_title.pack(anchor='w', padx=20, pady=(15, 5))
        
        self.event_time = tk.Label(
            event_frame,
            text="",
            font=self.fonts['text'],
            fg='#cccccc',
            bg=self.colors['bg']
        )
        self.event_time.pack(anchor='w', padx=20, pady=(0, 10))
        
        self.event_text = scrolledtext.ScrolledText(
            event_frame,
            wrap='word',
            font=self.fonts['text'],
            bg=self.colors['text_bg'],
            fg='#f0f0f0',
            relief='flat',
            borderwidth=2
        )
        self.event_text.pack(fill='both', expand=True, padx=20, pady=(0, 20))
        self.event_text.config(state='disabled')
        
    def create_decision_panel(self, parent):
        decision_frame = tk.LabelFrame(
            parent,
            text="🤔 历史抉择",
            font=self.fonts['subtitle'],
            fg=self.colors['accent_light'],
            bg=self.colors['bg'],
            relief='ridge',
            borderwidth=2
        )
        decision_frame.pack(side='left', fill='both', expand=True)
        
        self.decision_text = tk.Text(
            decision_frame,
            wrap='word',
            font=self.fonts['text'],
            bg=self.colors['text_bg'],
            fg=self.colors['text_highlight'],
            relief='flat',
            height=3
        )
        self.decision_text.pack(fill='x', padx=20, pady=(15, 10))
        self.decision_text.config(state='disabled')
        
        self.options_frame = tk.Frame(decision_frame, bg=self.colors['bg'])
        self.options_frame.pack(fill='both', expand=True, padx=20, pady=(0, 20))
        
    def create_timeline_panel(self, parent):
        timeline_frame = tk.LabelFrame(
            parent,
            text="📅 人生历程",
            font=self.fonts['subtitle'],
            fg=self.colors['accent_light'],
            bg=self.colors['bg'],
            relief='ridge',
            borderwidth=2
        )
        timeline_frame.pack(side='left', fill='both', expand=True, padx=(0, 20))
        
        canvas_frame = tk.Frame(timeline_frame, bg=self.colors['bg'])
        canvas_frame.pack(fill='both', expand=True, padx=5, pady=5)
        
        scrollbar = ttk.Scrollbar(canvas_frame)
        scrollbar.pack(side='right', fill='y')
        
        self.timeline_canvas = tk.Canvas(
            canvas_frame,
            bg=self.colors['text_bg'],
            yscrollcommand=scrollbar.set,
            highlightthickness=0
        )
        self.timeline_canvas.pack(side='left', fill='both', expand=True)
        
        scrollbar.config(command=self.timeline_canvas.yview)
        
        self.timeline_inner = tk.Frame(self.timeline_canvas, bg=self.colors['text_bg'])
        self.timeline_canvas.create_window((0, 0), window=self.timeline_inner, anchor='nw')
        
    def create_achievement_panel(self, parent):
        achievement_frame = tk.LabelFrame(
            parent,
            text="🏆 成就系统",
            font=self.fonts['subtitle'],
            fg=self.colors['achievement'],
            bg=self.colors['bg'],
            relief='ridge',
            borderwidth=2
        )
        achievement_frame.pack(side='left', fill='both', expand=True, padx=(0, 20))
        
        self.achievement_count_label = tk.Label(
            achievement_frame,
            text="成就：0/8",
            font=self.fonts['text_bold'],
            fg=self.colors['achievement'],
            bg=self.colors['bg']
        )
        self.achievement_count_label.pack(pady=10)
        
        achievement_container = tk.Frame(achievement_frame, bg=self.colors['bg'])
        achievement_container.pack(fill='both', expand=True, padx=10, pady=(0, 10))
        
        achievement_canvas = tk.Canvas(
            achievement_container,
            bg=self.colors['text_bg'],
            height=200,
            highlightthickness=0
        )
        achievement_canvas.pack(fill='both', expand=True)
        
        self.achievement_inner = tk.Frame(achievement_canvas, bg=self.colors['text_bg'])
        achievement_canvas.create_window((0, 0), window=self.achievement_inner, anchor='nw')
        
        self.update_achievements_display()
        
    def create_control_panel(self, parent):
        control_frame = tk.Frame(parent, bg=self.colors['bg'])
        control_frame.pack(side='left', fill='both', expand=True)
        
        self.history_btn = tk.Button(
            control_frame,
            text="📜 决策历史",
            command=self.show_history,
            font=self.fonts['text'],
            bg=self.colors['button'],
            fg=self.colors['fg'],
            relief='flat',
            padx=20,
            pady=10
        )
        self.history_btn.pack(fill='x', pady=(0, 10))
        
        self.prev_btn = tk.Button(
            control_frame,
            text="⬅ 上一步",
            command=self.prev_event,
            font=self.fonts['text'],
            bg=self.colors['button'],
            fg=self.colors['fg'],
            relief='flat',
            padx=20,
            pady=10,
            state='disabled'
        )
        self.prev_btn.pack(fill='x', pady=(0, 10))
        
        self.main_btn = tk.Button(
            control_frame,
            text="开始人生旅程",
            command=self.next_event,
            font=self.fonts['text'],
            bg=self.colors['accent'],
            fg='white',
            relief='flat',
            padx=20,
            pady=10
        )
        self.main_btn.pack(fill='x', pady=(0, 10))
        
        self.sound_btn = tk.Button(
            control_frame,
            text="🔇 音效：关" if not self.sound_manager.enabled else "🔊 音效：开",
            command=self.toggle_sound,
            font=self.fonts['text'],
            bg=self.colors['button'],
            fg=self.colors['fg'],
            relief='flat',
            padx=20,
            pady=10
        )
        self.sound_btn.pack(fill='x', pady=(0, 10))
        
        self.achievement_btn = tk.Button(
            control_frame,
            text="🏆 查看成就",
            command=self.show_achievements,
            font=self.fonts['text'],
            bg=self.colors['button'],
            fg=self.colors['fg'],
            relief='flat',
            padx=20,
            pady=10
        )
        self.achievement_btn.pack(fill='x', pady=(0, 10))
        
        self.reset_btn = tk.Button(
            control_frame,
            text="🔄 重新开始",
            command=self.reset_game,
            font=self.fonts['text'],
            bg=self.colors['button'],
            fg=self.colors['fg'],
            relief='flat',
            padx=20,
            pady=10
        )
        self.reset_btn.pack(fill='x', pady=(0, 10))
        
    def load_events(self):
        self.events = [
            {
                'year': 1907,
                'age': 0,
                'location': '湖南会同县枫木树脚村',
                'title': '侗乡初啼：将星的诞生',
                'description': '''1907年8月10日，粟裕诞生在湘西会同县的侗族小村庄。父亲是私塾先生，母亲是勤劳的侗族妇女。家中清贫但和睦，父亲教他识字明理，母亲教他善良待人。

从小目睹乡村贫困，逃荒者络绎不绝。母亲常分食物救济穷人，这一幕深深印在他心中。父亲常教诲："读书不是为了做官，是为了明理。人活一世，要懂得忠义。"

在侗寨度过平静童年，春天采茶，夏天戏水，秋天拾稻，冬天围炉。但变革暗流已在涌动，父亲从县城带回的报纸上，"变法"、"革命"等字眼引起少年好奇。

这个湘西大山里的侗族少年，二十年后拿起枪，走上改变中国命运的道路。淳朴的侗乡生活，为他奠定了坚毅、善良的品格基础。''',
                'decision': '这是我的生命起点。父亲教我识字明理，母亲教我善良待人。',
                'options': [],
                'effects': {'health': 0, 'military': 0, 'strategy': 0, 'politics': 0, 'morale': 0}
            },
            {
                'year': 1926,
                'age': 19,
                'location': '湖南常德省立第二师范学校',
                'title': '革命思想的萌芽',
                'description': '''在常德师范学校，粟裕接触到《新青年》杂志，"民主"、"科学"、"马克思主义"照亮年轻心灵。军阀混战，民不聊生，国家危难令人忧心。

1926年5月，上海发生"五卅惨案"，英国巡捕枪杀游行群众。消息传到常德，学生们义愤填膺。粟裕与同学滕代远等人常在操场角落讨论国家前途。

学校附近纱厂发生惨案，女工因请假被开除，丈夫来理论被打成重伤。滕代远组织学生声援，警察镇压，学生被打得头破血流。

粟裕额头上鲜血直流，但心中更加坚定："读书救不了中国，温和改良救不了中国！"这一刻，革命种子在心中生根发芽。''',
                'decision': '面对国家和民族的危难，我该如何选择人生道路？',
                'options': [
                    {
                        'text': '继续专心学业，将来当个老师，用知识改变命运',
                        'effects': {'health': 10, 'military': 0, 'strategy': 5, 'politics': 5, 'morale': -20},
                        'result_text': '你选择了安稳的道路。毕业后回家乡成为教师，过着平淡安稳的生活。每当听到革命消息，心中涌起一丝遗憾。那些理想在岁月中慢慢褪色，但至少让家乡孩子有了读书机会。'
                    },
                    {
                        'text': '毅然加入共青团，投身革命洪流',
                        'effects': {'health': -5, 'military': 10, 'strategy': 15, 'politics': 20, 'morale': 20},
                        'result_text': '1926年11月，在滕代远介绍下加入共青团。从此人生轨迹彻底改变。白天是普通学生，夜晚阅读《共产党宣言》，参加秘密会议，印发传单。这条路充满危险，但理想之火让你义无反顾。'
                    }
                ]
            },
            {
                'year': 1927,
                'age': 20,
                'location': '江西南昌',
                'title': '南昌起义：武装斗争的第一枪',
                'description': '''1927年8月1日凌晨，南昌起义爆发。粟裕任教导队班长，奉命攻打松柏巷天主堂敌军团部。枪声划破夜空，起义开始。

"同志们，跟我上！"粟裕第一个冲出掩体。子弹呼啸，手榴弹爆炸。战士在身边倒下，鲜血溅了一脸。天主堂敌人火力猛烈，机枪封锁街道。

粟裕观察地形，发现左侧小巷可迂回。"一班，跟我来！二班，正面掩护！"带领战士快速移动，出现在天主堂侧面院墙下。

"手榴弹准备！""扔！"十几颗手榴弹飞进院子。爆炸声中，他第一个翻过院墙："冲啊！"前后夹击，守敌崩溃。叶挺军长拍着他肩膀："小鬼，打得好！有勇有谋！"''',
                'decision': '如何指挥这场关键的突袭战？',
                'options': [
                    {
                        'text': '正面强攻，用革命勇气压倒敌人',
                        'effects': {'health': -20, 'military': 15, 'strategy': 10, 'politics': 5, 'morale': 10},
                        'result_text': '教导队付出惨重代价，但展现了革命勇气。叶挺军长看着满地伤员："勇气可嘉，但代价太大。"战士们伤亡过半，英勇冲锋震撼敌人，为其他部队创造了机会。'
                    },
                    {
                        'text': '迂回包抄，智取敌军阵地',
                        'effects': {'health': -10, 'military': 30, 'strategy': 25, 'politics': 10, 'morale': 20},
                        'result_text': '以微小代价全歼守敌，叶挺军长特别表扬。战后总结会上，叶挺说："这个小鬼，将来是个将才！"迂回战术保存了有生力量，为南昌起义胜利作出重要贡献，让你在军中崭露头角。'
                    }
                ]
            },
            {
                'year': 1934,
                'age': 27,
                'location': '江西苏区',
                'title': '长征前夕的战略决策',
                'description': '''1934年，中央苏区第五次反"围剿"失败，红军准备长征。粟裕任红七军团参谋长，奉命掩护主力转移，吸引敌人注意。

这是一项危险任务，很可能有去无回。在瑞金指挥部，与寻淮洲军长、方志敏政委研究地图。敌人蓝色箭头如潮水涌来，红色防线不断收缩。

任务艰巨：只有6000人，要面对几十万敌军。但为主力红军争取时间，必须有人牺牲。窗外秋雨绵绵，战士练习拼刺刀的喊杀声传来。

这些年轻战士大多十几二十岁，信任指挥员能带他们走向胜利。这份责任让粟裕夜不能寐。雨声急促，决定不仅关系到6000人生命，更关系中国革命未来。''',
                'decision': '作为留守部队指挥员，如何选择作战策略？',
                'options': [
                    {
                        'text': '坚守苏区根据地，开展阵地战',
                        'effects': {'health': -20, 'military': 20, 'strategy': 10, 'politics': 15, 'morale': 5},
                        'result_text': '在敌强我弱情况下坚守，损失较大但牵制了敌人。凭借有利地形抵抗一个多月，为主力红军争取了时间。但阵地战消耗大，部队伤亡惨重，突围时只剩不到一千人。'
                    },
                    {
                        'text': '转为游击战，在运动中消灭敌人',
                        'effects': {'health': -5, 'military': 25, 'strategy': 30, 'politics': 10, 'morale': 15},
                        'result_text': '灵活游击保存了有生力量，为日后发展奠定基础。化整为零，在闽浙赣边区与敌人周旋。生活艰苦，经常几天吃不上饭，但保存了革命火种。三年游击战争让你理解了人民战争。'
                    },
                    {
                        'text': '向敌人后方穿插，开辟新根据地',
                        'effects': {'health': -15, 'military': 30, 'strategy': 25, 'politics': 20, 'morale': 10},
                        'result_text': '大胆穿插取得战略主动，但面临极大风险。出其不意穿插到敌后，让国民党军措手不及。但敌我力量悬殊，新区群众基础薄弱，在围追堵截下损失较大。'
                    }
                ]
            },
            {
                'year': 1940,
                'age': 33,
                'location': '江苏黄桥',
                'title': '黄桥战役：以少胜多的经典',
                'description': '''1940年10月，韩德勤调集3万大军进攻新四军。我军仅7000人，敌我兵力4:1。在黄桥指挥部，作战会议紧张进行。

粟裕分析：敌人分三路，中路独立第六旅装备最好，左右两路战斗力弱。敌人各自为战，协调性差。有人建议先打最弱的右路。

粟裕摇头："应该集中兵力，先打最强的独立第六旅。这支部队骄傲轻敌，吃掉它，其他两路必然动摇。"这就是"打其强，震其弱"。

陈毅问具体部署。粟裕说："用三分之一兵力阻击左右两路，集中三分之二主力在黄桥围歼中路独立第六旅。正面阻击，两侧包抄。"

10月4日，战斗打响。独立第六旅果然骄傲轻敌，孤军深入伏击圈。经过一天激战，全歼3000余人，旅长翁达自杀。左右两路敌人不战而退。''',
                'decision': '面对5倍于己的敌人，如何部署兵力？',
                'options': [
                    {
                        'text': '集中兵力，先打最强的独立第六旅',
                        'effects': {'health': 0, 'military': 25, 'strategy': 20, 'politics': 5, 'morale': 15},
                        'result_text': '正确选择！全歼独立第六旅，敌军全线动摇。黄桥战役成为以少胜多的经典。延安发来贺电，毛主席赞扬"打出了新四军的威风"。巩固了苏北抗日根据地，军事才能得到党中央认可。'
                    },
                    {
                        'text': '分兵防御，全面阻击',
                        'effects': {'health': -15, 'military': 10, 'strategy': 5, 'politics': 0, 'morale': -10},
                        'result_text': '兵力分散导致防线薄弱，损失惨重。虽然勉强守住黄桥，但部队伤亡超过三分之一，失去继续作战能力。陈毅司令员批评了这种分兵把口的战术思想。'
                    },
                    {
                        'text': '诱敌深入，在运动中歼敌',
                        'effects': {'health': -5, 'military': 20, 'strategy': 15, 'politics': 10, 'morale': 5},
                        'result_text': '成功诱敌但未能全歼，战果有限。采取机动防御，在运动中消灭部分敌人，但未能给敌歼灭性打击。韩德勤主力基本完好，不久又卷土重来。'
                    }
                ]
            },
            {
                'year': 1946,
                'age': 39,
                'location': '江苏苏中',
                'title': '苏中战役：七战七捷',
                'description': '''1946年7月，蒋介石调集12万大军进攻苏中解放区。粟裕指挥华中野战军只有3万人，敌我兵力4:1。国民党军有美式装备、空军支援，我军只有"小米加步枪"。

在如皋指挥部，气氛紧张。参谋们进进出出，电话铃声不断。敌人分四路压来，兵力装备占绝对优势。作战参谋忧心忡忡："司令员，这仗怎么打？"

粟裕研究敌情：敌人分属不同派系，指挥不统一，矛盾重重，骄傲轻敌。他说："敌人看似强大，实则外强中干。分四路进攻，正好给我们各个击破机会。"

7月13日，宣泰战斗打响。集中12个团打敌人2个团，两天全歼守敌。首战告捷，士气大振。接着是如南、海安、李堡、丁堰林梓、如黄路、邵伯战斗。

一个半月内，连打七仗，仗仗胜利，歼敌5.3万余人，创造战争奇迹。每次都有不同特点，伏击战、攻坚战、运动战，但都坚持集中优势兵力，各个歼灭敌人。''',
                'decision': '如何应对敌人优势兵力的全面进攻？',
                'options': [
                    {
                        'text': '集中兵力，各个击破',
                        'effects': {'health': 0, 'military': 30, 'strategy': 25, 'politics': 10, 'morale': 20},
                        'result_text': '七战七捷！歼灭敌军5.3万余人，创造战争奇迹。延安发来贺电，毛主席称赞这是"集中优势兵力，各个歼灭敌人"的典范。沉重打击了国民党军士气，极大鼓舞了解放区军民信心。'
                    },
                    {
                        'text': '分散游击，消耗敌人',
                        'effects': {'health': -10, 'military': 15, 'strategy': 10, 'politics': 5, 'morale': 5},
                        'result_text': '虽消耗了敌人，但未能取得决定性胜利。采取分散游击战术，给敌人造成一定伤亡，但未能歼灭其有生力量。敌人逐步推进，占领苏中大部分城镇，根据地缩小。'
                    },
                    {
                        'text': '固守要点，阵地防御',
                        'effects': {'health': -20, 'military': 10, 'strategy': 5, 'politics': 0, 'morale': -10},
                        'result_text': '在敌人优势火力下损失惨重。与敌人打阵地战，英勇顽强，但在飞机、大炮轰击下，工事被毁，部队伤亡惨重。被迫放弃阵地，损失超过一半兵力。'
                    }
                ]
            },
            {
                'year': 1947,
                'age': 40,
                'location': '山东孟良崮',
                'title': '孟良崮战役：虎口拔牙',
                'description': '''1947年5月，国民党军45万对山东解放区重点进攻，采取"密集靠拢，稳扎稳打"战术，我军难以找到歼敌机会。

这时机会出现：整编74师3万余人，在师长张灵甫指挥下，孤军深入孟良崮。74师是国民党军五大主力之一，全副美式装备，号称"御林军"。

华东野战军指挥部激烈争论。大部分指挥员主张避开强敌，寻找薄弱环节。因为74师战斗力强，孟良崮易守难攻。强攻不下，周围10个整编师就会合围。

粟裕站在地图前凝视良久。这是一场赌博，赢了可沉重打击敌军士气，输了华东野战军可能遭重创。他说："74师是块硬骨头，但正因为它硬，打掉它才更有意义。"

陈毅问是否有把握短时间内吃掉它。粟裕坚定地说："74师被围在山上，重装备无法发挥。张灵甫与其他将领矛盾深，其他部队不会真心救援。集中绝对优势兵力，速战速决，完全可能吃掉它。"''',
                'decision': '是否冒险围歼敌军最精锐的整编74师？',
                'options': [
                    {
                        'text': '坚决围歼，打掉敌人最锋利的牙齿',
                        'effects': {'health': -10, 'military': 35, 'strategy': 30, 'politics': 15, 'morale': 25},
                        'result_text': '全歼整编74师！震撼国民党全军，扭转华东战局。毛主席高度评价："歼灭74师，有两个人没有想到，一个是蒋介石，第二个就是我毛泽东！"军事冒险取得巨大成功，华东战局转入战略进攻。'
                    },
                    {
                        'text': '打击其侧翼，避免硬拼',
                        'effects': {'health': 5, 'military': 20, 'strategy': 15, 'politics': 10, 'morale': 10},
                        'result_text': '取得一定战果，但未能改变战略态势。避开整编74师，打击其侧翼部队，取得一些胜利，但未能歼灭敌有生力量。74师完好无损，继续威胁根据地，华东战场形势依然严峻。'
                    },
                    {
                        'text': '避开强敌，寻找薄弱环节',
                        'effects': {'health': 10, 'military': 15, 'strategy': 10, 'politics': 5, 'morale': 5},
                        'result_text': '保存了实力，但错失歼敌良机。绕开整编74师，在运动中消灭一些国民党杂牌部队，取得小胜，但未能给敌决定性打击。74师这个心腹大患仍然存在，失去创造战争奇迹机会。'
                    }
                ]
            },
            {
                'year': 1948,
                'age': 41,
                'location': '淮海前线',
                'title': '淮海战役：战略决策',
                'description': '''1948年秋，全国战局根本变化，解放军转入战略进攻。在曲阜召开的华东野战军前委扩大会议上，两种意见激烈交锋。

一种主张先打济南，拔掉国民党军在山东最后一个据点；另一种主张南下徐州，与国民党军主力决战。粟裕经过反复思考，提出大胆设想。

他建议集中华东、中原两大野战军，在徐州附近与国民党军战略决战，一举歼灭其江北主力。这个设想太大胆：国民党军在徐州集结80万重兵，我军只有60万人。徐州是国民党军经营多年的战略要点。

在向中央军委的电报中，粟裕详细阐述："如果仅仅打下济南，国民党军主力尚存，还会卷土重来。不如利用我军连胜士气，集中优势兵力，在徐州地区打一个大歼灭战，一举解决江北问题。"

电报发出，心情忐忑。这个建议风险太大，如果中央不同意或战役失利，后果不堪设想。但作为军事指挥员，必须从战略全局出发，提出最有利于战争胜利的建议。''',
                'decision': '如何向中央建议战役规模？',
                'options': [
                    {
                        'text': '建议打"大淮海"，一举歼灭江北敌军主力',
                        'effects': {'health': 0, 'military': 30, 'strategy': 35, 'politics': 25, 'morale': 20},
                        'result_text': '中央采纳建议！淮海战役歼灭敌军55.5万人，奠定全国胜利基础。这是解放战争中规模最大、歼敌最多、影响最深远的战略决战。毛主席称赞："淮海战役，粟裕同志立了第一功。"战略远见得到全党全军高度评价。'
                    },
                    {
                        'text': '建议打"中淮海"，逐步消灭敌人',
                        'effects': {'health': 5, 'military': 20, 'strategy': 20, 'politics': 15, 'morale': 10},
                        'result_text': '取得一定胜利，但未能全歼敌军主力。淮海战役取得一些胜利，但未能实现战略决战目标。国民党军主力基本保存，退守长江防线。解放战争时间延长，人民承受更长时间战争苦难。'
                    },
                    {
                        'text': '建议打"小淮海"，稳扎稳打',
                        'effects': {'health': 10, 'military': 15, 'strategy': 15, 'politics': 10, 'morale': 5},
                        'result_text': '战果有限，延长了解放战争进程。淮海战役只取得战术性胜利，未能改变战略态势。国民党军仍然控制江北广大地区，与解放军形成对峙。解放战争进入相持阶段，胜负难料。'
                    }
                ]
            },
            {
                'year': 1955,
                'age': 48,
                'location': '北京中南海',
                'title': '授衔时刻：大将之首',
                'description': '''1955年9月27日，北京中南海怀仁堂，举行中国人民解放军首次授衔授勋典礼。粟裕穿着崭新55式将军礼服，站在授衔将领行列中。

看着眼前熟悉面孔，心潮起伏。这些人中有南昌起义老战友，三年游击战争老部下，黄桥、苏中、孟良崮、淮海战役的生死兄弟。一起走过最艰难岁月，一起创造战争奇迹。

听到"粟裕"名字，整理军装，迈着标准军人步伐走上主席台。周恩来总理亲自佩戴大将军衔肩章，毛主席颁发一级八一勋章、一级独立自由勋章、一级解放勋章。

沉甸甸的勋章挂在胸前，感受到的不只是荣誉，更是责任。这勋章属于千千万万为革命牺牲的战友。想起了南昌起义倒下的教导队战士，三年游击战争饿死的战友，各战役中牺牲的同志。

授衔仪式后，老战友前来祝贺。陈毅元帅握着我的手说："裕兄，你这个大将之首，当之无愧！"刘伯承元帅也说："粟裕同志百战百胜，是我们学习的榜样。"

但心里清楚，荣誉越高，责任越重。新中国成立后，工作重心从战场转向军事教育和国防建设。作为总参谋长，深知肩上担子有多重。''',
                'decision': '如何对待这份至高的荣誉？',
                'options': [
                    {
                        'text': '谦让元帅军衔，保持低调',
                        'effects': {'health': 10, 'military': 5, 'strategy': 10, 'politics': 30, 'morale': 15},
                        'result_text': '体现高风亮节，受到广泛尊敬。多次向中央表示资历尚浅，战功有限，不应授予元帅军衔。谦让在军内外传为美谈，展现了共产党员的高尚品德。在总参谋部岗位上勤奋工作，为国防现代化建设做出贡献。'
                    },
                    {
                        'text': '坦然接受，继续为军队建设贡献力量',
                        'effects': {'health': 5, 'military': 20, 'strategy': 15, 'politics': 20, 'morale': 20},
                        'result_text': '继续在军事科研和院校建设上做出重要贡献。接受大将军衔，视为党和人民的信任和重托。在总参谋长任上深入部队调研，总结作战经验，编写军事教材，培养军事人才，为国防现代化建设做出贡献。'
                    },
                    {
                        'text': '主动要求降低军衔，保持革命本色',
                        'effects': {'health': 15, 'military': 10, 'strategy': 5, 'politics': 25, 'morale': 10},
                        'result_text': '体现共产党员的谦逊品质，传为美谈。写信给中央军委，请求降低军衔，表示自己只是普通党员，不应享受这么高荣誉。请求虽未被批准，但这种谦虚谨慎态度赢得全军尊重。'
                    }
                ]
            }
        ]
   
    def display_event(self, event_index):
        if 0 <= event_index < len(self.events):
            event = self.events[event_index]
            self.current_event = event_index
            
            self.year = event['year']
            self.age = event['age']
            self.year_label.config(text=f"当前时间：{self.year}年 | 年龄：{self.age}岁")
            
            self.event_title.config(text=event['title'])
            self.event_time.config(text=f"地点：{event['location']}")
            
            self.event_text.config(state='normal')
            self.event_text.delete(1.0, tk.END)
            self.event_text.config(state='disabled')
            
            self.decision_text.config(state='normal')
            self.decision_text.delete(1.0, tk.END)
            self.decision_text.config(state='disabled')
            
            for widget in self.options_frame.winfo_children():
                widget.destroy()
            
            self.sound_manager.play_sound('page_turn')
            self.typewriter_effect(self.event_text, event['description'], 
                                  lambda: self.show_decision(event))
            
            self.prev_btn.config(state='normal' if event_index > 0 else 'disabled')
            self.main_btn.config(text="继续" if event_index < len(self.events)-1 else "查看总结")
            
            self.update_timeline()
            self.check_and_update_achievements()
    
    def show_decision(self, event):
        self.decision_text.config(state='normal')
        self.decision_text.delete(1.0, tk.END)
        self.decision_text.insert(1.0, event['decision'])
        self.decision_text.config(state='disabled')
        
        if event['options']:
            for i, option in enumerate(event['options']):
                btn = tk.Button(
                    self.options_frame,
                    text=f"选择 {i+1}: {option['text']}",
                    command=lambda opt=i: self.make_decision(opt),
                    font=self.fonts['text'],
                    bg=self.colors['button'],
                    fg=self.colors['fg'],
                    relief='flat',
                    padx=10,
                    pady=8,
                    anchor='w',
                    cursor='hand2'
                )
                btn.pack(fill='x', pady=(0, 8))
        else:
            self.main_btn.config(command=self.next_event)
    
    def make_decision(self, option_index):
        if self.is_typing:
            self.is_typing = False
            return
            
        event = self.events[self.current_event]
        option = event['options'][option_index]
        effects = option['effects']
        
        self.health = max(0, min(100, self.health + effects['health']))
        self.min_health = min(self.min_health, self.health)
        self.military_skill = max(0, min(100, self.military_skill + effects['military']))
        self.strategic_insight = max(0, min(100, self.strategic_insight + effects['strategy']))
        self.political_wisdom = max(0, min(100, self.political_wisdom + effects['politics']))
        self.morale = max(0, min(100, self.morale + effects['morale']))
        
        self.decisions_made += 1
        
        if '战斗' in event['title'] or '战役' in event['title']:
            if effects.get('morale', 0) > 0:
                self.battles_won += 1
        
        self.update_status()
        
        decision_record = f"{event['year']}年 - {event['title']}: {option['text'][:40]}..."
        self.decisions.append(decision_record)
        
        self.check_and_update_achievements()
        
        if effects.get('morale', 0) > 0:
            self.sound_manager.play_sound('decision')
        else:
            self.sound_manager.play_sound('defeat')
        
        messagebox.showinfo("决策结果", option['result_text'])
        self.next_event()
    
    def update_status(self):
        abilities = [
            (self.health_bar, self.health_label, self.health, "#ff4444"),
            (self.military_bar, self.military_label, self.military_skill, self.colors['accent']),
            (self.strategy_bar, self.strategy_label, self.strategic_insight, "#4169e1"),
            (self.politics_bar, self.politics_label, self.political_wisdom, "#32cd32"),
            (self.morale_bar, self.morale_label, self.morale, "#ffd700")
        ]
        
        for bar_canvas, value_label, value, color in abilities:
            bar_canvas.delete("all")
            bar_width = int(150 * value / 100)
            bar_canvas.create_rectangle(0, 0, bar_width, 20, fill=color, outline='')
            value_label.config(text=f"{value}/100")
        
        self.update_timeline()
    
    def update_timeline(self):
        for widget in self.timeline_inner.winfo_children():
            widget.destroy()
        
        for i, event in enumerate(self.events):
            item_frame = tk.Frame(
                self.timeline_inner,
                bg=self.colors['text_bg']
            )
            item_frame.pack(fill='x', padx=5, pady=2)
            
            if i == self.current_event:
                item_frame.config(bg=self.colors['accent'])
                text_color = 'white'
            elif i < self.current_event:
                item_frame.config(bg=self.colors['highlight'])
                text_color = 'white'
            else:
                text_color = self.colors['fg']
            
            tk.Label(
                item_frame,
                text=f"● {event['year']}年",
                font=("Microsoft YaHei", 10, "bold"),
                fg=text_color,
                bg=item_frame.cget('bg'),
                width=8
            ).pack(side='left', padx=(10, 5))
            
            tk.Label(
                item_frame,
                text=event['title'],
                font=("Microsoft YaHei", 9),
                fg=text_color,
                bg=item_frame.cget('bg'),
                anchor='w'
            ).pack(side='left', fill='x', expand=True)
    
    def update_achievements_display(self):
        for widget in self.achievement_inner.winfo_children():
            widget.destroy()
        
        achievements = self.achievement_system.get_all_achievements()
        
        for achievement_id, achievement in achievements.items():
            frame = tk.Frame(
                self.achievement_inner,
                bg=self.colors['achievement_bg'] if not achievement['unlocked'] else self.colors['highlight']
            )
            frame.pack(fill='x', padx=2, pady=2)
            
            icon = "✓" if achievement['unlocked'] else "○"
            icon_label = tk.Label(
                frame,
                text=icon,
                font=("Microsoft YaHei", 10, "bold"),
                fg=self.colors['achievement'] if achievement['unlocked'] else self.colors['fg'],
                bg=frame.cget('bg')
            )
            icon_label.pack(side='left', padx=(5, 10))
            
            tk.Label(
                frame,
                text=achievement['name'],
                font=("Microsoft YaHei", 8, "bold"),
                fg=self.colors['achievement'] if achievement['unlocked'] else self.colors['fg'],
                bg=frame.cget('bg'),
                anchor='w'
            ).pack(side='left', fill='x', expand=True)
        
        count = self.achievement_system.get_achievement_count()
        self.achievement_count_label.config(text=f"成就：{count}/8")
    
    def check_and_update_achievements(self):
        stats = {
            'decisions_made': self.decisions_made,
            'battles_won': self.battles_won,
            'strategic_insight': self.strategic_insight,
            'military_skill': self.military_skill,
            'political_wisdom': self.political_wisdom,
            'morale': self.morale,
            'min_health': self.min_health
        }
        
        unlocked = self.achievement_system.check_achievements(
            stats, 
            self.current_event, 
            len(self.events)
        )
        
        if unlocked:
            self.update_achievements_display()
            self.show_achievement_notification(unlocked)
    
    def show_achievement_notification(self, unlocked_ids):
        for achievement_id in unlocked_ids:
            achievement = self.achievement_system.achievements[achievement_id]
            
            notification = tk.Toplevel(self.root)
            notification.title("成就解锁！")
            notification.geometry("300x150")
            notification.configure(bg=self.colors['achievement_bg'])
            notification.overrideredirect(True)
            
            x = self.root.winfo_x() + (self.root.winfo_width() - 300) // 2
            y = self.root.winfo_y() + 50
            notification.geometry(f"300x150+{x}+{y}")
            
            tk.Label(
                notification,
                text="🏆",
                font=("Microsoft YaHei", 24),
                fg=self.colors['achievement'],
                bg=self.colors['achievement_bg']
            ).pack(pady=(20, 5))
            
            tk.Label(
                notification,
                text=achievement['name'],
                font=("Microsoft YaHei", 12, "bold"),
                fg=self.colors['achievement'],
                bg=self.colors['achievement_bg']
            ).pack()
            
            notification.after(3000, notification.destroy)
    
    def typewriter_effect(self, widget, text, callback=None):
        if self.is_typing:
            return
            
        self.is_typing = True
        widget.config(state='normal')
        widget.delete(1.0, tk.END)
        
        def type_next_char(index=0):
            if index < len(text) and self.is_typing:
                char = text[index]
                widget.insert(tk.END, char)
                widget.see(tk.END)
                
                if char not in [' ', '\n', '\t'] and index % 3 == 0:
                    self.sound_manager.play_sound('typewriter')
                
                delay = self.typewriter_speed
                if char in ['。', '！', '？', '，']:
                    delay = self.typewriter_speed * 2
                elif char in ['\n']:
                    delay = self.typewriter_speed * 1.5
                
                self.root.after(int(delay * 1000), lambda: type_next_char(index + 1))
            else:
                widget.config(state='disabled')
                self.is_typing = False
                if callback:
                    self.root.after(100, callback)
        
        threading.Thread(target=lambda: self.root.after(0, lambda: type_next_char(0)), daemon=True).start()
    
    def next_event(self):
        if self.current_event < len(self.events) - 1:
            self.current_event += 1
            self.display_event(self.current_event)
        else:
            self.show_summary()
    
    def prev_event(self):
        if self.current_event > 0:
            self.current_event -= 1
            self.display_event(self.current_event)
    
    def reset_game(self):
        if messagebox.askyesno("重新开始", "确定要重新开始吗？"):
            self.current_event = 0
            self.health = 100
            self.min_health = 100
            self.military_skill = 0
            self.strategic_insight = 0
            self.political_wisdom = 0
            self.morale = 50
            self.decisions = []
            self.decisions_made = 0
            self.battles_won = 0
            
            self.achievement_system = AchievementSystem()
            
            self.update_status()
            self.update_achievements_display()
            self.display_event(self.current_event)
    
    def show_history(self):
        if not self.decisions:
            messagebox.showinfo("决策历史", "您尚未做出任何重大决策。")
            return
        
        history_window = tk.Toplevel(self.root)
        history_window.title("决策历史记录")
        history_window.geometry("600x500")
        history_window.configure(bg=self.colors['bg'])
        
        tk.Label(
            history_window,
            text="📜 您的决策历史",
            font=self.fonts['subtitle'],
            fg=self.colors['accent'],
            bg=self.colors['bg']
        ).pack(pady=(20, 10))
        
        history_text = scrolledtext.ScrolledText(
            history_window,
            wrap='word',
            font=self.fonts['text'],
            bg=self.colors['text_bg'],
            fg=self.colors['fg']
        )
        history_text.pack(fill='both', expand=True, padx=20, pady=10)
        
        for i, decision in enumerate(self.decisions, 1):
            history_text.insert(tk.END, f"{i}. {decision}\n\n")
        
        history_text.config(state='disabled')
    
    def show_achievements(self):
        achievements_window = tk.Toplevel(self.root)
        achievements_window.title("成就系统详情")
        achievements_window.geometry("500x400")
        achievements_window.configure(bg=self.colors['bg'])
        
        tk.Label(
            achievements_window,
            text="🏆 成就系统",
            font=self.fonts['title'],
            fg=self.colors['achievement'],
            bg=self.colors['bg']
        ).pack(pady=(20, 10))
        
        count = self.achievement_system.get_achievement_count()
        total = len(self.achievement_system.achievements)
        tk.Label(
            achievements_window,
            text=f"已解锁：{count}/{total}",
            font=self.fonts['subtitle'],
            fg=self.colors['fg'],
            bg=self.colors['bg']
        ).pack(pady=(0, 20))
        
        canvas_frame = tk.Frame(achievements_window, bg=self.colors['bg'])
        canvas_frame.pack(fill='both', expand=True, padx=20, pady=10)
        
        scrollbar = ttk.Scrollbar(canvas_frame)
        scrollbar.pack(side='right', fill='y')
        
        canvas = tk.Canvas(
            canvas_frame,
            bg=self.colors['text_bg'],
            yscrollcommand=scrollbar.set,
            highlightthickness=0
        )
        canvas.pack(side='left', fill='both', expand=True)
        
        scrollbar.config(command=canvas.yview)
        
        inner_frame = tk.Frame(canvas, bg=self.colors['text_bg'])
        canvas.create_window((0, 0), window=inner_frame, anchor='nw')
        
        achievements = self.achievement_system.get_all_achievements()
        for achievement_id, achievement in achievements.items():
            frame = tk.Frame(
                inner_frame,
                bg=self.colors['achievement_bg'] if not achievement['unlocked'] else self.colors['highlight']
            )
            frame.pack(fill='x', padx=5, pady=5)
            
            icon = "✅" if achievement['unlocked'] else "⭕"
            tk.Label(
                frame,
                text=icon,
                font=("Microsoft YaHei", 12, "bold"),
                fg=self.colors['achievement'] if achievement['unlocked'] else self.colors['fg'],
                bg=frame.cget('bg')
            ).pack(side='left', padx=(10, 15))
            
            tk.Label(
                frame,
                text=achievement['name'],
                font=("Microsoft YaHei", 11, "bold"),
                fg=self.colors['achievement'] if achievement['unlocked'] else self.colors['fg'],
                bg=frame.cget('bg'),
                anchor='w'
            ).pack(side='left', padx=(0, 10))
            
            tk.Label(
                frame,
                text=achievement['desc'],
                font=("Microsoft YaHei", 9),
                fg=self.colors['fg'],
                bg=frame.cget('bg'),
                anchor='w'
            ).pack(side='left')
        
        canvas.configure(scrollregion=canvas.bbox("all"))
    
    def toggle_sound(self):
        self.sound_manager.toggle()
        if self.sound_manager.enabled:
            self.sound_btn.config(text="🔊 音效：开")
        else:
            self.sound_btn.config(text="🔇 音效：关")
    
    def show_summary(self):
        total_score = (self.health + self.military_skill + 
                      self.strategic_insight + self.political_wisdom + self.morale)
        
        if total_score >= 400:
            evaluation = "🎖️ 一代军神"
            detail = "您展现了卓越的军事才能和战略眼光！与历史上的粟裕大将一样，您用兵如神，智勇双全。"
        elif total_score >= 350:
            evaluation = "🎖️ 杰出统帅"
            detail = "您是一位杰出的军事统帅！展现出了非凡的军事天赋和战略眼光。"
        elif total_score >= 300:
            evaluation = "⭐ 优秀将领"
            detail = "您是一位优秀的军事将领！在多数战役中做出了明智的选择。"
        elif total_score >= 250:
            evaluation = "⭐ 合格指挥员"
            detail = "您是一位合格的军事指挥员。完成了自己的职责，在战争中积累了一定的经验。"
        else:
            evaluation = "📉 普通军人"
            detail = "您是一位普通的革命军人。在历史的洪流中做出了自己的选择。"
        
        messagebox.showinfo("人生总结评价", f"{evaluation}\n\n{detail}\n\n总得分：{total_score}/500")
    
    def skip_typing(self):
        self.is_typing = False
    
    def update_speed(self, value):
        self.typewriter_speed = float(value)

def main():
    root = tk.Tk()
    app = SuYuLifeGUI(root)
    root.mainloop()

if __name__ == "__main__":
    main()