refactorinnng
parent
c18f154328
commit
d7e4196f61
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue