Merge branch 'master' into refactor-internal-fluid-list
@@ -0,0 +1,3 @@
|
||||
REM Instructions: Drop in root folder, all directories and
|
||||
REM subdirectories will be purged of empty folders.
|
||||
for /f "delims=" %%i in ('dir /s /b /ad ^| sort /r') do rd "%%i" 2>NUL
|
||||
@@ -32,4 +32,4 @@
|
||||
#define SCREENTIP_PREFERENCE_CONTEXT_ONLY "Only with tips"
|
||||
|
||||
/// Regardless of intent
|
||||
#define INTENT_ANY "intent_any"
|
||||
#define INTENT_ANY "any"
|
||||
|
||||
@@ -1,31 +1,30 @@
|
||||
#define HINT_ICON_FILE 'icons/UI_Icons/screentips/cursor_hints.dmi'
|
||||
|
||||
// Generate intent icons
|
||||
/// Help intent icon for screentip context
|
||||
GLOBAL_DATUM_INIT(icon_intent_help, /image, image('icons/emoji.dmi', icon_state = INTENT_HELP))
|
||||
/// Disarm intent icon for screentip context
|
||||
GLOBAL_DATUM_INIT(icon_intent_disarm, /image, image('icons/emoji.dmi', icon_state = INTENT_DISARM))
|
||||
/// Grab intent icon for screentip context
|
||||
GLOBAL_DATUM_INIT(icon_intent_grab, /image, image('icons/emoji.dmi', icon_state = INTENT_GRAB))
|
||||
/// Harm intent icon for screentip context
|
||||
GLOBAL_DATUM_INIT(icon_intent_harm, /image, image('icons/emoji.dmi', icon_state = INTENT_HARM))
|
||||
GLOBAL_LIST_INIT_TYPED(screentip_context_icons, /image, prepare_screentip_context_icons())
|
||||
|
||||
/proc/prepare_screentip_context_icons()
|
||||
. = list()
|
||||
for(var/state in icon_states(HINT_ICON_FILE))
|
||||
.[state] = image(HINT_ICON_FILE, icon_state = state)
|
||||
|
||||
/*
|
||||
* # Builds context with each intent for this key
|
||||
* Args:
|
||||
* - context = list (REQUIRED)
|
||||
* - key = string (REQUIRED)
|
||||
* - allow_image = boolean (not required)
|
||||
*/
|
||||
/proc/build_context(list/context, key)
|
||||
/proc/build_context(list/context, key, allow_image)
|
||||
var/list/to_add
|
||||
for(var/intent in context[key])
|
||||
switch(intent)
|
||||
if(INTENT_HELP)
|
||||
LAZYADD(to_add, "\icon[GLOB.icon_intent_help] [key]: [context[key][INTENT_HELP]]")
|
||||
if(INTENT_DISARM)
|
||||
LAZYADD(to_add, "\icon[GLOB.icon_intent_disarm] [key]: [context[key][INTENT_DISARM]]")
|
||||
if(INTENT_GRAB)
|
||||
LAZYADD(to_add, "\icon[GLOB.icon_intent_grab] [key]: [context[key][INTENT_GRAB]]")
|
||||
if(INTENT_HARM)
|
||||
LAZYADD(to_add, "\icon[GLOB.icon_intent_harm] [key]: [context[key][INTENT_HARM]]")
|
||||
else // If you're adding intent-less YOU BETTER ADD IT FIRST IN THE LIST
|
||||
LAZYADD(to_add, "[key]: [context[key][intent]]")
|
||||
return english_list(to_add, "", " ", " ")
|
||||
var/key_help = "[length(key) > 3 ? copytext(key, 1, -3) : ""]"
|
||||
var/icon = "[copytext(key, -3)]-[intent]"
|
||||
if(allow_image)
|
||||
icon = "\icon[GLOB.screentip_context_icons[icon]]"
|
||||
LAZYADD(to_add, "[key_help][icon]: [context[key][intent]]")
|
||||
|
||||
var/separator = "[allow_image ? " " : " | "]"
|
||||
return english_list(to_add, "", separator, separator)
|
||||
|
||||
#undef HINT_ICON_FILE
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
/*
|
||||
* # COMSIG_MOB_ORGAN_ADD
|
||||
* From modular_sand\code\modules\surgery\organs
|
||||
* Used by signals for determining when an organ was inserted
|
||||
*/
|
||||
#define COMSIG_MOB_ORGAN_ADD "mob_organ_added"
|
||||
|
||||
/*
|
||||
* # COMSIG_MOB_ORGAN_REMOVE
|
||||
* From modular_sand\code\modules\surgery\organs
|
||||
* Used by signals for determining when an organ was removed
|
||||
*/
|
||||
#define COMSIG_MOB_ORGAN_REMOVE "mob_organ_removed"
|
||||
@@ -0,0 +1 @@
|
||||
#define COMSIG_KB_MOB_PIXELSHIFT "keybinding_mob_pixelshift"
|
||||
@@ -0,0 +1,8 @@
|
||||
//the names of the customization tabs
|
||||
//#define SETTINGS_TAB 0 //Already exists
|
||||
#define GAME_PREFERENCES_TAB 1
|
||||
#define APPEARANCE_TAB 2
|
||||
#define SPEECH_TAB 3
|
||||
#define LOADOUT_TAB 4
|
||||
#define CONTENT_PREFERENCES_TAB 5
|
||||
#define KEYBINDINGS_TAB_OLD 6
|
||||
@@ -1,3 +1,9 @@
|
||||
//Dominant/Well-trained quirks
|
||||
#define DOMINANT_DETECT_RANGE 5
|
||||
#define DOMINANT_SNAP_COOLDOWN 10 SECONDS
|
||||
|
||||
// Quirk mood types
|
||||
#define QMOOD_NUDIST "mood_nudist"
|
||||
#define QMOOD_MASKED_MOOK "mood_masked_mook"
|
||||
#define QMOOD_HIDE_BAG "mood_storage_concealment"
|
||||
#define QMOOD_WELL_TRAINED "mood_dom_trained"
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
#define SPECIES_SPECBOT "spectre_bot"
|
||||
#define SPECIES_SHADEKIN "shadekin"
|
||||
#define SPECIES_SPECBOT "spectre_bot"
|
||||
#define SPECIES_SHADEKIN "shadekin"
|
||||
#define SPECIES_ASHWALKER_WEST "ashlizard_west"
|
||||
#define SPECIES_ASHWALKER_EAST "ashlizard_east"
|
||||
|
||||
@@ -1,29 +1,33 @@
|
||||
#define SLAVER_TRAIT "slaver"
|
||||
#define PREGNANCY_TRAIT "pregnancy"
|
||||
// General traits
|
||||
#define TRAIT_PREGNANT "pregnant"
|
||||
#define TRAIT_FLOORED "floored"
|
||||
#define IGNORE_FAKE_Z_AXIS "ignore_fake_z_axis"
|
||||
#define TRAIT_TONGUELESS_SPEECH "tongueless_speech"
|
||||
|
||||
#define TRAIT_HYPNOTIC_GAZE "Hypnotic Gaze"
|
||||
#define TRAIT_PREGNANT "pregnant"
|
||||
// Trait types
|
||||
#define SLAVER_TRAIT "slaver"
|
||||
#define PREGNANCY_TRAIT "pregnancy"
|
||||
|
||||
#define TRAIT_FLOORED "floored"
|
||||
#define IGNORE_FAKE_Z_AXIS "ignore_fake_z_axis"
|
||||
|
||||
#define TRAIT_GFLUID_DETECT "genital_fluid_detect"
|
||||
|
||||
#define TRAIT_ASHRESISTANCE "TRAIT_ASHRESISTANCE"
|
||||
|
||||
#define TRAIT_TONGUELESS_SPEECH "tongueless-speech" //for dephelm stuff
|
||||
|
||||
// Hyperstation traits
|
||||
#define TRAIT_PHARMA "hepatic_pharmacokinesis"
|
||||
// Quirk traits
|
||||
#define TRAIT_HYPNOTIC_GAZE "hypnotic_gaze"
|
||||
#define TRAIT_GFLUID_DETECT "genital_fluid_detect"
|
||||
#define TRAIT_ASHRESISTANCE "ash_resistance"
|
||||
#define TRAIT_PHARMA "hepatic_pharmacokinesis"
|
||||
#define TRAIT_CHOKE_SLUT "choke_slut"
|
||||
|
||||
#define TRAIT_BLOODFLEDGE "BloodFledge"
|
||||
|
||||
#define TRAIT_INCUBUS "Incubus"
|
||||
#define TRAIT_SUCCUBUS "Succubus"
|
||||
|
||||
#define TRAIT_ARACHNID "Arachnid"
|
||||
#define TRAIT_BLOODFLEDGE "bloodfledge"
|
||||
#define TRAIT_INCUBUS "incubus"
|
||||
#define TRAIT_SUCCUBUS "succubus"
|
||||
#define TRAIT_ARACHNID "arachnid"
|
||||
#define TRAIT_FLUTTER "flutter"
|
||||
#define TRAIT_NUDIST "Nudist"
|
||||
#define TRAIT_NUDIST "nudist"
|
||||
#define TRAIT_CLOTH_EATER "cloth_eater"
|
||||
#define TRAIT_WEREWOLF "Werewolf"
|
||||
#define TRAIT_WEREWOLF "werewolf"
|
||||
#define TRAIT_PRIMITIVE "primitive"
|
||||
#define TRAIT_STEEL_ASS "steel_ass"
|
||||
#define TRAIT_CURSED_BLOOD "cursed_blood"
|
||||
#define TRAIT_HEADPAT_SLUT "headpat_slut"
|
||||
#define TRAIT_DISTANT "headpat_hater"
|
||||
#define TRAIT_ILLITERATE "illiterate"
|
||||
#define TRAIT_HIDE_BACKPACK "hide_backpack"
|
||||
#define TRAIT_DUMB4CUM "dumb4cum"
|
||||
#define TRAIT_RAD_FIEND "RadFiend"
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
#define SPECIES_ASHWALKER_WEST "ashlizard_west"
|
||||
#define SPECIES_ASHWALKER_EAST "ashlizard_east"
|
||||
@@ -1,9 +0,0 @@
|
||||
#define TRAIT_PRIMITIVE "primitive"
|
||||
#define TRAIT_STEEL_ASS "steel_ass"
|
||||
#define TRAIT_CURSED_BLOOD "cursed_blood" //Yo dawg I heard you like bloodborne references so I put a
|
||||
#define TRAIT_HEADPAT_SLUT "headpat_slut"
|
||||
#define TRAIT_DISTANT "headpat_hater"
|
||||
#define TRAIT_ILLITERATE "illiterate"
|
||||
#define TRAIT_HIDE_BACKPACK "hide_backpack"
|
||||
|
||||
#define TRAIT_DUMB4CUM "dumb4cum"
|
||||
@@ -106,6 +106,11 @@
|
||||
/// A luminescence-shifted value of the last color calculated for chatmessage overlays
|
||||
var/chat_color_darkened
|
||||
|
||||
// Use SET_BASE_PIXEL(x, y) to set these in typepath definitions, it'll handle pixel_x and y for you
|
||||
///Default pixel x shifting for the atom's icon.
|
||||
var/base_pixel_x = 0
|
||||
///Default pixel y shifting for the atom's icon.
|
||||
var/base_pixel_y = 0
|
||||
///Used for changing icon states for different base sprites.
|
||||
var/base_icon_state
|
||||
|
||||
@@ -1487,6 +1492,7 @@
|
||||
|
||||
if (isliving(user) || isovermind(user) || isaicamera(user))
|
||||
var/obj/item/held_item = user.get_active_held_item()
|
||||
var/allow_images = user.client.prefs.screentip_allow_images
|
||||
|
||||
if (flags_1 & HAS_CONTEXTUAL_SCREENTIPS_1 || held_item?.item_flags & ITEM_HAS_CONTEXTUAL_SCREENTIPS)
|
||||
var/list/context = list()
|
||||
@@ -1499,15 +1505,15 @@
|
||||
// LMB and RMB on one line...
|
||||
var/lmb_text = ""
|
||||
if((SCREENTIP_CONTEXT_LMB in context) && (length(context[SCREENTIP_CONTEXT_LMB]) > 0))
|
||||
lmb_text = build_context(context, SCREENTIP_CONTEXT_LMB)
|
||||
lmb_text = build_context(context, SCREENTIP_CONTEXT_LMB, allow_images)
|
||||
var/rmb_text = ""
|
||||
if((SCREENTIP_CONTEXT_RMB in context) && (length(context[SCREENTIP_CONTEXT_RMB]) > 0))
|
||||
rmb_text = build_context(context, SCREENTIP_CONTEXT_RMB)
|
||||
rmb_text = build_context(context, SCREENTIP_CONTEXT_RMB, allow_images)
|
||||
|
||||
if (lmb_text)
|
||||
lmb_rmb_line = lmb_text
|
||||
if (rmb_text)
|
||||
lmb_rmb_line += " | [rmb_text]"
|
||||
lmb_rmb_line += " | [allow_images ? " " : ""][rmb_text]"
|
||||
else if (rmb_text)
|
||||
lmb_rmb_line = rmb_text
|
||||
|
||||
@@ -1516,37 +1522,37 @@
|
||||
lmb_rmb_line += "<br>"
|
||||
extra_lines++
|
||||
if((SCREENTIP_CONTEXT_CTRL_LMB in context) && (length(context[SCREENTIP_CONTEXT_CTRL_LMB]) > 0))
|
||||
ctrl_lmb_ctrl_rmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_LMB)
|
||||
ctrl_lmb_ctrl_rmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_LMB, allow_images)
|
||||
|
||||
if((SCREENTIP_CONTEXT_CTRL_RMB in context) && (length(context[SCREENTIP_CONTEXT_CTRL_RMB]) > 0))
|
||||
if (ctrl_lmb_ctrl_rmb_line != "")
|
||||
ctrl_lmb_ctrl_rmb_line += " | "
|
||||
ctrl_lmb_ctrl_rmb_line += " | [allow_images ? " " : ""]"
|
||||
ctrl_lmb_ctrl_rmb_line += "[SCREENTIP_CONTEXT_CTRL_RMB]: [context[SCREENTIP_CONTEXT_CTRL_RMB]]"
|
||||
ctrl_lmb_ctrl_rmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_RMB)
|
||||
ctrl_lmb_ctrl_rmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_RMB, allow_images)
|
||||
|
||||
// Alt-LMB, Alt-RMB on one line...
|
||||
if (ctrl_lmb_ctrl_rmb_line != "")
|
||||
ctrl_lmb_ctrl_rmb_line += "<br>"
|
||||
extra_lines++
|
||||
if((SCREENTIP_CONTEXT_ALT_LMB in context) && (length(context[SCREENTIP_CONTEXT_ALT_LMB]) > 0))
|
||||
alt_lmb_alt_rmb_line = build_context(context, SCREENTIP_CONTEXT_ALT_LMB)
|
||||
alt_lmb_alt_rmb_line = build_context(context, SCREENTIP_CONTEXT_ALT_LMB, allow_images)
|
||||
if((SCREENTIP_CONTEXT_ALT_RMB in context) && (length(context[SCREENTIP_CONTEXT_ALT_RMB]) > 0))
|
||||
if (alt_lmb_alt_rmb_line != "")
|
||||
alt_lmb_alt_rmb_line += " | "
|
||||
alt_lmb_alt_rmb_line = build_context(context, SCREENTIP_CONTEXT_ALT_RMB)
|
||||
alt_lmb_alt_rmb_line += " | [allow_images ? " " : ""]"
|
||||
alt_lmb_alt_rmb_line = build_context(context, SCREENTIP_CONTEXT_ALT_RMB, allow_images)
|
||||
|
||||
// Shift-LMB, Ctrl-Shift-LMB on one line...
|
||||
if (alt_lmb_alt_rmb_line != "")
|
||||
alt_lmb_alt_rmb_line += "<br>"
|
||||
extra_lines++
|
||||
if((SCREENTIP_CONTEXT_SHIFT_LMB in context) && (length(context[SCREENTIP_CONTEXT_SHIFT_LMB]) > 0))
|
||||
shift_lmb_ctrl_shift_lmb_line = build_context(context, SCREENTIP_CONTEXT_SHIFT_LMB)
|
||||
shift_lmb_ctrl_shift_lmb_line = build_context(context, SCREENTIP_CONTEXT_SHIFT_LMB, allow_images)
|
||||
|
||||
if((SCREENTIP_CONTEXT_CTRL_SHIFT_LMB in context) && (length(context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]) > 0))
|
||||
if (shift_lmb_ctrl_shift_lmb_line != "")
|
||||
shift_lmb_ctrl_shift_lmb_line += " | "
|
||||
shift_lmb_ctrl_shift_lmb_line += " | [allow_images ? " " : ""]"
|
||||
shift_lmb_ctrl_shift_lmb_line += "[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]]"
|
||||
shift_lmb_ctrl_shift_lmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_SHIFT_LMB)
|
||||
shift_lmb_ctrl_shift_lmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_SHIFT_LMB, allow_images)
|
||||
|
||||
if (shift_lmb_ctrl_shift_lmb_line != "")
|
||||
extra_lines++
|
||||
|
||||
@@ -814,7 +814,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
|
||||
new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \
|
||||
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \
|
||||
new /datum/stack_recipe("shower curtain", /obj/structure/curtain, 10, time = 10, one_per_turf = 1, on_floor = 1), \
|
||||
new /datum/stack_recipe("duct", /obj/item/stack/ducts,1), \
|
||||
new /datum/stack_recipe("duct", /obj/item/stack/ducts, 1, 5, 50), \
|
||||
new /datum/stack_recipe("laser pointer case", /obj/item/glasswork/glass_base/laserpointer_shell, 30), \
|
||||
new /datum/stack_recipe("wet floor sign", /obj/item/clothing/suit/caution, 2),
|
||||
new /datum/stack_recipe("micro bricks", /obj/item/stack/sheet/micro_bricks, 1, 5, 15,)))
|
||||
|
||||
@@ -514,44 +514,3 @@
|
||||
/obj/item/stack/microwave_act(obj/machinery/microwave/M)
|
||||
if(istype(M) && M.dirty < 100)
|
||||
M.dirty += amount
|
||||
|
||||
/*
|
||||
* Recipe datum
|
||||
*/
|
||||
/datum/stack_recipe
|
||||
var/title = "ERROR"
|
||||
var/result_type
|
||||
var/req_amount = 1
|
||||
var/res_amount = 1
|
||||
var/max_res_amount = 1
|
||||
var/time = 0
|
||||
var/one_per_turf = FALSE
|
||||
var/on_floor = FALSE
|
||||
var/placement_checks = FALSE
|
||||
var/applies_mats = FALSE
|
||||
var/trait_booster = null
|
||||
var/trait_modifier = 1
|
||||
|
||||
/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1,time = 0, one_per_turf = FALSE, on_floor = FALSE, window_checks = FALSE, placement_checks = FALSE, applies_mats = FALSE, trait_booster = null, trait_modifier = 1)
|
||||
src.title = title
|
||||
src.result_type = result_type
|
||||
src.req_amount = req_amount
|
||||
src.res_amount = res_amount
|
||||
src.max_res_amount = max_res_amount
|
||||
src.time = time
|
||||
src.one_per_turf = one_per_turf
|
||||
src.on_floor = on_floor
|
||||
src.placement_checks = placement_checks
|
||||
src.applies_mats = applies_mats
|
||||
src.trait_booster = trait_booster
|
||||
src.trait_modifier = trait_modifier
|
||||
/*
|
||||
* Recipe list datum
|
||||
*/
|
||||
/datum/stack_recipe_list
|
||||
var/title = "ERROR"
|
||||
var/list/recipes
|
||||
|
||||
/datum/stack_recipe_list/New(title, recipes)
|
||||
src.title = title
|
||||
src.recipes = recipes
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
|
||||
/*
|
||||
* Recipe datum
|
||||
*/
|
||||
/datum/stack_recipe
|
||||
/// The title of the recipe
|
||||
var/title = "ERROR"
|
||||
/// What atom the recipe makes, typepath
|
||||
var/atom/result_type
|
||||
/// Amount of stack required to make
|
||||
var/req_amount = 1
|
||||
/// Amount of resulting atoms made
|
||||
var/res_amount = 1
|
||||
/// Max amount of resulting atoms made
|
||||
var/max_res_amount = 1
|
||||
/// How long it takes to make
|
||||
var/time = 0
|
||||
/// If only one of the resulting atom is allowed per turf
|
||||
var/one_per_turf = FALSE
|
||||
/// If the atom requires a floor below
|
||||
var/on_floor = FALSE
|
||||
/// Bitflag of additional placement checks required to place. (STACK_CHECK_CARDINALS|STACK_CHECK_ADJACENT)
|
||||
var/placement_checks = NONE
|
||||
/// If TRUE, the created atom will gain custom mat datums
|
||||
var/applies_mats = FALSE
|
||||
/// What trait, if any, boosts the construction speed of this item
|
||||
var/trait_booster
|
||||
/// How much the trait above, if supplied, boosts the construct speed of this item
|
||||
var/trait_modifier = 1
|
||||
|
||||
/datum/stack_recipe/New(
|
||||
title,
|
||||
result_type,
|
||||
req_amount = 1,
|
||||
res_amount = 1,
|
||||
max_res_amount = 1,
|
||||
time = 0,
|
||||
one_per_turf = FALSE,
|
||||
on_floor = FALSE,
|
||||
window_checks = FALSE,
|
||||
placement_checks = NONE,
|
||||
applies_mats = FALSE,
|
||||
trait_booster,
|
||||
trait_modifier = 1,
|
||||
)
|
||||
|
||||
src.title = title
|
||||
src.result_type = result_type
|
||||
src.req_amount = req_amount
|
||||
src.res_amount = res_amount
|
||||
src.max_res_amount = max_res_amount
|
||||
src.time = time
|
||||
src.one_per_turf = one_per_turf
|
||||
src.on_floor = on_floor
|
||||
src.placement_checks = placement_checks
|
||||
src.applies_mats = applies_mats
|
||||
src.trait_booster = trait_booster
|
||||
src.trait_modifier = trait_modifier
|
||||
|
||||
/*
|
||||
* Recipe list datum
|
||||
*/
|
||||
/datum/stack_recipe_list
|
||||
var/title = "ERROR"
|
||||
var/list/recipes
|
||||
|
||||
/datum/stack_recipe_list/New(title, recipes)
|
||||
src.title = title
|
||||
src.recipes = recipes
|
||||
@@ -64,6 +64,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/outline_color = COLOR_THEME_MIDNIGHT
|
||||
var/screentip_pref = SCREENTIP_PREFERENCE_ENABLED
|
||||
var/screentip_color = "#ffd391"
|
||||
var/screentip_allow_images = FALSE
|
||||
var/buttons_locked = FALSE
|
||||
var/hotkeys = FALSE
|
||||
|
||||
@@ -1264,6 +1265,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<b>Outline Color:</b> [outline_color ? "<span style='border:1px solid #161616; background-color: [outline_color];'>" : "Theme-based (null)"]<font color='[color_hex2num(outline_color) < 200 ? "FFFFFF" : "000000"]'>[outline_color]</font></span> <a href='?_src_=prefs;preference=outline_color'>Change</a><BR>"
|
||||
dat += "<b>Screentip:</b> <a href='?_src_=prefs;preference=screentip_pref'>[screentip_pref]</a><br>"
|
||||
dat += "<b>Screentip Color:</b> <span style='border:1px solid #161616; background-color: [screentip_color];'><font color='[color_hex2num(screentip_color) < 200 ? "FFFFFF" : "000000"]'>[screentip_color]</font></span> <a href='?_src_=prefs;preference=screentip_color'>Change</a><BR>"
|
||||
dat += "<font style='border-bottom:2px dotted white; cursor:help;'\
|
||||
title=\"This is an accessibility preference, if disabled, fallbacks to only text which colorblind people can understand better\">\
|
||||
<b>Screentip context with images:</b></font> <a href='?_src_=prefs;preference=screentip_allow_images'>[screentip_allow_images ? "Allowed" : "Disallowed"]</a><br>"
|
||||
dat += "<b>tgui Monitors:</b> <a href='?_src_=prefs;preference=tgui_lock'>[(tgui_lock) ? "Primary" : "All"]</a><br>"
|
||||
dat += "<b>tgui Style:</b> <a href='?_src_=prefs;preference=tgui_fancy'>[(tgui_fancy) ? "Fancy" : "No Frills"]</a><br>"
|
||||
dat += "<b>Show Runechat Chat Bubbles:</b> <a href='?_src_=prefs;preference=chat_on_map'>[chat_on_map ? "Enabled" : "Disabled"]</a><br>"
|
||||
@@ -1402,6 +1406,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<b>Be Antagonist Victim:</b> <a href='?_src_=prefs;preference=be_victim;task=input'>[be_victim ? be_victim : BEVICTIM_ASK]</a><br>"
|
||||
dat += "<b>Disable combat mode cursor:</b> <a href='?_src_=prefs;preference=disable_combat_cursor'>[disable_combat_cursor?"Yes":"No"]</a><br>"
|
||||
dat += "<b>Splashscreen Player Panel Style:</b> <a href='?_src_=prefs;preference=tg_playerpanel'>[(toggles & TG_PLAYER_PANEL)?"TG":"Old"]</a><br>"
|
||||
dat += "<b>Character Creation Menu Style:</b> <a href='?_src_=prefs;preference=charcreation_style'>[new_character_creator ? "New" : "Old"]</a><br>"
|
||||
//SPLURT Edit end
|
||||
|
||||
dat += "<br>"
|
||||
@@ -3561,6 +3566,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/pickedScreentipColor = input(user, "Choose your screentip color.", "General Preference", screentip_color) as color|null
|
||||
if(pickedScreentipColor)
|
||||
screentip_color = pickedScreentipColor
|
||||
if("screentip_allow_images")
|
||||
screentip_allow_images = !screentip_allow_images
|
||||
if("tgui_lock")
|
||||
tgui_lock = !tgui_lock
|
||||
if("winflash")
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
// You do not need to raise this if you are adding new values that have sane defaults.
|
||||
// Only raise this value when changing the meaning/format/name/layout of an existing value
|
||||
// where you would want the updater procs below to run
|
||||
#define SAVEFILE_VERSION_MAX 57
|
||||
#define SAVEFILE_VERSION_MAX 57.01
|
||||
|
||||
/*
|
||||
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
|
||||
@@ -423,6 +423,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["outline_enabled"] >> outline_enabled
|
||||
S["screentip_pref"] >> screentip_pref
|
||||
S["screentip_color"] >> screentip_color
|
||||
S["screentip_allow_images"] >> screentip_allow_images
|
||||
S["hotkeys"] >> hotkeys
|
||||
S["chat_on_map"] >> chat_on_map
|
||||
S["max_chat_length"] >> max_chat_length
|
||||
@@ -490,6 +491,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["disable_combat_cursor"] >> disable_combat_cursor
|
||||
S["use_new_playerpanel"] >> use_new_playerpanel
|
||||
S["gfluid_blacklist"] >> gfluid_blacklist
|
||||
S["new_character_creator"] >> new_character_creator
|
||||
|
||||
//favorite outfits
|
||||
S["favorite_outfits"] >> favorite_outfits
|
||||
|
||||
@@ -555,6 +558,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
key_bindings = sanitize_islist(key_bindings, list())
|
||||
modless_key_bindings = sanitize_islist(modless_key_bindings, list())
|
||||
favorite_outfits = SANITIZE_LIST(favorite_outfits)
|
||||
screentip_color = sanitize_hexcolor(screentip_color, 6, 1, initial(screentip_color))
|
||||
|
||||
//SKYRAT CHANGES BEGIN
|
||||
see_chat_emotes = sanitize_integer(see_chat_emotes, 0, 1, initial(see_chat_emotes))
|
||||
@@ -633,6 +637,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["outline_color"], outline_color)
|
||||
WRITE_FILE(S["screentip_pref"], screentip_pref)
|
||||
WRITE_FILE(S["screentip_color"], screentip_color)
|
||||
WRITE_FILE(S["screentip_allow_images"], screentip_allow_images)
|
||||
WRITE_FILE(S["hotkeys"], hotkeys)
|
||||
WRITE_FILE(S["chat_on_map"], chat_on_map)
|
||||
WRITE_FILE(S["max_chat_length"], max_chat_length)
|
||||
@@ -692,6 +697,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["disable_combat_cursor"], disable_combat_cursor)
|
||||
WRITE_FILE(S["use_new_playerpanel"], use_new_playerpanel)
|
||||
WRITE_FILE(S["gfluid_blacklist"], gfluid_blacklist)
|
||||
WRITE_FILE(S["new_character_creator"], new_character_creator)
|
||||
|
||||
var/mob/living/carbon/human/H = parent.mob
|
||||
if(istype(H))
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
var/mob/M = user.mob
|
||||
M.westface()
|
||||
return TRUE
|
||||
|
||||
/*
|
||||
/datum/keybinding/mob/shift_north
|
||||
hotkey_keys = list("CtrlShiftW", "CtrlShiftNorth")
|
||||
name = "pixel_shift_north"
|
||||
@@ -122,7 +122,7 @@
|
||||
var/mob/M = user.mob
|
||||
M.westshift()
|
||||
return TRUE
|
||||
|
||||
*/
|
||||
/datum/keybinding/living/hold_sprint
|
||||
hotkey_keys = list()
|
||||
classic_keys = list()
|
||||
|
||||
@@ -678,7 +678,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
|
||||
setDir(SOUTH)
|
||||
client.last_turn = world.time + MOB_FACE_DIRECTION_DELAY
|
||||
return TRUE
|
||||
|
||||
/*
|
||||
/mob/verb/eastshift()
|
||||
set hidden = TRUE
|
||||
if(!canface())
|
||||
@@ -710,7 +710,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
|
||||
if(pixel_y >= -32)
|
||||
pixel_y--
|
||||
is_shifted = TRUE
|
||||
|
||||
*/
|
||||
/mob/proc/IsAdvancedToolUser()//This might need a rename but it should replace the can this mob use things check
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -55,6 +55,8 @@
|
||||
var/resting = 0 //Carbon
|
||||
var/lying = 0
|
||||
var/lying_prev = 0
|
||||
|
||||
/// Whether the mob is pixel shifted or not
|
||||
var/is_shifted = FALSE
|
||||
|
||||
/// List of movement speed modifiers applying to this mob
|
||||
|
||||
@@ -45,6 +45,14 @@
|
||||
if(mob.force_moving)
|
||||
return FALSE
|
||||
|
||||
// Sandstorm Edit
|
||||
if(mob.shifting)
|
||||
mob.pixel_shift(direction)
|
||||
return FALSE
|
||||
else if(mob.is_shifted)
|
||||
mob.unpixel_shift()
|
||||
//
|
||||
|
||||
var/mob/living/L = mob //Already checked for isliving earlier
|
||||
if(L.incorporeal_move) //Move though walls
|
||||
Process_Incorpmove(direction)
|
||||
|
||||
@@ -388,7 +388,7 @@ All the important duct code:
|
||||
singular_name = "duct"
|
||||
icon = 'icons/obj/plumbing/fluid_ducts.dmi'
|
||||
icon_state = "ducts"
|
||||
custom_materials = list(/datum/material/iron=500)
|
||||
custom_materials = list(/datum/material/plastic = 400)
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
novariants = FALSE
|
||||
max_amount = 50
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
return round(A / max(1, all_materials[mat] * ef))
|
||||
|
||||
/obj/machinery/rnd/production/proc/efficient_with(path)
|
||||
return !ispath(path, /obj/item/stack/sheet) && !ispath(path, /obj/item/stack/ore/bluespace_crystal)
|
||||
return !ispath(path, /obj/item/stack/sheet) && !ispath(path, /obj/item/stack/ore/bluespace_crystal) && !ispath(path, /obj/item/stack/ducts)
|
||||
|
||||
/obj/machinery/rnd/production/proc/user_try_print_id(id, amount)
|
||||
if((!istype(linked_console) && requires_console) || !id)
|
||||
|
||||
@@ -90,3 +90,11 @@ TETRIS_SCORE_MAX_SCI 10000
|
||||
## This applies to both prizes and research points
|
||||
## Time is measured in ticks
|
||||
TETRIS_TIME_COOLDOWN 600
|
||||
|
||||
##
|
||||
## PROTOLATHE RESTRICTIONS
|
||||
###
|
||||
|
||||
## Should production machinery be restricted for skeleton crews?
|
||||
## Uncomment this to enable
|
||||
#PROTOLOCK_DURING_LOWPOP
|
||||
|
||||
@@ -108,3 +108,48 @@
|
||||
bourbon, resulting in 10 units.
|
||||
LeDrascol:
|
||||
- rscdel: Removed techweb entry for Infective Exo-Locomotion nanites
|
||||
2023-02-19:
|
||||
LeDrascol:
|
||||
- bugfix: Fixed techweb exploit with 357 speed loader
|
||||
- rscadd: Added more feedback messages to Cryptominer account changing
|
||||
- tweak: Standard cryptominers will report account changes on Cargo radio
|
||||
- balance: Setting a cryptominer's account now takes five seconds
|
||||
- admin: Added game logging for Cryptominer account changes
|
||||
- balance: Production machines now check ID cards for access
|
||||
- balance: R&D console starts locked by default
|
||||
- config: Added new configuration options for production machine access
|
||||
- tweak: In Estrous examine text is now based on the holder's reproductive organs
|
||||
- tweak: In Estrous gain text no longer implies the holder intends to be an organ
|
||||
recipient
|
||||
- code_imp: Added signals for organ insertion and removal
|
||||
- tweak: The Gear Harness is now non-covering
|
||||
- rscadd: Added Synthetic species flavor text for In Estrous
|
||||
- tweak: In Estrous no longer requires both female organs
|
||||
- code_imp: In Estrous examine text uses English lists
|
||||
SandPoot:
|
||||
- imageadd: Changed screentips icons to something a lot fancier unified with the
|
||||
LMB / RMB text.
|
||||
2023-02-20:
|
||||
LeDrascol:
|
||||
- refactor: Refactored trait defines
|
||||
2023-02-21:
|
||||
SandPoot:
|
||||
- tweak: Tweaked pixelshifting. (Default keybinding is B, check your keybinds!)
|
||||
- bugfix: Duct pipes will always have the same cost no matter where you make it.
|
||||
- bugfix: Hand-made duct pipes will properly stack with machine made ones.
|
||||
2023-02-22:
|
||||
BongaTheProto:
|
||||
- tweak: The pixelfishing keybind is now B, although you can use use the previous
|
||||
ctrl+shift keybinds. Please make sure you check your keybinds!
|
||||
2023-02-23:
|
||||
Comicao1:
|
||||
- tweak: Wendigos may now work in a proper way, and are also able to enslave people
|
||||
through sex while grabbing them.
|
||||
LeDrascol:
|
||||
- rscadd: 'Added positive quirk: Rad Fiend'
|
||||
WoolyAypa:
|
||||
- rscadd: Added a tajaran snout option
|
||||
- rscadd: Added an alt version of the dragon wings
|
||||
- rscadd: Added a stripper version of the explorer jumpsuit
|
||||
- rscadd: Added the security stripper outfit in the loadout
|
||||
- tweak: Now the security stripper outfit can be used with digitigrade
|
||||
|
||||
|
After Width: | Height: | Size: 414 B |
|
After Width: | Height: | Size: 490 B |
@@ -92,3 +92,7 @@
|
||||
// Minimum time between giving rewards
|
||||
/datum/config_entry/number/tetris_time_cooldown
|
||||
config_entry_value = 600
|
||||
|
||||
/// R&D Machinery ///
|
||||
// Should production machinery be restricted for skeleton crews?
|
||||
/datum/config_entry/flag/protolock_during_lowpop
|
||||
|
||||
@@ -36,16 +36,50 @@
|
||||
desc = "Your system burns with the desire to be bred. Satisfying your lust will make you happy, while ignoring it may cause you to become sad and needy."
|
||||
value = 0
|
||||
mob_trait = TRAIT_ESTROUS_ACTIVE
|
||||
gain_text = span_love("You body burns with the desire to be bred.")
|
||||
gain_text = span_love("You body burns with the desire to engage in breeding.")
|
||||
lose_text = span_notice("You feel more in control of your body and thoughts.")
|
||||
|
||||
// Default heat message for examine text
|
||||
var/heat_type = "influenced by the estrous cycle"
|
||||
|
||||
// Type of interaction to be performed
|
||||
// Intended for use with downstream quirks
|
||||
var/positional_orientation = "engage in breeding"
|
||||
|
||||
/datum/quirk/estrous_active/add()
|
||||
// Add examine hook
|
||||
RegisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE, .proc/quirk_examine_estrous_active)
|
||||
|
||||
// Add organ change hooks
|
||||
RegisterSignal(quirk_holder, COMSIG_MOB_ORGAN_ADD, .proc/update_heat_type)
|
||||
RegisterSignal(quirk_holder, COMSIG_MOB_ORGAN_REMOVE, .proc/update_heat_type)
|
||||
|
||||
/datum/quirk/estrous_active/remove()
|
||||
// Remove examine hook
|
||||
UnregisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE)
|
||||
// Remove signals
|
||||
UnregisterSignal(quirk_holder, list(COMSIG_MOB_ORGAN_ADD, COMSIG_MOB_ORGAN_REMOVE, COMSIG_PARENT_EXAMINE))
|
||||
|
||||
/datum/quirk/estrous_active/post_add()
|
||||
// Update text used by message
|
||||
update_heat_type()
|
||||
|
||||
/datum/quirk/estrous_active/proc/update_heat_type()
|
||||
// Define temporary list of heat phrases
|
||||
var/list/heat_phrases = list()
|
||||
|
||||
// Check for male hormonal organ
|
||||
if(quirk_holder.has_balls())
|
||||
heat_phrases += "in rut"
|
||||
|
||||
// Check for female hormonal organ
|
||||
if(quirk_holder.getorganslot(ORGAN_SLOT_WOMB))
|
||||
heat_phrases += "in estrous"
|
||||
|
||||
// Check for synthetic
|
||||
if(isrobotic(quirk_holder))
|
||||
heat_phrases += "simulating hormones"
|
||||
|
||||
// Build English list
|
||||
heat_type = english_list(heat_phrases, nothing_text = "experiencing high hormonal levels")
|
||||
|
||||
/datum/quirk/estrous_active/proc/quirk_examine_estrous_active(atom/examine_target, mob/living/carbon/human/examiner, list/examine_list)
|
||||
SIGNAL_HANDLER
|
||||
@@ -59,4 +93,4 @@
|
||||
return
|
||||
|
||||
// Add quirk message
|
||||
examine_list += span_love("[quirk_holder.p_they(TRUE)] [quirk_holder.p_are()] currently influenced by the estrous cycle, and long for breeding.")
|
||||
examine_list += span_love("[quirk_holder.p_they(TRUE)] [quirk_holder.p_are()] currently [heat_type], with a longing to [positional_orientation].")
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
/obj/machinery/cryptominer
|
||||
name = "cryptocurrency miner"
|
||||
desc = "This handy-dandy machine will produce credits for your enjoyment."
|
||||
desc = "This handy-dandy machine will produce credits for Cargo's enjoyment."
|
||||
icon = 'modular_sand/icons/obj/machines/cryptominer.dmi'
|
||||
icon_state = "off"
|
||||
density = TRUE
|
||||
@@ -32,9 +32,23 @@
|
||||
var/miningtime = 3000
|
||||
var/miningpoints = 50
|
||||
var/datum/bank_account/pay_me = null
|
||||
var/obj/item/radio/cargo_radio
|
||||
// Should this machine send messages on cargo radio?
|
||||
var/radio_snitch = TRUE
|
||||
|
||||
/obj/machinery/cryptominer/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
// Create new radio
|
||||
cargo_radio = new /obj/item/radio(src)
|
||||
|
||||
// Prevent radio listening
|
||||
cargo_radio.listening = 0
|
||||
|
||||
// Set radio frequency
|
||||
cargo_radio.set_frequency(FREQ_SUPPLY)
|
||||
|
||||
// Set default account
|
||||
pay_me = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
|
||||
/obj/machinery/cryptominer/update_icon()
|
||||
@@ -48,6 +62,7 @@
|
||||
|
||||
/obj/machinery/cryptominer/Destroy()
|
||||
STOP_PROCESSING(SSmachines,src)
|
||||
QDEL_NULL(cargo_radio)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/cryptominer/deconstruct()
|
||||
@@ -61,35 +76,107 @@
|
||||
return
|
||||
if(default_unfasten_wrench(user, W))
|
||||
return
|
||||
|
||||
// Check if disabled
|
||||
// Check if panel is open
|
||||
// Check if user is in HELP intent
|
||||
if(!mining && panel_open && user.a_intent == INTENT_HELP)
|
||||
// Attempt to locate user's ID
|
||||
var/id_card = W.GetID()
|
||||
if(id_card)
|
||||
var/obj/item/card/id/CARD = id_card
|
||||
if(CARD.bank_support != ID_FREE_BANK_ACCOUNT)
|
||||
to_chat(user, span_warning("This ID has no banking support whatsover, must be an older model..."))
|
||||
return
|
||||
if(!CARD.registered_account)
|
||||
to_chat(user, span_warning("ERROR: No bank account found."))
|
||||
return
|
||||
to_chat(user, span_notice("You link \the [CARD] to \the [src]."))
|
||||
pay_me = CARD.registered_account
|
||||
say("Now using [pay_me.account_holder ? "[pay_me.account_holder]s" : span_boldwarning("ERROR")] account.")
|
||||
|
||||
// Check if ID exists
|
||||
if(!id_card)
|
||||
return
|
||||
|
||||
// Define ID card
|
||||
var/obj/item/card/id/CARD = id_card
|
||||
|
||||
// Check if ID card has banking support
|
||||
if(CARD.bank_support != ID_FREE_BANK_ACCOUNT)
|
||||
// Warn in local chat and return
|
||||
say("ERROR: No banking support found on provided ID card.")
|
||||
return
|
||||
|
||||
// Check if ID card has a linked account
|
||||
if(!CARD.registered_account)
|
||||
// Warn in local chat and return
|
||||
say("ERROR: No bank account found on provided ID card.")
|
||||
return
|
||||
|
||||
// Display message in local chat
|
||||
user.visible_message(span_notice("[user] begins setting \the [src] to use \the [CARD]."), span_notice("[user] begins setting \the [src] to use \the [CARD]."))
|
||||
|
||||
// Display alert balloon
|
||||
balloon_alert(user, "Configuring new account...")
|
||||
|
||||
// Perform interaction timer
|
||||
if(!do_after(user, 5 SECONDS, target = src))
|
||||
// Warn in local chat
|
||||
user.visible_message(span_warning("[user] fails to link \the [src] to a new account!"), span_warning("You fail to link \the [src] to a new account!"))
|
||||
|
||||
// Display alert balloon
|
||||
balloon_alert(user, "Configuration failed!")
|
||||
|
||||
// Return with no further effects
|
||||
return
|
||||
|
||||
// Alert user of linking success
|
||||
to_chat(user, span_notice("You link \the [CARD] to \the [src]."))
|
||||
|
||||
// Define previous account
|
||||
var/old_account = pay_me
|
||||
|
||||
// Set payment account to ID card's account
|
||||
pay_me = CARD.registered_account
|
||||
|
||||
// Say in local chat
|
||||
say("Now using [pay_me.account_holder ? "[pay_me.account_holder]s" : span_boldwarning("ERROR")] account.")
|
||||
|
||||
// Log interaction
|
||||
log_game("[user] set \the [src] in [get_area(src)] to pay into their personal account. Previous account was [old_account].")
|
||||
|
||||
// Check if old account was cargo
|
||||
// Check if this machine should report over radio
|
||||
if(radio_snitch && (old_account == SSeconomy.get_dep_account(ACCOUNT_CAR)))
|
||||
// Send radio notice
|
||||
cargo_radio.talk_into(src, "CRYPTO ALERT: Crew member [user] has set \the [src] in [get_area(src)] to use [pay_me.account_holder]\'s account, instead of Cargo!", FREQ_SUPPLY)
|
||||
|
||||
/obj/machinery/cryptominer/AltClick(mob/user)
|
||||
user.visible_message(span_warning("[user] begins resetting \the [src]."),
|
||||
span_warning("You begin resetting \the [src]."))
|
||||
balloon_alert(user, "resetting")
|
||||
if(do_after(user, 5 SECONDS, target = src))
|
||||
pay_me = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
say("Now using [pay_me.account_holder]s account.")
|
||||
// Alert user in chat
|
||||
user.visible_message(span_warning("[user] begins resetting \the [src]."), span_warning("You begin resetting \the [src]."))
|
||||
|
||||
// Display alert balloon
|
||||
balloon_alert(user, "Resetting account...")
|
||||
|
||||
// Perform interaction timer
|
||||
if(!do_after(user, 5 SECONDS, target = src))
|
||||
// Warn in local chat
|
||||
user.visible_message(span_warning("[user] fails to reset \the [src]."), span_warning("You fail to reset \the [src]."))
|
||||
|
||||
// Display alert balloon
|
||||
balloon_alert(user, "Reset failed!")
|
||||
|
||||
// Return with no further effects
|
||||
return
|
||||
|
||||
// Define previous account
|
||||
var/old_account = pay_me
|
||||
|
||||
// Reset account to Cargo
|
||||
pay_me = SSeconomy.get_dep_account(ACCOUNT_CAR)
|
||||
|
||||
// Say in local chat
|
||||
say("Now using [pay_me.account_holder]s account.")
|
||||
|
||||
// Log interaction
|
||||
log_game("[user] reset the \the [src] in [get_area(src)] to pay Cargo's departmental account. Previous account was [old_account]")
|
||||
|
||||
/obj/machinery/cryptominer/examine(mob/user)
|
||||
. = ..()
|
||||
if(in_range(user, src) || isobserver(user))
|
||||
. += span_notice("A little screen on the machine reads: Currently the linked bank account is [pay_me.account_holder ? "[pay_me.account_holder]s" : span_boldwarning("ERROR")].")
|
||||
. += "Modify the destination of the credits using your id on it while it is inactive and has its panel open."
|
||||
. += "Alt-Click to reset to the Cargo budget.</span>"
|
||||
. += "Modify the destination of the credits using your id on it while it is inactive and has its panel open."
|
||||
. += "Alt-Click to reset to the Cargo budget.</span>"
|
||||
|
||||
/obj/machinery/cryptominer/process()
|
||||
// Get turf
|
||||
@@ -190,7 +277,7 @@
|
||||
|
||||
/obj/machinery/cryptominer/syndie
|
||||
name = "syndicate cryptocurrency miner"
|
||||
desc = "This handy-dandy machine will produce credits for your enjoyment. It lasts a little longer."
|
||||
desc = "This handy-dandy machine will produce credits for your own personal enjoyment. This one won't snitch on you to Cargo."
|
||||
icon_state = "off_syndie"
|
||||
density = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
@@ -199,6 +286,7 @@
|
||||
circuit = /obj/item/circuitboard/machine/cryptominer/syndie
|
||||
miningtime = 6000
|
||||
miningpoints = 100
|
||||
radio_snitch = FALSE // Illegal tech!
|
||||
|
||||
/obj/machinery/cryptominer/syndie/update_icon()
|
||||
. = ..()
|
||||
@@ -219,6 +307,7 @@
|
||||
active_power_usage = 1
|
||||
miningtime = 600000
|
||||
miningpoints = 1000
|
||||
radio_snitch = FALSE // None of cargo's business!
|
||||
|
||||
/obj/machinery/cryptominer/nanotrasen/update_icon()
|
||||
. = ..()
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
/obj/item/clothing/under/misc/gear_harness
|
||||
can_adjust = FALSE
|
||||
body_parts_covered = NONE
|
||||
|
||||
/obj/item/clothing/under/misc/gear_harness/toggle_jumpsuit_adjust()
|
||||
// Alert user and return
|
||||
to_chat(usr, span_notice("[src] cannot be adjusted!"))
|
||||
return FALSE
|
||||
@@ -15,6 +15,7 @@
|
||||
to_chat(src, span_warning("You cannot increase your layer priority any further."))
|
||||
return
|
||||
|
||||
layer = clamp(layer, MOB_LAYER_SHIFT_MIN, MOB_LAYER_SHIFT_MAX)
|
||||
layer += MOB_LAYER_SHIFT_INCREMENT
|
||||
var/layer_priority = FLOOR((layer - MOB_LAYER) * 100, 1) // Just for text feedback
|
||||
to_chat(src, span_notice("Your layer priority is now [layer_priority]."))
|
||||
@@ -31,6 +32,7 @@
|
||||
to_chat(src, span_warning("You cannot decrease your layer priority any further."))
|
||||
return
|
||||
|
||||
layer = clamp(layer, MOB_LAYER_SHIFT_MIN, MOB_LAYER_SHIFT_MAX)
|
||||
layer -= MOB_LAYER_SHIFT_INCREMENT
|
||||
var/layer_priority = FLOOR((layer - MOB_LAYER) * 100, 1) // Just for text feedback
|
||||
to_chat(src, span_notice("Your layer priority is now [layer_priority]."))
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
// Configuration defines
|
||||
#define JOB_MINIMAL_ACCESS CONFIG_GET(flag/jobs_have_minimal_access)
|
||||
#define PROTOLOCK_DURING_LOWPOP CONFIG_GET(flag/protolock_during_lowpop)
|
||||
|
||||
// Only Clients should have a panel for them, okay?
|
||||
/mob/Login()
|
||||
. = ..()
|
||||
@@ -23,3 +27,44 @@
|
||||
|
||||
/mob/proc/set_thirst(change)
|
||||
thirst = max(0, change)
|
||||
|
||||
/mob/proc/can_use_production(obj/machinery/rnd/production/machine_target)
|
||||
// Check if server is NOT using minimal access
|
||||
// This is intended for low populations
|
||||
if((!PROTOLOCK_DURING_LOWPOP) && (!JOB_MINIMAL_ACCESS))
|
||||
// Allow unrestricted use
|
||||
return TRUE
|
||||
|
||||
// Define machine user
|
||||
var/mob/living/carbon/human/machine_user = src
|
||||
|
||||
// Check if user exists
|
||||
if(!istype(machine_user))
|
||||
return TRUE
|
||||
|
||||
// Define user ID card
|
||||
var/obj/item/card/id/user_id = machine_user.get_idcard()
|
||||
|
||||
// Check if ID card was found
|
||||
if(!istype(user_id))
|
||||
// Warn in local chat, then return
|
||||
machine_target.say("Access denied: Unable to scan user ID card.")
|
||||
return FALSE
|
||||
|
||||
// Check for Captain
|
||||
if(ACCESS_CAPTAIN in user_id.access)
|
||||
// Allow usage
|
||||
return TRUE
|
||||
|
||||
// Check if access requirements are met
|
||||
if(machine_target.check_access(user_id))
|
||||
// Allow use
|
||||
return TRUE
|
||||
|
||||
// User does not have access
|
||||
// Warn in local chat, then return
|
||||
machine_target.say("Access denied: No valid departmental credentials detected.")
|
||||
return FALSE
|
||||
|
||||
#undef JOB_MINIMAL_ACCESS
|
||||
#undef PROTOLOCK_DURING_LOWPOP
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
#define MAXIMUM_PIXEL_SHIFT 16
|
||||
#define PASSABLE_SHIFT_THRESHOLD 8
|
||||
|
||||
/mob
|
||||
/// If we are in the shifting setting.
|
||||
var/shifting = FALSE
|
||||
|
||||
/// Takes the four cardinal direction defines. Any atoms moving into this atom's tile will be allowed to from the added directions.
|
||||
var/passthroughable = NONE
|
||||
|
||||
/datum/keybinding/mob/pixel_shift
|
||||
hotkey_keys = list("B")
|
||||
name = "pixel_shift"
|
||||
full_name = "Pixel Shift"
|
||||
description = "Shift your characters offset."
|
||||
category = CATEGORY_MOVEMENT
|
||||
keybind_signal = COMSIG_KB_MOB_PIXELSHIFT
|
||||
|
||||
/datum/keybinding/mob/pixel_shift/down(client/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
var/mob/M = user.mob
|
||||
M.shifting = TRUE
|
||||
return TRUE
|
||||
|
||||
/datum/keybinding/mob/pixel_shift/up(client/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
var/mob/M = user.mob
|
||||
M.shifting = FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/proc/unpixel_shift()
|
||||
return
|
||||
|
||||
/mob/living/unpixel_shift()
|
||||
. = ..()
|
||||
passthroughable = NONE
|
||||
if(is_shifted)
|
||||
is_shifted = FALSE
|
||||
pixel_x = get_standard_pixel_x_offset() + base_pixel_x
|
||||
client?.pixel_x = 0
|
||||
pixel_y = get_standard_pixel_y_offset() + base_pixel_y
|
||||
client?.pixel_y = 0
|
||||
|
||||
/mob/proc/pixel_shift(direction)
|
||||
return
|
||||
|
||||
/mob/living/set_pull_offsets(mob/living/pull_target, grab_state)
|
||||
pull_target.unpixel_shift()
|
||||
return ..()
|
||||
|
||||
/mob/living/reset_pull_offsets(mob/living/pull_target, override)
|
||||
pull_target.unpixel_shift()
|
||||
return ..()
|
||||
|
||||
/mob/living/pixel_shift(direction)
|
||||
passthroughable = NONE
|
||||
// switch(direction) // diagonal pixel-shifting, rejoice
|
||||
if(CHECK_BITFIELD(direction, NORTH))
|
||||
if(pixel_y <= MAXIMUM_PIXEL_SHIFT + base_pixel_y)
|
||||
pixel_y++
|
||||
client?.pixel_y++
|
||||
is_shifted = TRUE
|
||||
if(CHECK_BITFIELD(direction, EAST))
|
||||
if(pixel_x <= MAXIMUM_PIXEL_SHIFT + base_pixel_x)
|
||||
pixel_x++
|
||||
client?.pixel_x++
|
||||
is_shifted = TRUE
|
||||
if(CHECK_BITFIELD(direction, SOUTH))
|
||||
if(pixel_y >= -MAXIMUM_PIXEL_SHIFT + base_pixel_y)
|
||||
pixel_y--
|
||||
client?.pixel_y--
|
||||
is_shifted = TRUE
|
||||
if(CHECK_BITFIELD(direction, WEST))
|
||||
if(pixel_x >= -MAXIMUM_PIXEL_SHIFT + base_pixel_x)
|
||||
pixel_x--
|
||||
client?.pixel_x--
|
||||
is_shifted = TRUE
|
||||
|
||||
// Yes, I know this sets it to true for everything if more than one is matched.
|
||||
// Movement doesn't check diagonals, and instead just checks EAST or WEST, depending on where you are for those.
|
||||
if(pixel_y > PASSABLE_SHIFT_THRESHOLD)
|
||||
passthroughable |= EAST | SOUTH | WEST
|
||||
if(pixel_x > PASSABLE_SHIFT_THRESHOLD)
|
||||
passthroughable |= NORTH | SOUTH | WEST
|
||||
if(pixel_y < -PASSABLE_SHIFT_THRESHOLD)
|
||||
passthroughable |= NORTH | EAST | WEST
|
||||
if(pixel_x < -PASSABLE_SHIFT_THRESHOLD)
|
||||
passthroughable |= NORTH | EAST | SOUTH
|
||||
|
||||
/mob/living/CanAllowThrough(atom/movable/mover, turf/target)
|
||||
// Make sure to not allow projectiles of any kind past where they normally wouldn't.
|
||||
if(!istype(mover, /obj/item/projectile) && !mover.throwing && passthroughable & mover.dir)
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
#undef MAXIMUM_PIXEL_SHIFT
|
||||
#undef PASSABLE_SHIFT_THRESHOLD
|
||||
@@ -0,0 +1,29 @@
|
||||
/obj/machinery/rnd/production/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
// Generate access lists
|
||||
gen_access()
|
||||
|
||||
/obj/machinery/rnd/production/ui_interact(mob/user)
|
||||
// Check if access is required
|
||||
if(!req_access)
|
||||
return ..()
|
||||
|
||||
// Check if user can use machine
|
||||
if(!user.can_use_production(src))
|
||||
return
|
||||
|
||||
// Return normally
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/rnd/production/Topic(raw, ls)
|
||||
// Check if access is required
|
||||
if(!req_access)
|
||||
return ..()
|
||||
|
||||
// Check if user can use machine
|
||||
if(!usr.can_use_production(src))
|
||||
return
|
||||
|
||||
// Return normally
|
||||
. = ..()
|
||||
@@ -0,0 +1,2 @@
|
||||
/obj/machinery/rnd/production/circuit_imprinter/department/science
|
||||
req_access = list(ACCESS_RESEARCH)
|
||||
@@ -0,0 +1,17 @@
|
||||
/obj/machinery/rnd/production/protolathe/department/engineering
|
||||
req_access = list(ACCESS_ENGINE)
|
||||
|
||||
/obj/machinery/rnd/production/protolathe/department/service
|
||||
req_one_access = list(ACCESS_BAR, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_JANITOR)
|
||||
|
||||
/obj/machinery/rnd/production/protolathe/department/medical
|
||||
req_access = list(ACCESS_MEDICAL)
|
||||
|
||||
/obj/machinery/rnd/production/protolathe/department/cargo
|
||||
req_access = list(ACCESS_CARGO)
|
||||
|
||||
/obj/machinery/rnd/production/protolathe/department/science
|
||||
req_access = list(ACCESS_RESEARCH)
|
||||
|
||||
/obj/machinery/rnd/production/protolathe/department/security
|
||||
req_access = list(ACCESS_SECURITY)
|
||||
@@ -0,0 +1,17 @@
|
||||
/obj/machinery/rnd/production/techfab/department/engineering
|
||||
req_access = list(ACCESS_ENGINE)
|
||||
|
||||
/obj/machinery/rnd/production/techfab/department/service
|
||||
req_one_access = list(ACCESS_BAR, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_JANITOR)
|
||||
|
||||
/obj/machinery/rnd/production/techfab/department/medical
|
||||
req_access = list(ACCESS_MEDICAL)
|
||||
|
||||
/obj/machinery/rnd/production/techfab/department/cargo
|
||||
req_access = list(ACCESS_CARGO)
|
||||
|
||||
/obj/machinery/rnd/production/techfab/department/science
|
||||
req_access = list(ACCESS_RESEARCH)
|
||||
|
||||
/obj/machinery/rnd/production/techfab/department/security
|
||||
req_access = list(ACCESS_SECURITY)
|
||||
@@ -0,0 +1,2 @@
|
||||
/obj/machinery/computer/rdconsole
|
||||
locked = TRUE
|
||||
@@ -0,0 +1,22 @@
|
||||
/obj/item/organ/Insert(mob/living/carbon/organ_mob, special, drop_if_replaced)
|
||||
. = ..()
|
||||
|
||||
// Check parent return
|
||||
if(!.)
|
||||
return
|
||||
|
||||
// Send signal to mob
|
||||
SEND_SIGNAL(organ_mob, COMSIG_MOB_ORGAN_ADD, src, special, drop_if_replaced)
|
||||
|
||||
/obj/item/organ/Remove(special)
|
||||
. = ..()
|
||||
|
||||
// Define organ mob
|
||||
var/mob/living/carbon/organ_mob = . || null
|
||||
|
||||
// Check if organ mob exists
|
||||
if(!istype(organ_mob))
|
||||
return
|
||||
|
||||
// Send signal to mob
|
||||
SEND_SIGNAL(organ_mob, COMSIG_MOB_ORGAN_REMOVE, src, special)
|
||||
@@ -11,3 +11,7 @@
|
||||
desc = "An additional arm harvested from slaves captured by the Syndicate. Comes with an implanter."
|
||||
item = /obj/item/extra_arm
|
||||
cost = 8
|
||||
|
||||
// Made craftable, and no longer illegal
|
||||
/datum/uplink_item/ammo/revolver
|
||||
illegal_tech = FALSE
|
||||
|
||||
@@ -127,6 +127,7 @@
|
||||
ass = new
|
||||
ass.Insert(partner)
|
||||
ass.climax_modify_size(src, getorganslot(ORGAN_SLOT_PENIS))
|
||||
|
||||
else
|
||||
switch(last_genital.type)
|
||||
if(/obj/item/organ/genital/penis)
|
||||
@@ -193,6 +194,10 @@
|
||||
ass = new
|
||||
ass.Insert(partner)
|
||||
ass.climax_modify_size(src, last_genital)
|
||||
if(iswendigo(partner) && partner.pulling == src)
|
||||
var/mob/living/carbon/wendigo/W = partner
|
||||
W.slaves |= src
|
||||
to_chat(src, "<font color='red'> You are now [W]'s slave! Serve your master properly! </font>")
|
||||
if(!message)
|
||||
return ..()
|
||||
if(gender == MALE)
|
||||
|
||||
@@ -48,6 +48,52 @@
|
||||
quirk_holder.weather_immunities -= "ash"
|
||||
*/
|
||||
|
||||
/datum/quirk/rad_fiend
|
||||
name = "Rad Fiend"
|
||||
desc = "You've been blessed by Cherenkov's warming light, causing you to emit a subtle glow at all times. Only intense radiation is capable of penetrating your protective barrier."
|
||||
value = 2
|
||||
mob_trait = TRAIT_RAD_FIEND
|
||||
gain_text = span_notice("You feel empowered by Cherenkov's glow.")
|
||||
lose_text = span_notice("You realize that rads aren't so rad.")
|
||||
|
||||
// Variable for the radiation immunity check
|
||||
var/can_gain = TRUE
|
||||
|
||||
/datum/quirk/rad_fiend/add()
|
||||
// Define quirk holder mob
|
||||
var/mob/living/carbon/human/quirk_mob = quirk_holder
|
||||
|
||||
// Check for any radiation immunity
|
||||
if(HAS_TRAIT(quirk_mob, TRAIT_RADIMMUNE))
|
||||
// Set gain status
|
||||
can_gain = FALSE
|
||||
|
||||
// Return without doing anything
|
||||
return
|
||||
|
||||
// Add glow control action
|
||||
var/datum/action/rad_fiend/update_glow/quirk_action = new
|
||||
quirk_action.Grant(quirk_mob)
|
||||
|
||||
/datum/quirk/rad_fiend/post_add()
|
||||
// Check if quirk effect was gained
|
||||
if(can_gain)
|
||||
return
|
||||
|
||||
// Alert quirk holder of gain status
|
||||
to_chat(quirk_holder, span_warning("As you are immune to radiation, you were unable to gain Cherenkov's blessing. Please discuss alternatives with a medical professional."))
|
||||
|
||||
/datum/quirk/rad_fiend/remove()
|
||||
// Define quirk holder mob
|
||||
var/mob/living/carbon/human/quirk_mob = quirk_holder
|
||||
|
||||
// Remove glow control action
|
||||
var/datum/action/rad_fiend/update_glow/quirk_action = locate() in quirk_mob.actions
|
||||
quirk_action.Remove(quirk_mob)
|
||||
|
||||
// Remove glow effect
|
||||
quirk_mob.remove_filter("rad_fiend_glow")
|
||||
|
||||
/datum/quirk/dominant_aura
|
||||
name = "Dominant Aura"
|
||||
desc = "Your mere presence is assertive enough to appear as powerful to other people, so much in fact that the weaker kind can't help but throw themselves at your feet at the snap of a finger."
|
||||
|
||||
@@ -152,7 +152,6 @@
|
||||
gain_text = span_notice("You feel like being someone's pet...")
|
||||
lose_text = span_notice("You no longer feel like being a pet...")
|
||||
processing_quirk = TRUE
|
||||
var/mood_category = "dom_trained"
|
||||
var/notice_delay = 0
|
||||
var/mob/living/carbon/human/last_dom
|
||||
|
||||
@@ -202,10 +201,10 @@
|
||||
|
||||
//Handle the mood
|
||||
var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood)
|
||||
if(istype(mood.mood_events[mood_category], /datum/mood_event/dominant/good_boy))
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dominant/good_boy)
|
||||
if(istype(mood.mood_events[QMOOD_WELL_TRAINED], /datum/mood_event/dominant/good_boy))
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_WELL_TRAINED, /datum/mood_event/dominant/good_boy)
|
||||
else
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dominant/need)
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_WELL_TRAINED, /datum/mood_event/dominant/need)
|
||||
|
||||
//Don't do anything if a previous dom was found
|
||||
if(last_dom)
|
||||
@@ -279,7 +278,6 @@
|
||||
// The shame is unbearable
|
||||
mood_quirk = FALSE
|
||||
processing_quirk = FALSE
|
||||
var/mood_category = "backpack_implant_mood"
|
||||
|
||||
/datum/quirk/storage_concealment/on_spawn()
|
||||
. = ..()
|
||||
@@ -295,10 +293,10 @@
|
||||
// Check the quirk holder for the trait
|
||||
if(HAS_TRAIT(quirk_holder, TRAIT_HIDE_BACKPACK))
|
||||
// When found: Mood bonus
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dorsualiphobic_mood_positive)
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_HIDE_BAG, /datum/mood_event/dorsualiphobic_mood_positive)
|
||||
else
|
||||
// When not found: Mood penalty
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dorsualiphobic_mood_negative)
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_HIDE_BAG, /datum/mood_event/dorsualiphobic_mood_negative)
|
||||
|
||||
//succubus and incubus below
|
||||
/datum/quirk/incubus
|
||||
@@ -635,15 +633,14 @@
|
||||
value = 0
|
||||
mood_quirk = TRUE
|
||||
processing_quirk = TRUE
|
||||
var/mood_category = "nudist_mood"
|
||||
|
||||
/datum/quirk/nudist/on_process()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
// Checking torso exposure appears to be a robust method.
|
||||
if( ( H.is_chest_exposed() && H.is_groin_exposed() ) )
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/nudist_positive)
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_NUDIST, /datum/mood_event/nudist_positive)
|
||||
else
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/nudist_negative)
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_NUDIST, /datum/mood_event/nudist_negative)
|
||||
|
||||
/datum/quirk/nudist/on_spawn()
|
||||
. = ..()
|
||||
@@ -662,15 +659,14 @@
|
||||
mood_quirk = TRUE
|
||||
medical_record_text = "Patient feels more secure when wearing a gas mask."
|
||||
processing_quirk = TRUE
|
||||
var/mood_category = "masked_mook"
|
||||
|
||||
/datum/quirk/masked_mook/on_process()
|
||||
var/mob/living/carbon/human/H = quirk_holder
|
||||
var/obj/item/clothing/mask/gas/gasmask = H.get_item_by_slot(ITEM_SLOT_MASK)
|
||||
if(istype(gasmask))
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/masked_mook)
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_MASKED_MOOK, /datum/mood_event/masked_mook)
|
||||
else
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/masked_mook_incomplete)
|
||||
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, QMOOD_MASKED_MOOK, /datum/mood_event/masked_mook_incomplete)
|
||||
|
||||
/datum/quirk/masked_mook/on_spawn()
|
||||
. = ..()
|
||||
|
||||
@@ -957,3 +957,67 @@
|
||||
return
|
||||
else
|
||||
to_chat(H, span_warning("You are already conserving your energy!"))
|
||||
|
||||
//
|
||||
// Quirk: Rad Fiend
|
||||
//
|
||||
|
||||
/datum/action/rad_fiend
|
||||
name = "Broken Rad Action"
|
||||
desc = "Report this to a coder."
|
||||
icon_icon = 'icons/effects/effects.dmi'
|
||||
button_icon_state = "static"
|
||||
|
||||
/datum/action/rad_fiend/update_glow
|
||||
name = "Modify Glow"
|
||||
desc = "Change your radioactive glow color."
|
||||
button_icon_state = "blank"
|
||||
|
||||
// Glow color to use
|
||||
var/glow_color = "#39ff14" // Neon green
|
||||
|
||||
// Thickness of glow outline
|
||||
var/glow_range = 2
|
||||
|
||||
/datum/action/rad_fiend/update_glow/Grant()
|
||||
. = ..()
|
||||
|
||||
// Define user mob
|
||||
var/mob/living/carbon/human/action_mob = owner
|
||||
|
||||
// Add outline effect
|
||||
action_mob.add_filter("rad_fiend_glow", 1, list("type" = "outline", "color" = glow_color+"30", "size" = glow_range))
|
||||
|
||||
/datum/action/rad_fiend/update_glow/Remove()
|
||||
. = ..()
|
||||
|
||||
// Define user mob
|
||||
var/mob/living/carbon/human/action_mob = owner
|
||||
|
||||
// Remove glow
|
||||
action_mob.remove_filter("rad_fiend_glow")
|
||||
|
||||
/datum/action/rad_fiend/update_glow/Trigger()
|
||||
. = ..()
|
||||
|
||||
// Define user mob
|
||||
var/mob/living/carbon/human/action_mob = owner
|
||||
|
||||
// Ask user for color input
|
||||
var/input_color = input(action_mob, "Select a color to use for your glow outline.", "Select Glow Color", glow_color) as color|null
|
||||
|
||||
// Check if color input was given
|
||||
// Reset to stored color when not given input
|
||||
glow_color = (input_color ? input_color : glow_color)
|
||||
|
||||
// Ask user for range input
|
||||
var/input_range = input(action_mob, "How much do you glow? Value may range between 1 to 2.", "Select Glow Range", glow_range) as num|null
|
||||
|
||||
// Check if range input was given
|
||||
// Reset to stored color when not given input
|
||||
// Input is clamped in the 1-2 range
|
||||
glow_range = (input_range ? clamp(input_range, 1, 2) : glow_range)
|
||||
|
||||
// Update outline effect
|
||||
action_mob.remove_filter("rad_fiend_glow")
|
||||
action_mob.add_filter("rad_fiend_glow", 1, list("type" = "outline", "color" = glow_color+"30", "size" = glow_range))
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
var/obj/item/ears_extra = null
|
||||
var/obj/item/wrists = null
|
||||
|
||||
var/list/slaves = list() //people enslaved
|
||||
|
||||
/mob/living/carbon/wendigo/Initialize()
|
||||
. = ..()
|
||||
/* //TODO: Uncomment when objectives + forest get finished
|
||||
@@ -79,6 +81,7 @@
|
||||
|
||||
/mob/living/carbon/wendigo/Destroy()
|
||||
QDEL_NULL(physiology)
|
||||
slaves.Cut()
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/wendigo/update_body_parts()
|
||||
@@ -107,8 +110,10 @@
|
||||
return TRUE
|
||||
/mob/living/carbon/wendigo/IsAdvancedToolUser()
|
||||
return TRUE
|
||||
/* So they can be pulled.
|
||||
/mob/living/carbon/wendigo/can_be_pulled()
|
||||
return FALSE
|
||||
*/
|
||||
/mob/living/carbon/wendigo/is_literate()
|
||||
return TRUE
|
||||
/mob/living/carbon/wendigo/canBeHandcuffed()
|
||||
@@ -122,7 +127,7 @@
|
||||
//ORGANS
|
||||
//
|
||||
/mob/living/carbon/wendigo/create_internal_organs()
|
||||
internal_organs += new /obj/item/organ/eyes/wendigo
|
||||
internal_organs += new /obj/item/organ/eyes/night_vision/wendigo
|
||||
internal_organs += new /obj/item/organ/liver/wendigo
|
||||
|
||||
internal_organs += new /obj/item/organ/tongue
|
||||
@@ -131,3 +136,12 @@
|
||||
internal_organs += new /obj/item/organ/stomach
|
||||
internal_organs += new /obj/item/organ/ears
|
||||
..()
|
||||
|
||||
/mob/living/carbon/wendigo/movement_delay()
|
||||
. = ..()
|
||||
var/adding = 0
|
||||
var/turf/T = get_turf(src)
|
||||
if(T.get_lumcount() < 0.2)
|
||||
adding += 1
|
||||
. += adding
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
var/mob/living/carbon/wendigo/A = C
|
||||
A.metabolize_hunger()
|
||||
|
||||
/obj/item/organ/eyes/wendigo
|
||||
/obj/item/organ/eyes/night_vision/wendigo
|
||||
sight_flags = SEE_MOBS
|
||||
|
||||
/obj/item/bodypart/head/wendigo
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
/mob/living/carbon/wendigo/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
. = ..(user, TRUE)
|
||||
if(.)
|
||||
return
|
||||
adjustBruteLoss(15)
|
||||
var/hitverb = "punched"
|
||||
if(mob_size < MOB_SIZE_LARGE)
|
||||
step_away(src,user,15)
|
||||
sleep(1)
|
||||
step_away(src,user,15)
|
||||
hitverb = "slammed"
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
visible_message("<span class='danger'>[user] has [hitverb] [src]!</span>", \
|
||||
"<span class='userdanger'>[user] has [hitverb] [src]!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/wendigo/on_attack_hand(mob/living/carbon/human/M)
|
||||
. = ..()
|
||||
if(.) //To allow surgery to return properly.
|
||||
return
|
||||
switch(M.a_intent)
|
||||
if (INTENT_HARM)
|
||||
if(M != pulling && !src.slaves.Find(M))
|
||||
var/damage = rand(1, 9)
|
||||
if (prob(90))
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has punched [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has punched [src]!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
|
||||
apply_damage(damage, BRUTE, affecting)
|
||||
log_combat(M, src, "attacked")
|
||||
M.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
|
||||
else
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to punch [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has attempted to punch [src]!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
|
||||
if (INTENT_DISARM)
|
||||
if (!lying && M != pulling && !src.slaves.Find(M))
|
||||
M.do_attack_animation(src, ATTACK_EFFECT_DISARM)
|
||||
if (prob(5))
|
||||
Unconscious(40)
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
log_combat(M, src, "pushed")
|
||||
visible_message("<span class='danger'>[M] has pushed down [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has pushed down [src]!</span>")
|
||||
else
|
||||
if (prob(50))
|
||||
dropItemToGround(get_active_held_item())
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has disarmed [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has disarmed [src]!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
else
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to disarm [src]!</span>",\
|
||||
"<span class='userdanger'>[M] has attempted to disarm [src]!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
|
||||
/mob/living/carbon/wendigo/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
|
||||
if(!no_effect && !visual_effect_icon)
|
||||
visual_effect_icon = ATTACK_EFFECT_CLAW
|
||||
..()
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
/mob/living/carbon/human/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage, mb_time, obj/item/organ/genital/Lgen, forced = FALSE)
|
||||
. = ..()
|
||||
L.receive_climax(src, Lgen, G, spillage, forced = forced)
|
||||
if(iswendigo(L))
|
||||
var/mob/living/carbon/wendigo/W = L
|
||||
if(W.pulling == src)
|
||||
W.slaves |= src
|
||||
to_chat(src, "<font color='red'> You are now [W]'s slave! Serve your master properly! </font>")
|
||||
|
||||
/mob/living/proc/receive_climax(mob/living/partner, obj/item/organ/genital/receiver, obj/item/organ/genital/source, spill, forced)
|
||||
//gregnancy...
|
||||
|
||||
@@ -158,3 +158,15 @@
|
||||
path = /obj/item/clothing/under/performer/polychromic
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_initial_colors = list("#ffffff")
|
||||
|
||||
/datum/gear/uniform/stripper/security
|
||||
name = "Security Stripper Outfit"
|
||||
path = /obj/item/clothing/under/rank/security/stripper
|
||||
subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS
|
||||
restricted_roles = list("Security Officer", "Warden", "Head Of Security")
|
||||
|
||||
/datum/gear/uniform/stripper/explorer
|
||||
name = "Explorer Stripper Outfit"
|
||||
path = /obj/item/clothing/under/rank/cargo/miner/lavaland/stripper
|
||||
subcategory = LOADOUT_SUBCATEGORY_UNIFORM_JOBS
|
||||
restricted_roles = list("Shaft Miner")
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
/datum/preferences/update_preferences(current_version, savefile/S)
|
||||
. = ..()
|
||||
if(current_version < 57.01) //a
|
||||
new_character_creator = TRUE
|
||||
|
||||
/datum/preferences/update_character(current_version, savefile/S)
|
||||
. = ..()
|
||||
if(current_version < 53.01)
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
item_state = "secstripper"
|
||||
can_adjust = FALSE
|
||||
mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi'
|
||||
mutantrace_variation = NONE
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
|
||||
/obj/item/clothing/under/rank/brigdoc
|
||||
name = "brig physician outfit"
|
||||
@@ -333,3 +333,11 @@
|
||||
/obj/item/clothing/under/performer/polychromic/ComponentInitialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/polychromic, list("#ffffff"), 1)
|
||||
|
||||
/obj/item/clothing/under/rank/cargo/miner/lavaland/stripper
|
||||
name = "explorer stripper outfit"
|
||||
desc = "This can't be dress code compliant, can it?"
|
||||
icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi'
|
||||
icon_state = "explorerstripper"
|
||||
mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi'
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
|
||||
|
||||
@@ -21,3 +21,43 @@
|
||||
var/mob/M = user.mob
|
||||
M.tilt_left()
|
||||
return TRUE
|
||||
|
||||
/datum/keybinding/mob/pixel_shift/shift_north
|
||||
hotkey_keys = list("CtrlShiftW", "CtrlShiftNorth")
|
||||
name = "pixel_shift_north"
|
||||
full_name = "Pixel Shift North"
|
||||
|
||||
/datum/keybinding/mob/pixel_shift/shift_north/down(client/user)
|
||||
var/mob/M = user.mob
|
||||
M.pixel_shift(NORTH)
|
||||
return TRUE
|
||||
|
||||
/datum/keybinding/mob/pixel_shift/shift_east
|
||||
hotkey_keys = list("CtrlShiftD", "CtrlShiftEast")
|
||||
name = "pixel_shift_east"
|
||||
full_name = "Pixel Shift East"
|
||||
|
||||
/datum/keybinding/mob/pixel_shift/shift_east/down(client/user)
|
||||
var/mob/M = user.mob
|
||||
M.pixel_shift(EAST)
|
||||
return TRUE
|
||||
|
||||
/datum/keybinding/mob/pixel_shift/shift_south
|
||||
hotkey_keys = list("CtrlShiftS", "CtrlShiftSouth")
|
||||
name = "pixel_shift_south"
|
||||
full_name = "Pixel Shift South"
|
||||
|
||||
/datum/keybinding/mob/pixel_shift/shift_south/down(client/user)
|
||||
var/mob/M = user.mob
|
||||
M.pixel_shift(SOUTH)
|
||||
return TRUE
|
||||
|
||||
/datum/keybinding/mob/pixel_shift/shift_west
|
||||
hotkey_keys = list("CtrlShiftA", "CtrlShiftWest")
|
||||
name = "pixel_shift_west"
|
||||
full_name = "Pixel Shift West"
|
||||
|
||||
/datum/keybinding/mob/pixel_shift/shift_west/down(client/user)
|
||||
var/mob/M = user.mob
|
||||
M.pixel_shift(WEST)
|
||||
return TRUE
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
/obj/machinery/mineral/equipment_vendor/Initialize(mapload)
|
||||
. = ..()
|
||||
prize_list += list(
|
||||
new /datum/data/mining_equipment("Explorer Stripper Outfit", /obj/item/clothing/under/rank/cargo/miner/lavaland/stripper, 50)
|
||||
)
|
||||
@@ -243,3 +243,9 @@
|
||||
name = "Sloog (lips)"
|
||||
icon_state = "slooglips"
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/snouts/mam_snouts/tajaran
|
||||
name = "Tajaran"
|
||||
icon = 'modular_splurt/icons/mob/mam_snouts.dmi'
|
||||
icon_state = "tajaran"
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
@@ -166,3 +166,10 @@
|
||||
icon_state = "angelmoth"
|
||||
icon = 'modular_splurt/icons/mob/wings.dmi'
|
||||
upgrade_to = SPECIES_WINGS_MOTH
|
||||
|
||||
// Dragon wings but using WINGCOLOR instead
|
||||
/datum/sprite_accessory/deco_wings/dragonalt
|
||||
name = "Dragon (Alt)"
|
||||
icon_state = "dragonalt"
|
||||
icon = 'modular_splurt/icons/mob/wings.dmi'
|
||||
upgrade_to = SPECIES_WINGS_DRAGON
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
/mob/living/carbon/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
|
||||
. = ..()
|
||||
if(iswendigo(src) && user == pulling)
|
||||
to_chat(src, "<span class='danger'>I can't hit them, their grip is too strong!</span>")
|
||||
return FALSE
|
||||
if(iswendigo(src))
|
||||
var/mob/living/carbon/wendigo/W = src
|
||||
if(W.slaves.Find(user))
|
||||
to_chat(src, "<span class='danger'>I can't hit them, they're my master!</span>")
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
|
||||
/mob/living/carbon/human/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
|
||||
. = ..()
|
||||
if(.) //To allow surgery to return properly.
|
||||
return
|
||||
if(iswendigo(user))
|
||||
var/mob/living/carbon/wendigo/M = user
|
||||
switch(M.a_intent)
|
||||
if (INTENT_HARM)
|
||||
var/damage = rand(1, 9)
|
||||
var/turf/T = get_turf(user)
|
||||
if(T.get_lumcount() < 0.2)
|
||||
damage += rand(4,10)
|
||||
if (prob(90))
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has punched [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has punched [src]!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
|
||||
apply_damage(damage, BRUTE, affecting)
|
||||
log_combat(M, src, "attacked")
|
||||
M.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
|
||||
else
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to punch [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has attempted to punch [src]!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
if(INTENT_GRAB)
|
||||
grabbedby(M)
|
||||
if(INTENT_HELP)
|
||||
if(M == src && check_self_for_injuries())
|
||||
return
|
||||
help_shake_act(M)
|
||||
if (INTENT_DISARM)
|
||||
if (!lying)
|
||||
M.do_attack_animation(src, ATTACK_EFFECT_DISARM)
|
||||
if (prob(5))
|
||||
Unconscious(40)
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
log_combat(M, src, "pushed")
|
||||
visible_message("<span class='danger'>[M] has pushed down [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has pushed down [src]!</span>")
|
||||
else
|
||||
if (prob(50))
|
||||
dropItemToGround(get_active_held_item())
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has disarmed [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has disarmed [src]!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
else
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to disarm [src]!</span>",\
|
||||
"<span class='userdanger'>[M] has attempted to disarm [src]!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
|
||||
|
||||
@@ -33,3 +33,12 @@
|
||||
*/
|
||||
thirst_rate *= H.physiology.thirst_mod
|
||||
H.adjust_thirst(-thirst_rate)
|
||||
|
||||
/datum/species/handle_mutations_and_radiation(mob/living/carbon/human/H)
|
||||
// Check for rad fiend quirk
|
||||
// Check for radiation resist threshold
|
||||
if(HAS_TRAIT(H, TRAIT_RAD_FIEND) && (H.radiation < RAD_BURN_THRESHOLD))
|
||||
// Return without effects
|
||||
return TRUE
|
||||
|
||||
. = ..()
|
||||
|
||||
@@ -64,3 +64,12 @@
|
||||
AddElement(/datum/element/smalltalk)
|
||||
else
|
||||
RemoveElement(/datum/element/smalltalk)
|
||||
|
||||
/mob/living/do_resist_grab(moving_resist, forced, silent = FALSE)
|
||||
. = ..()
|
||||
if(iswendigo(pulledby)) //Grip is too strong, nonetheless.
|
||||
to_chat(src, "<span class='danger'>The grip is too strong! I need some time...</span>")
|
||||
if(do_after(src, 200, target=pulledby))
|
||||
to_chat(src, "<span class='danger'>I break free off [pulledby]'s grip!</span>")
|
||||
return TRUE
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
@@ -237,6 +237,7 @@
|
||||
#include "code\__HELPERS\sorts\TimSort.dm"
|
||||
#include "code\__SANDCODE\DEFINES\chat.dm"
|
||||
#include "code\__SANDCODE\DEFINES\DNA.dm"
|
||||
#include "code\__SANDCODE\DEFINES\keybindings.dm"
|
||||
#include "code\__SANDCODE\DEFINES\language.dm"
|
||||
#include "code\__SANDCODE\DEFINES\lewd.dm"
|
||||
#include "code\__SANDCODE\DEFINES\loadout.dm"
|
||||
@@ -254,6 +255,7 @@
|
||||
#include "code\__SANDCODE\DEFINES\wires.dm"
|
||||
#include "code\__SANDCODE\DEFINES\dcs\signals\signals_mob_main.dm"
|
||||
#include "code\__SANDCODE\DEFINES\dcs\signals\sizecode.dm"
|
||||
#include "code\__SANDCODE\DEFINES\dcs\signals.dm"
|
||||
#include "code\__SANDCODE\HELPERS\sizecode.dm"
|
||||
#include "code\__SPLURTCODE\DEFINES\access.dm"
|
||||
#include "code\__SPLURTCODE\DEFINES\admin.dm"
|
||||
@@ -266,6 +268,7 @@
|
||||
#include "code\__SPLURTCODE\DEFINES\hud.dm"
|
||||
#include "code\__SPLURTCODE\DEFINES\is_helpers.dm"
|
||||
#include "code\__SPLURTCODE\DEFINES\lewd.dm"
|
||||
#include "code\__SPLURTCODE\DEFINES\loadout.dm"
|
||||
#include "code\__SPLURTCODE\DEFINES\login.dm"
|
||||
#include "code\__SPLURTCODE\DEFINES\mobs.dm"
|
||||
#include "code\__SPLURTCODE\DEFINES\preferences.dm"
|
||||
@@ -281,8 +284,6 @@
|
||||
#include "code\__SPLURTCODE\DEFINES\traits.dm"
|
||||
#include "code\__SPLURTCODE\DEFINES\arousal\genitals.dm"
|
||||
#include "code\__SPLURTCODE\DEFINES\dcs\signals.dm"
|
||||
#include "code\__SPLURTCODE\DEFINES\zeros\species.dm"
|
||||
#include "code\__SPLURTCODE\DEFINES\zeros\traits.dm"
|
||||
#include "code\_globalvars\admin.dm"
|
||||
#include "code\_globalvars\bitfields.dm"
|
||||
#include "code\_globalvars\configuration.dm"
|
||||
@@ -1331,6 +1332,7 @@
|
||||
#include "code\game\objects\items\stacks\medical.dm"
|
||||
#include "code\game\objects\items\stacks\rods.dm"
|
||||
#include "code\game\objects\items\stacks\stack.dm"
|
||||
#include "code\game\objects\items\stacks\stack_recipe.dm"
|
||||
#include "code\game\objects\items\stacks\tape.dm"
|
||||
#include "code\game\objects\items\stacks\telecrystal.dm"
|
||||
#include "code\game\objects\items\stacks\tickets.dm"
|
||||
@@ -4128,6 +4130,7 @@
|
||||
#include "modular_sand\code\modules\clothing\suits\miscellaneous.dm"
|
||||
#include "modular_sand\code\modules\clothing\under\_under.dm"
|
||||
#include "modular_sand\code\modules\clothing\under\costumes.dm"
|
||||
#include "modular_sand\code\modules\clothing\under\miscellaneous.dm"
|
||||
#include "modular_sand\code\modules\clothing\under\uniform.dm"
|
||||
#include "modular_sand\code\modules\clothing\underwear\_underwear.dm"
|
||||
#include "modular_sand\code\modules\clothing\underwear\boxers.dm"
|
||||
@@ -4217,6 +4220,7 @@
|
||||
#include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\legionnaire.dm"
|
||||
#include "modular_sand\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\pandora.dm"
|
||||
#include "modular_sand\code\modules\movespeed\modifiers\components.dm"
|
||||
#include "modular_sand\code\modules\pixel_shift\pixel_shift.dm"
|
||||
#include "modular_sand\code\modules\power\cell.dm"
|
||||
#include "modular_sand\code\modules\power\lightning.dm"
|
||||
#include "modular_sand\code\modules\power\port_gen.dm"
|
||||
@@ -4238,6 +4242,11 @@
|
||||
#include "modular_sand\code\modules\reagents\reagent_containers\pill.dm"
|
||||
#include "modular_sand\code\modules\reagents\reagent_containers\spray.dm"
|
||||
#include "modular_sand\code\modules\research\stock_parts.dm"
|
||||
#include "modular_sand\code\modules\research\rdconsole.dm"
|
||||
#include "modular_sand\code\modules\research\machinery\_production.dm"
|
||||
#include "modular_sand\code\modules\research\machinery\departmental_circuit_imprinter.dm"
|
||||
#include "modular_sand\code\modules\research\machinery\departmental_protolathe.dm"
|
||||
#include "modular_sand\code\modules\research\machinery\departmental_techfab.dm"
|
||||
#include "modular_sand\code\modules\research\designs\autolathe_designs.dm"
|
||||
#include "modular_sand\code\modules\research\designs\biogenerator_designs.dm"
|
||||
#include "modular_sand\code\modules\research\designs\machine_designs.dm"
|
||||
@@ -4269,6 +4278,7 @@
|
||||
#include "modular_sand\code\modules\spells\spell.dm"
|
||||
#include "modular_sand\code\modules\spells\spell_types\shapeshift.dm"
|
||||
#include "modular_sand\code\modules\surgery\organs\augments_arms.dm"
|
||||
#include "modular_sand\code\modules\surgery\organs\organ_internal.dm"
|
||||
#include "modular_sand\code\modules\telescience\telepad.dm"
|
||||
#include "modular_sand\code\modules\telescience\telesci.dm"
|
||||
#include "modular_sand\code\modules\telescience\telesci_computer.dm"
|
||||
@@ -4512,6 +4522,7 @@
|
||||
#include "modular_splurt\code\modules\antagonists\wendigo\mob\mob_equip.dm"
|
||||
#include "modular_splurt\code\modules\antagonists\wendigo\mob\organs_bodyparts.dm"
|
||||
#include "modular_splurt\code\modules\antagonists\wendigo\mob\update_icons.dm"
|
||||
#include "modular_splurt\code\modules\antagonists\wendigo\mob\wendigo_defense.dm"
|
||||
#include "modular_splurt\code\modules\arousal\arousal.dm"
|
||||
#include "modular_splurt\code\modules\arousal\genitals.dm"
|
||||
#include "modular_splurt\code\modules\arousal\genitals_sprite_accessories.dm"
|
||||
@@ -4674,6 +4685,7 @@
|
||||
#include "modular_splurt\code\modules\mentor\mentor_mouse.dm"
|
||||
#include "modular_splurt\code\modules\mentor\mentor_verbs.dm"
|
||||
#include "modular_splurt\code\modules\mining\equipment\kinetic_crusher.dm"
|
||||
#include "modular_splurt\code\modules\mining\equipment\machine_vending.dm"
|
||||
#include "modular_splurt\code\modules\mob\emote.dm"
|
||||
#include "modular_splurt\code\modules\mob\mob.dm"
|
||||
#include "modular_splurt\code\modules\mob\mob_defines.dm"
|
||||
@@ -4708,7 +4720,9 @@
|
||||
#include "modular_splurt\code\modules\mob\living\brain\brain_item.dm"
|
||||
#include "modular_splurt\code\modules\mob\living\carbon\carbon.dm"
|
||||
#include "modular_splurt\code\modules\mob\living\carbon\human\emote.dm"
|
||||
#include "modular_splurt\code\modules\mob\living\carbon\carbon_defense.dm"
|
||||
#include "modular_splurt\code\modules\mob\living\carbon\human\human.dm"
|
||||
#include "modular_splurt\code\modules\mob\living\carbon\human\human_defense.dm"
|
||||
#include "modular_splurt\code\modules\mob\living\carbon\human\human_defines.dm"
|
||||
#include "modular_splurt\code\modules\mob\living\carbon\human\inventory.dm"
|
||||
#include "modular_splurt\code\modules\mob\living\carbon\human\physiology.dm"
|
||||
|
||||
@@ -16,4 +16,4 @@ preferAggregateCacheInfo: true
|
||||
|
||||
preferInteractive: true
|
||||
|
||||
yarnPath: .yarn/releases/yarn-3.2.3.cjs
|
||||
yarnPath: .yarn/releases/yarn-3.4.1.cjs
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
"style-loader": "^3.3.1",
|
||||
"terser-webpack-plugin": "^5.3.1",
|
||||
"typescript": "^4.6.4",
|
||||
"webpack": "^5.72.1",
|
||||
"webpack": "^5.75.0",
|
||||
"webpack-bundle-analyzer": "^4.5.0",
|
||||
"webpack-cli": "^4.9.2"
|
||||
}
|
||||
|
||||
@@ -2074,14 +2074,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/estree@npm:*":
|
||||
version: 0.0.50
|
||||
resolution: "@types/estree@npm:0.0.50"
|
||||
checksum: 9a2b6a4a8c117f34d08fbda5e8f69b1dfb109f7d149b60b00fd7a9fb6ac545c078bc590aa4ec2f0a256d680cf72c88b3b28b60c326ee38a7bc8ee1ee95624922
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/estree@npm:^0.0.51":
|
||||
"@types/estree@npm:*, @types/estree@npm:^0.0.51":
|
||||
version: 0.0.51
|
||||
resolution: "@types/estree@npm:0.0.51"
|
||||
checksum: e56a3bcf759fd9185e992e7fdb3c6a5f81e8ff120e871641607581fb3728d16c811702a7d40fa5f869b7f7b4437ab6a87eb8d98ffafeee51e85bbe955932a189
|
||||
@@ -2581,21 +2574,12 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"acorn@npm:^8.0.4":
|
||||
version: 8.4.1
|
||||
resolution: "acorn@npm:8.4.1"
|
||||
"acorn@npm:^8.0.4, acorn@npm:^8.5.0, acorn@npm:^8.7.1, acorn@npm:^8.8.0":
|
||||
version: 8.8.2
|
||||
resolution: "acorn@npm:8.8.2"
|
||||
bin:
|
||||
acorn: bin/acorn
|
||||
checksum: 0a8fd264349285aa36194b26a5a9d70c3641e78ad459ec44b9a9a5738e0ce6d86ec120ca2c0f04477165cee912fdeb158f62d6582697185c82278bdbf71187f8
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"acorn@npm:^8.5.0, acorn@npm:^8.7.1, acorn@npm:^8.8.0":
|
||||
version: 8.8.1
|
||||
resolution: "acorn@npm:8.8.1"
|
||||
bin:
|
||||
acorn: bin/acorn
|
||||
checksum: 4079b67283b94935157698831967642f24a075c52ce3feaaaafe095776dfbe15d86a1b33b1e53860fc0d062ed6c83f4284a5c87c85b9ad51853a01173da6097f
|
||||
checksum: f790b99a1bf63ef160c967e23c46feea7787e531292bb827126334612c234ed489a0dc2c7ba33156416f0ffa8d25bf2b0fdb7f35c2ba60eb3e960572bece4001
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -3894,12 +3878,12 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"enhanced-resolve@npm:^5.10.0":
|
||||
version: 5.10.0
|
||||
resolution: "enhanced-resolve@npm:5.10.0"
|
||||
version: 5.12.0
|
||||
resolution: "enhanced-resolve@npm:5.12.0"
|
||||
dependencies:
|
||||
graceful-fs: ^4.2.4
|
||||
tapable: ^2.2.0
|
||||
checksum: 0bb9830704db271610f900e8d79d70a740ea16f251263362b0c91af545576d09fe50103496606c1300a05e588372d6f9780a9bc2e30ce8ef9b827ec8f44687ff
|
||||
checksum: bf3f787facaf4ce3439bef59d148646344e372bef5557f0d37ea8aa02c51f50a925cd1f07b8d338f18992c29f544ec235a8c64bcdb56030196c48832a5494174
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -4640,7 +4624,7 @@ __metadata:
|
||||
|
||||
"fsevents@patch:fsevents@^2.3.2#~builtin<compat/fsevents>, fsevents@patch:fsevents@~2.3.2#~builtin<compat/fsevents>":
|
||||
version: 2.3.2
|
||||
resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin<compat/fsevents>::version=2.3.2&hash=18f3a7"
|
||||
resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin<compat/fsevents>::version=2.3.2&hash=df0bf1"
|
||||
dependencies:
|
||||
node-gyp: latest
|
||||
conditions: os=darwin
|
||||
@@ -4786,21 +4770,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6":
|
||||
version: 7.1.7
|
||||
resolution: "glob@npm:7.1.7"
|
||||
dependencies:
|
||||
fs.realpath: ^1.0.0
|
||||
inflight: ^1.0.4
|
||||
inherits: 2
|
||||
minimatch: ^3.0.4
|
||||
once: ^1.3.0
|
||||
path-is-absolute: ^1.0.0
|
||||
checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"glob@npm:^7.1.7, glob@npm:^7.2.0":
|
||||
"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.1.7, glob@npm:^7.2.0":
|
||||
version: 7.2.0
|
||||
resolution: "glob@npm:7.2.0"
|
||||
dependencies:
|
||||
@@ -4844,14 +4814,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.3, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6":
|
||||
version: 4.2.8
|
||||
resolution: "graceful-fs@npm:4.2.8"
|
||||
checksum: 5d224c8969ad0581d551dfabdb06882706b31af2561bd5e2034b4097e67cc27d05232849b8643866585fd0a41c7af152950f8776f4dd5579e9853733f31461c6
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"graceful-fs@npm:^4.2.9":
|
||||
"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.3, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9":
|
||||
version: 4.2.10
|
||||
resolution: "graceful-fs@npm:4.2.10"
|
||||
checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da
|
||||
@@ -7703,7 +7666,7 @@ resolve@^2.0.0-next.3:
|
||||
|
||||
"resolve@patch:resolve@^1.14.2#~builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.9.0#~builtin<compat/resolve>":
|
||||
version: 1.20.0
|
||||
resolution: "resolve@patch:resolve@npm%3A1.20.0#~builtin<compat/resolve>::version=1.20.0&hash=07638b"
|
||||
resolution: "resolve@patch:resolve@npm%3A1.20.0#~builtin<compat/resolve>::version=1.20.0&hash=c3c19d"
|
||||
dependencies:
|
||||
is-core-module: ^2.2.0
|
||||
path-parse: ^1.0.6
|
||||
@@ -7713,7 +7676,7 @@ resolve@^2.0.0-next.3:
|
||||
|
||||
"resolve@patch:resolve@^2.0.0-next.3#~builtin<compat/resolve>":
|
||||
version: 2.0.0-next.3
|
||||
resolution: "resolve@patch:resolve@npm%3A2.0.0-next.3#~builtin<compat/resolve>::version=2.0.0-next.3&hash=07638b"
|
||||
resolution: "resolve@patch:resolve@npm%3A2.0.0-next.3#~builtin<compat/resolve>::version=2.0.0-next.3&hash=c3c19d"
|
||||
dependencies:
|
||||
is-core-module: ^2.2.0
|
||||
path-parse: ^1.0.6
|
||||
@@ -8644,7 +8607,7 @@ resolve@^2.0.0-next.3:
|
||||
style-loader: ^3.3.1
|
||||
terser-webpack-plugin: ^5.3.1
|
||||
typescript: ^4.6.4
|
||||
webpack: ^5.72.1
|
||||
webpack: ^5.75.0
|
||||
webpack-bundle-analyzer: ^4.5.0
|
||||
webpack-cli: ^4.9.2
|
||||
languageName: unknown
|
||||
@@ -8889,11 +8852,11 @@ resolve@^2.0.0-next.3:
|
||||
|
||||
"typescript@patch:typescript@^4.6.4#~builtin<compat/typescript>":
|
||||
version: 4.8.2
|
||||
resolution: "typescript@patch:typescript@npm%3A4.8.2#~builtin<compat/typescript>::version=4.8.2&hash=a1c5e5"
|
||||
resolution: "typescript@patch:typescript@npm%3A4.8.2#~builtin<compat/typescript>::version=4.8.2&hash=3b564f"
|
||||
bin:
|
||||
tsc: bin/tsc
|
||||
tsserver: bin/tsserver
|
||||
checksum: 5cb0f02f414f5405f4b0e7ee1fd7fa9177b6a8783c9017b6cad85f56ce4c4f93e0e6f2ce37e863cb597d44227cd009474c9fbd85bf7a50004e5557426cb58079
|
||||
checksum: 28e130a49d9330b64b8229ad336247bf980e9a705c5850f30a859a68c051e8e68e367b3275f119da4a825dca71ad0fe315964a1315d4a381c0021bca5eeeb62e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -9235,9 +9198,9 @@ resolve@^2.0.0-next.3:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"webpack@npm:^5, webpack@npm:^5.72.1":
|
||||
version: 5.74.0
|
||||
resolution: "webpack@npm:5.74.0"
|
||||
"webpack@npm:^5, webpack@npm:^5.75.0":
|
||||
version: 5.75.0
|
||||
resolution: "webpack@npm:5.75.0"
|
||||
dependencies:
|
||||
"@types/eslint-scope": ^3.7.3
|
||||
"@types/estree": ^0.0.51
|
||||
@@ -9268,7 +9231,7 @@ resolve@^2.0.0-next.3:
|
||||
optional: true
|
||||
bin:
|
||||
webpack: bin/webpack.js
|
||||
checksum: 320c41369a75051b19e18c63f408b3dcc481852e992f83d311771c5ec0f05f2946385e8ebef62030cf3587f0a3d2f12779ffdb191569a966847289ba7313f946
|
||||
checksum: 2bcc5f3c195f375944e8af2f00bf2feea39cb9fda5f763b0d1b00077f1c51783db25c94d3fae96a07dead9fa085e6ae7474417e5ab31719c9776ea5969ceb83a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -9390,22 +9353,7 @@ resolve@^2.0.0-next.3:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ws@npm:^7.3.1":
|
||||
version: 7.5.3
|
||||
resolution: "ws@npm:7.5.3"
|
||||
peerDependencies:
|
||||
bufferutil: ^4.0.1
|
||||
utf-8-validate: ^5.0.2
|
||||
peerDependenciesMeta:
|
||||
bufferutil:
|
||||
optional: true
|
||||
utf-8-validate:
|
||||
optional: true
|
||||
checksum: 423dc0d859fa74020f5555140905b862470a60ea1567bb9ad55a087263d7718b9c94f69678be1cee9868925c570f1e6fc79d09f90c39057bc63fa2edbb2c547b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ws@npm:^7.5.3":
|
||||
"ws@npm:^7.3.1, ws@npm:^7.5.3":
|
||||
version: 7.5.5
|
||||
resolution: "ws@npm:7.5.5"
|
||||
peerDependencies:
|
||||
|
||||