refactorinnng

main
Bel LaPointe 2024-12-15 09:44:13 -07:00
parent c18f154328
commit d7e4196f61
1 changed files with 72 additions and 38 deletions

View File

@ -356,7 +356,6 @@ func (games Games) CreateEventAssignmentRotation(ctx context.Context, id string,
if err != nil { if err != nil {
return err return err
} }
now := time.Now()
event := EventAssignmentRotation{ event := EventAssignmentRotation{
Type: AssignmentRotation, Type: AssignmentRotation,
@ -369,15 +368,23 @@ func (games Games) CreateEventAssignmentRotation(ctx context.Context, id string,
AllKillWords: make(AllKillWords), AllKillWords: make(AllKillWords),
} }
toAssign := []string{} prevAllKillWords := make(AllKillWords)
doNotAssign := map[string]string{}
for k, v := range state.Players { for k, v := range state.Players {
v := v.KillWords prevAllKillWords[k] = v.KillWords
toAssign = append(toAssign, k) }
doNotAssign[k] = v.Assignee
event.AllKillWords[k] = KillWords{ event.AllKillWords.ShuffleAssignees(prevAllKillWords, killer, victim, word)
event.AllKillWords.FillKillWords()
return games.createEvent(ctx, id, event)
}
func (m AllKillWords) ShuffleAssignees(prev AllKillWords, killer, victim, word string) {
now := time.Now()
for k, v := range prev {
m[k] = KillWords{
Global: v.Global, Global: v.Global,
Assigned: now, Assigned: now,
Assignee: "", Assignee: "",
@ -385,72 +392,99 @@ func (games Games) CreateEventAssignmentRotation(ctx context.Context, id string,
} }
} }
if killerState, ok := state.Players[killer]; !ok { if killerState, ok := prev[killer]; !ok {
} else if victimState, ok := state.Players[victim]; !ok { } else if victimState, ok := prev[victim]; !ok {
} else { } else {
event.AllKillWords[killer] = KillWords{ m[killer] = KillWords{
Global: killerState.KillWords.Global, Global: killerState.Global,
Assigned: now, Assigned: now,
Assignee: victimState.KillWords.Assignee, Assignee: victimState.Assignee,
Assignment: killerState.KillWords.Assignment, Assignment: killerState.Assignment,
} }
toAssign = slices.DeleteFunc(toAssign, func(s string) bool { return s == event.AllKillWords[killer].Assignee })
if killerState.KillWords.Global.Word != word { if killerState.Global.Word != word {
victimState.KillWords.Assignment = Assignment{} victimState.Assignment = Assignment{}
state.Players[victim] = victimState prev[victim] = victimState
} }
} }
for !func() bool { for !func() bool {
toAssign := slices.Clone(toAssign) allKillWords := maps.Clone(m)
doNotAssign := maps.Clone(doNotAssign) unassigned := allKillWords.unassigned()
allKillWords := maps.Clone(event.AllKillWords) pop := func() string {
result := unassigned[0]
for i := range toAssign { unassigned = unassigned[1:]
j := rand.Intn(i + 1) return result
toAssign[i], toAssign[j] = toAssign[j], toAssign[i]
} }
for k, v := range allKillWords { for k, v := range allKillWords {
if k == toAssign[0] || doNotAssign[k] == toAssign[0] { assignee := pop()
if k == assignee || prev[k].Assignee == assignee {
return false return false
} }
allKillWords[k] = KillWords{ allKillWords[k] = KillWords{
Global: v.Global, Global: v.Global,
Assigned: now, Assigned: now,
Assignee: toAssign[0], Assignee: assignee,
Assignment: v.Assignment, Assignment: v.Assignment,
} }
toAssign = toAssign[1:]
} }
event.AllKillWords = allKillWords for k, v := range allKillWords {
m[k] = v
}
return true return true
}() { }() {
} }
}
for k, v := range event.AllKillWords { func (m AllKillWords) unassigned() []string {
var result []string
for k := range m {
if !slices.Contains(m.assigned(), k) {
result = append(result, k)
}
}
for i := range result {
j := rand.Intn(i + 1)
result[i], result[j] = result[j], result[i]
}
return result
}
func (m AllKillWords) assigned() []string {
var result []string
for k := range m {
v := m[k].Assignee
if v == "" {
continue
}
result = append(result, v)
}
return result
}
func (m AllKillWords) FillKillWords() {
for k, v := range m {
if v.Global.Word == "" { if v.Global.Word == "" {
v.Global = KillWord{Word: event.AllKillWords.unusedGlobal(), Points: -1} v.Global = KillWord{Word: m.unusedGlobal(), Points: -1}
event.AllKillWords[k] = v m[k] = v
} }
if len(v.Assignment.Public) == 0 { if len(v.Assignment.Public) == 0 {
v.Assignment.Public = []KillWord{} v.Assignment.Public = []KillWord{}
for i := 0; i < 2; i++ { for i := 0; i < 2; i++ {
v.Assignment.Public = append(v.Assignment.Public, KillWord{Word: event.AllKillWords.unusedPublic(), Points: 50}) v.Assignment.Public = append(v.Assignment.Public, KillWord{Word: m.unusedPublic(), Points: 50})
event.AllKillWords[k] = v m[k] = v
} }
} }
if len(v.Assignment.Private) == 0 { if len(v.Assignment.Private) == 0 {
v.Assignment.Private = []KillWord{} v.Assignment.Private = []KillWord{}
for i := 0; i < 2; i++ { for i := 0; i < 2; i++ {
v.Assignment.Private = append(v.Assignment.Private, KillWord{Word: event.AllKillWords.unusedPrivate(), Points: 100}) v.Assignment.Private = append(v.Assignment.Private, KillWord{Word: m.unusedPrivate(), Points: 100})
event.AllKillWords[k] = v m[k] = v
} }
} }
} }
return games.createEvent(ctx, id, event)
} }
//go:embed holiday.txt //go:embed holiday.txt