- commit
- 914ed010da01fab8fecf64fd21be5e9cd3f11016
- parent
- 16b95848ae8cb675bc7d6e82088c12c8775b35ea
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2024-09-29 07:25
add loot piles
Diffstat
| M | game.go | 64 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- |
| M | monster.go | 1 | + |
| M | static/main.js | 1 | + |
3 files changed, 63 insertions, 3 deletions
diff --git a/game.go b/game.go
@@ -7,10 +7,16 @@ import ( 7 7 8 8 type Message map[string]interface{} 9 9 -1 10 type Pile struct { -1 11 Id int -1 12 Items map[string]uint -1 13 } -1 14 10 15 type Game struct { 11 16 Id string 12 17 Players map[*Player]bool 13 18 Monsters map[*Monster]bool -1 19 Piles map[Point]*Pile 14 20 Msg chan PlayerMessage 15 21 MMsg chan MonsterMessage 16 22 register chan *Player @@ -39,6 +45,7 @@ func getGame(id string) *Game { 39 45 Id: id, 40 46 Players: make(map[*Player]bool), 41 47 Monsters: make(map[*Monster]bool), -1 48 Piles: make(map[Point]*Pile), 42 49 Msg: make(chan PlayerMessage), 43 50 MMsg: make(chan MonsterMessage), 44 51 register: make(chan *Player), @@ -73,6 +80,10 @@ func (game *Game) generateMap() { 73 80 delete(game.Monsters, monster) 74 81 } 75 82 -1 83 for pos := range game.Piles { -1 84 delete(game.Piles, pos) -1 85 } -1 86 76 87 prev := Rect{-3, -3, 3, 3} 77 88 78 89 game.Rects = []Rect{prev} @@ -168,6 +179,33 @@ func (game *Game) getPlayerAt(pos Point) *Player { 168 179 return nil 169 180 } 170 181 -1 182 func (game *Game) addToPile(pos Point, item string) { -1 183 pile, ok := game.Piles[pos] -1 184 if !ok { -1 185 pile = &Pile{ -1 186 Id: game.createId(), -1 187 Items: make(map[string]uint), -1 188 } -1 189 game.Piles[pos] = pile -1 190 } -1 191 -1 192 value, ok := pile.Items[item] -1 193 if ok { -1 194 pile.Items[item] = value + 1 -1 195 } else { -1 196 pile.Items[item] = 1 -1 197 game.broadcast([]Message{ -1 198 Message{ -1 199 "action": "create", -1 200 "type": "pile", -1 201 "id": pile.Id, -1 202 "rune": "%", -1 203 "pos": pos, -1 204 }, -1 205 }) -1 206 } -1 207 } -1 208 171 209 func (game *Game) run() { 172 210 for { 173 211 select { @@ -200,6 +238,15 @@ func (game *Game) run() { 200 238 "pos": monster.Pos, 201 239 }) 202 240 } -1 241 for pos, pile := range game.Piles { -1 242 setup = append(setup, Message{ -1 243 "action": "create", -1 244 "type": "pile", -1 245 "rune": "%", -1 246 "id": pile.Id, -1 247 "pos": pos, -1 248 }) -1 249 } 203 250 for p := range game.Players { 204 251 setup = append(setup, Message{ 205 252 "action": "create", @@ -253,15 +300,26 @@ func (game *Game) run() { 253 300 } 254 301 player.Move(dir) 255 302 } else if msg["action"] == "pickup" {256 -1 // TODO only if there is loot on player.Pos257 -1 player.AddItem("potion", 1)-1 303 pile, ok := game.Piles[player.Pos] -1 304 if ok { -1 305 delete(game.Piles, player.Pos) -1 306 for item, amount := range pile.Items { -1 307 player.AddItem(item, amount) -1 308 } -1 309 game.broadcast([]Message{ -1 310 Message{ -1 311 "action": "remove", -1 312 "id": pile.Id, -1 313 }, -1 314 }) -1 315 } 258 316 } else if msg["action"] == "drop" { 259 317 item, ok := msg["item"].(string) 260 318 if !ok { 261 319 continue 262 320 }263 -1 // TODO: add to loot pile264 321 player.RemoveItem(item, 1) -1 322 game.addToPile(player.Pos, item) 265 323 } else if msg["action"] == "use" { 266 324 item, ok := msg["item"].(string) 267 325 if !ok {
diff --git a/monster.go b/monster.go
@@ -92,6 +92,7 @@ func (monster *Monster) TakeDamage(amount int) {
92 92 if monster.Health <= 0 {
93 93 monster.quit <- true
94 94 delete(monster.Game.Monsters, monster)
-1 95 monster.Game.addToPile(monster.Pos, "potion")
95 96 monster.Game.broadcast([]Message{
96 97 Message{
97 98 "action": "remove",
diff --git a/static/main.js b/static/main.js
@@ -16,6 +16,7 @@ var send = function(data) {
16 16 var COLORS = {
17 17 'player': 4,
18 18 'monster': 1,
-1 19 'pile': 3,
19 20 };
20 21
21 22 var inRect = function(pos, rect, withWalls) {