Skip to content
This repository was archived by the owner on Sep 24, 2022. It is now read-only.

Commit d7a72f0

Browse files
yijia-ccYijia Chenmagicoder10
authored
Limit the number of candies a player can drop (#66)
* feature limit player to drop a certain amount of candies * Fix increase candy available on start exploding Co-authored-by: Yijia Chen <[email protected]> Co-authored-by: Magic Coder <[email protected]>
1 parent e697c74 commit d7a72f0

File tree

10 files changed

+114
-52
lines changed

10 files changed

+114
-52
lines changed

game/candy/candy.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package candy
22

33
import (
4+
"candy/pubsub"
45
"errors"
56
"time"
67

@@ -68,14 +69,19 @@ func (c Candy) CellsHit() []cell.Cell {
6869
return c.state.cellsHit()
6970
}
7071

71-
func newCandy(powerLevel int, center cell.Cell, rangeCutter RangeCutter) Candy {
72-
return Candy{state: newMeltingState(powerLevel, center, rangeCutter)}
72+
func newCandy(
73+
droppedBy int, powerLevel int, center cell.Cell,
74+
rangeCutter RangeCutter, pubSub *pubsub.PubSub,
75+
) Candy {
76+
return Candy{state: newMeltingState(droppedBy, powerLevel, center, rangeCutter, pubSub)}
7377
}
7478

7579
type Builder struct {
80+
droppedBy int
7681
powerLevel int
7782
center *cell.Cell
7883
rangeCutter RangeCutter
84+
pubSub *pubsub.PubSub
7985
}
8086

8187
func (b *Builder) Center(center cell.Cell) *Builder {
@@ -92,9 +98,14 @@ func (b *Builder) Build() (Candy, error) {
9298
if b.center == nil {
9399
return Candy{}, errors.New("center cannot be empty")
94100
}
95-
return newCandy(b.powerLevel, *b.center, b.rangeCutter), nil
101+
return newCandy(b.droppedBy, b.powerLevel, *b.center, b.rangeCutter, b.pubSub), nil
96102
}
97103

98-
func NewBuilder(powerLevel int) Builder {
99-
return Builder{powerLevel: powerLevel, rangeCutter: noChange{}}
104+
func NewBuilder(powerLevel int, droppedBy int, pubSub *pubsub.PubSub) Builder {
105+
return Builder{
106+
droppedBy: droppedBy,
107+
powerLevel: powerLevel,
108+
rangeCutter: noChange{},
109+
pubSub: pubSub,
110+
}
100111
}

game/candy/exploding.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package candy
22

33
import (
4+
"candy/pubsub"
45
"time"
56

67
"candy/game/cell"
@@ -127,6 +128,9 @@ func (e explodingState) hitRanges(processRange func(dir explodeDirection, currRa
127128
}
128129

129130
func newExplodingState(sharedState sharedState) *explodingState {
131+
defer func() {
132+
sharedState.pubSub.Publish(pubsub.OnCandyStartExploding, sharedState.droppedBy)
133+
}()
130134
explodingTime := getExplodingTime(sharedState.powerLevel)
131135
sharedState.remainingTime = explodingTime + animationDelay
132136
return &explodingState{

game/candy/melting.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package candy
22

33
import (
4+
"candy/pubsub"
45
"time"
56

67
"candy/game/cell"
@@ -46,13 +47,18 @@ func (m meltingState) draw(batch graphics.Batch, x int, y int, z int) {
4647
batch.DrawSprite(x, y, z, bound, 1)
4748
}
4849

49-
func newMeltingState(powerLevel int, center cell.Cell, rangeCutter RangeCutter) *meltingState {
50+
func newMeltingState(
51+
droppedBy int, powerLevel int, center cell.Cell,
52+
rangeCutter RangeCutter, pubSub *pubsub.PubSub,
53+
) *meltingState {
5054
return &meltingState{
5155
sharedState: sharedState{
56+
droppedBy: droppedBy,
5257
center: center,
5358
powerLevel: powerLevel,
5459
remainingTime: meltingTime,
5560
rangeCutter: rangeCutter,
61+
pubSub: pubSub,
5662
},
5763
}
5864
}

game/candy/state.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package candy
22

33
import (
4+
"candy/pubsub"
45
"time"
56

67
"candy/game/cell"
@@ -17,12 +18,14 @@ type state interface {
1718
}
1819

1920
type sharedState struct {
21+
droppedBy int
2022
center cell.Cell
2123
powerLevel int
2224
remainingTime time.Duration
2325
lag int64
2426
shouldExplode bool
2527
rangeCutter RangeCutter
28+
pubSub *pubsub.PubSub
2629
}
2730

2831
func (s *sharedState) explode() {

game/player/character.go

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,88 @@
11
package player
22

33
type character struct {
4-
walkCycleOffset walkCycleOffset
5-
initialPower int
6-
initialStepSize int
4+
walkCycleOffset walkCycleOffset
5+
initialPower int
6+
initialStepSize int
7+
initialCandyLimit int
78
}
89

910
var BlackBoy = character{
1011
walkCycleOffset: walkCycleOffset{
1112
x: 0,
1213
y: spriteColHeight,
1314
},
14-
initialStepSize: 4,
15-
initialPower: 1,
15+
initialStepSize: 4,
16+
initialPower: 1,
17+
initialCandyLimit: 2,
1618
}
1719

1820
var BlackGirl = character{
1921
walkCycleOffset: walkCycleOffset{
2022
x: 0,
2123
y: 0,
2224
},
23-
initialStepSize: 4,
24-
initialPower: 1,
25+
initialStepSize: 4,
26+
initialPower: 1,
27+
initialCandyLimit: 3,
2528
}
2629

2730
var BrownBoy = character{
2831
walkCycleOffset: walkCycleOffset{
2932
x: spriteRowWidth,
3033
y: spriteColHeight,
3134
},
32-
initialStepSize: 6,
33-
initialPower: 1,
35+
initialStepSize: 6,
36+
initialPower: 1,
37+
initialCandyLimit: 2,
3438
}
3539

3640
var BrownGirl = character{
3741
walkCycleOffset: walkCycleOffset{
3842
x: spriteRowWidth,
3943
y: 0,
4044
},
41-
initialStepSize: 6,
42-
initialPower: 1,
45+
initialStepSize: 6,
46+
initialPower: 1,
47+
initialCandyLimit: 2,
4348
}
4449

4550
var YellowBoy = character{
4651
walkCycleOffset: walkCycleOffset{
4752
x: spriteRowWidth * 2,
4853
y: spriteColHeight,
4954
},
50-
initialStepSize: 6,
51-
initialPower: 1,
55+
initialStepSize: 6,
56+
initialPower: 1,
57+
initialCandyLimit: 2,
5258
}
5359

5460
var YellowGirl = character{
5561
walkCycleOffset: walkCycleOffset{
5662
x: spriteRowWidth * 2,
5763
y: 0,
5864
},
59-
initialStepSize: 6,
60-
initialPower: 1,
65+
initialStepSize: 6,
66+
initialPower: 1,
67+
initialCandyLimit: 2,
6168
}
6269

6370
var OrangeBoy = character{
6471
walkCycleOffset: walkCycleOffset{
6572
x: spriteRowWidth * 3,
6673
y: spriteColHeight,
6774
},
68-
initialStepSize: 6,
69-
initialPower: 1,
75+
initialStepSize: 6,
76+
initialPower: 1,
77+
initialCandyLimit: 2,
7078
}
7179

7280
var OrangeGirl = character{
7381
walkCycleOffset: walkCycleOffset{
7482
x: spriteRowWidth * 3,
7583
y: 0,
7684
},
77-
initialStepSize: 6,
78-
initialPower: 1,
85+
initialStepSize: 6,
86+
initialPower: 1,
87+
initialCandyLimit: 2,
7988
}

game/player/player.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,14 @@ func (p *Player) IncreasePowerLevel(amountIncrease int) {
9898
p.state.increasePowerLevel(amountIncrease)
9999
}
100100

101-
func (p *Player) IncreaseStepSize(amountIncrease int) {
101+
func (p Player) IncreaseStepSize(amountIncrease int) {
102102
p.state.increaseStepSize(amountIncrease)
103103
}
104104

105+
func (p *Player) IncrementAvailableCandy() {
106+
p.state.incrementAvailableCandy()
107+
}
108+
105109
func NewPlayer(
106110
moveChecker MoveChecker,
107111
character character,

game/player/standing.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,20 @@ func newStandingStateOnSquare(
4646
) standingState {
4747
return standingState{
4848
&sharedState{
49-
moveChecker: moveChecker,
50-
currStep: 1,
51-
direction: direction.Down,
52-
playerWidth: playerWidth,
53-
playerHeight: playerHeight,
54-
x: gridX + col*square.Width,
55-
y: gridY + row*square.Width,
56-
regionOffset: regionOffset,
57-
powerLevel: character.initialPower,
58-
stepSize: character.initialStepSize,
59-
character: character,
60-
pubSub: pubSub,
49+
moveChecker: moveChecker,
50+
currStep: 1,
51+
direction: direction.Down,
52+
playerWidth: playerWidth,
53+
playerHeight: playerHeight,
54+
x: gridX + col*square.Width,
55+
y: gridY + row*square.Width,
56+
regionOffset: regionOffset,
57+
powerLevel: character.initialPower,
58+
stepSize: character.initialStepSize,
59+
candyLimit: character.initialCandyLimit,
60+
availableCandy: character.initialCandyLimit,
61+
character: character,
62+
pubSub: pubSub,
6163
},
6264
}
6365
}

game/player/state.go

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,25 @@ type state interface {
2121
getHeight() int
2222
increasePowerLevel(amountIncrease int)
2323
increaseStepSize(amountIncrease int)
24+
incrementAvailableCandy()
2425
isNormal() bool
2526
}
2627

2728
type sharedState struct {
28-
currStep int
29-
direction direction.Direction
30-
playerWidth int
31-
playerHeight int
32-
x int
33-
y int
34-
moveChecker MoveChecker
35-
regionOffset regionOffset
36-
powerLevel int
37-
stepSize int
38-
character character
39-
pubSub *pubsub.PubSub
29+
currStep int
30+
direction direction.Direction
31+
playerWidth int
32+
playerHeight int
33+
x int
34+
y int
35+
moveChecker MoveChecker
36+
regionOffset regionOffset
37+
powerLevel int
38+
stepSize int
39+
availableCandy int
40+
candyLimit int
41+
character character
42+
pubSub *pubsub.PubSub
4043
}
4144

4245
func (s sharedState) update(timeElapsed time.Duration) {
@@ -83,7 +86,17 @@ func (s *sharedState) increaseStepSize(amountIncrease int) {
8386
s.stepSize += amountIncrease
8487
}
8588

86-
func (s sharedState) dropCandy() {
89+
func (s *sharedState) incrementAvailableCandy() {
90+
if s.availableCandy < s.candyLimit {
91+
s.availableCandy++
92+
}
93+
}
94+
95+
func (s *sharedState) dropCandy() {
96+
if s.availableCandy == 0 {
97+
return
98+
}
99+
s.availableCandy--
87100
s.pubSub.Publish(pubsub.OnDropCandy, pubsub.OnDropCandyPayload{
88101
X: s.x,
89102
Y: s.y,

pubsub/topics.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ type topic int
44

55
const (
66
OnCandyExploding topic = iota
7+
OnCandyStartExploding
78
OnPlayerWalking
89
IncreasePlayerPower
910
IncreasePlayerSpeed

screen/game.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func (g Game) HandleInput(in input.Input) {
6565

6666
func (g Game) dropCandy(payload pubsub.OnDropCandyPayload) {
6767
playerCell := g.getObjectCell(payload.X, payload.Y, payload.Width, payload.Height)
68-
g.gameMap.AddCandy(playerCell, candy.NewBuilder(payload.PowerLevel))
68+
g.gameMap.AddCandy(playerCell, candy.NewBuilder(payload.PowerLevel, g.currPlayerIndex, g.pubSub))
6969
}
7070

7171
func (g Game) Update(timeElapsed time.Duration) {
@@ -119,6 +119,10 @@ func (g Game) increaseStepSize(amountIncrease int) {
119119
g.players[g.currPlayerIndex].IncreaseStepSize(amountIncrease)
120120
}
121121

122+
func (g Game) incrementAvailableCandy(playerID int) {
123+
g.players[playerID].IncrementAvailableCandy()
124+
}
125+
122126
func NewGame(
123127
logger *observability.Logger,
124128
assets assets.Assets, g graphics.Graphics,
@@ -173,5 +177,10 @@ func NewGame(
173177
stepSizeDelta := payload.(int)
174178
gm.increaseStepSize(stepSizeDelta)
175179
})
180+
pubSub.Subscribe(pubsub.OnCandyStartExploding, func(payload interface{}) {
181+
playerID := payload.(int)
182+
gm.incrementAvailableCandy(playerID)
183+
184+
})
176185
return &gm
177186
}

0 commit comments

Comments
 (0)