laneya2

cave exploration game
git clone https://git.ce9e.org/laneya2.git

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.Pos
  257    -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 pile
  264   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) {