mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-18 11:36:24 +01:00
[MIRROR] tgui Preferences Menu + total rewrite of the preferences backend (#8153)
* tgui Preferences Menu + total rewrite of the preferences backend * nah, we dont need to ping those people * trying to remove the funny stuff * unmodularizing this * prefs reset * this may need to be reverted, who knows * okay, this part * perhaps * EEEEEEEEE * unsanitary * E * Stage 1 + loadout system * more fixes * E * I mean, it launches? * More fixes and reorganisation * E * customisation code is spaget. * disable ERP prefs * Update erp_preferences.dm * Update erp_preferences.dm * E * Slowly getting there * It may be time for help :) * tri...colors... help * preferences now pass preferences * Update dna.dm * Fuck this man * missing savefile return, set_species works, removed dumb stuff from updateappearance * https://github.com/Skyrat-SS13/Skyrat-tg/pull/8199 * https://github.com/Skyrat-SS13/Skyrat-tg/pull/8224 * https://github.com/tgstation/tgstation/pull/61519 * https://github.com/Skyrat-SS13/Skyrat-tg/pull/8278 * e * le butonAZARAK HELLO * hhh * Proper recognition where it's due, MrMelbert! * EEEE * examine block * Better gen hit sounds from whitedream * final loadout touches, more bug fixes im sure to come * i said there would be bugfixes * Update LoadoutManager.js * Missing preferences in the html menu * LIVE TESTING PHASE BABY * Update LoadoutManager.js * EEE * LAUNCH TEST FIRE * Update job.dm * Update new_player.dm * 50gb DAY ONE PATCH * EEE * Update preferences.dm * buggle fixes * Update examine.dm * >LOOC starts on Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com> Co-authored-by: jjpark-kb <55967837+jjpark-kb@users.noreply.github.com> Co-authored-by: Gandalf <jzo123@hotmail.com> Co-authored-by: Azarak <azarak10@gmail.com>
This commit is contained in:
+14
-16
@@ -137,31 +137,29 @@
|
||||
#define LIPS 5
|
||||
#define NOBLOOD 6
|
||||
#define NOTRANSSTING 7
|
||||
/// Used if we want the mutant colour to be only used by mutant bodyparts. Don't combine this with MUTCOLORS, or it will be useless.
|
||||
#define MUTCOLORS_PARTSONLY 8
|
||||
#define NOZOMBIE 9
|
||||
#define NOZOMBIE 8
|
||||
/// Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi)
|
||||
#define DIGITIGRADE 10
|
||||
#define NO_UNDERWEAR 11
|
||||
#define NOSTOMACH 12
|
||||
#define NO_DNA_COPY 13
|
||||
#define DRINKSBLOOD 14
|
||||
#define DIGITIGRADE 9
|
||||
#define NO_UNDERWEAR 10
|
||||
#define NOSTOMACH 11
|
||||
#define NO_DNA_COPY 12
|
||||
#define DRINKSBLOOD 13
|
||||
/// Use this if you want to change the race's color without the player being able to pick their own color. AKA special color shifting
|
||||
#define DYNCOLORS 15
|
||||
#define AGENDER 16
|
||||
#define DYNCOLORS 14
|
||||
#define AGENDER 15
|
||||
/// Do not draw eyes or eyeless overlay
|
||||
#define NOEYESPRITES 17
|
||||
#define NOEYESPRITES 16
|
||||
/// Used for determining which wounds are applicable to this species.
|
||||
/// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD)
|
||||
#define HAS_FLESH 18
|
||||
#define HAS_FLESH 17
|
||||
/// if we have bones (can suffer bone wounds)
|
||||
#define HAS_BONE 19
|
||||
#define HAS_BONE 18
|
||||
///If we have a limb-specific overlay sprite
|
||||
#define HAS_MARKINGS 20
|
||||
#define HAS_MARKINGS 19
|
||||
/// Do not draw blood overlay
|
||||
#define NOBLOODOVERLAY 21
|
||||
#define NOBLOODOVERLAY 20
|
||||
///No augments, for monkeys in specific because they will turn into fucking freakazoids https://cdn.discordapp.com/attachments/326831214667235328/791313258912153640/102707682-fa7cad80-4294-11eb-8f13-8c689468aeb0.png
|
||||
#define NOAUGMENTS 22
|
||||
#define NOAUGMENTS 21
|
||||
|
||||
//organ slots
|
||||
#define ORGAN_SLOT_ADAMANTINE_RESONATOR "adamantine_resonator"
|
||||
|
||||
@@ -103,8 +103,6 @@
|
||||
#define MAX_KEYPRESS_COMMANDLENGTH 16
|
||||
///Maximum keys that can be bound to one button
|
||||
#define MAX_COMMANDS_PER_KEY 5
|
||||
///Maximum keys per keybind
|
||||
#define MAX_KEYS_PER_KEYBIND 3
|
||||
///Max amount of keypress messages per second over two seconds before client is autokicked
|
||||
#define MAX_KEYPRESS_AUTOKICK 50
|
||||
///Length of held key buffer
|
||||
|
||||
@@ -189,3 +189,6 @@ GLOBAL_LIST_INIT(normal_employers, list(
|
||||
|
||||
/// Checks if the given mob is a head revolutionary.
|
||||
#define IS_HEAD_REVOLUTIONARY(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/rev/head))
|
||||
|
||||
/// The dimensions of the antagonist preview icon. Will be scaled to this size.
|
||||
#define ANTAGONIST_PREVIEW_ICON_SIZE 96
|
||||
|
||||
@@ -195,3 +195,6 @@
|
||||
#define COLOR_PRIDE_GREEN "#41FC66"
|
||||
#define COLOR_PRIDE_BLUE "#42FFF2"
|
||||
#define COLOR_PRIDE_PURPLE "#5D5DFC"
|
||||
|
||||
/// The default color for admin say, used as a fallback when the preference is not enabled
|
||||
#define DEFAULT_ASAY_COLOR COLOR_MOSTLY_PURE_RED
|
||||
|
||||
@@ -15,6 +15,25 @@
|
||||
#define CLOTH (1<<14)
|
||||
#define NUTS (1<<15)
|
||||
|
||||
/// A list of food type names, in order of their flags
|
||||
#define FOOD_FLAGS list( \
|
||||
"MEAT", \
|
||||
"VEGETABLES", \
|
||||
"RAW", \
|
||||
"JUNKFOOD", \
|
||||
"GRAIN", \
|
||||
"FRUIT", \
|
||||
"DAIRY", \
|
||||
"FRIED", \
|
||||
"ALCOHOL", \
|
||||
"SUGAR", \
|
||||
"GROSS", \
|
||||
"TOXIC", \
|
||||
"PINEAPPLE", \
|
||||
"BREAKFAST", \
|
||||
"CLOTH", \
|
||||
)
|
||||
|
||||
#define DRINK_NICE 1
|
||||
#define DRINK_GOOD 2
|
||||
#define DRINK_VERYGOOD 3
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
#define CHECKBOX_NONE 0
|
||||
#define CHECKBOX_GROUP 1
|
||||
#define CHECKBOX_TOGGLE 2
|
||||
+6
-20
@@ -217,34 +217,21 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
|
||||
#define GHOST_ORBIT_PENTAGON "pentagon"
|
||||
|
||||
//Ghost showing preferences:
|
||||
#define GHOST_ACCS_NONE 1
|
||||
#define GHOST_ACCS_DIR 50
|
||||
#define GHOST_ACCS_FULL 100
|
||||
|
||||
#define GHOST_ACCS_NONE_NAME "default sprites"
|
||||
#define GHOST_ACCS_DIR_NAME "only directional sprites"
|
||||
#define GHOST_ACCS_FULL_NAME "full accessories"
|
||||
#define GHOST_ACCS_NONE "Default sprites"
|
||||
#define GHOST_ACCS_DIR "Only directional sprites"
|
||||
#define GHOST_ACCS_FULL "Full accessories"
|
||||
|
||||
#define GHOST_ACCS_DEFAULT_OPTION GHOST_ACCS_FULL
|
||||
|
||||
GLOBAL_LIST_INIT(ghost_accs_options, list(GHOST_ACCS_NONE, GHOST_ACCS_DIR, GHOST_ACCS_FULL)) //So save files can be sanitized properly.
|
||||
|
||||
#define GHOST_OTHERS_SIMPLE 1
|
||||
#define GHOST_OTHERS_DEFAULT_SPRITE 50
|
||||
#define GHOST_OTHERS_THEIR_SETTING 100
|
||||
|
||||
#define GHOST_OTHERS_SIMPLE_NAME "white ghost"
|
||||
#define GHOST_OTHERS_DEFAULT_SPRITE_NAME "default sprites"
|
||||
#define GHOST_OTHERS_THEIR_SETTING_NAME "their setting"
|
||||
#define GHOST_OTHERS_SIMPLE "White ghosts"
|
||||
#define GHOST_OTHERS_DEFAULT_SPRITE "Default sprites"
|
||||
#define GHOST_OTHERS_THEIR_SETTING "Their sprites"
|
||||
|
||||
#define GHOST_OTHERS_DEFAULT_OPTION GHOST_OTHERS_THEIR_SETTING
|
||||
|
||||
#define GHOST_MAX_VIEW_RANGE_DEFAULT 10
|
||||
#define GHOST_MAX_VIEW_RANGE_MEMBER 14
|
||||
|
||||
|
||||
GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DEFAULT_SPRITE, GHOST_OTHERS_THEIR_SETTING)) //Same as ghost_accs_options.
|
||||
|
||||
//pda fonts
|
||||
#define MONO "Monospaced"
|
||||
#define VT "VT323"
|
||||
@@ -398,7 +385,6 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE)))
|
||||
#define SECURITY_TRUSTED 3
|
||||
|
||||
//Dummy mob reserve slots
|
||||
#define DUMMY_HUMAN_SLOT_PREFERENCES "dummy_preference_preview"
|
||||
#define DUMMY_HUMAN_SLOT_ADMIN "admintools"
|
||||
#define DUMMY_HUMAN_SLOT_MANIFEST "dummy_manifest_generation"
|
||||
#define DUMMY_HUMAN_SLOT_CTF "dummy_ctf_preview_generation"
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
|
||||
//Preference toggles
|
||||
// Legacy preference toggles.
|
||||
// !!! DO NOT ADD ANY NEW ONES HERE !!!
|
||||
// Use `/datum/preference/toggle` instead.
|
||||
#define SOUND_ADMINHELP (1<<0)
|
||||
#define SOUND_MIDI (1<<1)
|
||||
#define SOUND_AMBIENCE (1<<2)
|
||||
#define SOUND_LOBBY (1<<3)
|
||||
#define MEMBER_PUBLIC (1<<4)
|
||||
// #define INTENT_STYLE (1<<5) - intents no longer exist
|
||||
#define MIDROUND_ANTAG (1<<6)
|
||||
#define SOUND_INSTRUMENTS (1<<7)
|
||||
#define SOUND_SHIP_AMBIENCE (1<<8)
|
||||
#define SOUND_PRAYERS (1<<9)
|
||||
@@ -25,15 +25,16 @@
|
||||
#define SOUND_COMBATMODE (1<<22)
|
||||
#define SPLIT_ADMIN_TABS (1<<23)
|
||||
|
||||
#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|SOUND_ENDOFROUND|MEMBER_PUBLIC|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS|SOUND_COMBATMODE)
|
||||
#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|SOUND_ENDOFROUND|MEMBER_PUBLIC|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS|SOUND_COMBATMODE)
|
||||
|
||||
//Chat toggles
|
||||
// Legacy chat toggles.
|
||||
// !!! DO NOT ADD ANY NEW ONES HERE !!!
|
||||
// Use `/datum/preference/toggle` instead.
|
||||
#define CHAT_OOC (1<<0)
|
||||
#define CHAT_DEAD (1<<1)
|
||||
#define CHAT_GHOSTEARS (1<<2)
|
||||
#define CHAT_GHOSTSIGHT (1<<3)
|
||||
#define CHAT_PRAYER (1<<4)
|
||||
#define CHAT_RADIO (1<<5)
|
||||
#define CHAT_PULLR (1<<6)
|
||||
#define CHAT_GHOSTWHISPER (1<<7)
|
||||
#define CHAT_GHOSTPDA (1<<8)
|
||||
@@ -42,19 +43,13 @@
|
||||
#define CHAT_GHOSTLAWS (1<<11)
|
||||
#define CHAT_LOGIN_LOGOUT (1<<12)
|
||||
|
||||
#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO|CHAT_BANKCARD|CHAT_GHOSTLAWS|CHAT_LOGIN_LOGOUT)
|
||||
#define TOGGLES_DEFAULT_CHAT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_PULLR|CHAT_GHOSTWHISPER|CHAT_GHOSTPDA|CHAT_GHOSTRADIO|CHAT_BANKCARD|CHAT_GHOSTLAWS|CHAT_LOGIN_LOGOUT)
|
||||
|
||||
#define PARALLAX_INSANE -1 //for show offs
|
||||
#define PARALLAX_HIGH 0 //default.
|
||||
#define PARALLAX_MED 1
|
||||
#define PARALLAX_LOW 2
|
||||
#define PARALLAX_DISABLE 3 //this option must be the highest number
|
||||
|
||||
#define PIXEL_SCALING_AUTO 0
|
||||
#define PIXEL_SCALING_1X 1
|
||||
#define PIXEL_SCALING_1_2X 1.5
|
||||
#define PIXEL_SCALING_2X 2
|
||||
#define PIXEL_SCALING_3X 3
|
||||
#define PARALLAX_INSANE "Insane"
|
||||
#define PARALLAX_HIGH "High"
|
||||
#define PARALLAX_MED "Medium"
|
||||
#define PARALLAX_LOW "Low"
|
||||
#define PARALLAX_DISABLE "Disabled"
|
||||
|
||||
#define SCALING_METHOD_NORMAL "normal"
|
||||
#define SCALING_METHOD_DISTORT "distort"
|
||||
@@ -105,47 +100,48 @@
|
||||
#define JP_HIGH 3
|
||||
|
||||
//randomised elements
|
||||
#define RANDOM_HARDCORE "random_hardcore"
|
||||
#define RANDOM_NAME "random_name"
|
||||
#define RANDOM_NAME_ANTAG "random_name_antag"
|
||||
#define RANDOM_BODY "random_body"
|
||||
#define RANDOM_BODY_ANTAG "random_body_antag"
|
||||
#define RANDOM_SPECIES "random_species"
|
||||
#define RANDOM_GENDER "random_gender"
|
||||
#define RANDOM_GENDER_ANTAG "random_gender_antag"
|
||||
#define RANDOM_AGE "random_age"
|
||||
#define RANDOM_AGE_ANTAG "random_age_antag"
|
||||
#define RANDOM_UNDERWEAR "random_underwear"
|
||||
#define RANDOM_UNDERWEAR_COLOR "random_underwear_color"
|
||||
#define RANDOM_UNDERSHIRT "random_undershirt"
|
||||
#define RANDOM_SOCKS "random_socks"
|
||||
#define RANDOM_BACKPACK "random_backpack"
|
||||
#define RANDOM_JUMPSUIT_STYLE "random_jumpsuit_style"
|
||||
#define RANDOM_HAIRSTYLE "random_hairstyle"
|
||||
#define RANDOM_HAIR_COLOR "random_hair_color"
|
||||
#define RANDOM_FACIAL_HAIR_COLOR "random_facial_hair_color"
|
||||
#define RANDOM_FACIAL_HAIRSTYLE "random_facial_hairstyle"
|
||||
#define RANDOM_SKIN_TONE "random_skin_tone"
|
||||
#define RANDOM_EYE_COLOR "random_eye_color"
|
||||
#define RANDOM_ANTAG_ONLY 1
|
||||
#define RANDOM_DISABLED 2
|
||||
#define RANDOM_ENABLED 3
|
||||
|
||||
//recommened client FPS
|
||||
#define RECOMMENDED_FPS 40
|
||||
|
||||
// randomise_appearance_prefs() and randomize_human_appearance() proc flags
|
||||
#define RANDOMIZE_GENDER (1<<0)
|
||||
#define RANDOMIZE_SPECIES (1<<1)
|
||||
#define RANDOMIZE_NAME (1<<2)
|
||||
#define RANDOMIZE_AGE (1<<3)
|
||||
#define RANDOMIZE_UNDERWEAR (1<<4)
|
||||
#define RANDOMIZE_UNDERWEAR_COLOR (1<<5)
|
||||
#define RANDOMIZE_UNDERSHIRT (1<<6)
|
||||
#define RANDOMIZE_SOCKS (1<<7)
|
||||
#define RANDOMIZE_BACKPACK (1<<8)
|
||||
#define RANDOMIZE_JUMPSUIT_STYLE (1<<9)
|
||||
#define RANDOMIZE_HAIRSTYLE (1<<10)
|
||||
#define RANDOMIZE_FACIAL_HAIRSTYLE (1<<11)
|
||||
#define RANDOMIZE_HAIR_COLOR (1<<12)
|
||||
#define RANDOMIZE_FACIAL_HAIR_COLOR (1<<13)
|
||||
#define RANDOMIZE_SKIN_TONE (1<<14)
|
||||
#define RANDOMIZE_EYE_COLOR (1<<15)
|
||||
#define RANDOMIZE_FEATURES (1<<16)
|
||||
#define RANDOMIZE_SPECIES (1<<0)
|
||||
#define RANDOMIZE_NAME (1<<1)
|
||||
|
||||
// Values for /datum/preference/savefile_identifier
|
||||
/// This preference is character specific.
|
||||
#define PREFERENCE_CHARACTER "character"
|
||||
/// This preference is account specific.
|
||||
#define PREFERENCE_PLAYER "player"
|
||||
|
||||
// Values for /datum/preferences/current_tab
|
||||
/// Open the character preference window
|
||||
#define PREFERENCE_TAB_CHARACTER_PREFERENCES 0
|
||||
|
||||
/// Open the game preferences window
|
||||
#define PREFERENCE_TAB_GAME_PREFERENCES 1
|
||||
|
||||
/// Open the keybindings window
|
||||
#define PREFERENCE_TAB_KEYBINDINGS 2
|
||||
|
||||
/// These will be shown in the character sidebar, but at the bottom.
|
||||
#define PREFERENCE_CATEGORY_FEATURES "features"
|
||||
|
||||
/// Any preferences that will show to the sides of the character in the setup menu.
|
||||
#define PREFERENCE_CATEGORY_CLOTHING "clothing"
|
||||
|
||||
/// Preferences that will be put into the 3rd list, and are not contextual.
|
||||
#define PREFERENCE_CATEGORY_NON_CONTEXTUAL "non_contextual"
|
||||
|
||||
/// Will be put under the game preferences window.
|
||||
#define PREFERENCE_CATEGORY_GAME_PREFERENCES "game_preferences"
|
||||
|
||||
/// These will show in the list to the right of the character preview.
|
||||
#define PREFERENCE_CATEGORY_SECONDARY_FEATURES "secondary_features"
|
||||
|
||||
/// These are preferences that are supplementary for main features,
|
||||
/// such as hair color being affixed to hair.
|
||||
#define PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES "supplemental_features"
|
||||
|
||||
@@ -6,31 +6,54 @@
|
||||
|
||||
//These are synced with the Database, if you change the values of the defines
|
||||
//then you MUST update the database!
|
||||
#define ROLE_SYNDICATE "Syndicate"
|
||||
#define ROLE_TRAITOR "Traitor"
|
||||
#define ROLE_OPERATIVE "Operative"
|
||||
#define ROLE_CHANGELING "Changeling"
|
||||
#define ROLE_WIZARD "Wizard"
|
||||
#define ROLE_MALF "Malf AI"
|
||||
#define ROLE_REV "Revolutionary"
|
||||
#define ROLE_REV_HEAD "Head Revolutionary"
|
||||
#define ROLE_REV_SUCCESSFUL "Victorious Revolutionary"
|
||||
#define ROLE_ALIEN "Xenomorph"
|
||||
#define ROLE_PAI "pAI"
|
||||
#define ROLE_CULTIST "Cultist"
|
||||
#define ROLE_HERETIC "Heretic"
|
||||
#define ROLE_BLOB "Blob"
|
||||
#define ROLE_NINJA "Space Ninja"
|
||||
#define ROLE_MONKEY "Monkey"
|
||||
#define ROLE_MONKEY_HELMET "Monkey Mind Magnification Helmet"
|
||||
#define ROLE_ABDUCTOR "Abductor"
|
||||
#define ROLE_REVENANT "Revenant"
|
||||
|
||||
// Roundstart roles
|
||||
#define ROLE_BROTHER "Blood Brother"
|
||||
#define ROLE_CHANGELING "Changeling"
|
||||
#define ROLE_CULTIST "Cultist"
|
||||
#define ROLE_FAMILIES "Gangster"
|
||||
#define ROLE_HERETIC "Heretic"
|
||||
#define ROLE_MALF "Malf AI"
|
||||
#define ROLE_MONKEY "Monkey"
|
||||
#define ROLE_OPERATIVE "Operative"
|
||||
#define ROLE_TRAITOR "Traitor"
|
||||
#define ROLE_WIZARD "Wizard"
|
||||
|
||||
// Midround roles
|
||||
#define ROLE_ABDUCTOR "Abductor"
|
||||
#define ROLE_ALIEN "Xenomorph"
|
||||
#define ROLE_BLOB "Blob"
|
||||
#define ROLE_BLOB_INFECTION "Blob Infection"
|
||||
#define ROLE_FAMILY_HEAD_ASPIRANT "Family Head Aspirant"
|
||||
#define ROLE_LONE_OPERATIVE "Lone Operative"
|
||||
#define ROLE_MALF_MIDROUND "Malf AI (Midround)"
|
||||
#define ROLE_NIGHTMARE "Nightmare"
|
||||
#define ROLE_NINJA "Space Ninja"
|
||||
#define ROLE_REV_HEAD "Head Revolutionary"
|
||||
#define ROLE_OBSESSED "Obsessed"
|
||||
#define ROLE_OPERATIVE_MIDROUND "Operative (Midround)"
|
||||
#define ROLE_SENTIENT_DISEASE "Sentient Disease"
|
||||
#define ROLE_SLEEPER_AGENT "Syndicate Sleeper Agent"
|
||||
#define ROLE_SPACE_DRAGON "Space Dragon"
|
||||
#define ROLE_SPIDER "Spider"
|
||||
#define ROLE_SWARMER "Swarmer"
|
||||
#define ROLE_WIZARD_MIDROUND "Wizard (Midround)"
|
||||
|
||||
// Latejoin roles
|
||||
#define ROLE_HERETIC_SMUGGLER "Heretic Smuggler"
|
||||
#define ROLE_PROVOCATEUR "Provocateur"
|
||||
#define ROLE_SYNDICATE_INFILTRATOR "Syndicate Infiltrator"
|
||||
|
||||
// Other roles
|
||||
#define ROLE_SYNDICATE "Syndicate"
|
||||
#define ROLE_REV "Revolutionary"
|
||||
#define ROLE_REV_SUCCESSFUL "Victorious Revolutionary"
|
||||
#define ROLE_PAI "pAI"
|
||||
#define ROLE_MONKEY_HELMET "Monkey Mind Magnification Helmet"
|
||||
#define ROLE_REVENANT "Revenant"
|
||||
#define ROLE_BRAINWASHED "Brainwashed Victim"
|
||||
#define ROLE_OVERTHROW "Syndicate Mutineer" //Role removed, left here for safety.
|
||||
#define ROLE_HIVE "Hivemind Host" //Role removed, left here for safety.
|
||||
#define ROLE_OBSESSED "Obsessed"
|
||||
#define ROLE_SPACE_DRAGON "Space Dragon"
|
||||
#define ROLE_SENTIENCE "Sentience Potion Spawn"
|
||||
#define ROLE_PYROCLASTIC_SLIME "Pyroclastic Anomaly Slime"
|
||||
#define ROLE_MIND_TRANSFER "Mind Transfer Potion"
|
||||
@@ -39,25 +62,20 @@
|
||||
#define ROLE_DEATHSQUAD "Deathsquad"
|
||||
#define ROLE_LAVALAND "Lavaland"
|
||||
#define ROLE_INTERNAL_AFFAIRS "Internal Affairs Agent"
|
||||
#define ROLE_FAMILIES "Familes Antagonists"
|
||||
|
||||
#define ROLE_POSITRONIC_BRAIN "Positronic Brain"
|
||||
#define ROLE_FREE_GOLEM "Free Golem"
|
||||
#define ROLE_SERVANT_GOLEM "Servant Golem"
|
||||
#define ROLE_NUCLEAR_OPERATIVE "Nuclear Operative"
|
||||
#define ROLE_CLOWN_OPERATIVE "Clown Operative"
|
||||
#define ROLE_LONE_OPERATIVE "Lone Operative"
|
||||
#define ROLE_NIGHTMARE "Nightmare"
|
||||
#define ROLE_WIZARD_APPRENTICE "apprentice"
|
||||
#define ROLE_SLAUGHTER_DEMON "Slaughter Demon"
|
||||
#define ROLE_SENTIENT_DISEASE "Sentient Disease"
|
||||
#define ROLE_MORPH "Morph"
|
||||
#define ROLE_SANTA "Santa"
|
||||
#define ROLE_FUGITIVE "Fugitive"
|
||||
|
||||
//Spawner roles
|
||||
#define ROLE_GHOST_ROLE "Ghost Role"
|
||||
#define ROLE_SPIDER "Spider"
|
||||
#define ROLE_EXILE "Exile"
|
||||
#define ROLE_FUGITIVE_HUNTER "Fugitive Hunter"
|
||||
#define ROLE_ESCAPED_PRISONER "Escaped Prisoner"
|
||||
@@ -85,27 +103,48 @@
|
||||
/// Keys are the antagonist, values are the number of days since the player's
|
||||
/// first connection in order to play.
|
||||
GLOBAL_LIST_INIT(special_roles, list(
|
||||
ROLE_TRAITOR = 0,
|
||||
// Roundstart
|
||||
ROLE_BROTHER = 0,
|
||||
ROLE_OPERATIVE = 14,
|
||||
ROLE_CHANGELING = 0,
|
||||
ROLE_WIZARD = 14,
|
||||
ROLE_MALF = 0,
|
||||
ROLE_REV = 14,
|
||||
ROLE_ALIEN = 0,
|
||||
ROLE_PAI = 0,
|
||||
ROLE_CLOWN_OPERATIVE = 14,
|
||||
ROLE_CULTIST = 14,
|
||||
ROLE_BLOB = 0,
|
||||
ROLE_NINJA = 0,
|
||||
ROLE_OBSESSED = 0,
|
||||
ROLE_SPACE_DRAGON = 0,
|
||||
ROLE_MONKEY = 0,
|
||||
ROLE_REVENANT = 0,
|
||||
ROLE_ABDUCTOR = 0,
|
||||
ROLE_INTERNAL_AFFAIRS = 0,
|
||||
ROLE_SENTIENCE = 0,
|
||||
ROLE_FAMILIES = 0,
|
||||
ROLE_HERETIC = 0,
|
||||
ROLE_MALF = 0,
|
||||
ROLE_MONKEY = 0,
|
||||
ROLE_OPERATIVE = 14,
|
||||
ROLE_REV_HEAD = 14,
|
||||
ROLE_TRAITOR = 0,
|
||||
ROLE_WIZARD = 14,
|
||||
|
||||
// Midround
|
||||
ROLE_ABDUCTOR = 0,
|
||||
ROLE_ALIEN = 0,
|
||||
ROLE_BLOB = 0,
|
||||
ROLE_BLOB_INFECTION = 0,
|
||||
ROLE_FAMILY_HEAD_ASPIRANT = 0,
|
||||
ROLE_LONE_OPERATIVE = 14,
|
||||
ROLE_MALF_MIDROUND = 0,
|
||||
ROLE_NINJA = 0,
|
||||
ROLE_OBSESSED = 0,
|
||||
ROLE_OPERATIVE_MIDROUND = 14,
|
||||
ROLE_REVENANT = 0,
|
||||
ROLE_SENTIENT_DISEASE = 0,
|
||||
ROLE_SLEEPER_AGENT = 0,
|
||||
ROLE_SPACE_DRAGON = 0,
|
||||
ROLE_SPIDER = 0,
|
||||
ROLE_SWARMER = 0,
|
||||
|
||||
// Latejoin
|
||||
ROLE_HERETIC_SMUGGLER = 0,
|
||||
ROLE_PROVOCATEUR = 14,
|
||||
ROLE_SYNDICATE_INFILTRATOR = 0,
|
||||
|
||||
// I'm not too sure why these are here, but they're not moving.
|
||||
ROLE_REV = 14,
|
||||
ROLE_PAI = 0,
|
||||
ROLE_INTERNAL_AFFAIRS = 0,
|
||||
ROLE_SENTIENCE = 0,
|
||||
))
|
||||
|
||||
//Job defines for what happens when you fail to qualify for any job during job selection
|
||||
|
||||
@@ -119,16 +119,17 @@
|
||||
#define INIT_ORDER_ACHIEVEMENTS 77
|
||||
#define INIT_ORDER_RESEARCH 75
|
||||
#define INIT_ORDER_STATION 74 //This is high priority because it manipulates a lot of the subsystems that will initialize after it.
|
||||
#define INIT_ORDER_QUIRKS 73
|
||||
#define INIT_ORDER_REAGENTS 72 //HAS to be before mapping and assets - both create objects, which creates reagents, which relies on lists made in this subsystem
|
||||
#define INIT_ORDER_EVENTS 70
|
||||
#define INIT_ORDER_IDACCESS 66
|
||||
#define INIT_ORDER_JOBS 65 // Must init before atoms, to set up properly the dynamic job lists.
|
||||
#define INIT_ORDER_QUIRKS 60
|
||||
#define INIT_ORDER_AI_MOVEMENT 56 //We need the movement setup
|
||||
#define INIT_ORDER_AI_CONTROLLERS 55 //So the controller can get the ref
|
||||
#define INIT_ORDER_TICKER 55
|
||||
#define INIT_ORDER_TCG 55
|
||||
#define INIT_ORDER_REAGENTS 55 //HAS to be before mapping - mapping creates objects, which creates reagents, which relies on lists made in this subsystem
|
||||
#define INIT_ORDER_MAPPING 50
|
||||
#define INIT_ORDER_EARLY_ASSETS 48
|
||||
#define INIT_ORDER_TIMETRACK 47
|
||||
#define INIT_ORDER_NETWORKS 45
|
||||
#define INIT_ORDER_ECONOMY 40
|
||||
@@ -142,7 +143,8 @@
|
||||
#define INIT_ORDER_TIMER 1
|
||||
#define INIT_ORDER_DEFAULT 0
|
||||
#define INIT_ORDER_AIR -1
|
||||
#define INIT_ORDER_PERSISTENCE -2 //before assets because some assets take data from SSPersistence
|
||||
#define INIT_ORDER_PERSISTENCE -2
|
||||
#define INIT_ORDER_PERSISTENT_PAINTINGS -3 // Assets relies on this
|
||||
#define INIT_ORDER_ASSETS -4
|
||||
#define INIT_ORDER_ICON_SMOOTHING -5
|
||||
#define INIT_ORDER_OVERLAY -6
|
||||
|
||||
@@ -737,3 +737,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
#define TRAIT_MAGNETIC_ID_CARD "magnetic_id_card"
|
||||
/// Traits granted to items due to their chameleon properties.
|
||||
#define CHAMELEON_ITEM_TRAIT "chameleon_item_trait"
|
||||
|
||||
/// This human wants to see the color of their glasses, for some reason
|
||||
#define TRAIT_SEE_GLASS_COLORS "see_glass_colors"
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
|
||||
#define MESSAGE_TYPE_MENTOR "mentor"
|
||||
|
||||
/// Adds a generic box around whatever message you're sending in chat. Really makes things stand out.
|
||||
#define examine_block(str) ("<div class='examine_block'>" + str + "</div>")
|
||||
@@ -0,0 +1,28 @@
|
||||
/// Defines for what loadout slot a corresponding item belongs to.
|
||||
#define LOADOUT_ITEM_BELT "belt"
|
||||
#define LOADOUT_ITEM_EARS "ears"
|
||||
#define LOADOUT_ITEM_GLASSES "glasses"
|
||||
#define LOADOUT_ITEM_GLOVES "gloves"
|
||||
#define LOADOUT_ITEM_HEAD "head"
|
||||
#define LOADOUT_ITEM_MASK "mask"
|
||||
#define LOADOUT_ITEM_NECK "neck"
|
||||
#define LOADOUT_ITEM_SHOES "shoes"
|
||||
#define LOADOUT_ITEM_SUIT "suit"
|
||||
#define LOADOUT_ITEM_UNIFORM "under"
|
||||
#define LOADOUT_ITEM_ACCESSORY "accessory"
|
||||
#define LOADOUT_ITEM_INHAND "inhand_items"
|
||||
#define LOADOUT_ITEM_MISC "pocket_items"
|
||||
#define LOADOUT_ITEM_TOYS "toys"
|
||||
|
||||
#define INFO_GREYSCALE "greyscale"
|
||||
#define INFO_NAMED "name"
|
||||
|
||||
/// Max amonut of misc / backpack items that are allowed.
|
||||
#define MAX_ALLOWED_MISC_ITEMS 3
|
||||
|
||||
/// Defines for extra info blurbs, for loadout items.
|
||||
#define TOOLTIP_NO_ARMOR "ARMORLESS - This item has no armor and is entirely cosmetic."
|
||||
#define TOOLTIP_NO_DAMAGE "CEREMONIAL - This item has very low force and is cosmetic."
|
||||
#define TOOLTIP_RANDOM_COLOR "RANDOM COLOR -This item has a random color and will change every round."
|
||||
#define TOOLTIP_GREYSCALE "GREYSCALED - This item can be customized via the greyscale modification UI."
|
||||
#define TOOLTIP_RENAMABLE "RENAMABLE - This item can be given a custom name."
|
||||
@@ -1,16 +0,0 @@
|
||||
//Skyrat toggles
|
||||
#define CHAT_LOOC (1<<0) //UNUSED BIT SLOT, could still be in savefiles. Feel free to replace it when you add a new one
|
||||
#define CHAT_LOOC_ADMIN (1<<1)
|
||||
#define APHRO_PREF (1<<2)
|
||||
#define CUMFACE_PREF (1<<3)
|
||||
#define ADMINDEL_ZAP_PREF (1<<4)
|
||||
|
||||
#define TOGGLES_DEFAULT_SKYRAT (CHAT_LOOC_ADMIN|APHRO_PREF|CUMFACE_PREF)
|
||||
|
||||
//SKYRAT ADDITION - ERP UPDATE
|
||||
#define BREAST_ENLARGEMENT (2<<3)
|
||||
#define PENIS_ENLARGEMENT (2<<4)
|
||||
#define FORCED_FEM (2<<5)
|
||||
#define FORCED_MALE (2<<6)
|
||||
#define BIMBO_PREF (2<<7)
|
||||
//SKYRAT ADDITION END
|
||||
@@ -0,0 +1 @@
|
||||
#define ROLE_LONE_INFILTRATOR "Lone Infiltrator"
|
||||
@@ -554,11 +554,12 @@
|
||||
else
|
||||
L1[key] = other_value
|
||||
|
||||
/proc/assoc_list_strip_value(list/input)
|
||||
var/list/ret = list()
|
||||
/// Turns an associative list into a flat list of keys
|
||||
/proc/assoc_to_keys(list/input)
|
||||
var/list/keys = list()
|
||||
for(var/key in input)
|
||||
ret += key
|
||||
return ret
|
||||
keys += key
|
||||
return keys
|
||||
|
||||
/proc/compare_list(list/l,list/d)
|
||||
if(!islist(l) || !islist(d))
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
/// Returns if the given client is an admin, REGARDLESS of if they're deadminned or not.
|
||||
/proc/is_admin(client/client)
|
||||
return !isnull(GLOB.admin_datums[client.ckey]) || !isnull(GLOB.deadmins[client.ckey])
|
||||
@@ -0,0 +1,19 @@
|
||||
/// Given a color in the format of "#RRGGBB", will return if the color
|
||||
/// is dark.
|
||||
/proc/is_color_dark(color, threshold = 0.25)
|
||||
var/list/rgb = hex2rgb(color)
|
||||
var/list/hsl = rgb2hsl(rgb[1], rgb[2], rgb[3])
|
||||
return hsl[3] < threshold
|
||||
|
||||
/// Given a 3 character color (no hash), converts it into #RRGGBB (with hash)
|
||||
/proc/expand_three_digit_color(color)
|
||||
if (length_char(color) != 3)
|
||||
CRASH("Invalid 3 digit color: [color]")
|
||||
|
||||
var/final_color = "#"
|
||||
|
||||
for (var/digit = 1 to 3)
|
||||
final_color += copytext(color, digit, digit + 1)
|
||||
final_color += copytext(color, digit, digit + 1)
|
||||
|
||||
return final_color
|
||||
@@ -512,7 +512,7 @@
|
||||
var/mob/M = C
|
||||
if(M.client)
|
||||
C = M.client
|
||||
if(!C || (!C.prefs.windowflashing && !ignorepref))
|
||||
if(!C || (!C.prefs.read_preference(/datum/preference/toggle/window_flashing) && !ignorepref))
|
||||
return
|
||||
winset(C, "mainwindow", "flash=5")
|
||||
|
||||
@@ -528,7 +528,7 @@
|
||||
A = A.loc
|
||||
|
||||
return A.loc
|
||||
/* - SKYRAT EDIT MOVAL - MOVED TO ALTTITLEPREFS
|
||||
|
||||
/proc/AnnounceArrival(mob/living/carbon/human/character, rank)
|
||||
if(!SSticker.IsRoundInProgress() || QDELETED(character))
|
||||
return
|
||||
@@ -543,7 +543,7 @@
|
||||
|
||||
var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems)
|
||||
announcer.announce("ARRIVAL", character.real_name, rank, list()) //make the list empty to make it announce it in common
|
||||
*/
|
||||
|
||||
/proc/lavaland_equipment_pressure_check(turf/T)
|
||||
. = FALSE
|
||||
if(!istype(T))
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, GLOB.animated_spines_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.r_wings_list,roundstart = TRUE)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/caps, GLOB.caps_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae, GLOB.moth_antennae_list)
|
||||
|
||||
+2
-10
@@ -991,7 +991,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types)
|
||||
if(job)
|
||||
body.dna.species.pre_equip_species_outfit(job, body, TRUE)
|
||||
if(outfit)
|
||||
body.equipOutfit(outfit, TRUE)
|
||||
body.equip_outfit_and_loadout(outfit, prefs, TRUE) //SKYRAT EDIT CHANGE
|
||||
|
||||
var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing")
|
||||
COMPILE_OVERLAYS(body)
|
||||
@@ -1053,12 +1053,7 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
|
||||
dummySave = null
|
||||
fdel("tmp/dummySave.sav") //if you get the idea to try and make this more optimized, make sure to still call unlock on the savefile after every write to unlock it.
|
||||
|
||||
/proc/icon2html(thing, target, icon_state, dir = SOUTH, frame = 1, moving = FALSE, sourceonly = FALSE, extra_classes = null, override_skyrat = FALSE) /// SKYRAT EDIT - icon2html override instead of fully disabling it - Original: /proc/icon2html(thing, target, icon_state, dir = SOUTH, frame = 1, moving = FALSE, sourceonly = FALSE, extra_classes = null)
|
||||
// SKYRAT EDIT START - icon2html override instead of fully disabling it
|
||||
if(!override_skyrat)
|
||||
return "" //SKYRAT EDIT DISABLE - ICON2HTML
|
||||
// SKYRAT EDIT END
|
||||
|
||||
/proc/icon2html(thing, target, icon_state, dir = SOUTH, frame = 1, moving = FALSE, sourceonly = FALSE, extra_classes = null)
|
||||
if (!thing)
|
||||
return
|
||||
if(SSlag_switch.measures[DISABLE_USR_ICON2HTML] && usr && !HAS_TRAIT(usr, TRAIT_BYPASS_MEASURES))
|
||||
@@ -1163,8 +1158,6 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
|
||||
|
||||
//Costlier version of icon2html() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs.
|
||||
/proc/costly_icon2html(thing, target, sourceonly = FALSE)
|
||||
return ""
|
||||
/* SKYRAT EDIT REMOVAL
|
||||
if (!thing)
|
||||
return
|
||||
if(SSlag_switch.measures[DISABLE_USR_ICON2HTML] && usr && !HAS_TRAIT(usr, TRAIT_BYPASS_MEASURES))
|
||||
@@ -1175,7 +1168,6 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
|
||||
|
||||
var/icon/I = getFlatIcon(thing)
|
||||
return icon2html(I, target, sourceonly = sourceonly)
|
||||
*/
|
||||
|
||||
GLOBAL_LIST_EMPTY(transformation_animation_objects)
|
||||
|
||||
|
||||
@@ -159,6 +159,22 @@ GLOBAL_LIST_INIT(skin_tones, sortList(list(
|
||||
"african2"
|
||||
)))
|
||||
|
||||
GLOBAL_LIST_INIT(skin_tone_names, list(
|
||||
"african1" = "Medium brown",
|
||||
"african2" = "Dark brown",
|
||||
"albino" = "Albino",
|
||||
"arab" = "Light brown",
|
||||
"asian1" = "Ivory",
|
||||
"asian2" = "Beige",
|
||||
"caucasian1" = "Porcelain",
|
||||
"caucasian2" = "Light peach",
|
||||
"caucasian3" = "Peach",
|
||||
"indian" = "Brown",
|
||||
"latino" = "Light beige",
|
||||
"mediterranean" = "Olive",
|
||||
))
|
||||
|
||||
/// An assoc list of species IDs to type paths
|
||||
GLOBAL_LIST_EMPTY(species_list)
|
||||
|
||||
/proc/age2agedescription(age)
|
||||
|
||||
@@ -278,8 +278,10 @@
|
||||
|
||||
CHECK_TICK
|
||||
SSdbcore.SetRoundEnd()
|
||||
|
||||
//Collects persistence features
|
||||
SSpersistence.collect_data()
|
||||
SSpersistent_paintings.save_paintings()
|
||||
|
||||
//stop collecting feedback during grifftime
|
||||
SSblackbox.Seal()
|
||||
|
||||
@@ -99,5 +99,5 @@
|
||||
return default ? default : crunch + repeat_string(desired_format, "0")
|
||||
|
||||
/// Makes sure the input color is text with a # at the start followed by 6 hexadecimal characters. Examples: "#ff1234", "#A38321", COLOR_GREEN_GRAY
|
||||
/proc/sanitize_ooccolor(color)
|
||||
/proc/sanitize_color(color)
|
||||
return findtext(color, GLOB.is_color) ? color : GLOB.normal_ooc_colour
|
||||
|
||||
@@ -191,7 +191,7 @@ Turf and target are separate in case you want to teleport some distance from a t
|
||||
return TRUE
|
||||
|
||||
//Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame()
|
||||
/mob/proc/apply_pref_name(role, client/C)
|
||||
/mob/proc/apply_pref_name(preference_type, client/C)
|
||||
if(!C)
|
||||
C = client
|
||||
var/oldname = real_name
|
||||
@@ -202,20 +202,11 @@ Turf and target are separate in case you want to teleport some distance from a t
|
||||
var/random = CONFIG_GET(flag/force_random_names) || (C ? is_banned_from(C.ckey, "Appearance") : FALSE)
|
||||
|
||||
while(loop && safety < 5)
|
||||
if(!safety && !random && C?.prefs.custom_names[role])
|
||||
newname = C.prefs.custom_names[role]
|
||||
if(!safety && !random)
|
||||
newname = C?.prefs?.read_preference(preference_type)
|
||||
else
|
||||
switch(role)
|
||||
if(SPECIES_HUMAN)
|
||||
newname = random_unique_name(gender)
|
||||
if("clown")
|
||||
newname = pick(GLOB.clown_names)
|
||||
if("mime")
|
||||
newname = pick(GLOB.mime_names)
|
||||
if("ai")
|
||||
newname = pick(GLOB.ai_names)
|
||||
else
|
||||
return FALSE
|
||||
var/datum/preference/preference = GLOB.preference_entries[preference_type]
|
||||
newname = preference.create_informed_default_value(C.prefs)
|
||||
|
||||
for(var/mob/living/M in GLOB.player_list)
|
||||
if(M == src)
|
||||
|
||||
@@ -1,21 +1,2 @@
|
||||
GLOBAL_LIST_EMPTY(classic_keybinding_list_by_key)
|
||||
GLOBAL_LIST_EMPTY(hotkey_keybinding_list_by_key)
|
||||
GLOBAL_LIST_EMPTY(default_hotkeys)
|
||||
GLOBAL_LIST_EMPTY(keybindings_by_name)
|
||||
|
||||
// This is a mapping from JS keys to Byond - ref: https://keycode.info/
|
||||
GLOBAL_LIST_INIT(_kbMap, list(
|
||||
"UP" = "North",
|
||||
"RIGHT" = "East",
|
||||
"DOWN" = "South",
|
||||
"LEFT" = "West",
|
||||
"INSERT" = "Insert",
|
||||
"HOME" = "Northwest",
|
||||
"PAGEUP" = "Northeast",
|
||||
"DEL" = "Delete",
|
||||
"END" = "Southwest",
|
||||
"PAGEDOWN" = "Southeast",
|
||||
"SPACEBAR" = "Space",
|
||||
"ALT" = "Alt",
|
||||
"SHIFT" = "Shift",
|
||||
"CONTROL" = "Ctrl"
|
||||
))
|
||||
|
||||
@@ -36,7 +36,6 @@ GLOBAL_LIST_EMPTY(animated_tails_list_human)
|
||||
GLOBAL_LIST_EMPTY(ears_list)
|
||||
GLOBAL_LIST_EMPTY(wings_list)
|
||||
GLOBAL_LIST_EMPTY(wings_open_list)
|
||||
GLOBAL_LIST_EMPTY(r_wings_list)
|
||||
GLOBAL_LIST_EMPTY(moth_wings_list)
|
||||
GLOBAL_LIST_EMPTY(moth_antennae_list)
|
||||
GLOBAL_LIST_EMPTY(moth_markings_list)
|
||||
@@ -164,18 +163,26 @@ GLOBAL_LIST_INIT(ai_core_display_screens, sortList(list(
|
||||
"Triumvirate-M",
|
||||
"Weird")))
|
||||
|
||||
/proc/resolve_ai_icon(input)
|
||||
/// A form of resolve_ai_icon that is guaranteed to never sleep.
|
||||
/// Not always accurate, but always synchronous.
|
||||
/proc/resolve_ai_icon_sync(input)
|
||||
SHOULD_NOT_SLEEP(TRUE)
|
||||
|
||||
if(!input || !(input in GLOB.ai_core_display_screens))
|
||||
return "ai"
|
||||
else
|
||||
if(input == "Random")
|
||||
input = pick(GLOB.ai_core_display_screens - "Random")
|
||||
if(input == "Portrait")
|
||||
var/datum/portrait_picker/tgui = new(usr)//create the datum
|
||||
tgui.ui_interact(usr)//datum has a tgui component, here we open the window
|
||||
return "ai-portrait" //just take this until they decide
|
||||
return "ai-[lowertext(input)]"
|
||||
|
||||
/proc/resolve_ai_icon(input)
|
||||
if (input == "Portrait")
|
||||
var/datum/portrait_picker/tgui = new(usr)//create the datum
|
||||
tgui.ui_interact(usr)//datum has a tgui component, here we open the window
|
||||
return "ai-portrait" //just take this until they decide
|
||||
|
||||
return resolve_ai_icon_sync(input)
|
||||
|
||||
GLOBAL_LIST_INIT(security_depts_prefs, sortList(list(
|
||||
SEC_DEPT_NONE,
|
||||
SEC_DEPT_ENGINEERING,
|
||||
@@ -197,18 +204,12 @@ GLOBAL_LIST_INIT(backpacklist, list(DBACKPACK, DSATCHEL, DDUFFELBAG, GBACKPACK,
|
||||
//Suit/Skirt
|
||||
#define PREF_SUIT "Jumpsuit"
|
||||
#define PREF_SKIRT "Jumpskirt"
|
||||
GLOBAL_LIST_INIT(jumpsuitlist, list(PREF_SUIT, PREF_SKIRT))
|
||||
|
||||
//Uplink spawn loc
|
||||
#define UPLINK_PDA "PDA"
|
||||
#define UPLINK_RADIO "Radio"
|
||||
#define UPLINK_PEN "Pen" //like a real spy!
|
||||
#define UPLINK_IMPLANT "Implant"
|
||||
#define UPLINK_IMPLANT_WITH_PRICE "[UPLINK_IMPLANT] (-[UPLINK_IMPLANT_TELECRYSTAL_COST] TC)"
|
||||
// What we show to the user
|
||||
GLOBAL_LIST_INIT(uplink_spawn_loc_list, list(UPLINK_PDA, UPLINK_RADIO, UPLINK_PEN, UPLINK_IMPLANT_WITH_PRICE))
|
||||
// What is actually saved; if the uplink implant price changes, it won't affect save files then
|
||||
GLOBAL_LIST_INIT(uplink_spawn_loc_list_save, list(UPLINK_PDA, UPLINK_RADIO, UPLINK_PEN, UPLINK_IMPLANT))
|
||||
|
||||
//Female Uniforms
|
||||
GLOBAL_LIST_EMPTY(female_clothing_icons)
|
||||
|
||||
@@ -11,15 +11,13 @@
|
||||
/proc/add_keybinding(datum/keybinding/instance)
|
||||
GLOB.keybindings_by_name[instance.name] = instance
|
||||
|
||||
// Classic
|
||||
if(LAZYLEN(instance.classic_keys))
|
||||
for(var/bound_key in instance.classic_keys)
|
||||
LAZYADD(GLOB.classic_keybinding_list_by_key[bound_key], list(instance.name))
|
||||
|
||||
// Hotkey
|
||||
if(LAZYLEN(instance.hotkey_keys))
|
||||
for(var/bound_key in instance.hotkey_keys)
|
||||
LAZYADD(GLOB.hotkey_keybinding_list_by_key[bound_key], list(instance.name))
|
||||
if (bound_key == "Unbound")
|
||||
LAZYADD(GLOB.default_hotkeys[instance.name], list())
|
||||
else
|
||||
LAZYADD(GLOB.default_hotkeys[instance.name], list(bound_key))
|
||||
|
||||
/proc/init_emote_keybinds()
|
||||
for(var/i in subtypesof(/datum/emote))
|
||||
|
||||
@@ -34,24 +34,3 @@ GLOBAL_LIST_INIT(hive_names, world.file2list("strings/names/hive_names.txt"))
|
||||
GLOBAL_LIST_INIT(dream_strings, world.file2list("strings/dreamstrings.txt"))
|
||||
//loaded on startup because of "
|
||||
//would include in rsc if ' was used
|
||||
|
||||
/*
|
||||
List of configurable names in preferences and their metadata
|
||||
"id" = list(
|
||||
"pref_name" = "name", //pref label
|
||||
"qdesc" = "name", //popup question text
|
||||
"allow_numbers" = FALSE, // numbers allowed in the name
|
||||
"group" = "whatever", // group (these will be grouped together on pref ui ,order still follows the list so they need to be concurrent to be grouped)
|
||||
"allow_null" = FALSE // if empty name is entered it's replaced with default value
|
||||
),
|
||||
*/
|
||||
GLOBAL_LIST_INIT(preferences_custom_names, list(
|
||||
"human" = list("pref_name" = "Backup Human", "qdesc" = "backup human name, used in the event you are assigned a command role as another species (leave empty to pick random name)", "allow_numbers" = FALSE , "group" = "backup_human", "allow_null" = TRUE),
|
||||
"clown" = list("pref_name" = "Clown" , "qdesc" = "clown name (leave empty to pick random name)", "allow_numbers" = FALSE , "group" = "fun", "allow_null" = TRUE),
|
||||
"mime" = list("pref_name" = "Mime", "qdesc" = "mime name (leave empty to pick random name)" , "allow_numbers" = FALSE , "group" = "fun", "allow_null" = TRUE),
|
||||
"cyborg" = list("pref_name" = "Cyborg", "qdesc" = "cyborg name (leave empty to use default naming scheme)", "allow_numbers" = TRUE , "group" = "silicons", "allow_null" = TRUE),
|
||||
"ai" = list("pref_name" = "AI", "qdesc" = "AI name (leave empty to pick random name)", "allow_numbers" = TRUE , "group" = "silicons", "allow_null" = TRUE),
|
||||
"religion" = list("pref_name" = "Chaplain religion", "qdesc" = "religion (leave empty to pick random religion)" , "allow_numbers" = TRUE , "group" = "chaplain", "allow_null" = TRUE),
|
||||
"deity" = list("pref_name" = "Chaplain deity", "qdesc" = "deity (leave empty to pick default name)", "allow_numbers" = TRUE , "group" = "chaplain", "allow_null" = TRUE),
|
||||
"bible" = list("pref_name" = "Chaplain bible name", "qdesc" = "bible name (leave empty to use default naming scheme)", "allow_numbers" = TRUE , "group" = "chaplain", "allow_null" = TRUE)
|
||||
))
|
||||
|
||||
@@ -20,7 +20,7 @@ GLOBAL_LIST_EMPTY(mechpad_list) //list of all /obj/machinery/mechpad
|
||||
GLOBAL_LIST(chemical_reactions_list) //list of all /datum/chemical_reaction datums indexed by their typepath. Use this for general lookup stuff
|
||||
GLOBAL_LIST(chemical_reactions_list_reactant_index) //list of all /datum/chemical_reaction datums. Used during chemical reactions. Indexed by REACTANT types
|
||||
GLOBAL_LIST(chemical_reactions_list_product_index) //list of all /datum/chemical_reaction datums. Used for the reaction lookup UI. Indexed by PRODUCT type
|
||||
GLOBAL_LIST(chemical_reagents_list) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
|
||||
GLOBAL_LIST_INIT(chemical_reagents_list, init_chemical_reagent_list()) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
|
||||
GLOBAL_LIST(chemical_reactions_results_lookup_list) //List of all reactions with their associated product and result ids. Used for reaction lookups
|
||||
GLOBAL_LIST(fake_reagent_blacklist) //List of all reagents that are parent types used to define a bunch of children - but aren't used themselves as anything.
|
||||
GLOBAL_LIST_EMPTY(tech_list) //list of all /datum/tech datums indexed by id.
|
||||
|
||||
@@ -0,0 +1,285 @@
|
||||
#define PHOBIA_FILE "phobia.json"
|
||||
|
||||
/// Phobia types that can be pulled randomly for brain traumas.
|
||||
/// Also determines what phobias you can choose as your preference with the quirk.
|
||||
GLOBAL_LIST_INIT(phobia_types, sortList(list(
|
||||
"aliens",
|
||||
"anime",
|
||||
"authority",
|
||||
"birds",
|
||||
"clowns",
|
||||
"doctors",
|
||||
"falling",
|
||||
"greytide",
|
||||
"guns",
|
||||
"insects",
|
||||
"lizards",
|
||||
"robots",
|
||||
"security",
|
||||
"skeletons",
|
||||
"snakes",
|
||||
"space",
|
||||
"spiders",
|
||||
"strangers",
|
||||
"the supernatural",
|
||||
)))
|
||||
|
||||
GLOBAL_LIST_INIT(phobia_regexes, list(
|
||||
"aliens" = construct_phobia_regex("aliens"),
|
||||
"anime" = construct_phobia_regex("anime"),
|
||||
"authority" = construct_phobia_regex("authority"),
|
||||
"birds" = construct_phobia_regex("birds"),
|
||||
"clowns" = construct_phobia_regex("clowns"),
|
||||
"conspiracies" = construct_phobia_regex("conspiracies"),
|
||||
"doctors" = construct_phobia_regex("doctors"),
|
||||
"falling" = construct_phobia_regex("falling"),
|
||||
"greytide" = construct_phobia_regex("greytide"),
|
||||
"guns" = construct_phobia_regex("guns"),
|
||||
"insects" = construct_phobia_regex("insects"),
|
||||
"lizards" = construct_phobia_regex("lizards"),
|
||||
"ocky icky" = construct_phobia_regex("ocky icky"),
|
||||
"robots" = construct_phobia_regex("robots"),
|
||||
"security" = construct_phobia_regex("security"),
|
||||
"skeletons" = construct_phobia_regex("skeletons"),
|
||||
"snakes" = construct_phobia_regex("snakes"),
|
||||
"space" = construct_phobia_regex("space"),
|
||||
"spiders" = construct_phobia_regex("spiders"),
|
||||
"strangers" = construct_phobia_regex("strangers"),
|
||||
"the supernatural" = construct_phobia_regex("the supernatural"),
|
||||
))
|
||||
|
||||
GLOBAL_LIST_INIT(phobia_mobs, list(
|
||||
"spiders" = typecacheof(list(/mob/living/simple_animal/hostile/giant_spider)),
|
||||
"security" = typecacheof(list(/mob/living/simple_animal/bot/secbot)),
|
||||
"lizards" = typecacheof(list(/mob/living/simple_animal/hostile/lizard)),
|
||||
"skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/skeleton)),
|
||||
"snakes" = typecacheof(list(/mob/living/simple_animal/hostile/retaliate/snake)),
|
||||
"robots" = typecacheof(list(
|
||||
/mob/living/silicon/ai,
|
||||
/mob/living/silicon/robot,
|
||||
/mob/living/simple_animal/bot,
|
||||
/mob/living/simple_animal/drone,
|
||||
/mob/living/simple_animal/hostile/swarmer,
|
||||
)),
|
||||
"doctors" = typecacheof(list(/mob/living/simple_animal/bot/medbot)),
|
||||
"the supernatural" = typecacheof(list(
|
||||
/mob/living/simple_animal/hostile/construct,
|
||||
/mob/living/simple_animal/revenant,
|
||||
/mob/living/simple_animal/shade,
|
||||
/mob/living/simple_animal/hostile/skeleton,
|
||||
/mob/living/simple_animal/hostile/retaliate/ghost,
|
||||
/mob/living/simple_animal/hostile/imp,
|
||||
/mob/dead/observer,
|
||||
/mob/living/simple_animal/bot/mulebot/paranormal,
|
||||
/mob/living/simple_animal/hostile/retaliate/bat,
|
||||
/mob/living/simple_animal/hostile/dark_wizard,
|
||||
/mob/living/simple_animal/hostile/faithless,
|
||||
/mob/living/simple_animal/hostile/wizard,
|
||||
/mob/living/simple_animal/hostile/zombie,
|
||||
)),
|
||||
"aliens" = typecacheof(list(
|
||||
/mob/living/carbon/alien,
|
||||
/mob/living/simple_animal/slime,
|
||||
)),
|
||||
"conspiracies" = typecacheof(list(
|
||||
/mob/living/simple_animal/bot/secbot,
|
||||
/mob/living/simple_animal/drone,
|
||||
/mob/living/simple_animal/pet/penguin,
|
||||
)),
|
||||
"birds" = typecacheof(list(
|
||||
/mob/living/simple_animal/chick,
|
||||
/mob/living/simple_animal/chicken,
|
||||
/mob/living/simple_animal/parrot,
|
||||
/mob/living/simple_animal/pet/penguin,
|
||||
)),
|
||||
"anime" = typecacheof(list(/mob/living/simple_animal/hostile/guardian)),
|
||||
"insects" = typecacheof(list(
|
||||
/mob/living/basic/cockroach,
|
||||
/mob/living/simple_animal/hostile/bee,
|
||||
)),
|
||||
))
|
||||
|
||||
GLOBAL_LIST_INIT(phobia_objs, list(
|
||||
"snakes" = typecacheof(list(/obj/item/rod_of_asclepius, /obj/item/toy/plush/snakeplushie)),
|
||||
"spiders" = typecacheof(list(/obj/structure/spider)),
|
||||
"security" = typecacheof(list(
|
||||
/obj/item/clothing/under/rank/security/officer, /obj/item/clothing/under/rank/security/warden,
|
||||
/obj/item/clothing/under/rank/security/head_of_security, /obj/item/clothing/under/rank/security/detective,
|
||||
/obj/item/melee/baton, /obj/item/gun/energy/taser, /obj/item/restraints/handcuffs,
|
||||
/obj/machinery/door/airlock/security, /obj/effect/hallucination/simple/securitron,
|
||||
/obj/item/stamp/hos, /obj/item/megaphone/sec, /obj/item/toy/figure/hos, /obj/item/toy/figure/secofficer,
|
||||
/obj/structure/statue/silver/sec, /obj/structure/statue/silver/secborg, /obj/structure/statue/gold/hos
|
||||
)),
|
||||
|
||||
"clowns" = typecacheof(list(
|
||||
/obj/item/clothing/under/rank/civilian/clown, /obj/item/clothing/shoes/clown_shoes,
|
||||
/obj/item/clothing/mask/gas/clown_hat, /obj/item/instrument/bikehorn,
|
||||
/obj/item/pda/clown, /obj/item/grown/bananapeel, /obj/item/food/cheesiehonkers,
|
||||
/obj/item/trash/cheesie, /obj/item/stack/ore/bananium, /obj/item/stack/tile/mineral/bananium,
|
||||
/obj/structure/falsewall/bananium, /obj/item/stack/ore/bananium, /obj/machinery/door/airlock/bananium,
|
||||
/obj/structure/statue/bananium, /obj/item/toy/crayon/rainbow, /obj/vehicle/sealed/mecha/combat/honker,
|
||||
/obj/item/toy/mecha/honk, /obj/item/toy/mecha/darkhonk,
|
||||
/obj/structure/mecha_wreckage/honker, /obj/item/megaphone/clown, /obj/item/stamp/clown,
|
||||
/obj/item/storage/backpack/clown, /obj/item/storage/backpack/ert/clown, /obj/item/storage/backpack/duffelbag/clown,
|
||||
/obj/item/food/pie/cream, /obj/item/pneumatic_cannon/pie, /obj/item/bedsheet/clown, /obj/vehicle/sealed/car/clowncar,
|
||||
/obj/item/gun/magic/staff/honk, /obj/item/clothing/suit/chaplainsuit/clownpriest, /obj/item/clothing/head/clownmitre,
|
||||
/obj/item/clothing/under/plasmaman/clown
|
||||
)),
|
||||
|
||||
"greytide" = typecacheof(list(/obj/item/clothing/under/color/grey, /obj/item/melee/baton/security/cattleprod,
|
||||
/obj/item/spear, /obj/item/clothing/mask/gas, /obj/item/toy/figure/assistant,
|
||||
/obj/structure/statue/sandstone/assistant
|
||||
)),
|
||||
|
||||
"lizards" = typecacheof(list(/obj/item/toy/plush/lizard_plushie, /obj/item/food/kebab/tail, /obj/item/organ/tail/lizard,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/lizardwine, /obj/item/clothing/head/lizard, /obj/item/clothing/shoes/cowboy/lizard,
|
||||
)),
|
||||
|
||||
"skeletons" = typecacheof(list(/obj/item/organ/tongue/bone, /obj/item/clothing/suit/armor/bone, /obj/item/stack/sheet/bone,
|
||||
/obj/item/food/meat/slab/human/mutant/skeleton,
|
||||
/obj/effect/decal/remains/human,
|
||||
)),
|
||||
|
||||
"conspiracies" = typecacheof(list(/obj/item/clothing/under/rank/captain, /obj/item/clothing/under/rank/security/head_of_security,
|
||||
/obj/item/clothing/under/rank/engineering/chief_engineer, /obj/item/clothing/under/rank/medical/chief_medical_officer,
|
||||
/obj/item/clothing/under/rank/civilian/head_of_personnel, /obj/item/clothing/under/rank/rnd/research_director,
|
||||
/obj/item/clothing/under/rank/security/head_of_security/grey, /obj/item/clothing/under/rank/security/head_of_security/alt,
|
||||
/obj/item/clothing/under/rank/rnd/research_director/alt, /obj/item/clothing/under/rank/rnd/research_director/turtleneck,
|
||||
/obj/item/clothing/under/rank/captain/parade, /obj/item/clothing/under/rank/security/head_of_security/parade, /obj/item/clothing/under/rank/security/head_of_security/parade/female,
|
||||
/obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/melee/baton/abductor,
|
||||
/obj/item/storage/belt/military/abductor, /obj/item/gun/energy/alien, /obj/item/abductor/silencer,
|
||||
/obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom/officer,
|
||||
/obj/item/clothing/suit/space/hardsuit/ert, /obj/item/clothing/suit/space/hardsuit/ert/sec,
|
||||
/obj/item/clothing/suit/space/hardsuit/ert/engi, /obj/item/clothing/suit/space/hardsuit/ert/med,
|
||||
/obj/item/clothing/suit/space/hardsuit/deathsquad, /obj/item/clothing/head/helmet/space/hardsuit/deathsquad,
|
||||
/obj/machinery/door/airlock/centcom, /obj/machinery/atmospherics/miner, /obj/item/toy/figure/captain, /obj/item/toy/figure/ce,
|
||||
/obj/item/toy/figure/dsquad, /obj/item/toy/figure/hop, /obj/item/toy/figure/hos, /obj/item/toy/figure/rd,
|
||||
/obj/item/toy/figure/cmo, /obj/item/stamp/captain, /obj/item/stamp/hop, /obj/item/stamp/hos, /obj/item/stamp/ce,
|
||||
/obj/item/stamp/rd, /obj/item/stamp/cmo, /obj/item/stamp/centcom, /obj/item/megaphone/command
|
||||
)),
|
||||
|
||||
"robots" = typecacheof(list(/obj/machinery/computer/upload, /obj/item/ai_module, /obj/machinery/recharge_station,
|
||||
/obj/item/aicard, /obj/structure/swarmer_beacon, /obj/item/toy/figure/borg, /obj/item/toy/talking/ai,
|
||||
/obj/structure/statue/silver/medborg, /obj/structure/statue/silver/secborg, /obj/structure/statue/diamond/ai1,
|
||||
/obj/structure/statue/diamond/ai2,
|
||||
)),
|
||||
|
||||
"doctors" = typecacheof(list(/obj/item/clothing/under/rank/medical,
|
||||
/obj/item/reagent_containers/syringe, /obj/item/reagent_containers/pill/, /obj/item/reagent_containers/hypospray,
|
||||
/obj/item/storage/firstaid, /obj/item/storage/pill_bottle, /obj/item/healthanalyzer,
|
||||
/obj/structure/sign/departments/medbay, /obj/machinery/door/airlock/medical, /obj/machinery/sleeper, /obj/machinery/stasis,
|
||||
/obj/machinery/dna_scannernew, /obj/machinery/atmospherics/components/unary/cryo_cell, /obj/item/surgical_drapes,
|
||||
/obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw,
|
||||
/obj/item/clothing/suit/bio_suit/plaguedoctorsuit, /obj/item/clothing/head/plaguedoctorhat, /obj/item/clothing/mask/gas/plaguedoctor,
|
||||
)),
|
||||
|
||||
"authority" = typecacheof(list(/obj/item/clothing/under/rank/captain, /obj/item/clothing/under/rank/civilian/head_of_personnel,
|
||||
/obj/item/clothing/under/rank/security/head_of_security, /obj/item/clothing/under/rank/rnd/research_director,
|
||||
/obj/item/clothing/under/rank/medical/chief_medical_officer, /obj/item/clothing/under/rank/engineering/chief_engineer,
|
||||
/obj/item/clothing/under/rank/centcom/officer, /obj/item/clothing/under/rank/centcom/commander,
|
||||
/obj/item/melee/baton/telescopic, /obj/item/card/id/advanced/silver, /obj/item/card/id/advanced/gold,
|
||||
/obj/item/card/id/advanced/centcom, /obj/machinery/door/airlock/command, /obj/item/card/id/advanced,
|
||||
/obj/item/toy/figure/captain, /obj/item/toy/figure/ce,
|
||||
/obj/item/toy/figure/dsquad, /obj/item/toy/figure/hop, /obj/item/toy/figure/hos, /obj/item/toy/figure/rd,
|
||||
/obj/item/toy/figure/cmo, /obj/item/stamp/captain, /obj/item/stamp/hop, /obj/item/stamp/hos, /obj/item/stamp/ce,
|
||||
/obj/item/stamp/rd, /obj/item/stamp/cmo, /obj/item/stamp/centcom, /obj/item/megaphone/command,
|
||||
/obj/structure/statue/gold/hos, /obj/structure/statue/gold/ce, /obj/structure/statue/gold/cmo, /obj/structure/statue/gold/rd,
|
||||
/obj/structure/statue/gold/hop, /obj/structure/statue/diamond/captain
|
||||
)),
|
||||
|
||||
"the supernatural" = typecacheof(list(/obj/structure/destructible/cult, /obj/item/tome,
|
||||
/obj/item/melee/cultblade, /obj/item/cult_bastard,
|
||||
/obj/item/restraints/legcuffs/bola/cult, /obj/item/clothing/suit/space/hardsuit/cult,
|
||||
/obj/item/clothing/suit/hooded/cultrobes, /obj/item/clothing/head/hooded/cult_hoodie, /obj/effect/rune,
|
||||
/obj/item/stack/sheet/runed_metal, /obj/machinery/door/airlock/cult, /obj/narsie,
|
||||
/obj/item/soulstone,
|
||||
/obj/item/clothing/suit/wizrobe, /obj/item/clothing/head/wizard, /obj/item/spellbook, /obj/item/staff,
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/hardsuit/wizard,
|
||||
/obj/item/gun/magic/staff, /obj/item/gun/magic/wand,
|
||||
/obj/item/nullrod, /obj/item/clothing/under/rank/civilian/chaplain,
|
||||
/obj/item/gun/magic/staff, /obj/item/gun/magic/wand, /obj/item/scrying, /obj/item/necromantic_stone,
|
||||
/obj/item/warpwhistle, /obj/item/nullrod, /obj/item/clothing/under/rank/civilian/chaplain,
|
||||
/obj/structure/spirit_board, /obj/item/toy/eightball/haunted, /obj/item/storage/toolbox/haunted,
|
||||
/obj/item/stack/sheet/hauntium,
|
||||
)),
|
||||
|
||||
"aliens" = typecacheof(list(/obj/item/clothing/mask/facehugger, /obj/item/organ/body_egg/alien_embryo,
|
||||
/obj/structure/alien, /obj/item/toy/toy_xeno,
|
||||
/obj/item/clothing/suit/armor/abductor, /obj/item/abductor, /obj/item/gun/energy/alien,
|
||||
/obj/item/melee/baton/abductor, /obj/item/radio/headset/abductor, /obj/item/scalpel/alien, /obj/item/hemostat/alien,
|
||||
/obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/surgicaldrill/alien, /obj/item/cautery/alien,
|
||||
/obj/item/clothing/head/helmet/abductor, /obj/structure/bed/abductor, /obj/structure/table_frame/abductor,
|
||||
/obj/structure/table/abductor, /obj/structure/table/optable/abductor, /obj/structure/closet/abductor, /obj/item/organ/heart/gland,
|
||||
/obj/machinery/abductor, /obj/item/crowbar/abductor, /obj/item/screwdriver/abductor, /obj/item/weldingtool/abductor,
|
||||
/obj/item/wirecutters/abductor, /obj/item/wrench/abductor, /obj/item/stack/sheet/mineral/abductor, /obj/item/toy/toy_xeno,
|
||||
/obj/structure/statue/plasma/xeno
|
||||
)),
|
||||
|
||||
"birds" = typecacheof(list(/obj/item/clothing/mask/gas/plaguedoctor, /obj/item/food/cracker,
|
||||
/obj/item/clothing/suit/chickensuit, /obj/item/clothing/head/chicken,
|
||||
/obj/item/clothing/suit/toggle/owlwings, /obj/item/clothing/under/costume/owl, /obj/item/clothing/mask/gas/owl_mask,
|
||||
/obj/item/clothing/under/costume/griffin, /obj/item/clothing/shoes/griffin, /obj/item/clothing/head/griffin,
|
||||
/obj/item/clothing/head/helmet/space/freedom, /obj/item/clothing/suit/space/freedom,
|
||||
)),
|
||||
|
||||
"anime" = typecacheof(list(/obj/item/clothing/under/costume/schoolgirl, /obj/item/katana, /obj/item/food/sashimi, /obj/item/food/chawanmushi,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/sake, /obj/item/throwing_star, /obj/item/clothing/head/kitty/genuine, /obj/item/clothing/suit/space/space_ninja,
|
||||
/obj/item/clothing/mask/gas/space_ninja, /obj/item/clothing/shoes/space_ninja, /obj/item/clothing/gloves/space_ninja, /obj/item/vibro_weapon,
|
||||
/obj/item/nullrod/scythe/vibro, /obj/item/energy_katana, /obj/item/toy/katana, /obj/item/nullrod/claymore/katana, /obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe)),
|
||||
|
||||
"birds" = typecacheof(list(/obj/item/clothing/mask/gas/plaguedoctor, /obj/item/food/cracker,
|
||||
/obj/item/clothing/suit/chickensuit, /obj/item/clothing/head/chicken,
|
||||
/obj/item/clothing/suit/toggle/owlwings, /obj/item/clothing/under/costume/owl, /obj/item/clothing/mask/gas/owl_mask,
|
||||
/obj/item/clothing/under/costume/griffin, /obj/item/clothing/shoes/griffin, /obj/item/clothing/head/griffin,
|
||||
/obj/item/clothing/head/helmet/space/freedom, /obj/item/clothing/suit/space/freedom
|
||||
)),
|
||||
|
||||
"guns" = typecacheof(list(/obj/item/gun/ballistic, /obj/item/gun/energy, /obj/item/gun/syringe, /obj/item/gun/chem,
|
||||
/obj/item/gun/blastcannon, /obj/item/gun/grenadelauncher, /obj/machinery/porta_turret, /obj/machinery/power/emitter,
|
||||
/obj/item/ammo_casing, /obj/item/storage/belt/bandolier, /obj/item/storage/belt/holster, /obj/item/ammo_box,
|
||||
/obj/item/mecha_ammo, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic, /obj/item/mecha_parts/mecha_equipment/weapon/energy
|
||||
)),
|
||||
|
||||
"insects" = typecacheof(list(/obj/item/toy/plush/moth, /obj/item/toy/plush/beeplushie, /obj/item/clothing/mask/animal/rat/bee, /obj/item/clothing/suit/hooded/bee_costume, /obj/structure/beebox)),
|
||||
|
||||
"anime" = typecacheof(list(/obj/item/clothing/under/costume/schoolgirl, /obj/item/katana, /obj/item/food/sashimi, /obj/item/food/chawanmushi,
|
||||
/obj/item/reagent_containers/food/drinks/bottle/sake, /obj/item/throwing_star, /obj/item/clothing/head/kitty/genuine, /obj/item/clothing/suit/space/space_ninja,
|
||||
/obj/item/clothing/mask/gas/space_ninja, /obj/item/clothing/shoes/space_ninja, /obj/item/clothing/gloves/space_ninja, /obj/item/vibro_weapon,
|
||||
/obj/item/nullrod/scythe/vibro, /obj/item/energy_katana, /obj/item/toy/katana, /obj/item/nullrod/claymore/katana, /obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe
|
||||
)),
|
||||
))
|
||||
|
||||
GLOBAL_LIST_INIT(phobia_turfs, list(
|
||||
"space" = typecacheof(list(/turf/open/space, /turf/open/floor/holofloor/space, /turf/open/floor/fakespace)),
|
||||
"the supernatural" = typecacheof(list(/turf/open/floor/cult, /turf/closed/wall/mineral/cult)),
|
||||
"aliens" = typecacheof(list(/turf/open/floor/plating/abductor, /turf/open/floor/plating/abductor2,
|
||||
/turf/open/floor/mineral/abductor, /turf/closed/wall/mineral/abductor
|
||||
)),
|
||||
"falling" = typecacheof(list(/turf/open/chasm, /turf/open/floor/fakepit, /turf/open/openspace)),
|
||||
))
|
||||
|
||||
GLOBAL_LIST_INIT(phobia_species, list(
|
||||
"aliens" = typecacheof(list(/datum/species/abductor, /datum/species/jelly, /datum/species/pod,/datum/species/shadow)),
|
||||
"anime" = typecacheof(list(/datum/species/human/felinid)),
|
||||
"conspiracies" = typecacheof(list(/datum/species/abductor, /datum/species/lizard, /datum/species/synth)),
|
||||
"insects" = typecacheof(list(/datum/species/fly, /datum/species/moth)),
|
||||
"lizards" = typecacheof(list(/datum/species/lizard)),
|
||||
"robots" = typecacheof(list(/datum/species/android)),
|
||||
"skeletons" = typecacheof(list(/datum/species/skeleton, /datum/species/plasmaman)),
|
||||
"the supernatural" = typecacheof(list(/datum/species/golem/runic)),
|
||||
))
|
||||
|
||||
/// Creates a regular expression to match against the given phobia
|
||||
/// Capture group 2 = the scary word
|
||||
/// Capture group 3 = an optional suffix on the scary word
|
||||
/proc/construct_phobia_regex(list/name)
|
||||
var/list/words = strings(PHOBIA_FILE, name)
|
||||
if(!length(words))
|
||||
CRASH("phobia [name] has no entries")
|
||||
var/words_match = ""
|
||||
for(var/word in words)
|
||||
words_match += "[REGEX_QUOTE(word)]|"
|
||||
words_match = copytext(words_match, 1, -1)
|
||||
return regex("(\\b|\\A)([words_match])('?s*)(\\b|\\|)", "ig")
|
||||
|
||||
#undef PHOBIA_FILE
|
||||
@@ -109,14 +109,15 @@
|
||||
usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = locked ? moved : null
|
||||
return TRUE
|
||||
if(LAZYACCESS(modifiers, ALT_CLICK))
|
||||
var/buttons_locked = usr.client.prefs.read_preference(/datum/preference/toggle/buttons_locked)
|
||||
for(var/V in usr.actions)
|
||||
var/datum/action/A = V
|
||||
var/atom/movable/screen/movable/action_button/B = A.button
|
||||
B.moved = FALSE
|
||||
if(B.id && usr.client)
|
||||
usr.client.prefs.action_buttons_screen_locs["[B.name]_[B.id]"] = null
|
||||
B.locked = usr.client.prefs.buttons_locked
|
||||
locked = usr.client.prefs.buttons_locked
|
||||
B.locked = buttons_locked
|
||||
locked = buttons_locked
|
||||
moved = FALSE
|
||||
if(id && usr.client)
|
||||
usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = null
|
||||
|
||||
@@ -104,10 +104,10 @@
|
||||
if(!.)
|
||||
return
|
||||
var/mob/screenmob = viewmob || mymob
|
||||
if(!screenmob.client.prefs.ghost_hud)
|
||||
screenmob.client.screen -= static_inventory
|
||||
else
|
||||
if(screenmob.client.prefs.read_preference(/datum/preference/toggle/ghost_hud))
|
||||
screenmob.client.screen += static_inventory
|
||||
else
|
||||
screenmob.client.screen -= static_inventory
|
||||
|
||||
//We should only see observed mob alerts.
|
||||
/datum/hud/ghost/reorganize_alerts(mob/viewmob)
|
||||
|
||||
@@ -60,6 +60,18 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
///UI for screentips that appear when you mouse over things
|
||||
var/atom/movable/screen/screentip/screentip_text
|
||||
|
||||
/// Whether or not screentips are enabled.
|
||||
/// This is updated by the preference for cheaper reads than would be
|
||||
/// had with a proc call, especially on one of the hottest procs in the
|
||||
/// game (MouseEntered).
|
||||
var/screentips_enabled = TRUE
|
||||
|
||||
/// The color to use for the screentips.
|
||||
/// This is updated by the preference for cheaper reads than would be
|
||||
/// had with a proc call, especially on one of the hottest procs in the
|
||||
/// game (MouseEntered).
|
||||
var/screentip_color
|
||||
|
||||
var/atom/movable/screen/movable/action_button/hide_toggle/hide_actions_toggle
|
||||
var/action_buttons_hidden = FALSE
|
||||
|
||||
@@ -76,12 +88,12 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
|
||||
if (!ui_style)
|
||||
// will fall back to the default if any of these are null
|
||||
ui_style = ui_style2icon(owner.client && owner.client.prefs && owner.client.prefs.UI_style)
|
||||
ui_style = ui_style2icon(owner.client?.prefs?.read_preference(/datum/preference/choiced/ui_style))
|
||||
|
||||
hide_actions_toggle = new
|
||||
hide_actions_toggle.InitialiseIcon(src)
|
||||
if(mymob.client)
|
||||
hide_actions_toggle.locked = mymob.client.prefs.buttons_locked
|
||||
hide_actions_toggle.locked = mymob.client.prefs.read_preference(/datum/preference/toggle/buttons_locked)
|
||||
|
||||
hand_slots = list()
|
||||
|
||||
@@ -90,6 +102,9 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
plane_masters["[instance.plane]"] = instance
|
||||
instance.backdrop(mymob)
|
||||
|
||||
var/datum/preferences/preferences = owner?.client?.prefs
|
||||
screentip_color = preferences?.read_preference(/datum/preference/color/screentip_color)
|
||||
screentips_enabled = preferences?.read_preference(/datum/preference/toggle/enable_screentips)
|
||||
screentip_text = new(null, src)
|
||||
static_inventory += screentip_text
|
||||
|
||||
@@ -173,7 +188,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
if(toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.inventory_shown)
|
||||
screenmob.client.screen += toggleable_inventory
|
||||
//SKYRAT EDIT ADDITION BEGIN - ERP_SLOT_SYSTEM
|
||||
if(ERP_toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.ERP_inventory_shown && screenmob.client?.prefs.sextoys_pref == "Yes")
|
||||
if(ERP_toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.ERP_inventory_shown && screenmob.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy))
|
||||
screenmob.client.screen += ERP_toggleable_inventory
|
||||
//SKYRAT EDIT ADDITION END
|
||||
if(hotkeybuttons.len && !hotkey_ui_hidden)
|
||||
@@ -193,7 +208,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
if(toggleable_inventory.len)
|
||||
screenmob.client.screen -= toggleable_inventory
|
||||
//SKYRAT EDIT ADDITION BEGIN - ERP_SLOT_SYSTEM
|
||||
if(ERP_toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.ERP_inventory_shown && screenmob.client?.prefs.sextoys_pref == "Yes")
|
||||
if(ERP_toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.ERP_inventory_shown && screenmob.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy))
|
||||
screenmob.client.screen -= ERP_toggleable_inventory
|
||||
//SKYRAT EDIT ADDITION END
|
||||
if(hotkeybuttons.len)
|
||||
@@ -217,7 +232,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
if(toggleable_inventory.len)
|
||||
screenmob.client.screen -= toggleable_inventory
|
||||
//SKYRAT EDIT ADDITION BEGIN - ERP_SLOT_SYSTEM
|
||||
if(toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.ERP_inventory_shown && screenmob.client?.prefs.sextoys_pref == "Yes")
|
||||
if(toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.ERP_inventory_shown && screenmob.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy))
|
||||
screenmob.client.screen -= ERP_toggleable_inventory
|
||||
//SKYRAT EDIT ADDITION END
|
||||
if(hotkeybuttons.len)
|
||||
|
||||
@@ -239,7 +239,7 @@
|
||||
using.screen_loc = ui_erp_inventory
|
||||
using.hud = src
|
||||
// When creating a character, we will check if the ERP is enabled on the client, if not, then the ERP button is immediately invisible
|
||||
if(owner.client?.prefs.sextoys_pref != "Yes")
|
||||
if(owner.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy))
|
||||
using.invisibility = 100
|
||||
static_inventory += using
|
||||
//SKYRAT EDIT ADDITION END
|
||||
@@ -470,7 +470,7 @@
|
||||
if(H.head) screenmob.client.screen -= H.head
|
||||
|
||||
//SKYRAT EDIT ADDITION BEGIN - ERP_SLOT_SYSTEM
|
||||
if(screenmob.hud_used.ERP_inventory_shown && screenmob.hud_used.hud_shown && H.client.prefs?.sextoys_pref == "Yes")
|
||||
if(screenmob.hud_used.ERP_inventory_shown && screenmob.hud_used.hud_shown && H.client.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy))
|
||||
if(H.vagina)
|
||||
// This shity code need for hanlde an moving UI stuff when default inventory expand/collapse
|
||||
if(screenmob.hud_used.inventory_shown && screenmob.hud_used)
|
||||
@@ -535,7 +535,7 @@
|
||||
screenmob.client.screen += H.r_store
|
||||
|
||||
//SKYRAT EDIT ADDITION BEGIN - ERP_SLOT_SYSTEM
|
||||
if(H.client.prefs?.sextoys_pref == "Yes")
|
||||
if(H.client.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy))
|
||||
if(H.vagina)
|
||||
H.vagina.screen_loc = ui_vagina
|
||||
screenmob.client.screen += H.vagina
|
||||
|
||||
@@ -74,7 +74,11 @@
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
hud.mymob.client.prefs.ShowChoices(hud.mymob)
|
||||
|
||||
var/datum/preferences/preferences = hud.mymob.client.prefs
|
||||
preferences.current_window = PREFERENCE_TAB_CHARACTER_PREFERENCES
|
||||
preferences.update_static_data(usr)
|
||||
preferences.ui_interact(usr)
|
||||
|
||||
///Button that appears before the game has started
|
||||
/atom/movable/screen/lobby/button/ready
|
||||
@@ -190,21 +194,21 @@
|
||||
set_button_status(TRUE)
|
||||
UnregisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME, .proc/enable_observing)
|
||||
|
||||
|
||||
/* This is here for a future settings menu that will come with the prefs rework, if this is not in by 2022 kill mothblocks.
|
||||
/atom/movable/screen/lobby/button/settings
|
||||
icon = 'icons/hud/lobby/bottom_buttons.dmi'
|
||||
icon_state = "settings"
|
||||
base_icon_state = "settings"
|
||||
screen_loc = "TOP:-122,CENTER:+58"
|
||||
screen_loc = "TOP:-122,CENTER:+30"
|
||||
|
||||
/atom/movable/screen/lobby/button/settings/Click(location, control, params)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
hud.mymob.client.prefs.ShowChoices(hud.mymob)
|
||||
*/
|
||||
|
||||
var/datum/preferences/preferences = hud.mymob.client.prefs
|
||||
preferences.current_window = PREFERENCE_TAB_GAME_PREFERENCES
|
||||
preferences.update_static_data(usr)
|
||||
preferences.ui_interact(usr)
|
||||
|
||||
/atom/movable/screen/lobby/button/changelog_button
|
||||
icon = 'icons/hud/lobby/bottom_buttons.dmi'
|
||||
@@ -217,7 +221,7 @@
|
||||
icon = 'icons/hud/lobby/bottom_buttons.dmi'
|
||||
icon_state = "crew_manifest"
|
||||
base_icon_state = "crew_manifest"
|
||||
screen_loc = "TOP:-122,CENTER:+30"
|
||||
screen_loc = "TOP:-122,CENTER:+2"
|
||||
|
||||
/atom/movable/screen/lobby/button/crew_manifest/Click(location, control, params)
|
||||
. = ..()
|
||||
@@ -234,7 +238,7 @@
|
||||
icon = 'icons/hud/lobby/bottom_buttons.dmi'
|
||||
icon_state = "poll"
|
||||
base_icon_state = "poll"
|
||||
screen_loc = "TOP:-122,CENTER:+2"
|
||||
screen_loc = "TOP:-122,CENTER:-26"
|
||||
|
||||
var/new_poll = FALSE
|
||||
|
||||
|
||||
@@ -48,10 +48,10 @@
|
||||
var/mob/screenmob = viewmob || mymob
|
||||
var/client/C = screenmob.client
|
||||
if(C.prefs)
|
||||
var/pref = C.prefs.parallax
|
||||
var/pref = C.prefs.read_preference(/datum/preference/choiced/parallax)
|
||||
if (isnull(pref))
|
||||
pref = PARALLAX_HIGH
|
||||
switch(C.prefs.parallax)
|
||||
switch(pref)
|
||||
if (PARALLAX_INSANE)
|
||||
C.parallax_throttle = FALSE
|
||||
C.parallax_layers_max = 5
|
||||
|
||||
@@ -58,7 +58,8 @@
|
||||
blend_mode = BLEND_OVERLAY
|
||||
|
||||
/atom/movable/screen/plane_master/game_world/backdrop(mob/mymob)
|
||||
if(istype(mymob) && mymob.client && mymob.client.prefs && mymob.client.prefs.ambientocclusion)
|
||||
remove_filter("AO")
|
||||
if(istype(mymob) && mymob.client?.prefs?.read_preference(/datum/preference/toggle/ambient_occlusion))
|
||||
add_filter("AO", 1, drop_shadow_filter(x = 0, y = -2, size = 4, color = "#04080FAA"))
|
||||
|
||||
|
||||
@@ -184,6 +185,6 @@
|
||||
blend_mode = BLEND_OVERLAY
|
||||
|
||||
/atom/movable/screen/plane_master/runechat/backdrop(mob/mymob)
|
||||
filters = list()
|
||||
if(istype(mymob) && mymob.client?.prefs?.ambientocclusion)
|
||||
remove_filter("AO")
|
||||
if(istype(mymob) && mymob.client?.prefs?.read_preference(/datum/preference/toggle/ambient_occlusion))
|
||||
add_filter("AO", 1, drop_shadow_filter(x = 0, y = -2, size = 4, color = "#04080FAA"))
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
return TRUE
|
||||
else if(isAdminGhostAI(user))
|
||||
attack_ai(user)
|
||||
else if(user.client.prefs.inquisitive_ghost)
|
||||
else if(user.client.prefs.read_preference(/datum/preference/toggle/inquisitive_ghost))
|
||||
user.examinate(src)
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -235,6 +235,7 @@
|
||||
var/tm_info = GLOB.revdata.GetTestMergeInfo()
|
||||
if(motd || tm_info)
|
||||
motd = motd ? "[motd]<br>[tm_info]" : tm_info
|
||||
|
||||
/*
|
||||
Policy file should be a json file with a single object.
|
||||
Value is raw html.
|
||||
|
||||
@@ -110,8 +110,6 @@
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_FLAG
|
||||
|
||||
/datum/config_entry/flag/join_with_mutant_humans //players can pick mutant bodyparts for humans before joining the game
|
||||
|
||||
/datum/config_entry/flag/no_summon_guns //No
|
||||
|
||||
/datum/config_entry/flag/no_summon_magic //Fun
|
||||
|
||||
@@ -64,6 +64,10 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
|
||||
var/current_runlevel //!for scheduling different subsystems for different stages of the round
|
||||
var/sleep_offline_after_initializations = TRUE
|
||||
|
||||
/// During initialization, will be the instanced subsytem that is currently initializing.
|
||||
/// Outside of initialization, returns null.
|
||||
var/current_initializing_subsystem = null
|
||||
|
||||
var/static/restart_clear = 0
|
||||
var/static/restart_timeout = 0
|
||||
var/static/restart_count = 0
|
||||
@@ -214,8 +218,10 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
|
||||
for (var/datum/controller/subsystem/SS in subsystems)
|
||||
if (SS.flags & SS_NO_INIT || SS.initialized) //Don't init SSs with the correspondig flag or if they already are initialzized
|
||||
continue
|
||||
current_initializing_subsystem = SS
|
||||
SS.Initialize(REALTIMEOFDAY)
|
||||
CHECK_TICK
|
||||
current_initializing_subsystem = null
|
||||
current_ticklimit = TICK_LIMIT_RUNNING
|
||||
var/time = (REALTIMEOFDAY - start_timeofday) / 10
|
||||
|
||||
|
||||
@@ -17,6 +17,9 @@ SUBSYSTEM_DEF(atoms)
|
||||
///initAtom() adds the atom its creating to this list iff InitializeAtoms() has been given a list to populate as an argument
|
||||
var/list/created_atoms
|
||||
|
||||
/// Atoms that will be deleted once the subsystem is initialized
|
||||
var/list/queued_deletions = list()
|
||||
|
||||
initialized = INITIALIZATION_INSSATOMS
|
||||
|
||||
/datum/controller/subsystem/atoms/Initialize(timeofday)
|
||||
@@ -75,6 +78,12 @@ SUBSYSTEM_DEF(atoms)
|
||||
atoms_to_return += created_atoms
|
||||
created_atoms = null
|
||||
|
||||
for (var/queued_deletion in queued_deletions)
|
||||
qdel(queued_deletion)
|
||||
|
||||
testing("[queued_deletions.len] atoms were queued for deletion.")
|
||||
queued_deletions.Cut()
|
||||
|
||||
/// Init this specific atom
|
||||
/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, from_template = FALSE, list/arguments)
|
||||
var/the_type = A.type
|
||||
@@ -169,6 +178,14 @@ SUBSYSTEM_DEF(atoms)
|
||||
if(fails & BAD_INIT_SLEPT)
|
||||
. += "- Slept during Initialize()\n"
|
||||
|
||||
/// Prepares an atom to be deleted once the atoms SS is initialized.
|
||||
/datum/controller/subsystem/atoms/proc/prepare_deletion(atom/target)
|
||||
if (initialized == INITIALIZATION_INNEW_REGULAR)
|
||||
// Atoms SS has already completed, just kill it now.
|
||||
qdel(target)
|
||||
else
|
||||
queued_deletions += WEAKREF(target)
|
||||
|
||||
/datum/controller/subsystem/atoms/Shutdown()
|
||||
var/initlog = InitLog()
|
||||
if(initlog)
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
/// Initializes any assets that need to be loaded ASAP.
|
||||
/// This houses preference menu assets, since they can be loaded at any time,
|
||||
/// most dangerously before the atoms SS initializes.
|
||||
/// Thus, we want it to fail consistently in CI as if it would've if a player
|
||||
/// opened it up early.
|
||||
SUBSYSTEM_DEF(early_assets)
|
||||
name = "Early Assets"
|
||||
init_order = INIT_ORDER_EARLY_ASSETS
|
||||
flags = SS_NO_FIRE
|
||||
|
||||
/datum/controller/subsystem/early_assets/Initialize(start_timeofday)
|
||||
for (var/datum/asset/asset_type as anything in subtypesof(/datum/asset))
|
||||
if (initial(asset_type._abstract) == asset_type)
|
||||
continue
|
||||
|
||||
if (!initial(asset_type.early))
|
||||
continue
|
||||
|
||||
if (!get_asset_datum(asset_type))
|
||||
stack_trace("Could not initialize early asset [asset_type]!")
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
return ..()
|
||||
@@ -74,7 +74,6 @@ SUBSYSTEM_DEF(job)
|
||||
SetupOccupations()
|
||||
if(CONFIG_GET(flag/load_jobs_from_txt))
|
||||
LoadJobs()
|
||||
generate_selectable_species()
|
||||
set_overflow_role(CONFIG_GET(string/overflow_job))
|
||||
return ..()
|
||||
|
||||
@@ -175,6 +174,7 @@ SUBSYSTEM_DEF(job)
|
||||
return name_occupations[rank]
|
||||
|
||||
/datum/controller/subsystem/job/proc/GetJobType(jobtype)
|
||||
RETURN_TYPE(/datum/job)
|
||||
if(!length(all_occupations))
|
||||
SetupOccupations()
|
||||
return type_occupations[jobtype]
|
||||
@@ -529,27 +529,32 @@ SUBSYSTEM_DEF(job)
|
||||
|
||||
//We couldn't find a job from prefs for this guy.
|
||||
/datum/controller/subsystem/job/proc/HandleUnassigned(mob/dead/new_player/player)
|
||||
var/jobless_role = player.client.prefs.read_preference(/datum/preference/choiced/jobless_role)
|
||||
|
||||
if(PopcapReached())
|
||||
RejectPlayer(player)
|
||||
else if(player.client.prefs.joblessrole == BEOVERFLOW)
|
||||
var/datum/job/overflow_role_datum = GetJobType(overflow_role)
|
||||
var/allowed_to_be_a_loser = !is_banned_from(player.ckey, overflow_role_datum.title)
|
||||
if(QDELETED(player) || !allowed_to_be_a_loser)
|
||||
RejectPlayer(player)
|
||||
else
|
||||
if(!AssignRole(player, overflow_role_datum))
|
||||
return
|
||||
|
||||
switch (jobless_role)
|
||||
if (BEOVERFLOW)
|
||||
var/datum/job/overflow_role_datum = GetJobType(overflow_role)
|
||||
var/allowed_to_be_a_loser = !is_banned_from(player.ckey, overflow_role_datum.title)
|
||||
if(QDELETED(player) || !allowed_to_be_a_loser)
|
||||
RejectPlayer(player)
|
||||
else if(player.client.prefs.joblessrole == BERANDOMJOB)
|
||||
if(!GiveRandomJob(player))
|
||||
else
|
||||
if(!AssignRole(player, overflow_role_datum))
|
||||
RejectPlayer(player)
|
||||
if (BERANDOMJOB)
|
||||
if(!GiveRandomJob(player))
|
||||
RejectPlayer(player)
|
||||
if (RETURNTOLOBBY)
|
||||
RejectPlayer(player)
|
||||
else //Something gone wrong if we got here.
|
||||
var/message = "DO: [player] fell through handling unassigned"
|
||||
JobDebug(message)
|
||||
log_game(message)
|
||||
message_admins(message)
|
||||
RejectPlayer(player)
|
||||
else if(player.client.prefs.joblessrole == RETURNTOLOBBY)
|
||||
RejectPlayer(player)
|
||||
else //Something gone wrong if we got here.
|
||||
var/message = "DO: [player] fell through handling unassigned"
|
||||
JobDebug(message)
|
||||
log_game(message)
|
||||
message_admins(message)
|
||||
RejectPlayer(player)
|
||||
|
||||
|
||||
//Gives the player the stuff he should have with his rank
|
||||
@@ -559,18 +564,10 @@ SUBSYSTEM_DEF(job)
|
||||
SEND_SIGNAL(equipping, COMSIG_JOB_RECEIVED, job)
|
||||
|
||||
equipping.mind?.set_assigned_role(job)
|
||||
//SKYRAT EDIT ADD - ALTERNATE JOB TITLES
|
||||
var/display_rank = job.title
|
||||
if(player_client && player_client.prefs && player_client.prefs.alt_titles_preferences[job.title])
|
||||
display_rank = player_client.prefs.alt_titles_preferences[job.title]
|
||||
if(player_client)
|
||||
to_chat(player_client, "<span class='infoplain'><b>You are the [display_rank].</b></span>")
|
||||
/* SKYRAT EDIT ORIGINAL
|
||||
if(player_client)
|
||||
to_chat(player_client, "<span class='infoplain'><b>You are the [job.title].</b></span>")
|
||||
*/ // SKYRAT EDIT END
|
||||
to_chat(player_client, span_infoplain("You are the [job.title]."))
|
||||
|
||||
equipping.on_job_equipping(job)
|
||||
equipping.on_job_equipping(job, player_client?.prefs) //SKYRAT EDIT CHANGE
|
||||
|
||||
job.announce_job(equipping)
|
||||
|
||||
@@ -581,15 +578,8 @@ SUBSYSTEM_DEF(job)
|
||||
handle_auto_deadmin_roles(player_client, job.title)
|
||||
|
||||
|
||||
var/list/packed_items //SKYRAT EDIT ADD - CUSTOMISATION
|
||||
if(job)
|
||||
if (player_client && job.no_dresscode && job.loadout)
|
||||
packed_items = player_client.prefs.equip_preference_loadout(equipping,FALSE,job,blacklist=job.blacklist_dresscode_slots,initial=TRUE)
|
||||
//SKYRAT EDIT ADDITION END
|
||||
|
||||
if(player_client)
|
||||
to_chat(player_client, "<span class='infoplain'><b>As the [display_rank] you answer directly to [job.supervisors]. Special circumstances may change this. Your role is that of a [job.title]. Regardless of what your job title may be, please work to fulfil that role.</b></span>") //SKYRAT EDIT -- ALT TITLES
|
||||
// to_chat(player_client, "<span class='infoplain'><b>As the [job.title] you answer directly to [job.supervisors]. Special circumstances may change this.</span></b>" // SKYRAT EDIT ORIGINAL
|
||||
to_chat(player_client, span_infoplain("As the [job.title] you answer directly to [job.supervisors]. Special circumstances may change this.")) // SKYRAT EDIT ORIGINAL
|
||||
|
||||
job.radio_help_message(equipping)
|
||||
|
||||
@@ -610,14 +600,6 @@ SUBSYSTEM_DEF(job)
|
||||
|
||||
job.after_spawn(equipping, player_client)
|
||||
|
||||
//SKYRAT CHANGE ADDITION BEGIN - CUSTOMIZATION
|
||||
if(!job.no_dresscode && job.loadout)
|
||||
if(player_client)
|
||||
packed_items = player_client.prefs.equip_preference_loadout(equipping, FALSE, job,initial=TRUE)
|
||||
if(packed_items)
|
||||
player_client.prefs.add_packed_items(equipping, packed_items)
|
||||
//SKYRAT CHANGE ADDITION END
|
||||
|
||||
/datum/controller/subsystem/job/proc/handle_auto_deadmin_roles(client/C, rank)
|
||||
if(!C?.holder)
|
||||
return TRUE
|
||||
|
||||
@@ -378,7 +378,7 @@ GLOBAL_LIST_EMPTY(the_station_areas)
|
||||
var/pmv = CONFIG_GET(flag/preference_map_voting)
|
||||
if(pmv)
|
||||
for (var/client/c in GLOB.clients)
|
||||
var/vote = c.prefs.preferred_map
|
||||
var/vote = c.prefs.read_preference(/datum/preference/choiced/preferred_map)
|
||||
if (!vote)
|
||||
if (global.config.defaultmap)
|
||||
mapvotes[global.config.defaultmap.map_name] += 1
|
||||
|
||||
@@ -21,8 +21,6 @@ SUBSYSTEM_DEF(persistence)
|
||||
var/list/picture_logging_information = list()
|
||||
var/list/obj/structure/sign/picture_frame/photo_frames
|
||||
var/list/obj/item/storage/photo_album/photo_albums
|
||||
var/list/obj/structure/sign/painting/painting_frames = list()
|
||||
var/list/paintings = list()
|
||||
|
||||
|
||||
/datum/controller/subsystem/persistence/Initialize()
|
||||
@@ -33,7 +31,6 @@ SUBSYSTEM_DEF(persistence)
|
||||
LoadRecentMaps()
|
||||
LoadPhotoPersistence()
|
||||
LoadRandomizedRecipes()
|
||||
LoadPaintings()
|
||||
LoadPanicBunker() //SKYRAT EDIT ADDITION - PANICBUNKER
|
||||
load_custom_outfits()
|
||||
|
||||
@@ -48,7 +45,6 @@ SUBSYSTEM_DEF(persistence)
|
||||
SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION.
|
||||
SaveRandomizedRecipes()
|
||||
SavePanicBunker()//SKYRAT EDIT ADDITION - PANICBUNKER
|
||||
SavePaintings()
|
||||
SaveScars()
|
||||
save_custom_outfits()
|
||||
|
||||
@@ -413,22 +409,6 @@ SUBSYSTEM_DEF(persistence)
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/LoadPaintings()
|
||||
var/json_file = file("data/paintings.json")
|
||||
if(fexists(json_file))
|
||||
paintings = json_decode(file2text(json_file))
|
||||
|
||||
for(var/obj/structure/sign/painting/P in painting_frames)
|
||||
P.load_persistent()
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/SavePaintings()
|
||||
for(var/obj/structure/sign/painting/P in painting_frames)
|
||||
P.save_persistent()
|
||||
|
||||
var/json_file = file("data/paintings.json")
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(paintings))
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/SaveScars()
|
||||
for(var/i in GLOB.joined_player_list)
|
||||
var/mob/living/carbon/human/ending_human = get_mob_by_ckey(i)
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
SUBSYSTEM_DEF(persistent_paintings)
|
||||
name = "Persistent Paintings"
|
||||
init_order = INIT_ORDER_PERSISTENT_PAINTINGS
|
||||
flags = SS_NO_FIRE
|
||||
|
||||
/// A list of painting frames that this controls
|
||||
var/list/obj/structure/sign/painting/painting_frames = list()
|
||||
|
||||
/// A map of identifiers (such as library) to paintings from paintings.json
|
||||
var/list/paintings = list()
|
||||
|
||||
/datum/controller/subsystem/persistent_paintings/Initialize(start_timeofday)
|
||||
var/json_file = file("data/paintings.json")
|
||||
if(fexists(json_file))
|
||||
paintings = json_decode(file2text(json_file))
|
||||
|
||||
for(var/obj/structure/sign/painting/painting_frame as anything in painting_frames)
|
||||
painting_frame.load_persistent()
|
||||
|
||||
return ..()
|
||||
|
||||
/// Saves all persistent paintings
|
||||
/datum/controller/subsystem/persistent_paintings/proc/save_paintings()
|
||||
for(var/obj/structure/sign/painting/painting_frame as anything in painting_frames)
|
||||
painting_frame.save_persistent()
|
||||
|
||||
var/json_file = file("data/paintings.json")
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(paintings))
|
||||
@@ -69,21 +69,6 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
|
||||
var/datum/quirk/wayfinder = /datum/quirk/item_quirk/needswayfinder
|
||||
if(user.add_quirk(wayfinder))
|
||||
SSblackbox.record_feedback("nested tally", "quirks_taken", 1, list(initial(wayfinder.name)))
|
||||
|
||||
|
||||
// SKYRAT EDIT ADDITION START - Customization (food prefs)
|
||||
// This was done in this proc on old skyrat and i cba to find a better way
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(H))
|
||||
if(cli.prefs.foodlikes.len)
|
||||
H.dna.species.liked_food = 0
|
||||
for(var/V in cli.prefs.foodlikes)
|
||||
H.dna.species.liked_food |= cli.prefs.foodlikes[V]
|
||||
if(cli.prefs.fooddislikes.len)
|
||||
H.dna.species.disliked_food = 0
|
||||
for(var/V in cli.prefs.fooddislikes)
|
||||
H.dna.species.disliked_food |= cli.prefs.fooddislikes[V]
|
||||
// SKYRAT EDIT ADDITION END
|
||||
/*
|
||||
*Randomises the quirks for a specified mob
|
||||
*/
|
||||
@@ -147,5 +132,66 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
|
||||
for(var/datum/quirk/quirk as anything in quirks_to_add)
|
||||
user.add_quirk(quirks[quirk]) //these are typepaths converted from string
|
||||
|
||||
/// Takes a list of quirk names and returns a new list of quirks that would
|
||||
/// be valid.
|
||||
/// If no changes need to be made, will return the same list.
|
||||
/// Expects all quirk names to be unique, but makes no other expectations.
|
||||
/datum/controller/subsystem/processing/quirks/proc/filter_invalid_quirks(list/quirks)
|
||||
var/list/new_quirks = list()
|
||||
var/list/positive_quirks = list()
|
||||
var/balance = 0
|
||||
|
||||
for (var/quirk_name in quirks)
|
||||
var/datum/quirk/quirk = SSquirks.quirks[quirk_name]
|
||||
if (isnull(quirk))
|
||||
continue
|
||||
|
||||
if (initial(quirk.mood_quirk) && CONFIG_GET(flag/disable_human_mood))
|
||||
continue
|
||||
|
||||
var/blacklisted = FALSE
|
||||
|
||||
for (var/list/blacklist as anything in quirk_blacklist)
|
||||
if (!(quirk in blacklist))
|
||||
continue
|
||||
|
||||
for (var/other_quirk in blacklist)
|
||||
if (other_quirk in new_quirks)
|
||||
blacklisted = TRUE
|
||||
break
|
||||
|
||||
if (blacklisted)
|
||||
break
|
||||
|
||||
if (blacklisted)
|
||||
continue
|
||||
|
||||
var/value = initial(quirk.value)
|
||||
if (value > 0)
|
||||
if (positive_quirks.len == MAX_QUIRKS)
|
||||
continue
|
||||
|
||||
positive_quirks[quirk_name] = value
|
||||
|
||||
balance += value
|
||||
new_quirks += quirk_name
|
||||
|
||||
if (balance > 0)
|
||||
var/balance_left_to_remove = balance
|
||||
|
||||
for (var/positive_quirk in positive_quirks)
|
||||
var/value = positive_quirks[positive_quirk]
|
||||
balance_left_to_remove -= value
|
||||
new_quirks -= positive_quirk
|
||||
|
||||
if (balance_left_to_remove <= 0)
|
||||
break
|
||||
|
||||
// It is guaranteed that if no quirks are invalid, you can simply check through `==`
|
||||
if (new_quirks.len == quirks.len)
|
||||
return quirks
|
||||
|
||||
return new_quirks
|
||||
|
||||
#undef RANDOM_QUIRK_BONUS
|
||||
#undef MINIMUM_RANDOM_QUIRKS
|
||||
|
||||
@@ -17,7 +17,6 @@ PROCESSING_SUBSYSTEM_DEF(reagents)
|
||||
///Blacklists these reagents from being added to the master list. the exact type only. Children are not blacklisted.
|
||||
GLOB.fake_reagent_blacklist = list(/datum/reagent/medicine/c2, /datum/reagent/medicine, /datum/reagent/reaction_agent)
|
||||
//Build GLOB lists - see holder.dm
|
||||
build_chemical_reagent_list()
|
||||
build_chemical_reactions_lists()
|
||||
return
|
||||
|
||||
|
||||
@@ -414,6 +414,12 @@ SUBSYSTEM_DEF(ticker)
|
||||
if(new_player_mob.client?.prefs?.should_be_random_hardcore(player_assigned_role, new_player_living.mind))
|
||||
new_player_mob.client.prefs.hardcore_random_setup(new_player_living)
|
||||
SSquirks.AssignQuirks(new_player_living, new_player_mob.client)
|
||||
|
||||
//SKYRAT EDIT ADDITION
|
||||
if(ishuman(new_player_living))
|
||||
for(var/datum/loadout_item/item as anything in loadout_list_to_datums(new_player_mob.client?.prefs?.loadout_list))
|
||||
item.post_equip_item(new_player_mob.client?.prefs, new_player_living)
|
||||
//SKYRAT EDIT END
|
||||
CHECK_TICK
|
||||
|
||||
if(captainless)
|
||||
@@ -437,7 +443,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
officer_mobs += character
|
||||
|
||||
var/datum/client_interface/client = GET_CLIENT(new_player_mob)
|
||||
var/preference = client?.prefs?.prefered_security_department || SEC_DEPT_NONE
|
||||
var/preference = client?.prefs?.read_preference(/datum/preference/choiced/security_department)
|
||||
officer_preferences += preference
|
||||
|
||||
var/distribution = get_officer_departments(officer_preferences, departments)
|
||||
@@ -483,7 +489,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
m = pick(memetips)
|
||||
|
||||
if(m)
|
||||
to_chat(world, span_purple("<span class='oocplain'><b>Tip of the round: </b>[html_encode(m)]</span>"))
|
||||
to_chat(world, span_purple(examine_block("<span class='oocplain'><b>Tip of the round: </b>[html_encode(m)]</span>"))) //SKYRAT EDIT CHAGNE
|
||||
|
||||
/datum/controller/subsystem/ticker/proc/check_queue()
|
||||
if(!queued_players.len)
|
||||
|
||||
@@ -64,7 +64,7 @@ SUBSYSTEM_DEF(vote)
|
||||
else if(mode == "map")
|
||||
for (var/non_voter_ckey in non_voters)
|
||||
var/client/C = non_voters[non_voter_ckey]
|
||||
var/preferred_map = C.prefs.preferred_map
|
||||
var/preferred_map = C.prefs.read_preference(/datum/preference/choiced/preferred_map)
|
||||
if(isnull(global.config.defaultmap))
|
||||
continue
|
||||
if(!preferred_map)
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
LAZYADD(M.actions, src)
|
||||
if(M.client)
|
||||
M.client.screen += button
|
||||
button.locked = M.client.prefs.buttons_locked || button.id ? M.client.prefs.action_buttons_screen_locs["[name]_[button.id]"] : FALSE //even if it's not defaultly locked we should remember we locked it before
|
||||
button.locked = M.client.prefs.read_preference(/datum/preference/toggle/buttons_locked) || button.id ? M.client.prefs.action_buttons_screen_locs["[name]_[button.id]"] : FALSE //even if it's not defaultly locked we should remember we locked it before
|
||||
button.moved = button.id ? M.client.prefs.action_buttons_screen_locs["[name]_[button.id]"] : FALSE
|
||||
M.update_action_buttons()
|
||||
else
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
setup_friend()
|
||||
return
|
||||
|
||||
real_name = appearance_from_prefs.real_name
|
||||
real_name = appearance_from_prefs.read_preference(/datum/preference/name/real_name)
|
||||
name = real_name
|
||||
|
||||
// Determine what job is marked as 'High' priority.
|
||||
@@ -141,7 +141,7 @@
|
||||
appearance_job = SSjob.GetJob("Assistant")
|
||||
|
||||
if(istype(appearance_job, /datum/job/ai))
|
||||
human_image = icon('icons/mob/ai.dmi', icon_state = resolve_ai_icon(appearance_from_prefs.preferred_ai_core_display), dir = SOUTH)
|
||||
human_image = icon('icons/mob/ai.dmi', icon_state = resolve_ai_icon(appearance_from_prefs.read_preference(/datum/preference/choiced/ai_core_display)), dir = SOUTH)
|
||||
return
|
||||
|
||||
if(istype(appearance_job, /datum/job/cyborg))
|
||||
@@ -194,7 +194,7 @@
|
||||
friend_talk(message)
|
||||
|
||||
/mob/camera/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list())
|
||||
if (client?.prefs.chat_on_map && (client.prefs.see_chat_non_mob || ismob(speaker)))
|
||||
if (client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) && (client.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker)))
|
||||
create_chat_message(speaker, message_language, raw_message, spans)
|
||||
to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods))
|
||||
|
||||
|
||||
@@ -22,16 +22,16 @@
|
||||
phobia_type = new_phobia_type
|
||||
|
||||
if(!phobia_type)
|
||||
phobia_type = pick(SStraumas.phobia_types)
|
||||
phobia_type = pick(GLOB.phobia_types)
|
||||
|
||||
gain_text = "<span class='warning'>You start finding [phobia_type] very unnerving...</span>"
|
||||
lose_text = "<span class='notice'>You no longer feel afraid of [phobia_type].</span>"
|
||||
scan_desc += " of [phobia_type]"
|
||||
trigger_regex = SStraumas.phobia_regexes[phobia_type]
|
||||
trigger_mobs = SStraumas.phobia_mobs[phobia_type]
|
||||
trigger_objs = SStraumas.phobia_objs[phobia_type]
|
||||
trigger_turfs = SStraumas.phobia_turfs[phobia_type]
|
||||
trigger_species = SStraumas.phobia_species[phobia_type]
|
||||
trigger_regex = GLOB.phobia_regexes[phobia_type]
|
||||
trigger_mobs = GLOB.phobia_mobs[phobia_type]
|
||||
trigger_objs = GLOB.phobia_objs[phobia_type]
|
||||
trigger_turfs = GLOB.phobia_turfs[phobia_type]
|
||||
trigger_species = GLOB.phobia_species[phobia_type]
|
||||
..()
|
||||
|
||||
/datum/brain_trauma/mild/phobia/on_life(delta_time, times_fired)
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
text = replacetext(text, span_check, "")
|
||||
|
||||
// Clip message
|
||||
var/maxlen = owned_by.prefs.max_chat_length
|
||||
var/maxlen = owned_by.prefs.read_preference(/datum/preference/numeric/max_chat_length)
|
||||
if (length_char(text) > maxlen)
|
||||
text = copytext_char(text, 1, maxlen + 1) + "..." // BYOND index moment
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
msg += event.description
|
||||
else
|
||||
msg += "[span_nicegreen("I don't have much of a reaction to anything right now.")]\n"
|
||||
to_chat(user, msg)
|
||||
to_chat(user, examine_block(msg)) //SKYRAT EDIT CHANGE
|
||||
|
||||
///Called after moodevent/s have been added/removed.
|
||||
/datum/component/mood/proc/update_mood()
|
||||
|
||||
+3
-32
@@ -141,7 +141,7 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
|
||||
var/datum/data/record/foundrecord = find_record("name", name, GLOB.data_core.general)
|
||||
if(foundrecord)
|
||||
foundrecord.fields["rank"] = assignment
|
||||
foundrecord.fields["truerank"] = assignment // SKYRAT EDIT - ALT TITLES
|
||||
|
||||
|
||||
/datum/datacore/proc/get_manifest()
|
||||
// First we build up the order in which we want the departments to appear in.
|
||||
@@ -154,14 +154,12 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
|
||||
for(var/datum/data/record/record as anything in GLOB.data_core.general)
|
||||
var/name = record.fields["name"]
|
||||
var/rank = record.fields["rank"]
|
||||
var/truerank = record.fields["truerank"] // SKYRAT EDIT ADD - ALT TITLES
|
||||
var/datum/job/job = SSjob.GetJob(truerank) // SKYRAT EDIT - ORIGINAL CALLED GetJob(rank)
|
||||
var/datum/job/job = SSjob.GetJob(rank)
|
||||
if(!job || !(job.job_flags & JOB_CREW_MANIFEST) || !LAZYLEN(job.departments_list)) // In case an unlawful custom rank is added.
|
||||
var/list/misc_list = manifest_out[DEPARTMENT_UNASSIGNED]
|
||||
misc_list[++misc_list.len] = list(
|
||||
"name" = name,
|
||||
"rank" = rank,
|
||||
"truerank" = truerank,
|
||||
)
|
||||
continue
|
||||
for(var/department_type as anything in job.departments_list)
|
||||
@@ -172,7 +170,6 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
|
||||
var/list/entry = list(
|
||||
"name" = name,
|
||||
"rank" = rank,
|
||||
"truerank" = truerank,
|
||||
)
|
||||
var/list/department_list = manifest_out[department.department_name]
|
||||
if(istype(job, department.department_head))
|
||||
@@ -223,13 +220,7 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
|
||||
var/static/list/show_directions = list(SOUTH, WEST)
|
||||
if(H.mind?.assigned_role.job_flags & JOB_CREW_MANIFEST)
|
||||
var/assignment = H.mind.assigned_role.title
|
||||
//SKYRAT EDIT ADD - ALTERNATE JOB TITLES
|
||||
var/true_assignment = assignment
|
||||
if(H.client && H.client.prefs && H.client.prefs.alt_titles_preferences[true_assignment]) // latejoin
|
||||
assignment = H.client.prefs.alt_titles_preferences[true_assignment]
|
||||
else if(C && C.prefs && C.prefs.alt_titles_preferences[true_assignment]) // roundstart - yes both do separate things i don't fucking know why but they do and if they're not both there then they don't fucking work leave me ALONE
|
||||
assignment = C.prefs.alt_titles_preferences[true_assignment]
|
||||
//SKYRAT EDIT ADD END
|
||||
|
||||
var/static/record_id_num = 1001
|
||||
var/id = num2hex(record_id_num++,6)
|
||||
if(!C)
|
||||
@@ -252,7 +243,6 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
|
||||
G.fields["id"] = id
|
||||
G.fields["name"] = H.real_name
|
||||
G.fields["rank"] = assignment
|
||||
G.fields["truerank"] = true_assignment // SKYRAT EDIT ADD - ALT TITLES
|
||||
G.fields["age"] = H.age
|
||||
G.fields["species"] = H.dna.species.name
|
||||
G.fields["fingerprint"] = md5(H.dna.unique_identity)
|
||||
@@ -267,10 +257,6 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
|
||||
G.fields["gender"] = "Other"
|
||||
G.fields["photo_front"] = photo_front
|
||||
G.fields["photo_side"] = photo_side
|
||||
if(C && C.prefs && C.prefs.general_record) // SKYRAT EDIT ADD - RP RECORDS
|
||||
G.fields["past_records"] = C.prefs.general_record
|
||||
else
|
||||
G.fields["past_records"] = "" // SKYRAT EDIT END
|
||||
general += G
|
||||
|
||||
//Medical Record
|
||||
@@ -287,10 +273,6 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
|
||||
M.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
|
||||
M.fields["notes"] = H.get_quirk_string(!medical, CAT_QUIRK_NOTES)
|
||||
M.fields["notes_d"] = H.get_quirk_string(medical, CAT_QUIRK_NOTES)
|
||||
if(C && C.prefs && C.prefs.general_record) // SKYRAT EDIT ADD - RP RECORDS
|
||||
M.fields["past_records"] = C.prefs.medical_record
|
||||
else
|
||||
M.fields["past_records"] = "" // SKYRAT EDIT END
|
||||
medical += M
|
||||
|
||||
//Security Record
|
||||
@@ -301,10 +283,6 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
|
||||
S.fields["citation"] = list()
|
||||
S.fields["crim"] = list()
|
||||
S.fields["notes"] = "No notes."
|
||||
if(C && C.prefs && C.prefs.general_record) // SKYRAT EDIT ADD - RP RECORDS
|
||||
S.fields["past_records"] = C.prefs.security_record
|
||||
else
|
||||
S.fields["past_records"] = "" // SKYRAT EDIT END
|
||||
security += S
|
||||
|
||||
//Locked Record
|
||||
@@ -312,7 +290,6 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
|
||||
L.fields["id"] = md5("[H.real_name][assignment]") //surely this should just be id, like the others?
|
||||
L.fields["name"] = H.real_name
|
||||
L.fields["rank"] = assignment
|
||||
L.fields["truerank"] = true_assignment // SKYRAT EDIT ADD - ALT TITLES
|
||||
L.fields["age"] = H.age
|
||||
L.fields["gender"] = H.gender
|
||||
if(H.gender == "male")
|
||||
@@ -328,12 +305,6 @@ GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
|
||||
L.fields["features"] = H.dna.features
|
||||
L.fields["image"] = image
|
||||
L.fields["mindref"] = H.mind
|
||||
// SKYRAT EDIT ADD BEGIN - EXAMINE RECORDS
|
||||
if(C && C.prefs && C.prefs.general_record)
|
||||
L.fields["exp_records"] = C.prefs.exploitable_info //TODO: somebody with less coding anxiety please add a field that stores C.prefs.background_info
|
||||
else
|
||||
L.fields["exp_records"] = ""
|
||||
// SKYRAT EDIT END
|
||||
locked += L
|
||||
return
|
||||
|
||||
|
||||
+3
-3
@@ -430,7 +430,7 @@
|
||||
update_atom_languages()
|
||||
*/
|
||||
//SKYRAT EDIT REMOVAL BEGIN
|
||||
|
||||
/*
|
||||
/mob/living/carbon/human/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE)
|
||||
..()
|
||||
if(icon_update)
|
||||
@@ -438,7 +438,7 @@
|
||||
update_hair()
|
||||
update_body_parts()
|
||||
update_mutations_overlay()// no lizard with human hulk overlay please.
|
||||
|
||||
*/
|
||||
|
||||
/mob/proc/has_dna()
|
||||
return
|
||||
@@ -492,7 +492,7 @@
|
||||
/mob/living/carbon/proc/create_dna()
|
||||
dna = new /datum/dna(src)
|
||||
if(!dna.species)
|
||||
var/rando_race = GLOB.species_list[pick(GLOB.roundstart_races)]
|
||||
var/rando_race = pick(get_selectable_species())
|
||||
dna.species = new rando_race()
|
||||
|
||||
//proc used to update the mob's appearance after its dna UI has been changed
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(href_list["examine"])
|
||||
to_chat(user, span_notice("[build_label_text(source)]"))
|
||||
to_chat(user, span_notice(examine_block("[build_label_text(source)]"))) //SKYRAT EDIT CHANGE
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
emote_key = initial(faketype.key)
|
||||
name = initial(faketype.key)
|
||||
full_name = capitalize(initial(faketype.key))
|
||||
description = "Do the emote '*[emote_key]'"
|
||||
|
||||
/datum/keybinding/emote/down(client/user)
|
||||
. = ..()
|
||||
|
||||
+18
-18
@@ -261,12 +261,12 @@
|
||||
if(!length(shown_skills))
|
||||
to_chat(user, span_notice("You don't seem to have any particularly outstanding skills."))
|
||||
return
|
||||
var/msg = "[span_info("*---------*\n<EM>Your skills</EM>")]\n<span class='notice'>"
|
||||
var/msg = "[span_info("<EM>Your skills</EM>")]\n<span class='notice'><hr>" //SKYRAT EDIT CHANGE
|
||||
for(var/i in shown_skills)
|
||||
var/datum/skill/the_skill = i
|
||||
msg += "[initial(the_skill.name)] - [get_skill_level_name(the_skill)]\n"
|
||||
msg += "</span>"
|
||||
to_chat(user, msg)
|
||||
to_chat(user, examine_block(msg)) //SKYRAT EDIT CHANGE
|
||||
|
||||
/datum/mind/proc/set_death_time()
|
||||
SIGNAL_HANDLER
|
||||
@@ -416,24 +416,24 @@
|
||||
var/obj/item/uplink_loc
|
||||
var/implant = FALSE
|
||||
|
||||
if(traitor_mob.client && traitor_mob.client.prefs)
|
||||
switch(traitor_mob.client.prefs.uplink_spawn_loc)
|
||||
if(UPLINK_PDA)
|
||||
uplink_loc = PDA
|
||||
if(!uplink_loc)
|
||||
uplink_loc = R
|
||||
if(!uplink_loc)
|
||||
uplink_loc = P
|
||||
if(UPLINK_RADIO)
|
||||
var/uplink_spawn_location = traitor_mob.client?.prefs?.read_preference(/datum/preference/choiced/uplink_location)
|
||||
switch (uplink_spawn_location)
|
||||
if(UPLINK_PDA)
|
||||
uplink_loc = PDA
|
||||
if(!uplink_loc)
|
||||
uplink_loc = R
|
||||
if(!uplink_loc)
|
||||
uplink_loc = PDA
|
||||
if(!uplink_loc)
|
||||
uplink_loc = P
|
||||
if(UPLINK_PEN)
|
||||
if(!uplink_loc)
|
||||
uplink_loc = P
|
||||
if(UPLINK_IMPLANT)
|
||||
implant = TRUE
|
||||
if(UPLINK_RADIO)
|
||||
uplink_loc = R
|
||||
if(!uplink_loc)
|
||||
uplink_loc = PDA
|
||||
if(!uplink_loc)
|
||||
uplink_loc = P
|
||||
if(UPLINK_PEN)
|
||||
uplink_loc = P
|
||||
if(UPLINK_IMPLANT)
|
||||
implant = TRUE
|
||||
|
||||
if(!uplink_loc) // We've looked everywhere, let's just implant you
|
||||
implant = TRUE
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
var/processing_quirk = FALSE
|
||||
/// When making an abstract quirk (in OOP terms), don't forget to set this var to the type path for that abstract quirk.
|
||||
var/abstract_parent_type = /datum/quirk
|
||||
/// The icon to show in the preferences menu.
|
||||
/// This references a tgui icon, so it can be FontAwesome or a tgfont (with a tg- prefix).
|
||||
var/icon = "bug" //SKYRAT EDIT CHANGE
|
||||
|
||||
/datum/quirk/Destroy()
|
||||
if(quirk_holder)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
/datum/quirk/alcohol_tolerance
|
||||
name = "Alcohol Tolerance"
|
||||
desc = "You become drunk more slowly and suffer fewer drawbacks from alcohol."
|
||||
icon = "beer"
|
||||
value = 4
|
||||
mob_trait = TRAIT_ALCOHOL_TOLERANCE
|
||||
gain_text = "<span class='notice'>You feel like you could drink a whole keg!</span>"
|
||||
@@ -13,6 +14,7 @@
|
||||
/datum/quirk/apathetic
|
||||
name = "Apathetic"
|
||||
desc = "You just don't care as much as other people. That's nice to have in a place like this, I guess."
|
||||
icon = "meh"
|
||||
value = 4
|
||||
mood_quirk = TRUE
|
||||
medical_record_text = "Patient was administered the Apathy Evaluation Scale but did not bother to complete it."
|
||||
@@ -30,6 +32,7 @@
|
||||
/datum/quirk/drunkhealing
|
||||
name = "Drunken Resilience"
|
||||
desc = "Nothing like a good drink to make you feel on top of the world. Whenever you're drunk, you slowly recover from injuries."
|
||||
icon = "wine-bottle"
|
||||
value = 8
|
||||
gain_text = "<span class='notice'>You feel like a drink would do you good.</span>"
|
||||
lose_text = "<span class='danger'>You no longer feel like drinking would ease your pain.</span>"
|
||||
@@ -53,6 +56,7 @@
|
||||
name = "Empath"
|
||||
desc = "Whether it's a sixth sense or careful study of body language, it only takes you a quick glance at someone to understand how they feel."
|
||||
value = 6 /// SKYRAT EDIT - Quirk Rebalance - Original: value = 8
|
||||
icon = "smile-beam"
|
||||
mob_trait = TRAIT_EMPATH
|
||||
gain_text = "<span class='notice'>You feel in tune with those around you.</span>"
|
||||
lose_text = "<span class='danger'>You feel isolated from others.</span>"
|
||||
@@ -61,6 +65,7 @@
|
||||
/datum/quirk/item_quirk/fan_clown
|
||||
name = "Clown Fan"
|
||||
desc = "You enjoy clown antics and get a mood boost from wearing your clown pin."
|
||||
icon = "map-pin"
|
||||
value = 2
|
||||
mob_trait = TRAIT_FAN_CLOWN
|
||||
gain_text = "<span class='notice'>You are a big fan of clowns.</span>"
|
||||
@@ -77,6 +82,7 @@
|
||||
/datum/quirk/item_quirk/fan_mime
|
||||
name = "Mime Fan"
|
||||
desc = "You enjoy mime antics and get a mood boost from wearing your mime pin."
|
||||
icon = "thumbtack"
|
||||
value = 2
|
||||
mob_trait = TRAIT_FAN_MIME
|
||||
gain_text = "<span class='notice'>You are a big fan of the Mime.</span>"
|
||||
@@ -93,6 +99,7 @@
|
||||
/datum/quirk/freerunning
|
||||
name = "Freerunning"
|
||||
desc = "You're great at quick moves! You can climb tables more quickly and take no damage from short falls."
|
||||
icon = "running"
|
||||
value = 8
|
||||
mob_trait = TRAIT_FREERUNNING
|
||||
gain_text = "<span class='notice'>You feel lithe on your feet!</span>"
|
||||
@@ -102,6 +109,7 @@
|
||||
/datum/quirk/friendly
|
||||
name = "Friendly"
|
||||
desc = "You give the best hugs, especially when you're in the right mood."
|
||||
icon = "hands-helping"
|
||||
value = 2
|
||||
mob_trait = TRAIT_FRIENDLY
|
||||
gain_text = "<span class='notice'>You want to hug someone.</span>"
|
||||
@@ -112,6 +120,7 @@
|
||||
/datum/quirk/jolly
|
||||
name = "Jolly"
|
||||
desc = "You sometimes just feel happy, for no reason at all."
|
||||
icon = "grin"
|
||||
value = 4
|
||||
mob_trait = TRAIT_JOLLY
|
||||
mood_quirk = TRUE
|
||||
@@ -120,6 +129,7 @@
|
||||
/datum/quirk/light_step
|
||||
name = "Light Step"
|
||||
desc = "You walk with a gentle step; footsteps and stepping on sharp objects is quieter and less painful. Also, your hands and clothes will not get messed in case of stepping in blood."
|
||||
icon = "shoe-prints"
|
||||
value = 4
|
||||
mob_trait = TRAIT_LIGHT_STEP
|
||||
gain_text = "<span class='notice'>You walk with a little more litheness.</span>"
|
||||
@@ -129,6 +139,7 @@
|
||||
/datum/quirk/item_quirk/musician
|
||||
name = "Musician"
|
||||
desc = "You can tune handheld musical instruments to play melodies that clear certain negative effects and soothe the soul."
|
||||
icon = "guitar"
|
||||
value = 2
|
||||
mob_trait = TRAIT_MUSICIAN
|
||||
gain_text = "<span class='notice'>You know everything about musical instruments.</span>"
|
||||
@@ -141,6 +152,7 @@
|
||||
/datum/quirk/night_vision
|
||||
name = "Night Vision"
|
||||
desc = "You can see slightly more clearly in full darkness than most people."
|
||||
icon = "eye"
|
||||
value = 4
|
||||
mob_trait = TRAIT_NIGHT_VISION
|
||||
gain_text = "<span class='notice'>The shadows seem a little less dark.</span>"
|
||||
@@ -164,6 +176,7 @@
|
||||
/datum/quirk/selfaware
|
||||
name = "Self-Aware"
|
||||
desc = "You know your body well, and can accurately assess the extent of your wounds."
|
||||
icon = "bone"
|
||||
value = 8
|
||||
mob_trait = TRAIT_SELF_AWARE
|
||||
medical_record_text = "Patient demonstrates an uncanny knack for self-diagnosis."
|
||||
@@ -171,6 +184,7 @@
|
||||
/datum/quirk/skittish
|
||||
name = "Skittish"
|
||||
desc = "You're easy to startle, and hide frequently. Run into a closed locker to jump into it, as long as you have access. You can walk to avoid this."
|
||||
icon = "trash"
|
||||
value = 8
|
||||
mob_trait = TRAIT_SKITTISH
|
||||
medical_record_text = "Patient demonstrates a high aversion to danger and has described hiding in containers out of fear."
|
||||
@@ -179,6 +193,7 @@
|
||||
name = "Spiritual"
|
||||
desc = "You hold a spiritual belief, whether in God, nature or the arcane rules of the universe. You gain comfort from the presence of holy people, and believe that your prayers are more special than others. Being in the chapel makes you happy."
|
||||
value = 2 /// SKYRAT EDIT - Quirk Rebalance - Original: value = 4
|
||||
icon = "bible"
|
||||
mob_trait = TRAIT_SPIRITUAL
|
||||
gain_text = "<span class='notice'>You have faith in a higher power.</span>"
|
||||
lose_text = "<span class='danger'>You lose faith!</span>"
|
||||
@@ -191,6 +206,7 @@
|
||||
/datum/quirk/item_quirk/tagger
|
||||
name = "Tagger"
|
||||
desc = "You're an experienced artist. People will actually be impressed by your graffiti, and you can get twice as many uses out of drawing supplies."
|
||||
icon = "spray-can"
|
||||
value = 4
|
||||
mob_trait = TRAIT_TAGGER
|
||||
gain_text = "<span class='notice'>You know how to tag walls efficiently.</span>"
|
||||
@@ -203,6 +219,7 @@
|
||||
/datum/quirk/voracious
|
||||
name = "Voracious"
|
||||
desc = "Nothing gets between you and your food. You eat faster and can binge on junk food! Being fat suits you just fine."
|
||||
icon = "drumstick-bite"
|
||||
value = 4
|
||||
mob_trait = TRAIT_VORACIOUS
|
||||
gain_text = "<span class='notice'>You feel HONGRY.</span>"
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
/datum/quirk/badback
|
||||
name = "Bad Back"
|
||||
desc = "Thanks to your poor posture, backpacks and other bags never sit right on your back. More evently weighted objects are fine, though."
|
||||
icon = "hiking"
|
||||
value = -8
|
||||
mood_quirk = TRUE
|
||||
gain_text = "<span class='danger'>Your back REALLY hurts!</span>"
|
||||
@@ -52,6 +53,7 @@
|
||||
/datum/quirk/blooddeficiency
|
||||
name = "Blood Deficiency"
|
||||
desc = "Your body can't produce enough blood to sustain itself."
|
||||
icon = "tint"
|
||||
value = -8
|
||||
gain_text = "<span class='danger'>You feel your vigor slowly fading away.</span>"
|
||||
lose_text = "<span class='notice'>You feel vigorous again.</span>"
|
||||
@@ -73,6 +75,7 @@
|
||||
/datum/quirk/item_quirk/blindness
|
||||
name = "Blind"
|
||||
desc = "You are completely blind, nothing can counteract this."
|
||||
icon = "eye-slash"
|
||||
value = -16
|
||||
gain_text = "<span class='danger'>You can't see anything.</span>"
|
||||
lose_text = "<span class='notice'>You miraculously gain back your vision.</span>"
|
||||
@@ -96,6 +99,7 @@
|
||||
/datum/quirk/item_quirk/brainproblems
|
||||
name = "Brain Tumor"
|
||||
desc = "You have a little friend in your brain that is slowly destroying it. Better bring some mannitol!"
|
||||
icon = "brain"
|
||||
value = -12
|
||||
gain_text = "<span class='danger'>You feel smooth.</span>"
|
||||
lose_text = "<span class='notice'>You feel wrinkled again.</span>"
|
||||
@@ -127,6 +131,7 @@
|
||||
/datum/quirk/deafness
|
||||
name = "Deaf"
|
||||
desc = "You are incurably deaf."
|
||||
icon = "deaf"
|
||||
value = -8
|
||||
mob_trait = TRAIT_DEAF
|
||||
gain_text = "<span class='danger'>You can't hear anything.</span>"
|
||||
@@ -137,6 +142,7 @@
|
||||
/datum/quirk/depression
|
||||
name = "Depression"
|
||||
desc = "You sometimes just hate life."
|
||||
icon = "frown"
|
||||
mob_trait = TRAIT_DEPRESSION
|
||||
value = -3
|
||||
gain_text = "<span class='danger'>You start feeling depressed.</span>"
|
||||
@@ -148,6 +154,7 @@
|
||||
/datum/quirk/item_quirk/family_heirloom
|
||||
name = "Family Heirloom"
|
||||
desc = "You are the current owner of an heirloom, passed down for generations. You have to keep it safe!"
|
||||
icon = "toolbox"
|
||||
value = -2
|
||||
mood_quirk = TRUE
|
||||
medical_record_text = "Patient demonstrates an unnatural attachment to a family heirloom."
|
||||
@@ -221,6 +228,7 @@
|
||||
/datum/quirk/frail
|
||||
name = "Frail"
|
||||
desc = "You have skin of paper and bones of glass! You suffer wounds much more easily than most."
|
||||
icon = "skull"
|
||||
value = -6
|
||||
mob_trait = TRAIT_EASILY_WOUNDED
|
||||
gain_text = "<span class='danger'>You feel frail.</span>"
|
||||
@@ -231,6 +239,7 @@
|
||||
/datum/quirk/heavy_sleeper
|
||||
name = "Heavy Sleeper"
|
||||
desc = "You sleep like a rock! Whenever you're put to sleep or knocked unconscious, you take a little bit longer to wake up."
|
||||
icon = "bed"
|
||||
value = -2
|
||||
mob_trait = TRAIT_HEAVY_SLEEPER
|
||||
gain_text = "<span class='danger'>You feel sleepy.</span>"
|
||||
@@ -241,6 +250,7 @@
|
||||
/datum/quirk/hypersensitive
|
||||
name = "Hypersensitive"
|
||||
desc = "For better or worse, everything seems to affect your mood more than it should."
|
||||
icon = "flushed"
|
||||
value = -2
|
||||
gain_text = "<span class='danger'>You seem to make a big deal out of everything.</span>"
|
||||
lose_text = "<span class='notice'>You don't seem to make a big deal out of everything anymore.</span>"
|
||||
@@ -260,6 +270,7 @@
|
||||
/datum/quirk/light_drinker
|
||||
name = "Light Drinker"
|
||||
desc = "You just can't handle your drinks and get drunk very quickly."
|
||||
icon = "cocktail"
|
||||
value = -2
|
||||
mob_trait = TRAIT_LIGHT_DRINKER
|
||||
gain_text = "<span class='notice'>Just the thought of drinking alcohol makes your head spin.</span>"
|
||||
@@ -270,6 +281,7 @@
|
||||
/datum/quirk/item_quirk/nearsighted
|
||||
name = "Nearsighted"
|
||||
desc = "You are nearsighted without prescription glasses, but spawn with a pair."
|
||||
icon = "glasses"
|
||||
value = -4
|
||||
gain_text = "<span class='danger'>Things far away from you start looking blurry.</span>"
|
||||
lose_text = "<span class='notice'>You start seeing faraway things normally again.</span>"
|
||||
@@ -288,6 +300,7 @@
|
||||
/datum/quirk/nyctophobia
|
||||
name = "Nyctophobia"
|
||||
desc = "As far as you can remember, you've always been afraid of the dark. While in the dark without a light source, you instinctually act careful, and constantly feel a sense of dread."
|
||||
icon = "lightbulb"
|
||||
value = -3
|
||||
medical_record_text = "Patient demonstrates a fear of the dark. (Seriously?)"
|
||||
hardcore_value = 5
|
||||
@@ -327,6 +340,7 @@
|
||||
/datum/quirk/nonviolent
|
||||
name = "Pacifist"
|
||||
desc = "The thought of violence makes you sick. So much so, in fact, that you can't hurt anyone."
|
||||
icon = "peace"
|
||||
value = -8
|
||||
mob_trait = TRAIT_PACIFISM
|
||||
gain_text = "<span class='danger'>You feel repulsed by the thought of violence!</span>"
|
||||
@@ -337,6 +351,7 @@
|
||||
/datum/quirk/paraplegic
|
||||
name = "Paraplegic"
|
||||
desc = "Your legs do not function. Nothing will ever fix this. But hey, free wheelchair!"
|
||||
icon = "wheelchair"
|
||||
value = -12
|
||||
human_only = TRUE
|
||||
gain_text = null // Handled by trauma.
|
||||
@@ -378,6 +393,7 @@
|
||||
/datum/quirk/poor_aim
|
||||
name = "Stormtrooper Aim"
|
||||
desc = "You've never hit anything you were aiming for in your life."
|
||||
icon = "bullseye"
|
||||
value = -4
|
||||
mob_trait = TRAIT_POOR_AIM
|
||||
medical_record_text = "Patient possesses a strong tremor in both hands."
|
||||
@@ -386,6 +402,7 @@
|
||||
/datum/quirk/prosopagnosia
|
||||
name = "Prosopagnosia"
|
||||
desc = "You have a mental disorder that prevents you from being able to recognize faces at all."
|
||||
icon = "user-secret"
|
||||
value = -4
|
||||
mob_trait = TRAIT_PROSOPAGNOSIA
|
||||
medical_record_text = "Patient suffers from prosopagnosia and cannot recognize faces."
|
||||
@@ -394,6 +411,7 @@
|
||||
/datum/quirk/prosthetic_limb
|
||||
name = "Prosthetic Limb"
|
||||
desc = "An accident caused you to lose one of your limbs. Because of this, you now have a random prosthetic!"
|
||||
icon = "tg-prosthetic-leg"
|
||||
value = -4
|
||||
var/slot_string = "limb"
|
||||
medical_record_text = "During physical examination, patient was found to have a prosthetic limb."
|
||||
@@ -428,6 +446,7 @@
|
||||
/datum/quirk/pushover
|
||||
name = "Pushover"
|
||||
desc = "Your first instinct is always to let people push you around. Resisting out of grabs will take conscious effort."
|
||||
icon = "handshake"
|
||||
value = -8
|
||||
mob_trait = TRAIT_GRABWEAKNESS
|
||||
gain_text = "<span class='danger'>You feel like a pushover.</span>"
|
||||
@@ -437,7 +456,8 @@
|
||||
|
||||
/datum/quirk/insanity
|
||||
name = "Reality Dissociation Syndrome"
|
||||
desc = "You suffer from a severe disorder that causes very vivid hallucinations. Mindbreaker toxin can suppress its effects, and you are immune to mindbreaker's hallucinogenic properties. <b>This is not a license to grief.</b>"
|
||||
desc = "You suffer from a severe disorder that causes very vivid hallucinations. Mindbreaker toxin can suppress its effects, and you are immune to mindbreaker's hallucinogenic properties. THIS IS NOT A LICENSE TO GRIEF."
|
||||
icon = "grin-tongue-wink"
|
||||
value = -8
|
||||
mob_trait = TRAIT_INSANITY
|
||||
gain_text = "<span class='userdanger'>...</span>"
|
||||
@@ -462,6 +482,7 @@
|
||||
/datum/quirk/social_anxiety
|
||||
name = "Social Anxiety"
|
||||
desc = "Talking to people is very difficult for you, and you often stutter or even lock up."
|
||||
icon = "comment-slash"
|
||||
value = -3
|
||||
gain_text = "<span class='danger'>You start worrying about what you're saying.</span>"
|
||||
lose_text = "<span class='notice'>You feel easier about talking again.</span>" //if only it were that easy!
|
||||
@@ -588,6 +609,7 @@
|
||||
/datum/quirk/item_quirk/junkie
|
||||
name = "Junkie"
|
||||
desc = "You can't get enough of hard drugs."
|
||||
icon = "pills"
|
||||
value = -6
|
||||
gain_text = "<span class='danger'>You suddenly feel the craving for drugs.</span>"
|
||||
medical_record_text = "Patient has a history of hard drugs."
|
||||
@@ -676,6 +698,7 @@
|
||||
/datum/quirk/item_quirk/junkie/smoker
|
||||
name = "Smoker"
|
||||
desc = "Sometimes you just really want a smoke. Probably not great for your lungs."
|
||||
icon = "smoking"
|
||||
value = -4
|
||||
gain_text = "<span class='danger'>You could really go for a smoke right about now.</span>"
|
||||
medical_record_text = "Patient is a current smoker."
|
||||
@@ -713,6 +736,7 @@
|
||||
/datum/quirk/unstable
|
||||
name = "Unstable"
|
||||
desc = "Due to past troubles, you are unable to recover your sanity if you lose it. Be very careful managing your mood!"
|
||||
icon = "angry"
|
||||
value = -10
|
||||
mob_trait = TRAIT_UNSTABLE
|
||||
gain_text = "<span class='danger'>There's a lot on your mind right now.</span>"
|
||||
@@ -723,6 +747,7 @@
|
||||
/datum/quirk/item_quirk/allergic
|
||||
name = "Extreme Medicine Allergy"
|
||||
desc = "Ever since you were a kid, you've been allergic to certain chemicals..."
|
||||
icon = "prescription-bottle"
|
||||
value = -6
|
||||
gain_text = "<span class='danger'>You feel your immune system shift.</span>"
|
||||
lose_text = "<span class='notice'>You feel your immune system phase back into perfect shape.</span>"
|
||||
@@ -781,6 +806,7 @@
|
||||
/datum/quirk/bad_touch
|
||||
name = "Bad Touch"
|
||||
desc = "You don't like hugs. You'd really prefer if people just left you alone."
|
||||
icon = "tg-bad-touch"
|
||||
mob_trait = TRAIT_BADTOUCH
|
||||
value = -1
|
||||
gain_text = "<span class='danger'>You just want people to leave you alone.</span>"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
/datum/quirk/extrovert
|
||||
name = "Extrovert"
|
||||
desc = "You are energized by talking to others, and enjoy spending your free time in the bar."
|
||||
icon = "users"
|
||||
value = 0
|
||||
mob_trait = TRAIT_EXTROVERT
|
||||
gain_text = "<span class='notice'>You feel like hanging out with other people.</span>"
|
||||
@@ -13,6 +14,7 @@
|
||||
/datum/quirk/introvert
|
||||
name = "Introvert"
|
||||
desc = "You are energized by having time to yourself, and enjoy spending your free time in the library."
|
||||
icon = "book-reader"
|
||||
value = 0
|
||||
mob_trait = TRAIT_INTROVERT
|
||||
gain_text = "<span class='notice'>You feel like reading a good book quietly.</span>"
|
||||
@@ -22,6 +24,7 @@
|
||||
/datum/quirk/no_taste
|
||||
name = "Ageusia"
|
||||
desc = "You can't taste anything! Toxic food will still poison you."
|
||||
icon = "meh-blank"
|
||||
value = 0
|
||||
mob_trait = TRAIT_AGEUSIA
|
||||
gain_text = "<span class='notice'>You can't taste anything!</span>"
|
||||
@@ -31,6 +34,7 @@
|
||||
/datum/quirk/foreigner
|
||||
name = "Foreigner"
|
||||
desc = "You're not from around here. You don't know Galactic Common!"
|
||||
icon = "language"
|
||||
value = 0
|
||||
gain_text = "<span class='notice'>The words being spoken around you don't make any sense."
|
||||
lose_text = "<span class='notice'>You've developed fluency in Galactic Common."
|
||||
@@ -51,6 +55,7 @@
|
||||
/datum/quirk/vegetarian
|
||||
name = "Vegetarian"
|
||||
desc = "You find the idea of eating meat morally and physically repulsive."
|
||||
icon = "carrot"
|
||||
value = 0
|
||||
gain_text = "<span class='notice'>You feel repulsion at the idea of eating meat.</span>"
|
||||
lose_text = "<span class='notice'>You feel like eating meat isn't that bad.</span>"
|
||||
@@ -80,6 +85,7 @@
|
||||
/datum/quirk/snob
|
||||
name = "Snob"
|
||||
desc = "You care about the finer things, if a room doesn't look nice its just not really worth it, is it?"
|
||||
icon = "user-tie"
|
||||
value = 0
|
||||
gain_text = "<span class='notice'>You feel like you understand what things should look like.</span>"
|
||||
lose_text = "<span class='notice'>Well who cares about deco anyways?</span>"
|
||||
@@ -89,6 +95,7 @@
|
||||
/datum/quirk/pineapple_liker
|
||||
name = "Ananas Affinity"
|
||||
desc = "You find yourself greatly enjoying fruits of the ananas genus. You can't seem to ever get enough of their sweet goodness!"
|
||||
icon = "thumbs-up"
|
||||
value = 0
|
||||
gain_text = "<span class='notice'>You feel an intense craving for pineapple.</span>"
|
||||
lose_text = "<span class='notice'>Your feelings towards pineapples seem to return to a lukewarm state.</span>"
|
||||
@@ -112,6 +119,7 @@
|
||||
/datum/quirk/pineapple_hater
|
||||
name = "Ananas Aversion"
|
||||
desc = "You find yourself greatly detesting fruits of the ananas genus. Serious, how the hell can anyone say these things are good? And what kind of madman would even dare putting it on a pizza!?"
|
||||
icon = "thumbs-down"
|
||||
value = 0
|
||||
gain_text = "<span class='notice'>You find yourself pondering what kind of idiot actually enjoys pineapples...</span>"
|
||||
lose_text = "<span class='notice'>Your feelings towards pineapples seem to return to a lukewarm state.</span>"
|
||||
@@ -135,6 +143,7 @@
|
||||
/datum/quirk/deviant_tastes
|
||||
name = "Deviant Tastes"
|
||||
desc = "You dislike food that most people enjoy, and find delicious what they don't."
|
||||
icon = "grin-tongue-squint"
|
||||
value = 0
|
||||
gain_text = "<span class='notice'>You start craving something that tastes strange.</span>"
|
||||
lose_text = "<span class='notice'>You feel like eating normal food again.</span>"
|
||||
@@ -163,6 +172,7 @@
|
||||
/datum/quirk/monochromatic
|
||||
name = "Monochromacy"
|
||||
desc = "You suffer from full colorblindness, and perceive nearly the entire world in blacks and whites."
|
||||
icon = "adjust"
|
||||
value = 0
|
||||
medical_record_text = "Patient is afflicted with almost complete color blindness."
|
||||
|
||||
@@ -180,13 +190,13 @@
|
||||
/datum/quirk/phobia
|
||||
name = "Phobia"
|
||||
desc = "You are irrationally afraid of something."
|
||||
icon = "spider"
|
||||
value = 0
|
||||
medical_record_text = "Patient has an irrational fear of something."
|
||||
var/phobia
|
||||
|
||||
/datum/quirk/phobia/add()
|
||||
if(!phobia && quirk_holder.client?.prefs.phobia)
|
||||
phobia = quirk_holder.client?.prefs.phobia
|
||||
phobia = phobia || quirk_holder.client?.prefs?.read_preference(/datum/preference/choiced/phobia)
|
||||
|
||||
if(phobia)
|
||||
var/mob/living/carbon/human/human_holder = quirk_holder
|
||||
@@ -195,7 +205,7 @@
|
||||
/datum/quirk/phobia/post_add()
|
||||
if(!phobia)
|
||||
var/mob/living/carbon/human/human_holder = quirk_holder
|
||||
phobia = human_holder.client.prefs.phobia
|
||||
phobia = human_holder.client.prefs.read_preference(/datum/preference/choiced/phobia)
|
||||
human_holder.gain_trauma(new /datum/brain_trauma/mild/phobia(phobia), TRAUMA_RESILIENCE_ABSOLUTE)
|
||||
|
||||
/datum/quirk/phobia/remove()
|
||||
@@ -205,6 +215,7 @@
|
||||
/datum/quirk/item_quirk/needswayfinder
|
||||
name = "Navigationally Challenged"
|
||||
desc = "Lacking familiarity with certain stations, you start with a wayfinding pinpointer where available."
|
||||
icon = "route"
|
||||
value = 0
|
||||
medical_record_text = "Patient demonstrates a keen ability to get lost."
|
||||
|
||||
@@ -223,6 +234,7 @@
|
||||
/datum/quirk/item_quirk/bald
|
||||
name = "Smooth-Headed"
|
||||
desc = "You have no hair and are quite insecure about it! Keep your wig on, or at least your head covered up."
|
||||
icon = "egg"
|
||||
value = 0
|
||||
mob_trait = TRAIT_BALD
|
||||
gain_text = "<span class='notice'>Your head is as smooth as can be, it's terrible.</span>"
|
||||
@@ -277,6 +289,7 @@
|
||||
/datum/quirk/item_quirk/tongue_tied
|
||||
name = "Tongue Tied"
|
||||
desc = "Due to a past incident, your ability to communicate has been relegated to your hands."
|
||||
icon = "sign-language"
|
||||
value = 0
|
||||
medical_record_text = "During physical examination, patient's tongue was found to be uniquely damaged."
|
||||
|
||||
@@ -297,6 +310,7 @@
|
||||
/datum/quirk/item_quirk/photographer
|
||||
name = "Photographer"
|
||||
desc = "You carry your camera and personal photo album everywhere you go, and your scrapbooks are legendary among your coworkers."
|
||||
icon = "camera"
|
||||
value = 0
|
||||
mob_trait = TRAIT_PHOTOGRAPHER
|
||||
gain_text = "<span class='notice'>You know everything about photography.</span>"
|
||||
@@ -325,6 +339,7 @@
|
||||
/datum/quirk/item_quirk/colorist
|
||||
name = "Colorist"
|
||||
desc = "You like carrying around a hair dye spray to quickly apply color patterns to your hair."
|
||||
icon = "fill-drip"
|
||||
value = 0
|
||||
medical_record_text = "Patient enjoys dyeing their hair with pretty colors."
|
||||
|
||||
|
||||
+2
-2
@@ -26,10 +26,10 @@
|
||||
winset(chief, "mapwindow.map", "zoom=0")
|
||||
|
||||
/datum/view_data/proc/resetFormat()//Cuck
|
||||
winset(chief, "mapwindow.map", "zoom=[chief.prefs.pixel_size]")
|
||||
winset(chief, "mapwindow.map", "zoom=[chief.prefs.read_preference(/datum/preference/numeric/pixel_size)]")
|
||||
|
||||
/datum/view_data/proc/setZoomMode()
|
||||
winset(chief, "mapwindow.map", "zoom-mode=[chief.prefs.scaling_method]")
|
||||
winset(chief, "mapwindow.map", "zoom-mode=[chief.prefs.read_preference(/datum/preference/choiced/scaling_method)]")
|
||||
|
||||
/datum/view_data/proc/isZooming()
|
||||
return (width || height)
|
||||
|
||||
@@ -81,7 +81,12 @@
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
if(damage_amount)
|
||||
playsound(src, 'sound/weapons/smash.ogg', 50, TRUE)
|
||||
//SKYRAT EDIT ADDITION - CREDITS TO WHITEDREAM(valtos)
|
||||
playsound(src, pick('modular_skyrat/master_files/sound/effects/metalblock1.wav', 'modular_skyrat/master_files/sound/effects/metalblock2.wav', \
|
||||
'modular_skyrat/master_files/sound/effects/metalblock3.wav', 'modular_skyrat/master_files/sound/effects/metalblock4.wav', \
|
||||
'modular_skyrat/master_files/sound/effects/metalblock5.wav', 'modular_skyrat/master_files/sound/effects/metalblock6.wav', \
|
||||
'modular_skyrat/master_files/sound/effects/metalblock7.wav', 'modular_skyrat/master_files/sound/effects/metalblock8.wav'), 50, TRUE)
|
||||
//SKYRAT EDIT END
|
||||
else
|
||||
playsound(src, 'sound/weapons/tap.ogg', 50, TRUE)
|
||||
if(BURN)
|
||||
|
||||
+5
-3
@@ -633,19 +633,21 @@
|
||||
* Produces a signal [COMSIG_PARENT_EXAMINE]
|
||||
*/
|
||||
/atom/proc/examine(mob/user)
|
||||
. = list("[get_examine_string(user, TRUE)].")
|
||||
. = list("[get_examine_string(user, TRUE)].<hr>")
|
||||
|
||||
. += get_name_chaser(user)
|
||||
if(desc)
|
||||
. += desc
|
||||
|
||||
if(custom_materials)
|
||||
. += "<hr>" //SKYRAT EDIT ADDITION
|
||||
var/list/materials_list = list()
|
||||
for(var/i in custom_materials)
|
||||
var/datum/material/M = i
|
||||
materials_list += "[M.name]"
|
||||
. += "<u>It is made out of [english_list(materials_list)]</u>."
|
||||
if(reagents)
|
||||
. += "<hr>" //SKYRAT EDIT ADDITION
|
||||
if(reagents.flags & TRANSPARENT)
|
||||
. += "It contains:"
|
||||
if(length(reagents.reagent_list))
|
||||
@@ -2127,10 +2129,10 @@
|
||||
status_bar_set_text(usr, name)
|
||||
// Screentips
|
||||
if(usr?.hud_used)
|
||||
if(!usr.client?.prefs.screentip_pref || (flags_1 & NO_SCREENTIPS_1))
|
||||
if(!usr.hud_used.screentips_enabled || (flags_1 & NO_SCREENTIPS_1))
|
||||
usr.hud_used.screentip_text.maptext = ""
|
||||
else
|
||||
usr.hud_used.screentip_text.maptext = MAPTEXT("<span style='text-align: center'><span style='font-size: 32px'><span style='color:[usr.client.prefs.screentip_color]: 32px'>[name]</span>")
|
||||
usr.hud_used.screentip_text.maptext = MAPTEXT("<span style='text-align: center'><span style='font-size: 32px'><span style='color:[usr.hud_used.screentip_color]: 32px'>[name]</span>")
|
||||
|
||||
/// Gets a merger datum representing the connected blob of objects in the allowed_types argument
|
||||
/atom/proc/GetMergeGroup(id, list/allowed_types)
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
var/list/mob/candidates = list()
|
||||
/// List of players that were selected for this rule
|
||||
var/list/datum/mind/assigned = list()
|
||||
/// Preferences flag such as ROLE_WIZARD that need to be turned on for players to be antag
|
||||
/// Preferences flag such as ROLE_WIZARD that need to be turned on for players to be antag.
|
||||
var/antag_flag = null
|
||||
/// The antagonist datum that is assigned to the mobs mind on ruleset execution.
|
||||
var/datum/antagonist/antag_datum = null
|
||||
@@ -57,6 +57,8 @@
|
||||
var/datum/game_mode/dynamic/mode = null
|
||||
/// If a role is to be considered another for the purpose of banning.
|
||||
var/antag_flag_override = null
|
||||
/// If set, will check this preference instead of antag_flag.
|
||||
var/antag_preference = null
|
||||
/// If a ruleset type which is in this list has been executed, then the ruleset will not be executed.
|
||||
var/list/blocking_rules = list()
|
||||
/// The minimum amount of players required for the rule to be considered.
|
||||
@@ -201,7 +203,7 @@
|
||||
continue
|
||||
|
||||
//SKYRAT EDIT ADDITION
|
||||
if(!candidate_client.prefs?.be_antag)
|
||||
if(!candidate_client.prefs?.read_preference(/datum/preference/toggle/be_antag))
|
||||
candidates.Remove(candidate_player)
|
||||
continue
|
||||
//SKYRAT EDIT END
|
||||
@@ -214,14 +216,13 @@
|
||||
candidates.Remove(candidate_player)
|
||||
continue
|
||||
|
||||
if(antag_flag_override)
|
||||
if(!(antag_flag_override in candidate_client.prefs.be_special) || is_banned_from(candidate_player.ckey, list(antag_flag_override, ROLE_SYNDICATE)))
|
||||
candidates.Remove(candidate_player)
|
||||
continue
|
||||
else
|
||||
if(!(antag_flag in candidate_client.prefs.be_special) || is_banned_from(candidate_player.ckey, list(antag_flag, ROLE_SYNDICATE)))
|
||||
candidates.Remove(candidate_player)
|
||||
continue
|
||||
if (!((antag_preference || antag_flag) in candidate_client.prefs.be_special))
|
||||
candidates.Remove(candidate_player)
|
||||
continue
|
||||
|
||||
if (is_banned_from(candidate_player.ckey, list(antag_flag_override || antag_flag, ROLE_SYNDICATE)))
|
||||
candidates.Remove(candidate_player)
|
||||
continue
|
||||
|
||||
// If this ruleset has exclusive_roles set, we want to only consider players who have those
|
||||
// job prefs enabled and are eligible to play that job. Otherwise, continue as before.
|
||||
|
||||
@@ -14,12 +14,8 @@
|
||||
candidates.Remove(P)
|
||||
else if((exclusive_roles.len > 0) && !(P.mind.assigned_role.title in exclusive_roles)) // Is the rule exclusive to their job?
|
||||
candidates.Remove(P)
|
||||
else if(antag_flag_override)
|
||||
if(!(antag_flag_override in P.client.prefs.be_special) || is_banned_from(P.ckey, list(antag_flag_override, ROLE_SYNDICATE)))
|
||||
candidates.Remove(P)
|
||||
else
|
||||
if(!(antag_flag in P.client.prefs.be_special) || is_banned_from(P.ckey, list(antag_flag, ROLE_SYNDICATE)))
|
||||
candidates.Remove(P)
|
||||
else if (!((antag_preference || antag_flag) in P.client.prefs.be_special) || is_banned_from(P.ckey, list(antag_flag_override || antag_flag, ROLE_SYNDICATE)))
|
||||
candidates.Remove(P)
|
||||
|
||||
/datum/dynamic_ruleset/latejoin/ready(forced = 0)
|
||||
if (!forced)
|
||||
@@ -52,7 +48,8 @@
|
||||
/datum/dynamic_ruleset/latejoin/infiltrator
|
||||
name = "Syndicate Infiltrator"
|
||||
antag_datum = /datum/antagonist/traitor
|
||||
antag_flag = ROLE_TRAITOR
|
||||
antag_flag = ROLE_SYNDICATE_INFILTRATOR
|
||||
antag_flag_override = ROLE_TRAITOR
|
||||
protected_roles = list("Prisoner", "Blueshield", "Corrections Officer", "Security Officer", "Warden", "Detective", "Security Medic", "Security Sergeant", "Civil Disputes Officer", "Head of Security", "Captain", "Nanotrasen Representative", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Vanguard Operative") //SKYRAT EDIT - SEC_HAUL
|
||||
restricted_roles = list("AI","Cyborg")
|
||||
required_candidates = 1
|
||||
@@ -71,7 +68,7 @@
|
||||
name = "Provocateur"
|
||||
persistent = TRUE
|
||||
antag_datum = /datum/antagonist/rev/head
|
||||
antag_flag = ROLE_REV_HEAD
|
||||
antag_flag = ROLE_PROVOCATEUR
|
||||
antag_flag_override = ROLE_REV
|
||||
restricted_roles = list("AI", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Corrections Officer", "Chief Medical Officer", "Research Director", "Vanguard Operative", "Nanotrasen Representative", "Blueshield", "Civil Disputes Officer", "Security Sergeant") //SKYRAT EDIT - Sec_haul
|
||||
enemy_roles = list("AI", "Cyborg", "Security Officer","Detective","Head of Security", "Captain", "Warden")
|
||||
@@ -147,7 +144,8 @@
|
||||
/datum/dynamic_ruleset/latejoin/heretic_smuggler
|
||||
name = "Heretic Smuggler"
|
||||
antag_datum = /datum/antagonist/heretic
|
||||
antag_flag = ROLE_HERETIC
|
||||
antag_flag = ROLE_HERETIC_SMUGGLER
|
||||
antag_flag_override = ROLE_HERETIC
|
||||
protected_roles = list("Prisoner", "Blueshield", "Corrections Officer", "Security Officer", "Warden", "Detective", "Security Medic", "Security Sergeant", "Civil Disputes Officer", "Head of Security", "Captain", "Nanotrasen Representative", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Vanguard Operative") //SKYRAT EDIT - SEC_HAUL
|
||||
restricted_roles = list("AI","Cyborg")
|
||||
required_candidates = 1
|
||||
|
||||
@@ -46,14 +46,12 @@
|
||||
if(M.client.get_remaining_days(minimum_required_age) > 0)
|
||||
trimmed_list.Remove(M)
|
||||
continue
|
||||
if(antag_flag_override)
|
||||
if(!(antag_flag_override in M.client.prefs.be_special) || is_banned_from(M.ckey, list(antag_flag_override, ROLE_SYNDICATE)))
|
||||
trimmed_list.Remove(M)
|
||||
continue
|
||||
else
|
||||
if(!(antag_flag in M.client.prefs.be_special) || is_banned_from(M.ckey, list(antag_flag, ROLE_SYNDICATE)))
|
||||
trimmed_list.Remove(M)
|
||||
continue
|
||||
if (!((antag_preference || antag_flag) in M.client.prefs.be_special))
|
||||
trimmed_list.Remove(M)
|
||||
continue
|
||||
if (is_banned_from(M.ckey, list(antag_flag_override || antag_flag, ROLE_SYNDICATE)))
|
||||
trimmed_list.Remove(M)
|
||||
continue
|
||||
if (M.mind)
|
||||
if (restrict_ghost_roles && (M.mind.assigned_role.title in GLOB.exp_specialmap[EXP_TYPE_SPECIAL])) // Are they playing a ghost role?
|
||||
trimmed_list.Remove(M)
|
||||
@@ -104,7 +102,7 @@
|
||||
message_admins("Polling [possible_volunteers.len] players to apply for the [name] ruleset.")
|
||||
log_game("DYNAMIC: Polling [possible_volunteers.len] players to apply for the [name] ruleset.")
|
||||
|
||||
candidates = pollGhostCandidates("The mode is looking for volunteers to become [antag_flag] for [name]", antag_flag, antag_flag_override ? antag_flag_override : antag_flag, poll_time = 300)
|
||||
candidates = pollGhostCandidates("The mode is looking for volunteers to become [antag_flag] for [name]", antag_flag_override, antag_flag || antag_flag_override, poll_time = 300)
|
||||
|
||||
if(!candidates || candidates.len <= 0)
|
||||
mode.dynamic_log("The ruleset [name] received no applications.")
|
||||
@@ -184,7 +182,8 @@
|
||||
/datum/dynamic_ruleset/midround/autotraitor
|
||||
name = "Syndicate Sleeper Agent"
|
||||
antag_datum = /datum/antagonist/traitor
|
||||
antag_flag = ROLE_TRAITOR
|
||||
antag_flag = ROLE_SLEEPER_AGENT
|
||||
antag_flag_override = ROLE_TRAITOR
|
||||
protected_roles = list("Prisoner", "Blueshield", "Corrections Officer", "Security Officer", "Warden", "Detective", "Security Medic", "Security Sergeant", "Civil Disputes Officer", "Head of Security", "Captain", "Nanotrasen Representative", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Vanguard Operative") //SKYRAT EDIT - SEC_HAUL
|
||||
restricted_roles = list("Cyborg", "AI", "Positronic Brain")
|
||||
required_candidates = 1
|
||||
@@ -248,7 +247,9 @@
|
||||
/datum/dynamic_ruleset/midround/families
|
||||
name = "Family Head Aspirants"
|
||||
persistent = TRUE
|
||||
antag_flag = ROLE_FAMILIES
|
||||
antag_datum = /datum/antagonist/gang
|
||||
antag_flag = ROLE_FAMILY_HEAD_ASPIRANT
|
||||
antag_flag_override = ROLE_FAMILIES
|
||||
protected_roles = list("Prisoner", "Head of Personnel")
|
||||
restricted_roles = list("Cyborg", "AI", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Corrections Officer", "Vanguard Operative", "Nanotrasen Representative", "Blueshield", "Civil Disputes Officer", "Security Sergeant") //SKYRAT EDIT - Sec_haul
|
||||
required_candidates = 6 // gotta have 'em ALL
|
||||
@@ -317,7 +318,8 @@
|
||||
/datum/dynamic_ruleset/midround/malf
|
||||
name = "Malfunctioning AI"
|
||||
antag_datum = /datum/antagonist/malf_ai
|
||||
antag_flag = ROLE_MALF
|
||||
antag_flag = ROLE_MALF_MIDROUND
|
||||
antag_flag_override = ROLE_MALF
|
||||
enemy_roles = list("Security Officer", "Warden","Detective","Head of Security", "Captain", "Scientist", "Chemist", "Research Director", "Chief Engineer", "Blueshield")
|
||||
exclusive_roles = list("AI")
|
||||
required_enemies = list(4,4,4,4,4,4,2,2,2,0)
|
||||
@@ -367,7 +369,8 @@
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/wizard
|
||||
name = "Wizard"
|
||||
antag_datum = /datum/antagonist/wizard
|
||||
antag_flag = ROLE_WIZARD
|
||||
antag_flag = ROLE_WIZARD_MIDROUND
|
||||
antag_flag_override = ROLE_WIZARD
|
||||
enemy_roles = list("Security Officer","Detective","Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_candidates = 1
|
||||
@@ -397,7 +400,8 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/nuclear
|
||||
name = "Nuclear Assault"
|
||||
antag_flag = ROLE_OPERATIVE
|
||||
antag_flag = ROLE_OPERATIVE_MIDROUND
|
||||
antag_flag_override = ROLE_OPERATIVE
|
||||
antag_datum = /datum/antagonist/nukeop
|
||||
enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden","Detective","Head of Security", "Captain")
|
||||
required_enemies = list(3,3,3,3,3,2,1,1,0,0)
|
||||
@@ -456,8 +460,9 @@
|
||||
/// Infects a random player, making them explode into a blob.
|
||||
/datum/dynamic_ruleset/midround/blob_infection
|
||||
name = "Blob Infection"
|
||||
antag_datum = /datum/antagonist/blob
|
||||
antag_flag = ROLE_BLOB
|
||||
antag_datum = /datum/antagonist/blob/infection
|
||||
antag_flag = ROLE_BLOB_INFECTION
|
||||
antag_flag_override = ROLE_BLOB
|
||||
protected_roles = list("Prisoner", "Blueshield", "Corrections Officer", "Security Officer", "Warden", "Detective", "Security Medic", "Security Sergeant", "Civil Disputes Officer", "Head of Security", "Captain", "Nanotrasen Representative", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Vanguard Operative") //SKYRAT EDIT - SEC_HAUL
|
||||
restricted_roles = list("Cyborg", "AI", "Positronic Brain")
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
@@ -633,8 +638,8 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/abductors
|
||||
name = "Abductors"
|
||||
antag_flag = "Abductor"
|
||||
antag_flag_override = ROLE_ABDUCTOR
|
||||
antag_datum = /datum/antagonist/abductor
|
||||
antag_flag = ROLE_ABDUCTOR
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_candidates = 2
|
||||
@@ -672,8 +677,7 @@
|
||||
/datum/dynamic_ruleset/midround/swarmers
|
||||
name = "Swarmers"
|
||||
antag_datum = /datum/antagonist/swarmer
|
||||
antag_flag = "Swarmer"
|
||||
antag_flag_override = ROLE_ALIEN
|
||||
antag_flag = ROLE_SWARMER
|
||||
required_type = /mob/dead/observer
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
@@ -707,8 +711,7 @@
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/space_ninja
|
||||
name = "Space Ninja"
|
||||
antag_datum = /datum/antagonist/ninja
|
||||
antag_flag = "Space Ninja"
|
||||
antag_flag_override = ROLE_NINJA
|
||||
antag_flag = ROLE_NINJA
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_candidates = 1
|
||||
@@ -747,8 +750,7 @@
|
||||
|
||||
/datum/dynamic_ruleset/midround/spiders
|
||||
name = "Spiders"
|
||||
antag_flag = "Spider"
|
||||
antag_flag_override = ROLE_ALIEN
|
||||
antag_flag = ROLE_SPIDER
|
||||
required_type = /mob/dead/observer
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
@@ -767,8 +769,7 @@
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/revenant
|
||||
name = "Revenant"
|
||||
antag_datum = /datum/antagonist/revenant
|
||||
antag_flag = "Revenant"
|
||||
antag_flag_override = ROLE_REVENANT
|
||||
antag_flag = ROLE_REVENANT
|
||||
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_candidates = 1
|
||||
@@ -814,8 +815,7 @@
|
||||
/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease
|
||||
name = "Sentient Disease"
|
||||
antag_datum = /datum/antagonist/disease
|
||||
antag_flag = "Sentient Disease"
|
||||
antag_flag_override = ROLE_ALIEN
|
||||
antag_flag = ROLE_SENTIENT_DISEASE
|
||||
required_candidates = 1
|
||||
weight = 4
|
||||
cost = 10
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
antag_flag = ROLE_TRAITOR
|
||||
antag_datum = /datum/antagonist/traitor
|
||||
minimum_required_age = 0
|
||||
protected_roles = list("Prisoner", "Blueshield", "Corrections Officer", "Security Officer", "Warden", "Detective", "Security Medic", "Security Sergeant", "Civil Disputes Officer", "Head of Security", "Captain", "Nanotrasen Representative", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Vanguard Operative") //SKYRAT EDIT - SEC_HAUL
|
||||
protected_roles = list("Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
restricted_roles = list("AI", "Cyborg")
|
||||
required_candidates = 1
|
||||
weight = 5
|
||||
@@ -92,8 +92,8 @@
|
||||
/datum/dynamic_ruleset/roundstart/traitorbro
|
||||
name = "Blood Brothers"
|
||||
antag_flag = ROLE_BROTHER
|
||||
antag_datum = /datum/antagonist/brother/
|
||||
protected_roles = list("Prisoner", "Blueshield", "Corrections Officer", "Security Officer", "Warden", "Detective", "Security Medic", "Security Sergeant", "Civil Disputes Officer", "Head of Security", "Captain", "Nanotrasen Representative", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Vanguard Operative") //SKYRAT EDIT - SEC_HAUL
|
||||
antag_datum = /datum/antagonist/brother
|
||||
protected_roles = list("Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
restricted_roles = list("Cyborg", "AI")
|
||||
required_candidates = 2
|
||||
weight = 4
|
||||
@@ -142,7 +142,7 @@
|
||||
name = "Changelings"
|
||||
antag_flag = ROLE_CHANGELING
|
||||
antag_datum = /datum/antagonist/changeling
|
||||
protected_roles = list("Prisoner", "Blueshield", "Corrections Officer", "Security Officer", "Warden", "Detective", "Security Medic", "Security Sergeant", "Civil Disputes Officer", "Head of Security", "Captain", "Nanotrasen Representative", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Vanguard Operative") //SKYRAT EDIT - SEC_HAUL
|
||||
protected_roles = list("Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
restricted_roles = list("AI", "Cyborg")
|
||||
required_candidates = 1
|
||||
weight = 3
|
||||
@@ -179,7 +179,7 @@
|
||||
name = "Heretics"
|
||||
antag_flag = ROLE_HERETIC
|
||||
antag_datum = /datum/antagonist/heretic
|
||||
protected_roles = list("Prisoner", "Blueshield", "Corrections Officer", "Security Officer", "Warden", "Detective", "Security Medic", "Security Sergeant", "Civil Disputes Officer", "Head of Security", "Captain", "Nanotrasen Representative", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Vanguard Operative") //SKYRAT EDIT - SEC_HAUL
|
||||
protected_roles = list("Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
restricted_roles = list("AI", "Cyborg")
|
||||
required_candidates = 1
|
||||
weight = 3
|
||||
@@ -268,7 +268,7 @@
|
||||
antag_flag = ROLE_CULTIST
|
||||
antag_datum = /datum/antagonist/cult
|
||||
minimum_required_age = 14
|
||||
restricted_roles = list("AI", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Chaplain", "Head of Personnel", "Corrections Officer")
|
||||
restricted_roles = list("AI", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Chaplain", "Head of Personnel")
|
||||
required_candidates = 2
|
||||
weight = 3
|
||||
cost = 20
|
||||
@@ -411,7 +411,7 @@
|
||||
antag_flag_override = ROLE_REV
|
||||
antag_datum = /datum/antagonist/rev/head
|
||||
minimum_required_age = 14
|
||||
restricted_roles = list("AI", "Corrections Officer", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director")
|
||||
restricted_roles = list("AI", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director")
|
||||
required_candidates = 3
|
||||
weight = 3
|
||||
delay = 7 MINUTES
|
||||
@@ -492,9 +492,10 @@
|
||||
/datum/dynamic_ruleset/roundstart/families
|
||||
name = "Families"
|
||||
persistent = TRUE
|
||||
antag_datum = /datum/antagonist/gang
|
||||
antag_flag = ROLE_FAMILIES
|
||||
protected_roles = list("Prisoner", "Head of Personnel")
|
||||
restricted_roles = list("Cyborg", "AI", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Corrections Officer", "Vanguard Operative", "Nanotrasen Representative", "Blueshield", "Civil Disputes Officer", "Security Sergeant") //SKYRAT EDIT - SEC_HAUL
|
||||
restricted_roles = list("Cyborg", "AI", "Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
required_candidates = 6 // gotta have 'em ALL
|
||||
weight = 2
|
||||
cost = 30
|
||||
@@ -561,22 +562,25 @@
|
||||
//////////////////////////////////////////////
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/nuclear/clown_ops
|
||||
name = "Clown Ops"
|
||||
name = "Clown Operatives"
|
||||
antag_datum = /datum/antagonist/nukeop/clownop
|
||||
antag_flag = ROLE_CLOWN_OPERATIVE
|
||||
antag_flag_override = ROLE_OPERATIVE
|
||||
antag_leader_datum = /datum/antagonist/nukeop/leader/clownop
|
||||
requirements = list(101,101,101,101,101,101,101,101,101,101)
|
||||
|
||||
/datum/dynamic_ruleset/roundstart/nuclear/clown_ops/pre_execute()
|
||||
. = ..()
|
||||
if(.)
|
||||
for(var/obj/machinery/nuclearbomb/syndicate/S in GLOB.nuke_list)
|
||||
var/turf/T = get_turf(S)
|
||||
if(T)
|
||||
qdel(S)
|
||||
new /obj/machinery/nuclearbomb/syndicate/bananium(T)
|
||||
for(var/datum/mind/V in assigned)
|
||||
V.set_assigned_role(SSjob.GetJobType(/datum/job/clown_operative))
|
||||
V.special_role = ROLE_CLOWN_OPERATIVE
|
||||
var/obj/machinery/nuclearbomb/syndicate/syndicate_nuke = locate() in GLOB.nuke_list
|
||||
if(syndicate_nuke)
|
||||
var/turf/nuke_turf = get_turf(syndicate_nuke)
|
||||
if(nuke_turf)
|
||||
new /obj/machinery/nuclearbomb/syndicate/bananium(nuke_turf)
|
||||
qdel(syndicate_nuke)
|
||||
for(var/datum/mind/clowns in assigned)
|
||||
clowns.set_assigned_role(SSjob.GetJobType(/datum/job/clown_operative))
|
||||
clowns.special_role = ROLE_CLOWN_OPERATIVE
|
||||
|
||||
|
||||
//////////////////////////////////////////////
|
||||
|
||||
@@ -235,7 +235,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
|
||||
if (id_card)
|
||||
entry["name"] = id_card.registered_name
|
||||
entry["assignment"] = id_card.assignment
|
||||
entry["ijob"] = jobs[id_card.real_title || id_card.assignment] //SKYRAT EDIT - ALTERNATE JOB TITLES
|
||||
entry["ijob"] = jobs[id_card.assignment] //SKYRAT EDIT - ALTERNATE JOB TITLES
|
||||
|
||||
// Binary living/dead status
|
||||
if (sensor_mode >= SENSOR_LIVING)
|
||||
|
||||
@@ -802,7 +802,7 @@ What a mess.*/
|
||||
active1.fields["age"] = t1
|
||||
if("species")
|
||||
if(istype(active1, /datum/data/record))
|
||||
var/t1 = input("Select a species", "Species Selection") as null|anything in GLOB.roundstart_races
|
||||
var/t1 = input("Select a species", "Species Selection") as null|anything in get_selectable_species()
|
||||
if(!canUseSecurityRecordsConsole(usr, t1, a1))
|
||||
return
|
||||
active1.fields["species"] = t1
|
||||
@@ -1042,7 +1042,7 @@ What a mess.*/
|
||||
if(6)
|
||||
R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
|
||||
if(7)
|
||||
R.fields["species"] = pick(GLOB.roundstart_races)
|
||||
R.fields["species"] = pick(get_selectable_species())
|
||||
if(8)
|
||||
var/datum/data/record/G = pick(GLOB.data_core.general)
|
||||
R.fields["photo_front"] = G.fields["photo_front"]
|
||||
|
||||
@@ -284,7 +284,12 @@
|
||||
if(glass)
|
||||
playsound(loc, 'sound/effects/glasshit.ogg', 90, TRUE)
|
||||
else if(damage_amount)
|
||||
playsound(loc, 'sound/weapons/smash.ogg', 50, TRUE)
|
||||
//SKYRAT EDIT ADDITION - CREDITS TO WHITEDREAM(valtos)
|
||||
playsound(src, pick('modular_skyrat/master_files/sound/effects/metalblock1.wav', 'modular_skyrat/master_files/sound/effects/metalblock2.wav', \
|
||||
'modular_skyrat/master_files/sound/effects/metalblock3.wav', 'modular_skyrat/master_files/sound/effects/metalblock4.wav', \
|
||||
'modular_skyrat/master_files/sound/effects/metalblock5.wav', 'modular_skyrat/master_files/sound/effects/metalblock6.wav', \
|
||||
'modular_skyrat/master_files/sound/effects/metalblock7.wav', 'modular_skyrat/master_files/sound/effects/metalblock8.wav'), 50, TRUE)
|
||||
//SKYRAT EDIT END
|
||||
else
|
||||
playsound(src, 'sound/weapons/tap.ogg', 50, TRUE)
|
||||
if(BURN)
|
||||
|
||||
@@ -216,15 +216,6 @@ Possible to do for anyone motivated enough:
|
||||
AI = null
|
||||
else
|
||||
aiPlayer = AI
|
||||
if(aiPlayer)
|
||||
if(aiPlayer.client)
|
||||
if(length(aiPlayer.client.prefs.features["silicon_flavor_text"]))
|
||||
var/message = aiPlayer.client.prefs.features["silicon_flavor_text"]
|
||||
if(length_char(message) <= 40)
|
||||
line = "<span class='notice'>[message]</span>"
|
||||
else
|
||||
line = "<span class='notice'>[copytext_char(message, 1, 37)]... <a href='?src=[REF(aiPlayer)];lookup_info=silicon_flavor_text'>More...</a></span>"
|
||||
line += " <span class='notice'><a href='?src=[REF(aiPlayer)];lookup_info=ooc_prefs'>\[OOC\]</a></span>"
|
||||
if(LAZYLEN(masters))
|
||||
if(holo.Impersonation)
|
||||
. += holo.Impersonation.examine(user)
|
||||
@@ -510,7 +501,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
|
||||
for(var/I in holo_calls)
|
||||
var/datum/holocall/HC = I
|
||||
if(HC.connected_holopad == src)
|
||||
if(speaker == HC.hologram && HC.user.client?.prefs.chat_on_map)
|
||||
if(speaker == HC.hologram && HC.user.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat))
|
||||
HC.user.create_chat_message(speaker, message_language, raw_message, spans)
|
||||
else
|
||||
HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mods)
|
||||
|
||||
@@ -170,11 +170,6 @@
|
||||
// From the list of radios, find all mobs who can hear those.
|
||||
var/list/receive = get_mobs_in_radio_ranges(radios)
|
||||
|
||||
// Cut out mobs with clients who are admins and have radio chatter disabled.
|
||||
for(var/mob/R in receive)
|
||||
if (R.client && R.client.holder && !(R.client.prefs.chat_toggles & CHAT_RADIO))
|
||||
receive -= R
|
||||
|
||||
// Add observers who have ghost radio enabled.
|
||||
for(var/mob/dead/observer/M in GLOB.player_list)
|
||||
if(M.client.prefs.chat_toggles & CHAT_GHOSTRADIO)
|
||||
|
||||
@@ -879,10 +879,10 @@ attack_basic_mob
|
||||
. = ..()
|
||||
if(get(src, /mob) == usr && !QDELETED(src))
|
||||
var/mob/living/L = usr
|
||||
if(usr.client.prefs.enable_tips)
|
||||
var/timedelay = usr.client.prefs.tip_delay/100
|
||||
if(usr.client.prefs.read_preference(/datum/preference/toggle/enable_tooltips))
|
||||
var/timedelay = usr.client.prefs.read_preference(/datum/preference/numeric/tooltip_delay) / 100
|
||||
tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, usr), timedelay, TIMER_STOPPABLE)//timer takes delay in deciseconds, but the pref is in milliseconds. dividing by 100 converts it.
|
||||
if(usr.client.prefs.itemoutline_pref)
|
||||
if(usr.client.prefs.read_preference(/datum/preference/toggle/item_outlines))
|
||||
if(istype(L) && L.incapacitated())
|
||||
apply_outline(COLOR_RED_GRAY) //if they're dead or handcuffed, let's show the outline as red to indicate that they can't interact with that right now
|
||||
else
|
||||
@@ -900,7 +900,7 @@ attack_basic_mob
|
||||
/obj/item/proc/apply_outline(outline_color = null)
|
||||
if(get(src, /mob) != usr || QDELETED(src) || isobserver(usr)) //cancel if the item isn't in an inventory, is being deleted, or if the person hovering is a ghost (so that people spectating you don't randomly make your items glow)
|
||||
return
|
||||
var/theme = lowertext(usr.client.prefs.UI_style)
|
||||
var/theme = lowertext(usr.client?.prefs?.read_preference(/datum/preference/choiced/ui_style))
|
||||
if(!outline_color) //if we weren't provided with a color, take the theme's color
|
||||
switch(theme) //yeah it kinda has to be this way
|
||||
if("midnight")
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
#define DARK_COLOR_LIGHTNESS_THRESHOLD 0.25
|
||||
|
||||
#define RANDOM_GRAFFITI "Random Graffiti"
|
||||
#define RANDOM_LETTER "Random Letter"
|
||||
#define RANDOM_PUNCTUATION "Random Punctuation"
|
||||
@@ -762,9 +760,7 @@
|
||||
|
||||
if(isobj(target) && !(target.flags_1 & UNPAINTABLE_1))
|
||||
if(actually_paints)
|
||||
var/list/rgb = hex2rgb(paint_color)
|
||||
var/list/hsl = rgb2hsl(rgb[1], rgb[2], rgb[3])
|
||||
var/color_is_dark = hsl[3] < DARK_COLOR_LIGHTNESS_THRESHOLD
|
||||
var/color_is_dark = is_color_dark(paint_color)
|
||||
|
||||
if (color_is_dark && !(target.flags_1 & ALLOW_DARK_PAINTS_1))
|
||||
to_chat(user, span_warning("A color that dark on an object like this? Surely not..."))
|
||||
@@ -865,7 +861,6 @@
|
||||
charges = -1
|
||||
desc = "Now with 30% more bluespace technology."
|
||||
|
||||
#undef DARK_COLOR_LIGHTNESS_THRESHOLD
|
||||
#undef RANDOM_GRAFFITI
|
||||
#undef RANDOM_LETTER
|
||||
#undef RANDOM_PUNCTUATION
|
||||
|
||||
@@ -129,8 +129,8 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
. = ..()
|
||||
if(!equipped)
|
||||
if(user.client)
|
||||
background_color = user.client.prefs.pda_color
|
||||
switch(user.client.prefs.pda_style)
|
||||
background_color = user.client.prefs.read_preference(/datum/preference/color/pda_color)
|
||||
switch(user.client.prefs.read_preference(/datum/preference/choiced/pda_style))
|
||||
if(MONO)
|
||||
font_index = MODE_MONO
|
||||
font_mode = FONT_MONO
|
||||
@@ -146,9 +146,6 @@ GLOBAL_LIST_EMPTY(PDAs)
|
||||
else
|
||||
font_index = MODE_MONO
|
||||
font_mode = FONT_MONO
|
||||
//SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION
|
||||
ttone = user.client.prefs.pda_ringer
|
||||
//SKYRAT EDIT ADDITION END
|
||||
equipped = TRUE
|
||||
|
||||
/obj/item/pda/proc/update_label()
|
||||
|
||||
@@ -429,7 +429,7 @@ GENE SCANNER
|
||||
render_list += "<span class='notice ml-1'>Detected cybernetic modifications:</span>\n"
|
||||
render_list += "<span class='notice ml-2'>[cyberimp_detect]</span>\n"
|
||||
|
||||
to_chat(user, jointext(render_list, ""), trailing_newline = FALSE) // we handled the last <br> so we don't need handholding
|
||||
to_chat(user, examine_block(jointext(render_list, "")), trailing_newline = FALSE) // we handled the last <br> so we don't need handholding //SKYRAT EDIT CHANGE
|
||||
|
||||
/proc/chemscan(mob/living/user, mob/living/M)
|
||||
if(user.incapacitated())
|
||||
@@ -477,7 +477,7 @@ GENE SCANNER
|
||||
if(M.has_status_effect(/datum/status_effect/eigenstasium))
|
||||
render_list += "<span class='notice ml-1'>Subject is temporally unstable. Stabilising agent is recommended to reduce disturbances.</span>\n"
|
||||
|
||||
to_chat(user, jointext(render_list, ""), trailing_newline = FALSE) // we handled the last <br> so we don't need handholding
|
||||
to_chat(user, examine_block(jointext(render_list, "")), trailing_newline = FALSE) // we handled the last <br> so we don't need handholding //SKYRAT EDIT CHANGE
|
||||
|
||||
/obj/item/healthanalyzer/verb/toggle_mode()
|
||||
set name = "Switch Verbosity"
|
||||
@@ -522,7 +522,7 @@ GENE SCANNER
|
||||
else
|
||||
to_chat(user, "<span class='notice ml-1'>No wounds detected in subject.</span>")
|
||||
else
|
||||
to_chat(user, jointext(render_list, ""))
|
||||
to_chat(user, examine_block(jointext(render_list, ""))) //SKYRAT EDIT CHANGE
|
||||
|
||||
/obj/item/healthanalyzer/wound
|
||||
name = "first aid analyzer"
|
||||
@@ -642,7 +642,7 @@ GENE SCANNER
|
||||
var/gas_concentration = env_gases[id][MOLES]/total_moles
|
||||
render_list += "[span_alert("[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] % ([round(env_gases[id][MOLES], 0.01)] mol)")]\n"
|
||||
render_list += "[span_info("Temperature: [round(environment.temperature-T0C, 0.01)] °C ([round(environment.temperature, 0.01)] K)")]\n"
|
||||
to_chat(user, jointext(render_list, ""), trailing_newline = FALSE) // we handled the last <br> so we don't need handholding
|
||||
to_chat(user, examine_block(jointext(render_list, "")), trailing_newline = FALSE) // we handled the last <br> so we don't need handholding //SKYRAT EDIT CHANGE
|
||||
|
||||
/obj/item/analyzer/AltClick(mob/user) //Barometer output for measuring when the next storm happens
|
||||
..()
|
||||
@@ -750,7 +750,7 @@ GENE SCANNER
|
||||
render_list += "[span_boldnotice("Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.")]\
|
||||
\n[span_notice("Instability of the last fusion reaction: [round(cached_scan_results["fusion"], 0.01)].")]"
|
||||
|
||||
to_chat(user, jointext(render_list, "\n")) // we let the join apply newlines so we do need handholding
|
||||
to_chat(user, examine_block(jointext(render_list, "\n"))) // we let the join apply newlines so we do need handholding //SKYRAT EDIT CHANGE
|
||||
return TRUE
|
||||
|
||||
//slime scanner
|
||||
@@ -820,7 +820,7 @@ GENE SCANNER
|
||||
if(T.effectmod)
|
||||
to_render += "\n[span_notice("Core mutation in progress: [T.effectmod]")]\
|
||||
\n[span_notice("Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]")]"
|
||||
to_chat(user, to_render + "\n========================")
|
||||
to_chat(user, examine_block(to_render + "\n========================")) //SKYRAT EDIT CHANGE
|
||||
|
||||
/obj/item/sequence_scanner//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODUL
|
||||
name = "genetic sequence scanner"
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
// Clean up the cell on destroy
|
||||
/obj/item/clothing/suit/space/Destroy()
|
||||
if(cell)
|
||||
if(isatom(cell))
|
||||
QDEL_NULL(cell)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
..()
|
||||
|
||||
/obj/structure/mirror/magic/lesser/New()
|
||||
choosable_races = GLOB.roundstart_races.Copy()
|
||||
choosable_races = get_selectable_species().Copy()
|
||||
..()
|
||||
|
||||
/obj/structure/mirror/magic/badmin/New()
|
||||
|
||||
@@ -12,8 +12,6 @@ GLOBAL_PROTECT(admin_verbs_default)
|
||||
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
|
||||
/client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/
|
||||
/client/proc/secrets,
|
||||
/client/proc/toggle_hear_radio, /*allows admins to hide all radio output*/
|
||||
/client/proc/toggle_split_admin_tabs,
|
||||
/client/proc/reload_admins,
|
||||
/client/proc/reestablish_db_connection, /*reattempt a connection to the database*/
|
||||
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
|
||||
@@ -77,13 +75,6 @@ GLOBAL_PROTECT(admin_verbs_admin)
|
||||
/client/proc/toggle_combo_hud, // toggle display of the combination pizza antag and taco sci/med/eng hud
|
||||
/client/proc/toggle_AI_interact, /*toggle admin ability to interact with machines as an AI*/
|
||||
/datum/admins/proc/open_shuttlepanel, /* Opens shuttle manipulator UI */
|
||||
/client/proc/deadchat,
|
||||
/client/proc/toggleprayers,
|
||||
/client/proc/toggle_prayer_sound,
|
||||
/client/proc/toggle_admin_looc_global, //SKYRAT EDIT ADDITION - LOOC
|
||||
/client/proc/colorasay,
|
||||
/client/proc/resetasaycolor,
|
||||
/client/proc/toggleadminhelpsound,
|
||||
/client/proc/respawn_character,
|
||||
/client/proc/admin_open_event_spawners_menu, //SKYRAT EDIT ADDITION - EVENTS
|
||||
/datum/admins/proc/toggleaooc, //SKYRAT EDIT ADDITION - ADMIN
|
||||
|
||||
@@ -280,15 +280,15 @@ This is highly likely to cause massive amounts of lag as every object in the gam
|
||||
// SKYRAT EDIT BEGIN - Bringing back the GAGS coloring menu
|
||||
steps += list(
|
||||
list(
|
||||
"layer"=icon2html(layer, user, dir=sprite_dir, sourceonly=TRUE, override_skyrat = TRUE),
|
||||
"result"=icon2html(result, user, dir=sprite_dir, sourceonly=TRUE, override_skyrat = TRUE),
|
||||
"layer"=icon2html(layer, user, dir=sprite_dir, sourceonly=TRUE),
|
||||
"result"=icon2html(result, user, dir=sprite_dir, sourceonly=TRUE),
|
||||
"config_name"=step["config_name"]
|
||||
)
|
||||
)
|
||||
// SKYRAT EDIT END
|
||||
|
||||
sprite_data["time_spent"] = TICK_DELTA_TO_MS(time_spent)
|
||||
sprite_data["finished"] = icon2html(finished, user, dir=sprite_dir, sourceonly=TRUE, override_skyrat = TRUE)
|
||||
sprite_data["finished"] = icon2html(finished, user, dir=sprite_dir, sourceonly=TRUE)
|
||||
refreshing = FALSE
|
||||
|
||||
/datum/greyscale_modify_menu/proc/Unlock()
|
||||
|
||||
@@ -229,7 +229,7 @@
|
||||
output += "<hr style='background:#000000; border:0; height:3px'>"
|
||||
var/datum/browser/panel = new(usr, "pmpanel", "Poll Management Panel", 780, 640)
|
||||
panel.add_stylesheet("admin_panelscss", 'html/admin/admin_panels.css')
|
||||
if(usr.client.prefs.tgui_fancy) //some browsers (IE8) have trouble with unsupported css3 elements that break the panel's functionality, so we won't load those if a user is in no frills tgui mode since that's for similar compatability support
|
||||
if(usr.client.prefs.read_preference(/datum/preference/toggle/tgui_fancy)) //some browsers (IE8) have trouble with unsupported css3 elements that break the panel's functionality, so we won't load those if a user is in no frills tgui mode since that's for similar compatability support
|
||||
panel.add_stylesheet("admin_panelscss3", 'html/admin/admin_panels_css3.css')
|
||||
panel.set_content(jointext(output, ""))
|
||||
panel.open()
|
||||
@@ -527,7 +527,7 @@
|
||||
panel_height = 320
|
||||
var/datum/browser/panel = new(usr, "popanel", "Poll Option Panel", 370, panel_height)
|
||||
panel.add_stylesheet("admin_panelscss", 'html/admin/admin_panels.css')
|
||||
if(usr.client.prefs.tgui_fancy) //some browsers (IE8) have trouble with unsupported css3 elements that break the panel's functionality, so we won't load those if a user is in no frills tgui mode since that's for similar compatability support
|
||||
if(usr.client.prefs.read_preference(/datum/preference/toggle/tgui_fancy)) //some browsers (IE8) have trouble with unsupported css3 elements that break the panel's functionality, so we won't load those if a user is in no frills tgui mode since that's for similar compatability support
|
||||
panel.add_stylesheet("admin_panelscss3", 'html/admin/admin_panels_css3.css')
|
||||
panel.set_content(jointext(output, ""))
|
||||
panel.open()
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
return FALSE
|
||||
|
||||
if(friend_candidate_client.prefs)
|
||||
random_appearance = tgui_alert(user, "Do you want the imaginary friend to look like and be named after [friend_candidate_client]'s current preferences ([friend_candidate_client.prefs.real_name])?", "Imaginary Friend Appearance?", list("Look-a-like", "Random")) == "Random"
|
||||
random_appearance = tgui_alert(user, "Do you want the imaginary friend to look like and be named after [friend_candidate_client]'s current preferences ([friend_candidate_client.prefs.read_preference(/datum/preference/name/real_name)])?", "Imaginary Friend Appearance?", list("Look-a-like", "Random")) == "Random"
|
||||
else
|
||||
random_appearance = TRUE
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
var/datum/browser/panel = new(usr, "banpanel", "Banning Panel", 910, panel_height)
|
||||
panel.add_stylesheet("admin_panelscss", 'html/admin/admin_panels.css')
|
||||
panel.add_stylesheet("banpanelcss", 'html/admin/banpanel.css')
|
||||
var/tgui_fancy = usr.client.prefs.tgui_fancy
|
||||
var/tgui_fancy = usr.client.prefs.read_preference(/datum/preference/toggle/tgui_fancy)
|
||||
if(tgui_fancy) //some browsers (IE8) have trouble with unsupported css3 elements and DOM methods that break the panel's functionality, so we won't load those if a user is in no frills tgui mode since that's for similar compatability support
|
||||
panel.add_stylesheet("admin_panelscss3", 'html/admin/admin_panels_css3.css')
|
||||
panel.add_script("banpaneljs", 'html/admin/banpanel.js')
|
||||
@@ -348,6 +348,9 @@
|
||||
ROLE_REV,
|
||||
ROLE_REVENANT,
|
||||
ROLE_REV_HEAD,
|
||||
ROLE_SENTIENT_DISEASE,
|
||||
ROLE_SPIDER,
|
||||
ROLE_SWARMER,
|
||||
ROLE_SYNDICATE,
|
||||
ROLE_TRAITOR,
|
||||
ROLE_WIZARD,
|
||||
|
||||
@@ -386,7 +386,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if(view_size.getView() == view_size.default)
|
||||
view_size.setTo(input("Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,37) - 7)
|
||||
else
|
||||
view_size.resetToDefault(getScreenSize(prefs.widescreenpref))
|
||||
view_size.resetToDefault(getScreenSize(prefs.read_preference(/datum/preference/toggle/widescreen)))
|
||||
|
||||
log_admin("[key_name(usr)] changed their view range to [view].")
|
||||
//message_admins("\blue [key_name_admin(usr)] changed their view range to [view].") //why? removed by order of XSI
|
||||
|
||||
@@ -11,7 +11,8 @@
|
||||
|
||||
mob.log_talk(msg, LOG_ASAY)
|
||||
msg = keywords_lookup(msg)
|
||||
var/custom_asay_color = (CONFIG_GET(flag/allow_admin_asaycolor) && prefs.asaycolor) ? "<font color=[prefs.asaycolor]>" : "<font color='#FF4500'>"
|
||||
var/asay_color = prefs.read_preference(/datum/preference/color/asay_color)
|
||||
var/custom_asay_color = (CONFIG_GET(flag/allow_admin_asaycolor) && asay_color) ? "<font color=[asay_color]>" : "<font color='[DEFAULT_ASAY_COLOR]'>"
|
||||
msg = "[span_adminsay("[span_prefix("ADMIN:")] <EM>[key_name(usr, 1)]</EM> [ADMIN_FLW(mob)]: [custom_asay_color]<span class='message linkify'>[msg]")]</span>[custom_asay_color ? "</font>":null]"
|
||||
to_chat(GLOB.admins,
|
||||
type = MESSAGE_TYPE_ADMINCHAT,
|
||||
|
||||
@@ -113,9 +113,8 @@ GLOBAL_DATUM(current_anonymous_theme, /datum/anonymous_theme)
|
||||
continue
|
||||
var/old_name = player.real_name //before restoration
|
||||
if(issilicon(player))
|
||||
player.apply_pref_name("[isAI(player) ? "ai" : "cyborg"]", player.client)
|
||||
player.apply_pref_name("[isAI(player) ? /datum/preference/name/ai : /datum/preference/name/cyborg]", player.client)
|
||||
else
|
||||
player.client.prefs.sanitize_chosen_prefs() // Just in case they changed unlawfully.
|
||||
player.client.prefs.apply_prefs_to(player) // This is not sound logic, as the prefs may have changed since then.
|
||||
player.fully_replace_character_name(old_name, player.real_name) //this changes IDs and PDAs and whatnot
|
||||
|
||||
@@ -131,7 +130,9 @@ GLOBAL_DATUM(current_anonymous_theme, /datum/anonymous_theme)
|
||||
* * target - mob for preferences and gender
|
||||
*/
|
||||
/datum/anonymous_theme/proc/anonymous_name(mob/target)
|
||||
return target.client.prefs.pref_species.random_name(target.gender,1)
|
||||
var/species_type = target.client.prefs.read_preference(/datum/preference/choiced/species)
|
||||
var/datum/species/species = new species_type
|
||||
return species.random_name(target.gender,1)
|
||||
|
||||
/**
|
||||
* anonymous_ai_name: generates a random name, based off of whatever the round's anonymousnames is set to (but for sillycones).
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
if(ertemplate.spawn_admin)
|
||||
if(isobserver(usr))
|
||||
var/mob/living/carbon/human/admin_officer = new (spawnpoints[1])
|
||||
var/chosen_outfit = usr.client?.prefs?.brief_outfit
|
||||
var/chosen_outfit = usr.client?.prefs?.read_preference(/datum/preference/choiced/brief_outfit)
|
||||
usr.client.prefs.safe_transfer_prefs_to(admin_officer, is_antag = TRUE)
|
||||
admin_officer.equipOutfit(chosen_outfit)
|
||||
admin_officer.key = usr.key
|
||||
|
||||
@@ -56,7 +56,7 @@ GLOBAL_DATUM(highlander_controller, /datum/highlander_controller)
|
||||
* * setup_list: list of all the datum setups (fancy list of roles) that would work for the game
|
||||
* * ready_players: list of filtered, sane players (so not playing or disconnected) for the game to put into roles
|
||||
*/
|
||||
/datum/highlander_controller/proc/new_highlander(mob/living/carbon/human/new_crewmember, rank)
|
||||
/datum/highlander_controller/proc/new_highlander(datum/source, mob/living/new_crewmember, rank)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
to_chat(new_crewmember, span_userdanger("<i>THERE CAN BE ONLY ONE!!!</i>"))
|
||||
@@ -90,8 +90,11 @@ GLOBAL_DATUM(highlander_controller, /datum/highlander_controller)
|
||||
log_admin("[key_name(usr)] used delayed THERE CAN BE ONLY ONE.")
|
||||
addtimer(CALLBACK(src, .proc/only_one, TRUE), 42 SECONDS)
|
||||
|
||||
/mob/living/carbon/human/proc/make_scottish()
|
||||
/mob/living/proc/make_scottish()
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/make_scottish()
|
||||
mind.add_antag_datum(/datum/antagonist/highlander)
|
||||
|
||||
/mob/living/silicon/robot/proc/make_scottish()
|
||||
/mob/living/silicon/robot/make_scottish()
|
||||
mind.add_antag_datum(/datum/antagonist/highlander/robot)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller)
|
||||
|
||||
/client/proc/secrets() //Creates a verb for admins to open up the ui
|
||||
set name = "Secrets"
|
||||
set desc = "Abuse harder than you ever have before with this handy dandy semi-misc stuff menu"
|
||||
@@ -448,24 +450,16 @@
|
||||
if(!SSticker.HasRoundStarted())
|
||||
tgui_alert(usr,"The game hasn't started yet!")
|
||||
return
|
||||
if(GLOB.everyone_a_traitor)
|
||||
tgui_alert(usr, "The everyone is a traitor secret has already been triggered")
|
||||
return
|
||||
var/objective = stripped_input(holder, "Enter an objective")
|
||||
if(!objective)
|
||||
return
|
||||
GLOB.everyone_a_traitor = new /datum/everyone_is_a_traitor_controller(objective)
|
||||
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Traitor All", "[objective]"))
|
||||
for(var/mob/living/player in GLOB.player_list)
|
||||
if(!(ishuman(player)||istype(player, /mob/living/silicon/)))
|
||||
continue
|
||||
if(player.stat == DEAD || !player.mind || ispAI(player))
|
||||
continue
|
||||
if(is_special_character(player))
|
||||
continue
|
||||
var/datum/antagonist/traitor/traitor_datum = new()
|
||||
traitor_datum.give_objectives = FALSE
|
||||
var/datum/objective/new_objective = new
|
||||
new_objective.owner = player
|
||||
new_objective.explanation_text = objective
|
||||
traitor_datum.objectives += new_objective
|
||||
player.mind.add_antag_datum(traitor_datum)
|
||||
GLOB.everyone_a_traitor.make_traitor(null, player)
|
||||
message_admins(span_adminnotice("[key_name_admin(holder)] used everyone is a traitor secret. Objective is [objective]"))
|
||||
log_admin("[key_name(holder)] used everyone is a traitor secret. Objective is [objective]")
|
||||
if("massbraindamage")
|
||||
@@ -612,3 +606,31 @@
|
||||
var/turf/T = get_step(loc, SOUTHWEST)
|
||||
flick_overlay_static(portal_appearance, T, 15)
|
||||
playsound(T, 'sound/magic/lightningbolt.ogg', rand(80, 100), TRUE)
|
||||
|
||||
///Makes sure latejoining crewmembers also become traitors.
|
||||
/datum/everyone_is_a_traitor_controller
|
||||
var/objective = ""
|
||||
|
||||
/datum/everyone_is_a_traitor_controller/New(objective)
|
||||
src.objective = objective
|
||||
RegisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED, .proc/make_traitor)
|
||||
|
||||
/datum/everyone_is_a_traitor_controller/Destroy()
|
||||
UnregisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED)
|
||||
return ..()
|
||||
|
||||
/datum/everyone_is_a_traitor_controller/proc/make_traitor(datum/source, mob/living/player)
|
||||
SIGNAL_HANDLER
|
||||
if(player.stat == DEAD || !player.mind)
|
||||
return
|
||||
if(!(ishuman(player) || issilicon(player)) || ispAI(player))
|
||||
return
|
||||
if(is_special_character(player))
|
||||
return
|
||||
var/datum/antagonist/traitor/traitor_datum = new()
|
||||
traitor_datum.give_objectives = FALSE
|
||||
var/datum/objective/new_objective = new
|
||||
new_objective.owner = player
|
||||
new_objective.explanation_text = objective
|
||||
traitor_datum.objectives += new_objective
|
||||
player.mind.add_antag_datum(traitor_datum)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
if(!QDELETED(D))
|
||||
vv_update_display(D, "deleted", "")
|
||||
// Skyrat edit addition start -- optional bluespace sparks on delete
|
||||
if(T && prefs.skyrat_toggles & ADMINDEL_ZAP_PREF)
|
||||
if(T && prefs.read_preference(/datum/preference/toggle/admin/delete_sparks))
|
||||
playsound(T, 'sound/magic/Repulse.ogg', 100, 1)
|
||||
var/datum/effect_system/spark_spread/quantum/sparks = new
|
||||
sparks.set_up(10, 1, T)
|
||||
|
||||
@@ -48,6 +48,8 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
var/show_name_in_check_antagonists = FALSE
|
||||
/// Should this antagonist be shown as antag to ghosts? Shouldn't be used for stealthy antagonists like traitors
|
||||
var/show_to_ghosts = FALSE
|
||||
/// The typepath for the outfit to show in the preview for the preferences menu.
|
||||
var/preview_outfit
|
||||
|
||||
//ANTAG UI
|
||||
|
||||
@@ -62,9 +64,7 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
|
||||
/datum/antagonist/Destroy()
|
||||
GLOB.antagonists -= src
|
||||
if(!owner)
|
||||
stack_trace("Destroy()ing antagonist datum when it has no owner.")
|
||||
else
|
||||
if(owner)
|
||||
LAZYREMOVE(owner.antag_datums, src)
|
||||
owner = null
|
||||
return ..()
|
||||
@@ -341,6 +341,42 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
/datum/antagonist/proc/get_admin_commands()
|
||||
. = list()
|
||||
|
||||
/// Creates an icon from the preview outfit.
|
||||
/// Custom implementors of `get_preview_icon` should use this, as the
|
||||
/// result of `get_preview_icon` is expected to be the completed version.
|
||||
/datum/antagonist/proc/render_preview_outfit(datum/outfit/outfit, mob/living/carbon/human/dummy)
|
||||
dummy = dummy || new /mob/living/carbon/human/dummy/consistent
|
||||
dummy.equipOutfit(outfit, visualsOnly = TRUE)
|
||||
COMPILE_OVERLAYS(dummy)
|
||||
var/icon = getFlatIcon(dummy)
|
||||
|
||||
// We don't want to qdel the dummy right away, since its items haven't initialized yet.
|
||||
SSatoms.prepare_deletion(dummy)
|
||||
|
||||
return icon
|
||||
|
||||
/// Given an icon, will crop it to be consistent of those in the preferences menu.
|
||||
/// Not necessary, and in fact will look bad if it's anything other than a human.
|
||||
/datum/antagonist/proc/finish_preview_icon(icon/icon)
|
||||
// Zoom in on the top of the head and the chest
|
||||
// I have no idea how to do this dynamically.
|
||||
icon.Scale(115, 115)
|
||||
|
||||
// This is probably better as a Crop, but I cannot figure it out.
|
||||
icon.Shift(WEST, 8)
|
||||
icon.Shift(SOUTH, 30)
|
||||
|
||||
icon.Crop(1, 1, ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE)
|
||||
|
||||
return icon
|
||||
|
||||
/// Returns the icon to show on the preferences menu.
|
||||
/datum/antagonist/proc/get_preview_icon()
|
||||
if (isnull(preview_outfit))
|
||||
return null
|
||||
|
||||
return finish_preview_icon(render_preview_outfit(preview_outfit))
|
||||
|
||||
/datum/antagonist/Topic(href,href_list)
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
@@ -19,6 +19,26 @@ GLOBAL_LIST_INIT(possible_abductor_names, list("Alpha","Beta","Gamma","Delta","E
|
||||
/// Type path for the associated job datum.
|
||||
var/role_job = /datum/job/abductor_agent
|
||||
|
||||
/datum/antagonist/abductor/get_preview_icon()
|
||||
var/mob/living/carbon/human/dummy/consistent/scientist = new
|
||||
var/mob/living/carbon/human/dummy/consistent/agent = new
|
||||
|
||||
scientist.set_species(/datum/species/abductor)
|
||||
agent.set_species(/datum/species/abductor)
|
||||
|
||||
var/icon/scientist_icon = render_preview_outfit(/datum/outfit/abductor/scientist, scientist)
|
||||
scientist_icon.Shift(WEST, 8)
|
||||
|
||||
var/icon/agent_icon = render_preview_outfit(/datum/outfit/abductor/agent, agent)
|
||||
agent_icon.Shift(EAST, 8)
|
||||
|
||||
var/icon/final_icon = scientist_icon
|
||||
final_icon.Blend(agent_icon, ICON_OVERLAY)
|
||||
|
||||
qdel(scientist)
|
||||
qdel(agent)
|
||||
|
||||
return finish_preview_icon(final_icon)
|
||||
|
||||
/datum/antagonist/abductor/agent
|
||||
name = "Abductor Agent"
|
||||
|
||||
@@ -38,6 +38,16 @@
|
||||
to_chat(owner.current, "<span class='alertsyndie'><font color=\"#EE4000\">You are no longer the Blob!</font></span>")
|
||||
return ..()
|
||||
|
||||
/datum/antagonist/blob/get_preview_icon()
|
||||
var/datum/blobstrain/reagent/reactive_spines/reactive_spines = /datum/blobstrain/reagent/reactive_spines
|
||||
|
||||
var/icon/icon = icon('icons/mob/blob.dmi', "blob_core")
|
||||
icon.Blend(initial(reactive_spines.color), ICON_MULTIPLY)
|
||||
icon.Blend(icon('icons/mob/blob.dmi', "blob_core_overlay"), ICON_OVERLAY)
|
||||
icon.Scale(ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE)
|
||||
|
||||
return icon
|
||||
|
||||
/datum/antagonist/blob/proc/create_objectives()
|
||||
var/datum/objective/blob_takeover/main = new
|
||||
main.owner = owner
|
||||
@@ -107,3 +117,22 @@
|
||||
var/mob/camera/blob/blob_cam = owner.current
|
||||
if(istype(blob_cam))
|
||||
. += "(Progress: [length(blob_cam.blobs_legit)]/[blob_cam.blobwincount])"
|
||||
|
||||
/// A subtype of blob meant to represent the infective version.
|
||||
/datum/antagonist/blob/infection
|
||||
job_rank = ROLE_BLOB_INFECTION
|
||||
|
||||
/datum/antagonist/blob/infection/get_preview_icon()
|
||||
var/icon/blob_icon = ..()
|
||||
|
||||
var/datum/blobstrain/reagent/reactive_spines/reactive_spines = /datum/blobstrain/reagent/reactive_spines
|
||||
var/icon/blob_head = icon('icons/mob/blob.dmi', "blob_head")
|
||||
blob_head.Blend(initial(reactive_spines.complementary_color), ICON_MULTIPLY)
|
||||
|
||||
var/icon/human_icon = render_preview_outfit(/datum/outfit/job/miner)
|
||||
human_icon.Blend(blob_head, ICON_OVERLAY)
|
||||
human_icon.ChangeOpacity(0.7)
|
||||
|
||||
blob_icon.Blend(finish_preview_icon(human_icon), ICON_OVERLAY)
|
||||
|
||||
return blob_icon
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user