Merge branch 'master' into refactor-internal-fluid-list

This commit is contained in:
Darius
2023-02-23 00:45:03 -05:00
70 changed files with 3124 additions and 239 deletions
+3
View File
@@ -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
+1 -1
View File
@@ -32,4 +32,4 @@
#define SCREENTIP_PREFERENCE_CONTEXT_ONLY "Only with tips"
/// Regardless of intent
#define INTENT_ANY "intent_any"
#define INTENT_ANY "any"
+20 -21
View File
@@ -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
+13
View 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"
+1
View File
@@ -0,0 +1 @@
#define COMSIG_KB_MOB_PIXELSHIFT "keybinding_mob_pixelshift"
+8
View File
@@ -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
+6
View File
@@ -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"
+4 -2
View File
@@ -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"
+28 -24
View File
@@ -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"
+18 -12
View File
@@ -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,)))
-41
View File
@@ -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
+7
View File
@@ -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")
+7 -1
View File
@@ -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))
+2 -2
View File
@@ -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()
+2 -2
View File
@@ -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
+2
View File
@@ -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
+8
View File
@@ -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)
+1 -1
View File
@@ -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)
+8
View File
@@ -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
+45
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 414 B

Binary file not shown.

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
+38 -4
View File
@@ -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].")
+110 -21
View File
@@ -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]."))
+45
View File
@@ -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)
+46
View File
@@ -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."
+9 -13
View File
@@ -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")
File diff suppressed because it is too large Load Diff
@@ -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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

+16 -2
View File
@@ -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"
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -16,4 +16,4 @@ preferAggregateCacheInfo: true
preferInteractive: true
yarnPath: .yarn/releases/yarn-3.2.3.cjs
yarnPath: .yarn/releases/yarn-3.4.1.cjs
+1 -1
View File
@@ -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"
}
+21 -73
View File
@@ -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: