feat(skills): add skill gains and level up tracking
- 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.
This commit is contained in:
parent
e3f3a595fb
commit
555bea7c33
|
|
@ -82,20 +82,30 @@ class LogWatcher:
|
||||||
)
|
)
|
||||||
|
|
||||||
# SKILL GAIN PATTERNS
|
# 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"
|
# Swedish: "Du har fått 0.3238 erfarenhet i din Translocation färdighet"
|
||||||
PATTERN_SKILL_EN = re.compile(
|
PATTERN_SKILL_EN = 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'You\s+gained\s+(\d+(?:\.\d+)?)\s+experience\s+in\s+your\s+([\w\s]+?)\s+skill',
|
r'You\s+(?:have\s+)?gained\s+(\d+(?:\.\d+)?)\s+experience\s+in\s+your\s+([\w\s]+?)\s+skill',
|
||||||
re.IGNORECASE
|
re.IGNORECASE
|
||||||
)
|
)
|
||||||
|
|
||||||
PATTERN_SKILL_SV = re.compile(
|
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',
|
r'Du\s+har\s+fått\s+(\d+(?:\.\d+)?)\s+erfarenhet\s+i\s+din\s+([\w\s]+?)\s+färdighet',
|
||||||
re.IGNORECASE
|
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
|
# DAMAGE DEALT - Swedish & English
|
||||||
# Swedish: "Du orsakade 13.5 poäng skada"
|
# Swedish: "Du orsakade 13.5 poäng skada"
|
||||||
# English: "You inflicted 4.4 points of damage"
|
# 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
|
# DAMAGE DEALT - Swedish
|
||||||
match = self.PATTERN_DAMAGE_DEALT_SV.match(line)
|
match = self.PATTERN_DAMAGE_DEALT_SV.match(line)
|
||||||
if match:
|
if match:
|
||||||
|
|
|
||||||
8
main.py
8
main.py
|
|
@ -207,7 +207,7 @@ class LemontropiaApp:
|
||||||
logger.info(f"Using REAL log: {log_path}")
|
logger.info(f"Using REAL log: {log_path}")
|
||||||
|
|
||||||
# Stats tracking
|
# 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):
|
def on_event(event):
|
||||||
"""Handle log events."""
|
"""Handle log events."""
|
||||||
|
|
@ -236,6 +236,10 @@ class LemontropiaApp:
|
||||||
stats['skills'] += 1
|
stats['skills'] += 1
|
||||||
print(f" 📈 Skill: {event.data.get('skill_name')} +{event.data.get('gained')}")
|
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':
|
elif event.event_type == 'damage_dealt':
|
||||||
stats['damage_dealt'] += 1
|
stats['damage_dealt'] += 1
|
||||||
print(f" 💥 Damage Dealt: {event.data.get('damage')} pts")
|
print(f" 💥 Damage Dealt: {event.data.get('damage')} pts")
|
||||||
|
|
@ -253,6 +257,7 @@ class LemontropiaApp:
|
||||||
self.watcher.subscribe('global', on_event)
|
self.watcher.subscribe('global', on_event)
|
||||||
self.watcher.subscribe('hof', on_event)
|
self.watcher.subscribe('hof', on_event)
|
||||||
self.watcher.subscribe('skill', 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_dealt', on_event)
|
||||||
self.watcher.subscribe('damage_taken', on_event)
|
self.watcher.subscribe('damage_taken', on_event)
|
||||||
self.watcher.subscribe('evade', on_event)
|
self.watcher.subscribe('evade', on_event)
|
||||||
|
|
@ -286,6 +291,7 @@ class LemontropiaApp:
|
||||||
print(f" Globals: {stats['globals']}")
|
print(f" Globals: {stats['globals']}")
|
||||||
print(f" HoFs: {stats['hofs']}")
|
print(f" HoFs: {stats['hofs']}")
|
||||||
print(f" Skills: {stats['skills']}")
|
print(f" Skills: {stats['skills']}")
|
||||||
|
print(f" Level Ups: {stats['level_ups']}")
|
||||||
print(f" Damage Dealt: {stats['damage_dealt']}")
|
print(f" Damage Dealt: {stats['damage_dealt']}")
|
||||||
print(f" Damage Taken: {stats['damage_taken']}")
|
print(f" Damage Taken: {stats['damage_taken']}")
|
||||||
print(f" Evades/Misses: {stats['evades']}")
|
print(f" Evades/Misses: {stats['evades']}")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue