完善了Web管理端
This commit is contained in:
+40
-1
@@ -11,6 +11,7 @@ type PlayerState struct {
|
||||
ID string
|
||||
Nickname string
|
||||
IsBot bool
|
||||
BotControlled bool
|
||||
Hand []*Card
|
||||
SkillZone []*Card
|
||||
ChallengeZone []*Card
|
||||
@@ -31,6 +32,8 @@ type Engine struct {
|
||||
Effect *EffectState
|
||||
ChaosMode bool
|
||||
ActionLogs []string
|
||||
TurnID int
|
||||
RoundNum int
|
||||
rng *rand.Rand
|
||||
}
|
||||
|
||||
@@ -67,6 +70,8 @@ func (e *Engine) Deal() {
|
||||
e.CurrentTurn = e.findStartingPlayer()
|
||||
e.Phase = "playing"
|
||||
e.TurnPhase = "select_card"
|
||||
e.RoundNum = 1
|
||||
e.TurnID = 0
|
||||
e.startTurn()
|
||||
}
|
||||
|
||||
@@ -82,6 +87,11 @@ func (e *Engine) findStartingPlayer() int {
|
||||
}
|
||||
|
||||
func (e *Engine) startTurn() {
|
||||
e.TurnID++
|
||||
cp := e.CurrentPlayer()
|
||||
if cp != nil && !cp.IsBot && !cp.BotControlled {
|
||||
e.log(fmt.Sprintf("轮到 %s 的回合 (第%d轮)", cp.Nickname, e.RoundNum))
|
||||
}
|
||||
if e.CheckInfectedEffect() {
|
||||
e.TurnPhase = "effect_resolving"
|
||||
} else {
|
||||
@@ -190,6 +200,8 @@ func (e *Engine) doChallenge(p *PlayerState, targetID string) error {
|
||||
}
|
||||
card := e.SelectedCard
|
||||
e.removeFromHand(p, card.UID)
|
||||
card.PlacedBy = p.ID
|
||||
card.PlacedByNick = p.Nickname
|
||||
target.ChallengeZone = append(target.ChallengeZone, card)
|
||||
e.log(p.Nickname + " 质疑了 " + target.Nickname)
|
||||
e.SelectedCard = nil
|
||||
@@ -214,10 +226,14 @@ func (e *Engine) finishTurn(p *PlayerState) {
|
||||
|
||||
func (e *Engine) advanceTurn() {
|
||||
n := len(e.Players)
|
||||
old := e.CurrentTurn
|
||||
next := (e.CurrentTurn + 1) % n
|
||||
for i := 0; i < n; i++ {
|
||||
if !e.Players[next].IsExited {
|
||||
e.CurrentTurn = next
|
||||
if next <= old {
|
||||
e.RoundNum++
|
||||
}
|
||||
return
|
||||
}
|
||||
next = (next + 1) % n
|
||||
@@ -256,6 +272,29 @@ func (e *Engine) IsHandTargetable(p *PlayerState) bool {
|
||||
return !p.IsExited
|
||||
}
|
||||
|
||||
func (e *Engine) UpdatePlayerID(oldID, newID string) {
|
||||
for _, p := range e.Players {
|
||||
if p.ID == oldID {
|
||||
p.ID = newID
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (e *Engine) SetBotControlled(playerID string, v bool) {
|
||||
for _, p := range e.Players {
|
||||
if p.ID == playerID {
|
||||
p.BotControlled = v
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (e *Engine) IsPlayerBotLike(playerID string) bool {
|
||||
p := e.GetPlayer(playerID)
|
||||
return p != nil && (p.IsBot || p.BotControlled)
|
||||
}
|
||||
|
||||
func (e *Engine) EffectNeedsResponseFrom(playerID string) bool {
|
||||
if !e.IsEffectResolving() {
|
||||
return false
|
||||
@@ -271,7 +310,7 @@ func (e *Engine) EffectNeedsResponseFrom(playerID string) bool {
|
||||
|
||||
func (e *Engine) BotAutoPlay(playerID string) (string, string) {
|
||||
p := e.GetPlayer(playerID)
|
||||
if p == nil || !p.IsBot || p.IsExited {
|
||||
if p == nil || (!p.IsBot && !p.BotControlled) || p.IsExited {
|
||||
return "", ""
|
||||
}
|
||||
var playable []*Card
|
||||
|
||||
Reference in New Issue
Block a user