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