iuehsgorujdhzfnlkzudfjhawierfg

master
livie 2026-02-03 06:09:33 +02:00
parent 2366c40049
commit 731c64c691
14 changed files with 1300 additions and 13 deletions

View File

@ -0,0 +1,74 @@
/*
* External Communications Program
*/
#include <ARES/a>
#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 + " <action>";
} 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 <ARES/program>

99
applications/extcom.lsl Normal file
View File

@ -0,0 +1,99 @@
/*
* External Communications Program
*/
#include <ARES/a>
#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 + " <action>";
} 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 <ARES/program>

146
applications/subsys.lsl Normal file
View File

@ -0,0 +1,146 @@
/*
* Subsystem Status Notifications Program
*
* Duplicates a fair amount of _power, not for redistribution.
*/
#define DEBUG
#include <ARES/a>
#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 + " <action>";
} 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 <ARES/program>

View File

@ -0,0 +1,6 @@
# <name> <bit flag> <tex-x> <tex-y>
video 0x00000002 1 0
hearing 0x00000020 6 0
lidar 0x00000004 2 0
language 0x00800000 7 0
optics 0x00000010 4 0

25
config/sysmap.cfg Normal file
View File

@ -0,0 +1,25 @@
# <name> <bit flag> <tex-x> <tex-y>
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

52
db/local.db Normal file
View File

@ -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

230
db/subsys.db Normal file
View File

@ -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"]

95
hardware/debug.lsl Normal file
View File

@ -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 <utils.lsl>
#include <objects.lsl>
// 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
//--------------------------------------------------------------------------

397
hardware/indicators.lsl Normal file
View File

@ -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 <utils.lsl>
#include <objects.lsl>
// 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 = <tex_scale, tex_scale, 0>;
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 += <geti(cl, 2), geti(cl, 3), 1>;
#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
//--------------------------------------------------------------------------

View File

@ -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);

91
interface-std-icons.as Normal file
View File

@ -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

29
persona/cat.p Normal file
View File

@ -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

37
persona/pony.p Normal file
View File

@ -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