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}