From 555bea7c330213edf91939986448f44a7896d97d Mon Sep 17 00:00:00 2001 From: LemonNexus Date: Sun, 8 Feb 2026 18:11:33 +0000 Subject: [PATCH] feat(skills): add skill gains and level up tracking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix skill pattern: 'You have gained' (not just 'You gained') - Add level_up pattern: 'You have advanced to level X in Skill' - Track skill experience gains in real-time - Display 🎉 LEVEL UP notifications - Include level_ups in session summary - Add level_up event subscription Skill progression now tracked alongside combat and loot events. --- core/log_watcher.py | 32 ++++++++++++++++++++++++++++---- main.py | 8 +++++++- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/core/log_watcher.py b/core/log_watcher.py index 1d8171c..432ad3c 100644 --- a/core/log_watcher.py +++ b/core/log_watcher.py @@ -82,20 +82,30 @@ class LogWatcher: ) # SKILL GAIN PATTERNS - # English: "You gained 0.45 experience in your Rifle skill" + # English: "You have gained 1.1466 experience in your Whip skill" + # English (alt): "You gained 0.45 experience in your Rifle skill" # Swedish: "Du har fått 0.3238 erfarenhet i din Translocation färdighet" PATTERN_SKILL_EN = re.compile( - r'^(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})\s+\[System\]\s+' - r'You\s+gained\s+(\d+(?:\.\d+)?)\s+experience\s+in\s+your\s+([\w\s]+?)\s+skill', + r'^(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})\s+\[System\]\s+\[?\]?\s*' + r'You\s+(?:have\s+)?gained\s+(\d+(?:\.\d+)?)\s+experience\s+in\s+your\s+([\w\s]+?)\s+skill', re.IGNORECASE ) PATTERN_SKILL_SV = re.compile( - r'^(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})\s+\[System\]\s+' + r'^(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})\s+\[System\]\s+\[?\]?\s*' r'Du\s+har\s+fått\s+(\d+(?:\.\d+)?)\s+erfarenhet\s+i\s+din\s+([\w\s]+?)\s+färdighet', re.IGNORECASE ) + # SKILL LEVEL UP + # English: "You have advanced to level 45 in Rifle" + # Swedish: "Du har avancerat till nivå 45 i Rifle" + PATTERN_LEVEL_UP_EN = re.compile( + r'^(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})\s+\[System\]\s+\[?\]?\s*' + r'You\s+have\s+advanced\s+to\s+level\s+(\d+)\s+in\s+([\w\s]+)', + re.IGNORECASE + ) + # DAMAGE DEALT - Swedish & English # Swedish: "Du orsakade 13.5 poäng skada" # English: "You inflicted 4.4 points of damage" @@ -356,6 +366,20 @@ class LogWatcher: } ) + # LEVEL UP - English + match = self.PATTERN_LEVEL_UP_EN.match(line) + if match: + return LogEvent( + timestamp=self._parse_timestamp(match.group(1)), + event_type='level_up', + raw_line=line, + data={ + 'new_level': int(match.group(2)), + 'skill_name': match.group(3).strip(), + 'language': 'english' + } + ) + # DAMAGE DEALT - Swedish match = self.PATTERN_DAMAGE_DEALT_SV.match(line) if match: diff --git a/main.py b/main.py index 4f085b9..3b1b59b 100644 --- a/main.py +++ b/main.py @@ -207,7 +207,7 @@ class LemontropiaApp: logger.info(f"Using REAL log: {log_path}") # Stats tracking - stats = {'loot': 0, 'globals': 0, 'hofs': 0, 'skills': 0, 'damage_dealt': 0, 'damage_taken': 0, 'evades': 0, 'total_ped': Decimal('0.0')} + stats = {'loot': 0, 'globals': 0, 'hofs': 0, 'skills': 0, 'level_ups': 0, 'damage_dealt': 0, 'damage_taken': 0, 'evades': 0, 'total_ped': Decimal('0.0')} def on_event(event): """Handle log events.""" @@ -236,6 +236,10 @@ class LemontropiaApp: stats['skills'] += 1 print(f" 📈 Skill: {event.data.get('skill_name')} +{event.data.get('gained')}") + elif event.event_type == 'level_up': + stats['level_ups'] += 1 + print(f" 🎉 LEVEL UP: {event.data.get('skill_name')} reached level {event.data.get('new_level')}!") + elif event.event_type == 'damage_dealt': stats['damage_dealt'] += 1 print(f" 💥 Damage Dealt: {event.data.get('damage')} pts") @@ -253,6 +257,7 @@ class LemontropiaApp: self.watcher.subscribe('global', on_event) self.watcher.subscribe('hof', on_event) self.watcher.subscribe('skill', on_event) + self.watcher.subscribe('level_up', on_event) self.watcher.subscribe('damage_dealt', on_event) self.watcher.subscribe('damage_taken', on_event) self.watcher.subscribe('evade', on_event) @@ -286,6 +291,7 @@ class LemontropiaApp: print(f" Globals: {stats['globals']}") print(f" HoFs: {stats['hofs']}") print(f" Skills: {stats['skills']}") + print(f" Level Ups: {stats['level_ups']}") print(f" Damage Dealt: {stats['damage_dealt']}") print(f" Damage Taken: {stats['damage_taken']}") print(f" Evades/Misses: {stats['evades']}")