forked from googleforgames/space-agon
-
Notifications
You must be signed in to change notification settings - Fork 0
/
generation.go
127 lines (110 loc) · 3.02 KB
/
generation.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
118
119
120
121
122
123
124
125
126
127
// Copyright 2018 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//go:generate go run github.com/mbychkowski/space-agon/game/generation
//go:generate go fmt github.com/mbychkowski/space-agon/game
package main
import (
"fmt"
"os"
"text/template"
)
var components = map[string]string{
// "ExplosionDetails": "ExplosionDetails",
"Lookup": "Lookup",
"MissileDetails": "MissileDetails",
"Momentum": "Vec2",
"NetworkId": "uint64",
"Pos": "Vec2",
"Rot": "float32",
"ShipControl": "ShipControl",
// "SpawnEvent": "SpawnType",
"Spin": "float32",
"Sprite": "Sprite",
"TimedDestroy": "float32",
"TimedExplode": "float32",
"AffectedByGravity": "",
"BoundLocation": "",
"CanExplode": "",
"FrameEndDelete": "",
"KeepInCamera": "",
"NetworkReceive": "",
"NetworkTransmit": "",
"ParticleSunDelete": "",
"PointRender": "",
}
var typeLiterals = map[string]string{
// "ExplosionDetails": "ExplosionDetails{Initialized: false}",
"float32": "0",
"uint64": "0",
"Lookup": "<Lookup is special, this should be never invoked>",
"SpawnType": "0",
"Sprite": "SpriteUnset",
}
func main() {
fmt.Println("Starting generation")
t := template.Must(template.ParseFiles("components.gotemplate"))
f, err := os.Create("../components.go")
if err != nil {
panic(err)
}
defer f.Close()
err = t.Execute(f, getInfo())
if err != nil {
panic(err)
}
fmt.Println("Generation Complete")
}
type compType struct {
Name string
TrueType string
TypeLiteral string
GenerateTypeDeclaration bool
ReturnPointer bool
}
type Info struct {
CompTypes map[string]*compType
Comps map[string]*compType
}
func getInfo() *Info {
// Known types start with those defined in the file because they don't fit the
// standard pattern.
i := &Info{
CompTypes: make(map[string]*compType),
Comps: make(map[string]*compType),
}
for k, v := range components {
if v == "" {
i.Comps[k] = nil
continue
}
if _, ok := i.CompTypes[v]; !ok {
c := &compType{
Name: "comp_" + v,
TrueType: v,
GenerateTypeDeclaration: true,
ReturnPointer: true,
}
if literal, ok := typeLiterals[v]; ok {
c.TypeLiteral = literal
} else {
c.TypeLiteral = v + "{}"
}
i.CompTypes[v] = c
}
i.Comps[k] = i.CompTypes[v]
}
i.CompTypes["Lookup"].GenerateTypeDeclaration = false
i.CompTypes["Lookup"].ReturnPointer = false
return i
}