- 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);