6
6
"log/slog"
7
7
"sync"
8
8
"time"
9
+
10
+ "github.com/eleniums/mining-post/data"
9
11
)
10
12
11
13
const updateInterval = 10 * time .Second
@@ -79,6 +81,8 @@ func (m *Manager) Stop() error {
79
81
80
82
// Update happens on a regular time interval. This is the main game loop.
81
83
func (m * Manager ) update () {
84
+ slog .Info ("Game update starting..." )
85
+
82
86
startTime := time .Now ()
83
87
84
88
// stop the world while updating
@@ -89,6 +93,8 @@ func (m *Manager) update() {
89
93
m .adjustMarketPrices ()
90
94
91
95
// run updates for each player
96
+ playerSaveData := make ([]data.Player , len (m .players ))
97
+ playerSaveIndex := 0
92
98
for _ , player := range m .players {
93
99
player .lock .Lock ()
94
100
defer player .lock .Unlock ()
@@ -115,14 +121,18 @@ func (m *Manager) update() {
115
121
if ranks [player .Rank ].eligibleForPromotion (player ) {
116
122
player .Rank ++
117
123
player .Title = ranks [player .Rank ].Name
118
- slog .Info ("player was promoted to a new rank" , "username" , player .Name , "title" , player .Title , "rank" , player .Rank )
124
+ slog .Info ("Player was promoted to a new rank" , "username" , player .Name , "title" , player .Title , "rank" , player .Rank )
119
125
}
120
126
121
- // last of all, save player data
122
- err := m .db .SavePlayer (player .ToDB ())
123
- if err != nil {
124
- slog .Error ("Failed to save player data" , "username" , player .Name , ErrAttr (err ))
125
- }
127
+ // prepare player data to be saved
128
+ playerSaveData [playerSaveIndex ] = player .ToDB ()
129
+ playerSaveIndex ++
130
+ }
131
+
132
+ // save all player data
133
+ err := m .db .SavePlayers (playerSaveData )
134
+ if err != nil {
135
+ slog .Error ("Failed to save player data" , ErrAttr (err ))
126
136
}
127
137
128
138
slog .Info ("Game update finished" , "playerCount" , len (m .players ), "elapsed" , time .Since (startTime ))
0 commit comments