mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-24 13:38:41 +01:00
tgui Preferences Menu + total rewrite of the preferences backend (#61313)
About The Pull Request Rewrites the entire preferences menu in tgui. Rewrites the entire backend to be built upon datumized preferences, rather than constant additions to the preferences base datum. Splits game preferences into its own window. Antagonists are now split into their individual rulesets. You can now be a roundstart heretic without signing up for latejoin heretic, as an example. This iteration matches parity, and provides very little new functionality, but adding anything new will be much easier. Fixes #60823 Fixes #28907 Fixes #44887 Fixes #59912 Fixes #58458 Fixes #59181 Major TODOs Quirk icons, from @Fikou (with some slight adjustments from me) Lore text, from @EOBGames (4/6, need moths and then ethereal lore from @AMonkeyThatCodes) Heavy documentation on how one would add new preferences, species, jobs, etc A lot of specialized testing so that people's real data don't get corrupted Changelog cl Mothblocks, Floyd on lots of the design refactor: The preferences menu has been completely rewritten in tgui. refactor: The "Stop Sounds" verb has been moved to OOC. /cl
This commit is contained in:
+9
-5
@@ -26,11 +26,6 @@
|
||||
/code/modules/admin/verbs/adminpm.dm @Cyberboss
|
||||
/code/modules/mapping/ @Cyberboss
|
||||
|
||||
|
||||
# Mothblocks
|
||||
|
||||
/code/modules/unit_tests/ @Mothblocks
|
||||
|
||||
# Jordie0608
|
||||
|
||||
/SQL/ @Jordie0608
|
||||
@@ -54,6 +49,15 @@
|
||||
/code/controllers/configuration/entries @MrStonedOne
|
||||
/config/ @MrStonedOne
|
||||
|
||||
# Mothblocks
|
||||
|
||||
/code/modules/unit_tests/ @Mothblocks
|
||||
/code/modules/client/preferences/ @Mothblocks
|
||||
/code/modules/preferences.dm @Mothblocks
|
||||
/code/modules/preferences_menu.dm @Mothblocks
|
||||
/code/modules/preferences_savefile.dm @Mothblocks
|
||||
/tgui/packages/tgui/interfaces/PreferenceMenu/ @Mothblocks
|
||||
|
||||
# ninjanomnom
|
||||
|
||||
/code/__DEFINES/dcs/ @ninjanomnom
|
||||
|
||||
+14
-16
@@ -123,31 +123,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"
|
||||
|
||||
@@ -100,8 +100,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
|
||||
|
||||
@@ -188,3 +188,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
@@ -206,34 +206,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"
|
||||
@@ -387,7 +374,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"
|
||||
@@ -104,47 +99,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,47 @@
|
||||
/// 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_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
|
||||
@@ -141,7 +142,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
|
||||
|
||||
@@ -733,3 +733,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"
|
||||
|
||||
@@ -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
|
||||
@@ -507,7 +507,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")
|
||||
|
||||
|
||||
@@ -28,7 +28,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)
|
||||
|
||||
@@ -154,6 +154,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)
|
||||
|
||||
@@ -272,8 +272,10 @@
|
||||
|
||||
CHECK_TICK
|
||||
SSdbcore.SetRoundEnd()
|
||||
|
||||
//Collects persistence features
|
||||
SSpersistence.collect_data()
|
||||
SSpersistent_paintings.save_paintings()
|
||||
|
||||
//stop collecting feedback during grifftime
|
||||
SSblackbox.Seal()
|
||||
|
||||
@@ -94,5 +94,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("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"
|
||||
))
|
||||
|
||||
@@ -34,7 +34,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)
|
||||
@@ -160,18 +159,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,
|
||||
@@ -193,18 +200,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)
|
||||
|
||||
@@ -58,6 +58,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
|
||||
|
||||
@@ -74,12 +86,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()
|
||||
|
||||
@@ -88,6 +100,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
|
||||
|
||||
|
||||
@@ -73,7 +73,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
|
||||
@@ -189,21 +193,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'
|
||||
@@ -216,7 +220,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)
|
||||
. = ..()
|
||||
@@ -233,7 +237,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]
|
||||
@@ -472,27 +472,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
|
||||
|
||||
@@ -328,7 +328,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()
|
||||
load_custom_outfits()
|
||||
|
||||
load_adventures()
|
||||
@@ -46,7 +43,6 @@ SUBSYSTEM_DEF(persistence)
|
||||
CollectMaps()
|
||||
SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION.
|
||||
SaveRandomizedRecipes()
|
||||
SavePaintings()
|
||||
SaveScars()
|
||||
save_custom_outfits()
|
||||
|
||||
@@ -411,22 +407,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))
|
||||
@@ -133,5 +133,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
|
||||
|
||||
|
||||
@@ -426,7 +426,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)
|
||||
|
||||
@@ -1,264 +0,0 @@
|
||||
SUBSYSTEM_DEF(traumas)
|
||||
name = "Traumas"
|
||||
flags = SS_NO_FIRE
|
||||
var/list/phobia_types
|
||||
var/list/phobia_regexes
|
||||
var/list/phobia_mobs
|
||||
var/list/phobia_objs
|
||||
var/list/phobia_turfs
|
||||
var/list/phobia_species
|
||||
|
||||
#define PHOBIA_FILE "phobia.json"
|
||||
|
||||
/datum/controller/subsystem/traumas/Initialize()
|
||||
//phobia types is to pull from randomly for brain traumas, e.g. conspiracies is for special assignment only
|
||||
phobia_types = sortList(list("spiders", "space", "security", "clowns", "greytide", "lizards",
|
||||
"skeletons", "snakes", "robots", "doctors", "authority", "the supernatural",
|
||||
"aliens", "strangers", "birds", "falling", "anime", "insects", "guns"))
|
||||
|
||||
phobia_regexes = list(
|
||||
"spiders" = construct_phobia_regex("spiders"),
|
||||
"space" = construct_phobia_regex("space"),
|
||||
"security" = construct_phobia_regex("security"),
|
||||
"clowns" = construct_phobia_regex("clowns"),
|
||||
"greytide" = construct_phobia_regex("greytide"),
|
||||
"lizards" = construct_phobia_regex("lizards"),
|
||||
"skeletons" = construct_phobia_regex("skeletons"),
|
||||
"snakes" = construct_phobia_regex("snakes"),
|
||||
"robots" = construct_phobia_regex("robots"),
|
||||
"doctors" = construct_phobia_regex("doctors"),
|
||||
"authority" = construct_phobia_regex("authority"),
|
||||
"the supernatural" = construct_phobia_regex("the supernatural"),
|
||||
"aliens" = construct_phobia_regex("aliens"),
|
||||
"strangers" = construct_phobia_regex("strangers"),
|
||||
"conspiracies" = construct_phobia_regex("conspiracies"),
|
||||
"birds" = construct_phobia_regex("birds"),
|
||||
"falling" = construct_phobia_regex("falling"),
|
||||
"anime" = construct_phobia_regex("anime"),
|
||||
"insects" = construct_phobia_regex("insects"),
|
||||
"ocky icky" = construct_phobia_regex("ocky icky"),
|
||||
"guns" = construct_phobia_regex("guns"),
|
||||
)
|
||||
|
||||
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/robot, /mob/living/silicon/ai,
|
||||
/mob/living/simple_animal/drone, /mob/living/simple_animal/bot, /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/parrot, /mob/living/simple_animal/chick, /mob/living/simple_animal/chicken,
|
||||
/mob/living/simple_animal/pet/penguin,
|
||||
)),
|
||||
"anime" = typecacheof(list(/mob/living/simple_animal/hostile/guardian)),
|
||||
"clowns" = typecacheof(list(/mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/bot/honkbot)),
|
||||
"insects" = typecacheof(list(/mob/living/basic/cockroach, /mob/living/simple_animal/hostile/bee))
|
||||
)
|
||||
|
||||
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,
|
||||
/obj/item/toy/figure/md, /obj/item/toy/figure/cmo, /obj/structure/statue/gold/cmo,
|
||||
/obj/structure/statue/silver/md, /obj/structure/statue/silver/medborg
|
||||
)),
|
||||
"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/black,
|
||||
/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/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
|
||||
)),
|
||||
)
|
||||
|
||||
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
|
||||
)),
|
||||
"clowns" = typecacheof(list(/turf/closed/wall/mineral/bananium, /turf/open/floor/mineral/bananium)),
|
||||
"falling" = typecacheof(list(/turf/open/chasm, /turf/open/floor/fakepit, /turf/open/openspace))
|
||||
)
|
||||
|
||||
phobia_species = list(
|
||||
"lizards" = typecacheof(list(/datum/species/lizard)),
|
||||
"skeletons" = typecacheof(list(/datum/species/skeleton, /datum/species/plasmaman)),
|
||||
"conspiracies" = typecacheof(list(/datum/species/abductor, /datum/species/lizard, /datum/species/synth)),
|
||||
"robots" = typecacheof(list(/datum/species/android)),
|
||||
"the supernatural" = typecacheof(list(
|
||||
/datum/species/golem/runic, /datum/species/skeleton, /datum/species/zombie,
|
||||
/datum/species/vampire, /datum/species/shadow
|
||||
)),
|
||||
"aliens" = typecacheof(list(/datum/species/abductor, /datum/species/jelly, /datum/species/pod, /datum/species/shadow)),
|
||||
"anime" = typecacheof(list(/datum/species/human/felinid)),
|
||||
"clowns" = typecacheof(list(/datum/species/golem/bananium)),
|
||||
"insects" = typecacheof(list(/datum/species/fly, /datum/species/moth))
|
||||
)
|
||||
|
||||
return ..()
|
||||
|
||||
///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
|
||||
/datum/controller/subsystem/traumas/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
|
||||
@@ -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
|
||||
|
||||
|
||||
+1
-1
@@ -471,7 +471,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
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
+16
-16
@@ -394,24 +394,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
|
||||
|
||||
/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>"
|
||||
@@ -52,6 +55,7 @@
|
||||
/datum/quirk/empath
|
||||
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."
|
||||
icon = "smile-beam"
|
||||
value = 8
|
||||
mob_trait = TRAIT_EMPATH
|
||||
gain_text = "<span class='notice'>You feel in tune with those around you.</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."
|
||||
@@ -178,6 +192,7 @@
|
||||
/datum/quirk/item_quirk/spiritual
|
||||
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."
|
||||
icon = "bible"
|
||||
value = 4
|
||||
mob_trait = TRAIT_SPIRITUAL
|
||||
gain_text = "<span class='notice'>You have faith in a higher power.</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)
|
||||
|
||||
+2
-2
@@ -2107,10 +2107,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.
|
||||
@@ -208,14 +210,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("Security Officer", "Warden", "Head of Personnel", "Detective", "Head of Security", "Captain")
|
||||
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", "Chief Medical Officer", "Research Director")
|
||||
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("Security Officer", "Warden", "Head of Personnel", "Detective", "Head of Security", "Captain","Prisoner")
|
||||
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", "Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
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")
|
||||
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")
|
||||
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", "Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
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
|
||||
@@ -746,8 +749,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)
|
||||
@@ -766,8 +768,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
|
||||
@@ -813,8 +814,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
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
/datum/dynamic_ruleset/roundstart/traitorbro
|
||||
name = "Blood Brothers"
|
||||
antag_flag = ROLE_BROTHER
|
||||
antag_datum = /datum/antagonist/brother/
|
||||
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
|
||||
@@ -492,6 +492,7 @@
|
||||
/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")
|
||||
@@ -563,6 +564,9 @@
|
||||
/datum/dynamic_ruleset/roundstart/nuclear/clown_ops
|
||||
name = "Clown Ops"
|
||||
antag_datum = /datum/antagonist/nukeop/clownop
|
||||
antag_flag = ROLE_CLOWN_OPERATIVE
|
||||
antag_preference = ROLE_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)
|
||||
|
||||
|
||||
@@ -774,7 +774,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
|
||||
@@ -1014,7 +1014,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"]
|
||||
|
||||
@@ -478,7 +478,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)
|
||||
|
||||
@@ -864,10 +864,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
|
||||
@@ -885,7 +885,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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -11,8 +11,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*/
|
||||
@@ -73,12 +71,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/colorasay,
|
||||
/client/proc/resetasaycolor,
|
||||
/client/proc/toggleadminhelpsound,
|
||||
/client/proc/respawn_character,
|
||||
/datum/admins/proc/open_borgopanel,
|
||||
/datum/admins/proc/view_all_circuits,
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -119,7 +119,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')
|
||||
@@ -316,6 +316,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).
|
||||
|
||||
@@ -119,7 +119,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
|
||||
|
||||
@@ -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 ..()
|
||||
@@ -337,6 +337,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
|
||||
|
||||
@@ -43,6 +43,34 @@
|
||||
/datum/antagonist/brother/antag_panel_data()
|
||||
return "Conspirators : [get_brother_names()]"
|
||||
|
||||
/datum/antagonist/brother/get_preview_icon()
|
||||
var/mob/living/carbon/human/dummy/consistent/brother1 = new
|
||||
var/mob/living/carbon/human/dummy/consistent/brother2 = new
|
||||
|
||||
brother1.dna.features["ethcolor"] = GLOB.color_list_ethereal["Faint Red"]
|
||||
brother1.set_species(/datum/species/ethereal)
|
||||
|
||||
brother2.dna.features["moth_antennae"] = "Plain"
|
||||
brother2.dna.features["moth_markings"] = "None"
|
||||
brother2.dna.features["moth_wings"] = "Plain"
|
||||
brother2.set_species(/datum/species/moth)
|
||||
|
||||
var/icon/brother1_icon = render_preview_outfit(/datum/outfit/job/quartermaster, brother1)
|
||||
brother1_icon.Blend(icon('icons/effects/blood.dmi', "maskblood"), ICON_OVERLAY)
|
||||
brother1_icon.Shift(WEST, 8)
|
||||
|
||||
var/icon/brother2_icon = render_preview_outfit(/datum/outfit/job/scientist, brother2)
|
||||
brother2_icon.Blend(icon('icons/effects/blood.dmi', "uniformblood"), ICON_OVERLAY)
|
||||
brother2_icon.Shift(EAST, 8)
|
||||
|
||||
var/icon/final_icon = brother1_icon
|
||||
final_icon.Blend(brother2_icon, ICON_OVERLAY)
|
||||
|
||||
qdel(brother1)
|
||||
qdel(brother2)
|
||||
|
||||
return finish_preview_icon(final_icon)
|
||||
|
||||
/datum/antagonist/brother/proc/get_brother_names()
|
||||
var/list/brothers = team.members - owner
|
||||
var/brother_text = ""
|
||||
|
||||
@@ -683,6 +683,20 @@
|
||||
|
||||
return parts.Join("<br>")
|
||||
|
||||
/datum/antagonist/changeling/get_preview_icon()
|
||||
var/icon/final_icon = render_preview_outfit(/datum/outfit/changeling)
|
||||
var/icon/split_icon = render_preview_outfit(/datum/outfit/job/engineer)
|
||||
|
||||
final_icon.Shift(WEST, world.icon_size / 2)
|
||||
final_icon.Shift(EAST, world.icon_size / 2)
|
||||
|
||||
split_icon.Shift(EAST, world.icon_size / 2)
|
||||
split_icon.Shift(WEST, world.icon_size / 2)
|
||||
|
||||
final_icon.Blend(split_icon, ICON_OVERLAY)
|
||||
|
||||
return finish_preview_icon(final_icon)
|
||||
|
||||
/datum/antagonist/changeling/ui_data(mob/user)
|
||||
var/list/data = list()
|
||||
var/list/memories = list()
|
||||
@@ -726,3 +740,10 @@
|
||||
to_chat(owner, span_boldannounce("You are a fresh changeling birthed from a headslug! You aren't as strong as a normal changeling, as you are newly born."))
|
||||
if(policy)
|
||||
to_chat(owner, policy)
|
||||
|
||||
/datum/outfit/changeling
|
||||
name = "Changeling"
|
||||
|
||||
head = /obj/item/clothing/head/helmet/changeling
|
||||
suit = /obj/item/clothing/suit/armor/changeling
|
||||
l_hand = /obj/item/melee/arm_blade
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
roundend_category = "obsessed"
|
||||
silent = TRUE //not actually silent, because greet will be called by the trauma anyway.
|
||||
suicide_cry = "FOR MY LOVE!!"
|
||||
preview_outfit = /datum/outfit/obsessed
|
||||
var/datum/brain_trauma/special/obsessed/trauma
|
||||
|
||||
/datum/antagonist/obsessed/admin_add(datum/mind/new_owner,mob/admin)
|
||||
@@ -44,6 +45,40 @@
|
||||
var/mob/living/M = mob_override || owner.current
|
||||
remove_antag_hud(antag_hud_type, M)
|
||||
|
||||
/datum/antagonist/obsessed/get_preview_icon()
|
||||
var/mob/living/carbon/human/dummy/consistent/victim_dummy = new
|
||||
victim_dummy.hair_color = "b96" // Brown
|
||||
victim_dummy.hairstyle = "Messy"
|
||||
victim_dummy.update_hair()
|
||||
|
||||
var/icon/obsessed_icon = render_preview_outfit(preview_outfit)
|
||||
obsessed_icon.Blend(icon('icons/effects/blood.dmi', "uniformblood"), ICON_OVERLAY)
|
||||
|
||||
var/icon/final_icon = finish_preview_icon(obsessed_icon)
|
||||
|
||||
final_icon.Blend(
|
||||
icon('icons/ui_icons/antags/obsessed.dmi', "obsession"),
|
||||
ICON_OVERLAY,
|
||||
ANTAGONIST_PREVIEW_ICON_SIZE - 30,
|
||||
20,
|
||||
)
|
||||
|
||||
return final_icon
|
||||
|
||||
/datum/outfit/obsessed
|
||||
name = "Obsessed (Preview only)"
|
||||
|
||||
uniform = /obj/item/clothing/under/misc/overalls
|
||||
gloves = /obj/item/clothing/gloves/color/latex
|
||||
mask = /obj/item/clothing/mask/surgical
|
||||
neck = /obj/item/camera
|
||||
suit = /obj/item/clothing/suit/apron
|
||||
|
||||
/datum/outfit/obsessed/post_equip(mob/living/carbon/human/H)
|
||||
for(var/obj/item/carried_item in H.get_equipped_items(TRUE))
|
||||
carried_item.add_mob_blood(H)//Oh yes, there will be blood...
|
||||
H.regenerate_icons()
|
||||
|
||||
/datum/antagonist/obsessed/proc/forge_objectives(datum/mind/obsessionmind)
|
||||
var/list/objectives_left = list("spendtime", "polaroid", "hug")
|
||||
var/datum/objective/assassinate/obsessed/kill = new
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
antagpanel_category = "Cult"
|
||||
antag_moodlet = /datum/mood_event/cult
|
||||
suicide_cry = "FOR NAR'SIE!!"
|
||||
preview_outfit = /datum/outfit/cultist
|
||||
var/datum/action/innate/cult/comm/communion = new
|
||||
var/datum/action/innate/cult/mastervote/vote = new
|
||||
var/datum/action/innate/cult/blood_magic/magic = new
|
||||
@@ -68,6 +69,24 @@
|
||||
if(cult_team.blood_target && cult_team.blood_target_image && current.client)
|
||||
current.client.images += cult_team.blood_target_image
|
||||
|
||||
/datum/antagonist/cult/get_preview_icon()
|
||||
var/icon/icon = render_preview_outfit(preview_outfit)
|
||||
|
||||
// The longsword is 64x64, but getFlatIcon crunches to 32x32.
|
||||
// So I'm just going to add it in post, screw it.
|
||||
|
||||
// Center the dude, because item icon states start from the center.
|
||||
// This makes the image 64x64.
|
||||
icon.Crop(-15, -15, 48, 48)
|
||||
|
||||
var/obj/item/melee/cultblade/longsword = new
|
||||
icon.Blend(icon(longsword.lefthand_file, longsword.inhand_icon_state), ICON_OVERLAY)
|
||||
qdel(longsword)
|
||||
|
||||
// Move the guy back to the bottom left, 32x32.
|
||||
icon.Crop(17, 17, 48, 48)
|
||||
|
||||
return finish_preview_icon(icon)
|
||||
|
||||
/datum/antagonist/cult/proc/equip_cultist(metal=TRUE)
|
||||
var/mob/living/carbon/H = owner.current
|
||||
@@ -434,3 +453,19 @@
|
||||
if(HAS_TRAIT(M, TRAIT_MINDSHIELD) || issilicon(M) || isbot(M) || isdrone(M) || !M.client)
|
||||
return FALSE //can't convert machines, shielded, or braindead
|
||||
return TRUE
|
||||
|
||||
/datum/outfit/cultist
|
||||
name = "Cultist (Preview only)"
|
||||
|
||||
uniform = /obj/item/clothing/under/color/black
|
||||
suit = /obj/item/clothing/suit/hooded/cultrobes/alt
|
||||
shoes = /obj/item/clothing/shoes/cult/alt
|
||||
r_hand = /obj/item/melee/blood_magic/stun
|
||||
|
||||
/datum/outfit/cultist/post_equip(mob/living/carbon/human/H, visualsOnly)
|
||||
H.eye_color = BLOODCULT_EYE
|
||||
H.update_body()
|
||||
|
||||
var/obj/item/clothing/suit/hooded/hooded = locate() in H
|
||||
hooded.MakeHood() // This is usually created on Initialize, but we run before atoms
|
||||
hooded.ToggleHood()
|
||||
|
||||
@@ -73,6 +73,11 @@
|
||||
|
||||
return result.Join("<br>")
|
||||
|
||||
/datum/antagonist/disease/get_preview_icon()
|
||||
var/icon/icon = icon('icons/mob/hud.dmi', "virus_infected")
|
||||
icon.Blend(COLOR_GREEN_GRAY, ICON_MULTIPLY)
|
||||
icon.Scale(ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE)
|
||||
return icon
|
||||
|
||||
/datum/objective/disease_infect
|
||||
explanation_text = "Survive and infect as many people as possible."
|
||||
|
||||
@@ -146,7 +146,7 @@ the new instance inside the host to be updated to the template's stats.
|
||||
else
|
||||
link = ""
|
||||
// Create map text prior to modifying message for goonchat
|
||||
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)
|
||||
// Recompose the message, because it's scrambled by default
|
||||
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
antag_hud_name = "heretic"
|
||||
hijack_speed = 0.5
|
||||
suicide_cry = "THE MANSUS SMILES UPON ME!!"
|
||||
preview_outfit = /datum/outfit/heretic
|
||||
var/give_equipment = TRUE
|
||||
var/list/researched_knowledge = list()
|
||||
var/total_sacrifices = 0
|
||||
@@ -32,6 +33,27 @@
|
||||
to_chat(owner.current, span_userdanger("Your mind begins to flare as the otherwordly knowledge escapes your grasp!"))
|
||||
owner.announce_objectives()
|
||||
|
||||
/datum/antagonist/heretic/get_preview_icon()
|
||||
var/icon/icon = render_preview_outfit(preview_outfit)
|
||||
|
||||
// MOTHBLOCKS TOOD: Copied and pasted from cult, make this its own proc
|
||||
|
||||
// The sickly blade is 64x64, but getFlatIcon crunches to 32x32.
|
||||
// So I'm just going to add it in post, screw it.
|
||||
|
||||
// Center the dude, because item icon states start from the center.
|
||||
// This makes the image 64x64.
|
||||
icon.Crop(-15, -15, 48, 48)
|
||||
|
||||
var/obj/item/melee/sickly_blade/blade = new
|
||||
icon.Blend(icon(blade.lefthand_file, blade.inhand_icon_state), ICON_OVERLAY)
|
||||
qdel(blade)
|
||||
|
||||
// Move the guy back to the bottom left, 32x32.
|
||||
icon.Crop(17, 17, 48, 48)
|
||||
|
||||
return finish_preview_icon(icon)
|
||||
|
||||
/datum/antagonist/heretic/on_gain()
|
||||
var/mob/living/current = owner.current
|
||||
if(ishuman(current))
|
||||
@@ -253,3 +275,14 @@
|
||||
if(!cultie)
|
||||
return FALSE
|
||||
return cultie.total_sacrifices >= target_amount
|
||||
|
||||
/datum/outfit/heretic
|
||||
name = "Heretic (Preview only)"
|
||||
|
||||
suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch
|
||||
r_hand = /obj/item/melee/touch_attack/mansus_fist
|
||||
|
||||
/datum/outfit/heretic/post_equip(mob/living/carbon/human/H, visualsOnly)
|
||||
var/obj/item/clothing/suit/hooded/hooded = locate() in H
|
||||
hooded.MakeHood() // This is usually created on Initialize, but we run before atoms
|
||||
hooded.ToggleHood()
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
antagpanel_category = "Family"
|
||||
show_in_antagpanel = FALSE // i don't *think* this base class is buggy but it's too worthless to test
|
||||
suicide_cry = "FOR THE FAMILY!!"
|
||||
preview_outfit = /datum/outfit/gangster
|
||||
/// The overarching family that the owner of this datum is a part of. Family teams are generic and imprinted upon by the per-person antagonist datums.
|
||||
var/datum/team/gang/my_gang
|
||||
/// The name of the family corresponding to this family member datum.
|
||||
@@ -251,6 +252,12 @@
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/outfit/gangster
|
||||
name = "Gangster (Preview only)"
|
||||
|
||||
uniform = /obj/item/clothing/under/suit/henchmen
|
||||
back = /obj/item/storage/backpack/henchmen
|
||||
|
||||
/datum/antagonist/gang/purple
|
||||
show_in_antagpanel = TRUE
|
||||
name = "Ballas"
|
||||
|
||||
@@ -187,4 +187,14 @@
|
||||
|
||||
return result.Join("<br>")
|
||||
|
||||
/datum/antagonist/malf_ai/get_preview_icon()
|
||||
var/icon/malf_ai_icon = icon('icons/mob/ai.dmi', "ai-red")
|
||||
|
||||
// Crop out the borders of the AI, just the face
|
||||
malf_ai_icon.Crop(5, 27, 28, 6)
|
||||
|
||||
malf_ai_icon.Scale(ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE)
|
||||
|
||||
return malf_ai_icon
|
||||
|
||||
#undef PROB_SPECIAL
|
||||
|
||||
@@ -16,6 +16,16 @@
|
||||
/datum/antagonist/monkey/can_be_owned(datum/mind/new_owner)
|
||||
return ..() && (!monkey_only || ismonkey(new_owner.current))
|
||||
|
||||
/datum/antagonist/monkey/get_preview_icon()
|
||||
// Creating a *real* monkey is fairly involved before atoms init.
|
||||
var/icon/icon = icon('icons/mob/monkey.dmi', "monkey1")
|
||||
|
||||
icon.Crop(4, 9, 28, 33)
|
||||
icon.Scale(ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE)
|
||||
icon.Shift(SOUTH, 10)
|
||||
|
||||
return icon
|
||||
|
||||
/datum/antagonist/monkey/get_team()
|
||||
return monkey_team
|
||||
|
||||
|
||||
@@ -14,6 +14,10 @@
|
||||
var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint.
|
||||
var/nukeop_outfit = /datum/outfit/syndicate
|
||||
|
||||
preview_outfit = /datum/outfit/nuclear_operative_elite
|
||||
|
||||
/// In the preview icon, the nukies who are behind the leader
|
||||
var/preview_outfit_behind = /datum/outfit/nuclear_operative
|
||||
|
||||
/datum/antagonist/nukeop/apply_innate_effects(mob/living/mob_override)
|
||||
var/mob/living/M = mob_override || owner.current
|
||||
@@ -148,6 +152,40 @@
|
||||
else
|
||||
to_chat(admin, span_danger("No valid nuke found!"))
|
||||
|
||||
/datum/antagonist/nukeop/get_preview_icon()
|
||||
if (!preview_outfit)
|
||||
return null
|
||||
|
||||
var/icon/final_icon = render_preview_outfit(preview_outfit)
|
||||
|
||||
if (!isnull(preview_outfit_behind))
|
||||
var/icon/teammate = render_preview_outfit(preview_outfit_behind)
|
||||
teammate.Blend(rgb(128, 128, 128, 128), ICON_MULTIPLY)
|
||||
|
||||
final_icon.Blend(teammate, ICON_OVERLAY, -world.icon_size / 4, 0)
|
||||
final_icon.Blend(teammate, ICON_OVERLAY, world.icon_size / 4, 0)
|
||||
|
||||
return finish_preview_icon(final_icon)
|
||||
|
||||
/datum/outfit/nuclear_operative
|
||||
name = "Nuclear Operative (Preview only)"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
head = /obj/item/clothing/head/helmet/space/hardsuit/syndi
|
||||
|
||||
/datum/outfit/nuclear_operative_elite
|
||||
name = "Nuclear Operative (Elite, Preview only)"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite
|
||||
head = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
|
||||
l_hand = /obj/item/modular_computer/tablet/nukeops
|
||||
r_hand = /obj/item/shield/energy
|
||||
|
||||
/datum/outfit/nuclear_operative_elite/post_equip(mob/living/carbon/human/H, visualsOnly)
|
||||
var/obj/item/shield/energy/shield = locate() in H.held_items
|
||||
shield.icon_state = "[shield.base_icon_state]1"
|
||||
H.update_inv_hands()
|
||||
|
||||
/datum/antagonist/nukeop/leader
|
||||
name = "Nuclear Operative Leader"
|
||||
nukeop_outfit = /datum/outfit/syndicate/leader
|
||||
@@ -225,6 +263,8 @@
|
||||
always_new_team = TRUE
|
||||
send_to_spawnpoint = FALSE //Handled by event
|
||||
nukeop_outfit = /datum/outfit/syndicate/full
|
||||
preview_outfit = /datum/outfit/nuclear_operative
|
||||
preview_outfit_behind = null
|
||||
|
||||
/datum/antagonist/nukeop/lone/assign_nuke()
|
||||
if(nuke_team && !nuke_team.tracked_nuke)
|
||||
|
||||
@@ -18,3 +18,6 @@
|
||||
/datum/antagonist/revenant/on_gain()
|
||||
forge_objectives()
|
||||
. = ..()
|
||||
|
||||
/datum/antagonist/revenant/get_preview_icon()
|
||||
return finish_preview_icon(icon('icons/mob/mob.dmi', "revenant_idle"))
|
||||
|
||||
@@ -163,6 +163,9 @@
|
||||
/datum/antagonist/rev/head
|
||||
name = "Head Revolutionary"
|
||||
antag_hud_name = "rev_head"
|
||||
|
||||
preview_outfit = /datum/outfit/revolutionary
|
||||
|
||||
var/remove_clumsy = FALSE
|
||||
var/give_flash = FALSE
|
||||
var/give_hud = TRUE
|
||||
@@ -181,6 +184,37 @@
|
||||
/datum/antagonist/rev/head/antag_listing_name()
|
||||
return ..() + "(Leader)"
|
||||
|
||||
/datum/antagonist/rev/head/get_preview_icon()
|
||||
var/icon/final_icon = render_preview_outfit(preview_outfit)
|
||||
|
||||
final_icon.Blend(make_assistant_icon("Business Hair"), ICON_UNDERLAY, -8, 0)
|
||||
final_icon.Blend(make_assistant_icon("CIA"), ICON_UNDERLAY, 8, 0)
|
||||
|
||||
// Apply the rev head HUD, but scale up the preview icon a bit beforehand.
|
||||
// Otherwise, the R gets cut off.
|
||||
final_icon.Scale(64, 64)
|
||||
|
||||
var/icon/rev_head_icon = icon('icons/mob/hud.dmi', "rev_head")
|
||||
rev_head_icon.Scale(48, 48)
|
||||
rev_head_icon.Crop(1, 1, 64, 64)
|
||||
rev_head_icon.Shift(EAST, 10)
|
||||
rev_head_icon.Shift(NORTH, 16)
|
||||
final_icon.Blend(rev_head_icon, ICON_OVERLAY)
|
||||
|
||||
return finish_preview_icon(final_icon)
|
||||
|
||||
/datum/antagonist/rev/head/proc/make_assistant_icon(hairstyle)
|
||||
var/mob/living/carbon/human/dummy/consistent/assistant = new
|
||||
assistant.hairstyle = hairstyle
|
||||
assistant.update_hair()
|
||||
|
||||
var/icon/assistant_icon = render_preview_outfit(/datum/outfit/job/assistant/consistent, assistant)
|
||||
assistant_icon.ChangeOpacity(0.5)
|
||||
|
||||
qdel(assistant)
|
||||
|
||||
return assistant_icon
|
||||
|
||||
/datum/antagonist/rev/proc/can_be_converted(mob/living/candidate)
|
||||
if(!candidate.mind)
|
||||
return FALSE
|
||||
@@ -559,5 +593,14 @@
|
||||
heads_report += "</table>"
|
||||
return common_part + heads_report
|
||||
|
||||
/datum/outfit/revolutionary
|
||||
name = "Revolutionary (Preview only)"
|
||||
|
||||
uniform = /obj/item/clothing/under/costume/soviet
|
||||
head = /obj/item/clothing/head/ushanka
|
||||
gloves = /obj/item/clothing/gloves/color/black
|
||||
l_hand = /obj/item/spear
|
||||
r_hand = /obj/item/assembly/flash
|
||||
|
||||
#undef DECONVERTER_STATION_WIN
|
||||
#undef DECONVERTER_REVS_WIN
|
||||
|
||||
@@ -26,6 +26,17 @@
|
||||
forge_objectives()
|
||||
. = ..()
|
||||
|
||||
/datum/antagonist/space_dragon/get_preview_icon()
|
||||
var/icon/icon = icon('icons/mob/spacedragon.dmi', "spacedragon")
|
||||
|
||||
icon.Blend(COLOR_STRONG_VIOLET, ICON_MULTIPLY)
|
||||
icon.Blend(icon('icons/mob/spacedragon.dmi', "overlay_base"), ICON_OVERLAY)
|
||||
|
||||
icon.Crop(10, 9, 54, 53)
|
||||
icon.Scale(ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE)
|
||||
|
||||
return icon
|
||||
|
||||
/datum/objective/summon_carp
|
||||
var/datum/antagonist/space_dragon/dragon
|
||||
explanation_text = "Summon and protect the rifts to flood the station with carp."
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
show_to_ghosts = TRUE
|
||||
antag_moodlet = /datum/mood_event/focused
|
||||
suicide_cry = "FOR THE SPIDER CLAN!!"
|
||||
preview_outfit = /datum/outfit/ninja
|
||||
///Whether or not this ninja will obtain objectives
|
||||
var/give_objectives = TRUE
|
||||
///Whether or not this ninja receives the standard equipment
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
/datum/antagonist/swarmer
|
||||
name = "Swarmer"
|
||||
job_rank = ROLE_ALIEN
|
||||
job_rank = ROLE_SWARMER
|
||||
show_to_ghosts = TRUE
|
||||
show_in_antagpanel = FALSE
|
||||
prevent_roundtype_conversion = FALSE
|
||||
@@ -32,6 +32,11 @@
|
||||
/datum/antagonist/swarmer/get_team()
|
||||
return swarmer_team
|
||||
|
||||
/datum/antagonist/swarmer/get_preview_icon()
|
||||
var/icon/swarmer_icon = icon('icons/mob/swarmer.dmi', "swarmer")
|
||||
swarmer_icon.Shift(NORTH, 8)
|
||||
return finish_preview_icon(swarmer_icon)
|
||||
|
||||
//SWARMER
|
||||
/mob/living/simple_animal/hostile/swarmer/mind_initialize()
|
||||
..()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user