From 4a155efa149eb536c31139d214566a45a560c618 Mon Sep 17 00:00:00 2001 From: Trevor Slocum Date: Tue, 26 Oct 2021 19:21:26 -0700 Subject: [PATCH] Add ghosts --- assets/creeps/ghost/ghost1.png | Bin 0 -> 954 bytes assets/creeps/ghost/ghost1r.png | Bin 0 -> 5565 bytes assets/creeps/ghost/ghost2.png | Bin 0 -> 956 bytes assets/creeps/ghost/ghost2r.png | Bin 0 -> 5536 bytes assets/ojas-dungeon/character_run.png | Bin 10942 -> 11189 bytes assets/sandstone-dungeon/Tiles-Props-pack.png | Bin 408636 -> 34623 bytes creep.go | 131 ++++++++++++- game.go | 180 +++++++----------- img.go | 8 + level.go | 77 +++++++- ss_bat.go | 2 + ss_environment.go | 82 +++++--- ss_player.go | 2 + tile.go | 7 +- 14 files changed, 353 insertions(+), 136 deletions(-) create mode 100644 assets/creeps/ghost/ghost1.png create mode 100644 assets/creeps/ghost/ghost1r.png create mode 100644 assets/creeps/ghost/ghost2.png create mode 100644 assets/creeps/ghost/ghost2r.png diff --git a/assets/creeps/ghost/ghost1.png b/assets/creeps/ghost/ghost1.png new file mode 100644 index 0000000000000000000000000000000000000000..456da04f184e1f3deea66d3fb9dc99884e2895e5 GIT binary patch literal 954 zcmV;r14aCaP)EX>4Tx04R}tkv&MmKpe$iQ>9WWA}u1~kfAzR5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWEwqU7;J6>}?mh0_0YbgZG^=YI&~)2O zCE{WxyDA1=5ySxc5kpvJmN6$uNqCO0d-(Wz7vovp=l&eMYR+PSPb8jYhG`RT5KnK~ z2Iqa^2rJ4e@j3CBNf#u3x%k-#FBAVGwJDoQBBroKwhNwJWk{kVsJ$n{I)Qpi;T zBgX*{h@IUz7t(BjgXeNc?K=+H|e2f5rU7%5OobO}DX`BH5XW&Y2`zv)|=9BbV zTZg?t`(KcjET0^wUAxYq2gwU5&WAWdB*Z-9eC zV6;Hl>mKj!>Fn*_Gp+u90Eb0#uW_#7ssI2024YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvPD5i~Qbfos(O000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0004zNkl-s49xI6iMVH>H&)!M*sD1EvBgCS z8Z6!2{7_$&B$LSyAW8#3lB!pw!i@Z}9YwoK*L$zp&^hMc{tFXP=#OS=7xQ z_;t$yfEd%RNy46L683$6$x(__c%G&yaDoqV;@{{10c;V5h_yA(L7i*8z=fC-<_Lkb zW~CbDoTuL%b(#^hgEKe}2;>4v6{k4|V))a5auU>OHquCHsT}EdsUDbC3V6na5+|Mz z_~>nOF2okP%{fOgZ`1)z$v{Xa+^cg8pJvrsdPe+E5oP!^>#JsjWdgNCz*_rs!u~n} zxqv&NfWqyR^4`ll&&?4i$#R!QM^cFOEoD#-rJ#8V>S)!lKFo@-5|Yg80MT9-N_;6! z#p5{cMzY%ZAVuJOCTw^wXmc|%pscLE8D%m)^i{qY@lgw;m$Yj&FA)|M8?sV#aJda% cIpJ#U3p#8nZh)s42LJ#707*qoM6N<$g3xxZ4FCWD literal 0 HcmV?d00001 diff --git a/assets/creeps/ghost/ghost1r.png b/assets/creeps/ghost/ghost1r.png new file mode 100644 index 0000000000000000000000000000000000000000..4d013799ed98b36fa936ee1b1bb2a7885f0cc8b8 GIT binary patch literal 5565 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 U$W37tP-S5(S084Tb42og0jCF#g#Z8m literal 0 HcmV?d00001 diff --git a/assets/creeps/ghost/ghost2.png b/assets/creeps/ghost/ghost2.png new file mode 100644 index 0000000000000000000000000000000000000000..c0272dd44c245739d7859b8d3d27cfdd8fdf808b GIT binary patch literal 956 zcmV;t14I0YP)EX>4Tx04R}tkv&MmKpe$iQ>9WWA}u1~kfAzR5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWEwqU7;J6>}?mh0_0YbgZG^=YI&~)2O zCE{WxyDA1=5ySxc5kpvJmN6$uNqCO0d-(Wz7vovp=l&eMYR+PSPb8jYhG`RT5KnK~ z2Iqa^2rJ4e@j3CBNf#u3x%k-#FBAVGwJDoQBBroKwhNwJWk{kVsJ$n{I)Qpi;T zBgX*{h@IUz7t(BjgXeNc?K=+H|e2f5rU7%5OobO}DX`BH5XW&Y2`zv)|=9BbV zTZg?t`(KcjET0^wUAxYq2gwU5&WAWdB*Z-9eC zV6;Hl>mKj!>Fn*_Gp+u90Eb0#uW_#7ssI2024YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jvPD5jGy%XjLKr000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0004#NklrihC8O9~BD} z5Y+89Kgd%_m`sKMsWbp2S@o$jn97^26m76wYi-qn#+dI_S%*khfc(U+u({n!8*)4U zoUAO~+hG{0oX_(d1b@HZT@YyEz;Y0PR^;G4QK(|=C?w@}y9FQCBJg}ZlXGKC5_JuM zU$$KU5Y_97#I0FP!oKehIf{{T^J$tKC%BRm|3(K0V2jX2T$}S0)Tz>QT<|%eS0mt@ z`?)Sv#R3t{=~PUb9Ekz}S)DrsQUS$^qou`sDC2qQzg$2m3F=-(uGMkuJk|rfN&)w{ zkmJNJ1U~xVbO0sjU9}lwDEdMjsNo9;>4dF4%rT44h#xBAy-KLUG)Zd5mNOzgVUq~> z1gaU&@}d(8DBMmdYppyUkKl*B@l3PQ#nF)zV)-);bm{WY%USPwMPCU?rgeZXsEiz6 zvR&~wjzLS-+8@LS?DvEh-V3g|87U|Wn{P&m9T$D&Z$?~mf%uYkEa$nBMZr4W literal 0 HcmV?d00001 diff --git a/assets/creeps/ghost/ghost2r.png b/assets/creeps/ghost/ghost2r.png new file mode 100644 index 0000000000000000000000000000000000000000..b6f5c6ff06bbad8da03edb283c2c05126bf3364d GIT binary patch literal 5536 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 m#5vGWq89rY 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 f4x1nVi%hNzklvOuT%W~?fB(i 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 SGy*SJ04Xb|$ydpmhWrl_!a8yQ literal 408636 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%0A{!8A%X6!TR~ofP&-bdY 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 icVoNuO1J^yp|d}I|LVlS_elox 1 { + startingFrame = rand.Intn(len(sprites)) + } + + x, y := l.newSpawnLocation() + return &gameCreep{ + creepType: creepType, + x: x, + y: y, + sprites: sprites, + frames: len(sprites), + frame: startingFrame, + level: l, + player: p, + health: 1, + } +} + func (c *gameCreep) queueNextAction() { if c.creepType == TypeBat { c.nextAction = 288 + rand.Intn(288) @@ -100,6 +157,22 @@ func (c *gameCreep) doNextAction() { randMovementA := (rand.Float64() - 0.5) / 12 randMovementB := (rand.Float64() - 0.5) / 12 + if c.creepType == TypeGhost { + c.angle = angle(c.x, c.y, c.player.x, c.player.y) + + // TODO optimize + if c.angle > math.Pi/2 || c.angle < -1*math.Pi/2 { + c.sprites = []*ebiten.Image{ + imageAtlas[ImageGhost1R], + } + c.angle = c.angle - math.Pi + } else { + c.sprites = []*ebiten.Image{ + imageAtlas[ImageGhost1], + } + } + } + repelled := c.repelled() if !repelled && rand.Intn(13) == 0 { c.seekPlayer() @@ -125,6 +198,54 @@ func (c *gameCreep) repelled() bool { return repelled } +// TODO return true when creep is facing player and player is facing creep +func (c *gameCreep) facingPlayer() bool { + mod := func(v float64) float64 { + for v > math.Pi { + v -= math.Pi + } + for v < math.Pi*-1 { + v += math.Pi + } + return v + } + _ = mod + + ca := math.Remainder(c.angle, math.Pi) + ca = math.Remainder(ca, -math.Pi) + if ca < 0 { + ca = math.Pi + ca + } + ca = c.angle + if ca < 0 { + ca = math.Pi*2 + ca + } + pa := math.Remainder(c.player.angle, math.Pi) + pa = math.Remainder(pa, -math.Pi) + if pa < 0 { + pa = math.Pi + pa + } + pa = c.player.angle + if pa < 0 { + pa = math.Pi*2 + pa + } + + a := ca - pa + if pa > ca { + a = pa - ca + } + + if rand.Intn(70) == 0 { + // TODO + log.Println(ca, pa, a) + } + + return a < 2 + //a2 := c.player.angle - c.angle + // TODO + //return a > math.Pi/2*-1 && a2 > math.Pi/2*-1 && a < math.Pi/2 && a2 < math.Pi/2 +} + func (c *gameCreep) Update() { c.Lock() defer c.Unlock() @@ -133,10 +254,18 @@ func (c *gameCreep) Update() { return } + if c.creepType == TypeTorch { + return + } + c.tick++ repelled := c.repelled() + if c.creepType == TypeGhost && c.facingPlayer() { + return + } + dx, dy := deltaXY(c.x, c.y, c.player.x, c.player.y) seekDistance := 2.0 if !repelled && dx < seekDistance && dy < seekDistance { @@ -191,7 +320,7 @@ func (c *gameCreep) killScore() int { case TypeBat: return 125 case TypeGhost: - return 75 + return 150 default: return 0 } diff --git a/game.go b/game.go index ad15c91..34bd53f 100644 --- a/game.go +++ b/game.go @@ -94,10 +94,6 @@ type game struct { projectiles []*projectile - batSS *BatSpriteSheet - - ojasSS *PlayerSpriteSheet - overlayImg *ebiten.Image op *ebiten.DrawImageOptions @@ -160,6 +156,8 @@ func NewGame() (*game, error) { } func (g *game) flashMessage(message string) { + log.Println(message) + g.flashMessageText = message g.flashMessageUntil = time.Now().Add(3 * time.Second) } @@ -167,12 +165,12 @@ func (g *game) flashMessage(message string) { func (g *game) loadAssets() error { var err error // Load SpriteSheets. - g.ojasSS, err = LoadPlayerSpriteSheet() + ojasSS, err = LoadPlayerSpriteSheet() if err != nil { return fmt.Errorf("failed to load embedded spritesheet: %s", err) } - g.batSS, err = LoadBatSpriteSheet() + batSS, err = LoadBatSpriteSheet() if err != nil { return fmt.Errorf("failed to load embedded spritesheet: %s", err) } @@ -199,44 +197,6 @@ func (g *game) newItem(itemType int) *gameItem { } } -func (g *game) newCreep(creepType int) *gameCreep { - sprites := []*ebiten.Image{ - imageAtlas[ImageVampire1], - imageAtlas[ImageVampire2], - imageAtlas[ImageVampire3], - imageAtlas[ImageVampire2], - } - if creepType == TypeBat { - sprites = []*ebiten.Image{ - g.batSS.Frame1, - g.batSS.Frame2, - g.batSS.Frame3, - g.batSS.Frame4, - g.batSS.Frame5, - g.batSS.Frame6, - g.batSS.Frame7, - } - } - - startingFrame := 0 - if len(sprites) > 1 { - startingFrame = rand.Intn(len(sprites)) - } - - x, y := g.level.newSpawnLocation() - return &gameCreep{ - creepType: creepType, - x: x, - y: y, - sprites: sprites, - frames: len(sprites), - frame: startingFrame, - level: g.level, - player: g.player, - health: 1, - } -} - func (g *game) nextLevel() error { g.levelNum++ if g.levelNum > 13 { @@ -255,11 +215,10 @@ func (g *game) generateLevel() error { } var err error - g.level, err = NewLevel(g.levelNum) + g.level, err = NewLevel(g.levelNum, g.player) if err != nil { return fmt.Errorf("failed to create new level: %s", err) } - g.level.player = g.player // Position player. for { @@ -273,20 +232,10 @@ func (g *game) generateLevel() error { // Spawn items. g.level.items = nil - added := make(map[string]bool) for i := 0; i < spawnGarlic; i++ { itemType := itemTypeGarlic c := g.newItem(itemType) - - addedItem := fmt.Sprintf("%0.0f-%0.0f", c.x, c.y) - if added[addedItem] { - // Already added a gameItem here. - i-- - continue - } - g.level.items = append(g.level.items, c) - added[addedItem] = true } // Spawn starting garlic. item := g.newItem(itemTypeGarlic) @@ -305,20 +254,8 @@ func (g *game) generateLevel() error { g.level.items = append(g.level.items, item) // Spawn creeps. - g.level.creeps = make([]*gameCreep, spawnVampire) for i := 0; i < spawnVampire; i++ { - creepType := TypeVampire - c := g.newCreep(creepType) - - addedCreep := fmt.Sprintf("%0.0f-%0.0f", c.x, c.y) - if added[addedCreep] { - // Already added a gameCreep here. - i-- - continue - } - - g.level.creeps[i] = c - added[addedCreep] = true + g.level.addCreep(TypeVampire) } return nil } @@ -434,6 +371,11 @@ func (g *game) Update() error { c.Update() + if c.creepType == TypeTorch { + continue + } + + // TODO can this move into creep? cx, cy := c.Position() dx, dy := deltaXY(g.player.x, g.player.y, cx, cy) if dx <= biteThreshold && dy <= biteThreshold { @@ -565,7 +507,7 @@ func (g *game) Update() error { dx, dy := deltaXY(g.player.x, g.player.y, item.x, item.y) if dx <= 1 && dy <= 1 { item.health = 0 - g.player.score += item.useScore() + g.player.score += item.useScore() * g.levelNum if item.itemType == itemTypeGarlic { g.playSound(SoundMunch, munchVolume) @@ -613,9 +555,14 @@ UPDATEPROJECTILES: continue } + threshold := bulletHitThreshold + if c.creepType == TypeTorch { + threshold = 1 + } + cx, cy := c.Position() dx, dy := deltaXY(p.x, p.y, cx, cy) - if dx > bulletHitThreshold || dy > bulletHitThreshold { + if dx > threshold || dy > threshold { continue } @@ -663,7 +610,7 @@ UPDATEPROJECTILES: if g.tick%200 == 0 { removed = 0 for i, creep := range g.level.creeps { - if creep.health != 0 { + if creep.health != 0 || creep.creepType == TypeTorch { continue } @@ -679,7 +626,7 @@ UPDATEPROJECTILES: g.level.items = append(g.level.items, item) if g.debugMode { - log.Println("SPAWN GARLIC") + g.flashMessage("SPAWN GARLIC") } } @@ -689,7 +636,7 @@ UPDATEPROJECTILES: g.level.items = append(g.level.items, item) if g.debugMode { - log.Println("SPAWN HOLY WATER") + g.flashMessage("SPAWN HOLY WATER") } } @@ -701,13 +648,10 @@ UPDATEPROJECTILES: spawnAmount *= 4 } if g.debugMode && spawnAmount > 0 { - log.Printf("SPAWN %d VAMPIRES", spawnAmount) + g.flashMessage(fmt.Sprintf("SPAWN %d VAMPIRES", spawnAmount)) } for i := 0; i < spawnAmount; i++ { - creepType := TypeVampire - c := g.newCreep(creepType) - - g.level.creeps = append(g.level.creeps, c) + g.level.addCreep(TypeVampire) } } @@ -721,13 +665,27 @@ UPDATEPROJECTILES: } spawnAmount = rand.Intn(spawnAmount) if g.debugMode && spawnAmount > 0 { - log.Printf("SPAWN %d BATS", spawnAmount) + g.flashMessage(fmt.Sprintf("SPAWN %d BATS", spawnAmount)) } for i := 0; i < spawnAmount; i++ { - creepType := TypeBat - c := g.newCreep(creepType) + g.level.addCreep(TypeBat) + } + } - g.level.creeps = append(g.level.creeps, c) + // Spawn ghosts. + if g.tick%1872 == 0 { + spawnAmount := g.tick / 1872 + if spawnAmount < 1 { + spawnAmount = 1 + } else if spawnAmount > 6 { + spawnAmount = 6 + } + spawnAmount = rand.Intn(spawnAmount) + if g.debugMode && spawnAmount > 0 { + g.flashMessage(fmt.Sprintf("SPAWN %d GHOSTS", spawnAmount)) + } + for i := 0; i < spawnAmount; i++ { + g.level.addCreep(TypeGhost) } } } @@ -752,6 +710,12 @@ UPDATEPROJECTILES: g.player.holyWaters++ g.flashMessage("+ HOLY WATER") } + if ebiten.IsKeyPressed(ebiten.KeyControl) && inpututil.IsKeyJustPressed(ebiten.Key2) { + for i := 0; i < 13; i++ { + g.level.addCreep(TypeGhost) + } + g.flashMessage("+ GHOST") + } if ebiten.IsKeyPressed(ebiten.KeyControl) && inpututil.IsKeyJustPressed(ebiten.Key6) { g.fullBrightMode = !g.fullBrightMode if g.fullBrightMode { @@ -777,7 +741,6 @@ UPDATEPROJECTILES: } if inpututil.IsKeyJustPressed(ebiten.KeyP) { if g.cpuProfile == nil { - log.Println("CPU profiling started...") g.flashMessage("CPU PROFILING STARTED") homeDir, err := os.UserHomeDir() @@ -792,7 +755,6 @@ UPDATEPROJECTILES: return err } } else { - log.Println("Profiling stopped") g.flashMessage("CPU PROFILING STOPPED") pprof.StopCPUProfile() @@ -899,6 +861,10 @@ func (g *game) tilePosition(x, y float64) (float64, float64) { // renderSprite renders a sprite on the screen. func (g *game) renderSprite(x float64, y float64, offsetx float64, offsety float64, angle float64, scale float64, colorScale float64, alpha float64, sprite *ebiten.Image, target *ebiten.Image) int { + if alpha <= .01 || colorScale <= .01 { + return 0 + } + x, y = g.tilePosition(x, y) // Skip drawing off-screen tiles. @@ -939,27 +905,13 @@ func (g *game) colorScale(x, y float64) float64 { return 1 } - dx, dy := deltaXY(x, y, g.player.x, g.player.y) + v := colorScaleValue(x, y, g.player.x, g.player.y) - sD := 7 / (dx + dy) - if sD > 1 { - sD = 1 - } - - sDB := sD - if dx > 4 { - sDB *= 0.6 / (dx / 4) - } - if dy > 4 { - sDB *= 0.6 / (dy / 4) - } + tileV := g.level.Tile(int(x), int(y)).colorScale - sD = sD * 2 * sDB - if sD > 1 { - sD = 1 - } + s := math.Min(1, v+tileV) - return sD + return s } // renderLevel draws the current Level on the screen. @@ -989,11 +941,11 @@ func (g *game) renderLevel(screen *ebiten.Image) int { } for _, c := range g.level.creeps { - if c.health == 0 { + if c.health == 0 && c.creepType != TypeTorch { continue } - drawn += g.renderSprite(c.x, c.y, 0, 0, 0, 1.0, g.colorScale(c.x, c.y), 1.0, c.sprites[c.frame], screen) + drawn += g.renderSprite(c.x, c.y, 0, 0, c.angle, 1.0, g.colorScale(c.x, c.y), 1.0, c.sprites[c.frame], screen) if c.frames > 1 && time.Since(c.lastFrame) >= 75*time.Millisecond { c.frame++ if c.frame == c.frames { @@ -1029,17 +981,18 @@ func (g *game) renderLevel(screen *ebiten.Image) int { drawn += g.renderSprite(g.player.x+0.25, g.player.y+0.25, -offset, -offset, 0, scale, 1.0, alpha, imageAtlas[ImageHolyWater], screen) } - playerSprite := g.ojasSS.Frame1 + playerSprite := ojasSS.Frame1 playerAngle := g.player.angle weaponSprite := g.player.weapon.spriteFlipped mul := float64(1) if g.player.angle > math.Pi/2 || g.player.angle < -1*math.Pi/2 { - playerSprite = g.ojasSS.Frame2 + playerSprite = ojasSS.Frame2 playerAngle = playerAngle - math.Pi weaponSprite = g.player.weapon.sprite mul = -1 } drawn += g.renderSprite(g.player.x, g.player.y, 0, 0, playerAngle, 1.0, 1.0, 1.0, playerSprite, screen) + drawn += g.renderSprite(g.player.x, g.player.y, -10*mul, 2, playerAngle, 1.0, 1.0, 1.0, sandstoneSS.TorchMulti, screen) if g.player.weapon != nil { drawn += g.renderSprite(g.player.x, g.player.y, 11*mul, 9, playerAngle, 1.0, 1.0, 1.0, weaponSprite, screen) } @@ -1086,7 +1039,18 @@ func (g *game) hurtCreep(c *gameCreep, damage int) error { } // Killed creep. - g.player.score += c.killScore() + g.player.score += c.killScore() * g.levelNum + + if c.creepType == TypeTorch { + // TODO play break sound + c.frames = 1 + c.frame = 0 + c.sprites = []*ebiten.Image{ + sandstoneSS.TorchTop9, + } + g.level.bakePartialLightmap(int(c.x), int(c.y)) + return nil + } // Play vampire die sound. diff --git a/img.go b/img.go index e07aa9f..18affc4 100644 --- a/img.go +++ b/img.go @@ -11,6 +11,10 @@ const ( ImageVampire1 = iota ImageVampire2 ImageVampire3 + ImageGhost1 + ImageGhost1R + ImageGhost2 + ImageGhost2R ImageGarlic ImageHolyWater ImageHeart @@ -23,6 +27,10 @@ var imageMap = map[int]string{ ImageVampire1: "assets/creeps/vampire/vampire1.png", ImageVampire2: "assets/creeps/vampire/vampire2.png", ImageVampire3: "assets/creeps/vampire/vampire3.png", + ImageGhost1: "assets/creeps/ghost/ghost1.png", + ImageGhost1R: "assets/creeps/ghost/ghost1r.png", + ImageGhost2: "assets/creeps/ghost/ghost2.png", + ImageGhost2R: "assets/creeps/ghost/ghost2r.png", ImageGarlic: "assets/items/garlic.png", ImageHolyWater: "assets/items/holywater.png", ImageHeart: "assets/ui/heart.png", diff --git a/level.go b/level.go index 86c3662..483d08e 100644 --- a/level.go +++ b/level.go @@ -23,6 +23,8 @@ type Level struct { liveCreeps int player *gamePlayer + + torches []*gameCreep } // Tile returns the tile at the provided coordinates, or nil. @@ -97,7 +99,7 @@ SPAWNLOCATION: } // NewLevel returns a new randomly generated Level. -func NewLevel(levelNum int) (*Level, error) { +func NewLevel(levelNum int, p *gamePlayer) (*Level, error) { multiplier := levelNum if multiplier > 2 { multiplier = 2 @@ -106,9 +108,11 @@ func NewLevel(levelNum int) (*Level, error) { w: 336 * multiplier, h: 336 * multiplier, tileSize: 32, + player: p, } - sandstoneSS, err := LoadEnvironmentSpriteSheet() + var err error + sandstoneSS, err = LoadEnvironmentSpriteSheet() if err != nil { return nil, fmt.Errorf("failed to load embedded spritesheet: %s", err) } @@ -198,6 +202,10 @@ func NewLevel(levelNum int) (*Level, error) { case spriteTop: if !bottomLeft || !bottomRight || left || right { neighbor.AddSprite(sandstoneSS.WallPillar) + c := newCreep(TypeTorch, l, l.player) + c.x, c.y = float64(nx), float64(ny) + l.creeps = append(l.creeps, c) + l.torches = append(l.torches, c) } else { neighbor.AddSprite(sandstoneSS.WallTop) } @@ -222,9 +230,74 @@ func NewLevel(levelNum int) (*Level, error) { } } + l.bakeLightmap() + return l, nil } +func (l *Level) bakeLightmap() { + for x := 0; x < l.w; x++ { + for y := 0; y < l.h; y++ { + t := l.tiles[y][x] + v := 0.0 + for _, torch := range l.torches { + if torch.health == 0 { + continue + } + torchV := colorScaleValue(float64(x), float64(y), torch.x, torch.y) + v += torchV + } + t.colorScale = v + } + } +} + +func (l *Level) bakePartialLightmap(lx, ly int) { + radius := 16 + for x := lx - radius; x < lx+radius; x++ { + for y := ly - radius; y < ly+radius; y++ { + t := l.Tile(x, y) + if t == nil { + continue + } + v := 0.0 + for _, torch := range l.torches { + if torch.health == 0 { + continue + } + torchV := colorScaleValue(float64(x), float64(y), torch.x, torch.y) + v += torchV + } + t.colorScale = v + } + } +} + +func (l *Level) addCreep(creepType int) { + c := newCreep(creepType, l, l.player) + l.creeps = append(l.creeps, c) +} + func angle(x1, y1, x2, y2 float64) float64 { return math.Atan2(y1-y2, x1-x2) } + +func colorScaleValue(x, y, bx, by float64) float64 { + dx, dy := deltaXY(x, y, bx, by) + sD := 7 / (dx + dy) + if sD > 1 { + sD = 1 + } + sDB := sD + if dx > 4 { + sDB *= 0.6 / (dx / 4) + } + if dy > 4 { + sDB *= 0.6 / (dy / 4) + } + sD = sD * 2 * sDB + if sD > 1 { + sD = 1 + } + return sD +} diff --git a/ss_bat.go b/ss_bat.go index f854833..1ac496e 100644 --- a/ss_bat.go +++ b/ss_bat.go @@ -7,6 +7,8 @@ import ( "github.com/hajimehoshi/ebiten/v2" ) +var batSS *BatSpriteSheet + // BatSpriteSheet represents a collection of sprite images. type BatSpriteSheet struct { Frame1 *ebiten.Image diff --git a/ss_environment.go b/ss_environment.go index db5a7de..6ff44ed 100644 --- a/ss_environment.go +++ b/ss_environment.go @@ -7,6 +7,8 @@ import ( "github.com/hajimehoshi/ebiten/v2" ) +var sandstoneSS *EnvironmentSpriteSheet + // EnvironmentSpriteSheet represents a collection of sprite images. type EnvironmentSpriteSheet struct { FloorA *ebiten.Image @@ -21,42 +23,78 @@ type EnvironmentSpriteSheet struct { WallTopLeft *ebiten.Image WallTopRight *ebiten.Image WallPillar *ebiten.Image + TorchTop1 *ebiten.Image + TorchTop2 *ebiten.Image + TorchTop3 *ebiten.Image + TorchTop4 *ebiten.Image + TorchTop5 *ebiten.Image + TorchTop6 *ebiten.Image + TorchTop7 *ebiten.Image + TorchTop8 *ebiten.Image + TorchTop9 *ebiten.Image + TorchMulti *ebiten.Image } // LoadEnvironmentSpriteSheet loads the embedded EnvironmentSpriteSheet. func LoadEnvironmentSpriteSheet() (*EnvironmentSpriteSheet, error) { tileSize := 32 - f, err := assetsFS.Open("assets/sandstone-dungeon/Tiles-SandstoneDungeons.png") + // Populate EnvironmentSpriteSheet. + s := &EnvironmentSpriteSheet{} + + // Dungeon sprites + dungeonFile, err := assetsFS.Open("assets/sandstone-dungeon/Tiles-SandstoneDungeons.png") if err != nil { return nil, err } - img, _, err := image.Decode(f) + defer dungeonFile.Close() + dungeonImg, _, err := image.Decode(dungeonFile) if err != nil { return nil, err } - - sheet := ebiten.NewImageFromImage(img) - - // spriteAt returns a sprite at the provided coordinates. - spriteAt := func(x, y int) *ebiten.Image { - return sheet.SubImage(image.Rect(x*tileSize, (y+1)*tileSize, (x+1)*tileSize, y*tileSize)).(*ebiten.Image) + dungeonSheet := ebiten.NewImageFromImage(dungeonImg) + // dungeonSpriteAt returns a sprite at the provided coordinates. + dungeonSpriteAt := func(x, y int) *ebiten.Image { + return dungeonSheet.SubImage(image.Rect(x*tileSize, (y+1)*tileSize, (x+1)*tileSize, y*tileSize)).(*ebiten.Image) } + s.FloorA = dungeonSpriteAt(3, 1) + s.FloorB = dungeonSpriteAt(2, 0) + s.FloorC = dungeonSpriteAt(2, 1) + s.WallTop = dungeonSpriteAt(1, 2) + s.WallBottom = dungeonSpriteAt(1, 6) + s.WallBottomLeft = dungeonSpriteAt(2, 6) + s.WallBottomRight = dungeonSpriteAt(0, 6) + s.WallLeft = dungeonSpriteAt(2, 2) + s.WallRight = dungeonSpriteAt(0, 2) + s.WallTopLeft = dungeonSpriteAt(2, 3) + s.WallTopRight = dungeonSpriteAt(0, 3) + s.WallPillar = dungeonSpriteAt(8, 4) - // Populate EnvironmentSpriteSheet. - s := &EnvironmentSpriteSheet{} - s.FloorA = spriteAt(3, 1) - s.FloorB = spriteAt(2, 0) - s.FloorC = spriteAt(2, 1) - s.WallTop = spriteAt(1, 2) - s.WallBottom = spriteAt(1, 6) - s.WallBottomLeft = spriteAt(2, 6) - s.WallBottomRight = spriteAt(0, 6) - s.WallLeft = spriteAt(2, 2) - s.WallRight = spriteAt(0, 2) - s.WallTopLeft = spriteAt(2, 3) - s.WallTopRight = spriteAt(0, 3) - s.WallPillar = spriteAt(8, 4) + // Prop sprites + propFile, err := assetsFS.Open("assets/sandstone-dungeon/Tiles-Props-pack.png") + if err != nil { + return nil, err + } + defer propFile.Close() + propImg, _, err := image.Decode(propFile) + if err != nil { + return nil, err + } + propSheet := ebiten.NewImageFromImage(propImg) + // dungeonSpriteAt returns a sprite at the provided coordinates. + propSpriteAt := func(x, y int) *ebiten.Image { + return propSheet.SubImage(image.Rect(x*tileSize, (y+1)*tileSize, (x+1)*tileSize, y*tileSize)).(*ebiten.Image) + } + s.TorchTop1 = propSpriteAt(0, 2) + s.TorchTop2 = propSpriteAt(1, 2) + s.TorchTop3 = propSpriteAt(2, 2) + s.TorchTop4 = propSpriteAt(3, 2) + s.TorchTop5 = propSpriteAt(4, 2) + s.TorchTop6 = propSpriteAt(5, 2) + s.TorchTop7 = propSpriteAt(6, 2) + s.TorchTop8 = propSpriteAt(7, 2) + s.TorchTop9 = propSpriteAt(8, 2) + s.TorchMulti = propSpriteAt(2, 4) return s, nil } diff --git a/ss_player.go b/ss_player.go index 13092c9..95d870e 100644 --- a/ss_player.go +++ b/ss_player.go @@ -8,6 +8,8 @@ import ( "github.com/hajimehoshi/ebiten/v2" ) +var ojasSS *PlayerSpriteSheet + // PlayerSpriteSheet represents a collection of sprite images. type PlayerSpriteSheet struct { Frame1 *ebiten.Image diff --git a/tile.go b/tile.go index e128438..10e2608 100644 --- a/tile.go +++ b/tile.go @@ -7,9 +7,10 @@ import ( // Tile represents a space with an x,y coordinate within a Level. Any number of // sprites may be added to a Tile. type Tile struct { - sprites []*ebiten.Image - floor bool - wall bool + sprites []*ebiten.Image + floor bool + wall bool + colorScale float64 // Minimum color scale (brightness) } // AddSprite adds a sprite to the Tile.