SPACE-NERDS-IN-SPACE(6)

๐Ÿ“ฆ version 1.1.1, in nixos 26.05, nixpkgs unstable

๐ŸŽ€ NAME ๐ŸŽ€

okay so this is the manual page for SPACE-NERDS-IN-SPACE(6), and the main character is snis_client โ€” a Multi player cooperative star ship bridge simulator (client). ๐Ÿ’ซ

๐ŸŒˆ SYNOPSIS ๐ŸŒˆ

snis_client [ OPTIONS ]

๐Ÿš€ DESCRIPTION ๐Ÿš€

snis_client` is the client process for the game Space Nerds In Space, which is a multiplayer starship bridge simulator. The server process simulates the game universe and processes input data from client processes and sends updated game state information to client processes. ๐Ÿ›ฐ๏ธ

The serverhost parameter is the hostname of the host running the ssgl_server game lobby process. The shipname parameter is the name of the ship in the game universe to which the client should connect (if the ship does not exist, one is created). The password is the password for the ship in the game.

๐Ÿšจ Security tea: this is an insecure "password", transmitted in plaintext. Not encrypted, not cute, not private.

The first client on a ship establishes a ship name and password, subsequent clients join the ship. (Mistyping either the shipname or the password will result in a new ship being created with the wrong name/password.) ๐Ÿ˜ญ


๐Ÿ“ Examples ๐Ÿ“

  • Ordinary invocation:
snis_client
  • Connect to a remote ssgl_server, start up in fullscreen mode, and skip the process launcher screen:
snis_client --lobbyhost mycloudserver.example.com --fullscreen \
     --no-launcher
  • Connect to a remote bare snis_server instance on port 20000 with no lobby and no snis_multiverse:
snis_client --nolobby --no-launcher --starship Enterprise \
     --pw tribbles -s myserver.example.com -p 20000

๐Ÿ’… OPTIONS ๐Ÿ’…

okay bestie, here is the whole flag menu โ€” yes, all of it, no skipping. ๐Ÿซถ

  • --acknowledgments โ€” Prints out acknowledgments and license information and exits. ๐Ÿ“œ
  • -r x:y, --aspect-ratio x:y โ€” Specify a requested aspect ratio. By default, the window manager is queried to determine the display dimensions, and the aspect ratio is made to match. Other arbitrary aspect ratios may be specified. This may be desirable if you have a display that is significantly different from the display the game was designed on (16:9). Common aspect ratios (circa 2015) are 5:4, 4:3, 16:10 and 16:9 (according to wikipedia). The values specified for x and y must be integers greater than zero and must be separated by a comma or a colon. Specifying an aspect ratio will disable the --fullscreen option. > โš ๏ธ Note: you may experience some problems with widget and text placement with aspect ratios significantly different than 16:9.
  • -A, --allroles โ€” This snis_client should be able to display all roles. ๐Ÿ‘‘
  • -C, --comms โ€” Request this client process support the COMMS (communication) role. ๐Ÿ’ฌ
  • --debug โ€” Request this client process support the DEBUG role. ๐Ÿ›
  • -E, --engineering โ€” Request this client process support the ENGINEERING role. ๐Ÿ”ง
  • -f, --fullscreen โ€” Use the full display, with no window borders. This option is ignored if the --aspect-ratio option is also specified. ๐Ÿ–ฅ๏ธ
  • -j joystick-device, --joystick joystick-device โ€” Specify the joystick device file to use. Typically something like /dev/input/by-id/something-or-other. ๐Ÿ•น๏ธ
  • -J, --projector โ€” Request this client support the PROJECTOR role. ๐Ÿ“ฝ๏ธ
  • -M, --main โ€” Request this client process support the MAIN SCREEN role. ๐ŸŒŸ
  • -m m, --monitor m โ€” If your system has multiple monitors, the --monitor option allows you to specify which one you want to use. It takes an integer argument, with 0 being the first monitor, 1 being the second, etc. The default monitor may be designated by -1 (or by omitting the --monitor option entirely). > ๐Ÿ’€ NOTE: this option is broken since snis_client was converted from GTK2 to SDL2.
  • -N, --navigation โ€” Request this client process support the NAVIGATION role. ๐Ÿงญ
  • -l hostname, --lobbyhost hostname โ€” Specify the hostname or IP address of the machine running the ssgl_server game lobby. ๐Ÿ 
  • -L, --nolobby โ€” Do not use the lobby server. This option requires that the --serverport and --serverhost options be used and that the --lobbyhost option is not used. It also requires that the --starship and --pw options be used as the network setup screen will be skipped. It also requires that the snis_server you will be connecting to was started with the --port and --nolobby options. ๐Ÿšซ
  • --no-launcher โ€” Suppress the SNIS process launcher screen that appears when snis_client starts up. If you are only running the snis_client, and other processes are all on another machine, what appears on the launcher screen is superfluous. If you are using the snis_launcher script to start SNIS processes it uses this flag when starting SNIS client, as snis_launcher can do everything the snis_client launcher screen can do and more. ๐Ÿ™ˆ
  • --no-textures โ€” Do not load all the ordinarily used textures. Instead load the same small texture for every texture in the game. This can be useful when running stations that do not use textures on memory constrained systems. (E.g. NAV, ENGINEERING, DAMAGE CONTROL, SCIENCE and COMMS). This can save approximately 400Mb of memory usage. ๐Ÿ“
  • -S, --science โ€” Request this client process support the SCIENCE role. ๐Ÿ”ฌ
  • -s host, --serverhost host โ€” Specify the hostname of the server to contact. This option requires the --nolobby and --serverport options are also used, and requires that the --lobbyhost option is not used. ๐ŸŒ
  • -p portnumber, --serverport portnumber โ€” Specify the portnumber of the snis_server process. This option requires the --nolobby and --serverhost options are also used, and requires that the --lobbyhost option is not used. ๐Ÿ”Œ
  • -n shipname, --starship shipname โ€” Specifies the name of your space ship. The shipname together with the password identify your space ship. ๐Ÿš€
  • -P password, --pw password โ€” Specifies the password to be used to connect to a snis_server process. ๐Ÿ”‘
  • --solarsystem solarsystem โ€” Load the specified solarsystem assets instead of the default assets. These are defined by "$SNIS_ASSET_DIR/solarsystems/*/assets.txt". ๐ŸŒŒ
  • -g, --NAT-ghetto-mode โ€” In the event that snis_client cannot connect to snis_server using the IP addresses it gets from ssgl_server, take a wild guess that the reason is because of NAT, and take another wild guess that the snis_server process is probably running on the same host as the lobby server, and just use the lobby server's IP address, but the port number from ssgl_server, on the theory that it will work because of port forwarding. ๐Ÿ•ต๏ธ
  • -a, --soundserver โ€” Request this client process support the SOUNDSERVER role. ๐Ÿ”Š
  • --auto-download-assets โ€” Automatically download art assets from spacenerdsinspace.com. โฌ‡๏ธ
  • -W, --weapons โ€” Request this client process support the WEAPONS role. ๐Ÿ’ฅ
  • -v, --version โ€” Print the program's version number and exit. ๐Ÿท๏ธ
  • -q, --quickstart โ€” Allows connecting to the first entry in ssgl_server automatically. This option is deprecated and will likely be removed soon. > ๐Ÿซ  deprecated era, bestie.
  • -t, --trap-nans โ€” This option is for debugging floating point problems, and will cause the program to trap (crash) on divide by zero, invalid or overflow conditions instead of propagating NaN (not-a-number) values through floating point calculations. ๐Ÿ’€
  • -x, --no-splash-screen โ€” Suppress the splash screen on start up. ๐Ÿ™…โ€โ™€๏ธ
  • -y number โ€” Requested aspect ratio y dimension. This option is deprecated and will likely be removed. > ๐Ÿซ  also deprecated, no cap.

๐ŸŒธ ENVIRONMENT VARIABLES ๐ŸŒธ

  • SNIS_ASSET_DIR โ€” if set controls the directory from which sounds and 3D models are read. By default, "share/snis" is used. ๐Ÿ“
  • SNIS_COLORS โ€” if set, the file $SNIS_ASSET_DIR/$SNIS_COLORS is read to obtain color information instead of reading the default file of $SNIS_ASSET_DIR/user_colors.cfg Additionally, if $SNIS_ASSET_DIR/custom_user_colors.cfg exists it will be read instead of over user_colors.cfg, as the latter is in danger of being overwritten by software updates. ๐ŸŽจ
  • SNIS_SUPPRESS_RENDER_TO_TEXTURE โ€” if set, suppresses the use of OpenGL's render to texture feature even if the driver claims to support it. ๐Ÿงš
  • SNIS_SUPPRESS_MSAA โ€” if set, suppresses the use of OpenGL's MSAA feature even if the driver claims to support it. โœจ
  • SNIS_SUPPRESS_RENDER_TO_FBO โ€” if set, suppresses the use of OpenGL's render to fbo feature even if the driver claims to support it. ๐Ÿฆ‹
  • SNIS_AUDIO_DEVICE โ€” if set, manually selects an audio device. Ordinarily a default device is chosen. This variable allows the default device to be overridden. This value should be an integer between 0 and the number of sound devices you have minus one. You can see which audio devices you have by running "aplay -l", or "pactl list". Note: Text-to-Speech functionality (e.g. "the computer" within the game) will not honor SNIS_AUDIO_DEVICE as text to speech is implemented by an external program (either pico2wave (plus play or aplay) or espeak) which figures out which sound device to use on its own. ๐ŸŽง

๐ŸŽ€ FILES ๐ŸŽ€

  • $XDG_DATA_HOME/space-nerds-in-space is a directory used to store various user defaults. If $XDG_DATA_HOME is not set, $HOME/.local/share is assumed. Old versions of snis_client would use ~/.space-nerds-in-space. See https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html ๐Ÿ“‚
  • $XDG_DATA_HOME/space-nerds-in-space/default_ship_name.txt This file preserves the ship name field between runs so that you do not have to re-type it each time in the login screen. ๐Ÿšข
  • $XDG_DATA_HOME/space-nerds-in-space/role_defaults.txt This file preserves the selected roles between runs so that you do not have to fill in the checkboxes each time in the login screen. โœ…
  • $XDG_DATA_HOME/space-nerds-in-space/snis_ui_position_offsets.txt This file preserves positions of UI elements if the user moves them and saves them. ๐Ÿ“Œ
  • $SNIS_ASSET_DIR/sounds/*.ogg, various audio files used by the game. ๐ŸŽต
  • $SNIS_ASSET_DIR/models/*.stl, various 3D models used by the game. ๐ŸงŠ
  • $SNIS_ASSET_DIR/solarsystems/*/assets.txt, per-solarsystem art assets. ๐ŸŒ 
  • $SNIS_ASSET_DIR/replacement_assets.txt โ€” the glow-up file ๐Ÿ’… it lets you swap standard assets for your own. Each line holds exactly two filenames, separated by any combination of spaces and tabs. First filename = the original asset file name, e.g. ./share/snis/models/cruiser.stl, second filename = the replacement asset file, e.g. ./share/snis/models/my_fancy_model.obj. Comments beginning with # and blank lines are permitted, so annotate away bestie.

Ok but listen, rn this asset replacement system only works for textures, ship models and sounds โ€” no cap. And note that replacement models should be similarly scaled and oriented as the original models. Normally the orientation should be such that the positive X axis is forward and the positive Y axis is up. Some models may deviate from this (e.g. snis3006.obj) and have some compensation applied via ship_types.txt. Replacement models should have the same deviation in orientation. โœจ

Note: likely this system does not yet work well when SNIS_ASSET_DIR has a value that deviates from the default. ๐Ÿ™ˆ
  • $SNIS_ASSET_DIR/joystick_config.txt and $SNIS_ASSET_DIR/custom_joystick_config.txt โ€” the joystick configuration files, your controller's whole personality ๐ŸŽฎ If custom_joystick_config.txt exists, it will be used, otherwise joystick_config.txt will be used. If you wish to customize the joystick configuration, you should start by copying joystick_config.txt to custom_joystick_config.txt and modify the latter. Like, important: the joystick_config.txt file is in danger of being overwritten by software updates, while custom_joystick_config.txt is not. Protect your work, queen ๐Ÿ‘‘.

The format of these files are as follows.

  • A device: line begins the configuration for a new device (i.e. a particular kind of joystick). The device names on the device: lines are regular expressions which should match the names of the devices as they appear in /dev/input/by-id/*.
  • A "mode" is a name or a number that refers to a terminal (screen) in the game. The modes are described in comments in the joystick config file example below.
  • An axis line defines how an axis is to be interpreted for the current (last specified) device by mapping the axis to a "function" (defined below). Optionally, an axis may also specify a deadzone value (default is 6000), a range in the axis which will have no effect. If you do not want a deadzone (as is common for throttle controls), specify the deadzone as 0.
  • A button line defines how a button is to be interpreted for the current (last specified) device by mapping the button to a "function" (defined below).
  • A "function" is one of several predefined words:
yaw, roll, pitch, phaser, torpedo, missile, weapons-yaw, weapons-pitch,
damcon-pitch, damcon-roll, throttle, warp, weapons-wavelength, damcon-gripper,
nav-engage-warp, nav-standard-orbit, nav-docking-magnets,
nav-attitude-indicator-abs-rel, nav-starmap, nav-reverse, nav-lights,
nav-nudge-warp-up, nav-nudge-warp-down, nav-nudge-zoom-up, nav-nudge-zoom-down,
weapons-wavelength-up, weapons-wavelength-down, nav-change-pov, eng-preset-1,
eng-preset-2, eng-preset-3, eng-preset-4, eng-preset-5, eng-preset-6,
eng-preset-7, eng-preset-8, eng-preset-9, eng-preset-10, eng-shield-toggle,
eng-deploy-flare, left-arrow, right-arrow, up-arrow, down-arrow, sci-left-arrow,
sci-right-arrow, sci-up-arrow, sci-down-arrow, sci-next-target, sci-prev-target,
cycle-station-forward, cycle-station-backward

And here's the example file in all its glory, verbatim, comments and all ๐Ÿซถ:

#
# Joystick config file for Space Nerds In Space
# The code that reads this file is in joystick_config.c
#
# If you add any new joystick configs to this file, please
# consider forwarding the new config to stephenmcameron@gmail.com
#
# The modes are as follows:
# (See DISPLAYMODE_* #defines in snis_packet.h)
#
# mode main - main screen
# mode navigation - navigation
# mode weapons - weapons
# mode engineering - engineering
# mode science - science
# mode comms - comms
# mode demon - demon screen
# mode damcon - damage control
# mode all - all screens
#
# Instead of names, you may also use numbers
#
# mode 0 # means the same as mode main
# mode 1 # means the same as mode navigation
# mode 2 # means the same as mode weapons
# mode 3 # means the same as mode engineering
# mode 4 # means the same as mode science
# mode 5 # means the same as mode comms
# mode 6 # means the same as mode demon
# mode 7 # means the same as mode damcon
# mode 9 # means the same as mode all
#
# You can set the mode by itself, or on lines that also set axis or button functions.
# Once a mode is set, it remains in effect until you change it again.
#
device:usb-ยฉMicrosoft_Corporation_Controller_05EB4AD-joystick
 # main screen
 mode main axis 3 roll
 mode main axis 4 pitch
 mode main axis 0 yaw
 mode 0 button 3 phaser
 mode 0 button 2 torpedo
 mode navigation
   axis 3 roll
   axis 4 pitch
   axis 0 yaw
 mode weapons
   axis 3 weapons-yaw
   axis 4 weapons-pitch
   axis 0 weapons-yaw
 mode damcon
   axis 3 damcon-roll
   axis 4 damcon-pitch
   button 1 damcon-gripper
   button 0 damcon-gripper
 mode 2 button 3 phaser
 mode 2 button 2 torpedo
device:usb-Thrustmaster_TWCS_Throttle-joystick
 # main screen
 mode 0 axis 2 throttle 0
 mode 0 axis 5 yaw
 # navigation
 mode 1 axis 2 throttle 0
 mode 1 axis 5 yaw
 # weapons
 mode 2 axis 5 weapons-yaw
 mode 2 axis 5 damcon-roll
device:usb-Thrustmaster_T.16000M-joystick
 # main screen
 mode 0 axis 0 roll
 mode 0 axis 1 pitch
 mode 0 axis 2 yaw
 mode 0 button 0 phaser
 mode 0 button 1 torpedo
 # navigation
 mode 1 axis 0 roll
 mode 1 axis 1 pitch
 mode 1 axis 2 yaw
 # weapons
 mode 2 axis 0 weapons-yaw # yaw, not roll, weapons doesn't have roll
 mode 2 axis 1 weapons-pitch
 mode 2 axis 2 weapons-yaw
 mode 2 button 0 phaser
 mode 2 button 1 torpedo
 # damcon
 mode 7 button 1 damcon-gripper
 mode 7 button 0 damcon-gripper
 mode 7 axis 0 damcon-roll
 mode 7 axis 1 damcon-pitch
 mode 7 axis 2 damcon-roll

Kind of a lot, I know, but like โ€” all of this is still somewhat preliminary and the format of this file will likely change ๐Ÿ˜ญ so don't get too attached to it.

  • /dev/input/by-id/* โ€” the joystick device nodes. That's where the device: regexes go looking ๐Ÿ”
  • /dev/input/event5 โ€” the rumble effect device. Yes, it rumbles. Iconic.
  • /tmp/snis-natural-language-fifo โ€” a named pipe which the client reads from. Anything sent into this pipe is forwarded to snis_server as a natural language request. This is useful for sending the output of a speech recognition system to snis_server. So like, you can literally just talk to your spaceship ๐Ÿ—ฃ๏ธ๐Ÿ’ซ
  • /tmp/snis-demon-fifo โ€” a named pipe which the client reads from. Anything sent into this pipe is forwarded to snis_server as a command to be run on the demon screen. Spooky little pipe, love that for it ๐Ÿ’€
  • $XDG_DATA_HOME/space-nerds-in-space/snis-keymap.txt โ€” the keyboard remapping configuration file โŒจ๏ธ

The format of the keyboard remapping file is as follows:

Lines beginning with a # are comments.

Key mappings are defined by lines of the form map stationlist key action

Valid actions are:

none, down, up, left, right, torpedo, transform,
fullscreen, thrust, quit, pause, reverse,
mainscreen, navigation, weapons, science,
damage, debug, demon, f8, f9, f10, onscreen,
viewmode, zoom, unzoom, phaser, rendermode,
keyrollleft, keyrollright, keyschiball_yawleft,
keysciball_yawright, keysciball_pitchup,
keysciball_pitchdown, keysciball_rollright,
keysciball_rollleft, key_invert_vertical,
key_toggle_frame_stats, key_camera_mode, key_page_up,
key_page_down, key_toggle_space_dust,
key_sci_mining_bot, key_sci_tractor_beam,
key_sci_waypoints, key_sci_lrs, key_sci_srs,
key_sci_details, key_weap_fire_missile,
key_space, key_robot_gripper, key_demon_console,
key_toggle_external_camera, key_increase_warp,
key_decrease_warp, key_increase_impulse,
key_decrease_impulse, key_engage_warp, keyreverse,
key_docking_magnets, key_exterior_lights, key_standard_orbit,
key_starmap, key_sci_next_target, key_sci_prev_target

Valid keys are: a-z, A-Z, 0-9, and most printable characters. Keypad numerals 0-9 may be specified as kp_0 through kp_9, and function keys f1 through f12 can be specified f1 through f12 (obviously). In addition the following strings may be used to specify the corresponding keys:

space       enter         return   backspace    delete
pause       scrolllock    escape   sysreq       left
right       up            down     kp_home      kp_down
kp_up       kp_left       kp_right kp_end       kp_delete
kp_insert   home          down     end          delete
insert

stationlist is a comma separated list of stations for which the action and key should be associated. Valid station names are as follows:

mainscreen,
navigation,
weapons,
engineering,
science,
comms,
demon,
damcon,
fonttest,
introscreen,
lobbyscreen,
connecting,
connected,
network_setup,

Additionally, the word all may be used to indicate the key-action assocation should be in effect on all stations. One word and it's everywhere, main character energy fr ๐Ÿ‘‘

  • $SNIS_ASSET_DIR/custom_user_colors.cfg โ€” if it exists, allows customizing of the colors of nearly all UI elements ๐ŸŽจ If it does not exist, $SNIS_ASSET_DIR/user_colors.cfg is used. If you wish to customize the colors, start by copying user_colors.cfg to custom_user_colors.cfg. The file contains comments describing its format. In brief, there are three types of lines:
    • A comment is a line beginning with a # or containing only whitespace, and is ignored.
    • A color line begins with the word color, which is followed by a user supplied name (eg: purple) then a space, then a color definition which is a # followed by 2 hex digits for each of red, green and blue, so, for example:
color purple #ff00ff
  • Finally, lines to change the colors of ui-components are of the form:
ui-component color

where ui-component is a 'magic word' identifying one of the ui components (see comments in $SNIS_ASSET_DIR/user_colors.cfg) and color is either a word defined in a prior color line, or else a color specification of the form #rrggbb where r, g, and b are hex digits. For example:

nav-button purple
nav-slider #00ff00

Custom hex colors, in my UI? It's giving art school, it's giving aesthetic, it's giving slay ๐ŸŒˆ๐Ÿ’…

โœจ SEE ALSO โœจ

okay bestie, when you're done here, go peek at these other pages โ€” they're literally the rest of the friend group:


๐Ÿ€ GOOD LUCK ๐Ÿ€

You'll need it.

likeโ€ฆ genuinely. godspeed, babe. ๐Ÿ˜ญ๐Ÿ’…

๐Ÿ‘‘ AUTHOR ๐Ÿ‘‘

Written by Stephen M. Cameron. (An icon, fr fr. ๐Ÿซถ)


okay that's the whole page! it's filed under snis_client, dated MARCH 2025, and it's the SPACE-NERDS-IN-SPACE(6) manual page. mwah ๐Ÿ’–โœจ

๐Ÿ“ฆ where this page comes from