diff options
author | David Walter Seikel | 2012-01-04 20:33:54 +1000 |
---|---|---|
committer | David Walter Seikel | 2012-01-04 20:33:54 +1000 |
commit | db13ada463c2908eba68b166a9ccc4963db019f5 (patch) | |
tree | ed693d9d9532bea0d890f08199a0bcd5b1e73430 /LuaSL/Test sim/objects/onefang's test bed/~memory | |
parent | README files should include at least a basic description of what it's all abo... (diff) | |
download | SledjHamr-db13ada463c2908eba68b166a9ccc4963db019f5.zip SledjHamr-db13ada463c2908eba68b166a9ccc4963db019f5.tar.gz SledjHamr-db13ada463c2908eba68b166a9ccc4963db019f5.tar.bz2 SledjHamr-db13ada463c2908eba68b166a9ccc4963db019f5.tar.xz |
Add a test sim with an MLP bed in it.
No animations yet, wont need them until later, maybe wont need them until this is ready for in world testing.
Diffstat (limited to 'LuaSL/Test sim/objects/onefang's test bed/~memory')
-rw-r--r-- | LuaSL/Test sim/objects/onefang's test bed/~memory | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/LuaSL/Test sim/objects/onefang's test bed/~memory b/LuaSL/Test sim/objects/onefang's test bed/~memory new file mode 100644 index 0000000..c72b6e2 --- /dev/null +++ b/LuaSL/Test sim/objects/onefang's test bed/~memory | |||
@@ -0,0 +1,378 @@ | |||
1 | //MPLV2 Version 2.2 by Learjeff Innis, based on | ||
2 | //MLP MULTI-LOVE-POSE V1.2 - Copyright (c) 2006, by Miffy Fluffy (BSD License) | ||
3 | // OpenSim port by Jez Ember | ||
4 | // Meta 7 fixes by onefang Rejected | ||
5 | |||
6 | // v2.2 - rotate all poses, cleaner dump | ||
7 | |||
8 | integer Checking = FALSE; // whether doing consistency check | ||
9 | |||
10 | integer line; | ||
11 | integer PosCount; | ||
12 | list Poses; // list of pose names | ||
13 | |||
14 | // indexed by same index as Poses, entry contains text string of pos/rot pairs, one for each ball in pose | ||
15 | |||
16 | // list Positions; | ||
17 | |||
18 | list Positions0; | ||
19 | list Positions1; | ||
20 | list Positions2; | ||
21 | list Positions3; | ||
22 | |||
23 | vector Pos1; | ||
24 | vector Pos2; | ||
25 | vector Pos3; | ||
26 | vector Pos4; | ||
27 | vector Pos5; | ||
28 | vector Pos6; | ||
29 | vector Rot1; | ||
30 | vector Rot2; | ||
31 | vector Rot3; | ||
32 | vector Rot4; | ||
33 | vector Rot5; | ||
34 | vector Rot6; | ||
35 | integer Ballcount; | ||
36 | |||
37 | // Replacement for llListFindList which is currently broken in OSLSL | ||
38 | integer myListFind(list a, string b) { | ||
39 | integer x; | ||
40 | integer l=llGetListLength(a); | ||
41 | |||
42 | for(x=0; x<l; x++) { | ||
43 | if(llList2String(a,x) == b) { | ||
44 | return x; | ||
45 | } | ||
46 | } | ||
47 | |||
48 | return -1; | ||
49 | } | ||
50 | |||
51 | announce() | ||
52 | { | ||
53 | llOwnerSay((string)PosCount | ||
54 | + " positions stored (" | ||
55 | + llGetScriptName() | ||
56 | + ": " | ||
57 | + (string)llGetFreeMemory() | ||
58 | + " bytes free)"); | ||
59 | } | ||
60 | |||
61 | getPosePos(string pdata) { | ||
62 | list plist = llParseString2List(pdata,[" "],[]); | ||
63 | |||
64 | Ballcount = llGetListLength(plist) / 2; | ||
65 | |||
66 | Pos1 = (vector)llList2String(plist, 0); | ||
67 | Rot1 = (vector)llList2String(plist, 1); | ||
68 | Pos2 = (vector)llList2String(plist, 2); | ||
69 | Rot2 = (vector)llList2String(plist, 3); | ||
70 | Pos3 = (vector)llList2String(plist, 4); | ||
71 | Rot3 = (vector)llList2String(plist, 5); | ||
72 | Pos4 = (vector)llList2String(plist, 6); | ||
73 | Rot4 = (vector)llList2String(plist, 7); | ||
74 | Pos5 = (vector)llList2String(plist, 8); | ||
75 | Rot5 = (vector)llList2String(plist, 8); | ||
76 | Pos6 = (vector)llList2String(plist, 10); | ||
77 | Rot6 = (vector)llList2String(plist, 11); | ||
78 | } | ||
79 | |||
80 | |||
81 | string adjust(integer doOffset, vector pos, vector erot, vector amt) { | ||
82 | if (doOffset) { | ||
83 | pos += amt/100.; | ||
84 | return (vround(pos) + " " + vround(erot)); | ||
85 | } | ||
86 | |||
87 | rotation amount = llEuler2Rot(amt * DEG_TO_RAD); | ||
88 | erot *= DEG_TO_RAD; | ||
89 | |||
90 | rotation oldrot = llEuler2Rot(erot); | ||
91 | rotation newrot = oldrot / amount; | ||
92 | |||
93 | erot = llRot2Euler(newrot) * RAD_TO_DEG; | ||
94 | pos = pos / amount; | ||
95 | return(vround(pos) + " " + vround(erot)); | ||
96 | } | ||
97 | |||
98 | adjust_all(integer doOffset, vector amt) { | ||
99 | integer ix; | ||
100 | integer bx; | ||
101 | string data; | ||
102 | for (ix = 0; ix < PosCount; ++ix) { | ||
103 | data = get_pose_by_index(ix); | ||
104 | getPosePos(data); | ||
105 | |||
106 | list parms = [ Pos1, Rot1, Pos2, Rot2, Pos3, Rot3, Pos4, Rot4, Pos5, Rot5, Pos6, Rot6 ]; | ||
107 | |||
108 | data = adjust(doOffset, Pos1, Rot1, amt); | ||
109 | integer ballix = 1; | ||
110 | while (ballix < Ballcount) { | ||
111 | string stuff = adjust(doOffset, llList2Vector(parms, 2*ballix), llList2Vector(parms, 2*ballix+1), amt); | ||
112 | data += " " + stuff; | ||
113 | ++ballix; | ||
114 | } | ||
115 | store_pose(data, ix); | ||
116 | } | ||
117 | } | ||
118 | |||
119 | |||
120 | string get_pose_data(string name) { | ||
121 | integer ix = myListFind(Poses, name); | ||
122 | |||
123 | // if not found, use default positions | ||
124 | if (ix == -1) { | ||
125 | ix = 0; | ||
126 | } | ||
127 | |||
128 | return (get_pose_by_index(ix)); | ||
129 | } | ||
130 | |||
131 | |||
132 | string get_pose_by_index(integer ix) { | ||
133 | if ((ix & 3) == 0) { | ||
134 | return llList2String(Positions0, ix>>2); | ||
135 | } else if ((ix & 3) == 1) { | ||
136 | return llList2String(Positions1, ix>>2); | ||
137 | } else if ((ix & 3) == 2) { | ||
138 | return llList2String(Positions2, ix>>2); | ||
139 | } | ||
140 | return llList2String(Positions3, ix>>2); | ||
141 | } | ||
142 | |||
143 | store_pose(string data, integer ix) { | ||
144 | if ((ix & 3) == 0) { | ||
145 | Positions0 = llListReplaceList(Positions0,[ data ],ix>>2,ix>>2); | ||
146 | } else if ((ix & 3) == 1) { | ||
147 | Positions1 = llListReplaceList(Positions1,[ data ],ix>>2,ix>>2); | ||
148 | } else if ((ix & 3) == 2) { | ||
149 | Positions2 = llListReplaceList(Positions2,[ data ],ix>>2,ix>>2); | ||
150 | } else if ((ix & 3) == 3) { | ||
151 | Positions3 = llListReplaceList(Positions3,[ data ],ix>>2,ix>>2); | ||
152 | } | ||
153 | } | ||
154 | |||
155 | |||
156 | save_pose(string name, string data) { | ||
157 | integer ix = myListFind(Poses, name); | ||
158 | if (ix == -1) { | ||
159 | add_pose(name, data); | ||
160 | } else { | ||
161 | store_pose(data, ix); | ||
162 | } | ||
163 | } | ||
164 | |||
165 | add_pose(string name, string data) { | ||
166 | integer ix = myListFind(Poses, name); | ||
167 | if (ix != -1) { | ||
168 | llOwnerSay("===> WARNING: Multiple .POSITIONS* entries for '" + name + "'"); | ||
169 | } else { | ||
170 | Poses += (list) name; | ||
171 | ix = ++PosCount; | ||
172 | } | ||
173 | store_pose(data, ix-1); | ||
174 | } | ||
175 | |||
176 | check_pose(string name) { | ||
177 | integer ix; | ||
178 | |||
179 | // if this is the last pose, report results | ||
180 | if (name == "CHECK2") { | ||
181 | string nameA; | ||
182 | for (ix = 0; ix < llGetListLength(Poses); ++ix) { | ||
183 | nameA = llList2String(Poses, ix); | ||
184 | if (get_pose_data(nameA) != "") { | ||
185 | if (nameA != "default" && nameA != "stand") { | ||
186 | llOwnerSay("No .MENUITEMS* entry for '" + nameA + "'."); | ||
187 | } | ||
188 | } | ||
189 | } | ||
190 | llOwnerSay("Checks complete, resetting."); | ||
191 | llResetScript(); | ||
192 | } | ||
193 | |||
194 | ix = myListFind(Poses, name); | ||
195 | if (ix == -1) { | ||
196 | llOwnerSay("No .POSITIONS* entry for '" + name + "'."); | ||
197 | return; | ||
198 | } | ||
199 | save_pose(name, ""); | ||
200 | } | ||
201 | |||
202 | |||
203 | string vround(vector vec) { | ||
204 | return ("<"+round(vec.x, 3)+","+round(vec.y, 3)+","+round(vec.z, 3)+">"); | ||
205 | } | ||
206 | |||
207 | string round(float number, integer places) { | ||
208 | float shifted; | ||
209 | integer rounded; | ||
210 | string s; | ||
211 | shifted = number * llPow(10.0,(float)places); | ||
212 | rounded = llRound(shifted); | ||
213 | s = (string)((float)rounded / llPow(10.0,(float)places)); | ||
214 | rounded = llSubStringIndex(s, "."); | ||
215 | if (-1 != rounded) | ||
216 | s = llGetSubString(s,0,llSubStringIndex(s, ".")+places); | ||
217 | else | ||
218 | { | ||
219 | s += ".00000000"; | ||
220 | s = llGetSubString(s,0,llSubStringIndex(s, ".")+places); | ||
221 | } | ||
222 | return s; | ||
223 | } | ||
224 | |||
225 | dashes() { | ||
226 | llOwnerSay("_______________________________________________________________________________"); | ||
227 | llOwnerSay(""); | ||
228 | } | ||
229 | |||
230 | |||
231 | // Globals for reading card config | ||
232 | integer ConfigLineIndex; | ||
233 | list ConfigCards; // list of names of config cards | ||
234 | string ConfigCardName; // name of card being read | ||
235 | integer ConfigCardIndex; // index of next card to read | ||
236 | key ConfigQueryId; | ||
237 | |||
238 | integer next_card() | ||
239 | { | ||
240 | if (ConfigCardIndex >= llGetListLength(ConfigCards)) { | ||
241 | ConfigCards = []; | ||
242 | return (FALSE); | ||
243 | } | ||
244 | |||
245 | ConfigLineIndex = 0; | ||
246 | ConfigCardName = llList2String(ConfigCards, ConfigCardIndex); | ||
247 | ConfigCardIndex++; | ||
248 | ConfigQueryId = llGetNotecardLine(ConfigCardName, ConfigLineIndex); | ||
249 | llOwnerSay("Reading " + ConfigCardName); | ||
250 | return (TRUE); | ||
251 | } | ||
252 | |||
253 | |||
254 | default { | ||
255 | state_entry() { | ||
256 | string item; | ||
257 | ConfigCards = []; | ||
258 | integer n = llGetInventoryNumber(INVENTORY_NOTECARD); | ||
259 | while (n-- > 0) { | ||
260 | item = llGetInventoryName(INVENTORY_NOTECARD, n); | ||
261 | if (llSubStringIndex(item, ".POSITIONS") != -1) { | ||
262 | ConfigCards += (list) item; | ||
263 | } | ||
264 | } | ||
265 | |||
266 | ConfigCardIndex = 0; | ||
267 | ConfigCards = llListSort(ConfigCards, 1, TRUE); | ||
268 | next_card(); | ||
269 | } | ||
270 | |||
271 | dataserver(key query_id, string data) { | ||
272 | if (query_id != ConfigQueryId) { | ||
273 | return; | ||
274 | } | ||
275 | if (data == EOF) { | ||
276 | if (next_card()) { | ||
277 | return; | ||
278 | } | ||
279 | state on; | ||
280 | } | ||
281 | if (llGetSubString(data,0,0) != "/") { // skip comments | ||
282 | integer ix = llSubStringIndex(data, "{"); //split name from positions, remove junk | ||
283 | integer jx = llSubStringIndex(data, "} <"); | ||
284 | if (ix != -1 && jx != -1) { | ||
285 | add_pose(llGetSubString(data, ix+1, jx-1), llGetSubString(data, jx+2, -1)); | ||
286 | } | ||
287 | } | ||
288 | ++ConfigLineIndex; | ||
289 | ConfigQueryId = llGetNotecardLine(ConfigCardName, ConfigLineIndex); //read next line of positions notecard | ||
290 | } | ||
291 | |||
292 | state_exit() { | ||
293 | if (PosCount < 1) { | ||
294 | add_pose("stand", "<-0.7,0.0,0.9> <0.0,0.0,0.0> <0.7,0.0,0.9> <0.0,0.0,-180.0>"); | ||
295 | } | ||
296 | if (PosCount < 2) { | ||
297 | add_pose("default", "<-0.7,0.0,0.7> <0.0,0.0,0.0> <0.7,0.0,0.7> <0.0,0.0,-180.0>"); | ||
298 | } | ||
299 | |||
300 | // do one save to indicate actual amount of available memory | ||
301 | string position = llList2String(Positions1, 0); | ||
302 | Positions1 = llListReplaceList(Positions1, [position],0,0); | ||
303 | |||
304 | if (llGetInventoryType("~props") == INVENTORY_SCRIPT) { | ||
305 | llSetScriptState("~props", TRUE); | ||
306 | llResetOtherScript("~props"); | ||
307 | llSleep(1.0); // give props a chance to run -- doesn't really matter if not enough | ||
308 | } | ||
309 | } | ||
310 | } | ||
311 | |||
312 | |||
313 | state on { | ||
314 | state_entry() { | ||
315 | llMessageLinked(LINK_THIS, 2, "OK", (key)""); //msg to menu, in case it's waiting for loading | ||
316 | announce(); | ||
317 | } | ||
318 | |||
319 | link_message(integer from, integer num, string str, key dkey) { | ||
320 | if (str == "PRIMTOUCH" || num < 0) { | ||
321 | return; | ||
322 | } | ||
323 | |||
324 | if (num == 0 && str == "POSEB") { | ||
325 | string name = (string)dkey; | ||
326 | if (name == "CHECK1") { | ||
327 | Checking = TRUE; | ||
328 | } else if (Checking) { | ||
329 | check_pose((string)dkey); | ||
330 | } else { | ||
331 | llMessageLinked(LINK_THIS, 0, "POSEPOS", (key)get_pose_data((string)dkey)); // to ~pos | ||
332 | } | ||
333 | return; | ||
334 | } | ||
335 | |||
336 | if (num != 1) { | ||
337 | return; | ||
338 | } | ||
339 | |||
340 | if (str == "OK?") { //question from menu, before loading menu | ||
341 | llMessageLinked(from, 2, "OK", (key)""); //answer to menu | ||
342 | } else if (str == "DUMP") { | ||
343 | dashes(); | ||
344 | llOwnerSay("Copy to .POSITIONS; delete any other *.POSITIONS* cards"); | ||
345 | dashes(); | ||
346 | string name = llGetObjectName(); | ||
347 | llSetObjectName(""); | ||
348 | |||
349 | integer ix; | ||
350 | for (ix = 0; ix < PosCount; ++ix) { | ||
351 | string nameA = llList2String(Poses, ix); | ||
352 | llOwnerSay("{" + nameA + "} " + get_pose_data(nameA)); | ||
353 | } | ||
354 | |||
355 | llSetObjectName(name); | ||
356 | dashes(); | ||
357 | } else if (llSubStringIndex(str, "REORIENT=") == 0) { | ||
358 | // Reorient command (LINKMENU command from .MENUITEMS file) | ||
359 | // str format: REORIENT=OFF=<x,y,z> or REORIENT=ROT=<x,y,z> (in degrees) | ||
360 | list parms = llParseString2List(str, ["="], []); | ||
361 | vector amount = (vector)llList2String(parms, 2); | ||
362 | llWhisper(0, "Adjusting Poses, please wait"); | ||
363 | |||
364 | if (llList2String(parms, 1) == "OFF") { | ||
365 | adjust_all(TRUE, amount); | ||
366 | } else { | ||
367 | adjust_all(FALSE, amount); | ||
368 | } | ||
369 | llMessageLinked(LINK_THIS, 0, "AGAIN", (key)""); | ||
370 | llWhisper(0, "Pose adjustment complete"); | ||
371 | } else { | ||
372 | if (llGetSubString((string)dkey, 0, 0) == "<") { //SAVE | ||
373 | save_pose(str, (string)dkey); | ||
374 | announce(); | ||
375 | } | ||
376 | } | ||
377 | } | ||
378 | } | ||