107 lines
2.5 KiB
Go
107 lines
2.5 KiB
Go
package game
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"time"
|
|
)
|
|
|
|
type CardDef struct {
|
|
TypeID string
|
|
Name string
|
|
MP int
|
|
Priority int
|
|
Count int
|
|
Unusable bool
|
|
}
|
|
|
|
type Card struct {
|
|
UID string
|
|
TypeID string
|
|
Name string
|
|
MP int
|
|
PlacedBy string
|
|
PlacedByNick string
|
|
}
|
|
|
|
var AllCardDefs = []CardDef{
|
|
{"student_council_president", "学生会长", 3, 4, 1, false},
|
|
{"class_monitor", "班长", 2, 4, 2, false},
|
|
{"honor_student", "优等生", 2, 4, 3, false},
|
|
{"discipline_committee_member", "风纪委员", 1, 4, 2, false},
|
|
{"library_committee_member", "图书委员", 1, 4, 3, false},
|
|
{"health_committee_member", "保健委员", 1, 4, 2, false},
|
|
{"young_lady", "大小姐", 1, 4, 3, false},
|
|
{"newspaper_club", "新闻部", 1, 4, 3, false},
|
|
{"go_home_club", "归宅部", 0, 5, 3, false},
|
|
{"infected_person", "感染者", 0, 2, 1, false},
|
|
{"accomplice", "共犯", 0, 3, 1, false},
|
|
{"culprit", "犯人", 0, 3, 1, true},
|
|
{"alien", "外星人", -1, 1, 1, false},
|
|
}
|
|
|
|
type RemoveRule struct {
|
|
TypeID string
|
|
Count int
|
|
}
|
|
|
|
type GameSetting struct {
|
|
PlayerCount int
|
|
HarmonyTarget int
|
|
RemoveCards []RemoveRule
|
|
TotalCards int
|
|
HandSize int
|
|
}
|
|
|
|
var GameSettings = map[int]GameSetting{
|
|
3: {3, 9, []RemoveRule{
|
|
{"library_committee_member", 1}, {"accomplice", 1}, {"honor_student", 1},
|
|
{"discipline_committee_member", 1}, {"young_lady", 1}, {"newspaper_club", 1}, {"go_home_club", 1},
|
|
}, 18, 6},
|
|
4: {4, 8, []RemoveRule{{"library_committee_member", 1}}, 24, 6},
|
|
5: {5, 7, nil, 25, 5},
|
|
6: {6, 6, []RemoveRule{{"library_committee_member", 1}}, 24, 4},
|
|
}
|
|
|
|
func BuildDeck(playerCount int) ([]*Card, GameSetting) {
|
|
setting := GameSettings[playerCount]
|
|
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
|
|
removeCount := make(map[string]int)
|
|
for _, r := range setting.RemoveCards {
|
|
removeCount[r.TypeID] += r.Count
|
|
}
|
|
|
|
var deck []*Card
|
|
uid := 0
|
|
for _, def := range AllCardDefs {
|
|
toRemove := removeCount[def.TypeID]
|
|
toAdd := def.Count - toRemove
|
|
for i := 0; i < toAdd; i++ {
|
|
uid++
|
|
deck = append(deck, &Card{
|
|
UID: fmt.Sprintf("c_%03d", uid),
|
|
TypeID: def.TypeID,
|
|
Name: def.Name,
|
|
MP: def.MP,
|
|
})
|
|
}
|
|
}
|
|
|
|
rng.Shuffle(len(deck), func(i, j int) { deck[i], deck[j] = deck[j], deck[i] })
|
|
return deck, setting
|
|
}
|
|
|
|
func IsUnusable(typeID string) bool {
|
|
return typeID == "culprit"
|
|
}
|
|
|
|
func GetCardDef(typeID string) *CardDef {
|
|
for i := range AllCardDefs {
|
|
if AllCardDefs[i].TypeID == typeID {
|
|
return &AllCardDefs[i]
|
|
}
|
|
}
|
|
return nil
|
|
}
|