finished chapter 3!
This commit is contained in:
		
							parent
							
								
									9fb3b65800
								
							
						
					
					
						commit
						643bcfbf41
					
				
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								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 | ||||
| ) | ||||
|  |  | |||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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= | ||||
|  |  | |||
							
								
								
									
										12
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								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) | ||||
|  |  | |||
|  | @ -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 | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // InBounds returns if the given coordinates are within the map's bounds.
 | ||||
| func (g *GameMap) InBounds (x, y int) bool { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user