// SPDX-License-Identifier: MIT // Copyright (c) 2026 Incoprea // Check numbered instruction steps // Not compiled or tested in-world // Setup: Add a saved plain-text notecard named Notes. Touch as owner to scan once; reset to scan again. Reads at most 100 lines. // Stop / restore: Disable or remove the script. It makes no inventory changes. // Notes: Line requests time out after 20 seconds. Lines may be truncated by the simulator; use short lines without embedded inventory. Editing Contents resets the scan. Reports only to the owner. Only lines beginning with digits followed by a dot are treated as steps. Number strings over six digits are rejected. // License: see LICENSE in this distribution. // Original Incoprea example. MIT. string CARD="Notes"; integer lineNumber; key pending=NULL_KEY; integer expected=1; integer issues; integer steps; requestLine() { pending=llGetNotecardLine(CARD,lineNumber); llSetTimerEvent(20.0); } complete() { pending=NULL_KEY; llSetTimerEvent(0.0); llOwnerSay("Numbered steps: "+(string)steps+"; sequence findings: "+(string)issues); } default { touch_start(integer count) { if(llDetectedKey(0)!=llGetOwner()) return; if(pending!=NULL_KEY) { llOwnerSay("Read in progress."); return; } if(lineNumber>0) { llOwnerSay("Reset this script to scan again."); return; } if(llGetInventoryType(CARD)!=INVENTORY_NOTECARD) { llOwnerSay("Add a saved plain-text notecard named Notes."); return; } requestLine(); } dataserver(key query,string data) { if(query!=pending || pending==NULL_KEY) return; if(data==EOF) { complete(); return; } string trimmed=llStringTrim(data,STRING_TRIM); integer dot=llSubStringIndex(trimmed,"."); if(dot>0 && dot<=6) { string digits=llGetSubString(trimmed,0,dot-1); integer valid=TRUE; integer i; for(i=0;i=100) { llOwnerSay("Stopped at 100 input lines; results may be partial."); complete(); return; } requestLine(); } timer() { pending=NULL_KEY; llSetTimerEvent(0.0); llOwnerSay("Timed out; reset before retrying. Partial values were not reported."); lineNumber=100; } changed(integer flags) { if(flags & (CHANGED_INVENTORY|CHANGED_OWNER)) llResetScript(); } }