diff --git a/_maps/map_files/RandomZLevels/terrorspiders.dmm b/_maps/map_files/RandomZLevels/terrorspiders.dmm
index b052f57a840..39040cc69ee 100644
--- a/_maps/map_files/RandomZLevels/terrorspiders.dmm
+++ b/_maps/map_files/RandomZLevels/terrorspiders.dmm
@@ -11288,7 +11288,7 @@
/obj/item/paper/terrorspiders3,
/obj/item/pen/edagger,
/obj/item/stack/telecrystal{
- amount = 10
+ amount = 50
},
/obj/item/chameleon,
/obj/item/reagent_containers/glass/bottle/traitor,
diff --git a/_maps/map_files/generic/CentComm.dmm b/_maps/map_files/generic/CentComm.dmm
index ae6ab95ac11..59c79dfe27a 100644
--- a/_maps/map_files/generic/CentComm.dmm
+++ b/_maps/map_files/generic/CentComm.dmm
@@ -2673,11 +2673,11 @@
desc = "Баксоны максона. Возможно кто-то приобретет пропуск.";
name = "100.000 �������� �������"
},
-/obj/item/stack/telecrystal/fifty{
+/obj/item/stack/telecrystal/twohundread_fifty{
amount = 115;
desc = null
},
-/obj/item/stack/telecrystal/fifty{
+/obj/item/stack/telecrystal/twohundread_fifty{
amount = 115;
desc = null
},
@@ -12047,18 +12047,18 @@
/area/centcom/zone1)
"fQg" = (
/obj/structure/table/wood,
-/obj/item/stack/telecrystal/fifty{
+/obj/item/stack/telecrystal/twohundread_fifty{
pixel_x = 3
},
-/obj/item/stack/telecrystal/fifty{
+/obj/item/stack/telecrystal/twohundread_fifty{
pixel_x = -3;
pixel_y = 4
},
-/obj/item/stack/telecrystal/fifty{
+/obj/item/stack/telecrystal/twohundread_fifty{
pixel_x = -4;
pixel_y = -2
},
-/obj/item/stack/telecrystal/fifty{
+/obj/item/stack/telecrystal/twohundread_fifty{
pixel_x = 3;
pixel_y = 9
},
diff --git a/_maps/map_files/generic/syndicatebase.dmm b/_maps/map_files/generic/syndicatebase.dmm
index af7a8ba6778..8fad62fadaf 100644
--- a/_maps/map_files/generic/syndicatebase.dmm
+++ b/_maps/map_files/generic/syndicatebase.dmm
@@ -191,7 +191,7 @@
/obj/item/stack/sheet/mineral/gold{
amount = 50
},
-/obj/item/stack/telecrystal/fifty{
+/obj/item/stack/telecrystal/twohundread_fifty{
amount = 20;
desc = null
},
diff --git a/_maps/map_files/generic/z2_old.dmm b/_maps/map_files/generic/z2_old.dmm
index ce97a2f4467..6b640366a7e 100644
--- a/_maps/map_files/generic/z2_old.dmm
+++ b/_maps/map_files/generic/z2_old.dmm
@@ -10998,19 +10998,19 @@
/obj/item/gun/projectile/shotgun/boltaction,
/obj/item/gun/projectile/shotgun/boltaction,
/obj/item/gun/projectile/shotgun/boltaction,
-/obj/item/ammo_box/speedloader/shotgun/a762,
-/obj/item/ammo_box/speedloader/shotgun/a762,
-/obj/item/ammo_box/speedloader/shotgun/a762,
-/obj/item/ammo_box/speedloader/shotgun/a762,
-/obj/item/ammo_box/speedloader/shotgun/a762,
-/obj/item/ammo_box/speedloader/shotgun/a762,
-/obj/item/ammo_box/speedloader/shotgun/a762,
-/obj/item/ammo_box/speedloader/shotgun/a762,
-/obj/item/ammo_box/speedloader/shotgun/a762,
-/obj/item/ammo_box/speedloader/shotgun/a762,
+/obj/item/ammo_box/speedloader/a762,
+/obj/item/ammo_box/speedloader/a762,
+/obj/item/ammo_box/speedloader/a762,
+/obj/item/ammo_box/speedloader/a762,
+/obj/item/ammo_box/speedloader/a762,
+/obj/item/ammo_box/speedloader/a762,
+/obj/item/ammo_box/speedloader/a762,
+/obj/item/ammo_box/speedloader/a762,
+/obj/item/ammo_box/speedloader/a762,
+/obj/item/ammo_box/speedloader/a762,
/obj/item/gun/projectile/shotgun/boltaction,
-/obj/item/ammo_box/speedloader/shotgun/a762,
-/obj/item/ammo_box/speedloader/shotgun/a762,
+/obj/item/ammo_box/speedloader/a762,
+/obj/item/ammo_box/speedloader/a762,
/obj/machinery/light/small{
brightness_range = 10;
light_range = 10;
@@ -13202,11 +13202,11 @@
desc = "Баксоны максона. Возможно кто-то приобретет пропуск.";
name = "100.000 �������� �������"
},
-/obj/item/stack/telecrystal/fifty{
+/obj/item/stack/telecrystal/twohundread_fifty{
amount = 115;
desc = null
},
-/obj/item/stack/telecrystal/fifty{
+/obj/item/stack/telecrystal/twohundread_fifty{
amount = 115;
desc = null
},
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm
index 9e3f2494cd2..c8d3c4eb7ce 100644
--- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm
+++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm
@@ -58,7 +58,7 @@
if(pipe_air.temperature > heat_limit + 1)
for(var/m in buckled_mobs)
var/mob/living/buckled_mob = m
- buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, "chest")
+ buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, BODY_ZONE_CHEST)
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/New()
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 4ee09ae5809..c3a336e2629 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -96,7 +96,7 @@
#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 8 //Coefficient of multiplication for the damage the item does when removed without a surgery (this*item.w_class)
#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 //A Time in ticks, total removal time = (this*item.w_class)
-// Body Parts
+// Body Part Zones
#define BODY_ZONE_HEAD "head"
#define BODY_ZONE_CHEST "chest"
#define BODY_ZONE_L_ARM "l_arm"
@@ -114,6 +114,7 @@
#define BODY_ZONE_PRECISE_L_FOOT "l_foot"
#define BODY_ZONE_PRECISE_R_FOOT "r_foot"
+
//We will round to this value in damage calculations.
#define DAMAGE_PRECISION 0.1
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 07a68148a17..a2d36f7b128 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -301,6 +301,7 @@
///from base of mob/key_down(): (_key, client/user)
#define COMSIG_MOB_KEY_DROP_ITEM_DOWN "mob_key_drop_item_down"
+ #define COMPONENT_CANCEL_DROP (1<<0)
///from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj
#define COMSIG_MOB_ALLOWED "mob_allowed"
@@ -655,9 +656,10 @@
#define COMSIG_HUMAN_CHANGE_HEAD_ACCESSORY "human_change_head_accessory"
//from /mob/living/carbon/human/proc/apply_overlay
#define COMSIG_HUMAN_APPLY_OVERLAY "living_apply_overlay"
+///From mob/living/carbon/human/do_suicide()
+#define COMSIG_HUMAN_SUICIDE_ACT "human_suicide_act"
// /datum/species signals
-
///from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species)
#define COMSIG_SPECIES_GAIN "species_gain"
///from datum/species/on_species_loss(): (datum/species/lost_species)
diff --git a/code/__DEFINES/implants_defines.dm b/code/__DEFINES/implants_defines.dm
new file mode 100644
index 00000000000..c01d2db4718
--- /dev/null
+++ b/code/__DEFINES/implants_defines.dm
@@ -0,0 +1,35 @@
+/// If used, an implant will trigger when an emote is intentionally used.
+#define BIOCHIP_EMOTE_TRIGGER_INTENTIONAL (1<<0)
+/// If used, an implant will trigger when an emote is forced/unintentionally used.
+#define BIOCHIP_EMOTE_TRIGGER_UNINTENTIONAL (1<<1)
+/// If used, an implant will always trigger when the user makes an emote.
+#define BIOCHIP_EMOTE_TRIGGER_ALWAYS (BIOCHIP_EMOTE_TRIGGER_UNINTENTIONAL|BIOCHIP_EMOTE_TRIGGER_INTENTIONAL)
+/// If used, an implant will trigger on the user's first death.
+#define BIOCHIP_TRIGGER_DEATH_ONCE (1<<2)
+/// If used, an implant will trigger any time a user dies.
+#define BIOCHIP_TRIGGER_DEATH_ANY (1<<3)
+/// If used, an implant will NOT trigger on death when a user is gibbed.
+#define BIOCHIP_TRIGGER_NOT_WHEN_GIBBED (1<<4)
+
+// Defines related to the way that the implant is activated. This is the value for implant.activated
+/// The implant is passively active (like a mindshield)
+#define BIOCHIP_ACTIVATED_PASSIVE 0
+/// The implant is activated manually by a trigger
+#define BIOCHIP_ACTIVATED_ACTIVE 1
+
+// Defines related to biochip current status
+/// The implant is currently inside the body
+#define BIOCHIP_IMPLANTED 1
+/// The implant was once implanted into someone
+#define BIOCHIP_USED 0
+/// The implant is new and intact
+#define BIOCHIP_NEW null
+
+// Defines implanting results of proc [/obj/item/implant/proc/implant()]
+/// Implant is successfully installed
+#define BIOCHIP_IMPLANT_SUCCESS 1
+/// Implant fails to inject
+#define BIOCHIP_IMPLANT_FAIL -1
+/// Return this if there's no room for the implant
+#define BIOCHIP_IMPLANT_NOROOM 0
+
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index ffc637b21bc..8fb5232099e 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -36,8 +36,6 @@
#define isprojectile(A) (istype(A, /obj/item/projectile))
-#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable
-
#define is_pen(W) (istype(W, /obj/item/pen))
#define is_pda(W) (istype(W, /obj/item/pda))
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
index 067da4146ec..286f1d04aad 100644
--- a/code/__DEFINES/layers.dm
+++ b/code/__DEFINES/layers.dm
@@ -89,6 +89,8 @@
#define HIGH_LANDMARK_LAYER 9.2
#define AREA_LAYER 10
#define MASSIVE_OBJ_LAYER 11
+
+#define POINT_PLANE 14
#define POINT_LAYER 12
#define CHAT_LAYER 12.0001 // Do not insert layers between these two values
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index bdd5c8c71ba..20827522339 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -1,11 +1,12 @@
///////////////////ORGAN DEFINES///////////////////
// Organ defines.
-#define ORGAN_BROKEN 1
-#define ORGAN_ROBOT 2
-#define ORGAN_SPLINTED 4
-#define ORGAN_DEAD 8
-#define ORGAN_MUTATED 16
+#define ORGAN_BROKEN 1
+#define ORGAN_ROBOT 2
+#define ORGAN_SPLINTED 4
+#define ORGAN_DEAD 8
+#define ORGAN_MUTATED 16
+#define ORGAN_INT_BLEED 32
#define PROCESS_ACCURACY 10
@@ -271,7 +272,8 @@
#define isnewplayer(A) (istype((A), /mob/new_player))
-#define isorgan(A) (istype((A), /obj/item/organ/external))
+#define isexternalorgan(A) (istype((A), /obj/item/organ/external))
+
#define hasorgans(A) (ishuman(A))
#define is_admin(user) (check_rights(R_ADMIN, 0, (user)) != 0)
diff --git a/code/__DEFINES/organ_defines.dm b/code/__DEFINES/organ_defines.dm
new file mode 100644
index 00000000000..06300d2d299
--- /dev/null
+++ b/code/__DEFINES/organ_defines.dm
@@ -0,0 +1,56 @@
+// Internal organs
+
+#define INTERNAL_ORGAN_HEART "heart"
+#define INTERNAL_ORGAN_LUNGS "lungs"
+#define INTERNAL_ORGAN_LIVER "liver"
+#define INTERNAL_ORGAN_KIDNEYS "kidneys"
+#define INTERNAL_ORGAN_APPENDIX "appendix"
+#define INTERNAL_ORGAN_EYES "eyes"
+#define INTERNAL_ORGAN_EARS "ears"
+#define INTERNAL_ORGAN_BRAIN "brain"
+
+#define INTERNAL_ORGAN_RESONANT_CRYSTAL "resonant_crystal"
+#define INTERNAL_ORGAN_STRANGE_CRYSTAL "strange_crystal"
+#define INTERNAL_ORGAN_WAX_GLANDS "wax_glands"
+#define INTERNAL_ORGAN_HEADPOCKET "headpocket"
+#define INTERNAL_ORGAN_LANTERN "lantern"
+#define INTERNAL_ORGAN_RESONATOR "adamantine_resonator"
+
+#define INTERNAL_ORGAN_PLASMAVESSEL "plasmavessel"
+#define INTERNAL_ORGAN_ACIDGLAND "acidgland"
+#define INTERNAL_ORGAN_HIVENODE "hivenode"
+#define INTERNAL_ORGAN_NEUROTOXIN_GLAND "neurotoxin_gland"
+#define INTERNAL_ORGAN_RESIN_SPINNER "resin_spinner"
+#define INTERNAL_ORGAN_EGGSAC "eggsac"
+
+#define INTERNAL_ORGAN_L_ARM_DEVICE "l_arm_device"
+#define INTERNAL_ORGAN_R_ARM_DEVICE "r_arm_device"
+#define INTERNAL_ORGAN_L_LEG_DEVICE "l_leg_device"
+#define INTERNAL_ORGAN_R_LEG_DEVICE "r_leg_device"
+#define INTERNAL_ORGAN_EYE_SIGHT_DEVICE "eye_sight"
+#define INTERNAL_ORGAN_EYE_HUD_DEVICE "eye_hud"
+#define INTERNAL_ORGAN_EYE_SHIELD_DEVICE "eye_shield"
+#define INTERNAL_ORGAN_EYE_LING "eye_ling"
+#define INTERNAL_ORGAN_BREATHING_TUBE "breathing_tube"
+#define INTERNAL_ORGAN_STOMACH "stomach"
+#define INTERNAL_ORGAN_HEART_DRIVE "heartdrive"
+#define INTERNAL_ORGAN_BRAIN_ANTIDROP "brain_antidrop"
+#define INTERNAL_ORGAN_BRAIN_ANTISTUN "brain_antistun"
+#define INTERNAL_ORGAN_BRAIN_ANTISLEEP "brain_antisleep"
+#define INTERNAL_ORGAN_BRAIN_CLOWNVOICE "brain_clownvoice"
+#define INTERNAL_ORGAN_BRAIN_SPEECHTRANSLATOR "brain_speechtranslator"
+
+#define INTERNAL_ORGAN_VOCALCORDS "vocal_cords"
+#define INTERNAL_ORGAN_HIVECORE "hivecore"
+#define INTERNAL_ORGAN_PARASITE_EGG "parasite_egg"
+
+#define INTERNAL_ORGAN_HAIR "hair_organ" // yeah thats a thing
+#define INTERNAL_ORGAN_HONK_BLADDER "honk_bladder"
+#define INTERNAL_ORGAN_BRAIN_TUMOR "brain_tumor"
+
+
+// insert/remove organ special defines
+#define ORGAN_MANIPULATION_DEFAULT 0
+#define ORGAN_MANIPULATION_NOEFFECT 1
+#define ORGAN_MANIPULATION_ABDUCTOR 2
+
diff --git a/code/__DEFINES/uplink_types.dm b/code/__DEFINES/uplink_types.dm
index 6d5ca1c6557..25f5c8925bc 100644
--- a/code/__DEFINES/uplink_types.dm
+++ b/code/__DEFINES/uplink_types.dm
@@ -2,3 +2,5 @@
#define UPLINK_TYPE_NUCLEAR 1
#define UPLINK_TYPE_SST 2
#define UPLINK_TYPE_ADMIN 3
+#define UPLINK_TYPE_SIT 4
+
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 214a9ec5294..53e8d69dd86 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -118,7 +118,7 @@
var/datum/robolimb/R = new limb_type()
GLOB.all_robolimbs[R.company] = R
if(!R.unavailable_at_chargen)
- if(R != "head" && R != "chest" && R != "groin" ) //Part of the method that ensures only IPCs can access head, chest and groin prosthetics.
+ if(R != BODY_ZONE_HEAD && R != BODY_ZONE_CHEST && R != BODY_ZONE_PRECISE_GROIN ) //Part of the method that ensures only IPCs can access head, chest and groin prosthetics.
if(R.has_subtypes) //Ensures solos get added to the list as well be incorporating has_subtypes == 1 and has_subtypes == 2.
GLOB.chargen_robolimbs[R.company] = R //List only main brands and solo parts.
if(R.selectable)
diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm
index 0520ab6b077..414a16636ec 100644
--- a/code/__HELPERS/matrices.dm
+++ b/code/__HELPERS/matrices.dm
@@ -3,7 +3,7 @@
Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT
-/atom/proc/SpinAnimation(speed = 10, loops = -1, clockwise = 1, segments = 3)
+/atom/proc/SpinAnimation(speed = 10, loops = -1, clockwise = 1, segments = 3, parallel = TRUE)
if(!segments)
return
var/segment = 360/segments
@@ -19,7 +19,10 @@
speed /= segments
- animate(src, transform = matrices[1], time = speed, loops)
+ if(parallel)
+ animate(src, transform = matrices[1], time = speed, loops , flags = ANIMATION_PARALLEL)
+ else
+ animate(src, transform = matrices[1], time = speed, loops)
for(var/i in 2 to segments) //2 because 1 is covered above
animate(transform = matrices[i], time = speed)
//doesn't have an object argument because this is "Stacking" with the animate call above
diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm
index 921156fad75..733413961b7 100644
--- a/code/__HELPERS/pronouns.dm
+++ b/code/__HELPERS/pronouns.dm
@@ -19,7 +19,7 @@
/**
* Replaces the `%(SINGLE,PLURAL)%` or `%(MALE,FEMALE,NEUTER,PLURAL)%` message piece accordingly to user gender.
- * Use `*` to deliberatly skip one genderize word.
+ * Use `*` to deliberatly skip one genderize word: `%(*,FEMALE,*,PLURAL)%`.
*
* Arguments:
* * user - Person which pronouns will be used.
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 652f586b3a0..0da8dbf45b3 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -536,6 +536,7 @@
text = replacetext(text, "\[logo\]", "​")
text = replacetext(text, "\[slogo\]", "​")
text = replacetext(text, "\[ussplogo\]", "​")
+ text = replacetext(text, "\[solgov\]", "​")
text = replacetext(text, "\[time\]", "[station_time_timestamp()]") // TO DO
text = replacetext(text, "\[date\]", "[GLOB.current_date_string]")
text = replacetext(text, "\[station\]", "[station_name()]")
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 5eb1cd82231..0f65c67141a 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -640,7 +640,7 @@ Returns 1 if the chain up to the area contains the given typepath
var/list/turfs = new/list()
for(var/area/N in world)
- if(istype(N, areatype))
+ if(N.type == areatype)
for(var/turf/T in N) turfs += T
return turfs
@@ -959,19 +959,40 @@ Returns 1 if the chain up to the area contains the given typepath
/proc/parse_zone(zone)
- if(zone == "r_hand") return "right hand"
- else if(zone == "l_hand") return "left hand"
- else if(zone == "l_arm") return "left arm"
- else if(zone == "r_arm") return "right arm"
- else if(zone == "l_leg") return "left leg"
- else if(zone == "r_leg") return "right leg"
- else if(zone == "l_foot") return "left foot"
- else if(zone == "r_foot") return "right foot"
- else if(zone == "l_hand") return "left hand"
- else if(zone == "r_hand") return "right hand"
- else if(zone == "l_foot") return "left foot"
- else if(zone == "r_foot") return "right foot"
- else return zone
+ switch(zone)
+ if(BODY_ZONE_HEAD)
+ return "head"
+ if(BODY_ZONE_CHEST)
+ return "chest"
+ if(BODY_ZONE_L_ARM)
+ return "left arm"
+ if(BODY_ZONE_R_ARM)
+ return "right arm"
+ if(BODY_ZONE_L_LEG)
+ return "left leg"
+ if(BODY_ZONE_R_LEG)
+ return "right leg"
+ if(BODY_ZONE_TAIL)
+ return "tail"
+ if(BODY_ZONE_WING)
+ return "wings"
+ if(BODY_ZONE_PRECISE_EYES)
+ return "eyes"
+ if(BODY_ZONE_PRECISE_MOUTH)
+ return "mouth"
+ if(BODY_ZONE_PRECISE_GROIN)
+ return "groin"
+ if(BODY_ZONE_PRECISE_L_HAND)
+ return "left hand"
+ if(BODY_ZONE_PRECISE_R_HAND)
+ return "right hand"
+ if(BODY_ZONE_PRECISE_L_FOOT)
+ return "left foot"
+ if(BODY_ZONE_PRECISE_R_FOOT)
+ return "right foot"
+ else
+ stack_trace("Wrong zone input.")
+
/*
@@ -1216,47 +1237,47 @@ Standard way to write links -Sayu
// HIDEGLASSES(formerly known as HIDEEYES) flag was made, ironically, to check if it hides our GLASSES
// not to check if it makes using the fucking mouth/eyes impossible!!!
switch(location)
- if("head")
+ if(BODY_ZONE_HEAD)
if(covered_locations & HEAD)
- return 0
- if("eyes")
+ return FALSE
+ if(BODY_ZONE_PRECISE_EYES)
if(eyesmouth_covered & MASKCOVERSEYES || eyesmouth_covered & GLASSESCOVERSEYES || eyesmouth_covered & HEADCOVERSEYES)
- return 0
- if("mouth")
+ return FALSE
+ if(BODY_ZONE_PRECISE_MOUTH)
if(eyesmouth_covered & HEADCOVERSMOUTH || eyesmouth_covered & MASKCOVERSMOUTH)
- return 0
- if("chest")
+ return FALSE
+ if(BODY_ZONE_CHEST)
if(covered_locations & UPPER_TORSO)
- return 0
- if("groin")
+ return FALSE
+ if(BODY_ZONE_PRECISE_GROIN)
if(covered_locations & LOWER_TORSO)
- return 0
- if("l_arm")
+ return FALSE
+ if(BODY_ZONE_L_ARM)
if(covered_locations & ARM_LEFT)
- return 0
- if("r_arm")
+ return FALSE
+ if(BODY_ZONE_R_ARM)
if(covered_locations & ARM_RIGHT)
- return 0
- if("l_leg")
+ return FALSE
+ if(BODY_ZONE_L_LEG)
if(covered_locations & LEG_LEFT)
- return 0
- if("r_leg")
+ return FALSE
+ if(BODY_ZONE_R_LEG)
if(covered_locations & LEG_RIGHT)
- return 0
- if("l_hand")
+ return FALSE
+ if(BODY_ZONE_PRECISE_L_HAND)
if(covered_locations & HAND_LEFT)
- return 0
- if("r_hand")
+ return FALSE
+ if(BODY_ZONE_PRECISE_R_HAND)
if(covered_locations & HAND_RIGHT)
- return 0
- if("l_foot")
+ return FALSE
+ if(BODY_ZONE_PRECISE_L_FOOT)
if(covered_locations & FOOT_LEFT)
- return 0
- if("r_foot")
+ return FALSE
+ if(BODY_ZONE_PRECISE_R_FOOT)
if(covered_locations & FOOT_RIGHT)
- return 0
+ return FALSE
- return 1
+ return TRUE
/proc/check_target_facings(mob/living/initator, mob/living/target)
/*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head.
@@ -1473,7 +1494,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
shift.Translate(0,radius)
transform = shift
- SpinAnimation(rotation_speed, -1, clockwise, rotation_segments)
+ SpinAnimation(rotation_speed, -1, clockwise, rotation_segments, parallel = FALSE)
while(orbiting && orbiting == A && A.loc)
var/targetloc = get_turf(A)
@@ -1491,14 +1512,15 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
if(orbiting == A) //make sure we haven't started orbiting something else.
orbiting = null
- SpinAnimation(0, 0)
transform = cached_transform
-
+ SpinAnimation(0, 0, parallel = FALSE)
/atom/movable/proc/stop_orbit()
orbiting = null
transform = cached_transform
+ SpinAnimation(0, 0, parallel = FALSE)
+
//Centers an image.
//Requires:
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index 8cc5256ed9e..ee90616c29f 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -62,3 +62,4 @@ GLOBAL_VAR(genname) //Nanotrasen officer name for fax send via fax panel, random
GLOBAL_VAR_INIT(pacifism_after_gt, FALSE)
GLOBAL_VAR_INIT(communications_blackout, FALSE)
+
diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm
index 90ebdfabc94..f550e35f6dc 100644
--- a/code/_onclick/hud/action_button.dm
+++ b/code/_onclick/hud/action_button.dm
@@ -44,8 +44,13 @@
if(modifiers["alt"])
AltClick(usr)
return TRUE
- linked_action.Trigger()
- linked_action.UpdateButtonIcon() //redraw button
+ if(modifiers["middle"])
+ linked_action.Trigger(left_click = FALSE)
+ return TRUE
+ linked_action.Trigger(left_click = TRUE)
+ transform = transform.Scale(0.8, 0.8)
+ alpha = 200
+ animate(src, transform = matrix(), time = 0.3 SECONDS, alpha = 255)
return TRUE
/obj/screen/movable/action_button/AltClick(mob/user)
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index d4521b6cc03..ed6868f5949 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -242,7 +242,7 @@
name = "damage zone"
icon_state = "zone_sel"
screen_loc = ui_zonesel
- var/selecting = "chest"
+ var/selecting = BODY_ZONE_CHEST
var/static/list/hover_overlays_cache = list()
var/hovering
@@ -302,54 +302,54 @@
if(1 to 3) //Feet
switch(icon_x)
if(10 to 15)
- return "r_foot"
+ return BODY_ZONE_PRECISE_R_FOOT
if(17 to 22)
- return "l_foot"
+ return BODY_ZONE_PRECISE_L_FOOT
if(4 to 9) //Legs
switch(icon_x)
if(10 to 15)
- return "r_leg"
+ return BODY_ZONE_R_LEG
if(17 to 22)
- return "l_leg"
+ return BODY_ZONE_L_LEG
if(24 to 29)
- return "tail"
+ return BODY_ZONE_TAIL
if(10 to 13) //Hands,groin and wings
switch(icon_x)
if(8 to 11)
- return "r_hand"
+ return BODY_ZONE_PRECISE_R_HAND
if(12 to 20)
- return "groin"
+ return BODY_ZONE_PRECISE_GROIN
if(21 to 24)
- return "l_hand"
+ return BODY_ZONE_PRECISE_L_HAND
if(3 to 7)
- return "wing"
+ return BODY_ZONE_WING
if(25 to 28)
- return "wing"
+ return BODY_ZONE_WING
if(14 to 22) //Chest and arms to shoulders and wings
switch(icon_x)
if (3 to 7)
- return "wing"
+ return BODY_ZONE_WING
if(8 to 11)
- return "r_arm"
+ return BODY_ZONE_R_ARM
if(12 to 20)
- return "chest"
+ return BODY_ZONE_CHEST
if(21 to 24)
- return "l_arm"
+ return BODY_ZONE_L_ARM
if(24 to 28)
- return "wing"
+ return BODY_ZONE_WING
if(23 to 30) //Head, but we need to check for eye or mouth
if(icon_x in 12 to 20)
switch(icon_y)
if(23 to 24)
if(icon_x in 15 to 17)
- return "mouth"
+ return BODY_ZONE_PRECISE_MOUTH
if(26) //Eyeline, eyes are on 15 and 17
if(icon_x in 14 to 18)
- return "eyes"
+ return BODY_ZONE_PRECISE_EYES
if(25 to 27)
if(icon_x in 15 to 17)
- return "eyes"
- return "head"
+ return BODY_ZONE_PRECISE_EYES
+ return BODY_ZONE_HEAD
/obj/screen/zone_sel/proc/set_selected_zone(choice, mob/user)
if(isobserver(user))
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index f167dbf0d89..9079fb77430 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -20,16 +20,16 @@
A.attack_hand(src)
+
/mob/living/carbon/human/beforeAdjacentClick(atom/A, params)
if(prob(dna.species.fragile_bones_chance * 3))
var/zone = "[hand ? "l" : "r"]_[pick("hand", "arm")]"
var/obj/item/organ/external/active_hand = get_organ(zone)
- if(!(active_hand.status & ORGAN_BROKEN))
+ if(!active_hand.has_fracture())
var/used_item_name = get_active_hand()
- var/message = "[used_item_name? "You try to use [used_item_name], but y": "Y"]our [active_hand] don't withstand the load!"
- to_chat(src, "[message]")
+ to_chat(src, span_danger("[used_item_name? "You try to use [used_item_name], but y": "Y"]our [active_hand] don't withstand the load!"))
active_hand.fracture()
- return
+
/atom/proc/attack_hand(mob/user)
SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user)
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index c09b26c808c..8acfbb73427 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -52,7 +52,7 @@ GLOBAL_LIST_EMPTY(overflow_whitelist)
InitEntries()
//Note: `$include`s are supported. Feel free to use them.
- var/list/configs = list("game_options.txt", "dbconfig.txt", "config.txt")
+ var/list/configs = list("game_options.txt", "dbconfig.txt", "config.txt", "emojis.txt")
for(var/I in configs)
if(fexists("[directory]/[I]"))
for(var/J in configs)
diff --git a/code/controllers/configuration/entries/config.dm b/code/controllers/configuration/entries/config.dm
index fdb59a2fcba..1d3c82073df 100644
--- a/code/controllers/configuration/entries/config.dm
+++ b/code/controllers/configuration/entries/config.dm
@@ -659,6 +659,11 @@
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_NUM
+//Needs proper testing
+/datum/config_entry/keyed_list/emoji
+ key_mode = KEY_MODE_TEXT
+ value_mode = VALUE_MODE_TEXT
+
/datum/config_entry/number/shadowling_max_age
/datum/config_entry/flag/guest_ban
diff --git a/code/controllers/subsystem/acid.dm b/code/controllers/subsystem/acid.dm
index 667610e8bec..7ff7b726fe3 100644
--- a/code/controllers/subsystem/acid.dm
+++ b/code/controllers/subsystem/acid.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(acid)
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
cpu_display = SS_CPUDISPLAY_LOW
offline_implications = "Objects will no longer react to acid. No immediate action is needed."
+ ss_id = "acid"
var/list/currentrun = list()
var/list/processing = list()
diff --git a/code/controllers/subsystem/afk.dm b/code/controllers/subsystem/afk.dm
index 6967565d36e..9e1c8273117 100644
--- a/code/controllers/subsystem/afk.dm
+++ b/code/controllers/subsystem/afk.dm
@@ -8,6 +8,7 @@ SUBSYSTEM_DEF(afk)
flags = SS_BACKGROUND
cpu_display = SS_CPUDISPLAY_LOW
offline_implications = "Players will no longer be marked as AFK. No immediate action is needed."
+ ss_id = "afk_watcher"
var/list/afk_players = list() // Associative list. ckey as key and AFK state as value
var/list/non_cryo_antags
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 96773c81145..cff12b94d90 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -16,6 +16,7 @@ SUBSYSTEM_DEF(air)
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
offline_implications = "Turfs will no longer process atmos, and all atmospheric machines (including cryotubes) will no longer function. Shuttle call recommended."
cpu_display = SS_CPUDISPLAY_HIGH
+ ss_id = "atmospherics"
var/cost_turfs = 0
var/cost_groups = 0
var/cost_highpressure = 0
diff --git a/code/controllers/subsystem/ambience.dm b/code/controllers/subsystem/ambience.dm
index dd8b896aa8d..4c56720b557 100644
--- a/code/controllers/subsystem/ambience.dm
+++ b/code/controllers/subsystem/ambience.dm
@@ -6,6 +6,7 @@ SUBSYSTEM_DEF(ambience)
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
wait = 1 SECONDS
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "ambience"
///Assoc list of listening client - next ambience time
var/list/ambience_listening_clients = list()
diff --git a/code/controllers/subsystem/cleanup.dm b/code/controllers/subsystem/cleanup.dm
index 0ef83af8dfc..839d788d143 100644
--- a/code/controllers/subsystem/cleanup.dm
+++ b/code/controllers/subsystem/cleanup.dm
@@ -19,6 +19,7 @@ SUBSYSTEM_DEF(cleanup)
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
offline_implications = "Certain global lists will no longer be cleared of nulls, which may result in runtimes. No immediate action is needed."
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "null_cleanup"
/// A list of global lists we want the subsystem to clean.
var/list/lists_to_clean
diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm
index e71c8730e2a..3065cce915a 100644
--- a/code/controllers/subsystem/dbcore.dm
+++ b/code/controllers/subsystem/dbcore.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(dbcore)
wait = 1 MINUTES
init_order = INIT_ORDER_DBCORE
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "database_core"
/// Is the DB schema valid
var/schema_valid = TRUE
diff --git a/code/controllers/subsystem/debugview.dm b/code/controllers/subsystem/debugview.dm
index 5d2a5506472..5d31b69c897 100644
--- a/code/controllers/subsystem/debugview.dm
+++ b/code/controllers/subsystem/debugview.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(debugview)
flags = SS_TICKER|SS_NO_INIT
offline_implications = "Shift+F3 will no longer show a debug view. No immediate action is needed."
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "debug_view"
/// List of clients currently processing
var/list/client/processing = list()
diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm
index d5a43c80d95..3546785a2cf 100644
--- a/code/controllers/subsystem/events.dm
+++ b/code/controllers/subsystem/events.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(events)
flags = SS_KEEP_TIMING
offline_implications = "Random events will no longer happen. No immediate action is needed."
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "events"
// Report events at the end of the rouund
var/report_at_round_end = 0
diff --git a/code/controllers/subsystem/fires.dm b/code/controllers/subsystem/fires.dm
index 3f20b68aafc..52850f84688 100644
--- a/code/controllers/subsystem/fires.dm
+++ b/code/controllers/subsystem/fires.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(fires)
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
cpu_display = SS_CPUDISPLAY_LOW // Trust me, this isnt atmos fires, this is paper and stuff being lit with lighters and stuff
offline_implications = "Objects will no longer react to fires. No immediate action is needed."
+ ss_id = "fire_processing"
var/list/currentrun = list()
var/list/processing = list()
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 38a2f75e835..c98cce36058 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -9,6 +9,7 @@ SUBSYSTEM_DEF(garbage)
init_order = INIT_ORDER_GARBAGE // Why does this have an init order if it has SS_NO_INIT?
offline_implications = "Garbage statistics collection is no longer functional, not a big deal actually. No futher actions required."
cpu_display = SS_CPUDISPLAY_HIGH
+ ss_id = "garbage_collector"
//Stat tracking
var/delslasttick = 0 // number of del()'s we've done this tick
diff --git a/code/controllers/subsystem/ghost_spawns.dm b/code/controllers/subsystem/ghost_spawns.dm
index f6b0a83bc9e..34a511d849d 100644
--- a/code/controllers/subsystem/ghost_spawns.dm
+++ b/code/controllers/subsystem/ghost_spawns.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(ghost_spawns)
runlevels = RUNLEVEL_GAME
offline_implications = "Ghosts will no longer be able to respawn as event mobs (Blob, etc..). Shuttle call recommended."
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "ghost_spawns"
/// List of polls currently ongoing, to be checked on next fire()
var/list/datum/candidate_poll/currently_polling
diff --git a/code/controllers/subsystem/http.dm b/code/controllers/subsystem/http.dm
index 83245a64a43..8fd890423e3 100644
--- a/code/controllers/subsystem/http.dm
+++ b/code/controllers/subsystem/http.dm
@@ -6,6 +6,7 @@ SUBSYSTEM_DEF(http)
// Assuming for the worst, since only discord is hooked into this for now, but that may change
offline_implications = "The server is no longer capable of making async HTTP requests. Shuttle call recommended."
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "http_requests"
/// List of all async HTTP requests in the processing chain
var/list/datum/http_request/active_async_requests = list()
/// Variable to define if logging is enabled or not. Disabled by default since we know the requests the server is making. Enable with VV if you need to debug requests
diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm
index 3228b80ec77..70accf76fc0 100644
--- a/code/controllers/subsystem/icon_smooth.dm
+++ b/code/controllers/subsystem/icon_smooth.dm
@@ -6,6 +6,7 @@ SUBSYSTEM_DEF(icon_smooth)
flags = SS_TICKER
offline_implications = "Objects will no longer smooth together properly. No immediate action is needed."
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "icon_smooth"
var/list/smooth_queue = list()
diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm
index 9ce9c206be2..cade9828161 100644
--- a/code/controllers/subsystem/idlenpcpool.dm
+++ b/code/controllers/subsystem/idlenpcpool.dm
@@ -6,6 +6,7 @@ SUBSYSTEM_DEF(idlenpcpool)
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
init_order = INIT_ORDER_IDLENPCS // MUST be after SSmapping since it tracks max Zs
offline_implications = "Idle simple animals will no longer process. Shuttle call recommended."
+ ss_id = "idle_npc_pool"
var/list/currentrun = list()
var/static/list/idle_mobs_by_zlevel[][]
diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm
index f37ee295601..43b2d0b3d1e 100644
--- a/code/controllers/subsystem/input.dm
+++ b/code/controllers/subsystem/input.dm
@@ -11,6 +11,7 @@ SUBSYSTEM_DEF(input)
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
offline_implications = "Player input will no longer be recognised. Immediate server restart recommended."
cpu_display = SS_CPUDISPLAY_HIGH
+ ss_id = "input"
/// List of clients whose input to process in loop.
var/list/client/processing = list()
diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm
index 4d36315ea91..bb73352b9a4 100644
--- a/code/controllers/subsystem/jobs.dm
+++ b/code/controllers/subsystem/jobs.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(jobs)
runlevels = RUNLEVEL_GAME
offline_implications = "Время игры на профессиях больше не будет сохраняться. Немедленных действий не требуется."
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "jobs"
//List of all jobs
var/list/occupations = list()
@@ -220,10 +221,9 @@ SUBSYSTEM_DEF(jobs)
if(player?.mind)
player.mind.assigned_role = null
player.mind.special_role = null
- SetupOccupations()
- unassigned = list()
- return
-
+ player.mind.offstation_role = FALSE
+ for(var/datum/job/job in occupations)
+ job.current_positions = initial(job.current_positions)
///This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until it locates a head or runs out of levels to check
/datum/controller/subsystem/jobs/proc/FillHeadPosition()
@@ -295,6 +295,7 @@ SUBSYSTEM_DEF(jobs)
for(var/datum/job/ai/A in occupations)
A.spawn_positions = 3
+ unassigned = list()
//Get the players who are ready
for(var/mob/new_player/player in GLOB.player_list)
if(player.ready && player.mind && !player.mind.assigned_role)
diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm
index 3e659ba5f8d..55bfcb648ab 100644
--- a/code/controllers/subsystem/lighting.dm
+++ b/code/controllers/subsystem/lighting.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(lighting)
flags = SS_TICKER
offline_implications = "Lighting will no longer update. Shuttle call recommended."
cpu_display = SS_CPUDISPLAY_HIGH
+ ss_id = "lighting"
var/static/list/sources_queue = list() // List of lighting sources queued for update.
var/static/list/corners_queue = list() // List of lighting corners queued for update.
var/static/list/objects_queue = list() // List of lighting objects queued for update.
diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm
index e981075b83f..0f9fdd56342 100644
--- a/code/controllers/subsystem/machinery.dm
+++ b/code/controllers/subsystem/machinery.dm
@@ -8,6 +8,7 @@ SUBSYSTEM_DEF(machines)
flags = SS_KEEP_TIMING
offline_implications = "Machinery will no longer process. Shuttle call recommended."
cpu_display = SS_CPUDISPLAY_HIGH
+ ss_id = "machines"
var/list/processing = list()
var/list/currentrun = list()
diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm
index 5b3bb4ae905..2e4257a5dda 100644
--- a/code/controllers/subsystem/mobs.dm
+++ b/code/controllers/subsystem/mobs.dm
@@ -6,6 +6,7 @@ SUBSYSTEM_DEF(mobs)
init_order = INIT_ORDER_MOBS
offline_implications = "Mobs will no longer process. Immediate server restart recommended."
cpu_display = SS_CPUDISPLAY_HIGH
+ ss_id = "mobs"
var/list/currentrun = list()
var/static/list/clients_by_zlevel[][]
diff --git a/code/controllers/subsystem/nano_mob_hunter.dm b/code/controllers/subsystem/nano_mob_hunter.dm
index 64f5d1c30ed..52b3c63bf73 100644
--- a/code/controllers/subsystem/nano_mob_hunter.dm
+++ b/code/controllers/subsystem/nano_mob_hunter.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(mob_hunt)
flags = SS_NO_INIT
offline_implications = "Nano-Mob Hunter will no longer spawn mobs. No immediate action is needed."
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "mob_hunt"
var/max_normal_spawns = 15 //change this to adjust the number of normal spawns that can exist at one time. trapped spawns (from traitors) don't count towards this
var/list/normal_spawns = list()
var/max_trap_spawns = 15 //change this to adjust the number of trap spawns that can exist at one time. traps spawned beyond this point clear the oldest traps
diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm
index 8420d257f68..f4d942cd36f 100644
--- a/code/controllers/subsystem/nightshift.dm
+++ b/code/controllers/subsystem/nightshift.dm
@@ -6,7 +6,7 @@ SUBSYSTEM_DEF(nightshift)
flags = SS_NO_TICK_CHECK
offline_implications = "The game will no longer shift between day and night lighting. No immediate action is needed."
cpu_display = SS_CPUDISPLAY_LOW
-
+ ss_id = "night_shift"
var/nightshift_active = FALSE
var/nightshift_start_time = 702000 //7:30 PM, station time
var/nightshift_end_time = 270000 //7:30 AM, station time
diff --git a/code/controllers/subsystem/non-firing/alarm.dm b/code/controllers/subsystem/non-firing/alarm.dm
index 3d91d763be3..098c004c270 100644
--- a/code/controllers/subsystem/non-firing/alarm.dm
+++ b/code/controllers/subsystem/non-firing/alarm.dm
@@ -1,6 +1,7 @@
SUBSYSTEM_DEF(alarm)
name = "Alarm"
flags = SS_NO_INIT | SS_NO_FIRE
+ ss_id = "alarm"
var/list/alarms = list("Motion" = list(), "Fire" = list(), "Atmosphere" = list(), "Power" = list(), "Camera" = list(), "Burglar" = list())
/datum/controller/subsystem/alarm/proc/triggerAlarm(class, area/A, list/O, obj/alarmsource)
diff --git a/code/controllers/subsystem/non-firing/assets.dm b/code/controllers/subsystem/non-firing/assets.dm
index 42608557473..9a39118efef 100644
--- a/code/controllers/subsystem/non-firing/assets.dm
+++ b/code/controllers/subsystem/non-firing/assets.dm
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(assets)
name = "Assets"
init_order = INIT_ORDER_ASSETS
flags = SS_NO_FIRE
+ ss_id = "assets"
var/list/cache = list()
var/list/preload = list()
diff --git a/code/controllers/subsystem/non-firing/atoms.dm b/code/controllers/subsystem/non-firing/atoms.dm
index eab354e37c4..9115a2d2a93 100644
--- a/code/controllers/subsystem/non-firing/atoms.dm
+++ b/code/controllers/subsystem/non-firing/atoms.dm
@@ -7,6 +7,7 @@ SUBSYSTEM_DEF(atoms)
name = "Atoms"
init_order = INIT_ORDER_ATOMS
flags = SS_NO_FIRE
+ ss_id = "atoms"
var/old_initialized
diff --git a/code/controllers/subsystem/non-firing/blackbox.dm b/code/controllers/subsystem/non-firing/blackbox.dm
index bfa3c78a43c..e713085c498 100644
--- a/code/controllers/subsystem/non-firing/blackbox.dm
+++ b/code/controllers/subsystem/non-firing/blackbox.dm
@@ -8,6 +8,7 @@ SUBSYSTEM_DEF(blackbox)
// The database SS has INIT_ORDER_DBCORE=16, and this SS has INIT_ORDER_BLACKBOX=15
// So putting this ensures it shuts down in the right order
init_order = INIT_ORDER_BLACKBOX
+ ss_id = "blackbox"
/// List of all recorded feedback
var/list/datum/feedback_variable/feedback = list()
diff --git a/code/controllers/subsystem/non-firing/discord.dm b/code/controllers/subsystem/non-firing/discord.dm
index 7c09b224577..dcf7ecc9846 100644
--- a/code/controllers/subsystem/non-firing/discord.dm
+++ b/code/controllers/subsystem/non-firing/discord.dm
@@ -1,6 +1,7 @@
SUBSYSTEM_DEF(discord)
name = "Discord"
flags = SS_NO_FIRE
+ ss_id = "discord"
/// Is the SS enabled
var/enabled = FALSE
/// Last time the administrator ping was dropped. This ensures administrators cannot be mass pinged if a large chunk of ahelps go off at once (IE: tesloose)
diff --git a/code/controllers/subsystem/non-firing/holiday.dm b/code/controllers/subsystem/non-firing/holiday.dm
index 2ae219fa50c..85f6c4e10e4 100644
--- a/code/controllers/subsystem/non-firing/holiday.dm
+++ b/code/controllers/subsystem/non-firing/holiday.dm
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(holiday)
name = "Holiday"
init_order = INIT_ORDER_HOLIDAY // 4
flags = SS_NO_FIRE
+ ss_id = "holiday"
var/list/holidays
/datum/controller/subsystem/holiday/Initialize()
diff --git a/code/controllers/subsystem/non-firing/ipintel.dm b/code/controllers/subsystem/non-firing/ipintel.dm
index 00c997b2ef0..f94459950f7 100644
--- a/code/controllers/subsystem/non-firing/ipintel.dm
+++ b/code/controllers/subsystem/non-firing/ipintel.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(ipintel)
wait = 1
flags = SS_NO_FIRE
init_order = INIT_ORDER_XKEYSCORE // 10
+ ss_id = "ipintel"
var/enabled = 0 //disable at round start to avoid checking reconnects
var/throttle = 0
var/errors = 0
diff --git a/code/controllers/subsystem/non-firing/mapping.dm b/code/controllers/subsystem/non-firing/mapping.dm
index 72d4ed44318..5a7d9e49cdc 100644
--- a/code/controllers/subsystem/non-firing/mapping.dm
+++ b/code/controllers/subsystem/non-firing/mapping.dm
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(mapping)
name = "Mapping"
init_order = INIT_ORDER_MAPPING // 7
flags = SS_NO_FIRE
+ ss_id = "mapping"
/// What map datum are we using
var/datum/map/map_datum
/// What map will be used next round
diff --git a/code/controllers/subsystem/non-firing/medals.dm b/code/controllers/subsystem/non-firing/medals.dm
index d9061ab13bb..a719f0d1d87 100644
--- a/code/controllers/subsystem/non-firing/medals.dm
+++ b/code/controllers/subsystem/non-firing/medals.dm
@@ -1,6 +1,7 @@
SUBSYSTEM_DEF(medals)
name = "Medals"
flags = SS_NO_FIRE
+ ss_id = "medals"
var/hub_enabled = FALSE
diff --git a/code/controllers/subsystem/non-firing/pathfinder.dm b/code/controllers/subsystem/non-firing/pathfinder.dm
index 2ce0630fecb..1393ddf3dfa 100644
--- a/code/controllers/subsystem/non-firing/pathfinder.dm
+++ b/code/controllers/subsystem/non-firing/pathfinder.dm
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(pathfinder)
name = "Pathfinder"
init_order = INIT_ORDER_PATH
flags = SS_NO_FIRE
+ ss_id = "pathfinder"
var/datum/flowcache/mobs
var/static/space_type_cache
diff --git a/code/controllers/subsystem/non-firing/persistent_data.dm b/code/controllers/subsystem/non-firing/persistent_data.dm
index 3035337340a..a8c662744ae 100644
--- a/code/controllers/subsystem/non-firing/persistent_data.dm
+++ b/code/controllers/subsystem/non-firing/persistent_data.dm
@@ -11,6 +11,7 @@ SUBSYSTEM_DEF(persistent_data)
name = "Persistent Data"
init_order = INIT_ORDER_PERSISTENCE // -95 | Loads after EVERYTHING else
flags = SS_NO_FIRE
+ ss_id = "persistent_data"
/// List of atoms registered into the subsystem for persistent data storage. Can be anything at all
var/list/registered_atoms = list()
diff --git a/code/controllers/subsystem/non-firing/ping.dm b/code/controllers/subsystem/non-firing/ping.dm
index a5435d094ef..f0f36daefa3 100644
--- a/code/controllers/subsystem/non-firing/ping.dm
+++ b/code/controllers/subsystem/non-firing/ping.dm
@@ -11,6 +11,7 @@ SUBSYSTEM_DEF(ping)
flags = SS_NO_INIT | SS_NO_FIRE
runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "ping"
var/list/currentrun = list()
diff --git a/code/controllers/subsystem/non-firing/radio.dm b/code/controllers/subsystem/non-firing/radio.dm
index ca964a2d982..d23dfe4b524 100644
--- a/code/controllers/subsystem/non-firing/radio.dm
+++ b/code/controllers/subsystem/non-firing/radio.dm
@@ -1,6 +1,7 @@
SUBSYSTEM_DEF(radio)
name = "Radio"
flags = SS_NO_INIT | SS_NO_FIRE
+ ss_id = "radio"
var/list/radiochannels = list(
"Common" = PUB_FREQ,
diff --git a/code/controllers/subsystem/non-firing/sounds.dm b/code/controllers/subsystem/non-firing/sounds.dm
index c4a0c645af0..66c24d2730c 100644
--- a/code/controllers/subsystem/non-firing/sounds.dm
+++ b/code/controllers/subsystem/non-firing/sounds.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(sounds)
init_order = INIT_ORDER_SOUNDS
flags = SS_NO_FIRE
offline_implications = "Sounds may not play correctly. Shuttle call recommended."
+ ss_id = "sounds"
var/using_channels_max = CHANNEL_HIGHEST_AVAILABLE // BYOND max channels
/// Amount of channels to reserve for random usage rather than reservations being allowed to reserve all channels. Also a nice safeguard for when someone screws up.
diff --git a/code/controllers/subsystem/non-firing/titlescreen.dm b/code/controllers/subsystem/non-firing/titlescreen.dm
index d6956eac656..aae8b40053a 100644
--- a/code/controllers/subsystem/non-firing/titlescreen.dm
+++ b/code/controllers/subsystem/non-firing/titlescreen.dm
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(title)
name = "Title Screen"
flags = SS_NO_FIRE
init_order = INIT_ORDER_TITLE
+ ss_id = "title_screen"
/datum/controller/subsystem/title/Initialize()
diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm
index ca9c3befbee..83b7fd773e8 100644
--- a/code/controllers/subsystem/npcpool.dm
+++ b/code/controllers/subsystem/npcpool.dm
@@ -4,7 +4,7 @@ SUBSYSTEM_DEF(npcpool)
priority = FIRE_PRIORITY_NPC
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
offline_implications = "Simple animals will no longer process. Shuttle call recommended."
-
+ ss_id = "npc_pool"
var/list/currentrun = list()
/datum/controller/subsystem/npcpool/get_stat_details()
diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm
index 67433db8a8e..558cd7dcb9b 100644
--- a/code/controllers/subsystem/overlays.dm
+++ b/code/controllers/subsystem/overlays.dm
@@ -5,7 +5,7 @@ SUBSYSTEM_DEF(overlays)
priority = FIRE_PRIORITY_OVERLAYS
init_order = INIT_ORDER_OVERLAY
offline_implications = "Overlays may look strange. No immediate action is needed."
-
+ ss_id = "overlays"
var/list/queue
var/list/stats
var/list/overlay_icon_state_caches
diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm
index c0beb503d66..78c188f758d 100644
--- a/code/controllers/subsystem/parallax.dm
+++ b/code/controllers/subsystem/parallax.dm
@@ -6,6 +6,7 @@ SUBSYSTEM_DEF(parallax)
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
offline_implications = "Space parallax will no longer move around. No immediate action is needed."
cpu_display = SS_CPUDISPLAY_HIGH
+ ss_id = "parallax"
var/list/currentrun
var/planet_x_offset = 128
var/planet_y_offset = 128
diff --git a/code/controllers/subsystem/processing/aura_healing.dm b/code/controllers/subsystem/processing/aura_healing.dm
index ad3fa6f4278..0df8924938b 100644
--- a/code/controllers/subsystem/processing/aura_healing.dm
+++ b/code/controllers/subsystem/processing/aura_healing.dm
@@ -3,3 +3,4 @@ PROCESSING_SUBSYSTEM_DEF(aura_healing)
name = "Aura Healing"
flags = SS_NO_INIT | SS_BACKGROUND | SS_KEEP_TIMING
wait = 0.3 SECONDS
+ ss_id = "aura_healing"
diff --git a/code/controllers/subsystem/processing/dcs.dm b/code/controllers/subsystem/processing/dcs.dm
index a223f4676f6..1d0c12f1ece 100644
--- a/code/controllers/subsystem/processing/dcs.dm
+++ b/code/controllers/subsystem/processing/dcs.dm
@@ -1,6 +1,7 @@
PROCESSING_SUBSYSTEM_DEF(dcs)
name = "Datum Component System"
flags = SS_NO_INIT
+ ss_id = "datum_component_system"
var/list/elements_by_type = list()
// Update this if you add in components which actually use this as a processor
diff --git a/code/controllers/subsystem/processing/fastprocess.dm b/code/controllers/subsystem/processing/fastprocess.dm
index 37761ca8d60..cf0ed7e43ed 100644
--- a/code/controllers/subsystem/processing/fastprocess.dm
+++ b/code/controllers/subsystem/processing/fastprocess.dm
@@ -5,3 +5,4 @@ PROCESSING_SUBSYSTEM_DEF(fastprocess)
wait = 2
stat_tag = "FP"
offline_implications = "Objects using the 'Fast Processing' processor will no longer process. Shuttle call recommended."
+ ss_id = "fast_processing"
diff --git a/code/controllers/subsystem/processing/instruments.dm b/code/controllers/subsystem/processing/instruments.dm
index 5aa6757a428..1415f52e307 100644
--- a/code/controllers/subsystem/processing/instruments.dm
+++ b/code/controllers/subsystem/processing/instruments.dm
@@ -4,6 +4,7 @@ PROCESSING_SUBSYSTEM_DEF(instruments)
wait = 1
flags = SS_TICKER|SS_BACKGROUND|SS_KEEP_TIMING
offline_implications = "Instruments will no longer play. No immediate action is needed."
+ ss_id = "instruments"
/// List of all instrument data, associative id = datum
var/list/datum/instrument/instrument_data
diff --git a/code/controllers/subsystem/processing/obj.dm b/code/controllers/subsystem/processing/obj.dm
index 2a05c04af58..c437b1aa60b 100644
--- a/code/controllers/subsystem/processing/obj.dm
+++ b/code/controllers/subsystem/processing/obj.dm
@@ -4,3 +4,4 @@ PROCESSING_SUBSYSTEM_DEF(obj)
flags = SS_NO_INIT
wait = 20
offline_implications = "Objects using the 'Objects' processor will no longer process. Shuttle call recommended."
+ ss_id = "objects"
diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm
index ccf771575d9..6b2d6cb8112 100644
--- a/code/controllers/subsystem/processing/processing.dm
+++ b/code/controllers/subsystem/processing/processing.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(processing)
priority = FIRE_PRIORITY_PROCESS
flags = SS_BACKGROUND|SS_POST_FIRE_TIMING|SS_NO_INIT
wait = 10
+ ss_id = "processing"
var/stat_tag = "P" //Used for logging
var/list/processing = list()
diff --git a/code/controllers/subsystem/processing/projectiles.dm b/code/controllers/subsystem/processing/projectiles.dm
index 679c61083c7..bad9a7dfb7c 100644
--- a/code/controllers/subsystem/processing/projectiles.dm
+++ b/code/controllers/subsystem/processing/projectiles.dm
@@ -4,6 +4,7 @@ PROCESSING_SUBSYSTEM_DEF(projectiles)
flags = SS_NO_INIT|SS_TICKER
offline_implications = "Projectiles will no longer move. Shuttle call recommended."
cpu_display = SS_CPUDISPLAY_HIGH
+ ss_id = "projectiles"
/// Maximum moves a projectile can make per tick.
var/global_max_tick_moves = 10
diff --git a/code/controllers/subsystem/runechat.dm b/code/controllers/subsystem/runechat.dm
index bb0e6fc1721..34363a9f1e9 100644
--- a/code/controllers/subsystem/runechat.dm
+++ b/code/controllers/subsystem/runechat.dm
@@ -3,7 +3,7 @@ TIMER_SUBSYSTEM_DEF(runechat)
priority = FIRE_PRIORITY_RUNECHAT
offline_implications = "Runechat messages will no longer clear. Shuttle call recommended."
cpu_display = SS_CPUDISPLAY_HIGH
-
+ ss_id = "runechat"
var/list/datum/callback/message_queue = list()
diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm
index 89de3c793c2..7825894a118 100644
--- a/code/controllers/subsystem/shuttles.dm
+++ b/code/controllers/subsystem/shuttles.dm
@@ -8,6 +8,7 @@ SUBSYSTEM_DEF(shuttle)
runlevels = RUNLEVEL_SETUP | RUNLEVEL_GAME
offline_implications = "Shuttles will no longer function and cargo will not generate points. Immediate server restart recommended."
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "shuttle"
var/list/mobile = list()
var/list/stationary = list()
var/list/transit = list()
diff --git a/code/controllers/subsystem/spacedrift.dm b/code/controllers/subsystem/spacedrift.dm
index c3e3f5c5b47..af8d9c4e464 100644
--- a/code/controllers/subsystem/spacedrift.dm
+++ b/code/controllers/subsystem/spacedrift.dm
@@ -6,7 +6,7 @@ SUBSYSTEM_DEF(spacedrift)
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
offline_implications = "Mobs will no longer respect a lack of gravity. No immediate action is needed."
cpu_display = SS_CPUDISPLAY_LOW
-
+ ss_id = "space_drift"
var/list/currentrun = list()
var/list/processing = list()
diff --git a/code/controllers/subsystem/speech_controller.dm b/code/controllers/subsystem/speech_controller.dm
index 48d05ce44b1..e1489e9c0bd 100644
--- a/code/controllers/subsystem/speech_controller.dm
+++ b/code/controllers/subsystem/speech_controller.dm
@@ -5,7 +5,7 @@ SUBSYSTEM_DEF(speech_controller)
priority = FIRE_PRIORITY_SPEECH_CONTROLLER//has to be high priority, second in priority ONLY to SSinput
init_order = INIT_ORDER_SPEECH_CONTROLLER
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
-
+ ss_id = "speech_controller"
///used so that an admin can force all speech verbs to execute immediately instead of queueing
var/FOR_ADMINS_IF_BROKE_immediately_execute_all_speech = FALSE
diff --git a/code/controllers/subsystem/statistics.dm b/code/controllers/subsystem/statistics.dm
index 5facdc325b9..c526501d5f1 100644
--- a/code/controllers/subsystem/statistics.dm
+++ b/code/controllers/subsystem/statistics.dm
@@ -3,7 +3,7 @@ SUBSYSTEM_DEF(statistics)
wait = 6000 // 10 minute delay between fires
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME // Only count time actually ingame to avoid logging pre-round dips
offline_implications = "Player count and admin count statistics will no longer be logged to the database. No immediate action is needed."
-
+ ss_id = "statistics"
/datum/controller/subsystem/statistics/Initialize()
if(!CONFIG_GET(flag/sql_enabled))
diff --git a/code/controllers/subsystem/sun.dm b/code/controllers/subsystem/sun.dm
index f0ec1516016..d8054968b73 100644
--- a/code/controllers/subsystem/sun.dm
+++ b/code/controllers/subsystem/sun.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(sun)
init_order = INIT_ORDER_SUN
offline_implications = "Solar panels will no longer rotate. No immediate action is needed."
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "sun"
var/angle
var/dx
var/dy
diff --git a/code/controllers/subsystem/text_to_speech.dm b/code/controllers/subsystem/text_to_speech.dm
index 664881311f7..b9dccd3320a 100644
--- a/code/controllers/subsystem/text_to_speech.dm
+++ b/code/controllers/subsystem/text_to_speech.dm
@@ -8,6 +8,7 @@ SUBSYSTEM_DEF(tts)
wait = 1 SECONDS
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
cpu_display = SS_CPUDISPLAY_HIGH
+ ss_id = "text_to_speech"
var/tts_wanted = 0
var/tts_request_failed = 0
diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm
index 5be0dbe3ce6..155617d0a5a 100644
--- a/code/controllers/subsystem/tgui.dm
+++ b/code/controllers/subsystem/tgui.dm
@@ -10,6 +10,7 @@ SUBSYSTEM_DEF(tgui)
priority = FIRE_PRIORITY_TGUI
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
offline_implications = "All TGUIs will no longer process. Shuttle call recommended."
+ ss_id = "tgui"
var/list/currentrun = list()
var/list/open_uis = list() // A list of open UIs, grouped by src_object and ui_key.
diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm
index 758fcaabda1..1ae1f090d4d 100644
--- a/code/controllers/subsystem/throwing.dm
+++ b/code/controllers/subsystem/throwing.dm
@@ -9,6 +9,7 @@ SUBSYSTEM_DEF(throwing)
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
offline_implications = "Thrown objects may not react properly. Shuttle call recommended."
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "throwing"
var/list/currentrun
var/list/processing = list()
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index def4f1d08b4..f2cb8443bb7 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -7,6 +7,7 @@ SUBSYSTEM_DEF(ticker)
runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME
offline_implications = "The game is no longer aware of when the round ends. Immediate server restart recommended."
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "ticker"
/// Time the world started, relative to world.time
var/round_start_time = 0
@@ -201,7 +202,6 @@ SUBSYSTEM_DEF(ticker)
var/datum/game_mode/M = config.pick_mode(GLOB.secret_force_mode)
if(M.can_start())
mode = config.pick_mode(GLOB.secret_force_mode)
- SSjobs.ResetOccupations()
if(!mode)
mode = pickweight(runnable_modes)
if(mode)
@@ -215,7 +215,6 @@ SUBSYSTEM_DEF(ticker)
mode = null
current_state = GAME_STATE_PREGAME
force_start = FALSE
- SSjobs.ResetOccupations()
Master.SetRunLevel(RUNLEVEL_LOBBY)
world.check_for_lowpop()
@@ -248,8 +247,6 @@ SUBSYSTEM_DEF(ticker)
P.ready = FALSE
- //Configure mode and assign player to special mode stuff
- mode.pre_pre_setup()
var/can_continue = FALSE
can_continue = mode.pre_setup() //Setup special modes
SSjobs.DivideOccupations() //Distribute jobs
diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm
index 3dd87e5c616..58935eb35e6 100644
--- a/code/controllers/subsystem/tickets/tickets.dm
+++ b/code/controllers/subsystem/tickets/tickets.dm
@@ -20,7 +20,7 @@ SUBSYSTEM_DEF(tickets)
priority = FIRE_PRIORITY_TICKETS
offline_implications = "Admin tickets will no longer be marked as stale. No immediate action is needed."
flags = SS_BACKGROUND
-
+ ss_id = "admin_tickets"
var/span_class = "adminticket"
var/ticket_system_name = "Admin Tickets"
var/ticket_name = "Admin Ticket"
diff --git a/code/controllers/subsystem/time_track.dm b/code/controllers/subsystem/time_track.dm
index b4f312bfe29..08930eb5a8c 100644
--- a/code/controllers/subsystem/time_track.dm
+++ b/code/controllers/subsystem/time_track.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(time_track)
wait = 10 SECONDS
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
flags = SS_NO_INIT
+ ss_id = "time_track"
var/time_dilation_current = 0
var/time_dilation_avg_fast = 0
diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm
index 524f45e5387..96db6c84c6d 100644
--- a/code/controllers/subsystem/timer.dm
+++ b/code/controllers/subsystem/timer.dm
@@ -24,6 +24,7 @@ SUBSYSTEM_DEF(timer)
flags = SS_TICKER|SS_NO_INIT
offline_implications = "The game will no longer process timers. Immediate server restart recommended."
cpu_display = SS_CPUDISPLAY_HIGH
+ ss_id = "timer"
/// Queue used for storing timers that do not fit into the current buckets
var/list/datum/timedevent/second_queue = list()
diff --git a/code/controllers/subsystem/verb_manager.dm b/code/controllers/subsystem/verb_manager.dm
index a3400ea4a6f..a7e5a37adb5 100644
--- a/code/controllers/subsystem/verb_manager.dm
+++ b/code/controllers/subsystem/verb_manager.dm
@@ -25,6 +25,7 @@ SUBSYSTEM_DEF(verb_manager)
flags = SS_TICKER | SS_NO_INIT
priority = FIRE_PRIORITY_DELAYED_VERBS
runlevels = RUNLEVEL_INIT | RUNLEVELS_DEFAULT
+ ss_id = "verb_manager"
///list of callbacks to procs called from verbs or verblike procs that were executed when the server was overloaded and had to delay to the next tick.
///this list is ran through every tick, and the subsystem does not yield until this queue is finished.
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 2c2160a621a..0a437d8b318 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(vote)
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
offline_implications = "Votes (Endround shuttle) will no longer function. Shuttle call recommended."
cpu_display = SS_CPUDISPLAY_LOW
+ ss_id = "vote"
/// Active vote, if any
var/datum/vote/active_vote
diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm
index 00256564fb0..d9a37cc3f2d 100644
--- a/code/controllers/subsystem/weather.dm
+++ b/code/controllers/subsystem/weather.dm
@@ -10,6 +10,7 @@ SUBSYSTEM_DEF(weather)
wait = 10
runlevels = RUNLEVEL_GAME
offline_implications = "Ash storms will no longer trigger. No immediate action is needed."
+ ss_id = "weather"
var/list/processing = list()
var/list/eligible_zlevels = list()
var/list/next_hit_by_zlevel = list() //Used by barometers to know when the next storm is coming
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 51d2c91af12..d41509e51c6 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -63,7 +63,7 @@
return TRUE
-/datum/action/proc/Trigger()
+/datum/action/proc/Trigger(left_click = TRUE)
if(!IsAvailable())
return FALSE
return TRUE
@@ -172,6 +172,8 @@
//Presets for item actions
/datum/action/item_action
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS
+ /// Whether action trigger should call attack self proc.
+ var/attack_self = TRUE
var/use_itemicon = TRUE
var/action_initialisation_text = null //Space ninja abilities only
@@ -189,12 +191,12 @@
I.actions -= src
return ..()
-/datum/action/item_action/Trigger(attack_self = TRUE) //Maybe we don't want to click the thing itself
+/datum/action/item_action/Trigger(left_click = TRUE)
if(!..())
return FALSE
if(target && attack_self)
var/obj/item/I = target
- I.ui_action_click(owner, type)
+ I.ui_action_click(owner, type, left_click)
return TRUE
/datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button)
@@ -290,7 +292,7 @@
/datum/action/item_action/toggle_welding_screen/plasmaman
name = "Toggle Welding Screen"
-/datum/action/item_action/toggle_welding_screen/plasmaman/Trigger()
+/datum/action/item_action/toggle_welding_screen/plasmaman/Trigger(left_click = TRUE)
var/obj/item/clothing/head/helmet/space/plasmaman/H = target
if(istype(H))
H.toggle_welding_screen(owner)
@@ -306,7 +308,7 @@
desc = "Toggles if the club's blasts cause friendly fire."
button_icon_state = "vortex_ff_on"
-/datum/action/item_action/toggle_unfriendly_fire/Trigger()
+/datum/action/item_action/toggle_unfriendly_fire/Trigger(left_click = TRUE)
if(..())
UpdateButtonIcon()
@@ -432,8 +434,9 @@
/datum/action/item_action/remove_tape
name = "Remove Duct Tape"
+ attack_self = FALSE
-/datum/action/item_action/remove_tape/Trigger(attack_self = FALSE)
+/datum/action/item_action/remove_tape/Trigger(left_click = TRUE)
if(..())
var/datum/component/ducttape/DT = target.GetComponent(/datum/component/ducttape)
DT.remove_tape(target, usr)
@@ -482,17 +485,14 @@
/datum/action/item_action/hands_free/activate
name = "Activate"
-/datum/action/item_action/bomb_imp
- check_flags = null
-
-/datum/action/item_action/bomb_imp/activate
- name = "Activate Bomb Implant"
+/datum/action/item_action/hands_free/activate/always
+ check_flags = NONE
/datum/action/item_action/toggle_research_scanner
name = "Toggle Research Scanner"
button_icon_state = "scan_mode"
-/datum/action/item_action/toggle_research_scanner/Trigger()
+/datum/action/item_action/toggle_research_scanner/Trigger(left_click = TRUE)
if(IsAvailable())
owner.research_scanner = !owner.research_scanner
to_chat(owner, "Research analyzer is now [owner.research_scanner ? "active" : "deactivated"].")
@@ -514,7 +514,7 @@
name = "Use Instrument"
desc = "Use the instrument specified"
-/datum/action/item_action/instrument/Trigger()
+/datum/action/item_action/instrument/Trigger(left_click = TRUE)
if(istype(target, /obj/item/instrument))
var/obj/item/instrument/I = target
I.interact(usr)
@@ -541,8 +541,9 @@
/datum/action/item_action/gravity_jump
name = "Gravity jump"
desc = "Directs a pulse of gravity in front of the user, pulling them forward rapidly."
+ attack_self = FALSE
-/datum/action/item_action/gravity_jump/Trigger(attack_self = FALSE)
+/datum/action/item_action/gravity_jump/Trigger(left_click = TRUE)
. = ..()
if(!.)
return FALSE
@@ -578,7 +579,7 @@
/datum/action/item_action/voice_changer/voice
name = "Set Voice"
-/datum/action/item_action/voice_changer/voice/Trigger()
+/datum/action/item_action/voice_changer/voice/Trigger(left_click = TRUE)
if(!IsAvailable())
return FALSE
@@ -638,7 +639,7 @@
S.action = null
return ..()
-/datum/action/spell_action/Trigger()
+/datum/action/spell_action/Trigger(left_click = TRUE)
if(!IsAvailable(TRUE))
return FALSE
@@ -721,7 +722,7 @@
check_flags = 0
var/active = FALSE
-/datum/action/innate/Trigger()
+/datum/action/innate/Trigger(left_click = TRUE)
if(!..())
return FALSE
if(!active)
@@ -740,7 +741,7 @@
name = "Toggle Research Scanner"
button_icon_state = "scan_mode"
-/datum/action/innate/research_scanner/Trigger()
+/datum/action/innate/research_scanner/Trigger(left_click = TRUE)
if(IsAvailable())
owner.research_scanner = !owner.research_scanner
to_chat(owner, "Research analyzer is now [owner.research_scanner ? "active" : "deactivated"].")
@@ -763,7 +764,7 @@
check_flags = 0
var/procname
-/datum/action/generic/Trigger()
+/datum/action/generic/Trigger(left_click = TRUE)
if(!..())
return FALSE
if(target && procname)
diff --git a/code/datums/components/aura_healing.dm b/code/datums/components/aura_healing.dm
index 3bc46390dff..b57609c523f 100644
--- a/code/datums/components/aura_healing.dm
+++ b/code/datums/components/aura_healing.dm
@@ -187,7 +187,7 @@
for(var/index in external_organ_fracture_healing)
body_part = human.bodyparts_by_name[index]
- if(QDELETED(body_part) || !(body_part.status & ORGAN_BROKEN) || (body_part.is_robotic() && !robot_heal))
+ if(QDELETED(body_part) || !body_part.has_fracture() || (body_part.is_robotic() && !robot_heal))
continue
if(prob(mend_fractures_chance))
@@ -196,8 +196,8 @@
break
else
- for(var/obj/item/organ/external/body_part in human.bodyparts)
- if(QDELETED(body_part) || !(body_part.status & ORGAN_BROKEN) || (body_part.is_robotic() && !robot_heal))
+ for(var/obj/item/organ/external/body_part as anything in human.bodyparts)
+ if(QDELETED(body_part) || !body_part.has_fracture() || (body_part.is_robotic() && !robot_heal))
continue
if(prob(mend_fractures_chance))
@@ -211,22 +211,22 @@
for(var/index in external_organ_bleeding_healing)
body_part = human.bodyparts_by_name[index]
- if(QDELETED(body_part) || !body_part.internal_bleeding)
+ if(QDELETED(body_part) || !body_part.has_internal_bleeding())
continue
if(prob(stop_internal_bleeding_chance))
external_organ_heal_done = TRUE
- body_part.internal_bleeding = FALSE
+ body_part.stop_internal_bleeding()
break
else
- for(var/obj/item/organ/external/body_part in human.bodyparts)
- if(QDELETED(body_part) || !body_part.internal_bleeding)
+ for(var/obj/item/organ/external/body_part as anything in human.bodyparts)
+ if(QDELETED(body_part) || !body_part.has_internal_bleeding())
continue
if(prob(stop_internal_bleeding_chance))
external_organ_heal_done = TRUE
- body_part.internal_bleeding = FALSE
+ body_part.stop_internal_bleeding()
break
if(should_show_effect && (external_organ_heal_done || old_health < candidate.maxHealth))
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index d1738db3cc4..e62d5d35c30 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -222,7 +222,7 @@ GLOBAL_VAR_INIT(record_id_num, 1001)
/proc/get_id_photo(mob/living/carbon/human/H, var/custom_job = null)
var/icon/preview_icon = null
- var/obj/item/organ/external/head/head_organ = H.get_organ("head")
+ var/obj/item/organ/external/head/head_organ = H.get_organ(BODY_ZONE_HEAD)
var/obj/item/organ/internal/eyes/eyes_organ = H.get_int_organ(/obj/item/organ/internal/eyes)
var/g = "m"
@@ -255,12 +255,12 @@ GLOBAL_VAR_INIT(record_id_num, 1001)
temp.Blend(H.skin_colour, ICON_ADD)
preview_icon.Blend(temp, ICON_OVERLAY)
- for(var/obj/item/organ/external/E in H.bodyparts)
- if(istype(E,/obj/item/organ/external/tail))
+ for(var/obj/item/organ/external/bodypart as anything in H.bodyparts)
+ if(istype(bodypart, /obj/item/organ/external/tail))
continue
- if(istype(E, /obj/item/organ/external/wing))
+ if(istype(bodypart, /obj/item/organ/external/wing))
continue
- preview_icon.Blend(E.get_icon(), ICON_OVERLAY)
+ preview_icon.Blend(bodypart.get_icon(), ICON_OVERLAY)
/* At this point all bodyparts already colored!
// Skin tone
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index 5ba9244f2e8..f6fcca700c2 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -78,27 +78,27 @@
var/zone_text
if(!zone)
- zone_text = pick(40; "head", 40; "chest", 10; "l_arm", 10; "l_leg")
+ zone_text = pick(40; BODY_ZONE_HEAD, 40; BODY_ZONE_CHEST, 10; BODY_ZONE_L_ARM, 10; BODY_ZONE_L_LEG)
else
if(istype(zone, /obj/item/organ/external))
var/obj/item/organ/external/E = zone
- zone_text = E.limb_name
+ zone_text = E.limb_zone
else
zone_text = zone
switch(zone_text)
- if("head", "eyes", "mouth")
+ if(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH)
if(ClothingVirusProtection(head) || ClothingVirusProtection(wear_mask))
return TRUE
- if("chest", "groin", "tail", "wing")
+ if(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_TAIL, BODY_ZONE_WING)
if(ClothingVirusProtection(wear_suit) || ClothingVirusProtection(w_uniform))
return TRUE
- if("l_arm", "r_arm", "l_hand", "r_hand")
+ if(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND)
if(istype(wear_suit) && (wear_suit.body_parts_covered & HANDS) && ClothingVirusProtection(wear_suit))
return TRUE
if(ClothingVirusProtection(gloves))
return TRUE
- if("l_leg", "r_leg", "l_foot", "r_foot")
+ if(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_PRECISE_L_FOOT, BODY_ZONE_PRECISE_R_FOOT)
if(istype(wear_suit) && (wear_suit.body_parts_covered & FEET) && ClothingVirusProtection(wear_suit))
return TRUE
if(ClothingVirusProtection(shoes))
diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm
index 4fa7169b8fd..ce215ad0e5a 100644
--- a/code/datums/diseases/appendicitis.dm
+++ b/code/datums/diseases/appendicitis.dm
@@ -31,7 +31,7 @@
A.inflamed = TRUE
A.update_icon()
- if(!ruptured && (A.germ_level >= INFECTION_LEVEL_THREE || A.status & ORGAN_DEAD))
+ if(!ruptured && (A.germ_level >= INFECTION_LEVEL_THREE || A.is_dead()))
rupture(H, A)
switch(stage)
@@ -120,15 +120,15 @@
A.necrotize()
stage = 5
- var/obj/item/organ/external/parent = H.get_organ(check_zone(A.parent_organ))
+ var/obj/item/organ/external/parent = H.get_organ(check_zone(A.parent_organ_zone))
if(istype(parent))
parent.receive_damage(25, used_weapon = "appendix rupture")
if(parent.germ_level < INFECTION_LEVEL_TWO)
parent.germ_level = INFECTION_LEVEL_TWO
- for(var/obj/item/organ/internal/O in parent.internal_organs)
- if(O.germ_level < INFECTION_LEVEL_TWO)
- O.germ_level = INFECTION_LEVEL_TWO
- O.receive_damage(10)
+ for(var/obj/item/organ/internal/organ as anything in parent.internal_organs)
+ if(organ.germ_level < INFECTION_LEVEL_TWO)
+ organ.germ_level = INFECTION_LEVEL_TWO
+ organ.receive_damage(10)
to_chat(H, span_userdanger("You feel a hellish pain in your abdomen, as if something is torn!"))
H.Stun(20 SECONDS)
diff --git a/code/datums/diseases/viruses/advance/symptoms/beard.dm b/code/datums/diseases/viruses/advance/symptoms/beard.dm
index 16e0113bdfe..14cf3398b56 100644
--- a/code/datums/diseases/viruses/advance/symptoms/beard.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/beard.dm
@@ -31,7 +31,7 @@ BONUS
var/mob/living/M = A.affected_mob
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- var/obj/item/organ/external/head/head_organ = H.get_organ("head")
+ var/obj/item/organ/external/head/head_organ = H.get_organ(BODY_ZONE_HEAD)
switch(A.stage)
if(1, 2)
to_chat(H, span_warning("Your chin itches."))
diff --git a/code/datums/diseases/viruses/advance/symptoms/damage_converter.dm b/code/datums/diseases/viruses/advance/symptoms/damage_converter.dm
index cf713948ffe..e847402e2e2 100644
--- a/code/datums/diseases/viruses/advance/symptoms/damage_converter.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/damage_converter.dm
@@ -46,7 +46,7 @@ Bonus
if(!parts.len)
return
var/healed = 0
- for(var/obj/item/organ/external/E in parts)
+ for(var/obj/item/organ/external/E as anything in parts)
healed += min(E.brute_dam, get_damage) + min(E.burn_dam, get_damage)
E.heal_damage(get_damage, get_damage, updating_health = TRUE)
M.adjustToxLoss(healed)
diff --git a/code/datums/diseases/viruses/advance/symptoms/limb_throw.dm b/code/datums/diseases/viruses/advance/symptoms/limb_throw.dm
index 30673fd07d6..f95d126df75 100644
--- a/code/datums/diseases/viruses/advance/symptoms/limb_throw.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/limb_throw.dm
@@ -69,7 +69,7 @@ Limb Rejection
to_chat(H, span_alert("You still need [limb]!"))
return FALSE
- for(var/obj/item/organ/internal/organ in limb.internal_organs)
+ for(var/obj/item/organ/internal/organ as anything in limb.internal_organs)
if(organ.vital)
to_chat(H, span_alert("You still need [organ]!"))
return FALSE
diff --git a/code/datums/diseases/viruses/advance/symptoms/shedding.dm b/code/datums/diseases/viruses/advance/symptoms/shedding.dm
index eadaab577b8..efa5950d4c7 100644
--- a/code/datums/diseases/viruses/advance/symptoms/shedding.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/shedding.dm
@@ -32,7 +32,7 @@ BONUS
to_chat(M, span_warning(pick("Your scalp itches.", "Your skin feels flakey.")))
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- var/obj/item/organ/external/head/head_organ = H.get_organ("head")
+ var/obj/item/organ/external/head/head_organ = H.get_organ(BODY_ZONE_HEAD)
switch(A.stage)
if(3, 4)
if(!(head_organ.h_style == "Bald") && !(head_organ.h_style == "Balding Hair"))
diff --git a/code/datums/diseases/viruses/advance/symptoms/toxification.dm b/code/datums/diseases/viruses/advance/symptoms/toxification.dm
index 0c1d0116189..01ee19bdb42 100644
--- a/code/datums/diseases/viruses/advance/symptoms/toxification.dm
+++ b/code/datums/diseases/viruses/advance/symptoms/toxification.dm
@@ -38,10 +38,10 @@ Toxification syndrome
)))
if(prob(10))
M.emote("groan", "pale")
- if(prob((A.stage - 2) - M.count_of_infected_organs()/4))
- var/obj/item/organ/O = pick(M.internal_organs + M.bodyparts)
- if(O.germ_level < INFECTION_LEVEL_ONE)
- O.germ_level = INFECTION_LEVEL_ONE
+ if(prob((A.stage - 2) - M.count_infected_organs() / 4))
+ var/obj/item/organ/organ = safepick(M.internal_organs + M.bodyparts)
+ if(organ && organ.germ_level < INFECTION_LEVEL_ONE)
+ organ.germ_level = INFECTION_LEVEL_ONE
return
/datum/symptom/infection/End(datum/disease/virus/advance/A)
diff --git a/code/datums/emote/emote.dm b/code/datums/emote/emote.dm
index fb710ef2dce..0652f2a7054 100644
--- a/code/datums/emote/emote.dm
+++ b/code/datums/emote/emote.dm
@@ -310,11 +310,12 @@
* Arguments:
* * user - Person that is trying to send the emote.
* * intentional - Bool that says whether the emote was forced (FALSE) or not (TRUE).
+ * * ignore_cooldowns - If `TRUE` all cooldowns will be skipped.
*
* Returns FALSE if the cooldown is not over, TRUE if the cooldown is over.
*/
-/datum/emote/proc/check_cooldown(mob/user, intentional)
- if(!intentional && bypass_unintentional_cooldown)
+/datum/emote/proc/check_cooldown(mob/user, intentional, ignore_cooldowns)
+ if((!intentional && bypass_unintentional_cooldown) || ignore_cooldowns)
return TRUE
// if our emote would play sound but another audio emote is on cooldown, prevent this emote from being used.
// Note that this only applies to intentional emotes
diff --git a/code/datums/keybindings/mob.dm b/code/datums/keybindings/mob.dm
index 97723b8ea3e..a20da4b3fab 100644
--- a/code/datums/keybindings/mob.dm
+++ b/code/datums/keybindings/mob.dm
@@ -28,11 +28,16 @@
/datum/keybinding/mob/drop_held_object/down(client/C)
. = ..()
var/obj/item/I = C.mob.get_active_hand()
+ if(!I && C.mob.special_hands_drop_action())
+ SEND_SIGNAL(C.mob, COMSIG_MOB_KEY_DROP_ITEM_DOWN)
+ return
+
if(I)
+ if(SEND_SIGNAL(C.mob, COMSIG_MOB_KEY_DROP_ITEM_DOWN) & COMPONENT_CANCEL_DROP)
+ return
I.run_drop_held_item(C.mob)
- SEND_SIGNAL(C.mob, COMSIG_MOB_KEY_DROP_ITEM_DOWN)
else
- to_chat(C, SPAN_WARNING("Вы ничего не держите в руке!"))
+ to_chat(C, span_warning("Вы ничего не держите в руке!"))
/datum/keybinding/mob/swap_hands
name = "Поменять руки"
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 0192d85d29a..e852f808a24 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -440,12 +440,12 @@
if(has_subclass)
. += " | Force full power: [vamp.subclass.full_power_override ? "Yes" : "No"]"
if(istype(vamp.subclass, /datum/vampire_subclass/bestia) || istype(vamp.subclass, /datum/vampire_subclass/ancient))
- . += "
Trophies:
Hearts: [vamp.subclass.trophies["hearts"]]"
- . += " | Lungs: [vamp.subclass.trophies["lungs"]]"
- . += " | Livers: [vamp.subclass.trophies["livers"]]"
- . += "
Kidneys: [vamp.subclass.trophies["kidneys"]]"
- . += " | Eyes: [vamp.subclass.trophies["eyes"]]"
- . += " | Ears: [vamp.subclass.trophies["ears"]]"
+ . += "
Trophies:
Hearts: [vamp.subclass.trophies[INTERNAL_ORGAN_HEART]]"
+ . += " | Lungs: [vamp.subclass.trophies[INTERNAL_ORGAN_LUNGS]]"
+ . += " | Livers: [vamp.subclass.trophies[INTERNAL_ORGAN_LIVER]]"
+ . += "
Kidneys: [vamp.subclass.trophies[INTERNAL_ORGAN_KIDNEYS]]"
+ . += " | Eyes: [vamp.subclass.trophies[INTERNAL_ORGAN_EYES]]"
+ . += " | Ears: [vamp.subclass.trophies[INTERNAL_ORGAN_EARS]]"
if(!length(vamp.objectives))
. += "
Objectives are empty! Randomize!"
else
@@ -1756,7 +1756,7 @@
if(isnull(new_total))
return
- vamp.adjust_trophies("hearts", new_total)
+ vamp.adjust_trophies(INTERNAL_ORGAN_HEART, new_total)
log_admin("[key_name(usr)] has adjusted [key_name(current)]'s hearts trophies by [new_total].")
message_admins("[key_name_admin(usr)] has adjusted [key_name_admin(current)]'s hearts trophies by [new_total].")
@@ -1769,7 +1769,7 @@
if(isnull(new_total))
return
- vamp.adjust_trophies("lungs", new_total)
+ vamp.adjust_trophies(INTERNAL_ORGAN_LUNGS, new_total)
log_admin("[key_name(usr)] has adjusted [key_name(current)]'s lungs trophies by [new_total].")
message_admins("[key_name_admin(usr)] has adjusted [key_name_admin(current)]'s lungs trophies by [new_total].")
@@ -1782,7 +1782,7 @@
if(isnull(new_total))
return
- vamp.adjust_trophies("livers", new_total)
+ vamp.adjust_trophies(INTERNAL_ORGAN_LIVER, new_total)
log_admin("[key_name(usr)] has adjusted [key_name(current)]'s livers trophies by [new_total].")
message_admins("[key_name_admin(usr)] has adjusted [key_name_admin(current)]'s livers trophies by [new_total].")
@@ -1795,7 +1795,7 @@
if(isnull(new_total))
return
- vamp.adjust_trophies("kidneys", new_total)
+ vamp.adjust_trophies(INTERNAL_ORGAN_KIDNEYS, new_total)
log_admin("[key_name(usr)] has adjusted [key_name(current)]'s kidneys trophies by [new_total].")
message_admins("[key_name_admin(usr)] has adjusted [key_name_admin(current)]'s kidneys trophies by [new_total].")
@@ -1808,7 +1808,7 @@
if(isnull(new_total))
return
- vamp.adjust_trophies("eyes", new_total)
+ vamp.adjust_trophies(INTERNAL_ORGAN_EYES, new_total)
log_admin("[key_name(usr)] has adjusted [key_name(current)]'s eyes trophies by [new_total].")
message_admins("[key_name_admin(usr)] has adjusted [key_name_admin(current)]'s eyes trophies by [new_total].")
@@ -1821,7 +1821,7 @@
if(isnull(new_total))
return
- vamp.adjust_trophies("ears", new_total)
+ vamp.adjust_trophies(INTERNAL_ORGAN_EARS, new_total)
log_admin("[key_name(usr)] has adjusted [key_name(current)]'s ears trophies by [new_total].")
message_admins("[key_name_admin(usr)] has adjusted [key_name_admin(current)]'s ears trophies by [new_total].")
diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm
index 4d870e1296c..f4b27c97069 100644
--- a/code/datums/mutable_appearance.dm
+++ b/code/datums/mutable_appearance.dm
@@ -9,13 +9,18 @@
plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE
// And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var
+
// Helper similar to image()
-/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE)
+/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE, color)
var/mutable_appearance/MA = new()
MA.icon = icon
MA.icon_state = icon_state
MA.layer = layer
MA.plane = plane
+ MA.alpha = alpha
+ MA.appearance_flags |= appearance_flags
+ if(color)
+ MA.color = color
return MA
@@ -23,3 +28,4 @@
. = ..()
alpha = 255
transform = null
+
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
index 1c03bc950ff..0b209f5b649 100644
--- a/code/datums/outfits/outfit_admin.dm
+++ b/code/datums/outfits/outfit_admin.dm
@@ -43,7 +43,7 @@
)
var/id_access = "Syndicate Operative"
- var/uplink_uses = 20
+ var/uplink_uses = 100
/datum/outfit/admin/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
@@ -173,7 +173,7 @@
name = "Syndicate Spy"
uniform = /obj/item/clothing/under/suit_jacket/really_black
shoes = /obj/item/clothing/shoes/chameleon/noslip
- uplink_uses = 40
+ uplink_uses = 200
id_access = "Syndicate Agent"
implants = list(
@@ -738,7 +738,7 @@
belt = /obj/item/gun/projectile/revolver/nagant
backpack_contents = list(
- /obj/item/ammo_box/speedloader/shotgun/a762 = 4
+ /obj/item/ammo_box/speedloader/a762 = 4
)
/datum/outfit/admin/soviet/soldier
@@ -837,6 +837,7 @@
/obj/item/storage/box/responseteam = 1,
/obj/item/implanter/dust = 1,
/obj/item/implanter/death_alarm = 1,
+ /obj/item/stamp/solgov = 1,
)
/datum/outfit/admin/solgov_rep/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
diff --git a/code/datums/spells/cluwne.dm b/code/datums/spells/cluwne.dm
index 6e4aec12ed8..213fb3e7b94 100644
--- a/code/datums/spells/cluwne.dm
+++ b/code/datums/spells/cluwne.dm
@@ -16,7 +16,7 @@
if(!get_int_organ(/obj/item/organ/internal/brain/cluwne))
var/obj/item/organ/internal/brain/cluwne/idiot_brain = new
internal_organs |= idiot_brain //Well, everything's for recursion prevention.
- idiot_brain.insert(src, make_cluwne = 0)
+ idiot_brain.insert(src, make_cluwne = FALSE)
idiot_brain.dna = dna.Clone()
else
return
diff --git a/code/datums/spells/high_rp.dm b/code/datums/spells/high_rp.dm
index 1a0c28e3cc2..0b8ac2e140f 100644
--- a/code/datums/spells/high_rp.dm
+++ b/code/datums/spells/high_rp.dm
@@ -7,8 +7,8 @@
var/warned = 0
unremovable = TRUE
-/obj/item/organ/internal/high_rp_tumor/insert(mob/living/target, special = 0)
- ..(target, special = special)
+/obj/item/organ/internal/high_rp_tumor/insert(mob/living/target, special = ORGAN_MANIPULATION_DEFAULT)
+ ..(target, special)
if(target)
to_chat(target, "Я должен дышать, иначе просто задохнусь!")
@@ -41,7 +41,7 @@
button_icon_state = "lungs"
check_flags = null
-/datum/action/item_action/organ_action/manual_breath/Trigger()
+/datum/action/item_action/organ_action/manual_breath/Trigger(left_click = TRUE)
. = ..()
if(. && istype(target, /obj/item/organ/internal/high_rp_tumor))
var/obj/item/organ/internal/high_rp_tumor/hrp_tumor = target
diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm
index 669074bc139..061a420851d 100644
--- a/code/datums/spells/mime.dm
+++ b/code/datums/spells/mime.dm
@@ -138,7 +138,7 @@
/obj/effect/proc_holder/spell/mime/fingergun/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/human/target in targets)
if(!current_gun)
- to_chat(user, "You draw your fingers!")
+ to_chat(user, span_notice("You draw your fingers!"))
current_gun = new gun(get_turf(user), src)
target.drop_from_active_hand()
target.put_in_hands(current_gun)
@@ -152,8 +152,9 @@
SIGNAL_HANDLER
if(!current_gun || action.owner.get_active_hand() != current_gun)
return
- to_chat(action.owner, "You holster your fingers. Another time perhaps...")
+ to_chat(action.owner, span_notice("You holster your fingers. Another time perhaps..."))
QDEL_NULL(current_gun)
+ return COMPONENT_CANCEL_DROP
// Mime Spellbooks
diff --git a/code/datums/spells/rathens.dm b/code/datums/spells/rathens.dm
index ad751dc8711..561c6886033 100644
--- a/code/datums/spells/rathens.dm
+++ b/code/datums/spells/rathens.dm
@@ -33,10 +33,10 @@
var/obj/effect/decal/cleanable/blood/gibs/G = new/obj/effect/decal/cleanable/blood/gibs(get_turf(H))
spawn()
G.throw_at(get_edge_target_turf(H, pick(GLOB.alldirs)), rand(1, 10), 5)
- H.apply_damage(10, BRUTE, "chest")
+ H.apply_damage(10, BRUTE, BODY_ZONE_CHEST)
to_chat(H, "You have no appendix, but something had to give! Holy shit, what was that?")
H.Weaken(6 SECONDS)
- for(var/obj/item/organ/external/E in H.bodyparts)
+ for(var/obj/item/organ/external/E as anything in H.bodyparts)
if(istype(E, /obj/item/organ/external/head))
continue
if(istype(E, /obj/item/organ/external/chest))
diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm
index 261196af883..d58073d0040 100644
--- a/code/datums/spells/summonitem.dm
+++ b/code/datums/spells/summonitem.dm
@@ -74,22 +74,9 @@
break
if(ishuman(M)) //Edge case housekeeping
- var/mob/living/carbon/human/C = M
- /*if(C.internal_bodyparts_by_name && item_to_retrieve in C.internal_bodyparts_by_name ) //This won't work, as we use organ datums instead of objects. --DZD
- C.internal_bodyparts_by_name -= item_to_retrieve
- if(istype(marked_item, /obj/item/brain)) //If this code ever runs I will be happy
- var/obj/item/brain/B = new /obj/item/brain(target.loc)
- B.transfer_identity(C)
- C.death()
- add_attack_logs(target, C, "Magically debrained INTENT: [uppertext(target.a_intent)]")*/
- for(var/X in C.bodyparts)
- var/obj/item/organ/external/part = X
- if(item_to_retrieve in part.embedded_objects)
- part.embedded_objects -= item_to_retrieve
- to_chat(C, span_warning("The [item_to_retrieve] that was embedded in your [part] has mysteriously vanished. How fortunate!"))
- if(!C.has_embedded_objects())
- C.clear_alert("embeddedobject")
- break
+ var/mob/living/carbon/human/human = M
+ if(human.remove_embedded_object(item_to_retrieve))
+ to_chat(human, span_warning("The [item_to_retrieve] that was embedded into you has mysteriously vanished. How fortunate!"))
else
if(istype(item_to_retrieve.loc,/obj/machinery/portable_atmospherics/)) //Edge cases for moved machinery
diff --git a/code/datums/spells/touch_attacks.dm b/code/datums/spells/touch_attacks.dm
index af20a1dcdd6..8560b457ddd 100644
--- a/code/datums/spells/touch_attacks.dm
+++ b/code/datums/spells/touch_attacks.dm
@@ -51,6 +51,7 @@
attached_hand.is_withdraw = TRUE
QDEL_NULL(attached_hand)
+ return COMPONENT_CANCEL_DROP
/obj/effect/proc_holder/spell/touch/disintegrate
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 7fe6aa94214..bcf96f443f0 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -57,10 +57,9 @@
if(ishuman(owner))
owner.status_flags |= IGNORESLOWDOWN
var/mob/living/carbon/human/H = owner
- for(var/X in H.bodyparts)
- var/obj/item/organ/external/BP = X
- BP.brute_mod *= 0.1
- BP.burn_mod *= 0.1
+ for(var/obj/item/organ/external/bodypart as anything in H.bodyparts)
+ bodypart.brute_mod *= 0.1
+ bodypart.burn_mod *= 0.1
H.dna.species.tox_mod *= 0.1
H.dna.species.oxy_mod *= 0.1
H.dna.species.clone_mod *= 0.1
@@ -73,10 +72,9 @@
/datum/status_effect/blooddrunk/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
- for(var/X in H.bodyparts)
- var/obj/item/organ/external/BP = X
- BP.brute_mod *= 10
- BP.burn_mod *= 10
+ for(var/obj/item/organ/external/bodypart as anything in H.bodyparts)
+ bodypart.brute_mod *= 10
+ bodypart.burn_mod *= 10
H.dna.species.tox_mod *= 10
H.dna.species.oxy_mod *= 10
H.dna.species.clone_mod *= 10
@@ -175,7 +173,7 @@
if(itemUser.put_in_l_hand(newRod, TRUE))
to_chat(itemUser, "The Rod of Asclepius suddenly grows back out of your arm!")
else
- if(!itemUser.has_organ("l_arm"))
+ if(!itemUser.get_organ(BODY_ZONE_L_ARM))
new /obj/item/organ/external/arm(itemUser)
new /obj/item/organ/external/hand(itemUser)
itemUser.update_body()
@@ -186,7 +184,7 @@
if(itemUser.put_in_r_hand(newRod, TRUE))
to_chat(itemUser, "The Rod of Asclepius suddenly grows back out of your arm!")
else
- if(!itemUser.has_organ("r_arm"))
+ if(!itemUser.get_organ(BODY_ZONE_R_ARM))
new /obj/item/organ/external/arm/right(itemUser)
new /obj/item/organ/external/hand/right(itemUser)
itemUser.update_body()
@@ -225,10 +223,9 @@
var/mob/living/carbon/human/H = owner
H.bodytemperature = H.dna.species.body_temperature
if(is_mining_level(H.z) || istype(get_area(H), /area/ruin/space/bubblegum_arena))
- for(var/thing in H.bodyparts)
- var/obj/item/organ/external/E = thing
- E.internal_bleeding = FALSE
- E.mend_fracture()
+ for(var/obj/item/organ/external/bodypart as anything in H.bodyparts)
+ bodypart.stop_internal_bleeding()
+ bodypart.mend_fracture()
else
to_chat(owner, "...But the core was weakened, it is not close enough to the rest of the legions of the necropolis.")
else
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 1a110ddc6fe..f48726ad9f7 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -199,10 +199,10 @@
/datum/status_effect/mark_prey/on_creation(mob/living/new_owner, datum/antagonist/vampire/antag_datum)
if(antag_datum)
vamp = antag_datum
- var/t_kidneys = vamp.get_trophies("kidneys")
+ var/t_kidneys = vamp.get_trophies(INTERNAL_ORGAN_KIDNEYS)
duration += t_kidneys SECONDS // 15s. MAX
- t_eyes = vamp.get_trophies("eyes")
- t_hearts = vamp.get_trophies("hearts")
+ t_eyes = vamp.get_trophies(INTERNAL_ORGAN_EYES)
+ t_hearts = vamp.get_trophies(INTERNAL_ORGAN_HEART)
return ..()
@@ -732,7 +732,7 @@
var/obj/item/organ/vision = H.get_int_organ(H.dna.species.vision_organ)
- if(!vision || vision.is_bruised() || vision.is_broken()) // doesn't decay if you have damaged eyesight.
+ if(!vision || vision.is_bruised() || vision.is_traumatized()) // doesn't decay if you have damaged eyesight.
return 0
if(istype(H.glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) // decays faster if you rest your eyes with a blindfold.
@@ -761,7 +761,7 @@
var/obj/item/organ/vision = H.get_int_organ(H.dna.species.vision_organ)
- if(!vision || vision.is_broken() || vision.is_bruised()) //got no eyes or broken eyes
+ if(!vision || vision.is_traumatized() || vision.is_bruised()) //got no eyes or broken eyes
return 0
return ..() //default decay rate
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 3d9f649f9fe..74aab06ce2f 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -470,7 +470,7 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY
/datum/supply_packs/security/armory/slugammo
name = "Slug Ammo Crate"
- contains = list(/obj/item/ammo_box/speedloader/shotgun,
+ contains = list(/obj/item/ammo_box/speedloader/shotgun/slug,
/obj/item/ammo_box/shotgun,
/obj/item/ammo_box/shotgun,
/obj/item/ammo_box/shotgun,
@@ -594,12 +594,12 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY
name = "Mosin Nagant crate"
contains = list(/obj/item/gun/projectile/shotgun/boltaction,
/obj/item/gun/projectile/shotgun/boltaction,
- /obj/item/ammo_box/speedloader/shotgun/a762,
- /obj/item/ammo_box/speedloader/shotgun/a762,
- /obj/item/ammo_box/speedloader/shotgun/a762,
- /obj/item/ammo_box/speedloader/shotgun/a762,
- /obj/item/ammo_box/speedloader/shotgun/a762,
- /obj/item/ammo_box/speedloader/shotgun/a762)
+ /obj/item/ammo_box/speedloader/a762,
+ /obj/item/ammo_box/speedloader/a762,
+ /obj/item/ammo_box/speedloader/a762,
+ /obj/item/ammo_box/speedloader/a762,
+ /obj/item/ammo_box/speedloader/a762,
+ /obj/item/ammo_box/speedloader/a762)
cost = 80
containername = "Mosin Nagant rifle crate"
contraband = 1
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index c1e9018c8fa..ba40d92a635 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -24,7 +24,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
uplink_items[I.category] = list()
uplink_items[I.category] += I
- if(I.limited_stock < 0 && !I.cant_discount && I.item && I.cost > 1)
+ if(I.limited_stock < 0 && !I.cant_discount && I.item && I.cost > 5)
sales_items += I
for(var/datum/uplink_item/I in last)
@@ -40,7 +40,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
A.limited_stock = 1
I.refundable = FALSE
A.refundable = FALSE
- if(A.cost >= 20)
+ if(A.cost >= 100)
discount *= 0.5 // If the item costs 20TC or more, it's only 25% off.
A.cost = max(round(A.cost * (1-discount)),1)
A.category = "Discounted Gear"
@@ -171,7 +171,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A grenade that explodes into HONK! brand banana peels that are genetically modified to be extra slippery and extrude caustic acid when stepped on"
reference = "BG"
item = /obj/item/grenade/clown_grenade
- cost = 2
+ cost = 10
job = list("Clown")
/datum/uplink_item/jobspecific/cmag
@@ -179,7 +179,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "The jestographic sequencer, also known as a cmag, is a small card that inverts the access on any door it's used on. Perfect for locking command out of their own departments. Honk!"
reference = "CMG"
item = /obj/item/card/cmag
- cost = 4
+ cost = 20
surplus = 50
job = list("Clown")
@@ -188,7 +188,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A pair of modified clown shoes fitted with an advanced magnetic traction system. Look and sound exactly like regular clown shoes unless closely inspected."
reference = "CM"
item = /obj/item/clothing/shoes/magboots/clown
- cost = 3
+ cost = 15
job = list("Clown")
/datum/uplink_item/jobspecific/acrobatic_shoes
@@ -196,7 +196,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A pair of modified clown shoes are power-up with a special jumping mechanism that works on the honk-space, allowing you to do excellent acrobatic tricks!"
reference = "AS"
item = /obj/item/clothing/shoes/bhop/clown
- cost = 3
+ cost = 15
job = list("Clown")
/datum/uplink_item/jobspecific/trick_revolver
@@ -204,7 +204,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A revolver that will fire backwards and kill whoever attempts to use it. Perfect for those pesky vigilante or just a good laugh."
reference = "CTR"
item = /obj/item/storage/box/syndie_kit/fake_revolver
- cost = 1
+ cost = 5
job = list("Clown")
//Mime
@@ -213,7 +213,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A specialised, one shell shotgun with a built-in cloaking device to mimic a cane. The shotgun is capable of hiding it's contents and the pin alongside being supressed. Comes boxed with 6 specialised shrapnel rounds laced with a silencing toxin and 1 preloaded in the shotgun's chamber."
reference = "MCS"
item = /obj/item/storage/box/syndie_kit/caneshotgun
- cost = 5
+ cost = 25
job = list("Mime")
/datum/uplink_item/jobspecific/mimery
@@ -221,7 +221,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Contains two manuals to teach you advanced Mime skills. You will be able to shoot stunning bullets out of your fingers, and create large walls that can block an entire hallway!"
reference = "AM"
item = /obj/item/storage/box/syndie_kit/mimery
- cost = 6
+ cost = 30
job = list("Mime")
/datum/uplink_item/jobspecific/mimejutsu
@@ -229,7 +229,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An old manual of the martial art of mimes."
reference = "MJ"
item = /obj/item/mimejutsu_scroll
- cost = 8
+ cost = 40
job = list("Mime")
//Miner
@@ -238,7 +238,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. Occupies 35% mod capacity."
reference = "KPM"
item = /obj/item/borg/upgrade/modkit/indoors
- cost = 4 //you need two for full damage, so total of 8 for maximum damage
+ cost = 20 //you need two for full damage, so total of 8 for maximum damage
job = list("Shaft Miner", "Quartermaster")
/datum/uplink_item/jobspecific/mining_charge_hacker
@@ -247,7 +247,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Use it on a mining charge to override its safeties. Reduces explosive power of mining charges due to the modification of their internals."
reference = "MCH"
item = /obj/item/t_scanner/adv_mining_scanner/syndicate
- cost = 4
+ cost = 20
job = list("Shaft Miner", "Quartermaster")
//Chef
@@ -256,7 +256,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A custom sauce made from the highly poisonous fly amanita mushrooms. Anyone who ingests it will take variable toxin damage depending on how long it has been in their system, with a higher dosage taking longer to metabolize."
reference = "CESS"
item = /obj/item/reagent_containers/food/condiment/syndisauce
- cost = 1
+ cost = 5
job = list("Chef")
/datum/uplink_item/jobspecific/meatcleaver
@@ -264,7 +264,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A mean looking meat cleaver that does damage comparable to an Energy Sword but with the added benefit of chopping your victim into hunks of meat after they've died."
reference = "MC"
item = /obj/item/kitchen/knife/butcher/meatcleaver
- cost = 4
+ cost = 20
job = list("Chef")
/datum/uplink_item/jobspecific/syndidonk
@@ -272,7 +272,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A box of highly specialized Donk pockets with a number of regenerative and stimulating chemicals inside of them; the box comes equipped with a self-heating mechanism."
reference = "SDP"
item = /obj/item/storage/box/syndidonkpockets
- cost = 2
+ cost = 10
job = list("Chef")
/datum/uplink_item/jobspecific/CQC_upgrade
@@ -280,7 +280,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Contain special implant for chefs, which destroy safety check their innate CQC implant, allow them to use martial art outside the kitchen. Use in hand."
reference = "CUI"
item = /obj/item/CQC_manual/chef
- cost = 6
+ cost = 30
job = list("Chef")
surplus = 0 //because it's useless for all non-chefs
@@ -289,7 +289,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Contains a set of three sharp metal trays capable of cutting off limbs. "
reference = "DT"
item = /obj/item/storage/box/syndie_kit/dangertray
- cost = 3
+ cost = 15
job = list("Chef")
//Chaplain
@@ -298,7 +298,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A doll created by Syndicate Witch Doctors. Ingredients: Something of the Thread, Something of the Head, Something of the Body, Something of the Dead, Secret Voodoo herbs, and Monosodium glutamate."
reference = "VD"
item = /obj/item/voodoo
- cost = 4
+ cost = 20
job = list("Chaplain")
/datum/uplink_item/jobspecific/missionary_kit
@@ -306,7 +306,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A box containing a missionary staff, missionary robes, and bible. The robes and staff can be linked to allow you to convert victims at range for a short time to do your bidding. The bible is for bible stuff."
reference = "MK"
item = /obj/item/storage/box/syndie_kit/missionary_set
- cost = 15
+ cost = 75
job = list("Chaplain")
/datum/uplink_item/jobspecific/artistic_toolbox
@@ -314,7 +314,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An accursed toolbox that grants its followers extreme power at the cost of requiring repeated sacrifices to it. If sacrifices are not provided, it will turn on its follower."
reference = "HGAT"
item = /obj/item/storage/toolbox/green/memetic
- cost = 20
+ cost = 100
job = list("Chaplain", "Civilian")
surplus = 0 //No lucky chances from the crate; if you get this, this is ALL you're getting
hijack_only = TRUE //This is a murderbone weapon, as such, it should only be available in those scenarios.
@@ -324,7 +324,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An ancient tome written in countless tongues. Despite this fact, you can read this book effortlessly, to learn all the existing languages. Don't ask questions."
reference = "BOB"
item = /obj/item/book_of_babel
- cost = 1
+ cost = 5
job = list("Chaplain", "Librarian")
surplus = 0
cant_discount = TRUE
@@ -335,7 +335,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An Anti-Personnel proximity mine cleverly disguised as a wet floor caution sign that is triggered by running past it, activate it to start the 15 second timer and activate again to disarm."
reference = "PM"
item = /obj/item/caution/proximity_sign
- cost = 3
+ cost = 15
job = list("Janitor")
surplus = 0
@@ -344,7 +344,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Projector that can set up to 5 stun mines with additional EMP effect."
reference = "HM"
item = /obj/item/holosign_creator/janitor/syndie
- cost = 8
+ cost = 40
job = list("Janitor")
surplus = 0
@@ -354,7 +354,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A radiation laser concealed inside of a Health Analyzer. After a moderate delay, causes temporary collapse and radiation. Has adjustable controls, but will not function as a regular health analyzer, only appears like one. May not function correctly on radiation resistant humanoids!"
reference = "RL"
item = /obj/item/rad_laser
- cost = 5
+ cost = 25
job = list("Chief Medical Officer", "Medical Doctor", "Intern", "Geneticist", "Psychiatrist", "Chemist", "Paramedic", "Coroner", "Virologist")
/datum/uplink_item/jobspecific/batterer
@@ -362,15 +362,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A device that has a chance of knocking down people around you for a long amount of time or slowing them down. The user is unaffected. Each charge takes 2 minutes to recharge."
reference = "BTR"
item = /obj/item/batterer
- cost = 10
+ cost = 50
job = list("Chief Medical Officer", "Psychiatrist")
-/datum/uplink_item/jobspecific/genekit
- name = "Genetic Superiority Bundle"
- desc = "A set of injectors containing extremely powerful mutations brought to you by recently established Syndicate research station. This set is designed for teamwork"
+/datum/uplink_item/jobspecific/dna_upgrader
+ name = "Genetic Superiority Injector"
+ desc = "Experemental DNA injector whick will give you one advanced gene modification and increase your gene stability."
reference = "GS"
- item = /obj/item/storage/box/syndie_kit/genes
- cost = 15
+ item = /obj/item/dna_upgrader
+ cost = 75
job = list("Chief Medical Officer", "Geneticist")
surplus = 0
@@ -380,7 +380,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A modified hypospray disguised as a functional pipette. The pipette can infect victims with viruses upon injection."
reference = "VI"
item = /obj/item/reagent_containers/dropper/precision/viral_injector
- cost = 3
+ cost = 15
job = list("Virologist")
/datum/uplink_item/jobspecific/cat_grenade
@@ -388,7 +388,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "The feral cat delivery grenade contains 5 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight."
item = /obj/item/grenade/spawnergrenade/feral_cats
reference = "CCLG"
- cost = 2
+ cost = 10
job = list("Psychiatrist")//why? Becuase its funny that a person in charge of your mental wellbeing has a cat granade..
/datum/uplink_item/jobspecific/gbs
@@ -396,7 +396,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A bottle containing Gravitokinetic Bipotential SADS culture. Also known as GBS, extremely deadly virus."
reference = "GBS"
item = /obj/item/reagent_containers/glass/bottle/gbs
- cost = 12
+ cost = 60
job = list("Virologist")
surplus = 0
hijack_only = TRUE
@@ -407,7 +407,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A pair of sleek gloves to aid in pickpocketing. While wearing these, you can loot your target without them knowing. Pickpocketing puts the item directly into your hand."
reference = "PG"
item = /obj/item/clothing/gloves/color/black/thief
- cost = 6
+ cost = 30
job = list("Civilian")
/datum/uplink_item/jobspecific/lockermech
@@ -415,7 +415,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A massive and incredibly deadly Syndicate exosuit(Not realy)."
reference = "SLM"
item = /obj/mecha/combat/lockersyndie/loaded
- cost = 6
+ cost = 30
job = list("Civilian", "Roboticist")
surplus = 0
@@ -424,7 +424,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A pair of sturdy shock gloves with insulated layer. Protects user from electric shock and allows to shock enemies."
reference = "SG"
item = /obj/item/storage/box/syndie_kit/stungloves
- cost = 2
+ cost = 10
job = list("Civilian", "Mechanic", "Station Engineer", "Trainee Engineer", "Chief Engineer")
//Bartender
@@ -433,7 +433,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A box containing 6 shotgun shells that simulate the effects of extreme drunkenness on the target, more effective for each type of alcohol in the target's system."
reference = "BSS"
item = /obj/item/storage/belt/bandolier/booze
- cost = 3
+ cost = 15
job = list("Bartender")
//Barber
@@ -442,7 +442,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A pair of scissors that are anything but what their name implies; can easily cut right into someone's throat."
reference = "CTS"
item = /obj/item/scissors/safety
- cost = 2
+ cost = 10
job = list("Barber")
//Botanist
@@ -451,7 +451,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A seemingly innocent briefcase full of not-so-innocent Syndicate-bred bees. Inject the case with blood to train the bees to ignore the donor(s). It also wirelessly taps into station intercomms to broadcast a message of TERROR."
reference = "BEE"
item = /obj/item/bee_briefcase
- cost = 6
+ cost = 30
job = list("Botanist")
//Engineer
@@ -460,7 +460,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Insulated gloves that can utilize the power of the station to deliver a short arc of electricity at a target. Must be standing on a powered cable to use."
reference = "PG"
item = /obj/item/clothing/gloves/color/yellow/power
- cost = 8
+ cost = 40
job = list("Station Engineer", "Trainee Engineer", "Chief Engineer")
/datum/uplink_item/jobspecific/supertoolbox
@@ -468,7 +468,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Ultimate version of all toolboxes, this one more robust and more useful than his cheaper version. Comes with experimental type tools, combat gloves and cool sunglasses."
item = /obj/item/storage/toolbox/syndisuper
reference = "CSSTB"
- cost = 2
+ cost = 10
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
job = list("Station Engineer", "Trainee Engineer", "Chief Engineer", "Mechanic", "Roboticist", "Paramedic")
@@ -478,7 +478,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An extremely high-tech energy gun that utilizes bluespace technology to teleport away living targets. Select the target beacon on the telegun itself; projectiles will send targets to the beacon locked onto."
reference = "TG"
item = /obj/item/gun/energy/telegun
- cost = 12
+ cost = 60
job = list("Research Director")
//Roboticist
@@ -487,7 +487,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A syndicate developed man-machine-interface which will make any cyborg it is inserted into follow the standard syndicate lawset."
reference = "SMMI"
item = /obj/item/mmi/syndie
- cost = 2
+ cost = 10
job = list("Roboticist")
surplus = 0
@@ -497,7 +497,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A seemingly innocent die, those who are not afraid to roll for attack will find it's effects quite explosive. Has a four second timer."
reference = "ETW"
item = /obj/item/dice/d20/e20
- cost = 3
+ cost = 15
job = list("Librarian")
surplus = 0
hijack_only = TRUE
@@ -507,7 +507,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Everything or nothing; that is my motto."
reference = "DOF"
item = /obj/item/dice/d20/fate/one_use
- cost = 20
+ cost = 100
job = list("Librarian")
surplus = 0
cant_discount = TRUE
@@ -518,7 +518,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Part of the notorious Ambrosia family, this species is nearly indistinguishable from Ambrosia Vulgaris- but its' branches contain a revolting toxin. Eight units are enough to drive victims insane."
reference = "BRO"
item = /obj/item/seeds/ambrosia/cruciatus
- cost = 1
+ cost = 5
job = list("Botanist")
//Atmos Tech
@@ -527,7 +527,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A highly flexible jumpsuit that will help you navigate the ventilation loops of the station internally. Comes with pockets and ID slot, but can't be used without stripping off most gear, including backpack, belt, helmet, and exosuit. Free hands are also necessary to crawl around inside."
reference = "AIRJ"
item = /obj/item/clothing/under/contortionist
- cost = 10
+ cost = 50
job = list("Life Support Specialist", "Chief Engineer")
/datum/uplink_item/jobspecific/energizedfireaxe
@@ -535,7 +535,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A fire axe with a massive energy charge built into it. Upon striking someone while charged it will throw them backwards while stunning them briefly, but will take some time to charge up again. It is also much sharper than a regular axe and can pierce light armor."
reference = "EFA"
item = /obj/item/twohanded/fireaxe/energized
- cost = 4
+ cost = 20
job = list("Life Support Specialist", "Chief Engineer")
//CE
@@ -544,7 +544,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Special RCD capable to destroy reinforced walls and have 500 matter units instead of 100."
reference = "SRCD"
item = /obj/item/rcd/combat
- cost = 5
+ cost = 25
job = list("Station Engineer", "Trainee Engineer", "Mechanic", "Life Support Specialist", "Chief Engineer")
surplus = 0
@@ -555,7 +555,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "The Syndicate will ship a bottle containing 40 units of a randomly selected poison. The poison can range from highly irritating to incredibly lethal."
reference = "TPB"
item = /obj/item/reagent_containers/glass/bottle/traitor
- cost = 2
+ cost = 10
job = list("Research Director", "Chief Medical Officer", "Medical Doctor", "Intern", "Psychiatrist", "Chemist", "Paramedic", "Virologist", "Bartender", "Chef")
// Paper contact poison pen
@@ -565,7 +565,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Cutting edge of deadly writing implements technology, this gadget will infuse any piece of paper with delayed contact poison."
reference = "PP"
item = /obj/item/pen/poison
- cost = 1
+ cost = 5
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
job = list("Head of Personnel", "Quartermaster", "Cargo Technician", "Librarian")
@@ -585,7 +585,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Advanced data storage designed to be compatible with positronic systems.This one include melee algorithms along with overwritten microbattery safety protocols."
reference = "ICU"
item = /obj/item/ipc_combat_upgrade
- cost = 3
+ cost = 15
race = list("Machine")
/datum/uplink_item/racial/supercharge
@@ -593,7 +593,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An implant injected into the body, and later activated manually to inject a chemical cocktail, which has the effect of removing and reducing the time of all stuns and increasing movement speed. Can be activated up to 3 times."
reference = "SSI"
item = /obj/item/implanter/supercharge
- cost = 8
+ cost = 40
race = list("Machine")
@@ -604,7 +604,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "The result of the work of scientists on mixing an experimental stable mutagen with the core of a pyroclastic anomaly. Gives the user the opportunity to become a slime and heat himself up."
reference = "AEXT"
item = /obj/item/anomaly_extract
- cost = 10
+ cost = 50
race = list("Slime People")
//Plasmaman
@@ -615,7 +615,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Due to budget cuts, the shoes don't provide protection against slipping. The set comes with a complementary chameleon stamp. Only for Plasmamen."
reference = "PCK"
item = /obj/item/storage/box/syndie_kit/plasma_chameleon
- cost = 4
+ cost = 20
race = list("Plasmaman")
// DANGEROUS WEAPONS
@@ -628,7 +628,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A modern, burst firing, mag-fed combat shotgun, that uses 12g ammo. Holds a 12/24 round drums, perfect for cleaning out crowds of people in narrow corridors. Welcome to the Minotaur's labyrinth!"
reference = "AS12"
item = /obj/item/gun/projectile/automatic/shotgun/minotaur
- cost = 16
+ cost = 80
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 0
@@ -637,14 +637,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
reference = "SPI"
desc = "A small, easily concealable handgun that uses 10mm auto rounds in 8-round magazines and is compatible with suppressors."
item = /obj/item/gun/projectile/automatic/pistol
- cost = 4
+ cost = 20
/datum/uplink_item/dangerous/revolver
name = "Syndicate .357 Revolver"
reference = "SR"
desc = "A brutally simple syndicate revolver that fires .357 Magnum cartridges and has 7 chambers."
item = /obj/item/gun/projectile/revolver
- cost = 10
+ cost = 50
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 50
@@ -653,7 +653,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
reference = "DEA"
desc = "A legendary high power pistol that uses 7 rounds .50AE magazines."
item = /obj/item/gun/projectile/automatic/pistol/deagle
- cost = 10
+ cost = 50
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/dangerous/uzi
@@ -661,7 +661,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
reference = "UZ"
desc = "A fully-loaded lightweight blowback-operated submachine gun that uses 30-rounds 9mm magazines."
item = /obj/item/gun/projectile/automatic/mini_uzi
- cost = 12
+ cost = 60
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/dangerous/smg
@@ -669,7 +669,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
reference = "SMG"
desc = "A fully-loaded Scarborough Arms bullpup submachine gun that fires .45 rounds with a 20-round magazine and is compatible with suppressors."
item = /obj/item/gun/projectile/automatic/c20r
- cost = 14
+ cost = 70
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 40
@@ -678,7 +678,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A fully-loaded three-round burst carbine that uses 30-round 5.56mm magazines with a togglable underslung 40mm grenade launcher."
reference = "AR"
item = /obj/item/gun/projectile/automatic/m90
- cost = 16
+ cost = 80
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 50
@@ -687,7 +687,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A fully-loaded Aussec Armory belt-fed machine gun. This deadly weapon has a massive 50-round magazine of devastating 7.62x51mm ammunition."
reference = "LMG"
item = /obj/item/gun/projectile/automatic/l6_saw
- cost = 35
+ cost = 175
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 0
@@ -696,14 +696,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "These gloves let the user punch people very fast. Does not improve weapon attack speed."
reference = "RPGD"
item = /obj/item/clothing/gloves/fingerless/rapid
- cost = 4
+ cost = 20
/datum/uplink_item/dangerous/sniper
name = "Sniper Rifle"
desc = "Ranged fury, Syndicate style. guaranteed to cause shock and awe or your TC back!"
reference = "SSR"
item = /obj/item/gun/projectile/automatic/sniper_rifle/syndicate
- cost = 20
+ cost = 100
surplus = 25
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
@@ -712,7 +712,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A compact, unscoped version of the operative sniper rifle. Packs a powerful punch, but ammo is limited."
reference = "CSR"
item = /obj/item/gun/projectile/automatic/sniper_rifle/compact
- cost = 8
+ cost = 40
surplus = 0
cant_discount = TRUE
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
@@ -722,7 +722,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A miniature energy crossbow that is small enough both to fit into a pocket and to slip into a backpack unnoticed by observers. Fires bolts tipped with toxin, a poisonous substance that is the product of a living organism. Stuns enemies for a short period of time. Recharges automatically."
reference = "EC"
item = /obj/item/gun/energy/kinetic_accelerator/crossbow
- cost = 9
+ cost = 45
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 50
@@ -731,7 +731,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A flamethrower, fuelled by a portion of highly flammable bio-toxins stolen previously from Nanotrasen stations. Make a statement by roasting the filth in their own greed. Use with caution."
reference = "FT"
item = /obj/item/flamethrower/full/tank
- cost = 4
+ cost = 20
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 40
@@ -740,7 +740,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be pocketed when inactive. Activating it produces a loud, distinctive noise."
reference = "ES"
item = /obj/item/melee/energy/sword/saber
- cost = 8
+ cost = 40
/datum/uplink_item/dangerous/powerfist
name = "Power Fist"
@@ -750,21 +750,21 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
deal extra damage and hit targets further. Use a screwdriver to take out any attached tanks."
reference = "PF"
item = /obj/item/melee/powerfist
- cost = 4
+ cost = 20
/datum/uplink_item/dangerous/chainsaw
name = "Chainsaw"
desc = "A high powered chainsaw for cutting up ...you know...."
reference = "CH"
item = /obj/item/twohanded/chainsaw
- cost = 12
+ cost = 60
/datum/uplink_item/dangerous/commando_kit
name = "Commandos knife operation kit"
desc = "A box that smells like a mix of gunpowder, napalm and cheap whiskey. Contains everything you need to survive in such places."
reference = "CK"
item = /obj/item/storage/box/syndie_kit/commando_kit
- cost = 7
+ cost = 35
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
// SUPPORT AND MECHAS
@@ -780,21 +780,21 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
This model lacks a method of space propulsion, and therefore it is advised to repair the mothership's teleporter if you wish to make use of it."
reference = "GE"
item = /obj/mecha/combat/gygax/dark/loaded
- cost = 80
+ cost = 400
/datum/uplink_item/support/rover
name = "Rover Exosuit"
desc = "A syndicate version of durand designed for teamwork. Has an abillity to create a forcewalls that only syndicate members can pass through."
reference = "RV"
item = /obj/mecha/combat/durand/rover/loaded
- cost = 100
+ cost = 500
/datum/uplink_item/support/mauler
name = "Mauler Exosuit"
desc = "A massive and incredibly deadly Syndicate exosuit. Features long-range targeting, thrust vectoring, and deployable smoke."
reference = "ME"
item = /obj/mecha/combat/marauder/mauler/loaded
- cost = 140
+ cost = 700
/datum/uplink_item/support/reinforcement
name = "Reinforcement"
@@ -803,7 +803,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
reference = "REINF"
item = /obj/item/antag_spawner/nuke_ops
refund_path = /obj/item/antag_spawner/nuke_ops
- cost = 20
+ cost = 100
refundable = TRUE
cant_discount = TRUE
@@ -814,7 +814,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
reference = "SAC"
item = /obj/item/antag_spawner/nuke_ops/borg_tele/assault
refund_path = /obj/item/antag_spawner/nuke_ops/borg_tele/assault
- cost = 65
+ cost = 325
/datum/uplink_item/support/reinforcement/medical_borg
name = "Syndicate Medical Cyborg"
@@ -824,7 +824,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
reference = "SMC"
item = /obj/item/antag_spawner/nuke_ops/borg_tele/medical
refund_path = /obj/item/antag_spawner/nuke_ops/borg_tele/medical
- cost = 35
+ cost = 175
/datum/uplink_item/support/reinforcement/saboteur_borg
name = "Syndicate Saboteur Cyborg"
@@ -839,7 +839,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade rounds with a 20-round magazine."
reference = "FSMG"
item = /obj/item/gun/projectile/automatic/c20r/toy
- cost = 5
+ cost = 20
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 0
@@ -848,7 +848,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A fully-loaded Donksoft belt-fed machine gun. This weapon has a massive 50-round magazine of devastating riot grade darts, that can briefly incapacitate someone in just one volley."
reference = "FLMG"
item = /obj/item/gun/projectile/automatic/l6_saw/toy
- cost = 10
+ cost = 50
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 0
@@ -859,7 +859,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
The holoparasites are unable to incoporate themselves to changeling and vampire agents."
item = /obj/item/storage/box/syndie_kit/guardian
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
- cost = 14
+ cost = 70
refund_path = /obj/item/guardiancreator/tech/choose
refundable = TRUE
cant_discount = TRUE
@@ -875,35 +875,35 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A 2 additional 8-round 10mm magazines for use in the syndicate pistol, loaded with rounds that are cheap but around half as effective as .357"
reference = "10MM"
item = /obj/item/storage/box/syndie_kit/pistol_ammo
- cost = 1
+ cost = 5
/datum/uplink_item/ammo/pistolap
name = "Stechkin - 10mm Armour Piercing Magazine"
desc = "An additional 8-round 10mm magazine for use in the syndicate pistol, loaded with rounds that are less effective at injuring the target but penetrate protective gear."
reference = "10MMAP"
item = /obj/item/ammo_box/magazine/m10mm/ap
- cost = 1
+ cost = 5
/datum/uplink_item/ammo/pistolfire
name = "Stechkin - 10mm Incendiary Magazine"
desc = "An additional 8-round 10mm magazine for use in the syndicate pistol, loaded with incendiary rounds which ignite the target."
reference = "10MMFIRE"
item = /obj/item/ammo_box/magazine/m10mm/fire
- cost = 1
+ cost = 5
/datum/uplink_item/ammo/pistolhp
name = "Stechkin - 10mm Hollow Point Magazine"
desc = "An additional 8-round 10mm magazine for use in the syndicate pistol, loaded with rounds which are more damaging but ineffective against armour."
reference = "10MMHP"
item = /obj/item/ammo_box/magazine/m10mm/hp
- cost = 1
+ cost = 5
/datum/uplink_item/ammo/bullbuck
name = "Drum - 12g Buckshot"
desc = "An additional 12-round buckshot magazine for use in the auto shotguns. Front towards enemy."
reference = "12BS"
item = /obj/item/ammo_box/magazine/m12g
- cost = 2
+ cost = 10
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/bulldragon
@@ -911,7 +911,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An alternative 12-round dragon's breath magazine for use in the auto shotguns. I'm a fire starter, twisted fire starter!"
reference = "12DB"
item = /obj/item/ammo_box/magazine/m12g/dragon
- cost = 2
+ cost = 10
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/bullflechette
@@ -919,7 +919,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An additional 12-round flechette magazine for use in the auto shotguns. Works well against armour."
reference = "12FL"
item = /obj/item/ammo_box/magazine/m12g/flechette
- cost = 2
+ cost = 10
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/bullterror
@@ -927,7 +927,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An alternative 12-round bioterror magazine for use in the auto shotguns. Extremely toxic!"
reference = "12BT"
item = /obj/item/ammo_box/magazine/m12g/bioterror
- cost = 3
+ cost = 15
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/bullmeteor
@@ -935,7 +935,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An alternative 12-round breaching magazine for use in the auto shotguns. This ammo should be illegal!"
reference = "12BRE"
item = /obj/item/ammo_box/magazine/m12g/breach
- cost = 5
+ cost = 25
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/bull_XLbuck
@@ -943,7 +943,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An additional 24-round buckshot magazine for use in the auto shotguns. Front towards enemy."
reference = "12BSXL"
item = /obj/item/ammo_box/magazine/m12g/XtrLrg
- cost = 4
+ cost = 20
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/bull_XLflechette
@@ -951,7 +951,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An additional 24-round flechette magazine for use in the auto shotguns. Works well against armour."
reference = "12FLXL"
item = /obj/item/ammo_box/magazine/m12g/XtrLrg/flechette
- cost = 4
+ cost = 20
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/bull_XLdragon
@@ -959,7 +959,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An additional 24-round dragon's breath magazine for use in the auto shotguns. I'm a fire starter, twisted fire starter!"
reference = "12DBXL"
item = /obj/item/ammo_box/magazine/m12g/XtrLrg/dragon
- cost = 4
+ cost = 20
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/bulldog_ammobag
@@ -967,7 +967,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A duffel bag filled with enough 12g ammo to supply an entire team, at a discounted price."
reference = "12ADB"
item = /obj/item/storage/backpack/duffel/syndie/ammo/shotgun
- cost = 12 // normally 18
+ cost = 60 // normally 90
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/bulldog_XLmagsbag
@@ -975,7 +975,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A duffel bag containing three 24 round drum magazines(Buckshot, Flechette, Dragon's Breath)."
reference = "12XLDB"
item = /obj/item/storage/backpack/duffel/syndie/ammo/shotgunXLmags
- cost = 9 // normally 18
+ cost = 45 // normally 90
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/uzi
@@ -983,7 +983,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An additional 30 round 9mm magazine for use in Type-U3 Uzi."
reference = "UZA"
item = /obj/item/ammo_box/magazine/uzim9mm
- cost = 2
+ cost = 10
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/uzi_ammobag
@@ -991,7 +991,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A duffel bag filled with enough 9mm ammo to supply an entire gang. Groove street forever."
reference = "UZADB"
item = /obj/item/storage/backpack/duffel/syndie/ammo/uzi
- cost = 14 // normally 20
+ cost = 70 // normally 100
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/smg
@@ -999,7 +999,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An additional 20-round .45 magazine for use in the C-20r submachine gun. These bullets pack a lot of punch that can knock most targets down, but do limited overall damage."
reference = "45"
item = /obj/item/ammo_box/magazine/smgm45
- cost = 2
+ cost = 10
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/smg_ammobag
@@ -1007,7 +1007,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A duffel bag filled with enough .45 ammo to supply an entire team, at a discounted price."
reference = "45ADB"
item = /obj/item/storage/backpack/duffel/syndie/ammo/smg
- cost = 14 // normally 20
+ cost = 70 // normally 100
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/carbine
@@ -1015,7 +1015,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An additional 30-round 5.56 magazine for use in the M-90gl carbine. These bullets don't have the punch to knock most targets down, but dish out higher overall damage."
reference = "556"
item = /obj/item/ammo_box/magazine/m556
- cost = 2
+ cost = 10
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/a40mm
@@ -1023,7 +1023,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A box of 4 additional 40mm HE grenades for use the C-90gl's underbarrel grenade launcher. Your teammates will thank you to not shoot these down small hallways."
reference = "40MM"
item = /obj/item/ammo_box/a40mm
- cost = 4
+ cost = 20
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/carbine_ammobag
@@ -1031,7 +1031,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A duffel bag filled with 9 5.56 Toploader magazines, and a 40 mm Grenade Ammo Box. Pew pew."
reference = "556ADB"
item = /obj/item/storage/backpack/duffel/syndie/ammo/carbine
- cost = 18 // normally 24
+ cost = 90 // normally 120
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/machinegun
@@ -1039,7 +1039,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A 50-round magazine of 5.56x45mm ammunition for use in the L6 SAW machine gun. By the time you need to use this, you'll already be on a pile of corpses."
reference = "762"
item = /obj/item/ammo_box/magazine/mm556x45
- cost = 10
+ cost = 50
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 0
@@ -1048,11 +1048,11 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A Duffel Bag filled with 5 mm556x45 box magazines. Remember, no Russian."
reference = "762ADB"
item = /obj/item/storage/backpack/duffel/syndie/ammo/lmg
- cost = 40 // normally 50
+ cost = 200 // normally 250
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/sniper
- cost = 5
+ cost = 20
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/sniper/basic
@@ -1060,21 +1060,21 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An additional standard 5-round magazine for use with .50 sniper rifles."
reference = "50M"
item = /obj/item/ammo_box/magazine/sniper_rounds
- cost = 5
+ cost = 20
/datum/uplink_item/ammo/sniper/soporific
name = "Sniper - .50 Soporific Magazine"
desc = "A 3-round magazine of soporific ammo designed for use with .50 sniper rifles. Put your enemies to sleep today!"
reference = "50S"
item = /obj/item/ammo_box/magazine/sniper_rounds/soporific
- cost = 3
+ cost = 15
/datum/uplink_item/ammo/sniper/explosive
name = "Sniper - .50 Explosive Magazine"
desc = "A 5-round magazine of explosive ammo designed for use with .50 sniper rifles. Human rights? What?"
reference = "50HE"
item = /obj/item/ammo_box/magazine/sniper_rounds/explosive
- cost = 6
+ cost = 30
/datum/uplink_item/ammo/sniper/penetrator
name = "Sniper - .50 Penetrator Magazine"
@@ -1082,14 +1082,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Can pierce walls and multiple enemies."
reference = "50P"
item = /obj/item/ammo_box/magazine/sniper_rounds/penetrator
- cost = 5
+ cost = 25
/datum/uplink_item/ammo/bioterror
name = "Box of Bioterror Syringes"
desc = "A box full of preloaded syringes, containing various chemicals that seize up the victim's motor and broca system , making it impossible for them to move or speak while in their system."
reference = "BTS"
item = /obj/item/storage/box/syndie_kit/bioterror
- cost = 5
+ cost = 25
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/toydarts
@@ -1097,7 +1097,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A box of 40 Donksoft foam riot darts, for reloading any compatible foam dart gun. Don't forget to share!"
reference = "FOAM"
item = /obj/item/ammo_box/foambox/riot
- cost = 2
+ cost = 10
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 0
@@ -1106,7 +1106,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A box of 50. cal sniper ammo."
reference = "50L"
item = /obj/item/ammo_box/magazine/sniper_rounds/compact
- cost = 2
+ cost = 10
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/revolver
@@ -1114,7 +1114,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A box with 2 speed loaders that contains fourteen additional .357 Magnum rounds for the syndicate revolver. For when you really need a lot of things dead."
reference = "357"
item = /obj/item/storage/box/syndie_kit/revolver_ammo
- cost = 1
+ cost = 5
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/deagle
@@ -1122,7 +1122,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A magazine that contains seven additional .50AE round for Desert Eagle. Kill them all."
reference = ".50AE"
item = /obj/item/ammo_box/magazine/m50
- cost = 1
+ cost = 5
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/rocketHE
@@ -1130,7 +1130,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A rocket from a rocketlauncher. This one deals a devastating explosion, enough to tear the station and civillian apart."
reference = "RHE"
item = /obj/item/ammo_casing/caseless/rocket
- cost = 8
+ cost = 40
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/rocketHEDP
@@ -1138,7 +1138,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A rocket from a rocketlauncher. This one emits shrapnel and incendiary ammunition. The rocket itself is strong enough to destroy station mechs and robots with one shot."
reference = "RHEDP"
item = /obj/item/ammo_casing/caseless/rocket/hedp
- cost = 6
+ cost = 30
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/ammo/knives_kit
@@ -1146,7 +1146,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A box containing 7 throwing knives"
reference = "THR"
item = /obj/item/storage/box/syndie_kit/knives_kit
- cost = 1
+ cost = 5
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
// STEALTHY WEAPONS
@@ -1160,7 +1160,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
will instantly put them in your grasp and silence them, as well as causing rapid suffocation. Does not work on those who do not need to breathe."
reference = "GAR"
item = /obj/item/twohanded/garrote
- cost = 4
+ cost = 20
/datum/uplink_item/stealthy_weapons/martialarts
name = "Martial Arts Scroll"
@@ -1169,7 +1169,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Unable to be understood by vampire and changeling agents."
reference = "SCS"
item = /obj/item/sleeping_carp_scroll
- cost = 13
+ cost = 65
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
refundable = TRUE
@@ -1180,7 +1180,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A manual that teaches a single user tactical Close-Quarters Combat before self-destructing. Does not restrict weapon usage, but cannot be used alongside Gloves of the North Star."
reference = "CQC"
item = /obj/item/CQC_manual
- cost = 10
+ cost = 50
cant_discount = TRUE
/datum/uplink_item/stealthy_weapons/mr_chang
@@ -1188,7 +1188,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "This package was kindly provided to us by Mr. Cheng's corporation. It contains a wide range of implements for the most effective promotion of products in a free market environment."
reference = "MRCH"
item = /obj/item/storage/box/syndie_kit/mr_chang_technique
- cost = 3
+ cost = 15
cant_discount = FALSE
/datum/uplink_item/stealthy_weapons/cameraflash
@@ -1198,7 +1198,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Useful for stunning borgs and individuals without eye protection or blinding a crowd for a get away."
reference = "CF"
item = /obj/item/flash/cameraflash
- cost = 2
+ cost = 10
/datum/uplink_item/stealthy_weapons/throwingweapons
name = "Box of Throwing Weapons"
@@ -1206,21 +1206,21 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
throwing weapons. The bolas can knock a target down and the shurikens will embed into limbs."
reference = "STK"
item = /obj/item/storage/box/syndie_kit/throwing_weapons
- cost = 1
+ cost = 5
/datum/uplink_item/stealthy_weapons/edagger
name = "Energy Dagger"
desc = "A dagger made of energy that looks and functions as a pen when off."
reference = "EDP"
item = /obj/item/pen/edagger
- cost = 2
+ cost = 10
/datum/uplink_item/stealthy_weapons/sleepy_pen
name = "Sleepy Pen"
desc = "A syringe disguised as a functional pen. It's filled with a potent anaesthetic. \ The pen holds two doses of the mixture. The pen can be refilled."
reference = "SP"
item = /obj/item/pen/sleepy
- cost = 8
+ cost = 40
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/stealthy_weapons/foampistol
@@ -1228,7 +1228,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An innocent looking toy pistol designed to fire foam darts. Comes loaded with riot grade darts, to incapacitate a target."
reference = "FSPI"
item = /obj/item/gun/projectile/automatic/toy/pistol/riot
- cost = 3
+ cost = 15
surplus = 10
/datum/uplink_item/stealthy_weapons/false_briefcase
@@ -1236,14 +1236,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A modified briefcase capable of storing and firing a gun under a false bottom. Use a screwdriver to pry away the false bottom and make modifications. Distinguishable upon close examination due to the added weight."
reference = "FBBC"
item = /obj/item/storage/briefcase/false_bottomed
- cost = 2
+ cost = 10
/datum/uplink_item/stealthy_weapons/soap
name = "Syndicate Soap"
desc = "A sinister-looking surfactant used to clean blood stains to hide murders and prevent DNA analysis. You can also drop it underfoot to slip people."
reference = "SOAP"
item = /obj/item/soap/syndie
- cost = 1
+ cost = 5
surplus = 50
/datum/uplink_item/stealthy_weapons/dart_pistol
@@ -1251,7 +1251,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A miniaturized version of a normal syringe gun. It is very quiet when fired and can fit into any space a small item can. Comes with 3 syringes, a knockout poison, a silencing agent and a deadly neurotoxin."
reference = "DART"
item = /obj/item/storage/box/syndie_kit/dart_gun
- cost = 4
+ cost = 20
surplus = 50
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
@@ -1260,7 +1260,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A rapid syringe gun able to hold six shot and fire them rapidly. Great together with the bioterror syringe"
reference = "RSG"
item = /obj/item/gun/syringe/rapidsyringe
- cost = 4
+ cost = 20
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/stealthy_weapons/silencer
@@ -1268,7 +1268,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Fitted for use on any small caliber weapon with a threaded barrel, this suppressor will silence the shots of the weapon for increased stealth and superior ambushing capability."
reference = "US"
item = /obj/item/suppressor
- cost = 1
+ cost = 5
surplus = 10
/datum/uplink_item/stealthy_weapons/dehy_carp
@@ -1276,7 +1276,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Just add water to make your very own hostile to everything space carp. It looks just like a plushie. The first person to squeeze it will be registered as its owner, who it will not attack. If no owner is registered, it'll just attack everyone."
reference = "DSC"
item = /obj/item/toy/carpplushie/dehy_carp
- cost = 2
+ cost = 10
// GRENADES AND EXPLOSIVES
@@ -1288,21 +1288,21 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls or connect an assembly to its wiring to make it remotely detonable. It has a modifiable timer with a minimum setting of 10 seconds."
reference = "C4"
item = /obj/item/grenade/plastic/c4
- cost = 1
+ cost = 5
/datum/uplink_item/explosives/plastic_explosives_pack
name = "Pack of 5 C-4 Explosives"
desc = "A package containing 5 C-4 Explosives at a discounted price. For when you need that little bit extra for your sabotaging needs."
reference = "C4P"
item = /obj/item/storage/box/syndie_kit/c4
- cost = 4
+ cost = 20
/datum/uplink_item/explosives/c4bag
name = "Bag of C-4 explosives"
desc = "Because sometimes quantity is quality. Contains 10 C-4 plastic explosives."
reference = "C4B"
item = /obj/item/storage/backpack/duffel/syndie/c4
- cost = 8 //20% discount!
+ cost = 40 //20% discount!
cant_discount = TRUE
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
@@ -1311,7 +1311,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "X-4 is a shaped charge designed to be safe to the user while causing maximum damage to the occupants of the room beach breached. It has a modifiable timer with a minimum setting of 10 seconds."
reference = "X4"
item = /obj/item/grenade/plastic/x4
- cost = 2
+ cost = 10
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/explosives/x4bag
@@ -1321,7 +1321,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
For when you want a controlled explosion that leaves a wider, deeper, hole."
reference = "X4B"
item = /obj/item/storage/backpack/duffel/syndie/x4
- cost = 4
+ cost = 20
cant_discount = TRUE
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
@@ -1330,7 +1330,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Thermite-charged breaching explosive. Effective to destroy wall, but not to destroy airlocks."
reference = "T4"
item = /obj/item/grenade/plastic/x4/thermite
- cost = 2
+ cost = 10
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/explosives/t4_pack
@@ -1338,7 +1338,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A package containing 3 T-4."
reference = "T4P"
item = /obj/item/storage/box/syndie_kit/t4P
- cost = 5
+ cost = 20
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/explosives/syndicate_bomb
@@ -1347,7 +1347,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb."
reference = "SB"
item = /obj/item/radio/beacon/syndicate/bomb
- cost = 8
+ cost = 40
surplus = 0
cant_discount = TRUE
hijack_only = TRUE
@@ -1356,7 +1356,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/explosives/syndicate_bomb/nuke
reference = "SB"
item = /obj/item/radio/beacon/syndicate/bomb
- cost = 11
+ cost = 55
excludefrom = list()
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
hijack_only = FALSE
@@ -1367,7 +1367,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb."
reference = "SBEMP"
item = /obj/item/radio/beacon/syndicate/bomb/emp
- cost = 8
+ cost = 40
surplus = 0
cant_discount = TRUE
hijack_only = TRUE
@@ -1376,7 +1376,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/explosives/emp_bomb/nuke
reference = "SBEMP"
item = /obj/item/radio/beacon/syndicate/bomb/emp
- cost = 10
+ cost = 50
excludefrom = list()
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
hijack_only = FALSE
@@ -1387,14 +1387,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "The minibomb is a grenade with a five-second fuse."
reference = "SMB"
item = /obj/item/grenade/syndieminibomb
- cost = 6
+ cost = 30
/datum/uplink_item/explosives/rocketlauncher
name = "84mm Rocket Propelled Grenade Launcher"
desc = "A reusable rocket propelled grenade launcher preloaded with a low-yield 84mm HE round. Guaranteed to send your target out with a bang or your money back!"
reference = "PML9"
item = /obj/item/gun/projectile/revolver/rocketlauncher
- cost = 10
+ cost = 50
surplus = 0 // no way
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
@@ -1403,7 +1403,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A belt full of rockets for a rocket propelled grenade launcher. Guaranteed to eliminate most of your targets. Just don't blow up your mates!"
reference = "PMLB"
item = /obj/item/storage/belt/rocketman
- cost = 35
+ cost = 175
surplus = 0
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
@@ -1412,14 +1412,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "When inserted into a personal digital assistant, this cartridge gives you five opportunities to detonate PDAs of crewmembers who have their message feature enabled. The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer. It has a chance to detonate your PDA."
reference = "DEPC"
item = /obj/item/cartridge/syndicate
- cost = 6
+ cost = 30
/datum/uplink_item/explosives/pizza_bomb
name = "Pizza Bomb"
desc = "A pizza box with a bomb taped inside of it. The timer needs to be set by opening the box; afterwards, opening the box again will trigger the detonation."
reference = "PB"
item = /obj/item/pizza_bomb
- cost = 3
+ cost = 15
surplus = 80
/datum/uplink_item/explosives/fraggrenade
@@ -1427,13 +1427,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
reference = "FRAG"
desc = "A belt containing 4 lethally dangerous and destructive grenades."
item = /obj/item/storage/belt/grenade/frag
- cost = 4
+ cost = 20
/datum/uplink_item/explosives/grenadier
name = "Grenadier's belt"
desc = "A belt containing 26 lethally dangerous and destructive grenades."
item = /obj/item/storage/belt/grenade/full
- cost = 25
+ cost = 125
surplus = 0
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
@@ -1442,7 +1442,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A unique grenade that deploys a swarm of viscerators upon activation, which will chase down and shred any non-operatives in the area."
reference = "VDG"
item = /obj/item/grenade/spawnergrenade/manhacks
- cost = 6
+ cost = 30
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 35
@@ -1451,7 +1451,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A box of two (2) grenades that spread knockout gas over a large area. Equip internals before using one of these."
reference = "ANG"
item = /obj/item/storage/box/syndie_kit/atmosn2ogrenades
- cost = 4
+ cost = 20
/datum/uplink_item/explosives/atmosfiregrenades
name = "Plasma Fire Grenades"
@@ -1459,7 +1459,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
reference = "APG"
item = /obj/item/storage/box/syndie_kit/atmosfiregrenades
hijack_only = TRUE
- cost = 10
+ cost = 50
surplus = 0
cant_discount = TRUE
@@ -1469,7 +1469,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
security's energy weapons, and silicon lifeforms when you're in a tight spot."
reference = "EMPK"
item = /obj/item/storage/box/syndie_kit/emp
- cost = 2
+ cost = 10
// STEALTHY TOOLS
@@ -1480,7 +1480,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Syndicate Counterfeiter Bundle"
desc = "A cleverly implemented bundle designed to document counterfeiting. Comes with a chameleon stamp, capable of imitating any NanoTrasen issued stamps and a fakesign pen to alter the world through the sheer force of paperwork. While making the user capable of faking almost any document, this Syndicate technology has been rumored to cause a huge upheaval on NT objects. "
reference = "CHST"
- cost = 1
+ cost = 5
surplus = 35
item = /obj/item/storage/box/syndie_kit/counterfeiter_bundle
@@ -1489,7 +1489,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A flag that can be disguised as any other known flag. There is a hidden spot in the pole to boobytrap the flag with a grenade or minibomb, which will detonate some time after the flag is set on fire."
reference = "CHFLAG"
item = /obj/item/flag/chameleon
- cost = 1
+ cost = 5
surplus = 35
/datum/uplink_item/stealthy_tools/chamsechud
@@ -1497,21 +1497,21 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A stolen Nanotrasen Security HUD with Syndicate chameleon technology implemented into it. Similarly to a chameleon jumpsuit, the HUD can be morphed into various other eyewear, while retaining the HUD qualities when worn."
reference = "CHHUD"
item = /obj/item/clothing/glasses/hud/security/chameleon
- cost = 2
+ cost = 10
/datum/uplink_item/stealthy_tools/thermal
name = "Thermal Chameleon Glasses"
desc = "These glasses are thermals with Syndicate chameleon technology built into them. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
reference = "THIG"
item = /obj/item/clothing/glasses/chameleon/thermal
- cost = 4
+ cost = 20
/datum/uplink_item/stealthy_tools/traitor_belt
name = "Traitor's Toolbelt"
desc = "A robust seven-slot belt made for carrying a broad variety of weapons, ammunition and explosives. It's modelled after the standard NT toolbelt so as to avoid suspicion while wearing it."
reference = "SBM"
item = /obj/item/storage/belt/military/traitor
- cost = 1
+ cost = 5
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/stealthy_tools/frame
@@ -1522,7 +1522,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
telecrystals normally."
reference = "FRAME"
item = /obj/item/cartridge/frame
- cost = 4
+ cost = 20
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/stealthy_tools/agent_card
@@ -1530,7 +1530,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Agent cards prevent artificial intelligences from tracking the wearer, and can copy access from other identification cards. The access is cumulative, so scanning one card does not erase the access gained from another."
reference = "AIDC"
item = /obj/item/card/id/syndicate
- cost = 2
+ cost = 10
/datum/uplink_item/stealthy_tools/chameleon
name = "Chameleon Kit"
@@ -1538,7 +1538,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Due to budget cuts, the shoes don't provide protection against slipping. The set comes with a complementary chameleon stamp."
reference = "CHAM"
item = /obj/item/storage/box/syndie_kit/chameleon
- cost = 4
+ cost = 20
/datum/uplink_item/stealthy_tools/syndigaloshes
name = "No-Slip Chameleon Shoes"
@@ -1546,12 +1546,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
They do not work on heavily lubricated surfaces."
reference = "NSSS"
item = /obj/item/clothing/shoes/chameleon/noslip
- cost = 2
+ cost = 10
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/stealthy_tools/syndigaloshes/nuke
reference = "NNSSS"
- cost = 4
+ cost = 20
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/stealthy_tools/chameleon_proj
@@ -1559,14 +1559,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Projects an image across a user, disguising them as an object scanned with it, as long as they don't move the projector from their hand. The disguised user cannot run and projectiles pass over them."
reference = "CP"
item = /obj/item/chameleon
- cost = 5
+ cost = 25
/datum/uplink_item/stealthy_tools/camera_bug
name = "Camera Bug"
desc = "Enables you to view all cameras on the network to track a target."
reference = "CB"
item = /obj/item/camera_bug
- cost = 1
+ cost = 5
surplus = 90
/datum/uplink_item/stealthy_tools/dnascrambler
@@ -1574,14 +1574,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A syringe with one injection that randomizes appearance and name upon use. A cheaper but less versatile alternative to an agent card and voice changer."
reference = "DNAS"
item = /obj/item/dnascrambler
- cost = 2
+ cost = 10
/datum/uplink_item/stealthy_tools/smugglersatchel
name = "Smuggler's Satchel"
desc = "This satchel is thin enough to be hidden in the gap between plating and tiling, great for stashing your stolen goods. Comes with a crowbar and a floor tile inside."
reference = "SMSA"
item = /obj/item/storage/backpack/satchel_flat
- cost = 2
+ cost = 10
surplus = 30
/datum/uplink_item/stealthy_tools/emplight
@@ -1590,7 +1590,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Useful for disrupting headsets, cameras, and borgs during stealth operations."
reference = "EMPL"
item = /obj/item/flashlight/emp
- cost = 4
+ cost = 20
surplus = 30
/datum/uplink_item/stealthy_tools/syndigaloshes
@@ -1598,13 +1598,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. They do not work on heavily lubricated surfaces."
reference = "NOCS"
item = /obj/item/clothing/shoes/chameleon/noslip
- cost = 2
+ cost = 10
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/stealthy_tools/syndigaloshes/nuke
reference = "NOCSN"
item = /obj/item/clothing/shoes/chameleon/noslip
- cost = 4
+ cost = 20
excludefrom = list()
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
@@ -1614,7 +1614,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
spraycan for changing their appearances."
reference = "ADCC"
item = /obj/item/storage/box/syndie_kit/cutouts
- cost = 1
+ cost = 5
surplus = 20
/datum/uplink_item/stealthy_tools/clownkit
@@ -1622,7 +1622,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer mask, magnetic clown shoes, and standard clown outfit, tools, and backpack."
reference = "HBIK"
item = /obj/item/storage/backpack/clown/syndie
- cost = 6
+ cost = 30
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 0
@@ -1631,7 +1631,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "This device disguises itself as any object scanned by it. It's unstable and disguise will be disabled in about 30 minutes. The box contains three counterfeiters."
reference = "CC"
item = /obj/item/storage/box/syndie_kit/chameleon_counter
- cost = 2
+ cost = 10
// DEVICE AND TOOLS
/datum/uplink_item/device_tools
@@ -1643,28 +1643,28 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "The cryptographic sequencer, also known as an emag, is a small card that unlocks hidden functions in electronic devices, subverts intended functions and characteristically breaks security mechanisms."
reference = "EMAG"
item = /obj/item/card/emag
- cost = 10 // No brainrot allowed
+ cost = 50 // No brainrot allowed
/datum/uplink_item/device_tools/access_tuner
name = "Access Tuner"
desc = "The access tuner is a small device that can interface with airlocks from range. It takes a few seconds to connect and can change the bolt state, open the door, or toggle emergency access."
reference = "HACK"
item = /obj/item/door_remote/omni/access_tuner
- cost = 6
+ cost = 30
/datum/uplink_item/device_tools/toolbox
name = "Fully Loaded Toolbox"
desc = "The syndicate toolbox is a suspicious black and red. Aside from tools, it comes with insulated gloves and a multitool."
reference = "FLTB"
item = /obj/item/storage/toolbox/syndicate
- cost = 1
+ cost = 5
/datum/uplink_item/device_tools/supertoolbox
name = "Superior Suspicious Toolbox"
desc = "Ultimate version of all toolboxes, this one more robust and more useful than his cheaper version. Comes with experimental type tools, combat gloves and cool sunglasses."
item = /obj/item/storage/toolbox/syndisuper
reference = "SSTB"
- cost = 2
+ cost = 10
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/device_tools/holster
@@ -1672,14 +1672,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "For holding your favourite gun close and always being ready for a cowboy duel with clown."
reference = "SHL"
item = /obj/item/clothing/accessory/holster
- cost = 1
+ cost = 5
/datum/uplink_item/device_tools/holster/knives
name = "Knife holster"
desc = "A bunch of straps connected into one holster. Has 7 special slots for holding knives."
reference = "KH"
item = /obj/item/clothing/accessory/holster/knives
- cost = 2
+ cost = 10
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/device_tools/webbing
@@ -1687,35 +1687,35 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Sturdy mess of synthcotton belts and buckles, ready to share your burden."
reference = "WBNG"
item = /obj/item/clothing/accessory/storage/webbing
- cost = 1
+ cost = 5
/datum/uplink_item/device_tools/black_vest
name = "Black Vest"
desc = "Robust black synthcotton vest with lots of pockets to hold whatever you need, but cannot hold in hands."
reference = "BLCKVST"
item = /obj/item/clothing/accessory/storage/black_vest
- cost = 1
+ cost = 5
/datum/uplink_item/device_tools/brown_vest
name = "Brown Vest"
desc = "Worn brownish synthcotton vest with lots of pockets to unload your hands."
reference = "BRWNVST"
item = /obj/item/clothing/accessory/storage/brown_vest
- cost = 1
+ cost = 5
/datum/uplink_item/device_tools/surgerybag
name = "Syndicate Surgery Duffelbag"
desc = "The Syndicate Surgical Bag comes with a complete set of everything you need for quality surgery, including a straitjacket and muzzle. The bag itself is unprecedentedly light, doesn't slow you down, and is completely silent."
reference = "SSDB"
item = /obj/item/storage/backpack/duffel/syndie/surgery
- cost = 2
+ cost = 10
/datum/uplink_item/device_tools/bonerepair
name = "Prototype Nanite Autoinjector Kit"
desc = "Stolen prototype full body repair nanites. Contains one prototype nanite autoinjector and guide."
reference = "NCAI"
item = /obj/item/storage/box/syndie_kit/bonerepair
- cost = 2
+ cost = 10
/datum/uplink_item/device_tools/syndicate_teleporter
name = "Experimental Syndicate Teleporter"
@@ -1725,14 +1725,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Has 4 charges, recharges, warranty voided if exposed to EMP."
reference = "TELE"
item = /obj/item/storage/box/syndie_kit/teleporter
- cost = 8
+ cost = 40
/datum/uplink_item/device_tools/spai
name = "Syndicate Personal AI Device (SPAI)"
desc = "You will have your personal assistant. It comes with an increased amount of memory and special programs."
reference = "SPAI"
item = /obj/item/storage/box/syndie_kit/pai
- cost = 4
+ cost = 35
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
refundable = TRUE
refund_path = /obj/item/paicard_upgrade/unused
@@ -1743,7 +1743,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A diamond tipped thermal drill with magnetic clamps for the purpose of quickly drilling hardened objects. Guaranteed 100% jam proof."
reference = "DDRL"
item = /obj/item/thermal_drill/diamond_drill
- cost = 1
+ cost = 5
+
+/datum/uplink_item/device_tools/jackhammer
+ name = "Jackhammer"
+ desc = "A jackhammer for breaking stone. Or walls. Or skulls"
+ reference = "JCKH"
+ item = /obj/item/pickaxe/drill/jackhammer
+ cost = 15
/datum/uplink_item/device_tools/medkit
name = "Syndicate Combat Medic Kit"
@@ -1751,7 +1758,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
and other medical supplies helpful for a medical field operative."
reference = "SCMK"
item = /obj/item/storage/firstaid/syndie
- cost = 7
+ cost = 35
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/device_tools/vtec
@@ -1759,7 +1766,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Increases the movement speed of a Cyborg. Install into any Borg, Syndicate or subverted"
reference = "VTEC"
item = /obj/item/borg/upgrade/vtec
- cost = 6
+ cost = 30
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/device_tools/cyborg_magboots
@@ -1767,7 +1774,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Позволяет киборгу частично примагничиваться к корпусу, что позволяет игнорировать некоторые условия отсутсвия гравитации."
reference = "FMAG"
item = /obj/item/borg/upgrade/magboots
- cost = 4
+ cost = 20
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/device_tools/autoimplanter
@@ -1775,7 +1782,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Cheaper version of nuclear operatives autoimplanter, this model allows you to install three cybernetic implants on the field."
reference = "SAI"
item = /obj/item/autoimplanter/traitor
- cost = 6
+ cost = 30
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
//Space Suits and Hardsuits
@@ -1790,7 +1797,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
sightings, however. "
reference = "SS"
item = /obj/item/storage/box/syndie_kit/space
- cost = 4
+ cost = 20
/datum/uplink_item/suits/hardsuit
name = "Syndicate Hardsuit"
@@ -1801,7 +1808,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Nanotrasen crew who spot these suits are known to panic."
reference = "BRHS"
item = /obj/item/storage/box/syndie_kit/hardsuit
- cost = 6
+ cost = 30
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/suits/chameleon_hardsuit
@@ -1810,14 +1817,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
In addition, it has an in-built chameleon system, allowing you to disguise your hardsuit to the most common variations on your mission area. \
This one disquised as engineering hardsuit."
reference = "CHS"
- cost = 10 //reskinned blood-red hardsuit with chameleon
+ cost = 50 //reskinned blood-red hardsuit with chameleon
item = /obj/item/storage/box/syndie_kit/chameleon_hardsuit
/datum/uplink_item/suits/hardsuit/elite
name = "Elite Syndicate Hardsuit"
desc = "An advanced hardsuit with superior armor and mobility to the standard Syndicate Hardsuit."
item = /obj/item/clothing/suit/space/hardsuit/syndi/elite
- cost = 10
+ cost = 50
reference = "ESHS"
excludefrom = list()
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
@@ -1826,7 +1833,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Shielded Hardsuit"
desc = "An advanced hardsuit with built-in energy shielding. The shields will rapidly recharge when not under fire."
item = /obj/item/clothing/suit/space/hardsuit/syndi/shielded
- cost = 30
+ cost = 150
reference = "SHS"
excludefrom = list()
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
@@ -1836,7 +1843,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A key, that when inserted into a radio headset, allows you to listen to and talk with artificial intelligences and cybernetic organisms in binary. To talk on the binary channel, type :+ before your radio message."
reference = "BITK"
item = /obj/item/encryptionkey/binary
- cost = 5
+ cost = 25
surplus = 75
/datum/uplink_item/device_tools/bowman_kit
@@ -1845,7 +1852,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
A key, that when inserted into a radio headset, allows you to listen to all station department channels as well as talk on an encrypted Syndicate channel."
reference = "SEK"
item = /obj/item/storage/box/syndie_kit/bowman_conversion_kit
- cost = 1
+ cost = 5
surplus = 75
/datum/uplink_item/device_tools/hacked_module
@@ -1853,7 +1860,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "When used with an upload console, this module allows you to upload priority laws to an artificial intelligence. Be careful with their wording, as artificial intelligences may look for loopholes to exploit."
reference = "HAI"
item = /obj/item/aiModule/syndicate
- cost = 8
+ cost = 40
/datum/uplink_item/device_tools/magboots
name = "Blood-Red Magboots"
@@ -1861,7 +1868,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
These reverse-engineered knockoffs of Nanotrasen's 'Advanced Magboots' slow you down in simulated-gravity environments much like the standard issue variety."
reference = "BRMB"
item = /obj/item/clothing/shoes/magboots/syndie
- cost = 2
+ cost = 10
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/device_tools/magboots/advance
@@ -1870,7 +1877,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
These reverse-engineered knockoffs of Nanotrasen's 'Advanced Magboots' not slow you down in simulated-gravity environments and provide protection against slipping on the space lube."
reference = "ABRMB"
item = /obj/item/clothing/shoes/magboots/syndie/advance
- cost = 8
+ cost = 40
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/device_tools/powersink
@@ -1878,7 +1885,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "When screwed to wiring attached to an electric grid, then activated, this large device places excessive load on the grid, causing a stationwide blackout. The sink cannot be carried because of its excessive size. Ordering this sends you a small beacon that will teleport the power sink to your location on activation."
reference = "PS"
item = /obj/item/powersink
- cost = 8
+ cost = 40
/datum/uplink_item/device_tools/singularity_beacon
name = "Power Beacon"
@@ -1888,7 +1895,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
sends you a small beacon that will teleport the larger beacon to your location upon activation."
reference = "SNGB"
item = /obj/item/radio/beacon/syndicate
- cost = 6
+ cost = 30
surplus = 0
hijack_only = TRUE //This is an item only useful for a hijack traitor, as such, it should only be available in those scenarios.
cant_discount = TRUE
@@ -1899,7 +1906,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Useful for when speed matters or you wish to synchronize multiple bomb blasts. Be sure to stand clear of the blast radius before using the detonator."
reference = "SD"
item = /obj/item/syndicatedetonator
- cost = 3
+ cost = 15
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/device_tools/advpinpointer
@@ -1907,28 +1914,28 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A pinpointer that tracks any specified coordinates, DNA string, high value item or the nuclear authentication disk."
reference = "ADVP"
item = /obj/item/pinpointer/advpinpointer
- cost = 4
+ cost = 20
/datum/uplink_item/device_tools/ai_detector
name = "Artificial Intelligence Detector" // changed name in case newfriends thought it detected disguised ai's
desc = "A functional multitool that turns red when it detects an artificial intelligence watching it or its holder. Knowing when an artificial intelligence is watching you is useful for knowing when to maintain cover."
reference = "AID"
item = /obj/item/multitool/ai_detect
- cost = 1
+ cost = 5
/datum/uplink_item/device_tools/jammer
name = "Radio Jammer"
desc = "This device will disrupt any nearby outgoing radio communication when activated."
reference = "RJ"
item = /obj/item/jammer
- cost = 2
+ cost = 10
/datum/uplink_item/device_tools/teleporter
name = "Teleporter Circuit Board"
desc = "A printed circuit board that completes the teleporter onboard the mothership. Advise you test fire the teleporter before entering it, as malfunctions can occur."
item = /obj/item/circuitboard/teleporter
reference = "TP"
- cost = 20
+ cost = 100
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 0
@@ -1937,7 +1944,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Use to select the landing zone of your assault pod."
item = /obj/item/assault_pod
reference = "APT"
- cost = 25
+ cost = 125
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 0
@@ -1946,7 +1953,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An incredibly useful personal shield projector, capable of reflecting energy projectiles, but it cannot block other attacks. Pair with an Energy Sword for a killer combination."
item = /obj/item/shield/energy/syndie
reference = "ESD"
- cost = 12
+ cost = 60
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 20
@@ -1955,7 +1962,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Medical Beam Gun, useful in prolonged firefights. DO NOT CROSS THE BEAMS. Crossing beams with another medbeam or attaching two beams to one target will have explosive consequences."
item = /obj/item/gun/medbeam
reference = "MBG"
- cost = 15
+ cost = 75
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
//Stimulants
@@ -1964,7 +1971,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A highly illegal compound contained within a compact auto-injector; when injected it makes the user extremely resistant to incapacitation and greatly enhances the body's ability to repair itself."
reference = "ST"
item = /obj/item/reagent_containers/hypospray/autoinjector/stimulants
- cost = 5
+ cost = 25
excludefrom = list(UPLINK_TYPE_NUCLEAR)
// IMPLANTS
@@ -1977,14 +1984,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An implant injected into the body and later activated manually to break out of any restraints. Can be activated up to 4 times."
reference = "FI"
item = /obj/item/implanter/freedom
- cost = 4
+ cost = 20
/datum/uplink_item/implants/uplink
name = "Uplink Implant"
desc = "An implant injected into the body, and later activated manually to open an uplink with 10 telecrystals. The ability for an agent to open an uplink after their possessions have been stripped from them makes this implant excellent for escaping confinement."
reference = "UI"
item = /obj/item/implanter/uplink
- cost = 12
+ cost = 60
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 0
cant_discount = TRUE
@@ -1994,21 +2001,21 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An implant injected into the body, and later activated at the user's will. It will open a small subspace pocket capable of storing two items."
reference = "SI"
item = /obj/item/implanter/storage
- cost = 6
+ cost = 30
/datum/uplink_item/implants/mindslave
name = "Mindslave Implant"
desc = "A box containing an implanter filled with a mindslave implant that when injected into another person makes them loyal to you and your cause, unless of course they're already implanted by someone else. Loyalty ends if the implant is no longer in their system."
reference = "MI"
item = /obj/item/implanter/traitor
- cost = 10
+ cost = 50
/datum/uplink_item/implants/adrenal
name = "Adrenal Implant"
desc = "An implant injected into the body, and later activated manually to inject a chemical cocktail, which has a mild healing effect along with removing and reducing the time of all stuns and increasing movement speed. Can be activated up to 3 times."
reference = "AI"
item = /obj/item/implanter/adrenalin
- cost = 8
+ cost = 40
cant_discount = TRUE
surplus = 0
@@ -2018,7 +2025,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
This will permanently destroy your body, however."
reference = "MBI"
item = /obj/item/implanter/explosive
- cost = 2
+ cost = 10
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/implants/mantisblade
@@ -2026,7 +2033,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A box containing a set of two Gorlex Hidden Blade Implants comes with self-destructing auto-implanters. After the EMP, they return to service to show that it's too early to write you off."
reference = "MABI"
item = /obj/item/storage/box/syndie_kit/mantisblade
- cost = 12
+ cost = 60
surplus = 90
/datum/uplink_item/implants/stealthbox
@@ -2034,7 +2041,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An implant injected into the body, and later activated manually to deploy a box, fully hiding you in the surroundings. Can be used indefinitely"
reference = "BI"
item = /obj/item/implanter/stealth
- cost = 8
+ cost = 40
// Cybernetics
/datum/uplink_item/cyber_implants
@@ -2047,14 +2054,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "These cybernetic eyes will give you thermal vision. Comes with an automated implanting tool."
reference = "CIT"
item = /obj/item/storage/box/cyber_implants/thermals
- cost = 8
+ cost = 40
/datum/uplink_item/cyber_implants/xray
name = "X-Ray Vision Implant"
desc = "These cybernetic eyes will give you X-ray vision. Comes with an automated implanting tool."
reference = "CIX"
item = /obj/item/storage/box/cyber_implants/xray
- cost = 10
+ cost = 50
/datum/uplink_item/cyber_implants/antistun
name = "Hardened CNS Rebooter Implant"
@@ -2062,7 +2069,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Comes with an automated implanting tool."
reference = "CIAS"
item = /obj/item/storage/box/cyber_implants/anti_stun_hardened
- cost = 12
+ cost = 60
/datum/uplink_item/cyber_implants/antisleep
name = "Hardened Neural Jumpstarter Implant"
@@ -2070,14 +2077,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Comes with an automated implanting tool."
reference = "NJ"
item = /obj/item/storage/box/cyber_implants/anti_sleep_hardened
- cost = 15
+ cost = 75
/datum/uplink_item/cyber_implants/reviver
name = "Hardened Reviver Implant"
desc = "This implant will attempt to revive you if you lose consciousness. It is invulnerable to EMPs. Comes with an automated implanting tool."
reference = "CIR"
item = /obj/item/storage/box/cyber_implants/reviver_hardened
- cost = 8
+ cost = 40
// POINTLESS BADASSERY
@@ -2090,7 +2097,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Strong flavor, dense smoke, infused with omnizine."
reference = "SYSM"
item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate
- cost = 1
+ cost = 5
/datum/uplink_item/badass/syndiecards
name = "Syndicate Playing Cards"
@@ -2098,7 +2105,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
You can also play card games with them."
reference = "SPC"
item = /obj/item/toy/cards/deck/syndicate
- cost = 1
+ cost = 5
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
surplus = 40
@@ -2108,14 +2115,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
The briefcase also feels a little heavier to hold; it has been manufactured to pack a little bit more of a punch if your client needs some convincing."
reference = "CASH"
item = /obj/item/storage/secure/briefcase/syndie
- cost = 1
+ cost = 5
/datum/uplink_item/badass/plasticbag
name = "Plastic Bag"
desc = "A simple, plastic bag. Keep out of reach of small children, do not apply to head."
reference = "PBAG"
item = /obj/item/storage/bag/plasticbag
- cost = 1
+ cost = 5
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/badass/balloon
@@ -2123,7 +2130,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A useless red balloon with the syndicate logo on it, which can blow the deepest of covers."
reference = "BABA"
item = /obj/item/toy/syndicateballoon
- cost = 20
+ cost = 100
cant_discount = TRUE
/datum/uplink_item/implants/macrobomb
@@ -2131,7 +2138,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "An implant injected into the body, and later activated either manually or automatically upon death. Upon death, releases a massive explosion that will wipe out everything nearby."
reference = "HAB"
item = /obj/item/implanter/explosive_macro
- cost = 20
+ cost = 100
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/bundles_TC
@@ -2145,7 +2152,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Bulldog shotgun, two 12g buckshot drums, and a pair of Thermal imaging goggles."
reference = "BULB"
item = /obj/item/storage/backpack/duffel/syndie/bulldogbundle
- cost = 9 // normally 12
+ cost = 45 // normally 60
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/bundles_TC/c20r
@@ -2153,7 +2160,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Old Faithful: The classic C-20r, bundled with three magazines and a (surplus) suppressor at discount price."
reference = "C20B"
item = /obj/item/storage/backpack/duffel/syndie/c20rbundle
- cost = 18 // normally 21
+ cost = 90 // normally 105
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/bundles_TC/cyber_implants
@@ -2162,7 +2169,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
Comes with an automated implanting tool."
reference = "CIB"
item = /obj/item/storage/box/cyber_implants/bundle
- cost = 40
+ cost = 200
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/bundles_TC/medical
@@ -2171,7 +2178,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
a medical beam gun implant, a surgery implant, a handheld defibrillator, autoimplanter, health analyzers, and a medical hardsuit."
reference = "MEDB"
item = /obj/item/storage/backpack/duffel/syndie/med/medicalbundle
- cost = 35 // normally 40
+ cost = 175 // normally 200
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/bundles_TC/sniper
@@ -2181,7 +2188,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
We'll throw in a free red tie if you order NOW."
reference = "SNPB"
item = /obj/item/storage/briefcase/sniperbundle
- cost = 22 // normally 27
+ cost = 110 // normally 135
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/bundles_TC/cyborg_maint
@@ -2189,7 +2196,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "A box containing all internal parts of cyborg for repair."
reference = "CYMT"
item = /obj/item/storage/box/syndie_kit/cyborg_maint
- cost = 4
+ cost = 20
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/bundles_TC/badass
@@ -2197,24 +2204,24 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 20 telecrystals, but you do not know which specialisation you will receive."
reference = "SYB"
item = /obj/item/storage/box/syndicate
- cost = 20
+ cost = 100
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/bundles_TC/surplus_crate
name = "Syndicate Surplus Crate"
- desc = "A crate containing 50 telecrystals worth of random syndicate leftovers."
+ desc = "A crate containing 250 telecrystals worth of random syndicate leftovers."
reference = "SYSC"
- cost = 20
+ cost = 100
item = /obj/item/storage/box/syndicate
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
- var/crate_value = 50
+ var/crate_value = 250
/datum/uplink_item/bundles_TC/surplus_crate/super
name = "Syndicate Super Surplus Crate"
- desc = "A crate containing 125 telecrystals worth of random syndicate leftovers."
+ desc = "A crate containing 625 telecrystals worth of random syndicate leftovers."
reference = "SYSS"
- cost = 40
- crate_value = 125
+ cost = 200
+ crate_value = 625
/datum/uplink_item/bundles_TC/surplus_crate/spawn_item(turf/loc, obj/item/uplink/U)
var/obj/structure/closet/crate/C = new(loc)
@@ -2254,24 +2261,24 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/stack/telecrystal
cost = 1
-/datum/uplink_item/bundles_TC/telecrystal/five
- name = "5 Raw Telecrystals"
- desc = "Five telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
+/datum/uplink_item/bundles_TC/telecrystal/twenty_five
+ name = "25 Raw Telecrystals"
+ desc = "Twenty five telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
reference = "RTCF"
- item = /obj/item/stack/telecrystal/five
- cost = 5
+ item = /obj/item/stack/telecrystal/twenty_five
+ cost = 25
-/datum/uplink_item/bundles_TC/telecrystal/twenty
- name = "20 Raw Telecrystals"
- desc = "Twenty telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
+/datum/uplink_item/bundles_TC/telecrystal/hundread
+ name = "100 Raw Telecrystals"
+ desc = "Hundread telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
reference = "RTCT"
- item = /obj/item/stack/telecrystal/twenty
- cost = 20
+ item = /obj/item/stack/telecrystal/hundread
+ cost = 100
-/datum/uplink_item/bundles_TC/telecrystal/fifty
- name = "50 Raw Telecrystals"
- desc = "Fifty telecrystals in their rawest and purest form. You know you want that Mauler."
+/datum/uplink_item/bundles_TC/telecrystal/twohundread_fifty
+ name = "250 Raw Telecrystals"
+ desc = "Two hundread fifty telecrystals in their rawest and purest form. You know you want that Mauler."
reference = "RTCB"
- item = /obj/item/stack/telecrystal/fifty
- cost = 50
+ item = /obj/item/stack/telecrystal/twohundread_fifty
+ cost = 250
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 1e458347a2f..1d29cbdb9e1 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -709,12 +709,13 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
//to add blood dna info to the object's blood_DNA list
/atom/proc/transfer_blood_dna(list/blood_dna)
- if(!blood_DNA)
- blood_DNA = list()
- var/old_length = blood_DNA.len
+ if(!blood_dna || !length(blood_dna))
+ return FALSE
+ LAZYINITLIST(blood_DNA)
+ var/old_length = length(blood_DNA)
blood_DNA |= blood_dna
- if(blood_DNA.len > old_length)
- return TRUE//some new blood DNA was added
+ return length(blood_DNA) > old_length //some new blood DNA was added
+
//to add blood from a mob onto something, and transfer their dna info
/atom/proc/add_mob_blood(mob/living/M)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 297cfc90270..acb44796abc 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -31,6 +31,10 @@
var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move
var/list/client_mobs_in_contents
+ /// Icon state for thought bubbles. Normally set by mobs.
+ var/thought_bubble_image = "thought_bubble"
+
+
/atom/movable/attempt_init(loc, ...)
var/turf/T = get_turf(src)
if(T && SSatoms.initialized != INITIALIZATION_INSSATOMS && GLOB.space_manager.is_zlevel_dirty(T.z))
@@ -61,41 +65,43 @@
/atom/movable/proc/on_teleported()
return
-/atom/movable/proc/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE)
- var/mob/M = AM
- if(ismob(M) && M.buckled)
- AM = M.buckled
- if(QDELETED(AM))
+/atom/movable/proc/start_pulling(atom/movable/AM, force = pull_force, show_message = FALSE)
+ var/mob/mob_target = AM
+ if(ismob(mob_target) && mob_target.buckled)
+ AM = mob_target.buckled
+
+ if(QDELETED(AM) || QDELETED(src))
return FALSE
- if(!(AM.can_be_pulled(src, state, force)))
+ if(!(AM.can_be_pulled(src, force, show_message)))
return FALSE
- // if we're pulling something then drop what we're currently pulling and pull this instead.
- if(pulling)
- if(state == 0)
- stop_pulling()
- return FALSE
- // Are we trying to pull something we are already pulling? Then enter grab cycle and end.
- if(AM == pulling)
- if(isliving(AM))
- var/mob/living/AMob = AM
- AMob.grabbedby(src)
- return TRUE
- stop_pulling()
+ if(pulling && AM == pulling && src == AM.pulledby) // are we trying to pull something we are already pulling?
+ return FALSE
+
+ var/atom/movable/previous_puller = null
if(AM.pulledby)
- add_attack_logs(AM, AM.pulledby, "pulled from", ATKLOG_ALMOSTALL)
- AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
+ previous_puller = AM.pulledby
+ previous_puller.stop_pulling() // an object can't be pulled by two mobs at once.
+
pulling = AM
AM.pulledby = src
- var/mob/pulled_mob = ismob(AM) ? AM : buckled_mobs[1]
- if(ismob(pulled_mob))
- add_attack_logs(src, pulled_mob, "passively grabbed", ATKLOG_ALMOSTALL)
- if(show_message)
- visible_message("[src] схватил[genderize_ru(src.gender,"","а","о","и")] [pulled_mob]!")
+ mob_target = ismob(AM) ? AM : (AM.buckled_mobs && length(AM.buckled_mobs)) ? AM.buckled_mobs[1] : null
+ if(mob_target)
+ if(previous_puller)
+ add_attack_logs(AM, previous_puller, "pulled from", ATKLOG_ALMOSTALL)
+ if(show_message)
+ visible_message(span_danger("[src] перехватил[genderize_ru(gender,"","а","о","и")] [mob_target] у [previous_puller]."))
+ else
+ add_attack_logs(src, mob_target, "pulls", ATKLOG_ALMOSTALL)
+ if(show_message)
+ visible_message(span_warning("[src] схватил[genderize_ru(gender,"","а","о","и")] [mob_target]!"))
+ mob_target.LAssailant = iscarbon(src) ? src : null
+
return TRUE
+
/atom/movable/proc/stop_pulling()
if(pulling)
pulling.pulledby = null
@@ -125,18 +131,18 @@
if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //separated from our puller and not in the middle of a diagonal move.
pulledby.stop_pulling()
-/atom/movable/proc/can_be_pulled(user, grab_state, force, show_message = FALSE)
+/atom/movable/proc/can_be_pulled(atom/movable/user, force, show_message = FALSE)
if(src == user || !isturf(loc))
return FALSE
if(anchored || move_resist == INFINITY)
- if(show_message) //Это разве не проверка таскания прикрученных объектов? Оно точно может получить пол ящика?
- to_chat(user, "Похоже, [src.name] прикрепл[genderize_ru(src.gender,"ён","ена","ено","ены")] к полу!")
+ if(show_message)
+ to_chat(user, span_warning("Похоже, [src.name] прикрепл[genderize_ru(src.gender,"ён","ена","ено","ены")] к полу!"))
return FALSE
if(throwing)
return FALSE
if(force < (move_resist * MOVE_FORCE_PULL_RATIO))
if(show_message)
- to_chat(user, "[src.name] слишком тяжелый!")
+ to_chat(user, span_warning("[src.name] слишком тяжелый!"))
return FALSE
return TRUE
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index a796ca71286..033130a27a0 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -90,7 +90,7 @@ GLOBAL_LIST_EMPTY(bad_blocks)
ResetUI(1)
// Hair
// FIXME: Species-specific defaults pls
- var/obj/item/organ/external/head/H = character.get_organ("head")
+ var/obj/item/organ/external/head/H = character.get_organ(BODY_ZONE_HEAD)
var/obj/item/organ/internal/eyes/eyes_organ = character.get_int_organ(/obj/item/organ/internal/eyes)
// Body Accessory
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 9dceb2a5aed..c6769fdae49 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -134,7 +134,7 @@
dna.UpdateUI()
dna.check_integrity()
var/mob/living/carbon/human/H = src
- var/obj/item/organ/external/head/head_organ = H.get_organ("head")
+ var/obj/item/organ/external/head/head_organ = H.get_organ(BODY_ZONE_HEAD)
var/obj/item/organ/internal/eyes/eye_organ = H.get_int_organ(/obj/item/organ/internal/eyes)
if(istype(head_organ))
dna.write_head_attributes(head_organ)
@@ -170,14 +170,16 @@
var/bodyacc = dna.GetUIValueRange(DNA_UI_BACC_STYLE, GLOB.body_accessory_by_name.len)
if((bodyacc > 0) && (bodyacc <= GLOB.body_accessory_by_name.len))
var/datum/body_accessory/body_acc = GLOB.body_accessory_by_name[GLOB.body_accessory_by_name[bodyacc]]
+ var/obj/item/organ/external/tail/bodypart_tail = H.get_organ(BODY_ZONE_TAIL)
+ var/obj/item/organ/external/wing/bodypart_wing = H.get_organ(BODY_ZONE_WING)
if(!body_acc)
H.body_accessory = null
- H.bodypart_tail?.body_accessory = null
- H.bodypart_wing?.body_accessory = null
+ bodypart_tail?.body_accessory = null
+ bodypart_wing?.body_accessory = null
else if(H.dna.species.name in body_acc.allowed_species)
H.body_accessory = body_acc
- H.bodypart_tail?.body_accessory = body_acc
- H.bodypart_wing?.body_accessory = body_acc
+ bodypart_tail?.body_accessory = body_acc
+ bodypart_wing?.body_accessory = body_acc
//Tail Markings
var/tail_marks = dna.GetUIValueRange(DNA_UI_TAIL_MARK_STYLE, GLOB.marking_styles_list.len)
if((tail_marks > 0) && (tail_marks <= GLOB.marking_styles_list.len))
diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm
index 20bea46e7e4..f1cba274123 100644
--- a/code/game/dna/genes/goon_powers.dm
+++ b/code/game/dna/genes/goon_powers.dm
@@ -256,7 +256,7 @@
if(!H.bodyparts_by_name[name])
continue
affecting = H.bodyparts_by_name[name]
- if(!isorgan(affecting))
+ if(!isexternalorgan(affecting))
continue
affecting.heal_damage(4, 0, updating_health = FALSE)
H.UpdateDamageIcon()
diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm
index 8cf802ff82f..9cfc931b9bc 100644
--- a/code/game/dna/genes/vg_powers.dm
+++ b/code/game/dna/genes/vg_powers.dm
@@ -37,7 +37,7 @@
to_chat(user, "You can't change your appearance right now!")
return
var/mob/living/carbon/human/M = user
- var/obj/item/organ/external/head/head_organ = M.get_organ("head")
+ var/obj/item/organ/external/head/head_organ = M.get_organ(BODY_ZONE_HEAD)
var/obj/item/organ/internal/eyes/eyes_organ = M.get_int_organ(/obj/item/organ/internal/eyes)
var/new_gender = alert(user, "Please select gender.", "Character Generation", "Male", "Female")
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 5d52d43a580..37691e30755 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -83,7 +83,7 @@
/mob/living/simple_animal/hostile/blob/blobspore/proc/Zombify(mob/living/carbon/human/H)
if(!H.check_death_method())
H.death()
- var/obj/item/organ/external/head/head_organ = H.get_organ("head")
+ var/obj/item/organ/external/head/head_organ = H.get_organ(BODY_ZONE_HEAD)
is_zombie = TRUE
if(H.wear_suit)
var/obj/item/clothing/suit/armor/A = H.wear_suit
diff --git a/code/game/gamemodes/clockwork/clockwork.dm b/code/game/gamemodes/clockwork/clockwork.dm
index aa47af54908..53081356a78 100644
--- a/code/game/gamemodes/clockwork/clockwork.dm
+++ b/code/game/gamemodes/clockwork/clockwork.dm
@@ -80,7 +80,6 @@ GLOBAL_LIST_EMPTY(all_clockers)
return (length(clockwork_cult) > 0)
/datum/game_mode/clockwork/post_setup()
- modePlayer += clockwork_cult
clocker_objs.setup()
for(var/datum/mind/clockwork_mind in clockwork_cult)
diff --git a/code/game/gamemodes/clockwork/clockwork_items.dm b/code/game/gamemodes/clockwork/clockwork_items.dm
index 872a6d07cc3..8afd0b3c9a6 100644
--- a/code/game/gamemodes/clockwork/clockwork_items.dm
+++ b/code/game/gamemodes/clockwork/clockwork_items.dm
@@ -411,7 +411,7 @@
var/wforce = rand(force_unwielded, force_wielded)
if(ishuman(user))
var/mob/living/carbon/human/human = user
- human.apply_damage(wforce, BRUTE, "head")
+ human.apply_damage(wforce, BRUTE, BODY_ZONE_HEAD)
else
user.adjustBruteLoss(wforce)
return
@@ -546,14 +546,12 @@
return
if(isclocker(target))
return
- if(ishuman(target))
+ if(ishuman(target) && enchant_type == BLOODSHED_SPELL)
var/mob/living/carbon/human/human = target
- if(enchant_type == BLOODSHED_SPELL && human.dna && !(NO_BLOOD in human.dna.species.species_traits))
- var/obj/item/organ/external/BP = pick(human.bodyparts)
- to_chat(user, " You tear through [human]'s skin releasing the blood from [human.p_their()] [BP.name]!")
- human.custom_pain("Your skin tears in [BP.name] from [src]!")
+ var/obj/item/organ/external/bodypart = pick(human.bodyparts)
+ if(bodypart.internal_bleeding())
+ to_chat(user, span_warning("You tear through [human]'s skin releasing the blood from [human.p_their()] [bodypart.name]!"))
playsound(get_turf(human), 'sound/effects/pierce.ogg', 30, TRUE)
- BP.internal_bleeding = TRUE
human.blood_volume = max(human.blood_volume - 100, 0)
var/splatter_dir = get_dir(user, human)
blood_color = human.dna.species.blood_color
@@ -631,7 +629,7 @@
to_chat(user, "\"Did you like having head?\"")
to_chat(user, "The buckler suddenly hits you in the head!")
user.emote("scream")
- user.apply_damage(10, BRUTE, "head")
+ user.apply_damage(10, BRUTE, BODY_ZONE_HEAD)
user.drop_item_ground(src)
// Clockwork robe. Basic robe from clockwork slab.
@@ -764,7 +762,7 @@
else
to_chat(user, "\"I think this armor is too hot for you to handle.\"")
user.emote("scream")
- user.apply_damage(7, BURN, "chest")
+ user.apply_damage(7, BURN, BODY_ZONE_CHEST)
user.IgniteMob()
user.drop_item_ground(src)
@@ -910,7 +908,7 @@
else
to_chat(user, "\"I think this armor is too hot for you to handle.\"")
user.emote("scream")
- user.apply_damage(15, BURN, "chest")
+ user.apply_damage(15, BURN, BODY_ZONE_CHEST)
user.adjust_fire_stacks(2)
user.IgniteMob()
user.drop_item_ground(src)
@@ -1028,8 +1026,8 @@
to_chat(user, "\"Did you like having arms?\"")
to_chat(user, "The gauntlets suddenly squeeze tight, crushing your arms before you manage to get them off!")
user.emote("scream")
- user.apply_damage(7, BRUTE, "l_arm")
- user.apply_damage(7, BRUTE, "r_arm")
+ user.apply_damage(7, BRUTE, BODY_ZONE_L_ARM)
+ user.apply_damage(7, BRUTE, BODY_ZONE_R_ARM)
user.drop_item_ground(src)
// Shoes
@@ -1068,8 +1066,8 @@
to_chat(user, "\"Let's see if you can dance with these.\"")
to_chat(user, "The treads turn searing hot as you scramble to get them off!")
user.emote("scream")
- user.apply_damage(7, BURN, "l_leg")
- user.apply_damage(7, BURN, "r_leg")
+ user.apply_damage(7, BURN, BODY_ZONE_L_LEG)
+ user.apply_damage(7, BURN, BODY_ZONE_R_LEG)
user.drop_item_ground(src)
// Helmet
@@ -1115,7 +1113,7 @@
to_chat(user, "\"Do you have a hole in your head? You're about to.\"")
to_chat(user, "The helmet tries to drive a spike through your head as you scramble to remove it!")
user.emote("scream")
- user.apply_damage(30, BRUTE, "head")
+ user.apply_damage(30, BRUTE, BODY_ZONE_HEAD)
user.adjustBrainLoss(30)
user.drop_item_ground(src)
@@ -1423,10 +1421,9 @@
living.heal_overall_damage(60, 60, TRUE, FALSE, TRUE)
living.reagents?.add_reagent("epinephrine", 5)
var/mob/living/carbon/human/H = living
- for(var/thing in H.bodyparts)
- var/obj/item/organ/external/E = thing
- E.internal_bleeding = FALSE
- E.mend_fracture()
+ for(var/obj/item/organ/external/bodypart as anything in H.bodyparts)
+ bodypart.stop_internal_bleeding()
+ bodypart.mend_fracture()
else
affected.ratvar_act()
animate(src, transform = matrix() * 0.1, time = 2 SECONDS)
diff --git a/code/game/gamemodes/clockwork/cogscarab.dm b/code/game/gamemodes/clockwork/cogscarab.dm
index e63a0771375..4f9f4f8253f 100644
--- a/code/game/gamemodes/clockwork/cogscarab.dm
+++ b/code/game/gamemodes/clockwork/cogscarab.dm
@@ -204,7 +204,7 @@
if(is_type_in_list(AM, allowed_bumpable_objects))
return ..()
-/mob/living/silicon/robot/cogscarab/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE)
+/mob/living/silicon/robot/cogscarab/start_pulling(atom/movable/AM, force = pull_force, show_message = FALSE)
if(is_type_in_list(AM, pullable_items))
..(AM, force = INFINITY) // Drone power! Makes them able to drag pipes and such
@@ -213,13 +213,13 @@
var/obj/item/O = AM
if(O.w_class > WEIGHT_CLASS_SMALL)
if(show_message)
- to_chat(src, "You are too small to pull that.")
+ to_chat(src, span_warning("You are too small to pull that."))
return
else
..()
else
if(show_message)
- to_chat(src, "You are too small to pull that.")
+ to_chat(src, span_warning("You are too small to pull that."))
/mob/living/silicon/robot/cogscarab/add_robot_verbs()
src.verbs |= silicon_subsystems
diff --git a/code/game/gamemodes/cult/blood_magic.dm b/code/game/gamemodes/cult/blood_magic.dm
index 5d456df973a..e4c4e3ef793 100644
--- a/code/game/gamemodes/cult/blood_magic.dm
+++ b/code/game/gamemodes/cult/blood_magic.dm
@@ -164,13 +164,13 @@
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
var/oof = FALSE
- for(var/obj/item/organ/external/E in H.bodyparts)
+ for(var/obj/item/organ/external/E as anything in H.bodyparts)
if(E.is_robotic())
oof = TRUE
break
if(!oof)
- for(var/obj/item/organ/internal/I in H.internal_organs)
- if(I.is_robotic())
+ for(var/obj/item/organ/internal/organ as anything in H.internal_organs)
+ if(organ.is_robotic())
oof = TRUE
break
if(oof)
@@ -523,7 +523,7 @@
/obj/item/melee/blood_magic/shackles/afterattack(atom/target, mob/living/carbon/user, proximity)
if(iscarbon(target) && proximity)
var/mob/living/carbon/C = target
- if(C.canBeHandcuffed() || C.get_arm_ignore())
+ if(C.canBeHandcuffed())
if(C.getStaminaLoss() > 90 || C.health <= HEALTH_THRESHOLD_CRIT || C.IsSleeping())
CuffAttack(C, user)
else
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index fd7338366b5..0a6c5763f3b 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -78,7 +78,6 @@ GLOBAL_LIST_EMPTY(all_cults)
return (length(cult) > 0)
/datum/game_mode/cult/post_setup()
- modePlayer += cult
cult_objs.setup()
for(var/datum/mind/cult_mind in cult)
@@ -340,3 +339,8 @@ GLOBAL_LIST_EMPTY(all_cults)
to_chat(world, endtext)
..()
+
+
+/proc/is_cultist(mob/living/user)
+ return istype(user) && user.mind && SSticker && SSticker.mode && (user.mind in SSticker.mode.cult)
+
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 49531b099ca..966cf5d63ca 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -39,7 +39,7 @@
"\"You shouldn't play with sharp things. You'll poke someone's eye out.\"")
if(ishuman(user))
var/mob/living/carbon/human/H = user
- H.apply_damage(rand(force/2, force), BRUTE, pick("l_arm", "r_arm"))
+ H.apply_damage(rand(force/2, force), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
else
user.adjustBruteLoss(rand(force/2, force))
return
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 20d4a6ab77c..e6fff3140b9 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -181,7 +181,7 @@
to_chat(user, "[G.affecting] is dead!")
return FALSE
var/mob/living/carbon/human/C = G.affecting
- var/obj/item/organ/external/head/head = C.get_organ("head")
+ var/obj/item/organ/external/head/head = C.get_organ(BODY_ZONE_HEAD)
if(!head)
to_chat(user, "[C] has no head!")
return FALSE
@@ -190,7 +190,7 @@
C.visible_message("[user] dunks [C]'s face into [src]'s lava!",
"[user] dunks your face into [src]'s lava!")
C.emote("scream")
- C.apply_damage(30, BURN, "head") // 30 fire damage because it's FUCKING LAVA
+ C.apply_damage(30, BURN, BODY_ZONE_HEAD) // 30 fire damage because it's FUCKING LAVA
head.disfigure() // Your face is unrecognizable because it's FUCKING LAVA
C.UpdateDamageIcon()
add_attack_logs(user, C, "Lava-dunked into [src]")
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index c8815ab03d4..02f3c47f824 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -130,6 +130,8 @@ To draw a rune, use a ritual dagger.
visible_message("[src] suddenly appears!")
alpha = initial(alpha)
+/obj/effect/rune/is_cleanable()
+ return TRUE
/*
There are a few different procs each rune runs through when a cultist activates it.
@@ -343,9 +345,9 @@ structure_check() searches for nearby cultist structures required for the invoca
else
H.visible_message("[convertee]'s wounds heal and close!",
"Your wounds have been healed. Now spread the blood to others.")
- for(var/obj/item/organ/external/E in H.bodyparts)
- E.mend_fracture()
- E.internal_bleeding = FALSE
+ for(var/obj/item/organ/external/bodypart as anything in H.bodyparts)
+ bodypart.mend_fracture()
+ bodypart.stop_internal_bleeding()
for(var/datum/disease/critical/crit in H.diseases) // cure all crit conditions
crit.cure()
diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm
index 4a6beb91733..645dbc493d1 100644
--- a/code/game/gamemodes/devil/devil_game_mode.dm
+++ b/code/game/gamemodes/devil/devil_game_mode.dm
@@ -62,6 +62,5 @@
for(var/datum/objective/objective in devil.objectives)
to_chat(devil.current, "Objective #[obj_count]: [objective.explanation_text]")
obj_count++
- modePlayer += devils
..()
return 1
diff --git a/code/game/gamemodes/devil/true_devil/_true_devil.dm b/code/game/gamemodes/devil/true_devil/_true_devil.dm
index 5881857a828..75ee05e54e9 100644
--- a/code/game/gamemodes/devil/true_devil/_true_devil.dm
+++ b/code/game/gamemodes/devil/true_devil/_true_devil.dm
@@ -25,11 +25,11 @@
/mob/living/carbon/true_devil/New(loc, mob/living/carbon/dna_source)
if(dna_source)
dna = dna_source.dna.Clone()
+ else
+ dna = new
- var/obj/item/organ/internal/brain/B = new(src)
- var/obj/item/organ/internal/ears/E = new(src)
- B.insert()
- E.insert()
+ new /obj/item/organ/internal/brain(src)
+ new /obj/item/organ/internal/ears(src)
..()
// Determines if mob has and can use his hands like a human
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 441970c8dce..6bca90497ad 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -24,8 +24,6 @@
/// See nuclearbomb.dm and malfunction.dm
var/explosion_in_progress = FALSE //sit back and relax
var/false_report_weight = 0 //How often will this show up incorrectly in a centcom report? --Not used--
- var/maximum_players = 0 // --Not used--
- var/list/datum/mind/modePlayer = new
// Jobs it doesn't make sense to be antags. I.E chaplain or AI cultist
var/list/restricted_jobs = list()
/// Jobs that can't be antags.
@@ -41,8 +39,6 @@
/// Whether ERT call is even allowed in this mode.
var/ert_disabled = FALSE
var/newscaster_announcements = null
- var/uplink_welcome = "Syndicate Uplink Console:"
- var/uplink_uses = 20
/// Lower bound on time before intercept arrives.
var/const/waittime_l = 60 SECONDS
@@ -78,13 +74,6 @@
return FALSE
-/**
- * For when you really don't want certain jobs ingame.
- */
-/datum/game_mode/proc/pre_pre_setup()
- return TRUE
-
-
/**
* Attempts to select players for special roles the mode might have.
*/
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 2ebcd1f1516..896d17f0462 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -4,7 +4,7 @@ VOX HEIST ROUNDTYPE
GLOBAL_LIST_EMPTY(raider_spawn)
GLOBAL_LIST_EMPTY(cortical_stacks) //Stacks for 'leave nobody behind' objective. Clumsy, rewrite sometime.
-/datum/game_mode/
+/datum/game_mode
var/list/datum/mind/raiders = list() //Antags.
var/list/raid_objectives = list() //Raid objectives
@@ -27,16 +27,14 @@ GLOBAL_LIST_EMPTY(cortical_stacks) //Stacks for 'leave nobody behind' objective.
to_chat(world, "Personnel: Trade with the raiders, or repel them and their low, low prices and/or crossbows.")
/datum/game_mode/heist/can_start()
-
if(!..())
- return 0
-
+ return FALSE
var/list/candidates = get_players_for_role(ROLE_RAIDER)
var/raider_num = 0
//Check that we have enough vox.
if(candidates.len < required_enemies)
- return 0
+ return FALSE
else if(candidates.len < recommended_enemies)
raider_num = candidates.len
else
@@ -44,20 +42,18 @@ GLOBAL_LIST_EMPTY(cortical_stacks) //Stacks for 'leave nobody behind' objective.
//Grab candidates randomly until we have enough.
while(raider_num > 0)
- var/datum/mind/new_raider = pick(candidates)
+ var/datum/mind/new_raider = pick_n_take(candidates)
raiders += new_raider
- candidates -= new_raider
raider_num--
+ return TRUE
+
+/datum/game_mode/heist/pre_setup()
for(var/datum/mind/raider in raiders)
raider.assigned_role = SPECIAL_ROLE_RAIDER
raider.special_role = SPECIAL_ROLE_RAIDER
raider.offstation_role = TRUE
- ..()
- return 1
-
-/datum/game_mode/heist/pre_setup()
- return 1
+ return TRUE
/datum/game_mode/heist/post_setup()
@@ -94,7 +90,7 @@ GLOBAL_LIST_EMPTY(cortical_stacks) //Stacks for 'leave nobody behind' objective.
newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah"))
var/mob/living/carbon/human/vox = newraider.current
- var/obj/item/organ/external/head/head_organ = vox.get_organ("head")
+ var/obj/item/organ/external/head/head_organ = vox.get_organ(BODY_ZONE_HEAD)
vox.real_name = capitalize(newname)
vox.dna.real_name = vox.real_name
@@ -121,7 +117,7 @@ GLOBAL_LIST_EMPTY(cortical_stacks) //Stacks for 'leave nobody behind' objective.
vox.update_dna()
vox.update_eyes()
- for(var/obj/item/organ/external/limb in vox.bodyparts)
+ for(var/obj/item/organ/external/limb as anything in vox.bodyparts)
limb.status &= ~ORGAN_ROBOT
//Now apply cortical stack.
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 3fe1e73788f..246fcfc500d 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -21,7 +21,7 @@
if(owner_AI && owner_AI.malf_cooldown > world.time)
return
-/datum/action/innate/ai/Trigger()
+/datum/action/innate/ai/Trigger(left_click = TRUE)
. = ..()
if(auto_use_uses)
adjust_uses(-1)
@@ -93,7 +93,7 @@
. = ..()
owner_AI.malf_picker = new /datum/module_picker
-/datum/action/innate/ai/choose_modules/Trigger()
+/datum/action/innate/ai/choose_modules/Trigger(left_click = TRUE)
. = ..()
owner_AI.malf_picker.use(owner_AI)
@@ -104,7 +104,7 @@
button_icon_state = "apcemag"
auto_use_uses = FALSE // Here just to prevent the "You have X uses remaining" from popping up.
-/datum/action/innate/ai/return_to_core/Trigger()
+/datum/action/innate/ai/return_to_core/Trigger(left_click = TRUE)
. = ..()
var/obj/machinery/power/apc/apc = owner_AI.loc
if(!istype(apc)) // This shouldn't happen but here for safety.
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 4bb77b0e26f..4951975a8d6 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -308,7 +308,7 @@
/obj/item/abductor/mind_device/proc/mind_control(atom/target, mob/living/user)
if(iscarbon(target))
var/mob/living/carbon/C = target
- var/obj/item/organ/internal/heart/gland/G = C.get_organ_slot("heart")
+ var/obj/item/organ/internal/heart/gland/G = C.get_organ_slot(INTERNAL_ORGAN_HEART)
if(!istype(G))
to_chat(user, "Your target does not have an experimental gland!")
return
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
index 2ba7bdd7b40..c979faa7f7e 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
@@ -1,7 +1,7 @@
/datum/surgery/organ_extraction
name = "Experimental Dissection"
steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/open_encased/saw, /datum/surgery_step/open_encased/retract, /datum/surgery_step/internal/extract_organ, /datum/surgery_step/internal/gland_insert, /datum/surgery_step/glue_bone, /datum/surgery_step/set_bone, /datum/surgery_step/finish_bone, /datum/surgery_step/generic/cauterize)
- possible_locs = list("chest")
+ possible_locs = list(BODY_ZONE_CHEST)
/datum/surgery/organ_extraction/can_start(mob/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
if(!ishuman(user))
@@ -26,10 +26,10 @@
var/obj/item/organ/internal/IC = null
/datum/surgery_step/internal/extract_organ/begin_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- for(var/obj/item/I in target.internal_organs)
+ for(var/obj/item/organ/internal/organ as anything in target.internal_organs)
// Allows for multiple subtypes of heart.
- if(istype(I, /obj/item/organ/internal/heart))
- IC = I
+ if(istype(organ, /obj/item/organ/internal/heart))
+ IC = organ
break
user.visible_message("[user] starts to remove [target]'s organs.", "You start to remove [target]'s organs...")
..()
@@ -40,7 +40,7 @@
user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].")
IC.forceMove_turf()
user.put_in_hands(IC, ignore_anim = FALSE)
- IC.remove(target, special = 1)
+ IC.remove(target, ORGAN_MANIPULATION_NOEFFECT)
return TRUE
if(NO_INTORGANS in AB.dna.species.species_traits)
user.visible_message("[user] prepares [target]'s [target_zone] for further dissection!", "You prepare [target]'s [target_zone] for further dissection.")
@@ -66,7 +66,7 @@
user.visible_message("[user] inserts [tool] into [target].", "You insert [tool] into [target].")
user.drop_from_active_hand()
var/obj/item/organ/internal/heart/gland/gland = tool
- gland.insert(target, 2)
+ gland.insert(target, ORGAN_MANIPULATION_ABDUCTOR)
return TRUE
/datum/surgery_step/internal/gland_insert/fail_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -78,7 +78,7 @@
/datum/surgery/organ_extraction/synth
name = "Experimental Robotic Dissection"
steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/internal/extract_organ/synth,/datum/surgery_step/internal/gland_insert,/datum/surgery_step/robotics/external/close_hatch)
- possible_locs = list("chest")
+ possible_locs = list(BODY_ZONE_CHEST)
requires_organic_bodypart = 0
/datum/surgery/organ_extraction/synth/can_start(mob/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index a65b5ed98c4..008b584ef96 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -67,8 +67,8 @@
active_mind_control = FALSE
update_gland_hud()
-/obj/item/organ/internal/heart/gland/remove(var/mob/living/carbon/M, special = 0)
- active = 0
+/obj/item/organ/internal/heart/gland/remove(mob/living/carbon/M, special = ORGAN_MANIPULATION_DEFAULT)
+ active = FALSE
if(initial(uses) == 1)
uses = initial(uses)
var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR]
@@ -76,9 +76,9 @@
clear_mind_control()
. = ..()
-/obj/item/organ/internal/heart/gland/insert(var/mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/gland/insert(mob/living/carbon/M, special = ORGAN_MANIPULATION_DEFAULT)
..()
- if(special != 2 && uses) // Special 2 means abductor surgery
+ if(special != ORGAN_MANIPULATION_ABDUCTOR && uses)
Start()
var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR]
hud.add_to_hud(owner)
@@ -126,7 +126,7 @@
mind_control_uses = 1
mind_control_duration = 2400
-/obj/item/organ/internal/heart/gland/slime/insert(mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/gland/slime/insert(mob/living/carbon/M, special = ORGAN_MANIPULATION_DEFAULT)
..()
owner.faction |= "slime"
owner.add_language("Bubblish")
@@ -274,14 +274,14 @@
mind_control_uses = 2
mind_control_duration = 900
-/obj/item/organ/internal/heart/gland/electric/insert(mob/living/carbon/M, special = 0)
- ..()
+/obj/item/organ/internal/heart/gland/electric/insert(mob/living/carbon/M, special = ORGAN_MANIPULATION_DEFAULT)
+ . = ..()
if(ishuman(owner))
owner.gene_stability += GENE_INSTABILITY_MODERATE // give them this gene for free
owner.dna.SetSEState(GLOB.shockimmunityblock, TRUE)
genemutcheck(owner, GLOB.shockimmunityblock, null, MUTCHK_FORCED)
-/obj/item/organ/internal/heart/gland/electric/remove(mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/gland/electric/remove(mob/living/carbon/M, special = ORGAN_MANIPULATION_DEFAULT)
if(ishuman(owner))
owner.gene_stability -= GENE_INSTABILITY_MODERATE // but return it to normal once it's removed
owner.dna.SetSEState(GLOB.shockimmunityblock, FALSE)
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index f125b95061a..bce2ceb4b62 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -318,7 +318,7 @@
var/list/choices = list()
for(var/mob/living/carbon/human/H in view(1,src))
- var/obj/item/organ/external/head/head = H.get_organ("head")
+ var/obj/item/organ/external/head/head = H.get_organ(BODY_ZONE_HEAD)
if(head.is_robotic())
continue
if(H.stat != DEAD && Adjacent(H) && !H.has_brain_worms())
diff --git a/code/game/gamemodes/miniantags/demons/pulse_demon/pulse_demon.dm b/code/game/gamemodes/miniantags/demons/pulse_demon/pulse_demon.dm
index 9cc22273760..dc9a3ee8719 100644
--- a/code/game/gamemodes/miniantags/demons/pulse_demon/pulse_demon.dm
+++ b/code/game/gamemodes/miniantags/demons/pulse_demon/pulse_demon.dm
@@ -815,16 +815,16 @@
user.drop_from_active_hand()
insert(user)
-/obj/item/organ/internal/heart/demon/pulse/insert(mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/demon/pulse/insert(mob/living/carbon/M, special = ORGAN_MANIPULATION_DEFAULT)
. = ..()
M.AddComponent(/datum/component/cross_shock, 30, 500, 2 SECONDS)
ADD_TRAIT(M, TRAIT_SHOCKIMMUNE, UNIQUE_TRAIT_SOURCE(src))
M.set_light(3, 2, "#bbbb00")
-/obj/item/organ/internal/heart/demon/pulse/remove(mob/living/carbon/M, special = 0)
- . = ..()
+/obj/item/organ/internal/heart/demon/pulse/remove(mob/living/carbon/M, special = ORGAN_MANIPULATION_DEFAULT)
REMOVE_TRAIT(M, TRAIT_SHOCKIMMUNE, UNIQUE_TRAIT_SOURCE(src))
M.remove_light()
+ . = ..()
/obj/item/organ/internal/heart/demon/pulse/on_life()
if(!owner)
diff --git a/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm b/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm
index 37d1176cb86..4b0c5a23d66 100644
--- a/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm
+++ b/code/game/gamemodes/miniantags/demons/shadow_demon/shadow_demon.dm
@@ -238,16 +238,14 @@
insert(user)
-/obj/item/organ/internal/heart/demon/shadow/insert(mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/demon/shadow/insert(mob/living/carbon/M, special = ORGAN_MANIPULATION_DEFAULT)
. = ..()
- if(M.mind)
- M.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball/shadow_grapple)
+ M?.mind?.AddSpell(new /obj/effect/proc_holder/spell/fireball/shadow_grapple)
-/obj/item/organ/internal/heart/demon/shadow/remove(mob/living/carbon/M, special = 0)
- ..()
- if(M.mind)
- M.mind.RemoveSpell(/obj/effect/proc_holder/spell/fireball/shadow_grapple)
+/obj/item/organ/internal/heart/demon/shadow/remove(mob/living/carbon/M, special = ORGAN_MANIPULATION_DEFAULT)
+ M?.mind?.RemoveSpell(/obj/effect/proc_holder/spell/fireball/shadow_grapple)
+ . = ..()
/mob/living/simple_animal/demon/shadow/attempt_objectives()
diff --git a/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter_demon.dm b/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter_demon.dm
index ed50e384156..4e17864bf58 100644
--- a/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter_demon.dm
+++ b/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter_demon.dm
@@ -193,18 +193,17 @@
qdel(src)
-/obj/item/organ/internal/heart/demon/slaughter/insert(mob/living/carbon/M, special = 0)
+/obj/item/organ/internal/heart/demon/slaughter/insert(mob/living/carbon/M, special = ORGAN_MANIPULATION_DEFAULT)
. = ..()
- if(M.mind)
- M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null))
+ M?.mind?.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null))
-/obj/item/organ/internal/heart/demon/slaughter/remove(mob/living/carbon/M, special = 0)
- ..()
+/obj/item/organ/internal/heart/demon/slaughter/remove(mob/living/carbon/M, special = ORGAN_MANIPULATION_DEFAULT)
if(M.mind)
REMOVE_TRAIT(M, TRAIT_BLOODCRAWL, TRAIT_BLOODCRAWL)
REMOVE_TRAIT(M, TRAIT_BLOODCRAWL_EAT, TRAIT_BLOODCRAWL_EAT)
M.mind.RemoveSpell(/obj/effect/proc_holder/spell/bloodcrawl)
+ . = ..()
/**
diff --git a/code/game/gamemodes/miniantags/guardian/host_actions.dm b/code/game/gamemodes/miniantags/guardian/host_actions.dm
index 48a32370ed2..a992447f1e4 100644
--- a/code/game/gamemodes/miniantags/guardian/host_actions.dm
+++ b/code/game/gamemodes/miniantags/guardian/host_actions.dm
@@ -26,7 +26,7 @@
desc = "Communicate telepathically with your guardian."
button_icon_state = "communicate"
-/datum/action/guardian/communicate/Trigger()
+/datum/action/guardian/communicate/Trigger(left_click = TRUE)
var/input = stripped_input(owner, "Enter a message to tell your guardian:", "Message", "")
if(!input)
return
@@ -51,7 +51,7 @@
desc = "Forcibly recall your guardian."
button_icon_state = "recall"
-/datum/action/guardian/recall/Trigger()
+/datum/action/guardian/recall/Trigger(left_click = TRUE)
guardian.Recall()
/**
@@ -70,7 +70,7 @@
return FALSE
return TRUE
-/datum/action/guardian/reset_guardian/Trigger()
+/datum/action/guardian/reset_guardian/Trigger(left_click = TRUE)
if(cooldown_timer)
to_chat(owner, "This ability is still recharging.")
return
diff --git a/code/game/gamemodes/miniantags/guardian/types/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm
index 9e6e3a6d122..4b33300dca9 100644
--- a/code/game/gamemodes/miniantags/guardian/types/healer.dm
+++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm
@@ -209,7 +209,7 @@
switch(random_cure)
if("bleedings")
var/obj/item/organ/external/limb = pick(injures["bleedings"])
- limb.internal_bleeding = FALSE
+ limb.stop_internal_bleeding()
to_chat(user, "Внутреннее кровотечение остановлено.")
return 1
if("fractures")
@@ -223,11 +223,9 @@
to_chat(user, "Очищено тело хозяина от инфекции.")
return 1
if("embedded")
- var/obj/item/organ/external/limb = pick(injures["embedded"])
- var/turf/T = get_turf(summoner)
- var/obj/item/item = pick(limb.embedded_objects)
- limb.embedded_objects -= item
- item.forceMove(T)
+ var/obj/item/organ/external/limb = safepick(injures["embedded"])
+ var/obj/item/item = safepick(limb?.embedded_objects)
+ limb?.remove_embedded_object(item)
to_chat(user, "Удалось вытащить застрявший предмет.")
return 1
if("damaged_organs")
diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm
index 5184b9b7d64..aebb7b0f431 100644
--- a/code/game/gamemodes/miniantags/morph/morph.dm
+++ b/code/game/gamemodes/miniantags/morph/morph.dm
@@ -113,8 +113,12 @@
/mob/living/simple_animal/hostile/morph/wizard/New()
. = ..()
- AddSpell(new /obj/effect/proc_holder/spell/smoke)
- AddSpell(new /obj/effect/proc_holder/spell/forcewall)
+ var/obj/effect/proc_holder/spell/smoke/smoke = new
+ var/obj/effect/proc_holder/spell/forcewall/forcewall = new
+ smoke.human_req = FALSE
+ forcewall.human_req = FALSE
+ AddSpell(smoke)
+ AddSpell(forcewall)
/mob/living/simple_animal/hostile/morph/proc/try_eat(atom/movable/item)
@@ -240,7 +244,7 @@
return TRUE
else if (!morphed)
to_chat(attacker, "Touching [src] with your hands hurts you!")
- var/obj/item/organ/external/affecting = attacker.get_organ("[attacker.hand ? "l" : "r" ]_hand")
+ var/obj/item/organ/external/affecting = attacker.get_organ(attacker.hand ? BODY_ZONE_PRECISE_L_HAND : BODY_ZONE_PRECISE_R_HAND)
affecting.receive_damage(20)
add_food(5)
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 8a5205120bb..2c0817cc5d5 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -1,11 +1,8 @@
-#define NUKESCALINGMODIFIER 1.2
+#define NUKESCALINGMODIFIER 6
/datum/game_mode
var/list/datum/mind/syndicates = list()
-/proc/issyndicate(mob/living/M as mob)
- return istype(M) && M.mind && SSticker && SSticker.mode && (M.mind in SSticker.mode.syndicates)
-
/datum/game_mode/nuclear
name = "nuclear emergency"
config_tag = "nuclear"
@@ -25,40 +22,34 @@
to_chat(world, "A [syndicate_name()] Strike Force is approaching [station_name()]!")
to_chat(world, "A nuclear explosive was being transported by Nanotrasen to a military base. The transport ship mysteriously lost contact with Space Traffic Control (STC). About that time a strange disk was discovered around [station_name()]. It was identified by Nanotrasen as a nuclear authentication disk and now Syndicate Operatives have arrived to retake the disk and detonate SS13! There are most likely Syndicate starships are in the vicinity, so take care not to lose the disk!\nSyndicate: Reclaim the disk and detonate the nuclear bomb anywhere on SS13.\nPersonnel: Hold the disk and escape with the disk on the shuttle!")
-/datum/game_mode/nuclear/can_start()//This could be better, will likely have to recode it later
+/datum/game_mode/nuclear/can_start()
if(!..())
- return 0
-
+ return FALSE
var/list/possible_syndicates = get_players_for_role(ROLE_OPERATIVE)
var/agent_number = 0
- if(possible_syndicates.len < 1)
- return 0
+ if(!length(possible_syndicates))
+ return FALSE
- if(LAZYLEN(possible_syndicates) > agents_possible)
+ if(possible_syndicates.len > agents_possible)
agent_number = agents_possible
else
agent_number = possible_syndicates.len
var/n_players = num_players()
if(agent_number > n_players)
- agent_number = n_players/2
+ agent_number = n_players / 2
while(agent_number > 0)
- var/datum/mind/new_syndicate = pick(possible_syndicates)
+ var/datum/mind/new_syndicate = pick_n_take(possible_syndicates)
syndicates += new_syndicate
- possible_syndicates -= new_syndicate //So it doesn't pick the same guy each time.
agent_number--
+/datum/game_mode/nuclear/pre_setup()
for(var/datum/mind/synd_mind in syndicates)
synd_mind.assigned_role = SPECIAL_ROLE_NUKEOPS //So they aren't chosen for other jobs.
synd_mind.special_role = SPECIAL_ROLE_NUKEOPS
- return 1
-
-
-/datum/game_mode/nuclear/pre_setup()
- ..()
- return 1
+ return TRUE
/datum/game_mode/proc/remove_operative(datum/mind/operative_mind)
if(operative_mind in syndicates)
@@ -169,7 +160,7 @@
M.overeatduration = 0
M.flavor_text = null
- var/obj/item/organ/external/head/head_organ = M.get_organ("head")
+ var/obj/item/organ/external/head/head_organ = M.get_organ(BODY_ZONE_HEAD)
var/hair_c = pick("#8B4513","#000000","#FF4500","#FFD700") // Brown, black, red, blonde
var/eye_c = pick("#000000","#8B4513","1E90FF") // Black, brown, blue
var/skin_tone = pick(-50, -30, -10, 0, 0, 0, 10) // Caucasian/black
@@ -251,7 +242,7 @@
return 1337 // WHY??? -- Doohl
-/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob, uplink_uses = 20)
+/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob, uplink_uses = 100)
var/radio_freq = SYND_FREQ
var/obj/item/radio/R = new /obj/item/radio/headset/syndicate/alt(synd_mob)
diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm
index afa56a1e7d3..202effadd56 100644
--- a/code/game/gamemodes/nuclear/nuclear_challenge.dm
+++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm
@@ -1,7 +1,7 @@
-#define CHALLENGE_TELECRYSTALS 280
+#define CHALLENGE_TELECRYSTALS 1400
#define CHALLENGE_TIME_LIMIT 6000
#define CHALLENGE_SCALE_PLAYER 1 // How many player per scaling bonus
-#define CHALLENGE_SCALE_BONUS 2 // How many TC per scaling bonus
+#define CHALLENGE_SCALE_BONUS 10 // How many TC per scaling bonus
#define CHALLENGE_MIN_PLAYERS 50
#define CHALLENGE_SHUTTLE_DELAY 18000 //30 minutes, so the ops have at least 10 minutes before the shuttle is callable. Gives the nuke ops at least 15 minutes before shuttle arrive.
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index 4636e9cd449..9521f1d4c92 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -108,7 +108,7 @@
if(!the_s_bomb)
the_s_bomb = locate()
-/obj/item/pinpointer/proc/point_at(atom/target)
+/obj/item/pinpointer/proc/pinpoint_at(atom/target)
if(!target)
icon_state = icon_null
return
@@ -132,15 +132,15 @@
/obj/item/pinpointer/proc/workdisk()
scandisk()
- point_at(the_disk)
+ pinpoint_at(the_disk)
/obj/item/pinpointer/proc/workbomb()
if(!syndicate)
scanbomb()
- point_at(the_bomb)
+ pinpoint_at(the_bomb)
else
scanbomb()
- point_at(the_s_bomb)
+ pinpoint_at(the_s_bomb)
/obj/item/pinpointer/examine(mob/user)
. = ..()
@@ -163,13 +163,13 @@
if(SETTING_DISK)
workdisk()
if(SETTING_LOCATION)
- point_at(location)
+ pinpoint_at(location)
if(SETTING_OBJECT)
- point_at(target)
+ pinpoint_at(target)
/obj/item/pinpointer/advpinpointer/workdisk() //since mode works diffrently for advpinpointer
scandisk()
- point_at(the_disk)
+ pinpoint_at(the_disk)
/obj/item/pinpointer/advpinpointer/AltClick(mob/user)
. = ..()
@@ -280,7 +280,7 @@
visible_message("Shuttle Locator mode actived.") //Lets the mob holding it know that the mode has changed
return //Get outta here
scandisk()
- point_at(the_disk)
+ pinpoint_at(the_disk)
/obj/item/pinpointer/nukeop/workbomb()
if(GLOB.bomb_set) //If the bomb is set, lead to the shuttle
@@ -290,7 +290,7 @@
visible_message("Shuttle Locator mode actived.") //Lets the mob holding it know that the mode has changed
return //Get outta here
scanbomb()
- point_at(the_s_bomb)
+ pinpoint_at(the_s_bomb)
/obj/item/pinpointer/nukeop/proc/worklocation()
if(!GLOB.bomb_set)
@@ -307,7 +307,7 @@
if(loc.z != home.z) //If you are on a different z-level from the shuttle
icon_state = icon_null
else
- point_at(home)
+ pinpoint_at(home)
/obj/item/pinpointer/operative
name = "operative pinpointer"
@@ -340,7 +340,7 @@
/obj/item/pinpointer/operative/proc/workop()
if(mode == MODE_OPERATIVE)
scan_for_ops()
- point_at(nearest_op, FALSE)
+ pinpoint_at(nearest_op, FALSE)
else
return FALSE
@@ -375,7 +375,7 @@
/obj/item/pinpointer/ninja/proc/workninja()
scan_for_ninja()
- point_at(nearest_ninja, FALSE)
+ pinpoint_at(nearest_ninja, FALSE)
/obj/item/pinpointer/ninja/examine(mob/user)
. = ..()
@@ -413,9 +413,9 @@
/obj/item/pinpointer/crew/process()
if(mode == MODE_CREW && target_set)
- point_at(target)
+ pinpoint_at(target)
-/obj/item/pinpointer/crew/point_at(atom/target)
+/obj/item/pinpointer/crew/pinpoint_at(atom/target)
if(!target || !trackable(target))
icon_state = icon_null
return
@@ -490,9 +490,9 @@
/obj/item/pinpointer/thief/process()
switch(setting)
if(SETTING_LOCATION)
- point_at(location)
+ pinpoint_at(location)
if(SETTING_OBJECT)
- point_at(target)
+ pinpoint_at(target)
/obj/item/pinpointer/thief/cycle(mob/user)
@@ -699,14 +699,14 @@
/obj/item/pinpointer/tendril/process()
if(mode == MODE_TENDRIL)
find_tendril()
- point_at(target, FALSE)
+ pinpoint_at(target, FALSE)
else
icon_state = icon_off
/obj/item/pinpointer/tendril/proc/find_tendril()
if(mode == MODE_TENDRIL)
scan_for_tendrils()
- point_at(target)
+ pinpoint_at(target)
else
return FALSE
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 4c39245b1f2..f0abfe9c3b3 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -122,7 +122,6 @@
for(var/datum/mind/rev_mind in head_revolutionaries)
greet_revolutionary(rev_mind)
- modePlayer += head_revolutionaries
..()
@@ -401,3 +400,12 @@
dat += "
[DISCORD_EMOJI_IMAGE(emojiId, 48, 48)] [emojiName] | "
+ else
+ rowString += "" + rowString += " |