1box = class:new()
2
3function box:init(x, y)
4	--PHYSICS STUFF
5	self.cox = x
6	self.coy = y
7	self.x = x-14/16
8	self.y = y-12/16
9	self.speedy = 0
10	self.speedx = 0
11	self.width = 12/16
12	self.height = 12/16
13	self.static = false
14	self.active = true
15	self.category = 9
16	self.parent = nil
17	self.portaloverride = true
18
19	self.mask = {	true,
20					false, false, false, false, false,
21					false, true, false, true, true,
22					false, false, true, false, false,
23					true, true, false, false, true,
24					false, true, true, false, false,
25					true, false, true, true, true}
26
27	self.emancipatecheck = true
28
29	self.userect = adduserect(self.x, self.y, 12/16, 12/16, self)
30
31	--IMAGE STUFF
32	self.drawable = true
33	self.graphic = boximage
34	self.quad = boxquad
35	self.offsetX = 6
36	self.offsetY = 2
37	self.quadcenterX = 6
38	self.quadcenterY = 6
39
40	self.rotation = 0 --for portals
41
42	self.falling = false
43	self.destroying = false
44	self.outtable = {}
45	self.portaledframe = false
46end
47
48function box:update(dt)
49	local friction = boxfrictionair
50	if self.falling == false then
51		friction = boxfriction
52	end
53
54	if not self.pushed then
55		if self.speedx > 0 then
56			self.speedx = self.speedx - friction*dt
57			if self.speedx < 0 then
58				self.speedx = 0
59			end
60		else
61			self.speedx = self.speedx + friction*dt
62			if self.speedx > 0 then
63				self.speedx = 0
64			end
65		end
66	else
67		self.pushed = false
68	end
69
70	--rotate back to 0 (portals)
71	self.rotation = math.mod(self.rotation, math.pi*2)
72	if self.rotation > 0 then
73		self.rotation = self.rotation - portalrotationalignmentspeed*dt
74		if self.rotation < 0 then
75			self.rotation = 0
76		end
77	elseif self.rotation < 0 then
78		self.rotation = self.rotation + portalrotationalignmentspeed*dt
79		if self.rotation > 0 then
80			self.rotation = 0
81		end
82	end
83
84	if self.parent then
85		local oldx = self.x
86		local oldy = self.y
87
88		self.x = self.parent.x+math.sin(-self.parent.pointingangle)*0.3
89		self.y = self.parent.y-math.cos(-self.parent.pointingangle)*0.3
90
91		if self.portaledframe == false then
92			for h, u in pairs(emancipationgrills) do
93				if u.dir == "hor" then
94					if inrange(self.x+6/16, u.startx-1, u.endx, true) and inrange(u.y-14/16, oldy, self.y, true) then
95						self:emancipate(h)
96					end
97				else
98					if inrange(self.y+6/16, u.starty-1, u.endy, true) and inrange(u.x-14/16, oldx, self.x, true) then
99						self:emancipate(h)
100					end
101				end
102			end
103		end
104	end
105
106	self.userect.x = self.x
107	self.userect.y = self.y
108
109	--check if offscreen
110	if self.y > 17 then
111		self:destroy()
112	end
113
114	self.portaledframe = false
115
116	if self.destroying then
117		return true
118	else
119		return false
120	end
121end
122
123function box:leftcollide(a, b)
124	if a == "button" then
125		self.y = b.y - self.height
126		self.x = b.x + b.width - 0.01
127		if self.speedy > 0 then
128			self.speedy = 0
129		end
130		return false
131	elseif a == "player" then
132		self.pushed = true
133		return false
134	end
135end
136
137function box:rightcollide(a, b)
138	if a == "button" then
139		self.y = b.y - self.height
140		self.x = b.x - self.width+0.01
141		if self.speedy > 0 then
142			self.speedy = 0
143		end
144		return false
145	elseif a == "player" then
146		self.pushed = true
147		return false
148	end
149end
150
151function box:floorcollide(a, b)
152	if self.falling then
153		self.falling = false
154	end
155
156	if a == "goomba" or a == "bulletbill" then
157		b:stomp()
158		addpoints(200, self.x, self.y)
159		playsound(stompsound)
160		self.falling = true
161		return false
162	end
163end
164
165function box:passivecollide(a, b)
166	if a == "player" then
167		if self.x+self.width > b.x+b.width then
168			self.x = b.x+b.width
169		else
170			self.x = b.x-self.width
171		end
172	end
173end
174
175function box:startfall()
176	self.falling = true
177end
178
179function box:emancipate()
180	if self.parent then
181		self.parent:cubeemancipate()
182	end
183	self:destroy()
184end
185
186function box:destroy()
187	self.userect.delete = true
188	self.destroying = true
189
190	for i = 1, #self.outtable do
191		if self.outtable[i].input then
192			self.outtable[i]:input("toggle")
193		end
194	end
195end
196
197function box:addoutput(a)
198	table.insert(self.outtable, a)
199end
200
201function box:used(id)
202	self.parent = objects["player"][id]
203	self.active = false
204	objects["player"][id]:pickupbox(self)
205end
206
207function box:dropped()
208	self.parent = nil
209	self.active = true
210end
211
212function box:portaled()
213	self.portaledframe = true
214end