feat(companion): add personality, relationship, and mood engines
This commit is contained in:
79
internal/companion/mood.go
Normal file
79
internal/companion/mood.go
Normal file
@@ -0,0 +1,79 @@
|
||||
package companion
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"git.db123.ir/db123/divacode/pkg/types"
|
||||
)
|
||||
|
||||
type MoodEngine struct {
|
||||
mu sync.Mutex
|
||||
current types.Mood
|
||||
updatedAt time.Time
|
||||
energy float64
|
||||
}
|
||||
|
||||
func NewMoodEngine() *MoodEngine {
|
||||
return &MoodEngine{
|
||||
current: types.MoodNeutral,
|
||||
updatedAt: time.Now(),
|
||||
energy: 1.0,
|
||||
}
|
||||
}
|
||||
|
||||
func (m *MoodEngine) Current() types.Mood {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
return m.current
|
||||
}
|
||||
|
||||
func (m *MoodEngine) Set(mood types.Mood) {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
m.current = mood
|
||||
m.updatedAt = time.Now()
|
||||
}
|
||||
|
||||
func (m *MoodEngine) DeriveFromInteraction(success bool, topicIntensity float64) types.Mood {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
|
||||
m.energy -= 0.05
|
||||
if m.energy < 0 {
|
||||
m.energy = 0
|
||||
}
|
||||
|
||||
if !success {
|
||||
m.current = types.MoodAnnoyed
|
||||
} else if topicIntensity > 0.7 {
|
||||
if rand.Float64() > 0.5 {
|
||||
m.current = types.MoodCurious
|
||||
} else {
|
||||
m.current = types.MoodPlayful
|
||||
}
|
||||
} else if m.energy < 0.3 {
|
||||
m.current = types.MoodTired
|
||||
} else {
|
||||
m.current = types.MoodNeutral
|
||||
}
|
||||
|
||||
m.updatedAt = time.Now()
|
||||
return m.current
|
||||
}
|
||||
|
||||
func (m *MoodEngine) Recharge() {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
m.energy += 0.1
|
||||
if m.energy > 1.0 {
|
||||
m.energy = 1.0
|
||||
}
|
||||
}
|
||||
|
||||
func (m *MoodEngine) Energy() float64 {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
return m.energy
|
||||
}
|
||||
Reference in New Issue
Block a user