From 643bcfbf4142ed00ccdb1f1bbfb7dda541fe8e1c Mon Sep 17 00:00:00 2001 From: gmzar Date: Tue, 16 Jul 2019 18:52:08 -0700 Subject: [PATCH] finished chapter 3! --- go.mod | 2 +- go.sum | 4 +++ main.go | 12 ++++----- mapping/gamemap.go | 61 ++++++++++++++++++++++++++++++++++++++-------- 4 files changed, 62 insertions(+), 17 deletions(-) diff --git a/go.mod b/go.mod index e3578b0..6bf0e24 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,6 @@ module steel go 1.12 require ( - github.com/kettek/goro v0.0.0-20190713012409-1029522674ba + github.com/kettek/goro v0.0.0-20190716230418-ed743d8603f6 golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb // indirect ) diff --git a/go.sum b/go.sum index 0cc7908..104e8ec 100644 --- a/go.sum +++ b/go.sum @@ -34,6 +34,10 @@ github.com/kettek/goro v0.0.0-20190713012210-db6dc3381a1e h1:8UPf9Di15NxRSHdPi0Z github.com/kettek/goro v0.0.0-20190713012210-db6dc3381a1e/go.mod h1:fO57DVF4MXRm+AOQWrFN0CFCbihOO36HUn42vjr00fU= github.com/kettek/goro v0.0.0-20190713012409-1029522674ba h1:HFhcgGAbvE1IhToLKr6IDfI7B2isbYY2yzB6rxV/mwQ= github.com/kettek/goro v0.0.0-20190713012409-1029522674ba/go.mod h1:fO57DVF4MXRm+AOQWrFN0CFCbihOO36HUn42vjr00fU= +github.com/kettek/goro v0.0.0-20190716001741-2ca1aaeebd5b h1:CMDJNDNpm6/ThhLQDxUSR475u49Bu5W4dVaVMxBCk0Q= +github.com/kettek/goro v0.0.0-20190716001741-2ca1aaeebd5b/go.mod h1:fO57DVF4MXRm+AOQWrFN0CFCbihOO36HUn42vjr00fU= +github.com/kettek/goro v0.0.0-20190716230418-ed743d8603f6 h1:+0W0fQIvYWnyS/tHViIQJjUBZ4Cm+8Bl6XZTR8jjrwU= +github.com/kettek/goro v0.0.0-20190716230418-ed743d8603f6/go.mod h1:fO57DVF4MXRm+AOQWrFN0CFCbihOO36HUn42vjr00fU= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= diff --git a/main.go b/main.go index 775d2e4..cc227d2 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,8 @@ package main import ( - "log" - "github.com/kettek/goro" + "log" "steel/entity" "steel/mapping" @@ -19,8 +18,12 @@ func main() { screen.SetTitle("Steel Lord") screen.SetSize(80, 40) + // Randomize our seed so the map is randomized per run. + goro.SetSeed(goro.RandomSeed()) + // Our initial variables. mapWidth, mapHeight := 80, 40 + maxRooms, roomMinSize, roomMaxSize := 30, 6, 10 colors := map[string]goro.Color{ "darkWall": goro.ColorGray, @@ -34,8 +37,6 @@ func main() { gameMap.Initialize() - gameMap.MakeMap() - player := entity.NewEntity(screen.Columns/2, screen.Rows/2+5, '@', goro.Style{Foreground: goro.ColorWhite}) npc := entity.NewEntity(screen.Columns/2-5, screen. Rows/2, '@', goro.Style{Foreground: goro.ColorYellow}) @@ -44,9 +45,8 @@ func main() { npc, } + gameMap.MakeMap(maxRooms, roomMinSize, roomMaxSize, player) - - // The game loop. for { // Draw screen. DrawAll(screen, entities, gameMap, colors) diff --git a/mapping/gamemap.go b/mapping/gamemap.go index 0512333..0a3d108 100644 --- a/mapping/gamemap.go +++ b/mapping/gamemap.go @@ -2,6 +2,8 @@ package mapping import ( "github.com/kettek/goro" + + "steel/entity" ) // GameMap is our map data type. @@ -25,14 +27,53 @@ func (g *GameMap) Initialize() { } } -// MakeMap populates our GameMap with rooms. -func (g *GameMap) MakeMap() { - room1 := NewRect(20, 15, 10, 15) - room2 := NewRect(35, 15, 10, 15) +// MakeMap creates a new randomized map. This is built according to the passed arguments. +func (g *GameMap) MakeMap(maxRooms, roomMinSize, roomMaxSize int, player *entity.Entity) { + var rooms []*Rect - g.CreateRoom(room1) - g.CreateRoom(room2) - g.CreateHTunnel(25, 40, 23) + for r := 0; r < maxRooms; r++ { + // Generate a random width and height. + width := roomMinSize + goro.Random.Intn(roomMaxSize) + height := roomMinSize + goro.Random.Intn(roomMaxSize) + // Generate a random position within the map boundaries. + x := goro.Random.Intn(g.Width - width - 1) + y := goro.Random.Intn(g.Height - height - 1) + // Create a Rect according to our generated sizes. + room := NewRect(x, y, width, height) + + // Iterate through our existing rooms to check for intersection with our new room. + intersects := false + for _, otherRoom := range rooms { + if room.Intersect(otherRoom) { + intersects = true + break + } + } + // Add the room if there is no intersection found. + if !intersects { + g.CreateRoom(room) + roomCenterX, roomCenterY := room.Center() + + // Always place the player in the center of the first room. + if len(rooms) == 0 { + player.X = roomCenterX + player.Y = roomCenterY + } else { + prevCenterX, prevCenterY := rooms[len(rooms)-1].Center() + + // Flip a coin if we should tunnel horizontally or vertically first. + if goro.Random.Intn(1) == 1 { + g.CreateHTunnel(prevCenterX, roomCenterX, prevCenterY) + g.CreateVTunnel(prevCenterY, roomCenterY, roomCenterX) + } else { + g.CreateVTunnel(prevCenterY, roomCenterY, prevCenterX) + g.CreateHTunnel(prevCenterX, roomCenterX, roomCenterY) + } + } + // Append our new room to our rooms list. + rooms = append(rooms, room) + } + } } // CreateRoom creates a room from a provided rect. @@ -67,11 +108,11 @@ func (g *GameMap) CreateVTunnel(y1, y2, x int) { // IsBlocked returns if the given coordinates are blocking movement. func (g *GameMap) IsBlocked(x, y int) bool { // Always block if ourside our GameMap's bounds. - if x < 0 || x >= g.Width || y < 0 || y >= g.Height { + if !g.InBounds(x, y) { return true - } - return g.Tiles[x][y].BlockMovement } + return g.Tiles[x][y].BlockMovement +} // InBounds returns if the given coordinates are within the map's bounds. func (g *GameMap) InBounds (x, y int) bool {