Sunday, August 26, 2007

Clock Island

Another case of seeing something interesting on a random flickr is Clock Island. It's sort of quirky and adorable, and mildly reminiscent of Dali (in that numbers fall from the sky and run around and you can walk around inside a giant hourglass, there isn't the melting involved).

There's also a scavenger hunt, which I am a sucker for, in the case of finding the 12 gold numbers. I've found four or five, and beyond a couple of obvious ones, they head straight into the realm of dirty pool. Inside objects, buried underwater (at least there is a subtle pointer), randomly falling from the sky with no discernible pattern... However, it's still great fun, although the assisting text and whole design concept is in Japanese, so one who doesn't speak the language is left thinking that they've missed something. There are also a couple of freebies hidden around- there's a lovely number dress that sadly isn't modifiable (I believe it would be quite lovely in black, but alas it is stuck in white), and a neat little pointer thingie that can be somewhat tricky to find as well. Maybe sure you have your sound on, aural clues abound in giving you an idea where you ought to be looking.

Unfortunately one of the elevators looks unintentionally broken, and the intentionally broken one...I have a feeling it's doing something, but I don't have the clues to know what exactly, as my Japanese extends to only very simple and nonsensical phrasings (Your shoe is big).

Thursday, August 23, 2007

Spinning fuses earrings and necklace

These necklaces and earrings glow, and the elements inside them spin around, giving a somewhat pulsing effect. I will probably only be offering one colour at the Jewelry Exposition (I'm leaning towards the blue), due to prim limits and all, but they are all available directly from me- just IM Allegory Malaprop if you would like some, or to see an in-world demonstration of the movement. Please let me know whether you would prefer modify/transfer/no copy, or modify/copy/no transfer. Separately, earrings and necklaces are L$50 each, or get a necklace and matching earrings for L$80. I shall figure some sort of bulk pricing for you if you are interested in full sets of colours.

Current colour selection: Metal choice of silver or copper, and element choice of blue, green, pink, red, or violet. Custom colours available on request.




(It should perhaps be mentioned that my proclivities towards steampunk tend heavily towards taking the word literally. For instance, I regularly have my hair styled in a green mohawk when visiting Caledon and New Babbage, and my attire, while inspired by the trends, may not always fall within the general accepted rules. Thus, these fulfill my scientific curiousity as well as my occasional tendency to wear things that provide their own light source in dark venues- while I tend more towards the venues in which the majority of people are wearing black except for those who see neons and enormous tie-on hair as a way to buck the trend, these could be considered accessories for your steamraver, a truly horrifying thought.)

Thursday, August 16, 2007

Devils Moon

I saw a picture of Devils Moon in a random someone's flickr, (off of one of those sidebars of all sorts of people with SL flickr's) and was intrigued.

They have an absolutely marvelous street effect. I love it. It's magnificently clever, the street looks wet with rain, with great reflections of the city above. Now, as you well know, I'm sure, real reflections haven't made the proper viewer yet, and when they do they're going to be murderous on people's systems. Instead it's a partially transparent street with the city built upside down underneath. It's a fantastic effect, and it only makes me cringe a little bit on the amount of prims they have to "waste." They've made up for it with some really fantastic textures that make you think things are more high prim than they are, and while there are places where they haven't mirrored things exactly (generally a "prims don't cut that way" problem), it's mostly things that you wouldn't notice unless you were really paying attention. It's also a brilliant (modern) Japanese influence cyberpunk city, which is always good- that is what lured me in in the first place, after all.

I'm smitten, and I need to bring Max when he has the time.

Apparently there's also some sort of combat game at one of the neighboring sims that run by the same people, and there are free ice and roller skates when you 'port in. So far I'm just enjoying the scenery though. Even though I don't really appreciate strip clubs, there's a perfectly seedy strip club with a hidden "cuddle" room up in one of the high rises. I think it's by far the most realistic strip club I've seen in SL (but then, I don't frequent them- but still, even empty you can smell the sweat, desperation, and alcohol).

Tuesday, August 14, 2007

Murder in New Babbage

There have been a couple of murders in New Babbage recently, how exciting. The first I discovered in the newspaper, but today I found a second body. He had a note on him suggesting that some of the urchins of New Babbage may be in danger as well, as well as a recorded cylinder of the disaster to do with the experiment.
New Babbage, sadly, makes me chug like crazy, and I've never been able to spend much time there. Which is very disappointing, as it's an amazing place, and I'm looking forward to the new underwater sim (which, I hope, will include that lovely Relay for Life build! I've been making a diving suit in preparation).

(Speaking of chugging, after a chat with someone I've met at my sandbox, I believe that voice chat is causing massive hangups on not just my system, but also the systems of many, even though I leave it turned off completely. *sigh* It isn't even a feature I would use- I dislike the sound of my own voice, tend to be quiet most of the time, often have music playing that would simply add noise to the background so no one would be able to understand a word I said, and don't have a mike anyway.)

Ring boxes

My rings come with a lot of instructions, because while you can just wear them and everything works, you can also make them work better for you particularly by doing a few things of gradually increasing complexity. The getting your hands dirty instructions are included in the rings themselves, because that's where you need to be to do those things. But you can also make it fit better just by editing it the way you normally would, in a particular way. So for that, I figured I should add it on the same level as the ring itself so people who are daunted easily would find it, since it isn't hard. This meant I needed ring boxes!

Now, I largely blame my RL friend E for this. She has a ring box collection, and the two of us ended up finding elephants and penguins and all sorts of adorable little velour boxes this one place (and she walked out with 10, I think it was). Secondly, I blame this great big peach room:
that had been in my sandbox for a couple of days. The back of the peach slid around to close it the door as well. It's gone now, but it was there when I made my first ring box:

which I still don't know what I'm going to use for, and I'm sure I'm going to change the texture (this was just a free thingie I had handy for a placeholder), but not only does it include my script and instructions, it also opens and closes on touch. Because, well, I had to. It isn't particularly of the style of the two sets that I really needed boxes for (I have other rings, but I haven't gotten the full sets together yet, and besides, Helios needed to be sent off), so after some thought, I went with these for Helios and Astraios:

Yes, they do have the rings sitting in the boxes themselves as well. Max made me stop when I started talking about making a pose to be able to hold them as well though, since really, that's the height of silliness. Also, they'd never get done.

Thursday, August 9, 2007

Sandbox etiquette

Can anyone explain to me what the deal is with sandbox etiquette? Or, more accurately, the lack thereof. Some day old started up a conversation with me, by going to my level of the sandbox when others were perfectly open and free (I'm usually at ABC recently, it's nicely tiered with level, so there's a lot of space to not be in someone's way. Also, there are chickens), and then started building next to me. Ok, this is not particularly awful, I understand some people are all about the social aspect, blah blah. But she quickly lost interest in talking to me, and started building massive structures. I'm zoomed in on my shoe because it's got fiddly little bits I'm putting on, and I look up at one point to find out I've been shoved all the way over against the rail by her building. Ok, whatever, not getting in the way of my building. But then, she drops a frigging house on top of the shoe I'm working on. What the hell? What is wrong with you people? Is common courtesy really so alien?

I understand the griefing jerks, they are intentionally trying to be bastards- one dropped an attachment with full mod so I could inpect the scripts before wearing, so I knew it was a push that would shove me across the sim, but then he whinged until I put it on (which I did just to get him to shut up, after getting to a decent stopping point and getting all of my things together)- didn't help that he barely spoke english, so it was just wear _item name_ over and over again spamming my chat channel, not even understanding when I was saying "you know, I know exactly what that's going to do, and I'm not in the mood, I'm in the middle of building right now." At least it beat the other gems I've gotten now and again, that one left after I tried his toy- I've had people sit on my items so I couldn't link them, stupid hovers and proximity pushes, etc. At least it isn't as if I can't take my toys and go somewhere else though, so while I will report them, I don't find them as obnoxious as the people who will just drop a house on me because they aren't paying attention. Sort of funny, isn't it?

Tuesday, August 7, 2007

Ring scripts, supplemental

For coding in the positions for each hand state, getting the position is easy. Simply use the regular positioning editor to put your ring where it belongs, and copy over the coordinates. However, things become a bit more difficult when it gets to rotation. In the prim editor, rotation is dealt with with degrees. Degrees make sense to you and me, it's what we were taught in school as children. However, degrees are not infallible, in fact they can cancel each other out and cause all sorts of problems really. So LSL keeps degrees in this bizarre format called quaternions. It does all this sine of the cosine of the inverse of the opposite angle cubed minus 11 to tell where things ought to be. That wikipedia page does make it out to be more confusing than it is, and it's a ridiculously confusing thing inherently (but wikipedia tends to not really help when it comes to technical things, as it doesn't explain anything so anyone who doesn't already know exactly what it is could understand).

However, LSL has a handy and easy way to bypass this. Put this little few lines of code into a script in your ring, and then when you wear it move it into position and rotate to your heart's content. Then, when you're copying over the position, touch the ring. It will send you a message telling you what the rotation is in quaternions to copy over! It's just that easy!



default
{

touch_start(integer total_number)
{
llOwnerSay((string)llGetLocalRot());
// This will tell you, and only you, the owner of the object, what the rotation is when you touch it. If the object is attached to you, it will be the rotating in relation to the attachment point, if in a child prim, its rotating in relation to the parent prim. Drop it in a parent prim and drop it on the ground, and it will be its rotation relative to the world. If for some reason you want to announce the rotation to everyone in the sandbox, replace the above line with llSay(0,(string)llGetLocalRot());
}
}

Ring scripts, part 3 - the left hand


// Hand mesh guesser, left hand v1.0 by Allegory Malaprop of Schadenfreude
// This version sized for women's hand 45.

// Instructions:
// The easy way to make this work is to skip down to the hand states (fist_state is the first one), and input where you want your ring to be in each state. Even easier way is to just drop this in your ring and let it run. It assumes the link parent is dead center of a ring on the ring finger, a small invisible sphere if there isn't a nice handy one piece band, and goes from there. You can't move it or rotate it or anything, the script will override any of that sort of thing- so if you want it moved or rotated, you have to set that in the hand states. It also assumes a female hand size of 45, because I found 50 was veering a little towards manhands, at least on my shape. There will be attachment wander with other sizes if you don't code other options, but then, that's typical, isn't it?

// Documentation:
// I have a tendency to not document, a lot, and then I wander off and am distracted by shiny things and forget how to use the language and have no idea what I did. So instead, I'm over documenting so when my brain has leaked out of my ear I can still, maybe, figure out just what it is I was doing. Also, I can be really really wordy in my epistles to the invisible people, even though when it comes to actual conversation I usually don't know what to say. Go figure.

// Distribution:
// This script had a bad experience, locked up in a closet as a child. As such, it wants to be free as the pretty birdies in the sky. So give it to anyone who might be interested in "finger attachments," bundle it up in freebie script give aways, share it with a loved one over a romantic candlelight dinner. Feel free to sell objects that contain this script for whatever your little heart (or wallet) desires, but please do not charge for the script itself, not even a single Linden. This is for many reasons, but the biggest is that this script works best if people believe in it. It's like Tinkerbell in that way. Animation Overrides are very prone to breaking it, and maybe if people use it and like it, they will make AOs that leave the default hand states alone whenever they can. It's not a perfect solution by any means, but unfortunately this script can't actually do anything about knowing the actual hand position beyond its best guess due to limitations in the language currently. See section: Where this breaks. Feel free to modify this script in any way and distribute your modifications, because you may have made it better, which I'm sure can be done in a great many ways.

// What this does:
// This script makes educated guesses about what position an avatar's hand will be in, and allows you to set things for each position. So rings can move with your hand, and it can be adapted for claws and fingernails that will actually move with your fingers. Not perfectly, no, and you may be able to improve upon the code to make it work better, but this should do the heavy lifting of figuring out what the hand position is most likely to be out of the box, and provide ways to do things with it, as well as providing a jumping off point for improvement.

// How it works:
// Well, my little darlings, I figured out the necessary functions by disecting the Franimation Overrider (available for your animation overriding needs at YadNi's Junkyard), in that the important bits are detecting in what animations the avatar is currently running. Now, it is designed to assume that you are using the default hand states, which isn't always true, as they can be overridden, but it is the most likely, and as there is no way to actually detect actual hand positions of which I am aware, this will have to do. Once it makes the guess about what the hand should be, it directs it to a function that tells the object where it should be located, and how it should be rotated (or whatever else you want to add in the functions).

// Where this breaks:
// This makes a lot of assumptions about hand positions, because it cannot actually detect them. Any Animation Overrides that have different hand states included will break this script- your ring will go one way, your hand will go the other. Poseballs are also likely to break it, as they also often override hands, in fact, any animation that overrides default hand state, broken. Drinks and other such hand attachments that have poses attached won't really break it, since they are generally hand attachments- therefore they will simply take the place of the object that has this script in it. Also, cases are added for most built in animations, it's just that custom ones are something we can't know, and the possibility also exists that I missed some of the built in ones. The one advantage to the bug wherein hand states are not being recognized properly, is that default hand states are more likely to be used so we avoid the hand issue a bit more. The disadvantage is that some built in states aren't being handled properly either, so if we actually do what we ought to, it can break. I think it's a bad priority thing, but watch the peace sign or holding a handgun- the hand style breaks when you change to any stands but the base one, I think. It's all sort of a mess, and I mostly just ignored it because it might be temporary. Whatever it is, I treat it as not intentional and did not code ways around it. Also, since these things are in motion, most people probably won't notice the majority of it anyway.


////////////////////////////////// HAND STATES ////////////////////////////////////
// Yes, this is where you have to work if you want to have it be anywhere by the default position. It's actually not that bad. Attach your object on your hand, get it in the place you want for each state, and make a note of the rotation and the position for each. The position is easy, just plug it right in. The rotation is a bit more difficult, as it involves translating the rotation into quaternions, but if you use the Rotation Getter, which may be included in this package, that's pretty easy to just get the numbers and copy paste too. Drop a notecard to Allegory Malaprop if you can't find the Rotation Getter, and I'll drop you a copy when I'm around (sometimes I'm AFK, so don't panic if I don't respond right away. Also, sometimes I crash, so IMs may not be reliable, but you can try that as well).
// If you want to move objects in more than way (claws, fingernails, multiple rings, etc.), you're on your own. This is the framework you need, but you'll have to get the rest of the way yourself because I haven't sat down to figure it out yet.
// Good gestures to check states: Relaxed I just did standing around; Impatient for fists; Wink (Hollywood) is good for pointing; Surprise or waiting around for the stand with the right hand in a fist and the left spread, for spread. You may have to define custom gestures for all of them, I'm not sure any are in the common gestures library.

// What do we do if we think the hand is relaxed?
relaxedState() {
llSetPrimitiveParams([PRIM_POSITION, <-0.014, 0.044, 0.026>, PRIM_ROTATION, <0.52439, -0.49190, -0.44772, 0.53160>]);
// Set position relative to avatar attachment point, in this case -0.014x, -0.044y, 0.026z, and set rotation the same way. This is 106.15 degrees x, 277 degrees y, 19.1 degrees z, translated into quaternion.
}

// What do we do if we think they have a fist?
fistState() {
llSetPrimitiveParams([PRIM_POSITION, <-0.013, 0.038, 0.007>, PRIM_ROTATION, <0.21548, -0.64547, -0.16706, 0.71346>]);
// Rotation: 51.2x, 276.75y, 19.75z
}

// What do we do if we think the hand is spread out?
spreadState() {
llSetPrimitiveParams([PRIM_POSITION, <-0.020, 0.045, 0.016>, PRIM_ROTATION, <0.54979, -0.44383, -0.38158, 0.59595>]);
// Rotation: 89.75x, 288.45y, 6z
}

// What do we do if the hand is pointing?
pointingState() {
llSetPrimitiveParams([PRIM_POSITION, <-0.013, 0.038, 0.007>, PRIM_ROTATION, <0.21548, -0.64547, -0.16706, 0.71346>]);
// Rotation: 51.2x, 276.75y, 19.75z
}

// What do we do if the hand is typing? Really, this ought to be animated, but you wouldn't have any way to sync up the animation. I'm just referring it to relaxed, because that's close enough for me. You can decide if it's close enough for you.
typeState() {
relaxedState(); // Treat as relaxed
}


////////////// EVIL CONFUSING CODE STARTS HERE. FEEL FREE TO WANDER OFF AND IGNORE. /////////////////////


// More functions for each hand state. This is entirely to keep the above code less confusing for the end user, so the only line of code they mess with is the thing they might want to change. Only relaxed and fist are included, because they are the only ones called multiple times, so the others are unnecessary. I'm warning you here about the inconsistency so you know what's going on.
relaxed() { // Relaxed case, calls the state above.
if (lastAnim == "relaxed") { // if that's what we just were doing, do nothing.
} else { // Otherwise, we want the relaxed state.
relaxedState();
lastAnim = "relaxed"; // reset lastAnim state so we know what to look for to skip it next time.
}
}

fist() { // Fist case, calls the state above.
if (lastAnim == "fist") { // if that's what we just were doing, do nothing.
} else { // Otherwise, we want the fist state.
fistState();
lastAnim = "fist"; // reset lastAnim state so we know what to look for to skip it next time.
}
}


string lastAnim = ""; // The last state in which we decided we were.
// How often are we going to check on the animation state? More often = more lag. So while you can check 0.001, that's hammering the server pretty hard. 0.25 only checks 4 times a second, which, really, is still often enough for what people are going to see, especially with lag and all.
float timerChecking = 0.25;

// Meaty mcMeatFingers, the script that goes through all our possibles and tells us which if the above states to use.
detectHand() {
list curAnims = llGetAnimationList(llGetOwner()); // A list of all the animations currently playing. They're going to be in UUID format, so, well, it's going to be great fun to deal with it all.

// Gestures get checked out first, because they will override everything else. They are cool and like to throw their weight around, pushing to the head of the line, and stealing lunch money from the standing and walking animations.
// We're using funky operands here, the ~. But it saves bytecode, because we love the server and want to keep it happy, and is faster than doing != -1, since if we come up with -1, it doesn't exist. Also because the programming wiki tells us to.


// Typing doesn't appear to actually trigger correctly for some reason.
if (llGetAgentInfo(llGetOwner()) & AGENT_TYPING) { // Are we TYPING? Cause we do that sometimes.
if (lastAnim = "typing") { // if that's what we just were doing, do nothing.
} else { // Otherwise, we want the typing state.
typeState();
lastAnim = "typing"; // reset lastAnim state so we know what to look for to skip it next time.
}

// Now let's check for the fist state. I'd be using ||seven more if LSL used them properly, but for some reason it still feels the need to check everything in the list, so they are less useful. Sad really. I'm still lots just because it saves a little space, and out of the hope they'll realize that this way actually is much nicer on the server at some point and change it. Also, I'd run out of ifs otherwise.
} else if (~llListFindList(curAnims, [(key)"eae8905b-271a-99e2-4c0e-31106afd100c"]) // I'm not standing here for you to take SNAPSHOTS.
|| ~llListFindList(curAnims, [(key)"5ea3991f-c293-392e-6860-91dfa01278a3"]) // IMPATIENT already? We've only just started.
|| ~llListFindList(curAnims, [(key)"709ea28e-1573-c023-8bf8-520c8bc637fa"]) // It's a bit early to be JUMPING FOR JOY.
|| ~llListFindList(curAnims, [(key)"315c3a41-a5f3-0ba4-27da-f893f769e69b"]) // I remain unimpressed by the flexing of your sexy MUSCLES.
|| ~llListFindList(curAnims, [(key)"ef62d355-c815-4816-2474-b1acc21094a6"]) // Your invisble BAZOOKA you're HOLDing doesn't scare me!
|| ~llListFindList(curAnims, [(key)"8b102617-bcba-037b-86c1-b76219f90c88"]) // Invisble BOW HOLDing, no more scary.
|| ~llListFindList(curAnims, [(key)"46bb4359-de38-4ed8-6a22-f1f52fe8f506"]) // Nor invisble BOW AIMing.
|| ~llListFindList(curAnims, [(key)"eefc79be-daae-a239-8c04-890f5d23654a"]) // Your ONE-TWO PUNCH doesn't scare me either!
|| ~llListFindList(curAnims, [(key)"f3300ad9-3462-1d07-2044-0fef80062da0"]) // Hey! No beating me up with your LEFT PUNCH!
|| ~llListFindList(curAnims, [(key)"c8e42d32-7310-6906-c903-cab5d4a34656"]) // Nor the RIGHT PUNCH either!
|| ~llListFindList(curAnims, [(key)"49aea43b-5ac3-8a44-b595-96100af0beda"]) // Ok, that's it. I'm not putting up with the abuse of your ROUNDHOUSE KICK.
|| ~llListFindList(curAnims, [(key)"11000694-3f41-adc2-606b-eee1d66f3724"])) // *sigh* Don't throw a TANTRUM. I know you only hurts me cause you loves me baby.)
{
fist(); // Call fist(), which covers the "are we there now?" and "what do we do again?"

// Only one pointing left hand:
} else if (~llListFindList(curAnims, [(key)"c0c4030f-c02b-49de-24ba-2331f43fe41c"])) // Your HOLLYWOOD WINK gets me every time, and you know it. Cheater.
{
if (lastAnim == "point") { // if that's what we just were doing, do nothing.
} else { // Otherwise, we want the pointing state.
pointingState();
lastAnim = "point"; // reset
}
// More batch checking, this time for relaxed hands
} else if (~llListFindList(curAnims, [(key)"18b3a4b5-b463-bd48-e4b6-71eaac76c515"]) // Don't you laugh that deep BELLY LAUGH at me!
|| ~llListFindList(curAnims, [(key)"b906c4ba-703b-1940-32a3-0c7f7d791510"]) // And now you are BORED by my antics. Well then, who needs you!
|| ~llListFindList(curAnims, [(key)"92624d3e-1068-f1aa-a5ec-8244585193ed"]) // Aw, don't CRY. I didn't really mean it.
|| ~llListFindList(curAnims, [(key)"42ecd00b-9947-a97c-400a-bbc9174c7aeb"])) // You aren't really going to prove to me you're a higher spiritual being with your FLOATING YOGA.
{
relaxed(); // Call relaxed(), which covers the "are we there now?" and "what do we do again?"

// More batch processing for spread
} else if (~llListFindList(curAnims, [(key)"313b9881-4302-73c0-c7d0-0e7a36b6c224"]) // Ha! I knew I could SURPRISE you!
// Left hand only:
|| ~llListFindList(curAnims, [(key)"ea633413-8006-180a-c3ba-96dd1d756720"]) // Eek! Don't AIM that RIFLE at me!
|| ~llListFindList(curAnims, [(key)"35db4f7e-28c2-6679-cea9-3ee108f7fc7f"]) // Moving on to COUNTing for a game of Rock Paper Scissors? You're very competative tonight.
|| ~llListFindList(curAnims, [(key)"42dd95d5-0bc6-6392-f650-777304946c0f"]) // Ha! Take that! My scissors shatter your ROCK.
|| ~llListFindList(curAnims, [(key)"0836b67f-7f7b-f37b-c00a-460dc1521f5a"]) // Rock Paper Scissors, again? My PAPER wraps around your paper!
|| ~llListFindList(curAnims, [(key)"16803a9f-5140-e042-4d7b-d28ba247c325"]) // And again I beat you! My paper wraps your SCISSORS!
|| ~llListFindList(curAnims, [(key)"42b46214-4b44-79ae-deb8-0df61424ff4b"]) // STAND 3 has one hand one hand spread out- the right hand is in a fist instead.
// Both hands:
|| ~llListFindList(curAnims, [(key)"62c5de58-cb33-5743-3d07-9e4cd4352864"])) // Fly away! HOVER UP is both hands spread. Put at the bottom here because it is a lesser priority than the gestures.
{
if (lastAnim == "spread") { // if that's what we just were doing, do nothing.
} else { // Otherwise, we want the spread state.
spreadState();
lastAnim = "spread"; // reset
}
// A few of the standing states involve balling hands into fists, as does the run state. So, if we don't get overridden by any of the above, we direct the state now.
} else if (~llListFindList(curAnims, [(key)"370f3a20-6ca6-9971-848c-9a01bc42ae3c"]) // STAND 2 is hands on hips in fists default.
|| ~llListFindList(curAnims, [(key)"05ddbff8-aaa9-92a1-2b74-8fe77a29b445"]) // RUN away!
|| ~llListFindList(curAnims, [(key)"20f063ea-8306-2562-0b07-5c853b37b31e"])) // Dive! Dive! HOVER DOWN!
{
fist(); // Call fist(), which covers the "are we there now?" and "what do we do again?"

// Catch all for all other states is relaxed hands. We may have missed something up there, but I did try to be exhaustive.
} else {
relaxed(); // Call relaxed(), which covers the "are we there now?" and "what do we do again?"
}
}

// Initialize timer, and reset a variable so we don't carry forward the last state erronerously.
initialize() {
llSetTimerEvent(timerChecking);
lastAnim = "";
}


// The stuff that actually starts doing things. Because all the above is just waiting impatiently to be chosen by one of the default states, otherwise it just sits there in its corner and rots.
default {
attach(key attached) { // Start the script when it is attached. Otherwise you have to run after this tiny prim object all over a sim as it flees from you. Trust me, it isn't fun.
if (attached != NULL_KEY) {// We are attached! So let's run!
detectHand(); // Run Meaty McMeatFingers!
initialize(); // Set the timer and blank out lastAnim so we don't get into trouble from the last wearing.
llResetTime();
} else {// No, really. We aren't attached. Stop the timer.
llSetTimerEvent(0);
}
}

timer() { // Our timer, so we keep checking states, instead of checking once and them being done with it. Because that would defeat the whole purpose of keeping track where our hands were.
detectHand(); // Run Meaty McMeatFingers at regular intervals!
}

}

// aim_r_rifle and stand_3 have different hand states for left/right- fists right, spread left for both. All the rock/paper/scissors also have different hand states- left is always spread.

Ring scripts, part two - the right hand


// Hand mesh guesser, right hand v1.0 by Allegory Malaprop of Schadenfreude
// This version sized for women's hand 45.

// Instructions:
// The easy way to make this work is to skip down to the hand states (fist_state is the first one), and input where you want your ring to be in each state. Even easier way is to just drop this in your ring and let it run. It assumes the link parent is dead center of a ring on the ring finger, a small invisible sphere if there isn't a nice handy one piece band, and goes from there. You can't move it or rotate it or anything, the script will override any of that sort of thing- so if you want it moved or rotated, you have to set that in the hand states. It also assumes a female hand size of 45, because I found 50 was veering a little towards manhands, at least on my shape. There will be attachment wander with other sizes if you don't code other options, but then, that's typical, isn't it?

// Documentation:
// I have a tendency to not document, a lot, and then I wander off and am distracted by shiny things and forget how to use the language and have no idea what I did. So instead, I'm over documenting so when my brain has leaked out of my ear I can still, maybe, figure out just what it is I was doing. Also, I can be really really wordy in my epistles to the invisible people, even though when it comes to actual conversation I usually don't know what to say. Go figure.

// Distribution:
// This script had a bad experience, locked up in a closet as a child. As such, it wants to be free as the pretty birdies in the sky. So give it to anyone who might be interested in "finger attachments," bundle it up in freebie script give aways, share it with a loved one over a romantic candlelight dinner. Feel free to sell objects that contain this script for whatever your little heart (or wallet) desires, but please do not charge for the script itself, not even a single Linden. This is for many reasons, but the biggest is that this script works best if people believe in it. It's like Tinkerbell in that way. Animation Overrides are very prone to breaking it, and maybe if people use it and like it, they will make AOs that leave the default hand states alone whenever they can. It's not a perfect solution by any means, but unfortunately this script can't actually do anything about knowing the actual hand position beyond its best guess due to limitations in the language currently. See section: Where this breaks. Feel free to modify this script in any way and distribute your modifications, because you may have made it better, which I'm sure can be done in a great many ways.

// What this does:
// This script makes educated guesses about what position an avatar's hand will be in, and allows you to set things for each position. So rings can move with your hand, and it can be adapted for claws and fingernails that will actually move with your fingers. Not perfectly, no, and you may be able to improve upon the code to make it work better, but this should do the heavy lifting of figuring out what the hand position is most likely to be out of the box, and provide ways to do things with it, as well as providing a jumping off point for improvement.

// How it works:
// Well, my little darlings, I figured out the necessary functions by disecting the Franimation Overrider (available for your animation overriding needs at YadNi's Junkyard), in that the important bits are detecting in what animations the avatar is currently running. Now, it is designed to assume that you are using the default hand states, which isn't always true, as they can be overridden, but it is the most likely, and as there is no way to actually detect actual hand positions of which I am aware, this will have to do. Once it makes the guess about what the hand should be, it directs it to a function that tells the object where it should be located, and how it should be rotated (or whatever else you want to add in the functions).

// Where this breaks:
// This makes a lot of assumptions about hand positions, because it cannot actually detect them. Any Animation Overrides that have different hand states included will break this script- your ring will go one way, your hand will go the other. Poseballs are also likely to break it, as they also often override hands, in fact, any animation that overrides default hand state, broken. Drinks and other such hand attachments that have poses attached won't really break it, since they are generally hand attachments- therefore they will simply take the place of the object that has this script in it. Also, cases are added for most built in animations, it's just that custom ones are something we can't know, and the possibility also exists that I missed some of the built in ones. The one advantage to the bug wherein hand states are not being recognized properly, is that default hand states are more likely to be used so we avoid the hand issue a bit more. The disadvantage is that some built in states aren't being handled properly either, so if we actually do what we ought to, it can break. I think it's a bad priority thing, but watch the peace sign or holding a handgun- the hand style breaks when you change to any stands but the base one, I think. It's all sort of a mess, and I mostly just ignored it because it might be temporary. Whatever it is, I treat it as not intentional and did not code ways around it. Also, since these things are in motion, most people probably won't notice the majority of it anyway.


////////////////////////////////// HAND STATES ////////////////////////////////////
// Yes, this is where you have to work if you want to have it be anywhere by the default position. It's actually not that bad. Attach your object on your hand, get it in the place you want for each state, and make a note of the rotation and the position for each. The position is easy, just plug it right in. The rotation is a bit more difficult, as it involves translating the rotation into quaternions, but if you use the Rotation Getter, which may be included in this package, that's pretty easy to just get the numbers and copy paste too. Drop a notecard to Allegory Malaprop if you can't find the Rotation Getter, and I'll drop you a copy when I'm around (sometimes I'm AFK, so don't panic if I don't respond right away. Also, sometimes I crash, so IMs may not be reliable, but you can try that as well).
// If you want to move objects in more than way (claws, fingernails, multiple rings, etc.), you're on your own. This is the framework you need, but you'll have to get the rest of the way yourself because I haven't sat down to figure it out yet.
// Good gestures to check states: Relaxed I just did standing around; /rock, /paper, and /scissor are good for fist, spread, and peace; Wink (Hollywood) is good for pointing; and Salute for, well, saluting. Rock, paper, and scissors are in the common gestures library, the other two I had to make new gestures for since I couldn't find them in the ones provided.

// What do we do if we think the hand is relaxed?
relaxedState() {
llSetPrimitiveParams([PRIM_POSITION, <-0.014, -0.044, 0.026>, PRIM_ROTATION, <0.52439,>]);
// Set position relative to avatar attachment point, in this case -0.014x, -0.044y, 0.026z, and set rotation the same way. This is 106.15 degrees x, 83 degrees y, 340.9 degrees z, translated into quaternion.
}

// What do we do if we think they have a fist?
fistState() {
llSetPrimitiveParams([PRIM_POSITION, <-0.013, -0.038, 0.007>, PRIM_ROTATION, <0.67513,>]);
// Rotation: 67.3x, 85.1y, 80.4z
}

// What do we do if we think the hand is spread out?
spreadState() {
llSetPrimitiveParams([PRIM_POSITION, <-0.022, -0.044, 0.016>, PRIM_ROTATION, <0.57562,>]);
// Rotation: 80.05x, 63.85y, 8.9z
}

// What do we do if the hand is pointing?
pointingState() {
llSetPrimitiveParams([PRIM_POSITION, <-0.013, -0.038, 0.007>, PRIM_ROTATION, <0.67513,>]);
// Rotation: 67.3x, 85.1y, 80.4z
}

// What do we do if the hand is typing? Really, this ought to be animated, but you wouldn't have any way to sync up the animation. I'm just referring it to relaxed, because that's close enough for me. You can decide if it's close enough for you.
typeState() {
relaxedState(); // Treat as relaxed
}

// What do we do if the hand is saluting? (Only right hand salutes.)
saluteState() {
llSetPrimitiveParams([PRIM_POSITION, <-0.015, -0.038, 0.020>, PRIM_ROTATION, <0.48835,>]);
// Rotation: 5.6x, 76.8y, 96.5z
}

// What do we do if the hand is making a peace sign? (Also only right hand.)
peaceState() {
llSetPrimitiveParams([PRIM_POSITION, <-0.013, -0.038, 0.007>, PRIM_ROTATION, <0.65968,>]);
// Rotation: 65.65x, 75.3y, 80.95z
}



////////////// EVIL CONFUSING CODE STARTS HERE. FEEL FREE TO WANDER OFF AND IGNORE. /////////////////////


// More functions for each hand state. This is entirely to keep the above code less confusing for the end user, so the only line of code they mess with is the thing they might want to change. Only relaxed and fist are included, because they are the only ones called multiple times, so the others are unnecessary. I'm warning you here about the inconsistency so you know what's going on.
relaxed() { // Relaxed case, calls the state above
if (lastAnim == "relaxed") { // if that's what we just were doing, do nothing.
} else { // Otherwise, we want the relaxed state.
relaxedState();
lastAnim = "relaxed"; // reset lastAnim state so we know what to look for to skip it next time.
}
}

fist() { // Fist case, calls the state above.
if (lastAnim == "fist") { // if that's what we just were doing, do nothing.
} else { // Otherwise, we want the fist state.
fistState();
lastAnim = "fist"; // reset lastAnim state so we know what to look for to skip it next time.
}
}


string lastAnim = ""; // The last state in which we decided we were.
// How often are we going to check on the animation state? More often = more lag. So while you can check 0.001, that's hammering the server pretty hard. 0.25 only checks 4 times a second, which, really, is still often enough for what people are going to see, especially with lag and all.
float timerChecking = 0.25;

// Meaty mcMeatFingers, the script that goes through all our possibles and tells us which if the above states to use.
detectHand() {
list curAnims = llGetAnimationList(llGetOwner()); // A list of all the animations currently playing. They're going to be in UUID format, so, well, it's going to be great fun to deal with it all.

// Gestures get checked out first, because they will override everything else. They are cool and like to throw their weight around, pushing to the head of the line, and stealing lunch money from the standing and walking animations.
// We're using funky operands here, the ~. But it saves bytecode, because we love the server and want to keep it happy, and is faster than doing != -1, since if we come up with -1, it doesn't exist. Also because the programming wiki tells us to.


// Typing doesn't appear to actually trigger correctly for some reason.
if (llGetAgentInfo(llGetOwner()) & AGENT_TYPING) { // Are we TYPING? Cause we do that sometimes.
if (lastAnim = "typing") { // if that's what we just were doing, do nothing.
} else { // Otherwise, we want the typing state.
typeState();
lastAnim = "typing"; // reset lastAnim state so we know what to look for to skip it next time.
}

// Now let's check for the fist state. I'd be using ||seven more if LSL used them properly, but for some reason it still feels the need to check everything in the list, so they are less useful. Sad really. I'm still lots just because it saves a little space, and out of the hope they'll realize that this way actually is much nicer on the server at some point and change it. Also, I'd run out of ifs otherwise.
} else if (~llListFindList(curAnims, [(key)"eae8905b-271a-99e2-4c0e-31106afd100c"]) // I'm not standing here for you to take SNAPSHOTS.
|| ~llListFindList(curAnims, [(key)"5ea3991f-c293-392e-6860-91dfa01278a3"]) // IMPATIENT already? We've only just started.
|| ~llListFindList(curAnims, [(key)"709ea28e-1573-c023-8bf8-520c8bc637fa"]) // It's a bit early to be JUMPING FOR JOY.
|| ~llListFindList(curAnims, [(key)"315c3a41-a5f3-0ba4-27da-f893f769e69b"]) // I remain unimpressed by the flexing of your sexy MUSCLES.
|| ~llListFindList(curAnims, [(key)"ef62d355-c815-4816-2474-b1acc21094a6"]) // Your invisble BAZOOKA you're HOLDing doesn't scare me!
|| ~llListFindList(curAnims, [(key)"8b102617-bcba-037b-86c1-b76219f90c88"]) // Invisble BOW HOLDing, no more scary.
|| ~llListFindList(curAnims, [(key)"46bb4359-de38-4ed8-6a22-f1f52fe8f506"]) // Nor invisble BOW AIMing.
|| ~llListFindList(curAnims, [(key)"eefc79be-daae-a239-8c04-890f5d23654a"]) // Your ONE-TWO PUNCH doesn't scare me either!
|| ~llListFindList(curAnims, [(key)"f3300ad9-3462-1d07-2044-0fef80062da0"]) // Hey! No beating me up with your LEFT PUNCH!
|| ~llListFindList(curAnims, [(key)"c8e42d32-7310-6906-c903-cab5d4a34656"]) // Nor the RIGHT PUNCH either!
|| ~llListFindList(curAnims, [(key)"49aea43b-5ac3-8a44-b595-96100af0beda"]) // Ok, that's it. I'm not putting up with the abuse of your ROUNDHOUSE KICK.
|| ~llListFindList(curAnims, [(key)"11000694-3f41-adc2-606b-eee1d66f3724"])) // *sigh* Don't throw a TANTRUM. I know you only hurts me cause you loves me baby.)
{
fist(); // Call fist(), which covers the "are we there now?" and "what do we do again?"

// Right hand animations only:
} else if (~llListFindList(curAnims, [(key)"7db00ccd-f380-f3ee-439d-61968ec69c8a"]) // Your FIST PUMP of joy because I forgive you is still not making up for the black eye.
|| ~llListFindList(curAnims, [(key)"efdc1727-8b8a-c800-4077-975fc27ee2f2"]) // And invisible HANGUN AIMing isn't helping any.
|| ~llListFindList(curAnims, [(key)"ea633413-8006-180a-c3ba-96dd1d756720"]) // Neither is the RIFLE AIMing. Did you forget how we got into this in the first place?
|| ~llListFindList(curAnims, [(key)"35db4f7e-28c2-6679-cea9-3ee108f7fc7f"]) // Moving on to COUNTing for a game of Rock Paper Scissors? You're very competative tonight.
|| ~llListFindList(curAnims, [(key)"42dd95d5-0bc6-6392-f650-777304946c0f"])) // Ha! Take that! My scissors shatter your ROCK.
{
fist(); // Call fist(), which covers the "are we there now?" and "what do we do again?"

// More batch checking, this time for pointing hands
// Right hand animations only:
} else if (~llListFindList(curAnims, [(key)"c1bc7f36-3ba0-d844-f93c-93be945d644f"]) // Don't you WAG your FINGER! I did so win! Scissors beat rock! Ask anyone!
|| ~llListFindList(curAnims, [(key)"17c024cc-eef2-f6a0-3527-9869876d7752"]) // All the POINTING at YOURSELF won't convince me you won. So there.
|| ~llListFindList(curAnims, [(key)"ec952cca-61ef-aa3b-2789-4d1344f016de"]) // And don't you POINT at OTHERS telling them they're cheaters! You know pointing isn't polite!
// Both hands point:
|| ~llListFindList(curAnims, [(key)"c0c4030f-c02b-49de-24ba-2331f43fe41c"])) // Your HOLLYWOOD WINK gets me every time, and you know it. Cheater.
{
if (lastAnim == "point") { // if that's what we just were doing, do nothing.
} else { // Otherwise, we want the pointing state.
pointingState();
lastAnim = "point"; // reset
}
// More batch checking, this time for relaxed hands
} else if (~llListFindList(curAnims, [(key)"18b3a4b5-b463-bd48-e4b6-71eaac76c515"]) // Don't you laugh that deep BELLY LAUGH at me!
|| ~llListFindList(curAnims, [(key)"b906c4ba-703b-1940-32a3-0c7f7d791510"]) // And now you are BORED by my antics. Well then, who needs you!
|| ~llListFindList(curAnims, [(key)"92624d3e-1068-f1aa-a5ec-8244585193ed"]) // Aw, don't CRY. I didn't really mean it.
|| ~llListFindList(curAnims, [(key)"42ecd00b-9947-a97c-400a-bbc9174c7aeb"])) // You aren't really going to prove to me you're a higher spiritual being with your FLOATING YOGA.
{
relaxed(); // Call relaxed(), which covers the "are we there now?" and "what do we do again?"

// More batch processing, but not much, for spread
// Right hand only:
} else if (~llListFindList(curAnims, [(key)"0836b67f-7f7b-f37b-c00a-460dc1521f5a"]) // Rock Paper Scissors, again? My PAPER wraps around your paper!
// Both hands:
|| ~llListFindList(curAnims, [(key)"313b9881-4302-73c0-c7d0-0e7a36b6c224"]) // Ha! I knew I could SURPRISE you!
|| ~llListFindList(curAnims, [(key)"62c5de58-cb33-5743-3d07-9e4cd4352864"])) // Fly away! HOVER UP!
{
if (lastAnim == "spread") { // if that's what we just were doing, do nothing.
} else { // Otherwise, we want the spread state.
spreadState();
lastAnim = "spread"; // reset
}
// Batch process giving the peace sign. This is a right hand only animation.
} else if (~llListFindList(curAnims, [(key)"16803a9f-5140-e042-4d7b-d28ba247c325"]) // And again I beat you! My paper wraps your SCISSORS!
|| ~llListFindList(curAnims, [(key)"b312b10e-65ab-a0a4-8b3c-1326ea8e3ed9"])) // PEACE, that's the last game of rock paper scissors we'll have. Note that this animation appears to have the improper priority and can be overridden by some default standing hand states, so it will glitch in and out even without an animation overrider. I didn't go through the states to fix that because I say it's a bug, and therefore someday might be fixed and break the hack to get it working temporarily.
{
if (lastAnim == "peace") { // if that's what we just were doing, do nothing.
} else { // Otherwise, we want the peace state.
peaceState();
lastAnim = "peace"; // reset
}
// The salute state. This is a right hand only animation.
} else if (~llListFindList(curAnims, [(key)"cd7668a6-7011-d7e2-ead8-fc69eff1a104"])) // Your SALUTE indicates that we part as friends. Note that this animation appears to have the same problem as peace.
{
if (lastAnim == "salute") { // if that's what we just were doing, do nothing.
} else { // Otherwise, we want the salute state.
saluteState();
lastAnim = "salute"; // reset
}
// A few of the standing states involve balling hands into fists, as does the run state. So, if we don't get overridden by any of the above, we direct the state now.
} else if (~llListFindList(curAnims, [(key)"370f3a20-6ca6-9971-848c-9a01bc42ae3c"]) // STAND 2 is hands on hips in fists default.
|| ~llListFindList(curAnims, [(key)"42b46214-4b44-79ae-deb8-0df61424ff4b"]) // STAND 3 has one hand as a fist on hip.
|| ~llListFindList(curAnims, [(key)"05ddbff8-aaa9-92a1-2b74-8fe77a29b445"]) // RUN away!
|| ~llListFindList(curAnims, [(key)"20f063ea-8306-2562-0b07-5c853b37b31e"])) // Dive! Dive! HOVER DOWN!
{
fist(); // Call fist(), which covers the "are we there now?" and "what do we do again?"

// Catch all for all other states is relaxed hands. We may have missed something up there, but I did try to be exhaustive.
} else {
relaxed(); // Call relaxed(), which covers the "are we there now?" and "what do we do again?"
}
}

// Initialize timer, and reset a variable so we don't carry forward the last state erronerously.
initialize() {
llSetTimerEvent(timerChecking);
lastAnim = "";
}


// The stuff that actually starts doing things. Because all the above is just waiting impatiently to be chosen by one of the default states, otherwise it just sits there in its corner and rots.
default {
attach(key attached) { // Start the script when it is attached. Otherwise you have to run after this tiny prim object all over a sim as it flees from you. Trust me, it isn't fun.
if (attached != NULL_KEY) {// We are attached! So let's run!
detectHand(); // Run Meaty McMeatFingers!
initialize(); // Set the timer and blank out lastAnim so we don't get into trouble from the last wearing.
llResetTime();
} else { // No, really. We aren't attached. Stop the timer.
llSetTimerEvent(0);
}
}

timer() { // Our timer, so we keep checking states, instead of checking once and them being done with it. Because that would defeat the whole purpose of keeping track where our hands were.
detectHand(); // Run Meaty McMeatFingers at regular intervals!
}

}

// aim_r_rifle and stand_3 have different hand states for left/right- fists right, spread left for both. All the rock/paper/scissors also have different hand states- left is always spread.

Ring scripts, part one - introduction and explanation

This is the basis for the ring script I'm using. The one I use for my own items has a little more flexibility (yay!), but less efficiency (boo!). However, this is at least a) a starting point for people wanting to add the flexibility in perhaps more elegant ways than I have, because I code like an epileptic monkey with a large wrench that I beat things with regularly and often, and b) something that actually does work, and even without the extra bits I added is perfectly serviceable.

What this does in brief: it guesses the hand position it thinks you will have, in fairly often intervals. It uses the same basic functionality for this that Franimation Overriders use, and detects animations currently playing. Instead of overriding the current animation with a custom one, it assigns hand values to animations and adjusts the item you are wearing accordingly. It does not work as is with custom overrides or any other poses that override the hands. Part of the ugly hack in the version I use is to allow people to add their own UUIDs without delving into the code proper. Once the animations are detected, it then runs the proper function for that state, which includes position and rotation data for the item- or, indeed, whatever you desire it to do at a changed hand state.

Even built in animations do not always work properly because SL has some rather nasty hand position glitches, with priority for hands right now being an utter mess.

The code itself follows in the next few posts. Copy the entire body of the post into a script file, and drop that script file into your ring.

Monday, August 6, 2007

Helios and Astraios

The first things I'm actually getting ads and such together with are for the Jewelry Exposition, since I have the impetus for it. I need to get all the little details on the scripting for the rings (they've got a script that makes educated guesses as to your hand position, and moves the ring accordingly, instead of having them just stick out like they tend to otherwise) for Helios done so I can send them off, and I also want to send Miriel the pictures for the webpage.

Helios is what I am going to contribute to the treasure hunt. It's an Art Deco sunburst design, that comes in quite a few pieces. For her, one of the aforementioned scripted rings, a bracelet, broach, hair pin, necklace, and 3 sets of earrings- one set with drops, one set with fairly small studs, and one set that has both as well as some hoops further up the ear for those who prefer to wear multiple earrings. For him, a set of cufflinks, and a more intricate ring
Astraios is a set that is quite similar to Helios, coming in the same variety of pieces (and got the ads done at the same time since they had to be similar). It is a 6 pointed star instead of the sunburst, and in silver and black instead of gold and white. Because I'm not really someone who wears gold (or white), myself. Some day I'm going to have to figure out what to price everything. I really don't know.

Saturday, August 4, 2007

Greenies

I stumbled across Pavig Lok when I inspected an absolutely clever little magnified flea (I absolutely adore the mechanism, and had actually been considering the same type of exploit but hadn't decided on what yet), and wrote down her name for later to browse her picks, as I was still in my first exploration of New Babbage (and still haven't seen a quarter of what's there as it is). It is exactly along the lines I've been thinking myself- turn a weakness of the system into a strength, and she did it dead fabulously. I'm sure I'll eventually steal the idea for this exact mechanism too, it's just perfect.

Aside from sending me to the hobo railroad, which I desperately wish I'd known about when I first started (or, more accurately, when I restarted) because it's got all sorts of useful information for newbies (as well as some freebies I'm still sorting through), I also found Greenies Home, which is apparently a new build of hers. This place is great! You are the same size as these little green aliens, who are about mouse sized, in a gigantic house.

They're all over doing various and sundry things (everything is frozen in place with no movement, including a spilt drink, which I'm sort of on the fence about- on the one hand, I'd like some movement, on the other with figures you've either got to program AIs for all of them or they look even more out of place, and within the limitations of not only LSL but sim load and computer processing speed due to inefficiency of not being designed exclusively for that, it really isn't practical), and there are proximity teleports up to the mother ship. That's right, cameraing around doesn't cut it. I camera around most of the time, because I find movement to be difficult at times, especially with lag and all, but I've been flying all over the place instead (and I totally respect and love the idea, even though it is somewhat awkward for my computer). The ship has a shop, in which you can purchase one of the little green alien avatars for your very own, as well as other merchandising (let's face it, they have to pay the sim fees somehow!), including a pj set with a stuffed alien and alien slippers, see-through bags which contain little aliens, odd alien inspired accessories, particle effect perfumes (!). It's all truly adorable.

It's on such a vast scale that flying is generally the way to go about it, not only is a lot of the action happening above your head, but with the greater movement speed you aren't walking across an expansive floor forever. There are some fabulously built models, of particular interest to me were the cat, which is sculpty free and a little (huge) feline marvel (but that may be in part due to having 5 cats, so, er, I tend to be drawn to cats. Also, I think it's actually an old model, and I love history, as well as it being very well done), and the bronze of the ballerina, which is all sculpty and amazing- this is one of the examples of what sculpties can really truly do (sadly, we've seen a lot that sculpties really aren't necessary for as well, I don't think I can count how many sculpties that could have been made exactly with only two regular prims- and while this may be a way to get around your prim limit, I think it is harder on the system). Amusingly, it looks like all the alien ships and tech are textured with sculpties as textures- it's all that rainbow gradient (they probably are not, but they are certainly reminiscent). There's also a great big movie screen (tiny black and white TV if you were to scale to the house) with assorted shows playing, if you want to sit and stay a while.

Interesting sociological experiment though: while I was there, the majority of the people were in the dollhouse, which is build to our size.