laneya2

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

commit
b42cecfae175983c913d65323f943d8a8e327c35
parent
800943e65b9575aedb044f5269343ba4401e2613
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2024-09-25 04:48
add monsters

Diffstat

M game.go 44 ++++++++++++++++++++++++++++++++++++++++++++
M static/main.js 18 ++++++++++++++++--

2 files changed, 60 insertions, 2 deletions


diff --git a/game.go b/game.go

@@ -19,6 +19,14 @@ type Player struct {
   19    19 	Speed float32
   20    20 }
   21    21 
   -1    22 type Monster struct {
   -1    23 	Game  *Game
   -1    24 	Id    int
   -1    25 	Rune  rune
   -1    26 	Pos   Point
   -1    27 	Speed float32
   -1    28 }
   -1    29 
   22    30 type PlayerMessage struct {
   23    31 	Player *Player
   24    32 	Msg    Message
@@ -27,6 +35,7 @@ type PlayerMessage struct {
   27    35 type Game struct {
   28    36 	Id         string
   29    37 	Players    map[*Player]bool
   -1    38 	Monsters   map[*Monster]bool
   30    39 	Msg        chan PlayerMessage
   31    40 	register   chan *Player
   32    41 	unregister chan *Player
@@ -53,6 +62,7 @@ func getGame(id string) *Game {
   53    62 		game = &Game{
   54    63 			Id:         id,
   55    64 			Players:    make(map[*Player]bool),
   -1    65 			Monsters:   make(map[*Monster]bool),
   56    66 			Msg:        make(chan PlayerMessage),
   57    67 			register:   make(chan *Player),
   58    68 			unregister: make(chan *Player),
@@ -81,6 +91,10 @@ func (game *Game) createId() int {
   81    91 }
   82    92 
   83    93 func (game *Game) generateMap() {
   -1    94 	for monster := range game.Monsters {
   -1    95 		delete(game.Monsters, monster)
   -1    96 	}
   -1    97 
   84    98 	prev := Rect{-3, -3, 3, 3}
   85    99 
   86   100 	game.Rects = []Rect{prev}
@@ -97,6 +111,15 @@ func (game *Game) generateMap() {
   97   111 			lines = append(lines, makeRect(p1.X, p1.Y, p2.X, p1.Y))
   98   112 			lines = append(lines, makeRect(p2.X, p1.Y, p2.X, p2.Y))
   99   113 
   -1   114 			monster := Monster{
   -1   115 				game,
   -1   116 				game.createId(),
   -1   117 				'm',
   -1   118 				rect.RandomPoint(),
   -1   119 				2,
   -1   120 			}
   -1   121 			game.Monsters[&monster] = true
   -1   122 
  100   123 			prev = rect
  101   124 		}
  102   125 	}
@@ -133,6 +156,16 @@ func (game *Game) MaybeNextLevel() {
  133   156 		},
  134   157 	}
  135   158 
   -1   159 	for monster := range game.Monsters {
   -1   160 		msgs = append(msgs, Message{
   -1   161 			"action": "create",
   -1   162 			"type":   "monster",
   -1   163 			"rune":   string(monster.Rune),
   -1   164 			"id":     monster.Id,
   -1   165 			"pos":    monster.Pos,
   -1   166 		})
   -1   167 	}
   -1   168 
  136   169 	for player := range game.Players {
  137   170 		player.Pos = Point{0, 0}
  138   171 		msgs = append(msgs, Message{
@@ -163,10 +196,20 @@ func (game *Game) run() {
  163   196 					"ladder": game.Ladder,
  164   197 				},
  165   198 			}
   -1   199 			for monster := range game.Monsters {
   -1   200 				setup = append(setup, Message{
   -1   201 					"action": "create",
   -1   202 					"type":   "monster",
   -1   203 					"rune":   string(monster.Rune),
   -1   204 					"id":     monster.Id,
   -1   205 					"pos":    monster.Pos,
   -1   206 				})
   -1   207 			}
  166   208 			for p := range game.Players {
  167   209 				setup = append(setup, Message{
  168   210 					"action": "create",
  169   211 					"type":   "player",
   -1   212 					"rune":   "@",
  170   213 					"id":     p.Id,
  171   214 					"pos":    p.Pos,
  172   215 				})
@@ -179,6 +222,7 @@ func (game *Game) run() {
  179   222 				Message{
  180   223 					"action": "create",
  181   224 					"type":   "player",
   -1   225 					"rune":   "@",
  182   226 					"id":     player.Id,
  183   227 					"pos":    player.Pos,
  184   228 				},

diff --git a/static/main.js b/static/main.js

@@ -12,6 +12,11 @@ var send = function(data) {
   12    12     socket.send(JSON.stringify(data));
   13    13 };
   14    14 
   -1    15 var COLORS = {
   -1    16     'player': 4,
   -1    17     'monster': 1,
   -1    18 };
   -1    19 
   15    20 var inRect = function(pos, rect, withWalls) {
   16    21     if (withWalls) {
   17    22         return pos.x >= rect.x1 - 1 && pos.x <= rect.x2 + 1
@@ -104,8 +109,11 @@ var game = {
  104   109         if (x === this.ladder.x && y === this.ladder.y) {
  105   110             return ['>', inView() ? -1 : 0];
  106   111         }
  107    -1         if (Object.values(this.objects).some(obj => x === obj.pos.x && y === obj.pos.y)) {
  108    -1             return ['@', 4];
   -1   112         var objs = Object.values(this.objects).filter(obj => x === obj.pos.x && y === obj.pos.y);
   -1   113         for (const obj of objs) {
   -1   114             if (obj.type === 'player' || inView()) {
   -1   115                 return [obj.rune, COLORS[obj.type]];
   -1   116             }
  109   117         }
  110   118         if (this.getRect({x, y})) {
  111   119             return ['.', inView() ? -1 : 0];
@@ -198,10 +206,16 @@ socket.onmessage = function(event) {
  198   206             game.horizontal = msg.horizontal;
  199   207             game.vertical = msg.vertical;
  200   208             game.seen = {};
   -1   209             for (const [id, obj] of Object.entries(game.objects)) {
   -1   210                 if (obj.type !== 'player') {
   -1   211                     delete game.objects[id];
   -1   212                 }
   -1   213             }
  201   214         } else if (msg.action === 'create') {
  202   215             game.objects[msg.id] = {
  203   216                 type: msg.type,
  204   217                 pos: msg.pos,
   -1   218                 rune: msg.rune,
  205   219             };
  206   220             if (msg.type === 'player') {
  207   221                 game.updateSeen(msg.pos);