parent
d75dd78e3b
commit
17e7fef95c
@ -0,0 +1,19 @@ |
|||||||
|
--- 01_the_screen/game.go 2025-10-06 10:40:36.384247800 -0400
|
||||||
|
+++ 02_mazes_and_enemies/game.go 2025-10-06 10:40:37.923662000 -0400
|
||||||
|
@@ -3,4 +3,5 @@
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
+ "math/rand"
|
||||||
|
)
|
||||||
|
|
||||||
|
@@ -24,2 +25,10 @@
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+func (game *Game) PlaceEnemies(places []Position) {
|
||||||
|
+ for _, pos := range places {
|
||||||
|
+ if rand.Int() % 2 == 0 {
|
||||||
|
+ game.Enemies[pos] = &Enemy{10, pos, 4}
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
@ -0,0 +1,9 @@ |
|||||||
|
--- 01_the_screen/main.go 2025-10-06 00:33:27.349824400 -0400
|
||||||
|
+++ 02_mazes_and_enemies/main.go 2025-10-06 11:53:40.243831800 -0400
|
||||||
|
@@ -8,4 +8,6 @@
|
||||||
|
|
||||||
|
game.NewMap()
|
||||||
|
+ dead_ends := game.NewMaze()
|
||||||
|
+ game.PlaceEnemies(dead_ends)
|
||||||
|
game.Render()
|
||||||
|
|
@ -0,0 +1,34 @@ |
|||||||
|
--- 01_the_screen/map.go 2025-10-06 23:32:48.943928000 -0400
|
||||||
|
+++ 02_mazes_and_enemies/map.go 2025-10-06 23:33:02.887088700 -0400
|
||||||
|
@@ -22,4 +22,5 @@
|
||||||
|
|
||||||
|
func (game *Game) Occupied(pos Position) bool {
|
||||||
|
+ _, is_enemy := game.Enemies[pos]
|
||||||
|
is_player := pos == game.Player.Pos
|
||||||
|
|
||||||
|
@@ -27,4 +28,5 @@
|
||||||
|
return !game.Inbounds(pos, 1) ||
|
||||||
|
game.Level[pos.Y][pos.X] == WALL ||
|
||||||
|
+ is_enemy ||
|
||||||
|
is_player
|
||||||
|
}
|
||||||
|
@@ -35,2 +37,19 @@
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+func (game *Game) Neighbors(near Position) []Position {
|
||||||
|
+ result := make([]Position, 0, 4)
|
||||||
|
+ points := compass(near, 2)
|
||||||
|
+
|
||||||
|
+ for _, pos := range points {
|
||||||
|
+ if game.Inbounds(pos, 0) {
|
||||||
|
+ result = append(result, pos)
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return result
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+func (game *Game) NewMap() {
|
||||||
|
+ game.FillMap(game.Level, '#')
|
||||||
|
+}
|
@ -0,0 +1,12 @@ |
|||||||
|
--- 01_the_screen/ui.go 2025-10-06 10:55:34.357039400 -0400
|
||||||
|
+++ 02_mazes_and_enemies/ui.go 2025-10-06 11:18:20.691714300 -0400
|
||||||
|
@@ -69,4 +69,9 @@
|
||||||
|
game.DrawMap()
|
||||||
|
game.DrawEntity('@', game.Player.Pos, tcell.ColorYellow)
|
||||||
|
+
|
||||||
|
+ for pos, _ := range game.Enemies {
|
||||||
|
+ game.DrawEntity('G', pos, tcell.ColorRed)
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
game.DrawStatus()
|
||||||
|
game.Screen.Show()
|
@ -0,0 +1,20 @@ |
|||||||
|
--- 02_mazes_and_enemies/data.go 2025-10-06 10:40:57.847195400 -0400
|
||||||
|
+++ 03_pathing_enemies/data.go 2025-10-06 02:44:43.658927000 -0400
|
||||||
|
@@ -11,9 +11,10 @@
|
||||||
|
RENDER = true
|
||||||
|
SHOW_RENDER = false
|
||||||
|
- SHOW_PATHS = false
|
||||||
|
+ SHOW_PATHS = true
|
||||||
|
HEARING_DISTANCE = 6
|
||||||
|
)
|
||||||
|
|
||||||
|
type Map [][]rune
|
||||||
|
+type Paths [][]int
|
||||||
|
|
||||||
|
type Position struct {
|
||||||
|
@@ -31,4 +32,5 @@
|
||||||
|
Screen tcell.Screen
|
||||||
|
Level Map
|
||||||
|
+ Paths Paths
|
||||||
|
Player Enemy
|
||||||
|
Status string
|
@ -0,0 +1,29 @@ |
|||||||
|
--- 02_mazes_and_enemies/debug.go 2025-10-06 01:05:42.441647100 -0400
|
||||||
|
+++ 03_pathing_enemies/debug.go 2025-10-05 23:47:48.686143800 -0400
|
||||||
|
@@ -4,4 +4,6 @@
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
+ "fmt"
|
||||||
|
+ "github.com/gdamore/tcell/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
@@ -13,2 +15,19 @@
|
||||||
|
dbg = log.New(out, "", log.LstdFlags)
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+func (game *Game) DrawPaths() {
|
||||||
|
+ for y, row := range game.Paths {
|
||||||
|
+ for x, path_num := range row {
|
||||||
|
+ if path_num == PATH_LIMIT { continue }
|
||||||
|
+
|
||||||
|
+ as_str := fmt.Sprintf("%x", path_num % 16)
|
||||||
|
+ style := tcell.StyleDefault.Foreground(tcell.ColorGray)
|
||||||
|
+
|
||||||
|
+ if path_num >= 0 && path_num <= 16 {
|
||||||
|
+ style = style.Reverse(true)
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ game.Screen.SetContent(x, y, rune(as_str[0]), nil, style)
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
@ -0,0 +1,8 @@ |
|||||||
|
--- 02_mazes_and_enemies/game.go 2025-10-06 10:40:37.923662000 -0400
|
||||||
|
+++ 03_pathing_enemies/game.go 2025-10-06 12:44:21.971080300 -0400
|
||||||
|
@@ -13,4 +13,5 @@
|
||||||
|
game.Enemies = make(map[Position]*Enemy)
|
||||||
|
game.Level = make(Map, height, height)
|
||||||
|
+ game.Paths = make(Paths, height, height)
|
||||||
|
game.Player = Enemy{20, Position{1,1}, 4}
|
||||||
|
|
@ -0,0 +1,9 @@ |
|||||||
|
--- 02_mazes_and_enemies/main.go 2025-10-06 11:53:40.243831800 -0400
|
||||||
|
+++ 03_pathing_enemies/main.go 2025-10-06 11:53:48.238068700 -0400
|
||||||
|
@@ -13,4 +13,6 @@
|
||||||
|
|
||||||
|
for game.HandleEvents() {
|
||||||
|
+ game.CalculatePaths()
|
||||||
|
+ game.EnemyPathing()
|
||||||
|
game.Render()
|
||||||
|
}
|
@ -0,0 +1,19 @@ |
|||||||
|
--- 02_mazes_and_enemies/map.go 2025-10-06 23:33:02.887088700 -0400
|
||||||
|
+++ 03_pathing_enemies/map.go 2025-10-06 10:44:52.350308600 -0400
|
||||||
|
@@ -14,4 +14,16 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
+func (game *Game) CloneMap() Map {
|
||||||
|
+ // this is a shallow copy though
|
||||||
|
+ new_map := slices.Clone(game.Level)
|
||||||
|
+
|
||||||
|
+ for i, row := range new_map {
|
||||||
|
+ // this makes sure the row is an actual copy
|
||||||
|
+ new_map[i] = slices.Clone(row)
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return new_map
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
func (game *Game) Inbounds(pos Position, offset int) bool {
|
||||||
|
return pos.X >= offset &&
|
@ -0,0 +1,13 @@ |
|||||||
|
--- 02_mazes_and_enemies/movement.go 2025-10-06 10:48:12.166620400 -0400
|
||||||
|
+++ 03_pathing_enemies/movement.go 2025-10-06 12:00:47.091211600 -0400
|
||||||
|
@@ -11,2 +11,10 @@
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+func (game *Game) MoveEnemy(from Position, to Position) {
|
||||||
|
+ enemy, ok := game.Enemies[from]
|
||||||
|
+ if !ok { dbg.Fatal("no enemy at", from, "wtf") }
|
||||||
|
+
|
||||||
|
+ delete(game.Enemies, from)
|
||||||
|
+ game.Enemies[to] = enemy
|
||||||
|
+}
|
@ -0,0 +1,12 @@ |
|||||||
|
--- 02_mazes_and_enemies/ui.go 2025-10-06 11:18:20.691714300 -0400
|
||||||
|
+++ 03_pathing_enemies/ui.go 2025-10-06 12:10:53.153215100 -0400
|
||||||
|
@@ -68,4 +68,9 @@
|
||||||
|
game.Screen.Clear()
|
||||||
|
game.DrawMap()
|
||||||
|
+
|
||||||
|
+ if SHOW_PATHS {
|
||||||
|
+ game.DrawPaths()
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
game.DrawEntity('@', game.Player.Pos, tcell.ColorYellow)
|
||||||
|
|
@ -0,0 +1,9 @@ |
|||||||
|
--- 03_pathing_enemies/data.go 2025-10-06 02:44:43.658927000 -0400
|
||||||
|
+++ 04_combat/data.go 2025-10-05 23:24:48.595383100 -0400
|
||||||
|
@@ -11,5 +11,5 @@
|
||||||
|
RENDER = true
|
||||||
|
SHOW_RENDER = false
|
||||||
|
- SHOW_PATHS = true
|
||||||
|
+ SHOW_PATHS = false
|
||||||
|
HEARING_DISTANCE = 6
|
||||||
|
)
|
@ -0,0 +1,16 @@ |
|||||||
|
--- 03_pathing_enemies/game.go 2025-10-06 12:44:21.971080300 -0400
|
||||||
|
+++ 04_combat/game.go 2025-10-06 10:56:30.634388900 -0400
|
||||||
|
@@ -34,2 +34,13 @@
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+func (game *Game) Restart() {
|
||||||
|
+ game.SetStatus("YOU DIED! Try again.")
|
||||||
|
+ game.Player.HP = 20
|
||||||
|
+ game.Player.Pos = Position{1,1}
|
||||||
|
+ clear(game.Enemies)
|
||||||
|
+ game.FillPaths(game.Paths, PATH_LIMIT)
|
||||||
|
+ game.FillMap(game.Level, '#')
|
||||||
|
+
|
||||||
|
+ game.Render()
|
||||||
|
+}
|
@ -0,0 +1,17 @@ |
|||||||
|
--- 03_pathing_enemies/go.mod 2025-09-29 00:25:59.856341100 -0400
|
||||||
|
+++ 04_combat/go.mod 2025-10-06 00:24:48.519375000 -0400
|
||||||
|
@@ -3,12 +3,10 @@
|
||||||
|
go 1.25.1
|
||||||
|
|
||||||
|
-require (
|
||||||
|
- github.com/gdamore/tcell/v2 v2.9.0
|
||||||
|
- github.com/mattn/go-runewidth v0.0.16
|
||||||
|
-)
|
||||||
|
+require github.com/gdamore/tcell/v2 v2.9.0
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/gdamore/encoding v1.0.1 // indirect
|
||||||
|
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
||||||
|
+ github.com/mattn/go-runewidth v0.0.16 // indirect
|
||||||
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
|
golang.org/x/sys v0.35.0 // indirect
|
@ -0,0 +1,35 @@ |
|||||||
|
--- 03_pathing_enemies/main.go 2025-10-06 11:53:48.238068700 -0400
|
||||||
|
+++ 04_combat/main.go 2025-10-06 11:53:46.781950000 -0400
|
||||||
|
@@ -7,15 +7,22 @@
|
||||||
|
game.InitScreen()
|
||||||
|
|
||||||
|
- game.NewMap()
|
||||||
|
- dead_ends := game.NewMaze()
|
||||||
|
- game.PlaceEnemies(dead_ends)
|
||||||
|
- game.Render()
|
||||||
|
-
|
||||||
|
- for game.HandleEvents() {
|
||||||
|
- game.CalculatePaths()
|
||||||
|
- game.EnemyPathing()
|
||||||
|
+ for {
|
||||||
|
+ game.NewMap()
|
||||||
|
+ dead_ends := game.NewMaze()
|
||||||
|
+ game.PlaceEnemies(dead_ends)
|
||||||
|
game.Render()
|
||||||
|
- }
|
||||||
|
|
||||||
|
- game.Exit()
|
||||||
|
+ for game.HandleEvents() && game.Player.HP > 0 {
|
||||||
|
+ game.EnemyDeath()
|
||||||
|
+ game.CalculatePaths()
|
||||||
|
+ game.EnemyPathing()
|
||||||
|
+ game.Render()
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if game.Player.HP <= 0 {
|
||||||
|
+ game.Restart()
|
||||||
|
+ } else {
|
||||||
|
+ game.Exit()
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
@ -0,0 +1,11 @@ |
|||||||
|
--- 03_pathing_enemies/movement.go 2025-10-06 12:00:47.091211600 -0400
|
||||||
|
+++ 04_combat/movement.go 2025-10-06 12:00:49.969794700 -0400
|
||||||
|
@@ -7,5 +7,7 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
- if !game.Occupied(target) {
|
||||||
|
+ if game.Occupied(target) {
|
||||||
|
+ game.Attack(target)
|
||||||
|
+ } else {
|
||||||
|
game.Player.Pos = target
|
||||||
|
}
|
@ -0,0 +1,10 @@ |
|||||||
|
#!/usr/bin/env bash |
||||||
|
|
||||||
|
for p in `diff $1 $2 | grep "^diff" | cut -d " " -f 2-3 | sed "s/ /#/g"` |
||||||
|
do |
||||||
|
echo $(echo $p | sed "s/#/ /g") |
||||||
|
|
||||||
|
read -r from to <<< "$(echo $p | sed 's/#/ /g')" |
||||||
|
|
||||||
|
diff -u2 $from $to > $to.diff |
||||||
|
done |
@ -0,0 +1,4 @@ |
|||||||
|
find . -name "*.diff" -exec rm {} \; |
||||||
|
./crank_diff.sh 01_the_screen 02_mazes_and_enemies |
||||||
|
./crank_diff.sh 02_mazes_and_enemies 03_pathing_enemies |
||||||
|
./crank_diff.sh 03_pathing_enemies 04_combat |
Loading…
Reference in new issue