]> git.lizzy.rs Git - hydra-dragonfire.git/blob - convert/push_static.go
Merge pull request #4 from Minetest-j45/master
[hydra-dragonfire.git] / convert / push_static.go
1 package convert
2
3 import (
4         "github.com/dragonfireclient/mt"
5         "github.com/yuin/gopher-lua"
6         "image/color"
7 )
8
9 //go:generate ./push_mkauto.lua
10
11 func CreateVec2(l *lua.LState, val [2]lua.LNumber) {
12         l.Push(l.GetGlobal("vec2"))
13         l.Push(val[0])
14         l.Push(val[1])
15         l.Call(2, 1)
16 }
17
18 func CreateVec3(l *lua.LState, val [3]lua.LNumber) {
19         l.Push(l.GetGlobal("vec3"))
20         l.Push(val[0])
21         l.Push(val[1])
22         l.Push(val[2])
23         l.Call(3, 1)
24 }
25
26 func popValue(l *lua.LState) lua.LValue {
27         ret := l.Get(-1)
28         l.Pop(1)
29         return ret
30 }
31
32 func PushVec2(l *lua.LState, val [2]lua.LNumber) lua.LValue {
33         CreateVec2(l, val)
34         return popValue(l)
35 }
36
37 func PushVec3(l *lua.LState, val [3]lua.LNumber) lua.LValue {
38         CreateVec3(l, val)
39         return popValue(l)
40 }
41
42 func PushBox1(l *lua.LState, val [2]lua.LNumber) lua.LValue {
43         l.Push(l.GetGlobal("box"))
44         l.Push(val[0])
45         l.Push(val[1])
46         l.Call(2, 1)
47         return popValue(l)
48 }
49
50 func PushBox2(l *lua.LState, val [2][2]lua.LNumber) lua.LValue {
51         l.Push(l.GetGlobal("box"))
52         CreateVec2(l, val[0])
53         CreateVec2(l, val[1])
54         l.Call(2, 1)
55         return popValue(l)
56 }
57
58 func PushBox3(l *lua.LState, val [2][3]lua.LNumber) lua.LValue {
59         l.Push(l.GetGlobal("box"))
60         CreateVec3(l, val[0])
61         CreateVec3(l, val[1])
62         l.Call(2, 1)
63         return popValue(l)
64 }
65
66 func PushColor(l *lua.LState, val color.NRGBA) lua.LValue {
67         tbl := l.NewTable()
68         l.SetField(tbl, "r", lua.LNumber(val.R))
69         l.SetField(tbl, "g", lua.LNumber(val.G))
70         l.SetField(tbl, "b", lua.LNumber(val.B))
71         l.SetField(tbl, "a", lua.LNumber(val.A))
72         return tbl
73 }
74
75 func PushStringSet(l *lua.LState, val []string) lua.LValue {
76         tbl := l.NewTable()
77         for _, str := range val {
78                 l.SetField(tbl, str, lua.LTrue)
79         }
80         return tbl
81 }
82
83 func PushStringList[T ~string](l *lua.LState, val []T) lua.LValue {
84         tbl := l.NewTable()
85         for _, s := range val {
86                 tbl.Append(lua.LString(s))
87         }
88         return tbl
89 }
90
91 func Push4096[T uint8 | mt.Content](l *lua.LState, val [4096]T) lua.LValue {
92         tbl := l.NewTable()
93         for i, v := range val {
94                 l.RawSetInt(tbl, i, lua.LNumber(v))
95         }
96         return tbl
97 }
98
99 func PushFields(l *lua.LState, val []mt.Field) lua.LValue {
100         tbl := l.NewTable()
101         for _, pair := range val {
102                 l.SetField(tbl, pair.Name, lua.LString(pair.Value))
103         }
104         return tbl
105 }
106
107 func PushNodeMetaFields(l *lua.LState, val []mt.NodeMetaField) lua.LValue {
108         tbl := l.NewTable()
109         for _, pair := range val {
110                 l.SetField(tbl, pair.Name, lua.LString(pair.Value))
111         }
112         return tbl
113 }
114
115 func PushInv(l *lua.LState, val mt.Inv) lua.LValue {
116         linv := l.NewTable()
117         for _, list := range val {
118                 llist := l.NewTable()
119                 l.SetField(llist, "width", lua.LNumber(list.Width))
120                 for _, stack := range list.Stacks {
121                         lmeta := l.NewTable()
122                         l.SetField(lmeta, "fields", PushFields(l, stack.Fields()))
123                         if toolcaps, ok := stack.ToolCaps(); ok {
124                                 l.SetField(lmeta, "tool_caps", PushToolCaps(l, toolcaps))
125                         }
126
127                         lstack := l.NewTable()
128                         l.SetField(lstack, "name", lua.LString(stack.Name))
129                         l.SetField(lstack, "count", lua.LNumber(stack.Count))
130                         l.SetField(lstack, "wear", lua.LNumber(stack.Wear))
131                         l.SetField(lstack, "meta", lmeta)
132
133                         llist.Append(lstack)
134                 }
135                 l.SetField(linv, list.Name, llist)
136         }
137         return linv
138 }
139
140 func PushNodeMetas(l *lua.LState, val map[uint16]*mt.NodeMeta) lua.LValue {
141         tbl := l.NewTable()
142         for i, meta := range val {
143                 l.RawSetInt(tbl, int(i), PushNodeMeta(l, *meta))
144         }
145         return tbl
146 }
147
148 func PushChangedNodeMetas(l *lua.LState, val map[[3]int16]*mt.NodeMeta) lua.LValue {
149         lmetas := l.NewTable()
150         for pos, meta := range val {
151                 lmeta := l.NewTable()
152                 l.SetField(lmeta, "pos", PushVec3(l, [3]lua.LNumber{lua.LNumber(pos[0]), lua.LNumber(pos[1]), lua.LNumber(pos[2])}))
153                 l.SetField(lmeta, "meta", PushNodeMeta(l, *meta))
154                 lmetas.Append(lmeta)
155         }
156         return lmetas
157 }
158
159 func PushGroups(l *lua.LState, val []mt.Group) lua.LValue {
160         tbl := l.NewTable()
161         for _, group := range val {
162                 l.SetField(tbl, group.Name, lua.LNumber(group.Rating))
163         }
164         return tbl
165 }
166
167 func PushGroupCaps(l *lua.LState, val []mt.ToolGroupCap) lua.LValue {
168         lcaps := l.NewTable()
169         for _, groupcap := range val {
170                 ltimes := l.NewTable()
171                 for _, digtime := range groupcap.Times {
172                         l.RawSetInt(ltimes, int(digtime.Rating), lua.LNumber(digtime.Time))
173                 }
174
175                 lcap := l.NewTable()
176                 l.SetField(lcap, "uses", lua.LNumber(groupcap.Uses))
177                 l.SetField(lcap, "max_lvl", lua.LNumber(groupcap.MaxLvl))
178                 l.SetField(lcap, "times", ltimes)
179
180                 l.SetField(lcaps, groupcap.Name, lcap)
181         }
182         return lcaps
183 }