// SPDX-License-Identifier: MIT // Copyright (c) 2026 Incoprea // Four-digit codebreaker // Not compiled or tested in-world // Setup: Owner-touch. Enter exactly four digits from 1–6; repeated digits are allowed. // Stop / restore: Stop responding and the listener closes after 90 seconds, or remove/disable the script. Owner-touch restarts the exercise. // Notes: Owner-only local exercise; no prizes, visitor records, network service, or persistent scores. Counts each matching symbol once, including repeated symbols. This is a puzzle, not an access lock or security mechanism. // License: see LICENSE in this distribution. // Original Incoprea. MIT. Not compiled or tested in-world. integer channel; integer handle; close() { if(handle)llListenRemove(handle); handle=0; llSetTimerEvent(0.0); } ask(string prompt) { if(!handle) { channel=-1000-(integer)llFrand(1000000.0); handle=llListen(channel,"",llGetOwner(),""); } llTextBox(llGetOwner(),prompt,channel); llSetTimerEvent(90.0); } integer digit(string text,integer min,integer max) { if(llStringLength(text)!=1)return -1; integer n=llSubStringIndex("0123456789",text); if(nmax)return -1; return n; } string secret; start() { secret=""; integer i; for(i=0;i<4;++i)secret+=(string)(1+(integer)llFrand(6.0)); ask("Guess four digits 1-6. Repeats allowed."); } answer(string s) { if(llStringLength(s)!=4) { ask("Enter exactly four digits 1-6."); return; } integer i; integer exact; list a; list b; for(i=0;i<4;++i) { string x=llGetSubString(s,i,i); if(digit(x,1,6)<0) { ask("Use only digits 1-6."); return; } string y=llGetSubString(secret,i,i); if(x==y)++exact; else { a+=[x]; b+=[y]; } } integer misplaced; for(i=0;i=0) { ++misplaced; b=llDeleteSubList(b,p,p); } } if(exact==4) { close(); llOwnerSay("Code solved: "+secret); } else ask((string)exact+" exact; "+(string)misplaced+" correct digit, wrong place.\nGuess again."); } default { touch_start(integer count) { if(llDetectedKey(0)!=llGetOwner())return; close(); start(); } listen(integer ch,string name,key id,string message) { if(!handle||ch!=channel||id!=llGetOwner())return; answer(llStringTrim(message,STRING_TRIM)); } timer() { close(); llOwnerSay("Exercise paused. Touch to restart."); } changed(integer change) { if(change&CHANGED_OWNER)llResetScript(); } }