Files
Time-GreenandGitHub 64f76f52a9 Interface Science | The Mariana Trench of Feature Content (#95857)
## Interface Science

You know what the problem is with our features? They're all too easy,
too optimized to use. Look at Genetics; we went from a confusing UI that
a 14 year old hardcoded with html into byond to a polished UI using
tgui, optimized for player comfort, and gameplay has suffered. Too long
we have coddled players with fun and easy content, no more I say!!!

To fix ss13, I have added a feature with the most awful, unusable UI
ever. It's just wires with random sequences that may or may not do
something. And yet, you will use it till your fingers bleed and your
eyes go white, and you will be grateful. "Thank you coder daddy", you
say as you sacrifice yourself to a display of unending, procedurally
generated dogshit.

<img width="563" height="294" alt="image"
src="https://github.com/user-attachments/assets/e56c947f-a40c-4df9-beed-672812357576"
/>

Or maybe you're a sick little deviant, and you don't respect me. Instead
of using my awful UI, you start optimizing. You've forced the secret
pulse code, and you're not going to pulse them again and again. You make
your own interface by connecting it with signallers, or integrated
circuits. Ahhh, you beat me! Damn it, and you're gonna get away with it
too.

## About the Pull Request

Adds new job content to science. Science spawns with a few "gizmo"
devices and can order more through cargo. These gizmo's have random
functionalities, like the strange objects you can find in maintenance.
These functionalities come with different settings to change how they
operate.

However, there are no buttons, just wires or a voice interface. You need
to solve, for example, a wire puzzle. You just pulse the wires, and if
you hear ping the sequence is good, if you hear buzz its bad. Just keep
going till you hear a creak sound.

If you do a sequence correctly, there are a bunch of randomly generated
ways this interacts with the functionality, mimicking real life settings
and interactions. Imagine a TV remote with randomized buttons, and you
have to map them out again.

Once you've mapped the sequences, you can make an interface. For simple
ones, you can just make some signaller assemblies. For the best control,
you could connect it with a bunch of integrated circuit signallers, and
program sequences into an integrated circuit machine.

Below is a short video of how the puzzle solving works. (I can't be
arsed to figure out how to record tgui, here's a video I made with my
phone. Also I had the sequences written down, which I STRONGLY recommend
you do.)


https://github.com/user-attachments/assets/93f79f0f-df14-4ff9-8096-f079ebae7e91

<details>
  <summary>Actual details</summary>
  
I have hidden the details to make exploring the feature itself more fun.
The whole thing was written to be convoluted, but intuitive. You should
be able to hit it with a multitool, and figure out everything from
there. It will take a bit to get the gist of it.

Nonetheless, for review purposes I have written down the details here.
If you're reading this for non-review purposes, you should know I have
embedded an internet curse that will at some point in 2026 teleport you
2 meters in a random direction. Continue reading at your own discretion.

The gizmo objects is usually generated with 1 or 2 'gizmodes'.
'Gizmodes' contains the fun-ctionality, and holds different operating
modes (so dubbed 'gizpulse'). You can't directly select a gizpulse, but
instead it generates a bunch of mode selections.

For example, a function that toggles lights has two gizpulses: toggle_on
and toggle_off. There are four different mode selects:
Cycle mode: Adds signal to cycle to the next gizpulse, and to activate
the current gizpulse
Select mode: Adds a signal for selecting every gizpulse, and a signal to
activate whatever the activate gizpulse is
Direct activate mode: Adds a signal for selecting every gizpulse, and
also immediately activates that gizpulse
Cycle-active mode: Cycles to the next mode, and activates it
(inconvenient but only has 1 signal to worry about)

So a light gizmode with the randomly selected 'select mode' has three
signals: select toggle_on, select toggle_off and trigger the currently
selected gizpulse.

Currently implemented gizmodes:
- Lights: toggle on, toggle off
- Move: start moving, stop moving 
- Food printer (its filled with the spongebob grey goop thing): print
food (donut or burger)
- Mood pulser (AOE): happy pulse, sad pulse, radiation pulse
- Mopper: select different reagent, dump onto tile (1/2/3 range), make
smoke cloud
- Teleporter (5 to 15 tiles, random dir): Teleport self, teleport mobs
in range 1, do both
- Electric: charge from nearest cell (looks into objects and stuff),
magically gain some charge, make lightning, make emp, charge nearby
object, defibrillate in an area
- Copier (makes fake copies of mobs and objects, visual copy only): scan
objects, print objects, erase all copies
- Sputter: dump oil and shake, throw self
- Bad: explode, explode, explode harder, explode with fire, stab you,
warning, make robot spider, breaks your bones, throws a grenade at you,
radiation pulses
- Some behind the scenes gizmodes (language toggle for voice interface,
for example)

The voice interface starts with wires, with signals to toggle the
language or dump the code words. After that, you can talk to it using
the code words similarly to the wire sequence to solve the rest of the
gizmodes.

</details>

I've added two to every map, somewhere in or near the experimentor room.
They may ocassionally spawn from a maintenance crate spawner
<img width="611" height="331" alt="image"
src="https://github.com/user-attachments/assets/3782700f-57d3-4591-9282-e0de590056e1"
/>


## Why It's Good For The Game

It's really difficult to have "experimentation" type features in the
game. It all has to fit into 1h rounds, and people get used to it real
quick. The experimentor and strange objects kinda try, but it's just one
button and praying a bear doesnt spawn you explodes you.

I don't claim to have solved this perfectly, but I think this is fun.
You truly have to start experimenting, be systematic and write things
down. If you figure out how something works, you can go to the next
stage of making it more convenient to use. I think it's really fun to
mess around with integrated circuits and USB's, and make, for example, a
BCI controlled bluespace launchpad.

So I lean into it! There's different settings to account for, and its up
to you to make it usable! If you like integrated circuits, you'll love
this (maybe).

The gizmo functions are aimed at benefiting the station as a whole in
some ways, to motivate people to make some fun systems for these to get
maximum benefit! A mood pulser near a busy area will make everyone
happier! (I do need to add more like these, I got distracted doing
stupid shit.)
2026-05-23 18:59:25 +00:00

121 lines
4.4 KiB
Plaintext

/// from base of /datum/wires/proc/cut : (wire)
#define COMSIG_CUT_WIRE(wire) "cut_wire [wire]"
#define COMSIG_MEND_WIRE(wire) "mend_wire [wire]"
/// from base of /datum/wires/proc/on_pulse : (wire, mob/user)
#define COMSIG_PULSE_WIRE "pulse_wire"
// Directionality of wire pulses
/// The wires interact with their holder when pulsed
#define WIRES_INPUT (1<<0)
/// The wires have a reason to toggle whether attached assemblies are armed
#define WIRES_TOGGLE_ARMED (1<<1)
/// The wires only want to activate assemblies that do something other than (dis)arming themselves
#define WIRES_FUNCTIONAL_OUTPUT (1<<2)
/// The holder can both pulse its wires and be affected by its wires getting pulsed
#define WIRES_ALL (WIRES_INPUT | WIRES_TOGGLE_ARMED | WIRES_FUNCTIONAL_OUTPUT)
/// The assembly can pulse a wire it is attached to
#define ASSEMBLY_INPUT (1<<0)
/// The assembly toggles whether it will pulse the attached wire when it is pulsed by the attached wire
#define ASSEMBLY_TOGGLE_ARMED (1<<1)
/// The assembly does something other than just (dis)arming itself when it is pulsed by the wire it is attached to
#define ASSEMBLY_FUNCTIONAL_OUTPUT (1<<2)
/// The assembly can both pulse the wire it is attached to, and (dis)arms itself when pulsed by the wire
#define ASSEMBLY_TOGGLEABLE_INPUT (ASSEMBLY_INPUT | ASSEMBLY_TOGGLE_ARMED)
#define ASSEMBLY_ALL (ASSEMBLY_TOGGLEABLE_INPUT | ASSEMBLY_FUNCTIONAL_OUTPUT)
//retvals for attempt_wires_interaction
#define WIRE_INTERACTION_FAIL 0
#define WIRE_INTERACTION_SUCCESSFUL 1
#define WIRE_INTERACTION_BLOCK 2 //don't do anything else rather than open wires and whatever else.
#define WIRE_ACCEPT "Scan Success"
#define WIRE_ACTIVATE "Activate"
#define WIRE_LAUNCH "Launch"
#define WIRE_SAFETIES "Safeties"
#define WIRE_AGELIMIT "Age Limit"
#define WIRE_AI "AI Connection"
#define WIRE_ALARM "Alarm"
#define WIRE_AVOIDANCE "Avoidance"
#define WIRE_BACKUP1 "Auxiliary Power 1"
#define WIRE_BACKUP2 "Auxiliary Power 2"
#define WIRE_BEACON "Beacon"
#define WIRE_FEEDBACK "Feedback"
#define WIRE_BOLTS "Bolts"
#define WIRE_BOOM "Boom Wire"
#define WIRE_CAMERA "Camera"
#define WIRE_CONTRABAND "Contraband"
#define WIRE_DELAY "Delay"
#define WIRE_DENY "Scan Fail"
#define WIRE_DISABLE "Disable"
#define WIRE_DISARM "Disarm"
#define WIRE_ON "On"
#define WIRE_DROP "Drop"
#define WIRE_ITEM_TYPE "Item Type"
#define WIRE_CHANGE_MODE "Change Mode"
#define WIRE_ONE_PRIORITY_BUTTON "One Priority Button"
#define WIRE_THROW_RANGE "Throw Range"
#define WIRE_DUD_PREFIX "__dud"
#define WIRE_HACK "Hack"
#define WIRE_IDSCAN "ID Scan"
#define WIRE_INTERFACE "Interface"
#define WIRE_LAWSYNC "AI Law Synchronization"
#define WIRE_LIGHT "Lights"
#define WIRE_LIMIT "Limiter"
#define WIRE_LOADCHECK "Load Check"
#define WIRE_LOCKDOWN "Lockdown"
#define WIRE_MODE_SELECT "Mode Select"
#define WIRE_MOTOR1 "Motor 1"
#define WIRE_MOTOR2 "Motor 2"
#define WIRE_OPEN "Open"
#define WIRE_PANIC "Panic Siphon"
#define WIRE_POWER "Power"
#define WIRE_POWER1 "Main Power 1"
#define WIRE_POWER2 "Main Power 2"
#define WIRE_PRIZEVEND "Emergency Prize Vend"
#define WIRE_PROCEED "Proceed"
#define WIRE_RESET_MODEL "Reset Model"
#define WIRE_RESETOWNER "Reset Owner"
#define WIRE_UNRESTRICTED_EXIT "Unrestricted Exit"
#define WIRE_RX "Receive"
#define WIRE_SAFETY "Safety"
#define WIRE_SHOCK "High Voltage Ground"
#define WIRE_SIGNAL "Signal"
#define WIRE_SPEAKER "Speaker"
#define WIRE_STRENGTH "Strength"
#define WIRE_THROW "Throw"
#define WIRE_TIMING "Timing"
#define WIRE_TX "Transmit"
#define WIRE_UNBOLT "Unbolt"
#define WIRE_ZAP "High Voltage Circuit"
#define WIRE_ZAP1 "High Voltage Circuit 1"
#define WIRE_ZAP2 "High Voltage Circuit 2"
#define WIRE_OVERCLOCK "Overclock"
#define WIRE_EQUIPMENT "Equipment"
#define WIRE_ENVIRONMENT "Environment"
#define WIRE_LOOP_MODE "Loop mode"
#define WIRE_REPLAY_MODE "Replay mode"
#define WIRE_FIRE_DETECT "Automatic Detection"
#define WIRE_FIRE_TRIGGER "Alarm Trigger"
#define WIRE_FIRE_RESET "Alarm Reset"
// Wire states for the AI
#define AI_WIRE_NORMAL 0
#define AI_WIRE_DISABLED 1
#define AI_WIRE_HACKED 2
#define AI_WIRE_DISABLED_HACKED -1
#define MAX_WIRE_COUNT 17
// Cryptic wires for Interface Science
#define CRYPTIC_WIRE_1 "Cryptic Wire 1"
#define CRYPTIC_WIRE_2 "Cryptic Wire 2"
#define CRYPTIC_WIRE_3 "Cryptic Wire 3"
#define CRYPTIC_WIRE_4 "Cryptic Wire 4"
#define CRYPTIC_WIRE_5 "Cryptic Wire 5"
#define CRYPTIC_WIRE_6 "Cryptic Wire 6"
#define CRYPTIC_WIRE_7 "Cryptic Wire 7"
#define CRYPTIC_WIRE_8 "Cryptic Wire 8"