// SPDX-License-Identifier: MIT // Copyright (c) 2026 Incoprea // Three-rod abacus trainer // Not compiled or tested in-world // Setup: Enter one,ten,hundred or down. Range0-999; down subtracts one. Owner-touch initializes; enter reset to restart. Text input closes after90seconds. // Stop / restore: Close or ignore the text box, or remove the script. It changes no world objects, avatar state or inventory. // Notes: Original bounded, manually stepped educational toy. Not a calibrated simulator, real-world control system, or live scientific measurement. Digits are represented separately; this is not an automatic representation of every physical abacus tradition. // License: see LICENSE in this distribution. // Original Incoprea. MIT. Not compiled or tested in-world. integer channel; integer handle; integer value; close() { if(handle)llListenRemove(handle); handle=0; llSetTimerEvent(0.0); } start() { value=0; } string view() { string text=(string)value+" | H T U rods: "; integer divisor=100; integer i; for(i=0;i<3;++i) { integer digit=(value/divisor)%10; text+="["+(string)(digit/5)+" five + "+(string)(digit%5)+" ones] "; divisor/=10; } return text; } show() { llOwnerSay(view()); if(!handle) { channel=-1000-(integer)llFrand(1000000.0); handle=llListen(channel,"",llGetOwner(),""); } llTextBox(llGetOwner(),"Enter one,ten,hundred or down. Range0-999; down subtracts one. Type reset to restart.",channel); llSetTimerEvent(90.0); } default { touch_start(integer n) { if(llDetectedKey(0)!=llGetOwner())return; close(); start(); show(); } listen(integer incomingChannel,string name,key id,string s) { if(!handle||incomingChannel!=channel||id!=llGetOwner())return; s=llToLower(llStringTrim(s,STRING_TRIM)); if(s=="reset")start(); else { integer next=value; if(s=="one")++next; else if(s=="ten")next+=10; else if(s=="hundred")next+=100; else if(s=="down")--next; if(next>=0&&next<=999)value=next; else llOwnerSay("Outside three-rod range."); } show(); } timer() { close(); } }