diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index 2f58d4e9ebb..a8a0459bcb1 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -7,4 +7,4 @@ assignees: ''
---
-Please place all features requests here: https://nanotrasen.se/forum/60-suggestions/
+Please place all features requests here: https://www.paradisestation.org/forum/60-suggestions/
diff --git a/.travis.yml b/.travis.yml
index 464e01c8f53..146be925c77 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -18,8 +18,8 @@ addons:
env:
global:
- - BYOND_MAJOR="512"
- - BYOND_MINOR="1454"
+ - BYOND_MAJOR="513"
+ - BYOND_MINOR="1505"
- BYOND_MACRO_COUNT=4
matrix:
- DM_MAPFILE="cyberiad"
diff --git a/README.md b/README.md
index d60fe8006c8..eafdb5ffe91 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
[](http://forthebadge.com)
[](http://forthebadge.com)
-[Website](https://nanotrasen.se/) - [Code](https://github.com/ParadiseSS13/Paradise) - [Discord](https://discordapp.com/invite/YJDsXFE)
+[Website](https://www.paradisestation.org/) - [Code](https://github.com/ParadiseSS13/Paradise) - [Discord](https://discordapp.com/invite/YJDsXFE)
---
@@ -104,7 +104,7 @@ Your server details go in /config/dbconfig.txt,
and the SQL schema is in /SQL/paradise_schema.sql or /SQL/paradise_schema_prefix.sql,
depending on if you want table prefixes.
More detailed setup instructions are located on our wiki:
-https://nanotrasen.se/wiki/index.php/Setting_up_the_Database
+https://www.paradisestation.org/wiki/index.php/Setting_up_the_Database
---
diff --git a/code/__DEFINES/crafting.dm b/code/__DEFINES/crafting.dm
index 7bfd2935280..0fbd76b9e21 100644
--- a/code/__DEFINES/crafting.dm
+++ b/code/__DEFINES/crafting.dm
@@ -6,6 +6,10 @@
#define CAT_ROBOT "Robots"
#define CAT_MISC "Misc"
#define CAT_PRIMAL "Tribal"
+#define CAT_DECORATIONS "Decorations"
+#define CAT_DECORATION "Decorations"
+#define CAT_HOLIDAY "Holiday"
+#define CAT_LARGE_DECORATIONS "Large Decorations"
#define CAT_CLOTHING "Clothing"
#define CAT_FOOD "Foods"
#define CAT_BREAD "Breads"
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 5a2c087e1fd..6e1fa5e01fd 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -384,7 +384,7 @@
#define EXPLOSIVE_WALL_GROUP_SYNDICATE_BASE "syndicate_base"
// Filters
-#define FILTER_AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA")
+#define FILTER_AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, color="#04080FAA")
//Fullscreen overlay resolution in tiles.
#define FULLSCREEN_OVERLAY_RESOLUTION_X 15
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 1db82f879fe..293d97e4fa3 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -95,6 +95,8 @@
#define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY|APPEARANCE_ALT_HEAD
#define APPEARANCE_ALL 32767
+#define STAMINA_REGEN_BLOCK_TIME (10 SECONDS)
+
//Slime evolution threshold. Controls how fast slimes can split/grow
#define SLIME_EVOLUTION_THRESHOLD 10
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 5b93e570222..34ad4d69e54 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -10,7 +10,6 @@
// justice if someone's abusing your role
#define ROLE_SYNDICATE "Syndicate"
#define ROLE_TRAITOR "traitor"
-#define ROLE_MINDSLAVE "mindslave"
#define ROLE_OPERATIVE "operative"
#define ROLE_CHANGELING "changeling"
#define ROLE_WIZARD "wizard"
diff --git a/code/__DEFINES/typeids.dm b/code/__DEFINES/typeids.dm
index 4fd2c390fa7..16b6e475b8e 100644
--- a/code/__DEFINES/typeids.dm
+++ b/code/__DEFINES/typeids.dm
@@ -2,5 +2,5 @@
#define TYPEID_NULL "0"
#define TYPEID_NORMAL_LIST "f"
//helper macros
-#define GET_TYPEID(ref) ( ( (lentext(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, lentext(ref) - 6) ) )
+#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, length(ref) - 6) ) )
#define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST)
\ No newline at end of file
diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index 49983658d48..5ffe891d95b 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -69,11 +69,6 @@
return list[index]
return
-/proc/islist(list/list)
- if(istype(list))
- return 1
- return 0
-
//Return either pick(list) or null if list is not of type /list or is empty
/proc/safepick(list/list)
if(!islist(list) || !list.len)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 10658df4c4b..7c61cf832b5 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -381,7 +381,7 @@ This is always put in the attack log.
drifting = 0
Uloc = user.loc
- if(!user || user.stat || user.weakened || user.stunned || (!drifting && user.loc != Uloc)|| (extra_checks && !extra_checks.Invoke()))
+ if(!user || user.stat || user.IsWeakened() || user.stunned || (!drifting && user.loc != Uloc)|| (extra_checks && !extra_checks.Invoke()))
. = 0
break
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index f3b76064517..0f356aa4f4a 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -20,7 +20,7 @@
if(!istext(t))
t = "[t]" // Just quietly assume any non-texts are supposed to be text
var/sqltext = dbcon.Quote(t);
- return copytext(sqltext, 2, lentext(sqltext));//Quote() adds quotes around input, we already do that
+ return copytext(sqltext, 2, length(sqltext));//Quote() adds quotes around input, we already do that
/proc/format_table_name(table as text)
return sqlfdbktableprefix + table
@@ -333,9 +333,9 @@ proc/checkhtml(var/t)
//is in the other string at the same spot (assuming it is not a replace char).
//This is used for fingerprints
var/newtext = text
- if(lentext(text) != lentext(compare))
+ if(length(text) != length(compare))
return 0
- for(var/i = 1, i < lentext(text), i++)
+ for(var/i = 1, i < length(text), i++)
var/a = copytext(text,i,i+1)
var/b = copytext(compare,i,i+1)
//if it isn't both the same letter, or if they are both the replacement character
@@ -355,7 +355,7 @@ proc/checkhtml(var/t)
if(!text || !character)
return 0
var/count = 0
- for(var/i = 1, i <= lentext(text), i++)
+ for(var/i = 1, i <= length(text), i++)
var/a = copytext(text,i,i+1)
if(a == character)
count++
@@ -400,8 +400,8 @@ proc/checkhtml(var/t)
//Used in preferences' SetFlavorText and human's set_flavor verb
//Previews a string of len or less length
/proc/TextPreview(var/string,var/len=40)
- if(lentext(string) <= len)
- if(!lentext(string))
+ if(length(string) <= len)
+ if(!length(string))
return "\[...\]"
else
return html_encode(string) //NO DECODED HTML YOU CHUCKLEFUCKS
@@ -541,7 +541,7 @@ proc/checkhtml(var/t)
text = "[text]"
else
text = "[text]"
-
+
text = copytext(text, 1, MAX_PAPER_MESSAGE_LEN)
return text
diff --git a/code/__HELPERS/traits.dm b/code/__HELPERS/traits.dm
index 472caea4490..7c1d2257e27 100644
--- a/code/__HELPERS/traits.dm
+++ b/code/__HELPERS/traits.dm
@@ -62,6 +62,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
//mob traits
#define TRAIT_PACIFISM "pacifism"
+#define TRAIT_WATERBREATH "waterbreathing"
// common trait sources
#define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention
\ No newline at end of file
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 82295bc9d80..f1611b38fd9 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -540,9 +540,20 @@ Returns 1 if the chain up to the area contains the given typepath
/proc/between(var/low, var/middle, var/high)
return max(min(middle, high), low)
-proc/arctan(x)
+
+
+#if DM_VERSION > 513
+#warn 513 is definitely stable now, remove this
+#endif
+#if DM_VERSION < 513
+/proc/arctan(x)
var/y=arcsin(x/sqrt(1+x*x))
return y
+/proc/islist(list/list)
+ if(istype(list))
+ return 1
+ return 0
+#endif
//returns random gauss number
proc/GaussRand(var/sigma)
diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm
index a5586578b3f..9c0f498cd83 100644
--- a/code/_onclick/hud/plane_master.dm
+++ b/code/_onclick/hud/plane_master.dm
@@ -16,7 +16,7 @@
filters += filter(type = "outline", size = _size, color = _color)
/obj/screen/plane_master/proc/shadow(_size, _border, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA")
- filters += filter(type = "drop_shadow", x = _x, y = _y, color = _color, size = _size, offset = _offset, border = _border)
+ filters += filter(type = "drop_shadow", x = _x, y = _y, color = _color, size = _size, offset = _offset)
/obj/screen/plane_master/proc/clear_filters()
filters = list()
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index c279a7be2a5..c3c9b6f7e65 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -169,7 +169,7 @@
/obj/screen/storage/Click(location, control, params)
if(world.time <= usr.next_move)
return 1
- if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
+ if(usr.stat || usr.paralysis || usr.stunned || usr.IsWeakened())
return 1
if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm
index 166083b36ff..504a2d74a2c 100644
--- a/code/controllers/subsystem/jobs.dm
+++ b/code/controllers/subsystem/jobs.dm
@@ -421,23 +421,23 @@ SUBSYSTEM_DEF(jobs)
to_chat(H, "You are the [alt_title ? alt_title : rank].")
to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.")
- to_chat(H, "For more information on how the station works, see Standard Operating Procedure (SOP)")
+ to_chat(H, "For more information on how the station works, see Standard Operating Procedure (SOP)")
if(job.is_service)
- to_chat(H, "As a member of Service, make sure to read up on your Department SOP")
+ to_chat(H, "As a member of Service, make sure to read up on your Department SOP")
if(job.is_supply)
- to_chat(H, "As a member of Supply, make sure to read up on your Department SOP")
+ to_chat(H, "As a member of Supply, make sure to read up on your Department SOP")
if(job.is_command)
- to_chat(H, "As an important member of Command, read up on your Department SOP")
+ to_chat(H, "As an important member of Command, read up on your Department SOP")
if(job.is_legal)
- to_chat(H, "Your job requires complete knowledge of Space Law and Legal Standard Operating Procedure")
+ to_chat(H, "Your job requires complete knowledge of Space Law and Legal Standard Operating Procedure")
if(job.is_engineering)
- to_chat(H, "As a member of Engineering, make sure to read up on your Department SOP")
+ to_chat(H, "As a member of Engineering, make sure to read up on your Department SOP")
if(job.is_medical)
- to_chat(H, "As a member of Medbay, make sure to read up on your Department SOP")
+ to_chat(H, "As a member of Medbay, make sure to read up on your Department SOP")
if(job.is_science)
- to_chat(H, "As a member of Science, make sure to read up on your Department SOP")
+ to_chat(H, "As a member of Science, make sure to read up on your Department SOP")
if(job.is_security)
- to_chat(H, "As a member of Security, you are to know Space Law, Legal Standard Operating Procedure, as well as your Department SOP")
+ to_chat(H, "As a member of Security, you are to know Space Law, Legal Standard Operating Procedure, as well as your Department SOP")
if(job.req_admin_notify)
to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp.")
diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm
index 24be623573e..058569250ec 100644
--- a/code/controllers/subsystem/tickets/tickets.dm
+++ b/code/controllers/subsystem/tickets/tickets.dm
@@ -23,7 +23,7 @@ SUBSYSTEM_DEF(tickets)
flags = SS_BACKGROUND
- var/list/allTickets
+ var/list/allTickets = list() //make it here because someone might ahelp before the system has initialized
var/ticketCounter = 1
@@ -31,7 +31,6 @@ SUBSYSTEM_DEF(tickets)
close_messages = list("- [ticket_name] Rejected! -",
"Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.",
"Your [ticket_name] has now been closed.")
- LAZYINITLIST(allTickets)
return ..()
/datum/controller/subsystem/tickets/fire()
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 043117efb84..b7af84e9ddf 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -72,7 +72,7 @@
if(owner.restrained())
return 0
if(check_flags & AB_CHECK_STUNNED)
- if(owner.stunned || owner.weakened)
+ if(owner.stunned || owner.IsWeakened())
return 0
if(check_flags & AB_CHECK_LYING)
if(owner.lying)
diff --git a/code/datums/components/ducttape.dm b/code/datums/components/ducttape.dm
index 85568f7a09c..98512589a46 100644
--- a/code/datums/components/ducttape.dm
+++ b/code/datums/components/ducttape.dm
@@ -2,20 +2,23 @@
var/x_offset = 0
var/y_offset = 0
var/icon/tape_overlay = null
+ var/hide_tape = FALSE
-/datum/component/ducttape/Initialize(obj/item/I, mob/user, x, y)
+/datum/component/ducttape/Initialize(obj/item/I, mob/user, x, y, hide_tape)
if(!istype(I)) //Something went wrong
return
+ if(!hide_tape) //if TRUE this hides the tape overlay and added examine text
+ RegisterSignal(parent, COMSIG_OBJ_UPDATE_ICON, .proc/add_tape_overlay)
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/add_tape_text)
x_offset = x
y_offset = y
- RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/add_tape_text)
- RegisterSignal(parent, COMSIG_OBJ_UPDATE_ICON, .proc/add_tape_overlay)
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/afterattack)
RegisterSignal(parent, COMSIG_ITEM_PICKUP, .proc/pick_up)
I.update_icon() //Do this first so the action button properly shows the icon
- var/datum/action/item_action/remove_tape/RT = new(I)
- if(I.loc == user)
- RT.Grant(user)
+ if(!hide_tape) //the tape can no longer be removed if TRUE
+ var/datum/action/item_action/remove_tape/RT = new(I)
+ if(I.loc == user)
+ RT.Grant(user)
/datum/component/proc/add_tape_text(datum/source, mob/user, list/examine_list)
examine_list += "There's some sticky tape attached to [source]."
diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm
index 2f07f106d2a..4aa7eafbed6 100644
--- a/code/datums/spells/area_teleport.dm
+++ b/code/datums/spells/area_teleport.dm
@@ -25,10 +25,13 @@
var/A = null
if(!randomise_selection)
- A = input("Area to teleport to", "Teleport", A) in teleportlocs
+ A = input("Area to teleport to", "Teleport", A) as null|anything in teleportlocs
else
A = pick(teleportlocs)
+ if(!A)
+ return
+
var/area/thearea = teleportlocs[A]
if(thearea.tele_proof && !istype(thearea, /area/wizard_station))
diff --git a/code/datums/spells/cluwne.dm b/code/datums/spells/cluwne.dm
index 6a87419886c..58a33e31a44 100644
--- a/code/datums/spells/cluwne.dm
+++ b/code/datums/spells/cluwne.dm
@@ -17,7 +17,7 @@
var/obj/item/organ/internal/brain/cluwne/idiot_brain = new
idiot_brain.insert(src, make_cluwne = 0)
idiot_brain.dna = dna.Clone()
- setBrainLoss(80)
+ setBrainLoss(80, use_brain_mod = FALSE)
set_nutrition(9000)
overeatduration = 9000
Confused(30)
diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm
index cc0cc307ed5..6c89ab45434 100644
--- a/code/game/gamemodes/autotraitor/autotraitor.dm
+++ b/code/game/gamemodes/autotraitor/autotraitor.dm
@@ -52,7 +52,7 @@
if(!traitor || !istype(traitor))
pre_traitors.Remove(traitor)
continue
- if(istype(traitor))
+ if(istype(traitor))
traitor.special_role = SPECIAL_ROLE_TRAITOR
traitor.restricted_roles = restricted_jobs
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index f94a9a3fbfd..cc7203d9c40 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -139,11 +139,7 @@
/mob/living/simple_animal/hostile/blob/blobspore/update_icons()
..()
- if(overmind && overmind.blob_reagent_datum)
- adjustcolors(overmind.blob_reagent_datum.complementary_color)
- else
- adjustcolors(overmind.blob_reagent_datum.complementary_color) //to ensure zombie/other overlays update
-
+ adjustcolors(overmind?.blob_reagent_datum?.complementary_color)
/mob/living/simple_animal/hostile/blob/blobspore/adjustcolors(var/a_color)
color = a_color
@@ -152,8 +148,7 @@
overlays.Cut()
overlays = human_overlays
var/image/I = image('icons/mob/blob.dmi', icon_state = "blob_head")
- I.color = overmind.blob_reagent_datum.complementary_color
- color = initial(overmind.blob_reagent_datum.complementary_color)//looks better.
+ I.color = color
overlays += I
/////////////////
@@ -191,6 +186,7 @@
else
adjustBruteLoss(0.2) // If you are at full health, you won't lose health. You'll need it. However the moment anybody sneezes on you, the decaying will begin.
adjustFireLoss(0.2)
+ ..()
/mob/living/simple_animal/hostile/blob/blobbernaut/New()
..()
diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm
index a8fdc03ec96..b8bff19cbcf 100644
--- a/code/game/gamemodes/blob/blobs/factory.dm
+++ b/code/game/gamemodes/blob/blobs/factory.dm
@@ -23,6 +23,7 @@
flick("blob_factory_glow", src)
spore_delay = world.time + 100 // 10 seconds
var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore(src.loc, src)
- BS.color = overmind.blob_reagent_datum.complementary_color
- BS.overmind = overmind
- overmind.blob_mobs.Add(BS)
+ if(overmind)
+ BS.color = overmind.blob_reagent_datum?.complementary_color
+ BS.overmind = overmind
+ overmind.blob_mobs.Add(BS)
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 1cc55d99f0c..113487dc1dc 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -9,24 +9,28 @@ var/global/list/all_cults = list()
/proc/is_convertable_to_cult(datum/mind/mind)
if(!mind)
- return 0
+ return FALSE
if(!mind.current)
- return 0
+ return FALSE
if(iscultist(mind.current))
- return 1 //If they're already in the cult, assume they are convertable
+ return TRUE //If they're already in the cult, assume they are convertable
if(ishuman(mind.current) && (mind.assigned_role in list("Captain", "Chaplain")))
- return 0
+ return FALSE
if(ishuman(mind.current))
var/mob/living/carbon/human/H = mind.current
- if(ismindshielded(H))
- return 0
+ if(ismindshielded(H)) //mindshield protects against conversions unless removed
+ return FALSE
+// if(mind.offstation_role) cant convert offstation roles such as ghost spawns
+// return FALSE Commented out until we can figure out why offstation_role is getting set to TRUE on normal crew
if(issilicon(mind.current))
- return 0 //can't convert machines, that's ratvar's thing
+ return FALSE //can't convert machines, that's ratvar's thing
if(isguardian(mind.current))
var/mob/living/simple_animal/hostile/guardian/G = mind.current
if(!iscultist(G.summoner))
- return 0 //can't convert it unless the owner is converted
- return 1
+ return FALSE //can't convert it unless the owner is converted
+ if(isgolem(mind.current))
+ return FALSE
+ return TRUE
/proc/is_sacrifice_target(datum/mind/mind)
if(SSticker.mode.name == "cult")
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index d30ac4f8a68..3489a087ec0 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -198,7 +198,7 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
if(last_heal <= world.time)
last_heal = world.time + heal_delay
for(var/mob/living/L in range(5, src))
- if(iscultist(L) || istype(L, /mob/living/simple_animal/shade) || istype(L, /mob/living/simple_animal/hostile/construct))
+ if(iscultist(L) || iswizard(L) || istype(L, /mob/living/simple_animal/shade) || istype(L, /mob/living/simple_animal/hostile/construct))
if(L.health != L.maxHealth)
new /obj/effect/temp_visual/heal(get_turf(src), "#960000")
if(ishuman(L))
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 2f2f0cae02e..d918bead0de 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -340,144 +340,100 @@ var/list/teleport_runes = list()
fail_invoke()
-//Rite of Enlightenment: Converts a normal crewmember to the cult. Faster for every cultist nearby.
+//Rite of Offering: Converts a normal crewmember to the cult or sacrifices mindshielded and sacrifice targets.
/obj/effect/rune/convert
- cultist_name = "Rite of Enlightenment"
- cultist_desc = "converts a normal crewmember on top of it to the cult. Does not work on mindshielded crew."
+ cultist_name = "Rite of Offering"
+ cultist_desc = "Offers a non-cultists on top of it to your deity, either converting or sacrificing them."
invocation = "Mah'weyh pleggh at e'ntrath!"
icon_state = "3"
- req_cultists = 2
-
+ req_cultists = 1
+ allow_excess_invokers = TRUE
+ rune_in_use = FALSE
+
/obj/effect/rune/convert/do_invoke_glow()
return
/obj/effect/rune/convert/invoke(var/list/invokers)
- var/list/convertees = list()
- var/turf/T = get_turf(src)
-
- for(var/mob/living/M in T.contents)
- if(!iscultist(M) && !ismindshielded(M) && !isgolem(M) && ishuman(M))
- convertees.Add(M)
- if(!convertees.len)
- fail_invoke()
- log_game("Convert rune failed - no eligible convertees")
- return
- var/mob/living/new_cultist = pick(convertees)
- if(!is_convertable_to_cult(new_cultist.mind) || new_cultist.null_rod_check())
- for(var/M in invokers)
- to_chat(M, "Something is shielding [new_cultist]'s mind!")
- if(is_sacrifice_target(new_cultist.mind))
- to_chat(M, "\"I desire this one for myself. SACRIFICE THEM!\"")
- fail_invoke()
- log_game("Convert rune failed - convertee could not be converted")
- return
- ..()
-
- new_cultist.visible_message("[new_cultist] writhes in pain as the markings below them glow a bloody red!", \
- "AAAAAAAAAAAAAA-")
- SSticker.mode.add_cultist(new_cultist.mind, 1)
- new /obj/item/tome(get_turf(src))
- new_cultist.mind.special_role = "Cultist"
- to_chat(new_cultist, "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(new_cultist, "Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve [SSticker.cultdat.entity_title3] above all else. Bring it back.\
- ")
-
-//Rite of Tribute: Sacrifices a crew member to Nar-Sie. Places them into a soul shard if they're in their body.
-/obj/effect/rune/sacrifice
- cultist_name = "Rite of Tribute"
- cultist_desc = "sacrifices a crew member to your god. May place them into a soul shard if their spirit remains in their body."
- icon_state = "3"
- allow_excess_invokers = 1
- invocation = "Barhah hra zar'garis!"
- rune_in_use = 0
-
-/obj/effect/rune/sacrifice/New()
- ..()
- cultist_desc = "sacrifices a crew member to [SSticker.cultdat.entity_title3]. May place them into a soul shard if their spirit remains in their body."
-
-/obj/effect/rune/sacrifice/invoke(var/list/invokers)
if(rune_in_use)
return
- rune_in_use = 1
- var/mob/living/user = invokers[1] //the first invoker is always the user
+ var/list/myriad_targets = list()
var/turf/T = get_turf(src)
- var/list/possible_targets = list()
- for(var/mob/living/M in T.contents)
- if(M.mind)
- if(M.mind in sacrificed)
- continue
+ for(var/mob/living/M in T)
if(!iscultist(M))
- possible_targets.Add(M)
- var/mob/offering
- if(possible_targets.len > 1) //If there's more than one target, allow choice
- offering = input(user, "Choose an offering to sacrifice.", "Unholy Tribute") as null|anything in possible_targets
- if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated())
- return
- else if(possible_targets.len) //Otherwise, if there's a target at all, pick the only one
- offering = possible_targets[possible_targets.len]
- if(!offering)
- rune_in_use = 0
+ myriad_targets |= M
+ if(!myriad_targets.len)
+ fail_invoke()
+ log_game("Offer rune failed - no eligible targets")
+ rune_in_use = FALSE
return
+
+ rune_in_use = TRUE
+ var/mob/living/new_cultist = pick(myriad_targets)
+ if(is_convertable_to_cult(new_cultist.mind) && !new_cultist.null_rod_check() && !is_sacrifice_target(new_cultist.mind) && new_cultist.stat != DEAD && new_cultist.client != null)
+ invocation = "Mah'weyh pleggh at e'ntrath!"
+ ..()
+ do_convert(new_cultist, invokers)
+ else
+ invocation = "Barhah hra zar'garis!"
+ ..()
+ do_sacrifice(new_cultist, invokers)
+ rune_in_use = FALSE
+
+/obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers)
+ if(invokers.len < 2)
+ fail_invoke()
+ for(var/I in invokers)
+ to_chat(I, "You need at least two invokers to convert!")
+ return
+ else
+ convertee.visible_message("[convertee] writhes in pain as the markings below them glow a bloody red!", \
+ "AAAAAAAAAAAAAA-")
+ SSticker.mode.add_cultist(convertee.mind, 1)
+ new /obj/item/tome(get_turf(src))
+ convertee.mind.special_role = "Cultist"
+ 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, "Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve [SSticker.cultdat.entity_title3] above all else. Bring it back.\
+ ")
+ return
+
+/obj/effect/rune/convert/proc/do_sacrifice(mob/living/offering, list/invokers)
+ var/mob/living/user = invokers[1] //the first invoker is always the user
if(((ishuman(offering) || isrobot(offering)) && offering.stat != DEAD) || is_sacrifice_target(offering.mind)) //Requires three people to sacrifice living targets
if(invokers.len < 3)
for(var/M in invokers)
to_chat(M, "[offering] is too greatly linked to the world! You need three acolytes!")
fail_invoke()
log_game("Sacrifice rune failed - not enough acolytes and target is living")
- rune_in_use = 0
return
- visible_message("[src] pulses blood red!")
- color = rgb(126, 23, 23)
- ..()
- sac(invokers, offering)
- color = initial(color)
-/obj/effect/rune/sacrifice/proc/sac(var/list/invokers, mob/living/T)
var/sacrifice_fulfilled
var/datum/game_mode/cult/cult_mode = SSticker.mode
- if(T)
- if(isdog(T)) // Doggos are the best, but not cats
- for(var/M in invokers)
- var/mob/living/L = M
- to_chat(L, "\"Even I have standards, such as they are!\"")
- if(L.reagents)
- L.reagents.add_reagent("hell_water", 2)
- if(T.mind)
- sacrificed.Add(T.mind)
- if(is_sacrifice_target(T.mind))
- sacrifice_fulfilled = 1
- new /obj/effect/temp_visual/cult/sac(loc)
- if(SSticker && SSticker.mode && SSticker.mode.name == "cult")
-
- cult_mode.harvested++
- for(var/M in invokers)
- if(sacrifice_fulfilled)
- to_chat(M, "\"Yes! This is the one I desire! You have done well.\"")
- cult_mode.additional_phase()
- else
- if(ishuman(T) || isrobot(T))
- to_chat(M, "\"I accept this sacrifice.\"")
- else
- to_chat(M, "\"I accept this meager sacrifice.\"")
- if(T.mind)
- var/obj/item/soulstone/stone = new /obj/item/soulstone(get_turf(src))
- stone.invisibility = INVISIBILITY_MAXIMUM //so it's not picked up during transfer_soul()
- if(!stone.transfer_soul("VICTIM", T, usr)) //If it cannot be added
- qdel(stone)
- if(stone)
- stone.invisibility = 0
- if(!T)
- rune_in_use = 0
- return
- if(isrobot(T))
- playsound(T, 'sound/effects/EMPulse.ogg', 100, 1)
- T.dust() //To prevent the MMI from remaining
+ if(offering.mind)
+ sacrificed.Add(offering.mind)
+ if(is_sacrifice_target(offering.mind))
+ sacrifice_fulfilled = TRUE
+ new /obj/effect/temp_visual/cult/sac(loc)
+ if(SSticker && SSticker.mode && SSticker.mode.name == "cult")
+ cult_mode.harvested++
+ for(var/M in invokers)
+ if(sacrifice_fulfilled)
+ to_chat(M, "\"Yes! This is the one I desire! You have done well.\"")
+ cult_mode.additional_phase()
else
- playsound(T, 'sound/magic/disintegrate.ogg', 100, 1)
- T.gib()
- rune_in_use = 0
+ if(ishuman(offering) || isrobot(offering))
+ to_chat(M, "\"I accept this sacrifice.\"")
+ else
+ to_chat(M, "\"I accept this meager sacrifice.\"")
+ playsound(offering, 'sound/misc/demon_consume.ogg', 100, 1)
+ if((ishuman(offering) || isrobot(offering)) && offering.client_mobs_in_contents?.len)
+ var/obj/item/soulstone/stone = new /obj/item/soulstone(get_turf(src))
+ stone.invisibility = INVISIBILITY_MAXIMUM //so it's not picked up during transfer_soul()
+ stone.transfer_soul("FORCE", offering, user) //If it cannot be added
+ stone.invisibility = 0
+ else
+ offering.dust()
//Ritual of Dimensional Rending: Calls forth the avatar of Nar-Sie upon the station.
/obj/effect/rune/narsie
@@ -707,6 +663,7 @@ var/list/teleport_runes = list()
/obj/effect/rune/raise_dead/fail_invoke()
..()
+ rune_in_use = FALSE
for(var/mob/living/M in range(1,src))
if(M.stat == DEAD)
M.visible_message("[M] twitches.")
diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm
index 908eaa5360f..9fce3cc6e24 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction.dm
@@ -184,7 +184,7 @@
var/obj/machinery/abductor/console/con = get_team_console(team_number)
var/datum/objective/objective = team_objectives[team_number]
if(con.experiment.points >= objective.target_amount)
- SSshuttle.emergency.request(null, 0.5)
+ SSshuttle.emergency.request(null, 0.5, reason = "Large amount of abnormal thought patterns detected. All crew are recalled for mandatory evaluation and reconditioning.")
SSshuttle.emergency.canRecall = FALSE
finished = 1
return ..()
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index b761af6db92..f86f018757e 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -162,7 +162,7 @@
to_chat(src, "You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable.")
to_chat(src, "To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities.")
to_chat(src, "You do not remember anything of your past lives, nor will you remember anything about this one after your death.")
- to_chat(src, "Be sure to read the wiki page at http://nanotrasen.se/wiki/index.php/Revenant to learn more.")
+ to_chat(src, "Be sure to read the wiki page at http://www.paradisestation.org/wiki/index.php/Revenant to learn more.")
var/datum/objective/revenant/objective = new
objective.owner = mind
mind.objectives += objective
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 214c349978a..89ecb1d103b 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -1,4 +1,4 @@
-var/global/list/all_objectives = list()
+GLOBAL_LIST_EMPTY(all_objectives)
var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datum/theft_objective/steal - /datum/theft_objective/number - /datum/theft_objective/unique
@@ -10,13 +10,13 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
var/completed = 0 //currently only used for custom objectives.
var/martyr_compatible = 0 //If the objective is compatible with martyr objective, i.e. if you can still do it while dead.
-/datum/objective/New(var/text)
- all_objectives |= src
+/datum/objective/New(text)
+ GLOB.all_objectives += src
if(text)
explanation_text = text
/datum/objective/Destroy()
- all_objectives -= src
+ GLOB.all_objectives -= src
return ..()
/datum/objective/proc/check_completion()
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index b580f88c0b7..b4b4b265711 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -126,7 +126,7 @@ Made by Xhuis
to_chat(shadow.current, "Currently, you are disguised as an employee aboard [world.name].")
to_chat(shadow.current, "In your limited state, you have two abilities: Hatch and Shadowling Hivemind (:8).")
to_chat(shadow.current, "Any other shadowlings are your allies. You must assist them as they shall assist you.")
- to_chat(shadow.current, "If you are new to shadowling, or want to read about abilities, check the wiki page at http://nanotrasen.se/wiki/index.php/Shadowling
")
+ to_chat(shadow.current, "If you are new to shadowling, or want to read about abilities, check the wiki page at https://www.paradisestation.org/wiki/index.php/Shadowling
")
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index 7791c48b432..6c9674d130e 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -584,7 +584,7 @@
return
if(stat != DEAD)
- if(weakened)
+ if(IsWeakened())
visible_message("[src] looks to be in pain!")
adjustBrainLoss(60)
else
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index cca11dc0a98..2edbb41cb95 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -205,24 +205,19 @@
/obj/item/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob)
switch(choice)
if("FORCE")
- var/obj/item/soulstone/C = src
- if(!iscarbon(target)) //TODO: Add sacrifice stoning for non-organics, just because you have no body doesnt mean you dont have a soul
- return 0
- if(contents.len)
- return 0
- var/mob/living/carbon/T = target
+ var/obj/item/soulstone/SS = src
+ var/mob/living/T = target
if(T.client != null)
- for(var/obj/item/W in T)
- T.unEquip(W)
- C.init_shade(T, U)
- return 1
+ SS.init_shade(T, U)
else
to_chat(U, "Capture failed!: The soul has already fled its mortal frame. You attempt to bring it back...")
- return C.getCultGhost(T,U)
+ T.Paralyse(20)
+ if(!SS.getCultGhost(T,U))
+ T.dust() //If we can't get a ghost, kill the sacrifice anyway.
if("VICTIM")
var/mob/living/carbon/human/T = target
- var/obj/item/soulstone/C = src
+ var/obj/item/soulstone/SS = src
if(T.stat == 0)
to_chat(U, "Capture failed!: Kill or maim the victim first!")
else
@@ -231,94 +226,67 @@
else
if(T.client == null)
to_chat(U, "Capture failed!: The soul has already fled its mortal frame. You attempt to bring it back...")
- C.getCultGhost(T,U)
+ SS.getCultGhost(T,U)
else
- if(C.contents.len)
+ if(SS.contents.len)
to_chat(U, "Capture failed!: The soul stone is full! Use or free an existing soul to make room.")
else
- for(var/obj/item/W in T)
- T.unEquip(W)
- C.init_shade(T, U, vic = 1)
- qdel(T)
+ SS.init_shade(T, U, vic = 1)
+
if("SHADE")
var/mob/living/simple_animal/shade/T = target
- var/obj/item/soulstone/C = src
- if(!C.can_use(U))
+ var/obj/item/soulstone/SS = src
+ if(!SS.can_use(U))
U.Paralyse(5)
to_chat(U, "Your body is wracked with debilitating pain!")
return
if(T.stat == DEAD)
to_chat(U, "Capture failed!: The shade has already been banished!")
else
- if(C.contents.len)
+ if(SS.contents.len)
to_chat(U, "Capture failed!: The soul stone is full! Use or free an existing soul to make room.")
else
- T.loc = C //put shade in stone
+ T.loc = SS //put shade in stone
T.status_flags |= GODMODE
T.canmove = 0
T.health = T.maxHealth
T.faction |= "\ref[U]"
- C.icon_state = "soulstone2"
+ SS.icon_state = "soulstone2"
to_chat(T, "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form")
to_chat(U, "Capture successful!: [T.name]'s has been recaptured and stored within the soul stone.")
if("CONSTRUCT")
var/obj/structure/constructshell/T = target
- var/obj/item/soulstone/C = src
- var/mob/living/simple_animal/shade/A = locate() in C
- if(A)
+ var/obj/item/soulstone/SS = src
+ var/mob/living/simple_animal/shade/SH = locate() in SS
+ if(SH)
var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer")
switch(construct_class)
if("Juggernaut")
- var/mob/living/simple_animal/hostile/construct/armoured/Z = new /mob/living/simple_animal/hostile/construct/armoured (get_turf(T.loc))
- Z.key = A.key
- Z.faction |= "\ref[U]"
- if(iscultist(U))
- if(SSticker.mode.name == "cult")
- SSticker.mode:add_cultist(Z.mind)
- else
- SSticker.mode.cult+=Z.mind
- SSticker.mode.update_cult_icons_added(Z.mind)
- qdel(T)
- to_chat(Z, "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, create shield walls and even deflect energy weapons, and rip apart enemies and walls alike.")
- to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.")
- Z.cancel_camera()
- qdel(C)
+ var/mob/living/simple_animal/hostile/construct/armoured/C = new /mob/living/simple_animal/hostile/construct/armoured (get_turf(T.loc))
+ to_chat(C, "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, create shield walls and even deflect energy weapons, and rip apart enemies and walls alike.")
+ init_construct(C,SH,SS,T)
if("Wraith")
- var/mob/living/simple_animal/hostile/construct/wraith/Z = new /mob/living/simple_animal/hostile/construct/wraith (get_turf(T.loc))
- Z.key = A.key
- Z.faction |= "\ref[U]"
- if(iscultist(U))
- if(SSticker.mode.name == "cult")
- SSticker.mode:add_cultist(Z.mind)
- else
- SSticker.mode.cult+=Z.mind
- SSticker.mode.update_cult_icons_added(Z.mind)
- qdel(T)
- to_chat(Z, "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.")
- to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.")
- Z.cancel_camera()
- qdel(C)
+ var/mob/living/simple_animal/hostile/construct/wraith/C = new /mob/living/simple_animal/hostile/construct/wraith (get_turf(T.loc))
+ to_chat(C, "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.")
+ init_construct(C,SH,SS,T)
if("Artificer")
- var/mob/living/simple_animal/hostile/construct/builder/Z = new /mob/living/simple_animal/hostile/construct/builder (get_turf(T.loc))
- Z.key = A.key
- Z.faction |= "\ref[U]"
- if(iscultist(U))
- if(SSticker.mode.name == "cult")
- SSticker.mode:add_cultist(Z.mind)
- else
- SSticker.mode.cult+=Z.mind
- SSticker.mode.update_cult_icons_added(Z.mind)
- qdel(T)
- to_chat(Z, "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, use magic missile, repair allied constructs (by clicking on them), and most important of all create new constructs (Use your Artificer spell to summon a new construct shell and Summon Soulstone to create a new soulstone).")
- to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.")
- Z.cancel_camera()
- qdel(C)
+ var/mob/living/simple_animal/hostile/construct/builder/C = new /mob/living/simple_animal/hostile/construct/builder (get_turf(T.loc))
+ to_chat(C, "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, use magic missile, repair allied constructs (by clicking on them), and most important of all create new constructs (Use your Artificer spell to summon a new construct shell and Summon Soulstone to create a new soulstone).")
+ init_construct(C,SH,SS,T)
else
to_chat(U, "Creation failed!: The soul stone is empty! Go kill someone!")
return
+/proc/init_construct(mob/living/simple_animal/hostile/construct/C, mob/living/simple_animal/shade/SH, obj/item/soulstone/SS, obj/structure/constructshell/T)
+ SH.mind.transfer_to(C)
+ qdel(T)
+ qdel(SH)
+ to_chat(C, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.")
+ C.cancel_camera()
+ qdel(SS)
+
/proc/makeNewConstruct(var/mob/living/simple_animal/hostile/construct/ctype, var/mob/target, var/mob/stoner = null, cultoverride = 0)
if(jobban_isbanned(target, "cultist") || jobban_isbanned(target, "Syndicate"))
return
@@ -332,14 +300,14 @@
SSticker.mode.cult+=newstruct.mind
SSticker.mode.update_cult_icons_added(newstruct.mind)
if(stoner && iswizard(stoner))
- to_chat(newstruct, "You are still bound to serve your creator, follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.")
+ to_chat(newstruct, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.")
else if(stoner && iscultist(stoner))
- to_chat(newstruct, "You are still bound to serve the cult, follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.")
+ to_chat(newstruct, "You are still bound to serve the cult, follow their orders and help them complete their goals at all costs.")
else
- to_chat(newstruct, "You are still bound to serve your creator, follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.")
+ to_chat(newstruct, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.")
newstruct.cancel_camera()
-/obj/item/soulstone/proc/init_shade(mob/living/carbon/human/T, mob/U, vic = 0)
+/obj/item/soulstone/proc/init_shade(mob/living/T, mob/U, vic = 0)
new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
T.invisibility = 101
var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc )
@@ -355,19 +323,30 @@
S.name = "Shade of [T.real_name]"
S.real_name = "Shade of [T.real_name]"
S.key = T.key
- if(U)
- S.faction |= "\ref[U]" //Add the master as a faction, allowing inter-mob cooperation
- if(U && iscultist(U))
- SSticker.mode.add_cultist(S.mind, 0)
S.cancel_camera()
name = "soulstone: Shade of [T.real_name]"
icon_state = "soulstone2"
- if(U && iswizard(U))
- to_chat(S, "Your soul has been captured! You are now bound to [U.real_name]'s will. Help [U.p_them()] succeed in their goals at all costs.")
- else if(U && iscultist(U))
- to_chat(S, "Your soul has been captured! You are now bound to the cult's will. Help [U.p_them()] succeed in their goals at all costs.")
+ if(U)
+ S.faction |= "\ref[U]" //Add the master as a faction, allowing inter-mob cooperation
+ if(iswizard(U))
+ SSticker.mode.update_wiz_icons_added(S.mind)
+ S.mind.special_role = SPECIAL_ROLE_WIZARD_APPRENTICE
+ if(iscultist(U))
+ SSticker.mode.add_cultist(S.mind, 0)
+ S.mind.special_role = SPECIAL_ROLE_CULTIST
+ S.mind.store_memory("Serve the cult's will.")
+ to_chat(S, "Your soul has been captured! You are now bound to the cult's will. Help them succeed in their goals at all costs.")
+ else
+ S.mind.store_memory("Serve [U.real_name], your creator.")
+ to_chat(S, "Your soul has been captured! You are now bound to [U.real_name]'s will. Help them succeed in their goals at all costs.")
if(vic && U)
to_chat(U, "Capture successful!: [T.real_name]'s soul has been ripped from [U.p_their()] body and stored within the soul stone.")
+ if(isrobot(T))//Robots have to dust or else they spill out an empty robot brain, and unequiping them spills robot components that shouldn't spawn.
+ T.dust()
+ else
+ for(var/obj/item/W in T)
+ T.unEquip(W)
+ qdel(T)
/obj/item/soulstone/proc/get_shade_type()
return /mob/living/simple_animal/shade/cult
@@ -375,7 +354,7 @@
/obj/item/soulstone/anybody/get_shade_type()
return /mob/living/simple_animal/shade
-/obj/item/soulstone/proc/getCultGhost(mob/living/carbon/human/T, mob/U)
+/obj/item/soulstone/proc/getCultGhost(mob/living/T, mob/U)
var/mob/dead/observer/chosen_ghost
for(var/mob/dead/observer/ghost in GLOB.player_list) //We put them back in their body
@@ -395,8 +374,5 @@
if(contents.len) //If they used the soulstone on someone else in the meantime
return 0
T.ckey = chosen_ghost.ckey
- for(var/obj/item/W in T)
- T.unEquip(W)
init_shade(T, U)
- qdel(T)
return 1
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index c8bdeb37ac4..2c6e60c3d52 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -52,7 +52,7 @@
/obj/machinery/optable/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
- if(usr.stat || (!ishuman(user) && !isrobot(user)) || user.restrained() || !check_table(user) || user.weakened || user.stunned)
+ if(usr.stat || (!ishuman(user) && !isrobot(user)) || user.restrained() || !check_table(user) || user.IsWeakened() || user.stunned)
return
if(!ismob(O)) //humans only
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index b0368d652fb..0863b65415a 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -140,6 +140,9 @@
if(stat & (NOPOWER|BROKEN))
return
+ if(occupant == user)
+ return // you cant reach that
+
if(panel_open)
to_chat(user, "Close the maintenance panel first.")
return
diff --git a/code/game/machinery/chiller.dm b/code/game/machinery/chiller.dm
index afb17f3c90a..f29bb26e8ca 100644
--- a/code/game/machinery/chiller.dm
+++ b/code/game/machinery/chiller.dm
@@ -11,9 +11,7 @@
/obj/machinery/space_heater/air_conditioner/New()
..()
- cell = new(src)
- cell.charge = 1000
- cell.maxcharge = 1000
+ cell = new /obj/item/stock_parts/cell(src)
update_icon()
return
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index 672ebed32e4..bcabdeb511e 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -71,8 +71,8 @@
health_display = "DEAD"
else if(total_loss)
health_display = "HURT ([total_loss])"
- if(is_station_level(M.z) && !istype(M.loc, /turf/space))
- loc_display = "[get_area(M)]"
+ if(is_station_level(Tr.z) && !istype(Tr.loc, /turf/space))
+ loc_display = "[get_area(Tr)]"
dat += "ID: [T.id]
Subject: [M]
Location: [loc_display]
Health: [health_display]
"
dat += "(Message Holder) |
"
dat += "********************************
"
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index ae8b3f5829c..abf6dc725b3 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -380,7 +380,7 @@
cult_mode.bypass_phase()
//Update any existing objectives involving this mob.
- for(var/datum/objective/O in all_objectives)
+ for(var/datum/objective/O in GLOB.all_objectives)
// We don't want revs to get objectives that aren't for heads of staff. Letting
// them win or lose based on cryo is silly so we remove the objective.
if(istype(O,/datum/objective/mutiny) && O.target == occupant.mind)
@@ -395,7 +395,7 @@
if(!O) return
O.find_target()
if(!(O.target))
- all_objectives -= O
+ GLOB.all_objectives -= O
O.owner.objectives -= O
qdel(O)
if(occupant.mind && occupant.mind.assigned_role)
diff --git a/code/game/machinery/defib_mount.dm b/code/game/machinery/defib_mount.dm
index 4f27dfa4be5..267ea5da392 100644
--- a/code/game/machinery/defib_mount.dm
+++ b/code/game/machinery/defib_mount.dm
@@ -53,9 +53,9 @@
. += "There are a pair of bolts in the defib unit housing securing the [src] to the wall."
/obj/machinery/defibrillator_mount/process()
- if(defib && defib.bcell && defib.bcell.charge < defib.bcell.maxcharge && is_operational())
+ if(defib && defib.cell && defib.cell.charge < defib.cell.maxcharge && is_operational())
use_power(200)
- defib.bcell.give(180) //90% efficiency, slightly better than the cell charger's 87.5%
+ defib.cell.give(180) //90% efficiency, slightly better than the cell charger's 87.5%
update_icon()
/obj/machinery/defibrillator_mount/update_icon()
@@ -64,7 +64,7 @@
add_overlay("defib")
if(defib.powered)
add_overlay(defib.safety ? "online" : "emagged")
- var/ratio = defib.bcell.charge / defib.bcell.maxcharge
+ var/ratio = defib.cell.charge / defib.cell.maxcharge
ratio = CEILING(ratio * 4, 1) * 25
add_overlay("charge[ratio]")
if(clamps_locked)
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index f23734a0079..8bd7af5dad4 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -444,7 +444,7 @@
//Stolen from status_display
/obj/machinery/door_timer/proc/texticon(tn, px = 0, py = 0)
var/image/I = image('icons/obj/status_display.dmi', "blank")
- var/len = lentext(tn)
+ var/len = length(tn)
for(var/d = 1 to len)
var/char = copytext(tn, len-d+1, len-d+2)
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
index 4b512297ffd..12804cfcc88 100644
--- a/code/game/machinery/poolcontroller.dm
+++ b/code/game/machinery/poolcontroller.dm
@@ -28,21 +28,21 @@
/obj/machinery/poolcontroller/invisible/sea
name = "Sea Controller"
desc = "A controller for the underwater portion of the sea. Players shouldn't see this."
- deep_water = TRUE
+ deep_water = TRUE
-/obj/machinery/poolcontroller/Initialize(mapload)
- var/contents_loop = linked_area
+/obj/machinery/poolcontroller/Initialize(mapload)
+ var/contents_loop = linked_area
if(!linked_area)
contents_loop = range(srange, src)
for(var/turf/T in contents_loop)
if(istype(T, /turf/simulated/floor/beach/water))
var/turf/simulated/floor/beach/water/W = T
- W.linkedcontroller = src
+ W.linkedcontroller = src
linkedturfs += T
else if(istype(T, /turf/unsimulated/beach/water))
var/turf/unsimulated/beach/water/W = T
- W.linkedcontroller = src
+ W.linkedcontroller = src
linkedturfs += T
. = ..()
@@ -121,7 +121,7 @@
return //Has internals, no drowning
if((NO_BREATHE in drownee.dna.species.species_traits) || (BREATHLESS in drownee.mutations))
return //doesn't breathe, no drowning
- if(isskrell(drownee) || isneara(drownee))
+ if(HAS_TRAIT(drownee,TRAIT_WATERBREATH))
return //fish things don't drown
if(drownee.stat == DEAD) //Dead spacemen don't drown more
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index a07c639c36f..68c029f2111 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -353,7 +353,7 @@ var/list/turret_icons
to_chat(user, "You remove the turret and salvage some components.")
if(installation)
var/obj/item/gun/energy/Gun = new installation(loc)
- Gun.power_supply.charge = gun_charge
+ Gun.cell.charge = gun_charge
Gun.update_icon()
if(prob(50))
new /obj/item/stack/sheet/metal(loc, rand(1,4))
@@ -857,7 +857,7 @@ var/list/turret_icons
to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]")
return
installation = I.type //installation becomes I.type
- gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge
+ gun_charge = E.cell.charge //the gun's charge is stored in gun_charge
to_chat(user, "You add [I] to the turret.")
if(istype(installation, /obj/item/gun/energy/laser/tag/blue) || istype(installation, /obj/item/gun/energy/laser/tag/red))
@@ -964,7 +964,7 @@ var/list/turret_icons
build_step = 3
var/obj/item/gun/energy/Gun = new installation(loc)
- Gun.power_supply.charge = gun_charge
+ Gun.cell.charge = gun_charge
Gun.update_icon()
installation = null
gun_charge = 0
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index ff5410f6953..8e4e5e3dc59 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -107,8 +107,8 @@
if(charging)
if(istype(charging, /obj/item/gun/energy))
var/obj/item/gun/energy/E = charging
- if(E.power_supply.charge < E.power_supply.maxcharge)
- E.power_supply.give(E.power_supply.chargerate * recharge_coeff)
+ if(E.cell.charge < E.cell.maxcharge)
+ E.cell.give(E.cell.chargerate * recharge_coeff)
E.on_recharge()
use_power(250)
using_power = TRUE
@@ -116,8 +116,8 @@
if(istype(charging, /obj/item/melee/baton))
var/obj/item/melee/baton/B = charging
- if(B.bcell)
- if(B.bcell.give(B.bcell.chargerate))
+ if(B.cell)
+ if(B.cell.give(B.cell.chargerate))
use_power(200)
using_power = TRUE
@@ -141,8 +141,8 @@
if(istype(charging, /obj/item/bodyanalyzer))
var/obj/item/bodyanalyzer/B = charging
- if(B.power_supply)
- if(B.power_supply.give(B.power_supply.chargerate))
+ if(B.cell)
+ if(B.cell.give(B.cell.chargerate))
use_power(200)
using_power = TRUE
@@ -155,13 +155,13 @@
if(istype(charging, /obj/item/gun/energy))
var/obj/item/gun/energy/E = charging
- if(E.power_supply)
- E.power_supply.emp_act(severity)
+ if(E.cell)
+ E.cell.emp_act(severity)
else if(istype(charging, /obj/item/melee/baton))
var/obj/item/melee/baton/B = charging
- if(B.bcell)
- B.bcell.charge = 0
+ if(B.cell)
+ B.cell.charge = 0
..(severity)
/obj/machinery/recharger/update_icon(using_power = FALSE) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 4b081307762..57903822b50 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -173,17 +173,17 @@
F.icon_state = "flash"
if(istype(O,/obj/item/gun/energy/disabler/cyborg))
var/obj/item/gun/energy/disabler/cyborg/D = O
- if(D.power_supply.charge < D.power_supply.maxcharge)
+ if(D.cell.charge < D.cell.maxcharge)
var/obj/item/ammo_casing/energy/E = D.ammo_type[D.select]
- D.power_supply.give(E.e_cost)
+ D.cell.give(E.e_cost)
D.on_recharge()
D.update_icon()
else
D.charge_tick = 0
if(istype(O,/obj/item/melee/baton))
var/obj/item/melee/baton/B = O
- if(B.bcell)
- B.bcell.charge = B.bcell.maxcharge
+ if(B.cell)
+ B.cell.charge = B.cell.maxcharge
//Service
if(istype(O,/obj/item/reagent_containers/food/condiment/enzyme))
if(O.reagents.get_reagent_amount("enzyme") < 50)
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index eb3052dd909..eecdc0e4f4a 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -8,6 +8,7 @@ var/const/SAFETY_COOLDOWN = 100
layer = MOB_LAYER+1 // Overhead
anchored = 1
density = 1
+ damage_deflection = 10
var/safety_mode = 0 // Temporarily stops machine if it detects a mob
var/icon_name = "grinder-o"
var/blood = 0
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 00d29b43459..3cfe6fe50ff 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -18,9 +18,7 @@
/obj/machinery/space_heater/New()
..()
- cell = new(src)
- cell.charge = 1000
- cell.maxcharge = 1000
+ cell = new /obj/item/stock_parts/cell(src)
update_icon()
return
diff --git a/code/game/machinery/supply_display.dm b/code/game/machinery/supply_display.dm
index d08f68b2914..1fe7ee6e4cb 100644
--- a/code/game/machinery/supply_display.dm
+++ b/code/game/machinery/supply_display.dm
@@ -14,7 +14,7 @@
else
message1 = "CARGO"
message2 = SSshuttle.supply.getTimerStr()
- if(lentext(message2) > CHARS_PER_LINE)
+ if(length(message2) > CHARS_PER_LINE)
message2 = "Error"
update_display(message1, message2)
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index b47693f1dcb..a82cc58e028 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -62,6 +62,4 @@
ME.attach(src)
/obj/mecha/combat/gygax/dark/add_cell()
- cell = new /obj/item/stock_parts/cell/bluespace(src)
- cell.charge = 30000
- cell.maxcharge = 30000
\ No newline at end of file
+ cell = new /obj/item/stock_parts/cell/hyper(src)
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 4b17b172c55..7bd95d87a35 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -59,8 +59,6 @@
/obj/mecha/combat/marauder/seraph/add_cell()
cell = new /obj/item/stock_parts/cell/bluespace(src)
- cell.charge = 40000
- cell.maxcharge = 40000
/obj/mecha/combat/marauder/seraph/loaded/New()
..()//Let it equip whatever is needed.
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index 5b5f483b94f..aacd605b730 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -316,40 +316,38 @@
var/mob/originaloccupant = chassis.occupant
spawn(0)
src = null //if src is deleted, still process the syringe
- for(var/i=0, i<6, i++)
+ var/max_range = 6
+ for(var/i=0, i [M] was hit by the syringe!")
- if(M.can_inject(null, TRUE))
- if(mechsyringe.reagents)
- for(var/datum/reagent/A in mechsyringe.reagents.reagent_list)
- R += A.id + " ("
- R += num2text(A.volume) + "),"
- add_attack_logs(originaloccupant, M, "Shot with [src] containing [R], transferred [mechsyringe.reagents.total_volume] units")
- mechsyringe.icon_state = initial(mechsyringe.icon_state)
- mechsyringe.icon = initial(mechsyringe.icon)
- mechsyringe.reagents.reaction(M, INGEST)
- mechsyringe.reagents.trans_to(M, mechsyringe.reagents.total_volume)
- M.take_organ_damage(2)
- break
- else if(mechsyringe.loc == trg)
- mechsyringe.icon_state = initial(mechsyringe.icon_state)
- mechsyringe.icon = initial(mechsyringe.icon)
- mechsyringe.update_icon()
- break
- else
- mechsyringe.icon_state = initial(mechsyringe.icon_state)
- mechsyringe.icon = initial(mechsyringe.icon)
- mechsyringe.update_icon()
+ if(!step_towards(mechsyringe,trg))
+ break
+
+ var/list/mobs = new
+ for(var/mob/living/carbon/M in mechsyringe.loc)
+ mobs += M
+ var/mob/living/carbon/M = safepick(mobs)
+ if(M)
+ var/R
+ mechsyringe.visible_message(" [M] was hit by the syringe!")
+ if(M.can_inject(null, TRUE))
+ if(mechsyringe.reagents)
+ for(var/datum/reagent/A in mechsyringe.reagents.reagent_list)
+ R += A.id + " ("
+ R += num2text(A.volume) + "),"
+ add_attack_logs(originaloccupant, M, "Shot with [src] containing [R], transferred [mechsyringe.reagents.total_volume] units")
+ mechsyringe.reagents.reaction(M, INGEST)
+ mechsyringe.reagents.trans_to(M, mechsyringe.reagents.total_volume)
+ M.take_organ_damage(2)
+ break
+ else if(mechsyringe.loc == trg)
break
sleep(1)
+ if(mechsyringe)
+ // Revert the syringe icon to normal one once it stops flying.
+ mechsyringe.icon_state = initial(mechsyringe.icon_state)
+ mechsyringe.icon = initial(mechsyringe.icon)
+ mechsyringe.update_icon()
return 1
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index aed3216332c..85f511395f1 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1,9 +1,3 @@
-
-
-#define MECHAMOVE_RAND 1
-#define MECHAMOVE_TURN 2
-#define MECHAMOVE_STEP 4
-
/obj/mecha
name = "Mecha"
desc = "Exosuit"
diff --git a/code/game/objects/items/decorations.dm b/code/game/objects/items/decorations.dm
new file mode 100644
index 00000000000..59ff6574890
--- /dev/null
+++ b/code/game/objects/items/decorations.dm
@@ -0,0 +1,274 @@
+/obj/item/decorations
+ icon = 'icons/obj/decorations.dmi'
+
+
+//duct tape decorations
+/obj/item/decorations/sticky_decorations
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/decorations/sticky_decorations/New()
+ . = ..()
+ AddComponent(/datum/component/ducttape, src, null, 0, 0, TRUE)//add this to something to make it sticky but without the tape overlay
+
+
+
+/obj/item/decorations/sticky_decorations/flammable
+ resistance_flags = FLAMMABLE
+
+
+//Non-holiday decorations
+
+/obj/item/decorations/sticky_decorations/flammable/heart
+ name = "paper heart"
+ desc = "Do not break."
+ icon_state = "decoration_heart"
+
+/obj/item/decorations/sticky_decorations/flammable/star
+ name = "paper star"
+ desc = "Throw it and make a wish!"
+ icon_state = "decoration_star"
+
+/obj/item/decorations/sticky_decorations/flammable/singleeye
+ name = "paper eye"
+ desc = "Feels like it stares into your soul."
+ icon_state = "paper_eye"
+
+/obj/item/decorations/sticky_decorations/flammable/googlyeyes
+ name = "paper googly eyes"
+ desc = "Seems to be looking at something with interest."
+ icon_state = "paper_googly_eyes"
+
+/obj/item/decorations/sticky_decorations/flammable/paperclock
+ name = "paper clock"
+ desc = "A paper clock. Right at least twice a day."
+ icon_state = "paper_clock"
+
+
+//Holiday decorations
+
+//Halloween decorations
+
+/obj/item/decorations/sticky_decorations/flammable/jack_o_lantern
+ name = "paper jack o'lantern"
+ desc = "A paper jack o'lantern. Although you can't put a candle in him he has a fun loving smile none the less!"
+ icon_state = "decoration_jack_o_lantern"
+
+/obj/item/decorations/sticky_decorations/flammable/ghost
+ name = "paper ghost"
+ desc = "A paper ghost. If it starts moving on its own, you know who to call."
+ icon_state = "decoration_ghost"
+
+/obj/item/decorations/sticky_decorations/flammable/spider
+ name = "paper spider"
+ desc = "A paper spider. Creepy but not venomous, thankfully."
+ icon_state = "decoration_spider"
+
+/obj/item/decorations/sticky_decorations/flammable/spiderweb
+ name = "paper spiderweb"
+ desc = "A paper spiderweb. You see someone wrote 'For Rent' on it."
+ icon_state = "decoration_spider_web"
+
+/obj/item/decorations/sticky_decorations/flammable/skull
+ name = "paper skull"
+ desc = "A paper skull. Seems a paper skeleton lost their head!"
+ icon_state = "decoration_skull"
+
+/obj/item/decorations/sticky_decorations/flammable/skeleton
+ name = "paper skeleton"
+ desc = "A paper skeleton. Instead of rattling, his bones rustle."
+ icon_state = "decoration_skeleton"
+
+/obj/item/decorations/sticky_decorations/flammable/cauldron
+ name = "paper cauldron"
+ desc = "A paper cauldron. Careful, a paper witch might be about."
+ icon_state = "paper_cauldron"
+
+//Christmas decorations
+
+/obj/item/decorations/sticky_decorations/flammable/snowman
+ name = "paper snowman"
+ desc = "A paper snowman. This one won't melt when it gets warm."
+ icon_state = "decoration_snowman"
+
+/obj/item/decorations/sticky_decorations/flammable/christmas_stocking
+ name = "paper stocking"
+ desc = "A paper Christmas stocking. Sadly you won't find gifts in it but at least you won't find coal either."
+ icon_state = "decoration_christmas_stocking"
+
+/obj/item/decorations/sticky_decorations/flammable/christmas_tree
+ name = "paper christmas tree"
+ desc = "A paper Christmas tree. Maybe someone will leave a present under it?"
+ icon_state = "decoration_christmas_tree"
+
+/obj/item/decorations/sticky_decorations/flammable/snowflake
+ name = "paper snowflake"
+ desc = "A paper snowflake. Imagine if snow was this big!"
+ icon_state = "decoration_snowflake"
+
+/obj/item/decorations/sticky_decorations/flammable/candy_cane
+ name = "paper candy cane"
+ desc = "A paper candy cane. Sadly, non-edible."
+ icon_state = "decoration_candy_cane"
+
+/obj/item/decorations/sticky_decorations/flammable/mistletoe
+ name = "paper mistletoe"
+ desc = "Paper mistletoe. If you stand next to this, expect to be kissed."
+ icon_state = "decoration_mistletoe"
+
+/obj/item/decorations/sticky_decorations/flammable/holly
+ name = "paper holly"
+ desc = "Paper holly. Wait is it the red berries or the white ones you kiss under?"
+ icon_state = "decoration_holly"
+
+//Tinsel
+
+/obj/item/decorations/sticky_decorations/flammable/tinsel
+ name = "paper tinsel"
+ desc = "Paper tinsel, because Nanotrasen is too cheap to buy the real deal."
+ icon_state = "decoration_tinsel_white"
+
+/obj/item/decorations/sticky_decorations/flammable/tinsel/red
+ icon_state = "decoration_tinsel_red"
+
+/obj/item/decorations/sticky_decorations/flammable/tinsel/blue
+ icon_state = "decoration_tinsel_blue"
+
+/obj/item/decorations/sticky_decorations/flammable/tinsel/yellow
+ icon_state = "decoration_tinsel_yellow"
+
+/obj/item/decorations/sticky_decorations/flammable/tinsel/purple
+ icon_state = "decoration_tinsel_purple"
+
+/obj/item/decorations/sticky_decorations/flammable/tinsel/green
+ icon_state = "decoration_tinsel_green"
+
+/obj/item/decorations/sticky_decorations/flammable/tinsel/orange
+ icon_state = "decoration_tinsel_orange"
+
+/obj/item/decorations/sticky_decorations/flammable/tinsel/black
+ icon_state = "decoration_tinsel_black"
+
+/obj/item/decorations/sticky_decorations/flammable/tinsel/halloween
+ desc = "Paper tinsel, because Nanotrasen is too cheap to buy the real deal. At least this one is spooky."
+ icon_state = "decoration_tinsel_halloween"
+
+//Valentines decorations
+
+
+
+/obj/item/decorations/sticky_decorations/flammable/arrowed_heart
+ name = "paper heart"
+ desc = "A paper heart. It's been shot through and Cupid is to blame!"
+ icon_state = "decoration_arrow_heart"
+
+/obj/item/decorations/sticky_decorations/flammable/heart_chain
+ name = "paper heart chain"
+ desc = "A paper chain of hearts. May our hearts always be together."
+ icon_state = "decoration_heart_chain"
+
+//St. Patrick's day
+
+/obj/item/decorations/sticky_decorations/flammable/four_leaf_clover
+ name = "paper four leaf clover"
+ desc = "A paper four leaf clover. Take it with you, it might bring good luck!"
+ icon_state = "decoration_four_leaf_clover"
+
+/obj/item/decorations/sticky_decorations/flammable/pot_of_gold
+ name = "paper pot of gold"
+ desc = "A paper pot of gold. You found the end of the paper rainbow!"
+ icon_state = "decoration_pot_o_gold"
+
+/obj/item/decorations/sticky_decorations/flammable/leprechaun_hat
+ name = "paper leprechaun hat"
+ desc = "A paper leprechaun hat. If you find the paper leprechaun that dropped this they might give you their pot of paper gold!"
+ icon_state = "decoration_leprechaun_hat"
+
+//Easter
+
+/obj/item/decorations/sticky_decorations/flammable/easter_bunny
+ name = "paper Easter bunny"
+ desc = "A paper Easter bunny. Help him find his lost eggs!"
+ icon_state = "decoration_easter_bunny"
+
+/obj/item/decorations/sticky_decorations/flammable/easter_egg
+ name = "paper Easter egg"
+ desc = "A paper Easter egg. If the chef won't let us use their eggs, then this will have to do."
+ icon_state = "decoration_easter_egg_blue"
+
+/obj/item/decorations/sticky_decorations/flammable/easter_egg/yellow
+ icon_state = "decoration_easter_egg_yellow"
+
+/obj/item/decorations/sticky_decorations/flammable/easter_egg/red
+ icon_state = "decoration_easter_egg_red"
+
+/obj/item/decorations/sticky_decorations/flammable/easter_egg/purple
+ icon_state = "decoration_easter_egg_purple"
+
+/obj/item/decorations/sticky_decorations/flammable/easter_egg/orange
+ icon_state = "decoration_easter_egg_orange"
+
+
+
+
+///////
+//Decorative structures
+///////
+
+
+/obj/structure/decorative_structures
+ icon = 'icons/obj/decorations.dmi'
+ icon_state = ""
+ density = 1
+ anchored = 0
+ max_integrity = 100
+
+/obj/structure/decorative_structures/metal
+ flags = CONDUCT
+
+/obj/structure/decorative_structures/metal/statue/metal_angel
+ name = "metal angel statue"
+ desc = "You feel a holy presence looking back at you."
+ icon_state = "metal_angel_statue"
+
+/obj/structure/decorative_structures/metal/statue/golden_disk
+ name = "golden disk statue"
+ desc = "You aren't sure what the runes say around the large plasma crystal."
+ icon_state = "golden_disk_statue"
+
+/obj/structure/decorative_structures/metal/statue/sun
+ name = "sun statue"
+ desc = "You wonder if you could be so grossly incandescent."
+ icon_state = "sun_statue"
+
+/obj/structure/decorative_structures/metal/statue/tesla
+ name = "tesla statue"
+ desc = "Lady Tesla, a powerful and dangerous mistress."
+ icon_state = "tesla_statue"
+
+/obj/structure/decorative_structures/metal/statue/moon
+ name = "moon statue"
+ desc = "Expect a lot of Vulps to howl around this thing."
+ icon_state = "moon_statue"
+
+/obj/structure/decorative_structures/metal/statue/tesla_monument
+ name = "tesla monument"
+ desc = "Praise be to lady Tesla!"
+ icon_state = "tesla_monument"
+
+
+/obj/structure/decorative_structures/flammable
+ resistance_flags = FLAMMABLE
+ max_integrity = 50
+
+
+/obj/structure/decorative_structures/flammable/grandfather_clock
+ name = "grandfather clock"
+ desc = "Seems the hands have stopped."
+ icon_state = "grandfather_clock"
+
+/obj/structure/decorative_structures/flammable/lava_land_display
+ name = "lava land display"
+ desc = "The tomb of many a miner and possibly a home for much worse things."
+ icon_state = "lava_land_display"
+
+
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 0c791be07cc..536c3dfd0e2 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -600,7 +600,7 @@ REAGENT SCANNER
throw_speed = 5
throw_range = 10
origin_tech = "magnets=6;biotech=6"
- var/obj/item/stock_parts/cell/power_supply
+ var/obj/item/stock_parts/cell/cell
var/cell_type = /obj/item/stock_parts/cell/upgraded
var/ready = TRUE // Ready to scan
var/time_to_use = 0 // How much time remaining before next scan is available.
@@ -609,7 +609,7 @@ REAGENT SCANNER
var/scan_cd = 60 SECONDS //how long before we can scan again
/obj/item/bodyanalyzer/get_cell()
- return power_supply
+ return cell
/obj/item/bodyanalyzer/advanced
cell_type = /obj/item/stock_parts/cell/upgraded/plus
@@ -624,8 +624,8 @@ REAGENT SCANNER
/obj/item/bodyanalyzer/New()
..()
- power_supply = new cell_type(src)
- power_supply.give(power_supply.maxcharge)
+ cell = new cell_type(src)
+ cell.give(cell.maxcharge)
update_icon()
/obj/item/bodyanalyzer/proc/setReady()
@@ -635,7 +635,7 @@ REAGENT SCANNER
/obj/item/bodyanalyzer/update_icon(printing = FALSE)
overlays.Cut()
- var/percent = power_supply.percent()
+ var/percent = cell.percent()
if(ready)
icon_state = "bodyanalyzer_1"
else
@@ -657,7 +657,7 @@ REAGENT SCANNER
playsound(user.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
return
- if(power_supply.charge >= usecharge)
+ if(cell.charge >= usecharge)
mobScan(M, user)
else
to_chat(user, "The scanner beeps angrily at you! It's out of charge!")
@@ -691,7 +691,7 @@ REAGENT SCANNER
var/mob/living/silicon/robot/R = user
R.cell.use(usecharge)
else
- power_supply.use(usecharge)
+ cell.use(usecharge)
ready = FALSE
update_icon(TRUE)
addtimer(CALLBACK(src, /obj/item/bodyanalyzer/.proc/setReady), scan_cd)
diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm
index a2b1f2fdedb..2bf519b4a22 100644
--- a/code/game/objects/items/documents.dm
+++ b/code/game/objects/items/documents.dm
@@ -33,6 +33,7 @@
name = "'Yellow' secret documents"
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Yellow\"."
icon_state = "docs_yellow"
+ resistance_flags = NONE
/obj/item/documents/syndicate/yellow/trapped
desc = "\"Top Secret\" documents printed on special copy-protected paper. It details sensitive Syndicate operational intelligence. These documents are marked \"Yellow\", and have a thin film of clear material covering their surface."
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 7dc1a97a735..9f8c877aa24 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -12,7 +12,7 @@
var/heal_brute = 0
var/heal_burn = 0
var/self_delay = 20
- var/unique_handling = 0 //some things give a special prompt, do we want to bypass some checks in parent?
+ var/unique_handling = FALSE //some things give a special prompt, do we want to bypass some checks in parent?
var/stop_bleeding = 0
var/healverb = "bandage"
@@ -31,28 +31,20 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_selected)
if(!H.can_inject(user, TRUE))
- return 1
+ return TRUE
if(!affecting)
to_chat(user, "That limb is missing!")
- return 1
+ return TRUE
if(affecting.is_robotic())
to_chat(user, "This can't be used on a robotic limb.")
- return 1
-
- if(stop_bleeding)
- if(H.bleedsuppress)
- to_chat(user, "[H]'s bleeding is already bandaged!")
- return 1
- else if(!H.bleed_rate)
- to_chat(user, "[H] isn't bleeding!")
- return 1
+ return TRUE
if(M == user && !unique_handling)
user.visible_message("[user] starts to apply [src] on [H]...")
if(!do_mob(user, H, self_delay))
- return 1
+ return TRUE
return
if(isanimal(M))
@@ -123,6 +115,7 @@
desc = "Some sterile gauze to wrap around bloody stumps."
icon_state = "gauze"
origin_tech = "biotech=2"
+ heal_brute = 10
stop_bleeding = 1800
/obj/item/stack/medical/bruise_pack/attackby(obj/item/I, mob/user, params)
@@ -140,13 +133,13 @@
/obj/item/stack/medical/bruise_pack/attack(mob/living/M, mob/user)
if(..())
- return 1
+ return TRUE
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_selected)
- if(affecting.open == 0)
+ if(affecting.open == FALSE)
affecting.germ_level = 0
if(stop_bleeding)
@@ -187,6 +180,7 @@
icon_state = "ointment"
origin_tech = "biotech=2"
healverb = "salve"
+ heal_burn = 10
/obj/item/stack/medical/ointment/attack(mob/living/M, mob/user)
if(..())
@@ -196,7 +190,7 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_selected)
- if(affecting.open == 0)
+ if(affecting.open == FALSE)
affecting.germ_level = 0
heal(H, user)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 71d5e36badf..0ad64e24f23 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -1069,6 +1069,22 @@ obj/item/toy/cards/deck/syndicate/black
name = "tuxedo cat plushie"
icon_state = "tuxedocat"
+/obj/item/toy/plushie/voxplushie
+ name = "vox plushie"
+ desc = "A stitched-together vox, fresh from the skipjack. Press its belly to hear it skree!"
+ icon_state = "plushie_vox"
+ item_state = "plushie_vox"
+ var/cooldown = 0
+
+/obj/item/toy/plushie/voxplushie/attack_self(mob/user)
+ if(!cooldown)
+ playsound(user, 'sound/voice/shriek1.ogg', 10, 0)
+ visible_message("Skreee!")
+ cooldown = 1
+ spawn(30) cooldown = 0
+ return
+ ..()
+
//New generation TG plushies
/obj/item/toy/plushie/lizardplushie
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 23e81e3c41d..581c4395650 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -20,11 +20,11 @@
var/safety = 1 //if you can zap people with the defibs on harm mode
var/powered = 0 //if there's a cell in the defib with enough power for a revive, blocks paddles from reviving otherwise
var/obj/item/twohanded/shockpaddles/paddles
- var/obj/item/stock_parts/cell/high/bcell = null
+ var/obj/item/stock_parts/cell/high/cell = null
var/combat = 0 //can we revive through space suits?
/obj/item/defibrillator/get_cell()
- return bcell
+ return cell
/obj/item/defibrillator/New() //starts without a cell for rnd
..()
@@ -35,7 +35,7 @@
/obj/item/defibrillator/loaded/New() //starts with hicap
..()
paddles = make_paddles()
- bcell = new(src)
+ cell = new(src)
update_icon()
return
@@ -49,8 +49,8 @@
. += "Ctrl-click to remove the paddles from the defibrillator."
/obj/item/defibrillator/proc/update_power()
- if(bcell)
- if(bcell.charge < paddles.revivecost)
+ if(cell)
+ if(cell.charge < paddles.revivecost)
powered = 0
else
powered = 1
@@ -63,21 +63,21 @@
overlays += "[icon_state]-paddles"
if(powered)
overlays += "[icon_state]-powered"
- if(!bcell)
+ if(!cell)
overlays += "[icon_state]-nocell"
if(!safety)
overlays += "[icon_state]-emagged"
/obj/item/defibrillator/proc/update_charge()
if(powered) //so it doesn't show charge if it's unpowered
- if(bcell)
- var/ratio = bcell.charge / bcell.maxcharge
+ if(cell)
+ var/ratio = cell.charge / cell.maxcharge
ratio = Ceiling(ratio*4) * 25
overlays += "[icon_state]-charge[ratio]"
/obj/item/defibrillator/CheckParts(list/parts_list)
..()
- bcell = locate(/obj/item/stock_parts/cell) in contents
+ cell = locate(/obj/item/stock_parts/cell) in contents
update_icon()
/obj/item/defibrillator/ui_action_click()
@@ -90,7 +90,7 @@
/obj/item/defibrillator/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stock_parts/cell))
var/obj/item/stock_parts/cell/C = W
- if(bcell)
+ if(cell)
to_chat(user, "[src] already has a cell.")
else
if(C.maxcharge < paddles.revivecost)
@@ -98,14 +98,14 @@
return
user.drop_item()
W.loc = src
- bcell = W
+ cell = W
to_chat(user, "You install a cell in [src].")
if(istype(W, /obj/item/screwdriver))
- if(bcell)
- bcell.update_icon()
- bcell.loc = get_turf(src.loc)
- bcell = null
+ if(cell)
+ cell.update_icon()
+ cell.loc = get_turf(src.loc)
+ cell = null
to_chat(user, "You remove the cell from the [src].")
update_icon()
@@ -120,7 +120,7 @@
to_chat(user, "You silently enable [src]'s safety protocols with the card.")
/obj/item/defibrillator/emp_act(severity)
- if(bcell)
+ if(cell)
deductcharge(1000 / severity)
if(safety)
safety = 0
@@ -182,15 +182,15 @@
var/M = get(paddles, /mob)
remove_paddles(M)
QDEL_NULL(paddles)
- QDEL_NULL(bcell)
+ QDEL_NULL(cell)
return ..()
/obj/item/defibrillator/proc/deductcharge(var/chrgdeductamt)
- if(bcell)
- if(bcell.charge < (paddles.revivecost+chrgdeductamt))
+ if(cell)
+ if(cell.charge < (paddles.revivecost+chrgdeductamt))
powered = 0
update_icon()
- if(bcell.use(chrgdeductamt))
+ if(cell.use(chrgdeductamt))
update_icon()
return 1
else
@@ -199,8 +199,8 @@
/obj/item/defibrillator/proc/cooldowncheck(var/mob/user)
spawn(50)
- if(bcell)
- if(bcell.charge >= paddles.revivecost)
+ if(cell)
+ if(cell.charge >= paddles.revivecost)
user.visible_message("[src] beeps: Unit ready.")
playsound(get_turf(src), 'sound/machines/defib_ready.ogg', 50, 0)
else
@@ -226,7 +226,7 @@
/obj/item/defibrillator/compact/loaded/New()
..()
paddles = make_paddles()
- bcell = new(src)
+ cell = new(src)
update_icon()
return
@@ -239,7 +239,7 @@
/obj/item/defibrillator/compact/combat/loaded/New()
..()
paddles = make_paddles()
- bcell = new /obj/item/stock_parts/cell/infinite(src)
+ cell = new /obj/item/stock_parts/cell/infinite(src)
update_icon()
return
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index 4d36c640784..4cc4cb948ce 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -18,7 +18,7 @@
-
+