// SPDX-License-Identifier: MIT // Copyright (c) 2026 Incoprea // Audit non-overlapping subtitle cues // Not compiled or tested in-world // Setup: Add a saved plain-text notecard named Config. Use decimal seconds from zero, for example 0|4.5|Welcome. Touch as owner; reset to scan again. // Stop / restore: Remove or disable. This auditor never changes object settings or inventory. // Notes: Reads at most 40 short lines, skips blanks and # comments, and times out each asynchronous request after 20 seconds. No sound plays and no captions are displayed. Adjacent cues may touch at an endpoint; negative, inverted, or overlapping times are findings. // License: see LICENSE in this distribution. // Original Incoprea example. MIT. integer decimalOK(string value) { integer n=llStringLength(value); if(n<1 || n>12)return FALSE; integer i; integer digits; integer dots; if(llGetSubString(value,0,0)=="-" || llGetSubString(value,0,0)=="+")i=1; for(;i0 && dots<=1; } float previousEnd; key pending=NULL_KEY; integer lineNumber; integer scannedRows; integer issues; integer finished; issue(string text) { ++issues; llOwnerSay("Line "+(string)(lineNumber+1)+": "+text); } requestLine() { pending=llGetNotecardLine("Config",lineNumber); llSetTimerEvent(20); } finish() { pending=NULL_KEY; finished=TRUE; llSetTimerEvent(0); llOwnerSay("Audited rows: "+(string)scannedRows+"; findings: "+(string)issues); } check(string data) { list p=llParseStringKeepNulls(data,["|"],[]); if(llGetListLength(p)!=3 || !decimalOK(llList2String(p,0)) || !decimalOK(llList2String(p,1))) { issue("Expected start|end|text."); return; } float start=llList2Float(p,0); float end=llList2Float(p,1); if(start<0 || end<=start || end>86400) { issue("Invalid cue interval."); return; } if(start=40) { llOwnerSay("40-line cap reached; report may be partial."); finish(); return; } requestLine(); } timer() { pending=NULL_KEY; finished=TRUE; llSetTimerEvent(0); llOwnerSay("Audit timed out; partial checks only. Reset to retry."); } changed(integer flags) { if(flags & (CHANGED_OWNER|CHANGED_INVENTORY))llResetScript(); } }