diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index c764adca16..bba92be7a7 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -46022,6 +46022,9 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/delivery,
+/obj/machinery/shower{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"cek" = (
@@ -46030,6 +46033,9 @@
name = "engineering security door"
},
/obj/effect/turf_decal/delivery,
+/obj/machinery/shower{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"cel" = (
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index 4a8eee364c..f9792a736e 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -44325,7 +44325,9 @@
dir = 1;
pixel_y = -22
},
-/obj/structure/closet/radiation,
+/obj/machinery/shower{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/break_room)
"bWF" = (
@@ -44352,7 +44354,10 @@
dir = 6
},
/obj/effect/turf_decal/delivery,
-/obj/structure/closet/radiation,
+/obj/machinery/shower{
+ dir = 8;
+ pixel_y = -4
+ },
/turf/open/floor/plasteel,
/area/engine/break_room)
"bWH" = (
@@ -44932,6 +44937,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/structure/closet/radiation,
/turf/open/floor/plasteel,
/area/engine/engineering)
"bYn" = (
@@ -44956,6 +44962,7 @@
/obj/machinery/light{
dir = 4
},
+/obj/structure/closet/radiation,
/turf/open/floor/plasteel,
/area/engine/engineering)
"bYp" = (
@@ -53780,7 +53787,7 @@
"eSB" = (
/obj/machinery/computer/cryopod{
dir = 1;
- pixel_y = -26;
+ pixel_y = -26
},
/turf/open/floor/plasteel/dark,
/area/security/prison)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 74a1fbd785..34a34273dc 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -294,7 +294,7 @@ GLOBAL_LIST_EMPTY(species_list)
else
return "unknown"
-/proc/do_mob(mob/user , mob/target, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks = null)
+/proc/do_mob(mob/user , mob/target, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks = null, ignorehelditem = 0)
if(!user || !target)
return 0
var/user_loc = user.loc
@@ -327,7 +327,7 @@ GLOBAL_LIST_EMPTY(species_list)
drifting = 0
user_loc = user.loc
- if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_held_item() != holding || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke()))
+ if((!drifting && user.loc != user_loc) || target.loc != target_loc || (!ignorehelditem && user.get_active_held_item() != holding) || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke()))
. = 0
break
if (progress)
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 7d6c017b77..7d8eb108f3 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -94,6 +94,8 @@
// Used to get a properly sanitized multiline input, of max_length
/proc/stripped_multiline_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN, no_trim=FALSE)
var/name = input(user, message, title, default) as message|null
+ if(isnull(name)) // Return null if canceled.
+ return null
if(no_trim)
return copytext(html_encode(name), 1, max_length)
else
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 09cbb68083..ccc2121929 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -103,7 +103,9 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
if(data_by_z["[z]"] && last_update["[z]"] && world.time <= last_update["[z]"] + SENSORS_UPDATE_PERIOD)
return data_by_z["[z]"]
- var/list/results = list()
+ var/list/results_damaged = list()
+ var/list/results_undamaged = list()
+
var/obj/item/clothing/under/U
var/obj/item/card/id/I
var/turf/pos
@@ -114,6 +116,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
var/toxdam
var/burndam
var/brutedam
+ var/totaldam
var/area
var/pos_x
var/pos_y
@@ -157,11 +160,13 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
toxdam = round(H.getToxLoss(),1)
burndam = round(H.getFireLoss(),1)
brutedam = round(H.getBruteLoss(),1)
+ totaldam = oxydam + toxdam + burndam + brutedam
else
oxydam = null
toxdam = null
burndam = null
brutedam = null
+ totaldam = 0
if (nanite_sensors || U.sensor_mode >= SENSOR_COORDS)
if (!pos)
@@ -174,16 +179,26 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
pos_x = null
pos_y = null
- results[++results.len] = list("name" = name, "assignment" = assignment, "ijob" = ijob, "life_status" = life_status, "oxydam" = oxydam, "toxdam" = toxdam, "burndam" = burndam, "brutedam" = brutedam, "area" = area, "pos_x" = pos_x, "pos_y" = pos_y, "can_track" = H.can_track(null))
+ var/total_list = list("name" = name, "assignment" = assignment, "ijob" = ijob, "life_status" = life_status, "oxydam" = oxydam, "toxdam" = toxdam, "burndam" = burndam, "brutedam" = brutedam, "totaldam" = totaldam, "area" = area, "pos_x" = pos_x, "pos_y" = pos_y, "can_track" = H.can_track(null))
- data_by_z["[z]"] = sortTim(results,/proc/sensor_compare)
+ if(totaldam)
+ results_damaged[++results_damaged.len] = total_list
+ else
+ results_undamaged[++results_undamaged.len] = total_list
+
+ var/list/returning = sortTim(results_damaged,/proc/damage_compare) + sortTim(results_undamaged,/proc/ijob_compare)
+
+ data_by_z["[z]"] = returning
last_update["[z]"] = world.time
- return results
+ return returning
-/proc/sensor_compare(list/a,list/b)
+/proc/ijob_compare(list/a,list/b)
return a["ijob"] - b["ijob"]
+/proc/damage_compare(list/a,list/b)
+ return b["totaldam"] - a["totaldam"]
+
/datum/crewmonitor/ui_act(action,params)
var/mob/living/silicon/ai/AI = usr
if(!istype(AI))
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 89d939e505..a8c44656ca 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -252,7 +252,8 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \
new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \
null, \
- new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1), \
+ new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1),\
+ new/datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 1),\
new/datum/stack_recipe("black gloves", /obj/item/clothing/gloves/color/black, 3), \
null, \
new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/sunglasses/blindfold, 2), \
@@ -284,6 +285,13 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \
new/datum/stack_recipe("light tubes", /obj/item/storage/box/lights/tubes), \
new/datum/stack_recipe("light bulbs", /obj/item/storage/box/lights/bulbs), \
new/datum/stack_recipe("mouse traps", /obj/item/storage/box/mousetraps), \
+ new/datum/stack_recipe("lethal ammo box", /obj/item/storage/box/lethalshot), \
+ new/datum/stack_recipe("rubber shot ammo box", /obj/item/storage/box/rubbershot), \
+ new/datum/stack_recipe("bean bag ammo box", /obj/item/storage/box/beanbag), \
+ new/datum/stack_recipe("12g ammo box", /obj/item/storage/box/lethalslugs), \
+ new/datum/stack_recipe("stun slug ammo box", /obj/item/storage/box/stunslug), \
+ new/datum/stack_recipe("tech shell ammo box", /obj/item/storage/box/techsslug), \
+ new/datum/stack_recipe("incendiary ammo box", /obj/item/storage/box/fireshot), \
new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \
new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \
new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index c8e96d0b28..f09c040795 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -14,8 +14,9 @@
* ID and security PDA cart boxes,
* Handcuff, mousetrap, and pillbottle boxes,
* Snap-pops and matchboxes,
- * Replacement light boxes.
- * Action Figure Boxes
+ * Replacement light boxes,
+ * Shotgun Ammo boxes,
+ * Action Figure Boxes,
* Various paper bags.
*
* For syndicate call-ins see uplink_kits.dm
@@ -84,7 +85,6 @@
for(var/i in 1 to 7)
new /obj/item/disk/data(src)
-
/obj/item/storage/box/disks_plantgene
name = "plant data disks box"
illustration = "disk_kit"
@@ -117,7 +117,6 @@
new /obj/item/crowbar/red(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
-
// Engineer survival box
/obj/item/storage/box/engineer/PopulateContents()
new /obj/item/clothing/mask/breath(src)
@@ -261,7 +260,6 @@
new /obj/item/assembly/flash/handheld(src)
new /obj/item/screwdriver(src)
-
/obj/item/storage/box/teargas
name = "box of tear gas grenades (WARNING)"
desc = "WARNING: These devices are extremely dangerous and can cause blindness and skin irritation."
@@ -615,7 +613,6 @@
for(var/i in 1 to 7)
new /obj/item/light/bulb(src)
-
/obj/item/storage/box/deputy
name = "box of deputy armbands"
desc = "To be issued to those authorized to act as deputy of security."
@@ -721,6 +718,46 @@
for(var/i in 1 to 6)
new /obj/item/ammo_casing/shotgun/beanbag(src)
+/obj/item/storage/box/lethalslugs
+ name = "box of 12g shotgun slugs"
+ desc = "A box full of lethal 12g slug, designed for riot shotguns."
+ icon_state = "12g_box"
+ illustration = null
+
+/obj/item/storage/box/lethalslugs/PopulateContents()
+ for(var/i in 1 to 7)
+ new /obj/item/projectile/bullet/shotgun_slug(src)
+
+/obj/item/storage/box/stunslug
+ name = "box of stun slugs"
+ desc = "A box full of stun 12g slugs."
+ icon_state = "stunslug_box"
+ illustration = null
+
+/obj/item/storage/box/stunslug/PopulateContents()
+ for(var/i in 1 to 7)
+ new /obj/item/projectile/bullet/shotgun_stunslug(src)
+
+/obj/item/storage/box/techsslug
+ name = "box of tech shotgun shells"
+ desc = "A box full of tech shotgun shells."
+ icon_state = "techslug_box"
+ illustration = null
+
+/obj/item/storage/box/techsslug/PopulateContents()
+ for(var/i in 1 to 7)
+ new /obj/item/ammo_casing/shotgun/techshell(src)
+
+/obj/item/storage/box/fireshot
+ name = "box of incendiary ammo"
+ desc = "A box full of tech incendiary ammo."
+ icon_state = "fireshot_box"
+ illustration = null
+
+/obj/item/storage/box/techsslug/PopulateContents()
+ for(var/i in 1 to 7)
+ new /obj/item/ammo_casing/shotgun/incendiary(src)
+
/obj/item/storage/box/actionfigure
name = "box of action figures"
desc = "The latest set of collectable action figures."
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index c0e81a7949..5265f555da 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -1,3 +1,5 @@
+#define STUNBATON_CHARGE_LENIENCY 0.3
+
/obj/item/melee/baton
name = "stunbaton"
desc = "A stun baton for incapacitating people with."
@@ -13,7 +15,7 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
var/stunforce = 140
- var/status = 0
+ var/status = FALSE
var/obj/item/stock_parts/cell/cell
var/hitcost = 1000
var/throw_hit_chance = 35
@@ -44,17 +46,31 @@
/obj/item/melee/baton/loaded //this one starts with a cell pre-installed.
preload_cell_type = /obj/item/stock_parts/cell/high
-/obj/item/melee/baton/proc/deductcharge(chrgdeductamt)
- if(cell)
- //Note this value returned is significant, as it will determine
- //if a stun is applied or not
- . = cell.use(chrgdeductamt)
- if(status && cell.charge < hitcost)
- //we're below minimum, turn off
- status = 0
- update_icon()
- playsound(loc, "sparks", 75, 1, -1)
+/obj/item/melee/baton/proc/deductcharge(chrgdeductamt, chargecheck = TRUE)
+ if(!cell)
+ switch_status(FALSE, TRUE)
+ return FALSE
+ //Note this value returned is significant, as it will determine
+ //if a stun is applied or not
+ . = cell.use(chrgdeductamt)
+ if(status && (!. || (chargecheck && cell.charge < hitcost * STUNBATON_CHARGE_LENIENCY)))
+ //we're below minimum, turn off
+ switch_status(FALSE)
+/obj/item/melee/baton/proc/switch_status(new_status = FALSE, silent = FALSE)
+ if(status == new_status)
+ return
+ status = new_status
+ update_icon()
+ if(!silent)
+ playsound(loc, "sparks", 75, 1, -1)
+ if(status)
+ START_PROCESSING(SSobj, src)
+ else
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/melee/baton/process()
+ deductcharge(hitcost * 0.004, FALSE)
/obj/item/melee/baton/update_icon()
if(status)
@@ -92,31 +108,25 @@
cell.forceMove(get_turf(src))
cell = null
to_chat(user, "You remove the cell from [src].")
- status = 0
- update_icon()
+ switch_status(FALSE, TRUE)
else
return ..()
/obj/item/melee/baton/attack_self(mob/user)
- if(cell && cell.charge > hitcost)
- status = !status
+ if(cell && cell.charge > hitcost * STUNBATON_CHARGE_LENIENCY)
+ switch_status(!status)
to_chat(user, "[src] is now [status ? "on" : "off"].")
- playsound(loc, "sparks", 75, 1, -1)
else
- status = 0
+ switch_status(FALSE, TRUE)
if(!cell)
to_chat(user, "[src] does not have a power source!")
else
to_chat(user, "[src] is out of charge.")
- update_icon()
add_fingerprint(user)
/obj/item/melee/baton/attack(mob/M, mob/living/carbon/human/user)
if(status && user.has_trait(TRAIT_CLUMSY) && prob(50))
- user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \
- "You accidentally hit yourself with [src]!")
- user.Knockdown(stunforce*3)
- deductcharge(hitcost)
+ clowning_around(user)
return
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes it impossible to baton in stamina softcrit
@@ -153,17 +163,21 @@
var/mob/living/carbon/human/H = L
if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
- return 0
+ return FALSE
+ var/stunpwr = stunforce
if(iscyborg(loc))
var/mob/living/silicon/robot/R = loc
- if(!R || !R.cell || !R.cell.use(hitcost))
- return 0
+ if(!istype(R) || !R.cell || !R.cell.use(hitcost))
+ return FALSE
else
- if(!deductcharge(hitcost))
- return 0
+ var/stuncharge = cell.charge
+ if(!deductcharge(hitcost, FALSE))
+ stunpwr *= round(stuncharge/hitcost)
+ if(stunpwr < stunforce * STUNBATON_CHARGE_LENIENCY)
+ return FALSE
- L.Knockdown(stunforce)
- L.adjustStaminaLoss(stunforce*0.1, affected_zone = (istype(user) ? user.zone_selected : BODY_ZONE_CHEST))//CIT CHANGE - makes stunbatons deal extra staminaloss. Todo: make this also deal pain when pain gets implemented.
+ L.Knockdown(stunpwr)
+ L.adjustStaminaLoss(stunpwr*0.1, affected_zone = (istype(user) ? user.zone_selected : BODY_ZONE_CHEST))//CIT CHANGE - makes stunbatons deal extra staminaloss. Todo: make this also deal pain when pain gets implemented.
L.apply_effect(EFFECT_STUTTER, stunforce)
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
if(user)
@@ -180,11 +194,18 @@
H.forcesay(GLOB.hit_appends)
- return 1
+ return TRUE
+
+/obj/item/melee/baton/proc/clowning_around(mob/living/user)
+ user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \
+ "You accidentally hit yourself with [src]!")
+ user.Knockdown(stunforce*3)
+ deductcharge(hitcost)
/obj/item/melee/baton/emp_act(severity)
. = ..()
if (!(. & EMP_PROTECT_SELF))
+ switch_status(FALSE)
deductcharge(1000 / severity)
//Makeshift stun baton. Replacement for stun gloves.
@@ -211,3 +232,5 @@
/obj/item/melee/baton/cattleprod/baton_stun()
if(sparkler.activate())
..()
+
+#undef STUNBATON_CHARGE_LENIENCY
diff --git a/code/game/objects/items/teleprod.dm b/code/game/objects/items/teleprod.dm
index fd9972f427..c514e5e926 100644
--- a/code/game/objects/items/teleprod.dm
+++ b/code/game/objects/items/teleprod.dm
@@ -6,27 +6,23 @@
item_state = "teleprod"
slot_flags = null
-/obj/item/melee/baton/cattleprod/teleprod/attack(mob/living/carbon/M, mob/living/carbon/user)//handles making things teleport when hit
- ..()
- if(status && user.has_trait(TRAIT_CLUMSY) && prob(50))
- user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \
- "You accidentally hit yourself with [src]!")
- if(do_teleport(user, get_turf(user), 50))//honk honk
- SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
- user.Knockdown(stunforce*3)
- deductcharge(hitcost)
- else
- SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
- user.Knockdown(stunforce*3)
- deductcharge(hitcost/4)
+/obj/item/melee/baton/cattleprod/teleprod/baton_stun(mob/living/carbon/M, mob/living/carbon/user)//handles making things teleport when hit
+ . = ..()
+ if(!. || !istype(M) || M.anchored)
return
else
- if(status)
- if(!istype(M) && M.anchored)
- return .
- else
- SEND_SIGNAL(M, COMSIG_LIVING_MINOR_SHOCK)
- do_teleport(M, get_turf(M), 15)
+ SEND_SIGNAL(M, COMSIG_LIVING_MINOR_SHOCK)
+ do_teleport(M, get_turf(M), 15)
+
+/obj/item/melee/baton/cattleprod/teleprod/clowning_around(mob/living/user)
+ user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \
+ "You accidentally hit yourself with [src]!")
+ SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
+ user.Knockdown(stunforce*3)
+ if(do_teleport(user, get_turf(user), 50))
+ deductcharge(hitcost)
+ else
+ deductcharge(hitcost * 0.25)
/obj/item/melee/baton/cattleprod/attackby(obj/item/I, mob/user, params)//handles sticking a crystal onto a stunprod to make a teleprod
if(istype(I, /obj/item/stack/ore/bluespace_crystal))
diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm
index c8d59f54a8..9451012a04 100644
--- a/code/modules/antagonists/cult/cult.dm
+++ b/code/modules/antagonists/cult/cult.dm
@@ -13,7 +13,7 @@
var/give_equipment = FALSE
var/datum/team/cult/cult_team
-
+
/datum/antagonist/cult/get_team()
return cult_team
@@ -115,7 +115,7 @@
cult_team.rise(current)
if(cult_team.cult_ascendent)
cult_team.ascend(current)
-
+
/datum/antagonist/cult/remove_innate_effects(mob/living/mob_override)
. = ..()
var/mob/living/current = owner.current
@@ -220,7 +220,7 @@
throwing.Remove(current)
current.update_action_buttons_icon()
current.remove_status_effect(/datum/status_effect/cult_master)
-
+
if(ishuman(current))
var/mob/living/carbon/human/H = current
H.eye_color = initial(H.eye_color)
@@ -241,7 +241,31 @@
var/reckoning_complete = FALSE
var/cult_risen = FALSE
var/cult_ascendent = FALSE
-
+
+/datum/team/cult/New()
+ . = ..()
+ START_PROCESSING(SSprocessing, src)
+
+/datum/team/cult/Destroy()
+ STOP_PROCESSING(SSprocessing, src)
+ return ..()
+
+/datum/team/cult/process()
+ if(SSticker.current_state == GAME_STATE_FINISHED)
+ return
+ var/datum/objective/sacrifice/sac_objective = locate() in objectives
+ if(!sac_objective || sac_objective.check_completion())
+ return
+ var/datum/mind/sacrificial = sac_objective.get_target()
+ var/mob/living/sac_current = sacrificial.current
+ if(!sacrificial || !sac_current) //target is gone for good but not sacrified.
+ sort_sacrifice(TRUE)
+ return
+ if(QDELETED(sac_objective.target_current) || sac_objective.target_current != sac_current) //target is now a different mob (monkey, simple mob)
+ sac_objective.sac_image = sac_current.get_sac_image()
+ sac_objective.target_current = sac_current
+ sac_objective.update_explanation_text()
+
/datum/team/cult/proc/check_size()
if(cult_ascendent)
return
@@ -262,7 +286,7 @@
to_chat(B.current, "The veil weakens as your cult grows, your eyes begin to glow...")
addtimer(CALLBACK(src, .proc/rise, B.current), 200)
cult_risen = TRUE
-
+
if(ratio > CULT_ASCENDENT && !cult_ascendent)
for(var/datum/mind/B in members)
if(B.current)
@@ -270,8 +294,8 @@
to_chat(B.current, "Your cult is ascendent and the red harvest approaches - you cannot hide your true nature for much longer!!")
addtimer(CALLBACK(src, .proc/ascend, B.current), 200)
cult_ascendent = TRUE
-
-
+
+
/datum/team/cult/proc/rise(cultist)
if(ishuman(cultist))
var/mob/living/carbon/human/H = cultist
@@ -279,7 +303,7 @@
H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK)
H.add_trait(CULT_EYES)
H.update_body()
-
+
/datum/team/cult/proc/ascend(cultist)
if(ishuman(cultist))
var/mob/living/carbon/human/H = cultist
@@ -289,48 +313,68 @@
/datum/team/cult/proc/setup_objectives()
//SAC OBJECTIVE , todo: move this to objective internals
+ sort_sacrifice()
+ //SUMMON OBJECTIVE
+ var/datum/objective/eldergod/summon_objective = new()
+ summon_objective.team = src
+ objectives += summon_objective
+
+/datum/team/cult/proc/sort_sacrifice(replacement = FALSE)
+
var/list/target_candidates = list()
- var/datum/objective/sacrifice/sac_objective = new
- sac_objective.team = src
+
+ var/datum/objective/sacrifice/sac_objective = locate() in GLOB.objectives
+ if(!sac_objective)
+ sac_objective = new
+ sac_objective.team = src
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && !is_convertable_to_cult(player) && player.stat != DEAD)
target_candidates += player.mind
- if(target_candidates.len == 0)
+ if(!length(target_candidates))
message_admins("Cult Sacrifice: Could not find unconvertible target, checking for convertible target.")
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD)
target_candidates += player.mind
+
listclearnulls(target_candidates)
- if(LAZYLEN(target_candidates))
- sac_objective.target = pick(target_candidates)
- sac_objective.update_explanation_text()
+ if(!LAZYLEN(target_candidates))
+ message_admins("Cult Sacrifice: Could not find unconvertible or convertible target. Proceeding to next stage!")
+ sac_objective.sacced = TRUE
+ return
+ var/datum/mind/new_target = pick(target_candidates)
+ if(replacement)
+ for(var/datum/mind/H in members)
+ if(H.current)
+ to_chat(H.current, "Nar'Sie murmurs, [sac_objective.target] is beyond your reach. Sacrifice [new_target] instead...")
+ sac_objective.target = new_target
+ sac_objective.target_current = new_target.current
+ sac_objective.update_explanation_text()
- var/datum/job/sacjob = SSjob.GetJob(sac_objective.target.assigned_role)
- var/datum/preferences/sacface = sac_objective.target.current.client.prefs
- var/icon/reshape = get_flat_human_icon(null, sacjob, sacface, list(SOUTH))
- reshape.Shift(SOUTH, 4)
- reshape.Shift(EAST, 1)
- reshape.Crop(7,4,26,31)
- reshape.Crop(-5,-3,26,30)
- sac_objective.sac_image = reshape
+ sac_objective.sac_image = sac_objective.target_current.get_sac_image()
+ objectives += sac_objective
- objectives += sac_objective
- else
- message_admins("Cult Sacrifice: Could not find unconvertible or convertible target. WELP!")
+/mob/proc/get_sac_image()
+ var/icon/reshape = icon(icon, icon_state, SOUTH)
+ reshape.Shift(SOUTH, 4)
+ reshape.Shift(EAST, 1)
+ reshape.Crop(7,4,26,31)
+ reshape.Crop(-5,-3,26,30)
+/mob/living/carbon/human/get_sac_image()
+ var/datum/job/sacjob = SSjob.GetJob(mind.assigned_role)
+ var/datum/preferences/sacface = client.prefs
+ var/icon/reshape = get_flat_human_icon(null, sacjob, sacface, list(SOUTH))
+ reshape.Shift(SOUTH, 4)
+ reshape.Shift(EAST, 1)
+ reshape.Crop(7,4,26,31)
+ reshape.Crop(-5,-3,26,30)
- //SUMMON OBJECTIVE
-
- var/datum/objective/eldergod/summon_objective = new()
- summon_objective.team = src
- objectives += summon_objective
-
-
/datum/objective/sacrifice
var/sacced = FALSE
var/sac_image
+ var/mob/living/target_current
/datum/objective/sacrifice/check_completion()
return sacced || completed
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index 8a3f81fc01..3c11351660 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -246,7 +246,7 @@ structure_check() searches for nearby cultist structures required for the invoca
return 0
to_chat(convertee, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
and something evil takes root.")
- to_chat(convertee, "Do you wish to embrace the Geometer of Blood? Click here to stop resisting the truth. Or you could choose to continue resisting...")
+ to_chat(convertee, "Do you wish to embrace the Geometer of Blood? Click here to become a follower of Nar'sie. Or you could choose to continue resisting and suffer a fate worse than death...")
currentconversionman = convertee
conversiontimeout = world.time + (10 SECONDS)
convertee.Stun(100)
diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm
index 5213c679ca..051bf74705 100644
--- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm
+++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm
@@ -130,6 +130,7 @@
if(!owner.current||owner.current.stat==DEAD)
return
to_chat(owner.current, " Target eliminated: [victim.name]")
+ LAZYINITLIST(targets_stolen)
for(var/objective_ in victim.objectives)
if(istype(objective_, /datum/objective/assassinate/internal))
var/datum/objective/assassinate/internal/objective = objective_
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 8e4891fb70..d80f56c8c8 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1458,7 +1458,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
if("flavor_text")
- var/msg = stripped_multiline_input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(features["flavor_text"]), MAX_MESSAGE_LEN*2, TRUE) as null|message
+ var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", html_decode(features["flavor_text"]), MAX_MESSAGE_LEN*2, TRUE)
if(!isnull(msg))
msg = copytext(msg, 1, MAX_MESSAGE_LEN*2)
features["flavor_text"] = msg
diff --git a/code/modules/integrated_electronics/core/saved_circuits.dm b/code/modules/integrated_electronics/core/saved_circuits.dm
index eef4fe38dd..2fe6984808 100644
--- a/code/modules/integrated_electronics/core/saved_circuits.dm
+++ b/code/modules/integrated_electronics/core/saved_circuits.dm
@@ -124,7 +124,7 @@
// Save modified name
if(initial(name) != name)
assembly_params["name"] = name
-
+
// Save modified description
if(initial(desc) != desc)
assembly_params["desc"] = desc
@@ -144,7 +144,7 @@
return "Bad assembly name."
if(assembly_params["desc"] && !reject_bad_text(assembly_params["desc"]))
return "Bad assembly description."
- if(assembly_params["detail_color"] && !(assembly_params["detail_color"] in color_whitelist))
+ if(assembly_params["detail_color"] && !reject_bad_text(assembly_params["detail_color"], 7))
return "Bad assembly color."
// Loads assembly parameters from a list
@@ -153,7 +153,7 @@
// Load modified name, if any.
if(assembly_params["name"])
name = assembly_params["name"]
-
+
// Load modified description, if any.
if(assembly_params["desc"])
desc = assembly_params["desc"]
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 49d2722323..13da7b913c 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -260,7 +260,7 @@
else
return
- if(do_mob(usr, src, POCKET_STRIP_DELAY/delay_denominator)) //placing an item into the pocket is 4 times faster
+ if(do_mob(usr, src, POCKET_STRIP_DELAY/delay_denominator, ignorehelditem = TRUE)) //placing an item into the pocket is 4 times faster
if(pocket_item)
if(pocket_item == (pocket_id == SLOT_R_STORE ? r_store : l_store)) //item still in the pocket we search
dropItemToGround(pocket_item)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index d68c936909..3930d19168 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1475,9 +1475,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else if(aim_for_mouth && ( target_on_help || target_restrained || target_aiming_for_mouth))
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
- user.visible_message(
- "[user] slaps [target] in the face!",
- "You slap [user == target ? "yourself" : target] in the face! ",\
+ user.visible_message(\
+ "\The [user] slaps \the [target] in the face!",\
+ "You slap [user == target ? "yourself" : "\the [target]"] in the face! ",\
"You hear a slap."
)
if (!target.has_trait(TRAIT_NYMPHO))
@@ -1487,9 +1487,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
else if(aim_for_groin && (target == user || target.lying || same_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
- user.visible_message(
- "[user] slaps [target]'s ass!",
- "You slap [user == target ? "your" : target + "'s"] ass! ",\
+ user.visible_message(\
+ "\The [user] slaps \the [target]'s ass!",\
+ "You slap [user == target ? "your" : "\the [target]'s"] ass!",\
"You hear a slap."
)
if (target.canbearoused)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index b9b6424092..ae662c7628 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -698,7 +698,7 @@
who.visible_message("[src] tries to remove [who]'s [what.name].", \
"[src] tries to remove [who]'s [what.name].")
what.add_fingerprint(src)
- if(do_mob(src, who, what.strip_delay))
+ if(do_mob(src, who, what.strip_delay, ignorehelditem = TRUE))
if(what && Adjacent(who))
if(islist(where))
var/list/L = where
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 39a0bba701..6cc0ca185f 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -8,9 +8,9 @@
set src in usr
if(usr != src)
usr << "No."
- var/msg = input(usr,"Set the flavor text in your 'examine' verb. Can also be used for OOC notes about your character.","Flavor Text",html_decode(flavor_text)) as message|null
-
- if(msg != null)
+ var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", html_decode(flavor_text), MAX_MESSAGE_LEN*2, TRUE)
+
+ if(!isnull(msg))
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
msg = html_encode(msg)
@@ -23,11 +23,12 @@
/mob/proc/print_flavor_text()
if(flavor_text && flavor_text != "")
- var/msg = replacetext(flavor_text, "\n", " ")
+ // We are decoding and then encoding to not only get correct amount of characters, but also to prevent partial escaping characters being shown.
+ var/msg = html_decode(replacetext(flavor_text, "\n", " "))
if(lentext(msg) <= 40)
- return "[msg]"
+ return "[html_encode(msg)]"
else
- return "[copytext(msg, 1, 37)]... More..."
+ return "[html_encode(copytext(msg, 1, 37))]... More..."
/mob/proc/get_top_level_mob()
if(istype(src.loc,/mob)&&src.loc!=src)
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 798b495cfd..503b1bd743 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -510,7 +510,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "12g Scatter Laser shot Slugs"
desc = "An alternative 8-round Scatter Laser Shot magazine for use in the Bulldog shotgun."
item = /obj/item/ammo_box/magazine/m12g/scatter
- cost = 5 // most armor has less laser protection then bullet
+ cost = 4 // most armor has less laser protection then bullet
/datum/uplink_item/ammo/shotgun/bag
name = "12g Ammo Duffel Bag"
@@ -776,7 +776,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."
item = /obj/item/suppressor
- cost = 3
+ cost = 1
surplus = 10
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
@@ -844,7 +844,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
You will receive the unlock code upon activating the virus, and the new uplink may be charged with \
telecrystals normally."
item = /obj/item/cartridge/virus/frame
- cost = 4
+ cost = 2
restricted = TRUE
/datum/uplink_item/stealthy_tools/agent_card
@@ -995,11 +995,11 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 1
/datum/uplink_item/device_tools/surgerybag_adv
- name = "Syndicate Surgery Duffel Bag"
+ name = "Advanced Syndicate Surgery Duffel Bag"
desc = "The Syndicate surgery duffel bag is a toolkit containing all newest surgery tools, surgical drapes, \
a Syndicate brand MMI, a straitjacket, a muzzle, and a full Syndicate Combat Medic Kit."
item = /obj/item/storage/backpack/duffelbag/syndie/surgery_adv
- cost = 15 //Mite be to cheap
+ cost = 10
/datum/uplink_item/device_tools/military_belt
name = "Chest Rig"
@@ -1041,7 +1041,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
such as AI units and cyborgs, over their private binary channel. Caution should \
be taken while doing this, as unless they are allied with you, they are programmed to report such intrusions."
item = /obj/item/encryptionkey/binary
- cost = 5
+ cost = 2
surplus = 75
restricted = TRUE
@@ -1517,12 +1517,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 15
restricted_roles = list("Clown")
-/datum/uplink_item/device_tools/honkpins //Idealy so they can place it into their own guns without needing cargo
+/datum/uplink_item/device_tools/ultrahonkpins //Idealy so they can place it into their own guns without needing cargo
name = "Hilarious firing pin"
desc = "A single firing pin made for Clown agents, this firing pin makes any gun honk when fired if not a true clown! \
This firing pin also helps you fire the gun correctly. May the HonkMother HONK you agent."
- item = /obj/item/firing_pin/clown
- cost = 1
+ item = /obj/item/firing_pin/clown/ultra
+ cost = 2
restricted_roles = list("Clown")
/*
diff --git a/html/changelogs/AutoChangeLog-pr-8404.yml b/html/changelogs/AutoChangeLog-pr-8404.yml
new file mode 100644
index 0000000000..c230977a44
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8404.yml
@@ -0,0 +1,5 @@
+author: "WhiteHusky"
+delete-after: True
+changes:
+ - bugfix: "Flavor text with special characters will not get partially unescaped."
+ - bugfix: "Canceling when setting flavor text does not clear it anymore."
diff --git a/html/changelogs/AutoChangeLog-pr-8408.yml b/html/changelogs/AutoChangeLog-pr-8408.yml
new file mode 100644
index 0000000000..548e4947be
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8408.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes cult potentially stalling if the target is erased from existence without being sacced."
diff --git a/html/changelogs/AutoChangeLog-pr-8419.yml b/html/changelogs/AutoChangeLog-pr-8419.yml
new file mode 100644
index 0000000000..037dba41ad
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8419.yml
@@ -0,0 +1,4 @@
+author: "UntoldTactics"
+delete-after: True
+changes:
+ - tweak: "Rewords the click here prompt given when an attempted conversion is done on an offer rune (for blood cult)"
diff --git a/html/changelogs/AutoChangeLog-pr-8435.yml b/html/changelogs/AutoChangeLog-pr-8435.yml
new file mode 100644
index 0000000000..3c2caeb994
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8435.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "fixes IAA."
diff --git a/html/changelogs/AutoChangeLog-pr-8437.yml b/html/changelogs/AutoChangeLog-pr-8437.yml
new file mode 100644
index 0000000000..4257a801c9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8437.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "more box options"
+ - bugfix: "a lack of replaceable boxes"
diff --git a/html/changelogs/AutoChangeLog-pr-8439.yml b/html/changelogs/AutoChangeLog-pr-8439.yml
new file mode 100644
index 0000000000..1e4bd2efae
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8439.yml
@@ -0,0 +1,6 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - balance: "EMPs now flick off stunbatons, they can be turned back on immediately by the user anyway."
+ - balance: "Stunbatons now very slowly consume charge whilst kept on, at a rate of 4/1000th of a standard batoning charge cost per tick."
+ - balance: "Softened up the charge cost checks to stop the above update from practically reducing the maximum uses of a stun baton by one. Now, should the remaining charge be lower than the hit cost, the resulting stun will be be proportional to the remaining charge divided by the hitcost, within a limit under which the stun batoning just won't happen."
diff --git a/html/changelogs/AutoChangeLog-pr-8443.yml b/html/changelogs/AutoChangeLog-pr-8443.yml
new file mode 100644
index 0000000000..1b1f82977b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8443.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - tweak: "The timer for stripping an item off of a spaceman is no longer interrupted by your active held item changing. This means you no longer have to worry about filling both of your hands when you're stripping items off of someone."
diff --git a/html/changelogs/AutoChangeLog-pr-8448.yml b/html/changelogs/AutoChangeLog-pr-8448.yml
new file mode 100644
index 0000000000..e670ffc0f4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8448.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "4 - > 5"
diff --git a/html/changelogs/AutoChangeLog-pr-8450.yml b/html/changelogs/AutoChangeLog-pr-8450.yml
new file mode 100644
index 0000000000..8afa74c68c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8450.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "4tc - > 2tc"
diff --git a/html/changelogs/AutoChangeLog-pr-8454.yml b/html/changelogs/AutoChangeLog-pr-8454.yml
new file mode 100644
index 0000000000..4cc6d98df1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8454.yml
@@ -0,0 +1,5 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "15 - >10"
+ - bugfix: "both bags have the same name"
diff --git a/html/changelogs/AutoChangeLog-pr-8455.yml b/html/changelogs/AutoChangeLog-pr-8455.yml
new file mode 100644
index 0000000000..e7944f5869
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8455.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "5 - > 2"
diff --git a/html/changelogs/AutoChangeLog-pr-8456.yml b/html/changelogs/AutoChangeLog-pr-8456.yml
new file mode 100644
index 0000000000..3ff35b1c09
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8456.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "3 -> 1"
diff --git a/html/changelogs/AutoChangeLog-pr-8460.yml b/html/changelogs/AutoChangeLog-pr-8460.yml
new file mode 100644
index 0000000000..39af97ef12
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8460.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "1->2 and ultra"
diff --git a/html/changelogs/AutoChangeLog-pr-8465.yml b/html/changelogs/AutoChangeLog-pr-8465.yml
new file mode 100644
index 0000000000..91556b4afc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8465.yml
@@ -0,0 +1,4 @@
+author: "Useroth"
+delete-after: True
+changes:
+ - bugfix: "After the PR which raised the ammo capacity of said magazines, due to the code, they ended up with an invalid icon state. Fixed through changing the icon state name in the icon file."
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index d6ffc12ae7..1a1e5f617b 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/modular_citadel/code/game/machinery/cryopod.dm b/modular_citadel/code/game/machinery/cryopod.dm
index 1ff628bfbd..15e7d34c65 100644
--- a/modular_citadel/code/game/machinery/cryopod.dm
+++ b/modular_citadel/code/game/machinery/cryopod.dm
@@ -245,43 +245,6 @@
// This function can not be undone; do not call this unless you are sure
/obj/machinery/cryopod/proc/despawn_occupant()
var/mob/living/mob_occupant = occupant
- var/list/target_candidates = list()
-
- if(istype(SSticker.mode, /datum/antagonist/cult))//thank
- if("sacrifice" in SSticker.mode.cult)
- for(var/mob/living/carbon/human/player in GLOB.player_list)
- if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && !is_convertable_to_cult(player) && player.stat != DEAD)
- target_candidates += player.mind
-
- target_candidates -= mob_occupant.mind
-
- if(target_candidates.len == 0)
- message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.")
- for(var/mob/living/carbon/human/player in GLOB.player_list)
- if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD)
- target_candidates += player.mind
-
- listclearnulls(target_candidates)
- if(LAZYLEN(target_candidates))
- var/datum/objective/sacrifice/sac_objective = locate() in GLOB.objectives
- sac_objective.target = pick(target_candidates)
- sac_objective.update_explanation_text()
-
- var/datum/job/sacjob = SSjob.GetJob(sac_objective.target.assigned_role)
- var/datum/preferences/sacface = sac_objective.target.current.client.prefs
- var/icon/reshape = get_flat_human_icon(null, sacjob, sacface)
- reshape.Shift(SOUTH, 4)
- reshape.Shift(EAST, 1)
- reshape.Crop(7,4,26,31)
- reshape.Crop(-5,-3,26,30)
- sac_objective.sac_image = reshape
-
- for(var/datum/mind/H in SSticker.mode.cult)
- if(H.current)
- to_chat(H.current, "Nar'Sie murmurs, [occupant] is beyond your reach. Sacrifice [sac_objective.target.current] instead...")
-
- else
- message_admins("Cult Sacrifice: Could not find unconvertable or convertable target after cryopod. WELP!")
//Update any existing objectives involving this mob.
for(var/datum/objective/O in GLOB.objectives)
diff --git a/modular_citadel/icons/obj/guns/cit_guns.dmi b/modular_citadel/icons/obj/guns/cit_guns.dmi
index e02025f436..8154a753e0 100644
Binary files a/modular_citadel/icons/obj/guns/cit_guns.dmi and b/modular_citadel/icons/obj/guns/cit_guns.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 4d74c8a95f..dea02c485f 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2502,12 +2502,6 @@
#include "code\modules\research\server.dm"
#include "code\modules\research\stock_parts.dm"
#include "code\modules\research\designs\AI_module_designs.dm"
-#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm"
-#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm"
-#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm"
-#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm"
-#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm"
-#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm"
#include "code\modules\research\designs\biogenerator_designs.dm"
#include "code\modules\research\designs\bluespace_designs.dm"
#include "code\modules\research\designs\comp_board_designs.dm"
@@ -2527,6 +2521,12 @@
#include "code\modules\research\designs\stock_parts_designs.dm"
#include "code\modules\research\designs\telecomms_designs.dm"
#include "code\modules\research\designs\weapon_designs.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm"
#include "code\modules\research\machinery\_production.dm"
#include "code\modules\research\machinery\circuit_imprinter.dm"
#include "code\modules\research\machinery\departmental_circuit_imprinter.dm"