-
Notifications
You must be signed in to change notification settings - Fork 0
/
level.go
117 lines (106 loc) · 2.66 KB
/
level.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package game
import (
"image/color"
"github.com/oakmound/lowrez17/game/layers"
"github.com/oakmound/lowrez17/game/sfx"
"github.com/oakmound/oak"
"github.com/oakmound/oak/event"
"github.com/oakmound/oak/physics"
"github.com/oakmound/oak/render"
)
var (
envFriction = 0.3
traveler *BodyTraveler
thisBody *Body
player *Player
)
//LevelInit sets up a level
func LevelInit(prevScene string, inLevel interface{}) {
Init()
sfx.Audios["fantastic"].Play()
b := GetBody(inLevel.(string))
player = nil
thisBody = b
var firstVein = true
var playerStart int
render.Draw(b.overlay, layers.BodyOverlayLayer)
for i, n := range b.graph {
pos := n.Vec()
var r render.Modifiable
if o, ok := n.Organ(); ok {
r = o.R()
w, h := r.GetDims()
pos = pos.Copy().Sub(physics.NewVector(float64(w)/2, float64(h)/2))
r.SetPos(pos.X(), pos.Y())
n.SetPos(pos)
render.Draw(r, layers.OrganLayer)
} else {
if firstVein {
playerStart = i
}
firstVein = false
// We could modify color at nodes
r := n.R()
pos.Sub(physics.NewVector(1, 1))
r.SetPos(pos.X(), pos.Y())
n.SetPos(pos)
render.Draw(r, layers.VeinLayer)
}
}
for i, list := range b.adjacency {
for _, j := range list {
if i > j {
v := NewVein(b.graph[i], b.graph[j], b)
render.Draw(v, layers.VeinLayer)
b.veins[i][j] = v
b.veins[j][i] = v
}
}
}
diseasedPalette = []color.Color{}
rd, gd, bd, _ := thisBody.veinColor2.RGBA()
for i := uint8(0); i < 127; i++ {
diseasedPalette = append(diseasedPalette, color.RGBA{i * (uint8(rd)), i * (uint8(gd)), i * (uint8(bd)), 255})
}
// Place player
pos := NodeCenter(b.graph[playerStart])
traveler = NewBodyTraveler(pos.X(), pos.Y())
// Bindings ...
event.GlobalBind(enterOrgan, "HitNode")
event.GlobalBind(spreadInfection, "EnterFrame")
event.GlobalBind(heartBeat, "EnterFrame")
}
func heartBeat(no int, frame interface{}) int {
f := frame.(int)
// Todo: increase heart rate with poor body health
if f%120 == 0 {
event.Trigger("Heartbeat", nil)
}
return 0
}
func enterOrgan(no int, nothing interface{}) int {
i := thisBody.VecIndex(traveler.Vector)
if o, ok := thisBody.graph[i].Organ(); ok {
if o.DiseaseLevel() > 0 && o.DiseaseLevel() < 1 {
oak.SetScreenFilter(FadeBy(o.DiseaseLevel()))
traveler.active = false
NewPlayer()
o.Place()
startupWalls()
startupFans()
startupPlayer()
}
}
return 0
}
func LevelLoop() bool {
return !thisBody.complete
}
func LevelEnd() (nextScene string, result *oak.SceneResult) {
sfx.Audios["fantastic"].Stop()
oak.ClearScreenFilter()
return "menu", &oak.SceneResult{
NextSceneInput: thisBody.Stats(),
Transition: oak.TransitionFade(.03, 100),
}
}