<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>From the Wyverns nest</title>
	<atom:link href="http://purplewyvern.co.uk/thenest/feed/" rel="self" type="application/rss+xml" />
	<link>http://purplewyvern.co.uk/thenest</link>
	<description>a tale of Wyverns, Dragons and Ponies</description>
	<pubDate>Wed, 19 Nov 2008 09:08:12 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>It&#8217;s an event&#8230;</title>
		<link>http://purplewyvern.co.uk/thenest/2008/11/19/its-an-event/</link>
		<comments>http://purplewyvern.co.uk/thenest/2008/11/19/its-an-event/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 09:08:12 +0000</pubDate>
		<dc:creator>Jahdo</dc:creator>
		
		<category><![CDATA[Purple Wyvern Designs]]></category>

		<category><![CDATA[lsleditor]]></category>

		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://purplewyvern.co.uk/thenest/?p=24</guid>
		<description><![CDATA[Sometimes weird bugs creep into scripts especially those that have morphed and grown over time.  I was having a problem with settings not getting stored by the object and getting reset to default or stuck on an old value.  I was wondering if I had found a weird SL bug, but it turned out I [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes weird bugs creep into scripts especially those that have morphed and grown over time.  I was having a problem with settings not getting stored by the object and getting reset to default or stuck on an old value.  I was wondering if I had found a weird SL bug, but it turned out I had been unintentionally using a workaround that was no longer working in the latest server version and I had a basic script mistake that I was working around with some over complicated functionality.</p>
<p>My problems stemmed from the fact my scripts often contain the following statement:</p>
<p><code>default {<br />
on_rez(integer start_param){<br />
llResetScript()<br />
}</code></p>
<p>I primarily do this in any script where I use <code>llGetOwner()</code> in order to ensure that any listeners or other functions depending on the users key are set up correctly.  However, resetting the script means that it sets any variables used back to default values.  My work around for this was to store the variables in the description field of a child primitive, a technique known as primitive parameter overloading.</p>
<p>If my objects were just rezzed on the ground, I would of been OK at that point.  But they are not, they are worn attachments.  Attachments don&#8217;t tend to easily let you edit there description fields when worn.  If the description is blank, it seems to let you write it once or twice, but not always.  Attachments will revert any object name changes on being un-worn, it looks like the description field gets reverted as well.</p>
<p>However, after a little advice from a friend who mentioned that I was probably doing something fundamentally wrong and I that shouldn&#8217;t be using <code>llResetScript()</code> in the on_rez event if I wanted to persist data, I decided to go back and revisit events and how they are triggered.</p>
<p><span id="more-24"></span></p>
<p>So back to school for me.</p>
<p>First, lets do some testing.  Lets consider the following bit of test code</p>
<p><code>integer myValue = 0;</p>
<p>default {<br />
on_rez(integer start_param) {<br />
llInstantMessage(llGetOwner(),"on_rez: "+(string)start_param);<br />
llInstantMessage(llGetOwner(),"myValue: "+(string)myValue);<br />
}<br />
state_entry() {<br />
llInstantMessage(llGetOwner(),"state_entry");<br />
llInstantMessage(llGetOwner(),"myValue: "+(string)myValue);<br />
}</p>
<p>state_exit() {<br />
llInstantMessage(llGetOwner(),"state_exit");<br />
llInstantMessage(llGetOwner(),"myValue: "+(string)myValue);<br />
}</p>
<p>attach(key attached) {<br />
llInstantMessage(llGetOwner(),"attach: "+(string)attached);<br />
llInstantMessage(llGetOwner(),"myValue: "+(string)myValue);<br />
}</p>
<p>touch_start(integer total_number) {<br />
llInstantMessage(llGetOwner(),"touch_start: "+(string)(++myValue));<br />
}<br />
}</code></p>
<p>I&#8217;ve used <code>llInstantMessage()</code> here because everyone hates spammy debug shouting at them.  I could of used <code>llOwnerSay()</code> but I considered that I might want to test across sim borders (llOwnerSay seems to cover entire regions).  The only downside to <code>llInstantMessage</code> is that it sleeps the prim for a couple of seconds when used.</p>
<p>So drop the script into the test prim, what do you get?</p>
<pre><span style="color: #ff6600;">Test Object: state_entry
Test Object: myValue: 0</span></pre>
<p>State entry is called when you script is first put into a prim, because this is the first time it enters the default state.  OK, take it into inventory and rez it back out again, note that state_exit never gets called</p>
<pre><span style="color: #ff6600;">Test Object: on_rez: 0
</span><span><span style="color: #ff6600;">Test Object: myValue: 0</span></span></pre>
<p>First thing to note here, state_entry is not called! This is because the script never left the (current) default state.  The on_rez event is always called when the object is rezzed (you might like to try walking away from the prim until it is out if sight and then walking back towards it and see what happens).</p>
<p>Next, touch it a couple of times, take the prim back to inventory and then wear it</p>
<pre><span style="color: #ff6600;">Test Object: on_rez: 0
</span><span><span style="color: #ff6600;">Test Object: myValue: 2</span></span>
<span style="color: #ff6600;">Test Object: attach: 1b61897c-d2ea-4314-bca4-d5d9307c1ba4</span><span style="color: #ff6600;">
Test Object: myValue: 2</span></pre>
<p>Note, the on_rez is called as well as the attach event, taking the object back off gives you</p>
<pre><span style="color: #ff6600;">Test Object: attach: 00000000-0000-0000-0000-000000000000
</span><span style="color: #ff6600;">Test Object: myValue: 2</span></pre>
<p>Which is correct.  The null key indicates that the object is being detached.</p>
<p>If I reintroduce <code>llResetScript()</code> into the on_rez, then I start to run into problems.  When I attach the object, because on_rez is being called myValue is reset to declared default.  So instead of the messages above, I get the following:</p>
<pre><span style="color: #ff6600;">Test Object: on_rez: 0
</span><span><span style="color: #ff6600;">Test Object: state_entry: 0</span></span>
<span><span style="color: #ff6600;">Test Object: myValue: 0</span></span>
<span style="color: #ff6600;">Test Object: attach: 1b61897c-d2ea-4314-bca4-d5d9307c1ba4</span><span style="color: #ff6600;">
Test Object: myValue: 0
</span></pre>
<p>Ouch, variables reset, and I get both on_rez and state_entry.  But I can&#8217;t simply remove the <code>llResetScript()</code> because that would mean that the object would listen only to me and not the new owner when they purchase it.  </p>
<p>Fortunately a friend had the solution to how it should be done, the following code snippet was suggested to me:</p>
<p><code>changed(integer change) {<br />
if (change &amp; CHANGED_OWNER) {<br />
llResetScript();<br />
}<br />
}<br />
</code><br />
This makes the items reset when the owner is changed - excellent!  This is probably the code that I should also have in all my box unpacking scripts as well.</p>
<p>However, what happens if I don&#8217;t want it to reset because it&#8217;s a limited use item?  As long as the item isn&#8217;t transferable, then this is still OK.  However, if the item is transferable then using this code would mean the person would only have to transfer the item to refresh the usage - not good!</p>
<p>The answer, well that is in the <a title="LSL Wiki - State" href="http://lslwiki.net/lslwiki/wakka.php?wakka=State">LSLWiki</a>, use a global initiation function in both the state_entry and on_rez events and that should catch all instances:<br />
<code><br />
init() {// do lots of initiation here }<br />
default {<br />
on_rez(integer start_param) {init();}<br />
state_entry() {init();}</code></p>
<p>This is of course really basic stuff.  But sometimes its the basic stuff that trips you up!</p>
<p>This is also a lesson about relying too heavily on debuggers.  I have of course tested my scripts in LSLEditor first before deploying them.  However, LSLEditors debugger lets you fire off the individual events.  But if you are assuming that events are triggered in situations where they are not - then it can&#8217;t correct that mistake.</p>
]]></content:encoded>
			<wfw:commentRss>http://purplewyvern.co.uk/thenest/2008/11/19/its-an-event/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Stargates!</title>
		<link>http://purplewyvern.co.uk/thenest/2008/09/25/stargates/</link>
		<comments>http://purplewyvern.co.uk/thenest/2008/09/25/stargates/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 11:33:42 +0000</pubDate>
		<dc:creator>Jahdo</dc:creator>
		
		<category><![CDATA[Purple Wyvern Designs]]></category>

		<category><![CDATA[marketing]]></category>

		<category><![CDATA[stargate]]></category>

		<guid isPermaLink="false">http://purplewyvern.co.uk/thenest/?p=16</guid>
		<description><![CDATA[When Abalus was first set-up, one of the first things Nimbus rezzed was the Stargate at the sim entry point.  This gate had all the functions you might expect, flashing lights, noises, event horizon and a kawooosh!

When I first came into SL in 2006, I remember stumbling across the Cleary region and finding a stargate [...]]]></description>
			<content:encoded><![CDATA[<p>When Abalus was first set-up, one of the first things Nimbus rezzed was the Stargate at the sim entry point.  This gate had all the functions you might expect, flashing lights, noises, event horizon and a kawooosh!</p>
<p style="text-align: center;"><img class="aligncenter" src="http://lh5.ggpht.com/Jahdo.Ohtobide/SNt2IgCnLDI/AAAAAAAAAQc/xE6672tBpb0/s400/JsindoStargate.jpg" alt="" /></p>
<p>When I first came into SL in 2006, I remember stumbling across the Cleary region and finding a stargate there.  I took one of their free stargates and placed it at my home in Jsindo.  At the time I was on a 512m² plot and a stargate ate badly into my prim allocation so I removed it and thought nothing more.</p>
<p>The Stargate looks cool and serves as a nice central item for the sim rez point in Abalus.  It also provides a link into a network of other gates.  But does it have any other uses?</p>
<p><span id="more-16"></span></p>
<h3>Why have a Stargate?</h3>
<p>So why have a Stargate?  The gate could be taking anything up to ~200 prims that you could be using for item vendors or product displays.  They are also scripted items that could be adding lag.</p>
<p>However, a Stargate has a potential use as a marketing tool, to understand the reason why this might be, you have to consider how people move around in SL compared with reality.</p>
<p>Too move between two sims you generally do point-to-point teleports.  You would not walk or fly between sims because it would take too long.  Besides, if you are on a single sim island there is nowhere to fly to!  If you are on the mainland there are usually too many obstacles (ban-lines, etc) in the way.  Within a sim, generally most people either walk, ride or fly depending on the mood and distances and obstacles.</p>
<p>This also means there is generally no benefit or disadvantage in being in any one location, because it takes the same effort to get to one sim as another.  In real-life a person is more likely to use a shop that is close to them, then to travel to another town.  Unless the shop in the other town offers some benefit the close one doesn&#8217;t (such as prices or range).  There is benefit is being in a specific location that is popular with your target market.</p>
<p>The Stargate has a random function - this allows you to randomly dial another gate without having to know it&#8217;s name.  This can effectively link the sims with gates together as an entity.  In some ways it is like having a giant mall where the Stargates are the level escalators.  A person can be at another sim location, dial random, and end up at your location.  If they randomly clicked on the SL main map, the odds that would click on your location is probably fairly low.</p>
<p>So therefore, people who visit a sim with a Stargate possibly might also visit another sim with a Stargate on the same network (assuming they know how to use it).  Those random visitors are likely to explore the surroundings they land in and might go on to buying something.</p>
<p>However, this assumes that there is a high-visitor volume location somewhere on the network from which people can dial from.  This isn&#8217;t necessarily the case, I did a number of random dials and the gates I visited where either:</p>
<ul>
<li>6 island sims with private homes (community gates)</li>
<li>5 empty nightclubs/malls (ok, I visited in the quiet time, but still&#8230;)</li>
<li>4 good &#8220;feature areas&#8221; like the sgc, midway</li>
<li>4 gates at high altitude in reception blocks</li>
</ul>
<p>I only went to about 20 gates (Alteran has over 350 gates), so this isn&#8217;t a representative sample.</p>
<h3>Vistor Demographics</h3>
<p>So who is likely to actually use the stargate?  For a newbie, using a Stargate is not necessarily clear.  Therefore the most likely visitors into your Stargate are going to be existing gate owners or Stargate role-players.</p>
<p>Looking at existing statistics (for Jsindo rather than Abalus), on average there is only 1 visitor a day.  This is probably consistant with a friend using the gate, or another sim owner.  Since both Abalus and Jsindo get a number of random visitors per day (anything from 4-8) it is obvious that these are generally not appearing via the stargate.</p>
<p>One of the issues is that you need to know the command to operate the gate.  I have put a &#8220;How To Use&#8221; notecard dispenser next to the stargate to get the newbie&#8217;s into the network and hopefully that will increase gate usage (although effectively sending my customers away!).</p>
<h3>So which Stargate network should you use?</h3>
<p>There have been a number of Stargate networks that have popped up in SL, some are small, others are large and I won&#8217;t claim to be familiar with all of them.  The original Cleary network still exists and there are two other large (&gt;200 gates) networks also; Alteran and Open.</p>
<p>Unfortunately these networks don&#8217;t yet talk to each other and therefore you can&#8217;t transparently move between them.  Ideally, I would like to see the day when all the different networks can talk to each other and thus support seamless transporting between networks.  One option you could do, assuming you have space and prims, is to have all gates from all three networks on your land (there are those that provide this &#8220;hub&#8221; service).</p>
<p>Which gate network to choose comes largely down to personal preference.  You could look at the list of gates on the network and choose one that has sims which you would like to be linked to.  If you are really low on prims, the Open Network does offer a single prim gate and single prim DHD and the Alteran network has a couple of low prim gate designs.</p>
<p>Jsindo is on the Alteran network, mostly because Abalus is on it, but also because I ultimately prefer the design of the gates and the options that come with it.</p>
<h3>OK, I got a Stargate, What now?</h3>
<p>The obvious stuff, make it a pleasant area to visit.  If a SGC team do visit and you have  gaudy advertising hoardings all over the place they are probably going to dial out just as quickly.  The same actually goes for any selling area, having a nice environment for your customers to visit is as important as price, product and location.  The Stargate creators often also offer advice and guidelines on how to locate a stargate.</p>
<p>Having a Stargate will not guarantee extra traffic and extra sales.  But having one means you have got something that potentially might generate extra traffic, plus, they look cool anyway!</p>
<p style="text-align: center;"><img class="aligncenter" src="http://lh3.ggpht.com/Jahdo.Ohtobide/SNt2I_1UwGI/AAAAAAAAAQk/eVQf_Y8RUwQ/s400/castleCornerStargat.jpg" alt="" /></p>
<h3>Links</h3>
<ul>
<li><a title="Alteran Stargate Network" href="http://www.alpha-fox.com/sl/asn/">Alteran Stargate Network</a></li>
<li><a title="OS Labs" href="http://oslabs.info/index.php">OS Labs - Stargate Accessories</a></li>
<li><a title="Opengate Network" href="http://ma8p.com/~opengate/">Opengate Startgate Network</a></li>
<li><a title="Cleary Stargate Network" href="http://www.aristoi.org/gatenetwork/">Cleary Stargate Network</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://purplewyvern.co.uk/thenest/2008/09/25/stargates/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Sim Building!</title>
		<link>http://purplewyvern.co.uk/thenest/2008/07/01/sim-building/</link>
		<comments>http://purplewyvern.co.uk/thenest/2008/07/01/sim-building/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 09:06:53 +0000</pubDate>
		<dc:creator>Jahdo</dc:creator>
		
		<category><![CDATA[Places]]></category>

		<category><![CDATA[abalus]]></category>

		<category><![CDATA[building]]></category>

		<category><![CDATA[shopping]]></category>

		<guid isPermaLink="false">http://purplewyvern.co.uk/thenest/?p=15</guid>
		<description><![CDATA[Following the terraforming of Abalus by Daryth and a few minor adjustments by me and Nimbus, the next task is to decorate the sim.  We have 3750 prims on the sim of which we want to reserve 750.  This leaves 3000 prims to do our own builds and for general sim landscaping.

I don&#8217;t have the [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Following the terraforming of Abalus by Daryth and a few minor adjustments by me and Nimbus, the next task is to decorate the sim.  We have 3750 prims on the sim of which we want to reserve 750.  This leaves 3000 prims to do our own builds and for general sim landscaping.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://lh3.ggpht.com/Jahdo.Ohtobide/SGkvQiIPCLI/AAAAAAAAANs/NMip-iEBm3o/s400/PWD.jpg" alt="Purple Wyvern at Abalus" width="400" height="302" /></p>
<p style="text-align: left;">I don&#8217;t have the time or skill to build everything a sim needs, so time to go shopping!</p>
<p style="text-align: left;"><span id="more-15"></span></p>
<h3 style="text-align: left;">Botanicals</h3>
<p style="text-align: left;">Unless the sim is themed to be a barren wasteland, it needs trees, bushes and flowers.  Abalus has a Mediterranean island type theme.   The whole concept of the area is an old volcano which blew it&#8217;s top off many thousands of years ago (and the detritus has settled inside the cone) .</p>
<p style="text-align: left;">To save on prim allocation, around the outside of the island I have generally used Linden trees; these are 1 prim and generally look acceptable for most people (depending on graphics setting).  But within the Island itself I prefer to use prim trees, especially given the nature of the Linden trees to encroach on buildings (depending on wind and graphics settings).</p>
<p style="text-align: center;"><img src="http://lh6.ggpht.com/Jahdo.Ohtobide/SGkvQ2EtAmI/AAAAAAAAAN0/T2ShN_IAS8Y/s400/Bridge_Beach.jpg" alt="Overlooking Dragon Beach" /></p>
<p style="text-align: left;">I favour trees from the Heart Garden Centre, these are well priced (often 299L$ or 399L$ for a multipack of 12 trees) with excellent textures and many trees are 6 prims or less.  I really like the Heart silver birch trees and think those are probably the nicest trees they make.  I have combined these with Mediterranean Pines and Mountain Pine for most of the general areas.  On the dragon beach I have used tropical palms.  Scattered around the Island are also the odd Lemon tree and Olive tree.  Equus has Apple and Orange trees, so it looks like we won&#8217;t have any shortage of fruit!  On the Isle of Wyrms proper Daryth has also used Heart trees, so this also helps keep the sim looking consistent with the rest of the continent.</p>
<p style="text-align: left;">I did consider buying some Straylight Botanicals forest trees, however the smaller trees are ~35 prims each (priced at around 160L$ per no-copy tree) and the mega tree just dominates the whole sim.  If I was making a tree house forest sim these would be my first choice however!  I recommend visiting ElvenValley to see a really nice forest sim with the Botanicals trees nicely used (including a mega).</p>
<p style="text-align: left;">Another tree maker worth mentioning is Julia Hathor,  her trees are also very nice, very prim efficient and have some nice features (like the apple trees that do drop apples).  Although I find that it isn&#8217;t easy to integrate her trees with Heart and get a consistent look.</p>
<p style="text-align: left;">Again for bushes I tend to favour Heart, expect to see some Purple Loosestrife, Foxgloves and maybe even some grape vines turning up.</p>
<h3 style="text-align: left;">Structures</h3>
<p style="text-align: left;">Most of my major builds are my own, due mostly to the fact I like building structures rather than a lack of purchasable alternatives.</p>
<p style="text-align: left;">Zephyr told me about the Swinging Rope Briges by Gypsy Paz.  I picked up a copy-mod set for 800L$ through SLX.  The bridges come in 20, 30 and 40 meter lengths and worst case requires 41 prims.  These move when you walk across them! and the effect is really accentuated if you lay them at a slight angle.  The only limitiation is that the bridges don&#8217;t like to be put across sim boundaries (they seem to go phantom).</p>
<p style="text-align: center;"><img src="http://lh5.ggpht.com/Jahdo.Ohtobide/SGkvRMX3YYI/AAAAAAAAAN8/k00s0qqS16Q/s400/secretTower.jpg" alt="Secret Hatchie Tower" /></p>
<p>On the South Eastern corner of the Island we have a Secret Hatchie tower.  This tower is intended to be a secret hiding place where the hatchlings can scheme and plot, plus it has really good views into Equus (with boxes under the windows so hatchies can see out).  I wanted to add a pirates cannon for the tower.  I found a few cannons on SLX which looked OK in the ad, but once rezzed either the textures were a bit naff or they were very primmy (40 prims in one case).  Then I recalled that I had seen a good pirates cannon on the Hatchie Haven sim (another Zephyr find).  Examining the creator of that object, I found it was made by Lia Woodget.  Using her picks I located her home store and picked up the no-copy Elysium  cannon (16 prims) for 180L$.  This has a really nice sound and smoke effect to it (as well as shooting a cannon ball).</p>
<p style="text-align: left;">The tower also has lockable doors by Sirius Creations.  These doors are highly configurable (sound, speed, and a lot more) and come in a <strong>very </strong>wide range of styles.  They are low lag (0.05 max on the script console) and are a snip at 85L$ for a no-copy mod/trans single door.  I choose a couple of solid looking wooden doors and locked the inner one (have to keep my cookie hoard safe).</p>
<p style="text-align: left;">The other major structural element in the sim is the fishing area; this is a <a title="7Seas Fishing" href="http://7seasfishing.com/">7Seas fishing</a> complex.  This system is very nice in that the whole installation is both low prim (you could have fishing with just one prim) and has low script usage.  The 7seas system is very good, both from an owners and users perspective.  It is cost effective (a low 750L$ one off cost to acquire the system) , there are frequent updates to keep people interested and the fish that you acquire are fun pets, and are often highly detailed.  My only criticism would be that my dragon can&#8217;t hold the fishing rod - not that there would be room for many dragons on the wharf anyway!</p>
<p style="text-align: center;"><img class="aligncenter" style="vertical-align: middle;" src="http://lh6.ggpht.com/Jahdo.Ohtobide/SGkvQWt3K9I/AAAAAAAAANk/7f1hL-qmOCA/s400/abalus_fishing.jpg" alt="Abalus Fishing area" width="400" height="300" /></p>
<h3 style="text-align: left;">Wildlife</h3>
<p style="text-align: left;">Scripted animals can be on the whole a bit laggy therefore we have to be careful what goes down.  Generally we are using scripted animals from  Animania.   We have Jellyfish, Swans, Gulls and a Hummingbird.  I did also have a Shark, but this seemed to be a bit more laggy than the others, and a crab but the slope algorithm in it could not handle the megaprim sphere I use for my beaches.  Most of the Animania animals cost between 500L$ and 700L$ for a single animal and are very low prim (as they are sculpties).  We also have Piranhas from Splash Aquatics and these do bite - so don&#8217;t fall in the lake!</p>
<p style="text-align: left;">I may eventually put down some of my exploding sheep - so watch out if you try to eat one.</p>
<h3 style="text-align: left;">Shopping links</h3>
<p style="text-align: left;">Here are some links to the shopping locations mentioned above.  Beware! Sometimes content creators do move there shops around, if in doubt check the creators profile.</p>
<p style="text-align: left;"><a href="http://slurl.com/secondlife/Heart%201/124/125/35">Heart Garden Centre</a> (Lillith Heart &amp; Dolly Heart) - Trees, Bushes, Flowers</p>
<p style="text-align: left;"><a href="http://slurl.com/secondlife/Straylight/182/53/25">Botanicals</a> (Kriss Lehmann) - Sculpti Trees</p>
<p style="text-align: left;"><a href="http://slurl.com/secondlife/Serenity%20Falls/187/103/25">Creative Fantasy</a> (Julia Hathor) - Trees, Houses. Birds, Butterflies</p>
<p style="text-align: left;"><a href="http://slurl.com/secondlife/Gypsy%20Falls/184/50/23">Gypsy Gadgets</a> (Gypsy Paz) - Canoe, Swimballs and Swinging Bridge</p>
<p style="text-align: left;"><a href="http://slurl.com/secondlife/Black%20Spot/149/165/24">Black Spot Shipyard</a> (Lia Woodget) - Boats (static), Cannons and other seafaring items</p>
<p style="text-align: left;"><a href="http://slurl.com/secondlife/Jsindo/60/67/67">Sirius Creations</a> (Innes McLeod) - doors, gates, also furniture cabinets and beach towels</p>
<p style="text-align: left;"><a href="http://slurl.com/secondlife/Skynx/70/64/22">Animania</a> (Vinnie Baxter) - animated animals, ducks, swans, sharks, hummingbirds, etc</p>
<p style="text-align: left;"><a href="http://slurl.com/secondlife/Gooruembalchi/112/193/70">Splash Aquatics</a> (Kaikou Splash) - fish and fishy things!</p>
]]></content:encoded>
			<wfw:commentRss>http://purplewyvern.co.uk/thenest/2008/07/01/sim-building/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Buildings Tools - LSL Editor</title>
		<link>http://purplewyvern.co.uk/thenest/2008/06/26/buildings-tools-lsl-editor/</link>
		<comments>http://purplewyvern.co.uk/thenest/2008/06/26/buildings-tools-lsl-editor/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 07:05:51 +0000</pubDate>
		<dc:creator>Jahdo</dc:creator>
		
		<category><![CDATA[Purple Wyvern Designs]]></category>

		<category><![CDATA[lsleditor]]></category>

		<category><![CDATA[scripting]]></category>

		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://purplewyvern.co.uk/thenest/?p=12</guid>
		<description><![CDATA[Most of what I do involves scripting (aside from the odd animation or texture).  There are many annoyances to a scripter, most of them in-world.  In no sort of order these are:

Asset failed to compile/save (generally when the asset database is throwing a hissy fit)
SL ate the script
Finding scripts reverted in objects
Silly errors [...]]]></description>
			<content:encoded><![CDATA[<p>Most of what I do involves scripting (aside from the odd animation or texture).  There are many annoyances to a scripter, most of them in-world.  In no sort of order these are:</p>
<ol>
<li>Asset failed to compile/save (generally when the asset database is throwing a hissy fit)</li>
<li>SL ate the script</li>
<li>Finding scripts reverted in objects</li>
<li>Silly errors in scripts!</li>
<li>Script stopped running</li>
</ol>
<p>Some of these just come down to doing things correctly and having patience (#3 is often down to taking an object back into inventory after modifying a contained script, before it has compiled and saved).  However, trying to develop and debug scripts in-world can often be very time consuming.  When SL is being laggy, often it takes some seconds for a script to compile, save and reset ready for testing.</p>
<p>One of the alternatives is to use an offline script development system.  The one I use is <a title="lsleditor homepage" href="http://www.lsleditor.org/">LSLEditor</a> which is an open source tool created by Alphons  van der Heijden.</p>
<p style="text-align: center;"><a href="http://purplewyvern.co.uk/thenest/wp-content/uploads/2008/11/lsl-editor.jpg"><img class="size-medium wp-image-29 aligncenter" title="lsl-editor" src="http://purplewyvern.co.uk/thenest/wp-content/uploads/2008/11/lsl-editor-300x230.jpg" alt="" width="300" height="230" /></a></p>
<p>LSL Editor performs a number of functions, it has code completion and code tips (useful for if you can&#8217;t remember all the arguments to a function, or the exact name).  It can check if your LSL is semantically correct and it has a debugger function.  There is also a &#8220;Solution Explorer&#8221; which allows you to build a virtual object and test the interactions between multiple scripts.</p>
<p><span id="more-12"></span></p>
<h3>Using LSL Editor</h3>
<p>The easiest way to use LSL Editor is to just open it up and type your script directly in, check the syntax and transfer the script in-world.  This does not use all the abilities of the tool, but this can still be a timesaver when SL is down and you still need to work on scripts.  One point here, it&#8217;s important to maintain synchronisation between your in-world and out-world script library.  There is nothing worse than not having the latest and greatest to hand when you want to do some development.</p>
<h3>Debug It!</h3>
<p>The debugger is probably the most useful feature of the tool.  The ability to write some code and throw it into a debugger to work through your use cases and verify it behaves as expected.  There are some limitations.  The LSL Editor only provides scope to define a fairly simple object environment, if you need a complex scenario you have to test in-world.  There is also no scope to view prim options such as colour or movement, you can however read these options being performed in the debug window.</p>
<p style="text-align: center;"><a href="http://purplewyvern.co.uk/thenest/wp-content/uploads/2008/11/lsleditordebug.jpg"><img class="aligncenter size-medium wp-image-30" title="lsleditordebug" src="http://purplewyvern.co.uk/thenest/wp-content/uploads/2008/11/lsleditordebug-300x287.jpg" alt="" width="300" height="287" /></a></p>
<p>In the basic debugger (not the Solution Explorer), there is also limited ability to interface with inventory.  You can&#8217;t check inventory contents or read a notecard.   However, if you configure an object in the solution explorer, you can perform these options plus you can have multiple scripts in multiple objects.</p>
<p>The debugger is a pretty powerful tool and some basic tests can save a lot of time in-world.  One of the nice features is that it does not constrain you in what you do to your script, for example you can send LSL events in any order (such as a detach before the attach) and watch the results.</p>
<h3>It&#8217;s not Perfect!</h3>
<p>LSL Editor does have areas where it differs from the in-world LSL compiler.  The effect of this is that in some cases a script will behave differently from in-world.</p>
<p>One example is if you want to do a Switch statement.  LSL does not support Switch, therefore you have to do it by:</p>
<pre>// switching integer n
if (n == 0) {
    llOwnerSay("You typed zero.\n");
    jump break;
}
if (n ==3 || n == 5 || n ==7) {
    llOwnerSay("n is a prime number\n");
    jump break;
}
if (n == 2 || n == 4 || n == 6 || n == 8 ) {
    llOwnerSay("n is an even number\n");
    jump break;
}
if (n == 1 || n == 9 ) {
    llOwnerSay("n is a perfect square\n");
    jump break;
}
@break;</pre>
<p>This will compile and debug in LSL Editor, but it will not work in-world.  This is due to a bug in LSL in which you must have one jump target for every jump source (so you end up having break1, break2, break3, etc).  This is a bug in LSL Editor because it does not contain the bugs that SL does!</p>
<p>LSLEditor also lets you do some silly things that the SL compiler seems much more strict on, such as <code>integer number = (integer)(string) keyValue</code> or <code>for (integer n = 0; n &lt; 10; n++)</code>.  This can be a bad thing since only the really experienced instinctively avoid writing silly things into scripts.</p>
<p>There are a number of other issues with LSLEditor posted on the <a title="SL Wiki - LSL Editor Bugs" href="http://wiki.secondlife.com/wiki/LSLEditorBugs">SecondLife Wiki</a>, however it is always a good idea to check the details of the function you are using just in case there are any known quirks or bugs.</p>
<h3>Other Options</h3>
<p>There are other editors available, mostly those that provide code highlighting and tooltips, some provide semantic checkers as well.  The full list can be found on the <a title="LSL Wiki - Alternate Editors" href="http://wiki.secondlife.com/wiki/LSL_Alternate_Editors">list of alternate editors</a> on the LSL wiki.  LSLEditor is unfortunately only available for MS Windows.</p>
<p>There was one other development tool which did catch my interest.  I noticed there was a plug-in for the Eclipse framework called <a title="LSL Plus homepage" href="http://lslplus.sourceforge.net/">LSL-Plus</a>.  I&#8217;ve used Eclipse for C/C++ development and it is a very good tool.  It still seems to be in Alpha development, so at some point I&#8217;ll give it a try and post some thoughts.</p>
<h3>The Scores on the Doors are&#8230;</h3>
<p>So, given my original list of annoyances:</p>
<ol>
<li>Asset failed to compile/save (generally when asset database is throwing a hissy fit)</li>
<li>SL ate the script</li>
<li>Finding scripts reverted in objects</li>
<li>Silly errors in scripts!</li>
<li>Script stopped running</li>
</ol>
<p>LSLEditor helps with (1) in that the server being slow doesn&#8217;t slow down development, and keeping a copy out of SL solves (2) as well.  Going through a debug process will help keep down the number of bugs (4), but not completely prevent them due to the limitations of the tool.</p>
<p>Strange SL defects like finding a script has stopped or that it has reverted can&#8217;t be solved by the tool.  Well 3 out of 5 ain&#8217;t bad.</p>
]]></content:encoded>
			<wfw:commentRss>http://purplewyvern.co.uk/thenest/2008/06/26/buildings-tools-lsl-editor/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Abalus rises!</title>
		<link>http://purplewyvern.co.uk/thenest/2008/06/24/abalus-rises/</link>
		<comments>http://purplewyvern.co.uk/thenest/2008/06/24/abalus-rises/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 19:33:51 +0000</pubDate>
		<dc:creator>Jahdo</dc:creator>
		
		<category><![CDATA[Isle of Wyrms]]></category>

		<category><![CDATA[Places]]></category>

		<category><![CDATA[Purple Wyvern Designs]]></category>

		<category><![CDATA[abalus]]></category>

		<category><![CDATA[building]]></category>

		<category><![CDATA[terraforming]]></category>

		<guid isPermaLink="false">http://purplewyvern.co.uk/thenest/?p=14</guid>
		<description><![CDATA[On the 18th of June a new sim rose from the waves, west of the new Equus sim (soon to be the new home of Lone Star Ranch).

Abalus, also known as the Island of Amber, is an Open Spaces sim.  The sim is shared between the Purple Wyvern group and the Caudra Draconis group. [...]]]></description>
			<content:encoded><![CDATA[<p>On the 18th of June a new sim rose from the waves, west of the new Equus sim (soon to be the new home of Lone Star Ranch).</p>
<p style="text-align: center;"><img style="vertical-align: middle;" src="http://lh3.ggpht.com/Jahdo.Ohtobide/SGDaJnzMMnI/AAAAAAAAAL8/ZkJfne__q3w/s400/2583527926_8edc611c62_o.jpg" alt="Abalus Sim Day 0" width="400" height="303" /></p>
<p>Abalus, also known as the Island of Amber, is an Open Spaces sim.  The sim is shared between the Purple Wyvern group and the Caudra Draconis group.  This will soon be the new home location for the Purple Wyvern outlets.  Jsindo is staying, alas delegated to second fiddle.  This means that the Avendale Ruins location will be for sale soon!</p>
<p><span id="more-14"></span></p>
<h3>Open Spaces Sims</h3>
<p>Open Spaces sims are meant to be &#8220;void&#8221; sims used to provide ocean or open space areas.  On a sim host, four Open Spaces sims occupy the space normally occupied by a normal sim.  This means that an Open Spaces sim has much lower capabilities then a conventional sim.  The most visible difference is that the sim has a limit of 3750 prims instead of 15000, but load up an Open Spaces sim with avatars and scripts and the other limitations become apparent too.</p>
<p>The benefit is that an Open Spaces sim costs a lot less than a normal Sim, but to own one you must already have a normal sim.  Fortunately, Isle of Wyrms owner, Daryth Kennedy is starting to rent Open Spaces sims for residential use and is allowing commercial use in certain cases.</p>
<h3>Terraforming</h3>
<p>Terraforming a sim is an art that requires patience!  The easiest way to do it is to use external tools to generate the RAW file and upload that.  However, only the estate owner can upload RAW files on to the sim.  As a tenant, I hold the Estate Manager roles, which allows me a lot of things, but not major terrain works.</p>
<p>The standard Land Editing tools are best left to small scale land terraforming.  I tried to do a major change and had to revert it since everything just looked too blocky.  Here are some useful tips for terraforming!</p>
<ul>
<li>Use select land and &#8220;Apply to selection&#8221; with care.  This is the easiest way to end up with blocky terrain.</li>
<li>Make small quick brushes with the selector for best effect, and use the smallest selection brush you can get away with.</li>
<li>Using the &#8220;Flatten&#8221; tool and sweeping from higher to lower land seems to be an effective (but slow) way of extending hills and land into the sea (but mind, you could end up with a flat terrace if you don&#8217;t change your starting pont each time).</li>
<li>Using the Flatten tool the other way around is a good way of cutting a channel or river</li>
<li>The &#8220;Smooth&#8221; tool doesn&#8217;t smooth to a flat area! (It&#8217;s a bit weird).</li>
</ul>
<h3>Estate Management</h3>
<p>Unfortunately the Estate Management tools are fairly undocumented in what they do and what are valid settings combination&#8217;s.  The first thing I came across is teleporting, telehubs and landing points.  As an Estate Manager I can by-pass a lot of the teleport limitations (I&#8217;ve not tried going into a banned parcel, but pretty sure I can).  However, a non-estate manager can not.</p>
<p>Out of the box, the sim was set to not-public (which means you have to be on the named access list) but also with no direct teleport allowed.  As I didn&#8217;t have a telehub set, any user on the access list who tried to teleport in were denied (had I been connected to a sim that was public, they would have ended up there).   They were not actually barred, it was just the sim was redirecting them to the nearest telehub.  That was in the next door sim, which was non-public.  OK, allow direct teleports problem solved&#8230;</p>
<h3>Telehubs</h3>
<p>We wanted to initially add a telehub at our Stargate.  Telehubs make all incoming traffic land at the telehub (except Estate Mangers, the Estate Owner and Officers in the group that owns the land).  If you don&#8217;t mind that all your traffic lands at one spot, then they are the thing to use.</p>
<p style="text-align: center;"><img style="vertical-align: middle;" src="http://lh5.ggpht.com/Jahdo.Ohtobide/SGDaJbfvSCI/AAAAAAAAALs/CeCv17foOLU/s400/2596914451_3bc2eae3c5_o.jpg" alt="Abalus Stargate" width="400" height="303" /></p>
<p>However, if you are going to cut plots and want to allow people to land at those plots, then you would use plot landing points instead.  After some training by Onix Harbinger, I was ready to make my own Telehub.  The instructions to do so can be found at the Second Life wiki under <a title="Second Life Wiki" href="http://wiki.secondlife.com/wiki/Estate_and_Private_Region_Telehubs_and_Direct_Teleport">Estate and Private Region Telehubs and Direct Teleport</a>.  This particular wiki page isn&#8217;t the easiest to find!</p>
<p>A couple of bits of excellent information given to me by Onix were:</p>
<ul>
<li>You have to have at least one Spawn Point.</li>
<li>Telehubs and Landing Points are mutually exclusive - if you set both then who knows where people could rez in!</li>
</ul>
<h3>The Future&#8230;</h3>
<p>Abalus presents the opportunity to present the purple wyvern products plus it allows space, so the vendors no longer need to be crammed together.  The fact I need to make a few dragon orientated items for the sim also provides a few new ideas for products&#8230;</p>
<p>So watch this space&#8230; and Abalus&#8230;</p>
<p style="text-align: center;"><img src="http://lh6.ggpht.com/Jahdo.Ohtobide/SGDaJRJ8lLI/AAAAAAAAAL0/UUCRBUIoJw4/s400/2596859823_503ce9f166_o.jpg" alt="Abalus Wyverns Nest &amp; Dragon Chair" width="400" height="303" /></p>
]]></content:encoded>
			<wfw:commentRss>http://purplewyvern.co.uk/thenest/2008/06/24/abalus-rises/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Arrr, Treasure Chest!!!</title>
		<link>http://purplewyvern.co.uk/thenest/2008/05/26/arrr-treasure-chest/</link>
		<comments>http://purplewyvern.co.uk/thenest/2008/05/26/arrr-treasure-chest/#comments</comments>
		<pubDate>Mon, 26 May 2008 13:25:29 +0000</pubDate>
		<dc:creator>Jahdo</dc:creator>
		
		<category><![CDATA[Isle of Wyrms]]></category>

		<category><![CDATA[rotation]]></category>

		<category><![CDATA[scripting]]></category>

		<category><![CDATA[treasure]]></category>

		<guid isPermaLink="false">http://purplewyvern.co.uk/thenest/?p=13</guid>
		<description><![CDATA[Make a Treasure Chest for the upcoming aquatically themed Isle of Wyrms Summer Festival.  The idea being that the hatchies can hunt down the treasure chests, click them and the chest will open to reveal the treasure (and give the hatchie a gift).

The treasure chest itself is based on a stripped down version (from [...]]]></description>
			<content:encoded><![CDATA[<p>Make a Treasure Chest for the upcoming aquatically themed Isle of Wyrms Summer Festival.  The idea being that the hatchies can hunt down the treasure chests, click them and the chest will open to reveal the treasure (and give the hatchie a gift).</p>
<p style="text-align: center;"><img class="alignnone" src="http://lh5.ggpht.com/Jahdo.Ohtobide/SDq2locMWjI/AAAAAAAAALE/0SrZMer9ABA/s400/Snapshot_089.JPG" alt="Open Treasure Chest" /></p>
<p>The treasure chest itself is based on a stripped down version (from about 16 prims to 3) of Daryth&#8217;s treasure chest from one of her building kits.  To save prims I decided to move the chest lid instead of having 2 chest lids and swapping them using alpha transparency.  The issue with this is that setting location and rotation of a prim in SL can be a headache inducing exercise.  SL uses quaternions to specify rotations.  Although there are a number of transformation functions to switch to more commonly known units.<br />
<span id="more-13"></span></p>
<h4>Preparation</h4>
<p>The first step is to reshape the treasure chest to the desired size.  In my example the body of the chest is a box of 1.024 m width x 0.512 m depth and x 0.368 m height.  The lid of the box is a linked cylinder of the same dimensions, but cut so that only half a cylinder is present.</p>
<p>The next step is to find the local position of the lid prim in both the open and closed positions.  Rather than have the treasure chest learn the position, similar to how the Timeless Linked Door works, I am hardcoding the positions (which means it will be sensitive to resizing of the whole object).</p>
<p>I use the following script to get the rotation and position of the lid.  Note the rotation is returned as a vector in Euler co-ordinates and in radians.</p>
<pre>// This reads back the Local Pos and Rot when touched
default {
    touch_start(integer total_number) {
        llOwnerSay("Rot = "+(string)llRot2Euler(llGetLocalRot()));
        llOwnerSay("Pos = "+(string)llGetLocalPos());
    }
}</pre>
<p>Since I am hardcoding these, I could actually use a raw Rotation and therefore not need to convert the units.  I have left this extra conversion in so that I can tweak the values at a later stage (tweaking in Euler is much easier than tweaking in Quaternion).</p>
<h4>Local vs Global</h4>
<p>The prim position and rotation setting commands have differing behaviors depending on how they are used.  In this case, I am going to put the script in the lid and move it when touched, therefore I need to set the local position and rotation.  To do this I need to make sure the lid is a child prim and not the root prim.  If you move and rotate the root prim, it will move and rotate the whole object (global).</p>
<p><code>llSetRot()</code> essentially works in the global co-ordinates (and it&#8217;s an offset for a child prim), so in this case I use <code>llSetLocalRot()</code> as that is always a rotation with respect to the root prim.  <code>llSetPos()</code> always works as an offset of the roots prims position for a child prim, therefore it is ok.</p>
<p>However, if you use these two commands to move the lid, the movement is jerky.  This is because both functions cause the script to sleep 0.2 seconds.  A technique to get around this is to use <code>llSetPrimitiveParams()</code> and set both the rotation and position at the same time.  For <code>llSetPrimitiveParams()</code>, the rotation command is the same as <code>llSetRot()</code>.  Therefore we have to deal with converting this to a local rotation.   I sought the LSL Potal for some wisdom, and this advice could be found:</p>
<blockquote><p>&#8220;If you are trying to set the rotation of a child prim relative to the root prim then divide the local rotation by the root rotation.&#8221;</p></blockquote>
<h4>Final Script</h4>
<p>The final script goes into the lid of the treasure chest and looks a little like this:</p>
<pre>// Treasure Chest Script
// On Touch, this swaps from open to closed and visa versa
// Constants for Treasure Lid Position
vector rotClosed = &lt;-1.57083, -0.00000, -0.00000&gt;;
vector posClosed = &lt; 0.00000,  0.00000,  0.18400&gt;;
vector rotOpen =   &lt;-1.57000,  0.00000,  1.57000&gt;;
vector posOpen =   &lt; 0.23610,  0.00000,  0.43744&gt;;
// Global variables
integer chestOpen = FALSE;

// Lid movement function
moveChestLid (rotation rot, vector pos) {
    rot /= llGetRootRotation();
    llSetPrimitiveParams([PRIM_ROTATION, rot, PRIM_POSITION, pos]);
}

default {
    on_rez(integer start_param) { llResetScript(); }
    touch_start(integer total_number) {
        // Swap between positions
        if (chestOpen == TRUE) { // set closed
            chestOpen = FALSE;
            moveChestLid(llEuler2Rot(rotClosed),posClosed);
        } else { // set open
            chestOpen = TRUE;
            moveChestLid(llEuler2Rot(rotOpen),posOpen);
        }
    }//end touch_start
}</pre>
<h4>Finishing Touches</h4>
<p>There are a number of final touches that can be added to the final treasure chest fairly easily:</p>
<ul>
<li> trigger a particle effect when the box opens (and shut it off when the box closes)</li>
<li> automatically close the box after a certain length of time</li>
<li> give one (or more) inventory item(s) when the box is opened (although remember that you can only detect the avatar that touched the chest in the <code>touch_start</code> event)</li>
</ul>
<p style="text-align: center;"><img class="aligncenter" src="http://lh5.ggpht.com/Jahdo.Ohtobide/SDq2locMWiI/AAAAAAAAAK8/Vyj_cZzJdBA/s400/Snapshot_094.JPG" alt="Final Treasure Chest with Particles" /></p>
]]></content:encoded>
			<wfw:commentRss>http://purplewyvern.co.uk/thenest/2008/05/26/arrr-treasure-chest/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Making a Basic HUD</title>
		<link>http://purplewyvern.co.uk/thenest/2008/04/25/making-a-basic-hud/</link>
		<comments>http://purplewyvern.co.uk/thenest/2008/04/25/making-a-basic-hud/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 09:10:27 +0000</pubDate>
		<dc:creator>Jahdo</dc:creator>
		
		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[hud]]></category>

		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://purplewyvern.co.uk/thenest/?p=11</guid>
		<description><![CDATA[Many products in SL come with a head-up-display or HUD device to control aspects of the product.  These range from simple colour changes to the ultra sophisticated multi-tool do-everything type HUDS.
The reasons you might create a HUD is if you want to make some aspect of your project controllable by your customer but don&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Many products in SL come with a head-up-display or HUD device to control aspects of the product.  These range from simple colour changes to the ultra sophisticated multi-tool do-everything type HUDS.</p>
<p>The reasons you might create a HUD is if you want to make some aspect of your project controllable by your customer but don&#8217;t want to have to add lots of button prims on the product or have your customer edit notecards.</p>
<p>This tutorial covers some basic concepts in putting together a basic hud,  the basic type that simply sends commands for processing in a separate in-world device,  but doesn&#8217;t show a complete example (I&#8217;ll add that if it&#8217;s requested, should anyone read this).</p>
<p>More complex devices that might incorporate 2-way communication are beyond this simple tutorial.<span id="more-11"></span></p>
<h3>Which HUD Position?</h3>
<p>There are eight possible positions that you can attach a HUD to.  These are show in the following picture:</p>
<p style="text-align: center;"><img class="aligncenter" src="http://lh4.ggpht.com/Jahdo.Ohtobide/SBDaJmy5CII/AAAAAAAAAJ0/7vcWi2848DA/s400/HUDAttachPoints.jpg" alt="HUD Attachment Points" /></p>
<p style="text-align: center;"><em>Where T: Top, L: Left, R: Right, B: Bottom, C: Centre</em></p>
<p>The primitives that were used in the picture have the dimensions X=0.5, Y=0.1 and Z=0.1.  By default it is the Y,Z face that faces the user on HUD attachments and not the X,Y.</p>
<p>A few things can be noted:</p>
<ul>
<li>the Centre and Centre2 positions are the same (meaning you can have two items defaulting to the centre of the screen).</li>
<li>the other positions correspond to the edge of the screen in each case, and the centre point of the prim is placed on the attachment position.  This means that if you attach a prim for a HUD to the Top Left attachment point, ¾ of the prim will not be visible to the user.</li>
</ul>
<p>Choosing the right position is important.  If the hud takes up a lot of screen real-estate and is only worn occasionally, then the centre positions may be ok.  If it is something that is going to be worn all of the time, then it may be better to design for one of the bottom positions or the left side.  As a note: the right side gets the statistics bar when enabled, and that can&#8217;t be moved elsewhere on the screen.</p>
<p>By editing the object you can move the object to a different position with respect to the attachment point and the prim will remember that position if you detach and reattach it and anyone you give the HUD to will also get that remembered setting.</p>
<p>SL sometimes forgets the remembered position, so check it is stored correctly!</p>
<h3>How To Communicate?</h3>
<p>When discussing two separate objects communicating with one another within SL, generally this is realised via various forms of chat:</p>
<ul>
<li><code>llSay()</code> - This is the basic method used by most, this technique contributes to lag of the sim.  This also has a 20m max range between the two objects.</li>
<li><code>llShout()</code> - This technique has a 80m working radius instead, but has a greater contribution to lag</li>
<li><code>llRegionSay()</code> - This technique allows communication within anywhere in the same sim.  However, if the objects are either side of a sim boundary, even if this is less than 5 meters, they will not be able to communicate.</li>
</ul>
<p>There are other ways also!  You could use Email between objects, however this method requires that your object has fixed UUID&#8217;s (or that you can detect it).  You could also use HTTP requests, with an out-world server storing the information to be communicated.  However, both of these methods are slower than a basic Listen handler (normally).</p>
<p>I have intentionally left out <code>llWhisper()</code> because in a moderately lagged sim, this seems to reliably fail!  This is the one problem with one-way communication, there is no guarantee that the message will be received and no way for you to know if it was received or not.</p>
<p>If your HUD is talking to another attachment worn by the user, <code>llSay()</code> would probably be the best technique.  If it is for an attachment with a fixed position, then <code>llRegionSay()</code> might be a better idea.</p>
<h3>Making the HUD</h3>
<p>The HUD itself is fairly straightforward, the general design is to have one root prim and a number of linked buttons.   The button send tells the root prim that it has been pressed and the root prim in turn sends this information to the object to be communicated with.</p>
<p>The script used in the buttons is as follows:</p>
<pre><code>default {</code></pre>
<pre>    on_touch() {</pre>
<pre>    llMessageLinked(LINK_ROOT,0,llGetObjectName()+"|"+llGetObjectDesc(), "");}</pre>
<pre>}</pre>
<p>This sends the contents of the prim name and description fields to the root node.  Note the seperator &#8220;|&#8221;.  This is used such that the commands can be decoded by the receiver, any separation character will do as long as it is not used in the object name.</p>
<p>The root node then has this script:</p>
<pre><code>integer channel = -188800;</code></pre>
<pre>default  {</pre>
<pre>    state_entry() {</pre>
<pre>        llPreloadSound("6005e358-33fd-d08b-012f-6110ab27a413"); }</pre>
<pre>    link_message(integer sender_num, integer num, string str, key id) {

// Play UI click and say message to other object</pre>
<pre>        llPlaySound("6005e358-33fd-d08b-012f-6110ab27a413", 1.0);</pre>
<pre>        llSay(channel,str); }</pre>
<pre>}</pre>
<p>The root node simple sends the information straight to the other object via <code>llSay</code> and plays a &#8220;click&#8221; sound.  The click sound is used to give the user feedback that they did press a button.</p>
<p>The channel selection is fairly important.  Low channel numbers tend to be more congested, channel 0 (normal chat) should never be used.  Positive channels can be used directly by the avatar (ie, by typing <span style="color: #0000ff;"><code>/55 do something</code></span>) but negative channels can not.</p>
<p>This is not the only, or even the best way to do this!  A better way (in terms of less scripts and therefore less lag) is to use <code>llDetectedLinkNumber()</code> to detect which button was touched from the root object.  The downside to this approach is that there is only a <code>llGetLinkName()</code> function, so the information to be passed to the other object has to be all in the prim name.</p>
<h3><a title="LlDetectedLinkNumber">Target Object Processing</a></h3>
<p>In the target object you need to set up a listen for the command from the hud, this is done by declaring an open listen on the channel to be used:<code> llListen(channel, "", "", "")</code>.  Note, this is an open listen so all messages on that channel will be picked up regardless of source.</p>
<p>To prevent listening to other avatars and HUD&#8217;s owned by other avatars, the following code is used:</p>
<pre>listen(integer channel, string name, key id, string message) {</pre>
<pre>    if ((id == llGetOwner())||(llGetOwnerKey(id) == llGetOwner())) {</pre>
<pre>    // process commands</pre>
<p>The first part of this checks if the owner sent the message, the second part checks if an object owned by the owner sent the message.</p>
<p>The processing of the commands depends on what exactly the hud is going to do.  If you have used a separation character to pass both a command and a parameter, the following code usefully extracts the command and parameter (and discards the separation character).</p>
<pre>message = llToLower (message);</pre>
<pre>// get the position of the seperation character</pre>
<pre>integer sepCharPos = llSubStringIndex(message,"|");</pre>
<pre>//extract</pre>
<pre>string command = llGetSubString(message, 0, (sepCharPos-1));</pre>
<pre>string parameter = llDeleteSubString(message, 0, (sepCharPos));</pre>
<p>This could of course be extended to include any number of separation characters and parameters.  Listening to the owner is not without risk, LSL does not have rigorous type checking or error detection functions.  There is no isInteger() function!  If you intend to type cast the received parameter to a different type from string there is a risk that you may get errors due to the input being malformed.</p>
<h3><a title="LlDetectedLinkNumber">Alternatives</a></h3>
<p>There are a few alternative techniques that can be used in place of a HUD:</p>
<ul>
<li>Use a Menu - LSL provides for a menu system that pops a blue menu up in the top right corner which the user can click.  Since the reply from the menu system is spoken back to the user, this still needs a Listener and thus contributes to lag.  The menu system can only show a limited number of characters per button.</li>
</ul>
<ul>
<li>Use a Configuration file - It is also possible to read a notecard in the objects inventory, the user can just edit this to change settings.  This doesn&#8217;t use a Listener and therefore is less laggy.  However, it does affect the time taken to change settings.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://purplewyvern.co.uk/thenest/2008/04/25/making-a-basic-hud/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Building Tools - Part 1</title>
		<link>http://purplewyvern.co.uk/thenest/2008/03/27/building-tools-part-1/</link>
		<comments>http://purplewyvern.co.uk/thenest/2008/03/27/building-tools-part-1/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 19:31:00 +0000</pubDate>
		<dc:creator>Jahdo</dc:creator>
		
		<category><![CDATA[Purple Wyvern Designs]]></category>

		<category><![CDATA[building]]></category>

		<category><![CDATA[shopping]]></category>

		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://purplewyvern.co.uk/thenest/2008/03/27/building-tools-part-1/</guid>
		<description><![CDATA[As a builder, generally I try to make a lot of the different components that I use.  I dabble in a lot of different areas, I can script, texture, pose and bash prims and get fairly good results.
But sometimes it is better to buy in the components than to make them.  There are [...]]]></description>
			<content:encoded><![CDATA[<p>As a builder, generally I try to make a lot of the different components that I use.  I dabble in a lot of different areas, I can script, texture, pose and bash prims and get fairly good results.</p>
<p>But sometimes it is better to buy in the components than to make them.  There are any number of excellent texturers, scripters and animators around SL, and many of them sell components at fairly reasonable rates.</p>
<p>Looking for reasonable rates is important.  If you are looking to make and sell a Sword for say, L$50, you do not want to be buying in a component that will cost L$5000 unless you know that it can be used in many other items or you can be sure you will sell 100 of them.   In the same way, a L$1000 piece of Jewelery needs something better than a plain texture.</p>
<p>I have compiled a short list of places to buy components that offer good value for money and are of a high quality.</p>
<p>In most of these I have given the creators name, this is because, although sims don&#8217;t generally disappear overnight, creators do move store locations around.</p>
<p><span id="more-10"></span></p>
<h3>Laura&#8217;s Tiling Textures (Laura Fox)</h3>
<p>This is one of the first places I discovered for textures in SL (after raiding all the freebie textures from NCI).   There are a wide range of textures available here including jewels, fabrics, food and themed sets.  New textures are added regularly.  I personally use the Jewelery textures and a number of the food textures.</p>
<p>The textures are usually between L$150 and L$500, and come with Copy/Mod/Trans permissions.  Often the pack also includes sample pieces demonstrating how to apply them to an object.</p>
<h3>Daryth Kennedy&#8217;s Building Kits (Daryth Kennedy)</h3>
<p>Seeing as I am involved with Daryth Kennedy&#8217;s Isle of Wyrms, it should be no surprise that I have a set of Daryth&#8217;s building kits.  There are six different types; Greek Pottery, Stone columns, Treasure Set, Jewels (good, but not as good as the Laura Fox ones), Mushrooms and Flowers.</p>
<p>Each kit is priced at L$100, and is set to Copy/Mod/Trans permissions.  My only criticism would be that some of the items use more prims then I would like, but as a general set of building components these are useful to have.</p>
<p>Sadly these can no longer be found in-world and have to be brought through <a title="SL Exchange Marketplace" href="http://www.slexchange.com/modules.php?name=Marketplace&amp;MerchantID=2170">SLX</a>.</p>
<h3>Phun Stuph (Mr Greggan)</h3>
<p>This shop was something recently shown to me whilst I was working on a project to make a bed suitable for a Steam Wyrmling.</p>
<p>Phun Stuph sells steampunk components, dials &amp; gauges (some animated), gears, wheels, boilers, and all sort of weird looking steampunkery!   If building steampunk is your style - then this is the place to shop.</p>
<p>The prices of the items I looked at ranged between L$35 and L$200 and where all set with Copy/Mod/Trans permissions.  Phun Stuph also offers a free group-only sandbox for putting your creations together.</p>
<h3>Pixel Lab (Cel Edman)</h3>
<p>Pixel Lab produces a range of different sculpted shapes, including a fairly neat cave pack and stairs.   The sculptie textures are of a reasonable resolution, which means that on a loaded sim they do take some time to load (giving that ugly sculptie default-sphere shape for a few seconds).  However, this also means they have nice detailing.</p>
<p>The packs contain 30-60 sculptie shapes and range from L$300 to L$600 and  all set with Copy/Mod/Trans permissions.  Again, Pixel Lab provides details on how you use their shapes.</p>
<h3>Rez-Faux (Lex Niva)</h3>
<p>Rez-Faux isn&#8217;t necessarily something you would consider in the same sense as textures and objects for integrating into builds.  However, it is a very useful tool to have around.</p>
<p>Rez-Faux basically allows you to Rez, De-Rez and position multiple unlinked components that are part of a build.   Second Life places limits on how close together parts must be in order to link them.   Also, setting one prim in a linked set phantom, sets all prims in the linkset phantom (which can be a pain if you are building a house and only want to phantom the doors).  Rez-Faux is an essential tool for making larger and more complex builds</p>
<p>Rez-Faux was L$625 and the transfer package is Copy/No-Mod/Transfer permissions.</p>
]]></content:encoded>
			<wfw:commentRss>http://purplewyvern.co.uk/thenest/2008/03/27/building-tools-part-1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Making A Tiny Pose in QAvimator</title>
		<link>http://purplewyvern.co.uk/thenest/2008/03/08/making-a-tiny-pose-in-qavimator/</link>
		<comments>http://purplewyvern.co.uk/thenest/2008/03/08/making-a-tiny-pose-in-qavimator/#comments</comments>
		<pubDate>Sat, 08 Mar 2008 14:02:48 +0000</pubDate>
		<dc:creator>Jahdo</dc:creator>
		
		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[animation]]></category>

		<category><![CDATA[qavimator]]></category>

		<category><![CDATA[tiny]]></category>

		<guid isPermaLink="false">http://purplewyvern.co.uk/thenest/2008/03/08/making-a-tiny-pose-in-qavimator/</guid>
		<description><![CDATA[You may notice in Second Life that sometimes you come across these cute little tiny avatars.  They come in a number of forms, rabbits, cats, pandas, hedgehogs, dragon hatchlings&#8230;   All are blindingly cute, mischievous ankle biters.
Interested in making a tiny, you try to duplicate what you have seen, but no matter what you [...]]]></description>
			<content:encoded><![CDATA[<p>You may notice in Second Life that sometimes you come across these cute little tiny avatars.  They come in a number of forms, rabbits, cats, pandas, hedgehogs, dragon hatchlings&#8230;   All are blindingly cute, mischievous ankle biters.</p>
<p>Interested in making a tiny, you try to duplicate what you have seen, but no matter what you try, it isn&#8217;t possible to create an avatar smaller than ~5ft yet these tinies are smaller.</p>
<p>The first tinies are acknowledged to have been created by Kage Seraph.  The technique he introduced was to use a script to override the currently active default animation(s), and activate another in its place (often called an animation-overrider or ao).  The animation itself folds the human avatar up into a smaller package to achieve the required &#8220;tiny&#8221; height.</p>
<p>This tutorial covers how to create a simple tiny standing animation using <a href="http://www.qavimator.org/" title="QAvimator website">QAvimator</a>.</p>
<p><span id="more-7"></span></p>
<h3>Getting Started</h3>
<p>The first stage is to open the QAvimator program.  The screen shots I have used are the Windows version of QAvimator, but the other platforms behave in much the same way.</p>
<p>Before starting to create your pose, un-tick the &#8220;Joint Limits&#8221; under the Options menu.  This allows you to twist the body beyond normal human limits.  Normally QAvimator will constrain limb movement to &#8220;sensible&#8221; human limits.  In this case we are going to fold the human avatar so we need to exceed normal limits.</p>
<p style="text-align: center"><img src="http://lh4.google.co.uk/Jahdo.Ohtobide/R9BH2vHZlCI/AAAAAAAAAG8/sGdgAZFDVY4/s400/QAV.jpg" /></p>
<p>Also drop the number of frames in the animation to 2.  The first frame is protected and therefore you can not edit it (and it&#8217;s required by SL).  For a simple static pose you only need two frames.  This isn&#8217;t absolutely required, but I like to do this to be tidy.</p>
<h3>Legs</h3>
<p>The first mod to the human avatar is to fold the legs in on themselves.   You do this by selecting the Left Shin (lShin) by either clicking on it or choosing it from the drop down menu and set the X rotation to 180 degrees.  Then select the Left Foot (lFoot) and set this in to the leg by setting the X Rotation to -90 degrees.</p>
<p style="text-align: center"><img src="http://lh5.google.co.uk/Jahdo.Ohtobide/R9BH2_HZlDI/AAAAAAAAAHE/KAlT_JCNvQA/s400/QAV_1.jpg" /></p>
<p>Repeat this process for the Right Shin and Right Foot.</p>
<h3>Arms</h3>
<p>Again the arms need to be folded, the process to do this is much the same as for the legs, this time take the Left Fore Arm (lForeArm) and twist the Y Rotation to -180 degrees.  Repeat for the Right Fore Arm.  You can leave the hands as they are as we will deal with those later.</p>
<h3>Torso</h3>
<p>The changes up to now have given you a basic human  torso with folded legs and arms.  The final stage is to fold the torso as well.  To do this take the abdomen and set the X Rotation to 180 degrees, then take the chest and  set the X Rotation to -180 degrees.</p>
<p style="text-align: center"><img src="http://lh4.google.co.uk/Jahdo.Ohtobide/R9BIdvHZlFI/AAAAAAAAAHU/cAJrY9OkvUU/s400/QAV_3b.jpg" /></p>
<h3>Upload Animation</h3>
<p>Now save your completed file as a &#8220;.bvh&#8221; file for upload into SL.  You may also wish to choose the &#8220;Optimise BVH&#8221; option from the Edit menu.</p>
<p>To upload the completed animation into Second Life, choose Upload Animation from the File menu, make sure you select the Loop tick box and the priority to 4.  In Second Life, the minimum priority is 1, the maximum is 4. By setting the priority to 4 you minimise the chance of your animation being interrupted by a standard Linden animation.</p>
<p style="text-align: center"><img src="http://lh4.google.co.uk/Jahdo.Ohtobide/R9BH2vHZlBI/AAAAAAAAAG0/yXKV8Xz4Ar4/s400/animUPloadMenu.jpg" /></p>
<p>To try to tidy the hands into the body I tend to also set the hands to fist.  Most &#8220;primmy&#8221; tiny bodies will hide them anyway.  If you don&#8217;t choose Loop, the animation will play once and then exit back to a standard Linden pose (probably stand).</p>
<p>Now you have a completed animation suitable for a pose ball.</p>
<h3>Hold On, That Doesn&#8217;t Look Right!</h3>
<p>Yes! One of the idiosyncrasies with Second Life is that any X,Y, Z Rotation set to zero in the animation will be treated as a movable joint.  Therefore when you activate the animation in Second Life, rather than your avatar taking on the T-pose as seen in the program, the avatar instead stands with the arms by it&#8217;s side. If you actually want to set a T-pose then the Z Rotation must be non-zero.  To fix the position of any body part, you must set at least one Rotation as non-zero.</p>
<p>You may also notice that the avatar is floating in the air slightly.  This isn&#8217;t so important if a pose ball is being used, since the position can be altered with an offset.   To correct this, the Y Position of the hip part must be reduced.</p>
<h3>Tiny Development Kit</h3>
<p>Now this just gives you a tiny standing pose with the arms set as a &#8216;T&#8217;.  You can repeat the process to make any number of different animations that would be suitable for a pose ball.  However, this is not the full story!</p>
<p>If you where aiming to make a tiny avatar, you would also need other tiny animations to use when the avatar is performing certain actions, such as sit, stand, animations for walk, run and fly.  You would also need a script to override the default Linden animations and trigger the special animations instead.  Lastly you would need a tiny shape.  The animations will work on the current size of the avatar, therefore if the avatar is 7ft, you will get a folded 7ft.</p>
<p>If this sounds like too much work, Kage Seraph sells a <a href="http://slurl.com/secondlife/Dreams/144/209/24" title="SLURL Tiny Development Kit">Tiny Development Kit</a> that comes with full-permissions versions of various tiny animations, scripts and a shape that would allow any tiny animation maker  to get started with the minimum of fuss.</p>
]]></content:encoded>
			<wfw:commentRss>http://purplewyvern.co.uk/thenest/2008/03/08/making-a-tiny-pose-in-qavimator/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Hedgehog Wheel</title>
		<link>http://purplewyvern.co.uk/thenest/2008/02/22/the-hedgehog-wheel/</link>
		<comments>http://purplewyvern.co.uk/thenest/2008/02/22/the-hedgehog-wheel/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 20:28:27 +0000</pubDate>
		<dc:creator>Jahdo</dc:creator>
		
		<category><![CDATA[Isle of Wyrms]]></category>

		<category><![CDATA[animation]]></category>

		<category><![CDATA[hedgehog]]></category>

		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://purplewyvern.co.uk/thenest/2008/02/22/the-hedgehog-wheel/</guid>
		<description><![CDATA[The task, make a Hamster Wheel for Hedgehog avatars for the upcoming Isle of Wyrms Hedgehog Spring Festival.

The requirements, an avatar can sit on the wheel and when they do so, they would start rolling and so would the wheel.  Since the Hedgehog avatar made by Daryth Kennedy comes with a rolling animation (which [...]]]></description>
			<content:encoded><![CDATA[<p>The task, make a Hamster Wheel for Hedgehog avatars for the upcoming Isle of Wyrms Hedgehog Spring Festival.</p>
<p style="text-align: center"><img src="http://lh5.google.com/Jahdo.Ohtobide/R78tqfFwPWI/AAAAAAAAAFU/eqJV47mE3cI/s400/HedgieWheel.jpg" /></p>
<p>The requirements, an avatar can sit on the wheel and when they do so, they would start rolling and so would the wheel.  Since the Hedgehog avatar made by Daryth Kennedy comes with a rolling animation (which was copy perms)  and in theory it was only a case of bolting the wheel animation onto a standard pose ball script, it didn&#8217;t sound all that complicated&#8230;</p>
<p><span id="more-5"></span></p>
<p><strong>Making the Wheel</strong></p>
<p>The first step was to make the wheel that the hedgehog would roll inside and the scripts to provide the &#8220;rotating&#8221; effect.  The wheel was a simple hollowed cylinder, with a second thin cylinder to provide the hub and spokes.</p>
<p>There were two techniques that I could use; animate the texture of the wheel using <code>llSetTextureAnim</code> or to rotate the whole prim using <code>llTargetOmega</code>.</p>
<p>Initially I choose to use <code>llSetTextureAnim</code> as this is the more conventional approach.  This function offers both rotate, scale and frame by frame animation modes.  To control the &#8220;rotation&#8221; animation for the test wheel I used a simple two state approach with the <code>on_touch</code> event being used to switch between &#8220;On&#8221; and &#8220;Off&#8221; states.</p>
<p>For the prim that contained the wheel hub and spokes, this worked very well and smoothly rotated the inner texture around the pivot point.  The only issue was that two separate commands had to be used to rotate the front and back of the prim - this would mean in lag the textures would probably not be synched.</p>
<p>However, for the &#8220;roll&#8221; surface this worked less well.  The issue with the <code>llSetTextureAnim</code> function is that it sets the texture to 1:1 scaling during animation irrespective of the actual texture scale setting applied to the prim.  To achieve the desired effect I had applied 6x horizontal scaling and the animation function was setting this back to 1x - Ugh!  One workaround would be to change the texture to incorporate the 6x horizontal scaling, but in order to maintain a sensible resolution the texture would become large (1568 x 256 in this case) and thus add to lag.</p>
<p><strong>llTargetOmega</strong></p>
<p>So, the alternative is to use the <code>llTargetOmega</code> fuction.  This rotates the prim the script is contained in (unless that prim is the root-prim where it will rotate the whole object).  Since the object I was making was non-physical, this processing would be done in the client and thus very low lag.</p>
<p>However, my &#8220;Off&#8221; state did not work correctly!  The prim refused to stop turning.  A quick search found that there was a bug in the function that <a href="https://jira.secondlife.com/browse/SVC-54" title="Second Life JIRA">llTargetOmega doesn&#8217;t update unless the object is interacted with by an AV</a>!  It wasn&#8217;t possible to stop the object turning using the script.</p>
<p>My workaround?  Well since the spin rate is a float value, I set it to something very small, I used 0.0001 in this case.  Since a value of 1 is a rotation of 1 radian per second, a value of 0.0001 is one rotation every 62,831 seconds or ~17 hours.  Being a 32-bit float I could go smaller, but this was adequate to ensure movement was not instantly apparent!</p>
<p><strong>Pose Ball</strong></p>
<p>The next task is to make the &#8220;pose-ball&#8221; that would trigger the animation and send the commands to the wheel.  I used a <a href="http://wiki.secondlife.com/wiki/Zero_Lag_Poseball" title="LSLWiki - Script Library - Zero Lag Poseball">standard pose-ball</a> script and added Daryth&#8217;s Hedgehog Roll animation.   To make the pose-ball work with the wheel, I just linked it to the wheel (making the pose-ball the root prim) using <code>llMessageLinked</code> to communicate with the wheel in the <code>show()</code> and <code>hide()</code> methods.  After replacing the <code>on_touch</code> events with <code>link_message</code> events, the wheel was good to go, so did it work?</p>
<p><strong>Animation Override</strong></p>
<p>Well yes and no.  The wheel would have worked, but tiny avatars such as the hedgehog incorporate an animation-override - this is to keep the avatar looking correct regardless of what the avatar is currently doing, walking, running, swimming, etc.  The default animations are meant for human avatars and are not for specialised avatars where the human frame has often been contorted.</p>
<p>Fortunately the script library also contained a handy <a href="http://wiki.secondlife.com/wiki/AO_Overriding_Pose_Ball" title="LSLWiki - Script Library - AO Overriding Pose Ball">AO Overriding Pose Ball Script</a>!  This relies on the fact that when the avatar sits on the object, the animation override will stop the default sit and then set its sit animation.   To get the correct rolling animation, this script stops the default sit, the ao sit and then sets the desired pose.  This relies on the fact most animation override devices do not periodically reset the pose.</p>
<p>To finish off I added a particle smoke effect for while the wheel was rolling.  So we now have a working Hedgehog Wheel - Weeee!</p>
<p style="text-align: center"><img src="http://lh5.google.com/Jahdo.Ohtobide/R78tqfFwPVI/AAAAAAAAAFM/LdoZuxhVm1I/s400/HedgieWheel2.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://purplewyvern.co.uk/thenest/2008/02/22/the-hedgehog-wheel/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
