Scripting WIP
[oweals/minetest.git] / data / scripts / default.lua
1 --[[function basicSerialize(o)
2         if type(o) == "number" then
3                 return tostring(o)
4         else   -- assume it is a string
5                 return string.format("%q", o)
6         end
7 end
8
9 function dump2(name, value, saved)
10         saved = saved or {}       -- initial value
11         io.write(name, " = ")
12         if type(value) == "number" or type(value) == "string" then
13                 io.write(basicSerialize(value), "\n")
14         elseif type(value) == "table" then
15                 if saved[value] then    -- value already saved?
16                         io.write(saved[value], "\n")  -- use its previous name
17                 else
18                         saved[value] = name   -- save name for next time
19                         io.write("{}\n")     -- create a new table
20                         for k,v in pairs(value) do      -- save its fields
21                                 local fieldname = string.format("%s[%s]", name,
22                                                                                                 basicSerialize(k))
23                                 save(fieldname, v, saved)
24                         end
25                 end
26         else
27                 error("cannot save a " .. type(value))
28         end
29 end]]
30
31 --[[function dump(o, name, dumped, s)
32         name = name or "_"
33         dumped = dumped or {}
34         s = s or ""
35         s = s .. name .. " = "
36         if type(o) == "number" then
37                 s = s .. tostring(o)
38         elseif type(o) == "string" then
39                 s = s .. string.format("%q", o)
40         elseif type(o) == "boolean" then
41                 s = s .. tostring(o)
42         elseif type(o) == "function" then
43                 s = s .. "<function>"
44         elseif type(o) == "nil" then
45                 s = s .. "nil"
46         elseif type(o) == "table" then
47                 if dumped[o] then
48                         s = s .. dumped[o]
49                 else
50                         dumped[o] = name
51                         local t = {}
52                         for k,v in pairs(o) do
53                                 t[#t+1] = dump(v, k, dumped)
54                         end
55                         s = s .. "{" .. table.concat(t, ", ") .. "}"
56                 end
57         else
58                 error("cannot dump a " .. type(o))
59                 return nil
60         end
61         return s
62 end]]
63
64 function basic_dump2(o)
65         if type(o) == "number" then
66                 return tostring(o)
67         elseif type(o) == "string" then
68                 return string.format("%q", o)
69         elseif type(o) == "boolean" then
70                 return tostring(o)
71         elseif type(o) == "function" then
72                 return "<function>"
73         elseif type(o) == "userdata" then
74                 return "<userdata>"
75         elseif type(o) == "nil" then
76                 return "nil"
77         else
78                 error("cannot dump a " .. type(o))
79                 return nil
80         end
81 end
82
83 function dump2(o, name, dumped)
84         name = name or "_"
85         dumped = dumped or {}
86         io.write(name, " = ")
87         if type(o) == "number" or type(o) == "string" or type(o) == "boolean"
88                         or type(o) == "function" or type(o) == "nil"
89                         or type(o) == "userdata" then
90                 io.write(basic_dump2(o), "\n")
91         elseif type(o) == "table" then
92                 if dumped[o] then
93                         io.write(dumped[o], "\n")
94                 else
95                         dumped[o] = name
96                         io.write("{}\n") -- new table
97                         for k,v in pairs(o) do
98                                 local fieldname = string.format("%s[%s]", name, basic_dump2(k))
99                                 dump2(v, fieldname, dumped)
100                         end
101                 end
102         else
103                 error("cannot dump a " .. type(o))
104                 return nil
105         end
106 end
107
108 function dump(o, dumped)
109         dumped = dumped or {}
110         if type(o) == "number" then
111                 return tostring(o)
112         elseif type(o) == "string" then
113                 return string.format("%q", o)
114         elseif type(o) == "table" then
115                 if dumped[o] then
116                         return "<circular reference>"
117                 end
118                 dumped[o] = true
119                 local t = {}
120                 for k,v in pairs(o) do
121                         t[#t+1] = "" .. k .. " = " .. dump(v, dumped)
122                 end
123                 return "{" .. table.concat(t, ", ") .. "}"
124         elseif type(o) == "boolean" then
125                 return tostring(o)
126         elseif type(o) == "function" then
127                 return "<function>"
128         elseif type(o) == "userdata" then
129                 return "<userdata>"
130         elseif type(o) == "nil" then
131                 return "nil"
132         else
133                 error("cannot dump a " .. type(o))
134                 return nil
135         end
136 end
137
138 print("omg lol")
139 print("minetest dump: "..dump(minetest))
140
141 --local TNT = minetest.new_entity {
142 local TNT = {
143         -- Maybe handle gravity and collision this way? dunno
144         physical = true,
145         weight = 5,
146         collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
147         visual = "cube",
148         textures = {"tnt_top.png","tnt_bottom.png","tnt_side.png","tnt_side.png","tnt_side.png","tnt_side.png"},
149         -- Initial value for our timer
150         timer = 0,
151         -- List names of state variables, for serializing object state
152         state_variables = {"timer"},
153 }
154
155 -- Called periodically
156 function TNT:on_step(dtime)
157         --print("TNT:on_step()")
158 end
159
160 -- Called when object is punched
161 function TNT:on_punch(hitter)
162         print("TNT:on_punch()")
163 end
164
165 -- Called when object is right-clicked
166 function TNT:on_rightclick(clicker)
167         print("TNT:on_rightclick()")
168         print("self: "..dump(self))
169         print("getmetatable(self): "..dump(getmetatable(self)))
170         print("getmetatable(getmetatable(self)): "..dump(getmetatable(getmetatable(self))))
171         pos = self.object:getpos()
172         print("TNT:on_rightclick(): object position: "..dump(pos))
173         pos = {x=pos.x+0.5+1, y=pos.y+0.5, z=pos.z+0.5}
174         --minetest.env:add_node(pos, 0)
175 end
176
177 print("TNT dump: "..dump(TNT))
178
179 print("Registering TNT");
180 minetest.register_entity("TNT", TNT)
181
182 --print("minetest.registered_entities: "..dump(minetest.registered_entities))
183 print("minetest.registered_entities:")
184 dump2(minetest.registered_entities)
185