// IF YOU VALUE THIS WORK, PLEASE LEAVE ATTRIBUTION INTACT // // // // _|_| // // _| _| _|_|_|_| _|_| _|_|_| _|_| // // _| _| _| _| _| _| _| _|_|_|_| // // _| _| _| _| _| _| _| _| // // _|_| _|_|_|_| _|_| _| _| _|_|_| // // MiniVerse // //............................................................// //.....................▒▓▓▒▒▒▒▓▓▓▓▓▓▒▒▒▓▓░....................// //.................._▒▓▒.Ozone.MiniVerse.▒▓▒_.................// //................_▒▓▓▓▒____PRESENTS____▒▓▓▓▓▓▒_..............// //..............░▓▓▓▓▓▓▒___I.M.A.G.E.___▒▓▓▓▓▓▓▓░.............// //.............▒▓▓▓▓▓▓▓▒__IMAGE_MATRIX__▒▓▓▓▓▓▓▓▓▒............// //............▒▓▒▓▓▓▓▒_ACTION_GAME_ENGINE_▒▓▓▓▓▒▓▓▒...........// //..........▒▓▓▓▓░...▒▓▓▒_By_Spax_Orion_▒▓▓▒...░▓▓▓▓▒.........// //.........▒▓▓▓▓░......▒▓_& Dirty Helga_▓▓▒░.....░▒▓▓▓........// //.........▓▓▓▓▒░.._......░▒▓▓▓▓▓▓▓▓▓▓▓▒░......_..░▒▓▓▓.......// //.........▓▓▓▓░.._▓░▓░_....▓▓▓▓▓▓▓▓▓▓...._▒▓▒▓_..░▓▓▓▓.......// //.........▓▓▓▓.._▓█░▒█▒.....▒▓▓▓▓▓▓▒.....▒█▒░█▒_..▓▓▓▓.......// //........▒▓▓▓▓▓▒_..▒._░_▒▓▓▒░.▒▒.░▒▓▓▒_░_.▒.._▒▓▓▓▓▓▓▒.......// //.......▒▓▓▓▓▓▓▓▓▓_...▒▓▓▓▓▓░..▒▒..░▓▓▓▓▓▒..._▓▓▓▓▓▓▓▓▒......// //......▓▓▓▓▓▓▓▓▓▓▓_.▓▓▓▓▓▒.._▓▓▓█_..▒▓▓▓▓▓._▓▓▓▓▓▓▓▓▓▓▓......// //......▓▓▓▓▓▒▒▓▓▓▒▓▓▓▓▓▓▒░.▒▓▓▓▓▓█▒.░▒▓▓▓▓▓▒▒▓▓▓▒▓▓▓▓▓▓......// //......▓▓▓▓▓░.▓▓▓.▒▓▓▓▓▓░..▒▓▓▓▓▓▓▒..░▓▓▓▓▓░.▓▓▓.░▓▓▓▓▓......// //........▒▓▓█░.▓▓▓.▒▓▓▓▓▓__▓_..▒▒.._▓__▓▓▓▓▓░.▓▓▓.▒▓▓▓▒......// //.........░▒░░▒▓▒░▒▓▓▓▓▓▓▒▒▓▒▒▒▓▓▒▒▒▓▒▒▓▓▓▓▓▒░▒▓▒░░▒░░.......// //.........░▒.░▓▓░.▓▓▓▓█▒▒▒█▒▒▒█▒▒█▒▒▒█▒▒▒█▓▓▓▓.░▓▓░.▒░.......// //.............░▓▓░_▓▓▓▓█................█▓▓▓▓_░▓▓░...........// //..............░▒▓▓▓█▓._▒_.█░....█░._█_.▓█▓▓▓▒░..............// //.................░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░................// //.................░▒▓▓▓▒▒▓▒▒▓▓▓▓▒▒▓▓▓▓▒▒▓▓▒░.................// //..................▒▓▓░░▓░░▓▓▓▓░░▓▓▓▓░░▓▓▒...................// //.................▒▓░..█__▓▓▓▓__▓▓▓▓__█..░▓▒.................// //...................░...░..░▓▓░..░▓▓░..░...░.................// //.................... ..░...░▒░....░▒░...░...................// //............................................................// // Common sense not included and must be supplied by end user // // Read ENTIRE script first and LEARN: KNOW what you're using // // CC BY-NC https://creativecommons.org/licenses/by-nc/4.0/ // // ===========================================================// // ===========================================================// // .IASR (IMAGE AUTONOMOUS SOUND RELAY) // // - Placed inworld by game owner // // - Listens on CH_IASR_CMD for MODE / VOL / STOP / KILL // // - Loops the named mode track if present in inventory // // ===========================================================// integer CH_IASR_CMD = -733102; // MUST match controller float DEFAULT_VOL = 1.0; string gMode = ""; float gVol = 1.0; integer gListen = 0; integer gHaveLoop = FALSE; float gLastLoopVol = -1.0; string gLastLoopSnd = ""; integer gLastTrigTime = 0; string gLastTrigSnd = ""; playLoop(string snd, float vol) { if (snd == "") return; // Clamp volume if (vol < 0.0) vol = 0.0; if (vol > 1.0) vol = 1.0; // Inventory guard if (llGetInventoryType(snd) != INVENTORY_SOUND) return; // Cheap duplicate suppression: don't restart the exact same loop if (gHaveLoop && snd == gLastLoopSnd && llFabs(vol - gLastLoopVol) < 0.001) return; llStopSound(); llLoopSound(snd, vol); gMode = snd; gVol = vol; gHaveLoop = TRUE; gLastLoopSnd = snd; gLastLoopVol = vol; } stopLoop() { llStopSound(); gMode = ""; gHaveLoop = FALSE; gLastLoopSnd = ""; gLastLoopVol = -1.0; } playTrig(string snd, float vol) { if (snd == "") return; // Clamp volume if (vol < 0.0) vol = 0.0; if (vol > 1.0) vol = 1.0; if (llGetInventoryType(snd) != INVENTORY_SOUND) return; // Throttle identical rapid-fire triggers (prevents ugly echo spam) integer now = llGetUnixTime(); if (snd == gLastTrigSnd && (now == gLastTrigTime)) return; gLastTrigSnd = snd; gLastTrigTime = now; llTriggerSound(snd, vol); } default { state_entry() { // Safety: relays should not drift or collide llSetStatus(STATUS_PHYSICS, FALSE); llSetStatus(STATUS_PHANTOM, TRUE); llSetAlpha(0.0, ALL_SIDES); if (gListen) llListenRemove(gListen); gListen = llListen(CH_IASR_CMD, "", NULL_KEY, ""); } on_rez(integer p) { p = 0; llResetScript(); } listen(integer channel, string name, key id, string msg) { name = ""; id = NULL_KEY; if (channel != CH_IASR_CMD) return; // Commands: // MODE|Attract // MODE|Famine // MODE|Hunger // MODE|Feast // VOL|0.5 // STOP // KILL list parts = llParseString2List(msg, ["|"], []); string cmd = llToUpper(llList2String(parts, 0)); if (cmd == "KILL") { llDie(); return; } if (cmd == "STOP") { stopLoop(); return; } if (cmd == "VOL") { float v = (float)llList2String(parts, 1); if (v < 0.0) v = 0.0; if (v > 1.0) v = 1.0; gVol = v; // Update loop volume (best we can do is restart loop at new vol) if (gMode != "") playLoop(gMode, gVol); return; } // Backward compat: MODE|TrackName if (cmd == "MODE") { string snd = llList2String(parts, 1); if (snd == "") return; float useVol = DEFAULT_VOL; if (gVol > 0.0) useVol = gVol; playLoop(snd, useVol); return; } // Explicit loop command: LOOP|TrackName|Vol if (cmd == "LOOP") { string snd = llList2String(parts, 1); float v = (float)llList2String(parts, 2); if (snd == "") return; playLoop(snd, v); return; } // One-shot SFX: TRIG|SoundName|Vol if (cmd == "TRIG") { string snd = llList2String(parts, 1); float v = (float)llList2String(parts, 2); if (snd == "") return; playTrig(snd, v); return; } } }