diff --git a/applications/extcom-tgbuds.lsl b/applications/extcom-tgbuds.lsl new file mode 100644 index 0000000..884189e --- /dev/null +++ b/applications/extcom-tgbuds.lsl @@ -0,0 +1,74 @@ +/* + * External Communications Program + */ + +#include +#define CLIENT_VERSION "0.0.1" +#define CLIENT_VERSION_TAGS "alpha 1" + +#define C_EARBUDS 1313 +#define LN_EARBUDS 4 + +integer hearing_state = 1; +integer language_state = 1; + +integer earbuds_state = 0; + +main(integer src, integer n, string m, key outs, key ins, key user) { + if (n == SIGNAL_INVOKE) { + list argv = split(m, " "); + integer argc = count(argv); + string cmd = gets(argv, 1); + string output_msg = ""; + if (argc == 1 || cmd == "help") { + output_msg = "Syntax: " + PROGRAM_NAME + " "; + } else if (cmd == "refresh") { + output_msg = "Refreshing earbuds..."; + if (earbuds_state) { + linked(LN_EARBUDS, C_EARBUDS, "EARMUFFS_ON", user); + } else { + linked(LN_EARBUDS, C_EARBUDS, "EARMUFFS_OFF", user); + } + } else { + output_msg = "Unknown command \"" + cmd + "\"."; + } + + if(output_msg != "") + print(outs, user, output_msg); + } else if (n == SIGNAL_NOTIFY) { + list argv = delitem(splitnulls(m, " "), 0); + integer ci = count(argv); + while (ci > 0) { + ci -= 2; + string cmd = gets(argv, ci); + string status = gets(argv, ci + 1); + if (cmd == "hearing") { + hearing_state = (status == "y"); + } + } + #ifdef DEBUG + echo("[" + PROGRAM_NAME + "] received notify from " + (string)src + ", user " + (string)user + ": [" + concat(argv, ", ") + "]"); + #endif + + if (hearing_state && earbuds_state) { + linked(LN_EARBUDS, C_EARBUDS, "EARMUFFS_OFF", user); + earbuds_state = 0; + } else if (!hearing_state && !earbuds_state) { + linked(LN_EARBUDS, C_EARBUDS, "EARMUFFS_ON", user); + earbuds_state = 1; + } + } else if (n == SIGNAL_INIT) { + #ifdef DEBUG + echo("[" + PROGRAM_NAME + "] init event"); + #endif + hearing_state = 1; + language_state = 1; + earbuds_state = 0; + } else if (n == SIGNAL_UNKNOWN_SCRIPT) { + echo("[" + PROGRAM_NAME + "] failed to run '" + m + "' (kernel could not find the program specified)"); + } else { + echo("[" + PROGRAM_NAME + "] unimplemented signal " + (string)n + ": " + m); + } +} + +#include diff --git a/applications/extcom.lsl b/applications/extcom.lsl new file mode 100644 index 0000000..dc86510 --- /dev/null +++ b/applications/extcom.lsl @@ -0,0 +1,99 @@ +/* + * External Communications Program + */ + +#include +#define CLIENT_VERSION "0.0.1" +#define CLIENT_VERSION_TAGS "alpha 1" + +#define C_UNHEARING 20538 +#define LN_UNHEARING 4 + +#define UH_CLEAR 0 +#define UH_GARBLE 1 +#define UH_DEAF 2 + +integer hearing_state = 1; +integer language_state = 1; + +integer unhearing_state = UH_CLEAR; + +main(integer src, integer n, string m, key outs, key ins, key user) { + if (n == SIGNAL_INVOKE) { + list argv = split(m, " "); + integer argc = count(argv); + string cmd = gets(argv, 1); + string output_msg = ""; + if (argc == 1 || cmd == "help") { + output_msg = "Syntax: " + PROGRAM_NAME + " "; + } else if (cmd == "dictionary") { + linked(LN_UNHEARING, C_UNHEARING, "dictionary", user); + } else if (cmd == "refresh") { + @refresh_start; + output_msg = "Refreshing externals..."; + if (unhearing_state == UH_CLEAR) { + linked(LN_UNHEARING, C_UNHEARING, "on:ARES", user); + } else if (unhearing_state == UH_GARBLE) { + linked(LN_UNHEARING, C_UNHEARING, "garble:ARES", user); + } else if (unhearing_state == UH_DEAF) { + linked(LN_UNHEARING, C_UNHEARING, "off:ARES", user); + } else { + // Something went wrong, reset. + unhearing_state = UH_CLEAR; + jump refresh_start; + } + } else { + output_msg = "Unknown command \"" + cmd + "\"."; + } + + if(output_msg != "") + print(outs, user, output_msg); + } else if (n == SIGNAL_NOTIFY) { + list argv = delitem(splitnulls(m, " "), 0); + integer ci = count(argv); + while (ci > 0) { + ci -= 2; + string cmd = gets(argv, ci); + string status = gets(argv, ci + 1); + if (cmd == "hearing") { + hearing_state = (status == "y"); + } else if (cmd == "language") { + language_state = (status == "y"); + } + } + #ifdef DEBUG + echo("[" + PROGRAM_NAME + "] received notify from " + (string)src + ", user " + (string)user + ": [" + concat(argv, ", ") + "]"); + #endif + + if (hearing_state) { + if (language_state) { + if (unhearing_state != UH_CLEAR) { + linked(LN_UNHEARING, C_UNHEARING, "on:ARES", user); + unhearing_state = UH_CLEAR; + } + } else { + if (unhearing_state != UH_GARBLE) { + linked(LN_UNHEARING, C_UNHEARING, "garble:ARES", user); + unhearing_state = UH_GARBLE; + } + } + } else { + if (unhearing_state != UH_DEAF) { + linked(LN_UNHEARING, C_UNHEARING, "off:ARES", user); + unhearing_state = UH_DEAF; + } + } + } else if (n == SIGNAL_INIT) { + #ifdef DEBUG + echo("[" + PROGRAM_NAME + "] init event"); + #endif + hearing_state = 1; + language_state = 1; + } else if (n == SIGNAL_UNKNOWN_SCRIPT) { + echo("[" + PROGRAM_NAME + "] failed to run '" + m + "' (kernel could not find the program specified)"); + } else { + echo("[" + PROGRAM_NAME + "] unimplemented signal " + (string)n + ": " + m); + } +} + +#include diff --git a/applications/subsys.lsl b/applications/subsys.lsl new file mode 100644 index 0000000..9e2e7d7 --- /dev/null +++ b/applications/subsys.lsl @@ -0,0 +1,146 @@ +/* + * Subsystem Status Notifications Program + * + * Duplicates a fair amount of _power, not for redistribution. + */ + +#define DEBUG + +#include +#define CLIENT_VERSION "0.0.1" +#define CLIENT_VERSION_TAGS "alpha 1" + +integer power_on = 1; +integer sys_state = 0xFFFFFFFF; +integer forbidden_state = 0; +integer masked_state = 0; +string power_systems = "{}"; +string power_system_names = "{}"; + +integer C_LIGHTS = NOWHERE; + +update_state() { + string s_status = llLinksetDataRead("status"); + sys_state = (integer)getjs(s_status, ["state"]); + power_on = (integer)getjs(s_status, ["on"]); + forbidden_state = (integer)getjs(s_status, ["forbidden"]); + masked_state = 0; + + if (!power_on) { + // Power off - all subsystems will be off, and light bus will be messaged. + // No need to continue update. + #ifdef DEBUG + echo("Powered off, no subsystems to check"); + #endif + return; + } + + integer psi = 0; + string ps; + + while ((ps = getjs(power_systems, [(string)psi])) != JSON_INVALID) { + integer system_forbidden = (forbidden_state & (1 << psi)) != 0; + integer system_enabled = (sys_state & (1 << psi)) != 0; + + if (system_forbidden) { + // System forbidden + if (system_enabled) { + // System forbidden, but status reports enabled. + // Shouldn't happen, sanity check just in case. + sys_state = sys_state & ~(1 << psi); + } + } else if (system_enabled) { + // System enabled + list psreqs = js2list(getjs(ps, ["req"])); + integer psri = count(psreqs); + while (psri--) { + integer psreq = geti(psreqs, psri); + if (!(sys_state & (1 << psreq)) || ((forbidden_state & (1 << psreq)) != 0)) { + // Requirement disabled or forbidden, system masked. + sys_state = sys_state & ~(1 << psi); + masked_state = masked_state | (1 << psi); + jump psribrk; + } + } + @psribrk; + } // else | System disabled + + ++psi; + } + + if (C_LIGHTS == NOWHERE) { + echo("[" + PROGRAM_NAME + "] light bus channel not set"); + return; + } + + list light_msg = ["subsys", sys_state, masked_state, forbidden_state]; + io_tell(NULL_KEY, C_LIGHTS, concat(light_msg, " ")); +} + +main(integer src, integer n, string m, key outs, key ins, key user) { + #ifdef DEBUG + echo("[" + PROGRAM_NAME + "] signal " + (string)n + ": " + m); + #endif + if (n == SIGNAL_INVOKE) { + list argv = split(m, " "); + integer argc = count(argv); + string cmd = gets(argv, 1); + string output_msg = ""; + if (argc == 1 || cmd == "help") { + output_msg = "Syntax: " + PROGRAM_NAME + " "; + } else if (cmd == "query") { + // send current status without updating + list light_msg = ["subsys", sys_state, masked_state, forbidden_state]; + io_tell(NULL_KEY, C_LIGHTS, concat(light_msg, " ")); + } else { + output_msg = "Unknown command \"" + cmd + "\"."; + } + + if(output_msg != "") + print(outs, user, output_msg); + } else if (n == SIGNAL_NOTIFY) { + list argv = splitnulls(m, " "); + string cmd = gets(argv, 1); + if (cmd == "update") { + update_state(); + } + #ifdef DEBUG + else { + echo("[" + PROGRAM_NAME + "] unrecognised notify " + m); + } + #endif + } else if (n == SIGNAL_INIT) { + #ifdef DEBUG + echo("[" + PROGRAM_NAME + "] init event"); + #endif + + if (llGetAttached()) { + C_LIGHTS = 105 - (integer)("0x" + substr(avatar, 29, 35)); + } else { + C_LIGHTS = 105 - (integer)("0x" + substr(KERNEL, 29, 35)); + } + + string s_power = llLinksetDataRead("power"); + power_systems = getjs(s_power, ["system"]); + + integer psi = 0; + string ps = ""; + while ((ps = getjs(power_systems, [(string)psi])) != JSON_INVALID) { + string psname = getjs(ps, ["name"]); + power_system_names = setjs(power_system_names, [psname], (string)psi); + ++psi; + } + + #ifdef DEBUG + echo("[" + PROGRAM_NAME + "] (DEBUG) available subsystems: " + (string)psi); + #endif + + update_state(); + } else if (n == SIGNAL_UNKNOWN_SCRIPT) { + echo("[" + PROGRAM_NAME + "] failed to run '" + m + "' (kernel could not find the program specified)"); + } else { + echo("[" + PROGRAM_NAME + "] unimplemented signal " + (string)n + ": " + m); + } +} + +#include diff --git a/config/sysmap-indicator.cfg b/config/sysmap-indicator.cfg new file mode 100644 index 0000000..4aec357 --- /dev/null +++ b/config/sysmap-indicator.cfg @@ -0,0 +1,6 @@ +# +video 0x00000002 1 0 +hearing 0x00000020 6 0 +lidar 0x00000004 2 0 +language 0x00800000 7 0 +optics 0x00000010 4 0 diff --git a/config/sysmap.cfg b/config/sysmap.cfg new file mode 100644 index 0000000..8429e05 --- /dev/null +++ b/config/sysmap.cfg @@ -0,0 +1,25 @@ +# +base 0x00000001 0 0 +video 0x00000002 1 0 +lidar 0x00000004 2 0 +hud 0x00000008 3 0 +optics 0x00000010 4 0 +hearing 0x00000020 6 0 +identify 0x00000040 5 0 +radio 0x00000080 0 1 +location 0x00000100 1 1 +teleport 0x00000200 2 1 +receive 0x00000400 3 1 +transmit 0x00000800 4 1 +wifi 0x00001000 5 1 +motors 0x00002000 6 1 +locomotion 0x00004000 0 2 +athletics 0x00008000 1 2 +flight 0x00010000 2 2 +reach 0x00020000 3 2 +voice 0x00040000 4 2 +speech 0x00080000 5 2 +amplifier 0x00100000 6 2 +mind 0x00200000 7 2 +finemotors 0x00400000 7 1 +language 0x00800000 7 0 diff --git a/db/local.db b/db/local.db new file mode 100644 index 0000000..229bca5 --- /dev/null +++ b/db/local.db @@ -0,0 +1,52 @@ +# ARES CUSTOMIZATIONS - UNIT SETTINGS +# Last updated: 2026-01-23 +# Keep all of your customizations in this file and back it up before version updates. You may rename it if you wish. +# Look through the other ".db" files to find settings you want to alter, and copy them into here. +# The manual includes some hints as to what many settings do. http://support.nanite-systems.com/?id=2832 +# To load, run the system command @db load local.db + +# useful sound: "475b270a-8dc0-2b53-210d-32d4dc6ebc7c" is silence + +# change #RLV path: +env.rlv ~ARES + +# SILENCE, MARKER +env.marker-female 475b270a-8dc0-2b53-210d-32d4dc6ebc7c +env.marker-male 475b270a-8dc0-2b53-210d-32d4dc6ebc7c +env.marker-neuter 475b270a-8dc0-2b53-210d-32d4dc6ebc7c +persona.marker 475b270a-8dc0-2b53-210d-32d4dc6ebc7c 475b270a-8dc0-2b53-210d-32d4dc6ebc7c 475b270a-8dc0-2b53-210d-32d4dc6ebc7c + +# set lighting colors: +id.color.0 0.612001 0.175943 0.970192 +id.color.1 0.983944 0.629795 0.753035 +id.color.2 0.962978 0.301208 0.255559 +id.color.3 0.368628 0.960784 0.996079 + +id.scheme.meow ["0.612001 0.175943 0.970192","0.983944 0.629795 0.753035","0.962978 0.301208 0.255559","0.368628 0.960784 0.996079"] + +# change name and model: +id.name Livie +id.serial CX/S 44-5137 +id.model CX/S + +# it might be helpful to save your interface height settings: +interface.height 985 +interface.height-mlook 1004 + +# block public bus charging (except from your seat and your attachments): +power.induction.local 1 +power.induction.remote 0 + +# YEET THE AUTOMOUNTS +DELETE fs.source.ns-persona +DELETE fs.source.setup + +# do some settings +id.gender.physical ["female","she","her","her","hers","herself"] +id.gender.mental ["inanimate","it","it","its","its","itself"] +id.gender.voice f +input.censored /me beepboops +sexuality.anorgasmia 0 +hardware.controller.volume.master 0.5 +hardware.controller.volume.marker 0 +hardware.controller.volume.announcer 0.5 diff --git a/db/subsys.db b/db/subsys.db new file mode 100644 index 0000000..ed031de --- /dev/null +++ b/db/subsys.db @@ -0,0 +1,230 @@ +# power.system.[].flag - used by subsys for external panels + +power.system [] + +power.system.0 {} +power.system.0.name base +power.system.0.notify _power base ? +power.system.0.req [] +power.system.0.draw 30 +power.system.0.flag 0x00000001 + +power.system.1 {} +power.system.1.name video +power.system.1.notify _power video ? +power.system.1.req [0] +power.system.1.draw 20 +power.system.1.flag 0x00000002 + +power.system.2 {} +power.system.2.name lidar +power.system.2.notify _power lidar ? +power.system.2.req [0] +power.system.2.draw 10 +power.system.2.flag 0x00000004 + +power.system.3 {} +power.system.3.name hud +power.system.3.notify _power hud ? +power.system.3.req [0,1] +power.system.3.draw 5 +power.system.3.flag 0x00000008 + +power.system.4 {} +power.system.4.name optics +power.system.4.notify _power optics ? +power.system.4.req [0,1] +power.system.4.draw 50 +power.system.4.flag 0x00000010 + +power.system.5 {} +power.system.5.name hearing +power.system.5.notify extcom hearing ? +power.system.5.req [0] +power.system.5.draw 10 +power.system.5.flag 0x00000020 + +power.system.6 {} +power.system.6.name identify +power.system.6.rlv showhovertextworld=?,shownametags=? +power.system.6.req [0,1,4] +power.system.6.draw 20 +power.system.6.flag 0x00000040 + +power.system.7 {} +power.system.7.name radio +power.system.7.req [0] +power.system.7.draw 30 +power.system.7.flag 0x00000080 + +power.system.8 {} +power.system.8.name location +power.system.8.rlv showworldmap=?,showminimap=?,showloc=? +power.system.8.notify nav location ? +power.system.8.req [0,7] +power.system.8.draw 5 +power.system.8.flag 0x00000100 + +power.system.9 {} +power.system.9.name teleport +power.system.9.rlv tplocal=?,tplm=?,tploc=?,sittp=?,tplure=? +power.system.9.notify nav teleport ? +power.system.9.req [0,2,7,8] +power.system.9.draw 120 +power.system.9.flag 0x00000200 + +power.system.10 {} +power.system.10.name receive +power.system.10.rlv recvim=? +power.system.10.req [0,7] +power.system.10.draw 10 +power.system.10.flag 0x00000400 + +power.system.11 {} +power.system.11.name transmit +power.system.11.rlv sendim=?,startim=? +power.system.11.req [0,7] +power.system.11.draw 10 +power.system.11.flag 0x00000800 + +power.system.12 {} +power.system.12.name wifi +power.system.12.notify _power wifi ? +power.system.12.req [0,7] +power.system.12.draw 10 +power.system.12.flag 0x00001000 + +power.system.13 {} +power.system.13.name motors +power.system.13.rlv touchworld=? +power.system.13.notify _power motors ? +power.system.13.req [0] +power.system.13.draw 60 +power.system.13.flag 0x00002000 + +power.system.14 {} +power.system.14.name locomotion +power.system.14.rlv sit=? +power.system.14.notify _power locomotion ? +power.system.14.req [0,13] +power.system.14.draw 40 +power.system.14.flag 0x00004000 + +power.system.15 {} +power.system.15.name athletics +power.system.15.rlv temprun=?,alwaysrun=? +power.system.15.req [0,13,14] +power.system.15.draw 30 +power.system.15.flag 0x00008000 + +power.system.16 {} +power.system.16.name flight +power.system.16.rlv fly=? +power.system.16.req [0,13,14] +power.system.16.draw 50 +power.system.16.flag 0x00010000 + +power.system.17 {} +power.system.17.name reach +power.system.17.rlv touchfar:3=? +power.system.17.req [0,13] +power.system.17.draw 20 +power.system.17.flag 0x00020000 + +power.system.18 {} +power.system.18.name voice +power.system.18.notify _input voice ? +power.system.18.req [0] +power.system.18.draw 20 +power.system.18.flag 0x00040000 + +power.system.19 {} +power.system.19.name speech +power.system.19.rlv chatnormal=? +power.system.19.notify _input speech ? +power.system.19.req [0,13,18] +power.system.19.draw 20 +power.system.19.flag 0x00080000 + +power.system.20 {} +power.system.20.name amplifier +power.system.20.rlv chatshout=? +power.system.20.notify _input amplifier ? +power.system.20.req [0,13,18,19] +power.system.20.draw 30 +power.system.20.flag 0x00100000 + +power.system.21 {} +power.system.21.name mind +power.system.21.rlv sendchat=? +power.system.21.notify _input mind ? +power.system.21.req [0,18] +power.system.21.draw 70 +power.system.21.flag 0x00200000 + +power.system.22 {} +power.system.22.name finemotors +power.system.22.rlv touchattach=? +power.system.22.req [0,13] +power.system.22.draw 20 +power.system.22.flag 0x00400000 + +power.system.23 {} +power.system.23.name language +power.system.23.notify extcom language ? +power.system.23.req [0,5] +power.system.23.draw 30 +power.system.23.flag 0x00800000 + +#power.system.24 {} +#power.system.24.name inventory +#power.system.24.rlv +#power.system.24.req [0] +#power.system.24.draw 10 + +#power.system.25 {} +#power.system.25.name drones +#power.system.25.rlv +#power.system.25.req [0] +#power.system.25.draw 20 + +#power.system.26 {} +#power.system.26.name wrenches +#power.system.26.rlv +#power.system.26.req [0] +#power.system.26.draw 10 + +# ----------------------------------- + +m:power {} +m:power.desc power control +m:power.p menu +m:power.e [] +m:power.e.0 ["base",2,"power base toggle","status.state|0"] +m:power.e.1 ["video",2,"power video toggle","status.state|1"] +m:power.e.2 ["LiDAR",2,"power lidar toggle","status.state|2"] +m:power.e.3 ["HUD",2,"power hud toggle","status.state|3"] +m:power.e.4 ["optics",2,"power optics toggle","status.state|4"] +m:power.e.5 ["hearing",2,"power hearing toggle","status.state|5"] +m:power.e.6 ["language",2,"power language toggle","status.state|23"] +m:power.e.7 ["face detect",2,"power identify toggle","status.state|6"] +m:power.e.8 ["main radio",2,"power radio toggle","status.state|7"] +m:power.e.9 ["GPS (location)",2,"power location toggle","status.state|8"] +m:power.e.10 ["FTL (teleport)",2,"power teleport toggle","status.state|9"] +m:power.e.11 ["receive IMs",2,"power receive toggle","status.state|10"] +m:power.e.12 ["transmit IMs",2,"power transmit toggle","status.state|11"] +m:power.e.13 ["net devices",2,"power wifi toggle","status.state|12"] +m:power.e.14 ["all motors",2,"power motors toggle","status.state|13"] +m:power.e.15 ["fine motors",2,"power finemotors toggle","status.state|22"] +m:power.e.16 ["walking",2,"power locomotion toggle","status.state|14"] +m:power.e.17 ["running",2,"power athletics toggle","status.state|15"] +m:power.e.18 ["flight",2,"power flight toggle","status.state|16"] +m:power.e.19 ["reach",2,"power reach toggle","status.state|17"] +m:power.e.20 ["allow talking",2,"power voice toggle","status.state|18"] +m:power.e.21 ["talk volume",2,"power speech toggle","status.state|19"] +m:power.e.22 ["shout volume",2,"power amplifier toggle","status.state|20"] +m:power.e.23 ["mind",2,"power mind toggle","status.state|21"] +m:power.e.24 ["power profiles...",1,"m:profile"] +m:power.e.25 ["back",1,"m:main"] + + diff --git a/hardware/debug.lsl b/hardware/debug.lsl new file mode 100644 index 0000000..d6b22d9 --- /dev/null +++ b/hardware/debug.lsl @@ -0,0 +1,95 @@ +//-------------------------------------------------------------------------- +// BEGIN config + +#define USE_LIGHTS +#define USE_PUBLIC +#define USE_ACS + +// END config +//-------------------------------------------------------------------------- +// BEGIN macros + +#define listen_on(_h, _ch) llListenRemove(_h); _h = llListen(_ch, "", NULL_KEY, "") + +// END macros +//-------------------------------------------------------------------------- +// BEGIN includes + +#include +#include + +// END includes +//-------------------------------------------------------------------------- +// BEGIN globals + +#ifdef USE_LIGHTS +integer L_LIGHTS = 0; +integer C_LIGHTS = 0; +#endif +#ifdef USE_PUBLIC +integer L_PUBLIC = 0; +integer C_PUBLIC = -9999999; +#endif +#ifdef USE_ACS +integer L_ACS = 0; +integer C_ACS = 360; +#endif + +key avatar = NULL_KEY; + +// END globals +//-------------------------------------------------------------------------- +// BEGIN functions + +init() { + avatar = llGetOwner(); + +#ifdef USE_LIGHTS + C_LIGHTS = 105 - (integer)("0x" + substr(avatar, 29, 35)); + listen_on(L_LIGHTS, C_LIGHTS); +#endif +#ifdef USE_PUBLIC + listen_on(L_PUBLIC, C_PUBLIC); +#endif +#ifdef USE_ACS + listen_on(L_ACS, C_ACS); +#endif +} // init() + +// END functions +//-------------------------------------------------------------------------- +// BEGIN main + +default { + state_entry() { + init(); + } // state_entry() + + on_rez(integer n) { + init(); + } // on_rez(...) + + listen(integer cc, string src, key id, string msg) { +#ifdef USE_LIGHTS + if (cc == C_LIGHTS) { + if (substr(msg, 0, 5) != "power ") { + echo("recv (light bus) from " + src + " (" + (string)id + "): " + msg); + } + } // if (cc == C_LIGHTS) +#endif +#ifdef USE_PUBLIC + if (cc == C_PUBLIC) { + echo ("recv (public bus) from " + src + " (" + (string)id + "):" + msg); + } +#endif +#ifdef USE_ACS + if (cc == C_ACS) { + echo("recv (ACS) from " + src + " (" + (string)id + "): " + msg); + } +#endif + } // listen(...) + +} // state default + +// END main +//-------------------------------------------------------------------------- diff --git a/hardware/indicators.lsl b/hardware/indicators.lsl new file mode 100644 index 0000000..4f242fb --- /dev/null +++ b/hardware/indicators.lsl @@ -0,0 +1,397 @@ +// init flow -> init() -> populate_link_nums() -> dataserver -> finalize_init() + +//-------------------------------------------------------------------------- +// BEGIN config + +// use flags +//#define USE_BOLTS +//#define USE_VERBOSE + +#define DEVICE_VERSION "0.1" +#define DEVICE_NAME "indicators" + +// lights +#define MAX_GLOW 0.3 +#define FULLBRIGHT_ON_GLOW +#define OFF_DAMP_FACTOR 0.4 +#define MASKED_TINT_FACTOR 0.5 + +#define INDICATOR_LINK_NAME "icon" +#define TOUCHABLE_LINK_NAME "glass" + +#define TEXTURE_TILES 8 + +// END config +//-------------------------------------------------------------------------- +// BEGIN macros + +#define color_parse(_argv) <(float)gets(_argv, 1), (float)gets(argv, 2), (float)gets(argv, 3)> +#define add_device(_id, _ch) tell(_id, _ch, "add " + DEVICE_NAME) + +// END macros +//-------------------------------------------------------------------------- +// BEGIN includes + +#include +#include + +// END includes +//-------------------------------------------------------------------------- +// BEGIN globals + +key config_query = NULL_KEY; +integer config_cur_line = 0; +string config_nc_name = "config"; +key config_nc_key = NULL_KEY; + +list system_names = []; +list system_flags = []; +list system_texcoords = []; + +list ind_links = []; +list touch_links = []; + +integer L_CAPS = 0; +integer L_LIGHTS = 0; + +#define C_CAPS 411 +integer C_LIGHTS = 0; + +integer power_on = 1; +integer broken = 0; +float gap = 0; + +vector color = <1, 1, 1>; +vector color2 = <1, 1, 1>; +vector color3 = <1, 1, 1>; +vector color4 = <1, 1, 1>; + +integer sys_state = 0xFFFFFFFF; +integer masked_state = 0; +integer forbidden_state = 0; + +key avatar = NULL_KEY; +key controller = NULL_KEY; + +// END globals +//-------------------------------------------------------------------------- +// BEGIN functions + +set_tint(integer link, integer side, vector tint, vector repeats, vector offsets, float glow) { + #ifdef FULLBRIGHT_ON_GLOW + integer fullbright = 0; + if (glow > 0) { + fullbright = 1; + } + #endif + + setp(link, [ + PRIM_COLOR, side, tint, 1, + PRIM_GLOW, side, glow, + #ifdef FULLBRIGHT_ON_GLOW + PRIM_FULLBRIGHT, side, fullbright, + #endif + PRIM_GLTF_BASE_COLOR, side, "", repeats, offsets, 0, llsRGB2Linear(tint), 1, PRIM_GLTF_ALPHA_MODE_OPAQUE, 0.5, 0, + PRIM_GLTF_NORMAL, side, "", repeats, offsets, 0, + PRIM_GLTF_METALLIC_ROUGHNESS, side, "", repeats, offsets, 0, 1, 1, + PRIM_GLTF_EMISSIVE, side, "", repeats, offsets, 0, llsRGB2Linear(tint) + ]); +} + +update_colors(float level) { + if (level < 0) { + level = 0; + } + if (level > 1) { + level = 1; + } + + integer sysi = count(system_names); + float tex_scale = 1.0 / TEXTURE_TILES; + vector repeats = ; + + while (sysi--) { + integer l = geti(ind_links, sysi); + string name = gets(system_names, sysi); + integer flag = geti(system_flags, sysi); + vector texcoord = getv(system_texcoords, sysi); + #ifdef USE_VERBOSE + echo("Updating sysi " + (string)sysi + ": link " + (string)l + ", system " + name + ", flag " + (string)flag + ", with offset " + (string)texcoord); + #endif + if (!l || !strlen(name) || !flag || texcoord == ZERO_VECTOR) { + #ifdef USE_VERBOSE + echo("Invalid, skipping " + (string)sysi + "..."); + #endif + jump sysicontinue; + } + + if (power_on) { + if (forbidden_state & flag) { + // System forbidden + set_tint(l, ALL_SIDES, color * OFF_DAMP_FACTOR, repeats, texcoord * tex_scale, 0); + } else if (masked_state & flag) { + // System requirements unmet + set_tint(l, ALL_SIDES, color3 * level * MASKED_TINT_FACTOR, repeats, texcoord * tex_scale, level * MAX_GLOW); + } else if (sys_state & flag) { + // System enabled + set_tint(l, ALL_SIDES, color * level, repeats, texcoord * tex_scale, level * MAX_GLOW); + } else { + // System disabled explicitly + set_tint(l, ALL_SIDES, color3 * level, repeats, texcoord * tex_scale, level * MAX_GLOW); + } + } else { + set_tint(l, ALL_SIDES, color * OFF_DAMP_FACTOR, repeats, texcoord * tex_scale, 0); + } + + @sysicontinue; + } +} + +integer get_prim_count() { + if (llGetAttached()) { + return llGetNumberOfPrims(); + } + + return llGetObjectPrimCount(llGetKey()); +} // get_prim_count() + +populate_link_nums() { + ind_links = []; + touch_links = []; + integer i = get_prim_count(); + string link_name; + for (; i > 0; i--) { + link_name = llGetLinkName(i); + if (strpos(link_name, INDICATOR_LINK_NAME) != -1) { + ind_links += i; + } + if (strpos(link_name, TOUCHABLE_LINK_NAME) != -1) { + touch_links += i; + } + } // for (...) + + #ifdef USE_VERBOSE + echo("Found " + (string)count(ind_links) + " icons, with " + (string)count(touch_links) + " touchable links"); + #endif +} // populate_link_nums() + +init() { + avatar = llGetOwner(); + controller = NULL_KEY; + + populate_link_nums(); + + power_on = 1; + + key nc = llGetInventoryKey(config_nc_name); + if (nc == config_nc_key && nc != NULL_KEY) { + // No config change. + finalize_init(); + return; + } + system_names = []; + system_flags = []; + system_texcoords = []; + config_nc_key = nc; + config_cur_line = 0; + if (config_nc_key == NULL_KEY) { + echo("No config found, cannot start"); + return; + } + config_query = llGetNotecardLine(config_nc_name, config_cur_line); +} + +finalize_init() { + #ifdef USE_VERBOSE + echo("Found " + (string)count(system_names) + " configured systems to track, finalizing"); + #endif + update_colors(1); + + // Called from dataserver once config is read. + C_LIGHTS = 105 - (integer)("0x" + substr(avatar, 29, 35)); + llListenRemove(L_LIGHTS); + L_LIGHTS = llListen(C_LIGHTS, "", NULL_KEY, ""); + + llListenRemove(L_CAPS); + L_CAPS = llListen(C_CAPS, "", NULL_KEY, ""); + + add_device(avatar, C_LIGHTS); +} + +// END functions +//-------------------------------------------------------------------------- +// BEGIN main + +default { + state_entry() { + init(); + } // state_entry() + + on_rez(integer n) { + init(); + } // on_rez(...) + + changed(integer chg) { + if (chg & CHANGED_INVENTORY) { + init(); + } + if (chg & CHANGED_OWNER) { + init(); + } + if (chg & CHANGED_LINK) { + init(); + } + } + + dataserver(key qid, string data) { + if (qid == config_query) { + if (data == EOF) { + echo("Config reloaded."); + finalize_init(); + } else { + // line + if (substr(data, 0, 0) == "#") { + #ifdef USE_VERBOSE + echo("Skipping comment in config: " + data); + #endif + jump confignextline; + } + list cl = split(data, " "); + if (count(cl) != 4) { + echo("Invalid line in config: " + data); + jump confignextline; + } + system_names += gets(cl, 0); + system_flags += geti(cl, 1); + system_texcoords += ; + + #ifdef USE_VERBOSE + echo("Registered system " + concat(cl, " ")); + #endif + + @confignextline; + config_query = llGetNotecardLine(config_nc_name, ++config_cur_line); + } + } + } + + listen(integer cc, string src, key id, string msg) { + if (cc == C_CAPS) { + if (substr(msg, 0, 4) == "info ") { + integer rc = (integer)delstring(msg, 0, 4); + tell(id, rc, "hwc " + jsobject([ + "vendor", "Cat Conspiracy", + "version", DEVICE_VERSION, + "purpose", "info", + "channel", jsobject(["caps", C_CAPS, "lights", C_LIGHTS]), + "private", 0, + "busy", 0, + "usable", power_on, + "health", 1.0, + "info", "http://localhost:8080/" + ])); + } // if (cmd == "info") + } // if (cc == C_CAPS) + else if (cc == C_LIGHTS) { + list argv = split(msg, " "); + string cmd = gets(argv, 0); + + switch (cmd) { + case "off": + power_on = 0; + gap = 0; + update_colors(1); + break; + case "on": + power_on = 1; + if (broken) { + gap = 0.05; + } else { + gap = 0; + } + update_colors(1); + break; +#ifdef USE_BOLTS + case "bolts": + if (gets(argv, 1) == "on") { + echo("@detach=n"); + } else if (gets(argv, 1) == "off") { + echo("@detach=y"); + } + break; +#endif + case "broken": + gap = 0.05; + broken = 1; + break; + case "fixed": + gap = 0; + broken = 0; + update_colors(1); + break; + case "color": + color = color_parse(argv); + update_colors(1); + break; + case "color-2": + color2 = color_parse(argv); + update_colors(1); + break; + case "color-3": + color3 = color_parse(argv); + update_colors(1); + break; + case "color-4": + color4 = color_parse(argv); + update_colors(1); + break; + case "name": + llSetObjectName(concat(delrange(argv, 0, 0), " ") + " (" + DEVICE_NAME + ")"); + case "probe": + add_device(id, C_LIGHTS); + break; + case "add-confirm": + controller = id; + tell(id, C_LIGHTS, "color-q"); + tell(id, C_LIGHTS, "command " + (string)avatar + " " + (string)avatar + " subsys query"); + break; + case "subsys": + #ifdef USE_VERBOSE + echo("Received " + msg); + #endif + sys_state = geti(argv, 1); + masked_state = geti(argv, 2); + forbidden_state = geti(argv, 3); + update_colors(1); + break; + case "power": + break; + case "rate": + break; + default: +#ifdef USE_VERBOSE + echo("Unhandled light bus (" + src + "): " + msg); +#endif + break; + } // switch (cmd) + + llSetTimerEvent(gap); + } // if (cc == C_LIGHTS) + } // listen(...) + + timer() { + if (!broken) { + return; + } + + float t = 1; + if (llFrand(1.0) < 0.1) { + t = llFrand(0.2); + } + + update_colors(t); + } // timer() +} // state default + +// END main +//-------------------------------------------------------------------------- diff --git a/light_sync.lsl b/hardware/light_sync.lsl similarity index 100% rename from light_sync.lsl rename to hardware/light_sync.lsl diff --git a/minimal_panel.lsl b/hardware/minimal_panel.lsl similarity index 92% rename from minimal_panel.lsl rename to hardware/minimal_panel.lsl index 57a6749..b120c3d 100644 --- a/minimal_panel.lsl +++ b/hardware/minimal_panel.lsl @@ -30,7 +30,6 @@ #define color_parse(_argv) <(float)gets(_argv, 1), (float)gets(argv, 2), (float)gets(argv, 3)> #define add_device(_id, _ch) tell(_id, _ch, "add " + PANEL_DEVICE_NAME) -#define try_add_port(_id, _ch, _port, _link) if (_link != LINK_THIS) tell(_id, _ch, "port " + _port + " " + (string)llGetLinkKey(_link)) #define GAUGE_SRC_Q GAUGE_SRC + "-q" @@ -300,13 +299,7 @@ default { integer touched_link = llDetectedLinkNumber(n); if (touched_link == LN_POWER_BUTTON) { - if(power_on) { - tell(controller, C_LIGHTS, "command " + (string)user + " " + (string)user + " power off"); - llTriggerSound("88af7a41-10e7-06ad-799e-313cbbe0ffad", 1); - } else { - tell(controller, C_LIGHTS, "command " + (string)user + " " + (string)user + " power on"); - llTriggerSound("dccca2d0-b50c-e069-a1f9-c3336249421d", 1); - } + tell(controller, C_LIGHTS, "auth " + PANEL_DEVICE_NAME + " " + (string)user); } } } // touch_end(...) @@ -395,11 +388,11 @@ default { tell(id, C_LIGHTS, GAUGE_SRC_Q); // Ports - /*try_add_port(id, C_LIGHTS, "power", LN_PLUG_POWER); - try_add_port(id, C_LIGHTS, "audio-in", LN_PLUG_AUDIO1); - try_add_port(id, C_LIGHTS, "audio-out", LN_PLUG_AUDIO2); - try_add_port(id, C_LIGHTS, "data-1", LN_PLUG_DATA1); - try_add_port(id, C_LIGHTS, "data-2", LN_PLUG_DATA2);*/ + update_port("power", avatar, 0); + update_port("audio-in", avatar, 0); + update_port("audio-out", avatar, 0); + update_port("data-1", avatar, 0); + update_port("data-2", avatar, 0); tell(id, C_LIGHTS, "port power " + (string)llGetKey()); tell(id, C_LIGHTS, "port audio-in " + (string)llGetKey()); tell(id, C_LIGHTS, "port audio-out " + (string)llGetKey()); @@ -426,6 +419,19 @@ default { case "port-disconnect": update_port(gets(argv, 1), id, 0); break; + case "accept": + key user = getk(argv, 1); + if(power_on) { + tell(controller, C_LIGHTS, "command " + (string)user + " " + (string)user + " power off"); + llTriggerSound("88af7a41-10e7-06ad-799e-313cbbe0ffad", 1); + } else { + tell(controller, C_LIGHTS, "command " + (string)user + " " + (string)user + " power on"); + llTriggerSound("dccca2d0-b50c-e069-a1f9-c3336249421d", 1); + } + break; + case "denyaccess": + tell(getk(argv, 1), 0, "Access denied."); + break; default: #ifdef USE_VERBOSE echo("Unhandled light bus (" + src + "): " + msg); diff --git a/interface-std-icons.as b/interface-std-icons.as new file mode 100644 index 0000000..1670525 --- /dev/null +++ b/interface-std-icons.as @@ -0,0 +1,91 @@ +echo Loading interface preset; this may take a minute. +input say !working loading theme... +xset width = interface.width +xset height = interface.height +xset ratio = interface.ratio +if $ratio < 0.1 then jump fail +if $width > 1 then jump width-set + set width = height * ratio + echo Inferring screen width is $width px +@width-set: +db interface.sound.go bd99a429-e579-0367-57c7-5dda70605ad0 +db interface.sound.deny edf4ea86-3472-6c85-ad0c-c9b154c86f5d +db interface.sound.act ad78297b-25a7-ba88-65b3-bfecb20f50a8 +db interface.sound.menu-open 5724f680-4c89-110f-4ab5-fd4e0d48e44c +db interface.sound.menu-close b3a1c106-c602-fba6-895e-e9b440d78c86 +db interface.sound.shield-down 348fcd3d-7993-54fb-720c-c5ebc42de505 +db interface.sound.env-alarm 5db9d9d6-6eda-485e-6436-e97dfdc1983c +db interface.sound.damage d248834e-ae0d-a844-8a98-de6cdaa67760 +db interface.sound.repair 5b93518c-2a6d-baef-3fc2-ee3af6cf74a4 +db interface.sound.alert 83f5fcc7-3084-853c-8402-218b0f45abd2 +db interface.sound.alert-dismiss 08d80c61-8c9e-3a3b-7855-4f8d17ccc791 +db interface.sound.test 971afde2-73e2-5dd8-6c8a-6c7ee25c7411 +db interface.compass {"enabled":1,"texture":"59e91121-24d6-4b75-a8fb-86b5d7884d05"} +db interface.gauges {"backdrop":"b6be113e-ca8a-5dd5-ae62-d98a594f9af7","left":"6c1677da-3269-a749-375b-ea4c58e6dbc4","mode":1,"right":"5dc5becd-fd4a-4bb5-fb67-4689ec5621be"} +db interface.altimeter {"enabled":1,"texture":"a7a40d18-dad2-a0c9-f4c5-eef2f269b0f4"} +db interface.speedometer.enabled 1 +db interface.crosshair 6 +db interface.crosshairs 78408016-021a-df86-1e54-045cee3a13bd +db interface.sitrep {"enabled":1,"texture":"df7e2139-5292-55f9-ec1f-fe98f62db80e"} +db interface.working.texture 37ae2327-ca45-b943-e576-e3f167d9ac5a +db interface.combat {"labels":"14d62124-1a1e-adfe-9801-198c5b8b445a","nums":"94b0deff-7902-167f-36cd-0d2cff968da3"} +# db interface.boot {"animate":1,"size":"<512, 256, 0>","texture":"8c3988a5-decd-24b9-0065-941ecfb74a4d"} +db interface.boot {"animate":0,"size":"<1024,1024,0>","texture":"73627ff7-145a-3336-074d-4efcde686388"} +db interface.target 73f90096-3965-de9e-00d3-b2cae5c9df6d +db interface.alert.texture 221f5de6-28c6-c475-1344-599a61f197cb +db interface.menu {"anchor":"3b9b2508-4b6b-e194-5be5-18d6d75fcc2e","backdrop":"df7d6401-b07f-aedc-e250-018fbc54b7e4","mode":1} +db interface.font murky-truth +db display.warning.texture 61050423-80d6-89f4-b753-9a762693788c +db display.warning.mode 2 +db display.devices.texture 23c806b8-b923-971c-765e-10cdebec7aa6 +set device-scale = 2 +if $height > 1600 then set device-scale = 4 +if $height < 900 then set device-scale = 1 +db display.devices.scale $device-scale +set device-scale %undefined +db display.devices.mode 1 +db display.devices.wires 1 +db interface.gauges.badge.offset <0, 0, 0> +db interface.gauges.badge.scale 1 +db interface.color 4 +db interface.altimeter.offset <0, 380, 0> +db interface.speedometer.offset <0, 408, -226> +set x = $width \ 2.5 +set y = $height \ 2.5 +db interface.alert.offset <0, $x, $y> +set y = $height \ 2 - 34 +db interface.compass.offset <0, 0, $y> +set x = $width \ 2 - 121 +db interface.sitrep.offset <0, $x, 237> +set y = 0 - $height \ 2 + 92 +db display.warning.offset <0, 0, $y> +set x = 0 - $width \ 3.5 +set y = $height \ 2 - 56 +db interface.menu.offset <0, $x, $y> +set y = 0 - $y +db interface.gauges.offset <0, 0, $y> +set y = $y + 64 +db interface.working.offset <0, -464, $y> +set x = 0 - $width \ 2 + 100 +db display.devices.offset <0, $x, -256> + +xset so = interface.sexuality.offset +if $so is %undefined then jump no_sexuality +set y = 0 - $height * 3 \ 8 + 14 +db interface.sexuality.offset <0, 0, $y> +@no_sexuality: +set so %undefined + +service interface restart +reset display +set x %undefined +set y %undefined +echo Interface preset loaded. +jump cleanup +@fail: + echo Could not determine screen width. Run Setup first. +@cleanup: + input say !done loading theme... + set width %undefined + set height %undefined + set ratio %undefined \ No newline at end of file diff --git a/persona/cat.p b/persona/cat.p new file mode 100644 index 0000000..fd60744 --- /dev/null +++ b/persona/cat.p @@ -0,0 +1,29 @@ +if $rlv is %undefined then set rlv ~ARES +persona set marker 475b270a-8dc0-2b53-210d-32d4dc6ebc7c 475b270a-8dc0-2b53-210d-32d4dc6ebc7c475b270a-8dc0-2b53-210d-32d4dc6ebc7c +persona set path $rlv/persona/cat +persona set action {} + +persona set action.yes Affirmative. +persona set action.no Negative. +persona set action.hi Mew there. +persona set action.bye See nya. +persona set action.ok Acknowledged. +persona set action.thanks Thanks nyuw. +persona set action.ready Ready. +persona set action.cannot This unit cannot comply. +persona set action.error An error has occurred. +persona set action.use This unit is available to assist. +persona set action.use? @say This unit offers \$pm.refl to assist. +persona set action.help This unit requires assistance. +persona set action.help? Do you require assistance? +persona set action.explain Please, elaborate. +persona set action.mind @say This unit cannot comply while \$pm.gen cortex is disabled. +persona set action.mew Mew.~ +persona set action.nya Nya.~ + +power load full +policy bolts off + +db set input.censored /me meowmeows + +kinematics Livie diff --git a/persona/pony.p b/persona/pony.p new file mode 100644 index 0000000..06fcbae --- /dev/null +++ b/persona/pony.p @@ -0,0 +1,37 @@ +if $rlv is %undefined then set rlv ~ARES +persona set marker 475b270a-8dc0-2b53-210d-32d4dc6ebc7c 475b270a-8dc0-2b53-210d-32d4dc6ebc7c 475b270a-8dc0-2b53-210d-32d4dc6ebc7c +persona set path $rlv/persona/pony +persona set action {} + +persona set action.y /me stomps once +persona set action.yes /me stomps once +persona set action.ok /me stomps once +persona set action.ready /me stomps once +persona set action.n /me stomps twice +persona set action.no /me stomps twice +persona set action.cannot /me stomps twice +persona set action.hi /me curtsies +persona set action.bye /me curtsies +persona set action.thanks /me curtsies +persona set action.nicker /me nickers +persona set action.whinny /me whinnies +persona set action.lol /me nickers +persona set action.blow /me blows +persona set action.fuck /me blows +persona set action.tired /me yawns +persona set action.yawn /me yawns +persona set action.squeal /me squeals +persona set action.scared /me squeals +persona set action.sigh /me sighs + +power flight off +power reach off +power amplifier off +power mind off + +power load pony +policy bolts on + +db set input.censored /me whinnies + +kinematics Stumpy