mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-15 08:32:41 +00:00
Add Misty & Arina NPCs, fix tier gating, babysit actions, Robbie filter, streak/scheduler bugs
Misty & Arina: random encounter NPCs triggered by chat message counting (5-10 msg threshold, 7-day cooldown, 7.5% roll). Misty asks for €100 — accept gives 7-day arena buff (20% gourmet food heals gear + 5 enemy dmg), decline gives 7-day debuff (20% crowd revenge damage). Arina asks for €5000 — accept gives 7-day sniper buff (8% instant kill in arena). Effects integrate into arena round resolution after combat roll; sniper overrides death. Other fixes: - Tier gating now uses base skill only — buffs improve success, not access - Babysitter uses all harvest actions (3/day, 4 on holidays) instead of 1 - Robbie collects all non-equipped items, not just slotted gear - Robbie timing: fire on first tick >= target hour, not exact minute match - Streak: dead players who acted still get streak credit - Streak: dead players skip shame DM (use LastDeathDate, not Alive flag) - Midnight ticker: in-memory date cache prevents 1439 wasted DB checks/day - T1 loot values ~3x across all activities to close T1/T2 gap Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -277,15 +277,18 @@ func (p *AdventurePlugin) midnightTicker() {
|
||||
ticker := time.NewTicker(1 * time.Minute)
|
||||
defer ticker.Stop()
|
||||
|
||||
lastRanDate := ""
|
||||
|
||||
for range ticker.C {
|
||||
now := time.Now().UTC()
|
||||
if now.Hour() != 0 || now.Minute() != 0 {
|
||||
dateKey := time.Now().UTC().Format("2006-01-02")
|
||||
if dateKey == lastRanDate {
|
||||
continue
|
||||
}
|
||||
|
||||
dateKey := now.Format("2006-01-02")
|
||||
// New UTC day — check DB in case we already ran (e.g. bot restart).
|
||||
jobName := "adventure_midnight"
|
||||
if db.JobCompleted(jobName, dateKey) {
|
||||
lastRanDate = dateKey
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -295,6 +298,7 @@ func (p *AdventurePlugin) midnightTicker() {
|
||||
continue
|
||||
}
|
||||
db.MarkJobCompleted(jobName, dateKey)
|
||||
lastRanDate = dateKey
|
||||
}
|
||||
}
|
||||
|
||||
@@ -309,14 +313,11 @@ func (p *AdventurePlugin) midnightReset() error {
|
||||
|
||||
dmsSent := 0
|
||||
for _, char := range chars {
|
||||
// Dead players freeze their streak — death is involuntary, don't punish it.
|
||||
if !char.Alive {
|
||||
continue
|
||||
}
|
||||
|
||||
if !char.HasActedToday() {
|
||||
// If the player died today (or yesterday — covering late-night deaths
|
||||
// that span midnight), grant a grace period: no shame, no streak reset.
|
||||
// If the player died today or yesterday, they couldn't act — no shame,
|
||||
// no streak reset. This covers both currently-dead players and players
|
||||
// who were just revived at midnight (Alive already flipped to true by
|
||||
// the reminder loop before midnightReset runs).
|
||||
if char.LastDeathDate == today ||
|
||||
char.LastDeathDate == time.Now().UTC().Add(-24*time.Hour).Format("2006-01-02") {
|
||||
continue
|
||||
@@ -374,6 +375,9 @@ func (p *AdventurePlugin) midnightReset() error {
|
||||
slog.Error("adventure: failed to prune expired buffs", "err", err)
|
||||
}
|
||||
|
||||
// Reset NPC message counts and regenerate roll targets
|
||||
npcMidnightReset()
|
||||
|
||||
// Clear flavor history to prevent unbounded memory growth.
|
||||
// Entries are only used for dedup within a day, so clearing at midnight is fine.
|
||||
advClearFlavorHistory()
|
||||
|
||||
Reference in New Issue
Block a user