Files
LilGuy/internal/maps/map.go
2025-11-25 11:59:59 -07:00

87 lines
1.8 KiB
Go

package maps
import (
"image/color"
"github.com/hajimehoshi/ebiten/v2"
"github.com/atridad/LilGuy/internal/portal"
"github.com/atridad/LilGuy/internal/world"
)
type Map struct {
ID string
Number int
DisplayName string
Width float64
Height float64
World *world.World
Portals []*portal.Portal
BackgroundColor color.NRGBA
bakedImage *ebiten.Image
}
func NewMap(id string, number int, displayName string, width, height float64) *Map {
return &Map{
ID: id,
Number: number,
DisplayName: displayName,
Width: width,
Height: height,
World: world.NewWorld(),
Portals: make([]*portal.Portal, 0),
BackgroundColor: color.NRGBA{R: 135, G: 206, B: 235, A: 255},
}
}
func (m *Map) AddPortal(p *portal.Portal) {
m.Portals = append(m.Portals, p)
}
func (m *Map) GetPortalByID(id string) *portal.Portal {
for _, p := range m.Portals {
if p.ID == id {
return p
}
}
return nil
}
// Renders the static world geometry to an offscreen image
func (m *Map) Bake() {
if m.Width <= 0 || m.Height <= 0 {
return
}
m.bakedImage = ebiten.NewImage(int(m.Width), int(m.Height))
m.bakedImage.Fill(m.BackgroundColor)
m.World.Draw(m.bakedImage)
}
func (m *Map) Draw(screen *ebiten.Image) {
if m.bakedImage != nil {
screen.DrawImage(m.bakedImage, nil)
} else {
screen.Fill(m.BackgroundColor)
m.World.Draw(screen)
}
// Draw portals
for _, p := range m.Portals {
p.Draw(screen)
}
}
// Resets the map state
func (m *Map) Reset() {
for _, p := range m.Portals {
p.Enabled = true
p.Visible = true
}
}
func CreateDefaultMaps(screenWidth, screenHeight float64) (*Map, *Map) {
plains := CreatePlains(screenWidth, screenHeight)
desert := CreateDesert(screenWidth, screenHeight)
return plains, desert
}