This repository has been archived by the owner on Sep 8, 2022. It is now read-only.
/
jin_sheng_huo.go
108 lines (98 loc) · 2.93 KB
/
jin_sheng_huo.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package role
import (
"github.com/CuteReimu/FengSheng/game"
"github.com/CuteReimu/FengSheng/protos"
"google.golang.org/protobuf/proto"
)
func init() {
game.RoleCache = append(game.RoleCache, &game.RoleSkillsData{
Name: "金生火",
Role: protos.Role_jin_sheng_huo,
FaceUp: true,
Skills: []game.ISkill{&JinShen{}},
})
}
type JinShen struct {
}
func (m *JinShen) Init(g *game.Game) {
g.AddListeningSkill(m)
}
func (m *JinShen) GetSkillId() game.SkillId {
return game.SkillIdJinShen
}
func (m *JinShen) Execute(g *game.Game) (nextFsm game.Fsm, continueResolve bool, ok bool) {
fsm, ok := g.GetFsm().(*game.ReceivePhaseReceiverSkill)
if !ok || fsm.InFrontOfWhom.FindSkill(m.GetSkillId()) == nil {
return nil, false, false
}
if fsm.InFrontOfWhom.GetSkillUseCount(m.GetSkillId()) > 0 {
return nil, false, false
}
if len(fsm.MessageCard.GetColors()) < 2 {
return nil, false, false
}
fsm.InFrontOfWhom.AddSkillUseCount(m.GetSkillId())
return &executeJinShen{fsm: fsm}, true, ok
}
func (m *JinShen) ExecuteProtocol(*game.Game, game.IPlayer, proto.Message) {
}
type executeJinShen struct {
fsm *game.ReceivePhaseReceiverSkill
}
func (e *executeJinShen) Resolve() (next game.Fsm, continueResolve bool) {
for _, p := range e.fsm.WhoseTurn.GetGame().GetPlayers() {
p.NotifyReceivePhaseWithWaiting(e.fsm.WhoseTurn, e.fsm.InFrontOfWhom, e.fsm.MessageCard, e.fsm.InFrontOfWhom, 20)
}
return e, false
}
func (e *executeJinShen) ResolveProtocol(player game.IPlayer, message proto.Message) (next game.Fsm, continueResolve bool) {
if player.Location() != e.fsm.InFrontOfWhom.Location() {
logger.Error("不是你发技能的时机")
return e, false
}
if pb, ok := message.(*protos.EndReceivePhaseTos); ok {
if r, ok := player.(*game.HumanPlayer); ok && r.Seq != pb.Seq {
logger.Error("操作太晚了, required Seq: ", r.Seq, ", actual Seq: ", pb.Seq)
return e, false
}
if player.Location() == e.fsm.InFrontOfWhom.Location() {
player.IncrSeq()
return e.fsm, true
} else {
logger.Error("还没轮到你")
return e, false
}
}
pb, ok := message.(*protos.SkillJinShenTos)
if !ok {
logger.Error("错误的协议")
return e, false
}
r := e.fsm.InFrontOfWhom
g := r.GetGame()
if humanPlayer, ok := r.(*game.HumanPlayer); ok && pb.Seq != humanPlayer.Seq {
logger.Error("操作太晚了, required Seq: ", humanPlayer.Seq, ", actual Seq: ", pb.Seq)
return e, false
}
card := r.FindCard(pb.CardId)
if card == nil {
logger.Error("没有这张卡")
return e, false
}
r.IncrSeq()
logger.Info("[金生火]发动了[谨慎]")
messageCard := e.fsm.MessageCard
r.DeleteCard(card.GetId())
r.DeleteMessageCard(messageCard.GetId())
r.AddMessageCards(card)
r.AddCards(messageCard)
for _, p := range g.GetPlayers() {
if player, ok := p.(*game.HumanPlayer); ok {
player.Send(&protos.SkillJinShenToc{
PlayerId: player.GetAlternativeLocation(r.Location()),
Card: card.ToPbCard(),
})
}
}
return e.fsm, true
}