<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zarf+Vantongerloo</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zarf+Vantongerloo"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Zarf_Vantongerloo"/>
	<updated>2026-06-20T22:34:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Badge_Script&amp;diff=32402</id>
		<title>Creative Commons License Machine/Badge Script</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Badge_Script&amp;diff=32402"/>
		<updated>2007-09-23T05:36:16Z</updated>

		<summary type="html">&lt;p&gt;Zarf Vantongerloo: New page: &amp;lt;pre&amp;gt; float gTouchTimeout = 30.0; // constant integer gDialogChannel = 85021; // constant  integer gKioskChannel; integer gKioskListener;  key gOriginalKey = NULL_KEY;  list gParams;     /...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
float gTouchTimeout = 30.0; // constant&lt;br /&gt;
integer gDialogChannel = 85021; // constant&lt;br /&gt;
&lt;br /&gt;
integer gKioskChannel;&lt;br /&gt;
integer gKioskListener;&lt;br /&gt;
&lt;br /&gt;
key gOriginalKey = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
list gParams;&lt;br /&gt;
    // user parameters, stride two: [ &amp;lt;param&amp;gt;, &amp;lt;value&amp;gt; ... ]&lt;br /&gt;
&lt;br /&gt;
string gLicenseImage;&lt;br /&gt;
string gLicenseURL;&lt;br /&gt;
string gLicenseName;&lt;br /&gt;
string gLicenseDescription;&lt;br /&gt;
&lt;br /&gt;
string gFullTitle;&lt;br /&gt;
string gShortTitle;&lt;br /&gt;
&lt;br /&gt;
integer gListener;&lt;br /&gt;
&lt;br /&gt;
integer gCatalog = FALSE;&lt;br /&gt;
float gCatalogRate = 86400.0; // once a day&lt;br /&gt;
float gCatalogTime;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
addParam(string param, string value)&lt;br /&gt;
{&lt;br /&gt;
    gParams += [ param, value ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string&lt;br /&gt;
getParam(string param)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llListFindList(gParams, [ param ]);&lt;br /&gt;
    if (i &amp;lt; 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    return llList2String(gParams, i + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
reciteParam(string param, string prompt)&lt;br /&gt;
{&lt;br /&gt;
    string value = getParam(param);&lt;br /&gt;
    if (value == &amp;quot;&amp;quot;) return;&lt;br /&gt;
    &lt;br /&gt;
    llSay(0, prompt + value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
aboutWork()&lt;br /&gt;
{&lt;br /&gt;
    llSetObjectName(gShortTitle);&lt;br /&gt;
    reciteParam(&amp;quot;title&amp;quot;,        &amp;quot;Title: &amp;quot;);&lt;br /&gt;
    reciteParam(&amp;quot;description&amp;quot;,  &amp;quot;Description: &amp;quot;);&lt;br /&gt;
    reciteParam(&amp;quot;tags&amp;quot;,         &amp;quot;Tags: &amp;quot;);&lt;br /&gt;
    reciteParam(&amp;quot;format&amp;quot;,       &amp;quot;Format: &amp;quot;);&lt;br /&gt;
    reciteParam(&amp;quot;creator&amp;quot;,      &amp;quot;Creator: &amp;quot;);&lt;br /&gt;
    reciteParam(&amp;quot;holder&amp;quot;,       &amp;quot;Copyright Holder: &amp;quot;);&lt;br /&gt;
    reciteParam(&amp;quot;year&amp;quot;,         &amp;quot;Copyright Year: &amp;quot;);&lt;br /&gt;
    reciteParam(&amp;quot;source&amp;quot;,       &amp;quot;Source URL: &amp;quot;);&lt;br /&gt;
    llSetObjectName(gFullTitle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
emailCatalog()&lt;br /&gt;
{&lt;br /&gt;
    string message;&lt;br /&gt;
    &lt;br /&gt;
    message += &amp;quot;original-key: &amp;quot; + (string)gOriginalKey + &amp;quot;\n&amp;quot;;&lt;br /&gt;
    message += &amp;quot;current-key: &amp;quot; + (string)llGetKey() + &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    integer n = llGetListLength(gParams);&lt;br /&gt;
    integer i;&lt;br /&gt;
    for (i = 0; i &amp;lt; n; i += 2) {&lt;br /&gt;
        string param = llList2String(gParams, i);&lt;br /&gt;
        string value = llList2String(gParams, i + 1);&lt;br /&gt;
        message += param + &amp;quot;: &amp;quot; + value + &amp;quot;\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    llEmail(&amp;quot;ccsl-object@notabene-sl.com&amp;quot;, &amp;quot;list&amp;quot;, message);&lt;br /&gt;
    &lt;br /&gt;
    gCatalogTime = llGetGMTclock();  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addToCatalog()&lt;br /&gt;
{&lt;br /&gt;
    llInstantMessage(llGetOwner(), &amp;quot;Listing in catalog (takes about 20 seconds)...&amp;quot;);&lt;br /&gt;
    gCatalog = TRUE;&lt;br /&gt;
    emailCatalog();&lt;br /&gt;
    llInstantMessage(llGetOwner(), &amp;quot;...done.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
removeFromCatalog()&lt;br /&gt;
{&lt;br /&gt;
    llInstantMessage(llGetOwner(), &amp;quot;Removing from catalog (takes about 20 seconds)...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    gCatalog = FALSE;&lt;br /&gt;
&lt;br /&gt;
    string message;&lt;br /&gt;
    &lt;br /&gt;
    message += &amp;quot;original-key: &amp;quot; + (string)gOriginalKey + &amp;quot;\n&amp;quot;;&lt;br /&gt;
    message += &amp;quot;current-key: &amp;quot; + (string)llGetKey() + &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    llEmail(&amp;quot;ccsl-object@notabene-sl.com&amp;quot;, &amp;quot;unlist&amp;quot;, message);   &lt;br /&gt;
&lt;br /&gt;
    llInstantMessage(llGetOwner(), &amp;quot;...done.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
setUp()&lt;br /&gt;
{&lt;br /&gt;
    string commercialUse = getParam(&amp;quot;commercial-use&amp;quot;);&lt;br /&gt;
    string modifications = getParam(&amp;quot;modifications&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    string license = &amp;quot;by&amp;quot;;&lt;br /&gt;
    if (commercialUse == &amp;quot;no&amp;quot;)      { license += &amp;quot;-nc&amp;quot;; }&lt;br /&gt;
    if (modifications == &amp;quot;no&amp;quot;)      { license += &amp;quot;-nd&amp;quot;; }&lt;br /&gt;
    if (modifications == &amp;quot;share&amp;quot;)   { license += &amp;quot;-sa&amp;quot;; }&lt;br /&gt;
    &lt;br /&gt;
    gLicenseURL = &amp;quot;http://creativecommons.org/licenses/&amp;quot; + license + &amp;quot;/2.5/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    gLicenseName = &amp;quot;Creative Commons Attribution&amp;quot;;&lt;br /&gt;
    if (commercialUse == &amp;quot;no&amp;quot;)      { gLicenseName += &amp;quot;-NonCommercial&amp;quot;; }&lt;br /&gt;
    if (modifications == &amp;quot;no&amp;quot;)      { gLicenseName += &amp;quot;-NoDerivs&amp;quot;; }&lt;br /&gt;
    if (modifications == &amp;quot;share&amp;quot;)   { gLicenseName += &amp;quot;-ShareAlike&amp;quot;; }&lt;br /&gt;
    gLicenseName += &amp;quot; 2.5 License&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    gLicenseDescription = &amp;quot;This work is licensed under a &amp;quot; + gLicenseName;&lt;br /&gt;
    &lt;br /&gt;
    gLicenseImage = getParam(&amp;quot;image-key&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    gShortTitle = &amp;quot;CC Notice&amp;quot;;&lt;br /&gt;
    gFullTitle = &amp;quot;Creative Commons Notice&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    string title = getParam(&amp;quot;title&amp;quot;);&lt;br /&gt;
    if (title != &amp;quot;&amp;quot;) {&lt;br /&gt;
        gFullTitle += &amp;quot; for \&amp;quot;&amp;quot; + title + &amp;quot;\&amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    llSetObjectName(gFullTitle);&lt;br /&gt;
    llSetObjectDesc(gLicenseDescription);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
showLicenseImage()&lt;br /&gt;
{&lt;br /&gt;
    llSetPrimitiveParams([&lt;br /&gt;
        PRIM_TEXTURE, 2, gLicenseImage, &amp;lt;1.0, 0.8, 1.0&amp;gt;, &amp;lt;0.0, 0.075, 0.0&amp;gt;, 0.0,&lt;br /&gt;
        PRIM_TEXTURE, 4, gLicenseImage, &amp;lt;1.0, 0.8, 1.0&amp;gt;, &amp;lt;0.0, 0.075, 0.0&amp;gt;, 0.0&lt;br /&gt;
        ]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
showBadgeImage()&lt;br /&gt;
{&lt;br /&gt;
    llSetPrimitiveParams([&lt;br /&gt;
        PRIM_TEXTURE, 2, &amp;quot;badge&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, &amp;lt;0.0, 0.0, 0.0&amp;gt;, 0.0,&lt;br /&gt;
        PRIM_TEXTURE, 4, &amp;quot;badge&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, &amp;lt;0.0, 0.0, 0.0&amp;gt;, 0.0&lt;br /&gt;
        ]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer ch) {&lt;br /&gt;
        if (ch == 0) {&lt;br /&gt;
            if (gOriginalKey != NULL_KEY) {&lt;br /&gt;
                llOwnerSay(&amp;quot;You took a copy of this cc license before it was ready, .  Please generate a new one.&amp;quot;);&lt;br /&gt;
                llDie();&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                // user rez from inventory of prototype&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            // rez from kiosk&lt;br /&gt;
            gOriginalKey = llGetKey();&lt;br /&gt;
            gKioskChannel = ch;   &lt;br /&gt;
            llListen(gKioskChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
            llSay(gKioskChannel, &amp;quot;go&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer ch, string who, key id, string what) {&lt;br /&gt;
        integer i = llSubStringIndex(what, &amp;quot;:&amp;quot;);&lt;br /&gt;
        if (i &amp;gt; 0) {&lt;br /&gt;
            string param = llGetSubString(what, 0, i - 1);&lt;br /&gt;
            string value = llGetSubString(what, i + 1, -1);&lt;br /&gt;
            addParam(param, value);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            if (llGetSubString(what, 0, 3) == &amp;quot;done&amp;quot;) {&lt;br /&gt;
                vector p = (vector)llGetSubString(what, 5, -1);&lt;br /&gt;
                vector s = &amp;lt;0.1, 0.512, 0.180&amp;gt;;&lt;br /&gt;
                llSetPrimitiveParams([&lt;br /&gt;
                    PRIM_SIZE, s,&lt;br /&gt;
                    PRIM_POSITION, p,&lt;br /&gt;
                    PRIM_TEXTURE, 2, &amp;quot;badge&amp;quot;, &amp;lt;1, 1, 1&amp;gt;, &amp;lt;0, 0, 0&amp;gt;, 0.0,&lt;br /&gt;
                    PRIM_TEXTURE, 4, &amp;quot;badge&amp;quot;, &amp;lt;1, 1, 1&amp;gt;, &amp;lt;0, 0, 0&amp;gt;, 0.0&lt;br /&gt;
                    ]);&lt;br /&gt;
                setUp();&lt;br /&gt;
                state ready;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer n) { }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state ready&lt;br /&gt;
{&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llSay(0, &amp;quot;Take a copy of this badge, then attach it to the work.&amp;quot;);&lt;br /&gt;
        if (gKioskChannel != 0) {&lt;br /&gt;
            gKioskListener = llListen(gKioskChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer n) {&lt;br /&gt;
        if (gKioskChannel != 0) {&lt;br /&gt;
            llListenRemove(gKioskListener);&lt;br /&gt;
            gKioskChannel = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }        &lt;br /&gt;
    &lt;br /&gt;
    state_exit() {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer n) {&lt;br /&gt;
        showLicenseImage();&lt;br /&gt;
        gListener = llListen(gDialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        integer i;&lt;br /&gt;
        for (i = 0; i &amp;lt; n; ++i) {&lt;br /&gt;
            key id = llDetectedKey(i);&lt;br /&gt;
            &lt;br /&gt;
            string message = &lt;br /&gt;
                gLicenseDescription&lt;br /&gt;
                + &amp;quot;\n\nDeed: go to deed page on web&amp;quot;&lt;br /&gt;
                + &amp;quot;\nAbout: speak details about the work&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            list buttons = [ &amp;quot;Deed&amp;quot;, &amp;quot;About&amp;quot; ];&lt;br /&gt;
            &lt;br /&gt;
            if (id == llGetOwner()) {&lt;br /&gt;
                if (!gCatalog) {&lt;br /&gt;
                    message += &amp;quot;\nList: add object to public catalog at http://www.notabene-sl.com/cc&amp;quot;;&lt;br /&gt;
                    buttons += [ &amp;quot;List&amp;quot; ];&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                    message += &amp;quot;\nUnlist: remove item from public catalog at http://www.notabene-sl.com/cc&amp;quot;;&lt;br /&gt;
                    buttons += [ &amp;quot;Unlist&amp;quot; ];&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            llDialog(id, message, buttons, gDialogChannel);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        llSetTimerEvent(gTouchTimeout);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer ch, string who, key id, string what) {&lt;br /&gt;
        if (what == &amp;quot;Deed&amp;quot;) {&lt;br /&gt;
            llLoadURL(id, gLicenseName, gLicenseURL);&lt;br /&gt;
        }&lt;br /&gt;
        else if (what == &amp;quot;About&amp;quot;) {&lt;br /&gt;
            aboutWork();&lt;br /&gt;
        }&lt;br /&gt;
        else if (what == &amp;quot;die&amp;quot;) {&lt;br /&gt;
            llDie();&lt;br /&gt;
        }&lt;br /&gt;
        else if (id == llGetOwner()) {&lt;br /&gt;
            if (what == &amp;quot;List&amp;quot;) {&lt;br /&gt;
                addToCatalog();&lt;br /&gt;
            }&lt;br /&gt;
            else if (what == &amp;quot;Unlist&amp;quot;) {&lt;br /&gt;
                removeFromCatalog();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer() {&lt;br /&gt;
        showBadgeImage();&lt;br /&gt;
        llListenRemove(gListener);&lt;br /&gt;
        &lt;br /&gt;
        if (gCatalog) {&lt;br /&gt;
            if ((llGetGMTclock() - gCatalogTime) &amp;gt;= gCatalogRate) {&lt;br /&gt;
                emailCatalog();&lt;br /&gt;
            }&lt;br /&gt;
            llSetTimerEvent(gCatalogRate);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zarf Vantongerloo</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Kiosk_Script&amp;diff=32399</id>
		<title>Creative Commons License Machine/Kiosk Script</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Kiosk_Script&amp;diff=32399"/>
		<updated>2007-09-23T05:33:32Z</updated>

		<summary type="html">&lt;p&gt;Zarf Vantongerloo: New page: The kiosk is actually just a general purpose state machine engine.  The particular state machine that is used for the Creative Commons LIcense Machine is in the Kiosk Program.  &amp;lt;pre&amp;gt; k...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The kiosk is actually just a general purpose state machine engine.  The particular state machine that is used for the Creative Commons LIcense Machine is in the [[Kiosk Program]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key gBlankTexture = &amp;quot;5748decc-f629-461c-9a36-a35a221fe21f&amp;quot;; // well known&lt;br /&gt;
&lt;br /&gt;
float gTimeOut = 60.0;&lt;br /&gt;
&lt;br /&gt;
integer gUserListener = 0;&lt;br /&gt;
&lt;br /&gt;
integer gLicenseChannel = 0;&lt;br /&gt;
integer gLicenseListener = 0;&lt;br /&gt;
&lt;br /&gt;
string gNode;&lt;br /&gt;
list gPath;&lt;br /&gt;
    // path of nodes, including current node at the end&lt;br /&gt;
&lt;br /&gt;
key gUser = NULL_KEY;&lt;br /&gt;
    // user we are interacting with&lt;br /&gt;
    &lt;br /&gt;
list gParams;&lt;br /&gt;
    // user parameters, stride two: [ &amp;lt;key&amp;gt;, &amp;lt;value&amp;gt; ... ]&lt;br /&gt;
&lt;br /&gt;
string gAltTrigger;&lt;br /&gt;
key gArgID;&lt;br /&gt;
string gArgMessage;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
clearUse()&lt;br /&gt;
{&lt;br /&gt;
    gNode = &amp;quot;&amp;quot;;&lt;br /&gt;
    gPath = [ ];&lt;br /&gt;
    gUser = NULL_KEY;&lt;br /&gt;
    gParams = [ ];&lt;br /&gt;
    &lt;br /&gt;
    clearNode();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
clearNode()&lt;br /&gt;
{&lt;br /&gt;
    gTimeOut = 30.0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdGo(string node)&lt;br /&gt;
{&lt;br /&gt;
    gNode = node;&lt;br /&gt;
    gPath += [ node ];&lt;br /&gt;
    llMessageLinked(LINK_THIS, 200, node, NULL_KEY);&lt;br /&gt;
    &lt;br /&gt;
    clearNode();&lt;br /&gt;
    runAnyAction(&amp;quot;init&amp;quot;, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    llSetTimerEvent(gTimeOut);&lt;br /&gt;
    if (gUserListener) { llListenRemove(gUserListener); }&lt;br /&gt;
    gUserListener = llListen(0, &amp;quot;&amp;quot;, gUser, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdReset()&lt;br /&gt;
{&lt;br /&gt;
    clearUse();&lt;br /&gt;
    cmdGo(&amp;quot;start&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdBack()&lt;br /&gt;
{&lt;br /&gt;
    integer n = llGetListLength(gPath);&lt;br /&gt;
    if (n &amp;gt;= 2) {&lt;br /&gt;
        string node = llList2String(gPath, -2);&lt;br /&gt;
        gPath = llDeleteSubList(gPath, -2, -1);&lt;br /&gt;
        cmdGo(node);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        cmdReset();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cmdUser(key id)&lt;br /&gt;
{&lt;br /&gt;
    gUser = id;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdAnyone()&lt;br /&gt;
{&lt;br /&gt;
    gUser = NULL_KEY;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdTimeOut(float t)&lt;br /&gt;
{&lt;br /&gt;
    gTimeOut = t;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdImage(string inv)&lt;br /&gt;
{&lt;br /&gt;
    llSetTexture(inv, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdSay(string text)&lt;br /&gt;
{&lt;br /&gt;
    llSay(0, text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdMovie() { }&lt;br /&gt;
&lt;br /&gt;
cmdGive(string inv)&lt;br /&gt;
{&lt;br /&gt;
    llGiveInventory(gUser, inv);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdWebsite()&lt;br /&gt;
{&lt;br /&gt;
    llLoadURL(gUser, &amp;quot;View the Creative Commons web site.&amp;quot;,&lt;br /&gt;
        &amp;quot;http://creativecommons.org/&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cmdSet(string param, string value)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llListFindList(gParams, [ param ]);&lt;br /&gt;
    if (i &amp;lt; 0) {&lt;br /&gt;
        gParams += [ param, value ];&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        gParams = llListReplaceList(gParams, [ value ], i + 1, i + 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdSetUser(string param)&lt;br /&gt;
{&lt;br /&gt;
    cmdSet(param, llKey2Name(gUser));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdSetNow(string param)&lt;br /&gt;
{&lt;br /&gt;
    cmdSet(param, llGetSubString(llGetDate(), 0, 3));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string&lt;br /&gt;
getParam(string param)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llListFindList(gParams, [ param ]);&lt;br /&gt;
    if (i &amp;lt; 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    return llList2String(gParams, i + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdReport(string param, string prompt)&lt;br /&gt;
{&lt;br /&gt;
    string value = getParam(param);&lt;br /&gt;
    if (value == &amp;quot;&amp;quot;) return;&lt;br /&gt;
    &lt;br /&gt;
    llSay(0, prompt + value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdLicenseImage()&lt;br /&gt;
{&lt;br /&gt;
    string commercialUse = getParam(&amp;quot;commercial-use&amp;quot;);&lt;br /&gt;
    string modifications = getParam(&amp;quot;modifications&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    string license = &amp;quot;by&amp;quot;;&lt;br /&gt;
    if (commercialUse == &amp;quot;no&amp;quot;)      { license += &amp;quot;-nc&amp;quot;; }&lt;br /&gt;
    if (modifications == &amp;quot;no&amp;quot;)      { license += &amp;quot;-nd&amp;quot;; }&lt;br /&gt;
    if (modifications == &amp;quot;share&amp;quot;)   { license += &amp;quot;-sa&amp;quot;; }&lt;br /&gt;
    &lt;br /&gt;
    string imageName = &amp;quot;lic-&amp;quot; + license;&lt;br /&gt;
    cmdImage(imageName);&lt;br /&gt;
    &lt;br /&gt;
    cmdSet(&amp;quot;image-key&amp;quot;, llGetInventoryKey(imageName));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdLicenseRez()&lt;br /&gt;
{&lt;br /&gt;
    gLicenseChannel = 10000000 + (integer)llFrand(10000000.0);&lt;br /&gt;
    gLicenseListener = llListen(gLicenseChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    rotation r = llEuler2Rot(&amp;lt;0, -45, 0&amp;gt; * DEG_TO_RAD) * llGetRot();&lt;br /&gt;
    &lt;br /&gt;
    llRezObject(&amp;quot;badge&amp;quot;,&lt;br /&gt;
        llGetPos() + &amp;lt;-0.358, 0.0, 0.523&amp;gt; * r,&lt;br /&gt;
        ZERO_VECTOR,&lt;br /&gt;
        r,&lt;br /&gt;
        gLicenseChannel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
finishLicense()&lt;br /&gt;
{&lt;br /&gt;
    llListenRemove(gLicenseListener);&lt;br /&gt;
    &lt;br /&gt;
    integer n = llGetListLength(gParams);&lt;br /&gt;
    integer i;&lt;br /&gt;
    for (i = 0; i &amp;lt; n; i += 2) {&lt;br /&gt;
        string param = llList2String(gParams, i);&lt;br /&gt;
        string value = llList2String(gParams, i + 1);&lt;br /&gt;
        llSay(gLicenseChannel, param + &amp;quot;:&amp;quot; + value);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    rotation r = llEuler2Rot(&amp;lt;0, -45, 0&amp;gt; * DEG_TO_RAD) * llGetRot();&lt;br /&gt;
    vector p = llGetPos() + &amp;lt;-0.358, 0.0, 0.761&amp;gt; * r;&lt;br /&gt;
    llSay(gLicenseChannel, &amp;quot;done &amp;quot; + (string)p);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdLicenseDie()&lt;br /&gt;
{&lt;br /&gt;
    if (gLicenseChannel != 0) {&lt;br /&gt;
        llSay(gLicenseChannel, &amp;quot;die&amp;quot;);&lt;br /&gt;
        gLicenseChannel = 0;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
executeStatement(string statement)&lt;br /&gt;
{&lt;br /&gt;
    integer sep = llSubStringIndex(statement, &amp;quot;|&amp;quot;);&lt;br /&gt;
    string tail = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (sep &amp;gt;= 1) {&lt;br /&gt;
        tail = llGetSubString(statement, sep + 1, -1);&lt;br /&gt;
        statement = llGetSubString(statement, 0, sep - 1);&lt;br /&gt;
    }&lt;br /&gt;
    list parts = llParseString2List(statement, [ &amp;quot; &amp;quot; ], [ ]);&lt;br /&gt;
    if (tail != &amp;quot;&amp;quot;) {&lt;br /&gt;
        parts += [ tail ];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    string cmd = llList2String(parts, 0);&lt;br /&gt;
    string arg1 = llList2String(parts, 1);&lt;br /&gt;
    string arg2 = llList2String(parts, 2);&lt;br /&gt;
    if (arg2 == &amp;quot;*&amp;quot;) { arg2 = gArgMessage; }&lt;br /&gt;
        &lt;br /&gt;
         if (cmd == &amp;quot;back&amp;quot;)     { cmdBack(); }&lt;br /&gt;
    else if (cmd == &amp;quot;go&amp;quot;)       { cmdGo(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;reset&amp;quot;)    { cmdReset(); }&lt;br /&gt;
    else if (cmd == &amp;quot;user&amp;quot;)     { cmdUser(gArgID); }&lt;br /&gt;
    else if (cmd == &amp;quot;anyone&amp;quot;)   { cmdAnyone(); }&lt;br /&gt;
    else if (cmd == &amp;quot;timeout&amp;quot;)  { cmdTimeOut((float)arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;image&amp;quot;)    { cmdImage(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;say&amp;quot;)      { cmdSay(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;movie&amp;quot;)    { cmdMovie(); }&lt;br /&gt;
    else if (cmd == &amp;quot;give&amp;quot;)     { cmdGive(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;website&amp;quot;)  { cmdWebsite(); }&lt;br /&gt;
    else if (cmd == &amp;quot;set&amp;quot;)      { cmdSet(arg1, arg2); }&lt;br /&gt;
    else if (cmd == &amp;quot;setUser&amp;quot;)  { cmdSetUser(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;setNow&amp;quot;)   { cmdSetNow(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;report&amp;quot;)   { cmdReport(arg1, arg2); }&lt;br /&gt;
    else if (cmd == &amp;quot;licenseImage&amp;quot;) { cmdLicenseImage(); }&lt;br /&gt;
    else if (cmd == &amp;quot;licenseRez&amp;quot;)   { cmdLicenseRez(); }&lt;br /&gt;
    else if (cmd == &amp;quot;licenseDie&amp;quot;)   { cmdLicenseDie(); }&lt;br /&gt;
    else {&lt;br /&gt;
        llOwnerSay(&amp;quot;Unknown command: &amp;quot; + cmd);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
executeBlock(string block)&lt;br /&gt;
{&lt;br /&gt;
    list statements = llParseString2List(block,&lt;br /&gt;
        [ &amp;quot; ; &amp;quot;, &amp;quot; ;&amp;quot;, &amp;quot;; &amp;quot;, &amp;quot;;&amp;quot; ], [ ]);&lt;br /&gt;
    integer n = llGetListLength(statements);&lt;br /&gt;
    integer i;&lt;br /&gt;
    for (i = 0; i &amp;lt; n; ++i) {&lt;br /&gt;
        executeStatement(llList2String(statements, i));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
runAnyAction(string trigger, string altTrigger, key id, string message)&lt;br /&gt;
{&lt;br /&gt;
    gAltTrigger = altTrigger;&lt;br /&gt;
    gArgID = id;&lt;br /&gt;
    gArgMessage = message;&lt;br /&gt;
    &lt;br /&gt;
    llMessageLinked(LINK_THIS, 300, trigger, NULL_KEY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llSetTexture(gBlankTexture, 0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Touch to start up.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer n)&lt;br /&gt;
    {&lt;br /&gt;
        if (llDetectedKey(0) == llGetOwner()) {&lt;br /&gt;
            state readProgram;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            llSay(0, &amp;quot;This kiosk is under construction.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
state readProgram&lt;br /&gt;
{&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llSetTexture(gBlankTexture, 0);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 100, &amp;quot;&amp;quot;, NULL_KEY);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    state_exit() {&lt;br /&gt;
        llOwnerSay(&amp;quot;main memory: &amp;quot; + (string)llGetFreeMemory());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
        if (num == 101) {&lt;br /&gt;
            state run;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer n) { }&lt;br /&gt;
    on_rez(integer n) { llResetScript(); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state run&lt;br /&gt;
{&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        cmdReset();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    state_exit() {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    touch_start(integer n) {&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
        if (gUser != NULL_KEY  &amp;amp;&amp;amp;  gUser != id) { return; }&lt;br /&gt;
        runAnyAction(&amp;quot;touch&amp;quot;, &amp;quot;&amp;quot;, id, &amp;quot;&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(gTimeOut);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer ch, string who, key id, string message) {&lt;br /&gt;
        if (ch != 0  &amp;amp;&amp;amp;  ch == gLicenseChannel) {&lt;br /&gt;
            finishLicense();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        string trigger = &amp;quot;\&amp;quot;&amp;quot; + llToLower(message) + &amp;quot;\&amp;quot;&amp;quot;;&lt;br /&gt;
        runAnyAction(trigger, &amp;quot;listen&amp;quot;, id, message);&lt;br /&gt;
        llSetTimerEvent(gTimeOut);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    changed(integer what) {&lt;br /&gt;
        if (what &amp;amp; CHANGED_INVENTORY) {&lt;br /&gt;
            state readProgram;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
        if (num == 301) {&lt;br /&gt;
            executeBlock(str);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 399) {&lt;br /&gt;
            if (gAltTrigger != &amp;quot;&amp;quot;) {&lt;br /&gt;
                llMessageLinked(LINK_THIS, 300, gAltTrigger, NULL_KEY);&lt;br /&gt;
                gAltTrigger = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer() {&lt;br /&gt;
        cmdReset();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer n) { llResetScript(); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zarf Vantongerloo</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Kiosk_Program&amp;diff=32401</id>
		<title>Creative Commons License Machine/Kiosk Program</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Kiosk_Program&amp;diff=32401"/>
		<updated>2007-09-23T05:32:50Z</updated>

		<summary type="html">&lt;p&gt;Zarf Vantongerloo: New page: This relies on a set of images, that I still haven&amp;#039;t uploaded...  &amp;lt;pre&amp;gt; == default &amp;quot;help&amp;quot;: give Creative-Commons-Help &amp;quot;restart&amp;quot;: reset &amp;quot;back&amp;quot;: back touch: say | Say one of the red menu opt...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This relies on a set of images, that I still haven&#039;t uploaded...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
== default&lt;br /&gt;
&amp;quot;help&amp;quot;: give Creative-Commons-Help&lt;br /&gt;
&amp;quot;restart&amp;quot;: reset&lt;br /&gt;
&amp;quot;back&amp;quot;: back&lt;br /&gt;
touch: say | Say one of the red menu options on the screen.&lt;br /&gt;
&lt;br /&gt;
== start&lt;br /&gt;
init: image opener; timeout 0; anyone; licenseDie&lt;br /&gt;
&amp;quot;start&amp;quot;: user; go intro&lt;br /&gt;
touch: user; go intro&lt;br /&gt;
&lt;br /&gt;
== intro&lt;br /&gt;
init: image intro&lt;br /&gt;
&amp;quot;next&amp;quot;: go menu&lt;br /&gt;
touch: go menu&lt;br /&gt;
&lt;br /&gt;
== menu&lt;br /&gt;
init: image menu-alt&lt;br /&gt;
&amp;quot;start&amp;quot;: say | Great, let&#039;s begin; go step-1&lt;br /&gt;
&amp;quot;movie&amp;quot;: go movies&lt;br /&gt;
&amp;quot;web&amp;quot;: website&lt;br /&gt;
&lt;br /&gt;
== movies&lt;br /&gt;
init: image movies&lt;br /&gt;
&amp;quot;past&amp;quot;: go screen&lt;br /&gt;
&amp;quot;creative&amp;quot;: go screen&lt;br /&gt;
&lt;br /&gt;
== screen&lt;br /&gt;
init: image screen&lt;br /&gt;
&amp;quot;stop&amp;quot;: back&lt;br /&gt;
&lt;br /&gt;
== step-1&lt;br /&gt;
init: image step-1; report commercial-use | Commercial use allowed: &lt;br /&gt;
&amp;quot;yes&amp;quot;: set commercial-use yes; go step-2&lt;br /&gt;
&amp;quot;no&amp;quot;: set commercial-use no; go step-2&lt;br /&gt;
&lt;br /&gt;
== step-2&lt;br /&gt;
init: image step-2; report modifications | Work can be modified: &lt;br /&gt;
&amp;quot;yes&amp;quot;: set modifications yes; go step-3&lt;br /&gt;
&amp;quot;share&amp;quot;: set modifications share; go step-3&lt;br /&gt;
&amp;quot;no&amp;quot;: set modifications no; go step-3&lt;br /&gt;
&lt;br /&gt;
== step-3&lt;br /&gt;
init: image step-3; report format | Format: &lt;br /&gt;
listen: set format *; go step-4&lt;br /&gt;
&lt;br /&gt;
== step-4&lt;br /&gt;
init: image step-4; licenseDie&lt;br /&gt;
&amp;quot;a&amp;quot;: go step-4a&lt;br /&gt;
&amp;quot;b&amp;quot;: go step-4b&lt;br /&gt;
&amp;quot;c&amp;quot;: go step-4c&lt;br /&gt;
&amp;quot;d&amp;quot;: go step-4d&lt;br /&gt;
&amp;quot;e&amp;quot;: go step-4e&lt;br /&gt;
&amp;quot;f&amp;quot;: go step-4f&lt;br /&gt;
&amp;quot;g&amp;quot;: go step-4g&lt;br /&gt;
&amp;quot;next&amp;quot;: go lic; licenseRez&lt;br /&gt;
&amp;quot;done&amp;quot;: go lic; licenseRez&lt;br /&gt;
touch: go lic; licenseRez&lt;br /&gt;
&lt;br /&gt;
== step-4a&lt;br /&gt;
init: image step-4a; timeout 180; report title | Title: &lt;br /&gt;
listen: set title *; back&lt;br /&gt;
&amp;quot;skip&amp;quot;: back&lt;br /&gt;
&lt;br /&gt;
== step-4b&lt;br /&gt;
init: image step-4b; timeout 240; report description | Description:&lt;br /&gt;
listen: set description *; back&lt;br /&gt;
&amp;quot;skip&amp;quot;: back&lt;br /&gt;
&lt;br /&gt;
== step-4c&lt;br /&gt;
init: image step-4c; timeout 180; report tags | Tags: &lt;br /&gt;
listen: set tags *; back&lt;br /&gt;
&amp;quot;skip&amp;quot;: back&lt;br /&gt;
&lt;br /&gt;
== step-4d&lt;br /&gt;
init: image step-4d; timeout 120; report creator | Creator:&lt;br /&gt;
listen: set creator *; back&lt;br /&gt;
&amp;quot;me&amp;quot;: setUser creator; back&lt;br /&gt;
&amp;quot;skip&amp;quot;: back&lt;br /&gt;
&lt;br /&gt;
== step-4e&lt;br /&gt;
init: image step-4e; timeout 120; report holder | Copyright Holder: &lt;br /&gt;
listen: set holder *; back&lt;br /&gt;
&amp;quot;me&amp;quot;: setUser holder; back&lt;br /&gt;
&amp;quot;skip&amp;quot;: back&lt;br /&gt;
&lt;br /&gt;
== step-4f&lt;br /&gt;
init: image step-4f; report year | Copyright Year: &lt;br /&gt;
listen: set year *; back&lt;br /&gt;
&amp;quot;now&amp;quot;: setNow year; back&lt;br /&gt;
&amp;quot;skip&amp;quot;: back&lt;br /&gt;
&lt;br /&gt;
== step-4g&lt;br /&gt;
init: image step-4g; timeout 180; report source | Source URL: &lt;br /&gt;
listen: set source *; back&lt;br /&gt;
&amp;quot;skip&amp;quot;: back &lt;br /&gt;
&lt;br /&gt;
== lic&lt;br /&gt;
init: licenseImage; timeout 300&lt;br /&gt;
&amp;quot;next&amp;quot;: go next&lt;br /&gt;
touch: go next&lt;br /&gt;
&lt;br /&gt;
== next&lt;br /&gt;
init: image next; anyone; timeout 300&lt;br /&gt;
&amp;quot;done&amp;quot;: reset&lt;br /&gt;
touch: reset&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zarf Vantongerloo</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Kiosk_Script&amp;diff=32400</id>
		<title>Creative Commons License Machine/Kiosk Script</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Kiosk_Script&amp;diff=32400"/>
		<updated>2007-09-23T05:32:29Z</updated>

		<summary type="html">&lt;p&gt;Zarf Vantongerloo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The kiosk is actually just a general purpose state machine engine.  The particular state machine that is used for the Creative Commons LIcense Machine is in the [[Creative Commons License Machine/Kiosk Program]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key gBlankTexture = &amp;quot;5748decc-f629-461c-9a36-a35a221fe21f&amp;quot;; // well known&lt;br /&gt;
&lt;br /&gt;
float gTimeOut = 60.0;&lt;br /&gt;
&lt;br /&gt;
integer gUserListener = 0;&lt;br /&gt;
&lt;br /&gt;
integer gLicenseChannel = 0;&lt;br /&gt;
integer gLicenseListener = 0;&lt;br /&gt;
&lt;br /&gt;
string gNode;&lt;br /&gt;
list gPath;&lt;br /&gt;
    // path of nodes, including current node at the end&lt;br /&gt;
&lt;br /&gt;
key gUser = NULL_KEY;&lt;br /&gt;
    // user we are interacting with&lt;br /&gt;
    &lt;br /&gt;
list gParams;&lt;br /&gt;
    // user parameters, stride two: [ &amp;lt;key&amp;gt;, &amp;lt;value&amp;gt; ... ]&lt;br /&gt;
&lt;br /&gt;
string gAltTrigger;&lt;br /&gt;
key gArgID;&lt;br /&gt;
string gArgMessage;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
clearUse()&lt;br /&gt;
{&lt;br /&gt;
    gNode = &amp;quot;&amp;quot;;&lt;br /&gt;
    gPath = [ ];&lt;br /&gt;
    gUser = NULL_KEY;&lt;br /&gt;
    gParams = [ ];&lt;br /&gt;
    &lt;br /&gt;
    clearNode();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
clearNode()&lt;br /&gt;
{&lt;br /&gt;
    gTimeOut = 30.0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdGo(string node)&lt;br /&gt;
{&lt;br /&gt;
    gNode = node;&lt;br /&gt;
    gPath += [ node ];&lt;br /&gt;
    llMessageLinked(LINK_THIS, 200, node, NULL_KEY);&lt;br /&gt;
    &lt;br /&gt;
    clearNode();&lt;br /&gt;
    runAnyAction(&amp;quot;init&amp;quot;, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    llSetTimerEvent(gTimeOut);&lt;br /&gt;
    if (gUserListener) { llListenRemove(gUserListener); }&lt;br /&gt;
    gUserListener = llListen(0, &amp;quot;&amp;quot;, gUser, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdReset()&lt;br /&gt;
{&lt;br /&gt;
    clearUse();&lt;br /&gt;
    cmdGo(&amp;quot;start&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdBack()&lt;br /&gt;
{&lt;br /&gt;
    integer n = llGetListLength(gPath);&lt;br /&gt;
    if (n &amp;gt;= 2) {&lt;br /&gt;
        string node = llList2String(gPath, -2);&lt;br /&gt;
        gPath = llDeleteSubList(gPath, -2, -1);&lt;br /&gt;
        cmdGo(node);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        cmdReset();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cmdUser(key id)&lt;br /&gt;
{&lt;br /&gt;
    gUser = id;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdAnyone()&lt;br /&gt;
{&lt;br /&gt;
    gUser = NULL_KEY;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdTimeOut(float t)&lt;br /&gt;
{&lt;br /&gt;
    gTimeOut = t;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdImage(string inv)&lt;br /&gt;
{&lt;br /&gt;
    llSetTexture(inv, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdSay(string text)&lt;br /&gt;
{&lt;br /&gt;
    llSay(0, text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdMovie() { }&lt;br /&gt;
&lt;br /&gt;
cmdGive(string inv)&lt;br /&gt;
{&lt;br /&gt;
    llGiveInventory(gUser, inv);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdWebsite()&lt;br /&gt;
{&lt;br /&gt;
    llLoadURL(gUser, &amp;quot;View the Creative Commons web site.&amp;quot;,&lt;br /&gt;
        &amp;quot;http://creativecommons.org/&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cmdSet(string param, string value)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llListFindList(gParams, [ param ]);&lt;br /&gt;
    if (i &amp;lt; 0) {&lt;br /&gt;
        gParams += [ param, value ];&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        gParams = llListReplaceList(gParams, [ value ], i + 1, i + 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdSetUser(string param)&lt;br /&gt;
{&lt;br /&gt;
    cmdSet(param, llKey2Name(gUser));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdSetNow(string param)&lt;br /&gt;
{&lt;br /&gt;
    cmdSet(param, llGetSubString(llGetDate(), 0, 3));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string&lt;br /&gt;
getParam(string param)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llListFindList(gParams, [ param ]);&lt;br /&gt;
    if (i &amp;lt; 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    return llList2String(gParams, i + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdReport(string param, string prompt)&lt;br /&gt;
{&lt;br /&gt;
    string value = getParam(param);&lt;br /&gt;
    if (value == &amp;quot;&amp;quot;) return;&lt;br /&gt;
    &lt;br /&gt;
    llSay(0, prompt + value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdLicenseImage()&lt;br /&gt;
{&lt;br /&gt;
    string commercialUse = getParam(&amp;quot;commercial-use&amp;quot;);&lt;br /&gt;
    string modifications = getParam(&amp;quot;modifications&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    string license = &amp;quot;by&amp;quot;;&lt;br /&gt;
    if (commercialUse == &amp;quot;no&amp;quot;)      { license += &amp;quot;-nc&amp;quot;; }&lt;br /&gt;
    if (modifications == &amp;quot;no&amp;quot;)      { license += &amp;quot;-nd&amp;quot;; }&lt;br /&gt;
    if (modifications == &amp;quot;share&amp;quot;)   { license += &amp;quot;-sa&amp;quot;; }&lt;br /&gt;
    &lt;br /&gt;
    string imageName = &amp;quot;lic-&amp;quot; + license;&lt;br /&gt;
    cmdImage(imageName);&lt;br /&gt;
    &lt;br /&gt;
    cmdSet(&amp;quot;image-key&amp;quot;, llGetInventoryKey(imageName));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdLicenseRez()&lt;br /&gt;
{&lt;br /&gt;
    gLicenseChannel = 10000000 + (integer)llFrand(10000000.0);&lt;br /&gt;
    gLicenseListener = llListen(gLicenseChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    rotation r = llEuler2Rot(&amp;lt;0, -45, 0&amp;gt; * DEG_TO_RAD) * llGetRot();&lt;br /&gt;
    &lt;br /&gt;
    llRezObject(&amp;quot;badge&amp;quot;,&lt;br /&gt;
        llGetPos() + &amp;lt;-0.358, 0.0, 0.523&amp;gt; * r,&lt;br /&gt;
        ZERO_VECTOR,&lt;br /&gt;
        r,&lt;br /&gt;
        gLicenseChannel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
finishLicense()&lt;br /&gt;
{&lt;br /&gt;
    llListenRemove(gLicenseListener);&lt;br /&gt;
    &lt;br /&gt;
    integer n = llGetListLength(gParams);&lt;br /&gt;
    integer i;&lt;br /&gt;
    for (i = 0; i &amp;lt; n; i += 2) {&lt;br /&gt;
        string param = llList2String(gParams, i);&lt;br /&gt;
        string value = llList2String(gParams, i + 1);&lt;br /&gt;
        llSay(gLicenseChannel, param + &amp;quot;:&amp;quot; + value);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    rotation r = llEuler2Rot(&amp;lt;0, -45, 0&amp;gt; * DEG_TO_RAD) * llGetRot();&lt;br /&gt;
    vector p = llGetPos() + &amp;lt;-0.358, 0.0, 0.761&amp;gt; * r;&lt;br /&gt;
    llSay(gLicenseChannel, &amp;quot;done &amp;quot; + (string)p);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdLicenseDie()&lt;br /&gt;
{&lt;br /&gt;
    if (gLicenseChannel != 0) {&lt;br /&gt;
        llSay(gLicenseChannel, &amp;quot;die&amp;quot;);&lt;br /&gt;
        gLicenseChannel = 0;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
executeStatement(string statement)&lt;br /&gt;
{&lt;br /&gt;
    integer sep = llSubStringIndex(statement, &amp;quot;|&amp;quot;);&lt;br /&gt;
    string tail = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (sep &amp;gt;= 1) {&lt;br /&gt;
        tail = llGetSubString(statement, sep + 1, -1);&lt;br /&gt;
        statement = llGetSubString(statement, 0, sep - 1);&lt;br /&gt;
    }&lt;br /&gt;
    list parts = llParseString2List(statement, [ &amp;quot; &amp;quot; ], [ ]);&lt;br /&gt;
    if (tail != &amp;quot;&amp;quot;) {&lt;br /&gt;
        parts += [ tail ];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    string cmd = llList2String(parts, 0);&lt;br /&gt;
    string arg1 = llList2String(parts, 1);&lt;br /&gt;
    string arg2 = llList2String(parts, 2);&lt;br /&gt;
    if (arg2 == &amp;quot;*&amp;quot;) { arg2 = gArgMessage; }&lt;br /&gt;
        &lt;br /&gt;
         if (cmd == &amp;quot;back&amp;quot;)     { cmdBack(); }&lt;br /&gt;
    else if (cmd == &amp;quot;go&amp;quot;)       { cmdGo(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;reset&amp;quot;)    { cmdReset(); }&lt;br /&gt;
    else if (cmd == &amp;quot;user&amp;quot;)     { cmdUser(gArgID); }&lt;br /&gt;
    else if (cmd == &amp;quot;anyone&amp;quot;)   { cmdAnyone(); }&lt;br /&gt;
    else if (cmd == &amp;quot;timeout&amp;quot;)  { cmdTimeOut((float)arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;image&amp;quot;)    { cmdImage(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;say&amp;quot;)      { cmdSay(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;movie&amp;quot;)    { cmdMovie(); }&lt;br /&gt;
    else if (cmd == &amp;quot;give&amp;quot;)     { cmdGive(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;website&amp;quot;)  { cmdWebsite(); }&lt;br /&gt;
    else if (cmd == &amp;quot;set&amp;quot;)      { cmdSet(arg1, arg2); }&lt;br /&gt;
    else if (cmd == &amp;quot;setUser&amp;quot;)  { cmdSetUser(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;setNow&amp;quot;)   { cmdSetNow(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;report&amp;quot;)   { cmdReport(arg1, arg2); }&lt;br /&gt;
    else if (cmd == &amp;quot;licenseImage&amp;quot;) { cmdLicenseImage(); }&lt;br /&gt;
    else if (cmd == &amp;quot;licenseRez&amp;quot;)   { cmdLicenseRez(); }&lt;br /&gt;
    else if (cmd == &amp;quot;licenseDie&amp;quot;)   { cmdLicenseDie(); }&lt;br /&gt;
    else {&lt;br /&gt;
        llOwnerSay(&amp;quot;Unknown command: &amp;quot; + cmd);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
executeBlock(string block)&lt;br /&gt;
{&lt;br /&gt;
    list statements = llParseString2List(block,&lt;br /&gt;
        [ &amp;quot; ; &amp;quot;, &amp;quot; ;&amp;quot;, &amp;quot;; &amp;quot;, &amp;quot;;&amp;quot; ], [ ]);&lt;br /&gt;
    integer n = llGetListLength(statements);&lt;br /&gt;
    integer i;&lt;br /&gt;
    for (i = 0; i &amp;lt; n; ++i) {&lt;br /&gt;
        executeStatement(llList2String(statements, i));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
runAnyAction(string trigger, string altTrigger, key id, string message)&lt;br /&gt;
{&lt;br /&gt;
    gAltTrigger = altTrigger;&lt;br /&gt;
    gArgID = id;&lt;br /&gt;
    gArgMessage = message;&lt;br /&gt;
    &lt;br /&gt;
    llMessageLinked(LINK_THIS, 300, trigger, NULL_KEY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llSetTexture(gBlankTexture, 0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Touch to start up.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer n)&lt;br /&gt;
    {&lt;br /&gt;
        if (llDetectedKey(0) == llGetOwner()) {&lt;br /&gt;
            state readProgram;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            llSay(0, &amp;quot;This kiosk is under construction.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
state readProgram&lt;br /&gt;
{&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llSetTexture(gBlankTexture, 0);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 100, &amp;quot;&amp;quot;, NULL_KEY);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    state_exit() {&lt;br /&gt;
        llOwnerSay(&amp;quot;main memory: &amp;quot; + (string)llGetFreeMemory());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
        if (num == 101) {&lt;br /&gt;
            state run;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer n) { }&lt;br /&gt;
    on_rez(integer n) { llResetScript(); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state run&lt;br /&gt;
{&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        cmdReset();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    state_exit() {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    touch_start(integer n) {&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
        if (gUser != NULL_KEY  &amp;amp;&amp;amp;  gUser != id) { return; }&lt;br /&gt;
        runAnyAction(&amp;quot;touch&amp;quot;, &amp;quot;&amp;quot;, id, &amp;quot;&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(gTimeOut);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer ch, string who, key id, string message) {&lt;br /&gt;
        if (ch != 0  &amp;amp;&amp;amp;  ch == gLicenseChannel) {&lt;br /&gt;
            finishLicense();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        string trigger = &amp;quot;\&amp;quot;&amp;quot; + llToLower(message) + &amp;quot;\&amp;quot;&amp;quot;;&lt;br /&gt;
        runAnyAction(trigger, &amp;quot;listen&amp;quot;, id, message);&lt;br /&gt;
        llSetTimerEvent(gTimeOut);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    changed(integer what) {&lt;br /&gt;
        if (what &amp;amp; CHANGED_INVENTORY) {&lt;br /&gt;
            state readProgram;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
        if (num == 301) {&lt;br /&gt;
            executeBlock(str);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 399) {&lt;br /&gt;
            if (gAltTrigger != &amp;quot;&amp;quot;) {&lt;br /&gt;
                llMessageLinked(LINK_THIS, 300, gAltTrigger, NULL_KEY);&lt;br /&gt;
                gAltTrigger = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer() {&lt;br /&gt;
        cmdReset();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer n) { llResetScript(); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zarf Vantongerloo</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Zarf_Vantongerloo&amp;diff=32398</id>
		<title>User:Zarf Vantongerloo</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Zarf_Vantongerloo&amp;diff=32398"/>
		<updated>2007-09-23T05:32:09Z</updated>

		<summary type="html">&lt;p&gt;Zarf Vantongerloo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Resident since June of 2005.&lt;br /&gt;
&lt;br /&gt;
Major projects:&lt;br /&gt;
*[http://www.notabene-sl.com/ Nota Bene] - the notary in SL&lt;br /&gt;
* {{SLurl|region= Obscure|x=214|y=206|z=32|title=Obscure Sandbox|}} &lt;br /&gt;
* [http://www.notabene-sl.com/slgc/ Go Center of Second Life]&lt;br /&gt;
&lt;br /&gt;
Minor Projects:&lt;br /&gt;
* The [[Creative Commons License Machine]]&lt;/div&gt;</summary>
		<author><name>Zarf Vantongerloo</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine&amp;diff=32397</id>
		<title>Creative Commons License Machine</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine&amp;diff=32397"/>
		<updated>2007-09-23T05:22:53Z</updated>

		<summary type="html">&lt;p&gt;Zarf Vantongerloo: New page: There is a Creative Commons License Machine at various places in Second Life.  There is one at the CC headquarters and one at the Nota Bene notary in Obscure.  The machine leads you throug...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is a Creative Commons License Machine at various places in Second Life.  There is one at the CC headquarters and one at the Nota Bene notary in Obscure.&lt;br /&gt;
&lt;br /&gt;
The machine leads you through a series of questions to select a Creative Commons license for a work.  When done, it rezs a small &amp;quot;badge&amp;quot; prim that you can attach to the work or leave near it.  The badge shows the type of license and can produce detailed information when touched.&lt;br /&gt;
&lt;br /&gt;
It was built by [[User:Zarf Vantongerloo]].  Ask him if you have questions...&lt;br /&gt;
&lt;br /&gt;
The source code for the machine is now open source, under the Gnu Public License:&lt;br /&gt;
* [[Creative Commons License Machine/Kiosk Script|Kiosk Script]]&lt;br /&gt;
* [[Creative Commons License Machine/Kiosk Program|Kiosk Program]]&lt;br /&gt;
* [[Creative Commons License Machine/Badge Script|Badge Script]]&lt;/div&gt;</summary>
		<author><name>Zarf Vantongerloo</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Zarf_Vantongerloo&amp;diff=32396</id>
		<title>User:Zarf Vantongerloo</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Zarf_Vantongerloo&amp;diff=32396"/>
		<updated>2007-09-23T05:14:07Z</updated>

		<summary type="html">&lt;p&gt;Zarf Vantongerloo: New page: Resident since June of 2005.  Major projects: *[http://www.notabene-sl.com/ Nota Bene] - the notary in SL * Obscure Sandbox - [http://slurl.com/secondlife/Obscure/214/206/32 Obscure (214,2...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Resident since June of 2005.&lt;br /&gt;
&lt;br /&gt;
Major projects:&lt;br /&gt;
*[http://www.notabene-sl.com/ Nota Bene] - the notary in SL&lt;br /&gt;
* Obscure Sandbox - [http://slurl.com/secondlife/Obscure/214/206/32 Obscure (214,206)] &lt;br /&gt;
* [http://www.notabene-sl.com/slgc/ Go Center of Second Life]&lt;br /&gt;
&lt;br /&gt;
Minor Projects:&lt;br /&gt;
* The [[Creative Commons License Machine]]&lt;/div&gt;</summary>
		<author><name>Zarf Vantongerloo</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Alternate_Editors&amp;diff=18268</id>
		<title>LSL Alternate Editors</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Alternate_Editors&amp;diff=18268"/>
		<updated>2007-04-25T04:06:47Z</updated>

		<summary type="html">&lt;p&gt;Zarf Vantongerloo: Added info on SubEthaEdit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
You are not limited to the in-world editor for editing your scripts; there are many editors available for free or purchase.  Many of these editors have syntax highlighting for LSL that will make your code easier to follow.  Below are some of the more popular editors for use with LSL.  &lt;br /&gt;
&lt;br /&gt;
If you have a favorite that is missing from the list, &#039;&#039;&#039;please&#039;&#039;&#039; feel free to add it.&lt;br /&gt;
&lt;br /&gt;
For some of the editors mentioned here, the [http://adammarker.org/shill Shill] project may have more up-to-date syntax files.&lt;br /&gt;
&lt;br /&gt;
==Multi-platform Editors==&lt;br /&gt;
===ByronStar SL===&lt;br /&gt;
Based on [http://eclipse.org Eclipse], the [http://byronstar-sl.sourceforge.net/ ByronStar SL IDE] includes most modern program editor features.  It also includes custom features for LSL, such as variable checking, error markers, and code formatting.  Eclipse is available for Macintosh, Linux, Windows, and many UNIX flavors.&lt;br /&gt;
&lt;br /&gt;
===Emacs===&lt;br /&gt;
You can find the LSL major mode, by Gary Evans, [http://www.cs.iastate.edu/~leavens/emacs/lsl-mode.el here]. Emacs is also available for Macintosh and Windows.&lt;br /&gt;
&lt;br /&gt;
There&#039;s also [[Emacs LSL Mode]] available on this wiki, which provides better syntax highlighting and indentation features.&lt;br /&gt;
&lt;br /&gt;
===vim===&lt;br /&gt;
[http://www.vim.org/ vim:] vi improved. A multi-platform evolution of the most classical of the editors: vi. GPL code.&lt;br /&gt;
&lt;br /&gt;
==Windows Editors==&lt;br /&gt;
&amp;lt;!-- Add your text editors in the following format --&amp;gt;&lt;br /&gt;
===Notepad++===&lt;br /&gt;
[http://notepad-plus.sourceforge.net/uk/site.htm Notepad++] is probably one of the best windows editor around. Packed with features, extremely powerful and easy to use for beginners too. Best of all, it is GPL code.&lt;br /&gt;
&lt;br /&gt;
===ConTEXT===&lt;br /&gt;
[http://www.context.cx/component/option,com_frontpage/Itemid,1/ ConTEXT] is a small, fast and powerful freeware text editor, developed mainly to serve as secondary tool for software developers.&lt;br /&gt;
&lt;br /&gt;
The following syntax files are available for ConTEXT.&lt;br /&gt;
* [http://forum.context.cx/index.php?action=dlattach;topic=1775.0;id=359 Shyan Graves] Last updated March 01, 2007.&lt;br /&gt;
* [http://adammarker.org/shill/context/lsl.chl Sir.Grelling] Last updated July 10, 2006.&lt;br /&gt;
&lt;br /&gt;
===Crimson Editor===&lt;br /&gt;
[http://www.crimsoneditor.com/ Crimson Editor] is a professional source code editor for Windows.&lt;br /&gt;
The following syntax files are available for Crimson Editor.&lt;br /&gt;
* [http://www.crimsoneditor.com/english/board/CrazyWWWBoard.cgi?db=file3&amp;amp;mode=read&amp;amp;num=1791 Aakanaar] Last updated September 10, 2006 for Second Life version 1.10.0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===LSLeditor===&lt;br /&gt;
&lt;br /&gt;
* [http://www.lsleditor.org/ http://www.lsleditor.org/]&lt;br /&gt;
&lt;br /&gt;
LSLeditor is a standallone LSL script editor, featuring:&lt;br /&gt;
&lt;br /&gt;
* Code editing (also cut / paste)&lt;br /&gt;
* Code highlighting&lt;br /&gt;
* Code autocompletion&lt;br /&gt;
* Code info (old LSL guide)&lt;br /&gt;
* Auto-indent&lt;br /&gt;
* F1 , turns up the LSLwiki.NET information on the keyword&lt;br /&gt;
* Experimental compiling and excution (LSLscript -&amp;gt; C#)&lt;br /&gt;
&lt;br /&gt;
Windows XP , Windows 2000&lt;br /&gt;
* .NET 1.x has to be installed&lt;br /&gt;
&lt;br /&gt;
===SciTE===&lt;br /&gt;
[http://sl.sdfjkl.org/secondlife/scite/ SciTE-ez]&lt;br /&gt;
&lt;br /&gt;
===TextPad [{{HoverText|&#039;&#039;C&#039;&#039;|Commercial Software}}]===&lt;br /&gt;
[http://www.textpad.com/products/textpad/index.html TextPad] is a powerful, but easy to use general purpose text editor.  It is a commercial product, but there is a 30 day trial version available for free on the website.&lt;br /&gt;
&lt;br /&gt;
The following syntax files are available for TextPad.&lt;br /&gt;
* [[LSL_Editor_TextPad_Syntax | Prodigal Maeterlinck &amp;amp; Patrick2 Chama]] Last updated February 20, 2007.  Extracted from the Second Life viewer source code.&lt;br /&gt;
* [http://www.textpad.com/add-ons/files/syntax/lsl_.zip Ben Gray] Last updated August 23, 2006. As of version 1.12.0, with the deprecated functions in a separate keyword list.&lt;br /&gt;
* [http://www.textpad.com/add-ons/files/syntax/lsl.zip Matthias Huber] Last updated September 23, 2004.&lt;br /&gt;
* [[LSL_Editor_TextPad_ClipBook_Events | Events ClipBook]] Last updated March 5, 2007.  Based on the LSL Portal event entries.&lt;br /&gt;
&lt;br /&gt;
===UltraEdit-32 [{{HoverText|&#039;&#039;C&#039;&#039;|Commercial Software}}]===&lt;br /&gt;
[http://www.ultraedit.com/ UltraEdit-32] is a powerful text, HTML, and HEX editor.  It is a commercial editor with a 30 day trial version available at the website.  Important features:&lt;br /&gt;
* column/block mode editing&lt;br /&gt;
* brackets/braces matching&lt;br /&gt;
* code-folding&lt;br /&gt;
* configurable syntax highlighting via custom  [http://www.ultraedit.com/index.php?name=Content&amp;amp;pa=showpage&amp;amp;pid=40#wordfiles wordfiles]&lt;br /&gt;
* autocomplete (using keywords defined in the wordfile)&lt;br /&gt;
* bookmarks, incremental searching, CTAG support&lt;br /&gt;
* automatic conversion between Unix/Dos/MAC/UTF-8, etc&lt;br /&gt;
* built-in FTP/SFTP client&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following syntax files are available for UltraEdit.&lt;br /&gt;
* [http://podryk.googlepages.com/LSL_Wordfile.txt Podryck Sands] Last updated April 12, 2007.&lt;br /&gt;
* [http://stryfe.org/lsl_wordfile.txt Stryfe Lowell] Last updated 2007-04-15.  Based on the original [http://www.lslwiki.net LSL Wiki] and updated based on release notes.  Currently at LSL 1.14.1.2.&lt;br /&gt;
&lt;br /&gt;
==Macintosh Editors==&lt;br /&gt;
===TextMate [{{HoverText|&#039;&#039;C&#039;&#039;|Commercial Software}}]===&lt;br /&gt;
You can find details about Piero Padar&#039;s well-maintained TextMate bundle in the [http://forums.secondlife.com/showthread.php?p=1041958#post1041958 Scripting Tips forum].  TextMate is a commercial Mac OS X text/program editor from [http://macromates.com/ Macromates].&lt;br /&gt;
&lt;br /&gt;
There is a 30 day trial version available on their website.&lt;br /&gt;
&lt;br /&gt;
===SubEthaEdit [{{HoverText|&#039;&#039;C&#039;&#039;|Commercial Software}}]===&lt;br /&gt;
This a great text editor with extensible language support.  It also happens to be an incredible collaborative editor. Info at: http://www.subethaedit.net/&lt;br /&gt;
&lt;br /&gt;
There is a contributed LSL mode by Zarf Vantongerloo.  The mode is a little out of date and could use some love.  But in general works great, doing syntax hilighting of LSL funcitons and adding a pop-up menu of all functions, states and event handlers to the top of the window.&lt;br /&gt;
&lt;br /&gt;
==Linux Editors==&lt;br /&gt;
[http://kate-editor.org/ Kate] is an advanced text editor for KDE. Usually included in all KDE based distributions.&lt;br /&gt;
A [[Kate LSL Mode]] is available on this wiki.&lt;/div&gt;</summary>
		<author><name>Zarf Vantongerloo</name></author>
	</entry>
</feed>