// SPDX-License-Identifier: MIT // Copyright (c) 2026 Incoprea // Manual reservoir valves // Not compiled or tested in-world // Setup: Enter inlet, drain or step. Valve commands toggle; step advances one arbitrary time unit. 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. The order is fill, drain, clamp. No fluid objects are created or real valves controlled. // License: see LICENSE in this distribution. // Original Incoprea. MIT. Not compiled or tested in-world. integer channel; integer handle; integer water; integer inlet; integer drain; integer spilled; close() { if(handle)llListenRemove(handle); handle=0; llSetTimerEvent(0.0); } start() { water=20; inlet=FALSE; drain=FALSE; spilled=0; } string view() { return "Tank "+(string)water+"/100 | inlet "+(string)inlet+" drain "+(string)drain+" overflow "+(string)spilled; } show() { llOwnerSay(view()); if(!handle) { channel=-1000-(integer)llFrand(1000000.0); handle=llListen(channel,"",llGetOwner(),""); } llTextBox(llGetOwner(),"Enter inlet, drain or step. Valve commands toggle; step advances one arbitrary time unit. 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 { if(s=="inlet")inlet=!inlet; else if(s=="drain")drain=!drain; else if(s=="step") { if(inlet)water+=7; if(drain)water-=4; if(water<0)water=0; if(water>100) { spilled+=water-100; water=100; } } } show(); } timer() { close(); } }