1{ 2id: "walker-2", 3is_human: true, 4 5# 6#consts list: 7#axels - [[x,y], …, [x,y]] A list of spots to anchor legs to. Function returns corrected for rotation. 8# 9# 10#vars list: 11#axRot - list of rotations for the legs attached to axels. 12#!overshoot - average of how much we need to 'overshoot' by to get to our desired rotation 13#legs - list of legs, two per axel. ~≘ axels. 14#rotvel - an integer specifying speed of rotation. 15# 16# 17#functions list: 18#spnTmpDbg(self, coordinate pair) - Makes a one frame long target image. 19#spnDbg(self, coordinate pair) - Spawn a little target image. 20#getAxels(self) - Where self.id = walker-2, return consts.axels corrected 21# for displacement and rotation. 22#getUpperLegLoc(self) - Returns a list containing two xy pairs for each axel.~≘ axels [[[x,y],[x,y]], …, [[x,y],[x,y]]] 23#getUpperLegRot(self) - Returns a list containing two rotations for each axel. ≘ legs. [[rot, rot], …, [rot,rot]] 24#setUpperLegs(self, locs, rots) - Sets the upper leg objects attached to self. Takes self, 25# locs (as from getUpperLegLoc), and rots (as from getUpperLegRot). 26#getKneeLoc(self) - Returns a list containing rotations for each leg. Structurally ≘ legs. 27#getLowerLegLoc(self) - List containing two xy pairs for each lower leg. ≘ getUpperLegLoc. 28#getLowerLegRot(self) - As above, but returns rotations. 29#setLowerLegs(self, locs, rots) - Like setUpperLegs, but for the lower legs. 30#getFeet(self) - Returns a list containing each foot with a structure ≘ legs. 31# This as in, getFeet . axel 32# . back(0th)leg? = data element. 33#getFeetLoc(self, level) Returns a location pair for each foot, based on joint rotation. 34#getFeetTouch(self, level) Tells which feet are touching. 0 for not, 1 for is. 35#newStepPos(self, level) Returns the coordinate pair of each foot's current footprint. [-1, -1] indicates foot in air. 36#getRealFootLoc(self, level) Returns the location of the foot as defined by the leg rots, or 37# as defined by it's last footprint. 38#getFootBodyDist(self, level) Distance between axel and foot for each leg. 39#getUpperLegLen(self) Length of the first upper leg segment. 40#getLowerLegLen(self) Of the lower leg segment. Integer. 41#getLLRealRot(self, level) See getLowerLegRot. This one is corrected for collision. 42#getLLRealLoc(self, level) See getLowerLegLoc. Collision. 43# 44functions: "def spnTmpDbg (self, crd) [ 45 spawn('walker-2.dbg', crd[0], crd[1], self.facing, [die()] ) 46 ]; 47 48 def spnDbg (self, crd) [ 49 spawn('walker-2.dbg', crd[0], crd[1], self.facing) 50 ]; 51 52 def getAxels (self) 53 map(range(size(axels)), 'axel_num', 54 #At this point, 'axel' is an x,y pair.# 55 map(range(2), 'n', rot_axel[n]+midpoint[n]) 56 where rot_axel = orbit_obj(0, 0, 57 angle(0, 0, axel[0], axel[1]) + rotate, 58 length(0, 0, axel[0], axel[1])) 59 where axel = axels[axel_num]) 60 where axels = self.consts.axels 61 where midpoint = [self.midpoint_x, self.midpoint_y] 62 where rotate = self.rotate; 63 64 def getUpperLegRot (self) 65 map(range(size(axels)), 'axel_num', 66 map(range(size(axels[axel_num])), 'crd_num', 67 #Here, leg is the upper leg object.# 68 leg.vars.bjRot+rotate 69 where leg = legs[axel_num][crd_num] 70 ) 71 ) 72 where axels = getAxels(self) 73 where legs = self.vars.legs 74 where rotate = self.rotate; 75 76 def getUpperLegLoc (self) 77 map(range(size(axels)), 'axel_num', 78 map(range(size(axels[axel_num])), 'crd_num', 79 #Here, leg is the upper leg object.# 80 orbit_obj( 81 axels[axel_num][0], 82 axels[axel_num][1], 83 90 + angle[axel_num][crd_num] + legs.vars.bjRot, 84 length(0,0,leg.consts.bjLoc[0],leg.consts.bjLoc[1]) 85 ) 86 where leg = legs[axel_num][crd_num] 87 ) 88 ) 89 where axels = getAxels(self) 90 where legs = self.vars.legs 91 where angle = getUpperLegRot(self); 92 93 def getKneeLoc (self) 94 map(range(size(axels)), 'axel_num', 95 map(range(size(axels[axel_num])), 'crd_num', 96 orbit_obj( 97 axels[axel_num][0], 98 axels[axel_num][1], 99 90 + angle[axel_num][crd_num] + legs.vars.bjRot, 100 length(leg.consts.ljLoc[0],leg.consts.ljLoc[1],leg.consts.bjLoc[0],leg.consts.bjLoc[1]) 101 ) 102 where leg = legs[axel_num][crd_num] 103 ) 104 ) 105 where axels = getAxels(self) 106 where legs = self.vars.legs 107 where angle = getUpperLegRot(self); 108 109 def setUpperLegs (self, locs, rots) 110 map(range(size(locs)), 'varA', 111 map(range(size(locs[varA])), 'varB', 112 [ 113 set(legcp.midpoint_x, locs[varA][varB][0]), 114 set(legcp.midpoint_y, locs[varA][varB][1]), 115 set(legcp.rotate, rotate), 116 ] where legcp = legs[varA][varB] 117 where rotate = rots[varA][varB] 118 ) 119 ) 120 where legs = self.vars.legs; 121 122 def getLowerLegLoc (self) 123 map(range(size(knees)), 'knee_num', 124 map(range(size(knees[knee_num])), 'knee_sub', 125 orbit_obj( 126 knee[0], 127 knee[1], 128 90 + pRot + leg.vars.ljRot, 129 length(0,0,leg.vars.leg.consts.joint[0],leg.vars.leg.consts.joint[1]) 130 ) 131 where knee = knees[knee_num][knee_sub] #coord# 132 where leg = legs[knee_num][knee_sub] #object# 133 where pRot = gulr[knee_num][knee_sub] 134 ) 135 ) 136 where legs = self.vars.legs 137 where knees = getKneeLoc(self) 138 where gulr = getUpperLegRot(self); 139 140 def getLowerLegRot (self) 141 map(range(size(axels)), 'axel_num', 142 map(range(size(axels[axel_num])), 'crd_num', 143 #Here, leg is the upper leg object.# 144 leg.vars.bjRot+leg.vars.ljRot+rotate 145 where leg = legs[axel_num][crd_num] 146 ) 147 ) 148 where axels = getAxels(self) 149 where legs = self.vars.legs 150 where rotate = self.rotate; 151 152 def setLowerLegs (self, locs, rots) 153 map(range(size(locs)), 'varA', 154 map(range(size(locs[varA])), 'varB', 155 [ 156 set(legcp.midpoint_x, locs[varA][varB][0]), 157 set(legcp.midpoint_y, locs[varA][varB][1]), 158 set(legcp.rotate, rotate), 159 ] where legcp = legs[varA][varB].vars.leg 160 where rotate = rots[varA][varB].vars.leg 161 ) 162 ) 163 where legs = self.vars.legs; 164 165 def getFeetLoc (self) 166 map(range(size(knees)), 'knee_num', 167 map(range(size(knees[knee_num])), 'knee_sub', 168 orbit_obj( 169 knee[0], 170 knee[1], 171 90 + pRot + leg.vars.ljRot, 172 length(0,0,leg.vars.leg.consts.joint[0]-leg.vars.leg.consts.foot[0], 173 leg.vars.leg.consts.joint[1]-leg.vars.leg.consts.foot[1]) 174 ) 175 where knee = knees[knee_num][knee_sub] #coord# 176 where leg = legs[knee_num][knee_sub] #object# 177 where pRot = gulr[knee_num][knee_sub] 178 ) 179 ) 180 where legs = self.vars.legs 181 where knees = getKneeLoc(self) 182 where gulr = getUpperLegRot(self); 183 184 def getFeetTouch (self, level) 185 map(range(size(feet)), 'axel', 186 map(range(size(feet[axel])), 'foot', 187 solid(level, feet[axel][foot][0], feet[axel][foot][1], 2, 2) 188 ) 189 ) 190 where feet = getFeetLoc(self); 191 192 def newStepPos (self, level) 193 map(range(size(feet)), 'axel', 194 map(range(size(feet[axel])), 'foot', 195 if(fs = 0, 196 if(sl != [-1,-1], [-1,-1], sl), 197 if(sl = [-1,-1], fl, sl) 198 ) 199 where fl = feet[axel][foot] 200 where fs = tState[axel][foot] 201 where sl = stepLoc[axel][foot] 202 ) 203 ) 204 where feet = getFeetLoc(self) 205 where tState = getFeetTouch(self, level) 206 where stepLoc = self.vars.stepLoc; 207 208 def getRealFootLoc (self, level) 209 map(range(size(prints)), 'axel', 210 map(range(size(prints[axel])), 'foot', 211 if(prints[axel][foot] = [-1, -1], 212 rotFeet[axel][foot], 213 prints[axel][foot] 214 ) 215 ) 216 ) 217 where rotFeet = getFeetLoc(self) 218 where prints = newStepPos(self, level) 219 ; 220 221 def getFootBodyDist (self, level) #side b# 222 map(range(size(axels)), 'axel', 223 map(range(size(axels[axel])), 'leg', 224 length(axels[axel][0], axels[axel][1], feet[axel][leg][0], feet[axel][leg][1]) 225 ) 226 ) 227 where axels = getAxels(self) 228 where feet = getRealFootLoc(self, level) 229 ; 230 231 def getUpperLegLen (self) #side a# 232 abs(self.vars.legs[0][0].consts.bjLoc[1])+abs(self.vars.legs[0][0].consts.ljLoc[1]) 233 ; 234 235 def getLowerLegLen (self) #side c# 236 abs(self.vars.legs[0][0].vars.leg.consts.joint[1])+abs(self.vars.legs[0][0].vars.leg.consts.foot[1]) 237 ; 238 239 def getLLRealRot (self, level) 240 map(range(size(bs)), 'axel', 241 map(range(size(bs[axel])), 'leg', 242 -angle_alpha(a,b,c) #needs proper bend direction checking.# 243 where b = bs[axel][leg] 244 ) 245 ) 246 where a = getUpperLegLen(self) 247 where c = getLowerLegLen(self) 248 where bs = getFootBodyDist(self, level) 249 ; 250 251 def getLLRealLoc (self, level) 252 map(range(size(rots)), 'axel', 253 map(range(size(rots)), 'leg', 254 orbit_obj(fprt[0], fprt[1], rot, len) 255 where rot = rots[axel][leg]-90 256 where len = length(legs[axel][leg].vars.leg.consts.foot[0], legs[axel][leg].vars.leg.consts.foot[1], 0, 0) 257 where fprt = ftLoc[axel][leg] 258 ) 259 ) 260 where legs = self.vars.legs 261 where rots = getLLRealRot(self, level) 262 where ftLoc = getRealFootLoc(self, level) 263 ; 264 265 def getRealKnee (self, level) 266 map(range(size(rots)), 'axel', 267 map(range(size(rots)), 'leg', 268 orbit_obj(fprt[0], fprt[1], rot, len) 269 where rot = rots[axel][leg]-90 270 where fprt = ftLoc[axel][leg] 271 ) 272 ) 273 where len = getLowerLegLen(self) 274 where legs = self.vars.legs 275 where rots = getLLRealRot(self, level) 276 where ftLoc = getRealFootLoc(self, level) 277 ; 278 279#broken def getULRealRot (self, level) 280 map(range(size(knees)), 'axel', 281 map(range(size(knees)), 'leg', 282 angle(0, 0, knees[axel][leg][0]-axels[axel][0], knees[axel][leg][1]-axels[axel][1]) 283 ) 284 ) 285 where axels = getAxels(self) 286 where knees = getRealKnee(self, level) 287 ; 288# 289 def getULRealRot (self, level) 290 map(range(size(bs)), 'axel', 291 map(range(size(bs[axel])), 'leg', 292 angle_theta(a,b,c) #needs proper bend direction checking.# 293 where b = bs[axel][leg] 294 ) 295 ) 296 where a = getUpperLegLen(self) 297 where c = getLowerLegLen(self) 298 where bs = getFootBodyDist(self, level) 299 ; 300 301 def getULRealLoc (self, level) 302 map(range(size(rots)), 'axel', 303 map(range(size(rots)), 'leg', 304 orbit_obj(axels[axel][0], axels[axel][1], 305 rots[axel][leg]+90, 306 length(legs[axel][leg].consts.bjLoc[0], 307 legs[axel][leg].consts.bjLoc[1], 0, 0)) 308 ) 309 ) 310 where axels = getAxels(self) 311 where rots = getULRealRot(self, level) 312 where legs = self.vars.legs 313 ;", 314vars: { 315 axRot: [], 316 overshoot: 0, 317 legs: [[]], 318 rotvel: 0, 319}, 320consts: { 321 axels: [[-28,4],[56,4]], 322}, 323on_create: "[ 324 map(range(size(self.consts.axels)), 'avar', 325 map(range(2), 'bvar', 326 spawn('walker-2.upper-leg', x, y, self.facing, set_var('listAddress', [avar,bvar])))), 327 set(vars.legs, map(range(size(consts.axels)), ['-','+'])), 328 set(vars.stepLoc, map(range(size(consts.axels)), [[-1,-1], [-1,-1]])), 329 set(vars.axState, map(range(size(consts.axels)), ['ok','ok'])), #ok, nopres, lgone, ugone# 330 ]", 331on_done_create: "set(self.vars.legs, 332 map(range(size(self.consts.axels)), 'index', 333 map(range(size(self.consts.axels[index])), 'subIndex', 334 self.tmp.legs[context.index*2+subIndex])))", 335on_ctrl_right: "[ 336 map(getRealKnee(self, level), 'crd', spnDbg(self, crd[0])), 337 debug(getULRealRot(self, level)), 338 ]", 339on_ctrl_left: "map(range(size(knees)), 'axel', 340 map(range(size(knees)), 'leg', 341 [spawn('walker-2.dbg', axels[axel][0], axels[axel][1], self.facing), 342 spawn('walker-2.dbg', knees[axel][leg][0], knees[axel][leg][1], self.facing), 343 #debug(angle(axels[axel][0], axels[axel][1], knees[axel][leg][0], knees[axel][leg][1])),# 344 #OK, what the heck is going on here - angle is returning the wrong data, and it bloody well shouldn't be.# 345 debug(axels[axel][0], axels[axel][1], knees[axel][leg][0], knees[axel][leg][1]) 346 ] 347 ) 348 ) 349 where axels = getAxels(self) 350 where knees = getRealKnee(self, level)", 351on_process: "[ 352 #debug(getFootBodyDist(self, level)),# 353 set(self.vars.stepLoc, nsp), 354 setUpperLegs(self, recUpLegPos, getULRealRot(self, level)), 355 setLowerLegs(self, recLowLegPos, getLLRealRot(self, level)), 356 if(ctrl_down, set(y, y+2)), 357 if(ctrl_up, set(y, y-2)), 358 ] 359 where recUpLegPos = getULRealLoc(self, level) 360 where recLowLegPos = getLLRealLoc(self, level) 361 where nsp = newStepPos(self, level)", 362on_end_anim: "animation('normal')", 363animation: { 364 id: "normal", 365 image: "experimental/spiderbot.png", 366 rect: [11,9,108,52], 367 pad: 0, 368 frames: 1, 369 duration: 1000, 370 item_area: "all", 371}, 372object_type: [ 373 { 374 id: "upper-leg", 375 vars: { 376 bjRot: 45, 377 ljRot: -65, 378 }, 379 consts: { 380 bjLoc: [-2,28], 381 ljLoc: [-2,-36], 382 }, 383 384 #vars list: 385 #bjRot - big joint rotation, in degrees 386 #ljRot - little joint ^ 387 #listAddress - A unique pair giving this object's index in it's parent's vars.legs list. 388 #leg - the spawned leg segment, the lower leg 389 # 390 #consts list: 391 #bjLoc - big joint location with respect to midpoint. Coordinate pair. 392 #ljLoc - little joint ^ 393 on_spawned: "[ 394 #debug('Spawning leg ' + str(self.vars.listAddress)),# 395 set(spawner.tmp.legs, spawner.tmp.legs + [self]), 396 if(self.vars.listAddress[1] = 0, set(z, z-5), set(z, z+5)), 397 spawn('walker-2.lower-leg', x, y, facing), 398 ]", 399 animation: { 400 id: "normal", 401 image: "experimental/spiderbot.png", 402 rect: [10,64,21,105], 403 pad: 0, 404 frames: 1, 405 duration: 1000, 406 item_area: "all", 407 }, 408 }, 409 { 410 id: "lower-leg", 411 consts: { 412 joint: [-2,-54], 413 foot: [0,60], 414 }, 415 416 #consts list: 417 #joint - Coordinate pair for the knee joint, with respect to the foot's midpoint. 418 #foot - Coordinate pair indicating the offset of the foot end from the midpoint of the object. 419 on_end_anim: "animation('normal')", 420 on_spawned: "[set(spawner.vars.leg, child), 421 set(z, spawner.z + if(spawner.z<0, 1, -1))]", 422 animation: { 423 id: "normal", 424 image: "experimental/spiderbot.png", 425 rect: [34,64,41,122], 426 pad: 0, 427 frames: 1, 428 duration: 1000, 429 item_area: "all", 430 }, 431 }, 432 { 433 id: "dbg", 434 z: 150, 435 on_end_anim: "animation('normal')", 436 on_create: "set(z, 150)", 437 animation: { 438 id: "normal", 439 image: "experimental/spiderbot.png", 440 rect: [87,65,94,72], 441 pad: 0, 442 frames: 2, 443 duration: 5, 444 item_area: "all", 445 }, 446 }, 447], 448}