The status display reads: Temperature range at [settableTemperatureRange]°C.
Heating power at [heatingPower*0.001]kJ.
Power consumption at [(efficiency*-0.0025)+150]%." //100%, 75%, 50%, 25%
-/obj/machinery/space_heater/update_icon()
+/obj/machinery/space_heater/update_icon_state()
if(on)
icon_state = "sheater-[mode]"
else
icon_state = "sheater-off"
- cut_overlays()
+/obj/machinery/space_heater/update_overlays()
+ . = ..()
if(panel_open)
- add_overlay("sheater-open")
+ . += "sheater-open"
/obj/machinery/space_heater/process()
if(!on || !is_operational())
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 3a2ce43315..cf6b2b4bf4 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -75,6 +75,12 @@
suit_type = /obj/item/clothing/suit/space/hardsuit/medical
mask_type = /obj/item/clothing/mask/breath
+/obj/machinery/suit_storage_unit/paramedic
+ name = "paramedic suit storage unit"
+ suit_type = /obj/item/clothing/suit/space/eva/paramedic
+ helmet_type = /obj/item/clothing/head/helmet/space/eva/paramedic
+ mask_type = /obj/item/clothing/mask/breath
+
/obj/machinery/suit_storage_unit/rd
suit_type = /obj/item/clothing/suit/space/hardsuit/rd
mask_type = /obj/item/clothing/mask/breath
@@ -134,29 +140,28 @@
QDEL_NULL(storage)
return ..()
-/obj/machinery/suit_storage_unit/update_icon()
- cut_overlays()
-
+/obj/machinery/suit_storage_unit/update_overlays()
+ . = ..()
if(uv)
if(uv_super)
- add_overlay("super")
+ . += "super"
else if(occupant)
- add_overlay("uvhuman")
+ . += "uvhuman"
else
- add_overlay("uv")
+ . += "uv"
else if(state_open)
if(stat & BROKEN)
- add_overlay("broken")
+ . += "broken"
else
- add_overlay("open")
+ . += "open"
if(suit)
- add_overlay("suit")
+ . += "suit"
if(helmet)
- add_overlay("helm")
+ . += "helm"
if(storage)
- add_overlay("storage")
+ . += "storage"
else if(occupant)
- add_overlay("human")
+ . += "human"
/obj/machinery/suit_storage_unit/power_change()
..()
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 221e35118e..b8d4ef26e8 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -102,7 +102,7 @@
. = ..()
. += "A digital display on it reads \"[seconds_remaining()]\"."
-/obj/machinery/syndicatebomb/update_icon()
+/obj/machinery/syndicatebomb/update_icon_state()
icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]"
/obj/machinery/syndicatebomb/proc/seconds_remaining()
diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm
index c2dd9a7828..fbb5505586 100644
--- a/code/game/machinery/telecomms/machines/allinone.dm
+++ b/code/game/machinery/telecomms/machines/allinone.dm
@@ -35,8 +35,6 @@
signal.data["compression"] = 0
signal.mark_done()
- if(signal.data["slow"] > 0)
- sleep(signal.data["slow"]) // simulate the network lag if necessary
signal.broadcast()
/obj/machinery/telecomms/allinone/attackby(obj/item/P, mob/user, params)
diff --git a/code/game/machinery/telecomms/machines/broadcaster.dm b/code/game/machinery/telecomms/machines/broadcaster.dm
index 0abe97c72e..6b03bcc880 100644
--- a/code/game/machinery/telecomms/machines/broadcaster.dm
+++ b/code/game/machinery/telecomms/machines/broadcaster.dm
@@ -41,9 +41,6 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages
return
GLOB.recentmessages.Add(signal_message)
- if(signal.data["slow"] > 0)
- sleep(signal.data["slow"]) // simulate the network lag if necessary
-
signal.broadcast()
if(!GLOB.message_delay)
diff --git a/code/game/machinery/telecomms/machines/bus.dm b/code/game/machinery/telecomms/machines/bus.dm
index ed7c33d50a..ce5ed31094 100644
--- a/code/game/machinery/telecomms/machines/bus.dm
+++ b/code/game/machinery/telecomms/machines/bus.dm
@@ -31,17 +31,10 @@
if(relay_information(signal, /obj/machinery/telecomms/processor))
return
- // failed to send to a processor, relay information anyway
- signal.data["slow"] += rand(1, 5) // slow the signal down only slightly
-
// Try sending it!
var/list/try_send = list(signal.server_type, /obj/machinery/telecomms/hub, /obj/machinery/telecomms/broadcaster)
- var/i = 0
for(var/send in try_send)
- if(i)
- signal.data["slow"] += rand(0, 1) // slow the signal down only slightly
- i++
if(relay_information(signal, send))
break
@@ -79,4 +72,4 @@
/obj/machinery/telecomms/bus/preset_one/birdstation
name = "Bus"
autolinkers = list("processor1", "common")
- freq_listening = list()
\ No newline at end of file
+ freq_listening = list()
diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm
index 1960080856..a6c2a0f126 100644
--- a/code/game/machinery/telecomms/machines/message_server.dm
+++ b/code/game/machinery/telecomms/machines/message_server.dm
@@ -74,7 +74,7 @@
if(!relay_information(signal, /obj/machinery/telecomms/hub))
relay_information(signal, /obj/machinery/telecomms/broadcaster)
-/obj/machinery/telecomms/message_server/update_icon()
+/obj/machinery/telecomms/message_server/update_icon_state()
if((stat & (BROKEN|NOPOWER)))
icon_state = "server-nopower"
else if (!toggled)
diff --git a/code/game/machinery/telecomms/machines/processor.dm b/code/game/machinery/telecomms/machines/processor.dm
index 2362273469..a09b3ca8fb 100644
--- a/code/game/machinery/telecomms/machines/processor.dm
+++ b/code/game/machinery/telecomms/machines/processor.dm
@@ -28,7 +28,6 @@
if(istype(machine_from, /obj/machinery/telecomms/bus))
relay_direct_information(signal, machine_from) // send the signal back to the machine
else // no bus detected - send the signal to servers instead
- signal.data["slow"] += rand(5, 10) // slow the signal down
relay_information(signal, signal.server_type)
//Preset Processors
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 7a9f682d34..d21edffea1 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -39,11 +39,6 @@ GLOBAL_LIST_EMPTY(telecomms_list)
return
var/send_count = 0
- // Apply some lag based on traffic rates
- var/netlag = round(traffic / 50)
- if(netlag > signal.data["slow"])
- signal.data["slow"] = netlag
-
// Loop through all linked machines and send the signal or copy.
for(var/obj/machinery/telecomms/machine in links)
if(filter && !istype( machine, filter ))
@@ -109,7 +104,7 @@ GLOBAL_LIST_EMPTY(telecomms_list)
links |= T
T.links |= src
-/obj/machinery/telecomms/update_icon()
+/obj/machinery/telecomms/update_icon_state()
if(on)
if(panel_open)
icon_state = "[initial(icon_state)]_o"
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 3cc71df0f1..985c1166b7 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -85,7 +85,7 @@
calibrated = FALSE
return
-/obj/machinery/teleport/hub/update_icon()
+/obj/machinery/teleport/hub/update_icon_state()
if(panel_open)
icon_state = "tele-o"
else if(is_ready())
@@ -218,7 +218,7 @@
if(teleporter_hub)
teleporter_hub.update_icon()
-/obj/machinery/teleport/station/update_icon()
+/obj/machinery/teleport/station/update_icon_state()
if(panel_open)
icon_state = "controller-o"
else if(stat & (BROKEN|NOPOWER))
diff --git a/code/game/machinery/toylathe.dm b/code/game/machinery/toylathe.dm
index a286bcdc25..87ab3cadd8 100644
--- a/code/game/machinery/toylathe.dm
+++ b/code/game/machinery/toylathe.dm
@@ -121,7 +121,7 @@
return ..()
/obj/machinery/autoylathe/proc/AfterMaterialInsert(obj/item/item_inserted, id_inserted, amount_inserted)
- if(item_inserted.custom_materials?.len && item_inserted.custom_materials[getmaterialref(/datum/material/glass)])
+ if(item_inserted.custom_materials?.len && item_inserted.custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)])
flick("autolathe_r",src)//plays glass insertion animation by default otherwise
else
flick("autolathe_o",src)//plays metal insertion animation
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index 4ed2473260..a2d4b9eb7e 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -38,8 +38,7 @@
..()
update_icon()
-/obj/machinery/transformer/update_icon()
- ..()
+/obj/machinery/transformer/update_icon_state()
if(stat & (BROKEN|NOPOWER) || cooldown == 1)
icon_state = "separator-AO0"
else
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index b5eed68ab0..ff5ba14810 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -199,8 +199,7 @@
-/obj/machinery/washing_machine/update_icon()
- cut_overlays()
+/obj/machinery/washing_machine/update_icon_state()
if(busy)
icon_state = "wm_running_[bloody_mess]"
else if(bloody_mess)
@@ -208,8 +207,11 @@
else
var/full = contents.len ? 1 : 0
icon_state = "wm_[state_open]_[full]"
+
+/obj/machinery/washing_machine/update_overlays()
+ . = ..()
if(panel_open)
- add_overlay("wm_panel")
+ . += "wm_panel"
/obj/machinery/washing_machine/attackby(obj/item/W, mob/user, params)
if(panel_open && !busy && default_unfasten_wrench(user, W))
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index 5f6b709d1a..7d44e7611c 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -226,8 +226,7 @@
return
if(M.health > 0)
M.adjustOxyLoss(-1)
- M.AdjustStun(-80)
- M.AdjustKnockdown(-80)
+ M.AdjustAllImmobility(-80)
M.AdjustUnconscious(-80)
if(M.reagents.get_reagent_amount(/datum/reagent/medicine/epinephrine) < 5)
M.reagents.add_reagent(/datum/reagent/medicine/epinephrine, 5)
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 978825c546..f1fa5ddd20 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -177,7 +177,7 @@
M.SetSleeping(0)
M.stuttering += 20
M.adjustEarDamage(0, 30)
- M.Knockdown(60)
+ M.DefaultCombatKnockdown(60)
if(prob(30))
M.Stun(200)
M.Unconscious(80)
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index facf687cc4..bcf1b948e2 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -128,11 +128,11 @@
else
recharge_port = null
-/obj/machinery/computer/mech_bay_power_console/update_icon()
- ..()
+/obj/machinery/computer/mech_bay_power_console/update_overlays()
+ . = ..()
if(!recharge_port || !recharge_port.recharging_mech || !recharge_port.recharging_mech.cell || !(recharge_port.recharging_mech.cell.charge < recharge_port.recharging_mech.cell.maxcharge) || stat & (NOPOWER|BROKEN))
return
- add_overlay("recharge_comp_on")
+ . += "recharge_comp_on"
/obj/machinery/computer/mech_bay_power_console/Initialize()
. = ..()
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 669bc89875..02115d3e30 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -755,7 +755,7 @@
AI.cancel_camera()
AI.controlled_mech = src
AI.remote_control = src
- AI.canmove = 1 //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow.
+ AI.mobility_flags = MOBILITY_FLAGS_DEFAULT //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow.
AI.can_shunt = 0 //ONE AI ENTERS. NO AI LEAVES.
to_chat(AI, AI.can_dominate_mechs ? "Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!" :\
"You have been uploaded to a mech's onboard computer.")
@@ -927,7 +927,7 @@
brainmob.forceMove(src) //should allow relaymove
brainmob.reset_perspective(src)
brainmob.remote_control = src
- brainmob.update_canmove()
+ brainmob.update_mobility()
brainmob.update_mouse_pointer()
icon_state = initial(icon_state)
update_icon()
@@ -941,7 +941,6 @@
/obj/mecha/container_resist(mob/living/user)
go_out()
-
/obj/mecha/Exited(atom/movable/M, atom/newloc)
if(occupant && occupant == M) // The occupant exited the mech without calling go_out()
go_out(TRUE, newloc)
@@ -993,7 +992,7 @@
L.reset_perspective()
mmi.mecha = null
mmi.update_icon()
- L.canmove = 0
+ L.mobility_flags = NONE
icon_state = initial(icon_state)+"-open"
setDir(dir_in)
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 845b208db1..5f54f0c93d 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -45,16 +45,6 @@
..()
update_icon()
-/obj/mecha/working/ripley/update_icon()
- ..()
- var/datum/component/armor_plate/C = GetComponent(/datum/component/armor_plate)
- if (C.amount)
- cut_overlays()
- if(C.amount < 3)
- add_overlay(occupant ? "ripley-g" : "ripley-g-open")
- else
- add_overlay(occupant ? "ripley-g-full" : "ripley-g-full-open")
-
/obj/mecha/working/ripley/Initialize()
. = ..()
AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list("melee" = 10, "bullet" = 5, "laser" = 5))
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 416644cada..0e14af75a9 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -36,8 +36,7 @@
//procs that handle the actual buckling and unbuckling
/atom/movable/proc/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
- if(!buckled_mobs)
- buckled_mobs = list()
+ LAZYINITLIST(buckled_mobs)
if(!istype(M))
return FALSE
@@ -66,7 +65,7 @@
M.buckled = src
M.setDir(dir)
buckled_mobs |= M
- M.update_canmove()
+ M.update_mobility()
M.throw_alert("buckled", /obj/screen/alert/restrained/buckled)
post_buckle_mob(M)
@@ -85,7 +84,7 @@
. = buckled_mob
buckled_mob.buckled = null
buckled_mob.anchored = initial(buckled_mob.anchored)
- buckled_mob.update_canmove()
+ buckled_mob.update_mobility()
buckled_mob.clear_alert("buckled")
buckled_mobs -= buckled_mob
SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, buckled_mob, force)
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index fbe25c5d1b..8c3ffa3cfc 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -113,7 +113,7 @@
/obj/effect/anomaly/grav/proc/gravShock(mob/living/A)
if(boing && isliving(A) && !A.stat)
- A.Knockdown(40)
+ A.DefaultCombatKnockdown(40)
var/atom/target = get_edge_target_turf(A, get_dir(src, get_step_away(A, src)))
A.throw_at(target, 5, 1)
boing = 0
diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm
index eea3bace98..48cf0b4a8b 100644
--- a/code/game/objects/effects/contraband.dm
+++ b/code/game/objects/effects/contraband.dm
@@ -409,6 +409,21 @@
desc = "A poster advertising a movie about some masked men."
icon_state = "poster44"
+/obj/structure/sign/poster/contraband/buzzfuzz
+ name = "Buzz Fuzz"
+ desc = "A poster advertising the newest drink \"Buzz Fuzz\" with its iconic slogan of ~A Hive of Flavour~."
+ icon_state = "poster45"
+
+/obj/structure/sign/poster/contraband/scum
+ name = "Security are Scum"
+ desc = "Anti-security propaganda. Features a human NanoTrasen security officer being shot in the head, with the words 'Scum' and a short inciteful manifesto. Used to anger security."
+ icon_state = "poster46"
+
+/obj/structure/sign/poster/contraband/syndicate_logo
+ name = "Syndicate"
+ desc = "A poster decipting a snake shaped into an ominous 'S'!"
+ icon_state = "poster47"
+
/obj/structure/sign/poster/official
poster_item_name = "motivational poster"
poster_item_desc = "An official Nanotrasen-issued poster to foster a compliant and obedient workforce. It comes with state-of-the-art adhesive backing, for easy pinning to any vertical surface."
@@ -595,4 +610,49 @@
desc = "This informational poster teaches the viewer what carbon dioxide is."
icon_state = "poster35_legit"
+/obj/structure/sign/poster/official/spiderlings
+ name = "Spiderlings"
+ desc = "This poster informs the crew of the dangers of spiderlings."
+ icon_state = "poster36_legit"
+
+/obj/structure/sign/poster/official/duelshotgun
+ name = "Cycler Shotgun Ad"
+ desc = "A poster advertising an advanced dual magazine tubes shotgun, boasting about how easy it is to swap between the two tubes."
+ icon_state = "poster37_legit"
+
+/obj/structure/sign/poster/official/fashion
+ name = "Fashion!"
+ desc = "An advertisement for 'Fashion!', a popular fashion magazine, depicting a woman with a black dress with a golden trim, she also has a red poppy in her hair."
+ icon_state = "poster38_legit"
+
+/obj/structure/sign/poster/official/pda_ad600
+ name = "NT PDA600 Ad"
+ desc = "A poster advertising an old discounted Nanotrasen PDA. This is the old 600 model, it has a small screen and suffered from security and networking issues."
+ icon_state = "poster39_legit"
+
+/obj/structure/sign/poster/official/pda_ad800
+ name = "NT PDA800 Ad"
+ desc = "An advertisement on an old Nanotrasen PDA model. The 800 fixed a lot of security flaws that the 600 had; it also had large touchscreen and hot-swappable cartridges."
+ icon_state = "poster40_legit"
+
+/obj/structure/sign/poster/official/hydro_ad
+ name = "Hydroponics Tray"
+ desc = "An advertisement for hydroponics trays. Space Station 13's botanical department uses a slightly newer model, but the principles are the same. From left to right: Green means the plant is done, red means the plant is unhealthy, flashing red means pests or weeds, yellow means the plant needs nutriment and blue means the plant needs water."
+ icon_state = "poster41_legit"
+
+/obj/structure/sign/poster/official/medical_green_cross
+ name = "Medical"
+ desc = "A green cross, one of the interplanetary symbol of health and aid. It has a bunch of common languages at the top with translations." // Didn't the American Heart Foundation trademark red crosses? I'm playing it safe with green, not that they'll notice spacegame13 poster.
+ icon_state = "poster42_legit"
+
+/obj/structure/sign/poster/official/nt_storm_officer
+ name = "NT Storm Ad"
+ desc = "An advertisement for NanoTrasen Storm. A premium infantry helmet, This is the officer variant. I comes with a better radio, better HUD software and better targeting sensors."
+ icon_state = "poster43_legit"
+
+/obj/structure/sign/poster/official/nt_storm
+ name = "NT Storm Ad"
+ desc = "An advertisement for NanoTrasen Storm. A premium infantry helmet, It contains a rebreather and full head coverage for use on harsh environments where the air isn't always safe to breathe."
+ icon_state = "poster44_legit"
+
#undef PLACE_SPEED
diff --git a/code/game/objects/effects/decals/cleanable/gibs.dm b/code/game/objects/effects/decals/cleanable/gibs.dm
index b6b93850f1..7df0153ddc 100644
--- a/code/game/objects/effects/decals/cleanable/gibs.dm
+++ b/code/game/objects/effects/decals/cleanable/gibs.dm
@@ -17,7 +17,7 @@
if(gibs_reagent_id)
reagents.add_reagent(gibs_reagent_id, 5)
if(gibs_bloodtype)
- add_blood_DNA(list("Non-human DNA" = gibs_bloodtype, diseases))
+ add_blood_DNA(list("Non-human DNA" = gibs_bloodtype), diseases)
update_icon()
/obj/effect/decal/cleanable/blood/gibs/update_icon()
diff --git a/code/game/objects/effects/effect_system/effects_other.dm b/code/game/objects/effects/effect_system/effects_other.dm
index dbc9b35275..c62dddfdb2 100644
--- a/code/game/objects/effects/effect_system/effects_other.dm
+++ b/code/game/objects/effects/effect_system/effects_other.dm
@@ -104,4 +104,5 @@
if(explosion_message)
location.visible_message("The solution violently explodes!", \
"You hear an explosion!")
- dyn_explosion(location, amount, flashing_factor)
\ No newline at end of file
+ dyn_explosion(location, amount, flashing_factor)
+
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index 7a45bdcf0c..97edd35581 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -151,6 +151,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark)
name = "Medical Doctor"
icon_state = "Medical Doctor"
+/obj/effect/landmark/start/paramedic
+ name = "Paramedic"
+ icon_state = "Paramedic"
+
/obj/effect/landmark/start/scientist
name = "Scientist"
icon_state = "Scientist"
@@ -502,8 +506,3 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
/obj/effect/landmark/stationroom/box/engine/New()
. = ..()
templates = CONFIG_GET(keyed_list/box_random_engine)
-
-// Landmark for the mining station
-/obj/effect/landmark/stationroom/lavaland/station
- templates = list("Public Mining Base" = 3)
- icon = 'icons/rooms/Lavaland/Mining.dmi'
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 6b94c65f49..2fb068a29b 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -48,7 +48,7 @@
/obj/effect/mine/stun/mineEffect(mob/living/victim)
if(isliving(victim))
- victim.Knockdown(stun_time)
+ victim.DefaultCombatKnockdown(stun_time)
/obj/effect/mine/kickmine
name = "kick mine"
diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm
index 8c3503367e..01edd82ccb 100644
--- a/code/game/objects/effects/step_triggers.dm
+++ b/code/game/objects/effects/step_triggers.dm
@@ -61,10 +61,11 @@
if(AM in T.affecting)
return
- if(ismob(AM))
- var/mob/M = AM
+ if(isliving(AM))
+ var/mob/living/M = AM
if(immobilize)
- M.canmove = 0
+ ADD_TRAIT(M, TRAIT_MOBILITY_NOMOVE, src)
+ M.update_mobility()
affecting.Add(AM)
while(AM && !stopthrow)
@@ -98,10 +99,11 @@
affecting.Remove(AM)
- if(ismob(AM))
- var/mob/M = AM
+ if(isliving(AM))
+ var/mob/living/M = AM
if(immobilize)
- M.canmove = 1
+ REMOVE_TRAIT(M, TRAIT_MOBILITY_NOMOVE, src)
+ M.update_mobility()
/* Stops things thrown by a thrower, doesn't do anything */
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index cdf6b77a76..53adc46239 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -139,13 +139,6 @@
/obj/effect/temp_visual/dir_setting/curse/hand
icon_state = "cursehand"
-/obj/effect/temp_visual/dir_setting/curse/hand/Initialize(mapload, set_dir, handedness)
- . = ..()
- update_icon()
-
-/obj/item/projectile/curse_hand/update_icon()
- icon_state = "[icon_state][handedness]"
-
/obj/effect/temp_visual/wizard
name = "water"
icon = 'icons/mob/mob.dmi'
@@ -474,7 +467,7 @@
else
update_icon()
-/obj/effect/constructing_effect/update_icon()
+/obj/effect/constructing_effect/update_icon_state()
icon_state = "rcd"
if (delay < 10)
icon_state += "_shortest"
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 8dfb36ce8a..fd1d2fc43d 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -175,14 +175,13 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
set category = "Object"
set src in oview(1)
- if(!isturf(loc) || usr.stat || usr.restrained() || !usr.canmove)
+ var/mob/living/L = usr
+ if(!istype(L) || !isturf(loc) || !CHECK_MOBILITY(L, MOBILITY_USE))
return
- var/turf/T = src.loc
-
- src.loc = null
-
- src.loc = T
+ var/turf/T = loc
+ loc = null
+ loc = T
/obj/item/examine(mob/user) //This might be spammy. Remove?
. = ..()
@@ -544,7 +543,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
to_chat(M, "You drop what you're holding and clutch at your eyes!")
M.adjust_blurriness(10)
M.Unconscious(20)
- M.Knockdown(40)
+ M.DefaultCombatKnockdown(40)
if (prob(eyes.damage - 10 + 1))
M.become_blind(EYE_DAMAGE)
to_chat(M, "You go blind!")
diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm
index 9f1d425d6c..d248556a9c 100644
--- a/code/game/objects/items/RCD.dm
+++ b/code/game/objects/items/RCD.dm
@@ -552,8 +552,8 @@ RLD
explosion(src, 0, 0, 3, 1, flame_range = 1)
qdel(src)
-/obj/item/construction/rcd/update_icon()
- ..()
+/obj/item/construction/rcd/update_overlays()
+ . = ..()
if(has_ammobar)
var/ratio = CEILING((matter / max_matter) * ammo_sections, 1)
cut_overlays() //To prevent infinite stacking of overlays
@@ -707,11 +707,10 @@ RLD
else
..()
-/obj/item/construction/rld/update_icon()
- ..()
+/obj/item/construction/rld/update_overlays()
+ . = ..()
var/ratio = CEILING((matter / max_matter) * ammo_sections, 1)
- cut_overlays() //To prevent infinite stacking of overlays
- add_overlay("rld_light[ratio]")
+ . += "rld_light[ratio]"
/obj/item/construction/rld/attack_self(mob/user)
..()
diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm
index 0eb97a8dee..9513519fa9 100644
--- a/code/game/objects/items/RCL.dm
+++ b/code/game/objects/items/RCL.dm
@@ -2,8 +2,8 @@
name = "rapid cable layer"
desc = "A device used to rapidly deploy cables. It has screws on the side which can be removed to slide off the cables. Do not use without insulation!"
icon = 'icons/obj/tools.dmi'
- icon_state = "rcl-empty"
- item_state = "rcl-0"
+ icon_state = "rcl"
+ item_state = "rcl"
var/obj/structure/cable/last
var/obj/item/stack/cable_coil/loaded
opacity = FALSE
@@ -23,6 +23,14 @@
var/datum/radial_menu/persistent/wiring_gui_menu
var/mob/listeningTo
+/obj/item/twohanded/rcl/Initialize()
+ . = ..()
+ update_icon()
+
+/obj/item/twohanded/rcl/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_updates_onmob)
+
/obj/item/twohanded/rcl/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = W
@@ -90,34 +98,28 @@
QDEL_NULL(wiring_gui_menu)
return ..()
-/obj/item/twohanded/rcl/update_icon()
- if(!loaded)
- icon_state = "rcl-empty"
- item_state = "rcl-empty"
+/obj/item/twohanded/rcl/update_icon_state()
+ icon_state = initial(icon_state)
+ item_state = initial(item_state)
+ if(!loaded || !loaded.amount)
+ icon_state += "-empty"
+ item_state += "-0"
+
+/obj/item/twohanded/rcl/update_overlays()
+ . = ..()
+ if(!loaded || !loaded.amount)
return
- cut_overlays()
- var/cable_amount = 0
- switch(loaded.amount)
- if(61 to INFINITY)
- cable_amount = 3
- if(31 to 60)
- cable_amount = 2
- if(1 to 30)
- cable_amount = 1
- else
- cable_amount = 0
-
- var/mutable_appearance/cable_overlay = mutable_appearance(icon, "rcl-[cable_amount]")
+ var/mutable_appearance/cable_overlay = mutable_appearance(icon, "[initial(icon_state)]-[CEILING(loaded.amount/(max_amount/3), 1)]")
cable_overlay.color = GLOB.cable_colors[colors[current_color_index]]
- if(cable_amount >= 1)
- icon_state = "rcl"
- item_state = "rcl"
- add_overlay(cable_overlay)
- else
- icon_state = "rcl-empty"
- item_state = "rcl-0"
- add_overlay(cable_overlay)
+ . += cable_overlay
+/obj/item/twohanded/rcl/worn_overlays(isinhands, icon_file, style_flags = NONE)
+ . = ..()
+ if(!isinhands || !(loaded?.amount))
+ return
+ var/mutable_appearance/cable_overlay = mutable_appearance(icon, "rcl-[CEILING(loaded.amount/(max_amount/3), 1)]")
+ cable_overlay.color = GLOB.cable_colors[colors[current_color_index]]
+ . += cable_overlay
/obj/item/twohanded/rcl/proc/is_empty(mob/user, loud = 1)
update_icon()
@@ -289,18 +291,6 @@ obj/item/twohanded/rcl/proc/getMobhook(mob/to_hook)
wiringGuiUpdate(user)
-
-/obj/item/twohanded/rcl/pre_loaded/Initialize() //Comes preloaded with cable, for testing stuff
- . = ..()
- loaded = new()
- loaded.max_amount = max_amount
- loaded.amount = max_amount
- update_icon()
-
-/obj/item/twohanded/rcl/Initialize()
- . = ..()
- update_icon()
-
/obj/item/twohanded/rcl/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/rcl_col))
current_color_index++;
@@ -319,37 +309,15 @@ obj/item/twohanded/rcl/proc/getMobhook(mob/to_hook)
else //open the menu
showWiringGui(user)
+/obj/item/twohanded/rcl/pre_loaded/Initialize() //Comes preloaded with cable, for testing stuff
+ loaded = new()
+ loaded.max_amount = max_amount
+ loaded.amount = max_amount
+ return ..()
+
/obj/item/twohanded/rcl/ghetto
actions_types = list()
max_amount = 30
name = "makeshift rapid cable layer"
+ icon_state = "rclg"
ghetto = TRUE
-
-/obj/item/twohanded/rcl/ghetto/update_icon()
- if(!loaded)
- icon_state = "rclg-empty"
- item_state = "rclg-0"
- return
- cut_overlays()
- var/cable_amount = 0
- switch(loaded.amount)
- if(20 to INFINITY)
- cable_amount = 3
- if(10 to 19)
- cable_amount = 2
- if(1 to 9)
- cable_amount = 1
- else
- cable_amount = 0
-
- var/mutable_appearance/cable_overlay = mutable_appearance(icon, "rcl-[cable_amount]")
- cable_overlay.color = GLOB.cable_colors[colors[current_color_index]]
- if(cable_amount >= 1)
- icon_state = "rclg"
- item_state = "rclg"
- add_overlay(cable_overlay)
- else
- icon_state = "rclg-empty"
- item_state = "rclg-0"
- add_overlay(cable_overlay)
-
diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm
index 3b1d9a8096..1f6dff490d 100644
--- a/code/game/objects/items/apc_frame.dm
+++ b/code/game/objects/items/apc_frame.dm
@@ -66,8 +66,8 @@
if(iswallturf(T))
T.attackby(src, user, params)
- var/metal_amt = round(custom_materials[getmaterialref(/datum/material/iron)]/MINERAL_MATERIAL_AMOUNT)
- var/glass_amt = round(custom_materials[getmaterialref(/datum/material/glass)]/MINERAL_MATERIAL_AMOUNT)
+ var/metal_amt = round(custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]/MINERAL_MATERIAL_AMOUNT)
+ var/glass_amt = round(custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)]/MINERAL_MATERIAL_AMOUNT)
if(istype(W, /obj/item/wrench) && (metal_amt || glass_amt))
to_chat(user, "You dismantle [src].")
diff --git a/code/game/objects/items/boombox.dm b/code/game/objects/items/boombox.dm
index 3b93480e43..49e2375c1a 100644
--- a/code/game/objects/items/boombox.dm
+++ b/code/game/objects/items/boombox.dm
@@ -37,7 +37,7 @@
SSjukeboxes.removejukebox(SSjukeboxes.findjukeboxindex(src))
. = ..()
-/obj/item/boombox/update_icon()
+/obj/item/boombox/update_icon_state()
icon_state = "[baseiconstate]_[boomingandboxing ? "on" : "off"]"
return
@@ -48,8 +48,11 @@
baseiconstate = "raiqbawks"
availabletrackids = list("hotline.ogg","chiptune.ogg","genesis.ogg")
-/obj/item/boombox/raiq/update_icon()
+/obj/item/boombox/raiq/Initialize()
. = ..()
+ RegisterSignal(src, COMSIG_ATOM_UPDATED_ICON, .proc/start_party)
+
+/obj/item/boombox/raiq/proc/start_party()
if(boomingandboxing)
START_PROCESSING(SSobj, src)
else
@@ -58,4 +61,3 @@
/obj/item/boombox/raiq/process()
set_light(5,0.95,pick("#d87aff","#7a7aff","#89ecff","#b88eff","#ff59ad"))
- return
diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm
index 78be7f78e8..11ab008c41 100644
--- a/code/game/objects/items/candle.dm
+++ b/code/game/objects/items/candle.dm
@@ -19,7 +19,7 @@
if(start_lit)
light()
-/obj/item/candle/update_icon()
+/obj/item/candle/update_icon_state()
icon_state = "candle[(wax > 400) ? ((wax > 750) ? 1 : 2) : 3][lit ? "_lit" : ""]"
/obj/item/candle/attackby(obj/item/W, mob/user, params)
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 4de3e4ff96..20e0b09d26 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -40,13 +40,13 @@
.=..()
update_icon()
-/obj/item/card/data/update_icon()
- cut_overlays()
+/obj/item/card/data/update_overlays()
+ . = ..()
if(detail_color == COLOR_FLOORTILE_GRAY)
return
var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/card.dmi', "[icon_state]-color")
detail_overlay.color = detail_color
- add_overlay(detail_overlay)
+ . += detail_overlay
/obj/item/card/data/attackby(obj/item/I, mob/living/user)
if(istype(I, /obj/item/integrated_electronics/detailer))
@@ -517,10 +517,16 @@ update_label("John Doe", "Clowny")
//Polychromatic Knight Badge
/obj/item/card/id/knight
- var/id_color = "#00FF00" //defaults to green
name = "knight badge"
icon_state = "knight"
desc = "A badge denoting the owner as a knight! It has a strip for swiping like an ID"
+ var/id_color = "#00FF00" //defaults to green
+ var/mutable_appearance/id_overlay
+
+/obj/item/card/id/knight/Initialize()
+ . = ..()
+ id_overlay = mutable_appearance(icon, "knight_overlay")
+ update_icon()
/obj/item/card/id/knight/update_label(newname, newjob)
if(newname || newjob)
@@ -529,14 +535,10 @@ update_label("John Doe", "Clowny")
name = "[(!registered_name) ? "knight badge" : "[registered_name]'s Knight Badge"][(!assignment) ? "" : " ([assignment])"]"
-/obj/item/card/id/knight/update_icon()
- var/mutable_appearance/id_overlay = mutable_appearance(icon, "knight_overlay")
-
- if(id_color)
- id_overlay.color = id_color
- cut_overlays()
-
- add_overlay(id_overlay)
+/obj/item/card/id/knight/update_overlays()
+ . = ..()
+ id_overlay.color = id_color
+ . += id_overlay
/obj/item/card/id/knight/AltClick(mob/living/user)
. = ..()
@@ -556,10 +558,6 @@ update_label("John Doe", "Clowny")
update_icon()
return TRUE
-/obj/item/card/id/knight/Initialize()
- . = ..()
- update_icon()
-
/obj/item/card/id/knight/examine(mob/user)
. = ..()
. += "Alt-click to recolor it."
diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm
index 2dcb495701..7b8c53484a 100644
--- a/code/game/objects/items/chrono_eraser.dm
+++ b/code/game/objects/items/chrono_eraser.dm
@@ -65,8 +65,9 @@
TED = new(src.loc)
return INITIALIZE_HINT_QDEL
-/obj/item/gun/energy/chrono_gun/update_icon()
- return
+/obj/item/gun/energy/chrono_gun/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_blocker)
/obj/item/gun/energy/chrono_gun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
if(field)
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index cd163e90a4..5b7c70b1b6 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -522,11 +522,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM
user.visible_message("[user] begins whacking [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
return BRUTELOSS
-/obj/item/lighter/update_icon()
- cut_overlays()
- var/mutable_appearance/lighter_overlay = mutable_appearance(icon,"lighter_overlay_[overlay_state][lit ? "-on" : ""]")
+/obj/item/lighter/update_icon_state()
icon_state = "[initial(icon_state)][lit ? "-on" : ""]"
- add_overlay(lighter_overlay)
+
+/obj/item/lighter/update_overlays()
+ . = ..()
+ var/mutable_appearance/lighter_overlay = mutable_appearance(icon,"lighter_overlay_[overlay_state][lit ? "-on" : ""]")
+ . += lighter_overlay
/obj/item/lighter/ignition_effect(atom/A, mob/user)
if(get_temperature())
@@ -645,12 +647,14 @@ CIGARETTE PACKETS ARE IN FANCY.DM
lighter_color = pick(color_list)
update_icon()
-/obj/item/lighter/greyscale/update_icon()
- cut_overlays()
- var/mutable_appearance/lighter_overlay = mutable_appearance(icon,"lighter_overlay_[overlay_state][lit ? "-on" : ""]")
+/obj/item/lighter/greyscale/update_icon_state()
icon_state = "[initial(icon_state)][lit ? "-on" : ""]"
+
+/obj/item/lighter/greyscale/update_overlays()
+ . = ..()
+ var/mutable_appearance/lighter_overlay = mutable_appearance(icon,"lighter_overlay_[overlay_state][lit ? "-on" : ""]")
lighter_overlay.color = lighter_color
- add_overlay(lighter_overlay)
+ . += lighter_overlay
/obj/item/lighter/greyscale/ignition_effect(atom/A, mob/user)
if(get_temperature())
@@ -852,7 +856,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(prob(5))//small chance for the vape to break and deal damage if it's emagged
playsound(get_turf(src), 'sound/effects/pop_expl.ogg', 50, 0)
M.apply_damage(20, BURN, BODY_ZONE_HEAD)
- M.Knockdown(300, 1, 0)
+ M.DefaultCombatKnockdown(300, 1, 0)
var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread
sp.set_up(5, 1, src)
sp.start()
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 49f8a90901..f5b13d4e3e 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -577,8 +577,8 @@
new /obj/item/toy/crayon/black(src)
update_icon()
-/obj/item/storage/crayons/update_icon()
- cut_overlays()
+/obj/item/storage/crayons/update_overlays()
+ . = ..()
for(var/obj/item/toy/crayon/crayon in contents)
add_overlay(mutable_appearance('icons/obj/crayons.dmi', crayon.item_color))
@@ -694,7 +694,7 @@
C.blind_eyes(1)
if(C.get_eye_protection() <= 0) // no eye protection? ARGH IT BURNS.
C.confused = max(C.confused, 3)
- C.Knockdown(60)
+ C.DefaultCombatKnockdown(60)
if(ishuman(C) && actually_paints)
var/mob/living/carbon/human/H = C
H.lip_style = "spray_face"
@@ -735,13 +735,15 @@
. = ..()
-/obj/item/toy/crayon/spraycan/update_icon()
+/obj/item/toy/crayon/spraycan/update_icon_state()
icon_state = is_capped ? icon_capped : icon_uncapped
+
+/obj/item/toy/crayon/spraycan/update_overlays()
+ . = ..()
if(use_overlays)
- cut_overlays()
var/mutable_appearance/spray_overlay = mutable_appearance('icons/obj/crayons.dmi', "[is_capped ? "spraycan_cap_colors" : "spraycan_colors"]")
spray_overlay.color = paint_color
- add_overlay(spray_overlay)
+ . += spray_overlay
/obj/item/toy/crayon/spraycan/borg
name = "cyborg spraycan"
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index e35d398021..3ac3347222 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -20,7 +20,7 @@
var/safety = TRUE //if you can zap people with the defibs on harm mode
var/powered = FALSE //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/cell
+ var/obj/item/stock_parts/cell/cell
var/combat = FALSE //can we revive through space suits?
var/grab_ghost = FALSE // Do we pull the ghost back into their body?
var/healdisk = FALSE // Will we shock people dragging the body?
@@ -35,19 +35,14 @@
/obj/item/defibrillator/Initialize() //starts without a cell for rnd
. = ..()
+ if(cell)
+ cell = new cell(src)
paddles = make_paddles()
- update_icon()
- return
-
-/obj/item/defibrillator/loaded/Initialize() //starts with hicap
- . = ..()
- cell = new(src)
- update_icon()
- return
-
-/obj/item/defibrillator/update_icon()
update_power()
- return ..()
+ return
+
+/obj/item/defibrillator/loaded
+ cell = /obj/item/stock_parts/cell/high
/obj/item/defibrillator/proc/update_power()
if(!QDELETED(cell))
@@ -57,6 +52,7 @@
powered = TRUE
else
powered = FALSE
+ update_icon()
/obj/item/defibrillator/update_overlays()
. = ..()
@@ -76,7 +72,7 @@
/obj/item/defibrillator/CheckParts(list/parts_list)
..()
cell = locate(/obj/item/stock_parts/cell) in contents
- update_icon()
+ update_power()
/obj/item/defibrillator/ui_action_click()
toggle_paddles()
@@ -124,7 +120,7 @@
return
cell = W
to_chat(user, "You install a cell in [src].")
- update_icon()
+ update_power()
else if(istype(W, /obj/item/screwdriver))
if(cell)
@@ -132,7 +128,7 @@
cell.forceMove(get_turf(src))
cell = null
to_chat(user, "You remove the cell from [src].")
- update_icon()
+ update_power()
else
return ..()
@@ -157,7 +153,7 @@
safety = TRUE
visible_message("[src] beeps: Safety protocols enabled!")
playsound(src, 'sound/machines/defib_saftyOn.ogg', 50, 0)
- update_icon()
+ update_power()
/obj/item/defibrillator/proc/toggle_paddles()
set name = "Toggle Paddles"
@@ -170,14 +166,14 @@
if(!usr.put_in_hands(paddles))
on = FALSE
to_chat(user, "You need a free hand to hold the paddles!")
- update_icon()
+ update_power()
return
else
//Remove from their hands and back onto the defib unit
paddles.unwield()
remove_paddles(user)
- update_icon()
+ update_power()
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
@@ -189,7 +185,7 @@
..()
if((slot_flags == ITEM_SLOT_BACK && slot != SLOT_BACK) || (slot_flags == ITEM_SLOT_BELT && slot != SLOT_BELT))
remove_paddles(user)
- update_icon()
+ update_power()
/obj/item/defibrillator/item_action_slot_check(slot, mob/user, datum/action/A)
if(slot == user.getBackSlot())
@@ -213,12 +209,12 @@
if(cell)
if(cell.charge < (paddles.revivecost+chrgdeductamt))
powered = FALSE
- update_icon()
+ update_power()
if(cell.use(chrgdeductamt))
- update_icon()
+ update_power()
return TRUE
else
- update_icon()
+ update_power()
return FALSE
/obj/item/defibrillator/proc/cooldowncheck(mob/user)
@@ -232,7 +228,7 @@
playsound(src, 'sound/machines/defib_failed.ogg', 50, 0)
paddles.cooldown = FALSE
paddles.update_icon()
- update_icon()
+ update_power()
/obj/item/defibrillator/compact
name = "compact defibrillator"
@@ -246,10 +242,8 @@
if(slot == user.getBeltSlot())
return TRUE
-/obj/item/defibrillator/compact/loaded/Initialize()
- . = ..()
- cell = new(src)
- update_icon()
+/obj/item/defibrillator/compact/loaded
+ cell = /obj/item/stock_parts/cell/high
/obj/item/defibrillator/compact/combat
name = "combat defibrillator"
@@ -258,17 +252,12 @@
safety = FALSE
always_emagged = TRUE
disarm_shock_time = 0
-
-/obj/item/defibrillator/compact/combat/loaded/Initialize()
- . = ..()
- cell = new /obj/item/stock_parts/cell/infinite(src)
- update_icon()
+ cell = /obj/item/stock_parts/cell/infinite
/obj/item/defibrillator/compact/combat/loaded/attackby(obj/item/W, mob/user, params)
if(W == paddles)
paddles.unwield()
toggle_paddles()
- update_icon()
return
//paddles
@@ -298,6 +287,10 @@
var/mob/listeningTo
+/obj/item/twohanded/shockpaddles/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_updates_onmob)
+
/obj/item/twohanded/shockpaddles/equipped(mob/user, slot)
. = ..()
if(!req_defib)
@@ -339,14 +332,11 @@
busy = FALSE
update_icon()
-/obj/item/twohanded/shockpaddles/update_icon()
+/obj/item/twohanded/shockpaddles/update_icon_state()
icon_state = "defibpaddles[wielded]"
item_state = "defibpaddles[wielded]"
if(cooldown)
icon_state = "defibpaddles[wielded]_cooldown"
- if(iscarbon(loc))
- var/mob/living/carbon/C = loc
- C.update_inv_hands()
/obj/item/twohanded/shockpaddles/suicide_act(mob/user)
user.visible_message("[user] is putting the live paddles on [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide!")
@@ -373,7 +363,7 @@
return
defib.on = FALSE
forceMove(defib)
- defib.update_icon()
+ defib.update_power()
/obj/item/twohanded/shockpaddles/proc/check_defib_exists(mainunit, mob/living/carbon/M, obj/O)
if(!req_defib)
@@ -459,7 +449,7 @@
M.visible_message("[user] zaps [M] with [src]!", \
"[user] zaps [M] with [src]!")
M.adjustStaminaLoss(50)
- M.Knockdown(100)
+ M.DefaultCombatKnockdown(100)
M.updatehealth() //forces health update before next life tick
playsound(src, 'sound/machines/defib_zap.ogg', 50, 1, -1)
M.emote("gasp")
@@ -516,7 +506,7 @@
H.set_heartattack(TRUE)
H.apply_damage(50, BURN, BODY_ZONE_CHEST)
log_combat(user, H, "overloaded the heart of", defib)
- H.Knockdown(100)
+ H.DefaultCombatKnockdown(100)
H.Jitter(100)
if(req_defib)
defib.deductcharge(revivecost)
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index fe8f3ca626..2b76a925e8 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -9,7 +9,6 @@ GLOBAL_LIST_EMPTY(PDAs)
#define PDA_SCANNER_HALOGEN 4
#define PDA_SCANNER_GAS 5
#define PDA_SPAM_DELAY 2 MINUTES
-#define PDA_STANDARD_OVERLAYS list("pda-r", "blank", "id_overlay", "insert_overlay", "light_overlay", "pai_overlay")
//pda icon overlays list defines
#define PDA_OVERLAY_ALERT 1
@@ -33,14 +32,19 @@ GLOBAL_LIST_EMPTY(PDAs)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
-
//Main variables
var/owner = null // String name of owner
var/default_cartridge = 0 // Access level defined by cartridge
var/obj/item/cartridge/cartridge = null //current cartridge
var/mode = 0 //Controls what menu the PDA will display. 0 is hub; the rest are either built in or based on cartridge.
var/list/overlays_icons = list('icons/obj/pda_alt.dmi' = list("pda-r", "screen_default", "id_overlay", "insert_overlay", "light_overlay", "pai_overlay"))
- var/current_overlays = PDA_STANDARD_OVERLAYS
+ var/static/list/standard_overlays_icons = list("pda-r", "blank", "id_overlay", "insert_overlay", "light_overlay", "pai_overlay")
+ var/list/current_overlays //set on Initialize.
+
+ //variables exclusively used on 'update_overlays' (which should never be called directly, and 'update_icon' doesn't use args anyway)
+ var/new_overlays = FALSE
+ var/new_alert = FALSE
+
var/font_index = 0 //This int tells DM which font is currently selected and lets DM know when the last font has been selected so that it can cycle back to the first font when "toggle font" is pressed again.
var/font_mode = "font-family:monospace;" //The currently selected font.
var/background_color = "#808000" //The currently selected background color.
@@ -123,7 +127,8 @@ GLOBAL_LIST_EMPTY(PDAs)
inserted_item = new inserted_item(src)
else
inserted_item = new /obj/item/pen(src)
- update_icon(FALSE, TRUE)
+ new_overlays = TRUE
+ update_icon()
/obj/item/pda/CtrlShiftClick(mob/living/user)
. = ..()
@@ -144,7 +149,8 @@ GLOBAL_LIST_EMPTY(PDAs)
if(QDELETED(src) || isnull(new_icon) || new_icon == icon || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
return
icon = new_icon
- update_icon(FALSE, TRUE)
+ new_overlays = TRUE
+ update_icon()
to_chat(M, "[src] is now skinned as '[choice]'.")
/obj/item/pda/proc/set_new_overlays()
@@ -157,7 +163,7 @@ GLOBAL_LIST_EMPTY(PDAs)
overlays_x_offset = new_offsets[1]
overlays_y_offset = new_offsets[2]
if(!(icon in overlays_icons))
- current_overlays = PDA_STANDARD_OVERLAYS
+ current_overlays = standard_overlays_icons
return
current_overlays = overlays_icons[icon]
@@ -188,7 +194,8 @@ GLOBAL_LIST_EMPTY(PDAs)
var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin]
if(icon != pref_skin)
icon = pref_skin
- update_icon(FALSE, TRUE)
+ new_overlays = TRUE
+ update_icon()
equipped = TRUE
/obj/item/pda/proc/update_label()
@@ -215,25 +222,30 @@ GLOBAL_LIST_EMPTY(PDAs)
return TRUE
return FALSE
-/obj/item/pda/update_icon(alert = FALSE, new_overlays = FALSE)
+/obj/item/pda/update_overlays()
+ . = ..()
if(new_overlays)
set_new_overlays()
- cut_overlays()
- add_overlay(alert ? current_overlays[PDA_OVERLAY_ALERT] : current_overlays[PDA_OVERLAY_SCREEN])
- var/mutable_appearance/overlay = new()
+ . += new_alert ? current_overlays[PDA_OVERLAY_ALERT] : current_overlays[PDA_OVERLAY_SCREEN]
+ var/screen_state = new_alert ? current_overlays[PDA_OVERLAY_ALERT] : current_overlays[PDA_OVERLAY_SCREEN]
+ var/mutable_appearance/overlay = mutable_appearance(icon, screen_state)
overlay.pixel_x = overlays_x_offset
+ overlay.pixel_y = overlays_y_offset
+ . += overlay
if(id)
overlay.icon_state = current_overlays[PDA_OVERLAY_ID]
- add_overlay(new /mutable_appearance(overlay))
+ . += new /mutable_appearance(overlay)
if(inserted_item)
overlay.icon_state = current_overlays[PDA_OVERLAY_ITEM]
- add_overlay(new /mutable_appearance(overlay))
+ . += new /mutable_appearance(overlay)
if(fon)
overlay.icon_state = current_overlays[PDA_OVERLAY_LIGHT]
- add_overlay(new /mutable_appearance(overlay))
+ . += new /mutable_appearance(overlay)
if(pai)
overlay.icon_state = "[current_overlays[PDA_OVERLAY_PAI]][pai.pai ? "" : "_off"]"
- add_overlay(new /mutable_appearance(overlay))
+ . += new /mutable_appearance(overlay)
+ new_overlays = FALSE
+ new_alert = FALSE
/obj/item/pda/MouseDrop(mob/over, src_location, over_location)
var/mob/M = usr
@@ -459,7 +471,7 @@ GLOBAL_LIST_EMPTY(PDAs)
var/mob/living/U = usr
//Looking for master was kind of pointless since PDAs don't appear to have one.
- if(usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) && !href_list["close"])
+ if(usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK, FALSE) && !href_list["close"])
add_fingerprint(U)
U.set_machine(src)
@@ -747,7 +759,7 @@ GLOBAL_LIST_EMPTY(PDAs)
var/t = stripped_input(U, "Please enter message", name)
if (!t || toff)
return
- if(!U.canUseTopic(src, BE_CLOSE))
+ if(!U.canUseTopic(src, BE_CLOSE, FALSE, NO_TK, FALSE))
return
if(emped)
t = Gibberish(t, 100)
@@ -849,6 +861,7 @@ GLOBAL_LIST_EMPTY(PDAs)
to_chat(L, "[icon2html(src)] Message from [hrefstart][signal.data["name"]] ([signal.data["job"]])[hrefend], [inbound_message] (Reply) (BLOCK/UNBLOCK)")
+ new_alert = TRUE
update_icon(TRUE)
/obj/item/pda/proc/send_to_all(mob/living/U)
@@ -1212,7 +1225,6 @@ GLOBAL_LIST_EMPTY(PDAs)
#undef PDA_SCANNER_HALOGEN
#undef PDA_SCANNER_GAS
#undef PDA_SPAM_DELAY
-#undef PDA_STANDARD_OVERLAYS
#undef PDA_OVERLAY_ALERT
#undef PDA_OVERLAY_SCREEN
diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm
index b604bec258..23ebaec3c2 100644
--- a/code/game/objects/items/devices/PDA/PDA_types.dm
+++ b/code/game/objects/items/devices/PDA/PDA_types.dm
@@ -193,8 +193,6 @@
/obj/item/pda/curator
name = "curator PDA"
icon_state = "pda-library"
- overlays_icons = list('icons/obj/pda.dmi' = list("pda-r-library","blank","id_overlay","insert_overlay", "light_overlay", "pai_overlay"),
- 'icons/obj/pda_alt.dmi' = list("pda-r","screen_default","id_overlay","insert_overlay", "light_overlay", "pai_overlay"))
current_overlays = list("pda-r-library","blank","id_overlay","insert_overlay", "light_overlay", "pai_overlay")
default_cartridge = /obj/item/cartridge/curator
inserted_item = /obj/item/pen/fountain
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 82644cb0fe..bf023c2c07 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -454,7 +454,7 @@
on = FALSE
update_icon()
-/obj/item/flashlight/glowstick/update_icon()
+/obj/item/flashlight/glowstick/update_icon_state()
item_state = "glowstick"
cut_overlays()
if(!fuel)
diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm
index 6168e2dabe..9eb51ffaeb 100644
--- a/code/game/objects/items/devices/geiger_counter.dm
+++ b/code/game/objects/items/devices/geiger_counter.dm
@@ -87,27 +87,25 @@
. += "The last radiation amount detected was [last_tick_amount]"
-/obj/item/geiger_counter/update_icon()
+/obj/item/geiger_counter/update_icon_state()
if(!scanning)
icon_state = "geiger_off"
- return 1
- if(obj_flags & EMAGGED)
+ else if(obj_flags & EMAGGED)
icon_state = "geiger_on_emag"
- return 1
- switch(radiation_count)
- if(-INFINITY to RAD_LEVEL_NORMAL)
- icon_state = "geiger_on_1"
- if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE)
- icon_state = "geiger_on_2"
- if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH)
- icon_state = "geiger_on_3"
- if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH)
- icon_state = "geiger_on_4"
- if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL)
- icon_state = "geiger_on_4"
- if(RAD_LEVEL_CRITICAL + 1 to INFINITY)
- icon_state = "geiger_on_5"
- ..()
+ else
+ switch(radiation_count)
+ if(-INFINITY to RAD_LEVEL_NORMAL)
+ icon_state = "geiger_on_1"
+ if(RAD_LEVEL_NORMAL + 1 to RAD_LEVEL_MODERATE)
+ icon_state = "geiger_on_2"
+ if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH)
+ icon_state = "geiger_on_3"
+ if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH)
+ icon_state = "geiger_on_4"
+ if(RAD_LEVEL_VERY_HIGH + 1 to RAD_LEVEL_CRITICAL)
+ icon_state = "geiger_on_4"
+ if(RAD_LEVEL_CRITICAL + 1 to INFINITY)
+ icon_state = "geiger_on_5"
/obj/item/geiger_counter/proc/update_sound()
var/datum/looping_sound/geiger/loop = soundloop
diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm
index dd7c5b15d9..4c46d064c4 100644
--- a/code/game/objects/items/devices/instruments.dm
+++ b/code/game/objects/items/devices/instruments.dm
@@ -108,6 +108,12 @@
song.instrumentDir = name
song.instrumentExt = insTypes[name]
+/obj/item/instrument/piano_synth/proc/selectInstrument() // Moved here so it can be used by the action and PAI software panel without copypasta
+ var/chosen = input("Choose the type of instrument you want to use", "Instrument Selection", song.instrumentDir) as null|anything in insTypes
+ if(!insTypes[chosen])
+ return
+ return changeInstrument(chosen)
+
/obj/item/instrument/banjo
name = "banjo"
desc = "A 'Mura' brand banjo. It's pretty much just a drum with a neck and strings."
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index 5b23f6f169..a3cfdb9177 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -116,7 +116,7 @@
//chance to actually hit the eyes depends on internal component
if(prob(effectchance * diode.rating))
S.flash_act(affect_silicon = 1)
- S.Knockdown(rand(100,200))
+ S.DefaultCombatKnockdown(rand(100,200))
to_chat(S, "Your sensors were overloaded by a laser!")
outmsg = "You overload [S] by shining [src] at [S.p_their()] sensors."
else
@@ -152,8 +152,7 @@
if(prob(50))
C.visible_message("[C] pounces on the light!","LIGHT!")
C.Move(targloc)
- C.resting = TRUE
- C.update_canmove()
+ C.set_resting(TRUE)
else
C.visible_message("[C] looks uninterested in your games.","You spot [user] shining [src] at you. How insulting!")
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index 30eaca2ba2..bee59b254c 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -158,7 +158,7 @@
/obj/item/lightreplacer/attack_self(mob/user)
to_chat(user, status_string())
-/obj/item/lightreplacer/update_icon()
+/obj/item/lightreplacer/update_icon_state()
icon_state = "lightreplacer[(obj_flags & EMAGGED ? 1 : 0)]"
/obj/item/lightreplacer/proc/status_string()
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index 65c3a96572..63092b5a13 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -67,7 +67,7 @@
to_chat(user, "You clear the wired connection from the multitool.")
update_icon()
-/obj/item/multitool/update_icon()
+/obj/item/multitool/update_icon_state()
if(selected_io)
icon_state = "multitool_red"
else
@@ -149,7 +149,7 @@
/obj/item/multitool/ai_detect/ui_action_click()
return
-/obj/item/multitool/ai_detect/update_icon()
+/obj/item/multitool/ai_detect/update_icon_state()
if(selected_io)
icon_state = "multitool_red"
else
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index f28aacc46c..5b332cda46 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -94,10 +94,8 @@
to_chat(pai, "Your mental faculties leave you.")
to_chat(pai, "oblivion... ")
qdel(pai)
- if(href_list["wires"])
- var/wire = text2num(href_list["wires"])
- if(pai.radio)
- pai.radio.wires.cut(wire)
+ if(href_list["wires"] && pai.radio)
+ pai.radio.wires.cut(href_list["wires"])
if(href_list["reset_radio_short"])
pai.unshort_radio()
if(href_list["setlaws"])
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index ba877f1dd7..352c998699 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -26,7 +26,7 @@
var/obj/structure/cable/attached // the attached cable
-/obj/item/powersink/update_icon()
+/obj/item/powersink/update_icon_state()
icon_state = "powersink[mode == OPERATING]"
/obj/item/powersink/proc/set_mode(value)
diff --git a/code/game/objects/items/devices/quantum_keycard.dm b/code/game/objects/items/devices/quantum_keycard.dm
index 33f839fa39..33f6dc877a 100644
--- a/code/game/objects/items/devices/quantum_keycard.dm
+++ b/code/game/objects/items/devices/quantum_keycard.dm
@@ -27,7 +27,7 @@
qpad = null
return TRUE
-/obj/item/quantum_keycard/update_icon()
+/obj/item/quantum_keycard/update_icon_state()
if(qpad)
icon_state = "quantum_keycard_on"
else
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index a173453f1c..914f2a149a 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -118,7 +118,7 @@
s.set_up(3, 1, L)
s.start()
- L.Knockdown(100)
+ L.DefaultCombatKnockdown(100)
if(master)
master.receive_signal()
@@ -192,7 +192,7 @@ Code:
s.set_up(3, 1, L)
s.start()
- L.Knockdown(100)
+ L.DefaultCombatKnockdown(100)
if(master)
master.receive_signal()
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index e3c036b3f0..5728a97dda 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -254,12 +254,17 @@ GLOBAL_LIST_INIT(channel_tokens, list(
keyslot = null
bowman = TRUE
-/obj/item/radio/headset/ai
+/obj/item/radio/headset/silicon/pai
+ name = "\proper mini Integrated Subspace Transceiver "
+ subspace_transmission = FALSE
+
+
+/obj/item/radio/headset/silicon/ai
name = "\proper Integrated Subspace Transceiver "
keyslot2 = new /obj/item/encryptionkey/ai
command = TRUE
-/obj/item/radio/headset/ai/can_receive(freq, level)
+/obj/item/radio/headset/silicon/can_receive(freq, level)
return ..(freq, level, TRUE)
/obj/item/radio/headset/attackby(obj/item/W, mob/user, params)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 1b8058e3d4..556080168f 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -484,7 +484,8 @@ SLIME SCANNER
set name = "Switch Verbosity"
set category = "Object"
- if(usr.stat || !usr.canmove || usr.restrained())
+ var/mob/living/L = usr
+ if(!istype(L) || !CHECK_MOBILITY(L, MOBILITY_USE))
return
mode = !mode
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index fc8679aa03..78a1a3bfda 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -83,7 +83,7 @@
eject(usr)
-/obj/item/taperecorder/update_icon()
+/obj/item/taperecorder/update_icon_state()
if(!mytape)
icon_state = "taperecorder_empty"
else if(recording)
diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index 1d42198a23..4bab5a5bcd 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -44,7 +44,7 @@ effective or pretty fucking useless.
for(var/mob/living/carbon/human/M in urange(10, user, 1))
if(prob(50))
- M.Knockdown(rand(200,400))
+ M.DefaultCombatKnockdown(rand(200,400))
to_chat(M, "You feel a tremendous, paralyzing wave flood your mind.")
else
diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm
index b1dd9be376..f572d0a841 100644
--- a/code/game/objects/items/dice.dm
+++ b/code/game/objects/items/dice.dm
@@ -134,8 +134,9 @@
w_class = WEIGHT_CLASS_SMALL
sides = 100
-/obj/item/dice/d100/update_icon()
- return
+/obj/item/dice/d100/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_blocker)
/obj/item/dice/eightbd20
name = "strange d20"
@@ -144,8 +145,9 @@
sides = 20
special_faces = list("It is certain","It is decidedly so","Without a doubt","Yes, definitely","You may rely on it","As I see it, yes","Most likely","Outlook good","Yes","Signs point to yes","Reply hazy try again","Ask again later","Better not tell you now","Cannot predict now","Concentrate and ask again","Don't count on it","My reply is no","My sources say no","Outlook not so good","Very doubtful")
-/obj/item/dice/eightbd20/update_icon()
- return
+/obj/item/dice/eightbd20/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_blocker)
/obj/item/dice/fourdd6
name = "4d d6"
@@ -154,8 +156,9 @@
sides = 48
special_faces = list("Cube-Side: 1-1","Cube-Side: 1-2","Cube-Side: 1-3","Cube-Side: 1-4","Cube-Side: 1-5","Cube-Side: 1-6","Cube-Side: 2-1","Cube-Side: 2-2","Cube-Side: 2-3","Cube-Side: 2-4","Cube-Side: 2-5","Cube-Side: 2-6","Cube-Side: 3-1","Cube-Side: 3-2","Cube-Side: 3-3","Cube-Side: 3-4","Cube-Side: 3-5","Cube-Side: 3-6","Cube-Side: 4-1","Cube-Side: 4-2","Cube-Side: 4-3","Cube-Side: 4-4","Cube-Side: 4-5","Cube-Side: 4-6","Cube-Side: 5-1","Cube-Side: 5-2","Cube-Side: 5-3","Cube-Side: 5-4","Cube-Side: 5-5","Cube-Side: 5-6","Cube-Side: 6-1","Cube-Side: 6-2","Cube-Side: 6-3","Cube-Side: 6-4","Cube-Side: 6-5","Cube-Side: 6-6","Cube-Side: 7-1","Cube-Side: 7-2","Cube-Side: 7-3","Cube-Side: 7-4","Cube-Side: 7-5","Cube-Side: 7-6","Cube-Side: 8-1","Cube-Side: 8-2","Cube-Side: 8-3","Cube-Side: 8-4","Cube-Side: 8-5","Cube-Side: 8-6")
-/obj/item/dice/fourdd6/update_icon()
- return
+/obj/item/dice/fourdd6/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_blocker)
/obj/item/dice/attack_self(mob/user)
diceroll(user)
@@ -187,9 +190,9 @@
else if(!src.throwing) //Dice was thrown and is coming to rest
visible_message("[src] rolls to a stop, landing on [result]. [comment]")
-/obj/item/dice/update_icon()
- cut_overlays()
- add_overlay("[src.icon_state]-[src.result]")
+/obj/item/dice/update_overlays()
+ . = ..()
+ . += "[icon_state]-[result]"
/obj/item/dice/microwave_act(obj/machinery/microwave/M)
if(can_be_rigged)
diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm
index e307b9d626..b0882b6e5d 100644
--- a/code/game/objects/items/flamethrower.dm
+++ b/code/game/objects/items/flamethrower.dm
@@ -27,6 +27,10 @@
var/igniter_type = /obj/item/assembly/igniter
trigger_guard = TRIGGER_GUARD_NORMAL
+/obj/item/flamethrower/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_updates_onmob)
+
/obj/item/flamethrower/Destroy()
if(weldtool)
qdel(weldtool)
@@ -48,22 +52,17 @@
if(isturf(location)) //start a fire if possible
igniter.flamethrower_process(location)
+/obj/item/flamethrower/update_icon_state()
+ item_state = "flamethrower_[lit]"
-/obj/item/flamethrower/update_icon()
- cut_overlays()
+/obj/item/flamethrower/update_overlays()
+ . = ..()
if(igniter)
- add_overlay("+igniter[status]")
+ . += "+igniter[status]"
if(ptank)
- add_overlay("+ptank")
+ . += "+ptank"
if(lit)
- add_overlay("+lit")
- item_state = "flamethrower_1"
- else
- item_state = "flamethrower_0"
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands()
- return
+ . += "+lit"
/obj/item/flamethrower/afterattack(atom/target, mob/user, flag)
. = ..()
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index 986090212e..0907a18fdd 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -294,7 +294,7 @@
/obj/item/book/granter/spell/knock/recoil(mob/living/user)
..()
to_chat(user,"You're knocked down!")
- user.Knockdown(40)
+ user.DefaultCombatKnockdown(40)
/obj/item/book/granter/spell/barnyard
spell = /obj/effect/proc_holder/spell/targeted/barnyardcurse
@@ -491,12 +491,12 @@
remarks = list("Looks like these would sell much better in a plasma fire...", "Using glass bowls rather then cones?", "Mixing soda and ice-cream?", "Tall glasses with of liquids and solids...", "Just add a bit of icecream and cherry on top?")
/obj/item/book/granter/crafting_recipe/bone_bow //Bow crafting for non-ashwalkers
- name = "Sandstone manual on bows"
- desc = "A standstone slab with everything you need to know for making bows and arrows just like an ashwalker would."
+ name = "bowyery sandstone slab" // this is an actual word
+ desc = "A sandstone slab with inscriptions describing the Ash Walkers of Lavaland's bowyery."
crafting_recipe_types = list(/datum/crafting_recipe/bone_arrow, /datum/crafting_recipe/bone_bow, /datum/crafting_recipe/ashen_arrow, /datum/crafting_recipe/quiver, /datum/crafting_recipe/bow_tablet)
icon_state = "stone_tablet"
oneuse = FALSE
- remarks = list("Sticking burning arrows into the sand makes them stronger?", "Breaking the bone apart to get shards, not sharpening the bone.", "Sinew is just like rope?")
+ remarks = list("Sticking burning arrows into the sand makes them stronger...", "Breaking the bone apart to get shards, not sharpening the bone...", "Sinew is just like rope...")
/obj/item/book/granter/crafting_recipe/under_the_oven //Illegal cook book
name = "Under The Oven"
diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm
index 67036bd604..6f79df28fe 100644
--- a/code/game/objects/items/grenades/flashbang.dm
+++ b/code/game/objects/items/grenades/flashbang.dm
@@ -31,7 +31,7 @@
M.show_message("BANG", MSG_AUDIBLE)
var/distance = get_dist(get_turf(M), source)
if(!distance || loc == M || loc == M.loc) //Stop allahu akbarring rooms with this.
- M.Knockdown(200)
+ M.DefaultCombatKnockdown(200)
M.soundbang_act(1, 200, 10, 15)
else
M.soundbang_act(1, max(200/max(1,distance), 60), rand(0, 5))
@@ -41,4 +41,4 @@
return
var/distance = get_dist(get_turf(M), source)
if(M.flash_act(affect_silicon = 1))
- M.Knockdown(max(200/max(1,distance), 60))
+ M.DefaultCombatKnockdown(max(200/max(1,distance), 60))
diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm
index 75e4e0b477..eaecae5a92 100644
--- a/code/game/objects/items/grenades/plastic.dm
+++ b/code/game/objects/items/grenades/plastic.dm
@@ -158,7 +158,7 @@
user.gib(1, 1)
qdel(src)
-/obj/item/grenade/plastic/update_icon()
+/obj/item/grenade/plastic/update_icon_state()
if(nadeassembly)
icon_state = "[item_state]1"
else
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index f458fe7e63..ee25cbb985 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -128,9 +128,6 @@
item_color = param_color || item_color || pick(cable_colors)
if(cable_colors[item_color])
item_color = cable_colors[item_color]
- update_icon()
-
-/obj/item/restraints/handcuffs/cable/update_icon()
color = null
add_atom_colour(item_color, FIXED_COLOUR_PRIORITY)
@@ -352,7 +349,7 @@
C.update_inv_legcuffed()
SSblackbox.record_feedback("tally", "handcuffs", 1, type)
to_chat(C, "\The [src] ensnares you!")
- C.Knockdown(knockdown)
+ C.DefaultCombatKnockdown(knockdown)
/obj/item/restraints/legcuffs/bola/tactical//traitor variant
name = "reinforced bola"
diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm
index da572d4d61..c961134244 100644
--- a/code/game/objects/items/his_grace.dm
+++ b/code/game/objects/items/his_grace.dm
@@ -92,7 +92,7 @@
master.emote("scream")
master.remove_status_effect(STATUS_EFFECT_HISGRACE)
REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
- master.Knockdown(60)
+ master.DefaultCombatKnockdown(60)
master.adjustBruteLoss(master.maxHealth)
playsound(master, 'sound/effects/splat.ogg', 100, 0)
else
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 45abd4fb49..4d275e2034 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -64,16 +64,16 @@
else
playsound(src, 'sound/machines/buzz-sigh.ogg', 40, 1)
-/obj/item/holybeacon/proc/beacon_armor(mob/M)
+/obj/item/holybeacon/proc/beacon_armor(mob/living/L)
var/list/holy_armor_list = typesof(/obj/item/storage/box/holy)
var/list/display_names = list()
for(var/V in holy_armor_list)
var/atom/A = V
display_names += list(initial(A.name) = A)
- var/choice = input(M,"What holy armor kit would you like to order?","Holy Armor Theme") as null|anything in display_names
- var/turf/T = get_turf(M)
- if(!T || QDELETED(src) || !choice || M.stat || !in_range(M, src) || M.restrained() || !M.canmove || GLOB.holy_armor_type)
+ var/choice = input(L,"What holy armor kit would you like to order?","Holy Armor Theme") as null|anything in display_names
+ var/turf/T = get_turf(src)
+ if(!T || QDELETED(src) || !choice || !CHECK_MOBILITY(L, MOBILITY_USE) || !in_range(L, src) || GLOB.holy_armor_type)
return
var/index = display_names.Find(choice)
@@ -86,7 +86,7 @@
if(holy_armor_box)
qdel(src)
- M.put_in_hands(holy_armor_box)
+ L.put_in_hands(holy_armor_box)
/obj/item/storage/box/holy
name = "Templar Kit"
@@ -244,7 +244,7 @@
if(user.mind && (user.mind.isholy) && !reskinned)
reskin_holy_weapon(user)
-/obj/item/nullrod/proc/reskin_holy_weapon(mob/M)
+/obj/item/nullrod/proc/reskin_holy_weapon(mob/living/L)
if(GLOB.holy_weapon_type)
return
var/obj/item/holy_weapon
@@ -255,8 +255,8 @@
if (initial(rodtype.chaplain_spawnable))
display_names[initial(rodtype.name)] = rodtype
- var/choice = input(M,"What theme would you like for your holy weapon?","Holy Weapon Theme") as null|anything in display_names
- if(QDELETED(src) || !choice || M.stat || !in_range(M, src) || M.restrained() || !M.canmove || reskinned)
+ var/choice = input(L, "What theme would you like for your holy weapon?","Holy Weapon Theme") as null|anything in display_names
+ if(QDELETED(src) || !choice || !in_range(L, src) || !CHECK_MOBILITY(L, MOBILITY_USE) || reskinned)
return
var/A = display_names[choice] // This needs to be on a separate var as list member access is not allowed for new
@@ -269,7 +269,7 @@
if(holy_weapon)
holy_weapon.reskinned = TRUE
qdel(src)
- M.put_in_active_hand(holy_weapon)
+ L.put_in_active_hand(holy_weapon)
/obj/item/nullrod/proc/jedi_spin(mob/living/user)
for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH))
@@ -674,7 +674,7 @@
add_fingerprint(user)
if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
to_chat(user, "You club yourself over the head with [src].")
- user.Knockdown(60)
+ user.DefaultCombatKnockdown(60)
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD)
diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm
index 02ac894e64..5f74830c99 100644
--- a/code/game/objects/items/hot_potato.dm
+++ b/code/game/objects/items/hot_potato.dm
@@ -71,8 +71,7 @@
if(stimulant)
if(isliving(loc))
var/mob/living/L = loc
- L.SetStun(0)
- L.SetKnockdown(0)
+ L.SetAllImmobility(0)
L.SetSleeping(0)
L.SetUnconscious(0)
L.reagents.add_reagent(/datum/reagent/medicine/muscle_stimulant, CLAMP(5 - L.reagents.get_reagent_amount(/datum/reagent/medicine/muscle_stimulant), 0, 5)) //If you don't have legs or get bola'd, tough luck!
@@ -154,7 +153,7 @@
colorize(null)
active = FALSE
-/obj/item/hot_potato/update_icon()
+/obj/item/hot_potato/update_icon_state()
icon_state = active? icon_on : icon_off
/obj/item/hot_potato/syndicate
diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm
index bf8d215a11..370924063d 100644
--- a/code/game/objects/items/implants/implant_explosive.dm
+++ b/code/game/objects/items/implants/implant_explosive.dm
@@ -78,7 +78,7 @@
return
if(message && imp_in.stat == CONSCIOUS)
imp_in.visible_message("[imp_in] doubles over in pain!")
- imp_in.Knockdown(140)
+ imp_in.DefaultCombatKnockdown(140)
/obj/item/implant/explosive/proc/boom_goes_the_weasel()
explosion(get_turf(imp_in ? imp_in : src), heavy, medium, weak, weak, flame_range = weak)
diff --git a/code/game/objects/items/implants/implantcase.dm b/code/game/objects/items/implants/implantcase.dm
index c1734cb24e..481f1a4181 100644
--- a/code/game/objects/items/implants/implantcase.dm
+++ b/code/game/objects/items/implants/implantcase.dm
@@ -10,18 +10,14 @@
throw_range = 5
w_class = WEIGHT_CLASS_TINY
custom_materials = list(/datum/material/glass=500)
- var/obj/item/implant/imp = null
+ var/obj/item/implant/imp
var/imp_type
-
-/obj/item/implantcase/update_icon()
+/obj/item/implantcase/update_icon_state()
if(imp)
icon_state = "implantcase-[imp.item_color]"
- reagents = imp.reagents
else
icon_state = "implantcase-0"
- reagents = null
-
/obj/item/implantcase/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/pen))
@@ -46,6 +42,7 @@
imp = I.imp
I.imp = null
update_icon()
+ reagents = imp.reagents
I.update_icon()
else
if(imp)
@@ -54,6 +51,7 @@
imp.forceMove(I)
I.imp = imp
imp = null
+ reagents = null
update_icon()
I.update_icon()
diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm
index 46a6cb2c35..3ea27c84bb 100644
--- a/code/game/objects/items/implants/implantchair.dm
+++ b/code/game/objects/items/implants/implantchair.dm
@@ -96,16 +96,17 @@
visible_message("[M] has been implanted by [src].")
return TRUE
-/obj/machinery/implantchair/update_icon()
+/obj/machinery/implantchair/update_icon_state()
icon_state = initial(icon_state)
if(state_open)
icon_state += "_open"
if(occupant)
icon_state += "_occupied"
+
+/obj/machinery/implantchair/update_overlays()
+ . = ..()
if(ready)
- add_overlay("ready")
- else
- cut_overlays()
+ . += "ready"
/obj/machinery/implantchair/proc/replenish()
if(ready_implants < max_implants)
diff --git a/code/game/objects/items/implants/implanter.dm b/code/game/objects/items/implants/implanter.dm
index 414bb3ea69..b57ffa27c0 100644
--- a/code/game/objects/items/implants/implanter.dm
+++ b/code/game/objects/items/implants/implanter.dm
@@ -14,13 +14,12 @@
var/imp_type = null
-/obj/item/implanter/update_icon()
+/obj/item/implanter/update_icon_state()
if(imp)
icon_state = "implanter1"
else
icon_state = "implanter0"
-
/obj/item/implanter/attack(mob/living/M, mob/user)
if(!istype(M))
return
diff --git a/code/game/objects/items/implants/implantpad.dm b/code/game/objects/items/implants/implantpad.dm
index c49e4d8d42..7c863017a1 100644
--- a/code/game/objects/items/implants/implantpad.dm
+++ b/code/game/objects/items/implants/implantpad.dm
@@ -18,7 +18,7 @@
if(case)
. += "Alt-click [src] to remove the inserted implant case."
-/obj/item/implantpad/update_icon()
+/obj/item/implantpad/update_icon_state()
icon_state = "implantpad-[case ? TRUE : FALSE]"
/obj/item/implantpad/AltClick(mob/user)
diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm
index 079e0d79e9..8a596b2e6e 100644
--- a/code/game/objects/items/inducer.dm
+++ b/code/game/objects/items/inducer.dm
@@ -163,13 +163,14 @@
if(opened)
. += "Its battery compartment is open."
-/obj/item/inducer/update_icon()
- cut_overlays()
- if(opened)
- if(!cell)
- add_overlay("inducer-nobat")
- else
- add_overlay("inducer-bat")
+/obj/item/inducer/update_overlays()
+ . = ..()
+ if(!opened)
+ return
+ if(!cell)
+ . += "inducer-nobat"
+ else
+ . += "inducer-bat"
/obj/item/inducer/sci
icon_state = "inducer-sci"
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index 22a8d2c92a..5f3524d1c3 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -138,6 +138,12 @@
throwforce = 15
custom_materials = null
+/obj/item/kitchen/knife/combat/bone/plastic
+ name = "plastic knife"
+ desc = "A plastic knife. Rather harmless to anything."
+ force = 1
+ bayonet = FALSE
+
/obj/item/kitchen/knife/combat/cyborg
name = "cyborg knife"
icon = 'icons/obj/items_cyborg.dmi'
diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm
index 3ca489542f..aba07c9120 100644
--- a/code/game/objects/items/melee/energy.dm
+++ b/code/game/objects/items/melee/energy.dm
@@ -7,7 +7,6 @@
var/brightness_on = 3
total_mass = 0.4 //Survival flashlights typically weigh around 5 ounces.
-
/obj/item/melee/transforming/energy/Initialize()
. = ..()
total_mass_on = (total_mass_on ? total_mass_on : (w_class_on * 0.75))
@@ -107,8 +106,12 @@
/obj/item/melee/transforming/energy/sword/transform_weapon(mob/living/user, supress_message_text)
. = ..()
- if(. && active && item_color)
- icon_state = "sword[item_color]"
+ if(active)
+ if(. && item_color)
+ icon_state = "sword[item_color]"
+ AddElement(/datum/element/sword_point)
+ else
+ RemoveElement(/datum/element/sword_point)
/obj/item/melee/transforming/energy/sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(active)
@@ -259,15 +262,14 @@
light_color = "#37FFF7"
actions_types = list()
+/obj/item/melee/transforming/energy/sword/cx/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_updates_onmob)
+
/obj/item/melee/transforming/energy/sword/cx/alt_pre_attack(atom/A, mob/living/user, params) //checks if it can do right click memes
altafterattack(A, user, TRUE, params)
return TRUE
-/obj/item/melee/transforming/energy/sword/cx/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) //does right click memes
- if(istype(user))
- user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].")
- return TRUE
-
/obj/item/melee/transforming/energy/sword/cx/transform_weapon(mob/living/user, supress_message_text)
active = !active //I'd use a ..() here but it'd inherit from the regular esword's proc instead, so SPAGHETTI CODE
if(active) //also I'd need to rip out the iconstate changing bits
@@ -301,7 +303,8 @@
if(!supress_message_text)
to_chat(user, "[src] [active ? "is now active":"can now be concealed"].")
-/obj/item/melee/transforming/energy/sword/cx/update_icon()
+/obj/item/melee/transforming/energy/sword/cx/update_overlays()
+ . = ..()
var/mutable_appearance/blade_overlay = mutable_appearance(icon, "cxsword_blade")
var/mutable_appearance/gem_overlay = mutable_appearance(icon, "cxsword_gem")
@@ -309,15 +312,10 @@
blade_overlay.color = light_color
gem_overlay.color = light_color
- cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
-
- add_overlay(gem_overlay)
+ . += gem_overlay
if(active)
- add_overlay(blade_overlay)
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands()
+ . += blade_overlay
/obj/item/melee/transforming/energy/sword/cx/AltClick(mob/living/user)
. = ..()
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index a71e82d865..996d206c65 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -73,6 +73,7 @@
/obj/item/melee/sabre/Initialize()
. = ..()
AddComponent(/datum/component/butchering, 30, 95, 5) //fast and effective, but as a sword, it might damage the results.
+ AddElement(/datum/element/sword_point)
/obj/item/melee/sabre/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(attack_type == PROJECTILE_ATTACK)
@@ -199,7 +200,7 @@
add_fingerprint(user)
if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
to_chat(user, "You club yourself over the head.")
- user.Knockdown(60 * force)
+ user.DefaultCombatKnockdown(60 * force)
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD)
@@ -224,7 +225,7 @@
if(check_martial_counter(H, user))
return
playsound(get_turf(src), 'sound/effects/woodhit.ogg', 75, 1, -1)
- target.Knockdown(softstun_ds, TRUE, FALSE, hardstun_ds, stam_dmg)
+ target.DefaultCombatKnockdown(softstun_ds, TRUE, FALSE, hardstun_ds, stam_dmg)
log_combat(user, target, "stunned", src)
src.add_fingerprint(user)
target.visible_message("[user] has knocked down [target] with [src]!", \
@@ -453,12 +454,10 @@
held_sausage = null
update_icon()
-/obj/item/melee/roastingstick/update_icon()
+/obj/item/melee/roastingstick/update_overlays()
. = ..()
- cut_overlays()
if (held_sausage)
- var/mutable_appearance/sausage = mutable_appearance(icon, "roastingstick_sausage")
- add_overlay(sausage)
+ . += mutable_appearance(icon, "roastingstick_sausage")
/obj/item/melee/roastingstick/proc/extend(user)
to_chat(user, "You extend [src].")
@@ -516,7 +515,7 @@
item_state = "mace_greyscale"
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR //Material type changes the prefix as well as the color.
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Material type changes the prefix as well as the color.
custom_materials = list(/datum/material/iron = 12000) //Defaults to an Iron Mace.
slot_flags = ITEM_SLOT_BELT
force = 14
diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
index 5f49f6b06d..9d9409acf0 100644
--- a/code/game/objects/items/pet_carrier.dm
+++ b/code/game/objects/items/pet_carrier.dm
@@ -143,14 +143,16 @@
update_icon()
remove_occupant(user)
-/obj/item/pet_carrier/update_icon()
- cut_overlay("unlocked")
- cut_overlay("locked")
+/obj/item/pet_carrier/update_icon_state()
if(open)
icon_state = initial(icon_state)
else
icon_state = "pet_carrier_[!occupants.len ? "closed" : "occupied"]"
- add_overlay("[locked ? "" : "un"]locked")
+
+/obj/item/pet_carrier/update_overlays()
+ . = ..()
+ if(!open)
+ . += "[locked ? "" : "un"]locked"
/obj/item/pet_carrier/MouseDrop(atom/over_atom)
if(isopenturf(over_atom) && usr.canUseTopic(src, BE_CLOSE, ismonkey(usr)) && usr.Adjacent(over_atom) && open && occupants.len)
diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm
index 57f247cdb2..65eb7ab658 100644
--- a/code/game/objects/items/pinpointer.dm
+++ b/code/game/objects/items/pinpointer.dm
@@ -49,29 +49,29 @@
/obj/item/pinpointer/proc/scan_for_target()
return
-/obj/item/pinpointer/update_icon()
- cut_overlays()
+/obj/item/pinpointer/update_overlays()
+ . = ..()
if(!active)
return
if(!target)
- add_overlay("pinon[alert ? "alert" : ""]null")
+ . += "pinon[alert ? "alert" : ""]null"
return
var/turf/here = get_turf(src)
var/turf/there = get_turf(target)
if(!here || !there || here.z != there.z)
- add_overlay("pinon[alert ? "alert" : ""]null")
+ . += "pinon[alert ? "alert" : ""]null"
return
if(get_dist_euclidian(here,there) <= minimum_range)
- add_overlay("pinon[alert ? "alert" : ""]direct")
+ . += "pinon[alert ? "alert" : ""]direct"
else
setDir(get_dir(here, there))
switch(get_dist(here, there))
if(1 to 8)
- add_overlay("pinon[alert ? "alert" : "close"]")
+ . += "pinon[alert ? "alert" : "close"]"
if(9 to 16)
- add_overlay("pinon[alert ? "alert" : "medium"]")
+ . += "pinon[alert ? "alert" : "medium"]"
if(16 to INFINITY)
- add_overlay("pinon[alert ? "alert" : "far"]")
+ . += "pinon[alert ? "alert" : "far"]"
/obj/item/pinpointer/crew // A replacement for the old crew monitoring consoles
name = "crew pinpointer"
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index a2a8cb3150..498990fcf3 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -37,7 +37,9 @@
/obj/item/toy/plush/random_snowflake/Initialize(mapload, set_snowflake_id)
. = ..()
var/list/configlist = CONFIG_GET(keyed_list/snowflake_plushies)
- var/id = pick(configlist)
+ var/id = safepick(configlist)
+ if(!id)
+ return
set_snowflake_from_config(id)
/obj/item/toy/plush/Initialize(mapload, set_snowflake_id)
diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm
index e63b4d7a3a..342f756ffc 100644
--- a/code/game/objects/items/pneumaticCannon.dm
+++ b/code/game/objects/items/pneumaticCannon.dm
@@ -168,7 +168,7 @@
if(pressureSetting >= 3 && iscarbon(user))
var/mob/living/carbon/C = user
C.visible_message("[C] is thrown down by the force of the cannon!", "[src] slams into your shoulder, knocking you down!")
- C.Knockdown(60)
+ C.DefaultCombatKnockdown(60)
/obj/item/pneumatic_cannon/proc/fire_items(turf/target, mob/user)
if(fire_mode == PCANNON_FIREALL)
@@ -241,11 +241,11 @@
tank = thetank
update_icon()
-/obj/item/pneumatic_cannon/update_icon()
- cut_overlays()
+/obj/item/pneumatic_cannon/update_overlays()
+ . = ..()
if(!tank)
return
- add_overlay(tank.icon_state)
+ . += tank.icon_state
/obj/item/pneumatic_cannon/proc/fill_with_type(type, amount)
if(!ispath(type, /obj) && !ispath(type, /mob))
diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm
index ac490b0122..cc466d73fc 100644
--- a/code/game/objects/items/religion.dm
+++ b/code/game/objects/items/religion.dm
@@ -64,8 +64,7 @@
/obj/item/banner/proc/inspiration(mob/living/carbon/human/H)
H.adjustBruteLoss(-15)
H.adjustFireLoss(-15)
- H.AdjustStun(-40)
- H.AdjustKnockdown(-40)
+ H.AdjustAllImmobility(-40)
H.AdjustUnconscious(-40)
playsound(H, 'sound/magic/staff_healing.ogg', 25, FALSE)
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 056d9e4677..d3e966f2fa 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -20,7 +20,7 @@
return
user.do_attack_animation(M)
- M.Knockdown(100)
+ M.DefaultCombatKnockdown(100)
M.apply_effect(EFFECT_STUTTER, 5)
M.visible_message("[user] has prodded [M] with [src]!", \
@@ -81,8 +81,7 @@
user.visible_message("[user] hugs [M] to make [M.p_them()] feel better!", \
"You hug [M] to make [M.p_them()] feel better!")
if(M.resting && !M.recoveringstam)
- M.resting = FALSE
- M.update_canmove()
+ M.set_resting(FALSE, TRUE)
else
user.visible_message("[user] pets [M]!", \
"You pet [M]!")
@@ -100,9 +99,8 @@
else
user.visible_message("[user] hugs [M] in a firm bear-hug! [M] looks uncomfortable...", \
"You hug [M] firmly to make [M.p_them()] feel better! [M] looks uncomfortable...")
- if(M.resting && !M.recoveringstam)
- M.resting = FALSE
- M.update_canmove()
+ if(!CHECK_MOBILITY(M, MOBILITY_STAND) && !M.recoveringstam)
+ M.set_resting(FALSE, TRUE)
else
user.visible_message("[user] bops [M] on the head!", \
"You bop [M] on the head!")
@@ -114,7 +112,6 @@
M.electrocute_act(5, "[user]", safety = 1)
user.visible_message("[user] electrocutes [M] with [user.p_their()] touch!", \
"You electrocute [M] with your touch!")
- M.update_canmove()
else
if(!iscyborg(M))
M.adjustFireLoss(10)
@@ -154,11 +151,7 @@
var/static/list/charge_machines = typecacheof(list(/obj/machinery/cell_charger, /obj/machinery/recharger, /obj/machinery/recharge_station, /obj/machinery/mech_bay_recharge_port))
var/static/list/charge_items = typecacheof(list(/obj/item/stock_parts/cell, /obj/item/gun/energy))
-/obj/item/borg/charger/Initialize()
- . = ..()
-
-/obj/item/borg/charger/update_icon()
- ..()
+/obj/item/borg/charger/update_icon_state()
icon_state = "charger_[mode]"
/obj/item/borg/charger/attack_self(mob/user)
@@ -330,7 +323,7 @@
C.stuttering += 10
C.Jitter(10)
if(2)
- C.Knockdown(40)
+ C.DefaultCombatKnockdown(40)
C.confused += 10
C.stuttering += 15
C.Jitter(25)
@@ -596,7 +589,7 @@
update_icon()
to_chat(user, "You [active? "activate":"deactivate"] [src].")
-/obj/item/borg/projectile_dampen/update_icon()
+/obj/item/borg/projectile_dampen/update_icon_state()
icon_state = "[initial(icon_state)][active]"
/obj/item/borg/projectile_dampen/proc/activate_field()
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 2bf9ead4ea..6621095b72 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -39,20 +39,20 @@
chest.cell = new /obj/item/stock_parts/cell/high/plus(chest)
..()
-/obj/item/robot_suit/update_icon()
- cut_overlays()
+/obj/item/robot_suit/update_overlays()
+ . = ..()
if(l_arm)
- add_overlay("[l_arm.icon_state]+o")
+ . += "[l_arm.icon_state]+o"
if(r_arm)
- add_overlay("[r_arm.icon_state]+o")
+ . += "[r_arm.icon_state]+o"
if(chest)
- add_overlay("[chest.icon_state]+o")
+ . += "[chest.icon_state]+o"
if(l_leg)
- add_overlay("[l_leg.icon_state]+o")
+ . += "[l_leg.icon_state]+o"
if(r_leg)
- add_overlay("[r_leg.icon_state]+o")
+ . += "[r_leg.icon_state]+o"
if(head)
- add_overlay("[head.icon_state]+o")
+ . += "[head.icon_state]+o"
/obj/item/robot_suit/proc/check_completion()
if(src.l_arm && src.r_arm)
@@ -317,8 +317,7 @@
O.robot_suit = src
if(!locomotion)
- O.lockcharge = 1
- O.update_canmove()
+ O.SetLockdown(TRUE)
to_chat(O, "Error: Servo motors unresponsive.")
else
@@ -356,8 +355,7 @@
forceMove(O)
O.robot_suit = src
if(!locomotion)
- O.lockcharge = TRUE
- O.update_canmove()
+ O.SetLockdown(TRUE)
else if(istype(W, /obj/item/pen))
to_chat(user, "You need to use a multitool to name [src]!")
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 09c2d442e8..56af03139a 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -364,12 +364,9 @@
to_chat(toggle_action.owner, "You activate the self-repair module.")
activate_sr()
-/obj/item/borg/upgrade/selfrepair/update_icon()
+/obj/item/borg/upgrade/selfrepair/update_icon_state()
if(toggle_action)
icon_state = "selfrepair_[on ? "on" : "off"]"
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
else
icon_state = "cyborg_upgrade5"
@@ -580,7 +577,7 @@
return FALSE
R.notransform = TRUE
- var/prev_lockcharge = R.lockcharge
+ var/prev_locked_down = R.locked_down
R.SetLockdown(1)
R.anchored = TRUE
var/datum/effect_system/smoke_spread/smoke = new
@@ -590,7 +587,7 @@
for(var/i in 1 to 4)
playsound(R, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, 1, -1)
sleep(12)
- if(!prev_lockcharge)
+ if(!prev_locked_down)
R.SetLockdown(0)
R.anchored = FALSE
R.notransform = FALSE
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index 4f5f264c0e..07f4cb4e40 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -237,3 +237,19 @@
w_class = WEIGHT_CLASS_HUGE
item_flags = SLOWS_WHILE_IN_HAND
transparent = FALSE
+
+/obj/item/shield/riot/implant
+ name = "riot tower shield"
+ desc = "A massive shield that can block a lot of attacks and can take a lot of abuse before breaking." //It cant break unless it is removed from the implant
+ item_state = "metal"
+ icon_state = "metal"
+ icon = 'icons/obj/items_and_weapons.dmi'
+ block_chance = 30 //May be big but hard to move around to block.
+ slowdown = 1
+ transparent = FALSE
+ item_flags = SLOWS_WHILE_IN_HAND
+
+/obj/item/shield/riot/implant/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(attack_type == PROJECTILE_ATTACK)
+ final_block_chance = 60 //Massive shield
+ return ..()
diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm
index 86f0ad4936..4c64ed9dd4 100644
--- a/code/game/objects/items/singularityhammer.dm
+++ b/code/game/objects/items/singularityhammer.dm
@@ -31,7 +31,7 @@
charged++
return
-/obj/item/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons.
+/obj/item/twohanded/singularityhammer/update_icon_state() //Currently only here to fuck with the on-mob icons.
icon_state = "mjollnir[wielded]"
return
@@ -110,6 +110,6 @@
if(isliving(hit_atom))
shock(hit_atom)
-/obj/item/twohanded/mjollnir/update_icon() //Currently only here to fuck with the on-mob icons.
+/obj/item/twohanded/mjollnir/update_icon_state() //Currently only here to fuck with the on-mob icons.
icon_state = "mjollnir[wielded]"
return
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index fb5adea3b0..e919f3fe02 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -35,9 +35,9 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
. = ..()
. += GLOB.rod_recipes
-/obj/item/stack/rods/update_icon()
+/obj/item/stack/rods/update_icon_state()
var/amount = get_amount()
- if((amount <= 5) && (amount > 0))
+ if(amount <= 5)
icon_state = "rods-[amount]"
else
icon_state = "rods"
@@ -77,8 +77,9 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \
is_cyborg = 1
cost = 250
-/obj/item/stack/rods/cyborg/update_icon()
- return
+/obj/item/stack/rods/cyborg/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_blocker)
/obj/item/stack/rods/ten
amount = 10
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 967e47f33f..55a28645fc 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -33,6 +33,12 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, one_per_turf = TRUE, on_floor = TRUE), \
)), \
//END OF CIT CHANGES
+ new/datum/stack_recipe_list("fancy sofas", list( \
+ new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa/corp, one_per_turf = TRUE, on_floor = TRUE), \
+ new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/corp/left, one_per_turf = TRUE, on_floor = TRUE), \
+ new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/corp/right, one_per_turf = TRUE, on_floor = TRUE), \
+ new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corp/corner, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
null, \
new/datum/stack_recipe_list("office chairs", list( \
new/datum/stack_recipe("dark office chair", /obj/structure/chair/office/dark, 5, one_per_turf = TRUE, on_floor = TRUE), \
@@ -42,8 +48,10 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
new/datum/stack_recipe("beige comfy chair", /obj/structure/chair/comfy/beige, 2, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("black comfy chair", /obj/structure/chair/comfy/black, 2, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("brown comfy chair", /obj/structure/chair/comfy/brown, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("green comfy chair", /obj/structure/chair/comfy/green, 2, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("lime comfy chair", /obj/structure/chair/comfy/lime, 2, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("teal comfy chair", /obj/structure/chair/comfy/teal, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("purple comfy chair", /obj/structure/chair/comfy/purple, 2, one_per_turf = TRUE, on_floor = TRUE), \
)), \
null, \
new/datum/stack_recipe("rack parts", /obj/item/rack_parts), \
@@ -96,6 +104,21 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2), \
new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1), \
null, \
+ new /datum/stack_recipe_list("chess pieces", list( \
+ new /datum/stack_recipe("White Pawn", /obj/structure/chess/whitepawn, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("White Rook", /obj/structure/chess/whiterook, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("White Knight", /obj/structure/chess/whiteknight, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("White Bishop", /obj/structure/chess/whitebishop, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("White Queen", /obj/structure/chess/whitequeen, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("White King", /obj/structure/chess/whiteking, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("Black Pawn", /obj/structure/chess/blackpawn, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("Black Rook", /obj/structure/chess/blackrook, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("Black Knight", /obj/structure/chess/blackknight, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("Black Bishop", /obj/structure/chess/blackbishop, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("Black Queen", /obj/structure/chess/blackqueen, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("Black King", /obj/structure/chess/blackking, 2, time = 10, one_per_turf = 1, on_floor = 1), \
+ )), \
+ null, \
new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = TRUE, on_floor = TRUE), \
))
@@ -360,6 +383,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
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), \
+ null, \
))
/obj/item/stack/sheet/cloth
@@ -394,12 +418,12 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("white jumpsuit", /obj/item/clothing/under/color/white, 4, time = 40), \
new/datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 2, time = 40), \
null, \
- new/datum/stack_recipe("silk string", /obj/item/weaponcrafting/silkstring, 2, time = 40), \
+ new/datum/stack_recipe("silk string", /obj/item/weaponcrafting/silkstring, 1, time = 40), \
))
/obj/item/stack/sheet/silk
name = "silk"
- desc = "A long soft material. This one is just made out of cotton rather then any spiders or wyrms"
+ desc = "A long, soft material. Made out of refined cotton, instead of relying on the habits of spiders or silkworms."
singular_name = "silk sheet"
icon_state = "sheet-silk"
item_state = "sheet-cloth"
@@ -751,6 +775,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("opaque plastic flaps", /obj/structure/plasticflaps/opaque, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \
new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \
+ new /datum/stack_recipe("shower curtain", /obj/structure/curtain, 10, time = 10, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2)))
/obj/item/stack/sheet/plastic
@@ -803,6 +828,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra
/obj/item/stack/sheet/cotton
name = "raw cotton bundle"
desc = "A bundle of raw cotton ready to be spun on the loom."
+ max_amount = 80
singular_name = "raw cotton ball"
icon_state = "sheet-cotton"
is_fabric = TRUE
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 131980e43a..f707c02ce9 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -48,7 +48,7 @@
merge_type = type
if(custom_materials && custom_materials.len)
for(var/i in custom_materials)
- custom_materials[getmaterialref(i)] = mats_per_stack * amount
+ custom_materials[SSmaterials.GetMaterialRef(i)] = mats_per_stack * amount
. = ..()
if(merge)
for(var/obj/item/stack/S in loc)
@@ -57,7 +57,7 @@
var/list/temp_recipes = get_main_recipes()
recipes = temp_recipes.Copy()
if(material_type)
- var/datum/material/M = getmaterialref(material_type) //First/main material
+ var/datum/material/M = SSmaterials.GetMaterialRef(material_type) //First/main material
for(var/i in M.categories)
switch(i)
if(MAT_CATEGORY_RIGID)
@@ -77,16 +77,15 @@
else
w_class = full_w_class
-/obj/item/stack/update_icon()
+/obj/item/stack/update_icon_state()
if(novariants)
- return ..()
+ return
if(amount <= (max_amount * (1/3)))
icon_state = initial(icon_state)
else if (amount <= (max_amount * (2/3)))
icon_state = "[initial(icon_state)]_2"
else
icon_state = "[initial(icon_state)]_3"
- ..()
/obj/item/stack/Destroy()
@@ -226,7 +225,7 @@
if(R.applies_mats && custom_materials && custom_materials.len)
var/list/used_materials = list()
for(var/i in custom_materials)
- used_materials[getmaterialref(i)] = R.req_amount / R.res_amount * (MINERAL_MATERIAL_AMOUNT / custom_materials.len)
+ used_materials[SSmaterials.GetMaterialRef(i)] = R.req_amount / R.res_amount * (MINERAL_MATERIAL_AMOUNT / custom_materials.len)
O.set_custom_materials(used_materials)
//START: oh fuck i'm so sorry
@@ -348,7 +347,7 @@
src.amount += amount
if(custom_materials && custom_materials.len)
for(var/i in custom_materials)
- custom_materials[getmaterialref(i)] = MINERAL_MATERIAL_AMOUNT * src.amount
+ custom_materials[SSmaterials.GetMaterialRef(i)] = MINERAL_MATERIAL_AMOUNT * src.amount
set_custom_materials() //Refresh
update_icon()
update_weight()
diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm
index eacf48d96d..7a6e1e3db6 100644
--- a/code/game/objects/items/storage/bags.dm
+++ b/code/game/objects/items/storage/bags.dm
@@ -57,14 +57,16 @@
playsound(loc, 'sound/items/eatfood.ogg', 50, 1, -1)
return (TOXLOSS)
-/obj/item/storage/bag/trash/update_icon()
- if(contents.len == 0)
- icon_state = "[initial(icon_state)]"
- else if(contents.len < 12)
- icon_state = "[initial(icon_state)]1"
- else if(contents.len < 21)
- icon_state = "[initial(icon_state)]2"
- else icon_state = "[initial(icon_state)]3"
+/obj/item/storage/bag/trash/update_icon_state()
+ switch(contents.len)
+ if(0)
+ icon_state = "[initial(icon_state)]"
+ if(0 to 11)
+ icon_state = "[initial(icon_state)]1"
+ if(11 to 20)
+ icon_state = "[initial(icon_state)]2"
+ else
+ icon_state = "[initial(icon_state)]3"
/obj/item/storage/bag/trash/cyborg
insertable = FALSE
@@ -244,7 +246,8 @@
set name = "Activate Seed Extraction"
set category = "Object"
set desc = "Activate to convert your plants into plantable seeds."
- if(usr.stat || !usr.canmove || usr.restrained())
+ var/mob/living/L = usr
+ if(istype(L) && !CHECK_MOBILITY(L, MOBILITY_USE))
return
for(var/obj/item/O in contents)
seedify(O, 1)
@@ -327,6 +330,8 @@
/obj/item/storage/bag/tray/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_w_class = WEIGHT_CLASS_NORMAL
+ STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food, /obj/item/reagent_containers/glass, /datum/reagent/consumable, /obj/item/kitchen/knife, /obj/item/kitchen/rollingpin, /obj/item/kitchen/fork, /obj/item/storage/box)) //Should cover: Bottles, Beakers, Bowls, Booze, Glasses, Food, Kitchen Tools, and ingredient boxes.
STR.insert_preposition = "on"
/obj/item/storage/bag/tray/attack(mob/living/M, mob/living/user)
@@ -349,13 +354,16 @@
if(ishuman(M) || ismonkey(M))
if(prob(10))
- M.Knockdown(40)
+ M.DefaultCombatKnockdown(40)
update_icon()
-/obj/item/storage/bag/tray/update_icon()
- cut_overlays()
+/obj/item/storage/bag/tray/update_overlays()
+ . = ..()
for(var/obj/item/I in contents)
- add_overlay(new /mutable_appearance(I))
+ var/mutable_appearance/I_copy = new(I)
+ I_copy.plane = FLOAT_PLANE
+ I_copy.layer = FLOAT_LAYER
+ . += I_copy
/obj/item/storage/bag/tray/Entered()
. = ..()
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 829c89be0e..4e03d029a8 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -10,23 +10,21 @@
attack_verb = list("whipped", "lashed", "disciplined")
max_integrity = 300
var/content_overlays = FALSE //If this is true, the belt will gain overlays based on what it's holding
- var/worn_overlays = FALSE //worn counterpart of the above.
+ var/onmob_overlays = FALSE //worn counterpart of the above.
/obj/item/storage/belt/suicide_act(mob/living/carbon/user)
user.visible_message("[user] begins belting [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
return BRUTELOSS
-/obj/item/storage/belt/update_icon()
- cut_overlays()
+/obj/item/storage/belt/update_overlays()
+ . = ..()
if(content_overlays)
for(var/obj/item/I in contents)
- var/mutable_appearance/M = I.get_belt_overlay()
- add_overlay(M)
- ..()
+ . += I.get_belt_overlay()
/obj/item/storage/belt/worn_overlays(isinhands, icon_file, style_flags = NONE)
. = ..()
- if(!isinhands && worn_overlays)
+ if(!isinhands && onmob_overlays)
for(var/obj/item/I in contents)
. += I.get_worn_belt_overlay(icon_file)
@@ -34,6 +32,11 @@
. = ..()
update_icon()
+/obj/item/storage/belt/ComponentInitialize()
+ . = ..()
+ if(onmob_overlays)
+ AddElement(/datum/element/update_icon_updates_onmob)
+
/obj/item/storage/belt/utility
name = "toolbelt" //Carn: utility belt is nicer, but it bamboozles the text parsing.
desc = "Holds tools."
@@ -769,7 +772,7 @@
item_state = "sheath"
w_class = WEIGHT_CLASS_BULKY
content_overlays = TRUE
- worn_overlays = TRUE
+ onmob_overlays = TRUE
var/list/fitting_swords = list(/obj/item/melee/sabre, /obj/item/melee/baton/stunsword)
var/starting_sword = /obj/item/melee/sabre
@@ -787,12 +790,6 @@
if(length(contents))
. += "Alt-click it to quickly draw the blade."
-/obj/item/storage/belt/sabre/update_icon()
- . = ..()
- if(isliving(loc))
- var/mob/living/L = loc
- L.regenerate_icons()
-
/obj/item/storage/belt/sabre/PopulateContents()
new starting_sword(src)
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index c4e6c57318..01a4f03108 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -50,11 +50,10 @@
user.visible_message("[user] beating [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
return BRUTELOSS
-/obj/item/storage/box/update_icon()
+/obj/item/storage/box/update_overlays()
. = ..()
if(illustration)
- cut_overlays()
- add_overlay(illustration)
+ . += illustration
/obj/item/storage/box/attack_self(mob/user)
..()
@@ -866,10 +865,11 @@
foldable = null
var/design = NODESIGN
-/obj/item/storage/box/papersack/update_icon()
+/obj/item/storage/box/papersack/update_icon_state()
if(contents.len == 0)
icon_state = "[item_state]"
- else icon_state = "[item_state]_closed"
+ else
+ icon_state = "[item_state]_closed"
/obj/item/storage/box/papersack/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/pen))
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index 92e09022b2..f2c50b359e 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -30,7 +30,7 @@
for(var/i = 1 to STR.max_items)
new spawn_type(src)
-/obj/item/storage/fancy/update_icon()
+/obj/item/storage/fancy/update_icon_state()
if(fancy_open)
icon_state = "[icon_type]box[contents.len]"
else
@@ -160,30 +160,31 @@
to_chat(user, "There are no [icon_type]s left in the pack.")
return TRUE
-/obj/item/storage/fancy/cigarettes/update_icon()
- if(fancy_open || !contents.len)
- cut_overlays()
- if(!contents.len)
- icon_state = "[initial(icon_state)]_empty"
+/obj/item/storage/fancy/cigarettes/update_icon_state()
+ if(!contents.len)
+ icon_state = "[initial(icon_state)]_empty"
+ else if(fancy_open)
+ icon_state = initial(icon_state)
+
+/obj/item/storage/fancy/cigarettes/update_overlays()
+ . = ..()
+ if(!fancy_open || !contents.len)
+ return
+ . += "[icon_state]_open"
+ var/cig_position = 1
+ for(var/C in contents)
+ var/mutable_appearance/inserted_overlay = mutable_appearance(icon)
+
+ if(istype(C, /obj/item/lighter/greyscale))
+ inserted_overlay.icon_state = "lighter_in"
+ else if(istype(C, /obj/item/lighter))
+ inserted_overlay.icon_state = "zippo_in"
else
- icon_state = initial(icon_state)
- add_overlay("[icon_state]_open")
- var/cig_position = 1
- for(var/C in contents)
- var/mutable_appearance/inserted_overlay = mutable_appearance(icon)
+ inserted_overlay.icon_state = "cigarette"
- if(istype(C, /obj/item/lighter/greyscale))
- inserted_overlay.icon_state = "lighter_in"
- else if(istype(C, /obj/item/lighter))
- inserted_overlay.icon_state = "zippo_in"
- else
- inserted_overlay.icon_state = "cigarette"
-
- inserted_overlay.icon_state = "[inserted_overlay.icon_state]_[cig_position]"
- add_overlay(inserted_overlay)
- cig_position++
- else
- cut_overlays()
+ inserted_overlay.icon_state = "[inserted_overlay.icon_state]_[cig_position]"
+ . += inserted_overlay
+ cig_position++
/obj/item/storage/fancy/cigarettes/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!ismob(M))
@@ -282,10 +283,10 @@
STR.max_items = 10
STR.can_hold = typecacheof(list(/obj/item/rollingpaper))
-/obj/item/storage/fancy/rollingpapers/update_icon()
- cut_overlays()
+/obj/item/storage/fancy/rollingpapers/update_overlays()
+ . = ..()
if(!contents.len)
- add_overlay("[icon_state]_empty")
+ . += "[icon_state]_empty"
/////////////
//CIGAR BOX//
@@ -306,21 +307,23 @@
STR.max_items = 5
STR.can_hold = typecacheof(list(/obj/item/clothing/mask/cigarette/cigar))
-/obj/item/storage/fancy/cigarettes/cigars/update_icon()
- cut_overlays()
+/obj/item/storage/fancy/cigarettes/cigars/update_icon_state()
if(fancy_open)
icon_state = "[initial(icon_state)]_open"
-
- var/cigar_position = 0 //to keep track of the pixel_x offset of each new overlay.
- for(var/obj/item/clothing/mask/cigarette/cigar/smokes in contents)
- var/mutable_appearance/cigar_overlay = mutable_appearance(icon, "[smokes.icon_off]")
- cigar_overlay.pixel_x = 3 * cigar_position
- add_overlay(cigar_overlay)
- cigar_position++
-
else
icon_state = "[initial(icon_state)]"
+/obj/item/storage/fancy/cigarettes/cigars/update_overlays()
+ . = ..()
+ if(!fancy_open)
+ return
+ var/cigar_position = 0 //to keep track of the pixel_x offset of each new overlay.
+ for(var/obj/item/clothing/mask/cigarette/cigar/smokes in contents)
+ var/mutable_appearance/cigar_overlay = mutable_appearance(icon, "[smokes.icon_off]")
+ cigar_overlay.pixel_x = 3 * cigar_position
+ . += cigar_overlay
+ cigar_position++
+
/obj/item/storage/fancy/cigarettes/cigars/cohiba
name = "\improper Cohiba Robusto cigar case"
desc = "A case of imported Cohiba cigars, renowned for their strong flavor."
@@ -382,4 +385,4 @@
icon_state = "silver ringbox"
icon_type = "silver ring"
spawn_type = /obj/item/clothing/gloves/ring/silver
-
+
diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm
index 454942f00b..5b6089d430 100644
--- a/code/game/objects/items/storage/lockbox.dm
+++ b/code/game/objects/items/storage/lockbox.dm
@@ -132,29 +132,34 @@
for(var/i in 1 to 3)
new /obj/item/clothing/accessory/medal/conduct(src)
-/obj/item/storage/lockbox/medal/update_icon()
- cut_overlays()
+/obj/item/storage/lockbox/medal/update_icon_state()
var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)
if(locked)
icon_state = "medalbox+l"
- open = FALSE
else
icon_state = "medalbox"
if(open)
icon_state += "open"
if(broken)
icon_state += "+b"
- if(contents && open)
- for (var/i in 1 to contents.len)
- var/obj/item/clothing/accessory/medal/M = contents[i]
- var/mutable_appearance/medalicon = mutable_appearance(initial(icon), M.medaltype)
- if(i > 1 && i <= 5)
- medalicon.pixel_x += ((i-1)*3)
- else if(i > 5)
- medalicon.pixel_y -= 7
- medalicon.pixel_x -= 2
- medalicon.pixel_x += ((i-6)*3)
- add_overlay(medalicon)
+
+/obj/item/storage/lockbox/medal/update_overlays()
+ . = ..()
+ if(!contents || !open)
+ return
+ var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)
+ if(locked)
+ return
+ for (var/i in 1 to contents.len)
+ var/obj/item/clothing/accessory/medal/M = contents[i]
+ var/mutable_appearance/medalicon = mutable_appearance(initial(icon), M.medaltype)
+ if(i > 1 && i <= 5)
+ medalicon.pixel_x += ((i-1)*3)
+ else if(i > 5)
+ medalicon.pixel_y -= 7
+ medalicon.pixel_x -= 2
+ medalicon.pixel_x += ((i-6)*3)
+ . += medalicon
/obj/item/storage/lockbox/medal/sec
name = "security medal box"
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index f1db164b31..4f7948c738 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -33,14 +33,11 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
. = ..()
update_icon()
-/obj/item/storage/toolbox/update_icon()
- ..()
- cut_overlays()
- if(length(blood_DNA))
- add_blood_overlay()
+/obj/item/storage/toolbox/update_overlays()
+ . = ..()
if(has_latches)
var/icon/I = icon('icons/obj/storage.dmi', latches)
- add_overlay(I)
+ . += I
/obj/item/storage/toolbox/suicide_act(mob/user)
diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm
index 2dbe42c159..27cd9c8908 100644
--- a/code/game/objects/items/storage/wallets.dm
+++ b/code/game/objects/items/storage/wallets.dm
@@ -66,7 +66,7 @@
. = ..()
refreshID()
-/obj/item/storage/wallet/update_icon()
+/obj/item/storage/wallet/update_icon_state()
var/new_state = "wallet"
if(front_id)
new_state = "wallet_id"
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index 52f082fa5c..78ba6d4f5f 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -84,7 +84,7 @@
/obj/item/melee/baton/process()
deductcharge(round(hitcost * STUNBATON_DEPLETION_RATE), FALSE, FALSE)
-/obj/item/melee/baton/update_icon()
+/obj/item/melee/baton/update_icon_state()
if(status)
icon_state = "[initial(name)]_active"
else if(!cell)
@@ -191,11 +191,11 @@
if(!disarming)
if(knockdown)
- L.Knockdown(50, override_stamdmg = 0) //knockdown
+ L.DefaultCombatKnockdown(50, override_stamdmg = 0) //knockdown
L.adjustStaminaLoss(stunpwr)
else
L.drop_all_held_items() //no knockdown/stamina damage, instead disarm.
-
+
L.apply_effect(EFFECT_STUTTER, stamforce)
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
if(user)
@@ -218,7 +218,7 @@
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(stamforce*6)
+ user.DefaultCombatKnockdown(stamforce*6)
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
deductcharge(hitcost)
diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm
index 3dab4c4c04..b5edb27704 100644
--- a/code/game/objects/items/teleportation.dm
+++ b/code/game/objects/items/teleportation.dm
@@ -142,7 +142,7 @@
return ..()
/obj/item/hand_tele/proc/try_dispel_portal(atom/target, mob/user, delay = 30)
- var/datum/beam/B = user.Beam(target)
+ var/datum/beam/B = user.Beam(target, icon_state = "rped_upgrade", maxdistance = 50)
if(is_parent_of_portal(target) && (!delay || do_after(user, delay, target = target)))
qdel(target)
to_chat(user, "You dispel [target] with \the [src]!")
diff --git a/code/game/objects/items/teleprod.dm b/code/game/objects/items/teleprod.dm
index bab4d6a488..63bde36976 100644
--- a/code/game/objects/items/teleprod.dm
+++ b/code/game/objects/items/teleprod.dm
@@ -16,7 +16,7 @@
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(stamforce * 6)
+ user.DefaultCombatKnockdown(stamforce * 6)
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
if(do_teleport(user, get_turf(user), 50, channel = TELEPORT_CHANNEL_BLUESPACE))
deductcharge(hitcost)
diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm
index 9b9fae7c8f..6fbf9316ed 100644
--- a/code/game/objects/items/theft_tools.dm
+++ b/code/game/objects/items/theft_tools.dm
@@ -246,7 +246,7 @@
QDEL_NULL(sliver)
return ..()
-/obj/item/hemostat/supermatter/update_icon()
+/obj/item/hemostat/supermatter/update_icon_state()
if(sliver)
icon_state = "supermatter_tongs_loaded"
else
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
index a36314ccb7..0d2892cb4a 100644
--- a/code/game/objects/items/tools/screwdriver.dm
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -45,13 +45,13 @@
if(prob(75))
pixel_y = rand(0, 16)
-/obj/item/screwdriver/update_icon()
+/obj/item/screwdriver/update_overlays()
+ . = ..()
if(!random_color) //icon override
return
- cut_overlays()
var/mutable_appearance/base_overlay = mutable_appearance(icon, "screwdriver_screwybits")
base_overlay.appearance_flags = RESET_COLOR
- add_overlay(base_overlay)
+ . += base_overlay
/obj/item/screwdriver/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
. = list()
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index b172cc25dd..9560f7fab3 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -40,24 +40,24 @@
reagents.add_reagent(/datum/reagent/fuel, max_fuel)
update_icon()
+/obj/item/weldingtool/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_updates_onmob)
-/obj/item/weldingtool/proc/update_torch()
+/obj/item/weldingtool/update_icon_state()
if(welding)
- add_overlay("[initial(icon_state)]-on")
item_state = "[initial(item_state)]1"
else
item_state = "[initial(item_state)]"
-
-/obj/item/weldingtool/update_icon()
- cut_overlays()
+/obj/item/weldingtool/update_overlays()
+ . = ..()
if(change_icons)
var/ratio = get_fuel() / max_fuel
ratio = CEILING(ratio*4, 1) * 25
- add_overlay("[initial(icon_state)][ratio]")
- update_torch()
- return
-
+ . += "[initial(icon_state)][ratio]"
+ if(welding)
+ . += "[initial(icon_state)]-on"
/obj/item/weldingtool/process()
switch(welding)
@@ -177,11 +177,6 @@
if(get_fuel() <= 0 && welding)
switched_on(user)
update_icon()
- //mob icon update
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands(0)
-
return 0
return 1
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index 37d8fe8824..ac5a02b9fc 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -40,13 +40,13 @@
add_atom_colour(wirecutter_colors[our_color], FIXED_COLOUR_PRIORITY)
update_icon()
-/obj/item/wirecutters/update_icon()
+/obj/item/wirecutters/update_overlays()
+ . = ..()
if(!random_color) //icon override
return
- cut_overlays()
var/mutable_appearance/base_overlay = mutable_appearance(icon, "cutters_cutty_thingy")
base_overlay.appearance_flags = RESET_COLOR
- add_overlay(base_overlay)
+ . += base_overlay
/obj/item/wirecutters/attack(mob/living/carbon/C, mob/user)
if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/restraints/handcuffs/cable))
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index fd897174cf..ba51fa3d65 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -44,9 +44,13 @@
item_state = "balloon-empty"
-/obj/item/toy/balloon/New()
+/obj/item/toy/balloon/Initialize()
+ . = ..()
create_reagents(10)
- ..()
+
+/obj/item/toy/balloon/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_updates_onmob)
/obj/item/toy/balloon/attack(mob/living/carbon/human/M, mob/user)
return
@@ -102,7 +106,7 @@
icon_state = "burst"
qdel(src)
-/obj/item/toy/balloon/update_icon()
+/obj/item/toy/balloon/update_icon_state()
if(src.reagents.total_volume >= 1)
icon_state = "waterballoon"
item_state = "balloon"
@@ -200,8 +204,8 @@
custom_materials = list(/datum/material/iron=10, /datum/material/glass=10)
var/amount_left = 7
-/obj/item/toy/ammo/gun/update_icon()
- src.icon_state = text("357OLD-[]", src.amount_left)
+/obj/item/toy/ammo/gun/update_icon_state()
+ icon_state = "357OLD-[amount_left]"
/obj/item/toy/ammo/gun/examine(mob/user)
. = ..()
@@ -224,26 +228,39 @@
var/hacked = FALSE
total_mass = 0.4
var/total_mass_on = TOTAL_MASS_TOY_SWORD
+ var/activation_sound = 'sound/weapons/saberon.ogg'
+ var/deactivation_sound = 'sound/weapons/saberoff.ogg'
+ var/activation_message = "You extend the plastic blade with a quick flick of your wrist."
+ var/deactivation_message = "You push the plastic blade back down into the handle."
+ var/transform_volume = 20
/obj/item/toy/sword/attack_self(mob/user)
- active = !( active )
+ active = !active
if (active)
- to_chat(user, "You extend the plastic blade with a quick flick of your wrist.")
- playsound(user, 'sound/weapons/saberon.ogg', 20, 1)
+ to_chat(user, "[activation_message]")
+ playsound(user, activation_sound, transform_volume, 1)
+ w_class = WEIGHT_CLASS_BULKY
+ AddElement(/datum/element/sword_point)
+ else
+ to_chat(user, "[deactivation_message]")
+ playsound(user, deactivation_sound, transform_volume, 1)
+ w_class = WEIGHT_CLASS_SMALL
+ RemoveElement(/datum/element/sword_point)
+
+ update_icon()
+ add_fingerprint(user)
+
+/obj/item/toy/sword/update_icon_state()
+ if(active)
if(hacked)
icon_state = "swordrainbow"
item_state = "swordrainbow"
else
icon_state = "swordblue"
item_state = "swordblue"
- w_class = WEIGHT_CLASS_BULKY
else
- to_chat(user, "You push the plastic blade back down into the handle.")
- playsound(user, 'sound/weapons/saberoff.ogg', 20, 1)
icon_state = "sword0"
item_state = "sword0"
- w_class = WEIGHT_CLASS_SMALL
- add_fingerprint(user)
// Copied from /obj/item/melee/transforming/energy/sword/attackby
/obj/item/toy/sword/attackby(obj/item/W, mob/living/user, params)
@@ -266,7 +283,7 @@
to_chat(user, "RNBW_ENGAGE")
if(active)
- icon_state = "swordrainbow"
+ update_icon()
user.update_inv_hands()
else
to_chat(user, "It's already fabulous!")
@@ -286,40 +303,27 @@
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("poked", "jabbed", "hit")
light_color = "#37FFF7"
+ activation_sound = 'sound/weapons/nebon.ogg'
+ deactivation_sound = 'sound/weapons/neboff.ogg'
+ transform_volume = 50
+ activation_message = "You activate the holographic blade with a press of a button."
+ deactivation_message = "You deactivate the holographic blade with a press of a button."
var/light_brightness = 3
actions_types = list()
-/obj/item/toy/sword/cx/alt_pre_attack(atom/A, mob/living/user, params) //checks if it can do right click memes
- altafterattack(A, user, TRUE, params)
- return TRUE
-
-/obj/item/toy/sword/cx/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) //does right click memes
- if(istype(user))
- user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].")
- return TRUE
+/obj/item/toy/sword/cx/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_updates_onmob)
/obj/item/toy/sword/cx/attack_self(mob/user)
- active = !( active )
+ . = ..()
+ set_light(active ? light_brightness : 0)
- if (active)
- to_chat(user, "You activate the holographic blade with a press of a button.")
- playsound(user, 'sound/weapons/nebon.ogg', 50, 1)
- w_class = WEIGHT_CLASS_BULKY
- attack_verb = list("slashed", "stabbed", "ravaged")
- set_light(light_brightness)
- update_icon()
+/obj/item/toy/sword/cx/update_icon_state()
+ return
- else
- to_chat(user, "You deactivate the holographic blade with a press of a button.")
- playsound(user, 'sound/weapons/neboff.ogg', 50, 1)
- w_class = WEIGHT_CLASS_SMALL
- attack_verb = list("poked", "jabbed", "hit")
- set_light(0)
- update_icon()
-
- add_fingerprint(user)
-
-/obj/item/toy/sword/cx/update_icon()
+/obj/item/toy/sword/cx/update_overlays()
+ . = ..()
var/mutable_appearance/blade_overlay = mutable_appearance(icon, "cxsword_blade")
var/mutable_appearance/gem_overlay = mutable_appearance(icon, "cxsword_gem")
@@ -327,15 +331,10 @@
blade_overlay.color = light_color
gem_overlay.color = light_color
- cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
-
- add_overlay(gem_overlay)
+ . += gem_overlay
if(active)
- add_overlay(blade_overlay)
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands()
+ . += blade_overlay
/obj/item/toy/sword/cx/AltClick(mob/living/user)
. = ..()
@@ -843,15 +842,16 @@
user.visible_message("[user] draws a card from the deck.", "You draw a card from the deck.")
update_icon()
-/obj/item/toy/cards/deck/update_icon()
- if(cards.len > 26)
- icon_state = "deck_[deckstyle]_full"
- else if(cards.len > 10)
- icon_state = "deck_[deckstyle]_half"
- else if(cards.len > 0)
- icon_state = "deck_[deckstyle]_low"
- else if(cards.len == 0)
- icon_state = "deck_[deckstyle]_empty"
+/obj/item/toy/cards/deck/update_icon_state()
+ switch(cards.len)
+ if(27 to INFINITY)
+ icon_state = "deck_[deckstyle]_full"
+ if(11 to 27)
+ icon_state = "deck_[deckstyle]_half"
+ if(1 to 11)
+ icon_state = "deck_[deckstyle]_low"
+ else
+ icon_state = "deck_[deckstyle]_empty"
/obj/item/toy/cards/deck/attack_self(mob/user)
if(cooldown < world.time - 50)
@@ -1078,8 +1078,13 @@
else
return ..()
-/obj/item/toy/cards/singlecard/attack_self(mob/user)
- if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained())
+/obj/item/toy/cards/singlecard/attack_self(mob/living/user)
+ . = ..()
+ if(.)
+ return
+ if(!ishuman(user))
+ return
+ if(!CHECK_MOBILITY(user, MOBILITY_USE))
return
Flip()
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index 0cd60804db..11a06e149d 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -24,7 +24,7 @@
* Twohanded
*/
/obj/item/twohanded
- var/wielded = 0
+ var/wielded = FALSE
var/force_unwielded // default to null, the number force will be set to on unwield()
var/force_wielded // same as above but for wield()
var/wieldsound = null
@@ -97,9 +97,6 @@
return
unwield(user)
-/obj/item/twohanded/update_icon()
- return
-
/obj/item/twohanded/attack_self(mob/user)
. = ..()
if(wielded) //Trying to unwield it
@@ -241,7 +238,7 @@
. = ..()
AddComponent(/datum/component/butchering, 100, 80, 0 , hitsound) //axes are not known for being precision butchering tools
-/obj/item/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons.
+/obj/item/twohanded/fireaxe/update_icon_state() //Currently only here to fuck with the on-mob icons.
icon_state = "fireaxe[wielded]"
return
@@ -342,7 +339,7 @@
STOP_PROCESSING(SSobj, src)
. = ..()
-/obj/item/twohanded/dualsaber/update_icon()
+/obj/item/twohanded/dualsaber/update_icon_state()
if(wielded)
icon_state = "dualsaber[item_color][wielded]"
else
@@ -399,6 +396,7 @@
hitsound = 'sound/weapons/blade1.ogg'
START_PROCESSING(SSobj, src)
set_light(brightness_on)
+ AddElement(/datum/element/sword_point)
/obj/item/twohanded/dualsaber/unwield() //Specific unwield () to switch hitsounds.
sharpness = initial(sharpness)
@@ -408,6 +406,7 @@
hitsound = "swing_hit"
STOP_PROCESSING(SSobj, src)
set_light(0)
+ RemoveElement(/datum/element/sword_point)
/obj/item/twohanded/dualsaber/process()
if(wielded)
@@ -492,34 +491,15 @@
spinnable = FALSE
total_mass_on = 4
-/obj/item/twohanded/dualsaber/hypereutactic/chaplain
- name = "\improper divine lightblade"
- desc = "A giant blade of bright and holy light, said to cut down the wicked with ease."
- force = 5
- force_unwielded = 5
- force_wielded = 20
- block_chance = 50
- armour_penetration = 0
- var/chaplain_spawnable = TRUE
- obj_flags = UNIQUE_RENAME
-
-/obj/item/twohanded/dualsaber/hypereutactic/chaplain/Initialize()
+/obj/item/twohanded/dualsaber/hypereutactic/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
+ AddElement(/datum/element/update_icon_updates_onmob)
-/obj/item/twohanded/dualsaber/hypereutactic/chaplain/IsReflect()
- return FALSE
+/obj/item/twohanded/dualsaber/hypereutactic/update_icon_state()
+ return
-/obj/item/twohanded/dualsaber/hypereutactic/alt_pre_attack(atom/A, mob/living/user, params) //checks if it can do right click memes
- altafterattack(A, user, TRUE, params)
- return TRUE
-
-/obj/item/twohanded/dualsaber/hypereutactic/altafterattack(atom/target, mob/living/user, proximity_flag, click_parameters) //does right click memes
- if(istype(user))
- user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].")
- return TRUE
-
-/obj/item/twohanded/dualsaber/hypereutactic/update_icon()
+/obj/item/twohanded/dualsaber/hypereutactic/update_overlays()
+ . = ..()
var/mutable_appearance/blade_overlay = mutable_appearance(icon, "hypereutactic_blade")
var/mutable_appearance/gem_overlay = mutable_appearance(icon, "hypereutactic_gem")
@@ -527,15 +507,10 @@
blade_overlay.color = light_color
gem_overlay.color = light_color
- cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
-
- add_overlay(gem_overlay)
+ . += gem_overlay
if(wielded)
- add_overlay(blade_overlay)
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_hands()
+ . += blade_overlay
clean_blood()
@@ -576,6 +551,24 @@
update_icon()
update_light()
+/obj/item/twohanded/dualsaber/hypereutactic/chaplain
+ name = "divine lightblade"
+ desc = "A giant blade of bright and holy light, said to cut down the wicked with ease."
+ force = 5
+ force_unwielded = 5
+ force_wielded = 20
+ block_chance = 50
+ armour_penetration = 0
+ var/chaplain_spawnable = TRUE
+ obj_flags = UNIQUE_RENAME
+
+/obj/item/twohanded/dualsaber/hypereutactic/chaplain/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
+
+/obj/item/twohanded/dualsaber/hypereutactic/chaplain/IsReflect()
+ return FALSE
+
//spears
/obj/item/twohanded/spear
icon_state = "spearglass0"
@@ -605,6 +598,8 @@
/obj/item/twohanded/spear/Initialize()
. = ..()
AddComponent(/datum/component/butchering, 100, 70) //decent in a pinch, but pretty bad.
+ AddComponent(/datum/component/jousting)
+ AddElement(/datum/element/sword_point)
/obj/item/twohanded/spear/attack_self(mob/user)
if(explosive)
@@ -630,16 +625,12 @@
return BRUTELOSS
return BRUTELOSS
-/obj/item/twohanded/spear/Initialize()
- . = ..()
- AddComponent(/datum/component/jousting)
-
/obj/item/twohanded/spear/examine(mob/user)
. = ..()
if(explosive)
. += "Use in your hands to activate the attached explosive.
Alt-click to set your war cry.
Right-click in combat mode to wield"
-/obj/item/twohanded/spear/update_icon()
+/obj/item/twohanded/spear/update_icon_state()
if(explosive)
icon_state = "spearbomb[wielded]"
else
@@ -717,9 +708,10 @@
tool_behaviour = TOOL_SAW
toolspeed = 0.5
-/obj/item/twohanded/required/chainsaw/Initialize()
+/obj/item/twohanded/required/chainsaw/ComponentInitialize()
. = ..()
AddComponent(/datum/component/butchering, 30, 100, 0, 'sound/weapons/chainsawhit.ogg', TRUE)
+ AddElement(/datum/element/update_icon_updates_onmob)
/obj/item/twohanded/required/chainsaw/suicide_act(mob/living/carbon/user)
if(on)
@@ -738,7 +730,7 @@
to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]")
force = on ? force_on : initial(force)
throwforce = on ? force_on : force
- icon_state = "chainsaw_[on ? "on" : "off"]"
+ update_icon()
var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering)
butchering.butchering_enabled = on
@@ -747,11 +739,8 @@
else
hitsound = "swing_hit"
- if(src == user.get_active_held_item()) //update inhands
- user.update_inv_hands()
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
+/obj/item/twohanded/required/chainsaw/update_icon_state()
+ icon_state = "chainsaw_[on ? "on" : "off"]"
/obj/item/twohanded/required/chainsaw/get_dismemberment_chance()
if(wielded)
@@ -820,6 +809,9 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
resistance_flags = FIRE_PROOF
+/obj/item/twohanded/pitchfork/Initialize(mapload)
+ AddElement(/datum/element/sword_point)
+
/obj/item/twohanded/pitchfork/demonic
name = "demonic pitchfork"
desc = "A red pitchfork, it looks like the work of the devil."
@@ -844,7 +836,7 @@
force_unwielded = 100
force_wielded = 500000 // Kills you DEAD.
-/obj/item/twohanded/pitchfork/update_icon()
+/obj/item/twohanded/pitchfork/update_icon_state()
icon_state = "pitchfork[wielded]"
/obj/item/twohanded/pitchfork/suicide_act(mob/user)
@@ -903,6 +895,7 @@
/obj/item/twohanded/vibro_weapon/Initialize()
. = ..()
AddComponent(/datum/component/butchering, 20, 105)
+ AddElement(/datum/element/sword_point)
/obj/item/twohanded/vibro_weapon/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(wielded)
@@ -918,7 +911,7 @@
return 1
return 0
-/obj/item/twohanded/vibro_weapon/update_icon()
+/obj/item/twohanded/vibro_weapon/update_icon_state()
icon_state = "hfrequency[wielded]"
/*
@@ -930,7 +923,7 @@
desc = "A large, vicious axe crafted out of several sharpened bone plates and crudely tied together. Made of monsters, by killing monsters, for killing monsters."
force_wielded = 23
-/obj/item/twohanded/fireaxe/boneaxe/update_icon()
+/obj/item/twohanded/fireaxe/boneaxe/update_icon_state()
icon_state = "bone_axe[wielded]"
/*
@@ -956,7 +949,7 @@
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
sharpness = IS_SHARP
-/obj/item/twohanded/bonespear/update_icon()
+/obj/item/twohanded/bonespear/update_icon_state()
icon_state = "bone_spear[wielded]"
/obj/item/twohanded/binoculars
@@ -1017,6 +1010,259 @@
user.client.pixel_x = 0
user.client.pixel_y = 0
+/obj/item/twohanded/electrostaff
+ icon = 'icons/obj/items_and_weapons.dmi'
+ icon_state = "electrostaff_3"
+ item_state = "electrostaff"
+ lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
+ name = "riot suppression electrostaff"
+ desc = "A large quarterstaff, with massive silver electrodes mounted at the end."
+ w_class = WEIGHT_CLASS_HUGE
+ slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_OCLOTHING
+ force_unwielded = 5
+ force_wielded = 10
+ throwforce = 15 //if you are a madman and finish someone off with this, power to you.
+ throw_speed = 1
+ item_flags = NO_MAT_REDEMPTION | SLOWS_WHILE_IN_HAND
+ block_chance = 30
+ attack_verb = list("struck", "beaten", "thwacked", "pulped")
+ total_mass = 5 //yeah this is a heavy thing, beating people with it while it's off is not going to do you any favors. (to curb stun-kill rampaging without it being on)
+ var/obj/item/stock_parts/cell/cell = /obj/item/stock_parts/cell/high
+ var/on = FALSE
+ var/can_block_projectiles = FALSE //can't block guns
+ var/lethal_cost = 400 //10000/400*20 = 500. decent enough?
+ var/lethal_damage = 20
+ var/lethal_stam_cost = 4
+ var/stun_cost = 333 //10000/333*25 = 750. stunbatons are at time of writing 10000/1000*49 = 490.
+ var/stun_status_effect = STATUS_EFFECT_ELECTROSTAFF //a small slowdown effect
+ var/stun_stamdmg = 40
+ var/stun_status_duration = 25
+ var/stun_stam_cost = 3.5
+
+/obj/item/twohanded/electrostaff/Initialize(mapload)
+ . = ..()
+ if(ispath(cell))
+ cell = new cell
+
+/obj/item/twohanded/electrostaff/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/twohanded/electrostaff/get_cell()
+ . = cell
+ if(iscyborg(loc))
+ var/mob/living/silicon/robot/R = loc
+ . = R.get_cell()
+
+/obj/item/twohanded/electrostaff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(!on)
+ return FALSE
+ if((attack_type == PROJECTILE_ATTACK) && !can_block_projectiles)
+ return FALSE
+ return ..()
+
+/obj/item/twohanded/electrostaff/proc/min_hitcost()
+ return min(stun_cost, lethal_cost)
+
+/obj/item/twohanded/electrostaff/proc/turn_on(mob/user, silent = FALSE)
+ if(on)
+ return
+ if(!cell)
+ if(user)
+ to_chat(user, "[src] has no cell.")
+ return
+ if(cell.charge < min_hitcost())
+ if(user)
+ to_chat(user, "[src] is out of charge.")
+ return
+ on = TRUE
+ START_PROCESSING(SSobj, src)
+ if(user)
+ to_chat(user, "You turn [src] on.")
+ update_icon()
+ if(!silent)
+ playsound(src, "sparks", 75, 1, -1)
+
+/obj/item/twohanded/electrostaff/proc/turn_off(mob/user, silent = FALSE)
+ if(!on)
+ return
+ if(user)
+ to_chat(user, "You turn [src] off.")
+ on = FALSE
+ STOP_PROCESSING(SSobj, src)
+ update_icon()
+ if(!silent)
+ playsound(src, "sparks", 75, 1, -1)
+
+/obj/item/twohanded/electrostaff/proc/toggle(mob/user, silent = FALSE)
+ if(on)
+ turn_off(user, silent)
+ else
+ turn_on(user, silent)
+
+/obj/item/twohanded/electrostaff/wield(mob/user)
+ . = ..()
+ if(wielded)
+ turn_on(user)
+ add_fingerprint(user)
+
+/obj/item/twohanded/electrostaff/unwield(mob/user)
+ . = ..()
+ if(!wielded)
+ turn_off(user)
+ add_fingerprint(user)
+
+/obj/item/twohanded/electrostaff/update_icon_state()
+ . = ..()
+ if(!wielded)
+ icon_state = "electrostaff_3"
+ item_state = "electrostaff"
+ else
+ icon_state = item_state = (on? "electrostaff_1" : "electrostaff_3")
+ set_light(7, on? 1 : 0, LIGHT_COLOR_CYAN)
+
+/obj/item/twohanded/electrostaff/examine(mob/living/user)
+ . = ..()
+ if(cell)
+ . += "The cell charge is [round(cell.percent())]%."
+ else
+ . += "There is no cell installed!"
+
+/obj/item/twohanded/electrostaff/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/stock_parts/cell))
+ var/obj/item/stock_parts/cell/C = W
+ if(cell)
+ to_chat(user, "[src] already has a cell!")
+ else
+ if(C.maxcharge < min_hit_cost())
+ to_chat(user, "[src] requires a higher capacity cell.")
+ return
+ if(!user.transferItemToLoc(W, src))
+ return
+ cell = C
+ to_chat(user, "You install a cell in [src].")
+
+ else if(W.tool_behaviour == TOOL_SCREWDRIVER)
+ if(cell)
+ cell.update_icon()
+ cell.forceMove(get_turf(src))
+ cell = null
+ to_chat(user, "You remove the cell from [src].")
+ turn_off(user, TRUE)
+ else
+ return ..()
+
+/obj/item/twohanded/electrostaff/process()
+ deductcharge(50) //Wasteful!
+
+/obj/item/twohanded/electrostaff/proc/min_hit_cost()
+ return min(lethal_cost, stun_cost)
+
+/obj/item/twohanded/electrostaff/proc/deductcharge(amount)
+ var/obj/item/stock_parts/cell/C = get_cell()
+ if(!C)
+ turn_off()
+ return FALSE
+ C.use(min(amount, C.charge))
+ if(QDELETED(src))
+ return FALSE
+ if(C.charge < min_hit_cost())
+ turn_off()
+
+/obj/item/twohanded/electrostaff/attack(mob/living/target, mob/living/user)
+ if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes it impossible to baton in stamina softcrit
+ to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
+ return //CIT CHANGE - ditto
+ if(on && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
+ clowning_around(user) //ouch!
+ return
+ if(iscyborg(target))
+ ..()
+ return
+ if(target.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that
+ playsound(target, 'sound/weapons/genhit.ogg', 50, 1)
+ return FALSE
+ if(user.a_intent != INTENT_HARM)
+ if(stun_act(target, user))
+ user.do_attack_animation(target)
+ user.adjustStaminaLossBuffered(stun_stam_cost)
+ return
+ else if(!harm_act(target, user))
+ return ..() //if you can't fry them just beat them with it
+ else //we did harm act them
+ user.do_attack_animation(target)
+ user.adjustStaminaLossBuffered(lethal_stam_cost)
+
+/obj/item/twohanded/electrostaff/proc/stun_act(mob/living/target, mob/living/user, no_charge_and_force = FALSE)
+ var/stunforce = stun_stamdmg
+ if(!no_charge_and_force)
+ if(!on)
+ target.visible_message("[user] has bapped [target] with [src]. Luckily it was off.", \
+ "[user] has bapped you with [src]. Luckily it was off")
+ turn_off() //if it wasn't already off
+ return FALSE
+ var/obj/item/stock_parts/cell/C = get_cell()
+ var/chargeleft = C.charge
+ deductcharge(stun_cost)
+ if(QDELETED(src) || QDELETED(C)) //boom
+ return FALSE
+ if(chargeleft < stun_cost)
+ stunforce *= round(chargeleft/stun_cost, 0.1)
+ target.adjustStaminaLoss(stunforce)
+ target.apply_effect(EFFECT_STUTTER, stunforce)
+ SEND_SIGNAL(target, COMSIG_LIVING_MINOR_SHOCK)
+ if(user)
+ target.lastattacker = user.real_name
+ target.lastattackerckey = user.ckey
+ target.visible_message("[user] has shocked [target] with [src]!", \
+ "[user] has shocked you with [src]!")
+ log_combat(user, user, "stunned with an electrostaff")
+ playsound(src, 'sound/weapons/staff.ogg', 50, 1, -1)
+ target.apply_status_effect(stun_status_effect, stun_status_duration)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ H.forcesay(GLOB.hit_appends)
+ return TRUE
+
+/obj/item/twohanded/electrostaff/proc/harm_act(mob/living/target, mob/living/user, no_charge_and_force = FALSE)
+ var/lethal_force = lethal_damage
+ if(!no_charge_and_force)
+ if(!on)
+ return FALSE //standard item attack
+ var/obj/item/stock_parts/cell/C = get_cell()
+ var/chargeleft = C.charge
+ deductcharge(lethal_cost)
+ if(QDELETED(src) || QDELETED(C)) //boom
+ return FALSE
+ if(chargeleft < stun_cost)
+ lethal_force *= round(chargeleft/lethal_cost, 0.1)
+ target.adjustFireLoss(lethal_force) //good against ointment spam
+ SEND_SIGNAL(target, COMSIG_LIVING_MINOR_SHOCK)
+ if(user)
+ target.lastattacker = user.real_name
+ target.lastattackerckey = user.ckey
+ target.visible_message("[user] has seared [user] with [src]!", \
+ "[user] has seared you with [src]!")
+ log_combat(user, user, "burned with an electrostaff")
+ playsound(src, 'sound/weapons/sear.ogg', 50, 1, -1)
+ return TRUE
+
+/obj/item/twohanded/electrostaff/proc/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)
+ harm_act(user, user, TRUE)
+ stun_act(user, user, TRUE)
+ deductcharge(lethal_cost)
+
+/obj/item/twohanded/electrostaff/emp_act(severity)
+ . = ..()
+ if (!(. & EMP_PROTECT_SELF))
+ turn_off()
+ if(!iscyborg(loc))
+ deductcharge(1000 / severity, TRUE, FALSE)
+
/obj/item/twohanded/broom
name = "broom"
desc = "This is my BROOMSTICK! It can be used manually or braced with two hands to sweep items as you move. It has a telescopic handle for compact storage." //LIES
@@ -1061,6 +1307,8 @@
target = A
else
target = A.loc
+ if(!isturf(target)) //read: Mob inventories.
+ return
else
target = user.loc
if (locate(/obj/structure/table) in target.contents)
@@ -1078,4 +1326,4 @@
/obj/item/twohanded/broom/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) //bless you whoever fixes this copypasta
J.put_in_cart(src, user)
J.mybroom=src
- J.update_icon()
\ No newline at end of file
+ J.update_icon()
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 7499d9de09..bc9c3255a6 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -74,6 +74,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/claymore/Initialize()
. = ..()
AddComponent(/datum/component/butchering, 40, 105)
+ AddElement(/datum/element/sword_point)
/obj/item/claymore/suicide_act(mob/user)
user.visible_message("[user] is falling on [src]! It looks like [user.p_theyre()] trying to commit suicide!")
@@ -346,25 +347,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
user.visible_message("[user] is slitting [user.p_their()] own throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
return (BRUTELOSS)
-/obj/item/switchblade/crafted
- icon_state = "switchblade_ms"
- desc = "A concealable spring-loaded knife."
- force = 2
- throwforce = 3
- extended_force = 15
- extended_throwforce = 18
- extended_icon_state = "switchblade_ext_ms"
- retracted_icon_state = "switchblade_ms"
-
-/obj/item/switchblade/crafted/attackby(obj/item/I, mob/user, params)
- . = ..()
- if(istype(I, /obj/item/stack/sheet/mineral/silver))
- icon_state = extended ? "switchblade_ext_msf" : "switchblade_msf"
- extended_icon_state = "switchblade_ext_msf"
- retracted_icon_state = "switchblade_msf"
- icon_state = "switchblade_msf"
- to_chat(user, "You use part of the silver to improve your Switchblade. Stylish!")
-
/obj/item/phone
name = "red phone"
desc = "Should anything ever go wrong..."
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 1d36b2b41b..e185defc0a 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -33,7 +33,7 @@
if(structureclimber && structureclimber != user)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
- structureclimber.Knockdown(40)
+ structureclimber.DefaultCombatKnockdown(40)
structureclimber.visible_message("[structureclimber] has been knocked off [src].", "You're knocked off [src]!", "You see [structureclimber] get knocked off [src].")
/obj/structure/ui_act(action, params)
@@ -45,7 +45,8 @@
if(!climbable)
return
if(user == O && iscarbon(O))
- if(user.canmove)
+ var/mob/living/L = O
+ if(CHECK_MOBILITY(L, MOBILITY_MOVE))
climb_structure(user)
return
if(!istype(O, /obj/item) || user.get_active_held_item() != O)
diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm
index b10e14e130..d2fff9649d 100644
--- a/code/game/objects/structures/barsigns.dm
+++ b/code/game/objects/structures/barsigns.dm
@@ -308,28 +308,26 @@
icon = "Meow Mix"
desc = "No, we don't serve catnip, officer!"
+/datum/barsign/the_hive
+ name = "The Hive"
+ icon = "thehive"
+ desc = "Comb in for some sweet drinks! Not known for serving any sappy drink."
+
/datum/barsign/hiddensigns
hidden = TRUE
-
//Hidden signs list below this point
-
-
/datum/barsign/hiddensigns/empbarsign
name = "Haywire Barsign"
icon = "empbarsign"
desc = "Something has gone very wrong."
-
-
/datum/barsign/hiddensigns/syndibarsign
name = "Syndi Cat Takeover"
icon = "syndibarsign"
desc = "Syndicate or die."
-
-
/datum/barsign/hiddensigns/signoff
name = "Bar Sign"
icon = "empty"
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index fbb98f4299..e0c2d6e2c7 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -110,7 +110,7 @@
user.visible_message("[user] pulls [src] out from under [poordude].", "You pull [src] out from under [poordude].")
var/C = new item_chair(loc)
user.put_in_hands(C)
- poordude.Knockdown(20)//rip in peace
+ poordude.DefaultCombatKnockdown(20)//rip in peace
user.adjustStaminaLoss(5)
unbuckle_all_mobs(TRUE)
qdel(src)
@@ -153,7 +153,7 @@
///Material chair
/obj/structure/chair/greyscale
icon_state = "chair_greyscale"
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
item_chair = /obj/item/chair/greyscale
buildstacktype = null //Custom mats handle this
@@ -226,9 +226,15 @@
/obj/structure/chair/comfy/black
color = rgb(167,164,153)
+/obj/structure/chair/comfy/green
+ color = rgb(81,173,106)
+
/obj/structure/chair/comfy/lime
color = rgb(255,251,0)
+/obj/structure/chair/comfy/purple
+ color = rgb(255,50,230)
+
/obj/structure/chair/comfy/plywood
name = "plywood chair"
desc = "A relaxing plywood chair."
@@ -371,13 +377,13 @@
if(iscarbon(target))
var/mob/living/carbon/C = target
if(C.health < C.maxHealth*0.5)
- C.Knockdown(20)
+ C.DefaultCombatKnockdown(20)
smash(user)
/obj/item/chair/greyscale
icon_state = "chair_greyscale_toppled"
item_state = "chair_greyscale"
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
origin_type = /obj/structure/chair/greyscale
/obj/item/chair/stool
@@ -407,7 +413,7 @@
buildstackamount = 1
/obj/structure/chair/stool/bar/alien
- name = "bronze bar stool"
+ name = "alien bar stool"
desc = "A hard bar stool made of advanced alien alloy."
icon_state = "baralien"
icon = 'icons/obj/abductor.dmi'
@@ -576,40 +582,3 @@
. = ..()
if(has_gravity())
playsound(src, 'sound/machines/clockcult/integration_cog_install.ogg', 50, TRUE)
-
-/obj/structure/chair/sofa
- name = "old ratty sofa"
- icon_state = "sofamiddle"
- icon = 'icons/obj/sofa.dmi'
- buildstackamount = 1
- var/mutable_appearance/armrest
-
-/obj/structure/chair/sofa/Initialize()
- armrest = mutable_appearance(icon, "[icon_state]_armrest", ABOVE_MOB_LAYER)
- return ..()
-
-/obj/structure/chair/sofa/post_buckle_mob(mob/living/M)
- . = ..()
- update_armrest()
-
-/obj/structure/chair/sofa/proc/update_armrest()
- if(has_buckled_mobs())
- add_overlay(armrest)
- else
- cut_overlay(armrest)
-
-/obj/structure/chair/sofa/post_unbuckle_mob()
- . = ..()
- update_armrest()
-
-/obj/structure/chair/sofa/left
- icon_state = "sofaend_left"
-
-/obj/structure/chair/sofa/right
- icon_state = "sofaend_right"
-
-/obj/structure/chair/sofa/corner
- icon_state = "sofacorner"
-
-/obj/structure/chair/sofa/corner/handle_layer() //only the armrest/back of this chair should cover the mob.
- return
\ No newline at end of file
diff --git a/code/game/objects/structures/beds_chairs/pew.dm b/code/game/objects/structures/beds_chairs/pew.dm
index 65440fb5d8..ec257a9898 100644
--- a/code/game/objects/structures/beds_chairs/pew.dm
+++ b/code/game/objects/structures/beds_chairs/pew.dm
@@ -10,7 +10,7 @@
item_chair = null
/obj/structure/chair/pew/left
- name = "left wooden pew end"
+ name = "wooden pew end"
icon_state = "pewend_left"
var/mutable_appearance/leftpewarmrest
@@ -41,7 +41,7 @@
update_leftpewarmrest()
/obj/structure/chair/pew/right
- name = "left wooden pew end"
+ name = "wooden pew end"
icon_state = "pewend_right"
var/mutable_appearance/rightpewarmrest
diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm
new file mode 100644
index 0000000000..e138e4d314
--- /dev/null
+++ b/code/game/objects/structures/beds_chairs/sofa.dm
@@ -0,0 +1,52 @@
+/obj/structure/chair/sofa
+ name = "old ratty sofa"
+ icon_state = "sofamiddle"
+ icon = 'icons/obj/sofa.dmi'
+ buildstackamount = 1
+ var/mutable_appearance/armrest
+
+/obj/structure/chair/sofa/Initialize()
+ armrest = mutable_appearance(icon, "[icon_state]_armrest", ABOVE_MOB_LAYER)
+ return ..()
+
+/obj/structure/chair/sofa/post_buckle_mob(mob/living/M)
+ . = ..()
+ update_armrest()
+
+/obj/structure/chair/sofa/proc/update_armrest()
+ if(has_buckled_mobs())
+ add_overlay(armrest)
+ else
+ cut_overlay(armrest)
+
+/obj/structure/chair/sofa/post_unbuckle_mob()
+ . = ..()
+ update_armrest()
+
+/obj/structure/chair/sofa/left
+ icon_state = "sofaend_left"
+
+/obj/structure/chair/sofa/right
+ icon_state = "sofaend_right"
+
+/obj/structure/chair/sofa/corner
+ icon_state = "sofacorner"
+
+/obj/structure/chair/sofa/corner/handle_layer() //only the armrest/back of this chair should cover the mob.
+ return
+
+// Credit for the sprites goes to CEV Eris. The sprites were taken from Hyper Station and modified to fit with armrests which were also added.
+
+/obj/structure/chair/sofa/corp
+ name = "sofa"
+ desc = "Soft, cushy and cozy. These sofas reek of bland faceless corporatism, but they aren't old and ratty at least."
+ icon_state = "corp_sofamiddle"
+
+/obj/structure/chair/sofa/corp/left
+ icon_state = "corp_sofaend_left"
+
+/obj/structure/chair/sofa/corp/right
+ icon_state = "corp_sofaend_right"
+
+/obj/structure/chair/sofa/corp/corner
+ icon_state = "corp_sofacorner"
diff --git a/code/game/objects/structures/chess.dm b/code/game/objects/structures/chess.dm
new file mode 100644
index 0000000000..8254405fee
--- /dev/null
+++ b/code/game/objects/structures/chess.dm
@@ -0,0 +1,76 @@
+/obj/structure/chess
+ anchored = FALSE
+ density = FALSE
+ icon = 'icons/obj/chess.dmi'
+ icon_state = "singularity_s1"
+ name = "Singularity"
+ desc = "You've just been pranked by the Syndicate Chess Grandmaster! Report this to CentCom."
+ max_integrity = 100
+
+/obj/structure/chess/wrench_act(mob/user, obj/item/tool)
+ to_chat(user, "You take apart the chess piece.")
+ var/obj/item/stack/sheet/metal/M = new (drop_location(), 2)
+ M.add_fingerprint(user)
+ tool.play_tool_sound(src)
+ qdel(src)
+ return TRUE
+
+/obj/structure/chess/whitepawn
+ name = "\improper White Pawn"
+ desc = "A white pawn chess piece. Get accused of cheating when executing a sick En Passant."
+ icon_state = "white_pawn"
+
+/obj/structure/chess/whiterook
+ name = "\improper White Rook"
+ desc = "A white rook chess piece. Also known as a castle. Can move any number of tiles in a straight line. It has a special move called castling."
+ icon_state = "white_rook"
+
+/obj/structure/chess/whiteknight
+ name = "\improper White Knight"
+ desc = "A white knight chess piece. Hah. It can hop over other pieces, moving in L shapes."
+ icon_state = "white_knight"
+
+/obj/structure/chess/whitebishop
+ name = "\improper White Bishop"
+ desc = "A white bishop chess piece. It can move any number of tiles in a diagonal line."
+ icon_state = "white_bishop"
+
+/obj/structure/chess/whitequeen
+ name = "\improper White Queen"
+ desc = "A white queen chess piece. It can move any number of tiles in diagonal and straight lines."
+ icon_state = "white_queen"
+
+/obj/structure/chess/whiteking
+ name = "\improper White King"
+ desc = "A white king chess piece. It can move any tile in one direction."
+ icon_state = "white_king"
+
+/obj/structure/chess/blackpawn
+ name = "\improper Black Pawn"
+ desc = "A black pawn chess piece. Get accused of cheating when executing a sick En Passant."
+ icon_state = "black_pawn"
+
+/obj/structure/chess/blackrook
+ name = "\improper Black Rook"
+ desc = "A black rook chess piece. Also known as a castle. Can move any number of tiles in a straight line. It has a special move called castling."
+ icon_state = "black_rook"
+
+/obj/structure/chess/blackknight
+ name = "\improper Black Knight"
+ desc = "A black knight chess piece. It can hop over other pieces, moving in L shapes."
+ icon_state = "black_knight"
+
+/obj/structure/chess/blackbishop
+ name = "\improper Black Bishop"
+ desc = "A black bishop chess piece. It can move any number of tiles in a diagonal line."
+ icon_state = "black_bishop"
+
+/obj/structure/chess/blackqueen
+ name = "\improper Black Queen"
+ desc = "A black queen chess piece. It can move any number of tiles in diagonal and straight lines."
+ icon_state = "black_queen"
+
+/obj/structure/chess/blackking
+ name = "\improper Black King"
+ desc = "A black king chess piece. It can move one tile in any direction."
+ icon_state = "black_king"
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 71fcef753c..c932dd96e8 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -359,7 +359,7 @@
"You hear [welder ? "welding" : "rustling of screws and metal"].")
deconstruct(TRUE)
return
- if(user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too
+ if(user.a_intent != INTENT_HARM && user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too
return TRUE
else if(istype(W, /obj/item/electronics/airlock))
handle_lock_addition(user, W)
@@ -431,7 +431,7 @@
"You hear a loud metal bang.")
var/mob/living/L = O
if(!issilicon(L))
- L.Knockdown(40)
+ L.DefaultCombatKnockdown(40)
O.forceMove(T)
close()
else
@@ -474,8 +474,9 @@
set category = "Object"
set name = "Toggle Open"
- if(!usr.canmove || usr.stat || usr.restrained())
- return
+ var/mob/living/L = usr
+ if(!istype(L) || !CHECK_MOBILITY(L, MOBILITY_USE))
+ return FALSE
if(iscarbon(usr) || issilicon(usr) || isdrone(usr))
return attack_hand(usr)
@@ -510,7 +511,7 @@
user.visible_message("[src] begins to shake violently!", \
"You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \
"You hear banging from [src].")
- if(do_after(user,(breakout_time), target = src))
+ if(do_after(user,(breakout_time), target = src, required_mobility_flags = MOBILITY_RESIST))
if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded) )
return
//we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting
@@ -603,12 +604,12 @@
step_towards(user, T2)
T1 = get_turf(user)
if(T1 == T2)
- user.resting = TRUE //so people can jump into crates without slamming the lid on their head
+ user.set_resting(TRUE, TRUE)
if(!close(user))
to_chat(user, "You can't get [src] to close!")
- user.resting = FALSE
+ user.set_resting(FALSE, TRUE)
return
- user.resting = FALSE
+ user.set_resting(FALSE, TRUE)
togglelock(user)
T1.visible_message("[user] dives into [src]!")
diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
index 645d1e5d7a..ae2e1a070a 100644
--- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
+++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
@@ -18,8 +18,8 @@
var/egged = 0
var/use_mob_movespeed = FALSE //Citadel adds snowflake box handling
-/obj/structure/closet/cardboard/relaymove(mob/user, direction)
- if(opened || move_delay || user.stat || user.IsStun() || user.IsKnockdown() || user.IsUnconscious() || !isturf(loc) || !has_gravity(loc))
+/obj/structure/closet/cardboard/relaymove(mob/living/user, direction)
+ if(opened || move_delay || !CHECK_MOBILITY(user, MOBILITY_MOVE) || !isturf(loc) || !has_gravity(loc))
return
move_delay = TRUE
var/oldloc = loc
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index a5857029f5..fae3625ccc 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -216,7 +216,7 @@
for(var/i in 1 to 3)
new /obj/item/clothing/suit/toggle/labcoat(src)
for(var/i in 1 to 3)
- new /obj/item/clothing/suit/toggle/labcoat/emt(src)
+ new /obj/item/clothing/suit/toggle/labcoat/paramedic(src)
for(var/i in 1 to 3)
new /obj/item/clothing/shoes/sneakers/white(src)
for(var/i in 1 to 3)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
index c3a23cb171..ff3f4d8793 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
@@ -4,10 +4,10 @@
/obj/structure/closet/secure_closet/freezer/Destroy()
recursive_organ_check(src)
- ..()
+ return ..()
/obj/structure/closet/secure_closet/freezer/Initialize()
- ..()
+ . = ..()
recursive_organ_check(src)
/obj/structure/closet/secure_closet/freezer/open(mob/living/user)
@@ -17,14 +17,15 @@
return ..()
/obj/structure/closet/secure_closet/freezer/close(mob/living/user)
- if(..()) //if we actually closed the locker
+ . = ..()
+ if(.) //if we actually closed the locker
recursive_organ_check(src)
/obj/structure/closet/secure_closet/freezer/ex_act()
if(!jones)
jones = TRUE
else
- ..()
+ return ..()
/obj/structure/closet/secure_closet/freezer/kitchen
name = "kitchen Cabinet"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 88c8d51479..bec1c893ae 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -265,12 +265,15 @@
new /obj/item/clothing/head/helmet/alt(src)
new /obj/item/clothing/mask/gas/sechailer(src)
new /obj/item/clothing/suit/armor/bulletproof(src)
+
/obj/structure/closet/secure_closet/lethalshots
- name = "shotgun lethal rounds"
+ name = "lethal ammunition and riot staves"
req_access = list(ACCESS_ARMORY)
icon_state = "tac"
/obj/structure/closet/secure_closet/lethalshots/PopulateContents()
..()
+ new /obj/item/twohanded/electrostaff(src)
+ new /obj/item/twohanded/electrostaff(src)
for(var/i in 1 to 3)
new /obj/item/storage/box/lethalshot(src)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 00a9452571..cf4a768f62 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -83,9 +83,12 @@
desc = "It's a burial receptacle for the dearly departed."
icon_state = "coffin"
resistance_flags = FLAMMABLE
+ can_weld_shut = FALSE
+ breakout_time = 200
max_integrity = 70
material_drop = /obj/item/stack/sheet/mineral/wood
material_drop_amount = 5
+ var/pryLidTimer = 250
/obj/structure/closet/crate/coffin/examine(mob/user)
. = ..()
diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm
index 92fda29101..fc1e642468 100644
--- a/code/game/objects/structures/holosign.dm
+++ b/code/game/objects/structures/holosign.dm
@@ -110,10 +110,10 @@
CanAtmosPass = ATMOS_PASS_NO
resistance_flags = FIRE_PROOF
-/obj/structure/holosign/barrier/combolock/blocksTemperature()
+/obj/structure/holosign/barrier/combifan/blocksTemperature()
return TRUE
-/obj/structure/holosign/barrier/combolock/Initialize()
+/obj/structure/holosign/barrier/combifan/Initialize()
. = ..()
air_update_turf(TRUE)
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index 21622519c9..05a7e1c958 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -64,6 +64,9 @@
/obj/structure/kitchenspike/attack_hand(mob/user)
if(VIABLE_MOB_CHECK(user.pulling) && user.a_intent == INTENT_GRAB && !has_buckled_mobs())
var/mob/living/L = user.pulling
+ if(HAS_TRAIT(user, TRAIT_PACIFISM) && L.stat != DEAD)
+ to_chat(user, "You don't want to hurt a living creature!")
+ return
if(do_mob(user, src, 120))
if(has_buckled_mobs()) //to prevent spam/queing up attacks
return
@@ -136,7 +139,7 @@
src.visible_message(text("[M] falls free of [src]!"))
unbuckle_mob(M,force=1)
M.emote("scream")
- M.AdjustKnockdown(20)
+ M.DefaultCombatKnockdown(20)
/obj/structure/kitchenspike/Destroy()
if(has_buckled_mobs())
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index df6d033af4..bdc7825feb 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -1,7 +1,7 @@
#define MUSICIAN_HEARCHECK_MINDELAY 4
#define MUSIC_MAXLINES 600
-#define MUSIC_MAXLINECHARS 50
+#define MUSIC_MAXLINECHARS 150
/datum/song
var/name = "Untitled"
@@ -82,7 +82,7 @@
/datum/song/proc/shouldStopPlaying(mob/user)
if(instrumentObj)
- if(!user.canUseTopic(instrumentObj))
+ if(!user.canUseTopic(instrumentObj, TRUE, FALSE, FALSE, FALSE))
return TRUE
return !instrumentObj.anchored // add special cases to stop in subclasses
else
@@ -220,7 +220,7 @@
updateDialog(usr) // make sure updates when complete
/datum/song/Topic(href, href_list)
- if(!usr.canUseTopic(instrumentObj))
+ if(!usr.canUseTopic(instrumentObj, TRUE, FALSE, FALSE, FALSE))
usr << browse(null, "window=instrument")
usr.unset_machine()
return
diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm
index 65ffb7e2e5..a8a5a577c2 100644
--- a/code/game/objects/structures/petrified_statue.dm
+++ b/code/game/objects/structures/petrified_statue.dm
@@ -49,7 +49,7 @@
if(S.mind)
if(petrified_mob)
S.mind.transfer_to(petrified_mob)
- petrified_mob.Knockdown(100)
+ petrified_mob.DefaultCombatKnockdown(100)
to_chat(petrified_mob, "You slowly come back to your senses. You are in control of yourself again!")
qdel(S)
diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm
index e3cd053d94..7e2922279b 100644
--- a/code/game/objects/structures/table_frames.dm
+++ b/code/game/objects/structures/table_frames.dm
@@ -41,7 +41,7 @@
make_new_table(material.tableVariant)
else
if(material.get_amount() < 1)
- to_chat(user, "You need one metal sheet to do this!")
+ to_chat(user, "You need one sheet to do this!")
return
to_chat(user, "You start adding [material] to [src]...")
if(do_after(user, 20, target = src) && material.use(1))
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 4eba21b8f9..550c0216c6 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -109,8 +109,7 @@
/obj/structure/table/proc/tableplace(mob/living/user, mob/living/pushed_mob)
pushed_mob.forceMove(src.loc)
- pushed_mob.resting = TRUE
- pushed_mob.update_canmove()
+ pushed_mob.set_resting(TRUE, FALSE)
pushed_mob.visible_message("[user] places [pushed_mob] onto [src].", \
"[user] places [pushed_mob] onto [src].")
log_combat(user, pushed_mob, "placed")
@@ -128,7 +127,7 @@
pushed_mob.pass_flags &= ~PASSTABLE
if(pushed_mob.loc != loc) //Something prevented the tabling
return
- pushed_mob.Knockdown(40)
+ pushed_mob.DefaultCombatKnockdown(40)
pushed_mob.visible_message("[user] slams [pushed_mob] onto [src]!", \
"[user] slams you onto [src]!")
log_combat(user, pushed_mob, "tabled", null, "onto [src]")
@@ -138,11 +137,11 @@
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table)
/obj/structure/table/shove_act(mob/living/target, mob/living/user)
- if(!target.resting)
- target.Knockdown(SHOVE_KNOCKDOWN_TABLE)
+ if(CHECK_MOBILITY(target, MOBILITY_STAND))
+ target.DefaultCombatKnockdown(SHOVE_KNOCKDOWN_TABLE)
user.visible_message("[user.name] shoves [target.name] onto \the [src]!",
"You shove [target.name] onto \the [src]!", null, COMBAT_MESSAGE_RANGE)
- target.forceMove(src.loc)
+ target.forceMove(loc)
log_combat(user, target, "shoved", "onto [src] (table)")
return TRUE
@@ -212,7 +211,7 @@
/obj/structure/table/greyscale
icon = 'icons/obj/smooth_structures/table_greyscale.dmi'
icon_state = "table"
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
buildstack = null //No buildstack, so generate from mat datums
/*
@@ -270,7 +269,7 @@
debris -= AM
if(istype(AM, /obj/item/shard))
AM.throw_impact(L)
- L.Knockdown(100)
+ L.DefaultCombatKnockdown(100)
qdel(src)
/obj/structure/table/glass/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
@@ -568,23 +567,20 @@
break
/obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob)
- pushed_mob.forceMove(src.loc)
- pushed_mob.resting = 1
- pushed_mob.update_canmove()
+ pushed_mob.forceMove(loc)
+ pushed_mob.set_resting(TRUE, TRUE)
visible_message("[user] has laid [pushed_mob] on [src].")
check_patient()
/obj/structure/table/optable/proc/check_patient()
- var/mob/M = locate(/mob/living/carbon/human, loc)
- if(M)
- if(M.resting)
- patient = M
- return 1
+ var/mob/living/carbon/human/H = locate() in loc
+ if(H)
+ if(!CHECK_MOBILITY(H, MOBILITY_STAND))
+ patient = H
+ return TRUE
else
patient = null
- return 0
-
-
+ return FALSE
/*
* Racks
@@ -644,7 +640,7 @@
. = ..()
if(.)
return
- if(user.IsKnockdown() || user.resting || user.lying || user.get_num_legs() < 2)
+ if(CHECK_MULTIPLE_BITFIELDS(user.mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) || user.get_num_legs() < 2)
return
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src, ATTACK_EFFECT_KICK)
diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm
index c386726f34..17ca178cd9 100644
--- a/code/game/objects/structures/transit_tubes/station.dm
+++ b/code/game/objects/structures/transit_tubes/station.dm
@@ -43,10 +43,10 @@
//pod insertion
-/obj/structure/transit_tube/station/MouseDrop_T(obj/structure/c_transit_tube_pod/R, mob/user)
- if(!user.canmove || user.stat || user.restrained())
+/obj/structure/transit_tube/station/MouseDrop_T(obj/structure/c_transit_tube_pod/R, mob/living/user)
+ if(!istype(user) || !CHECK_MOBILITY(user, MOBILITY_USE))
return
- if (!istype(R) || get_dist(user, src) > 1 || get_dist(src,R) > 1)
+ if(!istype(R) || get_dist(user, src) > 1 || get_dist(src,R) > 1)
return
for(var/obj/structure/transit_tube_pod/pod in loc)
return //no fun allowed
@@ -74,7 +74,7 @@
pod.visible_message("[user] starts putting [GM] into the [pod]!")
if(do_after(user, 15, target = src))
if(open_status == STATION_TUBE_OPEN && GM && user.grab_state >= GRAB_AGGRESSIVE && user.pulling == GM && !GM.buckled && !GM.has_buckled_mobs())
- GM.Knockdown(100)
+ GM.DefaultCombatKnockdown(100)
src.Bumped(GM)
break
else
diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm
index 3f559382f0..fa9c052aa3 100644
--- a/code/game/objects/structures/traps.dm
+++ b/code/game/objects/structures/traps.dm
@@ -83,7 +83,7 @@
/obj/structure/trap/stun/trap_effect(mob/living/L)
L.electrocute_act(30, src, safety=1) // electrocute act does a message.
- L.Knockdown(100)
+ L.DefaultCombatKnockdown(100)
/obj/structure/trap/fire
name = "flame trap"
@@ -92,7 +92,7 @@
/obj/structure/trap/fire/trap_effect(mob/living/L)
to_chat(L, "Spontaneous combustion!")
- L.Knockdown(20)
+ L.DefaultCombatKnockdown(20)
/obj/structure/trap/fire/flare()
..()
@@ -106,7 +106,7 @@
/obj/structure/trap/chill/trap_effect(mob/living/L)
to_chat(L, "You're frozen solid!")
- L.Knockdown(20)
+ L.DefaultCombatKnockdown(20)
L.adjust_bodytemperature(-300)
L.apply_status_effect(/datum/status_effect/freon)
@@ -119,7 +119,7 @@
/obj/structure/trap/damage/trap_effect(mob/living/L)
to_chat(L, "The ground quakes beneath your feet!")
- L.Knockdown(100)
+ L.DefaultCombatKnockdown(100)
L.adjustBruteLoss(35)
/obj/structure/trap/damage/flare()
@@ -147,7 +147,7 @@
/obj/structure/trap/cult/trap_effect(mob/living/L)
to_chat(L, "With a crack, the hostile constructs come out of hiding, stunning you!")
L.electrocute_act(10, src, safety = TRUE) // electrocute act does a message.
- L.Knockdown(20)
+ L.DefaultCombatKnockdown(20)
new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
- QDEL_IN(src, 30)
\ No newline at end of file
+ QDEL_IN(src, 30)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 359436dc2e..bdef4ab46d 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -529,7 +529,7 @@
if(B.cell.charge > 0 && B.status == 1)
flick("baton_active", src)
var/stunforce = B.stamforce
- user.Knockdown(stunforce * 2)
+ user.DefaultCombatKnockdown(stunforce * 2)
user.stuttering = stunforce/20
B.deductcharge(B.hitcost)
user.visible_message("[user] shocks [user.p_them()]self while attempting to wash the active [B.name]!", \
@@ -616,9 +616,10 @@
icon = 'icons/obj/watercloset.dmi'
icon_state = "open"
color = "#ACD1E9" //Default color, didn't bother hardcoding other colors, mappers can and should easily change it.
- alpha = 200 //Mappers can also just set this to 255 if they want curtains that can't be seen through
+ alpha = 200 //Mappers can also just set this to 255 if they want curtains that can't be seen through <- No longer necessary unless you don't want to see through it no matter what.
layer = SIGN_LAYER
anchored = TRUE
+ max_integrity = 25 //This makes cloth shower curtains as durable as a directional glass window. 300 integrity buildable shower curtains as a cover mechanic is a meta I don't want to see.
opacity = 0
density = FALSE
var/open = TRUE
@@ -633,12 +634,14 @@
layer = WALL_OBJ_LAYER
density = TRUE
open = FALSE
+ opacity = TRUE
else
icon_state = "open"
layer = SIGN_LAYER
density = FALSE
open = TRUE
+ opacity = FALSE
/obj/structure/curtain/attackby(obj/item/W, mob/user)
if (istype(W, /obj/item/toy/crayon))
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 7f039598cf..e824567b50 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -343,7 +343,8 @@
set name = "Flip Windoor Assembly"
set category = "Object"
set src in oview(1)
- if(usr.stat || !usr.canmove || usr.restrained())
+ var/mob/living/L = usr
+ if(!CHECK_MOBILITY(L, MOBILITY_PULL))
return
if(facing == "l")
@@ -354,4 +355,3 @@
to_chat(usr, "The windoor will now slide to the left.")
update_icon()
- return
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 11e026109a..c285026d5b 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -1,7 +1,6 @@
/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, soundenvwet = -10000, soundenvdry = 0)
if(isarea(source))
- throw EXCEPTION("playsound(): source is an area")
- return
+ CRASH("playsound(): source is an area")
var/turf/turf_source = get_turf(source)
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index c4c7ab2d7b..066249505d 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -272,7 +272,7 @@
var/olddir = C.dir
if(!(lube & SLIDE_ICE))
- C.Knockdown(knockdown_amount)
+ C.DefaultCombatKnockdown(knockdown_amount)
C.stop_pulling()
else
C.Stun(20)
diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm
index 3a474f339c..dd2b9dfa18 100644
--- a/code/game/turfs/simulated/lava.dm
+++ b/code/game/turfs/simulated/lava.dm
@@ -23,6 +23,10 @@
/turf/open/lava/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent)
return
+/turf/open/lava/Melt()
+ to_be_destroyed = FALSE
+ return src
+
/turf/open/lava/acid_act(acidpwr, acid_volume)
return
diff --git a/code/game/turfs/simulated/river.dm b/code/game/turfs/simulated/river.dm
index 83fade33b2..c8ea60c712 100644
--- a/code/game/turfs/simulated/river.dm
+++ b/code/game/turfs/simulated/river.dm
@@ -6,7 +6,7 @@
#define RIVERGEN_SAFETY_LOCK 1000000
-/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/open/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors/unexplored, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y)
+/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/open/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors/unexplored, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y, new_baseturfs)
var/list/river_nodes = list()
var/num_spawned = 0
var/list/possible_locs = block(locate(min_x, min_y, target_z), locate(max_x, max_y, target_z))
@@ -28,7 +28,7 @@
continue
W.connected = 1
var/turf/cur_turf = get_turf(W)
- cur_turf.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR)
+ cur_turf.ChangeTurf(turf_type, new_baseturfs, CHANGETURF_IGNORE_AIR)
var/turf/target_turf = get_turf(pick(river_nodes - W))
if(!target_turf)
break
@@ -57,7 +57,7 @@
cur_turf = get_step(cur_turf, cur_dir)
continue
else
- var/turf/river_turf = cur_turf.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR)
+ var/turf/river_turf = cur_turf.ChangeTurf(turf_type, new_baseturfs, CHANGETURF_IGNORE_AIR)
river_turf.Spread(25, 11, whitelist_area)
for(var/WP in river_nodes)
@@ -93,16 +93,16 @@
for(var/F in cardinal_turfs) //cardinal turfs are always changed but don't always spread
var/turf/T = F
- if(!istype(T, logged_turf_type) && T.ChangeTurf(type, null, CHANGETURF_IGNORE_AIR) && prob(probability))
+ if(!istype(T, logged_turf_type) && T.ChangeTurf(type, baseturfs, CHANGETURF_IGNORE_AIR) && prob(probability))
T.Spread(probability - prob_loss, prob_loss, whitelisted_area)
for(var/F in diagonal_turfs) //diagonal turfs only sometimes change, but will always spread if changed
var/turf/T = F
- if(!istype(T, logged_turf_type) && prob(probability) && T.ChangeTurf(type, null, CHANGETURF_IGNORE_AIR))
+ if(!istype(T, logged_turf_type) && prob(probability) && T.ChangeTurf(type, baseturfs, CHANGETURF_IGNORE_AIR))
T.Spread(probability - prob_loss, prob_loss, whitelisted_area)
else if(ismineralturf(T))
var/turf/closed/mineral/M = T
- M.ChangeTurf(M.turf_type, null, CHANGETURF_IGNORE_AIR)
+ M.ChangeTurf(M.turf_type, M.baseturfs, CHANGETURF_IGNORE_AIR)
#undef RANDOM_UPPER_X
diff --git a/code/modules/NTNet/relays.dm b/code/modules/NTNet/relays.dm
index 373f6451b9..0d855f15bb 100644
--- a/code/modules/NTNet/relays.dm
+++ b/code/modules/NTNet/relays.dm
@@ -35,7 +35,7 @@
return FALSE
return TRUE
-/obj/machinery/ntnet_relay/update_icon()
+/obj/machinery/ntnet_relay/update_icon_state()
if(is_operational())
icon_state = "bus"
else
diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm
index b5127929a7..ef4abeb0ad 100644
--- a/code/modules/admin/admin_ranks.dm
+++ b/code/modules/admin/admin_ranks.dm
@@ -23,8 +23,7 @@ GLOBAL_PROTECT(protected_ranks)
name = init_name
if(!name)
qdel(src)
- throw EXCEPTION("Admin rank created without name.")
- return
+ CRASH("Admin rank created without name.")
if(init_rights)
rights = init_rights
include_rights = rights
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index 37fe2a41fc..1d0b6b2a79 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -39,12 +39,10 @@ GLOBAL_PROTECT(href_token)
return
if(!ckey)
QDEL_IN(src, 0)
- throw EXCEPTION("Admin datum created without a ckey")
- return
+ CRASH("Admin datum created without a ckey")
if(!istype(R))
QDEL_IN(src, 0)
- throw EXCEPTION("Admin datum created without a rank")
- return
+ CRASH("Admin datum created without a rank")
target = ckey
name = "[ckey]'s admin datum ([R])"
rank = R
diff --git a/code/modules/admin/verbs/bluespacearty.dm b/code/modules/admin/verbs/bluespacearty.dm
index 97248b572b..2910d6dd85 100644
--- a/code/modules/admin/verbs/bluespacearty.dm
+++ b/code/modules/admin/verbs/bluespacearty.dm
@@ -21,6 +21,6 @@
target.gib(1, 1)
else
target.adjustBruteLoss(min(99,(target.health - 1)))
- target.Knockdown(400)
+ target.DefaultCombatKnockdown(400)
target.stuttering = 20
diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm
index c0445d588d..8cfd53b300 100644
--- a/code/modules/admin/verbs/borgpanel.dm
+++ b/code/modules/admin/verbs/borgpanel.dm
@@ -47,7 +47,7 @@
"emagged" = borg.emagged,
"active_module" = "[borg.module.type]",
"lawupdate" = borg.lawupdate,
- "lockdown" = borg.lockcharge,
+ "lockdown" = borg.locked_down,
"scrambledcodes" = borg.scrambledcodes
)
.["upgrades"] = list()
@@ -122,8 +122,8 @@
message_admins("[key_name_admin(user)] disabled lawsync on [ADMIN_LOOKUPFLW(borg)].")
log_admin("[key_name(user)] disabled lawsync on [key_name(borg)].")
if ("toggle_lockdown")
- borg.SetLockdown(!borg.lockcharge)
- if (borg.lockcharge)
+ borg.SetLockdown(!borg.locked_down)
+ if (borg.locked_down)
message_admins("[key_name_admin(user)] locked down [ADMIN_LOOKUPFLW(borg)].")
log_admin("[key_name(user)] locked down [key_name(borg)].")
else
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index 332329a221..c2a3f953f5 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -116,14 +116,13 @@
var/mob/living/carbon/human/M = loc
M.adjustStaminaLoss(-75)
M.SetUnconscious(0)
- M.SetStun(0)
- M.SetKnockdown(0)
+ M.SetAllImmobility(0)
combat_cooldown = 0
START_PROCESSING(SSobj, src)
/obj/item/clothing/suit/armor/abductor/vest/process()
combat_cooldown++
- if(combat_cooldown==initial(combat_cooldown))
+ if(combat_cooldown == initial(combat_cooldown))
STOP_PROCESSING(SSobj, src)
/obj/item/clothing/suit/armor/abductor/Destroy()
@@ -512,7 +511,7 @@
L.lastattackerckey = user.ckey
L.adjustStaminaLoss(35) //because previously it took 5-6 hits to actually "incapacitate" someone for the purposes of the sleep inducement
- L.Knockdown(140)
+ L.DefaultCombatKnockdown(140)
L.apply_effect(EFFECT_STUTTER, 7)
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
diff --git a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm
index 182fcea0c2..261677a74b 100644
--- a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm
+++ b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm
@@ -218,11 +218,16 @@
/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize()
. = ..()
- if(!independent) //no pulling people deep into the blob
- verbs -= /mob/living/verb/pulled
- else
+ if(independent)
pass_flags &= ~PASSBLOB
+/mob/living/simple_animal/hostile/blob/blobbernaut/start_pulling(atom/movable/AM, state, force = pull_force, supress_message = FALSE)
+ if(!independent && ismob(AM))
+ if(!supress_message)
+ to_chat(src, "You are unable to grasp people in this form.")
+ return FALSE
+ return ..()
+
/mob/living/simple_animal/hostile/blob/blobbernaut/Life()
if(..())
var/list/blobs_in_area = range(2, src)
diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm
index 5d3c8cd8ca..18e13118fe 100644
--- a/code/modules/antagonists/blob/blob/overmind.dm
+++ b/code/modules/antagonists/blob/blob/overmind.dm
@@ -24,7 +24,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
hud_type = /datum/hud/blob_overmind
var/obj/structure/blob/core/blob_core = null // The blob overmind's core
var/blob_points = 0
- var/max_blob_points = 100
+ var/max_blob_points = 250
var/last_attack = 0
var/datum/reagent/blob/blob_reagent_datum = new/datum/reagent/blob()
var/list/blob_mobs = list()
@@ -157,6 +157,9 @@ GLOBAL_LIST_EMPTY(blob_nodes)
BM.overmind = null
BM.update_icons()
GLOB.overminds -= src
+ blob_mobs = null
+ resource_blobs = null
+ blobs_legit = null
SSshuttle.clearHostileEnvironment(src)
diff --git a/code/modules/antagonists/blob/blob/powers.dm b/code/modules/antagonists/blob/blob/powers.dm
index aeb1392432..fe492831b8 100644
--- a/code/modules/antagonists/blob/blob/powers.dm
+++ b/code/modules/antagonists/blob/blob/powers.dm
@@ -321,7 +321,7 @@
set category = "Blob"
set name = "Blob Broadcast"
set desc = "Speak with your blob spores and blobbernauts as your mouthpieces."
- var/speak_text = input(src, "What would you like to say with your minions?", "Blob Broadcast", null) as text
+ var/speak_text = stripped_input(src, "What would you like to say with your minions?", "Blob Broadcast", null)
if(!speak_text)
return
else
diff --git a/code/modules/antagonists/blob/blob/theblob.dm b/code/modules/antagonists/blob/blob/theblob.dm
index 953b876b35..fc78f859f2 100644
--- a/code/modules/antagonists/blob/blob/theblob.dm
+++ b/code/modules/antagonists/blob/blob/theblob.dm
@@ -303,8 +303,7 @@
/obj/structure/blob/proc/change_to(type, controller)
if(!ispath(type))
- throw EXCEPTION("change_to(): invalid type for blob")
- return
+ CRASH("change_to(): invalid type for blob")
var/obj/structure/blob/B = new type(src.loc, controller)
B.creation_action()
B.update_icon()
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
index 0179c60ef1..e774cf4250 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm
@@ -315,7 +315,7 @@
bloodsuckerdatum.handle_eat_human_food(food_nutrition)
-/datum/antagonist/bloodsucker/proc/handle_eat_human_food(var/food_nutrition) // Called from snacks.dm and drinks.dm
+/datum/antagonist/bloodsucker/proc/handle_eat_human_food(food_nutrition, puke_blood = TRUE, masquerade_override) // Called from snacks.dm and drinks.dm
set waitfor = FALSE
if(!owner.current || !iscarbon(owner.current))
return
@@ -324,14 +324,14 @@
C.nutrition -= food_nutrition
foodInGut += food_nutrition
// Already ate some bad clams? Then we can back out, because we're already sick from it.
- if (foodInGut != food_nutrition)
+ if(foodInGut != food_nutrition)
return
// Haven't eaten, but I'm in a Human Disguise.
- else if (poweron_masquerade)
+ else if(poweron_masquerade && !masquerade_override)
to_chat(C, "Your stomach turns, but your \"human disguise\" keeps the food down...for now.")
// Keep looping until we purge. If we have activated our Human Disguise, we ignore the food. But it'll come up eventually...
var/sickphase = 0
- while (foodInGut)
+ while(foodInGut)
sleep(50)
C.adjust_disgust(10 * sickphase)
// Wait an interval...
@@ -340,24 +340,29 @@
if(C.stat == DEAD)
return
// Put up disguise? Then hold off the vomit.
- if(poweron_masquerade)
+ if(poweron_masquerade && !masquerade_override)
if(sickphase > 0)
to_chat(C, "Your stomach settles temporarily. You regain your composure...for now.")
sickphase = 0
continue
switch(sickphase)
- if (1)
+ if(1)
to_chat(C, "You feel unwell. You can taste ash on your tongue.")
C.Stun(10)
- if (2)
+ if(2)
to_chat(C, "Your stomach turns. Whatever you ate tastes of grave dirt and brimstone.")
C.Dizzy(15)
C.Stun(13)
- if (3)
+ if(3)
to_chat(C, "You purge the food of the living from your viscera! You've never felt worse.")
- C.vomit(foodInGut * 4, foodInGut * 2, 0) // (var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1, var/toxic = 0)
- C.blood_volume = max(0, C.blood_volume - foodInGut * 2)
+ //Puke blood only if puke_blood is true, and loose some blood, else just puke normally.
+ if(puke_blood)
+ C.blood_volume = max(0, C.blood_volume - foodInGut * 2)
+ C.vomit(foodInGut * 4, foodInGut * 2, 0)
+ else
+ C.vomit(foodInGut * 4, FALSE, 0)
C.Stun(30)
//C.Dizzy(50)
foodInGut = 0
+ SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "vampdisgust", /datum/mood_event/bloodsucker_disgust)
sickphase ++
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm b/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm
index 63e1470576..a2a0238df1 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm
@@ -208,7 +208,7 @@
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
+/*
// Destroy the Solar Arrays
/datum/objective/bloodsucker/solars
@@ -228,7 +228,7 @@
if (SC && SC.lastgen > 0 && SC.connected_panels.len > 0 && SC.connected_tracker)
return FALSE
return TRUE
-
+*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm
index 626ad43b10..507e1f2739 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm
@@ -96,7 +96,7 @@
// Incap?
if(must_be_capacitated)
var/mob/living/L = owner
- if (L.incapacitated(TRUE, TRUE) || L.resting && !can_be_immobilized)
+ if (L.incapacitated(TRUE, TRUE) || !CHECK_MOBILITY(L, MOBILITY_STAND) && !can_be_immobilized)
if(display_error)
to_chat(owner, "Not while you're incapacitated!")
return FALSE
diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
index 5207f7a66d..4d06c127d4 100644
--- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
+++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm
@@ -379,20 +379,21 @@
protege_objective.generate_objective()
add_objective(protege_objective)
- if (rand(0,1) == 0)
+ //if (rand(0,1) == 0)
// Heart Thief Objective
- var/datum/objective/bloodsucker/heartthief/heartthief_objective = new
- heartthief_objective.owner = owner
- heartthief_objective.generate_objective()
- add_objective(heartthief_objective)
-
+ var/datum/objective/bloodsucker/heartthief/heartthief_objective = new
+ heartthief_objective.owner = owner
+ heartthief_objective.generate_objective()
+ add_objective(heartthief_objective)
+ /*
else
- // Solars Objective
+
+ // Solars Objective, doesnt work due to TG updates.
var/datum/objective/bloodsucker/solars/solars_objective = new
solars_objective.owner = owner
solars_objective.generate_objective()
add_objective(solars_objective)
-
+*/
// Survive Objective
var/datum/objective/bloodsucker/survive/survive_objective = new
survive_objective.owner = owner
diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm
index b7c90523b6..b69b851990 100644
--- a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm
+++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm
@@ -1,9 +1,5 @@
-
-
// organ_internal.dm -- /obj/item/organ
-
-
// Do I have a stake in my heart?
/mob/living/AmStaked()
var/obj/item/bodypart/BP = get_bodypart("chest")
@@ -13,16 +9,14 @@
if (istype(I,/obj/item/stake/))
return TRUE
return FALSE
+
/mob/proc/AmStaked()
return FALSE
-
/mob/living/proc/StakeCanKillMe()
return IsSleeping() || stat >= UNCONSCIOUS || blood_volume <= 0 || HAS_TRAIT(src, TRAIT_DEATHCOMA) // NOTE: You can't go to sleep in a coffin with a stake in you.
-
-///obj/item/weapon/melee/stake
-/obj/item/stake/
+/obj/item/stake
name = "wooden stake"
desc = "A simple wooden stake carved to a sharp point."
icon = 'icons/obj/items_and_weapons.dmi'
@@ -112,8 +106,7 @@
// Can this target be staked? If someone stands up before this is complete, it fails. Best used on someone stationary.
/mob/living/carbon/proc/can_be_staked()
- //return resting || IsKnockdown() || IsUnconscious() || (stat && (stat != SOFT_CRIT || pulledby)) || (has_trait(TRAIT_FAKEDEATH)) || resting || IsStun() || IsFrozen() || (pulledby && pulledby.grab_state >= GRAB_NECK)
- return (resting || lying || IsUnconscious() || pulledby && pulledby.grab_state >= GRAB_NECK)
+ return !CHECK_MOBILITY(src, MOBILITY_STAND)
// ABOVE: Taken from update_mobility() in living.dm
/obj/item/stake/hardened
diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm
index a25244c48d..debeee3775 100644
--- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm
+++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm
@@ -42,25 +42,18 @@
/obj/structure/closet/crate
var/mob/living/resident // This lets bloodsuckers claim any "closet" as a Coffin, so long as they could get into it and close it. This locks it in place, too.
-/obj/structure/closet/crate/coffin
- var/pryLidTimer = 250
- can_weld_shut = FALSE
- breakout_time = 200
-
-
/obj/structure/closet/crate/coffin/blackcoffin
name = "black coffin"
desc = "For those departed who are not so dear."
icon_state = "coffin"
icon = 'icons/obj/vamp_obj.dmi'
- can_weld_shut = FALSE
- resistance_flags = 0 // Start off with no bonuses.
open_sound = 'sound/bloodsucker/coffin_open.ogg'
close_sound = 'sound/bloodsucker/coffin_close.ogg'
breakout_time = 600
pryLidTimer = 400
resistance_flags = NONE
- integrity_failure = 70
+ max_integrity = 100
+ integrity_failure = 0.5
armor = list("melee" = 50, "bullet" = 20, "laser" = 30, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60)
/obj/structure/closet/crate/coffin/meatcoffin
@@ -68,8 +61,6 @@
desc = "When you're ready to meat your maker, the steaks can never be too high."
icon_state = "meatcoffin"
icon = 'icons/obj/vamp_obj.dmi'
- can_weld_shut = FALSE
- resistance_flags = 0 // Start off with no bonuses.
open_sound = 'sound/effects/footstep/slime1.ogg'
close_sound = 'sound/effects/footstep/slime1.ogg'
breakout_time = 200
@@ -77,24 +68,23 @@
resistance_flags = NONE
material_drop = /obj/item/reagent_containers/food/snacks/meat/slab
material_drop_amount = 3
- integrity_failure = 40
+ integrity_failure = 0.57
armor = list("melee" = 70, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100)
-
+
/obj/structure/closet/crate/coffin/metalcoffin
name = "metal coffin"
desc = "A big metal sardine can inside of another big metal sardine can, in space."
icon_state = "metalcoffin"
icon = 'icons/obj/vamp_obj.dmi'
- can_weld_shut = FALSE
resistance_flags = FIRE_PROOF | LAVA_PROOF
open_sound = 'sound/effects/pressureplate.ogg'
close_sound = 'sound/effects/pressureplate.ogg'
breakout_time = 300
pryLidTimer = 200
- resistance_flags = NONE
material_drop = /obj/item/stack/sheet/metal
material_drop_amount = 5
- integrity_failure = 60
+ max_integrity = 200
+ integrity_failure = 0.25
armor = list("melee" = 40, "bullet" = 15, "laser" = 50, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60)
//////////////////////////////////////////////
diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm
index 9e46203483..db286dd6fe 100644
--- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm
+++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm
@@ -205,7 +205,7 @@
buckled_mob.pixel_y = buckled_mob.get_standard_pixel_y_offset(180)
src.visible_message(text("[buckled_mob][buckled_mob.stat==DEAD?"'s corpse":""] slides off of the rack."))
density = FALSE
- buckled_mob.AdjustKnockdown(30)
+ buckled_mob.DefaultCombatKnockdown(30)
update_icon()
useLock = FALSE // Failsafe
diff --git a/code/modules/antagonists/bloodsucker/powers/brawn.dm b/code/modules/antagonists/bloodsucker/powers/brawn.dm
index 712a15dff9..cf0393ff3a 100644
--- a/code/modules/antagonists/bloodsucker/powers/brawn.dm
+++ b/code/modules/antagonists/bloodsucker/powers/brawn.dm
@@ -72,8 +72,7 @@
if(rand(5 + powerlevel) >= 5)
target.visible_message("[user] lands a vicious punch, sending [target] away!", \
"[user] has landed a horrifying punch on you, sending you flying!!", null, COMBAT_MESSAGE_RANGE)
- target.Knockdown(min(5, rand(10, 10 * powerlevel)) )
-
+ target.DefaultCombatKnockdown(min(5, rand(10, 10 * powerlevel)) )
// Attack!
playsound(get_turf(target), 'sound/weapons/punch4.ogg', 60, 1, -1)
user.do_attack_animation(target, ATTACK_EFFECT_SMASH)
@@ -145,7 +144,7 @@
// Knock Down (if Living)
if (isliving(M))
var/mob/living/L = M
- L.Knockdown(pull_power * 10 + 20)
+ L.DefaultCombatKnockdown(pull_power * 10 + 20)
// Knock Back (before Knockdown, which probably cancels pull)
var/send_dir = get_dir(owner, M)
var/turf/T = get_ranged_target_turf(M, send_dir, pull_power)
diff --git a/code/modules/antagonists/bloodsucker/powers/cloak.dm b/code/modules/antagonists/bloodsucker/powers/cloak.dm
index 9d83c95f05..1bb7b02357 100644
--- a/code/modules/antagonists/bloodsucker/powers/cloak.dm
+++ b/code/modules/antagonists/bloodsucker/powers/cloak.dm
@@ -2,40 +2,59 @@
/datum/action/bloodsucker/cloak
name = "Cloak of Darkness"
- desc = "Blend into the shadows and become invisible to the untrained eye."
+ desc = "Blend into the shadows and become invisible to the untrained eye. Movement is slowed in brightly lit areas."
button_icon_state = "power_cloak"
bloodcost = 5
cooldown = 50
bloodsucker_can_buy = TRUE
amToggle = TRUE
warn_constant_cost = TRUE
- var/was_running
-
- var/light_min = 0.2 // If lum is above this, no good.
+ var/moveintent_was_run
+ var/runintent
+ var/walk_threshold = 0.4 // arbitrary number, to be changed. edit in last commit: this is fine after testing on box station for a bit
+ var/lum
/datum/action/bloodsucker/cloak/CheckCanUse(display_error)
. = ..()
if(!.)
return
- // Must be Dark
- var/turf/T = owner.loc
- if(istype(T) && T.get_lumcount() > light_min)
- to_chat(owner, "This area is not dark enough to blend in")
- return FALSE
+
+ // must have nobody around to see the cloak
+ var/watchers = viewers(9,get_turf(owner))
+ for(var/mob/living/M in watchers)
+ if(M != owner)
+ to_chat(owner, "You may only vanish into the shadows unseen.")
+ return FALSE
+
return TRUE
/datum/action/bloodsucker/cloak/ActivatePower()
var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
var/mob/living/user = owner
- was_running = (user.m_intent == MOVE_INTENT_RUN)
- if(was_running)
- user.toggle_move_intent()
- ADD_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness")
+
+ moveintent_was_run = (user.m_intent == MOVE_INTENT_RUN)
+
while(bloodsuckerdatum && ContinueActive(user))
// Pay Blood Toll (if awake)
- owner.alpha = max(20, owner.alpha - min(75, 10 + 5 * level_current))
+ owner.alpha = max(35, owner.alpha - min(75, 10 + 5 * level_current))
bloodsuckerdatum.AddBloodVolume(-0.2)
- sleep(5) // Check every few ticks that we haven't disabled this power
+
+ runintent = (user.m_intent == MOVE_INTENT_RUN)
+ var/turf/T = get_turf(user)
+ lum = T.get_lumcount()
+
+ if(istype(owner.loc))
+ if(lum > walk_threshold)
+ if(runintent)
+ user.toggle_move_intent()
+ ADD_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness")
+
+ if(lum < walk_threshold)
+ if(!runintent)
+ user.toggle_move_intent()
+ REMOVE_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness")
+
+ sleep(5) // Check every few ticks
/datum/action/bloodsucker/cloak/ContinueActive(mob/living/user, mob/living/target)
if (!..())
@@ -43,15 +62,14 @@
if(user.stat == !CONSCIOUS) // Must be CONSCIOUS
to_chat(owner, "Your cloak failed due to you falling unconcious! ")
return FALSE
- var/turf/T = owner.loc // Must be DARK
- if(istype(T) && T.get_lumcount() > light_min)
- to_chat(owner, "Your cloak failed due to there being too much light!")
- return FALSE
return TRUE
/datum/action/bloodsucker/cloak/DeactivatePower(mob/living/user = owner, mob/living/target)
..()
REMOVE_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness")
user.alpha = 255
- if(was_running && user.m_intent != MOVE_INTENT_RUN)
+
+ runintent = (user.m_intent == MOVE_INTENT_RUN)
+
+ if(!runintent && moveintent_was_run)
user.toggle_move_intent()
diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm
index f9ff31d94a..bbce221d91 100644
--- a/code/modules/antagonists/bloodsucker/powers/feed.dm
+++ b/code/modules/antagonists/bloodsucker/powers/feed.dm
@@ -306,7 +306,7 @@
// Bloodsuckers not affected by "the Kiss" of another vampire
if(!target.mind || !target.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER))
target.Unconscious(50,0)
- target.Knockdown(40 + 5 * level_current,1)
+ target.DefaultCombatKnockdown(40 + 5 * level_current,1)
// NOTE: THis is based on level of power!
if(ishuman(target))
target.adjustStaminaLoss(5, forced = TRUE)// Base Stamina Damage
@@ -321,4 +321,4 @@
// My mouth is no longer full
REMOVE_TRAIT(owner, TRAIT_MUTE, "bloodsucker_feed")
// Let me move immediately
- user.update_canmove()
+ user.update_mobility()
diff --git a/code/modules/antagonists/bloodsucker/powers/go_home.dm b/code/modules/antagonists/bloodsucker/powers/go_home.dm
index 3fa8a07299..4788d7639e 100644
--- a/code/modules/antagonists/bloodsucker/powers/go_home.dm
+++ b/code/modules/antagonists/bloodsucker/powers/go_home.dm
@@ -100,8 +100,8 @@
var/mob/living/simple_animal/SA = pick(/mob/living/simple_animal/mouse,/mob/living/simple_animal/mouse,/mob/living/simple_animal/mouse, /mob/living/simple_animal/hostile/retaliate/bat) //prob(300) /mob/living/simple_animal/mouse,
new SA (owner.loc)
// TELEPORT: Move to Coffin & Close it!
+ user.set_resting(TRUE, TRUE, FALSE)
do_teleport(owner, bloodsuckerdatum.coffin, no_effects = TRUE, forced = TRUE, channel = TELEPORT_CHANNEL_QUANTUM)
- user.resting = TRUE
user.Stun(30,1)
// CLOSE LID: If fail, force me in.
if(!bloodsuckerdatum.coffin.close(owner))
diff --git a/code/modules/antagonists/bloodsucker/powers/haste.dm b/code/modules/antagonists/bloodsucker/powers/haste.dm
index 47c93b794e..143950b32f 100644
--- a/code/modules/antagonists/bloodsucker/powers/haste.dm
+++ b/code/modules/antagonists/bloodsucker/powers/haste.dm
@@ -76,16 +76,17 @@
sleep(speed)
UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
hit = null
- user.update_canmove()
+ user.update_mobility()
/datum/action/bloodsucker/targeted/haste/DeactivatePower(mob/living/user = owner, mob/living/target)
..() // activate = FALSE
- user.update_canmove()
+ user.update_mobility()
/datum/action/bloodsucker/targeted/haste/proc/on_move()
for(var/mob/living/L in dview(1, get_turf(owner)))
if(!hit[L] && (L != owner))
hit[L] = TRUE
playsound(L, "sound/weapons/punch[rand(1,4)].ogg", 15, 1, -1)
- L.Knockdown(10 + level_current * 5, override_hardstun = 0.1)
+ L.DefaultCombatKnockdown(10 + level_current * 5)
+ L.Paralyze(0.1)
L.spin(10, 1)
diff --git a/code/modules/antagonists/bloodsucker/powers/lunge.dm b/code/modules/antagonists/bloodsucker/powers/lunge.dm
index 48e12332a2..cc9363bbaf 100644
--- a/code/modules/antagonists/bloodsucker/powers/lunge.dm
+++ b/code/modules/antagonists/bloodsucker/powers/lunge.dm
@@ -9,7 +9,7 @@
cooldown = 120
target_range = 3
power_activates_immediately = TRUE
- message_Trigger = ""//"Whom will you subvert to your will?"
+ message_Trigger = "Whom will you ensnare within your grasp?"
must_be_capacitated = TRUE
bloodsucker_can_buy = TRUE
@@ -52,32 +52,37 @@
// set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done.
var/mob/living/carbon/target = A
var/turf/T = get_turf(target)
+ var/mob/living/L = owner
// Clear Vars
owner.pulling = null
// Will we Knock them Down?
var/do_knockdown = !is_A_facing_B(target,owner) || owner.alpha <= 0 || istype(owner.loc, /obj/structure/closet)
// CAUSES: Target has their back to me, I'm invisible, or I'm in a Closet
// Step One: Heatseek toward Target's Turf
-
- walk_towards(owner, T, 0.1, 10) // NOTE: this runs in the background! to cancel it, you need to use walk(owner.current,0), or give them a new path.
addtimer(CALLBACK(owner, .proc/_walk, 0), 2 SECONDS)
- if(get_turf(owner) != T && !(isliving(target) && target.Adjacent(owner)) && owner.incapacitated() && owner.resting)
- var/send_dir = get_dir(owner, T)
- new /datum/forced_movement(owner, get_ranged_target_turf(owner, send_dir, 1), 1, FALSE)
- owner.spin(10)
- // Step Two: Check if I'm at/adjectent to Target's CURRENT turf (not original...that was just a destination)
- sleep(1)
- if(target.Adjacent(owner))
- // LEVEL 2: If behind target, mute or unconscious!
- if(do_knockdown) // && level_current >= 1)
- target.Knockdown(15 + 10 * level_current,1)
- target.adjustStaminaLoss(40 + 10 * level_current)
- // Cancel Walk (we were close enough to contact them)
- walk(owner, 0)
- target.Stun(10,1) //Without this the victim can just walk away
- target.grabbedby(owner) // Taken from mutations.dm under changelings
- target.grippedby(owner, instant = TRUE) //instant aggro grab
+ target.playsound_local(get_turf(owner), 'sound/bloodsucker/lunge_warn.ogg', 60, FALSE, pressure_affected = FALSE) // target-only telegraphing
+ owner.playsound_local(owner, 'sound/bloodsucker/lunge_warn.ogg', 60, FALSE, pressure_affected = FALSE) // audio feedback to the user
+ if(do_mob(owner, owner, 7, TRUE, TRUE))
+ walk_towards(owner, T, 0.1, 10) // yes i know i shouldn't use this but i don't know how to work in anything better
+ if(get_turf(owner) != T && !(isliving(target) && target.Adjacent(owner)) && owner.incapacitated() && !CHECK_MOBILITY(L, MOBILITY_STAND))
+ var/send_dir = get_dir(owner, T)
+ new /datum/forced_movement(owner, get_ranged_target_turf(owner, send_dir, 1), 1, FALSE)
+ owner.spin(10)
+ // Step Two: Check if I'm at/adjectent to Target's CURRENT turf (not original...that was just a destination)
+ for(var/i in 1 to 6)
+ if (target.Adjacent(owner))
+ // LEVEL 2: If behind target, mute or unconscious!
+ if(do_knockdown) // && level_current >= 1)
+ target.Knockdown(15 + 10 * level_current,1)
+ target.adjustStaminaLoss(40 + 10 * level_current)
+ // Cancel Walk (we were close enough to contact them)
+ walk(owner, 0)
+ target.Stun(10,1) //Without this the victim can just walk away
+ target.grabbedby(owner) // Taken from mutations.dm under changelings
+ target.grippedby(owner, instant = TRUE) //instant aggro grab
+ break
+ sleep(3)
/datum/action/bloodsucker/targeted/lunge/DeactivatePower(mob/living/user = owner, mob/living/target)
..() // activate = FALSE
- user.update_canmove()
+ user.update_mobility()
diff --git a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm
index dc9d1d46a0..d5354c1af9 100644
--- a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm
+++ b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm
@@ -11,24 +11,25 @@
button_icon_state = "power_mez"
bloodcost = 30
cooldown = 300
- target_range = 1
- power_activates_immediately = FALSE
+ target_range = 2
+ power_activates_immediately = TRUE
message_Trigger = "Whom will you subvert to your will?"
must_be_capacitated = TRUE
bloodsucker_can_buy = TRUE
+ var/success
/datum/action/bloodsucker/targeted/mesmerize/CheckCanUse(display_error)
. = ..()
if(!.)
return
- if (!owner.getorganslot(ORGAN_SLOT_EYES))
+ if(!owner.getorganslot(ORGAN_SLOT_EYES))
if (display_error)
to_chat(owner, "You have no eyes with which to mesmerize.")
return FALSE
// Check: Eyes covered?
var/mob/living/L = owner
- if (istype(L) && L.is_eyes_covered() || !isturf(owner.loc))
- if (display_error)
+ if(istype(L) && L.is_eyes_covered() || !isturf(owner.loc))
+ if(display_error)
to_chat(owner, "Your eyes are concealed from sight.")
return FALSE
return TRUE
@@ -38,74 +39,102 @@
/datum/action/bloodsucker/targeted/mesmerize/CheckCanTarget(atom/A,display_error)
// Check: Self
- if (A == owner)
+ if(A == owner)
return FALSE
var/mob/living/carbon/target = A // We already know it's carbon due to CheckValidTarget()
+
// Bloodsucker
- if (target.mind && target.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER))
+ if(target.mind && target.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER))
if (display_error)
to_chat(owner, "Bloodsuckers are immune to [src].")
return FALSE
// Dead/Unconscious
- if (target.stat > CONSCIOUS)
+ if(target.stat > CONSCIOUS)
if (display_error)
to_chat(owner, "Your victim is not [(target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH))?"alive":"conscious"].")
return FALSE
// Check: Target has eyes?
- if (!target.getorganslot(ORGAN_SLOT_EYES))
+ if(!target.getorganslot(ORGAN_SLOT_EYES))
if (display_error)
to_chat(owner, "They have no eyes!")
return FALSE
// Check: Target blind?
- if (target.eye_blind > 0)
+ if(target.eye_blind > 0)
if (display_error)
to_chat(owner, "Your victim's eyes are glazed over. They cannot perceive you.")
return FALSE
// Check: Target See Me? (behind wall)
- if (!(owner in view(target_range, get_turf(target))))
+ if(!(target in view(target_range, get_turf(owner))))
// Sub-Check: GET CLOSER
//if (!(owner in range(target_range, get_turf(target)))
// if (display_error)
// to_chat(owner, "You're too far from your victim.")
- if (display_error)
+ if(display_error)
to_chat(owner, "You're too far outside your victim's view.")
return FALSE
+
+ if(target.has_status_effect(STATUS_EFFECT_MESMERIZE)) // ignores facing once the windup has started
+ return TRUE
+
// Check: Facing target?
- if (!is_A_facing_B(owner,target)) // in unsorted.dm
+ if(!is_A_facing_B(owner,target)) // in unsorted.dm
if (display_error)
to_chat(owner, "You must be facing your victim.")
return FALSE
// Check: Target facing me?
- if (!target.resting && !is_A_facing_B(target,owner))
- if (display_error)
+ if (CHECK_MOBILITY(target, MOBILITY_STAND) && !is_A_facing_B(target,owner))
+ if(display_error)
to_chat(owner, "Your victim must be facing you to see into your eyes.")
return FALSE
return TRUE
+/datum/action/bloodsucker/targeted/mesmerize/proc/ContinueTarget(atom/A)
+ var/mob/living/carbon/target = A
+ var/mob/living/user = owner
+
+ var/cancontinue=CheckCanTarget(target)
+ if(!cancontinue)
+ success = FALSE
+ target.remove_status_effect(STATUS_EFFECT_MESMERIZE)
+ user.remove_status_effect(STATUS_EFFECT_MESMERIZE)
+ DeactivatePower()
+ DeactivateRangedAbility()
+ StartCooldown()
+ to_chat(user, "[target] has escaped your gaze!")
+ UnregisterSignal(target, COMSIG_MOVABLE_MOVED)
+
/datum/action/bloodsucker/targeted/mesmerize/FireTargetedPower(atom/A)
// set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done.
var/mob/living/carbon/target = A
var/mob/living/user = owner
if(istype(target))
- target.Stun(40) //Utterly useless without this, its okay since there are so many checks to go through
- target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 45) //So you cant rotate with combat mode, plus fancy status alert
+ success = TRUE
+ var/power_time = 138 + level_current * 12
+ target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 30)
+ user.apply_status_effect(STATUS_EFFECT_MESMERIZE, 30)
+
+ RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/ContinueTarget)
- if(do_mob(user, target, 40, 0, TRUE, extra_checks = CALLBACK(src, .proc/ContinueActive, user, target)))
- PowerActivatedSuccessfully() // PAY COST! BEGIN COOLDOWN!
- var/power_time = 90 + level_current * 12
- target.apply_status_effect(STATUS_EFFECT_MESMERIZE, power_time + 80)
- to_chat(user, "[target] is fixed in place by your hypnotic gaze.")
- target.Stun(power_time)
- target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // target.changeNext_move(power_time) // check click.dm
- target.notransform = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze.
- spawn(power_time)
- if(istype(target))
- target.notransform = FALSE
- // They Woke Up! (Notice if within view)
- if(istype(user) && target.stat == CONSCIOUS && (target in view(10, get_turf(user))) )
+ // 3 second windup
+ sleep(30)
+ if(success)
+ PowerActivatedSuccessfully() // blood & cooldown only altered if power activated successfully - less "fuck you"-y
+ target.face_atom(user)
+ target.apply_status_effect(STATUS_EFFECT_MESMERIZE, power_time) // pretty much purely cosmetic
+ target.Stun(power_time)
+ to_chat(user, "[target] is fixed in place by your hypnotic gaze.")
+ target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // target.changeNext_move(power_time) // check click.dm
+ target.notransform = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze.
+
+ UnregisterSignal(target, COMSIG_MOVABLE_MOVED)
+
+ spawn(power_time)
+ if(istype(target) && success)
+ target.notransform = FALSE
+ // They Woke Up! (Notice if within view)
+ if(istype(user) && target.stat == CONSCIOUS && (target in view(10, get_turf(user))) )
to_chat(user, "[target] has snapped out of their trance.")
-
/datum/action/bloodsucker/targeted/mesmerize/ContinueActive(mob/living/user, mob/living/target)
return ..() && CheckCanUse() && CheckCanTarget(target)
diff --git a/code/modules/antagonists/changeling/cellular_emporium.dm b/code/modules/antagonists/changeling/cellular_emporium.dm
index 3cf0a3ee25..b2c1a52a4a 100644
--- a/code/modules/antagonists/changeling/cellular_emporium.dm
+++ b/code/modules/antagonists/changeling/cellular_emporium.dm
@@ -81,7 +81,7 @@
if(istype(our_target, /datum/cellular_emporium))
cellular_emporium = our_target
else
- throw EXCEPTION("cellular_emporium action created with non emporium")
+ CRASH("cellular_emporium action created with non emporium")
/datum/action/innate/cellular_emporium/Activate()
cellular_emporium.ui_interact(owner)
diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm
index 8ed5b5e39c..da626bcf1c 100644
--- a/code/modules/antagonists/changeling/powers/fakedeath.dm
+++ b/code/modules/antagonists/changeling/powers/fakedeath.dm
@@ -18,7 +18,6 @@
user.tod = STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)
user.fakedeath("changeling") //play dead
user.update_stat()
- user.update_canmove()
addtimer(CALLBACK(src, .proc/ready_to_regenerate, user), LING_FAKEDEATH_TIME, TIMER_UNIQUE)
return TRUE
diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm
index 4ef0d2f240..867f160081 100644
--- a/code/modules/antagonists/changeling/powers/headcrab.dm
+++ b/code/modules/antagonists/changeling/powers/headcrab.dm
@@ -30,7 +30,7 @@
H.confused += 3
for(var/mob/living/silicon/S in range(2,user))
to_chat(S, "Your sensors are disabled by a shower of blood!")
- S.Knockdown(60)
+ S.DefaultCombatKnockdown(60)
var/turf = get_turf(user)
user.gib()
. = TRUE
diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm
index 65e58ae65b..3de220dbcb 100644
--- a/code/modules/antagonists/changeling/powers/shriek.dm
+++ b/code/modules/antagonists/changeling/powers/shriek.dm
@@ -24,7 +24,7 @@
if(issilicon(M))
SEND_SOUND(M, sound('sound/weapons/flash.ogg'))
- M.Knockdown(rand(100,200))
+ M.DefaultCombatKnockdown(rand(100,200))
for(var/obj/machinery/light/L in range(4, user))
L.on = 1
diff --git a/code/modules/antagonists/changeling/powers/strained_muscles.dm b/code/modules/antagonists/changeling/powers/strained_muscles.dm
index 1f25e06324..a98700683e 100644
--- a/code/modules/antagonists/changeling/powers/strained_muscles.dm
+++ b/code/modules/antagonists/changeling/powers/strained_muscles.dm
@@ -26,7 +26,7 @@
changeling.chem_recharge_slowdown -= 0.5
if(stacks >= 20)
to_chat(user, "We collapse in exhaustion.")
- user.Knockdown(60)
+ user.DefaultCombatKnockdown(60)
user.emote("gasp")
INVOKE_ASYNC(src, .proc/muscle_loop, user)
@@ -40,7 +40,7 @@
if(user.stat != CONSCIOUS || user.staminaloss >= 90)
active = !active
to_chat(user, "Our muscles relax without the energy to strengthen them.")
- user.Knockdown(40)
+ user.DefaultCombatKnockdown(40)
user.remove_movespeed_modifier(MOVESPEED_ID_CHANGELING_MUSCLES)
changeling.chem_recharge_slowdown -= 0.5
break
diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
index eb7f83735d..1b4d26ac86 100644
--- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
+++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm
@@ -80,7 +80,7 @@
if(iscultist(L)) //No longer stuns cultists, instead sets them on fire and burns them
to_chat(L, "\"Watch your step, wretch.\"")
L.adjustFireLoss(10)
- L.Knockdown(20, FALSE)
+ L.DefaultCombatKnockdown(20, FALSE)
L.adjust_fire_stacks(5) //Burn!
L.IgniteMob()
else
@@ -155,7 +155,7 @@
if(brutedamage || burndamage)
L.adjustBruteLoss(-(brutedamage * 0.25))
L.adjustFireLoss(-(burndamage * 0.25))
- L.Knockdown(50) //Completely defenseless for five seconds - mainly to give them time to read over the information they've just been presented with
+ L.DefaultCombatKnockdown(50) //Completely defenseless for five seconds - mainly to give them time to read over the information they've just been presented with
if(iscarbon(L))
var/mob/living/carbon/C = L
C.silent += 5
diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
index ee1a1233d2..c7c9c42ee9 100644
--- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
+++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm
@@ -196,7 +196,7 @@
if(!iscultist(L))
L.visible_message("[L]'s eyes blaze with brilliant light!", \
"Your vision suddenly screams with white-hot light!")
- L.Knockdown(15, TRUE, FALSE, 15)
+ L.DefaultCombatKnockdown(15, TRUE, FALSE, 15)
L.apply_status_effect(STATUS_EFFECT_KINDLE)
L.flash_act(1, 1)
if(issilicon(target))
diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm
index 05516cc6a2..4a10862e28 100644
--- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm
@@ -57,15 +57,15 @@
else if(!..())
if(!L.anti_magic_check())
if(issilicon(L))
- L.Knockdown(100)
+ L.DefaultCombatKnockdown(100)
else if(iscultist(L))
L.confused += CLAMP(10 - L.confused, 0, 5) // Spearthrow now confuses enemy cultists + just deals extra damage / sets on fire instead of hardstunning + damage
to_chat(L, "[src] crashes into you with burning force, sending you reeling!")
L.adjust_fire_stacks(2)
- L.Knockdown(1)
+ L.DefaultCombatKnockdown(1)
L.IgniteMob()
else
- L.Knockdown(40)
+ L.DefaultCombatKnockdown(40)
GLOB.clockwork_vitality += L.adjustFireLoss(bonus_burn * 3) //normally a total of 40 damage, 70 with ratvar
break_spear(T)
else
diff --git a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm
index 644d9eedd5..6a53097922 100644
--- a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm
+++ b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm
@@ -176,7 +176,7 @@
var/datum/status_effect/belligerent/B = C.apply_status_effect(STATUS_EFFECT_BELLIGERENT)
if(!QDELETED(B))
B.duration = world.time + 30
- C.Knockdown(5) //knocks down for half a second if affected
+ C.DefaultCombatKnockdown(5) //knocks down for half a second if affected
sleep(!GLOB.ratvar_approaches ? 16 : 10)
name = "judicial blast"
layer = ABOVE_ALL_MOB_LAYER
@@ -196,7 +196,7 @@
L.visible_message("Strange energy flows into [L]'s [I.name]!", \
"Your [I.name] shields you from [src]!")
continue
- L.Knockdown(15) //knocks down briefly when exploding
+ L.DefaultCombatKnockdown(15) //knocks down briefly when exploding
if(!iscultist(L))
L.visible_message("[L] is struck by a judicial explosion!", \
"[!issilicon(L) ? "An unseen force slams you into the ground!" : "ERROR: Motor servos disabled by external source!"]")
diff --git a/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm b/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm
index 1158b02a4c..98b3c32b0f 100644
--- a/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm
@@ -57,5 +57,5 @@
L.confused = min(L.confused + 15, 50)
L.dizziness = min(L.dizziness + 15, 50)
if(L.confused >= 25)
- L.Knockdown(FLOOR(L.confused * 0.8, 1))
+ L.DefaultCombatKnockdown(FLOOR(L.confused * 0.8, 1))
take_damage(max_integrity)
diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
index 2f0db73bfc..a4b19f2d40 100644
--- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
@@ -22,7 +22,7 @@
if(buckled_mobs && LAZYLEN(buckled_mobs))
var/mob/living/L = buckled_mobs[1]
if(iscarbon(L))
- L.Knockdown(100)
+ L.DefaultCombatKnockdown(100)
L.visible_message("[L] is maimed as the skewer shatters while still in [L.p_their()] body!")
L.adjustBruteLoss(15)
unbuckle_mob(L)
@@ -117,6 +117,6 @@
return
skewee.visible_message("[skewee] comes free of [src] with a squelching pop!", \
"You come free of [src]!")
- skewee.Knockdown(30)
+ skewee.DefaultCombatKnockdown(30)
playsound(skewee, 'sound/misc/desceration-03.ogg', 50, TRUE)
unbuckle_mob(skewee)
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 636061783e..9a086b75a2 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -446,7 +446,7 @@
var/atom/throw_target = get_edge_target_turf(L, user.dir)
L.throw_at(throw_target, 7, 1, user)
else if(!iscultist(L))
- L.Knockdown(160)
+ L.DefaultCombatKnockdown(160)
L.adjustStaminaLoss(140) //Ensures hard stamcrit
L.flash_act(1,1)
if(issilicon(target))
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index f14aeede9a..3dc199b56d 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -46,10 +46,11 @@
/obj/item/melee/cultblade/Initialize()
. = ..()
AddComponent(/datum/component/butchering, 40, 100)
+ AddElement(/datum/element/sword_point)
/obj/item/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user)
if(!iscultist(user))
- user.Knockdown(100)
+ user.DefaultCombatKnockdown(100)
user.dropItemToGround(src, TRUE)
user.visible_message("A powerful force shoves [user] away from [target]!", \
"\"You shouldn't play with sharp things. You'll poke someone's eye out.\"")
@@ -148,7 +149,7 @@
user.emote("scream")
user.apply_damage(30, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
user.dropItemToGround(src, TRUE)
- user.Knockdown(50)
+ user.DefaultCombatKnockdown(50)
return
force = initial(force)
jaunt.Grant(user, src)
@@ -405,7 +406,7 @@
to_chat(user, "An overwhelming sense of nausea overpowers you!")
user.dropItemToGround(src, TRUE)
user.Dizzy(30)
- user.Knockdown(100)
+ user.DefaultCombatKnockdown(100)
else
to_chat(user, "\"Trying to use things you don't own is bad, you know.\"")
to_chat(user, "The armor squeezes at your body!")
@@ -457,7 +458,7 @@
to_chat(user, "An overwhelming sense of nausea overpowers you!")
user.dropItemToGround(src, TRUE)
user.Dizzy(30)
- user.Knockdown(100)
+ user.DefaultCombatKnockdown(100)
else
to_chat(user, "\"Trying to use things you don't own is bad, you know.\"")
to_chat(user, "The robes squeeze at your body!")
@@ -478,7 +479,7 @@
to_chat(user, "\"You want to be blind, do you?\"")
user.dropItemToGround(src, TRUE)
user.Dizzy(30)
- user.Knockdown(100)
+ user.DefaultCombatKnockdown(100)
user.blind_eyes(30)
/obj/item/reagent_containers/glass/beaker/unholywater
@@ -499,7 +500,7 @@
/obj/item/shuttle_curse/attack_self(mob/living/user)
if(!iscultist(user))
user.dropItemToGround(src, TRUE)
- user.Knockdown(100)
+ user.DefaultCombatKnockdown(100)
to_chat(user, "A powerful force shoves you away from [src]!")
return
if(curselimit > 1)
@@ -705,10 +706,10 @@
if(is_servant_of_ratvar(L))
to_chat(L, "\"Kneel for me, scum\"")
L.confused += CLAMP(10 - L.confused, 0, 5) //confuses and lightly knockdowns + damages hostile cultists instead of hardstunning like before
- L.Knockdown(15)
+ L.DefaultCombatKnockdown(15)
L.adjustBruteLoss(10)
else
- L.Knockdown(50)
+ L.DefaultCombatKnockdown(50)
break_spear(T)
else
..()
@@ -843,7 +844,7 @@
INVOKE_ASYNC(src, .proc/pewpew, user, params)
var/obj/structure/emergency_shield/invoker/N = new(user.loc)
if(do_after(user, 90, target = user))
- user.Knockdown(40)
+ user.DefaultCombatKnockdown(40)
to_chat(user, "You have exhausted the power of this spell!")
firing = FALSE
if(N)
@@ -908,7 +909,7 @@
else
var/mob/living/L = target
if(L.density)
- L.Knockdown(20)
+ L.DefaultCombatKnockdown(20)
L.adjustBruteLoss(45)
playsound(L, 'sound/hallucinations/wail.ogg', 50, 1)
L.emote("scream")
@@ -944,7 +945,7 @@
T.visible_message("The sheer force from [P] shatters the mirror shield!")
new /obj/effect/temp_visual/cult/sparks(T)
playsound(T, 'sound/effects/glassbr3.ogg', 100)
- owner.Knockdown(25)
+ owner.DefaultCombatKnockdown(25)
qdel(src)
return FALSE
if(P.is_reflectable)
@@ -1001,9 +1002,9 @@
else if(!..())
if(!L.anti_magic_check())
if(is_servant_of_ratvar(L))
- L.Knockdown(60)
+ L.DefaultCombatKnockdown(60)
else
- L.Knockdown(30)
+ L.DefaultCombatKnockdown(30)
if(D.thrower)
for(var/mob/living/Next in orange(2, T))
if(!Next.density || iscultist(Next))
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index 0111334748..3d27fa942b 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -219,7 +219,7 @@ structure_check() searches for nearby cultist structures required for the invoca
L.visible_message("[L]'s eyes glow a defiant yellow!", \
"\"Stop resisting. You will be mi-\"\n\
\"Give up and you will feel pain unlike anything you've ever felt!\"")
- L.Knockdown(80)
+ L.DefaultCombatKnockdown(80)
else if(is_convertable)
do_convert(L, invokers)
else
@@ -908,7 +908,7 @@ structure_check() searches for nearby cultist structures required for the invoca
if(affecting.key)
affecting.visible_message("[affecting] slowly relaxes, the glow around [affecting.p_them()] dimming.", \
"You are re-united with your physical form. [src] releases its hold over you.")
- affecting.Knockdown(40)
+ affecting.DefaultCombatKnockdown(40)
break
if(affecting.health <= 10)
to_chat(G, "Your body can no longer sustain the connection!")
@@ -970,7 +970,7 @@ structure_check() searches for nearby cultist structures required for the invoca
playsound(T, 'sound/magic/enter_blood.ogg', 100, 1)
visible_message("A colossal shockwave of energy bursts from the rune, disintegrating it in the process!")
for(var/mob/living/L in range(src, 3))
- L.Knockdown(30)
+ L.DefaultCombatKnockdown(30)
empulse(T, 0.42*(intensity), 1)
var/list/images = list()
var/zmatch = T.z
diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm
index 951fe4e18a..84920eba00 100644
--- a/code/modules/antagonists/devil/devil.dm
+++ b/code/modules/antagonists/devil/devil.dm
@@ -477,7 +477,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
if(SOULVALUE >= ARCH_THRESHOLD && ascendable)
A.convert_to_archdevil()
else
- throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection")
+ CRASH("Unable to find a blobstart landmark for hellish resurrection")
/datum/antagonist/devil/proc/update_hud()
diff --git a/code/modules/antagonists/devil/devil_helpers.dm b/code/modules/antagonists/devil/devil_helpers.dm
index 4d0a781570..d3445eac0f 100644
--- a/code/modules/antagonists/devil/devil_helpers.dm
+++ b/code/modules/antagonists/devil/devil_helpers.dm
@@ -32,7 +32,7 @@
if(BANE_HARVEST)
if(istype(weapon, /obj/item/reagent_containers/food/snacks/grown/))
visible_message("The spirits of the harvest aid in the exorcism.", "The harvest spirits are harming you.")
- Knockdown(40)
+ DefaultCombatKnockdown(40)
qdel(weapon)
return 2
return 1
\ No newline at end of file
diff --git a/code/modules/antagonists/ninja/ninja.dm b/code/modules/antagonists/ninja/ninja.dm
index 12bdbec77a..133bd5ab6a 100644
--- a/code/modules/antagonists/ninja/ninja.dm
+++ b/code/modules/antagonists/ninja/ninja.dm
@@ -70,16 +70,10 @@
O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm."
objectives += O
if(4) //flavor
- if(helping_station)
- var/datum/objective/flavor/ninja_helping/O = new /datum/objective/flavor/ninja_helping
- O.owner = owner
- O.forge_objective()
- objectives += O
- else
- var/datum/objective/flavor/ninja_syndie/O = new /datum/objective/flavor/ninja_helping
- O.owner = owner
- O.forge_objective()
- objectives += O
+ var/datum/objective/flavor/O = helping_station ? new /datum/objective/flavor/ninja_helping : new /datum/objective/flavor/ninja_syndie
+ O.owner = owner
+ O.forge_objective()
+ objectives += O
else
break
var/datum/objective/O = new /datum/objective/survive()
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index 0d815703c5..c6c29a385b 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -178,23 +178,22 @@
else
return NUKE_OFF_UNLOCKED
-/obj/machinery/nuclearbomb/update_icon()
- if(deconstruction_state == NUKESTATE_INTACT)
- switch(get_nuke_state())
- if(NUKE_OFF_LOCKED, NUKE_OFF_UNLOCKED)
- icon_state = "nuclearbomb_base"
- update_icon_interior()
- update_icon_lights()
- if(NUKE_ON_TIMING)
- cut_overlays()
- icon_state = "nuclearbomb_timing"
- if(NUKE_ON_EXPLODING)
- cut_overlays()
- icon_state = "nuclearbomb_exploding"
- else
+/obj/machinery/nuclearbomb/update_icon_state()
+ if(deconstruction_state != NUKESTATE_INTACT)
icon_state = "nuclearbomb_base"
- update_icon_interior()
- update_icon_lights()
+ return
+ switch(get_nuke_state())
+ if(NUKE_OFF_LOCKED, NUKE_OFF_UNLOCKED)
+ icon_state = "nuclearbomb_base"
+ if(NUKE_ON_TIMING)
+ icon_state = "nuclearbomb_timing"
+ if(NUKE_ON_EXPLODING)
+ icon_state = "nuclearbomb_exploding"
+
+/obj/machinery/nuclearbomb/update_overlays()
+ . = ..()
+ update_icon_interior()
+ update_icon_lights()
/obj/machinery/nuclearbomb/proc/update_icon_interior()
cut_overlay(interior)
diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm
index 99d12972d8..92852c6c7f 100644
--- a/code/modules/antagonists/swarmer/swarmer.dm
+++ b/code/modules/antagonists/swarmer/swarmer.dm
@@ -191,7 +191,7 @@
return 0
/obj/item/IntegrateAmount() //returns the amount of resources gained when eating this item
- if(custom_materials[getmaterialref(/datum/material/iron)] || custom_materials[getmaterialref(/datum/material/glass)])
+ if(custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)] || custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)])
return 1
return ..()
@@ -586,7 +586,7 @@
playsound(loc,'sound/effects/snap.ogg',50, 1, -1)
L.electrocute_act(0, src, 1, 1, 1)
if(iscyborg(L))
- L.Knockdown(100)
+ L.DefaultCombatKnockdown(100)
qdel(src)
..()
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index 492da73e66..74cfc61d0f 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -261,7 +261,7 @@
GiveHint(target)
else if(is_pointed(I))
to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_selected)]!")
- target.Knockdown(40)
+ target.DefaultCombatKnockdown(40)
GiveHint(target)
else if(istype(I, /obj/item/bikehorn))
to_chat(target, "HONK")
@@ -377,7 +377,10 @@
/obj/item/warpwhistle/proc/end_effect(mob/living/carbon/user)
user.invisibility = initial(user.invisibility)
user.status_flags &= ~GODMODE
- user.canmove = TRUE
+ REMOVE_TRAIT(user, TRAIT_MOBILITY_NOMOVE, src)
+ REMOVE_TRAIT(user, TRAIT_MOBILITY_NOUSE, src)
+ REMOVE_TRAIT(user, TRAIT_MOBILITY_NOPICKUP, src)
+ user.update_mobility()
/obj/item/warpwhistle/attack_self(mob/living/carbon/user)
if(!istype(user) || on_cooldown)
@@ -390,7 +393,10 @@
on_cooldown = TRUE
last_user = user
playsound(T,'sound/magic/warpwhistle.ogg', 200, 1)
- user.canmove = FALSE
+ ADD_TRAIT(user, TRAIT_MOBILITY_NOMOVE, src)
+ ADD_TRAIT(user, TRAIT_MOBILITY_NOUSE, src)
+ ADD_TRAIT(user, TRAIT_MOBILITY_NOPICKUP, src)
+ user.update_mobility()
new /obj/effect/temp_visual/tornado(T)
sleep(20)
if(interrupted(user))
@@ -412,7 +418,6 @@
return
if(T.z != potential_T.z || abs(get_dist_euclidian(potential_T,T)) > 50 - breakout)
do_teleport(user, potential_T, channel = TELEPORT_CHANNEL_MAGIC)
- user.canmove = 0
T = potential_T
break
breakout += 1
diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm
index 962c2b2da4..0f43dfaf3a 100644
--- a/code/modules/antagonists/wizard/equipment/soulstone.dm
+++ b/code/modules/antagonists/wizard/equipment/soulstone.dm
@@ -83,8 +83,8 @@
/obj/item/soulstone/proc/release_shades(mob/user)
for(var/mob/living/simple_animal/shade/A in src)
A.status_flags &= ~GODMODE
- A.canmove = TRUE
A.forceMove(get_turf(user))
+ A.mobility_flags = MOBILITY_FLAGS_DEFAULT
A.cancel_camera()
icon_state = "soulstone"
name = initial(name)
@@ -173,7 +173,7 @@
else
T.forceMove(src) //put shade in stone
T.status_flags |= GODMODE
- T.canmove = FALSE
+ T.mobility_flags = NONE
T.health = T.maxHealth
icon_state = "soulstone2"
name = "soulstone: Shade of [T.real_name]"
@@ -240,8 +240,8 @@
T.dust_animation()
QDEL_IN(T, 5)
var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade(src)
- S.status_flags |= GODMODE //So they won't die inside the stone somehow
- S.canmove = FALSE//Can't move out of the soul stone
+ S.status_flags |= GODMODE //So they won't die inside the stone somehow
+ S.mobility_flags = NONE //Can't move out of the soul stone
S.name = "Shade of [T.real_name]"
S.real_name = "Shade of [T.real_name]"
T.transfer_ckey(S)
diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm
index b6afc3cc0b..13ea317b9b 100644
--- a/code/modules/assembly/flash.dm
+++ b/code/modules/assembly/flash.dm
@@ -150,7 +150,7 @@
var/mob/living/silicon/robot/R = M
log_combat(user, R, "flashed", src)
update_icon(1)
- R.Knockdown(rand(80,120))
+ R.DefaultCombatKnockdown(rand(80,120))
var/diff = 5 * CONFUSION_STACK_MAX_MULTIPLIER - M.confused
R.confused += min(5, diff)
R.flash_act(affect_silicon = 1)
@@ -197,14 +197,13 @@
else
to_chat(user, "This mind seems resistant to the flash!")
-
/obj/item/assembly/flash/cyborg
/obj/item/assembly/flash/cyborg/attack(mob/living/M, mob/user)
. = ..()
new /obj/effect/temp_visual/borgflash(get_turf(src))
- if(. && !CONFIG_GET(flag/disable_borg_flash_knockdown) && iscarbon(M) && !M.resting && !M.get_eye_protection())
- M.Knockdown(80)
+ if(. && !CONFIG_GET(flag/disable_borg_flash_knockdown) && iscarbon(M) && CHECK_MOBILITY(M, MOBILITY_STAND) && !M.get_eye_protection())
+ M.DefaultCombatKnockdown(80)
/obj/item/assembly/flash/cyborg/attack_self(mob/user)
..()
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index c701e13a26..90d4662c15 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -48,7 +48,7 @@
if("feet")
if(!H.shoes || !(H.shoes.body_parts_covered & FEET))
affecting = H.get_bodypart(pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
- H.Knockdown(60)
+ H.DefaultCombatKnockdown(60)
if(BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND)
if(!H.gloves)
affecting = H.get_bodypart(type)
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 0904808f51..864edfdbe6 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -314,10 +314,6 @@
user.forceMove(loc)
user.visible_message("You hear something squeezing through the ducts...", "You climb out the ventilation system.")
- user.canmove = FALSE
- addtimer(VARSET_CALLBACK(user, canmove, TRUE), 1)
-
-
/obj/machinery/atmospherics/AltClick(mob/living/L)
if(is_type_in_typecache(src, GLOB.ventcrawl_machinery))
return L.handle_ventcrawl(src)
diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm
index 86e8863b2b..a79beca4ec 100644
--- a/code/modules/atmospherics/machinery/components/components_base.dm
+++ b/code/modules/atmospherics/machinery/components/components_base.dm
@@ -144,7 +144,7 @@
for(var/i in 1 to device_type)
var/datum/pipeline/parent = parents[i]
if(!parent)
- throw EXCEPTION("Component is missing a pipenet! Rebuilding...")
+ stack_trace("Component is missing a pipenet! Rebuilding...")
build_network()
parent.update = 1
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 1e8cce32c0..e013a86fd2 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -244,7 +244,7 @@
M.forceMove(get_turf(src))
if(isliving(M))
var/mob/living/L = M
- L.update_canmove()
+ L.update_mobility()
occupant = null
update_icon()
@@ -277,10 +277,10 @@
else
. += "[src] seems empty."
-/obj/machinery/atmospherics/components/unary/cryo_cell/MouseDrop_T(mob/target, mob/user)
- if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser())
+/obj/machinery/atmospherics/components/unary/cryo_cell/MouseDrop_T(mob/living/carbon/target, mob/user)
+ if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !istype(target) || !user.IsAdvancedToolUser())
return
- if (target.IsKnockdown() || target.IsStun() || target.IsSleeping() || target.IsUnconscious())
+ if(!CHECK_MOBILITY(target, MOBILITY_MOVE))
close_machine(target)
else
user.visible_message("[user] starts shoving [target] inside [src].", "You start shoving [target] inside [src].")
diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm
index a9d3b25d90..675cbb2be0 100644
--- a/code/modules/cargo/exports/materials.dm
+++ b/code/modules/cargo/exports/materials.dm
@@ -15,10 +15,10 @@
if(!isitem(O))
return 0
var/obj/item/I = O
- if(!(getmaterialref(material_id) in I.custom_materials))
+ if(!(SSmaterials.GetMaterialRef(material_id) in I.custom_materials))
return 0
- var/amount = I.custom_materials[getmaterialref(material_id)]
+ var/amount = I.custom_materials[SSmaterials.GetMaterialRef(material_id)]
if(istype(I, /obj/item/stack/ore))
amount *= 0.8 // Station's ore redemption equipment is really goddamn good.
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 793a72c1f7..d5f2ae35ed 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -123,7 +123,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"has_cock" = FALSE,
"cock_shape" = "Human",
"cock_length" = 6,
- "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF,
+ "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF,
"cock_color" = "fff",
"has_sheath" = FALSE,
"sheath_color" = "fff",
@@ -1474,8 +1474,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
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", features["flavor_text"], MAX_FAVOR_LEN, TRUE)
- if(msg)
- features["flavor_text"] = msg
+ if(!isnull(msg))
+ features["flavor_text"] = html_decode(msg)
if("hair")
var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference","#"+hair_color) as color|null
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 03c6051c5d..86148ee17c 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -415,7 +415,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_cock_shape"] >> features["cock_shape"]
S["feature_cock_color"] >> features["cock_color"]
S["feature_cock_length"] >> features["cock_length"]
- S["feature_cock_girth"] >> features["cock_girth"]
+ S["feature_cock_diameter"] >> features["cock_diameter"]
S["feature_has_sheath"] >> features["sheath_color"]
//balls features
S["feature_has_balls"] >> features["has_balls"]
diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm
index 255a5a2eec..cae9a54484 100644
--- a/code/modules/client/verbs/suicide.dm
+++ b/code/modules/client/verbs/suicide.dm
@@ -224,7 +224,7 @@
/mob/living/carbon/canSuicide()
if(!..())
return
- if(IsStun() || IsKnockdown()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide
+ if(!CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_MOVE|MOBILITY_USE)) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide
to_chat(src, "You can't commit suicide while stunned! ((You can type Ghost instead however.))")
return
if(restrained())
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 50e458a224..e176943aa9 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -243,7 +243,7 @@
icon_state = "knight_greyscale"
item_state = "knight_greyscale"
armor = list("melee" = 35, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40)
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR //Can change color and add prefix
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix
/obj/item/clothing/head/helmet/skull
name = "skull helmet"
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index 1acb7628a3..59747d59ba 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -58,6 +58,12 @@
/obj/item/clothing/shoes/magboots/advance/debug/Initialize()
attack_self(src)
+/obj/item/clothing/shoes/magboots/paramedic
+ desc = "A pair of magboots decked in colors matching the equipment of an emergency medical technician."
+ name = "paramedic magboots"
+ icon_state = "para_magboots0"
+ magboot_state = "para_magboots"
+
/obj/item/clothing/shoes/magboots/syndie
desc = "Reverse-engineered magnetic boots that have a heavy magnetic pull. Property of Gorlex Marauders."
name = "blood-red magboots"
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index a8387c5ccc..3d06fba285 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -221,7 +221,7 @@
if(user.wear_suit == src)
if(hard_landing)
user.electrocute_act(35, src, safety = 1)
- user.Knockdown(200)
+ user.DefaultCombatKnockdown(200)
if(!silent)
to_chat(user, "\nroot@ChronosuitMK4# chronowalk4 --stop\n")
if(camera)
diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm
index 04aacfc3f5..2f9ded7848 100644
--- a/code/modules/clothing/spacesuits/flightsuit.dm
+++ b/code/modules/clothing/spacesuits/flightsuit.dm
@@ -481,7 +481,7 @@
adjust_momentum(0, 0, 10)
wearer.visible_message("[wearer]'s flight suit crashes into the ground!")
if(knockdown)
- wearer.Knockdown(80)
+ wearer.DefaultCombatKnockdown(80)
momentum_x = 0
momentum_y = 0
calculate_momentum_speed()
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index fab41c9876..d9e4f17649 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -455,6 +455,18 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS
+/obj/item/clothing/head/helmet/space/hardsuit/medical/equipped(mob/living/carbon/human/user, slot)
+ ..()
+ if (slot == SLOT_HEAD)
+ var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
+ DHUD.add_hud_to(user)
+
+/obj/item/clothing/head/helmet/space/hardsuit/medical/dropped(mob/living/carbon/human/user)
+ ..()
+ if (user.head == src)
+ var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
+ DHUD.remove_hud_from(user)
+
/obj/item/clothing/suit/space/hardsuit/medical
icon_state = "hardsuit-medical"
name = "medical hardsuit"
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index f9e35ca37f..8c39427c49 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -465,3 +465,16 @@ Contains:
torn = TRUE
playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1)
playsound(loc, 'sound/effects/refill.ogg', 50, 1)
+
+/obj/item/clothing/suit/space/eva/paramedic
+ name = "paramedic EVA suit"
+ icon_state = "paramedic-eva"
+ item_state = "paramedic-eva"
+ desc = "A deep blue space suit decorated with red and white crosses to indicate that the wearer is trained emergency medical personnel."
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/roller)
+
+/obj/item/clothing/head/helmet/space/eva/paramedic
+ name = "paramedic EVA helmet"
+ desc = "A deep blue space helmet with a large red cross on the faceplate to designate the wearer as trained emergency medical personnel."
+ icon_state = "paramedic-eva-helmet"
+ item_state = "paramedic-eva-helmet"
\ No newline at end of file
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 1f0214cade..3b84a227ef 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -267,7 +267,7 @@
icon_state = "knight_greyscale"
item_state = "knight_greyscale"
armor = list("melee" = 35, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 10, "rad" = 10, "fire" = 40, "acid" = 40)
- material_flags = MATERIAL_ADD_PREFIX //Can change color and add prefix
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix
/obj/item/clothing/suit/armor/vest/durathread
name = "makeshift vest"
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 48fd8ccf1c..efadb8a035 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -195,3 +195,18 @@
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEEARS
mutantrace_variation = STYLE_MUZZLE
+
+
+//Paramedic
+
+/obj/item/clothing/suit/toggle/labcoat/paramedic
+ name = "paramedic vest"
+ desc = "A dark blue vest with reflective strips for emergency medical technicians."
+ icon_state = "paramedic-vest"
+ item_state = "paramedic-vest"
+
+/obj/item/clothing/suit/toggle/labcoat/emt
+ name = "emt vest"
+ desc = "A dark blue vest with reflective strips for emergency medical technicians."
+ icon_state = "labcoat_emt"
+ item_state = "labcoat_emt"
\ No newline at end of file
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index 022bc7c95c..195712b814 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -37,12 +37,6 @@
icon_state = "labcoat_cmo"
item_state = "labcoat_cmo"
-/obj/item/clothing/suit/toggle/labcoat/emt
- name = "\improper EMT's jacket"
- desc = "A dark blue jacket with reflective strips for emergency medical technicians."
- icon_state = "labcoat_emt"
- item_state = "labcoat_cmo"
-
/obj/item/clothing/suit/toggle/labcoat/mad
name = "\proper The Mad's labcoat"
desc = "It makes you look capable of konking someone on the noggin and shooting them into space."
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 4d3e8acb28..6f61bf56cb 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -480,8 +480,6 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
allowed = list(/obj/item/clothing/mask/facehugger/toy)
-
-
// WINTER COATS
/obj/item/clothing/suit/hooded/wintercoat
@@ -521,6 +519,7 @@
/obj/item/clothing/suit/hooded/wintercoat/captain
name = "captain's winter coat"
+ desc = "A luxuriant winter coat, stuffed with the down of the endangered Uka bird and trimmed with genuine sable. The fabric is an indulgently soft micro-fiber, and the deep ultramarine color is only one that could be achieved with minute amounts of crystalline bluespace dust woven into the thread between the plectrums. Extremely lavish, and extremely durable. The tiny flakes of protective material make it nothing short of extremely light lamellar armor."
icon_state = "coatcaptain"
item_state = "coatcaptain"
armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
@@ -531,20 +530,24 @@
allowed = GLOB.security_wintercoat_allowed
/obj/item/clothing/head/hooded/winterhood/captain
+ desc = "A blue and yellow hood attached to a heavy winter jacket."
icon_state = "winterhood_captain"
/obj/item/clothing/suit/hooded/wintercoat/hop
name = "head of personnel's winter coat"
+ desc = "A cozy winter coat, covered in thick fur. The breast features a proud yellow chevron, reminding everyone that you're the second banana."
icon_state = "coathop"
item_state = "coathop"
armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 5, "rad" = 0, "fire" = 0, "acid" = 5)
hoodtype = /obj/item/clothing/head/hooded/winterhood/hop
/obj/item/clothing/head/hooded/winterhood/hop
+ desc = "A cozy winter hood attached to a heavy winter jacket."
icon_state = "winterhood_hop"
/obj/item/clothing/suit/hooded/wintercoat/security
name = "security winter coat"
+ desc = "A red, armor-padded winter coat. It glitters with a mild ablative coating and a robust air of authority. The zipper tab is a pair of jingly little handcuffs and got annoying after the first ten seconds."
icon_state = "coatsecurity"
item_state = "coatsecurity"
armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45)
@@ -555,10 +558,12 @@
allowed = GLOB.security_wintercoat_allowed
/obj/item/clothing/head/hooded/winterhood/security
+ desc = "A red, armor-padded winter hood."
icon_state = "winterhood_security"
/obj/item/clothing/suit/hooded/wintercoat/hos
name = "head of security's winter coat"
+ desc = "A red, armor-padded winter coat, lovingly woven with a Kevlar interleave and reinforced with semi-ablative polymers and a silver azide fill material. The zipper tab looks like a tiny replica of Beepsky."
icon_state = "coathos"
item_state = "coathos"
armor = list("melee" = 35, "bullet" = 35, "laser" = 35, "energy" = 15, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 55)
@@ -569,10 +574,12 @@
allowed = GLOB.security_wintercoat_allowed
/obj/item/clothing/head/hooded/winterhood/hos
+ desc = "A red, armor-padded winter hood, lovingly woven with a Kevlar interleave. Definitely not bulletproof, especially not the part where your face goes."
icon_state = "winterhood_hos"
/obj/item/clothing/suit/hooded/wintercoat/medical
name = "medical winter coat"
+ desc = "An arctic white winter coat with a small blue caduceus instead of a plastic zipper tab. Snazzy."
icon_state = "coatmedical"
item_state = "coatmedical"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
@@ -580,10 +587,12 @@
hoodtype = /obj/item/clothing/head/hooded/winterhood/medical
/obj/item/clothing/head/hooded/winterhood/medical
+ desc = "A white winter coat hood."
icon_state = "winterhood_medical"
/obj/item/clothing/suit/hooded/wintercoat/cmo
name = "chief medical officer's winter coat"
+ desc = "An arctic white winter coat with a small blue caduceus instead of a plastic zipper tab. The normal liner is replaced with an exceptionally thick, soft layer of fur."
icon_state = "coatcmo"
item_state = "coatcmo"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
@@ -591,10 +600,12 @@
hoodtype = /obj/item/clothing/head/hooded/winterhood/cmo
/obj/item/clothing/head/hooded/winterhood/cmo
+ desc = "A white winter coat hood."
icon_state = "winterhood_cmo"
/obj/item/clothing/suit/hooded/wintercoat/chemistry
name = "chemistry winter coat"
+ desc = "A lab-grade winter coat made with acid resistant polymers. For the enterprising chemist who was exiled to a frozen wasteland on the go."
icon_state = "coatchemistry"
item_state = "coatchemistry"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
@@ -602,10 +613,12 @@
hoodtype = /obj/item/clothing/head/hooded/winterhood/chemistry
/obj/item/clothing/head/hooded/winterhood/chemistry
+ desc = "A white winter coat hood."
icon_state = "winterhood_chemistry"
/obj/item/clothing/suit/hooded/wintercoat/viro
name = "virology winter coat"
+ desc = "A white winter coat with green markings. Warm, but wont fight off the common cold or any other disease. Might make people stand far away from you in the hallway. The zipper tab looks like an oversized bacteriophage."
icon_state = "coatviro"
item_state = "coatviro"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
@@ -613,10 +626,12 @@
hoodtype = /obj/item/clothing/head/hooded/winterhood/viro
/obj/item/clothing/head/hooded/winterhood/viro
+ desc = "A white winter coat hood with green markings."
icon_state = "winterhood_viro"
/obj/item/clothing/suit/hooded/wintercoat/science
name = "science winter coat"
+ desc = "A white winter coat with an outdated atomic model instead of a plastic zipper tab."
icon_state = "coatscience"
item_state = "coatscience"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
@@ -624,10 +639,12 @@
hoodtype = /obj/item/clothing/head/hooded/winterhood/science
/obj/item/clothing/head/hooded/winterhood/science
+ desc = "A white winter coat hood. This one will keep your brain warm. About as much as the others, really."
icon_state = "winterhood_science"
/obj/item/clothing/suit/hooded/wintercoat/robotics
name = "robotics winter coat"
+ desc = "A black winter coat with a badass flaming robotic skull for the zipper tab. This one has bright red designs and a few useless buttons."
icon_state = "coatrobotics"
item_state = "coatrobotics"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/screwdriver, /obj/item/crowbar, /obj/item/wrench, /obj/item/stack/cable_coil, /obj/item/weldingtool, /obj/item/multitool)
@@ -635,20 +652,24 @@
hoodtype = /obj/item/clothing/head/hooded/winterhood/robotics
/obj/item/clothing/head/hooded/winterhood/robotics
+ desc = "A black winter coat hood. You can pull it down over your eyes and pretend that you're an outdated, late 1980s interpretation of a futuristic mechanized police force. They'll fix you. They fix everything."
icon_state = "winterhood_robotics"
/obj/item/clothing/suit/hooded/wintercoat/genetics
name = "genetics winter coat"
+ desc = "A white winter coat with a DNA helix for the zipper tab. "
icon_state = "coatgenetics"
item_state = "coatgenetics"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
hoodtype = /obj/item/clothing/head/hooded/winterhood/genetics
/obj/item/clothing/head/hooded/winterhood/genetics
+ desc = "A white winter coat hood. It's warm."
icon_state = "winterhood_genetics"
/obj/item/clothing/suit/hooded/wintercoat/rd
name = "research director's winter coat"
+ desc = "A thick arctic winter coat with an outdated atomic model instead of a plastic zipper tab. Most in the know are heavily aware that Bohr's model of the atom was outdated by the time of the 1930s when the Heisenbergian and Schrodinger models were generally accepted for true. Nevertheless, we still see its use in anachronism, roleplaying, and, in this case, as a zipper tab. At least it should keep you warm on your ivory pillar."
icon_state = "coatrd"
item_state = "coatrd"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
@@ -656,10 +677,12 @@
hoodtype = /obj/item/clothing/head/hooded/winterhood/rd
/obj/item/clothing/head/hooded/winterhood/rd
+ desc = "A white winter coat hood. It smells faintly of hair gel."
icon_state = "winterhood_rd"
/obj/item/clothing/suit/hooded/wintercoat/ce
name = "chief engineer's winter coat"
+ desc = "A white winter coat with reflective green and yellow stripes. Stuffed with asbestos, treated with fire retardant PBDE, lined with a micro thin sheet of lead foil and snugly fitted to your body's measurements. This baby's ready to save you from anything except the thyroid cancer and systemic fibrosis you'll get from wearing it. The zipper tab is a tiny golden wrench."
icon_state = "coatce"
item_state = "coatce"
armor = list("melee" = 0, "bullet" = 0, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 30, "fire" = 35, "acid" = 45)
@@ -667,10 +690,12 @@
hoodtype = /obj/item/clothing/head/hooded/winterhood/ce
/obj/item/clothing/head/hooded/winterhood/ce
+ desc = "A white winter coat hood. Feels surprisingly heavy. The tag says that it's not child safe."
icon_state = "winterhood_ce"
/obj/item/clothing/suit/hooded/wintercoat/engineering
name = "engineering winter coat"
+ desc = "A surprisingly heavy yellow winter coat with reflective orange stripes. It has a small wrench for its zipper tab, and the inside layer is covered with a radiation-resistant silver-nylon blend. Because you're worth it."
icon_state = "coatengineer"
item_state = "coatengineer"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45)
@@ -678,29 +703,35 @@
hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering
/obj/item/clothing/head/hooded/winterhood/engineering
+ desc = "A yellow winter coat hood. Definitely not a replacement for a hard hat."
icon_state = "winterhood_engineer"
/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos
name = "atmospherics winter coat"
+ desc = "A yellow and blue winter coat. The zipper pull-tab is made to look like a miniature breath mask."
icon_state = "coatatmos"
item_state = "coatatmos"
hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering/atmos
/obj/item/clothing/head/hooded/winterhood/engineering/atmos
+ desc = "A yellow and blue winter coat hood."
icon_state = "winterhood_atmos"
/obj/item/clothing/suit/hooded/wintercoat/hydro
name = "hydroponics winter coat"
+ desc = "A green and blue winter coat. The zipper tab looks like the flower from a member of Rosa Hesperrhodos, a pretty pink-and-white rose. The colors absolutely clash."
icon_state = "coathydro"
item_state = "coathydro"
allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants, /obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro
/obj/item/clothing/head/hooded/winterhood/hydro
+ desc = "A green winter coat hood."
icon_state = "winterhood_hydro"
/obj/item/clothing/suit/hooded/wintercoat/cosmic
name = "cosmic winter coat"
+ desc = "A starry winter coat that even glows softly."
icon_state = "coatcosmic"
item_state = "coatcosmic"
hoodtype = /obj/item/clothing/head/hooded/winterhood/cosmic
@@ -708,48 +739,58 @@
light_range = 1.2
/obj/item/clothing/head/hooded/winterhood/cosmic
+ desc = "A starry winter hood."
icon_state = "winterhood_cosmic"
/obj/item/clothing/suit/hooded/wintercoat/janitor
name = "janitors winter coat"
+ desc = "A purple-and-beige winter coat that smells of space cleaner."
icon_state = "coatjanitor"
item_state = "coatjanitor"
allowed = list(/obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter,/obj/item/grenade/chem_grenade,/obj/item/lightreplacer,/obj/item/flashlight,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/spray,/obj/item/soap,/obj/item/holosign_creator,/obj/item/key/janitor,/obj/item/melee/flyswatter,/obj/item/paint/paint_remover,/obj/item/storage/bag/trash,/obj/item/reagent_containers/glass/bucket)
hoodtype = /obj/item/clothing/head/hooded/winterhood/janitor
/obj/item/clothing/head/hooded/winterhood/janitor
+ desc = "A purple hood that smells of space cleaner."
icon_state = "winterhood_janitor"
/obj/item/clothing/suit/hooded/wintercoat/cargo
name = "cargo winter coat"
+ desc = "A tan-and-grey winter coat that has a crate for its zipper pull tab. It fills you with the warmth of a fierce independence."
icon_state = "coatcargo"
item_state = "coatcargo"
hoodtype = /obj/item/clothing/head/hooded/winterhood/cargo
/obj/item/clothing/head/hooded/winterhood/cargo
+ desc = "A grey hood for a winter coat."
icon_state = "winterhood_cargo"
/obj/item/clothing/suit/hooded/wintercoat/qm
name = "quartermaster's winter coat"
+ desc = "A dark brown winter coat that has a golden crate pin for its zipper pully."
icon_state = "coatqm"
item_state = "coatqm"
hoodtype = /obj/item/clothing/head/hooded/winterhood/qm
/obj/item/clothing/head/hooded/winterhood/qm
+ desc = "A dark brown winter hood"
icon_state = "winterhood_qm"
/obj/item/clothing/suit/hooded/wintercoat/aformal
name = "assistant's formal winter coat"
+ desc = "A black button up winter coat."
icon_state = "coataformal"
item_state = "coataformal"
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter,/obj/item/clothing/gloves/color/yellow)
hoodtype = /obj/item/clothing/head/hooded/winterhood/aformal
/obj/item/clothing/head/hooded/winterhood/aformal
+ desc = "A black winter coat hood."
icon_state = "winterhood_aformal"
/obj/item/clothing/suit/hooded/wintercoat/miner
name = "mining winter coat"
+ desc = "A dusty button up winter coat. The zipper tab looks like a tiny pickaxe."
icon_state = "coatminer"
item_state = "coatminer"
allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
@@ -757,10 +798,12 @@
hoodtype = /obj/item/clothing/head/hooded/winterhood/miner
/obj/item/clothing/head/hooded/winterhood/miner
+ desc = "A dusty winter coat hood."
icon_state = "winterhood_miner"
/obj/item/clothing/suit/hooded/wintercoat/ratvar
name = "ratvarian winter coat"
+ desc = "A brass-plated button up winter coat. Instead of a zipper tab, it has a brass cog with a tiny red gemstone inset."
icon_state = "coatratvar"
item_state = "coatratvar"
armor = list("melee" = 30, "bullet" = 45, "laser" = -10, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60)
@@ -770,6 +813,7 @@
/obj/item/clothing/head/hooded/winterhood/ratvar
icon_state = "winterhood_ratvar"
+ desc = "A brass-plated winter hood that glows softly, hinting at its divinity."
light_range = 3
light_power = 1
light_color = "#B18B25" //clockwork slab background top color
@@ -788,6 +832,7 @@
/obj/item/clothing/suit/hooded/wintercoat/narsie
name = "narsian winter coat"
+ desc = "A somber button-up in tones of grey entropy and a wicked crimson zipper. When pulled all the way up, the zipper looks like a bloody gash. The zipper pull looks like a single drop of blood."
icon_state = "coatnarsie"
item_state = "coatnarsie"
armor = list("melee" = 30, "bullet" = 20, "laser" = 30,"energy" = 10, "bomb" = 30, "bio" = 10, "rad" = 10, "fire" = 30, "acid" = 30)
@@ -808,10 +853,12 @@
user.adjustBruteLoss(rand(10,16))
/obj/item/clothing/head/hooded/winterhood/narsie
+ desc = "A black winter hood full of whispering secrets that only She shall ever know."
icon_state = "winterhood_narsie"
/obj/item/clothing/suit/hooded/wintercoat/ratvar/fake
name = "brass winter coat"
+ desc = "A brass-plated button up winter coat. Instead of a zipper tab, it has a brass cog with a tiny red piece of plastic as an inset."
icon_state = "coatratvar"
item_state = "coatratvar"
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
@@ -820,6 +867,7 @@
/obj/item/clothing/suit/hooded/wintercoat/narsie/fake
name = "runed winter coat"
+ desc = "A dusty button up winter coat in the tones of oblivion and ash. The zipper pull looks like a single drop of blood."
icon_state = "coatnarsie"
item_state = "coatnarsie"
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
@@ -842,7 +890,6 @@
icon_state = "winterhood_durathread"
armor = list("melee" = 20, "bullet" = 8, "laser" = 15, "energy" = 8, "bomb" = 25, "bio" = 10, "rad" = 15, "fire" = 75, "acid" = 37)
-
/obj/item/clothing/suit/spookyghost
name = "spooky ghost"
desc = "This is obviously just a bedsheet, but maybe try it on?"
diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm
index dff62dd2c3..87e7098ebd 100644
--- a/code/modules/clothing/suits/reactive_armour.dm
+++ b/code/modules/clothing/suits/reactive_armour.dm
@@ -252,7 +252,7 @@
return
owner.visible_message("The reactive teleport system flings [H] clear of [attack_text] and slams [H.p_them()] into a fabricated table!")
owner.visible_message("[H] GOES ON THE TABLE!!!")
- owner.Knockdown(40)
+ owner.DefaultCombatKnockdown(40)
var/list/turfs = new/list()
for(var/turf/T in orange(tele_range, H))
if(T.density)
diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm
index 6952a581da..3f31fb4717 100644
--- a/code/modules/clothing/under/jobs/medsci.dm
+++ b/code/modules/clothing/under/jobs/medsci.dm
@@ -158,6 +158,37 @@
can_adjust = FALSE
fitted = FEMALE_UNIFORM_TOP
+/obj/item/clothing/under/rank/medical/paramedic
+ desc = "It's made of a special fiber that provides minor protection against biohazards. It has a white cross on the chest denoting that the wearer is a trained paramedic."
+ name = "paramedic jumpsuit"
+ icon_state = "paramedic-dark"
+ item_state = "w_suit"
+ item_color = "paramedic-dark"
+ permeability_coefficient = 0.5
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
+ can_adjust = FALSE
+
+/obj/item/clothing/under/rank/medical/paramedic/light
+ desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic."
+ icon_state = "paramedic-light"
+ item_color = "paramedic-light"
+ can_adjust = TRUE
+
+/obj/item/clothing/under/rank/medical/paramedic/skirt
+ name = "paramedic jumpskirt"
+ desc = "It's made of a special fiber that provides minor protection against biohazards. It has a white cross on the chest denoting that the wearer is a trained paramedic."
+ icon_state = "paramedic-dark_skirt"
+ item_state = "w_suit"
+ item_color = "paramedic-dark_skirt"
+ body_parts_covered = CHEST|GROIN|ARMS
+ can_adjust = FALSE
+ fitted = FEMALE_UNIFORM_TOP
+
+/obj/item/clothing/under/rank/medical/paramedic/skirt/light
+ desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic."
+ icon_state = "paramedic_skirt"
+ item_color = "paramedic_skirt"
+
/obj/item/clothing/under/rank/nursesuit
desc = "It's a jumpsuit commonly worn by nursing staff in the medical department."
name = "nurse's suit"
@@ -169,6 +200,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = NO_FEMALE_UNIFORM
can_adjust = FALSE
+
/obj/item/clothing/under/rank/medical
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel."
name = "medical doctor's jumpsuit"
@@ -177,18 +209,21 @@
item_color = "medical"
permeability_coefficient = 0.5
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
+
/obj/item/clothing/under/rank/medical/blue
name = "blue medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue."
icon_state = "scrubsblue"
item_color = "scrubsblue"
can_adjust = FALSE
+
/obj/item/clothing/under/rank/medical/green
name = "green medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green."
icon_state = "scrubsgreen"
item_color = "scrubsgreen"
can_adjust = FALSE
+
/obj/item/clothing/under/rank/medical/purple
name = "purple medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple."
@@ -204,4 +239,4 @@
item_color = "medical_skirt"
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
- fitted = FEMALE_UNIFORM_TOP
+ fitted = FEMALE_UNIFORM_TOP
\ No newline at end of file
diff --git a/code/modules/clothing/under/trek.dm b/code/modules/clothing/under/trek.dm
index 9564d03909..20852dbe62 100644
--- a/code/modules/clothing/under/trek.dm
+++ b/code/modules/clothing/under/trek.dm
@@ -19,7 +19,6 @@
icon_state = "trek_engsec"
item_color = "trek_engsec"
item_state = "r_suit"
- armor = list("melee" = 10, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) //more sec than eng, but w/e.
strip_delay = 50
/obj/item/clothing/under/trek/medsci
@@ -69,4 +68,4 @@
desc = "Something about it feels off..."
icon_state = "trek_Q"
item_color = "trek_Q"
- item_state = "r_suit"
\ No newline at end of file
+ item_state = "r_suit"
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index 7df089d49c..68c5d8c5c8 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -63,7 +63,7 @@
else
D = new virus_type()
else
- D = new /datum/disease/advance/random(max_severity, max_severity)
+ D = new /datum/disease/advance/random(TRUE, max_severity, max_severity)
D.carrier = TRUE
H.ForceContractDisease(D, FALSE, TRUE)
diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm
index 96b6cded58..2d39e4270a 100644
--- a/code/modules/events/sentience.dm
+++ b/code/modules/events/sentience.dm
@@ -24,7 +24,7 @@
/datum/round_event/ghost_role/sentience/spawn_role()
var/list/mob/dead/observer/candidates
- candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN)
+ candidates = get_candidates(ROLE_SENTIENCE, null, ROLE_SENTIENCE)
// find our chosen mob to breathe life into
// Mobs have to be simple animals, mindless and on station
diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm
index 67e96455f0..b82cd91323 100644
--- a/code/modules/events/wizard/departmentrevolt.dm
+++ b/code/modules/events/wizard/departmentrevolt.dm
@@ -19,7 +19,7 @@
jobs_to_revolt = list("Assistant")
nation_name = pick("Assa", "Mainte", "Tunnel", "Gris", "Grey", "Liath", "Grigio", "Ass", "Assi")
if("white")
- jobs_to_revolt = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist")
+ jobs_to_revolt = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Paramedic", "Virologist")
nation_name = pick("Mede", "Healtha", "Recova", "Chemi", "Geneti", "Viro", "Psych")
if("yellow")
jobs_to_revolt = list("Chief Engineer", "Station Engineer", "Atmospheric Technician")
diff --git a/code/modules/fields/peaceborg_dampener.dm b/code/modules/fields/peaceborg_dampener.dm
index 79bd866fca..13a2bc0135 100644
--- a/code/modules/fields/peaceborg_dampener.dm
+++ b/code/modules/fields/peaceborg_dampener.dm
@@ -42,7 +42,7 @@
if(R.has_buckled_mobs())
for(var/mob/living/L in R.buckled_mobs)
L.visible_message("[L] is knocked off of [R] by the charge in [R]'s chassis induced by [name]!") //I know it's bad.
- L.Knockdown(10)
+ L.DefaultCombatKnockdown(10)
R.unbuckle_mob(L)
do_sparks(5, 0, L)
..()
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index b0c3121c67..ea475b28d6 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -220,8 +220,8 @@ GLOBAL_LIST_INIT(hallucination_list, list(
/obj/effect/hallucination/simple/xeno/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
update_icon("alienh_pounce")
- if(hit_atom == target && target.stat!=DEAD)
- target.Knockdown(100)
+ if(hit_atom == target && target.stat != DEAD)
+ target.DefaultCombatKnockdown(100)
target.visible_message("[target] flails around wildly.","[name] pounces on you!")
/datum/hallucination/xeno_attack
@@ -308,7 +308,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
shake_camera(target, 2, 1)
if(bubblegum.Adjacent(target) && !charged)
charged = TRUE
- target.Knockdown(80)
+ target.DefaultCombatKnockdown(80)
target.adjustStaminaLoss(40)
step_away(target, bubblegum)
shake_camera(target, 4, 3)
@@ -1106,7 +1106,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
if(istype(target, /obj/effect/dummy/phased_mob))
return
to_chat(target, "You fall into the chasm!")
- target.Knockdown(40)
+ target.DefaultCombatKnockdown(40)
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, target, "It's surprisingly shallow."), 15)
QDEL_IN(src, 30)
@@ -1245,7 +1245,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
/datum/hallucination/shock/proc/shock_drop()
target.jitteriness = max(target.jitteriness - 990, 10) //Still jittery, but vastly less
- target.Knockdown(60)
+ target.DefaultCombatKnockdown(60)
/datum/hallucination/husks
@@ -1318,7 +1318,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
"[G] grabs your wrist and violently wrenches it to the side!")
C.emote("scream")
C.dropItemToGround(C.get_active_held_item())
- C.Knockdown(60)
+ C.DefaultCombatKnockdown(60)
else
to_chat(C,"[G] violently grabs you!")
qdel(src)
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index 07026e79de..b38250e39d 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -51,7 +51,7 @@
head_attack_message = " on the head"
//Knockdown the target for the duration that we calculated and divide it by 5.
if(armor_duration)
- target.Knockdown(min(armor_duration, 200)) // Never knockdown more than a flash!
+ target.DefaultCombatKnockdown(min(armor_duration, 200)) // Never knockdown more than a flash!
//Display an attack message.
if(target != user)
diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm
index bb37ec9b5d..f2253ee760 100644
--- a/code/modules/food_and_drinks/food/snacks_cake.dm
+++ b/code/modules/food_and_drinks/food/snacks_cake.dm
@@ -85,6 +85,20 @@
tastes = list("cake" = 4, "cream cheese" = 3)
foodtype = GRAIN | DAIRY
+/obj/item/reagent_containers/food/snacks/store/cake/brioche
+ name = "brioche cake"
+ desc = "A ring of sweet, glazed buns."
+ icon_state = "briochecake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/brioche
+ slices_num = 6
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2)
+
+/obj/item/reagent_containers/food/snacks/cakeslice/brioche
+ name = "brioche cake slice"
+ desc = "Delicious sweet-bread. Who needs anything else?"
+ icon_state = "briochecake_slice"
+ filling_color = "#FFD700"
+
/obj/item/reagent_containers/food/snacks/cakeslice/cheese
name = "cheese cake slice"
desc = "Slice of pure cheestisfaction."
@@ -375,7 +389,7 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake
/obj/item/reagent_containers/food/snacks/cakeslice/peach_slice
name = "peach cake slice"
desc = "A slice of peach cake."
- icon_state = "peach_slice"
+ icon_state = "peachcake_slice"
filling_color = "#00FFFF"
tastes = list("cake" = 1, "sugar" = 1, "peachjuice" = 10)
foodtype = GRAIN | SUGAR | DAIRY
@@ -396,4 +410,4 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake
icon_state = "trumpetcakeslice"
filling_color = "#7A3D80"
tastes = list("cake" = 4, "violets" = 2, "jam" = 2)
- foodtype = GRAIN | DAIRY | FRUIT | SUGAR
\ No newline at end of file
+ foodtype = GRAIN | DAIRY | FRUIT | SUGAR
diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm
index c65e42c0e4..0f2856c090 100644
--- a/code/modules/food_and_drinks/food/snacks_egg.dm
+++ b/code/modules/food_and_drinks/food/snacks_egg.dm
@@ -101,7 +101,7 @@
desc = "A fried egg with a side of bacon. Delicious!"
icon_state = "baconegg"
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
- bitesize = 1
+ bitesize = 2
filling_color = "#FFFFF0"
tastes = list("egg" = 2, "bacon" = 2, "salt" = 1, "pepper" = 1)
foodtype = MEAT | FRIED | BREAKFAST
@@ -151,8 +151,17 @@
desc = "There is only one egg on this, how rude."
icon_state = "benedict"
bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 4)
- trash = /obj/item/trash/plate
w_class = WEIGHT_CLASS_NORMAL
+ trash = /obj/item/trash/plate
list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 4)
tastes = list("egg" = 1, "bacon" = 1, "bun" = 1)
foodtype = MEAT | BREAKFAST
+
+/obj/item/reagent_containers/food/snacks/scotchegg
+ name = "scotch egg"
+ desc = "A boiled egg wrapped in a delicious, seasoned meatball."
+ icon_state = "scotchegg"
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
+ bitesize = 3
+ filling_color = "#FFFFF0"
+ list_reagents = list(/datum/reagent/consumable/nutriment = 6)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index 5103418e6b..83a03ed2d9 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -225,7 +225,7 @@
if(iscarbon(M))
M.visible_message("[src] bursts out of [M]!")
M.emote("scream")
- M.Knockdown(40)
+ M.DefaultCombatKnockdown(40)
M.adjustBruteLoss(60)
Expand()
return ..()
@@ -325,7 +325,7 @@
/obj/item/reagent_containers/food/snacks/corndog
name = "corndog plate"
desc = "A plate with two small corn dogs, with two dimples of ketchup and mustard to dip them in."
- icon_state = "dorndog"
+ icon_state = "corndog"
trash = /obj/item/trash/plate/alt
tastes = list("hotdog" = 2, "mustard and ketchup" = 1, "fryed bread" = 1)
bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/mustard = 5, /datum/reagent/consumable/ketchup = 5)
@@ -359,4 +359,4 @@
list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/bbqsauce = 5)
bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
tastes = list("meat" = 3, "smokey sauce" = 1)
- foodtype = MEAT
\ No newline at end of file
+ foodtype = MEAT
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index a7090a5274..7dc2188100 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -674,3 +674,26 @@
if (7000 to INFINITY)
burn()
..()
+
+//Easter Stuff
+
+/obj/item/reagent_containers/food/snacks/chocolatebunny
+ name = "chocolate bunny"
+ desc = "Contains less than 10% real rabbit!"
+ icon_state = "chocolatebunny"
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/coco = 2)
+ filling_color = "#A0522D"
+
+/obj/item/reagent_containers/food/snacks/soup/mammi
+ name = "Mammi"
+ desc = "A bowl of mushy bread and milk. It reminds you, not too fondly, of a bowel movement."
+ icon_state = "mammi"
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
+ list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1)
+
+/obj/item/reagent_containers/food/snacks/hotcrossbun
+ bitesize = 2
+ name = "hot-cross bun"
+ desc = "The Cross represents the Assistants that died for your sins."
+ icon_state = "hotcrossbun"
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm
index 1533f067ab..b3ad6b5126 100644
--- a/code/modules/food_and_drinks/food/snacks_pie.dm
+++ b/code/modules/food_and_drinks/food/snacks_pie.dm
@@ -49,7 +49,7 @@
else
creamoverlay.icon_state = "creampie_human"
if(stunning)
- H.Knockdown(20) //splat!
+ H.DefaultCombatKnockdown(20) //splat!
H.adjust_blurriness(1)
H.visible_message("[H] is creamed by [src]!", "You've been creamed by [src]!")
playsound(H, "desceration", 50, TRUE)
@@ -83,7 +83,7 @@
A.throw_at(T, 1, 1)
M.visible_message("[src] bursts out of [M]!")
M.emote("scream")
- M.Knockdown(40)
+ M.DefaultCombatKnockdown(40)
M.adjustBruteLoss(60)
return ..()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index f3b8e466f3..1215dd7ecb 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -152,6 +152,6 @@ God bless America.
reagents.reaction(C, TOUCH)
C.apply_damage(min(30, reagents.total_volume), BURN, BODY_ZONE_HEAD)
reagents.remove_any((reagents.total_volume/2))
- C.Knockdown(60)
+ C.DefaultCombatKnockdown(60)
user.changeNext_move(CLICK_CD_MELEE)
return ..()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index eddd1bdc3f..24dd99e5e0 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -310,7 +310,7 @@
for(var/obj/item/O in ingredients)
O.microwave_act(src)
if(O.custom_materials?.len)
- metal += O.custom_materials[getmaterialref(/datum/material/iron)]
+ metal += O.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]
if(metal)
spark()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
index b81c127523..3fa188fb94 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -132,7 +132,8 @@
set name = "Eject Contents"
set src in oview(1)
- if(usr.stat || !usr.canmove || usr.restrained())
+ var/mob/living/L = usr
+ if(!istype(L) || !CHECK_MOBILITY(L, MOBILITY_USE))
return
empty()
add_fingerprint(usr)
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index c94118ddf1..59b2e7838a 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -591,7 +591,7 @@
results = list(/datum/reagent/consumable/ethanol/cogchamp = 3)
required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/fuel = 1, /datum/reagent/consumable/ethanol/screwdrivercocktail = 1)
mix_message = "You hear faint sounds of gears turning as it mixes."
- mix_sound = 'sound/effects/clockcult_gateway_closing.ogg'
+ mix_sound = 'sound/machines/clockcult/steam_whoosh.ogg'
/datum/chemical_reaction/quadruplesec
name = "Quadruple Sec"
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
index e572cc76ff..c3890b28eb 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
@@ -3,36 +3,6 @@
////////////////////////////////////////////////BREAD////////////////////////////////////////////////
-/datum/crafting_recipe/food/meatbread
- name = "Meat bread"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
- /obj/item/reagent_containers/food/snacks/meat/cutlet/plain = 3,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 3
- )
- result = /obj/item/reagent_containers/food/snacks/store/bread/meat
- subcategory = CAT_BREAD
-
-/datum/crafting_recipe/food/xenomeatbread
- name = "Xenomeat bread"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
- /obj/item/reagent_containers/food/snacks/meat/cutlet/xeno = 3,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 3
- )
- result = /obj/item/reagent_containers/food/snacks/store/bread/xenomeat
- subcategory = CAT_BREAD
-
-/datum/crafting_recipe/food/spidermeatbread
- name = "Spidermeat bread"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
- /obj/item/reagent_containers/food/snacks/meat/cutlet/spider = 3,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 3
- )
- result = /obj/item/reagent_containers/food/snacks/store/bread/spidermeat
- subcategory = CAT_BREAD
-
/datum/crafting_recipe/food/banananutbread
name = "Banana nut bread"
reqs = list(
@@ -44,16 +14,6 @@
result = /obj/item/reagent_containers/food/snacks/store/bread/banana
subcategory = CAT_BREAD
-/datum/crafting_recipe/food/tofubread
- name = "Tofu bread"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
- /obj/item/reagent_containers/food/snacks/tofu = 3,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 3
- )
- result = /obj/item/reagent_containers/food/snacks/store/bread/tofu
- subcategory = CAT_BREAD
-
/datum/crafting_recipe/food/creamcheesebread
name = "Cream cheese bread"
reqs = list(
@@ -64,6 +24,16 @@
result = /obj/item/reagent_containers/food/snacks/store/bread/creamcheese
subcategory = CAT_BREAD
+/datum/crafting_recipe/food/meatbread
+ name = "Meat bread"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/meat/cutlet/plain = 3,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 3
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/bread/meat
+ subcategory = CAT_BREAD
+
/datum/crafting_recipe/food/mimanabread
name = "Mimana bread"
reqs = list(
@@ -75,6 +45,38 @@
result = /obj/item/reagent_containers/food/snacks/store/bread/mimana
subcategory = CAT_BREAD
+/datum/crafting_recipe/food/spidermeatbread
+ name = "Spidermeat bread"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/meat/cutlet/spider = 3,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 3
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/bread/spidermeat
+ subcategory = CAT_BREAD
+
+/datum/crafting_recipe/food/tofubread
+ name = "Tofu bread"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/tofu = 3,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 3
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/bread/tofu
+ subcategory = CAT_BREAD
+
+/datum/crafting_recipe/food/xenomeatbread
+ name = "Xenomeat bread"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/meat/cutlet/xeno = 3,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 3
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/bread/xenomeat
+ subcategory = CAT_BREAD
+
+////////////////////////////////////////////////TOAST////////////////////////////////////////////////
+
/datum/crafting_recipe/food/butteredtoast
name = "Buttered Toast"
reqs = list(
@@ -84,6 +86,45 @@
result = /obj/item/reagent_containers/food/snacks/butteredtoast
subcategory = CAT_BREAD
+/datum/crafting_recipe/food/slimetoast
+ name = "Slime toast"
+ reqs = list(
+ /datum/reagent/toxin/slimejelly = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/jelliedtoast/slime
+ subcategory = CAT_BREAD
+
+/datum/crafting_recipe/food/jelliedtoast
+ name = "Jellied toast"
+ reqs = list(
+ /datum/reagent/consumable/cherryjelly = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry
+ subcategory = CAT_BREAD
+
+/datum/crafting_recipe/food/peanutbuttertoast
+ name = "Peanut butter toast"
+ reqs = list(
+ /datum/reagent/consumable/peanut_butter = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/peanut_buttertoast
+ subcategory = CAT_BREAD
+
+////////////////////////////////////////////////MISC////////////////////////////////////////////////
+
+/datum/crafting_recipe/food/baguette
+ name = "Baguette"
+ time = 40
+ reqs = list(/datum/reagent/consumable/sodiumchloride = 1,
+ /datum/reagent/consumable/blackpepper = 1,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/baguette
+ subcategory = CAT_BREAD
+
/datum/crafting_recipe/food/butterbiscuit
name = "Butter Biscuit"
reqs = list(
@@ -100,4 +141,13 @@
/obj/item/reagent_containers/food/snacks/butter = 3,
)
result = /obj/item/reagent_containers/food/snacks/butterdog
+ subcategory = CAT_BREAD
+
+/datum/crafting_recipe/food/twobread
+ name = "Two bread"
+ reqs = list(
+ /datum/reagent/consumable/ethanol/wine = 5,
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/twobread
subcategory = CAT_BREAD
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
index ffa8709245..cf96c01e7b 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
@@ -1,8 +1,74 @@
// see code/module/crafting/table.dm
-////////////////////////////////////////////////BURGERS////////////////////////////////////////////////
+////////////////////////////////////////////////STANDARD BURGS////////////////////////////////////////////////
+/datum/crafting_recipe/food/burger
+ name = "Burger"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/steak/plain = 1,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+
+ result = /obj/item/reagent_containers/food/snacks/burger/plain
+ subcategory = CAT_BURGER
+
+/datum/crafting_recipe/food/baconburger
+ name = "Bacon Burger"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/bacon = 3,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+
+ result = /obj/item/reagent_containers/food/snacks/burger/baconburger
+ subcategory = CAT_BURGER
+
+/datum/crafting_recipe/food/bigbiteburger
+ name = "Big bite burger"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/steak/plain = 3,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 2,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/burger/bigbite
+ subcategory = CAT_BURGER
+
+/datum/crafting_recipe/food/superbiteburger
+ name = "Super bite burger"
+ reqs = list(
+ /datum/reagent/consumable/sodiumchloride = 5,
+ /datum/reagent/consumable/blackpepper = 5,
+ /obj/item/reagent_containers/food/snacks/meat/steak/plain = 5,
+ /obj/item/reagent_containers/food/snacks/grown/tomato = 4,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 3,
+ /obj/item/reagent_containers/food/snacks/boiledegg = 1,
+ /obj/item/reagent_containers/food/snacks/meat/bacon = 1,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+
+ )
+ result = /obj/item/reagent_containers/food/snacks/burger/superbite
+ subcategory = CAT_BURGER
+
+/datum/crafting_recipe/food/cheeseburger
+ name = "Cheese Burger"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/steak/plain = 1,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/burger/cheese
+ subcategory = CAT_BURGER
+
+/datum/crafting_recipe/food/corgiburger
+ name = "Corgi burger"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/slab/corgi = 1,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+
+ result = /obj/item/reagent_containers/food/snacks/burger/corgi
+ subcategory = CAT_BURGER
/datum/crafting_recipe/food/humanburger
name = "Human burger"
@@ -16,26 +82,37 @@
result = /obj/item/reagent_containers/food/snacks/burger/human
subcategory = CAT_BURGER
-/datum/crafting_recipe/food/burger
- name = "Burger"
+/datum/crafting_recipe/food/ribburger
+ name = "McRib"
reqs = list(
- /obj/item/reagent_containers/food/snacks/meat/steak/plain = 1,
+ /obj/item/reagent_containers/food/snacks/bbqribs = 1, //The sauce is already included in the ribs
+ /obj/item/reagent_containers/food/snacks/onion_slice = 1, //feel free to remove if too burdensome.
/obj/item/reagent_containers/food/snacks/bun = 1
)
-
- result = /obj/item/reagent_containers/food/snacks/burger/plain
+ result = /obj/item/reagent_containers/food/snacks/burger/rib
subcategory = CAT_BURGER
-/datum/crafting_recipe/food/corgiburger
- name = "Corgi burger"
+/datum/crafting_recipe/food/mcguffin
+ name = "McGuffin"
reqs = list(
- /obj/item/reagent_containers/food/snacks/meat/slab/corgi = 1,
+ /obj/item/reagent_containers/food/snacks/friedegg = 1,
+ /obj/item/reagent_containers/food/snacks/meat/bacon = 2,
/obj/item/reagent_containers/food/snacks/bun = 1
)
-
- result = /obj/item/reagent_containers/food/snacks/burger/corgi
+ result = /obj/item/reagent_containers/food/snacks/burger/mcguffin
subcategory = CAT_BURGER
+/datum/crafting_recipe/food/tofuburger
+ name = "Tofu burger"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/tofu = 1,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/burger/tofu
+ subcategory = CAT_BURGER
+
+///////////////EXOTIC//////////////////
+
/datum/crafting_recipe/food/appendixburger
name = "Appendix burger"
reqs = list(
@@ -54,15 +131,6 @@
result = /obj/item/reagent_containers/food/snacks/burger/brain
subcategory = CAT_BURGER
-/datum/crafting_recipe/food/xenoburger
- name = "Xeno burger"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/meat/steak/xeno = 1,
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/reagent_containers/food/snacks/burger/xeno
- subcategory = CAT_BURGER
-
/datum/crafting_recipe/food/bearger
name = "Bearger"
reqs = list(
@@ -72,6 +140,16 @@
result = /obj/item/reagent_containers/food/snacks/burger/bearger
subcategory = CAT_BURGER
+/datum/crafting_recipe/food/chickenburger
+ name = "Chicken Sandwich"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/steak/chicken = 1,
+ /datum/reagent/consumable/mayonnaise = 5,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/burger/chicken
+ subcategory = CAT_BURGER
+
/datum/crafting_recipe/food/fishburger
name = "Fish burger"
reqs = list(
@@ -82,25 +160,73 @@
result = /obj/item/reagent_containers/food/snacks/burger/fish
subcategory = CAT_BURGER
-/datum/crafting_recipe/food/tofuburger
- name = "Tofu burger"
+/datum/crafting_recipe/food/fivealarmburger
+ name = "Five alarm burger"
reqs = list(
- /obj/item/reagent_containers/food/snacks/tofu = 1,
- /obj/item/reagent_containers/food/snacks/bun = 1
+ /obj/item/reagent_containers/food/snacks/grown/ghost_chili = 2,
+ /obj/item/reagent_containers/food/snacks/meat/steak/plain = 1,
+ /obj/item/reagent_containers/food/snacks/bun = 1
)
- result = /obj/item/reagent_containers/food/snacks/burger/tofu
+ result = /obj/item/reagent_containers/food/snacks/burger/fivealarm
subcategory = CAT_BURGER
-/datum/crafting_recipe/food/ghostburger
- name = "Ghost burger"
+/datum/crafting_recipe/food/slimeburger
+ name = "Jelly burger"
reqs = list(
- /obj/item/ectoplasm = 1,
- /datum/reagent/consumable/sodiumchloride = 2,
+ /datum/reagent/toxin/slimejelly = 5,
/obj/item/reagent_containers/food/snacks/bun = 1
)
- result = /obj/item/reagent_containers/food/snacks/burger/ghost
+ result = /obj/item/reagent_containers/food/snacks/burger/jelly/slime
subcategory = CAT_BURGER
+/datum/crafting_recipe/food/jellyburger
+ name = "Jelly burger"
+ reqs = list(
+ /datum/reagent/consumable/cherryjelly = 5,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/burger/jelly/cherry
+ subcategory = CAT_BURGER
+
+/datum/crafting_recipe/food/baseballburger
+ name = "Home run baseball burger"
+ reqs = list(
+ /obj/item/melee/baseball_bat = 1,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/burger/baseball
+ subcategory = CAT_BURGER
+
+/datum/crafting_recipe/food/ratburger
+ name = "Rat burger"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/deadmouse = 1,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/burger/rat
+ subcategory = CAT_BURGER
+
+/datum/crafting_recipe/food/soylentburger
+ name = "Soylent Burger"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/soylentgreen = 1, //two full meats worth.
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 2,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/burger/soylent
+ subcategory = CAT_BURGER
+
+/datum/crafting_recipe/food/xenoburger
+ name = "Xeno burger"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/steak/xeno = 1,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/burger/xeno
+ subcategory = CAT_BURGER
+
+////////////MYSTICAL////////////////
+
/datum/crafting_recipe/food/clownburger
name = "Clown burger"
reqs = list(
@@ -119,6 +245,35 @@
result = /obj/item/reagent_containers/food/snacks/burger/mime
subcategory = CAT_BURGER
+/datum/crafting_recipe/food/ghostburger
+ name = "Ghost burger"
+ reqs = list(
+ /obj/item/ectoplasm = 1,
+ /datum/reagent/consumable/sodiumchloride = 2,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/burger/ghost
+ subcategory = CAT_BURGER
+
+/datum/crafting_recipe/food/spellburger
+ name = "Spell burger"
+ reqs = list(
+ /obj/item/clothing/head/wizard/fake = 1,
+ )
+ result = /obj/item/reagent_containers/food/snacks/burger/spell
+ subcategory = CAT_BURGER
+
+/datum/crafting_recipe/food/spellburger2
+ name = "Spell burger"
+ reqs = list(
+ /obj/item/clothing/head/wizard = 1,
+ /obj/item/reagent_containers/food/snacks/bun = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/burger/spell
+ subcategory = CAT_BURGER
+
+////////////COLORED BURGERS//////////////
+
/datum/crafting_recipe/food/redburger
name = "Red burger"
reqs = list(
@@ -197,154 +352,4 @@
/obj/item/reagent_containers/food/snacks/bun = 1
)
result = /obj/item/reagent_containers/food/snacks/burger/white
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/spellburger
- name = "Spell burger"
- reqs = list(
- /obj/item/clothing/head/wizard/fake = 1,
- )
- result = /obj/item/reagent_containers/food/snacks/burger/spell
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/spellburger2
- name = "Spell burger"
- reqs = list(
- /obj/item/clothing/head/wizard = 1,
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/reagent_containers/food/snacks/burger/spell
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/bigbiteburger
- name = "Big bite burger"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/meat/steak/plain = 3,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 2,
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/reagent_containers/food/snacks/burger/bigbite
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/superbiteburger
- name = "Super bite burger"
- reqs = list(
- /datum/reagent/consumable/sodiumchloride = 5,
- /datum/reagent/consumable/blackpepper = 5,
- /obj/item/reagent_containers/food/snacks/meat/steak/plain = 5,
- /obj/item/reagent_containers/food/snacks/grown/tomato = 4,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 3,
- /obj/item/reagent_containers/food/snacks/boiledegg = 1,
- /obj/item/reagent_containers/food/snacks/meat/bacon = 1,
- /obj/item/reagent_containers/food/snacks/bun = 1
-
- )
- result = /obj/item/reagent_containers/food/snacks/burger/superbite
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/slimeburger
- name = "Jelly burger"
- reqs = list(
- /datum/reagent/toxin/slimejelly = 5,
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/reagent_containers/food/snacks/burger/jelly/slime
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/jellyburger
- name = "Jelly burger"
- reqs = list(
- /datum/reagent/consumable/cherryjelly = 5,
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/reagent_containers/food/snacks/burger/jelly/cherry
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/fivealarmburger
- name = "Five alarm burger"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/grown/ghost_chili = 2,
- /obj/item/reagent_containers/food/snacks/meat/steak/plain = 1,
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/reagent_containers/food/snacks/burger/fivealarm
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/ratburger
- name = "Rat burger"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/deadmouse = 1,
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/reagent_containers/food/snacks/burger/rat
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/baseballburger
- name = "Home run baseball burger"
- reqs = list(
- /obj/item/melee/baseball_bat = 1,
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/reagent_containers/food/snacks/burger/baseball
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/baconburger
- name = "Bacon Burger"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/meat/bacon = 3,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
-
- result = /obj/item/reagent_containers/food/snacks/burger/baconburger
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/cheeseburger
- name = "Cheese Burger"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/meat/steak/plain = 1,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/reagent_containers/food/snacks/burger/cheese
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/soylentburger
- name = "Soylent Burger"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/soylentgreen = 1, //two full meats worth.
- /obj/item/reagent_containers/food/snacks/cheesewedge = 2,
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/reagent_containers/food/snacks/burger/soylent
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/ribburger
- name = "McRib"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/bbqribs = 1, //The sauce is already included in the ribs
- /obj/item/reagent_containers/food/snacks/onion_slice = 1, //feel free to remove if too burdensome.
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/reagent_containers/food/snacks/burger/rib
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/mcguffin
- name = "McGuffin"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/friedegg = 1,
- /obj/item/reagent_containers/food/snacks/meat/bacon = 2,
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/reagent_containers/food/snacks/burger/mcguffin
- subcategory = CAT_BURGER
-
-/datum/crafting_recipe/food/chickenburger
- name = "Chicken Sandwich"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/meat/steak/chicken = 1,
- /datum/reagent/consumable/mayonnaise = 5,
- /obj/item/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/reagent_containers/food/snacks/burger/chicken
subcategory = CAT_BURGER
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
index f168896164..f6441210f6 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
@@ -1,7 +1,93 @@
// see code/module/crafting/table.dm
-////////////////////////////////////////////////CAKE////////////////////////////////////////////////
+////////////////////////////////////////////////FRUIT CAKE////////////////////////////////////////////////
+
+/datum/crafting_recipe/food/applecake
+ name = "Apple cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/apple = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/apple
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/bscccake
+ name = "Blackberry and strawberry chocolate cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 2,
+ /obj/item/reagent_containers/food/snacks/grown/berries = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/bscc
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/bscvcake
+ name = "Blackberry and strawberry vanilla cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/berries = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/bsvc
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/lemoncake
+ name = "Lemon cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/citrus/lemon = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/lemon
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/limecake
+ name = "Lime cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/citrus/lime = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/lime
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/orangecake
+ name = "Orange cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/citrus/orange = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/orange
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/peachcake
+ name = "Peach cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/peach = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/peach_cake
+ subcategory = CAT_CAKE
+
+///////////////////////////////////FANCY////////////////////////////////////////////
+
+/datum/crafting_recipe/food/birthdaycake
+ name = "Birthday cake"
+ reqs = list(
+ /datum/reagent/consumable/sugar = 5,
+ /datum/reagent/consumable/caramel =2,
+ /obj/item/candle = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/birthday
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/briochecake
+ name = "Brioche cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /datum/reagent/consumable/sugar = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/brioche
+ subcategory = CAT_CAKE
/datum/crafting_recipe/food/carrotcake
name = "Carrot cake"
@@ -21,42 +107,6 @@
result = /obj/item/reagent_containers/food/snacks/store/cake/cheese
subcategory = CAT_CAKE
-/datum/crafting_recipe/food/applecake
- name = "Apple cake"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/apple = 2
- )
- result = /obj/item/reagent_containers/food/snacks/store/cake/apple
- subcategory = CAT_CAKE
-
-/datum/crafting_recipe/food/orangecake
- name = "Orange cake"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/citrus/orange = 2
- )
- result = /obj/item/reagent_containers/food/snacks/store/cake/orange
- subcategory = CAT_CAKE
-
-/datum/crafting_recipe/food/limecake
- name = "Lime cake"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/citrus/lime = 2
- )
- result = /obj/item/reagent_containers/food/snacks/store/cake/lime
- subcategory = CAT_CAKE
-
-/datum/crafting_recipe/food/lemoncake
- name = "Lemon cake"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/citrus/lemon = 2
- )
- result = /obj/item/reagent_containers/food/snacks/store/cake/lemon
- subcategory = CAT_CAKE
-
/datum/crafting_recipe/food/chocolatecake
name = "Chocolate cake"
reqs = list(
@@ -66,35 +116,6 @@
result = /obj/item/reagent_containers/food/snacks/store/cake/chocolate
subcategory = CAT_CAKE
-/datum/crafting_recipe/food/birthdaycake
- name = "Birthday cake"
- reqs = list(
- /datum/reagent/consumable/sugar = 5,
- /datum/reagent/consumable/caramel =2,
- /obj/item/candle = 1,
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/store/cake/birthday
- subcategory = CAT_CAKE
-
-/datum/crafting_recipe/food/braincake
- name = "Brain cake"
- reqs = list(
- /obj/item/organ/brain = 1,
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/store/cake/brain
- subcategory = CAT_CAKE
-
-/datum/crafting_recipe/food/slimecake
- name = "Slime cake"
- reqs = list(
- /obj/item/slime_extract = 1,
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/store/cake/slimecake
- subcategory = CAT_CAKE
-
/datum/crafting_recipe/food/pumpkinspicecake
name = "Pumpkin spice cake"
reqs = list(
@@ -104,6 +125,26 @@
result = /obj/item/reagent_containers/food/snacks/store/cake/pumpkinspice
subcategory = CAT_CAKE
+/datum/crafting_recipe/food/poundcake
+ name = "Pound cake"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 4
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/pound_cake
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/vanillacake
+ name = "Vanilla cake"
+ always_availible = FALSE
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/vanillapod = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake
+ subcategory = CAT_CAKE
+
+/////////////SPECIAL////////////
+
/datum/crafting_recipe/food/holycake
name = "Angel food cake"
reqs = list(
@@ -113,12 +154,24 @@
result = /obj/item/reagent_containers/food/snacks/store/cake/holy_cake
subcategory = CAT_CAKE
-/datum/crafting_recipe/food/poundcake
- name = "Pound cake"
+/datum/crafting_recipe/food/braincake
+ name = "Brain cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 4
+ /obj/item/organ/brain = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/pound_cake
+ result = /obj/item/reagent_containers/food/snacks/store/cake/brain
+ subcategory = CAT_CAKE
+
+/datum/crafting_recipe/food/clowncake
+ name = "Clown cake"
+ always_availible = FALSE
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
+ /obj/item/reagent_containers/food/snacks/sundae = 2,
+ /obj/item/reagent_containers/food/snacks/grown/banana = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/store/cake/clown_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/hardwarecake
@@ -131,53 +184,13 @@
result = /obj/item/reagent_containers/food/snacks/store/cake/hardware_cake
subcategory = CAT_CAKE
-/datum/crafting_recipe/food/bscccake
- name = "blackberry and strawberry chocolate cake"
+/datum/crafting_recipe/food/slimecake
+ name = "Slime cake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
- /obj/item/reagent_containers/food/snacks/chocolatebar = 2,
- /obj/item/reagent_containers/food/snacks/grown/berries = 5
+ /obj/item/slime_extract = 1,
+ /obj/item/reagent_containers/food/snacks/store/cake/plain = 1
)
- result = /obj/item/reagent_containers/food/snacks/store/cake/bscc
- subcategory = CAT_CAKE
-
-/datum/crafting_recipe/food/bscvcake
- name = "blackberry and strawberry vanilla cake"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/berries = 5
- )
- result = /obj/item/reagent_containers/food/snacks/store/cake/bsvc
- subcategory = CAT_CAKE
-
-/datum/crafting_recipe/food/clowncake
- name = "clown cake"
- always_availible = FALSE
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
- /obj/item/reagent_containers/food/snacks/sundae = 2,
- /obj/item/reagent_containers/food/snacks/grown/banana = 5
- )
- result = /obj/item/reagent_containers/food/snacks/store/cake/clown_cake
- subcategory = CAT_CAKE
-
-/datum/crafting_recipe/food/vanillacake
- name = "vanilla cake"
- always_availible = FALSE
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/vanillapod = 2
- )
- result = /obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake
- subcategory = CAT_CAKE
-
-/datum/crafting_recipe/food/peachcake
- name = "Peach cake"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/peach = 5
- )
- result = /obj/item/reagent_containers/food/snacks/store/cake/peach_cake
+ result = /obj/item/reagent_containers/food/snacks/store/cake/slimecake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/trumpetcake
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm
new file mode 100644
index 0000000000..ac5576ac25
--- /dev/null
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm
@@ -0,0 +1,255 @@
+// see code/module/crafting/table.dm
+
+////////////////////////////////////////////////DONUTS////////////////////////////////////////////////
+
+/datum/crafting_recipe/food/donut
+ time = 15
+ name = "Donut"
+ reqs = list(
+ /datum/reagent/consumable/sugar = 1,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/plain
+ subcategory = CAT_DONUT
+
+/datum/crafting_recipe/food/donut/chaos
+ name = "Chaos donut"
+ reqs = list(
+ /datum/reagent/consumable/frostoil = 5,
+ /datum/reagent/consumable/capsaicin = 5,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/chaos
+
+datum/crafting_recipe/food/donut/meat
+ time = 15
+ name = "Meat donut"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/slab = 1,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/meat
+
+/datum/crafting_recipe/food/donut/jelly
+ name = "Jelly donut"
+ reqs = list(
+ /datum/reagent/consumable/berryjuice = 5,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/plain
+
+/datum/crafting_recipe/food/donut/slimejelly
+ name = "Slime jelly donut"
+ reqs = list(
+ /datum/reagent/toxin/slimejelly = 5,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain
+
+/datum/crafting_recipe/food/donut/glaze
+ time = 15
+ name = "glaze donut"
+ reqs = list(
+ /datum/reagent/consumable/sugar = 10,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/glaze
+ subcategory = CAT_DONUT
+
+/datum/crafting_recipe/food/donut/berry
+ name = "Berry Donut"
+ reqs = list(
+ /datum/reagent/consumable/berryjuice = 3,
+ /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/berry
+
+/datum/crafting_recipe/food/donut/trumpet
+ name = "Spaceman's Donut"
+ reqs = list(
+ /datum/reagent/medicine/polypyr = 3,
+ /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ )
+
+ result = /obj/item/reagent_containers/food/snacks/donut/trumpet
+
+/datum/crafting_recipe/food/donut/apple
+ name = "Apple Donut"
+ reqs = list(
+ /datum/reagent/consumable/applejuice = 3,
+ /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/apple
+
+/datum/crafting_recipe/food/donut/caramel
+ name = "Caramel Donut"
+ reqs = list(
+ /datum/reagent/consumable/caramel = 3,
+ /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/caramel
+
+/datum/crafting_recipe/food/donut/choco
+ name = "Chocolate Donut"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
+ /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/choco
+
+/datum/crafting_recipe/food/donut/blumpkin
+ name = "Blumpkin Donut"
+ reqs = list(
+ /datum/reagent/consumable/blumpkinjuice = 3,
+ /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/blumpkin
+
+/datum/crafting_recipe/food/donut/bungo
+ name = "Bungo Donut"
+ reqs = list(
+ /datum/reagent/consumable/bungojuice = 3,
+ /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/bungo
+
+/datum/crafting_recipe/food/donut/matcha
+ name = "Matcha Donut"
+ reqs = list(
+ /datum/reagent/toxin/teapowder = 3,
+ /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/matcha
+
+////////////////////////////////////////////////////JELLY DONUTS///////////////////////////////////////////////////////
+
+/datum/crafting_recipe/food/donut/jelly/apple
+ name = "Apple Jelly Donut"
+ reqs = list(
+ /datum/reagent/consumable/applejuice = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/apple
+
+/datum/crafting_recipe/food/donut/jelly/berry
+ name = "Berry Jelly Donut"
+ reqs = list(
+ /datum/reagent/consumable/berryjuice = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/berry
+
+/datum/crafting_recipe/food/donut/jelly/blumpkin
+ name = "Blumpkin Jelly Donut"
+ reqs = list(
+ /datum/reagent/consumable/blumpkinjuice = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/blumpkin
+
+/datum/crafting_recipe/food/donut/jelly/bungo
+ name = "Bungo Jelly Donut"
+ reqs = list(
+ /datum/reagent/consumable/bungojuice = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/bungo
+
+/datum/crafting_recipe/food/donut/jelly/caramel
+ name = "Caramel Jelly Donut"
+ reqs = list(
+ /datum/reagent/consumable/caramel = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/caramel
+
+/datum/crafting_recipe/food/donut/jelly/choco
+ name = "Chocolate Jelly Donut"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/choco
+
+/datum/crafting_recipe/food/donut/jelly/matcha
+ name = "Matcha Jelly Donut"
+ reqs = list(
+ /datum/reagent/toxin/teapowder = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/matcha
+
+/datum/crafting_recipe/food/donut/jelly/trumpet
+ name = "Spaceman's Jelly Donut"
+ reqs = list(
+ /datum/reagent/medicine/polypyr = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/trumpet
+
+////////////////////////////////////////////////////SLIME DONUTS///////////////////////////////////////////////////////
+
+/datum/crafting_recipe/food/donut/slimejelly/apple
+ name = "Apple Slime Donut"
+ reqs = list(
+ /datum/reagent/consumable/applejuice = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/apple
+
+/datum/crafting_recipe/food/donut/slimejelly/berry
+ name = "Berry Slime Donut"
+ reqs = list(
+ /datum/reagent/consumable/berryjuice = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/berry
+
+/datum/crafting_recipe/food/donut/slimejelly/blumpkin
+ name = "Blumpkin Slime Donut"
+ reqs = list(
+ /datum/reagent/consumable/blumpkinjuice = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/blumpkin
+
+/datum/crafting_recipe/food/donut/slimejelly/bungo
+ name = "Bungo Slime Donut"
+ reqs = list(
+ /datum/reagent/consumable/bungojuice = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/bungo
+
+/datum/crafting_recipe/food/donut/slimejelly/caramel
+ name = "Caramel Slime Donut"
+ reqs = list(
+ /datum/reagent/consumable/caramel = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/caramel
+
+/datum/crafting_recipe/food/donut/slimejelly/choco
+ name = "Chocolate Slime Donut"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/choco
+
+/datum/crafting_recipe/food/donut/slimejelly/trumpet
+ name = "Spaceman's Slime Donut"
+ reqs = list(
+ /datum/reagent/medicine/polypyr = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
+ )
+
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/trumpet
+
+/datum/crafting_recipe/food/donut/slimejelly/matcha
+ name = "Matcha Slime Donut"
+ reqs = list(
+ /datum/reagent/toxin/teapowder = 3,
+ /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/matcha
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
index c049cd7563..108307119d 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
@@ -59,4 +59,15 @@
/obj/item/reagent_containers/food/snacks/grown/corn = 1
)
result = /obj/item/reagent_containers/food/snacks/salad/eggbowl
+ subcategory = CAT_EGG
+
+/datum/crafting_recipe/food/scotchegg
+ name = "Scotch egg"
+ reqs = list(
+ /datum/reagent/consumable/sodiumchloride = 1,
+ /datum/reagent/consumable/blackpepper = 1,
+ /obj/item/reagent_containers/food/snacks/boiledegg = 1,
+ /obj/item/reagent_containers/food/snacks/faggot = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/scotchegg
subcategory = CAT_EGG
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
index e204b0c72c..6d443c99f0 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm
@@ -3,6 +3,64 @@
//Misc. Frozen.//
/////////////////
+/datum/crafting_recipe/food/banana_split
+ name = "Banana Split"
+ always_availible = FALSE
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/icecream = 3,
+ /obj/item/reagent_containers/food/snacks/grown/banana = 1,
+ /obj/item/reagent_containers/food/snacks/grown/cherries = 1,
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/banana_split
+ subcategory = CAT_ICE
+
+ /datum/crafting_recipe/food/bluecharrie_float
+ name = "Blue Cherry Shake"
+ always_availible = FALSE
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/icecream = 1,
+ /obj/item/reagent_containers/food/snacks/grown/bluecherries = 3,
+ /obj/item/reagent_containers/food/drinks/drinkingglass = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/bluecharrie_float
+ subcategory = CAT_ICE
+
+/datum/crafting_recipe/food/charrie_float
+ name = "Cherry Shake"
+ always_availible = FALSE
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/icecream = 1,
+ /obj/item/reagent_containers/food/snacks/grown/cherries = 3,
+ /obj/item/reagent_containers/food/drinks/drinkingglass = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/charrie_float
+ subcategory = CAT_ICE
+
+/datum/crafting_recipe/food/root_float
+ name = "Cola Float"
+ always_availible = FALSE
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/icecream = 1,
+ /obj/item/reagent_containers/food/snacks/grown/cherries = 1,
+ /datum/reagent/consumable/space_cola = 10,
+ /obj/item/reagent_containers/food/drinks/drinkingglass = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/cola_float
+ subcategory = CAT_ICE
+
+/datum/crafting_recipe/food/honkdae
+ name ="Honkdae"
+ reqs = list(
+ /datum/reagent/consumable/cream = 5,
+ /obj/item/clothing/mask/gas/clown_hat = 1,
+ /obj/item/reagent_containers/food/snacks/grown/cherries = 1,
+ /obj/item/reagent_containers/food/snacks/grown/banana = 2,
+ /obj/item/reagent_containers/food/snacks/icecream = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/honkdae
+ subcategory = CAT_ICE
+
/datum/crafting_recipe/food/icecreamsandwich
name = "Icecream sandwich"
reqs = list(
@@ -14,7 +72,7 @@
subcategory = CAT_ICE
/datum/crafting_recipe/food/spacefreezy
- name ="Space freezy"
+ name ="Space Freezy"
reqs = list(
/datum/reagent/consumable/bluecherryjelly = 5,
/datum/reagent/consumable/spacemountainwind = 15,
@@ -34,105 +92,8 @@
result = /obj/item/reagent_containers/food/snacks/sundae
subcategory = CAT_ICE
-/datum/crafting_recipe/food/honkdae
- name ="Honkdae"
- reqs = list(
- /datum/reagent/consumable/cream = 5,
- /obj/item/clothing/mask/gas/clown_hat = 1,
- /obj/item/reagent_containers/food/snacks/grown/cherries = 1,
- /obj/item/reagent_containers/food/snacks/grown/banana = 2,
- /obj/item/reagent_containers/food/snacks/icecream = 1
- )
- result = /obj/item/reagent_containers/food/snacks/honkdae
- subcategory = CAT_ICE
-
-/datum/crafting_recipe/food/banana_split
- name = "Banana Split"
- always_availible = FALSE
- reqs = list(
- /obj/item/reagent_containers/food/snacks/icecream = 3,
- /obj/item/reagent_containers/food/snacks/grown/banana = 1,
- /obj/item/reagent_containers/food/snacks/grown/cherries = 1,
- /obj/item/reagent_containers/food/snacks/chocolatebar = 1
- )
- result = /obj/item/reagent_containers/food/snacks/banana_split
- subcategory = CAT_ICE
-
-/datum/crafting_recipe/food/root_float
- name = "Cola Float"
- always_availible = FALSE
- reqs = list(
- /obj/item/reagent_containers/food/snacks/icecream = 1,
- /obj/item/reagent_containers/food/snacks/grown/cherries = 1,
- /datum/reagent/consumable/space_cola = 10,
- /obj/item/reagent_containers/food/drinks/drinkingglass = 1
- )
- result = /obj/item/reagent_containers/food/snacks/cola_float
- subcategory = CAT_ICE
-
-/datum/crafting_recipe/food/charrie_float
- name = "Cherry Shake"
- always_availible = FALSE
- reqs = list(
- /obj/item/reagent_containers/food/snacks/icecream = 1,
- /obj/item/reagent_containers/food/snacks/grown/cherries = 3,
- /obj/item/reagent_containers/food/drinks/drinkingglass = 1
- )
- result = /obj/item/reagent_containers/food/snacks/charrie_float
- subcategory = CAT_ICE
-
-/datum/crafting_recipe/food/bluecharrie_float
- name = "Blue Cherry Shake"
- always_availible = FALSE
- reqs = list(
- /obj/item/reagent_containers/food/snacks/icecream = 1,
- /obj/item/reagent_containers/food/snacks/grown/bluecherries = 3,
- /obj/item/reagent_containers/food/drinks/drinkingglass = 1
- )
- result = /obj/item/reagent_containers/food/snacks/bluecharrie_float
- subcategory = CAT_ICE
-
//////////////////////////SNOW CONES///////////////////////
-/datum/crafting_recipe/food/flavorless_sc
- name = "Flavorless snowcone"
- reqs = list(
- /obj/item/reagent_containers/food/drinks/sillycup = 1,
- /datum/reagent/consumable/ice = 15
- )
- result = /obj/item/reagent_containers/food/snacks/snowcones
- subcategory = CAT_ICE
-
-/datum/crafting_recipe/food/pineapple_sc
- name = "Pineapple snowcone"
- reqs = list(
- /obj/item/reagent_containers/food/drinks/sillycup = 1,
- /datum/reagent/consumable/ice = 15,
- /obj/item/reagent_containers/food/snacks/pineappleslice = 2
- )
- result = /obj/item/reagent_containers/food/snacks/snowcones/pineapple
- subcategory = CAT_ICE
-
-/datum/crafting_recipe/food/lime_sc
- name = "Lime snowcone"
- reqs = list(
- /obj/item/reagent_containers/food/drinks/sillycup = 1,
- /datum/reagent/consumable/ice = 15,
- /datum/reagent/consumable/limejuice = 5
- )
- result = /obj/item/reagent_containers/food/snacks/snowcones/lime
- subcategory = CAT_ICE
-
-/datum/crafting_recipe/food/lemon_sc
- name = "Lemon snowcone"
- reqs = list(
- /obj/item/reagent_containers/food/drinks/sillycup = 1,
- /datum/reagent/consumable/ice = 15,
- /datum/reagent/consumable/lemonjuice = 5
- )
- result = /obj/item/reagent_containers/food/snacks/snowcones/lemon
- subcategory = CAT_ICE
-
/datum/crafting_recipe/food/apple_sc
name = "Apple snowcone"
reqs = list(
@@ -143,24 +104,14 @@
result = /obj/item/reagent_containers/food/snacks/snowcones/apple
subcategory = CAT_ICE
-/datum/crafting_recipe/food/grape_sc
- name = "Grape snowcone"
+/datum/crafting_recipe/food/berry_sc
+ name = "Berry snowcone"
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/datum/reagent/consumable/ice = 15,
- /datum/reagent/consumable/grapejuice = 5
+ /datum/reagent/consumable/berryjuice = 5
)
- result = /obj/item/reagent_containers/food/snacks/snowcones/grape
- subcategory = CAT_ICE
-
-/datum/crafting_recipe/food/orange_sc
- name = "Orange snowcone"
- reqs = list(
- /obj/item/reagent_containers/food/drinks/sillycup = 1,
- /datum/reagent/consumable/ice = 15,
- /datum/reagent/consumable/orangejuice = 5
- )
- result = /obj/item/reagent_containers/food/snacks/snowcones/orange
+ result = /obj/item/reagent_containers/food/snacks/snowcones/berry
subcategory = CAT_ICE
/datum/crafting_recipe/food/blue_sc
@@ -183,14 +134,13 @@
result = /obj/item/reagent_containers/food/snacks/snowcones/red
subcategory = CAT_ICE
-/datum/crafting_recipe/food/berry_sc
- name = "Berry snowcone"
+/datum/crafting_recipe/food/flavorless_sc
+ name = "Flavorless snowcone"
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
- /datum/reagent/consumable/ice = 15,
- /datum/reagent/consumable/berryjuice = 5
+ /datum/reagent/consumable/ice = 15
)
- result = /obj/item/reagent_containers/food/snacks/snowcones/berry
+ result = /obj/item/reagent_containers/food/snacks/snowcones
subcategory = CAT_ICE
/datum/crafting_recipe/food/fruitsalad_sc
@@ -206,24 +156,84 @@
result = /obj/item/reagent_containers/food/snacks/snowcones/fruitsalad
subcategory = CAT_ICE
-/datum/crafting_recipe/food/mime_sc
- name = "Mime snowcone"
+/datum/crafting_recipe/food/grape_sc
+ name = "Grape snowcone"
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/datum/reagent/consumable/ice = 15,
- /datum/reagent/consumable/nothing = 5
+ /datum/reagent/consumable/grapejuice = 5
)
- result = /obj/item/reagent_containers/food/snacks/snowcones/mime
+ result = /obj/item/reagent_containers/food/snacks/snowcones/grape
subcategory = CAT_ICE
-/datum/crafting_recipe/food/clown_sc
- name = "Clown snowcone"
+/datum/crafting_recipe/food/honey_sc
+ name = "Honey snowcone"
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/datum/reagent/consumable/ice = 15,
- /datum/reagent/consumable/laughter = 5
+ /datum/reagent/consumable/honey = 5
)
- result = /obj/item/reagent_containers/food/snacks/snowcones/clown
+ result = /obj/item/reagent_containers/food/snacks/snowcones/honey
+ subcategory = CAT_ICE
+
+/datum/crafting_recipe/food/lemon_sc
+ name = "Lemon snowcone"
+ reqs = list(
+ /obj/item/reagent_containers/food/drinks/sillycup = 1,
+ /datum/reagent/consumable/ice = 15,
+ /datum/reagent/consumable/lemonjuice = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/snowcones/lemon
+ subcategory = CAT_ICE
+
+/datum/crafting_recipe/food/lime_sc
+ name = "Lime snowcone"
+ reqs = list(
+ /obj/item/reagent_containers/food/drinks/sillycup = 1,
+ /datum/reagent/consumable/ice = 15,
+ /datum/reagent/consumable/limejuice = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/snowcones/lime
+ subcategory = CAT_ICE
+
+/datum/crafting_recipe/food/orange_sc
+ name = "Orange snowcone"
+ reqs = list(
+ /obj/item/reagent_containers/food/drinks/sillycup = 1,
+ /datum/reagent/consumable/ice = 15,
+ /datum/reagent/consumable/orangejuice = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/snowcones/orange
+ subcategory = CAT_ICE
+
+/datum/crafting_recipe/food/pineapple_sc
+ name = "Pineapple snowcone"
+ reqs = list(
+ /obj/item/reagent_containers/food/drinks/sillycup = 1,
+ /datum/reagent/consumable/ice = 15,
+ /obj/item/reagent_containers/food/snacks/pineappleslice = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/snowcones/pineapple
+ subcategory = CAT_ICE
+
+/datum/crafting_recipe/food/pwrgame_sc
+ name = "Pwrgame snowcone"
+ reqs = list(
+ /obj/item/reagent_containers/food/drinks/sillycup = 1,
+ /datum/reagent/consumable/ice = 15,
+ /datum/reagent/consumable/pwr_game = 15
+ )
+ result = /obj/item/reagent_containers/food/snacks/snowcones/pwrgame
+ subcategory = CAT_ICE
+
+/datum/crafting_recipe/food/rainbow_sc
+ name = "Rainbow snowcone"
+ reqs = list(
+ /obj/item/reagent_containers/food/drinks/sillycup = 1,
+ /datum/reagent/consumable/ice = 15,
+ /datum/reagent/colorful_reagent = 1 //Harder to make
+ )
+ result = /obj/item/reagent_containers/food/snacks/snowcones/rainbow
subcategory = CAT_ICE
/datum/crafting_recipe/food/soda_sc
@@ -246,32 +256,24 @@
result = /obj/item/reagent_containers/food/snacks/snowcones/spacemountainwind
subcategory = CAT_ICE
-/datum/crafting_recipe/food/pwrgame_sc
- name = "Pwrgame snowcone"
+/////I don't like seperating the clown and mime.///
+
+/datum/crafting_recipe/food/mime_sc
+ name = "Mime snowcone"
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/datum/reagent/consumable/ice = 15,
- /datum/reagent/consumable/pwr_game = 15
+ /datum/reagent/consumable/nothing = 5
)
- result = /obj/item/reagent_containers/food/snacks/snowcones/pwrgame
+ result = /obj/item/reagent_containers/food/snacks/snowcones/mime
subcategory = CAT_ICE
-/datum/crafting_recipe/food/honey_sc
- name = "Honey snowcone"
+/datum/crafting_recipe/food/clown_sc
+ name = "Clown snowcone"
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/datum/reagent/consumable/ice = 15,
- /datum/reagent/consumable/honey = 5
+ /datum/reagent/consumable/laughter = 5
)
- result = /obj/item/reagent_containers/food/snacks/snowcones/honey
- subcategory = CAT_ICE
-
-/datum/crafting_recipe/food/rainbow_sc
- name = "Rainbow snowcone"
- reqs = list(
- /obj/item/reagent_containers/food/drinks/sillycup = 1,
- /datum/reagent/consumable/ice = 15,
- /datum/reagent/colorful_reagent = 1 //Harder to make
- )
- result = /obj/item/reagent_containers/food/snacks/snowcones/rainbow
- subcategory = CAT_ICE
+ result = /obj/item/reagent_containers/food/snacks/snowcones/clown
+ subcategory = CAT_ICE
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
index d8145410cd..efb773159d 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
@@ -1,3 +1,5 @@
+// see code/module/crafting/table.dm
+
////////////////////////////////////////////////KEBABS////////////////////////////////////////////////
/datum/crafting_recipe/food/humankebab
@@ -36,6 +38,18 @@
result = /obj/item/reagent_containers/food/snacks/kebab/tail
subcategory = CAT_MEAT
+/datum/crafting_recipe/food/fiestaskewer
+ name = "Fiesta Skewer"
+ reqs = list(
+ /obj/item/stack/rods = 1,
+ /obj/item/reagent_containers/food/snacks/grown/chili = 1,
+ /obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
+ /obj/item/reagent_containers/food/snacks/grown/corn = 1,
+ /obj/item/reagent_containers/food/snacks/grown/tomato = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/kebab/fiesta
+ subcategory = CAT_MEAT
+
// see code/module/crafting/table.dm
////////////////////////////////////////////////MR SPIDER////////////////////////////////////////////////
@@ -52,6 +66,36 @@
////////////////////////////////////////////////MISC RECIPE's////////////////////////////////////////////////
+/datum/crafting_recipe/food/ribs
+ name = "BBQ Ribs"
+ reqs = list(
+ /datum/reagent/consumable/bbqsauce = 5,
+ /obj/item/reagent_containers/food/snacks/meat/steak/plain = 2,
+ /obj/item/stack/rods = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/bbqribs
+ subcategory = CAT_MEAT
+
+/datum/crafting_recipe/food/nugget
+ name = "Chicken nugget"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/cutlet = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/nugget
+ subcategory = CAT_MEAT
+
+/datum/crafting_recipe/food/corndog
+ name = "Corndog meal"
+ reqs = list(
+ /obj/item/stack/rods = 1,
+ /obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
+ /obj/item/reagent_containers/food/snacks/bun = 1,
+ /datum/reagent/consumable/mustard = 5,
+ /datum/reagent/consumable/ketchup = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/corndog
+ subcategory = CAT_MEAT
+
/datum/crafting_recipe/food/cornedbeef
name = "Corned beef"
reqs = list(
@@ -72,16 +116,6 @@
result = /obj/item/reagent_containers/food/snacks/bearsteak
subcategory = CAT_MEAT
-/datum/crafting_recipe/food/enchiladas
- name = "Enchiladas"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/meat/cutlet = 2,
- /obj/item/reagent_containers/food/snacks/grown/chili = 2,
- /obj/item/reagent_containers/food/snacks/tortilla = 2
- )
- result = /obj/item/reagent_containers/food/snacks/enchiladas
- subcategory = CAT_MEAT
-
/datum/crafting_recipe/food/stewedsoymeat
name = "Stewed soymeat"
reqs = list(
@@ -101,23 +135,6 @@
result = /obj/item/reagent_containers/food/snacks/sausage
subcategory = CAT_MEAT
-/datum/crafting_recipe/food/nugget
- name = "Chicken nugget"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/meat/cutlet = 1
- )
- result = /obj/item/reagent_containers/food/snacks/nugget
- subcategory = CAT_MEAT
-
-/datum/crafting_recipe/food/rawkhinkali
- name = "Raw Khinkali"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/doughslice = 1,
- /obj/item/reagent_containers/food/snacks/faggot = 1
- )
- result = /obj/item/reagent_containers/food/snacks/rawkhinkali
- subcategory = CAT_MEAT
-
/datum/crafting_recipe/food/pigblanket
name = "Pig in a Blanket"
reqs = list(
@@ -128,18 +145,6 @@
result = /obj/item/reagent_containers/food/snacks/pigblanket
subcategory = CAT_MEAT
-/datum/crafting_recipe/food/corndog
- name = "Corndog meal"
- reqs = list(
- /obj/item/stack/rods = 1,
- /obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
- /obj/item/reagent_containers/food/snacks/bun = 1,
- /datum/reagent/consumable/mustard = 5,
- /datum/reagent/consumable/ketchup = 5
- )
- result = /obj/item/reagent_containers/food/snacks/corndog
- subcategory = CAT_MEAT
-
/datum/crafting_recipe/food/ratkebab
name = "Rat Kebab"
reqs = list(
@@ -166,25 +171,3 @@
)
result = /obj/item/reagent_containers/food/snacks/salad/ricepork
subcategory = CAT_MEAT
-
-/datum/crafting_recipe/food/fiestaskewer
- name = "Fiesta Skewer"
- reqs = list(
- /obj/item/stack/rods = 1,
- /obj/item/reagent_containers/food/snacks/grown/chili = 1,
- /obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
- /obj/item/reagent_containers/food/snacks/grown/corn = 1,
- /obj/item/reagent_containers/food/snacks/grown/tomato = 1
- )
- result = /obj/item/reagent_containers/food/snacks/kebab/fiesta
- subcategory = CAT_MEAT
-
-/datum/crafting_recipe/food/ribs
- name = "BBQ Ribs"
- reqs = list(
- /datum/reagent/consumable/bbqsauce = 5,
- /obj/item/reagent_containers/food/snacks/meat/steak/plain = 2,
- /obj/item/stack/rods = 2
- )
- result = /obj/item/reagent_containers/food/snacks/bbqribs
- subcategory = CAT_MEAT
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm
new file mode 100644
index 0000000000..e155a1bd23
--- /dev/null
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm
@@ -0,0 +1,111 @@
+// see code/module/crafting/table.dm
+
+////////////////////////////////////////////////"MEXICAN"////////////////////////////////////////////////
+
+/datum/crafting_recipe/food/burrito
+ name ="Burrito"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/tortilla = 1,
+ /obj/item/reagent_containers/food/snacks/grown/soybeans = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/burrito
+ subcategory = CAT_MEXICAN
+
+/datum/crafting_recipe/food/cheesyburrito
+ name ="Cheesy burrito"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/tortilla = 1,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 2,
+ /obj/item/reagent_containers/food/snacks/grown/soybeans = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/cheesyburrito
+ subcategory = CAT_MEXICAN
+
+/datum/crafting_recipe/food/enchiladas
+ name = "Enchiladas"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/cutlet = 2,
+ /obj/item/reagent_containers/food/snacks/grown/chili = 2,
+ /obj/item/reagent_containers/food/snacks/tortilla = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/enchiladas
+ subcategory = CAT_MEXICAN
+
+/datum/crafting_recipe/food/carneburrito
+ name ="Carne de asada burrito"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/tortilla = 1,
+ /obj/item/reagent_containers/food/snacks/meat/cutlet = 2,
+ /obj/item/reagent_containers/food/snacks/grown/soybeans = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/carneburrito
+ subcategory = CAT_MEXICAN
+
+/datum/crafting_recipe/food/fuegoburrito
+ name ="Fuego plasma burrito"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/tortilla = 1,
+ /obj/item/reagent_containers/food/snacks/grown/ghost_chili = 2,
+ /obj/item/reagent_containers/food/snacks/grown/soybeans = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/fuegoburrito
+ subcategory = CAT_MEXICAN
+
+/datum/crafting_recipe/food/taco
+ name ="Classic Taco"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/tortilla = 1,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
+ /obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
+ /obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
+ )
+ result = /obj/item/reagent_containers/food/snacks/taco
+ subcategory = CAT_MEXICAN
+
+/datum/crafting_recipe/food/tacoplain
+ name ="Plain Taco"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/tortilla = 1,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
+ /obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
+ )
+ result = /obj/item/reagent_containers/food/snacks/taco/plain
+ subcategory = CAT_MEXICAN
+
+/datum/crafting_recipe/food/nachos
+ name ="Nachos"
+ reqs = list(
+ /datum/reagent/consumable/sodiumchloride = 1,
+ /obj/item/reagent_containers/food/snacks/tortilla = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/nachos
+ subcategory = CAT_MEXICAN
+
+/datum/crafting_recipe/food/cheesynachos
+ name ="Cheesy nachos"
+ reqs = list(
+ /datum/reagent/consumable/sodiumchloride = 1,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
+ /obj/item/reagent_containers/food/snacks/tortilla = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/cheesynachos
+ subcategory = CAT_MEXICAN
+
+/datum/crafting_recipe/food/cubannachos
+ name ="Cuban nachos"
+ reqs = list(
+ /datum/reagent/consumable/ketchup = 5,
+ /obj/item/reagent_containers/food/snacks/grown/chili = 2,
+ /obj/item/reagent_containers/food/snacks/tortilla = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/cubannachos
+ subcategory = CAT_MEXICAN
+
+/datum/crafting_recipe/food/wrap
+ name = "Wrap"
+ reqs = list(/datum/reagent/consumable/soysauce = 10,
+ /obj/item/reagent_containers/food/snacks/friedegg = 1,
+ /obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
+ )
+ result = /obj/item/reagent_containers/food/snacks/eggwrap
+ subcategory = CAT_MEXICAN
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index 9cf5ea31a0..6a622d6719 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -1,62 +1,77 @@
// see code/module/crafting/table.dm
-// MISC
+//////////////////Eastern Foods//////////////////////
-/datum/crafting_recipe/food/candiedapple
- name = "Candied apple"
- reqs = list(/datum/reagent/water = 5,
- /datum/reagent/consumable/sugar = 5,
- /obj/item/reagent_containers/food/snacks/grown/apple = 1
- )
- result = /obj/item/reagent_containers/food/snacks/candiedapple
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/spiderlollipop
- name = "Spider Lollipop"
- reqs = list(/obj/item/stack/rods = 1,
- /datum/reagent/consumable/sugar = 5,
+/datum/crafting_recipe/food/chawanmushi
+ name = "Chawanmushi"
+ reqs = list(
/datum/reagent/water = 5,
- /obj/item/reagent_containers/food/snacks/spiderling = 1
+ /datum/reagent/consumable/soysauce = 5,
+ /obj/item/reagent_containers/food/snacks/boiledegg = 2,
+ /obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle = 1
)
- result = /obj/item/reagent_containers/food/snacks/spiderlollipop
+ result = /obj/item/reagent_containers/food/snacks/chawanmushi
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/chococoin
- name = "Choco coin"
+/datum/crafting_recipe/food/khachapuri
+ name = "Khachapuri"
reqs = list(
- /obj/item/coin = 1,
- /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
+ /datum/reagent/consumable/eggyolk = 5,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1
)
- result = /obj/item/reagent_containers/food/snacks/chococoin
+ result = /obj/item/reagent_containers/food/snacks/khachapuri
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/fudgedice
- name = "Fudge dice"
+/datum/crafting_recipe/food/rawkhinkali
+ name = "Raw Khinkali"
reqs = list(
- /obj/item/dice = 1,
- /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
+ /obj/item/reagent_containers/food/snacks/doughslice = 1,
+ /obj/item/reagent_containers/food/snacks/faggot = 1
)
- result = /obj/item/reagent_containers/food/snacks/fudgedice
+ result = /obj/item/reagent_containers/food/snacks/rawkhinkali
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/chocoorange
- name = "Choco orange"
+/datum/crafting_recipe/food/meatbun
+ name = "Meat bun"
reqs = list(
- /obj/item/reagent_containers/food/snacks/grown/citrus/orange = 1,
- /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
+ /datum/reagent/consumable/soysauce = 5,
+ /obj/item/reagent_containers/food/snacks/bun = 1,
+ /obj/item/reagent_containers/food/snacks/faggot = 1,
+ /obj/item/reagent_containers/food/snacks/grown/cabbage = 1
)
- result = /obj/item/reagent_containers/food/snacks/chocoorange
+ result = /obj/item/reagent_containers/food/snacks/meatbun
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/loadedbakedpotato
- name = "Loaded baked potato"
+/////////////////////////////////MISC/////////////////////////////////////
+
+/datum/crafting_recipe/food/beans
+ name = "Beans"
time = 40
- reqs = list(
- /obj/item/reagent_containers/food/snacks/grown/potato = 1,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 1
+ reqs = list(/datum/reagent/consumable/ketchup = 5,
+ /obj/item/reagent_containers/food/snacks/grown/soybeans = 2
)
- result = /obj/item/reagent_containers/food/snacks/loadedbakedpotato
+ result = /obj/item/reagent_containers/food/snacks/beans
+ subcategory = CAT_MISCFOOD
+
+/datum/crafting_recipe/food/branrequests
+ name = "Bran Requests Cereal"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/grown/wheat = 1,
+ /obj/item/reagent_containers/food/snacks/no_raisin = 1,
+ )
+ result = /obj/item/reagent_containers/food/snacks/branrequests
+ subcategory = CAT_MISCFOOD
+
+/datum/crafting_recipe/food/oatmeal
+ name = "Oatmeal"
+ reqs = list(
+ /datum/reagent/consumable/milk = 10,
+ /obj/item/reagent_containers/glass/bowl = 1,
+ /obj/item/reagent_containers/food/snacks/grown/oat = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/salad/oatmeal
subcategory = CAT_MISCFOOD
/datum/crafting_recipe/food/cheesyfries
@@ -68,24 +83,6 @@
result = /obj/item/reagent_containers/food/snacks/cheesyfries
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/wrap
- name = "Wrap"
- reqs = list(/datum/reagent/consumable/soysauce = 10,
- /obj/item/reagent_containers/food/snacks/friedegg = 1,
- /obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
- )
- result = /obj/item/reagent_containers/food/snacks/eggwrap
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/beans
- name = "Beans"
- time = 40
- reqs = list(/datum/reagent/consumable/ketchup = 5,
- /obj/item/reagent_containers/food/snacks/grown/soybeans = 2
- )
- result = /obj/item/reagent_containers/food/snacks/beans
- subcategory = CAT_MISCFOOD
-
/datum/crafting_recipe/food/eggplantparm
name ="Eggplant parmigiana"
reqs = list(
@@ -95,91 +92,14 @@
result = /obj/item/reagent_containers/food/snacks/eggplantparm
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/baguette
- name = "Baguette"
+/datum/crafting_recipe/food/loadedbakedpotato
+ name = "Loaded baked potato"
time = 40
- reqs = list(/datum/reagent/consumable/sodiumchloride = 1,
- /datum/reagent/consumable/blackpepper = 1,
- /obj/item/reagent_containers/food/snacks/pastrybase = 2
- )
- result = /obj/item/reagent_containers/food/snacks/baguette
- subcategory = CAT_MISCFOOD
-
-////////////////////////////////////////////////TOAST////////////////////////////////////////////////
-
-/datum/crafting_recipe/food/slimetoast
- name = "Slime toast"
reqs = list(
- /datum/reagent/toxin/slimejelly = 5,
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 1
+ /obj/item/reagent_containers/food/snacks/grown/potato = 1,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1
)
- result = /obj/item/reagent_containers/food/snacks/jelliedtoast/slime
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/jelliedtoast
- name = "Jellied toast"
- reqs = list(
- /datum/reagent/consumable/cherryjelly = 5,
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/peanutbuttertoast
- name = "Peanut butter toast"
- reqs = list(
- /datum/reagent/consumable/peanut_butter = 5,
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/peanut_buttertoast
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/twobread
- name = "Two bread"
- reqs = list(
- /datum/reagent/consumable/ethanol/wine = 5,
- /obj/item/reagent_containers/food/snacks/breadslice/plain = 2
- )
- result = /obj/item/reagent_containers/food/snacks/twobread
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/burrito
- name ="Burrito"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/tortilla = 1,
- /obj/item/reagent_containers/food/snacks/grown/soybeans = 2
- )
- result = /obj/item/reagent_containers/food/snacks/burrito
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/cheesyburrito
- name ="Cheesy burrito"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/tortilla = 1,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 2,
- /obj/item/reagent_containers/food/snacks/grown/soybeans = 1
- )
- result = /obj/item/reagent_containers/food/snacks/cheesyburrito
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/carneburrito
- name ="Carne de asada burrito"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/tortilla = 1,
- /obj/item/reagent_containers/food/snacks/meat/cutlet = 2,
- /obj/item/reagent_containers/food/snacks/grown/soybeans = 1
- )
- result = /obj/item/reagent_containers/food/snacks/carneburrito
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/fuegoburrito
- name ="Fuego plasma burrito"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/tortilla = 1,
- /obj/item/reagent_containers/food/snacks/grown/ghost_chili = 2,
- /obj/item/reagent_containers/food/snacks/grown/soybeans = 1
- )
- result = /obj/item/reagent_containers/food/snacks/fuegoburrito
+ result = /obj/item/reagent_containers/food/snacks/loadedbakedpotato
subcategory = CAT_MISCFOOD
/datum/crafting_recipe/food/melonfruitbowl
@@ -195,35 +115,6 @@
result = /obj/item/reagent_containers/food/snacks/melonfruitbowl
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/nachos
- name ="Nachos"
- reqs = list(
- /datum/reagent/consumable/sodiumchloride = 1,
- /obj/item/reagent_containers/food/snacks/tortilla = 1
- )
- result = /obj/item/reagent_containers/food/snacks/nachos
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/cheesynachos
- name ="Cheesy nachos"
- reqs = list(
- /datum/reagent/consumable/sodiumchloride = 1,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/reagent_containers/food/snacks/tortilla = 1
- )
- result = /obj/item/reagent_containers/food/snacks/cheesynachos
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/cubannachos
- name ="Cuban nachos"
- reqs = list(
- /datum/reagent/consumable/ketchup = 5,
- /obj/item/reagent_containers/food/snacks/grown/chili = 2,
- /obj/item/reagent_containers/food/snacks/tortilla = 1
- )
- result = /obj/item/reagent_containers/food/snacks/cubannachos
- subcategory = CAT_MISCFOOD
-
/datum/crafting_recipe/food/melonkeg
name ="Melon keg"
reqs = list(
@@ -235,16 +126,6 @@
result = /obj/item/reagent_containers/food/snacks/melonkeg
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/honeybar
- name = "Honey nut bar"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/grown/oat = 1,
- /datum/reagent/consumable/honey = 5
- )
- result = /obj/item/reagent_containers/food/snacks/honeybar
- subcategory = CAT_MISCFOOD
-
-
/datum/crafting_recipe/food/stuffedlegion
name = "Stuffed legion"
time = 40
@@ -257,7 +138,6 @@
result = /obj/item/reagent_containers/food/snacks/stuffedlegion
subcategory = CAT_MISCFOOD
-
/datum/crafting_recipe/lizardwine //not a subtype of /datum/crafting_recipe/food due to a bug where the resulting bottle would contain 100u of lizardwine and 100u of ethanol.
name = "Lizard wine"
time = 40
@@ -269,7 +149,6 @@
category = CAT_FOOD
subcategory = CAT_MISCFOOD
-
/datum/crafting_recipe/food/powercrepe
name = "Powercrepe"
time = 40
@@ -283,36 +162,6 @@
result = /obj/item/reagent_containers/food/snacks/powercrepe
subcategory = CAT_MISCFOOD
-/datum/crafting_recipe/food/taco
- name ="Classic Taco"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/tortilla = 1,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
- /obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
- )
- result = /obj/item/reagent_containers/food/snacks/taco
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/tacoplain
- name ="Plain Taco"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/tortilla = 1,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
- )
- result = /obj/item/reagent_containers/food/snacks/taco/plain
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/branrequests
- name = "Bran Requests Cereal"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/grown/wheat = 1,
- /obj/item/reagent_containers/food/snacks/no_raisin = 1,
- )
- result = /obj/item/reagent_containers/food/snacks/branrequests
- subcategory = CAT_MISCFOOD
-
/datum/crafting_recipe/food/ricepudding
name = "Rice pudding"
reqs = list(
@@ -322,22 +171,3 @@
)
result = /obj/item/reagent_containers/food/snacks/salad/ricepudding
subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/riceball
- name = "Onigiri"
- reqs = list(
- /datum/reagent/consumable/soysauce = 1,
- /obj/item/reagent_containers/food/snacks/grown/kudzupod = 1,
- /obj/item/reagent_containers/food/snacks/salad/boiledrice = 1
- )
- result = /obj/item/reagent_containers/food/snacks/riceball
- subcategory = CAT_MISCFOOD
-
-/datum/crafting_recipe/food/chocolatestrawberry
- name = "Chocolate Strawberry"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
- /obj/item/reagent_containers/food/snacks/grown/strawberry = 1
- )
- result = /obj/item/reagent_containers/food/snacks/chocolatestrawberry
- subcategory = CAT_MISCFOOD
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
index 62b8509eb1..8a393476a2 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
@@ -1,259 +1,108 @@
// see code/module/crafting/table.dm
-////////////////////////////////////////////////DONUTS////////////////////////////////////////////////
+////////////////////////////////////////////////MUFFINS////////////////////////////////////////////////
-/datum/crafting_recipe/food/donut
+/datum/crafting_recipe/food/muffin
time = 15
- name = "Donut"
+ name = "Muffin"
reqs = list(
- /datum/reagent/consumable/sugar = 1,
+ /datum/reagent/consumable/milk = 5,
/obj/item/reagent_containers/food/snacks/pastrybase = 1
)
- result = /obj/item/reagent_containers/food/snacks/donut/plain
+ result = /obj/item/reagent_containers/food/snacks/muffin
subcategory = CAT_PASTRY
-/datum/crafting_recipe/food/donut/chaos
- name = "Chaos donut"
+/datum/crafting_recipe/food/berrymuffin
+ name = "Berry muffin"
reqs = list(
- /datum/reagent/consumable/frostoil = 5,
- /datum/reagent/consumable/capsaicin = 5,
- /obj/item/reagent_containers/food/snacks/pastrybase = 1
+ /datum/reagent/consumable/milk = 5,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1,
+ /obj/item/reagent_containers/food/snacks/grown/berries = 1
)
- result = /obj/item/reagent_containers/food/snacks/donut/chaos
-
-datum/crafting_recipe/food/donut/meat
- time = 15
- name = "Meat donut"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/meat/slab = 1,
- /obj/item/reagent_containers/food/snacks/pastrybase = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/meat
-
-/datum/crafting_recipe/food/donut/jelly
- name = "Jelly donut"
- reqs = list(
- /datum/reagent/consumable/berryjuice = 5,
- /obj/item/reagent_containers/food/snacks/pastrybase = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/plain
-
-/datum/crafting_recipe/food/donut/slimejelly
- name = "Slime jelly donut"
- reqs = list(
- /datum/reagent/toxin/slimejelly = 5,
- /obj/item/reagent_containers/food/snacks/pastrybase = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain
-
-/datum/crafting_recipe/food/donut/glaze
- time = 15
- name = "glaze donut"
- reqs = list(
- /datum/reagent/consumable/sugar = 10,
- /obj/item/reagent_containers/food/snacks/pastrybase = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/glaze
+ result = /obj/item/reagent_containers/food/snacks/muffin/berry
subcategory = CAT_PASTRY
-/datum/crafting_recipe/food/donut/berry
- name = "Berry Donut"
+/datum/crafting_recipe/food/booberrymuffin
+ name = "Booberry muffin"
reqs = list(
- /datum/reagent/consumable/berryjuice = 3,
- /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ /datum/reagent/consumable/milk = 5,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1,
+ /obj/item/reagent_containers/food/snacks/grown/berries = 1,
+ /obj/item/ectoplasm = 1
)
- result = /obj/item/reagent_containers/food/snacks/donut/berry
+ result = /obj/item/reagent_containers/food/snacks/muffin/booberry
+ subcategory = CAT_PASTRY
-/datum/crafting_recipe/food/donut/trumpet
- name = "Spaceman's Donut"
+/datum/crafting_recipe/food/poppymuffin
+ name = "Poppy muffin"
reqs = list(
- /datum/reagent/medicine/polypyr = 3,
- /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ /datum/reagent/consumable/milk = 5,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1,
+ /obj/item/reagent_containers/food/snacks/grown/citrus/lemon = 1,
+ /obj/item/seeds/poppy = 1
)
+ result = /obj/item/reagent_containers/food/snacks/muffin/poppy
+ subcategory = CAT_PASTRY
- result = /obj/item/reagent_containers/food/snacks/donut/trumpet
+////////////////////////////////////////////CUPCAKES////////////////////////////////////////////
-/datum/crafting_recipe/food/donut/apple
- name = "Apple Donut"
+/datum/crafting_recipe/food/cherrycupcake
+ name = "Cherry cupcake"
reqs = list(
- /datum/reagent/consumable/applejuice = 3,
- /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1,
+ /obj/item/reagent_containers/food/snacks/grown/cherries = 1
)
- result = /obj/item/reagent_containers/food/snacks/donut/apple
+ result = /obj/item/reagent_containers/food/snacks/cherrycupcake
+ subcategory = CAT_PASTRY
-/datum/crafting_recipe/food/donut/caramel
- name = "Caramel Donut"
+/datum/crafting_recipe/food/bluecherrycupcake
+ name = "Blue cherry cupcake"
reqs = list(
- /datum/reagent/consumable/caramel = 3,
- /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1,
+ /obj/item/reagent_containers/food/snacks/grown/bluecherries = 1
)
- result = /obj/item/reagent_containers/food/snacks/donut/caramel
+ result = /obj/item/reagent_containers/food/snacks/bluecherrycupcake
+ subcategory = CAT_PASTRY
-/datum/crafting_recipe/food/donut/choco
- name = "Chocolate Donut"
+/datum/crafting_recipe/food/strawberrycupcake
+ name = "Strawberry cherry cupcake"
reqs = list(
- /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
- /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1,
+ /obj/item/reagent_containers/food/snacks/grown/strawberry = 1
)
- result = /obj/item/reagent_containers/food/snacks/donut/choco
+ result = /obj/item/reagent_containers/food/snacks/strawberrycupcake
+ subcategory = CAT_PASTRY
-/datum/crafting_recipe/food/donut/blumpkin
- name = "Blumpkin Donut"
+////////////////////////////////////////////COOKIES////////////////////////////////////////////
+
+/datum/crafting_recipe/food/raisincookie
+ name = "Raisin cookie"
reqs = list(
- /datum/reagent/consumable/blumpkinjuice = 3,
- /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ /obj/item/reagent_containers/food/snacks/no_raisin = 1,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1,
+ /obj/item/reagent_containers/food/snacks/grown/oat = 1
)
- result = /obj/item/reagent_containers/food/snacks/donut/blumpkin
+ result = /obj/item/reagent_containers/food/snacks/raisincookie
+ subcategory = CAT_PASTRY
-/datum/crafting_recipe/food/donut/bungo
- name = "Bungo Donut"
+/datum/crafting_recipe/food/oatmealcookie
+ name = "Oatmeal cookie"
reqs = list(
- /datum/reagent/consumable/bungojuice = 3,
- /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1,
+ /obj/item/reagent_containers/food/snacks/grown/oat = 1
)
- result = /obj/item/reagent_containers/food/snacks/donut/bungo
+ result = /obj/item/reagent_containers/food/snacks/oatmealcookie
+ subcategory = CAT_PASTRY
-/datum/crafting_recipe/food/donut/matcha
- name = "Matcha Donut"
+/datum/crafting_recipe/food/sugarcookie
+ time = 15
+ name = "Sugar cookie"
reqs = list(
- /datum/reagent/toxin/teapowder = 3,
- /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ /datum/reagent/consumable/sugar = 5,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1
)
- result = /obj/item/reagent_containers/food/snacks/donut/matcha
-
-////////////////////////////////////////////////////JELLY DONUTS///////////////////////////////////////////////////////
-
-/datum/crafting_recipe/food/donut/jelly/berry
- name = "Berry Jelly Donut"
- reqs = list(
- /datum/reagent/consumable/berryjuice = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/berry
-
-/datum/crafting_recipe/food/donut/jelly/trumpet
- name = "Spaceman's Jelly Donut"
- reqs = list(
- /datum/reagent/medicine/polypyr = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
- )
-
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/trumpet
-
-/datum/crafting_recipe/food/donut/jelly/apple
- name = "Apple Jelly Donut"
- reqs = list(
- /datum/reagent/consumable/applejuice = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/apple
-
-/datum/crafting_recipe/food/donut/jelly/caramel
- name = "Caramel Jelly Donut"
- reqs = list(
- /datum/reagent/consumable/caramel = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/caramel
-
-/datum/crafting_recipe/food/donut/jelly/choco
- name = "Chocolate Jelly Donut"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
- /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/choco
-
-/datum/crafting_recipe/food/donut/jelly/blumpkin
- name = "Blumpkin Jelly Donut"
- reqs = list(
- /datum/reagent/consumable/blumpkinjuice = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/blumpkin
-
-/datum/crafting_recipe/food/donut/jelly/bungo
- name = "Bungo Jelly Donut"
- reqs = list(
- /datum/reagent/consumable/bungojuice = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/bungo
-
-/datum/crafting_recipe/food/donut/jelly/matcha
- name = "Matcha Jelly Donut"
- reqs = list(
- /datum/reagent/toxin/teapowder = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/matcha
-
-////////////////////////////////////////////////////SLIME DONUTS///////////////////////////////////////////////////////
-
-/datum/crafting_recipe/food/donut/slimejelly/berry
- name = "Berry Slime Donut"
- reqs = list(
- /datum/reagent/consumable/berryjuice = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/berry
-
-/datum/crafting_recipe/food/donut/slimejelly/trumpet
- name = "Spaceman's Slime Donut"
- reqs = list(
- /datum/reagent/medicine/polypyr = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
- )
-
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/trumpet
-
-/datum/crafting_recipe/food/donut/slimejelly/apple
- name = "Apple Slime Donut"
- reqs = list(
- /datum/reagent/consumable/applejuice = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/apple
-
-/datum/crafting_recipe/food/donut/slimejelly/caramel
- name = "Caramel Slime Donut"
- reqs = list(
- /datum/reagent/consumable/caramel = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/caramel
-
-/datum/crafting_recipe/food/donut/slimejelly/choco
- name = "Chocolate Slime Donut"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
- /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/choco
-
-/datum/crafting_recipe/food/donut/slimejelly/blumpkin
- name = "Blumpkin Slime Donut"
- reqs = list(
- /datum/reagent/consumable/blumpkinjuice = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/blumpkin
-
-/datum/crafting_recipe/food/donut/slimejelly/bungo
- name = "Bungo Slime Donut"
- reqs = list(
- /datum/reagent/consumable/bungojuice = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/bungo
-
-/datum/crafting_recipe/food/donut/slimejelly/matcha
- name = "Matcha Slime Donut"
- reqs = list(
- /datum/reagent/toxin/teapowder = 3,
- /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/matcha
+ result = /obj/item/reagent_containers/food/snacks/sugarcookie
+ subcategory = CAT_PASTRY
////////////////////////////////////////////////WAFFLES AND PANCAKES////////////////////////////////////////////////
@@ -321,7 +170,6 @@ datum/crafting_recipe/food/donut/meat
result = /obj/item/reagent_containers/food/snacks/pancakes/chocolatechip
subcategory = CAT_PASTRY
-
////////////////////////////////////////////////DONKPOCCKETS////////////////////////////////////////////////
/datum/crafting_recipe/food/donkpocket
@@ -344,92 +192,26 @@ datum/crafting_recipe/food/donut/meat
result = /obj/item/reagent_containers/food/snacks/dankpocket
subcategory = CAT_PASTRY
-////////////////////////////////////////////////MUFFINS////////////////////////////////////////////////
-
-/datum/crafting_recipe/food/muffin
- time = 15
- name = "Muffin"
- reqs = list(
- /datum/reagent/consumable/milk = 5,
- /obj/item/reagent_containers/food/snacks/pastrybase = 1
- )
- result = /obj/item/reagent_containers/food/snacks/muffin
- subcategory = CAT_PASTRY
-
-/datum/crafting_recipe/food/berrymuffin
- name = "Berry muffin"
- reqs = list(
- /datum/reagent/consumable/milk = 5,
- /obj/item/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/reagent_containers/food/snacks/grown/berries = 1
- )
- result = /obj/item/reagent_containers/food/snacks/muffin/berry
- subcategory = CAT_PASTRY
-
-/datum/crafting_recipe/food/booberrymuffin
- name = "Booberry muffin"
- reqs = list(
- /datum/reagent/consumable/milk = 5,
- /obj/item/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/reagent_containers/food/snacks/grown/berries = 1,
- /obj/item/ectoplasm = 1
- )
- result = /obj/item/reagent_containers/food/snacks/muffin/booberry
- subcategory = CAT_PASTRY
-
-/datum/crafting_recipe/food/poppymuffin
- name = "Poppy muffin"
- reqs = list(
- /datum/reagent/consumable/milk = 5,
- /obj/item/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/reagent_containers/food/snacks/grown/citrus/lemon = 1,
- /obj/item/seeds/poppy = 1
- )
- result = /obj/item/reagent_containers/food/snacks/muffin/poppy
- subcategory = CAT_PASTRY
-
-/datum/crafting_recipe/food/chawanmushi
- name = "Chawanmushi"
- reqs = list(
- /datum/reagent/water = 5,
- /datum/reagent/consumable/soysauce = 5,
- /obj/item/reagent_containers/food/snacks/boiledegg = 2,
- /obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle = 1
- )
- result = /obj/item/reagent_containers/food/snacks/chawanmushi
- subcategory = CAT_PASTRY
-
////////////////////////////////////////////OTHER////////////////////////////////////////////
-/datum/crafting_recipe/food/meatbun
- name = "Meat bun"
+/datum/crafting_recipe/food/chococornet
+ name = "Choco cornet"
reqs = list(
- /datum/reagent/consumable/soysauce = 5,
- /obj/item/reagent_containers/food/snacks/bun = 1,
- /obj/item/reagent_containers/food/snacks/faggot = 1,
- /obj/item/reagent_containers/food/snacks/grown/cabbage = 1
+ /datum/reagent/consumable/sodiumchloride = 1,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1,
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 1
)
- result = /obj/item/reagent_containers/food/snacks/meatbun
+ result = /obj/item/reagent_containers/food/snacks/chococornet
subcategory = CAT_PASTRY
-/datum/crafting_recipe/food/khachapuri
- name = "Khachapuri"
- reqs = list(
- /datum/reagent/consumable/eggyolk = 5,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/khachapuri
- subcategory = CAT_PASTRY
-
-/datum/crafting_recipe/food/sugarcookie
+/datum/crafting_recipe/food/cracker
time = 15
- name = "Sugar cookie"
+ name = "Cracker"
reqs = list(
- /datum/reagent/consumable/sugar = 5,
- /obj/item/reagent_containers/food/snacks/pastrybase = 1
+ /datum/reagent/consumable/sodiumchloride = 1,
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1,
)
- result = /obj/item/reagent_containers/food/snacks/sugarcookie
+ result = /obj/item/reagent_containers/food/snacks/cracker
subcategory = CAT_PASTRY
/datum/crafting_recipe/food/fortunecookie
@@ -445,6 +227,34 @@ datum/crafting_recipe/food/donut/meat
result = /obj/item/reagent_containers/food/snacks/fortunecookie
subcategory = CAT_PASTRY
+/datum/crafting_recipe/food/honeybun
+ name = "Honey bun"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pastrybase = 1,
+ /datum/reagent/consumable/honey = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/honeybun
+ subcategory = CAT_PASTRY
+
+/datum/crafting_recipe/food/hotcrossbun
+ name = "Hot-Cross Bun"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /datum/reagent/consumable/sugar = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/hotcrossbun
+ subcategory = CAT_PASTRY
+
+/datum/crafting_recipe/food/mammi
+ name = "Mammi"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
+ /datum/reagent/consumable/milk = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/soup/mammi
+ subcategory = CAT_PASTRY
+
/datum/crafting_recipe/food/poppypretzel
time = 15
name = "Poppy pretzel"
@@ -465,78 +275,3 @@ datum/crafting_recipe/food/donut/meat
result = /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit
subcategory = CAT_PASTRY
-/datum/crafting_recipe/food/cracker
- time = 15
- name = "Cracker"
- reqs = list(
- /datum/reagent/consumable/sodiumchloride = 1,
- /obj/item/reagent_containers/food/snacks/pastrybase = 1,
- )
- result = /obj/item/reagent_containers/food/snacks/cracker
- subcategory = CAT_PASTRY
-
-/datum/crafting_recipe/food/chococornet
- name = "Choco cornet"
- reqs = list(
- /datum/reagent/consumable/sodiumchloride = 1,
- /obj/item/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/reagent_containers/food/snacks/chocolatebar = 1
- )
- result = /obj/item/reagent_containers/food/snacks/chococornet
- subcategory = CAT_PASTRY
-
-/datum/crafting_recipe/food/oatmealcookie
- name = "Oatmeal cookie"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/reagent_containers/food/snacks/grown/oat = 1
- )
- result = /obj/item/reagent_containers/food/snacks/oatmealcookie
- subcategory = CAT_PASTRY
-
-
-/datum/crafting_recipe/food/raisincookie
- name = "Raisin cookie"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/no_raisin = 1,
- /obj/item/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/reagent_containers/food/snacks/grown/oat = 1
- )
- result = /obj/item/reagent_containers/food/snacks/raisincookie
- subcategory = CAT_PASTRY
-
-/datum/crafting_recipe/food/cherrycupcake
- name = "Cherry cupcake"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/reagent_containers/food/snacks/grown/cherries = 1
- )
- result = /obj/item/reagent_containers/food/snacks/cherrycupcake
- subcategory = CAT_PASTRY
-
-/datum/crafting_recipe/food/bluecherrycupcake
- name = "Blue cherry cupcake"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/reagent_containers/food/snacks/grown/bluecherries = 1
- )
- result = /obj/item/reagent_containers/food/snacks/bluecherrycupcake
- subcategory = CAT_PASTRY
-
-/datum/crafting_recipe/food/strawberrycupcake
- name = "Strawberry cherry cupcake"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/reagent_containers/food/snacks/grown/strawberry = 1
- )
- result = /obj/item/reagent_containers/food/snacks/strawberrycupcake
- subcategory = CAT_PASTRY
-
-/datum/crafting_recipe/food/honeybun
- name = "Honey bun"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/pastrybase = 1,
- /datum/reagent/consumable/honey = 5
- )
- result = /obj/item/reagent_containers/food/snacks/honeybun
- subcategory = CAT_PASTRY
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pies_sweets.dm
similarity index 74%
rename from code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_pies_sweets.dm
index b5bed4d5fc..52becf81df 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pies_sweets.dm
@@ -1,7 +1,16 @@
// see code/module/crafting/table.dm
-////////////////////////////////////////////////PIES////////////////////////////////////////////////
+//////////////////////////////////FRUITS/////////////////////////////////////////
+
+/datum/crafting_recipe/food/applepie
+ name = "Apple pie"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/apple = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/applepie
+ subcategory = CAT_PIE
/datum/crafting_recipe/food/bananacreampie
name = "Banana cream pie"
@@ -13,33 +22,13 @@
result = /obj/item/reagent_containers/food/snacks/pie/cream
subcategory = CAT_PIE
-/datum/crafting_recipe/food/meatpie
- name = "Meat pie"
- reqs = list(
- /datum/reagent/consumable/blackpepper = 1,
- /datum/reagent/consumable/sodiumchloride = 1,
- /obj/item/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/reagent_containers/food/snacks/meat/steak/plain = 1
- )
- result = /obj/item/reagent_containers/food/snacks/pie/meatpie
- subcategory = CAT_PIE
-
-/datum/crafting_recipe/food/tofupie
- name = "Tofu pie"
+/datum/crafting_recipe/food/berryclafoutis
+ name = "Berry clafoutis"
reqs = list(
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/reagent_containers/food/snacks/tofu = 1
+ /obj/item/reagent_containers/food/snacks/grown/berries = 1
)
- result = /obj/item/reagent_containers/food/snacks/pie/tofupie
- subcategory = CAT_PIE
-
-/datum/crafting_recipe/food/xenopie
- name = "Xeno pie"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/reagent_containers/food/snacks/meat/cutlet/xeno = 1
- )
- result = /obj/item/reagent_containers/food/snacks/pie/xemeatpie
+ result = /obj/item/reagent_containers/food/snacks/pie/berryclafoutis
subcategory = CAT_PIE
/datum/crafting_recipe/food/cherrypie
@@ -51,13 +40,53 @@
result = /obj/item/reagent_containers/food/snacks/pie/cherrypie
subcategory = CAT_PIE
-/datum/crafting_recipe/food/berryclafoutis
- name = "Berry clafoutis"
+/datum/crafting_recipe/food/frostypie
+ name = "Frosty pie"
reqs = list(
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/berries = 1
+ /obj/item/reagent_containers/food/snacks/grown/bluecherries = 1
)
- result = /obj/item/reagent_containers/food/snacks/pie/berryclafoutis
+ result = /obj/item/reagent_containers/food/snacks/pie/frostypie
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/grapetart
+ name = "Grape tart"
+ reqs = list(
+ /datum/reagent/consumable/milk = 5,
+ /datum/reagent/consumable/sugar = 5,
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/grapes = 3
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/grapetart
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/peachpie
+ name = "Peach Pie"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/peach = 3
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/peachpie
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/strawberrypie
+ name = "Strawberry pie"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/strawberry = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/strawberrypie
+ subcategory = CAT_PIE
+
+//////////OTHER PIES/////////
+
+/datum/crafting_recipe/food/amanitapie
+ name = "Amanita pie"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/mushroom/amanita = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/amanita_pie
subcategory = CAT_PIE
/datum/crafting_recipe/food/bearypie
@@ -70,64 +99,14 @@
result = /obj/item/reagent_containers/food/snacks/pie/bearypie
subcategory = CAT_PIE
-/datum/crafting_recipe/food/amanitapie
- name = "Amanita pie"
+/datum/crafting_recipe/food/baklava
+ name = "Baklava pie"
reqs = list(
- /obj/item/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/mushroom/amanita = 1
+ /obj/item/reagent_containers/food/snacks/butter = 1,
+ /obj/item/reagent_containers/food/snacks/tortilla = 4, //Layers
+ /obj/item/seeds/wheat/oat = 3
)
- result = /obj/item/reagent_containers/food/snacks/pie/amanita_pie
- subcategory = CAT_PIE
-
-/datum/crafting_recipe/food/plumppie
- name = "Plump pie"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/mushroom/plumphelmet = 1
- )
- result = /obj/item/reagent_containers/food/snacks/pie/plump_pie
- subcategory = CAT_PIE
-
-/datum/crafting_recipe/food/applepie
- name = "Apple pie"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/apple = 1
- )
- result = /obj/item/reagent_containers/food/snacks/pie/applepie
- subcategory = CAT_PIE
-
-/datum/crafting_recipe/food/pumpkinpie
- name = "Pumpkin pie"
- reqs = list(
- /datum/reagent/consumable/milk = 5,
- /datum/reagent/consumable/sugar = 5,
- /obj/item/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/pumpkin = 1
- )
- result = /obj/item/reagent_containers/food/snacks/pie/pumpkinpie
- subcategory = CAT_PIE
-
-/datum/crafting_recipe/food/goldenappletart
- name = "Golden apple tart"
- reqs = list(
- /datum/reagent/consumable/milk = 5,
- /datum/reagent/consumable/sugar = 5,
- /obj/item/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/apple/gold = 1
- )
- result = /obj/item/reagent_containers/food/snacks/pie/appletart
- subcategory = CAT_PIE
-
-/datum/crafting_recipe/food/grapetart
- name = "Grape tart"
- reqs = list(
- /datum/reagent/consumable/milk = 5,
- /datum/reagent/consumable/sugar = 5,
- /obj/item/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/grapes = 3
- )
- result = /obj/item/reagent_containers/food/snacks/pie/grapetart
+ result = /obj/item/reagent_containers/food/snacks/pie/baklava
subcategory = CAT_PIE
/datum/crafting_recipe/food/blumpkinpie
@@ -151,32 +130,66 @@
result = /obj/item/reagent_containers/food/snacks/pie/dulcedebatata
subcategory = CAT_PIE
-/datum/crafting_recipe/food/frostypie
- name = "Frosty pie"
+/datum/crafting_recipe/food/meatpie
+ name = "Meat pie"
reqs = list(
+ /datum/reagent/consumable/blackpepper = 1,
+ /datum/reagent/consumable/sodiumchloride = 1,
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/bluecherries = 1
+ /obj/item/reagent_containers/food/snacks/meat/steak/plain = 1
)
- result = /obj/item/reagent_containers/food/snacks/pie/frostypie
+ result = /obj/item/reagent_containers/food/snacks/pie/meatpie
subcategory = CAT_PIE
-/datum/crafting_recipe/food/strawberrypie
- name = "Strawberry pie"
+/datum/crafting_recipe/food/plumppie
+ name = "Plump pie"
reqs = list(
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/strawberry = 1
+ /obj/item/reagent_containers/food/snacks/grown/mushroom/plumphelmet = 1
)
- result = /obj/item/reagent_containers/food/snacks/pie/strawberrypie
+ result = /obj/item/reagent_containers/food/snacks/pie/plump_pie
subcategory = CAT_PIE
-/datum/crafting_recipe/food/baklava
- name = "Baklava pie"
+/datum/crafting_recipe/food/pumpkinpie
+ name = "Pumpkin pie"
reqs = list(
- /obj/item/reagent_containers/food/snacks/butter = 1,
- /obj/item/reagent_containers/food/snacks/tortilla = 4, //Layers
- /obj/item/seeds/wheat/oat = 3
+ /datum/reagent/consumable/milk = 5,
+ /datum/reagent/consumable/sugar = 5,
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/pumpkin = 1
)
- result = /obj/item/reagent_containers/food/snacks/pie/baklava
+ result = /obj/item/reagent_containers/food/snacks/pie/pumpkinpie
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/tofupie
+ name = "Tofu pie"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /obj/item/reagent_containers/food/snacks/tofu = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/tofupie
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/xenopie
+ name = "Xeno pie"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /obj/item/reagent_containers/food/snacks/meat/cutlet/xeno = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/xemeatpie
+ subcategory = CAT_PIE
+
+//////////////TARTS//////////////
+
+/datum/crafting_recipe/food/goldenappletart
+ name = "Golden apple tart"
+ reqs = list(
+ /datum/reagent/consumable/milk = 5,
+ /datum/reagent/consumable/sugar = 5,
+ /obj/item/reagent_containers/food/snacks/pie/plain = 1,
+ /obj/item/reagent_containers/food/snacks/grown/apple/gold = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pie/appletart
subcategory = CAT_PIE
/datum/crafting_recipe/food/mimetart
@@ -216,11 +229,77 @@
result = /obj/item/reagent_containers/food/snacks/pie/cocolavatart
subcategory = CAT_PIE
-/datum/crafting_recipe/food/peachpie
- name = "Peach Pie"
+////////////////////////////////////////////SWEETS////////////////////////////////////////////
+
+/datum/crafting_recipe/food/candiedapple
+ name = "Candied apple"
+ reqs = list(/datum/reagent/water = 5,
+ /datum/reagent/consumable/sugar = 5,
+ /obj/item/reagent_containers/food/snacks/grown/apple = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/candiedapple
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/chococoin
+ name = "Choco coin"
reqs = list(
- /obj/item/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/reagent_containers/food/snacks/grown/peach = 3
- )
- result = /obj/item/reagent_containers/food/snacks/pie/peachpie
+ /obj/item/coin = 1,
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
+ )
+ result = /obj/item/reagent_containers/food/snacks/chococoin
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/chocoorange
+ name = "Choco orange"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/grown/citrus/orange = 1,
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
+ )
+ result = /obj/item/reagent_containers/food/snacks/chocoorange
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/chocolatebunny
+ name = "Chocolate bunny"
+ reqs = list(
+ /datum/reagent/consumable/sugar = 2,
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/chocolatebunny
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/chocolatestrawberry
+ name = "Chocolate Strawberry"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
+ /obj/item/reagent_containers/food/snacks/grown/strawberry = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/chocolatestrawberry
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/fudgedice
+ name = "Fudge dice"
+ reqs = list(
+ /obj/item/dice = 1,
+ /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
+ )
+ result = /obj/item/reagent_containers/food/snacks/fudgedice
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/honeybar
+ name = "Honey nut bar"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/grown/oat = 1,
+ /datum/reagent/consumable/honey = 5
+ )
+ result = /obj/item/reagent_containers/food/snacks/honeybar
+ subcategory = CAT_PIE
+
+/datum/crafting_recipe/food/spiderlollipop
+ name = "Spider Lollipop"
+ reqs = list(/obj/item/stack/rods = 1,
+ /datum/reagent/consumable/sugar = 5,
+ /datum/reagent/water = 5,
+ /obj/item/reagent_containers/food/snacks/spiderling = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/spiderlollipop
subcategory = CAT_PIE
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm
index 64447dd180..21112a4a4f 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm
@@ -3,6 +3,40 @@
////////////////////////////////////////////////PIZZA!!!////////////////////////////////////////////////
+/datum/crafting_recipe/food/dankpizza
+ name = "Dank pizza"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pizzabread = 1,
+ /obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris = 3,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
+ /obj/item/reagent_containers/food/snacks/grown/tomato = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pizza/dank
+ subcategory = CAT_PIZZA
+
+/datum/crafting_recipe/food/donkpocketpizza
+ name = "Donkpocket pizza"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pizzabread = 1,
+ /obj/item/reagent_containers/food/snacks/donkpocket/warm = 3,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
+ /obj/item/reagent_containers/food/snacks/grown/tomato = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pizza/donkpocket
+ subcategory = CAT_PIZZA
+
+/datum/crafting_recipe/food/pineapplepizza
+ name = "Hawaiian pizza"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pizzabread = 1,
+ /obj/item/reagent_containers/food/snacks/meat/cutlet = 2,
+ /obj/item/reagent_containers/food/snacks/pineappleslice = 3,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
+ /obj/item/reagent_containers/food/snacks/grown/tomato = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pizza/pineapple
+ subcategory = CAT_PIZZA
+
/datum/crafting_recipe/food/margheritapizza
name = "Margherita pizza"
reqs = list(
@@ -24,18 +58,6 @@
result = /obj/item/reagent_containers/food/snacks/pizza/meat
subcategory = CAT_PIZZA
-/datum/crafting_recipe/food/arnold
- name = "Arnold pizza"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/pizzabread = 1,
- /obj/item/reagent_containers/food/snacks/meat/cutlet = 3,
- /obj/item/ammo_casing/c9mm = 8,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/reagent_containers/food/snacks/grown/tomato = 1
- )
- result = /obj/item/reagent_containers/food/snacks/pizza/arnold
- subcategory = CAT_PIZZA
-
/datum/crafting_recipe/food/mushroompizza
name = "Mushroom pizza"
reqs = list(
@@ -45,6 +67,17 @@
result = /obj/item/reagent_containers/food/snacks/pizza/mushroom
subcategory = CAT_PIZZA
+/datum/crafting_recipe/food/sassysagepizza
+ name = "Sassysage pizza"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pizzabread = 1,
+ /obj/item/reagent_containers/food/snacks/faggot = 3,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
+ /obj/item/reagent_containers/food/snacks/grown/tomato = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pizza/sassysage
+ subcategory = CAT_PIZZA
+
/datum/crafting_recipe/food/vegetablepizza
name = "Vegetable pizza"
reqs = list(
@@ -57,50 +90,7 @@
result = /obj/item/reagent_containers/food/snacks/pizza/vegetable
subcategory = CAT_PIZZA
-/datum/crafting_recipe/food/donkpocketpizza
- name = "Donkpocket pizza"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/pizzabread = 1,
- /obj/item/reagent_containers/food/snacks/donkpocket/warm = 3,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/reagent_containers/food/snacks/grown/tomato = 1
- )
- result = /obj/item/reagent_containers/food/snacks/pizza/donkpocket
- subcategory = CAT_PIZZA
-
-/datum/crafting_recipe/food/dankpizza
- name = "Dank pizza"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/pizzabread = 1,
- /obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris = 3,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/reagent_containers/food/snacks/grown/tomato = 1
- )
- result = /obj/item/reagent_containers/food/snacks/pizza/dank
- subcategory = CAT_PIZZA
-
-/datum/crafting_recipe/food/sassysagepizza
- name = "Sassysage pizza"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/pizzabread = 1,
- /obj/item/reagent_containers/food/snacks/faggot = 3,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/reagent_containers/food/snacks/grown/tomato = 1
- )
- result = /obj/item/reagent_containers/food/snacks/pizza/sassysage
- subcategory = CAT_PIZZA
-
-/datum/crafting_recipe/food/pineapplepizza
- name = "Hawaiian pizza"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/pizzabread = 1,
- /obj/item/reagent_containers/food/snacks/meat/cutlet = 2,
- /obj/item/reagent_containers/food/snacks/pineappleslice = 3,
- /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/reagent_containers/food/snacks/grown/tomato = 1
- )
- result = /obj/item/reagent_containers/food/snacks/pizza/pineapple
- subcategory = CAT_PIZZA
+//////Special Pizzas/////
/datum/crafting_recipe/food/pineapplepizza/anomaly
name = "Anomaly Hawaiian pizza"
@@ -120,3 +110,15 @@
tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
result = /obj/item/pizzabox/infinite
subcategory = CAT_PIZZA
+
+/datum/crafting_recipe/food/arnold
+ name = "Arnold pizza"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pizzabread = 1,
+ /obj/item/reagent_containers/food/snacks/meat/cutlet = 3,
+ /obj/item/ammo_casing/c9mm = 8,
+ /obj/item/reagent_containers/food/snacks/cheesewedge = 1,
+ /obj/item/reagent_containers/food/snacks/grown/tomato = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/pizza/arnold
+ subcategory = CAT_PIZZA
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm
index 39eeb7d936..0a44c4590e 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm
@@ -3,16 +3,6 @@
////////////////////////////////////////////////SALADS////////////////////////////////////////////////
-/datum/crafting_recipe/food/herbsalad
- name = "Herb salad"
- reqs = list(
- /obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris = 3,
- /obj/item/reagent_containers/food/snacks/grown/apple = 1
- )
- result = /obj/item/reagent_containers/food/snacks/salad/herbsalad
- subcategory = CAT_SALAD
-
/datum/crafting_recipe/food/aesirsalad
name = "Aesir salad"
reqs = list(
@@ -23,38 +13,16 @@
result = /obj/item/reagent_containers/food/snacks/salad/aesirsalad
subcategory = CAT_SALAD
-/datum/crafting_recipe/food/validsalad
- name = "Valid salad"
+/datum/crafting_recipe/food/citrusdelight
+ name = "Citrus delight"
reqs = list(
/obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris = 3,
- /obj/item/reagent_containers/food/snacks/grown/potato = 1,
- /obj/item/reagent_containers/food/snacks/faggot = 1
- )
- result = /obj/item/reagent_containers/food/snacks/salad/validsalad
- subcategory = CAT_SALAD
+ /obj/item/reagent_containers/food/snacks/grown/citrus/lime = 1,
+ /obj/item/reagent_containers/food/snacks/grown/citrus/lemon = 1,
+ /obj/item/reagent_containers/food/snacks/grown/citrus/orange = 1
-/datum/crafting_recipe/food/monkeysdelight
- name = "Monkeys delight"
- reqs = list(
- /datum/reagent/consumable/flour = 5,
- /datum/reagent/consumable/sodiumchloride = 1,
- /datum/reagent/consumable/blackpepper = 1,
- /obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/monkeycube = 1,
- /obj/item/reagent_containers/food/snacks/grown/banana = 1
)
- result = /obj/item/reagent_containers/food/snacks/soup/monkeysdelight
- subcategory = CAT_SALAD
-
-/datum/crafting_recipe/food/oatmeal
- name = "Oatmeal"
- reqs = list(
- /datum/reagent/consumable/milk = 10,
- /obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/grown/oat = 1
- )
- result = /obj/item/reagent_containers/food/snacks/salad/oatmeal
+ result = /obj/item/reagent_containers/food/snacks/salad/citrusdelight
subcategory = CAT_SALAD
/datum/crafting_recipe/food/fruitsalad
@@ -70,6 +38,16 @@
result = /obj/item/reagent_containers/food/snacks/salad/fruit
subcategory = CAT_SALAD
+/datum/crafting_recipe/food/herbsalad
+ name = "Herb salad"
+ reqs = list(
+ /obj/item/reagent_containers/glass/bowl = 1,
+ /obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris = 3,
+ /obj/item/reagent_containers/food/snacks/grown/apple = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/salad/herbsalad
+ subcategory = CAT_SALAD
+
/datum/crafting_recipe/food/junglesalad
name = "Jungle salad"
reqs = list(
@@ -83,14 +61,26 @@
result = /obj/item/reagent_containers/food/snacks/salad/jungle
subcategory = CAT_SALAD
-/datum/crafting_recipe/food/citrusdelight
- name = "Citrus delight"
+/datum/crafting_recipe/food/monkeysdelight
+ name = "Monkeys delight"
+ reqs = list(
+ /datum/reagent/consumable/flour = 5,
+ /datum/reagent/consumable/sodiumchloride = 1,
+ /datum/reagent/consumable/blackpepper = 1,
+ /obj/item/reagent_containers/glass/bowl = 1,
+ /obj/item/reagent_containers/food/snacks/monkeycube = 1,
+ /obj/item/reagent_containers/food/snacks/grown/banana = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/soup/monkeysdelight
+ subcategory = CAT_SALAD
+
+/datum/crafting_recipe/food/validsalad
+ name = "Valid salad"
reqs = list(
/obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/grown/citrus/lime = 1,
- /obj/item/reagent_containers/food/snacks/grown/citrus/lemon = 1,
- /obj/item/reagent_containers/food/snacks/grown/citrus/orange = 1
-
+ /obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris = 3,
+ /obj/item/reagent_containers/food/snacks/grown/potato = 1,
+ /obj/item/reagent_containers/food/snacks/faggot = 1
)
- result = /obj/item/reagent_containers/food/snacks/salad/citrusdelight
+ result = /obj/item/reagent_containers/food/snacks/salad/validsalad
subcategory = CAT_SALAD
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
index 127b2cc238..d2ea1da50a 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -84,7 +84,6 @@
result = /obj/item/reagent_containers/food/snacks/peanutbutter_sandwich
subcategory = CAT_SANDWICH
-
/datum/crafting_recipe/food/notasandwich
name = "Not a sandwich"
reqs = list(
@@ -113,4 +112,4 @@
/obj/item/reagent_containers/food/snacks/sausage = 1
)
result = /obj/item/reagent_containers/food/snacks/hotdog
- subcategory = CAT_SANDWICH
+ subcategory = CAT_SANDWICH //I don't agree with this.
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sushi.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm
similarity index 87%
rename from code/modules/food_and_drinks/recipes/tablecraft/recipes_sushi.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm
index 9dbf1d684b..4fc12f0777 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sushi.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm
@@ -1,4 +1,6 @@
-//////////////////////////Sushi Components///////////////////////
+// see code/module/crafting/table.dm
+
+///////////////////////Sushi Components///////////////////////////
/datum/crafting_recipe/food/sushi_rice
name = "Sushi Rice"
@@ -7,7 +9,7 @@
/datum/reagent/consumable/rice = 10
)
result = /obj/item/reagent_containers/food/snacks/sushi_rice
- subcategory = CAT_FISH
+ subcategory = CAT_SEAFOOD
/datum/crafting_recipe/food/sea_weed
name = "Sea Weed Sheet"
@@ -17,17 +19,7 @@
/obj/item/reagent_containers/food/snacks/grown/kudzupod = 1,
)
result = /obj/item/reagent_containers/food/snacks/sea_weed
- subcategory = CAT_FISH
-
-/datum/crafting_recipe/food/tuna_can
- name = "Can of Tuna"
- reqs = list(
- /datum/reagent/consumable/sodiumchloride = 15,
- /datum/reagent/consumable/cooking_oil = 5,
- /obj/item/reagent_containers/food/snacks/carpmeat = 1,
- )
- result = /obj/item/reagent_containers/food/snacks/tuna
- subcategory = CAT_FISH
+ subcategory = CAT_SEAFOOD
//////////////////////////Sushi/////////////////////////////////
@@ -39,7 +31,7 @@
/obj/item/reagent_containers/food/snacks/carpmeat = 1
)
result = /obj/item/reagent_containers/food/snacks/sashimi
- subcategory = CAT_FISH
+ subcategory = CAT_SEAFOOD
/datum/crafting_recipe/food/riceball
name = "Onigiri"
@@ -49,7 +41,7 @@
/obj/item/reagent_containers/food/snacks/sushi_rice = 1
)
result = /obj/item/reagent_containers/food/snacks/riceball
- subcategory = CAT_FISH
+ subcategory = CAT_SEAFOOD
/datum/crafting_recipe/food/sushie_egg
name = "Tobiko"
@@ -59,7 +51,7 @@
/obj/item/reagent_containers/food/snacks/sea_weed = 2,
)
result = /obj/item/reagent_containers/food/snacks/tobiko
- subcategory = CAT_FISH
+ subcategory = CAT_SEAFOOD
/datum/crafting_recipe/food/sushie_basic
name = "Funa Hosomaki"
@@ -70,7 +62,7 @@
/obj/item/reagent_containers/food/snacks/sea_weed = 3,
)
result = /obj/item/reagent_containers/food/snacks/sushie_basic
- subcategory = CAT_FISH
+ subcategory = CAT_SEAFOOD
/datum/crafting_recipe/food/sushie_adv
name = "Funa Nigiri"
@@ -80,7 +72,7 @@
/obj/item/reagent_containers/food/snacks/carpmeat = 1
)
result = /obj/item/reagent_containers/food/snacks/sushie_adv
- subcategory = CAT_FISH
+ subcategory = CAT_SEAFOOD
/datum/crafting_recipe/food/sushie_pro
name = "Well made Funa Nigiri"
@@ -91,19 +83,19 @@
/obj/item/reagent_containers/food/snacks/sea_weed = 1
)
result = /obj/item/reagent_containers/food/snacks/sushie_pro
- subcategory = CAT_FISH
+ subcategory = CAT_SEAFOOD
-///////////////Gaijin junk/////////////////////////////////////
+//////////////////////////////////////////////FISH///////////////////////////////////////////
-/datum/crafting_recipe/food/fishfingers
- name = "Fish fingers"
+/datum/crafting_recipe/food/tuna_can
+ name = "Can of Tuna"
reqs = list(
- /datum/reagent/consumable/flour = 5,
- /obj/item/reagent_containers/food/snacks/bun = 1,
- /obj/item/reagent_containers/food/snacks/carpmeat = 1
+ /datum/reagent/consumable/sodiumchloride = 15,
+ /datum/reagent/consumable/cooking_oil = 5,
+ /obj/item/reagent_containers/food/snacks/carpmeat = 1,
)
- result = /obj/item/reagent_containers/food/snacks/fishfingers
- subcategory = CAT_FISH
+ result = /obj/item/reagent_containers/food/snacks/tuna
+ subcategory = CAT_SEAFOOD
/datum/crafting_recipe/food/cubancarp
name = "Cuban carp"
@@ -113,7 +105,17 @@
/obj/item/reagent_containers/food/snacks/carpmeat = 1
)
result = /obj/item/reagent_containers/food/snacks/cubancarp
- subcategory = CAT_FISH
+ subcategory = CAT_SEAFOOD
+
+/datum/crafting_recipe/food/fishfingers
+ name = "Fish fingers"
+ reqs = list(
+ /datum/reagent/consumable/flour = 5,
+ /obj/item/reagent_containers/food/snacks/bun = 1,
+ /obj/item/reagent_containers/food/snacks/carpmeat = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/fishfingers
+ subcategory = CAT_SEAFOOD
/datum/crafting_recipe/food/fishandchips
name = "Fish and chips"
@@ -122,4 +124,4 @@
/obj/item/reagent_containers/food/snacks/carpmeat = 1
)
result = /obj/item/reagent_containers/food/snacks/fishandchips
- subcategory = CAT_FISH
\ No newline at end of file
+ subcategory = CAT_SEAFOOD
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
index 76a5a64096..0c966faf33 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
@@ -3,71 +3,46 @@
////////////////////////////////////////////////SOUP////////////////////////////////////////////////
-/datum/crafting_recipe/food/meatballsoup
- name = "Meatball soup"
+/datum/crafting_recipe/food/amanitajelly
+ name = "Amanita jelly"
+ reqs = list(
+ /datum/reagent/consumable/ethanol/vodka = 5,
+ /obj/item/reagent_containers/glass/bowl = 1,
+ /obj/item/reagent_containers/food/snacks/grown/mushroom/amanita = 3
+ )
+ result = /obj/item/reagent_containers/food/snacks/soup/amanitajelly
+ subcategory = CAT_SOUP
+
+/datum/crafting_recipe/food/beetsoup
+ name = "Beet soup"
reqs = list(
/datum/reagent/water = 10,
/obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/faggot = 1,
- /obj/item/reagent_containers/food/snacks/grown/carrot = 1,
- /obj/item/reagent_containers/food/snacks/grown/potato = 1
+ /obj/item/reagent_containers/food/snacks/grown/whitebeet = 1,
+ /obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
)
- result = /obj/item/reagent_containers/food/snacks/soup/meatball
+ result = /obj/item/reagent_containers/food/snacks/soup/beet
subcategory = CAT_SOUP
-/datum/crafting_recipe/food/vegetablesoup
- name = "Vegetable soup"
+/datum/crafting_recipe/food/bloodsoup
+ name = "Blood soup"
+ reqs = list(
+ /datum/reagent/blood = 10,
+ /obj/item/reagent_containers/glass/bowl = 1,
+ /obj/item/reagent_containers/food/snacks/grown/tomato/blood = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/soup/blood
+ subcategory = CAT_SOUP
+
+/datum/crafting_recipe/food/clownstears
+ name = "Clowns tears"
reqs = list(
/datum/reagent/water = 10,
/obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/grown/carrot = 1,
- /obj/item/reagent_containers/food/snacks/grown/corn = 1,
- /obj/item/reagent_containers/food/snacks/grown/eggplant = 1,
- /obj/item/reagent_containers/food/snacks/grown/potato = 1
+ /obj/item/reagent_containers/food/snacks/grown/banana = 1,
+ /obj/item/stack/ore/bananium = 1
)
- result = /obj/item/reagent_containers/food/snacks/soup/vegetable
- subcategory = CAT_SOUP
-
-/datum/crafting_recipe/food/nettlesoup
- name = "Nettle soup"
- reqs = list(
- /datum/reagent/water = 10,
- /obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/grown/nettle = 1,
- /obj/item/reagent_containers/food/snacks/grown/potato = 1,
- /obj/item/reagent_containers/food/snacks/boiledegg = 1
- )
- result = /obj/item/reagent_containers/food/snacks/soup/nettle
- subcategory = CAT_SOUP
-
-/datum/crafting_recipe/food/wingfangchu
- name = "Wingfangchu"
- reqs = list(
- /obj/item/reagent_containers/glass/bowl = 1,
- /datum/reagent/consumable/soysauce = 5,
- /obj/item/reagent_containers/food/snacks/meat/cutlet/xeno = 2
- )
- result = /obj/item/reagent_containers/food/snacks/soup/wingfangchu
- subcategory = CAT_SOUP
-
-/datum/crafting_recipe/food/wishsoup
- name = "Wish soup"
- reqs = list(
- /datum/reagent/water = 20,
- /obj/item/reagent_containers/glass/bowl = 1
- )
- result= /obj/item/reagent_containers/food/snacks/soup/wish
- subcategory = CAT_SOUP
-
-/datum/crafting_recipe/food/hotchili
- name = "Hot chili"
- reqs = list(
- /obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/meat/cutlet = 2,
- /obj/item/reagent_containers/food/snacks/grown/chili = 1,
- /obj/item/reagent_containers/food/snacks/grown/tomato = 1
- )
- result = /obj/item/reagent_containers/food/snacks/soup/hotchili
+ result = /obj/item/reagent_containers/food/snacks/soup/clownstears
subcategory = CAT_SOUP
/datum/crafting_recipe/food/coldchili
@@ -81,16 +56,6 @@
result = /obj/item/reagent_containers/food/snacks/soup/coldchili
subcategory = CAT_SOUP
-/datum/crafting_recipe/food/tomatosoup
- name = "Tomato soup"
- reqs = list(
- /datum/reagent/water = 10,
- /obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/grown/tomato = 2
- )
- result = /obj/item/reagent_containers/food/snacks/soup/tomato
- subcategory = CAT_SOUP
-
/datum/crafting_recipe/food/eyeballsoup
name = "Eyeball soup"
reqs = list(
@@ -102,6 +67,28 @@
result = /obj/item/reagent_containers/food/snacks/soup/tomato/eyeball
subcategory = CAT_SOUP
+/datum/crafting_recipe/food/hotchili
+ name = "Hot chili"
+ reqs = list(
+ /obj/item/reagent_containers/glass/bowl = 1,
+ /obj/item/reagent_containers/food/snacks/meat/cutlet = 2,
+ /obj/item/reagent_containers/food/snacks/grown/chili = 1,
+ /obj/item/reagent_containers/food/snacks/grown/tomato = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/soup/hotchili
+ subcategory = CAT_SOUP
+
+/datum/crafting_recipe/food/meatballsoup
+ name = "Meatball soup"
+ reqs = list(
+ /datum/reagent/water = 10,
+ /obj/item/reagent_containers/glass/bowl = 1,
+ /obj/item/reagent_containers/food/snacks/faggot = 1,
+ /obj/item/reagent_containers/food/snacks/grown/carrot = 1,
+ /obj/item/reagent_containers/food/snacks/grown/potato = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/soup/meatball
+ subcategory = CAT_SOUP
/datum/crafting_recipe/food/milosoup
name = "Milo soup"
@@ -114,35 +101,15 @@
result = /obj/item/reagent_containers/food/snacks/soup/milo
subcategory = CAT_SOUP
-/datum/crafting_recipe/food/bloodsoup
- name = "Blood soup"
+/datum/crafting_recipe/food/mushroomsoup
+ name = "Mushroom soup"
reqs = list(
- /datum/reagent/blood = 10,
+ /datum/reagent/consumable/milk = 5,
+ /datum/reagent/water = 5,
/obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/grown/tomato/blood = 2
+ /obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle = 1
)
- result = /obj/item/reagent_containers/food/snacks/soup/blood
- subcategory = CAT_SOUP
-
-/datum/crafting_recipe/food/slimesoup
- name = "Slime soup"
- reqs = list(
- /datum/reagent/water = 10,
- /datum/reagent/toxin/slimejelly = 5,
- /obj/item/reagent_containers/glass/bowl = 1
- )
- result = /obj/item/reagent_containers/food/snacks/soup/slime
- subcategory = CAT_SOUP
-
-/datum/crafting_recipe/food/clownstears
- name = "Clowns tears"
- reqs = list(
- /datum/reagent/water = 10,
- /obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/grown/banana = 1,
- /obj/item/stack/ore/bananium = 1
- )
- result = /obj/item/reagent_containers/food/snacks/soup/clownstears
+ result = /obj/item/reagent_containers/food/snacks/soup/mushroom
subcategory = CAT_SOUP
/datum/crafting_recipe/food/mysterysoup
@@ -158,26 +125,37 @@
result = /obj/item/reagent_containers/food/snacks/soup/mystery
subcategory = CAT_SOUP
-/datum/crafting_recipe/food/mushroomsoup
- name = "Mushroom soup"
- reqs = list(
- /datum/reagent/consumable/milk = 5,
- /datum/reagent/water = 5,
- /obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle = 1
- )
- result = /obj/item/reagent_containers/food/snacks/soup/mushroom
- subcategory = CAT_SOUP
-
-/datum/crafting_recipe/food/beetsoup
- name = "Beet soup"
+/datum/crafting_recipe/food/nettlesoup
+ name = "Nettle soup"
reqs = list(
/datum/reagent/water = 10,
/obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/grown/whitebeet = 1,
- /obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
+ /obj/item/reagent_containers/food/snacks/grown/nettle = 1,
+ /obj/item/reagent_containers/food/snacks/grown/potato = 1,
+ /obj/item/reagent_containers/food/snacks/boiledegg = 1
)
- result = /obj/item/reagent_containers/food/snacks/soup/beet
+ result = /obj/item/reagent_containers/food/snacks/soup/nettle
+ subcategory = CAT_SOUP
+
+/datum/crafting_recipe/food/redbeetsoup
+ name = "Red beet soup"
+ reqs = list(
+ /datum/reagent/water = 10,
+ /obj/item/reagent_containers/glass/bowl = 1,
+ /obj/item/reagent_containers/food/snacks/grown/redbeet = 1,
+ /obj/item/reagent_containers/food/snacks/grown/cabbage = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/soup/beet/red
+ subcategory = CAT_SOUP
+
+/datum/crafting_recipe/food/slimesoup
+ name = "Slime soup"
+ reqs = list(
+ /datum/reagent/water = 10,
+ /datum/reagent/toxin/slimejelly = 5,
+ /obj/item/reagent_containers/glass/bowl = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/soup/slime
subcategory = CAT_SOUP
/datum/crafting_recipe/food/stew
@@ -205,16 +183,6 @@
result = /obj/item/reagent_containers/food/snacks/soup/spacylibertyduff
subcategory = CAT_SOUP
-/datum/crafting_recipe/food/amanitajelly
- name = "Amanita jelly"
- reqs = list(
- /datum/reagent/consumable/ethanol/vodka = 5,
- /obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/grown/mushroom/amanita = 3
- )
- result = /obj/item/reagent_containers/food/snacks/soup/amanitajelly
- subcategory = CAT_SOUP
-
/datum/crafting_recipe/food/sweetpotatosoup
name = "Sweet potato soup"
reqs = list(
@@ -226,13 +194,44 @@
result = /obj/item/reagent_containers/food/snacks/soup/sweetpotato
subcategory = CAT_SOUP
-/datum/crafting_recipe/food/redbeetsoup
- name = "Red beet soup"
+/datum/crafting_recipe/food/tomatosoup
+ name = "Tomato soup"
reqs = list(
/datum/reagent/water = 10,
/obj/item/reagent_containers/glass/bowl = 1,
- /obj/item/reagent_containers/food/snacks/grown/redbeet = 1,
- /obj/item/reagent_containers/food/snacks/grown/cabbage = 1
+ /obj/item/reagent_containers/food/snacks/grown/tomato = 2
)
- result = /obj/item/reagent_containers/food/snacks/soup/beet/red
+ result = /obj/item/reagent_containers/food/snacks/soup/tomato
subcategory = CAT_SOUP
+
+/datum/crafting_recipe/food/vegetablesoup
+ name = "Vegetable soup"
+ reqs = list(
+ /datum/reagent/water = 10,
+ /obj/item/reagent_containers/glass/bowl = 1,
+ /obj/item/reagent_containers/food/snacks/grown/carrot = 1,
+ /obj/item/reagent_containers/food/snacks/grown/corn = 1,
+ /obj/item/reagent_containers/food/snacks/grown/eggplant = 1,
+ /obj/item/reagent_containers/food/snacks/grown/potato = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/soup/vegetable
+ subcategory = CAT_SOUP
+
+/datum/crafting_recipe/food/wingfangchu
+ name = "Wingfangchu"
+ reqs = list(
+ /obj/item/reagent_containers/glass/bowl = 1,
+ /datum/reagent/consumable/soysauce = 5,
+ /obj/item/reagent_containers/food/snacks/meat/cutlet/xeno = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/soup/wingfangchu
+ subcategory = CAT_SOUP
+
+/datum/crafting_recipe/food/wishsoup
+ name = "Wish soup"
+ reqs = list(
+ /datum/reagent/water = 20,
+ /obj/item/reagent_containers/glass/bowl = 1
+ )
+ result= /obj/item/reagent_containers/food/snacks/soup/wish
+ subcategory = CAT_SOUP
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
index 355402111c..12020a6241 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
@@ -3,15 +3,6 @@
////////////////////////////////////////////////SPAGHETTI////////////////////////////////////////////////
-/datum/crafting_recipe/food/tomatopasta
- name = "Tomato pasta"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/boiledspaghetti = 1,
- /obj/item/reagent_containers/food/snacks/grown/tomato = 2
- )
- result = /obj/item/reagent_containers/food/snacks/pastatomato
- subcategory = CAT_SPAGHETTI
-
/datum/crafting_recipe/food/copypasta
name = "Copypasta"
reqs = list(
@@ -38,6 +29,17 @@
result = /obj/item/reagent_containers/food/snacks/spesslaw
subcategory = CAT_SPAGHETTI
+/datum/crafting_recipe/food/tomatopasta
+ name = "Tomato pasta"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/boiledspaghetti = 1,
+ /obj/item/reagent_containers/food/snacks/grown/tomato = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/pastatomato
+ subcategory = CAT_SPAGHETTI
+
+////////////NOODLES///////////
+
/datum/crafting_recipe/food/beefnoodle
name = "Beef noodle"
reqs = list(
diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm
index 1898fe4b01..5f2d92fc93 100644
--- a/code/modules/holiday/easter.dm
+++ b/code/modules/holiday/easter.dm
@@ -140,96 +140,8 @@
containsPrize = FALSE
qdel(src)
-//Easter Recipes + food
-/obj/item/reagent_containers/food/snacks/hotcrossbun
- bitesize = 2
- name = "hot-cross bun"
- desc = "The Cross represents the Assistants that died for your sins."
- icon_state = "hotcrossbun"
-
-/datum/crafting_recipe/food/hotcrossbun
- name = "Hot-Cross Bun"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
- /datum/reagent/consumable/sugar = 1
- )
- result = /obj/item/reagent_containers/food/snacks/hotcrossbun
- category = CAT_MISCFOOD
-
-
-/obj/item/reagent_containers/food/snacks/store/cake/brioche
- name = "brioche cake"
- desc = "A ring of sweet, glazed buns."
- icon_state = "briochecake"
- slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/brioche
- slices_num = 6
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2)
-
-/obj/item/reagent_containers/food/snacks/cakeslice/brioche
- name = "brioche cake slice"
- desc = "Delicious sweet-bread. Who needs anything else?"
- icon_state = "briochecake_slice"
- filling_color = "#FFD700"
-
-/datum/crafting_recipe/food/briochecake
- name = "Brioche cake"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
- /datum/reagent/consumable/sugar = 2
- )
- result = /obj/item/reagent_containers/food/snacks/store/cake/brioche
- category = CAT_MISCFOOD
-
-/obj/item/reagent_containers/food/snacks/scotchegg
- name = "scotch egg"
- desc = "A boiled egg wrapped in a delicious, seasoned meatball."
- icon_state = "scotchegg"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2)
- bitesize = 3
- filling_color = "#FFFFF0"
- list_reagents = list(/datum/reagent/consumable/nutriment = 6)
-
-/datum/crafting_recipe/food/scotchegg
- name = "Scotch egg"
- reqs = list(
- /datum/reagent/consumable/sodiumchloride = 1,
- /datum/reagent/consumable/blackpepper = 1,
- /obj/item/reagent_containers/food/snacks/boiledegg = 1,
- /obj/item/reagent_containers/food/snacks/faggot = 1
- )
- result = /obj/item/reagent_containers/food/snacks/scotchegg
- category = CAT_MISCFOOD
-
-/obj/item/reagent_containers/food/snacks/soup/mammi
- name = "Mammi"
- desc = "A bowl of mushy bread and milk. It reminds you, not too fondly, of a bowel movement."
- icon_state = "mammi"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1)
-
-/datum/crafting_recipe/food/mammi
- name = "Mammi"
- reqs = list(
- /obj/item/reagent_containers/food/snacks/store/bread/plain = 1,
- /obj/item/reagent_containers/food/snacks/chocolatebar = 1,
- /datum/reagent/consumable/milk = 5
- )
- result = /obj/item/reagent_containers/food/snacks/soup/mammi
- category = CAT_MISCFOOD
-
-/obj/item/reagent_containers/food/snacks/chocolatebunny
- name = "chocolate bunny"
- desc = "Contains less than 10% real rabbit!"
- icon_state = "chocolatebunny"
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
- list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/coco = 2)
- filling_color = "#A0522D"
-
-/datum/crafting_recipe/food/chocolatebunny
- name = "Chocolate bunny"
- reqs = list(
- /datum/reagent/consumable/sugar = 2,
- /obj/item/reagent_containers/food/snacks/chocolatebar = 1
- )
- result = /obj/item/reagent_containers/food/snacks/chocolatebunny
- category = CAT_MISCFOOD
+/*
+Easter Recipes + Food moved to appropriate files.
+\code\modules\food_and_drinks\
+\code\modules\food_and_drinks\recipes\
+*/
\ No newline at end of file
diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm
index 2b116bbfd3..638d1427bc 100644
--- a/code/modules/holiday/halloween/jacqueen.dm
+++ b/code/modules/holiday/halloween/jacqueen.dm
@@ -46,6 +46,8 @@
var/progression = list() //Keep track of where people are in the story.
var/active = TRUE //Turn this to false to keep normal mob behavour
var/cached_z
+ /// I'm busy chatting, don't move.
+ var/busy_chatting = FALSE
/mob/living/simple_animal/jacq/Initialize()
..()
@@ -76,9 +78,9 @@
say("Hello there [gender_check(M)]!")
return ..()
if(!ckey)
- canmove = FALSE
+ busy_chatting = FALSE
chit_chat(M)
- canmove = TRUE
+ busy_chatting = TRUE
..()
/mob/living/simple_animal/jacq/attack_paw(mob/living/carbon/monkey/M)
@@ -86,9 +88,9 @@
say("Hello there [gender_check(M)]!")
return ..()
if(!ckey)
- canmove = FALSE
+ busy_chatting = FALSE
chit_chat(M)
- canmove = TRUE
+ busy_chatting = TRUE
..()
/mob/living/simple_animal/jacq/proc/poof()
@@ -99,7 +101,7 @@
s.set_up(R, 0, loc)
s.start()
visible_message("[src] disappears in a puff of smoke!")
- canmove = TRUE
+ busy_chatting = TRUE
health = 25
//Try to go to populated areas
@@ -377,6 +379,12 @@
sleep(20)
poof()
+/mob/living/simple_animal/jacq/update_mobility()
+ . = ..()
+ if(busy_chatting)
+ DISABLE_BITFIELD(., MOBILITY_MOVE)
+ mobility_flags = .
+
/obj/item/clothing/head/hardhat/pumpkinhead/jaqc
name = "Jacq o' latern"
desc = "A jacqueline o' lantern! You can't seem to get rid of it."
diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm
index 8fa0825628..9fb97c08a7 100644
--- a/code/modules/holodeck/area_copy.dm
+++ b/code/modules/holodeck/area_copy.dm
@@ -4,6 +4,10 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list(
"power_supply", "contents", "reagents", "stat", "x", "y", "z", "group", "atmos_adjacent_turfs", "comp_lookup"
))
+GLOBAL_LIST_INIT(duplicate_forbidden_vars_by_type, typecacheof_assoc_list(list(
+ /obj/item/gun/energy = "ammo_type"
+ )))
+
/proc/DuplicateObject(atom/original, perfectcopy = TRUE, sameloc = FALSE, atom/newloc = null, nerf = FALSE, holoitem=FALSE)
RETURN_TYPE(original.type)
if(!original)
@@ -16,7 +20,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list(
O = new original.type(newloc)
if(perfectcopy && O && original)
- for(var/V in original.vars - GLOB.duplicate_forbidden_vars)
+ for(var/V in original.vars - GLOB.duplicate_forbidden_vars - GLOB.duplicate_forbidden_vars_by_type[O.type])
if(islist(original.vars[V]))
var/list/L = original.vars[V]
O.vars[V] = L.Copy()
diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm
index 206a5c14a3..e6aed7a8ca 100644
--- a/code/modules/holodeck/items.dm
+++ b/code/modules/holodeck/items.dm
@@ -87,7 +87,7 @@
playsound(src, 'sound/items/dodgeball.ogg', 50, 1)
M.apply_damage(10, STAMINA)
if(prob(5))
- M.Knockdown(60)
+ M.DefaultCombatKnockdown(60)
visible_message("[M] is knocked right off [M.p_their()] feet!")
//
@@ -117,7 +117,7 @@
to_chat(user, "You need a better grip to do that!")
return
L.forceMove(loc)
- L.Knockdown(100)
+ L.DefaultCombatKnockdown(100)
visible_message("[user] dunks [L] into \the [src]!")
user.stop_pulling()
else
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index 6f3c8c9047..f7715e7320 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -196,7 +196,7 @@
dat += "x5"
if(ispath(D.build_path, /obj/item/stack))
dat += "x10"
- dat += "([D.materials[getmaterialref(/datum/material/biomass)]/efficiency])
"
+ dat += "([D.materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]/efficiency])
"
dat += ""
else
dat += "No container inside, please insert container.
"
@@ -233,14 +233,14 @@
menustat = "void"
/obj/machinery/biogenerator/proc/check_cost(list/materials, multiplier = 1, remove_points = TRUE)
- if(materials.len != 1 || materials[1] != getmaterialref(/datum/material/biomass))
+ if(materials.len != 1 || materials[1] != SSmaterials.GetMaterialRef(/datum/material/biomass))
return FALSE
- if (materials[getmaterialref(/datum/material/biomass)]*multiplier/efficiency > points)
+ if (materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]*multiplier/efficiency > points)
menustat = "nopoints"
return FALSE
else
if(remove_points)
- points -= materials[getmaterialref(/datum/material/biomass)]*multiplier/efficiency
+ points -= materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]*multiplier/efficiency
update_icon()
updateUsrDialog()
return TRUE
diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm
index b8496c865c..6ebfd3254f 100644
--- a/code/modules/hydroponics/grown/misc.dm
+++ b/code/modules/hydroponics/grown/misc.dm
@@ -234,19 +234,6 @@
reagents.chem_temp = 1000 //Sets off the black powder
reagents.handle_reactions()
-// Lavaland cactus
-
-/obj/item/seeds/lavaland/cactus
- name = "pack of fruiting cactus seeds"
- desc = "These seeds grow into fruiting cacti."
- icon_state = "seed-cactus"
- species = "cactus"
- plantname = "Fruiting Cactus"
- product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit
- growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
- growthstages = 2
-
-
// Coconut
/obj/item/seeds/coconut
name = "pack of coconut seeds"
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
index 554115eb5f..699a1c798d 100644
--- a/code/modules/hydroponics/grown/mushrooms.dm
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -334,68 +334,4 @@
/obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom/attack_self(mob/user)
. = ..()
if(.)
- investigate_log("was planted by [key_name(user)] at [AREACOORD(user)]", INVESTIGATE_BOTANY)
-
-//// LAVALAND MUSHROOMS ////
-
-// Bracket (Shaving mushroom)
-
-/obj/item/seeds/lavaland
- name = "lavaland seeds"
- desc = "You should never see this."
- lifespan = 50
- endurance = 25
- maturation = 7
- production = 4
- yield = 4
- potency = 15
- growthstages = 3
- rarity = 20
- reagents_add = list(/datum/reagent/consumable/nutriment = 0.1)
- resistance_flags = FIRE_PROOF
-
-/obj/item/seeds/lavaland/polypore
- name = "pack of polypore mycelium"
- desc = "This mycelium grows into bracket mushrooms, also known as polypores. Woody and firm, shaft miners often use them for makeshift crafts."
- icon_state = "mycelium-polypore"
- species = "polypore"
- plantname = "Polypore Mushrooms"
- product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings
- genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
- growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
-
-// Porcini (Leafy mushroom)
-
-/obj/item/seeds/lavaland/porcini
- name = "pack of porcini mycelium"
- desc = "This mycelium grows into Boletus edulus, also known as porcini. Native to the late Earth, but discovered on Lavaland. Has culinary, medicinal and relaxant effects."
- icon_state = "mycelium-porcini"
- species = "porcini"
- plantname = "Porcini Mushrooms"
- product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf
- genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
- growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
-
-// Inocybe (Mushroom caps)
-
-/obj/item/seeds/lavaland/inocybe
- name = "pack of inocybe mycelium"
- desc = "This mycelium grows into an inocybe mushroom, a species of Lavaland origin with hallucinatory and toxic effects."
- icon_state = "mycelium-inocybe"
- species = "inocybe"
- plantname = "Inocybe Mushrooms"
- product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap
- genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
- growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
-
-// Embershroom (Mushroom stem)
-
-/obj/item/seeds/lavaland/ember
- name = "pack of embershroom mycelium"
- desc = "This mycelium grows into embershrooms, a species of bioluminescent mushrooms native to Lavaland."
- icon_state = "mycelium-ember"
- species = "ember"
- plantname = "Embershroom Mushrooms"
- product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem
- genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/glow)
- growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ investigate_log("was planted by [key_name(user)] at [AREACOORD(user)]", INVESTIGATE_BOTANY)
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
index c3bd82c624..0979ea483f 100644
--- a/code/modules/hydroponics/grown/nettle.dm
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -98,7 +98,7 @@
/obj/item/reagent_containers/food/snacks/grown/nettle/death/pickup(mob/living/carbon/user)
if(..())
if(prob(50))
- user.Knockdown(100)
+ user.DefaultCombatKnockdown(100)
to_chat(user, "You are stunned by the Deathnettle as you try picking it up!")
/obj/item/reagent_containers/food/snacks/grown/nettle/death/attack(mob/living/carbon/M, mob/user)
@@ -111,5 +111,5 @@
M.adjust_blurriness(force/7)
if(prob(20))
M.Unconscious(force / 0.3)
- M.Knockdown(force / 0.75)
+ M.DefaultCombatKnockdown(force / 0.75)
M.drop_all_held_items()
diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm
index 53c3389695..d3525c951d 100644
--- a/code/modules/hydroponics/grown/tomato.dm
+++ b/code/modules/hydroponics/grown/tomato.dm
@@ -36,7 +36,7 @@
plantname = "Blood-Tomato Plants"
product = /obj/item/reagent_containers/food/snacks/grown/tomato/blood
mutatelist = list()
- reagents_add = list(/datum/reagent/blood = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1)
+ reagents_add = list(/datum/reagent/blood/tomato = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1)
rarity = 20
/obj/item/reagent_containers/food/snacks/grown/tomato/blood
@@ -47,7 +47,7 @@
splat_type = /obj/effect/gibspawner/generic
filling_color = "#FF0000"
foodtype = FRUIT | GROSS
- grind_results = list(/datum/reagent/consumable/ketchup = 0, /datum/reagent/blood = 0)
+ grind_results = list(/datum/reagent/consumable/ketchup = 0, /datum/reagent/blood/tomato = 0)
distill_reagent = /datum/reagent/consumable/ethanol/bloody_mary
// Blue Tomato
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 1cd63db6da..718033ac56 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -620,7 +620,7 @@
if(!(myseed.resistance_flags & FIRE_PROOF))
adjustHealth(-round(S.get_reagent_amount(/datum/reagent/napalm) * 6))
adjustToxic(round(S.get_reagent_amount(/datum/reagent/napalm) * 7))
- adjustWeeds(-rand(5,9))
+ adjustWeeds(-rand(5,9))
//Weed Spray
if(S.has_reagent(/datum/reagent/toxin/plantbgone/weedkiller, 1))
diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm
index cdccc92cfd..5f6440bffb 100644
--- a/code/modules/integrated_electronics/core/printer.dm
+++ b/code/modules/integrated_electronics/core/printer.dm
@@ -190,10 +190,10 @@
var/cost = 400
if(ispath(build_type, /obj/item/electronic_assembly))
var/obj/item/electronic_assembly/E = SScircuit.cached_assemblies[build_type]
- cost = E.custom_materials[getmaterialref(/datum/material/iron)]
+ cost = E.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]
else if(ispath(build_type, /obj/item/integrated_circuit))
var/obj/item/integrated_circuit/IC = SScircuit.cached_components[build_type]
- cost = IC.custom_materials[getmaterialref(/datum/material/iron)]
+ cost = IC.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]
else if(!(build_type in SScircuit.circuit_fabricator_recipe_list["Tools"]))
return
diff --git a/code/modules/integrated_electronics/core/saved_circuits.dm b/code/modules/integrated_electronics/core/saved_circuits.dm
index cbf3bba616..61ada24b25 100644
--- a/code/modules/integrated_electronics/core/saved_circuits.dm
+++ b/code/modules/integrated_electronics/core/saved_circuits.dm
@@ -260,7 +260,7 @@
blocks["max_space"] = assembly.max_components
// Start keeping track of total metal cost
- blocks["metal_cost"] = assembly.custom_materials[getmaterialref(/datum/material/iron)]
+ blocks["metal_cost"] = assembly.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]
// Block 2. Components.
@@ -291,7 +291,7 @@
// Update estimated assembly complexity, taken space and material cost
blocks["complexity"] += component.complexity
blocks["used_space"] += component.size
- blocks["metal_cost"] += component.custom_materials[getmaterialref(/datum/material/iron)]
+ blocks["metal_cost"] += component.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]
// Check if the assembly requires printer upgrades
if(!(component.spawn_flags & IC_SPAWN_DEFAULT))
diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm
index 9b275d85fe..3183a6d0e6 100644
--- a/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -414,7 +414,7 @@
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
set_pin_data(IC_OUTPUT, 2, materials.total_amount)
for(var/I in 1 to mtypes.len)
- var/datum/material/M = materials.materials[getmaterialref(I)]
+ var/datum/material/M = materials.materials[SSmaterials.GetMaterialRef(I)]
var/amount = materials[M]
if(M)
set_pin_data(IC_OUTPUT, I+2, amount)
@@ -452,7 +452,7 @@
continue
if(!mt) //Invalid input
if(U>0)
- if(materials.retrieve_sheets(U, getmaterialref(mtypes[I]), T))
+ if(materials.retrieve_sheets(U, SSmaterials.GetMaterialRef(mtypes[I]), T))
suc = TRUE
else
if(mt.transer_amt_to(materials, U, mtypes[I]))
diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm
index 350f05914d..02340970af 100644
--- a/code/modules/integrated_electronics/subtypes/weaponized.dm
+++ b/code/modules/integrated_electronics/subtypes/weaponized.dm
@@ -336,7 +336,7 @@
if(!L || !isliving(L))
return 0
- L.Knockdown(stunforce)
+ L.DefaultCombatKnockdown(stunforce)
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
message_admins("stunned someone with an assembly. Last touches: Assembly: [assembly.fingerprintslast] Circuit: [fingerprintslast]")
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index eddb18b25e..9bd5dc1684 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -357,7 +357,7 @@
/proc/get_all_jobs()
return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Cook", "Botanist", "Quartermaster", "Cargo Technician",
"Shaft Miner", "Clown", "Mime", "Janitor", "Curator", "Lawyer", "Chaplain", "Chief Engineer", "Station Engineer",
- "Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist",
+ "Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist", "Paramedic",
"Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer")
/proc/get_all_job_icons() //For all existing HUD icons
diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm
new file mode 100644
index 0000000000..b74f1a1c18
--- /dev/null
+++ b/code/modules/jobs/job_types/paramedic.dm
@@ -0,0 +1,44 @@
+/datum/job/paramedic
+ title = "Paramedic"
+ flag = PARAMEDIC
+ department_head = list("Chief Medical Officer")
+ department_flag = MEDSCI
+ faction = "Station"
+ total_positions = 3
+ spawn_positions = 2
+ supervisors = "the chief medical officer"
+ selection_color = "#74b5e0"
+
+ outfit = /datum/outfit/job/paramedic
+
+ access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS)
+
+ minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS)
+
+ display_order = JOB_DISPLAY_ORDER_PARAMEDIC
+
+/datum/outfit/job/paramedic
+ name = "Paramedic"
+ jobtype = /datum/job/paramedic
+
+ ears = /obj/item/radio/headset/headset_med
+ gloves = /obj/item/clothing/gloves/color/latex/nitrile
+ uniform = /obj/item/clothing/under/rank/medical/paramedic
+ mask = /obj/item/clothing/mask/cigarette
+ shoes = /obj/item/clothing/shoes/jackboots
+ head = /obj/item/clothing/head/soft/emt
+ suit = /obj/item/clothing/suit/toggle/labcoat/paramedic
+ belt = /obj/item/storage/belt/medical
+ l_hand = /obj/item/storage/firstaid/regular
+ suit_store = /obj/item/flashlight/pen
+ id = /obj/item/card/id
+ r_pocket = /obj/item/pinpointer/crew
+ l_pocket = /obj/item/pda/medical
+ backpack_contents = list(/obj/item/roller=1)
+ pda_slot = SLOT_L_STORE
+
+ backpack = /obj/item/storage/backpack/medic
+ satchel = /obj/item/storage/backpack/satchel/med
+ duffelbag = /obj/item/storage/backpack/duffelbag/med
+
+ chameleon_extras = /obj/item/gun/syringe
diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm
index 92fd25a811..78b7dd3964 100644
--- a/code/modules/jobs/jobs.dm
+++ b/code/modules/jobs/jobs.dm
@@ -18,6 +18,7 @@ GLOBAL_LIST_INIT(medical_positions, list(
"Medical Doctor",
"Geneticist",
"Virologist",
+ "Paramedic",
"Chemist"))
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 459212aad0..bfd0ae03cb 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -112,14 +112,14 @@
else
return ..()
-/obj/structure/bookcase/attack_hand(mob/user)
+/obj/structure/bookcase/attack_hand(mob/living/user)
. = ..()
- if(.)
+ if(. || !istype(user))
return
if(contents.len)
var/obj/item/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents
if(choice)
- if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
+ if(!CHECK_MOBILITY(user, MOBILITY_USE) || !in_range(loc, user))
return
if(ishuman(user))
if(!user.get_active_held_item())
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index 10b33cd473..68e70dc882 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -23,7 +23,7 @@
return
template = SSmapping.shelter_templates[template_id]
if(!template)
- throw EXCEPTION("Shelter template ([template_id]) not found!")
+ stack_trace("Shelter template ([template_id]) not found!")
qdel(src)
/obj/item/survivalcapsule/Destroy()
diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm
index 5e2e8bdd5a..c31008fa62 100644
--- a/code/modules/mining/equipment/wormhole_jaunter.dm
+++ b/code/modules/mining/equipment/wormhole_jaunter.dm
@@ -93,7 +93,7 @@
playsound(M,'sound/weapons/resonator_blast.ogg',50,1)
if(iscarbon(M))
var/mob/living/carbon/L = M
- L.Knockdown(60)
+ L.DefaultCombatKnockdown(60)
if(ishuman(L))
shake_camera(L, 20, 1)
addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm
index fd366670f0..5044a73c10 100644
--- a/code/modules/mining/fulton.dm
+++ b/code/modules/mining/fulton.dm
@@ -74,7 +74,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
var/mutable_appearance/balloon3
if(isliving(A))
var/mob/living/M = A
- M.Knockdown(320) // Keep them from moving during the duration of the extraction
+ M.DefaultCombatKnockdown(320) // Keep them from moving during the duration of the extraction
M.buckled = 0 // Unbuckle them to prevent anchoring problems
else
A.anchored = TRUE
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
index ea0174d2a5..43c8dec129 100644
--- a/code/modules/mining/lavaland/ash_flora.dm
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -227,6 +227,78 @@
else
. = ..()
+////// LAVALAND FLORA //////
+
+/obj/item/seeds/lavaland
+ name = "lavaland seeds"
+ desc = "You should never see this."
+ lifespan = 50
+ endurance = 25
+ maturation = 7
+ production = 4
+ yield = 4
+ potency = 15
+ growthstages = 3
+ rarity = 20
+ reagents_add = list(/datum/reagent/consumable/nutriment = 0.1)
+ resistance_flags = FIRE_PROOF
+
+/obj/item/seeds/lavaland/cactus
+ name = "pack of fruiting cactus seeds"
+ desc = "These seeds grow into fruiting cacti."
+ icon_state = "seed-cactus"
+ species = "cactus"
+ plantname = "Fruiting Cactus"
+ product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit
+ genes = list(/datum/plant_gene/trait/fire_resistance)
+ growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
+ growthstages = 2
+ reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.04, /datum/reagent/consumable/vitfro = 0.08)
+
+/obj/item/seeds/lavaland/polypore
+ name = "pack of polypore mycelium"
+ desc = "This mycelium grows into bracket mushrooms, also known as polypores. Woody and firm, shaft miners often use them for makeshift crafts."
+ icon_state = "mycelium-polypore"
+ species = "polypore"
+ plantname = "Polypore Mushrooms"
+ product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/fire_resistance)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ reagents_add = list(/datum/reagent/consumable/sugar = 0.06, /datum/reagent/consumable/ethanol = 0.04, /datum/reagent/stabilizing_agent = 0.06, /datum/reagent/toxin/minttoxin = 0.02)
+
+/obj/item/seeds/lavaland/porcini
+ name = "pack of porcini mycelium"
+ desc = "This mycelium grows into Boletus edulus, also known as porcini. Native to the late Earth, but discovered on Lavaland. Has culinary, medicinal and relaxant effects."
+ icon_state = "mycelium-porcini"
+ species = "porcini"
+ plantname = "Porcini Mushrooms"
+ product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/fire_resistance)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ reagents_add = list(/datum/reagent/consumable/nutriment = 0.06, /datum/reagent/consumable/vitfro = 0.04, /datum/reagent/drug/nicotine = 0.04)
+
+/obj/item/seeds/lavaland/inocybe
+ name = "pack of inocybe mycelium"
+ desc = "This mycelium grows into an inocybe mushroom, a species of Lavaland origin with hallucinatory and toxic effects."
+ icon_state = "mycelium-inocybe"
+ species = "inocybe"
+ plantname = "Inocybe Mushrooms"
+ product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/fire_resistance)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ reagents_add = list(/datum/reagent/toxin/mindbreaker = 0.04, /datum/reagent/consumable/entpoly = 0.08, /datum/reagent/drug/mushroomhallucinogen = 0.04)
+
+/obj/item/seeds/lavaland/ember
+ name = "pack of embershroom mycelium"
+ desc = "This mycelium grows into embershrooms, a species of bioluminescent mushrooms native to Lavaland."
+ icon_state = "mycelium-ember"
+ species = "ember"
+ plantname = "Embershroom Mushrooms"
+ product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem
+ genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/glow, /datum/plant_gene/trait/fire_resistance)
+ growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ reagents_add = list(/datum/reagent/consumable/tinlux = 0.04, /datum/reagent/consumable/nutriment/vitamin = 0.02, /datum/reagent/drug/space_drugs = 0.02)
+
//what you can craft with these things
/datum/crafting_recipe/mushroom_bowl
name = "Mushroom Bowl"
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 9561684414..512fa8f3e4 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -86,7 +86,7 @@
proximity_monitor = new(src, 1)
AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace), INFINITY, TRUE, /obj/item/stack)
stored_research = new /datum/techweb/specialized/autounlocking/smelter
- selected_material = getmaterialref(/datum/material/iron)
+ selected_material = SSmaterials.GetMaterialRef(/datum/material/iron)
/obj/machinery/mineral/processing_unit/Destroy()
CONSOLE = null
diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm
index c9f9a2cfbb..d04c0104e5 100644
--- a/code/modules/mining/mint.dm
+++ b/code/modules/mining/mint.dm
@@ -29,7 +29,7 @@
/datum/material/plastic,
/datum/material/runite
), MINERAL_MATERIAL_AMOUNT * 50, FALSE, /obj/item/stack)
- chosen = getmaterialref(chosen)
+ chosen = SSmaterials.GetMaterialRef(chosen)
/obj/machinery/mineral/mint/process()
var/turf/T = get_step(src, input_dir)
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 8240724d66..4f9bad2f0f 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -94,12 +94,12 @@
w_class = WEIGHT_CLASS_TINY
GLOBAL_LIST_INIT(sand_recipes, list(\
- new /datum/stack_recipe("sandstone", /obj/item/stack/sheet/mineral/sandstone, 1, 1, 50)\
- ))
+ new/datum/stack_recipe("sandstone", /obj/item/stack/sheet/mineral/sandstone, 1, 1, 50),\
+ ))
-/obj/item/stack/ore/glass/Initialize(mapload, new_amount, merge = TRUE)
- recipes = GLOB.sand_recipes
+/obj/item/stack/ore/glass/get_main_recipes()
. = ..()
+ . += GLOB.sand_recipes
/obj/item/stack/ore/glass/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(..() || !ishuman(hit_atom))
@@ -144,7 +144,6 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
to_chat(user, "You can't hit a high enough temperature to smelt [src] properly!")
return TRUE
-
/obj/item/stack/ore/silver
name = "silver ore"
icon_state = "Silver ore"
@@ -321,12 +320,13 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
throwforce = 2
w_class = WEIGHT_CLASS_TINY
custom_materials = list(/datum/material/iron = 400)
- material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS
var/string_attached
var/list/sideslist = list("heads","tails")
var/cooldown = 0
var/value
var/coinflip
+ item_flags = NO_MAT_REDEMPTION //You know, it's kind of a problem that money is worth more extrinsicly than intrinsically in this universe.
/obj/item/coin/Initialize()
. = ..()
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 0418b281e6..7658bd963d 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -10,7 +10,6 @@
density = FALSE
stat = DEAD
- canmove = FALSE
var/mob/living/new_character //for instant transfer once the round is set up
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
index dac91b5445..5ae3c9a8b3 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm
@@ -170,6 +170,18 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
+/datum/sprite_accessory/tails/human/twocat
+ name = "Cat, Double"
+ icon_state = "twocat"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ color_src = MATRIXED
+
+/datum/sprite_accessory/tails_animated/human/twocat
+ name = "Cat, Double"
+ icon_state = "twocat"
+ icon = 'modular_citadel/icons/mob/mam_tails.dmi'
+ color_src = MATRIXED
+
/datum/sprite_accessory/tails/human/cow
name = "Cow"
icon_state = "cow"
@@ -562,6 +574,14 @@
/datum/sprite_accessory/mam_tails_animated/catbig
name = "Cat, Big"
icon_state = "catbig"
+
+/datum/sprite_accessory/mam_tails/twocat
+ name = "Cat, Double"
+ icon_state = "twocat"
+
+/datum/sprite_accessory/mam_tails_animated/twocat
+ name = "Cat, Double"
+ icon_state = "twocat"
/datum/sprite_accessory/mam_tails/corvid
name = "Corvid"
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 325ea6e8ed..b891525e42 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -11,7 +11,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
layer = GHOST_LAYER
stat = DEAD
density = FALSE
- canmove = 0
+ move_resist = INFINITY
see_invisible = SEE_INVISIBLE_OBSERVER
see_in_dark = 100
invisibility = INVISIBILITY_OBSERVER
@@ -289,7 +289,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES
if(world.time < roundstart_quit_limit)
penalty += roundstart_quit_limit - world.time
- if(penalty + world.realtime - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime)
+ var/maximumRoundEnd = SSautotransfer.starttime + SSautotransfer.voteinterval * SSautotransfer.maxvotes
+ if(penalty - SSshuttle.realtimeofstart > maximumRoundEnd + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime)
penalty = CANT_REENTER_ROUND
if(SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, (stat == DEAD) ? TRUE : FALSE, FALSE, (stat == DEAD)? penalty : 0, (stat == DEAD)? TRUE : FALSE) & COMPONENT_BLOCK_GHOSTING)
@@ -323,7 +324,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES
if(world.time < roundstart_quit_limit)
penalty += roundstart_quit_limit - world.time
- if(penalty + world.realtime - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime)
+ var/maximumRoundEnd = SSautotransfer.starttime + SSautotransfer.voteinterval * SSautotransfer.maxvotes
+ if(penalty - SSshuttle.realtimeofstart > maximumRoundEnd + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime)
penalty = CANT_REENTER_ROUND
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty == CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm
index 37dd7b6a31..e7b8250494 100644
--- a/code/modules/mob/living/brain/brain.dm
+++ b/code/modules/mob/living/brain/brain.dm
@@ -39,12 +39,8 @@
container = null
return ..()
-/mob/living/brain/update_canmove()
- if(in_contents_of(/obj/mecha))
- canmove = 1
- else
- canmove = 0
- return canmove
+/mob/living/brain/update_mobility()
+ return ((mobility_flags = (in_contents_of(/obj/mecha)? MOBILITY_FLAGS_DEFAULT : NONE)))
/mob/living/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up.
return
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index 8de60cba2f..fda136df0b 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -22,11 +22,11 @@ In all, this is a lot like the monkey code. /N
switch(M.a_intent)
if (INTENT_HELP)
if(!recoveringstam)
- resting = 0
- AdjustStun(-60)
- AdjustKnockdown(-60)
- AdjustUnconscious(-60)
- AdjustSleeping(-100)
+ set_resting(FALSE, TRUE, FALSE)
+ AdjustAllImmobility(-60, FALSE)
+ AdjustUnconscious(-60, FALSE)
+ AdjustSleeping(-100, FALSE)
+ update_mobility()
visible_message("[M.name] nuzzles [src] trying to wake [p_them()] up!")
if(INTENT_DISARM, INTENT_HARM)
if(health > 0)
diff --git a/code/modules/mob/living/carbon/alien/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm
index f5d210b94b..66738b2208 100644
--- a/code/modules/mob/living/carbon/alien/damage_procs.dm
+++ b/code/modules/mob/living/carbon/alien/damage_procs.dm
@@ -5,11 +5,9 @@
/mob/living/carbon/alien/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) //alien immune to tox damage
return FALSE
-/* CIT CHANGE - Pffffffffffffhahahahahhaha-- No.
//aliens are immune to stamina damage.
-/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_health = 1)
+/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_health = TRUE, forced = FALSE)
return
-/mob/living/carbon/alien/setStaminaLoss(amount, updating_health = 1)
+/mob/living/carbon/alien/setStaminaLoss(amount, updating_health = TRUE, forced = FALSE)
return
-*/
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index b20383301d..e0647159a5 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -31,7 +31,7 @@
#define MAX_ALIEN_LEAP_DIST 7
/mob/living/carbon/alien/humanoid/hunter/proc/leap_at(atom/A)
- if(!canmove || leaping)
+ if(!CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND | MOBILITY_MOVE) || leaping)
return
if(pounce_cooldown > world.time)
@@ -65,21 +65,21 @@
var/mob/living/L = hit_atom
if(!L.check_shields(src, 0, "the [name]", attack_type = LEAP_ATTACK))
L.visible_message("[src] pounces on [L]!", "[src] pounces on you!")
- L.Knockdown(100)
+ L.DefaultCombatKnockdown(100)
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
step_towards(src,L)
else
- Knockdown(40, 1, 1)
+ DefaultCombatKnockdown(40, 1, 1)
toggle_leap(0)
else if(hit_atom.density && !hit_atom.CanPass(src))
visible_message("[src] smashes into [hit_atom]!", "[src] smashes into [hit_atom]!")
- Knockdown(40, 1, 1)
+ Paralyze(40, TRUE, TRUE)
if(leaping)
leaping = 0
update_icons()
- update_canmove()
+ update_mobility()
/mob/living/carbon/alien/humanoid/float(on)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/death.dm b/code/modules/mob/living/carbon/alien/humanoid/death.dm
index 5625e98b75..cbbe8a3e0a 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/death.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/death.dm
@@ -4,7 +4,7 @@
. = ..()
- update_canmove()
+ update_mobility()
update_icons()
status_flags |= CANPUSH
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 347106f6c1..048b5062ec 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -69,11 +69,11 @@
playsound(src, 'sound/voice/hiss5.ogg', 40, 1, 1) //Alien roars when starting to break free
..(I, cuff_break = INSTANT_CUFFBREAK)
-/mob/living/carbon/alien/humanoid/resist_grab(moving_resist)
- if(pulledby.grab_state)
+/mob/living/carbon/alien/humanoid/do_resist_grab(moving_resist, forced, silent = FALSE)
+ if(pulledby.grab_state && !silent)
visible_message("[src] has broken free of [pulledby]'s grip!")
pulledby.stop_pulling()
- . = 0
+ return TRUE
/mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0)
if(leaping)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index a1ef522f1a..ca62df0b57 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -12,12 +12,12 @@
else
icon_state = "alien[caste]_dead"
- else if((stat == UNCONSCIOUS && !asleep) || stat == SOFT_CRIT || IsKnockdown())
+ else if((stat == UNCONSCIOUS && !asleep) || stat == SOFT_CRIT || IsParalyzed())
icon_state = "alien[caste]_unconscious"
else if(leap_on_click)
icon_state = "alien[caste]_pounce"
- else if(lying || resting || asleep)
+ else if(lying || !CHECK_MOBILITY(src, MOBILITY_STAND) || asleep)
icon_state = "alien[caste]_sleep"
else if(mob_size == MOB_SIZE_LARGE)
icon_state = "alien[caste]"
diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm
index 01a52b3b80..81b76c1720 100644
--- a/code/modules/mob/living/carbon/alien/larva/life.dm
+++ b/code/modules/mob/living/carbon/alien/larva/life.dm
@@ -22,13 +22,13 @@
if(stat == CONSCIOUS)
stat = UNCONSCIOUS
blind_eyes(1)
- update_canmove()
+ update_mobility()
else
if(stat == UNCONSCIOUS)
stat = CONSCIOUS
if(!recoveringstam)
- resting = 0
+ set_resting(FALSE, TRUE)
adjust_blindness(-1)
- update_canmove()
+ update_mobility()
update_damage_hud()
update_health_hud()
diff --git a/code/modules/mob/living/carbon/alien/larva/update_icons.dm b/code/modules/mob/living/carbon/alien/larva/update_icons.dm
index 9b762d1728..e6e7e657e8 100644
--- a/code/modules/mob/living/carbon/alien/larva/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/larva/update_icons.dm
@@ -14,9 +14,9 @@
icon_state = "larva[state]_dead"
else if(handcuffed || legcuffed) //This should be an overlay. Who made this an icon_state?
icon_state = "larva[state]_cuff"
- else if(stat == UNCONSCIOUS || lying || resting)
+ else if(stat == UNCONSCIOUS || !CHECK_MOBILITY(src, MOBILITY_STAND))
icon_state = "larva[state]_sleep"
- else if(IsStun())
+ else if(IsStun() || IsParalyzed())
icon_state = "larva[state]_stun"
else
icon_state = "larva[state]"
diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm
index febd0a024a..b57f9653a9 100644
--- a/code/modules/mob/living/carbon/alien/organs.dm
+++ b/code/modules/mob/living/carbon/alien/organs.dm
@@ -140,7 +140,7 @@
else if(ishuman(owner)) //Humans, being more fragile, are more overwhelmed by the mental backlash.
to_chat(owner, "You feel a splitting pain in your head, and are struck with a wave of nausea. You cannot hear the hivemind anymore!")
owner.emote("scream")
- owner.Knockdown(100)
+ owner.DefaultCombatKnockdown(100)
owner.jitteriness += 30
owner.confused += 30
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index 0621d1400e..5352329f99 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -89,8 +89,8 @@
var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc)
ghost.transfer_ckey(new_xeno, FALSE)
SEND_SOUND(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100)) //To get the player's attention
- new_xeno.canmove = 0 //so we don't move during the bursting animation
- new_xeno.notransform = 1
+ new_xeno.Paralyze(6)
+ new_xeno.notransform = TRUE
new_xeno.invisibility = INVISIBILITY_MAXIMUM
sleep(6)
@@ -99,8 +99,8 @@
return
if(new_xeno)
- new_xeno.canmove = 1
- new_xeno.notransform = 0
+ new_xeno.SetParalyzed(0)
+ new_xeno.notransform = FALSE
new_xeno.invisibility = 0
var/mob/living/carbon/old_owner = owner
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 574a5aedd2..5f9e838330 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -103,7 +103,7 @@
hurt = FALSE
if(hit_atom.density && isturf(hit_atom))
if(hurt)
- Knockdown(20)
+ DefaultCombatKnockdown(20)
take_bodypart_damage(10)
if(iscarbon(hit_atom) && hit_atom != src)
var/mob/living/carbon/victim = hit_atom
@@ -112,8 +112,8 @@
if(hurt)
victim.take_bodypart_damage(10)
take_bodypart_damage(10)
- victim.Knockdown(20)
- Knockdown(20)
+ victim.DefaultCombatKnockdown(20)
+ DefaultCombatKnockdown(20)
visible_message("[src] crashes into [victim], knocking them both over!",\
"You violently crash into [victim]!")
playsound(src,'sound/weapons/punch1.ogg',50,1)
@@ -281,19 +281,23 @@
return FALSE
/mob/living/carbon/resist_buckle()
+ . = FALSE
if(restrained())
- changeNext_move(CLICK_CD_BREAKOUT)
- last_special = world.time + CLICK_CD_BREAKOUT
+ // too soon.
+ if(last_special > world.time)
+ return
var/buckle_cd = 600
if(handcuffed)
var/obj/item/restraints/O = src.get_item_by_slot(SLOT_HANDCUFFED)
buckle_cd = O.breakouttime
+ changeNext_move(min(CLICK_CD_BREAKOUT, buckle_cd))
+ last_special = world.time + min(CLICK_CD_BREAKOUT, buckle_cd)
visible_message("[src] attempts to unbuckle [p_them()]self!", \
"You attempt to unbuckle yourself... (This will take around [round(buckle_cd/600,1)] minute\s, and you need to stay still.)")
- if(do_after(src, buckle_cd, 0, target = src))
+ if(do_after(src, buckle_cd, 0, target = src, required_mobility_flags = MOBILITY_RESIST))
if(!buckled)
return
- buckled.user_unbuckle_mob(src,src)
+ buckled.user_unbuckle_mob(src, src)
else
if(src && buckled)
to_chat(src, "You fail to unbuckle yourself!")
@@ -301,21 +305,26 @@
buckled.user_unbuckle_mob(src,src)
/mob/living/carbon/resist_fire()
+ if(last_special > world.time)
+ return
fire_stacks -= 5
- Knockdown(60, TRUE, TRUE)
+ DefaultCombatKnockdown(60, TRUE, TRUE)
spin(32,2)
visible_message("[src] rolls on the floor, trying to put [p_them()]self out!", \
"You stop, drop, and roll!")
+ last_special = world.time + 30
sleep(30)
if(fire_stacks <= 0)
visible_message("[src] has successfully extinguished [p_them()]self!", \
"You extinguish yourself.")
ExtinguishMob()
- return
-/mob/living/carbon/resist_restraints()
+/mob/living/carbon/resist_restraints(ignore_delay = FALSE)
var/obj/item/I = null
var/type = 0
+ if(!ignore_delay && (last_special > world.time))
+ to_chat(src, "You don't have the energy to resist your restraints that fast!")
+ return
if(handcuffed)
I = handcuffed
type = 1
@@ -324,14 +333,13 @@
type = 2
if(I)
if(type == 1)
- changeNext_move(CLICK_CD_BREAKOUT)
+ changeNext_move(min(CLICK_CD_BREAKOUT, I.breakouttime))
last_special = world.time + CLICK_CD_BREAKOUT
if(type == 2)
- changeNext_move(CLICK_CD_RANGE)
+ changeNext_move(min(CLICK_CD_RANGE, I.breakouttime))
last_special = world.time + CLICK_CD_RANGE
cuff_resist(I)
-
/mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0)
if(I.item_flags & BEING_REMOVED)
to_chat(src, "You're already attempting to remove [I]!")
@@ -341,7 +349,7 @@
if(!cuff_break)
visible_message("[src] attempts to remove [I]!")
to_chat(src, "You attempt to remove [I]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)")
- if(do_after(src, breakouttime, 0, target = src))
+ if(do_after(src, breakouttime, 0, target = src, required_mobility_flags = MOBILITY_RESIST))
clear_cuffs(I, cuff_break)
else
to_chat(src, "You fail to remove [I]!")
@@ -488,7 +496,7 @@
visible_message("[src] dry heaves!", \
"You try to throw up, but there's nothing in your stomach!")
if(stun)
- Knockdown(200)
+ DefaultCombatKnockdown(200)
return 1
if(is_mouth_covered()) //make this add a blood/vomit overlay later it'll be hilarious
@@ -572,9 +580,9 @@
if(stam > DAMAGE_PRECISION)
var/total_health = (health - stam)
if(total_health <= crit_threshold && !stat)
- if(!IsKnockdown())
+ if(CHECK_MOBILITY(src, MOBILITY_STAND))
to_chat(src, "You're too exhausted to keep going...")
- Knockdown(100)
+ KnockToFloor(TRUE)
update_health_hud()
/mob/living/carbon/update_sight()
@@ -814,7 +822,7 @@
else
stat = CONSCIOUS
adjust_blindness(-1)
- update_canmove()
+ update_mobility()
update_damage_hud()
update_health_hud()
med_hud_set_status()
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 637178ffe6..5bbc6d6a64 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -52,7 +52,12 @@
. = ..()
if(!HAS_TRAIT(src, TRAIT_AUTO_CATCH_ITEM) && !skip_throw_mode_check && !in_throw_mode)
return
- if(get_active_held_item() || restrained())
+ if(incapacitated())
+ return
+ if (get_active_held_item())
+ if (HAS_TRAIT_FROM(src, TRAIT_AUTO_CATCH_ITEM,RISING_BASS_TRAIT))
+ visible_message("[src] chops [I] out of the air!")
+ return TRUE
return
I.attack_hand(src)
if(get_active_held_item() == I) //if our attack_hand() picks up the item...
@@ -77,7 +82,7 @@
var/mob/living/carbon/tempcarb = user
if(!tempcarb.combatmode)
totitemdamage *= 0.5
- if(user.resting)
+ if(!CHECK_MOBILITY(user, MOBILITY_STAND))
totitemdamage *= 0.5
if(!combatmode)
totitemdamage *= 1.5
@@ -188,7 +193,7 @@
do_sparks(5, TRUE, src)
var/power = M.powerlevel + rand(0,3)
- Knockdown(power*20)
+ DefaultCombatKnockdown(power*20)
if(stuttering < power)
stuttering = power
if (prob(stunprob) && M.powerlevel >= 8)
@@ -262,7 +267,7 @@
spawn(20)
jitteriness = max(jitteriness - 990, 10) //Still jittery, but vastly less
if((!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) && stun)
- Knockdown(60)
+ DefaultCombatKnockdown(60)
if(override)
return override
else
@@ -282,13 +287,13 @@
M.visible_message("[M] shakes [src] trying to get [p_them()] up!", \
"You shake [src] trying to get [p_them()] up!")
- else if(check_zone(M.zone_selected) == "mouth") // I ADDED BOOP-EH-DEH-NOSEH - Jon
+ else if(M.zone_selected == BODY_ZONE_PRECISE_MOUTH) // I ADDED BOOP-EH-DEH-NOSEH - Jon
M.visible_message( \
"[M] boops [src]'s nose.", \
"You boop [src] on the nose.", )
playsound(src, 'sound/items/Nose_boop.ogg', 50, 0)
- else if(check_zone(M.zone_selected) == "head")
+ else if(check_zone(M.zone_selected) == BODY_ZONE_HEAD)
var/datum/species/S
if(ishuman(src))
S = dna.species
@@ -322,7 +327,7 @@
else
return
- else if(check_zone(M.zone_selected) == "r_arm" || check_zone(M.zone_selected) == "l_arm")
+ else if(check_zone(M.zone_selected) == BODY_ZONE_R_ARM || check_zone(M.zone_selected) == BODY_ZONE_L_ARM)
M.visible_message( \
"[M] shakes [src]'s hand.", \
"You shake [src]'s hand.", )
@@ -341,16 +346,14 @@
else if (mood.sanity >= SANITY_DISTURBED)
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/betterhug, M)
- AdjustStun(-60)
- AdjustKnockdown(-60)
- AdjustUnconscious(-60)
- AdjustSleeping(-100)
+ AdjustAllImmobility(-60, FALSE)
+ AdjustUnconscious(-60, FALSE)
+ AdjustSleeping(-100, FALSE)
if(recoveringstam)
adjustStaminaLoss(-15)
- else if(resting)
- resting = 0
- update_canmove()
-
+ else
+ set_resting(FALSE, FALSE)
+ update_mobility()
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
@@ -414,7 +417,7 @@
var/effect_amount = intensity - ear_safety
if(effect_amount > 0)
if(stun_pwr)
- Knockdown(stun_pwr*effect_amount)
+ DefaultCombatKnockdown(stun_pwr*effect_amount)
if(istype(ears) && (deafen_pwr || damage_pwr))
var/ear_damage = damage_pwr * effect_amount
diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index 4a99e9c89e..26ac12b97a 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -9,8 +9,6 @@
. += 6 - 3*get_num_arms() //crawling is harder with fewer arms
if(legcuffed)
. += legcuffed.slowdown
- if(stat == SOFT_CRIT)
- . += SOFTCRIT_ADD_SLOWDOWN
/mob/living/carbon/slip(knockdown_amount, obj/O, lube)
if(movement_type & FLYING && !(lube & FLYING_DOESNT_HELP))
@@ -43,3 +41,10 @@
nutrition -= HUNGER_FACTOR/10
if(m_intent == MOVE_INTENT_RUN)
nutrition -= HUNGER_FACTOR/10
+
+/mob/living/carbon/can_move_under_living(mob/living/other)
+ . = ..()
+ if(!.) //we failed earlier don't need to fail again
+ return
+ if(!other.lying && lying) //they're up, we're down.
+ return FALSE
diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm
index 8c5dc6aa0b..e3512e3929 100644
--- a/code/modules/mob/living/carbon/emote.dm
+++ b/code/modules/mob/living/carbon/emote.dm
@@ -49,6 +49,7 @@
message = "moans!"
message_mime = "appears to moan!"
emote_type = EMOTE_AUDIBLE
+ stat_allowed = SOFT_CRIT
/datum/emote/living/carbon/roll
key = "roll"
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 3f2a259df7..efd81c1744 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -91,7 +91,7 @@
. += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner."
if(combatmode)
- . += "[t_He] [t_is] visibly tense[resting ? "." : ", and [t_is] standing in combative stance."]"
+ . += "[t_He] [t_is] visibly tense[CHECK_MOBILITY(src, MOBILITY_STAND) ? "." : ", and [t_is] standing in combative stance."]"
var/trait_exam = common_trait_examine()
if (!isnull(trait_exam))
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 423277863f..bd7cbb48f9 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -491,7 +491,7 @@
to_chat(usr, "Unable to locate a data core entry for this person.")
/mob/living/carbon/human/proc/canUseHUD()
- return !(src.stat || IsKnockdown() || IsStun() || src.restrained())
+ return CHECK_MOBILITY(src, MOBILITY_UI)
/mob/living/carbon/human/can_inject(mob/user, error_msg, target_zone, penetrate_thick = FALSE, bypass_immunity = FALSE)
. = 1 // Default to returning true.
@@ -724,8 +724,8 @@
remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#000000")
cut_overlay(MA)
-/mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
- if(incapacitated() || lying )
+/mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE, check_resting = TRUE)
+ if(incapacitated() || (check_resting && !CHECK_MOBILITY(src, MOBILITY_STAND)))
to_chat(src, "You can't do that right now!")
return FALSE
if(!Adjacent(M) && (M.loc != src))
@@ -836,7 +836,7 @@
visible_message("[src] dry heaves!", \
"You try to throw up, but there's nothing in your stomach!")
if(stun)
- Knockdown(200)
+ DefaultCombatKnockdown(200)
return 1
..()
@@ -870,7 +870,7 @@
return (istype(target) && target.stat == CONSCIOUS)
/mob/living/carbon/human/proc/can_be_firemanned(mob/living/carbon/target)
- return (ishuman(target) && target.lying)
+ return (ishuman(target) && !CHECK_MOBILITY(target, MOBILITY_STAND))
/mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target)
if(can_be_firemanned(target))
@@ -879,7 +879,7 @@
if(do_after(src, 30, TRUE, target))
//Second check to make sure they're still valid to be carried
if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE))
- target.resting = FALSE
+ target.set_resting(FALSE, TRUE)
buckle_mob(target, TRUE, TRUE, 90, 1, 0)
return
visible_message("[src] fails to fireman carry [target]!")
@@ -892,7 +892,7 @@
/mob/living/carbon/human/proc/piggyback(mob/living/carbon/target)
if(can_piggyback(target))
visible_message("[target] starts to climb onto [src]...")
- if(do_after(target, 15, target = src))
+ if(do_after(target, 15, target = src, required_mobility_flags = MOBILITY_STAND))
if(can_piggyback(target))
if(target.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE))
target.visible_message("[target] can't hang onto [src]!")
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 57b8f59780..5bedce359b 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -49,9 +49,14 @@
if (mind.martial_art && mind.martial_art.dodge_chance)
if(!lying && dna && !dna.check_mutation(HULK))
if(prob(mind.martial_art.dodge_chance))
- var/dodgemessage = pick("dodges under the projectile!","dodges to the right of the projectile!","jumps over the projectile!")
- visible_message("[src] [dodgemessage]", "You dodge the projectile!")
- return BULLET_ACT_BLOCK
+ var/static/dodgemessages = list("dodges under",0,-4,"dodges to the right of",-4,0,"dodges to the left of",4,0,"jumps over",0,4)
+ var/pick = pick(1,4,7,10)
+ var/oldx = pixel_x
+ var/oldy = pixel_y
+ animate(src,pixel_x = pixel_x + dodgemessages[pick+1],pixel_y = pixel_y + dodgemessages[pick+2],time=3)
+ animate(src,pixel_x = oldx,pixel_y = oldy,time=2)
+ visible_message("[src] [dodgemessages[pick]] the projectile!", "You dodge the projectile!")
+ return BULLET_ACT_FORCE_PIERCE
if(mind.martial_art && !incapacitated(FALSE, TRUE) && mind.martial_art.can_use(src) && mind.martial_art.deflection_chance) //Some martial arts users can deflect projectiles!
if(prob(mind.martial_art.deflection_chance))
if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it
@@ -174,7 +179,7 @@
"[M] disarmed [src]!")
else if(!M.client || prob(5)) // only natural monkeys get to stun reliably, (they only do it occasionaly)
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
- Knockdown(100)
+ DefaultCombatKnockdown(100)
log_combat(M, src, "tackled")
visible_message("[M] has tackled down [src]!", \
"[M] has tackled down [src]!")
@@ -223,9 +228,9 @@
else
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
if(!lying) //CITADEL EDIT
- Knockdown(100, TRUE, FALSE, 30, 25)
+ DefaultCombatKnockdown(100, TRUE, FALSE, 30, 25)
else
- Knockdown(100)
+ DefaultCombatKnockdown(100)
log_combat(M, src, "tackled")
visible_message("[M] has tackled down [src]!", \
"[M] has tackled down [src]!")
@@ -292,10 +297,10 @@
switch(M.damtype)
if("brute")
if(M.force > 35) // durand and other heavy mechas
- Knockdown(50)
+ DefaultCombatKnockdown(50)
src.throw_at(throw_target, rand(1,5), 7)
- else if(M.force >= 20 && !IsKnockdown()) // lightweight mechas like gygax
- Knockdown(30)
+ else if(M.force >= 20 && CHECK_MOBILITY(src, MOBILITY_STAND)) // lightweight mechas like gygax
+ DefaultCombatKnockdown(30)
src.throw_at(throw_target, rand(1,3), 7)
update |= temp.receive_damage(dmg, 0)
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
diff --git a/code/modules/mob/living/carbon/human/human_mobility.dm b/code/modules/mob/living/carbon/human/human_mobility.dm
new file mode 100644
index 0000000000..61ceb42336
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/human_mobility.dm
@@ -0,0 +1,48 @@
+/mob/living/carbon/human/resist_a_rest(automatic = FALSE, ignoretimer = FALSE)
+ if(!resting || stat || attemptingstandup)
+ return FALSE
+ if(ignoretimer)
+ set_resting(FALSE, FALSE)
+ return TRUE
+ if(!lying) //if they're in a chair or something they don't need to force themselves off the ground.
+ set_resting(FALSE, FALSE)
+ return TRUE
+ else if(!CHECK_MOBILITY(src, MOBILITY_RESIST))
+ if(!automatic)
+ to_chat(src, "You are unable to stand up right now.")
+ return FALSE
+ else
+ var/totaldelay = 3 //A little bit less than half of a second as a baseline for getting up from a rest
+ if(getStaminaLoss() >= STAMINA_SOFTCRIT)
+ to_chat(src, "You're too exhausted to get up!")
+ return FALSE
+ attemptingstandup = TRUE
+ var/health_deficiency = max((maxHealth - (health - getStaminaLoss()))*0.5, 0)
+ if(!has_gravity())
+ health_deficiency = health_deficiency*0.2
+ totaldelay += health_deficiency
+ var/standupwarning = "[src] and everyone around them should probably yell at the dev team"
+ switch(health_deficiency)
+ if(-INFINITY to 10)
+ standupwarning = "[src] stands right up!"
+ if(10 to 35)
+ standupwarning = "[src] tries to stand up."
+ if(35 to 60)
+ standupwarning = "[src] slowly pushes [p_them()]self upright."
+ if(60 to 80)
+ standupwarning = "[src] weakly attempts to stand up."
+ if(80 to INFINITY)
+ standupwarning = "[src] struggles to stand up."
+ var/usernotice = automatic ? "You are now getting up. (Auto)" : "You are now getting up."
+ visible_message("[standupwarning]", usernotice, vision_distance = 5)
+ if(do_after(src, totaldelay, target = src, required_mobility_flags = MOBILITY_RESIST))
+ set_resting(FALSE, TRUE)
+ attemptingstandup = FALSE
+ return TRUE
+ else
+ attemptingstandup = FALSE
+ if(resting) //we didn't shove ourselves up or something
+ visible_message("[src] falls right back down.", "You fall right back down.")
+ if(has_gravity())
+ playsound(src, "bodyfall", 20, 1)
+ return FALSE
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index b1bc47ea4a..b834de3302 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1364,9 +1364,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return TRUE
if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB))
- if(!H.IsKnockdown())
+ if(CHECK_MOBILITY(H, MOBILITY_STAND))
H.emote("collapse")
- H.Knockdown(RAD_MOB_KNOCKDOWN_AMOUNT)
+ H.DefaultCombatKnockdown(RAD_MOB_KNOCKDOWN_AMOUNT)
to_chat(H, "You feel weak.")
if(radiation > RAD_MOB_VOMIT && prob(RAD_MOB_VOMIT_PROB))
@@ -1514,7 +1514,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
//CITADEL CHANGES - makes resting and disabled combat mode reduce punch damage, makes being out of combat mode result in you taking more damage
if(!target.combatmode && damage < user.dna.species.punchstunthreshold)
damage = user.dna.species.punchstunthreshold - 1
- if(user.resting)
+ if(!CHECK_MOBILITY(user, MOBILITY_STAND))
damage *= 0.5
if(!user.combatmode)
damage *= 0.25
@@ -1632,7 +1632,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return*/
if(!target.combatmode) // CITADEL CHANGE
randn += -10 //CITADEL CHANGE - being out of combat mode makes it easier for you to get disarmed
- if(user.resting) //CITADEL CHANGE
+ if(!CHECK_MOBILITY(user, MOBILITY_STAND)) //CITADEL CHANGE
randn += 100 //CITADEL CHANGE - No kosher disarming if you're resting
if(!user.combatmode) //CITADEL CHANGE
randn += 25 //CITADEL CHANGE - Makes it harder to disarm outside of combat mode
@@ -1715,7 +1715,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/mob/living/carbon/tempcarb = user
if(!tempcarb.combatmode)
totitemdamage *= 0.5
- if(user.resting)
+ if(!CHECK_MOBILITY(user, MOBILITY_STAND))
totitemdamage *= 0.5
if(istype(H))
if(!H.combatmode)
@@ -1831,12 +1831,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
to_chat(user, "You're too exhausted for that.")
return
- if(!user.resting)
+ if(user.IsKnockdown() || user.IsParalyzed() || user.IsStun())
+ to_chat(user, "You can't seem to force yourself up right now!")
+ return
+ if(CHECK_MOBILITY(user, MOBILITY_STAND))
to_chat(user, "You can only force yourself up if you're on the ground.")
return
user.visible_message("[user] forces [p_them()]self up to [p_their()] feet!", "You force yourself up to your feet!")
- user.resting = 0
- user.update_canmove()
+ user.set_resting(FALSE, TRUE)
user.adjustStaminaLossBuffered(user.stambuffer) //Rewards good stamina management by making it easier to instantly get up from resting
playsound(user, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
@@ -1849,7 +1851,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return FALSE
if(attacker_style && attacker_style.disarm_act(user,target))
return TRUE
- if(user.resting)
+ if(!CHECK_MOBILITY(user, MOBILITY_STAND))
return FALSE
else
if(user == target)
@@ -1862,7 +1864,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
target.w_uniform.add_fingerprint(user)
SEND_SIGNAL(target, COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected)
- if(!target.resting)
+ if(CHECK_MOBILITY(target, MOBILITY_STAND))
target.adjustStaminaLoss(5)
if(target.is_shove_knockdown_blocked())
@@ -1876,7 +1878,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
//Thank you based whoneedsspace
target_collateral_human = locate(/mob/living/carbon/human) in target_shove_turf.contents
- if(target_collateral_human && !target_collateral_human.resting)
+ if(target_collateral_human && CHECK_MOBILITY(target_collateral_human, MOBILITY_STAND))
shove_blocked = TRUE
else
target_collateral_human = null
@@ -1887,15 +1889,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/append_message = ""
if(shove_blocked && !target.buckled)
var/directional_blocked = !target.Adjacent(target_shove_turf)
- var/targetatrest = target.resting
+ var/targetatrest = !CHECK_MOBILITY(target, MOBILITY_STAND)
if((directional_blocked || !(target_collateral_human || target_shove_turf.shove_act(target, user))) && !targetatrest)
- target.Knockdown(SHOVE_KNOCKDOWN_SOLID)
+ target.DefaultCombatKnockdown(SHOVE_KNOCKDOWN_SOLID)
user.visible_message("[user.name] shoves [target.name], knocking them down!",
"You shove [target.name], knocking them down!", null, COMBAT_MESSAGE_RANGE)
log_combat(user, target, "shoved", "knocking them down")
else if(target_collateral_human && !targetatrest)
- target.Knockdown(SHOVE_KNOCKDOWN_HUMAN)
- target_collateral_human.Knockdown(SHOVE_KNOCKDOWN_COLLATERAL)
+ target.DefaultCombatKnockdown(SHOVE_KNOCKDOWN_HUMAN)
+ target_collateral_human.DefaultCombatKnockdown(SHOVE_KNOCKDOWN_COLLATERAL)
user.visible_message("[user.name] shoves [target.name] into [target_collateral_human.name]!",
"You shove [target.name] into [target_collateral_human.name]!", null, COMBAT_MESSAGE_RANGE)
append_message += ", into [target_collateral_human.name]"
diff --git a/code/modules/mob/living/carbon/human/species_types/angel.dm b/code/modules/mob/living/carbon/human/species_types/angel.dm
index 18c6a7bab4..924f5f9c6a 100644
--- a/code/modules/mob/living/carbon/human/species_types/angel.dm
+++ b/code/modules/mob/living/carbon/human/species_types/angel.dm
@@ -52,21 +52,20 @@
return 0
/datum/species/angel/proc/CanFly(mob/living/carbon/human/H)
- if(H.stat || H.IsStun() || H.IsKnockdown())
- return 0
+ if(!CHECK_MOBILITY(H, MOBILITY_MOVE))
+ return FALSE
if(H.wear_suit && ((H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))) //Jumpsuits have tail holes, so it makes sense they have wing holes too
to_chat(H, "Your suit blocks your wings from extending!")
- return 0
+ return FALSE
var/turf/T = get_turf(H)
if(!T)
- return 0
+ return FALSE
var/datum/gas_mixture/environment = T.return_air()
if(environment && !(environment.return_pressure() > 30))
to_chat(H, "The atmosphere is too thin for you to fly!")
- return 0
- else
- return 1
+ return FALSE
+ return TRUE
/datum/action/innate/flight
name = "Toggle Flight"
@@ -81,12 +80,12 @@
if(H.movement_type & FLYING)
to_chat(H, "You settle gently back onto the ground...")
A.ToggleFlight(H,0)
- H.update_canmove()
+ H.update_mobility()
else
to_chat(H, "You beat your wings and begin to hover gently above the ground...")
- H.resting = 0
+ H.set_resting(FALSE, TRUE)
A.ToggleFlight(H,1)
- H.update_canmove()
+ H.update_mobility()
/datum/species/angel/proc/flyslip(mob/living/carbon/human/H)
var/obj/buckled_obj
diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
index 718599c550..e2e41330fb 100644
--- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
@@ -3,7 +3,7 @@
id = "insect"
default_color = "00FF00"
species_traits = list(LIPS,EYECOLOR,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR)
- inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
+ inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
mutant_bodyparts = list("mam_ears","mam_tail", "taur", "insect_wings","mam_snout", "mam_snouts", "insect_fluff","insect_markings")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None",
"insect_wings" = "None", "insect_fluff" = "None", "mam_snouts" = "None", "taur" = "None", "insect_markings" = "None")
diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
index 71f5aaa8e2..ee4ef83a44 100644
--- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
@@ -24,7 +24,7 @@
H.vomit(0, FALSE, FALSE, 2, TRUE)
var/obj/effect/decal/cleanable/vomit/V = locate() in pos
if(V)
- H.reagents.trans_id_to(V, chem, chem.volume)
+ H.reagents.trans_id_to(V, chem.type, chem.volume)
playsound(pos, 'sound/effects/splat.ogg', 50, 1)
H.visible_message("[H] vomits on the floor!", \
"You throw up on the floor!")
diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index e2adb2acd9..ab86b2cc5d 100644
--- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -4,7 +4,7 @@
default_color = "4B4B4B"
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR)
- inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
+ inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BEAST
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "deco_wings", "taur", "horns", "legs")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None",
"mam_body_markings" = "Husky", "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian")
@@ -57,7 +57,6 @@
default_color = "00FF00"
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS)
- inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "mam_body_markings", "taur", "legs")
default_features = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade")
attack_verb = "slash"
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 6da73f0b79..446e726256 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -636,7 +636,7 @@
limbs_id = "clockgolem"
info_text = "As a Clockwork Golem, you are faster than other types of golems, and are capable of using guns. On death, you will break down into scrap."
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYES,NOGENITALS,NOAROUSAL)
- inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
+ inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
armor = 20 //Reinforced, but much less so to allow for fast movement
@@ -969,7 +969,7 @@
special_names = list("Head", "Broth", "Fracture", "Rattler", "Appetit")
liked_food = GROSS | MEAT | RAW
toxic_food = null
- inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
+ inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutanttongue = /obj/item/organ/tongue/bone
sexes = FALSE
fixed_mut_color = "ffffff"
diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm
index 4249be098f..add0e17c43 100644
--- a/code/modules/mob/living/carbon/human/species_types/ipc.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm
@@ -7,13 +7,19 @@
blacklisted = 0
sexes = 0
species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING)
- inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
+ inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
mutant_bodyparts = list("ipc_screen", "ipc_antenna")
default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None")
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
gib_types = list(/obj/effect/gibspawner/ipc, /obj/effect/gibspawner/ipc/bodypartless)
mutanttongue = /obj/item/organ/tongue/robot/ipc
+//Just robo looking parts.
mutant_heart = /obj/item/organ/heart/ipc
+ mutantlungs = /obj/item/organ/lungs/ipc
+ mutantliver = /obj/item/organ/liver/ipc
+ mutantstomach = /obj/item/organ/stomach/ipc
+ mutanteyes = /obj/item/organ/eyes/ipc
+
exotic_bloodtype = "HF"
var/datum/action/innate/monitor_change/screen
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index eb1e194c0f..cf2950ff6f 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -83,6 +83,7 @@
button_icon_state = "slimeheal"
icon_icon = 'icons/mob/actions/actions_slime.dmi'
background_icon_state = "bg_alien"
+ required_mobility_flags = NONE
/datum/action/innate/regenerate_limbs/IsAvailable()
if(..())
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index b29890a97d..d2d4c6c658 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -58,7 +58,7 @@
if(/obj/item/projectile/energy/floramut)
if(prob(15))
H.rad_act(rand(30,80))
- H.Knockdown(100)
+ H.DefaultCombatKnockdown(100)
H.visible_message("[H] writhes in pain as [H.p_their()] vacuoles boil.", "You writhe in pain as your vacuoles boil!", "You hear the crunching of leaves.")
if(prob(80))
H.randmutb()
diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm
index 49121c9409..37bafdab67 100644
--- a/code/modules/mob/living/carbon/human/status_procs.dm
+++ b/code/modules/mob/living/carbon/human/status_procs.dm
@@ -3,7 +3,7 @@
amount = dna.species.spec_stun(src,amount)
return ..()
-/mob/living/carbon/human/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg)
+/mob/living/carbon/human/DefaultCombatKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg)
amount = dna.species.spec_stun(src,amount)
return ..()
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index ccca90807b..639cfc40e2 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -280,7 +280,7 @@
if(miasma_partialpressure > MINIMUM_MOLES_DELTA_TO_MOVE)
if(prob(0.05 * miasma_partialpressure))
- var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3)
+ var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(TRUE, 2,3)
miasma_disease.name = "Unknown"
ForceContractDisease(miasma_disease, TRUE, TRUE)
@@ -509,7 +509,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
/mob/living/carbon/handle_status_effects()
..()
if(getStaminaLoss() && !combatmode)//CIT CHANGE - prevents stamina regen while combat mode is active
- adjustStaminaLoss(resting ? (recoveringstam ? -7.5 : -6) : -3)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke
+ adjustStaminaLoss(!CHECK_MOBILITY(src, MOBILITY_STAND) ? (recoveringstam ? -7.5 : -6) : -3)//CIT CHANGE - decreases adjuststaminaloss to stop stamina damage from being such a joke
if(!recoveringstam && incomingstammult != 1)
incomingstammult = max(0.01, incomingstammult)
@@ -521,7 +521,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
bufferedstam = max(bufferedstam - drainrate, 0)
//END OF CIT CHANGES
- var/restingpwr = 1 + 4 * resting
+ var/restingpwr = 1 + 4 * !CHECK_MOBILITY(src, MOBILITY_STAND)
//Dizziness
if(dizziness)
diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm
index 3277c57b75..a06d65ad4b 100644
--- a/code/modules/mob/living/carbon/monkey/combat.dm
+++ b/code/modules/mob/living/carbon/monkey/combat.dm
@@ -50,17 +50,11 @@
// taken from /mob/living/carbon/human/interactive/
/mob/living/carbon/monkey/proc/IsDeadOrIncap(checkDead = TRUE)
- if(!canmove)
- return 1
+ if(!CHECK_MOBILITY(src, MOBILITY_MOVE))
+ return TRUE
if(health <= 0 && checkDead)
- return 1
- if(IsUnconscious())
- return 1
- if(IsStun() || IsKnockdown())
- return 1
- if(stat)
- return 1
- return 0
+ return TRUE
+ return FALSE
/mob/living/carbon/monkey/proc/battle_screech()
if(next_battle_screech < world.time)
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index e83f67f796..31589f1cab 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -13,7 +13,7 @@
if(!client)
if(stat == CONSCIOUS)
- if(on_fire || buckled || restrained() || (resting && canmove)) //CIT CHANGE - makes it so monkeys attempt to resist if they're resting)
+ if(on_fire || buckled || restrained() || (!CHECK_MOBILITY(src, MOBILITY_STAND) && CHECK_MOBILITY(src, MOBILITY_MOVE))) //CIT CHANGE - makes it so monkeys attempt to resist if they're resting)
if(!resisting && prob(MONKEY_RESIST_PROB))
resisting = TRUE
walk_to(src,0)
@@ -21,7 +21,7 @@
else if(resisting)
resisting = FALSE
else if((mode == MONKEY_IDLE && !pickupTarget && !prob(MONKEY_SHENANIGAN_PROB)) || !handle_combat())
- if(prob(25) && canmove && isturf(loc) && !pulledby)
+ if(prob(25) && CHECK_MOBILITY(src, MOBILITY_MOVE) && isturf(loc) && !pulledby)
step(src, pick(GLOB.cardinals))
else if(prob(1))
emote(pick("scratch","jump","roll","tail"))
@@ -34,9 +34,9 @@
gorillize()
return
if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB))
- if(!IsKnockdown())
+ if(!recoveringstam)
emote("collapse")
- Knockdown(RAD_MOB_KNOCKDOWN_AMOUNT)
+ DefaultCombatKnockdown(RAD_MOB_KNOCKDOWN_AMOUNT)
to_chat(src, "You feel weak.")
if(radiation > RAD_MOB_MUTATE)
if(prob(1))
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index f3abe83958..e48fc722cd 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -43,7 +43,7 @@
/mob/living/carbon/monkey/ComponentInitialize()
. = ..()
- AddElement(/datum/element/mob_holder, "monkey", null, null, null, SLOT_HEAD)
+ AddElement(/datum/element/mob_holder, "monkey", null, null, null, ITEM_SLOT_HEAD)
/mob/living/carbon/monkey/Destroy()
diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm
index 62550f4ccb..50793eb821 100644
--- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm
@@ -82,7 +82,7 @@
if(!IsUnconscious())
M.do_attack_animation(src, ATTACK_EFFECT_DISARM)
if (prob(25))
- Knockdown(40)
+ DefaultCombatKnockdown(40)
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
log_combat(M, src, "pushed")
visible_message("[M] has pushed down [src]!", \
@@ -126,7 +126,7 @@
var/obj/item/I = null
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
if(prob(95))
- Knockdown(20)
+ DefaultCombatKnockdown(20)
visible_message("[M] has tackled down [name]!", \
"[M] has tackled down [name]!", null, COMBAT_MESSAGE_RANGE)
else
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index abcb0589ae..d5e1fa6fc4 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -88,7 +88,7 @@
if(EFFECT_STUN)
Stun(effect * hit_percent)
if(EFFECT_KNOCKDOWN)
- Knockdown(effect * hit_percent, override_stamdmg = knockdown_stammax ? CLAMP(knockdown_stamoverride, 0, knockdown_stammax-getStaminaLoss()) : knockdown_stamoverride)
+ DefaultCombatKnockdown(effect * hit_percent, override_stamdmg = knockdown_stammax ? CLAMP(knockdown_stamoverride, 0, knockdown_stammax-getStaminaLoss()) : knockdown_stamoverride)
if(EFFECT_UNCONSCIOUS)
Unconscious(effect * hit_percent)
if(EFFECT_IRRADIATE)
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index a33eebf12a..ad1a3bc9b9 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -78,7 +78,7 @@
update_action_buttons_icon()
update_damage_hud()
update_health_hud()
- update_canmove()
+ update_mobility()
med_hud_set_health()
med_hud_set_status()
if(!gibbed && !QDELETED(src))
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 3221981e78..a1efae5838 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -273,7 +273,7 @@
if(H.get_num_arms() == 0)
if(H.get_num_legs() != 0)
message_param = "tries to point at %t with a leg, falling down in the process!"
- H.Knockdown(20)
+ H.DefaultCombatKnockdown(20)
else
message_param = "bumps [user.p_their()] head on the ground trying to motion towards %t."
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5)
@@ -377,7 +377,7 @@
. = ..()
if(. && isliving(user))
var/mob/living/L = user
- L.Knockdown(200)
+ L.DefaultCombatKnockdown(200)
/datum/emote/living/sway
key = "sway"
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index e8cf0225e6..d9a22674ae 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -48,7 +48,7 @@
/mob/living/proc/ZImpactDamage(turf/T, levels)
visible_message("[src] crashes into [T] with a sickening noise!")
adjustBruteLoss((levels * 5) ** 1.5)
- Knockdown(levels * 50)
+ DefaultCombatKnockdown(levels * 50)
/mob/living/proc/OpenCraftingMenu()
@@ -88,7 +88,7 @@
var/they_can_move = TRUE
if(isliving(M))
var/mob/living/L = M
- they_can_move = L.canmove //L.mobility_flags & MOBILITY_MOVE
+ they_can_move = CHECK_MOBILITY(L, MOBILITY_MOVE)
//Also spread diseases
for(var/thing in diseases)
var/datum/disease/D = thing
@@ -115,7 +115,7 @@
return 1
//CIT CHANGES START HERE - makes it so resting stops you from moving through standing folks without a short delay
- if(resting && !L.resting)
+ if(!CHECK_MOBILITY(src, MOBILITY_STAND) && CHECK_MOBILITY(L, MOBILITY_STAND))
var/origtargetloc = L.loc
if(!pulledby)
if(attemptingcrawl)
@@ -125,7 +125,7 @@
return TRUE
attemptingcrawl = TRUE
visible_message("[src] is attempting to crawl under [L].", "You are now attempting to crawl under [L].")
- if(!do_after(src, CRAWLUNDER_DELAY, target = src) || !resting)
+ if(!do_after(src, CRAWLUNDER_DELAY, target = src) || CHECK_MOBILITY(src, MOBILITY_STAND))
attemptingcrawl = FALSE
return TRUE
var/src_passmob = (pass_flags & PASSMOB)
@@ -249,7 +249,7 @@
var/current_dir
if(isliving(AM))
current_dir = AM.dir
- if(step(AM, t))
+ if(step(AM, t) && Process_Spacemove(t))
step(src, t)
if(current_dir)
AM.setDir(current_dir)
@@ -369,8 +369,8 @@
death()
-/mob/living/incapacitated(ignore_restraints, ignore_grab)
- if(stat || IsUnconscious() || IsStun() || IsKnockdown() || recoveringstam || (!ignore_restraints && restrained(ignore_grab))) // CIT CHANGE - adds recoveringstam check here
+/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE)
+ if(stat || IsUnconscious() || IsStun() || IsParalyzed() || recoveringstam || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)))
return TRUE
/mob/living/canUseStorage()
@@ -428,7 +428,6 @@
else
if(alert(src, "You sure you want to sleep for a while?", "Sleep", "Yes", "No") == "Yes")
SetSleeping(400) //Short nap
- update_canmove()
/mob/proc/get_contents()
@@ -493,7 +492,7 @@
stat = UNCONSCIOUS //the mob starts unconscious,
blind_eyes(1)
updatehealth() //then we check if the mob should wake up.
- update_canmove()
+ update_mobility()
update_sight()
clear_alert("not_enough_oxy")
reload_fullscreen()
@@ -512,8 +511,7 @@
setStaminaLoss(0, 0)
SetUnconscious(0, FALSE)
set_disgust(0)
- SetStun(0, FALSE)
- SetKnockdown(0, FALSE)
+ SetAllImmobility(0, FALSE)
SetSleeping(0, FALSE)
radiation = 0
nutrition = NUTRITION_LEVEL_FED + 50
@@ -528,7 +526,7 @@
ExtinguishMob()
fire_stacks = 0
confused = 0
- update_canmove()
+ update_mobility()
//Heal all organs
if(iscarbon(src))
var/mob/living/carbon/C = src
@@ -552,30 +550,6 @@
var/obj/item/item = i
SEND_SIGNAL(item, COMSIG_ITEM_WEARERCROSSED, AM)
-/mob/living/Move(atom/newloc, direct)
- if (buckled && buckled.loc != newloc) //not updating position
- if (!buckled.anchored)
- return buckled.Move(newloc, direct)
- else
- return 0
-
- var/old_direction = dir
- var/turf/T = loc
-
- if(pulling)
- update_pull_movespeed()
-
- . = ..()
-
- if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move.
- pulledby.stop_pulling()
-
- if(active_storage && !(CanReach(active_storage.parent,view_only = TRUE)))
- active_storage.close(src)
-
- if(lying && !buckled && prob(getBruteLoss()*200/maxHealth))
- makeTrail(newloc, T, old_direction)
-
/mob/living/proc/makeTrail(turf/target_turf, turf/start, direction)
if(!has_gravity())
return
@@ -648,66 +622,97 @@
..(pressure_difference, direction, pressure_resistance_prob_delta)
/mob/living/can_resist()
- return !((next_move > world.time) || incapacitated(ignore_restraints = TRUE))
+ return !((next_move > world.time) || !CHECK_MOBILITY(src, MOBILITY_RESIST))
+/// Resist verb for attempting to get out of whatever is restraining your motion. Gives you resist clickdelay if do_resist() returns true.
/mob/living/verb/resist()
set name = "Resist"
set category = "IC"
if(!can_resist())
return
- changeNext_move(CLICK_CD_RESIST)
+ if(do_resist())
+ changeNext_move(CLICK_CD_RESIST)
+
+/// The actual proc for resisting. Return TRUE to give clickdelay.
+/mob/living/proc/do_resist()
SEND_SIGNAL(src, COMSIG_LIVING_RESIST, src)
//resisting grabs (as if it helps anyone...)
- if(!restrained(ignore_grab = 1) && pulledby)
- visible_message("[src] resists against [pulledby]'s grip!")
- log_combat(src, pulledby, "resisted grab")
- resist_grab()
- return
+ // only works if you're not cuffed.
+ if(!restrained(ignore_grab = TRUE) && pulledby)
+ var/old_gs = pulledby.grab_state
+ attempt_resist_grab(FALSE)
+ // Return as we should only resist one thing at a time. Give clickdelay if the grab wasn't passive.
+ return old_gs? TRUE : FALSE
- //unbuckling yourself
+ // unbuckling yourself. stops the chain if you try it.
if(buckled && last_special <= world.time)
- resist_buckle()
+ log_combat(src, buckled, "resisted buckle")
+ return resist_buckle()
- // CIT CHANGE - climbing out of a gut
- if(attempt_vr(src,"vore_process_resist",args)) return TRUE
+ // CIT CHANGE - climbing out of a gut.
+ if(attempt_vr(src,"vore_process_resist",args))
+ //Sure, give clickdelay for anti spam. shouldn't be combat voring anyways.
+ return TRUE
//Breaking out of a container (Locker, sleeper, cryo...)
- else if(isobj(loc))
+ if(isobj(loc))
var/obj/C = loc
C.container_resist(src)
+ // This shouldn't give clickdelays sometime (e.g. going out of a mech/unwelded and unlocked locker/disposals bin/etc) but there's so many overrides that I am not going to bother right now.
+ return TRUE
- else if(canmove)
+ if(CHECK_MOBILITY(src, MOBILITY_MOVE))
if(on_fire)
resist_fire() //stop, drop, and roll
- return
- if(resting) //cit change - allows resisting out of resting
- resist_a_rest() // ditto
- return
- if(resist_embedded()) //Citadel Change for embedded removal memes
- return
- if(last_special <= world.time)
- resist_restraints() //trying to remove cuffs.
- return
+ // Give clickdelay
+ return TRUE
+ if(resting) //cit change - allows resisting out of resting
+ resist_a_rest() // ditto
+ // DO NOT GIVE CLCIKDELAY - resist_a_rest() handles spam prevention. Somewhat.
+ return FALSE
+ if(last_special <= world.time)
+ resist_restraints() //trying to remove cuffs.
+ // DO NOT GIVE CLICKDELAY - last_special handles this.
+ return FALSE
+ if(CHECK_MOBILITY(src, MOBILITY_USE) && resist_embedded()) //Citadel Change for embedded removal memes - requires being able to use items.
+ // DO NOT GIVE DEFAULT CLICKDELAY - This is a combat action.
+ changeNext_move(CLICK_CD_MELEE)
+ return FALSE
+/// Proc to resist a grab. moving_resist is TRUE if this began by someone attempting to move. Return FALSE if still grabbed/failed to break out. Use this instead of resist_grab() directly.
+/mob/proc/attempt_resist_grab(moving_resist, forced, log = TRUE)
+ if(!pulledby) //not being grabbed
+ return TRUE
+ var/old_gs = pulledby.grab_state //how strong the grab is
+ var/old_pulled = pulledby
+ var/success = do_resist_grab(moving_resist, forced)
+ if(log)
+ log_combat(src, old_pulled, "[success? "successfully broke free of" : "failed to resist"] a grab of strength [old_gs][moving_resist? " (moving)":""][forced? " (forced)":""]")
+ return success
-/mob/proc/resist_grab(moving_resist)
- return 1 //returning 0 means we successfully broke free
+/*!
+ * Proc that actually does the grab resisting. Return TRUE if successful. Does not check that a grab exists! Use attempt_resist_grab() instead of this in general!
+ * Forced is if something other than the user mashing movement keys/pressing resist button did it, silent is if it makes messages (like "attempted to resist" and "broken free").
+ * Forced does NOT force success!
+ */
+/mob/proc/do_resist_grab(moving_resist, forced, silent = FALSE)
+ return FALSE
-/mob/living/resist_grab(moving_resist)
- . = 1
+/mob/living/do_resist_grab(moving_resist, forced, silent = FALSE)
+ . = ..()
if(pulledby.grab_state)
- if(!resting && prob(30/pulledby.grab_state))
+ if(CHECK_MOBILITY(src, MOBILITY_STAND) && prob(30/pulledby.grab_state))
visible_message("[src] has broken free of [pulledby]'s grip!")
- log_combat(pulledby, src, "broke grab")
pulledby.stop_pulling()
- return 0
- if(moving_resist && client) //we resisted by trying to move
+ return TRUE
+ else if(moving_resist && client) //we resisted by trying to move // this is a horrible system and whoever thought using client instead of mob is okay is not an okay person
client.move_delay = world.time + 20
+ visible_message("[src] resists against [pulledby]'s grip!")
else
pulledby.stop_pulling()
- return 0
+ return TRUE
/mob/living/proc/resist_buckle()
buckled.user_unbuckle_mob(src,src)
@@ -1048,7 +1053,7 @@
"[C] trips over [src] and falls!", \
"[C] topples over [src]!", \
"[C] leaps out of [src]'s way!")]")
- C.Knockdown(40)
+ C.DefaultCombatKnockdown(40)
/mob/living/ConveyorMove()
if((movement_type & FLYING) && !stat)
@@ -1058,61 +1063,6 @@
/mob/living/can_be_pulled()
return ..() && !(buckled && buckled.buckle_prevents_pull)
-//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
-//Robots, animals and brains have their own version so don't worry about them
-/mob/living/proc/update_canmove()
- var/ko = IsKnockdown() || IsUnconscious() || (stat && (stat != SOFT_CRIT || pulledby)) || (HAS_TRAIT(src, TRAIT_DEATHCOMA))
- var/move_and_fall = stat == SOFT_CRIT && !pulledby
- var/chokehold = pulledby && pulledby.grab_state >= GRAB_NECK
- var/buckle_lying = !(buckled && !buckled.buckle_lying)
- var/has_legs = get_num_legs()
- var/has_arms = get_num_arms()
- var/ignore_legs = get_leg_ignore()
- var/pinned = resting && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE // Cit change - adds pinning for aggressive-grabbing people on the ground
- if(ko || move_and_fall || IsStun() || chokehold) // Cit change - makes resting not force you to drop everything
- drop_all_held_items()
- unset_machine()
- if(pulling)
- stop_pulling()
- else if(resting) //CIT CHANGE - makes resting make you stop pulling and interacting with machines
- unset_machine() //CIT CHANGE - Ditto!
- if(pulling) //CIT CHANGE - Ditto.
- stop_pulling() //CIT CHANGE - Ditto...
- else if(has_legs || ignore_legs)
- lying = 0
- if (pulledby && isliving(pulledby))
- var/mob/living/L = pulledby
- L.update_pull_movespeed()
- if(buckled)
- lying = 90*buckle_lying
- else if(!lying)
- if(resting)
- lying = pick(90, 270) // Cit change - makes resting not force you to drop your held items
- if(has_gravity()) // Cit change - Ditto
- playsound(src, "bodyfall", 50, 1) // Cit change - Ditto!
- else if(ko || move_and_fall || (!has_legs && !ignore_legs) || chokehold)
- fall(forced = 1)
- canmove = !(ko || recoveringstam || pinned || IsStun() || IsFrozen() || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms)) //Cit change - makes it plausible to move while resting, adds pinning and stamina crit
- density = !lying
- if(resting)
- ENABLE_BITFIELD(movement_type, CRAWLING)
- else
- DISABLE_BITFIELD(movement_type, CRAWLING)
- if(lying)
- if(layer == initial(layer)) //to avoid special cases like hiding larvas.
- layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs
- else
- if(layer == LYING_MOB_LAYER)
- layer = initial(layer)
- update_transform()
- if(!lying && lying_prev)
- if(client)
- client.move_delay = world.time + movement_delay()
- lying_prev = lying
- if(canmove && !intentionalresting && iscarbon(src) && client && client.prefs && client.prefs.autostand)//CIT CHANGE - adds autostanding as a preference
- addtimer(CALLBACK(src, .proc/resist_a_rest, TRUE), 0) //CIT CHANGE - ditto
- return canmove
-
/mob/living/proc/AddAbility(obj/effect/proc_holder/A)
abilities.Add(A)
A.on_gain(src)
@@ -1140,42 +1090,6 @@
return LINGHIVE_LINK
return LINGHIVE_NONE
-/mob/living/forceMove(atom/destination)
- stop_pulling()
- if(buckled)
- buckled.unbuckle_mob(src, force = TRUE)
- if(has_buckled_mobs())
- unbuckle_all_mobs(force = TRUE)
- . = ..()
- if(.)
- if(client)
- reset_perspective()
- update_canmove() //if the mob was asleep inside a container and then got forceMoved out we need to make them fall.
-
-/mob/living/proc/update_z(new_z) // 1+ to register, null to unregister
- if(isnull(new_z) && audiovisual_redirect)
- return
- if (registered_z != new_z)
- if (registered_z)
- SSmobs.clients_by_zlevel[registered_z] -= src
- if (client || audiovisual_redirect)
- if (new_z)
- SSmobs.clients_by_zlevel[new_z] += src
- for (var/I in length(SSidlenpcpool.idle_mobs_by_zlevel[new_z]) to 1 step -1) //Backwards loop because we're removing (guarantees optimal rather than worst-case performance), it's fine to use .len here but doesn't compile on 511
- var/mob/living/simple_animal/SA = SSidlenpcpool.idle_mobs_by_zlevel[new_z][I]
- if (SA)
- SA.toggle_ai(AI_ON) // Guarantees responsiveness for when appearing right next to mobs
- else
- SSidlenpcpool.idle_mobs_by_zlevel[new_z] -= SA
-
- registered_z = new_z
- else
- registered_z = null
-
-/mob/living/onTransitZ(old_z,new_z)
- ..()
- update_z(new_z)
-
/mob/living/MouseDrop(mob/over)
. = ..()
var/mob/living/user = usr
@@ -1222,14 +1136,6 @@
GLOB.dead_mob_list += src
. = ..()
switch(var_name)
- if("knockdown")
- SetKnockdown(var_value)
- if("stun")
- SetStun(var_value)
- if("unconscious")
- SetUnconscious(var_value)
- if("sleeping")
- SetSleeping(var_value)
if("eye_blind")
set_blindness(var_value)
if("eye_damage")
@@ -1261,21 +1167,20 @@
SetSleeping(clamp_unconscious_to)
if(AmountUnconscious() > clamp_unconscious_to)
SetUnconscious(clamp_unconscious_to)
- if(AmountStun() > clamp_immobility_to)
- SetStun(clamp_immobility_to)
- if(AmountKnockdown() > clamp_immobility_to)
- SetKnockdown(clamp_immobility_to)
+ HealAllImmobilityUpTo(clamp_immobility_to)
adjustStaminaLoss(min(0, -stamina_boost))
adjustStaminaLossBuffered(min(0, -stamina_buffer_boost))
if(scale_stamina_loss_recovery)
adjustStaminaLoss(min(-((getStaminaLoss() - stamina_loss_recovery_bypass) * scale_stamina_loss_recovery), 0))
if(put_on_feet)
- resting = FALSE
- lying = FALSE
+ set_resting(FALSE, TRUE, FALSE)
if(reset_misc)
stuttering = 0
updatehealth()
update_stamina()
- update_canmove()
+ update_mobility()
if(healing_chems)
reagents.add_reagent_list(healing_chems)
+
+/mob/living/canface()
+ return ..() && CHECK_MOBILITY(src, MOBILITY_MOVE)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 6a14cce4af..9c67498935 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -261,21 +261,21 @@
else
visible_message("[user] has grabbed [src] aggressively!", \
"[user] has grabbed you aggressively!")
- drop_all_held_items()
+ update_mobility()
stop_pulling()
log_combat(user, src, "grabbed", addition="aggressive grab[add_log]")
if(GRAB_NECK)
log_combat(user, src, "grabbed", addition="neck grab")
visible_message("[user] has grabbed [src] by the neck!",\
"[user] has grabbed you by the neck!")
- update_canmove() //we fall down
+ update_mobility() //we fall down
if(!buckled && !density)
Move(user.loc)
if(GRAB_KILL)
log_combat(user, src, "strangled", addition="kill grab")
visible_message("[user] is strangling [src]!", \
"[user] is strangling you!")
- update_canmove() //we fall down
+ update_mobility() //we fall down
if(!buckled && !density)
Move(user.loc)
return 1
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 7106d003ee..ed46568489 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -22,6 +22,8 @@
var/staminaloss = 0 //Stamina damage, or exhaustion. You recover it slowly naturally, and are knocked down if it gets too high. Holodeck and hallucinations deal this.
var/crit_threshold = HEALTH_THRESHOLD_CRIT // when the mob goes from "normal" to crit
+ var/mobility_flags = MOBILITY_FLAGS_DEFAULT
+
var/confused = 0 //Makes the mob move in random directions.
var/hallucination = 0 //Directly affects how long a mob will hallucinate for
@@ -112,4 +114,7 @@
var/drag_slowdown = TRUE //Whether the mob is slowed down when dragging another prone mob
- var/rotate_on_lying = FALSE
\ No newline at end of file
+ var/rotate_on_lying = FALSE
+
+ /// Next world.time when we can get the "you can't move while buckled to [thing]" message.
+ var/buckle_message_cooldown = 0
diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm
new file mode 100644
index 0000000000..4b2afd0448
--- /dev/null
+++ b/code/modules/mob/living/living_mobility.dm
@@ -0,0 +1,155 @@
+/// IN THE FUTURE, WE WILL PROBABLY REFACTOR TO LESSEN THE NEED FOR UPDATE_MOBILITY, BUT FOR NOW.. WE CAN START DOING THIS.
+/// FOR BLOCKING MOVEMENT, USE TRAIT_MOBILITY_NOMOVE AS MUCH AS POSSIBLE. IT WILL MAKE REFACTORS IN THE FUTURE EASIER.
+/mob/living/ComponentInitialize()
+ . = ..()
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOMOVE), .proc/update_mobility)
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOPICKUP), .proc/update_mobility)
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOUSE), .proc/update_mobility)
+
+//Stuff like mobility flag updates, resting updates, etc.
+
+//Force-set resting variable, without needing to resist/etc.
+/mob/living/proc/set_resting(new_resting, silent = FALSE, updating = TRUE)
+ if(new_resting != resting)
+ resting = new_resting
+ if(!silent)
+ to_chat(src, "You are now [resting? "resting" : "getting up"].")
+ update_resting(updating)
+
+/mob/living/proc/update_resting(update_mobility = TRUE)
+ if(update_mobility)
+ update_mobility()
+
+//Force mob to rest, does NOT do stamina damage.
+//It's really not recommended to use this proc to give feedback, hence why silent is defaulting to true.
+/mob/living/proc/KnockToFloor(disarm_items = FALSE, silent = TRUE, updating = TRUE)
+ if(!silent && !resting)
+ to_chat(src, "You are knocked to the floor!")
+ set_resting(TRUE, TRUE, updating)
+ if(disarm_items)
+ drop_all_held_items()
+
+/mob/living/proc/lay_down()
+ set name = "Rest"
+ set category = "IC"
+ if(client?.prefs?.autostand)
+ intentionalresting = !intentionalresting
+ to_chat(src, "You are now attempting to [intentionalresting ? "[!resting ? "lay down and ": ""]stay down" : "[resting ? "get up and ": ""]stay up"].")
+ if(intentionalresting && !resting)
+ set_resting(TRUE, FALSE)
+ else
+ resist_a_rest()
+ else
+ if(!resting)
+ set_resting(TRUE, FALSE)
+ to_chat(src, "You are now laying down.")
+ else
+ resist_a_rest()
+
+/mob/living/proc/resist_a_rest(automatic = FALSE, ignoretimer = FALSE) //Lets mobs resist out of resting. Major QOL change with combat reworks.
+ set_resting(FALSE, TRUE)
+ return TRUE
+
+//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
+//Robots, animals and brains have their own version so don't worry about them
+/mob/living/proc/update_mobility()
+ var/stat_softcrit = stat == SOFT_CRIT
+ var/stat_conscious = (stat == CONSCIOUS) || stat_softcrit
+
+ var/conscious = !IsUnconscious() && stat_conscious && !HAS_TRAIT(src, TRAIT_DEATHCOMA)
+
+ var/has_arms = get_num_arms()
+ var/has_legs = get_num_legs()
+ var/ignore_legs = get_leg_ignore()
+ var/stun = IsStun()
+ var/paralyze = IsParalyzed()
+ var/knockdown = IsKnockdown()
+ var/daze = IsDazed()
+ var/immobilize = IsImmobilized()
+
+ var/chokehold = pulledby && pulledby.grab_state >= GRAB_NECK
+ var/restrained = restrained()
+ var/pinned = resting && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE // Cit change - adds pinning for aggressive-grabbing people on the ground
+ var/has_limbs = has_arms || ignore_legs || has_legs
+ var/canmove = !immobilize && !stun && conscious && !paralyze && (!stat_softcrit || !pulledby) && !chokehold && !IsFrozen() && has_limbs && !pinned && !recoveringstam
+ var/canresist = !stun && conscious && !stat_softcrit && !paralyze && has_limbs && !recoveringstam
+
+ if(canmove)
+ mobility_flags |= MOBILITY_MOVE
+ else
+ mobility_flags &= ~MOBILITY_MOVE
+
+ if(canresist)
+ mobility_flags |= MOBILITY_RESIST
+ else
+ mobility_flags &= ~MOBILITY_RESIST
+
+ var/canstand_involuntary = conscious && !stat_softcrit && !knockdown && !chokehold && !paralyze && (ignore_legs || has_legs) && !(buckled && buckled.buckle_lying) && !recoveringstam
+ var/canstand = canstand_involuntary && !resting
+
+ var/should_be_lying = !canstand
+ if(buckled)
+ if(buckled.buckle_lying != -1)
+ should_be_lying = buckled.buckle_lying
+
+ if(should_be_lying)
+ mobility_flags &= ~MOBILITY_STAND
+ if(!lying) //force them on the ground
+ lying = pick(90, 270)
+ if(has_gravity() && !buckled)
+ playsound(src, "bodyfall", 20, 1)
+ else
+ mobility_flags |= MOBILITY_STAND
+ lying = 0
+
+ if(should_be_lying || restrained || incapacitated())
+ mobility_flags &= ~(MOBILITY_UI|MOBILITY_PULL)
+ else
+ mobility_flags |= MOBILITY_UI|MOBILITY_PULL
+
+ var/canitem_general = !paralyze && !stun && conscious && !(stat_softcrit) && !chokehold && !restrained && has_arms && !recoveringstam
+ if(canitem_general)
+ mobility_flags |= (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_STORAGE | MOBILITY_HOLD)
+ else
+ mobility_flags &= ~(MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_STORAGE | MOBILITY_HOLD)
+
+ if(HAS_TRAIT(src, TRAIT_MOBILITY_NOMOVE))
+ DISABLE_BITFIELD(mobility_flags, MOBILITY_MOVE)
+ if(HAS_TRAIT(src, TRAIT_MOBILITY_NOPICKUP))
+ DISABLE_BITFIELD(mobility_flags, MOBILITY_PICKUP)
+ if(HAS_TRAIT(src, TRAIT_MOBILITY_NOUSE))
+ DISABLE_BITFIELD(mobility_flags, MOBILITY_USE)
+
+ if(daze)
+ DISABLE_BITFIELD(mobility_flags, MOBILITY_USE)
+
+ //Handle update-effects.
+ if(!CHECK_MOBILITY(src, MOBILITY_HOLD))
+ drop_all_held_items()
+ if(!CHECK_MOBILITY(src, MOBILITY_PULL))
+ if(pulling)
+ stop_pulling()
+ if(!CHECK_MOBILITY(src, MOBILITY_UI))
+ unset_machine()
+
+ if(isliving(pulledby))
+ var/mob/living/L = pulledby
+ L.update_pull_movespeed()
+
+ //Handle lying down, voluntary or involuntary
+ density = !lying
+ if(lying)
+ set_resting(TRUE, TRUE, FALSE)
+ if(layer == initial(layer)) //to avoid special cases like hiding larvas.
+ layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs
+ else
+ if(layer == LYING_MOB_LAYER)
+ layer = initial(layer)
+ update_transform()
+ lying_prev = lying
+
+ //Handle citadel autoresist
+ if(CHECK_MOBILITY(src, MOBILITY_MOVE) && !intentionalresting && canstand_involuntary && iscarbon(src) && client?.prefs?.autostand)//CIT CHANGE - adds autostanding as a preference
+ addtimer(CALLBACK(src, .proc/resist_a_rest, TRUE), 0) //CIT CHANGE - ditto
+
+ return mobility_flags
diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm
index e0ea6350d7..f278d22891 100644
--- a/code/modules/mob/living/living_movement.dm
+++ b/code/modules/mob/living/living_movement.dm
@@ -12,10 +12,14 @@
return (!density || lying)
if(buckled == mover)
return TRUE
- if(ismob(mover))
- if (mover in buckled_mobs)
+ if(!ismob(mover))
+ if(mover.throwing?.thrower == src)
return TRUE
- return (!mover.density || !density || lying || (mover.throwing && mover.throwing.thrower == src && !ismob(mover)))
+ if(ismob(mover))
+ if(mover in buckled_mobs)
+ return TRUE
+ var/mob/living/L = mover //typecast first, check isliving and only check this if living using short circuit
+ return (!density || (isliving(mover)? L.can_move_under_living(src) : !mover.density))
/mob/living/toggle_move_intent()
. = ..()
@@ -25,6 +29,10 @@
update_move_intent_slowdown()
return ..()
+/// whether or not we can slide under another living mob. defaults to if we're not dense. CanPass should check "overriding circumstances" like buckled mobs/having PASSMOB flag, etc.
+/mob/living/proc/can_move_under_living(mob/living/other)
+ return !density
+
/mob/living/proc/update_move_intent_slowdown()
var/mod = 0
if(m_intent == MOVE_INTENT_WALK)
@@ -50,4 +58,69 @@
remove_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING)
/mob/living/canZMove(dir, turf/target)
- return can_zTravel(target, dir) && (movement_type & FLYING)
\ No newline at end of file
+ return can_zTravel(target, dir) && (movement_type & FLYING)
+
+/mob/living/Move(atom/newloc, direct)
+ if (buckled && buckled.loc != newloc) //not updating position
+ if (!buckled.anchored)
+ return buckled.Move(newloc, direct)
+ else
+ return 0
+
+ var/old_direction = dir
+ var/turf/T = loc
+
+ if(pulling)
+ update_pull_movespeed()
+
+ . = ..()
+
+ if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move.
+ pulledby.stop_pulling()
+
+ if(active_storage && !(CanReach(active_storage.parent,view_only = TRUE)))
+ active_storage.close(src)
+
+ if(lying && !buckled && prob(getBruteLoss()*200/maxHealth))
+ makeTrail(newloc, T, old_direction)
+
+/mob/living/forceMove(atom/destination)
+ stop_pulling()
+ if(buckled)
+ buckled.unbuckle_mob(src, force = TRUE)
+ if(has_buckled_mobs())
+ unbuckle_all_mobs(force = TRUE)
+ . = ..()
+ if(.)
+ if(client)
+ reset_perspective()
+ update_mobility() //if the mob was asleep inside a container and then got forceMoved out we need to make them fall.
+
+/mob/living/proc/update_z(new_z) // 1+ to register, null to unregister
+ if(isnull(new_z) && audiovisual_redirect)
+ return
+ if (registered_z != new_z)
+ if (registered_z)
+ SSmobs.clients_by_zlevel[registered_z] -= src
+ if (client || audiovisual_redirect)
+ if (new_z)
+ SSmobs.clients_by_zlevel[new_z] += src
+ for (var/I in length(SSidlenpcpool.idle_mobs_by_zlevel[new_z]) to 1 step -1) //Backwards loop because we're removing (guarantees optimal rather than worst-case performance), it's fine to use .len here but doesn't compile on 511
+ var/mob/living/simple_animal/SA = SSidlenpcpool.idle_mobs_by_zlevel[new_z][I]
+ if (SA)
+ SA.toggle_ai(AI_ON) // Guarantees responsiveness for when appearing right next to mobs
+ else
+ SSidlenpcpool.idle_mobs_by_zlevel[new_z] -= SA
+
+ registered_z = new_z
+ else
+ registered_z = null
+
+/mob/living/onTransitZ(old_z,new_z)
+ ..()
+ update_z(new_z)
+
+/mob/living/canface()
+ if(!CHECK_MOBILITY(src, MOBILITY_MOVE))
+ return FALSE
+ return ..()
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index ed0d0d02e8..703e5cefac 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -18,7 +18,7 @@
icon_state = "ai"
move_resist = MOVE_FORCE_OVERPOWERING
density = TRUE
- canmove = FALSE
+ mobility_flags = ALL
status_flags = CANSTUN|CANPUSH
a_intent = INTENT_HARM //so we always get pushed instead of trying to swap
sight = SEE_TURFS | SEE_MOBS | SEE_OBJS
@@ -146,7 +146,7 @@
aiPDA.name = name + " (" + aiPDA.ownjob + ")"
aiMulti = new(src)
- radio = new /obj/item/radio/headset/ai(src)
+ radio = new /obj/item/radio/headset/silicon/ai(src)
aicamera = new/obj/item/camera/siliconcam/ai_camera(src)
deploy_action.Grant(src)
@@ -324,8 +324,10 @@
to_chat(src, "You are now [is_anchored ? "" : "un"]anchored.")
// the message in the [] will change depending whether or not the AI is anchored
-/mob/living/silicon/ai/update_canmove() //If the AI dies, mobs won't go through it anymore
- return 0
+// AIs are immobile
+/mob/living/silicon/ai/update_mobility()
+ mobility_flags = ALL
+ return ALL
/mob/living/silicon/ai/proc/ai_cancel_call()
set category = "Malfunction"
@@ -987,7 +989,7 @@
deployed_shell.undeploy()
diag_hud_set_deployed()
-/mob/living/silicon/ai/resist()
+/mob/living/silicon/ai/do_resist()
return
/mob/living/silicon/ai/spawned/Initialize(mapload, datum/ai_laws/L, mob/target_ai)
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index f978b7b697..afabafd929 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -15,7 +15,7 @@
cameraFollow = null
move_resist = MOVE_FORCE_NORMAL
- update_canmove()
+ update_mobility()
if(eyeobj)
eyeobj.setLoc(get_turf(src))
set_eyeobj_visible(FALSE)
diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm
index 414ee2f3d7..c60d84438c 100644
--- a/code/modules/mob/living/silicon/pai/death.dm
+++ b/code/modules/mob/living/silicon/pai/death.dm
@@ -2,7 +2,7 @@
if(stat == DEAD)
return
stat = DEAD
- canmove = 0
+ update_mobility()
update_sight()
clear_fullscreens()
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index daaf9afbe2..a65c1d24ac 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -10,6 +10,7 @@
health = 500
maxHealth = 500
layer = BELOW_MOB_LAYER
+ var/obj/item/instrument/piano_synth/internal_instrument
silicon_privileges = PRIVILEDGES_PAI
var/datum/element/mob_holder/current_mob_holder //because only a few of their chassis can be actually held.
@@ -27,6 +28,7 @@
var/speakDoubleExclamation = "alarms"
var/speakQuery = "queries"
+ var/obj/item/radio/headset // The pAI's headset
var/obj/item/pai_cable/cable // The cable we produce and use when door or camera jacking
var/master // Name of the one who commands us
@@ -54,6 +56,7 @@
var/obj/item/integrated_signaler/signaler // AI's signaller
+ var/encryptmod = FALSE
var/holoform = FALSE
var/canholo = TRUE
var/obj/item/card/id/access_card = null
@@ -77,13 +80,14 @@
var/radio_short_cooldown = 3 MINUTES
var/radio_short_timerid
- canmove = FALSE
+ mobility_flags = NONE
var/silent = FALSE
var/brightness_power = 5
var/icon/custom_holoform_icon
/mob/living/silicon/pai/Destroy()
+ QDEL_NULL(internal_instrument)
if (loc != card)
card.forceMove(drop_location())
card.pai = null
@@ -97,7 +101,6 @@
START_PROCESSING(SSfastprocess, src)
GLOB.pai_list += src
make_laws()
- canmove = 0
if(!istype(P)) //when manually spawning a pai, we create a card to put it into.
var/newcardloc = P
P = new /obj/item/paicard(newcardloc)
@@ -106,7 +109,7 @@
card = P
signaler = new(src)
if(!radio)
- radio = new /obj/item/radio(src)
+ radio = new /obj/item/radio/headset/silicon/pai(src)
//PDA
pda = new(src)
@@ -296,6 +299,17 @@
/mob/living/silicon/pai/process()
emitterhealth = CLAMP((emitterhealth + emitterregen), -50, emittermaxhealth)
+/obj/item/paicard/attackby(obj/item/W, mob/user, params)
+ ..()
+ user.set_machine(src)
+ if(pai.encryptmod == TRUE)
+ if(W.tool_behaviour == TOOL_SCREWDRIVER)
+ pai.radio.attackby(W, user, params)
+ else if(istype(W, /obj/item/encryptionkey))
+ pai.radio.attackby(W, user, params)
+ else
+ to_chat(user, "Encryption Key ports not configured.")
+
/mob/living/silicon/pai/proc/short_radio()
if(radio_short_timerid)
deltimer(radio_short_timerid)
diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm
index 93cf10706a..0477492c0a 100644
--- a/code/modules/mob/living/silicon/pai/pai_defense.dm
+++ b/code/modules/mob/living/silicon/pai/pai_defense.dm
@@ -8,7 +8,7 @@
if(. & EMP_PROTECT_SELF)
return
take_holo_damage(50/severity)
- Knockdown(400/severity)
+ DefaultCombatKnockdown(400/severity)
silent = max(silent, (PAI_EMP_SILENCE_DURATION) / SSmobs.wait / severity)
if(holoform)
fold_in(force = TRUE)
@@ -23,10 +23,10 @@
qdel(src)
if(2)
fold_in(force = 1)
- Knockdown(400)
+ DefaultCombatKnockdown(400)
if(3)
fold_in(force = 1)
- Knockdown(200)
+ DefaultCombatKnockdown(200)
//ATTACK HAND IGNORING PARENT RETURN VALUE
/mob/living/silicon/pai/attack_hand(mob/living/carbon/human/user)
@@ -98,7 +98,7 @@
take_holo_damage(amount * 0.25)
/mob/living/silicon/pai/adjustOrganLoss(slot, amount, maximum = 500) //I kept this in, unlike tg
- Knockdown(amount * 0.2)
+ DefaultCombatKnockdown(amount * 0.2)
/mob/living/silicon/pai/getBruteLoss()
return emittermaxhealth - emitterhealth
diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm
index 8ae44c042f..7de983229e 100644
--- a/code/modules/mob/living/silicon/pai/pai_shell.dm
+++ b/code/modules/mob/living/silicon/pai/pai_shell.dm
@@ -17,7 +17,6 @@
return FALSE
emitter_next_use = world.time + emittercd
- canmove = TRUE
density = TRUE
if(istype(card.loc, /obj/item/pda))
var/obj/item/pda/P = card.loc
@@ -37,6 +36,7 @@
C.push_data()
forceMove(get_turf(card))
card.forceMove(src)
+ update_mobility()
if(client)
client.perspective = EYE_PERSPECTIVE
client.eye = src
@@ -63,12 +63,11 @@
var/turf/T = drop_location()
card.forceMove(T)
forceMove(card)
- canmove = FALSE
density = FALSE
set_light(0)
holoform = FALSE
- if(resting)
- lay_down()
+ set_resting(FALSE, TRUE, FALSE)
+ update_mobility()
/mob/living/silicon/pai/proc/choose_chassis()
if(!isturf(loc) && loc != card)
@@ -96,12 +95,10 @@
dynamic_chassis = choice
resist_a_rest(FALSE, TRUE)
update_icon()
+ current_mob_holder?.Detach(src)
+ current_mob_holder = null
if(possible_chassis[chassis])
- current_mob_holder = AddElement(/datum/element/mob_holder, chassis, 'icons/mob/pai_item_head.dmi', 'icons/mob/pai_item_rh.dmi', 'icons/mob/pai_item_lh.dmi', SLOT_HEAD)
- else
- current_mob_holder?.Detach(src)
- current_mob_holder = null
- return
+ current_mob_holder = AddElement(/datum/element/mob_holder, chassis, 'icons/mob/pai_item_head.dmi', 'icons/mob/pai_item_rh.dmi', 'icons/mob/pai_item_lh.dmi', ITEM_SLOT_HEAD)
to_chat(src, "You switch your holochassis projection composite to [chassis]")
/mob/living/silicon/pai/lay_down()
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index 55f4bdd65d..7751632813 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -20,6 +20,8 @@
"universal translator" = 35,
//"projection array" = 15
"remote signaller" = 5,
+ "loudness booster" = 25,
+ "encryption keys" = 20
)
/mob/living/silicon/pai/proc/paiInterface()
@@ -50,6 +52,8 @@
left_part = softwareMedicalRecord()
if("securityrecord")
left_part = softwareSecurityRecord()
+ if("encryptionkeys")
+ left_part = softwareEncryptionKeys()
if("translator")
left_part = softwareTranslator()
if("atmosensor")
@@ -64,6 +68,8 @@
left_part = softwareCamera()
if("signaller")
left_part = softwareSignal()
+ if("loudness")
+ left_part = softwareLoudness()
//usr << browse_rsc('windowbak.png') // This has been moved to the mob's Login() proc
@@ -256,6 +262,9 @@
else
var/datum/atom_hud/med = GLOB.huds[med_hud]
med.remove_hud_from(src)
+ if("encryptionkeys")
+ if(href_list["toggle"])
+ encryptmod = TRUE
if("translator")
if(href_list["toggle"])
grant_all_languages(TRUE)
@@ -271,6 +280,12 @@
var/turf/T = get_turf(loc)
cable = new /obj/item/pai_cable(T)
T.visible_message("A port on [src] opens to reveal [cable], which promptly falls to the floor.", "You hear the soft click of something light and hard falling to the ground.")
+ if("loudness")
+ if(subscreen == 1) // Open Instrument
+ internal_instrument.interact(src)
+ if(subscreen == 2) // Change Instrument type
+ internal_instrument.selectInstrument()
+
//updateUsrDialog() We only need to account for the single mob this is intended for, and he will *always* be able to call this window
paiInterface() // So we'll just call the update directly rather than doing some default checks
return
@@ -306,6 +321,8 @@
dat += "Camera Jack
"
if(s == "remote signaller")
dat += "Remote Signaller
"
+ if(s == "loudness booster")
+ dat += "Loudness Booster
"
dat += "
"
// Advanced
@@ -319,6 +336,8 @@
dat += "Facial Recognition Suite[(secHUD) ? " On" : " Off"]
"
if(s == "medical HUD")
dat += "Medical Analysis Suite[(medHUD) ? " On" : " Off"]
"
+ if(s == "encryption keys")
+ dat += "Channel Encryption Firmware[(encryptmod) ? " On" : " Off"]
"
if(s == "universal translator")
var/datum/language_holder/H = get_language_holder()
dat += "Universal Translator[H.omnitongue ? " On" : " Off"]
"
@@ -469,6 +488,14 @@
. += "Requested security record not found,
"
. += "
\nBack
"
return .
+// Encryption Keys
+// Encryption kets
+/mob/living/silicon/pai/proc/softwareEncryptionKeys()
+ var/dat = {"Encryption Key Firmware
+ When enabled, this device will be able to use up to two (2) encryption keys for departmental channel access.
+ The device is currently [encryptmod ? "en" : "dis" ]abled.
[encryptmod ? "" : "Activate Encryption Key Ports
"]"}
+ return dat
+
// Universal Translator
/mob/living/silicon/pai/proc/softwareTranslator()
@@ -630,3 +657,12 @@
dat += "
"
dat += "Messages:
[pda.tnote]"
return dat
+
+// Loudness Booster
+/mob/living/silicon/pai/proc/softwareLoudness()
+ if(!internal_instrument)
+ internal_instrument = new(src)
+ var/dat = "Sound Synthetizer
"
+ dat += "Open Synthesizer Interface
"
+ dat += "Choose Instrument Type"
+ return dat
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index 23531e9f72..6a5338c1f5 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -21,7 +21,7 @@
locked = FALSE //unlock cover
- update_canmove()
+ update_mobility()
if(!QDELETED(builtInCamera) && builtInCamera.status)
builtInCamera.toggle_cam(src,0)
update_headlamp(1) //So borg lights are disabled when killed.
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 26305eedb1..cf67517c52 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -91,12 +91,3 @@
add_overlay(fire_overlay)
else
cut_overlay(fire_overlay)
-
-/mob/living/silicon/robot/update_canmove()
- if(stat || buckled || lockcharge || resting) //CITADEL EDIT resting dogborg-os
- canmove = 0
- else
- canmove = 1
- update_transform()
- update_action_buttons_icon()
- return canmove
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 86e3ccad24..d4f520a611 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -64,7 +64,7 @@
var/lawupdate = 1 //Cyborgs will sync their laws with their AI by default
var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them.
- var/lockcharge //Boolean of whether the borg is locked down or not
+ var/locked_down //Boolean of whether the borg is locked down or not
var/toner = 0
var/tonermax = 40
@@ -493,7 +493,7 @@
update_icons()
else if(istype(W, /obj/item/wrench) && opened && !cell) //Deconstruction. The flashes break from the fall, to prevent this from being a ghetto reset module.
- if(!lockcharge)
+ if(!locked_down)
to_chat(user, "[src]'s bolts spark! Maybe you should lock them down first!")
spark_system.start()
return
@@ -655,65 +655,6 @@
/mob/living/silicon/robot/regenerate_icons()
return update_icons()
-/mob/living/silicon/robot/update_icons()
- cut_overlays()
- icon_state = module.cyborg_base_icon
- //Citadel changes start here - Allows modules to use different icon files, and allows modules to specify a pixel offset
- icon = (module.cyborg_icon_override ? module.cyborg_icon_override : initial(icon))
- if(laser)
- add_overlay("laser")//Is this even used??? - Yes borg/inventory.dm
- if(disabler)
- add_overlay("disabler")//ditto
-
- if(sleeper_g && module.sleeper_overlay)
- add_overlay("[module.sleeper_overlay]_g[sleeper_nv ? "_nv" : ""]")
- if(sleeper_r && module.sleeper_overlay)
- add_overlay("[module.sleeper_overlay]_r[sleeper_nv ? "_nv" : ""]")
- if(stat == DEAD && module.has_snowflake_deadsprite)
- icon_state = "[module.cyborg_base_icon]-wreck"
-
- if(module.cyborg_pixel_offset)
- pixel_x = module.cyborg_pixel_offset
- //End of citadel changes
-
- if(module.cyborg_base_icon == "robot")
- icon = 'icons/mob/robots.dmi'
- pixel_x = initial(pixel_x)
- if(stat != DEAD && !(IsUnconscious() || IsStun() || IsKnockdown() || low_power_mode)) //Not dead, not stunned.
- if(!eye_lights)
- eye_lights = new()
- if(lamp_intensity > 2)
- eye_lights.icon_state = "[module.special_light_key ? "[module.special_light_key]":"[module.cyborg_base_icon]"]_l"
- else
- eye_lights.icon_state = "[module.special_light_key ? "[module.special_light_key]":"[module.cyborg_base_icon]"]_e[is_servant_of_ratvar(src) ? "_r" : ""]"
- eye_lights.icon = icon
- add_overlay(eye_lights)
-
- if(opened)
- if(wiresexposed)
- add_overlay("ov-opencover +w")
- else if(cell)
- add_overlay("ov-opencover +c")
- else
- add_overlay("ov-opencover -c")
- if(hat)
- var/mutable_appearance/head_overlay = hat.build_worn_icon(state = hat.icon_state, default_layer = 20, default_icon_file = 'icons/mob/head.dmi')
- head_overlay.pixel_y += hat_offset
- add_overlay(head_overlay)
- update_fire()
-
- if(client && stat != DEAD && module.dogborg == TRUE)
- if(resting)
- if(sitting)
- icon_state = "[module.cyborg_base_icon]-sit"
- if(bellyup)
- icon_state = "[module.cyborg_base_icon]-bellyup"
- else if(!sitting && !bellyup)
- icon_state = "[module.cyborg_base_icon]-rest"
- cut_overlays()
- else
- icon_state = "[module.cyborg_base_icon]"
-
/mob/living/silicon/robot/proc/self_destruct()
if(emagged)
if(mmi)
@@ -728,8 +669,6 @@
connected_ai.connected_robots -= src
src.connected_ai = null
lawupdate = 0
- lockcharge = 0
- canmove = 1
scrambledcodes = 1
//Disconnect it's camera so it's not so easily tracked.
if(!QDELETED(builtInCamera))
@@ -738,6 +677,7 @@
// Instead of being listed as "deactivated". The downside is that I'm going
// to have to check if every camera is null or not before doing anything, to prevent runtime errors.
// I could change the network to null but I don't know what would happen, and it seems too hacky for me.
+ update_mobility()
/mob/living/silicon/robot/mode()
set name = "Activate Held Object"
@@ -759,8 +699,8 @@
throw_alert("locked", /obj/screen/alert/locked)
else
clear_alert("locked")
- lockcharge = state
- update_canmove()
+ locked_down = state
+ update_mobility()
/mob/living/silicon/robot/proc/SetEmagged(new_state)
emagged = new_state
@@ -949,7 +889,7 @@
to_chat(connected_ai, "
NOTICE - Remote telemetry lost with [name].
")
/mob/living/silicon/robot/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
- if(stat || lockcharge || low_power_mode)
+ if(stat || locked_down || low_power_mode)
to_chat(src, "You can't do that right now!")
return FALSE
if(be_close && !in_range(M, src))
@@ -1025,17 +965,17 @@
if(health <= -maxHealth) //die only once
death()
return
- if(IsUnconscious() || IsStun() || IsKnockdown() || getOxyLoss() > maxHealth*0.5)
+ if(IsUnconscious() || IsStun() || IsParalyzed() || getOxyLoss() > maxHealth*0.5)
if(stat == CONSCIOUS)
stat = UNCONSCIOUS
blind_eyes(1)
- update_canmove()
+ update_mobility()
update_headlamp()
else
if(stat == UNCONSCIOUS)
stat = CONSCIOUS
adjust_blindness(-1)
- update_canmove()
+ update_mobility()
update_headlamp()
diag_hud_set_status()
diag_hud_set_health()
@@ -1269,20 +1209,6 @@
for(var/i in connected_ai.aicamera.stored)
aicamera.stored[i] = TRUE
-/mob/living/silicon/robot/lay_down()
- ..()
- update_canmove()
-
-/mob/living/silicon/robot/update_canmove()
- ..()
- if(client && stat != DEAD && dogborg == FALSE)
- if(resting)
- cut_overlays()
- icon_state = "[module.cyborg_base_icon]-rest"
- else
- icon_state = "[module.cyborg_base_icon]"
- update_icons()
-
/mob/living/silicon/robot/proc/rest_style()
set name = "Switch Rest Style"
set category = "Robot Commands"
diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm
index e7b252a248..5750543a92 100644
--- a/code/modules/mob/living/silicon/robot/robot_defense.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defense.dm
@@ -36,7 +36,7 @@
"[M] has disabled [src]'s active module!", null, COMBAT_MESSAGE_RANGE)
log_combat(M, src, "disarmed", "[I ? " removing \the [I]" : ""]")
else
- Stun(40)
+ Paralyze(40)
step(src,get_dir(M,src))
log_combat(M, src, "pushed")
visible_message("[M] has forced back [src]!", \
@@ -86,9 +86,9 @@
return
switch(severity)
if(1)
- Stun(160)
+ Paralyze(160)
if(2)
- Stun(60)
+ Paralyze(60)
/mob/living/silicon/robot/emag_act(mob/user)
diff --git a/code/modules/mob/living/silicon/robot/robot_mobility.dm b/code/modules/mob/living/silicon/robot/robot_mobility.dm
new file mode 100644
index 0000000000..c5863b523f
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/robot_mobility.dm
@@ -0,0 +1,15 @@
+/mob/living/silicon/robot/update_mobility()
+ var/newflags = NONE
+ if(!stat)
+ if(!resting)
+ newflags |= (MOBILITY_STAND | MOBILITY_RESIST)
+ if(!locked_down)
+ newflags |= MOBILITY_MOVE
+ newflags |= MOBILITY_PULL
+ if(!locked_down)
+ newflags |= MOBILITY_FLAGS_ANY_INTERACTION
+ mobility_flags = newflags
+ update_transform()
+ update_action_buttons_icon()
+ update_icons()
+ return mobility_flags
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index f3e0816b1b..c45a472367 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -97,8 +97,8 @@
var/obj/item/stack/S = I
if(is_type_in_list(S, list(/obj/item/stack/sheet/metal, /obj/item/stack/rods, /obj/item/stack/tile/plasteel)))
- if(S.custom_materials?.len && S.custom_materials[getmaterialref(/datum/material/iron)])
- S.cost = S.custom_materials[getmaterialref(/datum/material/iron)] * 0.25
+ if(S.custom_materials?.len && S.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)])
+ S.cost = S.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)] * 0.25
S.source = get_or_create_estorage(/datum/robot_energy_storage/metal)
else if(istype(S, /obj/item/stack/sheet/glass))
@@ -257,7 +257,7 @@
/obj/item/robot_module/proc/do_transform_delay()
var/mob/living/silicon/robot/R = loc
- var/prev_lockcharge = R.lockcharge
+ var/prev_locked_down = R.locked_down
sleep(1)
flick("[cyborg_base_icon]_transform", R)
R.notransform = TRUE
@@ -267,7 +267,7 @@
for(var/i in 1 to 4)
playsound(R, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, 1, -1)
sleep(7)
- if(!prev_lockcharge)
+ if(!prev_locked_down)
R.SetLockdown(0)
R.setDir(SOUTH)
R.anchored = FALSE
diff --git a/code/modules/mob/living/silicon/robot/update_icons.dm b/code/modules/mob/living/silicon/robot/update_icons.dm
new file mode 100644
index 0000000000..8d40e35706
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/update_icons.dm
@@ -0,0 +1,59 @@
+/// this is bad code
+/mob/living/silicon/robot/update_icons()
+ cut_overlays()
+ icon_state = module.cyborg_base_icon
+ //Citadel changes start here - Allows modules to use different icon files, and allows modules to specify a pixel offset
+ icon = (module.cyborg_icon_override ? module.cyborg_icon_override : initial(icon))
+ if(laser)
+ add_overlay("laser")//Is this even used??? - Yes borg/inventory.dm
+ if(disabler)
+ add_overlay("disabler")//ditto
+
+ if(sleeper_g && module.sleeper_overlay)
+ add_overlay("[module.sleeper_overlay]_g[sleeper_nv ? "_nv" : ""]")
+ if(sleeper_r && module.sleeper_overlay)
+ add_overlay("[module.sleeper_overlay]_r[sleeper_nv ? "_nv" : ""]")
+ if(stat == DEAD && module.has_snowflake_deadsprite)
+ icon_state = "[module.cyborg_base_icon]-wreck"
+
+ if(module.cyborg_pixel_offset)
+ pixel_x = module.cyborg_pixel_offset
+ //End of citadel changes
+
+ if(module.cyborg_base_icon == "robot")
+ icon = 'icons/mob/robots.dmi'
+ pixel_x = initial(pixel_x)
+ if(stat != DEAD && !(IsUnconscious() ||IsStun() || IsKnockdown() || IsParalyzed() || low_power_mode)) //Not dead, not stunned.
+ if(!eye_lights)
+ eye_lights = new()
+ if(lamp_intensity > 2)
+ eye_lights.icon_state = "[module.special_light_key ? "[module.special_light_key]":"[module.cyborg_base_icon]"]_l"
+ else
+ eye_lights.icon_state = "[module.special_light_key ? "[module.special_light_key]":"[module.cyborg_base_icon]"]_e[is_servant_of_ratvar(src) ? "_r" : ""]"
+ eye_lights.icon = icon
+ add_overlay(eye_lights)
+
+ if(opened)
+ if(wiresexposed)
+ add_overlay("ov-opencover +w")
+ else if(cell)
+ add_overlay("ov-opencover +c")
+ else
+ add_overlay("ov-opencover -c")
+ if(hat)
+ var/mutable_appearance/head_overlay = hat.build_worn_icon(state = hat.icon_state, default_layer = 20, default_icon_file = 'icons/mob/head.dmi')
+ head_overlay.pixel_y += hat_offset
+ add_overlay(head_overlay)
+ update_fire()
+
+ if(client && stat != DEAD && module.dogborg == TRUE)
+ if(resting)
+ if(sitting)
+ icon_state = "[module.cyborg_base_icon]-sit"
+ if(bellyup)
+ icon_state = "[module.cyborg_base_icon]-bellyup"
+ else if(!sitting && !bellyup)
+ icon_state = "[module.cyborg_base_icon]-rest"
+ cut_overlays()
+ else
+ icon_state = "[module.cyborg_base_icon]"
diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm
index 4cd8dd47e4..5d1d2610b9 100644
--- a/code/modules/mob/living/silicon/silicon_defense.dm
+++ b/code/modules/mob/living/silicon/silicon_defense.dm
@@ -32,7 +32,7 @@
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
if(prob(damage))
for(var/mob/living/N in buckled_mobs)
- N.Knockdown(20)
+ N.DefaultCombatKnockdown(20)
unbuckle_mob(N)
N.visible_message("[N] is knocked off of [src] by [M]!")
switch(M.melee_damage_type)
@@ -106,7 +106,7 @@
for(var/mob/living/M in buckled_mobs)
if(prob(severity*50))
unbuckle_mob(M)
- M.Knockdown(40)
+ M.DefaultCombatKnockdown(40)
M.visible_message("[M] is thrown off of [src]!")
flash_act(affect_silicon = 1)
@@ -123,7 +123,7 @@
for(var/mob/living/M in buckled_mobs)
M.visible_message("[M] is knocked off of [src]!")
unbuckle_mob(M)
- M.Knockdown(40)
+ M.DefaultCombatKnockdown(40)
if(P.stun || P.knockdown)
for(var/mob/living/M in buckled_mobs)
unbuckle_mob(M)
diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm
index 472cbd7414..ebc89e2577 100644
--- a/code/modules/mob/living/simple_animal/astral.dm
+++ b/code/modules/mob/living/simple_animal/astral.dm
@@ -4,7 +4,7 @@
icon = 'icons/mob/mob.dmi'
icon_state = "ghost"
icon_living = "ghost"
- mob_biotypes = list(MOB_SPIRIT)
+ mob_biotypes = MOB_SPIRIT
attacktext = "raises the hairs on the neck of"
response_harm = "disrupts the concentration of"
response_disarm = "wafts"
@@ -32,7 +32,6 @@
/mob/living/simple_animal/astral/death()
icon_state = "shade_dead"
Stun(1000)
- canmove = 0
friendly = "deads at"
pseudo_death = TRUE
incorporeal_move = 0
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index d5e6f687fb..75364b2845 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -115,7 +115,7 @@
if(stat)
return FALSE
on = TRUE
- canmove = TRUE
+ update_mobility()
set_light(initial(light_range))
update_icon()
diag_hud_set_botstat()
@@ -123,7 +123,7 @@
/mob/living/simple_animal/bot/proc/turn_off()
on = FALSE
- canmove = FALSE
+ update_mobility()
set_light(0)
bot_reset() //Resets an AI's call, should it exist.
update_icon()
@@ -160,11 +160,11 @@
path_hud.add_to_hud(src)
path_hud.add_hud_to(src)
-/mob/living/simple_animal/bot/update_canmove()
+/mob/living/simple_animal/bot/update_mobility()
. = ..()
if(!on)
- . = 0
- canmove = .
+ . = NONE
+ mobility_flags = .
/mob/living/simple_animal/bot/Destroy()
if(path_hud)
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 6d304c6782..2ab0f1721c 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -525,7 +525,7 @@ Auto Patrol[]"},
return
if(iscarbon(A))
var/mob/living/carbon/C = A
- if(C.canmove || arrest_type) // CIT CHANGE - makes sentient ed209s check for canmove rather than !isstun.
+ if(CHECK_MOBILITY(C, MOBILITY_STAND|MOBILITY_MOVE|MOBILITY_USE) || arrest_type) // CIT CHANGE - makes sentient ed209s check for canmove rather than !isstun.
stun_attack(A)
else if(C.canBeHandcuffed() && !C.handcuffed)
cuff(A)
@@ -543,7 +543,7 @@ Auto Patrol[]"},
spawn(2)
icon_state = "[lasercolor]ed209[on]"
var/threat = 5
- C.Knockdown(100)
+ C.DefaultCombatKnockdown(100)
C.stuttering = 5
if(ishuman(C))
var/mob/living/carbon/human/H = C
diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm
index 6ab4dc36db..a5ac2e8bca 100644
--- a/code/modules/mob/living/simple_animal/bot/firebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/firebot.dm
@@ -170,7 +170,7 @@
if(!..())
return
- if(IsStun())
+ if(IsStun() || IsParalyzed())
old_target_fire = target_fire
target_fire = null
mode = BOT_IDLE
@@ -287,7 +287,7 @@
if(!on)
icon_state = "firebot0"
return
- if(IsStun())
+ if(IsStun() || IsParalyzed())
icon_state = "firebots1"
else if(stationary_mode) //Bot has yellow light to indicate stationary mode.
icon_state = "firebots1"
diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm
index e491cff74a..c3c16d5976 100644
--- a/code/modules/mob/living/simple_animal/bot/honkbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm
@@ -196,7 +196,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
C.stuttering = 20
C.adjustEarDamage(0, 5) //far less damage than the H.O.N.K.
C.Jitter(50)
- C.Knockdown(60)
+ C.DefaultCombatKnockdown(60)
var/mob/living/carbon/human/H = C
if(client) //prevent spam from players..
spam_flag = TRUE
@@ -215,7 +215,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
"[src] has honked you!")
else
C.stuttering = 20
- C.Knockdown(80)
+ C.DefaultCombatKnockdown(80)
addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntime)
@@ -358,7 +358,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
"[C] trips over [src] and falls!", \
"[C] topples over [src]!", \
"[C] leaps out of [src]'s way!")]")
- C.Knockdown(10)
+ C.DefaultCombatKnockdown(10)
playsound(loc, 'sound/misc/sadtrombone.ogg', 50, 1, -1)
if(!client)
speak("Honk!")
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index bb29cd3526..d3fb65c585 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -106,7 +106,7 @@
skin = new_skin
update_icon()
-/mob/living/simple_animal/bot/medbot/update_canmove()
+/mob/living/simple_animal/bot/medbot/update_mobility()
. = ..()
update_icon()
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index b5aa8b6967..ab7ce96336 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -662,7 +662,7 @@
if(!paicard)
log_combat(src, L, "knocked down")
visible_message("[src] knocks over [L]!")
- L.Knockdown(160)
+ L.DefaultCombatKnockdown(160)
return ..()
// called from mob/living/carbon/human/Crossed()
@@ -747,8 +747,8 @@
else
return null
-/mob/living/simple_animal/bot/mulebot/resist()
- ..()
+/mob/living/simple_animal/bot/mulebot/do_resist()
+ . = ..()
if(load)
unload()
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 461fa9cf2a..3ff97f2cc0 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -213,7 +213,7 @@ Auto Patrol: []"},
return
if(iscarbon(A))
var/mob/living/carbon/C = A
- if(C.canmove || arrest_type) // CIT CHANGE - makes sentient secbots check for canmove rather than !isstun.
+ if(CHECK_MOBILITY(C, MOBILITY_MOVE|MOBILITY_USE|MOBILITY_STAND) || arrest_type) // CIT CHANGE - makes sentient secbots check for canmove rather than !isstun.
stun_attack(A)
else if(C.canBeHandcuffed() && !C.handcuffed)
cuff(A)
@@ -254,11 +254,11 @@ Auto Patrol: []"},
var/threat = 5
if(ishuman(C))
C.stuttering = 5
- C.Knockdown(100)
+ C.DefaultCombatKnockdown(100)
var/mob/living/carbon/human/H = C
threat = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
else
- C.Knockdown(100)
+ C.DefaultCombatKnockdown(100)
C.stuttering = 5
threat = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 4c6bfc4c3e..64b783b692 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -353,7 +353,7 @@
if(!LAZYLEN(parts))
if(undismembermerable_limbs) //they have limbs we can't remove, and no parts we can, attack!
return ..()
- C.Knockdown(60)
+ C.DefaultCombatKnockdown(60)
visible_message("[src] knocks [C] down!")
to_chat(src, "\"Bring [C.p_them()] to me.\"")
return FALSE
diff --git a/code/modules/mob/living/simple_animal/friendly/bumbles.dm b/code/modules/mob/living/simple_animal/friendly/bumbles.dm
index 63e9fbf852..013bb31b63 100644
--- a/code/modules/mob/living/simple_animal/friendly/bumbles.dm
+++ b/code/modules/mob/living/simple_animal/friendly/bumbles.dm
@@ -18,7 +18,7 @@
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = VENTCRAWLER_ALWAYS
mob_size = MOB_SIZE_TINY
- mob_biotypes = list(MOB_ORGANIC, MOB_BEAST)
+ mob_biotypes = MOB_ORGANIC|MOB_BEAST
gold_core_spawnable = FRIENDLY_SPAWN
verb_say = "bzzs"
verb_ask = "bzzs inquisitively"
@@ -33,15 +33,13 @@
. = ..()
AddElement(/datum/element/wuv, "bzzs!")
-/mob/living/simple_animal/pet/bumbles/update_canmove()
- ..()
+/mob/living/simple_animal/pet/bumbles/update_mobility()
+ . = ..()
if(client && stat != DEAD)
if (resting)
icon_state = "[icon_living]_rest"
- collar_type = "[initial(collar_type)]_rest"
else
icon_state = "[icon_living]"
- collar_type = "[initial(collar_type)]"
regenerate_icons()
/mob/living/simple_animal/pet/bumbles/bee_friendly()
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 0f95096497..1297fddb69 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -43,10 +43,10 @@
AddElement(/datum/element/wuv, "purrs!", EMOTE_AUDIBLE, /datum/mood_event/pet_animal, "hisses!", EMOTE_AUDIBLE)
AddElement(/datum/element/mob_holder, held_icon)
-/mob/living/simple_animal/pet/cat/update_canmove()
- ..()
+/mob/living/simple_animal/pet/cat/update_mobility()
+ . = ..()
if(client && stat != DEAD)
- if (resting)
+ if(!CHECK_MOBILITY(src, MOBILITY_STAND))
icon_state = "[icon_living]_rest"
collar_type = "[initial(collar_type)]_rest"
else
@@ -180,27 +180,24 @@
emote("me", EMOTE_VISIBLE, pick("stretches out for a belly rub.", "wags its tail.", "lies down."))
icon_state = "[icon_living]_rest"
collar_type = "[initial(collar_type)]_rest"
- resting = 1
- update_canmove()
+ set_resting(TRUE)
else if (prob(1))
emote("me", EMOTE_VISIBLE, pick("sits down.", "crouches on its hind legs.", "looks alert."))
icon_state = "[icon_living]_sit"
collar_type = "[initial(collar_type)]_sit"
- resting = 1
- update_canmove()
+ set_resting(TRUE)
else if (prob(1))
if (resting)
emote("me", EMOTE_VISIBLE, pick("gets up and meows.", "walks around.", "stops resting."))
icon_state = "[icon_living]"
collar_type = "[initial(collar_type)]"
- resting = 0
- update_canmove()
+ set_resting(FALSE)
else
emote("me", EMOTE_VISIBLE, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat."))
//MICE!
if((src.loc) && isturf(src.loc))
- if(!stat && !resting && !buckled)
+ if(!stat && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) && !buckled)
for(var/mob/living/simple_animal/mouse/M in view(1,src))
if(!M.stat && Adjacent(M))
emote("me", EMOTE_VISIBLE, "splats \the [M]!")
@@ -217,7 +214,7 @@
make_babies()
- if(!stat && !resting && !buckled)
+ if(!stat && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) && !buckled)
turns_since_scan++
if(turns_since_scan > 5)
walk_to(src,0)
@@ -309,7 +306,6 @@
if (pseudo_death == TRUE) //secret cat chem
icon_state = "custom_cat_dead"
Stun(1000)
- canmove = 0
friendly = "deads at"
return
else
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index d906757ed5..9e1ae48bdd 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -26,7 +26,7 @@
..()
//CRAB movement
if(!ckey && !stat)
- if(isturf(src.loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc.
+ if(isturf(loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++
if(turns_since_move >= turns_per_move)
var/east_vs_west = pick(4,8)
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 37ef271226..46cdc755db 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -425,7 +425,7 @@
..()
//Feeding, chasing food, FOOOOODDDD
- if(!stat && !resting && !buckled)
+ if(!stat && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) && !buckled)
turns_since_scan++
if(turns_since_scan > 5)
turns_since_scan = 0
@@ -625,7 +625,7 @@
make_babies()
- if(!stat && !resting && !buckled)
+ if(!stat && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) && !buckled)
if(prob(1))
emote("me", EMOTE_VISIBLE, pick("dances around.","chases her tail."))
spawn(0)
@@ -635,8 +635,7 @@
/mob/living/simple_animal/pet/dog/pug/Life()
..()
-
- if(!stat && !resting && !buckled)
+ if(!stat && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) && !buckled)
if(prob(1))
emote("me", EMOTE_VISIBLE, pick("chases its tail."))
spawn(0)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index 43149e6ba7..726eda6c45 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -105,7 +105,7 @@
. = ..()
if(can_be_held)
//icon/item state is defined in mob_holder/drone_worn_icon()
- AddElement(/datum/element/mob_holder, null, 'icons/mob/head.dmi', 'icons/mob/inhands/clothing_righthand.dmi', 'icons/mob/inhands/clothing_lefthand.dmi', TRUE, /datum/element/mob_holder.proc/drone_worn_icon)
+ AddElement(/datum/element/mob_holder, null, 'icons/mob/head.dmi', 'icons/mob/inhands/clothing_righthand.dmi', 'icons/mob/inhands/clothing_lefthand.dmi', ITEM_SLOT_HEAD, /datum/element/mob_holder.proc/drone_worn_icon)
/mob/living/simple_animal/drone/med_hud_set_health()
var/image/holder = hud_list[DIAG_HUD]
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
index 6e1bf54000..da39fb71cf 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
@@ -204,37 +204,6 @@
else
icon_state = "[visualAppearence]_dead"
-/mob/living/simple_animal/drone/cogscarab/Stun(amount, updating = 1, ignore_canstun = 0)
+/mob/living/simple_animal/drone/cogscarab/update_mobility()
. = ..()
- if(.)
- update_icons()
-
-/mob/living/simple_animal/drone/cogscarab/SetStun(amount, updating = 1, ignore_canstun = 0)
- . = ..()
- if(.)
- update_icons()
-
-/mob/living/simple_animal/drone/cogscarab/AdjustStun(amount, updating = 1, ignore_canstun = 0)
- . = ..()
- if(.)
- update_icons()
-
-/mob/living/simple_animal/drone/cogscarab/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg)
- . = ..()
- if(.)
- update_icons()
-
-/mob/living/simple_animal/drone/cogscarab/SetKnockdown(amount, updating = 1, ignore_canknockdown = 0)
- . = ..()
- if(.)
- update_icons()
-
-/mob/living/simple_animal/drone/cogscarab/AdjustKnockdown(amount, updating = 1, ignore_canknockdown = 0)
- . = ..()
- if(.)
- update_icons()
-
-/mob/living/simple_animal/drone/cogscarab/update_canmove()
- . = ..()
- if(.)
- update_icons()
+ update_icons()
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index fad519838a..e67e649ac6 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -160,7 +160,7 @@
M.visible_message("[M] tips over [src].",
"You tip over [src].")
to_chat(src, "You are tipped over by [M]!")
- Knockdown(60,ignore_canknockdown = TRUE)
+ DefaultCombatKnockdown(60,ignore_canknockdown = TRUE)
icon_state = icon_dead
spawn(rand(20,50))
if(!stat && M)
diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm
index f0d354ace1..dbcaed1ba2 100644
--- a/code/modules/mob/living/simple_animal/friendly/lizard.dm
+++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm
@@ -26,7 +26,7 @@
/mob/living/simple_animal/hostile/lizard/ComponentInitialize()
. = ..()
- AddElement(/datum/element/mob_holder, "lizard", null, null, null, SLOT_HEAD) //you can hold lizards now.
+ AddElement(/datum/element/mob_holder, "lizard", null, null, null, ITEM_SLOT_HEAD) //you can hold lizards now.
/mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target?
if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index 479b102b36..69956c5d0d 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -41,6 +41,6 @@
. = ..()
if(. && prob(12) && iscarbon(target))
var/mob/living/carbon/C = target
- C.Knockdown(60)
+ C.DefaultCombatKnockdown(60)
C.visible_message("\The [src] knocks down \the [C]!", \
"\The [src] knocks you down!")
diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
index 6d864576a1..9b5b428f44 100644
--- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
+++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
@@ -71,7 +71,7 @@
var/atom/throw_target = get_edge_target_turf(L, dir)
L.throw_at(throw_target, rand(1,2), 7, src)
else
- L.Knockdown(20)
+ L.DefaultCombatKnockdown(20)
visible_message("[src] knocks [L] down!")
/mob/living/simple_animal/hostile/gorilla/CanAttack(atom/the_target)
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
index ee9d1dddbd..1cc675825f 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
@@ -10,7 +10,7 @@
icon_living = "basic"
icon_dead = "basic"
gender = NEUTER
- mob_biotypes = list(MOB_ROBOTIC)
+ mob_biotypes = MOB_ROBOTIC
health = 50
maxHealth = 50
healable = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
index ea01e4b659..e558982fbb 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
@@ -93,7 +93,7 @@
var/mob/living/L = AM
if(!istype(L, /mob/living/simple_animal/hostile/jungle/leaper))
playsound(src,'sound/effects/snap.ogg',50, 1, -1)
- L.Knockdown(50)
+ L.DefaultCombatKnockdown(50)
if(iscarbon(L))
var/mob/living/carbon/C = L
C.reagents.add_reagent(/datum/reagent/toxin/leaper_venom, 5)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
index c7d90f9556..1ddd9079b2 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
@@ -47,7 +47,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
icon_state = "swarmer_console"
health = 750
maxHealth = 750 //""""low-ish"""" HP because it's a passive boss, and the swarm itself is the real foe
- mob_biotypes = list(MOB_ROBOTIC)
+ mob_biotypes = MOB_ROBOTIC
medal_type = BOSS_MEDAL_SWARMERS
score_type = SWARMER_BEACON_SCORE
faction = list("mining", "boss", "swarmer")
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 16a55421b8..6ec8e0cfd2 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -69,7 +69,7 @@
icon_state = initial(icon_state)
if(prob(15) && iscarbon(target))
var/mob/living/carbon/C = target
- C.Knockdown(40)
+ C.DefaultCombatKnockdown(40)
C.visible_message("\The [src] knocks down \the [C]!", \
"\The [src] knocks you down!")
@@ -179,7 +179,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
. = ..()
if(knockdown_people && . && prob(15) && iscarbon(target))
var/mob/living/carbon/C = target
- C.Knockdown(40)
+ C.DefaultCombatKnockdown(40)
C.visible_message("\The [src] knocks down \the [C]!", \
"\The [src] knocks you down!")
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
index 199def430e..576410fe8c 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
@@ -325,6 +325,7 @@ obj/structure/elite_tumor/proc/onEliteWon()
return
E.faction = list("neutral")
E.revive(full_heal = TRUE, admin_revive = TRUE)
+ E.grab_ghost()
user.visible_message("[user] stabs [E] with [src], reviving it.")
E.playsound_local(get_turf(E), 'sound/effects/magic.ogg', 40, 0)
to_chat(E, "You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk.The skulls on [src] wail in anger as they flee from their dying host!")
var/turf/T = get_turf(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/sharks.dm b/code/modules/mob/living/simple_animal/hostile/sharks.dm
index c94e49b286..4e16a1f7bd 100644
--- a/code/modules/mob/living/simple_animal/hostile/sharks.dm
+++ b/code/modules/mob/living/simple_animal/hostile/sharks.dm
@@ -44,7 +44,7 @@
var/mob/living/carbon/L = .
if(istype(L))
if(prob(25))
- L.Knockdown(20)
+ L.DefaultCombatKnockdown(20)
L.visible_message("\the [src] knocks down \the [L]!")
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index e7b2da1844..a915ede835 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -56,7 +56,7 @@
if(iscarbon(target))
var/mob/living/carbon/C = target
if(prob(15))
- C.Knockdown(60)
+ C.DefaultCombatKnockdown(60)
C.visible_message("\The [src] knocks down \the [C]!", \
"\The [src] knocks you down!")
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
index 29bc2cbff0..976f8df229 100644
--- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -94,7 +94,7 @@
if(prob(grasp_pull_chance))
setDir(get_dir(src,L) )//staaaare
step(L,get_dir(L,src)) //reel them in
- L.Knockdown(60) //you can't get away now~
+ L.DefaultCombatKnockdown(60) //you can't get away now~
if(grasping.len < max_grasps)
grasping:
diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm
index ae3f0465d5..e926a5d332 100644
--- a/code/modules/mob/living/simple_animal/hostile/zombie.dm
+++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm
@@ -64,7 +64,7 @@
icon_state = "husk"
icon_living = "husk"
icon_dead = "husk"
- mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
+ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 0
stat_attack = UNCONSCIOUS //braains
maxHealth = 100
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index e79e24b885..9ad9a121ca 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -381,7 +381,7 @@
/mob/living/simple_animal/parrot/handle_automated_movement()
- if(!isturf(src.loc) || !canmove || buckled)
+ if(!isturf(loc) || !CHECK_MOBILITY(src, MOBILITY_MOVE) || buckled)
return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove)
if(client && stat == CONSCIOUS && parrot_state != icon_living)
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 1b1cab13bb..3feed2129b 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -153,7 +153,7 @@
/mob/living/simple_animal/proc/handle_automated_movement()
set waitfor = FALSE
if(!stop_automated_movement && wander)
- if((isturf(src.loc) || allow_movement_on_non_turfs) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
+ if((isturf(src.loc) || allow_movement_on_non_turfs) && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++
if(turns_since_move >= turns_per_move)
if(!(stop_automated_movement_when_pulled && pulledby)) //Some animals don't move when pulled
@@ -418,20 +418,19 @@
else
..()
-/mob/living/simple_animal/update_canmove(value_otherwise = TRUE)
- if(IsUnconscious() || IsStun() || IsKnockdown() || stat || resting)
+/mob/living/simple_animal/update_mobility(value_otherwise = MOBILITY_FLAGS_DEFAULT)
+ if(IsUnconscious() || IsStun() || IsParalyzed() || stat || resting)
drop_all_held_items()
- canmove = FALSE
+ mobility_flags = NONE
else if(buckled)
- canmove = FALSE
+ mobility_flags = ~MOBILITY_MOVE
else
- canmove = value_otherwise
- if(!canmove) // !(mobility_flags & MOBILITY_MOVE)
+ mobility_flags = MOBILITY_FLAGS_DEFAULT
+ if(!CHECK_MOBILITY(src, MOBILITY_MOVE)) // !(mobility_flags & MOBILITY_MOVE)
walk(src, 0) //stop mid walk
-
update_transform()
update_action_buttons_icon()
- return canmove
+ return mobility_flags
/mob/living/simple_animal/update_transform()
var/matrix/ntransform = matrix(transform) //aka transform.Copy()
diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm
index 52c9210263..5cac0c630c 100644
--- a/code/modules/mob/living/simple_animal/slime/death.dm
+++ b/code/modules/mob/living/simple_animal/slime/death.dm
@@ -24,7 +24,7 @@
stat = DEAD
cut_overlays()
- update_canmove()
+ update_mobility()
if(SSticker.mode)
SSticker.mode.check_win()
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index fd6cecf926..a923da6ed6 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -41,7 +41,7 @@
AIproc = 1
while(AIproc && stat != DEAD && (attacked || hungry || rabid || buckled))
- if(!canmove) // !(mobility_flags & MOBILITY_MOVE) //also covers buckling. Not sure why buckled is in the while condition if we're going to immediately break, honestly
+ if(!CHECK_MOBILITY(src, MOBILITY_MOVE)) //also covers buckling. Not sure why buckled is in the while condition if we're going to immediately break, honestly
break
if(!Target || client)
@@ -140,12 +140,12 @@
stat = UNCONSCIOUS
powerlevel = 0
rabid = 0
- update_canmove()
+ update_mobility()
regenerate_icons()
else if(stat == UNCONSCIOUS && !stasis)
to_chat(src, "You wake up from the stasis.")
stat = CONSCIOUS
- update_canmove()
+ update_mobility()
regenerate_icons()
updatehealth()
@@ -272,15 +272,8 @@
if(prob(25-powerlevel*5))
powerlevel++
-
-
-
/mob/living/simple_animal/slime/proc/handle_targets()
- if(Tempstun)
- if(!buckled) // not while they're eating!
- canmove = 0
- else
- canmove = 1
+ update_mobility()
if(attacked > 50)
attacked = 50
@@ -298,7 +291,7 @@
Discipline--
if(!client)
- if(!canmove)
+ if(!CHECK_MOBILITY(src, MOBILITY_MOVE))
return
if(buckled)
@@ -383,13 +376,13 @@
if (Leader)
if(holding_still)
holding_still = max(holding_still - 1, 0)
- else if(canmove && isturf(loc))
+ else if(CHECK_MOBILITY(src, MOBILITY_MOVE) && isturf(loc))
step_to(src, Leader)
else if(hungry)
if (holding_still)
holding_still = max(holding_still - hungry, 0)
- else if(canmove && isturf(loc) && prob(50))
+ else if(CHECK_MOBILITY(src, MOBILITY_MOVE) && isturf(loc) && prob(50))
step(src, pick(GLOB.cardinals))
else
@@ -397,7 +390,7 @@
holding_still = max(holding_still - 1, 0)
else if (docile && pulledby)
holding_still = 10
- else if(canmove && isturf(loc) && prob(33))
+ else if(CHECK_MOBILITY(src, MOBILITY_MOVE) && isturf(loc) && prob(33))
step(src, pick(GLOB.cardinals))
else if(!AIproc)
INVOKE_ASYNC(src, .proc/AIprocess)
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 2ea2a412f8..990e61974e 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -454,13 +454,13 @@
SStun = world.time + rand(20,60)
spawn(0)
- canmove = 0
+ DISABLE_BITFIELD(mobility_flags, MOBILITY_MOVE)
if(user)
step_away(src,user,15)
sleep(3)
if(user)
step_away(src,user,15)
- update_canmove()
+ update_mobility()
/mob/living/simple_animal/slime/pet
docile = 1
diff --git a/code/modules/mob/living/simple_animal/slime/slime_mobility.dm b/code/modules/mob/living/simple_animal/slime/slime_mobility.dm
new file mode 100644
index 0000000000..5be5ff4e36
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/slime/slime_mobility.dm
@@ -0,0 +1,5 @@
+/mob/living/simple_animal/slime/update_mobility()
+ . = ..()
+ if(Tempstun && !buckled)
+ DISABLE_BITFIELD(., MOBILITY_MOVE)
+ mobility_flags = .
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index aa5b2256d2..40b4212aac 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -1,11 +1,24 @@
-//Here are the procs used to modify status effects of a mob.
-//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness,
-// eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait.
-
+// YEEHAW GAMERS STAMINA REWORK PROC GETS TO BE FIRST
+// amount = strength
+// updating = update mobility etc etc
+// ignore_castun = same logic as Paralyze() in general
+// override_duration = If this is set, does Paralyze() for this duration.
+// override_stam = If this is set, does this amount of stamina damage.
+/mob/living/proc/DefaultCombatKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg)
+ if(!iscarbon(src))
+ return Paralyze(amount, updating, ignore_canknockdown)
+ if(istype(buckled, /obj/vehicle/ridden))
+ buckled.unbuckle_mob(src)
+ var/drop_items = amount > 80 //80 is cutoff for old item dropping behavior
+ var/stamdmg = isnull(override_stamdmg)? (amount * 0.25) : override_stamdmg
+ KnockToFloor(drop_items, TRUE, updating)
+ adjustStaminaLoss(stamdmg)
+ if(!isnull(override_hardstun))
+ Paralyze(override_hardstun)
////////////////////////////// STUN ////////////////////////////////////
-/mob/living/IsStun() //If we're stunned
+/mob/living/proc/IsStun() //If we're stunned
return has_status_effect(STATUS_EFFECT_STUN)
/mob/living/proc/AmountStun() //How many deciseconds remain in our stun
@@ -15,6 +28,8 @@
return 0
/mob/living/proc/Stun(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
if(absorb_stun(amount, ignore_canstun))
return
@@ -26,6 +41,8 @@
return S
/mob/living/proc/SetStun(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
var/datum/status_effect/incapacitating/stun/S = IsStun()
if(amount <= 0)
@@ -41,6 +58,8 @@
return S
/mob/living/proc/AdjustStun(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
if(absorb_stun(amount, ignore_canstun))
return
@@ -53,7 +72,7 @@
///////////////////////////////// KNOCKDOWN /////////////////////////////////////
-/mob/living/IsKnockdown() //If we're knocked down
+/mob/living/proc/IsKnockdown() //If we're knocked down
return has_status_effect(STATUS_EFFECT_KNOCKDOWN)
/mob/living/proc/AmountKnockdown() //How many deciseconds remain in our knockdown
@@ -62,25 +81,29 @@
return K.duration - world.time
return 0
-/mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg) //Can't go below remaining duration
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canknockdown)
- if(absorb_stun(isnull(override_hardstun)? amount : override_hardstun, ignore_canknockdown))
+/mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ if(absorb_stun(amount, ignore_canstun))
return
var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
if(K)
- K.duration = max(world.time + (isnull(override_hardstun)? amount : override_hardstun), K.duration)
- else if((amount || override_hardstun) > 0)
- K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating, override_hardstun, override_stamdmg)
+ K.duration = max(world.time + amount, K.duration)
+ else if(amount > 0)
+ K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
return K
-/mob/living/proc/SetKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Sets remaining duration
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canknockdown)
+/mob/living/proc/SetKnockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
if(amount <= 0)
if(K)
qdel(K)
else
- if(absorb_stun(amount, ignore_canknockdown))
+ if(absorb_stun(amount, ignore_canstun))
return
if(K)
K.duration = world.time + amount
@@ -88,9 +111,11 @@
K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
return K
-/mob/living/proc/AdjustKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Adds to remaining duration
- if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canknockdown)
- if(absorb_stun(amount, ignore_canknockdown))
+/mob/living/proc/AdjustKnockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ if(absorb_stun(amount, ignore_canstun))
return
var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
if(K)
@@ -99,6 +124,304 @@
K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
return K
+///////////////////////////////// IMMOBILIZED ////////////////////////////////////
+/mob/living/proc/IsImmobilized() //If we're immobilized
+ return has_status_effect(STATUS_EFFECT_IMMOBILIZED)
+
+/mob/living/proc/AmountImmobilized() //How many deciseconds remain in our Immobilized status effect
+ var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
+ if(I)
+ return I.duration - world.time
+ return 0
+
+/mob/living/proc/Immobilize(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
+ if(I)
+ I.duration = max(world.time + amount, I.duration)
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
+ return I
+
+/mob/living/proc/SetImmobilized(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
+ if(amount <= 0)
+ if(I)
+ qdel(I)
+ else
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ if(I)
+ I.duration = world.time + amount
+ else
+ I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
+ return I
+
+/mob/living/proc/AdjustImmobilized(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized()
+ if(I)
+ I.duration += amount
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating)
+ return I
+
+///////////////////////////////// PARALYZED //////////////////////////////////
+/mob/living/proc/IsParalyzed() //If we're immobilized
+ return has_status_effect(STATUS_EFFECT_PARALYZED)
+
+/mob/living/proc/AmountParalyzed() //How many deciseconds remain in our Paralyzed status effect
+ var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
+ if(P)
+ return P.duration - world.time
+ return 0
+
+/mob/living/proc/Paralyze(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
+ if(P)
+ P.duration = max(world.time + amount, P.duration)
+ else if(amount > 0)
+ P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
+ return P
+
+/mob/living/proc/SetParalyzed(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
+ if(amount <= 0)
+ if(P)
+ qdel(P)
+ else
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ if(P)
+ P.duration = world.time + amount
+ else
+ P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
+ return P
+
+/mob/living/proc/AdjustParalyzed(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE)
+ if(P)
+ P.duration += amount
+ else if(amount > 0)
+ P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating)
+ return P
+
+///////////////////////////////// DAZED ////////////////////////////////////
+/mob/living/proc/IsDazed() //If we're Dazed
+ return has_status_effect(STATUS_EFFECT_DAZED)
+
+/mob/living/proc/AmountDazed() //How many deciseconds remain in our Dazed status effect
+ var/datum/status_effect/incapacitating/dazed/I = IsDazed()
+ if(I)
+ return I.duration - world.time
+ return 0
+
+/mob/living/proc/Daze(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_DAZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/dazed/I = IsDazed()
+ if(I)
+ I.duration = max(world.time + amount, I.duration)
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
+ return I
+
+/mob/living/proc/SetDazed(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_DAZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ var/datum/status_effect/incapacitating/dazed/I = IsDazed()
+ if(amount <= 0)
+ if(I)
+ qdel(I)
+ else
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ if(I)
+ I.duration = world.time + amount
+ else
+ I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
+ return I
+
+/mob/living/proc/AdjustDazed(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_DAZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ if(absorb_stun(amount, ignore_canstun))
+ return
+ var/datum/status_effect/incapacitating/dazed/I = IsDazed()
+ if(I)
+ I.duration += amount
+ else if(amount > 0)
+ I = apply_status_effect(STATUS_EFFECT_DAZED, amount, updating)
+ return I
+
+//Blanket
+/mob/living/proc/AllImmobility(amount, updating, ignore_canstun = FALSE)
+ Paralyze(amount, FALSE, ignore_canstun)
+ Knockdown(amount, FALSE, ignore_canstun)
+ Stun(amount, FALSE, ignore_canstun)
+ Immobilize(amount, FALSE, ignore_canstun)
+ Daze(amount, FALSE, ignore_canstun)
+ if(updating)
+ update_mobility()
+
+/mob/living/proc/SetAllImmobility(amount, updating, ignore_canstun = FALSE)
+ SetParalyzed(amount, FALSE, ignore_canstun)
+ SetKnockdown(amount, FALSE, ignore_canstun)
+ SetStun(amount, FALSE, ignore_canstun)
+ SetImmobilized(amount, FALSE, ignore_canstun)
+ SetDazed(amount, FALSE, ignore_canstun)
+ if(updating)
+ update_mobility()
+
+/mob/living/proc/AdjustAllImmobility(amount, updating, ignore_canstun = FALSE)
+ AdjustParalyzed(amount, FALSE, ignore_canstun)
+ AdjustKnockdown(amount, FALSE, ignore_canstun)
+ AdjustStun(amount, FALSE, ignore_canstun)
+ AdjustImmobilized(amount, FALSE, ignore_canstun)
+ AdjustDazed(amount, FALSE, ignore_canstun)
+ if(updating)
+ update_mobility()
+
+/// Makes sure all 5 of the non-knockout immobilizing status effects are lower or equal to amount.
+/mob/living/proc/HealAllImmobilityUpTo(amount, updating, ignore_canstun = FALSE)
+ if(AmountStun() > amount)
+ SetStun(amount, FALSE, ignore_canstun)
+ if(AmountKnockdown() > amount)
+ SetKnockdown(amount, FALSE, ignore_canstun)
+ if(AmountParalyzed() > amount)
+ SetParalyzed(amount, FALSE, ignore_canstun)
+ if(AmountImmobilized() > amount)
+ SetImmobilized(amount, FALSE, ignore_canstun)
+ if(AmountDazed() > amount)
+ SetImmobilized(amount, FALSE, ignore_canstun)
+ if(updating)
+ update_mobility()
+
+/mob/living/proc/HighestImmobilityAmount()
+ return max(max(max(max(AmountStun(), AmountKnockdown()), AmountParalyzed()), AmountImmobilized()), AmountDazed())
+
+//////////////////UNCONSCIOUS
+/mob/living/proc/IsUnconscious() //If we're unconscious
+ return has_status_effect(STATUS_EFFECT_UNCONSCIOUS)
+
+/mob/living/proc/AmountUnconscious() //How many deciseconds remain in our unconsciousness
+ var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious()
+ if(U)
+ return U.duration - world.time
+ return 0
+
+/mob/living/proc/Unconscious(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_UNCONSCIOUS, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANUNCONSCIOUS) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious()
+ if(U)
+ U.duration = max(world.time + amount, U.duration)
+ else if(amount > 0)
+ U = apply_status_effect(STATUS_EFFECT_UNCONSCIOUS, amount, updating)
+ return U
+
+/mob/living/proc/SetUnconscious(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_UNCONSCIOUS, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANUNCONSCIOUS) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious()
+ if(amount <= 0)
+ if(U)
+ qdel(U)
+ else if(U)
+ U.duration = world.time + amount
+ else
+ U = apply_status_effect(STATUS_EFFECT_UNCONSCIOUS, amount, updating)
+ return U
+
+/mob/living/proc/AdjustUnconscious(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_UNCONSCIOUS, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if(((status_flags & CANUNCONSCIOUS) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
+ var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious()
+ if(U)
+ U.duration += amount
+ else if(amount > 0)
+ U = apply_status_effect(STATUS_EFFECT_UNCONSCIOUS, amount, updating)
+ return U
+
+/////////////////////////////////// SLEEPING ////////////////////////////////////
+
+/mob/living/proc/IsSleeping() //If we're asleep
+ return has_status_effect(STATUS_EFFECT_SLEEPING)
+
+/mob/living/proc/AmountSleeping() //How many deciseconds remain in our sleep
+ var/datum/status_effect/incapacitating/sleeping/S = IsSleeping()
+ if(S)
+ return S.duration - world.time
+ return 0
+
+/mob/living/proc/Sleeping(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_SLEEP, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if((!HAS_TRAIT(src, TRAIT_SLEEPIMMUNE)) || ignore_canstun)
+ var/datum/status_effect/incapacitating/sleeping/S = IsSleeping()
+ if(S)
+ S.duration = max(world.time + amount, S.duration)
+ else if(amount > 0)
+ S = apply_status_effect(STATUS_EFFECT_SLEEPING, amount, updating)
+ return S
+
+/mob/living/proc/SetSleeping(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_SLEEP, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if((!HAS_TRAIT(src, TRAIT_SLEEPIMMUNE)) || ignore_canstun)
+ var/datum/status_effect/incapacitating/sleeping/S = IsSleeping()
+ if(amount <= 0)
+ if(S)
+ qdel(S)
+ else if(S)
+ S.duration = world.time + amount
+ else
+ S = apply_status_effect(STATUS_EFFECT_SLEEPING, amount, updating)
+ return S
+
+/mob/living/proc/AdjustSleeping(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
+ if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_SLEEP, amount, updating, ignore_canstun) & COMPONENT_NO_STUN)
+ return
+ if((!HAS_TRAIT(src, TRAIT_SLEEPIMMUNE)) || ignore_canstun)
+ var/datum/status_effect/incapacitating/sleeping/S = IsSleeping()
+ if(S)
+ S.duration += amount
+ else if(amount > 0)
+ S = apply_status_effect(STATUS_EFFECT_SLEEPING, amount, updating)
+ return S
+
///////////////////////////////// FROZEN /////////////////////////////////////
/mob/living/proc/IsFrozen()
@@ -119,8 +442,10 @@
"visible_message" = message, "self_message" = self_message, "examine_message" = examine_message)
/mob/living/proc/absorb_stun(amount, ignoring_flag_presence)
- if(!amount || amount <= 0 || stat || ignoring_flag_presence || !islist(stun_absorption))
+ if(amount < 0 || stat || ignoring_flag_presence || !islist(stun_absorption))
return FALSE
+ if(!amount)
+ amount = 0
var/priority_absorb_key
var/highest_priority
for(var/i in stun_absorption)
@@ -128,20 +453,20 @@
priority_absorb_key = stun_absorption[i]
highest_priority = priority_absorb_key["priority"]
if(priority_absorb_key)
- if(priority_absorb_key["visible_message"] || priority_absorb_key["self_message"])
- if(priority_absorb_key["visible_message"] && priority_absorb_key["self_message"])
- visible_message("[src][priority_absorb_key["visible_message"]]", "[priority_absorb_key["self_message"]]")
- else if(priority_absorb_key["visible_message"])
- visible_message("[src][priority_absorb_key["visible_message"]]")
- else if(priority_absorb_key["self_message"])
- to_chat(src, "[priority_absorb_key["self_message"]]")
- priority_absorb_key["stuns_absorbed"] += amount
+ if(amount) //don't spam up the chat for continuous stuns
+ if(priority_absorb_key["visible_message"] || priority_absorb_key["self_message"])
+ if(priority_absorb_key["visible_message"] && priority_absorb_key["self_message"])
+ visible_message("[src][priority_absorb_key["visible_message"]]", "[priority_absorb_key["self_message"]]")
+ else if(priority_absorb_key["visible_message"])
+ visible_message("[src][priority_absorb_key["visible_message"]]")
+ else if(priority_absorb_key["self_message"])
+ to_chat(src, "[priority_absorb_key["self_message"]]")
+ priority_absorb_key["stuns_absorbed"] += amount
return TRUE
/////////////////////////////////// DISABILITIES ////////////////////////////////////
-
/mob/living/proc/add_quirk(quirktype, spawn_effects) //separate proc due to the way these ones are handled
- if(has_quirk(quirktype))
+ if(HAS_TRAIT(src, quirktype))
return
var/datum/quirk/T = quirktype
var/qname = initial(T.name)
@@ -162,20 +487,23 @@
if(Q.type == quirktype)
return TRUE
return FALSE
+
/////////////////////////////////// TRAIT PROCS ////////////////////////////////////
-/mob/living/proc/cure_blind(list/sources)
- REMOVE_TRAIT(src, TRAIT_BLIND, sources)
+/mob/living/proc/cure_blind(source)
+ REMOVE_TRAIT(src, TRAIT_BLIND, source)
if(!HAS_TRAIT(src, TRAIT_BLIND))
- adjust_blindness(-1)
+ update_blindness()
/mob/living/proc/become_blind(source)
- if(!HAS_TRAIT(src, TRAIT_BLIND))
- blind_eyes(1)
- ADD_TRAIT(src, TRAIT_BLIND, source)
+ if(!HAS_TRAIT(src, TRAIT_BLIND)) // not blind already, add trait then overlay
+ ADD_TRAIT(src, TRAIT_BLIND, source)
+ update_blindness()
+ else
+ ADD_TRAIT(src, TRAIT_BLIND, source)
-/mob/living/proc/cure_nearsighted(list/sources)
- REMOVE_TRAIT(src, TRAIT_NEARSIGHT, sources)
+/mob/living/proc/cure_nearsighted(source)
+ REMOVE_TRAIT(src, TRAIT_NEARSIGHT, source)
if(!HAS_TRAIT(src, TRAIT_NEARSIGHT))
clear_fullscreen("nearsighted")
@@ -184,8 +512,8 @@
overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
ADD_TRAIT(src, TRAIT_NEARSIGHT, source)
-/mob/living/proc/cure_husk(list/sources)
- REMOVE_TRAIT(src, TRAIT_HUSK, sources)
+/mob/living/proc/cure_husk(source)
+ REMOVE_TRAIT(src, TRAIT_HUSK, source)
if(!HAS_TRAIT(src, TRAIT_HUSK))
REMOVE_TRAIT(src, TRAIT_DISFIGURED, "husk")
update_body()
@@ -193,14 +521,15 @@
/mob/living/proc/become_husk(source)
if(!HAS_TRAIT(src, TRAIT_HUSK))
+ ADD_TRAIT(src, TRAIT_HUSK, source)
ADD_TRAIT(src, TRAIT_DISFIGURED, "husk")
update_body()
- . = TRUE
- ADD_TRAIT(src, TRAIT_HUSK, source)
+ else
+ ADD_TRAIT(src, TRAIT_HUSK, source)
-/mob/living/proc/cure_fakedeath(list/sources)
- REMOVE_TRAIT(src, TRAIT_FAKEDEATH, sources)
- REMOVE_TRAIT(src, TRAIT_DEATHCOMA, sources)
+/mob/living/proc/cure_fakedeath(source)
+ REMOVE_TRAIT(src, TRAIT_FAKEDEATH, source)
+ REMOVE_TRAIT(src, TRAIT_DEATHCOMA, source)
if(stat != DEAD)
tod = null
update_stat()
@@ -215,10 +544,10 @@
tod = STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)
update_stat()
-/mob/living/proc/unignore_slowdown(list/sources)
- REMOVE_TRAIT(src, TRAIT_IGNORESLOWDOWN, sources)
+/mob/living/proc/unignore_slowdown(source)
+ REMOVE_TRAIT(src, TRAIT_IGNORESLOWDOWN, source)
update_movespeed(FALSE)
/mob/living/proc/ignore_slowdown(source)
ADD_TRAIT(src, TRAIT_IGNORESLOWDOWN, source)
- update_movespeed(FALSE)
\ No newline at end of file
+ update_movespeed(FALSE)
diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm
index 7f8513bfd9..36a596f42e 100644
--- a/code/modules/mob/living/ventcrawling.dm
+++ b/code/modules/mob/living/ventcrawling.dm
@@ -50,7 +50,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
if(vent_found_parent && (vent_found_parent.members.len || vent_found_parent.other_atmosmch))
visible_message("[src] begins climbing into the ventilation system..." ,"You begin climbing into the ventilation system...")
- if(!do_after(src, 25, target = vent_found))
+ if(!do_after(src, 25, target = vent_found, required_mobility_flags = MOBILITY_MOVE))
return
if(!client)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 1ca6299efb..a523c22d53 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -659,8 +659,6 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
// facing verbs
/mob/proc/canface()
- if(!canmove)
- return FALSE
if(world.time < client.last_turn)
return FALSE
if(stat == DEAD || stat == UNCONSCIOUS)
@@ -762,7 +760,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
//You can buckle on mobs if you're next to them since most are dense
/mob/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
if(M.buckled)
- return 0
+ return FALSE
var/turf/T = get_turf(src)
if(M.loc != T)
var/old_density = density
@@ -770,7 +768,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
var/can_step = step_towards(M, T)
density = old_density
if(!can_step)
- return 0
+ return FALSE
return ..()
//Default buckling shift visual for mobs
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index c45f6eec13..638a3aa0e2 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -38,7 +38,6 @@
var/resting = 0 //Carbon
var/lying = 0
var/lying_prev = 0
- var/canmove = 1
//MOVEMENT SPEED
var/list/movespeed_modification //Lazy list, see mob_movespeed.dm
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index b11d1632c8..071ef1f49e 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -62,7 +62,7 @@
if(mob.buckled) //if we're buckled to something, tell it we moved.
return mob.buckled.relaymove(mob, direction)
- if(!mob.canmove)
+ if(!CHECK_MOBILITY(L, MOBILITY_MOVE))
return FALSE
if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved
@@ -107,9 +107,7 @@
if(P && !ismob(P) && P.density)
mob.setDir(turn(mob.dir, 180))
-///Process_Grab()
-///Called by client/Move()
-///Checks to see if you are being grabbed and if so attemps to break it
+/// Process_Grab(): checks for grab, attempts to break if so. Return TRUE to prevent movement.
/client/proc/Process_Grab()
if(mob.pulledby)
if(mob.incapacitated(ignore_restraints = 1))
@@ -120,7 +118,7 @@
to_chat(src, "You're restrained! You can't move!")
return TRUE
else
- return mob.resist_grab(1)
+ return !mob.attempt_resist_grab(TRUE)
///Process_Incorpmove
///Called by client/Move()
diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm
index 17311daec2..12379bce91 100644
--- a/code/modules/mob/status_procs.dm
+++ b/code/modules/mob/status_procs.dm
@@ -3,222 +3,81 @@
//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage,
// eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait.
-/////////////////////////////////// STUN ////////////////////////////////////
-
-/mob/proc/IsStun() //non-living mobs shouldn't be stunned
- return FALSE
-
-/////////////////////////////////// KNOCKDOWN ////////////////////////////////////
-
-/mob/proc/IsKnockdown() //non-living mobs shouldn't be knocked down
- return FALSE
-
-/////////////////////////////////// UNCONSCIOUS ////////////////////////////////////
-
-/mob/proc/IsUnconscious() //non-living mobs shouldn't be unconscious
- return FALSE
-
-/mob/living/IsUnconscious() //If we're unconscious
- return has_status_effect(STATUS_EFFECT_UNCONSCIOUS)
-
-/mob/living/proc/AmountUnconscious() //How many deciseconds remain in our unconsciousness
- var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious()
- if(U)
- return U.duration - world.time
- return 0
-
-/mob/living/proc/Unconscious(amount, updating = TRUE, ignore_canunconscious = FALSE) //Can't go below remaining duration
- if(((status_flags & CANUNCONSCIOUS) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canunconscious)
- var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious()
- if(U)
- U.duration = max(world.time + amount, U.duration)
- else if(amount > 0)
- U = apply_status_effect(STATUS_EFFECT_UNCONSCIOUS, amount, updating)
- return U
-
-/mob/living/proc/SetUnconscious(amount, updating = TRUE, ignore_canunconscious = FALSE) //Sets remaining duration
- if(((status_flags & CANUNCONSCIOUS) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canunconscious)
- var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious()
- if(amount <= 0)
- if(U)
- qdel(U)
- else if(U)
- U.duration = world.time + amount
- else
- U = apply_status_effect(STATUS_EFFECT_UNCONSCIOUS, amount, updating)
- return U
-
-/mob/living/proc/AdjustUnconscious(amount, updating = TRUE, ignore_canunconscious = FALSE) //Adds to remaining duration
- if(((status_flags & CANUNCONSCIOUS) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canunconscious)
- var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious()
- if(U)
- U.duration += amount
- else if(amount > 0)
- U = apply_status_effect(STATUS_EFFECT_UNCONSCIOUS, amount, updating)
- return U
-
-/////////////////////////////////// SLEEPING ////////////////////////////////////
-
-/mob/proc/IsSleeping() //non-living mobs shouldn't be sleeping either
- return FALSE
-
-/mob/living/IsSleeping() //If we're asleep
- return has_status_effect(STATUS_EFFECT_SLEEPING)
-
-/mob/living/proc/AmountSleeping() //How many deciseconds remain in our sleep
- var/datum/status_effect/incapacitating/sleeping/S = IsSleeping()
- if(S)
- return S.duration - world.time
- return 0
-
-/mob/living/proc/Sleeping(amount, updating = TRUE, ignore_sleepimmune = FALSE) //Can't go below remaining duration
- if((!HAS_TRAIT(src, TRAIT_SLEEPIMMUNE)) || ignore_sleepimmune)
- var/datum/status_effect/incapacitating/sleeping/S = IsSleeping()
- if(S)
- S.duration = max(world.time + amount, S.duration)
- else if(amount > 0)
- S = apply_status_effect(STATUS_EFFECT_SLEEPING, amount, updating)
- return S
-
-/mob/living/proc/SetSleeping(amount, updating = TRUE, ignore_sleepimmune = FALSE) //Sets remaining duration
- if((!HAS_TRAIT(src, TRAIT_SLEEPIMMUNE)) || ignore_sleepimmune)
- var/datum/status_effect/incapacitating/sleeping/S = IsSleeping()
- if(amount <= 0)
- if(S)
- qdel(S)
- else if(S)
- S.duration = world.time + amount
- else
- S = apply_status_effect(STATUS_EFFECT_SLEEPING, amount, updating)
- return S
-
-/mob/living/proc/AdjustSleeping(amount, updating = TRUE, ignore_sleepimmune = FALSE) //Adds to remaining duration
- if((!HAS_TRAIT(src, TRAIT_SLEEPIMMUNE)) || ignore_sleepimmune)
- var/datum/status_effect/incapacitating/sleeping/S = IsSleeping()
- if(S)
- S.duration += amount
- else if(amount > 0)
- S = apply_status_effect(STATUS_EFFECT_SLEEPING, amount, updating)
- return S
-
-/////////////////////////////////// RESTING ////////////////////////////////////
-
-/mob/proc/Resting(amount)
- resting = max(max(resting,amount),0)
-
-/mob/living/Resting(amount)
- ..()
- update_canmove()
-
-/mob/proc/SetResting(amount)
- resting = max(amount,0)
-
-/mob/living/SetResting(amount)
- ..()
- update_canmove()
-
-/mob/proc/AdjustResting(amount)
- resting = max(resting + amount,0)
-
-/mob/living/AdjustResting(amount)
- ..()
- update_canmove()
-
-/////////////////////////////////// JITTERINESS ////////////////////////////////////
-
+///Set the jitter of a mob
/mob/proc/Jitter(amount)
jitteriness = max(jitteriness,amount,0)
-/////////////////////////////////// DIZZINESS ////////////////////////////////////
-
+/**
+ * Set the dizzyness of a mob to a passed in amount
+ *
+ * Except if dizziness is already higher in which case it does nothing
+ */
/mob/proc/Dizzy(amount)
dizziness = max(dizziness,amount,0)
-/////////////////////////////////// EYE_BLIND ////////////////////////////////////
+///FOrce set the dizzyness of a mob
+/mob/proc/set_dizziness(amount)
+ dizziness = max(amount, 0)
+///Blind a mobs eyes by amount
/mob/proc/blind_eyes(amount)
- if(amount>0)
- var/old_eye_blind = eye_blind
- eye_blind = max(eye_blind, amount)
- if(!old_eye_blind)
- if(stat == CONSCIOUS || stat == SOFT_CRIT)
- throw_alert("blind", /obj/screen/alert/blind)
- overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
+ adjust_blindness(amount)
+/**
+ * Adjust a mobs blindness by an amount
+ *
+ * Will apply the blind alerts if needed
+ */
/mob/proc/adjust_blindness(amount)
- if(amount>0)
- var/old_eye_blind = eye_blind
- eye_blind += amount
- if(!old_eye_blind)
- if(stat == CONSCIOUS || stat == SOFT_CRIT)
- throw_alert("blind", /obj/screen/alert/blind)
- overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
- else if(eye_blind)
- var/blind_minimum = 0
- if((stat != CONSCIOUS && stat != SOFT_CRIT))
- blind_minimum = 1
- if(isliving(src))
- var/mob/living/L = src
- if(HAS_TRAIT(L, TRAIT_BLIND))
- blind_minimum = 1
- eye_blind = max(eye_blind+amount, blind_minimum)
- if(!eye_blind)
- clear_alert("blind")
- clear_fullscreen("blind")
-
+ var/old_eye_blind = eye_blind
+ eye_blind = max(0, eye_blind + amount)
+ if(!old_eye_blind || !eye_blind && !HAS_TRAIT(src, TRAIT_BLIND))
+ update_blindness()
+/**
+ * Force set the blindness of a mob to some level
+ */
/mob/proc/set_blindness(amount)
- if(amount>0)
- var/old_eye_blind = eye_blind
- eye_blind = amount
- if(client && !old_eye_blind)
- if(stat == CONSCIOUS || stat == SOFT_CRIT)
- throw_alert("blind", /obj/screen/alert/blind)
- overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
- else if(eye_blind)
- var/blind_minimum = 0
- if(stat != CONSCIOUS && stat != SOFT_CRIT)
- blind_minimum = 1
- if(isliving(src))
- var/mob/living/L = src
- if(HAS_TRAIT(L, TRAIT_BLIND))
- blind_minimum = 1
- eye_blind = blind_minimum
- if(!eye_blind)
- clear_alert("blind")
- clear_fullscreen("blind")
-
-/////////////////////////////////// EYE_BLURRY ////////////////////////////////////
+ var/old_eye_blind = eye_blind
+ eye_blind = max(amount, 0)
+ if(!old_eye_blind || !eye_blind && !HAS_TRAIT(src, TRAIT_BLIND))
+ update_blindness()
+/// proc that adds and removes blindness overlays when necessary
+/mob/proc/update_blindness()
+ if(stat == UNCONSCIOUS || HAS_TRAIT(src, TRAIT_BLIND) || eye_blind) // UNCONSCIOUS or has blind trait, or has temporary blindness
+ if(stat == CONSCIOUS || stat == SOFT_CRIT)
+ throw_alert("blind", /obj/screen/alert/blind)
+ overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
+ // You are blind why should you be able to make out details like color, only shapes near you
+ // add_client_colour(/datum/client_colour/monochrome/blind)
+ else // CONSCIOUS no blind trait, no blindness
+ clear_alert("blind")
+ clear_fullscreen("blind")
+ // remove_client_colour(/datum/client_colour/monochrome/blind)
+/**
+ * Make the mobs vision blurry
+ */
/mob/proc/blur_eyes(amount)
if(amount>0)
- var/old_eye_blurry = eye_blurry
eye_blurry = max(amount, eye_blurry)
- if(!old_eye_blurry)
- add_eyeblur() //Citadel edit blurry eye memes entailed. syncs beware
- else if(eye_blurry > 0)
- update_eyeblur()
+ update_eyeblur()
+/**
+ * Adjust the current blurriness of the mobs vision by amount
+ */
/mob/proc/adjust_blurriness(amount)
- var/old_eye_blurry = eye_blurry
eye_blurry = max(eye_blurry+amount, 0)
- if(amount>0)
- if(!old_eye_blurry)
- add_eyeblur()
- else if(eye_blurry > 0)
- update_eyeblur()
- else if(old_eye_blurry && !eye_blurry)
- remove_eyeblur()
+ update_eyeblur()
+///Set the mobs blurriness of vision to an amount
/mob/proc/set_blurriness(amount)
- var/old_eye_blurry = eye_blurry
eye_blurry = max(amount, 0)
- if(amount>0)
- if(!old_eye_blurry)
- add_eyeblur()
- else if(eye_blurry > 0)
- update_eyeblur()
- else if(old_eye_blurry)
- remove_eyeblur()
+ update_eyeblur()
+
+/mob/proc/update_eyeblur()
+ remove_eyeblur()
+ if(eye_blurry)
+ add_eyeblur()
/mob/proc/add_eyeblur()
if(!client)
@@ -228,10 +87,6 @@
GW.add_filter("blurry_eyes", 2, EYE_BLUR(CLAMP(eye_blurry*0.1,0.6,3)))
F.add_filter("blurry_eyes", 2, EYE_BLUR(CLAMP(eye_blurry*0.1,0.6,3)))
-/mob/proc/update_eyeblur()
- remove_eyeblur()
- add_eyeblur()
-
/mob/proc/remove_eyeblur()
if(!client)
return
@@ -240,24 +95,23 @@
GW.remove_filter("blurry_eyes")
F.remove_filter("blurry_eyes")
-/////////////////////////////////// DRUGGY ////////////////////////////////////
-
+///Adjust the drugginess of a mob
/mob/proc/adjust_drugginess(amount)
return
+///Set the drugginess of a mob
/mob/proc/set_drugginess(amount)
return
-/////////////////////////////////// GROSSED OUT ////////////////////////////////////
-
+///Adjust the disgust level of a mob
/mob/proc/adjust_disgust(amount)
return
+///Set the disgust level of a mob
/mob/proc/set_disgust(amount)
return
-/////////////////////////////////// TEMPERATURE ////////////////////////////////////
-
+///Adjust the body temperature of a mob, with min/max settings
/mob/proc/adjust_bodytemperature(amount,min_temp=0,max_temp=INFINITY)
if(bodytemperature >= min_temp && bodytemperature <= max_temp)
bodytemperature = CLAMP(bodytemperature + amount,min_temp,max_temp)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index dfbc0f483e..4b360df8c7 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -29,9 +29,8 @@
dropItemToGround(W)
//Make mob invisible and spawn animation
- notransform = 1
- canmove = 0
- Stun(22, ignore_canstun = TRUE)
+ notransform = TRUE
+ Stun(INFINITY, ignore_canstun = TRUE)
icon = null
cut_overlays()
invisibility = INVISIBILITY_MAXIMUM
@@ -187,8 +186,7 @@
//Make mob invisible and spawn animation
- notransform = 1
- canmove = 0
+ notransform = TRUE
Stun(22, ignore_canstun = TRUE)
icon = null
cut_overlays()
@@ -316,13 +314,13 @@
return ..()
/mob/living/carbon/AIize()
- if (notransform)
+ if(notransform)
return
for(var/obj/item/W in src)
dropItemToGround(W)
regenerate_icons()
- notransform = 1
- canmove = 0
+ notransform = TRUE
+ Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
return ..()
@@ -365,8 +363,8 @@
else
dropItemToGround(W)
regenerate_icons()
- notransform = 1
- canmove = 0
+ notransform = TRUE
+ Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
for(var/t in bodyparts)
@@ -408,7 +406,7 @@
dropItemToGround(W)
regenerate_icons()
notransform = 1
- canmove = 0
+ Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
for(var/t in bodyparts)
@@ -441,7 +439,7 @@
dropItemToGround(W)
regenerate_icons()
notransform = 1
- canmove = 0
+ Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
for(var/t in bodyparts)
@@ -485,8 +483,8 @@
for(var/obj/item/W in src)
dropItemToGround(W)
regenerate_icons()
- notransform = 1
- canmove = 0
+ notransform = TRUE
+ Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
for(var/t in bodyparts) //this really should not be necessary
@@ -516,7 +514,7 @@
regenerate_icons()
notransform = TRUE
- canmove = FALSE
+ Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
var/mob/living/simple_animal/hostile/gorilla/new_gorilla = new (get_turf(src))
@@ -545,7 +543,7 @@
regenerate_icons()
notransform = TRUE
- canmove = FALSE
+ Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm
index ce8ab9659c..1f19cf64ff 100644
--- a/code/modules/modular_computers/computers/item/laptop.dm
+++ b/code/modules/modular_computers/computers/item/laptop.dm
@@ -19,7 +19,6 @@
var/start_open = TRUE // unless this var is set to 1
var/icon_state_closed = "laptop-closed"
var/w_class_open = WEIGHT_CLASS_BULKY
- var/slowdown_open = TRUE
/obj/item/modular_computer/laptop/examine(mob/user)
. = ..()
@@ -92,11 +91,9 @@
/obj/item/modular_computer/laptop/proc/toggle_open(mob/living/user=null)
if(screen_on)
to_chat(user, "You close \the [src].")
- slowdown = initial(slowdown)
w_class = initial(w_class)
else
to_chat(user, "You open \the [src].")
- slowdown = slowdown_open
w_class = w_class_open
screen_on = !screen_on
diff --git a/code/modules/newscaster/newscaster_machine.dm b/code/modules/newscaster/newscaster_machine.dm
index 46dc52e286..93d5dc3b31 100644
--- a/code/modules/newscaster/newscaster_machine.dm
+++ b/code/modules/newscaster/newscaster_machine.dm
@@ -54,7 +54,6 @@ GLOBAL_LIST_EMPTY(allCasters)
return ..()
/obj/machinery/newscaster/update_icon()
- cut_overlays()
if(stat & (NOPOWER|BROKEN))
icon_state = "newscaster_off"
else
@@ -62,19 +61,23 @@ GLOBAL_LIST_EMPTY(allCasters)
icon_state = "newscaster_wanted"
else
icon_state = "newscaster_normal"
- if(alert)
- add_overlay("newscaster_alert")
+
+/obj/machinery/newscaster/update_overlays()
+ . = ..()
+
+ if(!(stat & (NOPOWER|BROKEN)) && !GLOB.news_network.wanted_issue.active && alert)
+ . += "newscaster_alert"
+
var/hp_percent = obj_integrity * 100 /max_integrity
switch(hp_percent)
if(75 to 100)
return
if(50 to 75)
- add_overlay("crack1")
+ . += "crack1"
if(25 to 50)
- add_overlay("crack2")
+ . += "crack2"
else
- add_overlay("crack3")
-
+ . += "crack3"
/obj/machinery/newscaster/power_change()
if(stat & BROKEN)
@@ -654,8 +657,7 @@ GLOBAL_LIST_EMPTY(allCasters)
var/mob/living/silicon/ai_user = user
scanned_user = "[ai_user.name] ([ai_user.job])"
else
- throw EXCEPTION("Invalid user for this proc")
- return
+ CRASH("Invalid user for this proc")
/obj/machinery/newscaster/proc/print_paper()
SSblackbox.record_feedback("amount", "newspapers_printed", 1)
diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm
index f166717aaf..f1e7119530 100644
--- a/code/modules/ninja/ninja_event.dm
+++ b/code/modules/ninja/ninja_event.dm
@@ -69,7 +69,7 @@ Contents:
Mind.add_antag_datum(ninjadatum)
if(Ninja.mind != Mind) //something has gone wrong!
- throw EXCEPTION("Ninja created with incorrect mind")
+ stack_trace("Ninja created with incorrect mind")
spawned_mobs += Ninja
message_admins("[ADMIN_LOOKUPFLW(Ninja)] has been made into a ninja by an event.")
diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm
index 10fce3d74e..6553211c07 100644
--- a/code/modules/ninja/suit/ninjaDrainAct.dm
+++ b/code/modules/ninja/suit/ninjaDrainAct.dm
@@ -263,7 +263,7 @@ They *could* go in their appropriate files, but this is supposed to be modular
visible_message("[H] electrocutes [src] with [H.p_their()] touch!", "[H] electrocutes you with [H.p_their()] touch!")
electrocute_act(15, H)
- Knockdown(G.stunforce)
+ DefaultCombatKnockdown(G.stunforce)
adjustStaminaLoss(G.stunforce*0.1, affected_zone = (istype(H) ? H.zone_selected : BODY_ZONE_CHEST))
apply_effect(EFFECT_STUTTER, G.stunforce)
SEND_SIGNAL(src, COMSIG_LIVING_MINOR_SHOCK)
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index 076d8b026a..06c16810b7 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -120,7 +120,7 @@
H.adjust_blurriness(6)
if(eyes)
eyes.applyOrganDamage(rand(6,8))
- H.Knockdown(40)
+ H.DefaultCombatKnockdown(40)
H.emote("scream")
/obj/item/paper/examine(mob/user)
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index fad4ec80b4..a98f057c4a 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -139,6 +139,7 @@
O.name = input
to_chat(user, "\The [oldname] has been successfully been renamed to \the [input].")
O.renamedByPlayer = TRUE
+ log_game("[user] [key_name(user)] has renamed [O] to [input]")
if(penchoice == "Change description")
var/input = stripped_input(user,"Describe \the [O.name] here", ,"", 100)
@@ -146,6 +147,7 @@
return
O.desc = input
to_chat(user, "You have successfully changed \the [O.name]'s description.")
+ log_game("[user] [key_name(user)] has changed [O]'s description to to [input]")
/*
* Sleepypens
diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm
index d51f569738..d45a119553 100644
--- a/code/modules/photography/photos/photo.dm
+++ b/code/modules/photography/photos/photo.dm
@@ -84,8 +84,12 @@
set category = "Object"
set src in usr
+ var/mob/living/L = usr
+ if(!istype(L))
+ return
+
var/n_name = stripped_input(usr, "What would you like to label the photo?", "Photo Labelling", "", MAX_NAME_LEN)
//loc.loc check is for making possible renaming photos in clipboards
- if(n_name && (loc == usr || loc.loc && loc.loc == usr) && usr.stat == CONSCIOUS && usr.canmove && !usr.restrained())
+ if(n_name && (loc == usr || loc.loc && loc.loc == usr) && CHECK_MOBILITY(L, MOBILITY_USE))
name = "photo[(n_name ? text("- '[n_name]'") : null)]"
add_fingerprint(usr)
diff --git a/code/modules/pool/pool_controller.dm b/code/modules/pool/pool_controller.dm
index 681adb0ef3..52be51d1c1 100644
--- a/code/modules/pool/pool_controller.dm
+++ b/code/modules/pool/pool_controller.dm
@@ -109,9 +109,11 @@
to_chat(user, "The interface on [src] is already too damaged to short it again.")
return
-/obj/machinery/pool/controller/AltClick(mob/user)
+/obj/machinery/pool/controller/AltClick(mob/living/user)
. = ..()
- if(!isliving(user) || !user.Adjacent(src) || !user.CanReach(src) || user.IsStun() || user.IsKnockdown() || user.incapacitated())
+ if(!istype(user))
+ return FALSE
+ if(!user.Adjacent(src) || !user.CanReach(src) || !CHECK_MOBILITY(user, MOBILITY_USE))
return FALSE
visible_message("[user] starts to drain [src]!")
draining = TRUE
diff --git a/code/modules/pool/pool_main.dm b/code/modules/pool/pool_main.dm
index 2b260b5c0b..40aac0e88d 100644
--- a/code/modules/pool/pool_main.dm
+++ b/code/modules/pool/pool_main.dm
@@ -50,9 +50,11 @@
layer = BELOW_MOB_LAYER
// Mousedrop hook to normal turfs to get out of pools.
-/turf/open/MouseDrop_T(atom/from, mob/user)
+/turf/open/MouseDrop_T(atom/from, mob/living/user)
+ if(!istype(user))
+ return ..()
// I could make this /open/floor and not have the !istype but ehh - kev
- if(isliving(from) && HAS_TRAIT(from, TRAIT_SWIMMING) && isliving(user) && ((user == from) || user.CanReach(from)) && !user.IsStun() && !user.IsKnockdown() && !user.incapacitated() && !istype(src, /turf/open/pool))
+ if(HAS_TRAIT(from, TRAIT_SWIMMING) && isliving(user) && ((user == from) || user.CanReach(from)) && !CHECK_MOBILITY(user, MOBILITY_USE) && !istype(src, /turf/open/pool))
var/mob/living/L = from
//The element only exists if you're on water and a living mob, so let's skip those checks.
var/pre_msg
@@ -119,10 +121,10 @@
H.visible_message("[H] falls in the water!",
"You fall in the water!")
playsound(src, 'sound/effects/splash.ogg', 60, TRUE, 1)
- H.Knockdown(20)
+ H.DefaultCombatKnockdown(20)
return
else
- H.Knockdown(60)
+ H.DefaultCombatKnockdown(60)
H.adjustOxyLoss(5)
H.emote("cough")
H.visible_message("[H] falls in and takes a drink!",
@@ -133,19 +135,19 @@
H.visible_message("[H] falls in the drained pool!",
"You fall in the drained pool!")
H.adjustBruteLoss(7)
- H.Knockdown(80)
+ H.DefaultCombatKnockdown(80)
playsound(src, 'sound/effects/woodhit.ogg', 60, TRUE, 1)
else
H.visible_message("[H] falls in the drained pool, and cracks his skull!",
"You fall in the drained pool, and crack your skull!")
H.apply_damage(15, BRUTE, "head")
- H.Knockdown(200) // This should hurt. And it does.
+ H.DefaultCombatKnockdown(200) // This should hurt. And it does.
playsound(src, 'sound/effects/woodhit.ogg', 60, TRUE, 1)
playsound(src, 'sound/misc/crack.ogg', 100, TRUE)
else
H.visible_message("[H] falls in the drained pool, but had an helmet!",
"You fall in the drained pool, but you had an helmet!")
- H.Knockdown(40)
+ H.DefaultCombatKnockdown(40)
playsound(src, 'sound/effects/woodhit.ogg', 60, TRUE, 1)
else if(filled)
victim.adjustStaminaLoss(1)
diff --git a/code/modules/pool/pool_structures.dm b/code/modules/pool/pool_structures.dm
index 92350abf44..4cea485237 100644
--- a/code/modules/pool/pool_structures.dm
+++ b/code/modules/pool/pool_structures.dm
@@ -119,7 +119,7 @@
"You misstep!")
var/atom/throw_target = get_edge_target_turf(src, dir)
jumper.throw_at(throw_target, 0, 1, callback = CALLBACK(src, .proc/on_finish_jump, jumper))
- jumper.Knockdown(100)
+ jumper.DefaultCombatKnockdown(100)
jumper.adjustBruteLoss(10)
if(91 to 100)
@@ -156,4 +156,4 @@
to_chat(victim, "That was stupid of you..")
victim.visible_message("[victim] smashes into the ground!")
victim.apply_damage(50)
- victim.Knockdown(200)
+ victim.DefaultCombatKnockdown(200)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 43a1f94ca5..a53af534e1 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -570,8 +570,7 @@
else if (istype(W, /obj/item/stack/cable_coil) && opened)
var/turf/host_turf = get_turf(src)
if(!host_turf)
- throw EXCEPTION("attackby on APC when it's not on a turf")
- return
+ CRASH("attackby on APC when it's not on a turf")
if (host_turf.intact)
to_chat(user, "You must remove the floor plating in front of the APC first!")
return
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 31e0c479ed..89596eb82f 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -108,7 +108,7 @@
var/shock_damage = min(rand(30,40),rand(30,40))
if(iscarbon(user))
- user.Knockdown(300)
+ user.DefaultCombatKnockdown(300)
user.electrocute_act(shock_damage, src, 1)
else if(issilicon(user))
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 92c86ba7b0..6c5f97557d 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -1,5 +1,5 @@
-#define SOLAR_MAX_DIST 40
-#define SOLARGENRATE 1500
+#define SOLAR_GEN_RATE 1500
+#define OCCLUSION_DISTANCE 20
/obj/machinery/power/solar
name = "solar panel"
@@ -10,20 +10,53 @@
use_power = NO_POWER_USE
idle_power_usage = 0
active_power_usage = 0
- var/id = 0
max_integrity = 150
integrity_failure = 0.33
- var/obscured = 0
- var/sunfrac = 0
- var/adir = SOUTH // actual dir
- var/ndir = SOUTH // target dir
- var/turn_angle = 0
- var/obj/machinery/power/solar_control/control = null
+
+ var/id
+ var/obscured = FALSE
+ var/sunfrac = 0 //[0-1] measure of obscuration -- multipllier against power generation
+ var/azimuth_current = 0 //[0-360) degrees, which direction are we facing?
+ var/azimuth_target = 0 //same but what way we're going to face next time we turn
+ var/obj/machinery/power/solar_control/control
+ var/needs_to_turn = TRUE //do we need to turn next tick?
+ var/needs_to_update_solar_exposure = TRUE //do we need to call update_solar_exposure() next tick?
+ var/obj/effect/overlay/panel
var/obj/item/solar_assembly/assembly
var/efficiency = 1
/obj/machinery/power/solar/Initialize(mapload, obj/item/solar_assembly/S)
. = ..()
+ panel = new()
+#if DM_VERSION >= 513
+ panel.vis_flags = VIS_INHERIT_ID|VIS_INHERIT_ICON|VIS_INHERIT_PLANE
+ vis_contents += panel
+#endif
+ panel.icon = icon
+ panel.icon_state = "solar_panel"
+ panel.layer = FLY_LAYER
+ Make(S)
+ connect_to_network()
+ RegisterSignal(SSsun, COMSIG_SUN_MOVED, .proc/queue_update_solar_exposure)
+
+/obj/machinery/power/solar/Destroy()
+ unset_control() //remove from control computer
+ return ..()
+
+//set the control of the panel to a given computer
+/obj/machinery/power/solar/proc/set_control(obj/machinery/power/solar_control/SC)
+ unset_control()
+ control = SC
+ SC.connected_panels += src
+ queue_turn(SC.azimuth_target)
+
+//set the control of the panel to null and removes it from the control list of the previous control computer if needed
+/obj/machinery/power/solar/proc/unset_control()
+ if(control)
+ control.connected_panels -= src
+ control = null
+
+/obj/machinery/power/solar/proc/Make(obj/item/solar_assembly/S)
if(!S)
assembly = new /obj/item/solar_assembly
assembly.glass_type = new /obj/item/stack/sheet/glass(null, 2)
@@ -34,32 +67,13 @@
assembly.glass_type.on_solar_construction(src)
obj_integrity = max_integrity
update_icon()
- connect_to_network()
-
-/obj/machinery/power/solar/Destroy()
- unset_control() //remove from control computer
- return ..()
-
-//set the control of the panel to a given computer if closer than SOLAR_MAX_DIST
-/obj/machinery/power/solar/proc/set_control(obj/machinery/power/solar_control/SC)
- if(!SC || (get_dist(src, SC) > SOLAR_MAX_DIST))
- return 0
- control = SC
- SC.connected_panels |= src
- return 1
-
-//set the control of the panel to null and removes it from the control list of the previous control computer if needed
-/obj/machinery/power/solar/proc/unset_control()
- if(control)
- control.connected_panels.Remove(src)
- control = null
/obj/machinery/power/solar/crowbar_act(mob/user, obj/item/I)
- playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
- user.visible_message("[user] begins to take the glass off [src].", "You begin to take the glass off [src]...")
+ playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
+ user.visible_message("[user] begins to take the glass off [src].", "You begin to take the glass off [src]...")
if(I.use_tool(src, user, 50))
- playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
- user.visible_message("[user] takes the glass off [src].", "You take the glass off [src].")
+ playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE)
+ user.visible_message("[user] takes the glass off [src].", "You take the glass off [src].")
deconstruct(TRUE)
return TRUE
@@ -67,16 +81,16 @@
switch(damage_type)
if(BRUTE)
if(stat & BROKEN)
- playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 60, 1)
+ playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 60, TRUE)
else
- playsound(loc, 'sound/effects/glasshit.ogg', 90, 1)
+ playsound(loc, 'sound/effects/glasshit.ogg', 90, TRUE)
if(BURN)
- playsound(loc, 'sound/items/welder.ogg', 100, 1)
+ playsound(loc, 'sound/items/welder.ogg', 100, TRUE)
/obj/machinery/power/solar/obj_break(damage_flag)
if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1))
- playsound(loc, 'sound/effects/glassbr3.ogg', 100, 1)
+ playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE)
stat |= BROKEN
unset_control()
update_icon()
@@ -94,81 +108,95 @@
new shard(loc)
qdel(src)
-
-/obj/machinery/power/solar/update_icon()
- ..()
- cut_overlays()
+/obj/machinery/power/solar/update_overlays()
+ . = ..()
+ var/matrix/turner = matrix()
+ turner.Turn(azimuth_current)
+ panel.transform = turner
if(stat & BROKEN)
- add_overlay(mutable_appearance(icon, "solar_panel-b", FLY_LAYER))
+ panel.icon_state = "solar_panel-b"
else
- add_overlay(mutable_appearance(icon, "solar_panel", FLY_LAYER))
- src.setDir(angle2dir(adir))
+ panel.icon_state = "solar_panel"
+#if DM_VERSION <= 512
+ . += new /mutable_appearance(panel)
+#endif
-//calculates the fraction of the sunlight that the panel receives
+/obj/machinery/power/solar/proc/queue_turn(azimuth)
+ needs_to_turn = TRUE
+ azimuth_target = azimuth
+
+/obj/machinery/power/solar/proc/queue_update_solar_exposure()
+ needs_to_update_solar_exposure = TRUE //updating right away would be wasteful if we're also turning later
+
+/obj/machinery/power/solar/proc/update_turn()
+ needs_to_turn = FALSE
+ if(azimuth_current != azimuth_target)
+ azimuth_current = azimuth_target
+ occlusion_setup()
+ update_icon()
+ needs_to_update_solar_exposure = TRUE
+
+///trace towards sun to see if we're in shadow
+/obj/machinery/power/solar/proc/occlusion_setup()
+ obscured = TRUE
+
+ var/distance = OCCLUSION_DISTANCE
+ var/target_x = round(sin(SSsun.azimuth), 0.01)
+ var/target_y = round(cos(SSsun.azimuth), 0.01)
+ var/x_hit = x
+ var/y_hit = y
+ var/turf/hit
+
+ for(var/run in 1 to distance)
+ x_hit += target_x
+ y_hit += target_y
+ hit = locate(round(x_hit, 1), round(y_hit, 1), z)
+ if(hit.opacity)
+ return
+ if(hit.x == 1 || hit.x == world.maxx || hit.y == 1 || hit.y == world.maxy) //edge of the map
+ break
+ obscured = FALSE
+
+///calculates the fraction of the sunlight that the panel receives
/obj/machinery/power/solar/proc/update_solar_exposure()
+ needs_to_update_solar_exposure = FALSE
+ sunfrac = 0
if(obscured)
- sunfrac = 0
- return
+ return 0
- //find the smaller angle between the direction the panel is facing and the direction of the sun (the sign is not important here)
- var/p_angle = min(abs(adir - SSsun.angle), 360 - abs(adir - SSsun.angle))
+ var/sun_azimuth = SSsun.azimuth
+ if(azimuth_current == sun_azimuth) //just a quick optimization for the most frequent case
+ . = 1
+ else
+ //dot product of sun and panel -- Lambert's Cosine Law
+ . = cos(azimuth_current - sun_azimuth)
+ . = CLAMP(round(., 0.01), 0, 1)
+ sunfrac = .
- if(p_angle > 90) // if facing more than 90deg from sun, zero output
- sunfrac = 0
- return
-
- sunfrac = cos(p_angle) ** 2
- //isn't the power received from the incoming light proportionnal to cos(p_angle) (Lambert's cosine law) rather than cos(p_angle)^2 ?
-
-/obj/machinery/power/solar/process()//TODO: remove/add this from machines to save on processing as needed ~Carn PRIORITY
+/obj/machinery/power/solar/process()
if(stat & BROKEN)
return
- if(!control) //if there's no sun or the panel is not linked to a solar control computer, no need to proceed
+ if(control && (!powernet || control.powernet != powernet))
+ unset_control()
+ if(needs_to_turn)
+ update_turn()
+ if(needs_to_update_solar_exposure)
+ update_solar_exposure()
+ if(sunfrac <= 0)
return
- if(powernet)
- if(powernet == control.powernet)//check if the panel is still connected to the computer
- if(obscured) //get no light from the sun, so don't generate power
- return
- var/sgen = SOLARGENRATE * sunfrac * efficiency
- add_avail(sgen)
- control.gen += sgen
- else //if we're no longer on the same powernet, remove from control computer
- unset_control()
+ var/sgen = SOLAR_GEN_RATE * sunfrac
+ add_avail(sgen)
+ if(control)
+ control.gen += sgen
-
-/obj/machinery/power/solar/fake/New(var/turf/loc, var/obj/item/solar_assembly/S)
- ..(loc, S, 0)
+//Bit of a hack but this whole type is a hack
+/obj/machinery/power/solar/fake/Initialize(turf/loc, obj/item/solar_assembly/S)
+ . = ..()
+ UnregisterSignal(SSsun, COMSIG_SUN_MOVED)
/obj/machinery/power/solar/fake/process()
- . = PROCESS_KILL
- return
-
-//trace towards sun to see if we're in shadow
-/obj/machinery/power/solar/proc/occlusion()
-
- var/ax = x // start at the solar panel
- var/ay = y
- var/turf/T = null
- var/dx = SSsun.dx
- var/dy = SSsun.dy
-
- for(var/i = 1 to 20) // 20 steps is enough
- ax += dx // do step
- ay += dy
-
- T = locate( round(ax,0.5),round(ay,0.5),z)
-
- if(T.x == 1 || T.x==world.maxx || T.y==1 || T.y==world.maxy) // not obscured if we reach the edge
- break
-
- if(T.density) // if we hit a solid turf, panel is obscured
- obscured = 1
- return
-
- obscured = 0 // if hit the edge or stepped 20 times, not obscured
- update_solar_exposure()
-
+ return PROCESS_KILL
//
// Solar Assembly - For construction of solar arrays.
@@ -202,6 +230,7 @@
glass_type.forceMove(Tsec)
glass_type = null
+
/obj/item/solar_assembly/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/wrench) && isturf(loc))
if(isinspace())
@@ -224,8 +253,7 @@
var/obj/item/stack/sheet/G = S.change_stack(null, 2)
if(G)
glass_type = G
- G.moveToNullspace()
- playsound(loc, 'sound/machines/click.ogg', 50, 1)
+ playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user.visible_message("[user] places the glass on the solar assembly.", "You place the glass on the solar assembly.")
if(tracker)
new /obj/machinery/power/tracker(get_turf(src), src)
@@ -269,21 +297,23 @@
var/icon_screen = "solar"
var/icon_keyboard = "power_key"
var/id = 0
- var/currentdir = 0
- var/targetdir = 0 // target angle in manual tracking (since it updates every game minute)
var/gen = 0
var/lastgen = 0
- var/track = 0 // 0= off 1=timed 2=auto (tracker)
- var/trackrate = 600 // 300-900 seconds
- var/nexttime = 0 // time for a panel to rotate of 1 degree in manual tracking
+ var/azimuth_target = 0
+ var/azimuth_rate = 1 ///degree change per minute
+
+ var/track = SOLAR_TRACK_OFF ///SOLAR_TRACK_OFF, SOLAR_TRACK_TIMED, SOLAR_TRACK_AUTO
+
var/obj/machinery/power/tracker/connected_tracker = null
var/list/connected_panels = list()
/obj/machinery/power/solar_control/Initialize()
. = ..()
- if(powernet)
- set_panels(currentdir)
+ azimuth_rate = SSsun.base_rotation
+ RegisterSignal(SSsun, COMSIG_SUN_MOVED, .proc/timed_track)
connect_to_network()
+ if(powernet)
+ set_panels(azimuth_target)
/obj/machinery/power/solar_control/Destroy()
for(var/obj/machinery/power/solar/M in connected_panels)
@@ -292,16 +322,6 @@
connected_tracker.unset_control()
return ..()
-/obj/machinery/power/solar_control/disconnect_from_network()
- ..()
- SSsun.solars.Remove(src)
-
-/obj/machinery/power/solar_control/connect_to_network()
- var/to_return = ..()
- if(powernet) //if connected and not already in solar_list...
- SSsun.solars |= src //... add it
- return to_return
-
//search for unconnected panels and trackers in the computer powernet and connect them
/obj/machinery/power/solar_control/proc/search_for_connected()
if(powernet)
@@ -316,32 +336,16 @@
if(!T.control) //i.e unconnected
T.set_control(src)
-//called by the sun controller, update the facing angle (either manually or via tracking) and rotates the panels accordingly
-/obj/machinery/power/solar_control/proc/update()
- if(stat & (NOPOWER | BROKEN))
- return
-
- switch(track)
- if(1)
- if(trackrate) //we're manual tracking. If we set a rotation speed...
- currentdir = targetdir //...the current direction is the targetted one (and rotates panels to it)
- if(2) // auto-tracking
- if(connected_tracker)
- connected_tracker.set_angle(SSsun.angle)
-
- set_panels(currentdir)
- updateDialog()
-
-/obj/machinery/power/solar_control/update_icon()
- cut_overlays()
+/obj/machinery/power/solar_control/update_overlays()
+ . = ..()
if(stat & NOPOWER)
- add_overlay("[icon_keyboard]_off")
+ . += mutable_appearance(icon, "[icon_keyboard]_off")
return
- add_overlay(icon_keyboard)
+ . += mutable_appearance(icon, icon_keyboard)
if(stat & BROKEN)
- add_overlay("[icon_state]_broken")
+ . += mutable_appearance(icon, "[icon_state]_broken")
else
- add_overlay(icon_screen)
+ . += mutable_appearance(icon, icon_screen)
/obj/machinery/power/solar_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
@@ -352,73 +356,60 @@
/obj/machinery/power/solar_control/ui_data()
var/data = list()
-
data["generated"] = round(lastgen)
- data["angle"] = currentdir
- data["direction"] = angle2text(currentdir)
-
+ data["generated_ratio"] = data["generated"] / round(max(connected_panels.len, 1) * SOLAR_GEN_RATE)
+ data["azimuth_current"] = azimuth_target
+ data["azimuth_rate"] = azimuth_rate
+ data["max_rotation_rate"] = SSsun.base_rotation * 2
data["tracking_state"] = track
- data["tracking_rate"] = trackrate
- data["rotating_way"] = (trackrate<0 ? "CCW" : "CW")
-
data["connected_panels"] = connected_panels.len
- data["connected_tracker"] = (connected_tracker ? 1 : 0)
+ data["connected_tracker"] = (connected_tracker ? TRUE : FALSE)
return data
/obj/machinery/power/solar_control/ui_act(action, params)
if(..())
return
- if(action == "angle")
+ if(action == "azimuth")
var/adjust = text2num(params["adjust"])
var/value = text2num(params["value"])
if(adjust)
- value = currentdir + adjust
+ value = azimuth_target + adjust
if(value != null)
- currentdir = CLAMP((360 + value) % 360, 0, 359)
- targetdir = currentdir
- set_panels(currentdir)
+ set_panels(value)
return TRUE
return FALSE
- if(action == "rate")
+ if(action == "azimuth_rate")
var/adjust = text2num(params["adjust"])
var/value = text2num(params["value"])
if(adjust)
- value = trackrate + adjust
+ value = azimuth_rate + adjust
if(value != null)
- trackrate = CLAMP(value, -7200, 7200)
- if(trackrate)
- nexttime = world.time + 36000 / abs(trackrate)
+ azimuth_rate = round(CLAMP(value, -2 * SSsun.base_rotation, 2 * SSsun.base_rotation), 0.01)
return TRUE
return FALSE
if(action == "tracking")
var/mode = text2num(params["mode"])
track = mode
- if(mode == 2 && connected_tracker)
- connected_tracker.set_angle(SSsun.angle)
- set_panels(currentdir)
- else if(mode == 1)
- targetdir = currentdir
- if(trackrate)
- nexttime = world.time + 36000 / abs(trackrate)
- set_panels(targetdir)
+ if(mode == SOLAR_TRACK_AUTO)
+ if(connected_tracker)
+ connected_tracker.sun_update(SSsun, SSsun.azimuth)
+ else
+ track = SOLAR_TRACK_OFF
return TRUE
if(action == "refresh")
search_for_connected()
- if(connected_tracker && track == 2)
- connected_tracker.set_angle(SSsun.angle)
- set_panels(currentdir)
return TRUE
return FALSE
/obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/screwdriver))
- if(I.use_tool(src, user, 20, volume=50))
- if (src.stat & BROKEN)
+ if(I.tool_behaviour == TOOL_SCREWDRIVER)
+ if(I.use_tool(src, user, 20, volume = 50))
+ if(src.stat & BROKEN)
to_chat(user, "The broken glass falls out.")
var/obj/structure/frame/computer/A = new /obj/structure/frame/computer( src.loc )
new /obj/item/shard( src.loc )
var/obj/item/circuitboard/computer/solar_control/M = new /obj/item/circuitboard/computer/solar_control( A )
- for (var/obj/C in src)
+ for(var/obj/C in src)
C.forceMove(drop_location())
A.circuit = M
A.state = 3
@@ -429,7 +420,7 @@
to_chat(user, "You disconnect the monitor.")
var/obj/structure/frame/computer/A = new /obj/structure/frame/computer( src.loc )
var/obj/item/circuitboard/computer/solar_control/M = new /obj/item/circuitboard/computer/solar_control( A )
- for (var/obj/C in src)
+ for(var/obj/C in src)
C.forceMove(drop_location())
A.circuit = M
A.state = 4
@@ -445,15 +436,15 @@
switch(damage_type)
if(BRUTE)
if(stat & BROKEN)
- playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
+ playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE)
else
- playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1)
+ playsound(src.loc, 'sound/effects/glasshit.ogg', 75, TRUE)
if(BURN)
- playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
+ playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE)
/obj/machinery/power/solar_control/obj_break(damage_flag)
if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1))
- playsound(loc, 'sound/effects/glassbr3.ogg', 100, 1)
+ playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE)
stat |= BROKEN
update_icon()
@@ -461,36 +452,31 @@
lastgen = gen
gen = 0
- if(stat & (NOPOWER | BROKEN))
- return
+ if(connected_tracker && (!powernet || connected_tracker.powernet != powernet))
+ connected_tracker.unset_control()
- if(connected_tracker) //NOTE : handled here so that we don't add trackers to the processing list
- if(connected_tracker.powernet != powernet)
- connected_tracker.unset_control()
+///Ran every time the sun updates.
+/obj/machinery/power/solar_control/proc/timed_track()
+ if(track == SOLAR_TRACK_TIMED)
+ azimuth_target += azimuth_rate
+ set_panels(azimuth_target)
- if(track==1 && trackrate) //manual tracking and set a rotation speed
- if(nexttime <= world.time) //every time we need to increase/decrease the angle by 1�...
- targetdir = (targetdir + trackrate/abs(trackrate) + 360) % 360 //... do it
- nexttime += 36000/abs(trackrate) //reset the counter for the next 1�
-
-//rotates the panel to the passed angle
-/obj/machinery/power/solar_control/proc/set_panels(currentdir)
+///Rotates the panel to the passed angles
+/obj/machinery/power/solar_control/proc/set_panels(azimuth)
+ azimuth = CLAMP(round(azimuth, 0.01), -360, 719.99)
+ if(azimuth >= 360)
+ azimuth -= 360
+ if(azimuth < 0)
+ azimuth += 360
+ azimuth_target = azimuth
for(var/obj/machinery/power/solar/S in connected_panels)
- S.adir = currentdir //instantly rotates the panel
- S.occlusion()//and
- S.update_icon() //update it
-
- update_icon()
-
+ S.queue_turn(azimuth)
/obj/machinery/power/solar_control/power_change()
..()
update_icon()
-
-
-
//
// MISC
//
@@ -498,3 +484,6 @@
/obj/item/paper/guides/jobs/engi/solars
name = "paper- 'Going green! Setup your own solar array instructions.'"
info = "Welcome
At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuel or plasma! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array.
You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!
Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker.
Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.
That's all to it, be safe, be green!
"
+
+#undef SOLAR_GEN_RATE
+#undef OCCLUSION_DISTANCE
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 21003b5e86..67cc371c3b 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -328,12 +328,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
if(power)
soundloop.volume = min(40, (round(power/100)/50)+1) // 5 +1 volume per 20 power. 2500 power is max
- if(isclosedturf(T))
- var/turf/did_it_melt = T.Melt()
- if(!isclosedturf(did_it_melt)) //In case some joker finds way to place these on indestructible walls
- visible_message("[src] melts through [T]!")
- return
-
//Ok, get the air from the turf
var/datum/gas_mixture/env = T.return_air()
@@ -345,8 +339,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
else
// Pass all the gas related code an empty gas container
removed = new()
-
- damage = min(damage_archived + (DAMAGE_HARDCAP * explosion_point),damage) // hardcap any direct damage taken before doing atmos damage
+ damage = min(damage_archived + (DAMAGE_HARDCAP * explosion_point),damage)
damage_archived = damage
if(!removed || !removed.total_moles() || isspaceturf(T)) //we're in space or there is no gas to process
if(takes_damage)
@@ -531,7 +524,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
message_admins("[src] has been powered for the first time [ADMIN_JMP(src)].")
has_been_powered = TRUE
else if(takes_damage)
- damage += Proj.damage * config_bullet_energy
+ matter_power += Proj.damage * config_bullet_energy
return BULLET_ACT_HIT
/obj/machinery/power/supermatter_crystal/singularity_act()
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index c3f284bf70..0627a55de0 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -1,6 +1,6 @@
//Solar tracker
-//Machine that tracks the sun and reports it's direction to the solar controllers
+//Machine that tracks the sun and reports its direction to the solar controllers
//As long as this is working, solar panels on same powernet will track automatically
/obj/machinery/power/tracker
@@ -14,12 +14,39 @@
integrity_failure = 0.2
var/id = 0
- var/sun_angle = 0 // sun angle as set by sun datum
- var/obj/machinery/power/solar_control/control = null
+ var/obj/machinery/power/solar_control/control
var/obj/item/solar_assembly/assembly
/obj/machinery/power/tracker/Initialize(mapload, obj/item/solar_assembly/S)
. = ..()
+ Make(S)
+ connect_to_network()
+ RegisterSignal(SSsun, COMSIG_SUN_MOVED, .proc/sun_update)
+
+/obj/machinery/power/tracker/Destroy()
+ unset_control() //remove from control computer
+ return ..()
+
+/obj/machinery/power/tracker/proc/set_control(obj/machinery/power/solar_control/SC)
+ unset_control()
+ control = SC
+ SC.connected_tracker = src
+
+//set the control of the tracker to null and removes it from the previous control computer if needed
+/obj/machinery/power/tracker/proc/unset_control()
+ if(control)
+ if(control.track == SOLAR_TRACK_AUTO)
+ control.track = SOLAR_TRACK_OFF
+ control.connected_tracker = null
+ control = null
+
+///Tell the controller to turn the solar panels
+/obj/machinery/power/tracker/proc/sun_update(datum/source, azimuth)
+ setDir(angle2dir(azimuth))
+ if(control && control.track == SOLAR_TRACK_AUTO)
+ control.set_panels(azimuth)
+
+/obj/machinery/power/tracker/proc/Make(obj/item/solar_assembly/S)
if(!S)
assembly = new /obj/item/solar_assembly
assembly.glass_type = new /obj/item/stack/sheet/glass(null, 2)
@@ -29,59 +56,29 @@
S.moveToNullspace()
assembly = S
update_icon()
- connect_to_network()
-
-/obj/machinery/power/tracker/Destroy()
- unset_control() //remove from control computer
- return ..()
-
-//set the control of the tracker to a given computer if closer than SOLAR_MAX_DIST
-/obj/machinery/power/tracker/proc/set_control(obj/machinery/power/solar_control/SC)
- if(!SC || (get_dist(src, SC) > SOLAR_MAX_DIST))
- return 0
- control = SC
- SC.connected_tracker = src
- return 1
-
-//set the control of the tracker to null and removes it from the previous control computer if needed
-/obj/machinery/power/tracker/proc/unset_control()
- if(control)
- control.connected_tracker = null
- control = null
-
-//updates the tracker icon and the facing angle for the control computer
-/obj/machinery/power/tracker/proc/set_angle(angle)
- sun_angle = angle
-
- //set icon dir to show sun illumination
- setDir(turn(NORTH, -angle - 22.5) )// 22.5 deg bias ensures, e.g. 67.5-112.5 is EAST
-
- if(powernet && (powernet == control.powernet)) //update if we're still in the same powernet
- control.currentdir = angle
/obj/machinery/power/tracker/crowbar_act(mob/user, obj/item/I)
- playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
- user.visible_message("[user] begins to take the glass off [src].", "You begin to take the glass off [src]...")
+ playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
+ user.visible_message("[user] begins to take the glass off [src].", "You begin to take the glass off [src]...")
if(I.use_tool(src, user, 50))
- playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
- user.visible_message("[user] takes the glass off [src].", "You take the glass off [src].")
+ playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE)
+ user.visible_message("[user] takes the glass off [src].", "You take the glass off [src].")
deconstruct(TRUE)
return TRUE
/obj/machinery/power/tracker/obj_break(damage_flag)
if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1))
- playsound(loc, 'sound/effects/glassbr3.ogg', 100, 1)
- stat |= BROKEN
+ playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE)
unset_control()
-/obj/machinery/power/solar/deconstruct(disassembled = TRUE)
+/obj/machinery/power/tracker/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
if(disassembled)
if(assembly)
assembly.forceMove(loc)
assembly.give_glass(stat & BROKEN)
else
- playsound(src, "shatter", 70, 1)
+ playsound(src, "shatter", 70, TRUE)
var/shard = assembly?.glass_type ? assembly.glass_type.shard_type : /obj/item/shard
new shard(loc)
new shard(loc)
diff --git a/code/modules/projectiles/ammunition/caseless/arrow.dm b/code/modules/projectiles/ammunition/caseless/arrow.dm
index df4941aa6a..0543e48f96 100644
--- a/code/modules/projectiles/ammunition/caseless/arrow.dm
+++ b/code/modules/projectiles/ammunition/caseless/arrow.dm
@@ -9,18 +9,18 @@
/obj/item/ammo_casing/caseless/arrow/ashen
name = "ashen arrow"
- desc = "Fire harderned wooden arrow."
+ desc = "An arrow made of wood, hardened by fire."
icon_state = "ashenarrow"
projectile_type = /obj/item/projectile/bullet/reusable/arrow/ashen
/obj/item/ammo_casing/caseless/arrow/bone
name = "bone arrow"
- desc = "Arrow made of bone and sinew. The tip is sharp enough to pierce into a goliath plate."
+ desc = "An arrow made of bone and sinew. The tip is sharp enough to pierce through a goliath plate."
icon_state = "bonearrow"
projectile_type = /obj/item/projectile/bullet/reusable/arrow/bone
/obj/item/ammo_casing/caseless/arrow/bronze
name = "bronze arrow"
- desc = "Bronze tipped arrow."
+ desc = "An arrow made of wood, tipped with bronze. The tip is dense enough to provide some armor penetration."
icon_state = "bronzearrow"
projectile_type = /obj/item/projectile/bullet/reusable/arrow/bronze
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 611f8c57bd..17dd1341b9 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -363,4 +363,4 @@
user.visible_message("[user] somehow manages to shoot [user.p_them()]self in the face!", "You somehow shoot yourself in the face! How the hell?!")
user.emote("scream")
user.drop_all_held_items()
- user.Knockdown(80)
+ user.DefaultCombatKnockdown(80)
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 401678512b..be43bc48fd 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -67,8 +67,7 @@
/obj/item/gun/energy/Destroy()
if(flags_1 & INITIALIZED_1)
QDEL_NULL(cell)
- if(!(flags_1 & HOLOGRAM_1)) //holodeck stuff.
- QDEL_LIST(ammo_type)
+ QDEL_LIST(ammo_type)
STOP_PROCESSING(SSobj, src)
return ..()
diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm
index 615bb5d939..2f0aa00027 100644
--- a/code/modules/projectiles/guns/energy/dueling.dm
+++ b/code/modules/projectiles/guns/energy/dueling.dm
@@ -334,7 +334,7 @@
L.death() //Die, powergamers.
if(DUEL_HUGBOX_NONLETHAL)
L.adjustStaminaLoss(200, forced = TRUE) //Die, powergamers x 2
- L.Knockdown(100, override_hardstun = 100) //For good measure.
+ L.Paralyze(100) //For good measure.
//Storage case.
/obj/item/storage/lockbox/dueling
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index 57bbd13cf7..4857369363 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -181,3 +181,21 @@
..()
explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2)
charges--
+
+/////////////////////////////////////
+//WAND OF ARCANE MISSILE
+/////////////////////////////////////
+
+/obj/item/gun/magic/wand/arcane
+ name = "wand of arcane missile"
+ desc = "This wand fires off small bolts of concentrated magic energy, searing any victim."
+ ammo_type = /obj/item/ammo_casing/magic/arcane_barrage
+ fire_sound = 'sound/weapons/mmlbuster.ogg'
+ icon_state = "arcanewand"
+ max_charges = 20 //20, 10, 10, 7
+
+/obj/item/gun/magic/wand/arcane/zap_self(mob/living/user)
+ ..()
+ charges--
+ user.take_overall_damage(0,30)
+ to_chat(user, "You zap yourself. Why?")
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 7608e5f4a8..7695ef77be 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -124,8 +124,8 @@
if(!istype(M) || M.stat == DEAD || M.notransform || (GODMODE & M.status_flags))
return
- M.notransform = 1
- M.canmove = 0
+ M.notransform = TRUE
+ M.Paralyze(INFINITY)
M.icon = null
M.cut_overlays()
M.invisibility = INVISIBILITY_ABSTRACT
@@ -529,7 +529,7 @@
else
used = 1
victim.take_overall_damage(30,30)
- victim.Knockdown(60)
+ victim.DefaultCombatKnockdown(60)
explosion(src, -1, -1, -1, -1, FALSE, FALSE, 5)
return BULLET_ACT_HIT
diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm
index 062623689b..99aa922622 100644
--- a/code/modules/projectiles/projectile/special/curse.dm
+++ b/code/modules/projectiles/projectile/special/curse.dm
@@ -21,6 +21,9 @@
handedness = prob(50)
icon_state = "cursehand[handedness]"
+/obj/item/projectile/curse_hand/update_icon_state()
+ icon_state = "[initial(icon_state)][handedness]"
+
/obj/item/projectile/curse_hand/fire(setAngle)
if(starting)
arm = starting.Beam(src, icon_state = "curse[handedness]", time = INFINITY, maxdistance = INFINITY, beam_type=/obj/effect/ebeam/curse_arm)
@@ -40,7 +43,8 @@
if(CHECK_BITFIELD(movement_type, UNSTOPPABLE))
playsound(src, 'sound/effects/curse3.ogg', 25, 1, -1)
var/turf/T = get_step(src, dir)
- new/obj/effect/temp_visual/dir_setting/curse/hand(T, dir, handedness)
+ var/obj/effect/temp_visual/dir_setting/curse/hand/leftover = new(T, dir)
+ leftover.icon_state = icon_state
for(var/obj/effect/temp_visual/dir_setting/curse/grasp_portal/G in starting)
qdel(G)
new /obj/effect/temp_visual/dir_setting/curse/grasp_portal/fading(starting, dir)
diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm
index a6da1f26bd..3aa85c085f 100644
--- a/code/modules/projectiles/projectile/special/hallucination.dm
+++ b/code/modules/projectiles/projectile/special/hallucination.dm
@@ -166,7 +166,7 @@
hal_impact_effect_wall = null
/obj/item/projectile/hallucination/taser/hal_apply_effect()
- hal_target.Knockdown(100)
+ hal_target.DefaultCombatKnockdown(100)
hal_target.stuttering += 20
if(hal_target.dna && hal_target.dna.check_mutation(HULK))
hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
@@ -199,7 +199,7 @@
hal_impact_effect_wall = null
/obj/item/projectile/hallucination/ebow/hal_apply_effect()
- hal_target.Knockdown(100)
+ hal_target.DefaultCombatKnockdown(100)
hal_target.stuttering += 5
hal_target.adjustStaminaLoss(8)
diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm
index 12f502f9f0..a72d078384 100644
--- a/code/modules/projectiles/projectile/special/neurotoxin.dm
+++ b/code/modules/projectiles/projectile/special/neurotoxin.dm
@@ -10,5 +10,5 @@
nodamage = TRUE
else if(iscarbon(target))
var/mob/living/L = target
- L.Knockdown(100, TRUE, FALSE, 30, 25)
+ L.DefaultCombatKnockdown(100, TRUE, FALSE, 30, 25)
return ..()
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 8635626209..eff1531e23 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -303,6 +303,8 @@
if(R.overdose_threshold)
if(R.volume > R.overdose_threshold && !R.overdosed)
R.overdosed = 1
+ var/turf/CT = get_turf(C)
+ log_reagent("OVERDOSE START: [key_name(C)] at [AREACOORD(CT)] started overdosing on [R.volume] units of [R].")
need_mob_update += R.overdose_start(C)
if(R.addiction_threshold)
if(R.volume > R.addiction_threshold && !is_type_in_list(R, cached_addictions))
@@ -340,13 +342,16 @@
addiction_tick++
if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates.
C.updatehealth()
- C.update_canmove()
+ C.update_mobility()
C.update_stamina()
update_total()
/datum/reagents/proc/remove_addiction(datum/reagent/R)
to_chat(my_atom, "You feel like you've gotten over your need for [R.name].")
SEND_SIGNAL(my_atom, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose")
+ if(ismob(my_atom))
+ var/turf/T = get_turf(my_atom)
+ log_reagent("OVERDOSE STOP: [key_name(my_atom)] at [AREACOORD(T)] got over their need for [R].")
addiction_list.Remove(R)
qdel(R)
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 4aabd82d6a..384a113b27 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -78,7 +78,6 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
current_cycle++
if(holder)
holder.remove_reagent(type, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears.
- return
//called when a mob processes chems when dead.
/datum/reagent/proc/on_mob_dead(mob/living/carbon/M)
@@ -87,15 +86,15 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
current_cycle++
if(holder)
holder.remove_reagent(type, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears.
- return
// Called when this reagent is first added to a mob
/datum/reagent/proc/on_mob_add(mob/living/L, amount)
if(!iscarbon(L))
return
var/mob/living/carbon/M = L
+ var/turf/T = get_turf(M)
+ log_reagent("MOB ADD: on_mob_add(): [key_name(M)] at [AREACOORD(T)] - [volume] of [type] with [purity] purity")
if (purity == 1)
- log_game("CHEM: [L] ckey: [L.key] has ingested [volume]u of [type]")
return
if(cached_purity == 1)
cached_purity = purity
@@ -112,20 +111,18 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
R.name = name//Negative effects are hidden
if(R.chemical_flags & REAGENT_INVISIBLE)
R.chemical_flags |= (REAGENT_INVISIBLE)
- log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [inverse_chem]")
- return
+ log_reagent("MOB ADD: on_mob_add() (impure): merged [volume] of [inverse_chem]")
else if (impure_chem)
var/impureVol = amount * (1 - purity) //turns impure ratio into impure chem
if(!(chemical_flags & REAGENT_SPLITRETAINVOL))
M.reagents.remove_reagent(type, (impureVol), FALSE)
M.reagents.add_reagent(impure_chem, impureVol, FALSE, other_purity = 1-cached_purity)
- log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume - impureVol]u of [type]")
- log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [impure_chem]")
- return
+ log_reagent("MOB ADD: on_mob_add() (mixed purity): merged [volume - impureVol] of [type] and [volume] of [impure_chem]")
// Called when this reagent is removed while inside a mob
/datum/reagent/proc/on_mob_delete(mob/living/L)
- return
+ var/turf/T = get_turf(L)
+ log_reagent("MOB DELETE: on_mob_delete: [key_name(L)] at [AREACOORD(T)] - [type]")
// Called when this reagent first starts being metabolized by a liver
/datum/reagent/proc/on_mob_metabolize(mob/living/L)
@@ -146,8 +143,9 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
/datum/reagent/proc/on_merge(data, amount, mob/living/carbon/M, purity)
if(!iscarbon(M))
return
+ var/turf/T = get_turf(M)
+ log_reagent("MOB ADD: on_merge(): [key_name(M)] at [AREACOORD(T)] - [volume] of [type] with [purity] purity")
if (purity == 1)
- log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [type]")
return
cached_purity = purity //purity SHOULD be precalculated from the add_reagent, update cache.
if (purity < 0)
@@ -163,16 +161,13 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
R.name = name//Negative effects are hidden
if(R.chemical_flags & REAGENT_INVISIBLE)
R.chemical_flags |= (REAGENT_INVISIBLE)
- log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [inverse_chem]")
- return
+ log_reagent("MOB ADD: on_merge() (impure): merged [volume] of [inverse_chem]")
else if (impure_chem) //SPLIT
var/impureVol = amount * (1 - purity)
if(!(chemical_flags & REAGENT_SPLITRETAINVOL))
M.reagents.remove_reagent(type, impureVol, FALSE)
M.reagents.add_reagent(impure_chem, impureVol, FALSE, other_purity = 1-cached_purity)
- log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume - impureVol]u of [type]")
- log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [impure_chem]")
- return
+ log_reagent("MOB ADD: on_merge() (mixed purity): merged [volume - impureVol] of [type] and [volume] of [impure_chem]")
/datum/reagent/proc/on_update(atom/A)
return
@@ -188,31 +183,26 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
/datum/reagent/proc/overdose_start(mob/living/M)
to_chat(M, "You feel like you took too much of [name]!")
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name)
- return
/datum/reagent/proc/addiction_act_stage1(mob/living/M)
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_light, name)
if(prob(30))
to_chat(M, "You feel like having some [name] right about now.")
- return
/datum/reagent/proc/addiction_act_stage2(mob/living/M)
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_medium, name)
if(prob(30))
to_chat(M, "You feel like you need [name]. You just can't get enough.")
- return
/datum/reagent/proc/addiction_act_stage3(mob/living/M)
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_severe, name)
if(prob(30))
to_chat(M, "You have an intense craving for [name].")
- return
/datum/reagent/proc/addiction_act_stage4(mob/living/M)
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_critical, name)
if(prob(30))
to_chat(M, "You're not feeling good at all! You really need some [name].")
- return
/proc/pretty_string_from_reagent_list(list/reagent_list)
//Convert reagent list to a printable string for logging etc
@@ -221,3 +211,13 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
rs += "[R.name], [R.volume]"
return rs.Join(" | ")
+
+//For easy bloodsucker disgusting and blood removal
+/datum/reagent/proc/disgust_bloodsucker(mob/living/carbon/C, disgust, blood_change, blood_puke = TRUE, force)
+ if(isvamp(C))
+ var/datum/antagonist/bloodsucker/bloodsuckerdatum = C.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
+ if(disgust)
+ bloodsuckerdatum.handle_eat_human_food(disgust, blood_puke, force)
+ if(blood_change)
+ bloodsuckerdatum.AddBloodVolume(blood_change)
+
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 4b65776ce9..e22f8caf89 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -579,8 +579,8 @@ All effects don't start immediately, but rather get worse over time; the rate is
value = 1.3
/datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C)
- if((HAS_TRAIT(C, TRAIT_NOMARROW)))
- return
+ if(isvamp(C))
+ disgust_bloodsucker(FALSE, 1) //Bloodsuckers get SOME blood from it, for style reasons.
if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio))
C.blood_volume = min((BLOOD_VOLUME_NORMAL*C.blood_ratio), C.blood_volume + 3) //Bloody Mary quickly restores blood loss.
..()
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index a2e651d791..04e7c0a74e 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -20,7 +20,7 @@
/datum/reagent/drug/space_drugs/on_mob_life(mob/living/carbon/M)
M.set_drugginess(15)
if(isturf(M.loc) && !isspaceturf(M.loc))
- if(M.canmove)
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE))
if(prob(10))
step(M, pick(GLOB.cardinals))
if(prob(7))
@@ -52,8 +52,7 @@
var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.")
to_chat(M, "[smoke_message]")
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "smoked", /datum/mood_event/smoked, name)
- M.AdjustStun(-20, 0)
- M.AdjustKnockdown(-20, 0)
+ M.AdjustAllImmobility(-20, 0)
M.AdjustUnconscious(-20, 0)
M.adjustStaminaLoss(-0.5*REM, 0)
..()
@@ -72,8 +71,7 @@
if(prob(5))
var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.")
to_chat(M, "[high_message]")
- M.AdjustStun(-20, 0)
- M.AdjustKnockdown(-20, 0)
+ M.AdjustAllImmobility(-20, 0)
M.AdjustUnconscious(-20, 0)
..()
. = 1
@@ -182,8 +180,7 @@
var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.")
if(prob(5))
to_chat(M, "[high_message]")
- M.AdjustStun(-40, 0)
- M.AdjustKnockdown(-40, 0)
+ M.AdjustAllImmobility(-40, 0)
M.AdjustUnconscious(-40, 0)
M.adjustStaminaLoss(-7.5 * REM, 0)
if(jitter)
@@ -197,7 +194,7 @@
. = 1
/datum/reagent/drug/methamphetamine/overdose_process(mob/living/M)
- if(M.canmove && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
for(var/i in 1 to 4)
step(M, pick(GLOB.cardinals))
if(prob(20))
@@ -224,7 +221,7 @@
..()
/datum/reagent/drug/methamphetamine/addiction_act_stage3(mob/living/M)
- if(M.canmove && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
for(var/i = 0, i < 4, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(15)
@@ -234,7 +231,7 @@
..()
/datum/reagent/drug/methamphetamine/addiction_act_stage4(mob/living/carbon/human/M)
- if(M.canmove && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
for(var/i = 0, i < 8, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(20)
@@ -286,7 +283,7 @@
M.adjustStaminaLoss(-5, 0)
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4)
M.hallucination += 5
- if(M.canmove && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
step(M, pick(GLOB.cardinals))
step(M, pick(GLOB.cardinals))
..()
@@ -294,7 +291,7 @@
/datum/reagent/drug/bath_salts/overdose_process(mob/living/M)
M.hallucination += 5
- if(M.canmove && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
for(var/i in 1 to 8)
step(M, pick(GLOB.cardinals))
if(prob(20))
@@ -305,7 +302,7 @@
/datum/reagent/drug/bath_salts/addiction_act_stage1(mob/living/M)
M.hallucination += 10
- if(M.canmove && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
for(var/i = 0, i < 8, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(5)
@@ -316,7 +313,7 @@
/datum/reagent/drug/bath_salts/addiction_act_stage2(mob/living/M)
M.hallucination += 20
- if(M.canmove && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
for(var/i = 0, i < 8, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(10)
@@ -328,7 +325,7 @@
/datum/reagent/drug/bath_salts/addiction_act_stage3(mob/living/M)
M.hallucination += 30
- if(M.canmove && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
for(var/i = 0, i < 12, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(15)
@@ -340,7 +337,7 @@
/datum/reagent/drug/bath_salts/addiction_act_stage4(mob/living/carbon/human/M)
M.hallucination += 30
- if(M.canmove && !ismovableatom(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
for(var/i = 0, i < 16, i++)
step(M, pick(GLOB.cardinals))
M.Jitter(50)
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 52eee9f8ea..fa30609c54 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -323,7 +323,7 @@
victim.blind_eyes(2)
victim.confused = max(M.confused, 3)
victim.damageoverlaytemp = 60
- victim.Knockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 3, 15))
+ victim.DefaultCombatKnockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 3, 15))
return
else if ( eyes_covered ) // Eye cover is better than mouth cover
victim.blur_eyes(3)
@@ -336,7 +336,7 @@
victim.blind_eyes(3)
victim.confused = max(M.confused, 6)
victim.damageoverlaytemp = 75
- victim.Knockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 5, 25))
+ victim.DefaultCombatKnockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 5, 25))
victim.update_damage_hud()
/datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/M)
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 0a040a4f17..4b2c1447c5 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -46,8 +46,7 @@
REMOVE_TRAITS_NOT_IN(M, list(SPECIES_TRAIT, ROUNDSTART_TRAIT, ORGAN_TRAIT))
M.set_blurriness(0)
M.set_blindness(0)
- M.SetKnockdown(0, 0)
- M.SetStun(0, 0)
+ M.SetAllImmobility(0, 0)
M.SetUnconscious(0, 0)
M.silent = FALSE
M.dizziness = 0
@@ -87,8 +86,7 @@
/datum/reagent/medicine/synaptizine/on_mob_life(mob/living/carbon/M)
M.drowsyness = max(M.drowsyness-5, 0)
- M.AdjustStun(-20, 0)
- M.AdjustKnockdown(-20, 0)
+ M.AdjustAllImmobility(-20, 0)
M.AdjustUnconscious(-20, 0)
if(holder.has_reagent(/datum/reagent/toxin/mindbreaker))
holder.remove_reagent(/datum/reagent/toxin/mindbreaker, 5)
@@ -595,7 +593,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/salbutamol
name = "Salbutamol"
- description = "Rapidly restores oxygen deprivation as well as preventing more of it to an extent."
+ description = "Rapidly restores oxygen deprivation as well as preventing more of it to an extent. Causes jittering."
reagent_state = LIQUID
color = "#00FFFF"
metabolization_rate = 0.25 * REAGENTS_METABOLISM
@@ -605,6 +603,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
M.adjustOxyLoss(-3*REM, 0)
if(M.losebreath >= 4)
M.losebreath -= 2
+ M.Jitter(5)
..()
. = 1
@@ -636,10 +635,9 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
pH = 12
/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M)
- M.AdjustStun(-20, 0)
- M.AdjustKnockdown(-20, 0)
- M.AdjustUnconscious(-20, 0)
- M.adjustStaminaLoss(-4.5*REM, 0)
+ M.AdjustAllImmobility(-20, FALSE)
+ M.AdjustUnconscious(-20, FALSE)
+ M.adjustStaminaLoss(-4.5*REM, FALSE)
M.Jitter(10)
if(prob(50))
M.confused = max(M.confused, 1)
@@ -847,8 +845,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
M.adjustStaminaLoss(-0.5*REM, 0)
. = 1
if(prob(20))
- M.AdjustStun(-20, 0)
- M.AdjustKnockdown(-20, 0)
+ M.AdjustAllImmobility(-20, 0)
M.AdjustUnconscious(-20, 0)
..()
@@ -1002,21 +999,20 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/stimulants/on_mob_life(mob/living/carbon/M)
if(M.health < 50 && M.health > 0)
- M.adjustOxyLoss(-1*REM, 0)
- M.adjustToxLoss(-1*REM, 0)
- M.adjustBruteLoss(-1*REM, 0)
- M.adjustFireLoss(-1*REM, 0)
- M.AdjustStun(-60, 0)
- M.AdjustKnockdown(-60, 0)
- M.AdjustUnconscious(-60, 0)
- M.adjustStaminaLoss(-20*REM, 0)
+ M.adjustOxyLoss(-1*REM, FALSE)
+ M.adjustToxLoss(-1*REM, FALSE)
+ M.adjustBruteLoss(-1*REM, FALSE)
+ M.adjustFireLoss(-1*REM, FALSE)
+ M.AdjustAllImmobility(-60, FALSE)
+ M.AdjustUnconscious(-60, FALSE)
+ M.adjustStaminaLoss(-20*REM, FALSE)
..()
. = 1
/datum/reagent/medicine/stimulants/overdose_process(mob/living/M)
if(prob(33))
- M.adjustStaminaLoss(2.5*REM, 0)
- M.adjustToxLoss(1*REM, 0)
+ M.adjustStaminaLoss(2.5*REM, FALSE)
+ M.adjustToxLoss(1*REM, FALSE)
M.losebreath++
. = 1
..()
@@ -1045,12 +1041,12 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
pH = 5
/datum/reagent/medicine/bicaridine/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-2*REM, 0)
+ M.adjustBruteLoss(-2*REM, FALSE)
..()
. = 1
/datum/reagent/medicine/bicaridine/overdose_process(mob/living/M)
- M.adjustBruteLoss(4*REM, 0)
+ M.adjustBruteLoss(4*REM, FALSE)
..()
. = 1
@@ -1063,12 +1059,12 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
pH = 9.7
/datum/reagent/medicine/dexalin/on_mob_life(mob/living/carbon/M)
- M.adjustOxyLoss(-2*REM, 0)
+ M.adjustOxyLoss(-2*REM, FALSE)
..()
. = 1
/datum/reagent/medicine/dexalin/overdose_process(mob/living/M)
- M.adjustOxyLoss(4*REM, 0)
+ M.adjustOxyLoss(4*REM, FALSE)
..()
. = 1
@@ -1081,12 +1077,12 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
pH = 9
/datum/reagent/medicine/kelotane/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-2*REM, 0)
+ M.adjustFireLoss(-2*REM, FALSE)
..()
. = 1
/datum/reagent/medicine/kelotane/overdose_process(mob/living/M)
- M.adjustFireLoss(4*REM, 0)
+ M.adjustFireLoss(4*REM, FALSE)
..()
. = 1
@@ -1100,14 +1096,14 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
pH = 10
/datum/reagent/medicine/antitoxin/on_mob_life(mob/living/carbon/M)
- M.adjustToxLoss(-2*REM, 0)
+ M.adjustToxLoss(-2*REM, FALSE)
for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
M.reagents.remove_reagent(R.type,1)
..()
. = 1
/datum/reagent/medicine/antitoxin/overdose_process(mob/living/M)
- M.adjustToxLoss(4*REM, 0) // End result is 2 toxin loss taken, because it heals 2 and then removes 4.
+ M.adjustToxLoss(4*REM, FALSE) // End result is 2 toxin loss taken, because it heals 2 and then removes 4.
..()
. = 1
@@ -1133,18 +1129,18 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/tricordrazine/on_mob_life(mob/living/carbon/M)
if(prob(80))
- M.adjustBruteLoss(-1*REM, 0)
- M.adjustFireLoss(-1*REM, 0)
- M.adjustOxyLoss(-1*REM, 0)
- M.adjustToxLoss(-1*REM, 0)
+ M.adjustBruteLoss(-1*REM, FALSE)
+ M.adjustFireLoss(-1*REM, FALSE)
+ M.adjustOxyLoss(-1*REM, FALSE)
+ M.adjustToxLoss(-1*REM, FALSE)
. = 1
..()
/datum/reagent/medicine/tricordrazine/overdose_process(mob/living/M)
- M.adjustToxLoss(2*REM, 0)
- M.adjustOxyLoss(2*REM, 0)
- M.adjustBruteLoss(2*REM, 0)
- M.adjustFireLoss(2*REM, 0)
+ M.adjustToxLoss(2*REM, FALSE)
+ M.adjustOxyLoss(2*REM, FALSE)
+ M.adjustBruteLoss(2*REM, FALSE)
+ M.adjustFireLoss(2*REM, FALSE)
..()
. = 1
@@ -1156,9 +1152,9 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
taste_description = "jelly"
/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-1.5*REM, 0)
- M.adjustFireLoss(-1.5*REM, 0)
- M.adjustOxyLoss(-1.5*REM, 0)
+ M.adjustBruteLoss(-1.5*REM, FALSE)
+ M.adjustFireLoss(-1.5*REM, FALSE)
+ M.adjustOxyLoss(-1.5*REM, FALSE)
M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs
. = 1
..()
@@ -1171,13 +1167,13 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
pH = 11
/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-5*REM, 0) //A ton of healing - this is a 50 telecrystal investment.
- M.adjustFireLoss(-5*REM, 0)
- M.adjustOxyLoss(-15, 0)
- M.adjustToxLoss(-5*REM, 0)
+ M.adjustBruteLoss(-5*REM, FALSE) //A ton of healing - this is a 50 telecrystal investment.
+ M.adjustFireLoss(-5*REM, FALSE)
+ M.adjustOxyLoss(-15, FALSE)
+ M.adjustToxLoss(-5*REM, FALSE)
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM)
- M.adjustCloneLoss(-3*REM, 0)
- M.adjustStaminaLoss(-25*REM,0)
+ M.adjustCloneLoss(-3*REM, FALSE)
+ M.adjustStaminaLoss(-25*REM,FALSE)
if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio))
M.blood_volume += 40 // blood fall out man bad
..()
@@ -1191,13 +1187,13 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
pH = 11
/datum/reagent/medicine/lesser_syndicate_nanites/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-3*REM, 0) // hidden gold shh
- M.adjustFireLoss(-3*REM, 0)
- M.adjustOxyLoss(-15, 0)
- M.adjustToxLoss(-3*REM, 0)
+ M.adjustBruteLoss(-3*REM, FALSE) // hidden gold shh
+ M.adjustFireLoss(-3*REM, FALSE)
+ M.adjustOxyLoss(-15, FALSE)
+ M.adjustToxLoss(-3*REM, FALSE)
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM)
- M.adjustCloneLoss(-3*REM, 0)
- M.adjustStaminaLoss(-20*REM,0)
+ M.adjustCloneLoss(-3*REM, FALSE)
+ M.adjustStaminaLoss(-20*REM,FALSE)
if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio))
M.blood_volume += 20 // blood fall out man bad
..()
@@ -1214,17 +1210,17 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
pH = 11.8
/datum/reagent/medicine/neo_jelly/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-1.5*REM, 0)
- M.adjustFireLoss(-1.5*REM, 0)
- M.adjustOxyLoss(-1.5*REM, 0)
+ M.adjustBruteLoss(-1.5*REM, FALSE)
+ M.adjustFireLoss(-1.5*REM, FALSE)
+ M.adjustOxyLoss(-1.5*REM, FALSE)
M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs
. = 1
..()
/datum/reagent/medicine/neo_jelly/overdose_process(mob/living/M)
- M.adjustOxyLoss(2.6*REM, 0)
- M.adjustBruteLoss(3.5*REM, 0)
- M.adjustFireLoss(3.5*REM, 0)
+ M.adjustOxyLoss(2.6*REM, FALSE)
+ M.adjustBruteLoss(3.5*REM, FALSE)
+ M.adjustFireLoss(3.5*REM, FALSE)
..()
. = 1
@@ -1236,13 +1232,13 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
pH = 11
/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-3 * REM, 0)
- M.adjustFireLoss(-3 * REM, 0)
- M.adjustOxyLoss(-15 * REM, 0)
- M.adjustToxLoss(-3 * REM, 0, TRUE) //Heals TOXINLOVERS
+ M.adjustBruteLoss(-3 * REM, FALSE)
+ M.adjustFireLoss(-3 * REM, FALSE)
+ M.adjustOxyLoss(-15 * REM, FALSE)
+ M.adjustToxLoss(-3 * REM, FALSE, TRUE) //Heals TOXINLOVERS
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that!
- M.adjustCloneLoss(-1 * REM, 0)
- M.adjustStaminaLoss(-13 * REM, 0)
+ M.adjustCloneLoss(-1 * REM, FALSE)
+ M.adjustStaminaLoss(-13 * REM, FALSE)
M.jitteriness = min(max(0, M.jitteriness + 3), 30)
M.druggy = min(max(0, M.druggy + 10), 15) //See above
..()
@@ -1250,7 +1246,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/earthsblood/overdose_process(mob/living/M)
M.hallucination = min(max(0, M.hallucination + 5), 60)
- M.adjustToxLoss(8 * REM, 0, TRUE) //Hurts TOXINLOVERS
+ M.adjustToxLoss(8 * REM, FALSE, TRUE) //Hurts TOXINLOVERS
..()
. = 1
@@ -1305,8 +1301,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/M as mob)
M.AdjustUnconscious(-20, 0)
- M.AdjustStun(-20, 0)
- M.AdjustKnockdown(-20, 0)
+ M.AdjustAllImmobility(-20, 0)
M.AdjustSleeping(-20, 0)
M.adjustStaminaLoss(-30, 0)
..()
@@ -1389,8 +1384,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
/datum/reagent/medicine/modafinil/on_mob_life(mob/living/carbon/M)
if(!overdosed) // We do not want any effects on OD
overdose_threshold = overdose_threshold + rand(-10,10)/10 // for extra fun
- M.AdjustStun(-5, 0)
- M.AdjustKnockdown(-5, 0)
+ M.AdjustAllImmobility(-5, 0)
M.AdjustUnconscious(-5, 0)
M.adjustStaminaLoss(-1*REM, 0)
M.Jitter(1)
@@ -1422,7 +1416,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
if(prob(20))
to_chat(M, "You have a sudden fit!")
M.emote("moan")
- M.Knockdown(20, 1, 0) // you should be in a bad spot at this point unless epipen has been used
+ M.DefaultCombatKnockdown(20, 1, 0) // you should be in a bad spot at this point unless epipen has been used
if(81)
to_chat(M, "You feel too exhausted to continue!") // at this point you will eventually die unless you get charcoal
M.adjustOxyLoss(0.1*REM, 0)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index adc30ecdc9..5038a4b68c 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -13,7 +13,7 @@
shot_glass_icon_state = "shotglassred"
pH = 7.4
-/datum/reagent/blood/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
+/datum/reagent/blood/reaction_mob(mob/living/L, method = TOUCH, reac_volume)
if(data && data["viruses"])
for(var/thing in data["viruses"])
var/datum/disease/D = thing
@@ -26,6 +26,18 @@
else //ingest, patch or inject
L.ForceContractDisease(D)
+ if(data["blood_type"] == "SY")
+ //Synthblood is very disgusting to bloodsuckers. They will puke it out to expel it, unless they have masquarade on
+ switch(reac_volume)
+ if(0 to 3)
+ disgust_bloodsucker(L, 3, FALSE, FALSE, FALSE)
+ if(3 to 6)
+ //If theres more than 8 units, they will start expelling it, even if they are masquarading.
+ disgust_bloodsucker(L, 5, FALSE, FALSE, TRUE)
+ else
+ //If they have too much in them, they will also puke out their blood.
+ disgust_bloodsucker(L, 7, -5, TRUE, TRUE)
+
if(iscarbon(L))
var/mob/living/carbon/C = L
var/blood_id = C.get_blood_id()
@@ -37,10 +49,8 @@
L.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
/datum/reagent/blood/on_mob_life(mob/living/carbon/C) //Because lethals are preferred over stamina. damnifino.
- if((HAS_TRAIT(C, TRAIT_NOMARROW)))
- return //We dont want vampires getting toxed from blood
var/blood_id = C.get_blood_id()
- if((blood_id == /datum/reagent/blood || blood_id == /datum/reagent/blood/jellyblood))
+ if((blood_id in GLOB.blood_reagent_types) && !HAS_TRAIT(C, TRAIT_NOMARROW))
if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) //we only care about bloodtype here because this is where the poisoning should be
C.adjustToxLoss(rand(2,8)*REM, TRUE, TRUE) //forced to ensure people don't use it to gain beneficial toxin as slime person
..()
@@ -117,7 +127,7 @@
if(!istype(D, /datum/disease/advance))
preserve += D
data["viruses"] = preserve
- return 1
+ return TRUE
/datum/reagent/blood/proc/get_diseases()
. = list()
@@ -142,6 +152,13 @@
taste_mult = 1.3
pH = 4
+/datum/reagent/blood/tomato
+ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+ name = "Tomato Blood"
+ description = "This highly resembles blood, but it doesnt actually function like it, resembling more ketchup, with a more blood-like consistency."
+ taste_description = "sap" //Like tree sap?
+ pH = 7.45
+
/datum/reagent/blood/jellyblood/on_mob_life(mob/living/carbon/M)
if(prob(10))
if(M.dna?.species?.exotic_bloodtype != "GEL")
@@ -374,22 +391,21 @@
/datum/reagent/fuel/unholywater/on_mob_life(mob/living/carbon/M)
if(iscultist(M))
M.drowsyness = max(M.drowsyness-5, 0)
- M.AdjustUnconscious(-20, 0)
- M.AdjustStun(-40, 0)
- M.AdjustKnockdown(-40, 0)
- M.adjustStaminaLoss(-10, 0)
- M.adjustToxLoss(-2, 0, TRUE)
- M.adjustOxyLoss(-2, 0)
- M.adjustBruteLoss(-2, 0)
- M.adjustFireLoss(-2, 0)
+ M.AdjustUnconscious(-20, FALSE)
+ M.AdjustAllImmobility(-40, FALSE)
+ M.adjustStaminaLoss(-10, FALSE)
+ M.adjustToxLoss(-2, FALSE, TRUE)
+ M.adjustOxyLoss(-2, FALSE)
+ M.adjustBruteLoss(-2, FALSE)
+ M.adjustFireLoss(-2, FALSE)
if(ishuman(M) && M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio))
M.blood_volume += 3
else // Will deal about 90 damage when 50 units are thrown
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150)
- M.adjustToxLoss(2, 0)
- M.adjustFireLoss(2, 0)
- M.adjustOxyLoss(2, 0)
- M.adjustBruteLoss(2, 0)
+ M.adjustToxLoss(2, FALSE)
+ M.adjustFireLoss(2, FALSE)
+ M.adjustOxyLoss(2, FALSE)
+ M.adjustBruteLoss(2, FALSE)
holder.remove_reagent(type, 1)
return TRUE
@@ -401,8 +417,8 @@
/datum/reagent/hellwater/on_mob_life(mob/living/carbon/M)
M.fire_stacks = min(5,M.fire_stacks + 3)
M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
- M.adjustToxLoss(1, 0)
- M.adjustFireLoss(1, 0) //Hence the other damages... ain't I a bastard?
+ M.adjustToxLoss(1, FALSE)
+ M.adjustFireLoss(1, FALSE) //Hence the other damages... ain't I a bastard?
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5, 150)
holder.remove_reagent(type, 1)
pH = 0.1
@@ -415,23 +431,23 @@
/datum/reagent/fuel/holyoil/on_mob_life(mob/living/carbon/M)
if(is_servant_of_ratvar(M))
M.drowsyness = max(M.drowsyness-5, 0)
- M.AdjustUnconscious(-60, 0)
- M.AdjustStun(-30, 0)
- M.AdjustKnockdown(-70, 0)
- M.adjustStaminaLoss(-15, 0)
- M.adjustToxLoss(-5, 0, TRUE)
- M.adjustOxyLoss(-3, 0)
- M.adjustBruteLoss(-3, 0)
- M.adjustFireLoss(-5, 0)
+ M.AdjustUnconscious(-60, FALSE)
+ M.AdjustAllImmobility(-30, FALSE)
+ M.AdjustKnockdown(-40, FALSE)
+ M.adjustStaminaLoss(-15, FALSE)
+ M.adjustToxLoss(-5, FALSE, TRUE)
+ M.adjustOxyLoss(-3, FALSE)
+ M.adjustBruteLoss(-3, FALSE)
+ M.adjustFireLoss(-5, FALSE)
if(iscultist(M))
- M.AdjustUnconscious(1, 0)
- M.AdjustStun(10, 0)
- M.AdjustKnockdown(20, 0)
- M.adjustStaminaLoss(15, 0)
+ M.AdjustUnconscious(1, FALSE)
+ M.AdjustAllImmobility(10, FALSE)
+ M.AdjustKnockdown(10, FALSE)
+ M.adjustStaminaLoss(15, FALSE)
else
- M.adjustToxLoss(3, 0)
- M.adjustOxyLoss(2, 0)
- M.adjustStaminaLoss(10, 0)
+ M.adjustToxLoss(3, FALSE)
+ M.adjustOxyLoss(2, FALSE)
+ M.adjustStaminaLoss(10, FALSE)
holder.remove_reagent(type, 1)
return TRUE
@@ -584,7 +600,7 @@
return
to_chat(H, "You crumple in agony as your flesh wildly morphs into new forms!")
H.visible_message("[H] falls to the ground and screams as [H.p_their()] skin bubbles and froths!") //'froths' sounds painful when used with SKIN.
- H.Knockdown(60)
+ H.DefaultCombatKnockdown(60)
addtimer(CALLBACK(src, .proc/mutate, H), 30)
return
@@ -890,7 +906,7 @@
taste_mult = 0 // apparently tasteless.
/datum/reagent/mercury/on_mob_life(mob/living/carbon/M)
- if(M.canmove && !isspaceturf(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !isspaceturf(M.loc))
step(M, pick(GLOB.cardinals))
if(prob(5))
M.emote(pick("twitch","drool","moan"))
@@ -970,7 +986,7 @@
pH = 11.3
/datum/reagent/lithium/on_mob_life(mob/living/carbon/M)
- if(M.canmove && !isspaceturf(M.loc))
+ if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !isspaceturf(M.loc))
step(M, pick(GLOB.cardinals))
if(prob(5))
M.emote(pick("twitch","drool","moan"))
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
index 9eb033824d..cd63fff0db 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
@@ -227,8 +227,7 @@
/datum/reagent/teslium/energized_jelly/on_mob_life(mob/living/carbon/M)
if(isjellyperson(M))
shock_timer = 0 //immune to shocks
- M.AdjustStun(-40, 0)
- M.AdjustKnockdown(-40, 0)
+ M.AdjustAllImmobility(-40, 0)
M.AdjustUnconscious(-40, 0)
M.adjustStaminaLoss(-2, 0)
if(isluminescent(M))
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 946cb1307c..025587bc2a 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -539,7 +539,7 @@
var/picked_option = rand(1,3)
switch(picked_option)
if(1)
- C.Knockdown(60, 0)
+ C.DefaultCombatKnockdown(60, 0)
. = TRUE
if(2)
C.losebreath += 10
@@ -678,7 +678,7 @@
/datum/reagent/toxin/curare/on_mob_life(mob/living/carbon/M)
if(current_cycle >= 11)
- M.Knockdown(60, 0)
+ M.DefaultCombatKnockdown(60, 0)
M.adjustOxyLoss(1*REM, 0)
. = 1
..()
@@ -843,7 +843,7 @@
holder.remove_reagent(type, actual_metaboliztion_rate * M.metabolism_efficiency)
M.adjustToxLoss(actual_toxpwr*REM, 0)
if(prob(10))
- M.Knockdown(20, 0)
+ M.DefaultCombatKnockdown(20, 0)
. = 1
..()
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 3930988380..2c8be10ace 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -76,7 +76,7 @@
for(var/mob/living/carbon/C in get_hearers_in_view(round(multiplier/48,1),get_turf(holder.my_atom)))
if(iscultist(C))
to_chat(C, "The divine explosion sears you!")
- C.Knockdown(40)
+ C.DefaultCombatKnockdown(40)
C.adjust_fire_stacks(5)
C.IgniteMob()
..(holder, multiplier, T)
@@ -252,7 +252,7 @@
for(var/mob/living/carbon/C in get_hearers_in_view(range, location))
if(C.flash_act())
if(get_dist(C, location) < 4)
- C.Knockdown(60)
+ C.DefaultCombatKnockdown(60)
else
C.Stun(100)
holder.remove_reagent(/datum/reagent/flash_powder, multiplier*3)
@@ -273,7 +273,7 @@
for(var/mob/living/carbon/C in get_hearers_in_view(range, location))
if(C.flash_act())
if(get_dist(C, location) < 4)
- C.Knockdown(60)
+ C.DefaultCombatKnockdown(60)
else
C.Stun(100)
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index c178aad717..c9cfdde797 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -123,28 +123,34 @@
if(thrown)
reagents.total_volume *= rand(5,10) * 0.1 //Not all of it makes contact with the target
var/mob/M = target
- var/R
+ var/R = reagents.log_list()
target.visible_message("[M] has been splashed with something!", \
"[M] has been splashed with something!")
- for(var/datum/reagent/A in reagents.reagent_list)
- R += "[A.type] ([A.volume]),"
-
- if(thrownby)
+ var/turf/TT = get_turf(target)
+ var/throwerstring
+ if(thrownby && thrown)
log_combat(thrownby, M, "splashed", R)
+ var/turf/AT = get_turf(thrownby)
+ throwerstring = " THROWN BY [key_name(thrownby)] at [AT] (AREACOORD(AT)]"
+ log_reagent("SPLASH: [src] mob SplashReagents() onto [key_name(target)] at [TT] ([AREACOORD(TT)])[throwerstring] - [R]")
reagents.reaction(target, TOUCH)
-
+
else if(bartender_check(target) && thrown)
visible_message("[src] lands onto the [target.name] without spilling a single drop.")
transform = initial(transform)
addtimer(CALLBACK(src, .proc/ForceResetRotation), 1)
- return
-
else
if(isturf(target) && reagents.reagent_list.len && thrownby)
log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]", "in [AREACOORD(target)]")
log_game("[key_name(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [AREACOORD(target)].")
message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [ADMIN_VERBOSEJMP(target)].")
+ var/turf/T = get_turf(target)
+ var/throwerstring
+ if(thrownby && thrown)
+ var/turf/AT = get_turf(thrownby)
+ throwerstring = " THROWN BY [key_name(thrownby)] at [AT] ([AREACOORD(AT)])"
+ log_reagent("SPLASH - [src] object SplashReagents() onto [target] at [T] ([AREACOORD(T)])[throwerstring] - [reagents.log_list()]")
visible_message("[src] spills its contents all over [target].")
reagents.reaction(target, TOUCH)
if(QDELETED(src))
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index 2f5fb067ea..3296586c94 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -89,7 +89,7 @@
blood_type = "BUG"
/obj/item/reagent_containers/blood/attackby(obj/item/I, mob/user, params)
- if (istype(I, /obj/item/pen) || istype(I, /obj/item/toy/crayon))
+ if(istype(I, /obj/item/pen) || istype(I, /obj/item/toy/crayon))
if(!user.is_literate())
to_chat(user, "You scribble illegibly on the label of [src]!")
return
@@ -107,25 +107,31 @@
else
return ..()
-/obj/item/reagent_containers/blood/attack(mob/M, mob/user, def_zone)
- if(user.a_intent == INTENT_HELP && reagents.total_volume > 0)
- if (user != M)
- to_chat(user, "You force [M] to drink from the [src]")
- user.visible_message("[user] forces [M] to drink from the [src].")
- if(!do_mob(user, M, 50))
+/obj/item/reagent_containers/blood/attack(mob/living/carbon/C, mob/user, def_zone)
+ if(user.a_intent == INTENT_HELP && reagents.total_volume > 0 && iscarbon(C) && user.a_intent == INTENT_HELP)
+ if(C.is_mouth_covered())
+ to_chat(user, "You cant drink from the [src] while your mouth is covered.")
+ return
+ if(user != C)
+ user.visible_message("[user] forces [C] to drink from the [src].", \
+ "You force [C] to drink from the [src]")
+ if(!do_mob(user, C, 50))
return
else
- if(!do_mob(user, M, 10))
+ if(!do_mob(user, C, 10))
return
+
to_chat(user, "You take a sip from the [src].")
user.visible_message("[user] puts the [src] up to their mouth.")
if(reagents.total_volume <= 0) // Safety: In case you spam clicked the blood bag on yourself, and it is now empty (below will divide by zero)
return
- var/gulp_size = 5
+ var/gulp_size = 3
var/fraction = min(gulp_size / reagents.total_volume, 1)
- reagents.reaction(M, INGEST, fraction) //checkLiked(fraction, M) // Blood isn't food, sorry.
- reagents.trans_to(M, gulp_size)
- playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
+ reagents.reaction(C, INGEST, fraction) //checkLiked(fraction, M) // Blood isn't food, sorry.
+ reagents.trans_to(C, gulp_size)
+ reagents.remove_reagent(src, 2) //Inneficency, so hey, IVs are usefull.
+ playsound(C.loc,'sound/items/drink.ogg', rand(10, 50), TRUE)
+ return
..()
/obj/item/reagent_containers/blood/bluespace
@@ -133,3 +139,14 @@
desc = "Contains blood used for transfusion, this one has been made with bluespace technology to hold much more blood. Must be attached to an IV drip."
icon_state = "bsbloodpack"
volume = 600 //its a blood bath!
+
+/obj/item/reagent_containers/blood/bluespace/attack(mob/living/carbon/C, mob/user, def_zone)
+ if(user.a_intent == INTENT_HELP)
+ if(user != C)
+ to_chat(user, "You can't force people to drink from the [src]. Nothing comes out from it.")
+ return
+ else
+ to_chat(user, "You try to suck on the [src], but nothing comes out.")
+ return
+ else
+ ..()
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 23f149ade4..78c335ce14 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -29,20 +29,30 @@
message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].")
reagents.reaction(M, TOUCH)
log_combat(user, M, "splashed", R)
+ var/turf/UT = get_turf(user)
+ var/turf/MT = get_turf(M)
+ var/turf/OT = get_turf(target)
+ log_reagent("SPLASH: attack(target mob [key_name(M)] at [AREACOORD(MT)], from user [key_name(user)] at [AREACOORD(UT)], target object [target] at [AREACOORD(OT)]) - [R]")
reagents.clear_reagents()
else
var/self_fed = M == user
if(!self_fed)
M.visible_message("[user] attempts to feed something to [M].", \
"[user] attempts to feed something to you.")
+ log_combat(user, M, "is attempting to feed", reagents.log_list())
if(!do_mob(user, M))
return
if(!reagents || !reagents.total_volume)
return // The drink might be empty after the delay, such as by spam-feeding
+ var/turf/UT = get_turf(user) // telekenesis memes
+ var/turf/MT = get_turf(M)
M.visible_message("[user] feeds something to [M].", "[user] feeds something to you.")
log_combat(user, M, "fed", reagents.log_list())
+ log_reagent("INGESTION: FED BY: [key_name(user)] (loc [user.loc] at [AREACOORD(UT)]) -> [key_name(M)] (loc [M.loc] at [AREACOORD(MT)]) - [reagents.log_list()]")
else
+ var/turf/T = get_turf(user)
to_chat(user, "You swallow a gulp of [src].")
+ log_reagent("INGESTION: SELF: [key_name(user)] (loc [user.loc] at [AREACOORD(T)]) - [reagents.log_list()]")
var/fraction = min(5/reagents.total_volume, 1)
reagents.reaction(M, INGEST, fraction)
addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5, null, null, null, self_fed? "self swallowed" : "fed by [user]"), 5)
@@ -325,6 +335,8 @@
if (slot == SLOT_HEAD)
if(reagents.total_volume)
to_chat(user, "[src]'s contents spill all over you!")
+ var/R = reagents.log_list()
+ log_reagent("SPLASH: [user] splashed [src] on their head via bucket/equipped(self, SLOT_HEAD) - [R]")
reagents.reaction(user, TOUCH)
reagents.clear_reagents()
reagent_flags = NONE
diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm
index d39d9f4b85..38b62546a8 100644
--- a/code/modules/recycling/disposal/bin.dm
+++ b/code/modules/recycling/disposal/bin.dm
@@ -372,7 +372,7 @@
/obj/machinery/disposal/bin/shove_act(mob/living/target, mob/living/user)
if(!can_stuff_mob_in(target, user, TRUE))
return FALSE
- target.Knockdown(SHOVE_KNOCKDOWN_SOLID)
+ target.DefaultCombatKnockdown(SHOVE_KNOCKDOWN_SOLID)
target.forceMove(src)
user.visible_message("[user.name] shoves [target.name] into \the [src]!",
"You shove [target.name] into \the [src]!", null, COMBAT_MESSAGE_RANGE)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 0f9c64545a..f3ac118134 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -53,7 +53,7 @@ other types of metals and chemistry for reagents).
for(var/i in materials) //Go through all of our materials, get the subsystem instance, and then replace the list.
var/amount = materials[i]
if(!istext(i)) //Not a category, so get the ref the normal way
- var/datum/material/M = getmaterialref(i)
+ var/datum/material/M = SSmaterials.GetMaterialRef(i)
temp_list[M] = amount
else
temp_list[i] = amount
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
index 567f909150..8288ceff23 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm
@@ -49,7 +49,7 @@
/datum/design/multitool
name = "Multitool"
id = "multitool"
- build_type = AUTOLATHE
+ build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 50, /datum/material/glass = 20)
build_path = /obj/item/multitool
category = list("initial","Tools","Tool Designs")
diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm
index 87f2c253f2..e82dffbe07 100644
--- a/code/modules/research/designs/biogenerator_designs.dm
+++ b/code/modules/research/designs/biogenerator_designs.dm
@@ -56,7 +56,7 @@
id = "enzyme"
build_type = BIOGENERATOR
materials = list(/datum/material/biomass = 30)
- make_reagents = list("enzyme" = 10)
+ make_reagents = list(/datum/reagent/consumable/enzyme = 10)
category = list("initial","Food")
/datum/design/flour_sack
diff --git a/code/modules/research/designs/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm
index 57d0b78547..4e9238c4c7 100644
--- a/code/modules/research/designs/electronics_designs.dm
+++ b/code/modules/research/designs/electronics_designs.dm
@@ -23,16 +23,6 @@
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_ALL
-/datum/design/ai_cam_upgrade
- name = "AI Surveillance Software Update"
- desc = "A software package that will allow an artificial intelligence to 'hear' from its cameras via lip reading."
- id = "ai_cam_upgrade"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 5000, /datum/material/glass = 5000, /datum/material/gold = 15000, /datum/material/silver = 15000, /datum/material/diamond = 20000, /datum/material/plasma = 10000)
- build_path = /obj/item/surveillance_upgrade
- category = list("Electronics")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
///////////////////////////////////
//////////Nanite Devices///////////
///////////////////////////////////
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index a45a8b4898..8011dcf0f0 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -393,6 +393,39 @@
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+/datum/design/cyberimp_shield
+ name = "Riot Shield Arm Implant"
+ desc = "An implanted riot shield, designed to be installed on subject's arm."
+ id = "ci-shield"
+ build_type = PROTOLATHE
+ materials = list (/datum/material/iron = 8500, /datum/material/glass = 8500, /datum/material/silver = 1800, /datum/material/titanium = 600)
+ construction_time = 200
+ build_path = /obj/item/organ/cyberimp/arm/shield
+ category = list("Misc", "Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/cyberimp_janitor
+ name = "Janitor Arm Implant"
+ desc = "A set of janitor tools fitted into an arm implant, designed to be installed on subject's arm."
+ id = "ci-janitor"
+ build_type = PROTOLATHE | MECHFAB
+ materials = list (/datum/material/iron = 3500, /datum/material/glass = 1500, /datum/material/silver = 1500)
+ construction_time = 200
+ build_path = /obj/item/organ/cyberimp/arm/janitor
+ category = list("Misc", "Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
+/datum/design/cyberimp_service
+ name = "Service Arm Implant"
+ desc = "Everything a cook or barkeep needs in an arm implant, designed to be installed on subject's arm."
+ id = "ci-service"
+ build_type = PROTOLATHE | MECHFAB
+ materials = list (/datum/material/iron = 3500, /datum/material/glass = 1500, /datum/material/silver = 1500)
+ construction_time = 200
+ build_path = /obj/item/organ/cyberimp/arm/service
+ category = list("Misc", "Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
/datum/design/cyberimp_medical_hud
name = "Medical HUD Implant"
desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control."
diff --git a/code/modules/research/nanites/nanite_programs/rogue.dm b/code/modules/research/nanites/nanite_programs/rogue.dm
index 287aed36fe..cd9b30bee9 100644
--- a/code/modules/research/nanites/nanite_programs/rogue.dm
+++ b/code/modules/research/nanites/nanite_programs/rogue.dm
@@ -116,4 +116,4 @@
host_mob.drop_all_held_items()
else if(prob(4))
to_chat(host_mob, "You can't feel your legs!")
- host_mob.Knockdown(30)
+ host_mob.DefaultCombatKnockdown(30)
diff --git a/code/modules/research/nanites/nanite_programs/suppression.dm b/code/modules/research/nanites/nanite_programs/suppression.dm
index 56fd7fa044..1c882cead3 100644
--- a/code/modules/research/nanites/nanite_programs/suppression.dm
+++ b/code/modules/research/nanites/nanite_programs/suppression.dm
@@ -50,9 +50,11 @@
trigger_cooldown = 300
rogue_types = list(/datum/nanite_program/shocking, /datum/nanite_program/nerve_decay)
-/datum/nanite_program/stun/on_trigger(comm_message)
+/datum/nanite_program/triggered/stun/trigger(delayed)
+ if(!..())
+ return
+ host_mob.DefaultCombatKnockdown(80)
playsound(host_mob, "sparks", 75, TRUE, -1)
- host_mob.Knockdown(80)
/datum/nanite_program/pacifying
name = "Pacification"
diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm
index b510abbedd..fff3f42b9f 100644
--- a/code/modules/research/techweb/_techweb_node.dm
+++ b/code/modules/research/techweb/_techweb_node.dm
@@ -13,7 +13,6 @@
var/list/unlock_ids = list() //CALCULATED FROM OTHER NODE'S PREREQUISITES. Assoc list id = TRUE.
var/list/boost_item_paths = list() //Associative list, path = list(point type = point_value).
var/autounlock_by_boost = TRUE //boosting this will autounlock this node.
- var/export_price = 0 //Cargo export price.
var/list/research_costs = list() //Point cost to research. type = amount
var/category = "Misc" //Category
@@ -46,7 +45,6 @@
VARSET_TO_LIST(., assoc_list_strip_value(unlock_ids))
VARSET_TO_LIST(., boost_item_paths)
VARSET_TO_LIST(., autounlock_by_boost)
- VARSET_TO_LIST(., export_price)
VARSET_TO_LIST(., research_costs)
VARSET_TO_LIST(., category)
@@ -62,7 +60,6 @@
VARSET_FROM_LIST(input, unlock_ids)
VARSET_FROM_LIST(input, boost_item_paths)
VARSET_FROM_LIST(input, autounlock_by_boost)
- VARSET_FROM_LIST(input, export_price)
VARSET_FROM_LIST(input, research_costs)
VARSET_FROM_LIST(input, category)
Initialize()
@@ -81,6 +78,9 @@
prereq_ids -= node_id
unlock_ids -= node_id
+/datum/techweb_node/proc/price_display(datum/techweb/TN)
+ return techweb_point_display_generic(get_price(TN))
+
/datum/techweb_node/proc/get_price(datum/techweb/host)
if(host)
var/list/actual_costs = research_costs
@@ -91,7 +91,4 @@
actual_costs[i] -= L[i]
return actual_costs
else
- return research_costs
-
-/datum/techweb_node/proc/price_display(datum/techweb/TN)
- return techweb_point_display_generic(get_price(TN))
+ return research_costs
\ No newline at end of file
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 3d144b8bbe..78643255d0 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -73,7 +73,6 @@
prereq_ids = list("base")
design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv", "medspray")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/cadaver_management
id = "cadaver_management"
@@ -90,7 +89,6 @@
prereq_ids = list("biotech")
design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "meta_beaker", "healthanalyzer_advanced", "holobarrier_med", "defibrillator_compact", "smartdartgun", "medicinalsmartdart", "pHmeter")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/bio_process
id = "bio_process"
@@ -99,7 +97,6 @@
prereq_ids = list("biotech")
design_ids = list("smartfridge", "gibber", "deepfryer", "monkey_recycler", "processor", "gibber", "microwave", "reagentgrinder", "dish_drive")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/bottle_exports
id = "bottle_exports"
@@ -116,7 +113,6 @@
prereq_ids = list("adv_biotech", "surplus_lims")
design_ids = list("adv_l_arm", "adv_r_arm", "adv_r_leg", "adv_l_leg")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250)
- export_price = 5000
/datum/techweb_node/advance_surgerytools
id = "advance_surgerytools"
@@ -125,7 +121,6 @@
prereq_ids = list("adv_biotech", "adv_surgery")
design_ids = list("drapes", "retractor_adv", "surgicaldrill_adv", "scalpel_adv")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/adv_defibrillator_tec
id = "adv_defibrillator_tec"
@@ -134,7 +129,6 @@
prereq_ids = list("adv_biotech", "exp_surgery", "adv_engi", "adv_power")
design_ids = list("defib_decay", "defib_shock", "defib_heal", "defib_speed")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/////////////////////////Advanced Surgery/////////////////////////
/datum/techweb_node/imp_wt_surgery
@@ -144,7 +138,6 @@
prereq_ids = list("biotech")
design_ids = list("surgery_heal_brute_upgrade","surgery_heal_burn_upgrade")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
- export_price = 1000
/datum/techweb_node/adv_surgery
id = "adv_surgery"
@@ -153,7 +146,6 @@
prereq_ids = list("imp_wt_surgery")
design_ids = list("surgery_revival", "surgery_lobotomy", "surgery_heal_brute_upgrade_femto","surgery_heal_burn_upgrade_femto", "surgery_heal_combo", "surgery_toxinhealing", "organbox", "surgery_adv_dissection")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/exp_surgery
id = "exp_surgery"
@@ -162,7 +154,6 @@
prereq_ids = list("adv_surgery")
design_ids = list("surgery_pacify","surgery_vein_thread","surgery_muscled_veins","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond", "surgery_exp_dissection", "surgery_heal_combo_upgrade")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 5000
/datum/techweb_node/alien_surgery
id = "alien_surgery"
@@ -171,7 +162,6 @@
prereq_ids = list("exp_surgery", "alientech")
design_ids = list("surgery_brainwashing","surgery_zombie", "surgery_ext_dissection", "surgery_heal_combo_upgrade_femto")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
- export_price = 5000
/////////////////////////data theory tech/////////////////////////
/datum/techweb_node/datatheory //Computer science
@@ -180,7 +170,6 @@
description = "Big Data, in space!"
prereq_ids = list("base")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
/datum/techweb_node/adv_datatheory
id = "adv_datatheory"
@@ -189,7 +178,6 @@
prereq_ids = list("datatheory")
design_ids = list("icprinter", "icupgadv", "icupgclo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
/////////////////////////engineering tech/////////////////////////
/datum/techweb_node/engineering
@@ -199,9 +187,8 @@
prereq_ids = list("base")
design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin",
"atmosalerts", "atmos_control", "recycler", "autolathe", "autolathe_secure", "high_micro_laser", "nano_mani", "mesons", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod",
- "apc_control", "cell_charger", "power control", "airlock_board", "firelock_board", "airalarm_electronics", "firealarm_electronics", "cell_charger", "stack_console", "stack_machine", "rcd_ammo")
+ "apc_control", "power control", "airlock_board", "firelock_board", "airalarm_electronics", "firealarm_electronics", "cell_charger", "stack_console", "stack_machine", "rcd_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 6000)
- export_price = 5000
/datum/techweb_node/adv_engi
id = "adv_engi"
@@ -210,7 +197,6 @@
prereq_ids = list("engineering", "emp_basic")
design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask" , "rcd_loaded", "rpd", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade_frames", "rcd_upgrade_simple_circuits", "rcd_ammo_large")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
- export_price = 5000
/datum/techweb_node/anomaly
id = "anomaly_research"
@@ -219,7 +205,6 @@
prereq_ids = list("adv_engi", "practical_bluespace")
design_ids = list("reactive_armour", "anomaly_neutralizer")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
- export_price = 5000
/datum/techweb_node/high_efficiency
id = "high_efficiency"
@@ -228,7 +213,6 @@
prereq_ids = list("engineering", "datatheory")
design_ids = list("pico_mani", "super_matter_bin")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 5000
/datum/techweb_node/adv_power
id = "adv_power"
@@ -237,7 +221,6 @@
prereq_ids = list("engineering")
design_ids = list("smes", "super_cell", "hyper_cell", "super_capacitor", "superpacman", "mrspacman", "power_turbine", "power_turbine_console", "power_compressor", "circulator", "teg")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
/*
/datum/techweb_node/basic_meteor_defense
@@ -246,7 +229,6 @@
description = "Unlock the potential of the mysterious of why CC decided to not build these around the station themselves."
prereq_ids = list("adv_engi", "high_efficiency")
design_ids = list("meteor_defence", "meteor_console")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
/datum/techweb_node/adv_meteor_defense
id = "adv_meteor_defense"
@@ -254,8 +236,6 @@
description = "New and improved coding and lock on tech for meteor defence!"
prereq_ids = list("basic_meteor_defense", "adv_datatheory", "emp_adv")
design_ids = list("meteor_disk")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
-
*/
/datum/techweb_node/computer_board_gaming
@@ -265,7 +245,6 @@
prereq_ids = list("comptech")
design_ids = list("arcade_battle", "arcade_orion", "slotmachine", "autoylathe")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
- export_price = 5000
/////////////////////////Bluespace tech/////////////////////////
/datum/techweb_node/bluespace_basic //Bluespace-memery
@@ -275,7 +254,6 @@
prereq_ids = list("base", "datatheory")
design_ids = list("beacon", "xenobioconsole", "telesci_gps", "xenobio_monkeys")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/practical_bluespace
id = "practical_bluespace"
@@ -284,7 +262,6 @@
prereq_ids = list("bluespace_basic", "engineering")
design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart", "xenobio_slimebasic")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 5000
/datum/techweb_node/adv_bluespace
id = "adv_bluespace"
@@ -293,7 +270,6 @@
prereq_ids = list("practical_bluespace", "high_efficiency")
design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "bluespace_crystal", "xenobio_slimeadv")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
- export_price = 5000
/datum/techweb_node/bluespace_power
id = "bluespace_power"
@@ -302,7 +278,6 @@
prereq_ids = list("adv_power", "adv_bluespace")
design_ids = list("bluespace_cell", "quadratic_capacitor")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/bluespace_holding
id = "bluespace_holding"
@@ -311,7 +286,6 @@
prereq_ids = list("adv_power", "adv_bluespace", "adv_biotech", "adv_plasma")
design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding", "bsblood_bag")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500)
- export_price = 5000
/datum/techweb_node/bluespace_portal
id = "bluespace_portal"
@@ -320,7 +294,6 @@
prereq_ids = list("adv_weaponry", "adv_bluespace")
design_ids = list("wormholeprojector")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/bluespace_warping
id = "bluespace_warping"
@@ -329,7 +302,6 @@
prereq_ids = list("adv_power", "adv_bluespace")
design_ids = list("tele_station", "tele_hub", "quantumpad", "quantum_keycard", "launchpad", "launchpad_console", "teleconsole", "roastingstick")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/unregulated_bluespace
id = "unregulated_bluespace"
@@ -338,7 +310,6 @@
prereq_ids = list("bluespace_warping", "syndicate_basic")
design_ids = list("desynchronizer")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 2500
/////////////////////////plasma tech/////////////////////////
/datum/techweb_node/basic_plasma
@@ -348,7 +319,6 @@
prereq_ids = list("engineering")
design_ids = list("mech_generator")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
/datum/techweb_node/adv_plasma
id = "adv_plasma"
@@ -357,7 +327,6 @@
prereq_ids = list("basic_plasma")
design_ids = list("mech_plasma_cutter")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
/////////////////////////robotics tech/////////////////////////
/datum/techweb_node/robotics
@@ -367,7 +336,6 @@
prereq_ids = list("base")
design_ids = list("paicard", "drone_shell")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
/datum/techweb_node/adv_robotics
id = "adv_robotics"
@@ -376,7 +344,6 @@
prereq_ids = list("robotics")
design_ids = list("borg_upgrade_diamonddrill", "borg_upgrade_advancedmop", "borg_upgrade_advcutter", "borg_upgrade_premiumka")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
/datum/techweb_node/neural_programming
id = "neural_programming"
@@ -384,7 +351,6 @@
description = "Study into networks of processing units that mimic our brains."
prereq_ids = list("biotech", "datatheory")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/posibrain
id = "posibrain"
@@ -393,7 +359,6 @@
prereq_ids = list("neural_programming")
design_ids = list("mmi_posi")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/cyborg_upg_util
id = "cyborg_upg_util"
@@ -402,7 +367,6 @@
prereq_ids = list("engineering", "robotics")
design_ids = list("borg_upgrade_lavaproof", "borg_upgrade_thrusters", "borg_upgrade_selfrepair", "borg_upgrade_expand", "borg_upgrade_rped")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
/datum/techweb_node/cyborg_upg_med
id = "cyborg_upg_med"
@@ -411,7 +375,6 @@
prereq_ids = list("adv_biotech", "robotics")
design_ids = list("borg_upgrade_advhealth", "borg_upgrade_piercinghypospray", "borg_upgrade_highstrengthsynthesiser", "borg_upgrade_expandedsynthesiser", "borg_upgrade_pinpointer", "borg_upgrade_surgicalprocessor")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
/datum/techweb_node/cyborg_upg_combat
id = "cyborg_upg_combat"
@@ -420,7 +383,6 @@
prereq_ids = list("adv_robotics", "adv_engi" , "weaponry")
design_ids = list("borg_upgrade_vtec", "borg_upgrade_disablercooler")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 5000
/datum/techweb_node/ai
id = "ai"
@@ -431,7 +393,6 @@
"reset_module", "purge_module", "remove_module", "freeformcore_module", "asimov_module", "paladin_module", "tyrant_module", "corporate_module",
"default_module", "borg_ai_control", "mecha_tracking_ai_control", "aiupload", "intellicard")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/////////////////////////EMP tech/////////////////////////
/datum/techweb_node/emp_basic //EMP tech for some reason
@@ -441,7 +402,6 @@
prereq_ids = list("base")
design_ids = list("holosign", "holosignsec", "holosignengi", "holosignatmos", "holosignfirelock", "inducer", "tray_goggles", "holopad")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/emp_adv
id = "emp_adv"
@@ -450,7 +410,6 @@
prereq_ids = list("emp_basic")
design_ids = list("ultra_micro_laser")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
/datum/techweb_node/emp_super
id = "emp_super"
@@ -459,7 +418,6 @@
prereq_ids = list("emp_adv")
design_ids = list("quadultra_micro_laser")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
/////////////////////////Clown tech/////////////////////////
/datum/techweb_node/clown
@@ -470,7 +428,6 @@
design_ids = list("air_horn", "honker_main", "honker_peri", "honker_targ", "honk_chassis", "honk_head", "honk_torso", "honk_left_arm", "honk_right_arm",
"honk_left_leg", "honk_right_leg", "mech_banana_mortar", "mech_mousetrap_mortar", "mech_honker", "mech_punching_face", "implant_trombone", "borg_transform_clown")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
////////////////////////Computer tech////////////////////////
/datum/techweb_node/comptech
@@ -480,7 +437,6 @@
prereq_ids = list("datatheory")
design_ids = list("cargo", "cargorequest", "libraryconsole", "mining", "miningshuttle", "crewconsole", "rdcamera", "comconsole", "idcardconsole", "seccamera")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
/datum/techweb_node/computer_hardware_basic //Modular computers are shitty and nearly useless so until someone makes them actually useful this can be easy to get.
id = "computer_hardware_basic"
@@ -488,7 +444,6 @@
description = "How computer hardware are made."
prereq_ids = list("comptech")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250) //they are really kinda shitty
- export_price = 2000
design_ids = list("hdd_basic", "hdd_advanced", "hdd_super", "hdd_cluster", "ssd_small", "ssd_micro", "netcard_basic", "netcard_advanced", "netcard_wired",
"portadrive_basic", "portadrive_advanced", "portadrive_super", "cardslot", "aislot", "miniprinter", "APClink", "bat_control", "bat_normal", "bat_advanced",
"bat_super", "bat_micro", "bat_nano", "cpu_normal", "pcpu_normal", "cpu_small", "pcpu_small")
@@ -500,7 +455,6 @@
prereq_ids = list("comptech")
design_ids = list("secdata", "med_data", "prisonmanage", "vendor", "automated_announcement")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250)
- export_price = 2000
/datum/techweb_node/telecomms
id = "telecomms"
@@ -508,7 +462,6 @@
description = "Subspace transmission technology for near-instant communications devices."
prereq_ids = list("comptech", "bluespace_basic")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
- export_price = 5000
design_ids = list("s-receiver", "s-bus", "s-broadcaster", "s-processor", "s-hub", "s-server", "s-relay", "comm_monitor", "comm_server",
"s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter", "message_monitor")
@@ -519,7 +472,6 @@
prereq_ids = list("comp_recordkeeping", "emp_basic")
design_ids = list("health_hud", "security_hud", "diagnostic_hud", "scigoggles", "health_hud_prescription", "security_hud_prescription", "diagnostic_hud_prescription")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
- export_price = 5000
/datum/techweb_node/NVGtech
id = "NVGtech"
@@ -528,7 +480,6 @@
prereq_ids = list("integrated_HUDs", "adv_engi", "emp_adv")
design_ids = list("health_hud_night", "security_hud_night", "diagnostic_hud_night", "night_visision_goggles", "nvgmesons", "night_visision_goggles_glasses")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 5000
////////////////////////Medical////////////////////////
/datum/techweb_node/cloning
@@ -538,7 +489,6 @@
prereq_ids = list("biotech")
design_ids = list("clonecontrol", "clonepod", "clonescanner", "scan_console", "cloning_disk")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
/datum/techweb_node/cryotech
id = "cryotech"
@@ -547,7 +497,6 @@
prereq_ids = list("adv_engi", "biotech")
design_ids = list("splitbeaker", "noreactsyringe", "cryotube", "cryo_Grenade")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 4000
/datum/techweb_node/subdermal_implants
id = "subdermal_implants"
@@ -556,7 +505,6 @@
prereq_ids = list("biotech", "datatheory")
design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator", "c38_trac")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/cyber_organs
id = "cyber_organs"
@@ -565,7 +513,6 @@
prereq_ids = list("adv_biotech")
design_ids = list("cybernetic_ears", "cybernetic_heart", "cybernetic_liver", "cybernetic_lungs", "cybernetic_tongue")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
- export_price = 5000
/datum/techweb_node/cyber_organs_upgraded
id = "cyber_organs_upgraded"
@@ -574,16 +521,14 @@
prereq_ids = list("cyber_organs")
design_ids = list("cybernetic_ears_u", "cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
- export_price = 5000
/datum/techweb_node/cyber_implants
id = "cyber_implants"
display_name = "Cybernetic Implants"
description = "Electronic implants that improve humans."
prereq_ids = list("adv_biotech", "adv_datatheory")
- design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud")
+ design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud", "ci-service")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/adv_cyber_implants
id = "adv_cyber_implants"
@@ -592,7 +537,6 @@
prereq_ids = list("neural_programming", "cyber_implants","integrated_HUDs")
design_ids = list("ci-toolset", "ci-surgery", "ci-reviver", "ci-nutrimentplus")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/combat_cyber_implants
id = "combat_cyber_implants"
@@ -601,7 +545,6 @@
prereq_ids = list("adv_cyber_implants","weaponry","NVGtech","high_efficiency")
design_ids = list("ci-xray", "ci-thermals", "ci-antidrop", "ci-antistun", "ci-thrusters")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
////////////////////////Tools////////////////////////
/datum/techweb_node/basic_tools
@@ -611,7 +554,6 @@
prereq_ids = list("base")
design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop", "broom")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500)
- export_price = 5000
/datum/techweb_node/basic_mining
id = "basic_mining"
@@ -620,7 +562,6 @@
prereq_ids = list("engineering", "basic_plasma")
design_ids = list("drill", "superresonator", "triggermod", "damagemod", "cooldownmod", "rangemod", "ore_redemption", "mining_equipment_vendor", "cargoexpress", "plasmacutter")//e a r l y g a m e)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/adv_mining
id = "adv_mining"
@@ -629,16 +570,14 @@
prereq_ids = list("basic_mining", "adv_engi", "adv_power", "adv_plasma")
design_ids = list("drill_diamond", "jackhammer", "hypermod", "plasmacutter_adv", "ore_silo", "plasteel_pick", "titanium_pick")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/janitor
id = "janitor"
display_name = "Advanced Sanitation Technology"
description = "Clean things better, faster, stronger, and harder!"
prereq_ids = list("adv_engi")
- design_ids = list("advmop", "buffer", "light_replacer", "spraybottle", "beartrap")
+ design_ids = list("advmop", "buffer", "light_replacer", "spraybottle", "beartrap", "ci-janitor")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1750) // No longer has its bag
- export_price = 5000
/datum/techweb_node/botany
id = "botany"
@@ -647,7 +586,6 @@
prereq_ids = list("adv_engi", "biotech")
design_ids = list("diskplantgene", "portaseeder", "plantgenes", "flora_gun", "hydro_tray", "biogenerator", "seed_extractor")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
- export_price = 5000
/datum/techweb_node/exp_tools
id = "exp_tools"
@@ -656,7 +594,6 @@
design_ids = list("exwelder", "jawsoflife", "handdrill", "holosigncombifan")
prereq_ids = list("adv_engi")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
- export_price = 5000
/datum/techweb_node/sec_basic
id = "sec_basic"
@@ -665,7 +602,6 @@
design_ids = list("seclite", "pepperspray", "bola_energy", "zipties", "evidencebag")
prereq_ids = list("base")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 750)
- export_price = 5000
/////////////////////////weaponry tech/////////////////////////
/datum/techweb_node/weaponry
@@ -675,7 +611,6 @@
prereq_ids = list("engineering")
design_ids = list("pin_testing", "tele_shield", "lasercarbine", "pin_away")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
- export_price = 5000
/datum/techweb_node/adv_weaponry
id = "adv_weaponry"
@@ -684,7 +619,6 @@
prereq_ids = list("adv_engi", "weaponry")
design_ids = list("pin_loyalty")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
- export_price = 5000
/datum/techweb_node/electric_weapons
id = "electronic_weapons"
@@ -693,7 +627,6 @@
prereq_ids = list("weaponry", "adv_power" , "emp_basic")
design_ids = list("stunrevolver", "stunshell", "ioncarbine")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
- export_price = 5000
/datum/techweb_node/radioactive_weapons
id = "radioactive_weapons"
@@ -702,7 +635,6 @@
prereq_ids = list("adv_engi", "adv_weaponry")
design_ids = list("nuclear_gun")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/magnetic_weapons
id = "magnetic_weapons"
@@ -711,7 +643,6 @@
prereq_ids = list("weaponry", "adv_weaponry", "emp_adv")
design_ids = list("magrifle", "magpistol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/medical_weapons
id = "medical_weapons"
@@ -720,7 +651,6 @@
prereq_ids = list("adv_biotech", "adv_weaponry")
design_ids = list("rapidsyringe", "shotgundartcryostatis")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
/datum/techweb_node/beam_weapons
id = "beam_weapons"
@@ -729,7 +659,6 @@
prereq_ids = list("adv_weaponry")
design_ids = list("temp_gun", "xray_laser")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/adv_beam_weapons
id = "adv_beam_weapons"
@@ -738,7 +667,6 @@
prereq_ids = list("beam_weapons")
design_ids = list("beamrifle")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3250) // Sniper
- export_price = 5000
/datum/techweb_node/explosive_weapons
id = "explosive_weapons"
@@ -747,7 +675,6 @@
prereq_ids = list("adv_weaponry")
design_ids = list("large_Grenade", "pyro_Grenade", "adv_Grenade")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
- export_price = 5000
/datum/techweb_node/ballistic_weapons
id = "ballistic_weapons"
@@ -756,7 +683,6 @@
prereq_ids = list("weaponry")
design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic", "mag_oldsmg_rubber", "mag_oldsmg_tx")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
- export_price = 5000
/datum/techweb_node/exotic_ammo
id = "exotic_ammo"
@@ -765,7 +691,6 @@
prereq_ids = list("weaponry", "ballistic_weapons")
design_ids = list("techshotshell", "c38_hotshot", "c38_iceblox")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
- export_price = 5000
/datum/techweb_node/gravity_gun
id = "gravity_gun"
@@ -774,7 +699,6 @@
prereq_ids = list("adv_weaponry", "adv_bluespace")
design_ids = list("gravitygun", "mech_gravcatapult")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
////////////////////////mech technology////////////////////////
/datum/techweb_node/adv_mecha
@@ -784,7 +708,6 @@
prereq_ids = list("adv_robotics")
design_ids = list("mech_repair_droid")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/odysseus
id = "mecha_odysseus"
@@ -794,7 +717,6 @@
design_ids = list("odysseus_chassis", "odysseus_torso", "odysseus_head", "odysseus_left_arm", "odysseus_right_arm" ,"odysseus_left_leg", "odysseus_right_leg",
"odysseus_main", "odysseus_peri")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/gygax
id = "mech_gygax"
@@ -804,7 +726,6 @@
design_ids = list("gygax_chassis", "gygax_torso", "gygax_head", "gygax_left_arm", "gygax_right_arm", "gygax_left_leg", "gygax_right_leg", "gygax_main",
"gygax_peri", "gygax_targ", "gygax_armor")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/durand
id = "mech_durand"
@@ -814,7 +735,6 @@
design_ids = list("durand_chassis", "durand_torso", "durand_head", "durand_left_arm", "durand_right_arm", "durand_left_leg", "durand_right_leg", "durand_main",
"durand_peri", "durand_targ", "durand_armor")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
- export_price = 5000
/datum/techweb_node/phazon
id = "mecha_phazon"
@@ -824,7 +744,6 @@
design_ids = list("phazon_chassis", "phazon_torso", "phazon_head", "phazon_left_arm", "phazon_right_arm", "phazon_left_leg", "phazon_right_leg", "phazon_main",
"phazon_peri", "phazon_targ", "phazon_armor")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
/datum/techweb_node/adv_mecha_tools
id = "adv_mecha_tools"
@@ -833,7 +752,6 @@
prereq_ids = list("adv_mecha")
design_ids = list("mech_rcd")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/med_mech_tools
id = "med_mech_tools"
@@ -842,7 +760,6 @@
prereq_ids = list("adv_biotech")
design_ids = list("mech_sleeper", "mech_syringe_gun", "mech_medi_beam")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
/datum/techweb_node/mech_modules
id = "adv_mecha_modules"
@@ -851,7 +768,6 @@
prereq_ids = list("adv_mecha", "bluespace_power")
design_ids = list("mech_energy_relay", "mech_ccw_armor", "mech_proj_armor", "mech_generator_nuclear")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_scattershot
id = "mecha_tools"
@@ -860,7 +776,6 @@
prereq_ids = list("ballistic_weapons")
design_ids = list("mech_scattershot", "mech_scattershot_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_seedscatter
id = "mech_seedscatter"
@@ -869,7 +784,6 @@
prereq_ids = list("ballistic_weapons")
design_ids = list("mech_seedscatter")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_carbine
id = "mech_carbine"
@@ -878,7 +792,6 @@
prereq_ids = list("ballistic_weapons")
design_ids = list("mech_carbine", "mech_carbine_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_ion
id = "mmech_ion"
@@ -887,7 +800,6 @@
prereq_ids = list("electronic_weapons", "emp_adv")
design_ids = list("mech_ion")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_tesla
id = "mech_tesla"
@@ -896,7 +808,6 @@
prereq_ids = list("electronic_weapons", "adv_power")
design_ids = list("mech_tesla")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_laser
id = "mech_laser"
@@ -905,7 +816,6 @@
prereq_ids = list("beam_weapons")
design_ids = list("mech_laser")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_laser_heavy
id = "mech_laser_heavy"
@@ -914,7 +824,6 @@
prereq_ids = list("adv_beam_weapons")
design_ids = list("mech_laser_heavy")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_grenade_launcher
id = "mech_grenade_launcher"
@@ -923,7 +832,6 @@
prereq_ids = list("explosive_weapons")
design_ids = list("mech_grenade_launcher", "mech_grenade_launcher_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_missile_rack
id = "mech_missile_rack"
@@ -932,7 +840,6 @@
prereq_ids = list("explosive_weapons")
design_ids = list("mech_missile_rack", "mech_missile_rack_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/clusterbang_launcher
id = "clusterbang_launcher"
@@ -941,7 +848,6 @@
prereq_ids = list("explosive_weapons")
design_ids = list("clusterbang_launcher", "clusterbang_launcher_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_teleporter
id = "mech_teleporter"
@@ -950,7 +856,6 @@
prereq_ids = list("adv_bluespace")
design_ids = list("mech_teleporter")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_wormhole_gen
id = "mech_wormhole_gen"
@@ -959,7 +864,6 @@
prereq_ids = list("adv_bluespace")
design_ids = list("mech_wormhole_gen")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_taser
id = "mech_taser"
@@ -968,7 +872,6 @@
prereq_ids = list("electronic_weapons")
design_ids = list("mech_taser")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_lmg
id = "mech_lmg"
@@ -977,7 +880,6 @@
prereq_ids = list("ballistic_weapons")
design_ids = list("mech_lmg", "mech_lmg_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/mech_diamond_drill
id = "mech_diamond_drill"
@@ -986,7 +888,6 @@
prereq_ids = list("adv_mining")
design_ids = list("mech_diamond_drill")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/////////////////////////Nanites/////////////////////////
/datum/techweb_node/nanite_base
@@ -998,7 +899,6 @@
"nanite_chamber","public_nanite_chamber","nanite_chamber_control","nanite_programmer","nanite_program_hub","nanite_cloud_control",\
"relay_nanites", "monitoring_nanites", "access_nanites", "repairing_nanites","sensor_nanite_volume", "repeater_nanites", "relay_repeater_nanites","red_diag_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/nanite_smart
id = "nanite_smart"
@@ -1007,7 +907,6 @@
prereq_ids = list("nanite_base","adv_robotics")
design_ids = list("purging_nanites", "research_nanites", "metabolic_nanites", "stealth_nanites", "memleak_nanites","sensor_voice_nanites", "voice_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 4000
/datum/techweb_node/nanite_mesh
id = "nanite_mesh"
@@ -1016,7 +915,6 @@
prereq_ids = list("nanite_base","engineering")
design_ids = list("hardening_nanites", "dermal_button_nanites", "refractive_nanites", "cryo_nanites", "conductive_nanites", "shock_nanites", "emp_nanites", "temperature_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/nanite_bio
id = "nanite_bio"
@@ -1026,7 +924,6 @@
design_ids = list("regenerative_nanites", "bloodheal_nanites", "coagulating_nanites","poison_nanites","flesheating_nanites",\
"sensor_crit_nanites","sensor_death_nanites", "sensor_health_nanites", "sensor_damage_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/nanite_neural
id = "nanite_neural"
@@ -1035,7 +932,6 @@
prereq_ids = list("nanite_bio")
design_ids = list("nervous_nanites", "brainheal_nanites", "paralyzing_nanites", "stun_nanites", "selfscan_nanites","good_mood_nanites","bad_mood_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/nanite_synaptic
id = "nanite_synaptic"
@@ -1044,7 +940,6 @@
prereq_ids = list("nanite_neural","neural_programming")
design_ids = list("mindshield_nanites", "pacifying_nanites", "blinding_nanites", "sleep_nanites", "mute_nanites", "speech_nanites","hallucination_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
/datum/techweb_node/nanite_harmonic
id = "nanite_harmonic"
@@ -1053,7 +948,6 @@
prereq_ids = list("nanite_bio","nanite_smart","nanite_mesh")
design_ids = list("fakedeath_nanites","researchplus_nanites","aggressive_nanites","defib_nanites","regenerative_plus_nanites","brainheal_plus_nanites","purging_plus_nanites","adrenaline_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
- export_price = 8000
/datum/techweb_node/nanite_combat
id = "nanite_military"
@@ -1062,7 +956,6 @@
prereq_ids = list("nanite_harmonic", "syndicate_basic")
design_ids = list("explosive_nanites","pyro_nanites","meltdown_nanites","viral_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
- export_price = 12500
/datum/techweb_node/nanite_hazard
id = "nanite_hazard"
@@ -1071,7 +964,6 @@
prereq_ids = list("nanite_harmonic", "alientech")
design_ids = list("spreading_nanites","mindcontrol_nanites","mitosis_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
- export_price = 15000
////////////////////////Alien technology////////////////////////
/datum/techweb_node/alientech //AYYYYYYYYLMAOO tech
@@ -1080,7 +972,6 @@
description = "Things used by the greys."
prereq_ids = list("biotech","engineering")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 20000
hidden = TRUE
design_ids = list("alienalloy")
@@ -1101,7 +992,6 @@
prereq_ids = list("alientech", "advance_surgerytools")
design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery", "ayyplantgenes")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 10000
/datum/techweb_node/alien_engi
id = "alien_engi"
@@ -1110,16 +1000,14 @@
prereq_ids = list("alientech", "exp_tools")
design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 10000
/datum/techweb_node/syndicate_basic
id = "syndicate_basic"
display_name = "Illegal Technology"
description = "Dangerous research used to create dangerous objects."
prereq_ids = list("adv_engi", "adv_weaponry", "explosive_weapons")
- design_ids = list("decloner", "borg_syndicate_module", "ai_cam_upgrade", "suppressor", "largecrossbow", "donksofttoyvendor", "donksoft_refill", "syndiesleeper")
+ design_ids = list("decloner", "borg_syndicate_module", "suppressor", "largecrossbow", "donksofttoyvendor", "donksoft_refill", "syndiesleeper")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
- export_price = 5000
hidden = TRUE
/datum/techweb_node/syndicate_basic/New() //Crappy way of making syndicate gear decon supported until there's another way.
@@ -1138,17 +1026,8 @@
design_ids = list("10mm","10mmap","10mminc","10mmhp","sl357","sl357ap","pistolm9mm","m45","bolt_clip")
prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns from traitors, space, or anything in between.
- export_price = 7000
//Helpers for debugging/balancing the techweb in its entirety!
-/proc/total_techweb_exports()
- var/list/datum/techweb_node/processing = list()
- for(var/i in subtypesof(/datum/techweb_node))
- processing += new i
- . = 0
- for(var/i in processing)
- var/datum/techweb_node/TN = i
- . += TN.export_price
/proc/total_techweb_points()
var/list/datum/techweb_node/processing = list()
diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
index 8648e46cb9..b6e39e98dc 100644
--- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm
+++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
@@ -249,7 +249,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
to_chat(user, "The door seems to be malfunctioning and refuses to operate!")
return
if(alert(user, "Hilbert's Hotel would like to remind you that while we will do everything we can to protect the belongings you leave behind, we make no guarantees of their safety while you're gone, especially that of the health of any living creatures. With that in mind, are you ready to leave?", "Exit", "Leave", "Stay") == "Leave")
- if(!user.canmove || (get_dist(get_turf(src), get_turf(user)) > 1)) //no teleporting around if they're dead or moved away during the prompt.
+ if(!CHECK_MOBILITY(user, MOBILITY_MOVE) || (get_dist(get_turf(src), get_turf(user)) > 1)) //no teleporting around if they're dead or moved away during the prompt.
return
user.forceMove(get_turf(parentSphere))
do_sparks(3, FALSE, get_turf(user))
diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm
index beaaa51adb..701c153783 100644
--- a/code/modules/shuttle/on_move.dm
+++ b/code/modules/shuttle/on_move.dm
@@ -318,7 +318,7 @@ All ShuttleMove procs go here
var/knockdown = movement_force["KNOCKDOWN"]
if(knockdown)
- Knockdown(knockdown)
+ DefaultCombatKnockdown(knockdown)
/mob/living/simple_animal/hostile/megafauna/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock)
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index 2d17a8e55a..f05adb9309 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -186,7 +186,7 @@
// No climbing on the bar please
var/mob/living/M = AM
var/throwtarget = get_edge_target_turf(src, boot_dir)
- M.Knockdown(40)
+ M.DefaultCombatKnockdown(40)
M.throw_at(throwtarget, 5, 1)
to_chat(M, "No climbing on the bar please.")
else
diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm
index d97d466e4d..3952a347e0 100644
--- a/code/modules/spells/spell_types/devil.dm
+++ b/code/modules/spells/spell_types/devil.dm
@@ -198,7 +198,7 @@
if(H.anti_magic_check(FALSE, TRUE))
continue
H.mind.add_antag_datum(/datum/antagonist/sintouched)
- H.Knockdown(400)
+ H.DefaultCombatKnockdown(400)
/obj/effect/proc_holder/spell/targeted/summon_dancefloor
diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm
index a9d5f21abc..424a3b7671 100644
--- a/code/modules/spells/spell_types/ethereal_jaunt.dm
+++ b/code/modules/spells/spell_types/ethereal_jaunt.dm
@@ -40,7 +40,8 @@
return
mobloc = get_turf(target.loc)
jaunt_steam(mobloc)
- target.canmove = 0
+ ADD_TRAIT(target, TRAIT_MOBILITY_NOMOVE, src)
+ target.update_mobility()
holder.reappearing = 1
playsound(get_turf(target), 'sound/magic/ethereal_exit.ogg', 50, 1, -1)
sleep(25 - jaunt_in_time)
@@ -55,7 +56,8 @@
if(T)
if(target.Move(T))
break
- target.canmove = 1
+ REMOVE_TRAIT(target, TRAIT_MOBILITY_NOMOVE, src)
+ target.update_mobility()
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_steam(mobloc)
var/datum/effect_system/steam_spread/steam = new /datum/effect_system/steam_spread()
diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm
index c4a2b4aa7e..fe53fd37e4 100644
--- a/code/modules/spells/spell_types/godhand.dm
+++ b/code/modules/spells/spell_types/godhand.dm
@@ -123,9 +123,9 @@
M.SetSleeping(0)
M.stuttering += 20*mul
M.adjustEarDamage(0, 30*mul)
- M.Knockdown(60*mul)
+ M.DefaultCombatKnockdown(60*mul)
if(prob(40))
- M.Knockdown(200*mul)
+ M.DefaultCombatKnockdown(200*mul)
else
M.Jitter(500*mul)
diff --git a/code/modules/spells/spell_types/inflict_handler.dm b/code/modules/spells/spell_types/inflict_handler.dm
index 7bc5ce34d3..5837caba24 100644
--- a/code/modules/spells/spell_types/inflict_handler.dm
+++ b/code/modules/spells/spell_types/inflict_handler.dm
@@ -46,7 +46,7 @@
if(!amt_knockdown && amt_dam_stam)
target.adjustStaminaLoss(amt_dam_stam)
else
- target.Knockdown(amt_knockdown, override_hardstun = amt_hardstun, override_stamdmg = amt_dam_stam)
+ target.DefaultCombatKnockdown(amt_knockdown, override_hardstun = amt_hardstun, override_stamdmg = amt_dam_stam)
target.Unconscious(amt_unconscious)
target.Stun(amt_stun)
diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm
index 86597d5d2e..207ccd8374 100644
--- a/code/modules/spells/spell_types/lichdom.dm
+++ b/code/modules/spells/spell_types/lichdom.dm
@@ -135,7 +135,7 @@
lich.hardset_dna(null,null,lich.real_name,null, new /datum/species/skeleton/space)
to_chat(lich, "Your bones clatter and shudder as you are pulled back into this world!")
var/turf/body_turf = get_turf(old_body)
- lich.Knockdown(200 + 200*resurrections)
+ lich.DefaultCombatKnockdown(200 + 200*resurrections)
resurrections++
if(old_body && old_body.loc)
if(iscarbon(old_body))
diff --git a/code/modules/spells/spell_types/shadow_walk.dm b/code/modules/spells/spell_types/shadow_walk.dm
index b32c8c16c6..0b492cc6b0 100644
--- a/code/modules/spells/spell_types/shadow_walk.dm
+++ b/code/modules/spells/spell_types/shadow_walk.dm
@@ -25,8 +25,7 @@
if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
playsound(get_turf(user), 'sound/magic/ethereal_enter.ogg', 50, 1, -1)
visible_message("[user] melts into the shadows!")
- user.SetStun(0, FALSE)
- user.SetKnockdown(0, FALSE)
+ user.SetAllImmobility(0)
user.setStaminaLoss(0, 0)
var/obj/effect/dummy/phased_mob/shadow/S2 = new(get_turf(user.loc))
user.forceMove(S2)
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index 44fdd1eb55..124159e910 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -297,14 +297,14 @@
if(distfromcaster == 0)
if(isliving(AM))
var/mob/living/M = AM
- M.Knockdown(100, override_hardstun = 20)
+ M.DefaultCombatKnockdown(100, override_hardstun = 20)
M.adjustBruteLoss(5)
to_chat(M, "You're slammed into the floor by [user]!")
else
new sparkle_path(get_turf(AM), get_dir(user, AM)) //created sparkles will disappear on their own
if(isliving(AM))
var/mob/living/M = AM
- M.Knockdown(stun_amt, override_hardstun = stun_amt * 0.2)
+ M.DefaultCombatKnockdown(stun_amt, override_hardstun = stun_amt * 0.2)
to_chat(M, "You're thrown back by [user]!")
AM.throw_at(throwtarget, ((CLAMP((maxthrow - (CLAMP(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time.
safety--
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index c9affe92f9..bdea05decd 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -256,7 +256,7 @@
disabled = new_disabled
owner.update_health_hud() //update the healthdoll
owner.update_body()
- owner.update_canmove()
+ owner.update_mobility()
if(!disabled)
incoming_stam_mult = 1
return TRUE
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 61811cdafc..8e47d6dbde 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -124,7 +124,7 @@
C.update_health_hud() //update the healthdoll
C.update_body()
C.update_hair()
- C.update_canmove()
+ C.update_mobility()
if(!Tsec) // Tsec = null happens when a "dummy human" used for rendering icons on prefs screen gets its limbs replaced.
qdel(src)
@@ -298,7 +298,7 @@
C.update_body()
C.update_hair()
C.update_damage_overlays()
- C.update_canmove()
+ C.update_mobility()
/obj/item/bodypart/head/attach_limb(mob/living/carbon/C, special)
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index 7371afd40f..37ee253d4b 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -140,6 +140,88 @@
else
Retract()
+/obj/item/organ/cyberimp/arm/medibeam
+ name = "integrated medical beamgun"
+ desc = "A cybernetic implant that allows the user to project a healing beam from their hand."
+ contents = newlist(/obj/item/gun/medbeam)
+
+///////////////
+//Tools Arms//
+///////////////
+
+/obj/item/organ/cyberimp/arm/toolset
+ name = "integrated toolset implant"
+ desc = "A stripped-down version of the engineering cyborg toolset, designed to be installed on subject's arm. Contains all necessary tools."
+ contents = newlist(/obj/item/screwdriver/cyborg, /obj/item/wrench/cyborg, /obj/item/weldingtool/largetank/cyborg,
+ /obj/item/crowbar/cyborg, /obj/item/wirecutters/cyborg, /obj/item/multitool/cyborg)
+
+/obj/item/organ/cyberimp/arm/toolset/emag_act()
+ . = ..()
+ if(obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ to_chat(usr, "You unlock [src]'s integrated knife!")
+ items_list += new /obj/item/kitchen/knife/combat/cyborg(src)
+ return TRUE
+
+/obj/item/organ/cyberimp/arm/surgery
+ name = "surgical toolset implant"
+ desc = "A set of surgical tools hidden behind a concealed panel on the user's arm."
+ contents = newlist(/obj/item/retractor/augment, /obj/item/hemostat/augment, /obj/item/cautery/augment, /obj/item/surgicaldrill/augment, /obj/item/scalpel/augment, /obj/item/circular_saw/augment, /obj/item/surgical_drapes)
+
+/obj/item/organ/cyberimp/arm/surgery/emag_act()
+ . = ..()
+ if(obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ to_chat(usr, "You unlock [src]'s integrated knife!")
+ items_list += new /obj/item/kitchen/knife/combat/cyborg(src)
+ return TRUE
+
+/obj/item/organ/cyberimp/arm/janitor
+ name = "janitorial tools implant"
+ desc = "A set of janitorial tools on the user's arm."
+ contents = newlist(/obj/item/lightreplacer, /obj/item/holosign_creator, /obj/item/soap/nanotrasen, /obj/item/reagent_containers/spray/cyborg_drying, /obj/item/mop/advanced, /obj/item/paint/paint_remover, /obj/item/reagent_containers/glass/beaker/large, /obj/item/reagent_containers/spray/cleaner) //Beaker if for refilling sprays
+
+/obj/item/organ/cyberimp/arm/janitor/emag_act()
+ . = ..()
+ if(obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ to_chat(usr, "You unlock [src]'s integrated deluxe cleaning supplies!")
+ items_list += new /obj/item/soap/syndie(src) //We add not replace.
+ items_list += new /obj/item/reagent_containers/spray/cyborg_lube(src)
+ return TRUE
+
+/obj/item/organ/cyberimp/arm/service
+ name = "service toolset implant"
+ desc = "A set of miscellaneous gadgets hidden behind a concealed panel on the user's arm."
+ contents = newlist(/obj/item/extinguisher/mini, /obj/item/kitchen/knife/combat/bone/plastic, /obj/item/hand_labeler, /obj/item/pen, /obj/item/reagent_containers/dropper, /obj/item/kitchen/rollingpin, /obj/item/reagent_containers/glass/beaker/large, /obj/item/reagent_containers/syringe,/obj/item/reagent_containers/food/drinks/shaker, /obj/item/radio/off, /obj/item/camera, /obj/item/modular_computer/tablet/preset/cargo)
+
+/obj/item/organ/cyberimp/arm/service/emag_act()
+ . = ..()
+ if(obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ to_chat(usr, "You unlock [src]'s integrated real knife!")
+ items_list += new /obj/item/kitchen/knife/combat/cyborg(src)
+ return TRUE
+
+///////////////
+//Combat Arms//
+///////////////
+
+/obj/item/organ/cyberimp/arm/gun/laser
+ name = "arm-mounted laser implant"
+ desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use."
+ icon_state = "arm_laser"
+ contents = newlist(/obj/item/gun/energy/laser/mounted)
+
+/obj/item/organ/cyberimp/arm/gun/taser
+ name = "arm-mounted taser implant"
+ desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use."
+ icon_state = "arm_taser"
+ contents = newlist(/obj/item/gun/energy/e_gun/advtaser/mounted)
/obj/item/organ/cyberimp/arm/gun/emp_act(severity)
. = ..()
@@ -156,54 +238,6 @@
crit_fail = 1
organ_flags |= ORGAN_FAILING
-
-/obj/item/organ/cyberimp/arm/gun/laser
- name = "arm-mounted laser implant"
- desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use."
- icon_state = "arm_laser"
- contents = newlist(/obj/item/gun/energy/laser/mounted)
-
-/obj/item/organ/cyberimp/arm/gun/laser/l
- zone = BODY_ZONE_L_ARM
-
-
-/obj/item/organ/cyberimp/arm/gun/taser
- name = "arm-mounted taser implant"
- desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use."
- icon_state = "arm_taser"
- contents = newlist(/obj/item/gun/energy/e_gun/advtaser/mounted)
-
-/obj/item/organ/cyberimp/arm/gun/taser/l
- zone = BODY_ZONE_L_ARM
-
-/obj/item/organ/cyberimp/arm/toolset
- name = "integrated toolset implant"
- desc = "A stripped-down version of the engineering cyborg toolset, designed to be installed on subject's arm. Contains all necessary tools."
- contents = newlist(/obj/item/screwdriver/cyborg, /obj/item/wrench/cyborg, /obj/item/weldingtool/largetank/cyborg,
- /obj/item/crowbar/cyborg, /obj/item/wirecutters/cyborg, /obj/item/multitool/cyborg)
-
-/obj/item/organ/cyberimp/arm/toolset/l
- zone = BODY_ZONE_L_ARM
-
-/obj/item/organ/cyberimp/arm/toolset/emag_act()
- . = ..()
- if(locate(/obj/item/kitchen/knife/combat/cyborg) in items_list)
- return
- to_chat(usr, "You unlock [src]'s integrated knife!")
- items_list += new /obj/item/kitchen/knife/combat/cyborg(src)
- return TRUE
-
-/obj/item/organ/cyberimp/arm/esword
- name = "arm-mounted energy blade"
- desc = "An illegal and highly dangerous cybernetic implant that can project a deadly blade of concentrated energy."
- contents = newlist(/obj/item/melee/transforming/energy/blade/hardlight)
-
-/obj/item/organ/cyberimp/arm/medibeam
- name = "integrated medical beamgun"
- desc = "A cybernetic implant that allows the user to project a healing beam from their hand."
- contents = newlist(/obj/item/gun/medbeam)
-
-
/obj/item/organ/cyberimp/arm/flash
name = "integrated high-intensity photon projector" //Why not
desc = "An integrated projector mounted onto a user's arm that is able to be used as a powerful flash."
@@ -231,7 +265,22 @@
var/obj/item/assembly/flash/armimplant/F = locate(/obj/item/assembly/flash/armimplant) in items_list
F.I = src
-/obj/item/organ/cyberimp/arm/surgery
- name = "surgical toolset implant"
- desc = "A set of surgical tools hidden behind a concealed panel on the user's arm."
- contents = newlist(/obj/item/retractor/augment, /obj/item/hemostat/augment, /obj/item/cautery/augment, /obj/item/surgicaldrill/augment, /obj/item/scalpel/augment, /obj/item/circular_saw/augment, /obj/item/surgical_drapes)
+/obj/item/organ/cyberimp/arm/esword
+ name = "arm-mounted energy blade"
+ desc = "An illegal and highly dangerous cybernetic implant that can project a deadly blade of concentrated energy."
+ contents = newlist(/obj/item/melee/transforming/energy/blade/hardlight)
+
+/obj/item/organ/cyberimp/arm/shield
+ name = "arm-mounted riot shield"
+ desc = "A deployable riot shield to help deal with civil unrest."
+ contents = newlist(/obj/item/shield/riot/implant)
+
+/obj/item/organ/cyberimp/arm/shield/emag_act()
+ . = ..()
+ if(obj_flags & EMAGGED)
+ return
+ obj_flags |= EMAGGED
+ to_chat(usr, "You unlock [src]'s high-power flash!")
+ var/obj/item/assembly/flash/armimplant/F = new(src)
+ items_list += F
+ F.I = src
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index 01cd4acbed..a678482ef3 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -105,11 +105,8 @@
..()
if(crit_fail || !(organ_flags & ORGAN_FAILING))
return
- owner.adjustStaminaLoss(-3.5) //Citadel edit, makes it more useful in Stamina based combat
- if(owner.AmountStun() > STUN_SET_AMOUNT)
- owner.SetStun(STUN_SET_AMOUNT)
- if(owner.AmountKnockdown() > STUN_SET_AMOUNT)
- owner.SetKnockdown(STUN_SET_AMOUNT)
+ owner.adjustStaminaLoss(-3.5, FALSE) //Citadel edit, makes it more useful in Stamina based combat
+ owner.HealAllImmobilityUpTo(STUN_SET_AMOUNT)
/obj/item/organ/cyberimp/brain/anti_stun/emp_act(severity)
. = ..()
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index bdd1a444bb..a915d12838 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -377,3 +377,7 @@
name = "insect eyes"
desc = "These eyes seem to have increased sensitivity to bright light, with no improvement to low light vision."
flash_protect = -1
+
+/obj/item/organ/eyes/ipc
+ name = "ipc eyes"
+ icon_state = "cybernetic_eyeballs"
\ No newline at end of file
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 5767e84c73..547ca38ead 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -222,9 +222,8 @@ obj/item/organ/heart/cybernetic/upgraded/on_life()
/obj/item/organ/heart/ipc
name = "IPC heart"
- desc = "An electronic pump that regulates hydraulic functions, they have an auto-restart after EMPs."
+ desc = "An electronic pump that regulates hydraulic functions, the electronics have EMP shielding."
icon_state = "heart-c"
- organ_flags = ORGAN_SYNTHETIC
/obj/item/organ/heart/freedom
name = "heart of freedom"
diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm
index 680d2389de..73225fc41c 100755
--- a/code/modules/surgery/organs/liver.dm
+++ b/code/modules/surgery/organs/liver.dm
@@ -95,6 +95,10 @@
icon_state = "liver-p"
desc = "A large crystal that is somehow capable of metabolizing chemicals, these are found in plasmamen."
+/obj/item/organ/liver/ipc
+ name = "reagent processing liver"
+ icon_state = "liver-c"
+
/obj/item/organ/liver/cybernetic
name = "cybernetic liver"
icon_state = "liver-c"
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index 91153655d3..ac2b34b855 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -2,6 +2,7 @@
/obj/item/organ/lungs
name = "lungs"
+ desc = "Looking at them makes you start manual breathing."
icon_state = "lungs"
zone = BODY_ZONE_CHEST
slot = ORGAN_SLOT_LUNGS
@@ -349,7 +350,7 @@
//Miasma sickness
if(prob(0.05 * miasma_pp))
- var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3)
+ var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(TRUE, 2,3)
miasma_disease.name = "Unknown"
miasma_disease.try_infect(owner)
@@ -462,6 +463,10 @@
S.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 5)
return S
+/obj/item/organ/lungs/ipc
+ name = "ipc lungs"
+ icon_state = "lungs-c"
+
/obj/item/organ/lungs/plasmaman
name = "plasma filter"
desc = "A spongy rib-shaped mass for filtering plasma from the air."
@@ -543,4 +548,4 @@
/obj/item/organ/lungs/yamerol/on_life()
..()
- damage += 2 //Yamerol lungs are temporary
+ damage += 2 //Yamerol lungs are temporary
\ No newline at end of file
diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm
index 94f88cbe67..3b383581cf 100755
--- a/code/modules/surgery/organs/stomach.dm
+++ b/code/modules/surgery/organs/stomach.dm
@@ -96,3 +96,7 @@
name = "digestive crystal"
icon_state = "stomach-p"
desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen."
+
+/obj/item/organ/stomach/ipc
+ name = "ipc stomach"
+ icon_state = "stomach-ipc"
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index c9596e3754..7c849dbd68 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -272,7 +272,7 @@
cooldown = COOLDOWN_STUN
for(var/V in listeners)
var/mob/living/L = V
- L.Knockdown(60 * power_multiplier)
+ L.DefaultCombatKnockdown(60 * power_multiplier)
//SLEEP
else if((findtext(message, sleep_words)))
@@ -492,10 +492,10 @@
for(var/V in listeners)
var/mob/living/L = V
if(L.resting)
- L.lay_down() //aka get up
- L.SetStun(0)
- L.SetKnockdown(0)
- L.SetUnconscious(0) //i said get up i don't care if you're being tased
+ L.set_resting(FALSE, FALSE, FALSE)
+ L.SetAllImmobility(0, FALSE)
+ L.SetUnconscious(0, FALSE) //i said get up i don't care if you're being tased
+ L.update_mobility()
//SIT
else if((findtext(message, sit_words)))
@@ -1205,7 +1205,7 @@
var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)
switch(E.phase)
if(2 to INFINITY)
- L.Knockdown(30 * power_multiplier * E.phase)
+ L.DefaultCombatKnockdown(30 * power_multiplier * E.phase)
E.cooldown += 8
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You suddenly drop to the ground!"), 5)
to_chat(user, "You encourage [L] to drop down to the ground.")
@@ -1422,10 +1422,8 @@
var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)
switch(E.phase)
if(3 to INFINITY)//Tier 3 only
- if(L.resting)
- L.lay_down() //aka get up
- L.SetStun(0)
- L.SetKnockdown(0)
+ L.set_resting(FALSE, TRUE, FALSE)
+ L.SetAllImmobility(0)
L.SetUnconscious(0) //i said get up i don't care if you're being tased
E.cooldown += 10 //This could be really strong
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "You jump to your feet from sheer willpower!"), 5)
diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm
index 959f096d05..b0808cef5e 100644
--- a/code/modules/tgui/states.dm
+++ b/code/modules/tgui/states.dm
@@ -70,7 +70,7 @@
return ..()
/mob/living/silicon/robot/shared_ui_interaction(src_object)
- if(!cell || cell.charge <= 0 || lockcharge) // Disable UIs if the Borg is unpowered or locked.
+ if(!cell || cell.charge <= 0 || locked_down) // Disable UIs if the Borg is unpowered or locked.
return UI_DISABLED
return ..()
diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm
index d4437e17d5..dc6cccb9a9 100644
--- a/code/modules/vehicles/cars/car.dm
+++ b/code/modules/vehicles/cars/car.dm
@@ -29,8 +29,8 @@
last_enginesound_time = world.time
playsound(src, engine_sound, 100, TRUE)
-/obj/vehicle/sealed/car/MouseDrop_T(atom/dropping, mob/M)
- if(!M.canmove || M.stat || M.restrained())
+/obj/vehicle/sealed/car/MouseDrop_T(atom/dropping, mob/living/M)
+ if(!istype(M) || !CHECK_MOBILITY(M, MOBILITY_USE))
return FALSE
if(isliving(dropping) && M != dropping)
var/mob/living/L = dropping
diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm
index 73ba785ec2..2b9890b863 100644
--- a/code/modules/vehicles/cars/clowncar.dm
+++ b/code/modules/vehicles/cars/clowncar.dm
@@ -52,7 +52,7 @@
var/mob/living/L = M
if(iscarbon(L))
var/mob/living/carbon/C = L
- C.Knockdown(40) //I play to make sprites go horizontal
+ C.DefaultCombatKnockdown(40) //I play to make sprites go horizontal
L.visible_message("[src] rams into [L] and sucks him up!") //fuck off shezza this isn't ERP.
mob_forced_enter(L)
playsound(src, pick('sound/vehicles/clowncar_ram1.ogg', 'sound/vehicles/clowncar_ram2.ogg', 'sound/vehicles/clowncar_ram3.ogg'), 75)
diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm
index 0dd7ff32a8..cb53574653 100644
--- a/code/modules/vehicles/scooter.dm
+++ b/code/modules/vehicles/scooter.dm
@@ -71,7 +71,7 @@
var/atom/throw_target = get_edge_target_turf(H, pick(GLOB.cardinals))
unbuckle_mob(H)
H.throw_at(throw_target, 4, 3)
- H.Knockdown(100)
+ H.DefaultCombatKnockdown(100)
H.adjustStaminaLoss(40)
var/head_slot = H.get_item_by_slot(SLOT_HEAD)
if(!head_slot || !(istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/hardhat)))
@@ -199,7 +199,7 @@
var/atom/throw_target = get_edge_target_turf(H, pick(GLOB.cardinals))
unbuckle_mob(H)
H.throw_at(throw_target, 4, 3)
- H.Knockdown(30)
+ H.DefaultCombatKnockdown(30)
H.adjustStaminaLoss(10)
var/head_slot = H.get_item_by_slot(SLOT_HEAD)
if(!head_slot || !(istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/hardhat)))
diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm
index 30ae49ecd2..fc81e2ec00 100644
--- a/code/modules/vehicles/sealed.dm
+++ b/code/modules/vehicles/sealed.dm
@@ -93,7 +93,7 @@
mob_exit(i, null, randomstep)
if(iscarbon(i))
var/mob/living/carbon/Carbon = i
- Carbon.Knockdown(40)
+ Carbon.DefaultCombatKnockdown(40)
/obj/vehicle/sealed/proc/DumpSpecificMobs(flag, randomstep = TRUE)
for(var/i in occupants)
@@ -101,7 +101,7 @@
mob_exit(i, null, randomstep)
if(iscarbon(i))
var/mob/living/carbon/C = i
- C.Knockdown(40)
+ C.DefaultCombatKnockdown(40)
/obj/vehicle/sealed/AllowDrop()
diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm
index 6526e6d89a..a560cbb8f3 100644
--- a/code/modules/vehicles/speedbike.dm
+++ b/code/modules/vehicles/speedbike.dm
@@ -76,7 +76,7 @@
playsound(src, 'sound/effects/bang.ogg', 50, 1)
if(ishuman(A))
var/mob/living/carbon/human/H = A
- H.Knockdown(100)
+ H.DefaultCombatKnockdown(100)
H.adjustStaminaLoss(30)
H.apply_damage(rand(20,35), BRUTE)
if(!crash_all)
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index d368a9bbca..ba5e511612 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -32,24 +32,29 @@
icon_state = "medidrobe"
product_ads = "Make those blood stains look fashionable!!"
vend_reply = "Thank you for using the MediDrobe!"
- products = list(/obj/item/clothing/accessory/pocketprotector = 3,
- /obj/item/clothing/head/beret/med = 3,
- /obj/item/storage/backpack/duffelbag/med = 3,
- /obj/item/storage/backpack/medic = 3,
- /obj/item/storage/backpack/satchel/med = 3,
- /obj/item/clothing/suit/hooded/wintercoat/medical = 3,
- /obj/item/clothing/under/rank/nursesuit = 3,
- /obj/item/clothing/head/nursehat = 3,
+ products = list(/obj/item/clothing/accessory/pocketprotector = 5,
+ /obj/item/clothing/head/beret/med = 5,
+ /obj/item/storage/backpack/duffelbag/med = 5,
+ /obj/item/storage/backpack/medic = 5,
+ /obj/item/storage/backpack/satchel/med = 5,
+ /obj/item/clothing/suit/hooded/wintercoat/medical = 5,
+ /obj/item/clothing/under/rank/nursesuit = 5,
+ /obj/item/clothing/head/nursehat = 5,
/obj/item/clothing/under/rank/medical/skirt= 5,
- /obj/item/clothing/under/rank/medical/blue = 2,
- /obj/item/clothing/under/rank/medical/green = 2,
- /obj/item/clothing/under/rank/medical/purple = 2,
+ /obj/item/clothing/under/rank/medical/blue = 5,
+ /obj/item/clothing/under/rank/medical/green = 5,
+ /obj/item/clothing/under/rank/medical/purple = 5,
/obj/item/clothing/under/rank/medical = 5,
+ /obj/item/clothing/under/rank/medical/paramedic = 5,
+ /obj/item/clothing/under/rank/medical/paramedic/light = 5,
+ /obj/item/clothing/under/rank/medical/paramedic/skirt = 5,
+ /obj/item/clothing/under/rank/medical/paramedic/skirt/light = 5,
/obj/item/clothing/suit/toggle/labcoat = 5,
+ /obj/item/clothing/suit/toggle/labcoat/paramedic = 5,
/obj/item/clothing/suit/toggle/labcoat/emt = 5,
/obj/item/clothing/shoes/sneakers/white = 5,
/obj/item/clothing/head/soft/emt = 5,
- /obj/item/clothing/suit/apron/surgical = 3,
+ /obj/item/clothing/suit/apron/surgical = 5,
/obj/item/clothing/mask/surgical = 5)
refill_canister = /obj/item/vending_refill/wardrobe/medi_wardrobe
diff --git a/code/modules/vore/eating/vore.dm b/code/modules/vore/eating/vore.dm
index 35f0653617..abb5bbb988 100644
--- a/code/modules/vore/eating/vore.dm
+++ b/code/modules/vore/eating/vore.dm
@@ -108,6 +108,7 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums)
digestable = json_from_file["digestable"]
devourable = json_from_file["devourable"]
feeding = json_from_file["feeding"]
+ lickable = json_from_file["lickable"]
vore_taste = json_from_file["vore_taste"]
belly_prefs = json_from_file["belly_prefs"]
@@ -118,6 +119,8 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums)
devourable = FALSE
if(isnull(feeding))
feeding = FALSE
+ if(isnull(lickable))
+ lickable = FALSE
if(isnull(belly_prefs))
belly_prefs = list()
@@ -133,6 +136,7 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums)
"digestable" = digestable,
"devourable" = devourable,
"feeding" = feeding,
+ "lickable" = lickable,
"vore_taste" = vore_taste,
"belly_prefs" = belly_prefs,
)
diff --git a/code/modules/vore/persistence.dm b/code/modules/vore/persistence.dm
index 078a3f48ee..f45a759fa3 100644
--- a/code/modules/vore/persistence.dm
+++ b/code/modules/vore/persistence.dm
@@ -78,12 +78,12 @@ in their list
/proc/list_to_object(var/list/data, var/loc)
if(!islist(data))
- throw EXCEPTION("You didn't give me a list, bucko")
+ stack_trace("You didn't give me a list, bucko")
if(!("type" in data))
- throw EXCEPTION("No 'type' field in the data")
+ stack_trace("No 'type' field in the data")
var/path = text2path(data["type"])
if(!path)
- throw EXCEPTION("Path not found: [path]")
+ stack_trace("Path not found: [path]")
var/atom/movable/thing = new path(loc)
thing.deserialize(data)
diff --git a/config/config.txt b/config/config.txt
index 0ab0cc911e..1d987070dd 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -184,6 +184,15 @@ VOTE_DELAY 6000
## time period (deciseconds) which voting session will last (default 1 minute)
VOTE_PERIOD 600
+## autovote initial delay (deciseconds) before first automatic transfer vote call (default 120 minutes)
+VOTE_AUTOTRANSFER_INITIAL 72000
+
+## autovote delay (deciseconds) before sequential automatic transfer votes are called (default 30 minutes)
+VOTE_AUTOTRANSFER_INTERVAL 18000
+
+## autovote maximum votes until automatic transfer call (default 4)
+VOTE_AUTOTRANSFER_MAXIMUM 4
+
## prevents dead players from voting or starting votes
# NO_DEAD_VOTE
diff --git a/config/game_options.txt b/config/game_options.txt
index b2b0ac0abd..5be76ae60d 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -531,6 +531,9 @@ LAVALAND_BUDGET 60
## Space Ruin Budged
Space_Budget 16
+## Station Ruin Budget
+STATION_SPACE_BUDGET 10
+
## Time in ds from when a player latejoins till the arrival shuttle docks at the station
## Must be at least 30. At least 55 recommended to be visually/aurally appropriate
ARRIVALS_SHUTTLE_DOCK_WINDOW 55
diff --git a/config/jobs.txt b/config/jobs.txt
index a0c1ffa970..1bf271763b 100644
--- a/config/jobs.txt
+++ b/config/jobs.txt
@@ -31,6 +31,7 @@ Station Engineer=5,5
Atmospheric Technician=3,2
Medical Doctor=5,3
+Paramedic=2,2
Chemist=2,2
Geneticist=2,2
Virologist=1,1
@@ -43,4 +44,4 @@ Detective=1,1
Security Officer=5,5
AI=0,1
-Cyborg=0,1
\ No newline at end of file
+Cyborg=0,1
diff --git a/config/maps.txt b/config/maps.txt
index 6792cb9468..4bd2b1ce8a 100644
--- a/config/maps.txt
+++ b/config/maps.txt
@@ -40,4 +40,7 @@ map runtimestation
endmap
map multiz_debug
+endmap
+
+map kilostation
endmap
\ No newline at end of file
diff --git a/config/stationRuinBlacklist.txt b/config/stationRuinBlacklist.txt
new file mode 100644
index 0000000000..86a5e06a32
--- /dev/null
+++ b/config/stationRuinBlacklist.txt
@@ -0,0 +1,12 @@
+#Listing maps here will blacklist them from generating in station space.
+#Maps must be the full path to them
+#A list of maps valid to blacklist can be found in _maps\RandomRuins\StationRuins\Space
+#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
+
+#_maps/RandomRuins/StationRuins/Space/roid1.dmm
+#_maps/RandomRuins/StationRuins/Space/roid2.dmm
+#_maps/RandomRuins/StationRuins/Space/roid3.dmm
+#_maps/RandomRuins/StationRuins/Space/roid4.dmm
+#_maps/RandomRuins/StationRuins/Space/roid5.dmm
+#_maps/RandomRuins/StationRuins/Space/roid6.dmm
+#_maps/RandomRuins/StationRuins/Space/roid7.dmm
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index 349a8ce012..fc78fc33a1 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,555 @@
-->
+
26 February 2020
+
AnturK ported by kevinz000 updated:
+
+ - Dueling pistols have been added.
+
+
Arturlang updated:
+
+ - Replaces a lot of ingame UIs with TGUI next, increasing performance drastically.
+ - Each night for bloodsuckers will last longer due to the sun dimming.
+ - You cant level up for free, now you have to pay blood for power.
+ - Bloodsuckers are no longer as resistant to hard stuns and regenerate less stamina. and a lot of their cooldowns are a lot higher.
+ - Removed text macros from the chem dispenser.
+ - Replaced with dispenser input recording macros.
+ - Fancifying makeshift switchblades now works
+ - Shields will no longer block lasers, and will break if they take too much damage.
+ - Added a TGUI Next interface for crafting
+ - Removed the old TGUI slow crafting interface
+ - The MK2 hypospray now
+ - The debug outfit is now kitted out for whatever debbuging needs.
+ - Fixed the pandemic naming and the radiation healing symptom UI crashing
+ - Hyposprays now switch modes on CTRL click, instead of alt, as it was already reserved for dispension amount.
+ - Nanite interfaces have gotten a rework to TGUI Next, and can now support sub-programs. add:Adds the nanite sting program, which will allow you to manually sting people to give them nanites, changeling style.
+ - The pandemic can no longer make vaccines or synthblood as quickly.
+ - The syndicate uplinks interface has been redone in TGUI Next
+ - Valentines can now be converted by bloodsuckers
+
+
Bhijn updated:
+
+ - Click-dragging will now only perform the quick item usage behavior if you're in combat mode.
+
+
BlueWildrose updated:
+
+ - podpeople tail wagging
+ - lifebringer ghost role fixes
+
+
BuffEngineering, nemvar. updated:
+
+ - Addicts can now feel like they're getting their fix or kicking it.
+ - Aheals now remove addictions and restore your mood to default.
+
+
CameronWoof updated:
+
+ - Lighting looks better now. I can say that because the PR wouldn't be merged and you wouldn't be reading this if it wasn't true.
+ - Ammonia and saltpetre can now be made at the biogenerator.
+
+
Commandersand updated:
+
+ - uplink centcomm suit doesn't have sensors
+
+
DeltaFire15 updated:
+
+ - Nar'Sie runes no longer benefit from runed floors.
+
+
Detective-Google updated:
+
+ - the POOL. remove: boxstation dorms 7
+ - valentines candy no longer prefbreaks
+ - Loudness Booster pAI program
+ - Encryption Key pAI program
+
+
EmeraldSundisk updated:
+
+ - Connects mining's disposal unit on Delta.
+ - Slight visual adjustments to the immediate affected area.
+
+
Feasel updated:
+
+ - Buffed dissection success chances.
+
+
Ghommie updated:
+
+ - The anomalous honking crystal should now properly clown your mind.
+ - Stopped the ellipsis question mark from being displayed twice in the examine message for masked/unknown human mobs.
+ - Made the aforementioned ellipsis question mark display on flavor-text-less masked/unknown human mobs too for consistency.
+ - Stopped an APTFT exploit with spray bottles.
+ - Fixed the detective revolver being quite risky to use.
+ - Hair styles and undergarments are yet again free from gender restrictions.
+ - Clown ops will find bombananas and clown bomb beacons instead of minibombs and bomb beacons in their infiltrator ship now.
+ - For safety, the syndicate shuttle minibombs and bombananas come shipped in a box. Please don't instinctively eat any of those nanas, thank you.
+ - Uplink items excluded (such as mulligan, chameleon, ebow) from or exclusive (such as cyber implants) to normal nuke ops will now be properly unavailable/available to clown ops.
+ - Fixed bananium energy sword/shield slips.
+ - Buffed said slips to ignore no-grav/crawling/flying as well as adding some deadly force to the e-sword.
+ - Fixed the 'stache grenade anti-non-clumsy user check.
+ - Doubled the timer for the sticky mustaches effect from the above grenade (from 1 to 2 minutes)
+ - Fixed an edge case with the chaplain armaments beacon spawning the box in nullspace.
+ - The playback device's cooldown now proportionally increases with messages longer than 60 characters (3 seconds is the default assembly cooldown).
+ - Fixed space ninjas "Nothing" objective. Now you gotta steal some dandy stuff such as corgi meat and pinpointers as a ninja too.
+ - Fixed maploaded APC terminals direction.
+ - Nerfed magnetic rifles/pistols by re(?)adding power cell requirements for it. These firearms must be recharged after firing 2 magazines worth of projectiles and are slightly more susceptible to EMPs.
+ - Fixed the tearstache nade not properly working.
+ - Buffed it against space helmet internals.
+ - Holographic fans won't display above mobs and other objects anymore.
+ - Fixed paraplegics appearing as shoeless.
+ - Fixed the petting element.
+ - Fixed slipping.
+ - Refactored mob holders into an element.
+ - Fixed a few minor issues with that feature. such as mismatching sprites for certain held mobs and a slight lack of safety checks.
+ - holdable mobs can't force themselves into people's hands anymore.
+ - Milkies fix.
+ - Fixed some mounted defibrillator issue with the altclicking functionality.
+ - Fixed no-grav lavaland labor/mining shuttle areas.
+ - Fixed a little issue with sleeper UI and blood types.
+ - Fixing accidental nerfs to the magpistol magazine.
+ - The Lavaland's Herald speech sound should only play if they are actually speaking.
+ - Nerfed cargo passive points generation from 500 to 125 creds per minute.
+ - Fixed whitelisted/donor loadouts
+ - Childproofs double-esword and hypereuplastic blade toys.
+ - Some reagent holders (such as cigarettes, food) are not suitable for reagents export anymore, while unprocessed botany crops will only net 1/3 of the standard reagents values.
+ - Export scanners now include the reagents value in the price report.
+ - Fixed a little inconvenience with the character setup preview dummy having extra unwarranted bits.
+ - Stopped role restricted uplink items from being discounted despite not being purchasable most times.
+ - Missing words replacement file for the gondola mask.
+ - Fixed an issue with the nearsighted prescription glasses taking over worn eyewear.
+ - Fixed AI unanchoring not properly removing the no teleport trait. My bad.
+ - Fixed another issue with hering comsig.
+ - Fixed dozen missing privates sprites.
+ - A little fix concerning some R&D and reagents.
+ - Further mob holder fixes.
+ - Fixed being unable to dump a trash bag's contents directly into disposal bins.
+ - Doubled the halved flavor text maximum length.
+ - Reduced tongue organ damage and tasting pH message spam.
+ - Fixed agent IDs not registering the inputted name. Thanks MrPerson.
+ - Fixed solar panels/trackers (de)construction being a bit wonky.
+ - Fixed something about slime blood and the law of conservation of mass.
+ - Fixed flypeople being emetic machine guns.
+ - Fixed virology being unable to be done with synthetic blood.
+ - Renamed "blaster carbine" and "blaster rifles" back to "energy gun" and "laser gun" respectively
+ - Fixed magnetic rifles & co being inconsistent with printed energy guns and start with an empty power cell.
+ - Reverted practice laser gun sprites back to their former glory. Mostly.
+ - Fixed sprint buffer cost and regen being rounded down.
+ - Nerfed the fermenting barrel export industry.
+ - Reagent dispensers selling price no longer takes in account the reagents volume. It's already handled by reagents export.
+ - pAIs are yet again unable to perform certain silicon interactions with machineries yet again.
+ - Fixed pAI radios inability to be toggled on/off.
+
+
Ghommie (original PRs by Floyd/Qustinnus, 4Dplanner, Willox, ninjanomnom, mrdoombringer, Fikou, Fox McCloud, TheChosenEvilOne, nemvar, bobbahbrown, Time-Green, Stonebaykyle, MrPerson, ArcaneMusic and zxaber) updated:
+
+ - You can now make toolboxes out of almost any solid material in an autolathe
+ - adds Knight's Armour made out of any materials
+ - new ruin found in lavaland protected by dark wizards, I wonder what they're guarding
+ - You can now put a bunch more mats in the coin mint and autolathe
+ - Adamantine and Mythril are now materials (Adamantine still only from xenobio, Mythril still only from badminnery). Adamantine boosts an item's force by 1.5, Mythril gives an item RPG statistics.
+ - most custom sprites for coins have been lost
+ - You can now give your ass acute radiation poisoning
+ - floydmats now apply to all objs / items
+ - you can now make tables and chairs out of any material
+ - Fixes being able to exploit fully upgraded destructive analyzers to multiply materials
+ - An old monastery from a previously abandoned sector of space has recently resurfaced in some regions surrounding the station.
+ - Latent scans of the surrounding systems have picked up trace signs of new, smaller cult constructs, however these signatures quickly vanished.
+ - In other news, scavengers in your sector have been seen occasionally with classically recreated maces, so autolathe firmware has been upgraded to accommodate this.
+
+
Hatterhat updated:
+
+ - Zombie powder is now instant when ingested, but delayed when injected or applied through touch.
+ - The H.E.C.K. suit is now goliath tentacle resistant and probably better for acid resistance.
+ - The Engineering techfab can now print standard and large RCD compressed matter cartridges.
+ - The Experimental Tools node now has the Combifan projector, blocking both temperature and atmospheric changes.
+ - fiddles with the seed extractor upgrade examine to make it not shit
+ - Formaldehyde prevents organ decay and corpses' miasma production at 1u in the body.
+ - Epinephrine pens now contain 3u formaldehyde. This should not kill you.
+ - The ships often crashed by Free Golems on Lavaland now have GPSes. They're off, by default, but an awakening Golem could easily turn one on.
+ - Standard RCD ammo can now be printed from Engineering-keyed techfabs once you hit Industrial Engineering.
+ - Consoleless interfaces are now default - this means unrestricted protolathes and circuit imprinters can now be interfaced with by interacting with the machine itself.
+ - Multitools can now actually be printed from Engineering and Science protolathes/techfabs once you unlock Basic Tools.
+ - Husking (from being burned to shit) can now be reverted! 5u rezadone or 100u synthflesh, at below 50 burn.
+ - Turning a body into a burnt husk now takes more effort. 300 burn's worth of effort.
+ - Buckshot individual pellet damage up from 10 to 12.5. Still firing 6 pellets.
+ - Preservahyde! Made with water, bromine, and formaldehyde, it doesn't decay into histamine. Instead, it just prevents your organs from rotting into nothing.
+ - You can now purify eldritch longswords with a bible. This creates purified longswords, which do not have anti-magic properties, but are still good for swinging at cultists.
+ - Extend votes! Ported from Hyper, ported from AUstation.
+ - mechs with stock parts now have icons
+ - Pie reagent transfer now requires an uncovered mouth.
+ - Biogenerators can now actually generate universal enzyme.
+ - The Basic Tools node now unlocks the multitool for printing on Engineering and Science fabricators.
+ - The Ash Walkers' nest on Lavaland now starts with three bowyery slabs.
+ - You can now welder-harden arrows. It might take longer.
+ - Silkstring's costs adjusted for bows and whatnot.
+ - Grammar adjusted on a lot of things relating to bows.
+ - Pipe bows' bowstring doesn't look like it replicated itself upon draw.
+
+
IHOPMommyLich updated:
+
+ - Changed the multiplicative_slowdown of Stimulants from -1 to -0.5
+
+
IronEleven updated:
+
+ - Minor stat changes to Choking, Spontaneous Combustion, Autophagocytosis Necrosis, Hallucigen, Narcolepsy, Shivering, and Vomiting symptoms.
+
+
KathrinBailey updated:
+
+ - Missing turf_decals in Cargo Office.
+ - Turns on the docking beacons on Box.
+ - Fixes Starboard Quarter maint room being spaced. It was never intended to be like how it was.
+ - The aforementioned maint room not having stuff in it.
+ - varedited photocopier sometimes not opening any UI.
+ - Atmos differences in Starboard Quarter maint.
+ - Atmos differences in destroyed shuttle/EVA bridge. Plating replaced with airless plating.
+ - Rotates AI satellite computers. These have probably been like this since computers had the old sprites and no directional ones. You shouldn't sit at a chair to operate a sideways computer.
+
+
KrabSpider updated:
+
+ - The Van Dyke is no longer Fu Manchu.
+ - Gets rid of a Fu Manchu imitation.
+
+
Kraseo updated:
+
+ - You can no longer pull before wearing boxing gloves to bypass the grab check.
+ - Nightmares no longer delete entire guns from existence for merely having a light on them.
+
+
Linzolle updated:
+
+ - Bows now will not delete an arrow if it cant fire it.
+ - bows now like and respect sprite changes
+
+
MalricB updated:
+
+ - "Shaggy" sprite from virgo
+ - "shaggy" option in the character customization
+
+
MrJWhit updated:
+
+ - Removed meteor defense tech node
+ - TEG
+
+
Naksu updated:
+
+ - Odysseus chem synthesizing now works again.
+
+
Owai-Seek updated:
+
+ - Burger, Cargo Packaging, Dirty Magazine, Air Pump, and Scrubber crates.
+ - Duplicate Crate, Festive Wrapping Paper Crate, Contraband Monkey Meat Crate
+ - Gave Seed Crate Ambrosia Seed, gave Biker Gang Crate Spraypaint.
+ - Organised some crates with sub-categories. Also, moved all vendor refills to a new tab.
+ - Moved Grill to Service Tab
+ - Engineering Hardsuit Access
+ - Blood Crate now has all of the current blood types.
+ - Birthday Cake Recipe is now the same as TG.
+ - Added Soy Sauce and BBQ Packets to Dinnerware Vendor.
+ - Added nurse outfit, nurse cap, and mailman hat to loadout.
+ - Changed the name of scrubs to blue, green, and purple scrubs.
+ - Bacon and Eggs food item. Delicious! Added a Lemony Poppy Seed Muffin.
+ - Snack Vendor has Chocolates, Tortilla Chips, and a Marshmallow Box
+ - Mops can now be printed at service lathe once tools are researched.
+ - Biobags can hold most organic limbs/organs, but not brains, implants, or cybernetics.
+ - Trash Bag can now hold limbs (but not heads.)
+ - Most snack vendor items reduced by 1.
+ - Trash Cans are now actually craftable, and only require metal instead of plastic.
+ - Bacon and Eggs, Drying Agent Bottle.
+ - Mugs now show reagent colors of contained reagents. Thanks Seris!
+ - Reorganized all food recipes, (hopefully) making things easier to find.
+ - Trays now have a whitelist, allowing them to pick up normal sized foods, bowls, glassware, booze, ect.
+ - Easter foods are no longer their own Misc Food Category on the top of the menu.
+ - fixed a few typos/capitalization consistency.
+ - Mexican Foods are their own Subcategory.
+ - Donuts are their own Subcategory
+ - Moved Sweets from Misc Food in with Pies. Renamed to Pies & Sweets
+ - BROOM
+ - Janitor Vendor now has gear for two Janitors.
+
+
PersianXerxes updated:
+
+ - SMES and PACMAN attached to gulag Security to power electrified windows remove: Removed Sec vendor from gulag Security
+ - Separation of gulag and public mining
+ - Better clarified the comment explaining the contraband tag.
+ - Cargo nuclear defusal kits now require an emag'd drop pod console to be purchased.
+ - Added Kilo Station
+ - Adjusts Kilo Station to be more in line with Citadel standards
+ - Added area icons required to make Kilo Station editable on Citadel code
+ - Fixed a reagent container on Kilo pointing to a nonexistent reagent
+ - Adds Kilo Station to the maps config file, does not fix Meta Station's population requirement
+
+
Psody-Mordheim updated:
+
+ - You can now make synth-flesh with synthetic blood.
+ - You can now make synthetic blood via mixing saline glucose, iron, stable plasma and heating it to 350 temp.
+ - You can mix synthetic blood and cryoxadone to create synth-meat in addition to normal blood.
+ - Disfiguration Symptom.
+ - Deoxyribonucleic Acid Saboteur Symptom.
+ - Polyvitiligo Symptom.
+ - Revitiligo Symptom.
+ - Vitiligo Symptom.
+
+
Putnam3145 updated:
+
+ - Added logging to various consent things.
+ - Lots of new traitor objectives
+ - gender change potion now respects prefs
+ - Hypno prefs work better.
+ - Panic bunker is now round-to-round persistent
+ - Relief valve now has a TGUI-next UI
+ - Atmos reaction priority works now.
+ - map voting doesn't suck anymore
+ - Dynamic now defaults to "classic" storyteller instead of just failing if the vote didn't choose a storyteller.
+ - antag quirk blacklisting works now
+ - default should be... default
+ - all supermatter damage is now hardcapped
+ - Supermatter sabotage objective no longer shows up with no supermatter
+ - Mining vendors no longer fail and eat your points iff you have precisely enough points to pay for an item
+ - Licking pref
+ - Fixed IRV.
+ - Runtime if nobody has a chaos pref set
+ - IRV fixed... again
+ - temporary flavor text can now be of reasonable length
+ - Shooting the supermatter now adds to the supermatter's power. CO2 setups beware!
+ - Logging for renaming
+
+
Raiq & Linzolle updated:
+
+ - Bone bow - Ash walkers crafting , bone arrows - Ash walkers crafting, silk string used in bow crafting, harden arrows - Ash walkers crafting, ash walker only crafting book, basic pipe bow, and bow & arrow selling. Quivers for ash walkers as well, just to hold some arrows well out on the hunt!
+
+
Seris02 updated:
+
+ - tweaked the way the SM works
+ - custom reagent pie smite
+ - hijack implant
+ - changed mentions of the issilion proc to hasSiliconAccessInArea based on what the proc is used for
+ - recipe for mammal mutation toxin
+ - polychromic winter coat
+ - thief's gloves
+ - crushing magboots
+ - golden plastitanium toolbox being actually plastitanuium
+ - character slot amount
+ - rebalanced rising bass
+ - string highlighting whitespace
+ - glitch with PKA
+ - meteor hallucinations (again)
+ - Added naked hallucination
+ - crowbarring manifests off crates
+ - makes RCDs cost a better amount
+ - apc icons
+ - rest hotkey
+ - hsl instead of sum of rgb for spraycan lum check
+ - bloodcrawl's cooldown
+
+
ShadeAware updated:
+
+ - Craftable Switchblades, a weaker subtype of normal switchblades that can be crafted using a Kitchen Knife, Modular Receiver, Rifle Stock and some Cable Coil. Requires a welder to complete.
+ - You can now actually craft Switchblades.
+ - Switchblades no longer regain their old Makeshift sprite after retracting if you've made them fancy with Silver.
+ - The Captain's Wardrobe, a special one-of-a-kind and ID-locked wardrobe for the Captain that holds all of their snowflakey gear. Remove: Snowflake gear from the Captain's locker, since now it has its own vendor.
+
+
Tlaltecuhtli, ported by Hatterhat updated:
+
+ - Ripley, Firefighter, Odysseus and H.O.N.K. mechs now also use scanning modules and capacitors on construction. This means that they also gain reduced power consumption and EMP protection from higher-tier stock parts.
+
+
Trilbyspaceclone updated:
+
+ - Vault hallway door being all access
+ - Updates change logs
+ - Crafts are now made of plasteel and can be made with 5 sheets
+ - Takes away NT's connections to the Aliens that run the Syndicats
+ - Carps have evolved to take more damage
+ - restock crates for each vender
+ - restock units for all station venders
+ - Sec-vender missing icon
+ - Box station captain office issues maping: Gulag on box can now be accessed
+ - Alien stools and chairs
+ - Bone armor/Dagger are now crafting from bones rather then crafting menu
+ - Firing pins that only works when not on station
+ - Medical locked crates
+ - Russian gear crates have less gear in some cases but all will cost more
+ - Medical locked crates that were not locked
+ - Crates that were out of date are corrected
+ - Heads of staff have been better screened by NT before being promoted
+ - The suit full of spiders also known as a ninja now is a tactical turtleneck
+ - The Wiznerds now dont have suits set to max
+ - Meat wheat no longer has blood
+ - Flat guns can no longer be suppressed
+ - replaced stickmans .45 caliber with 10mm, for consistency.
+ - Meatwheat and Oats now have rarity
+ - Oats now have at lest 50% more flour in them
+ - BDM now uses a PKA rather then a normal KA
+ - Gang tower shield is no longer transparent
+ - Cosmic winter coat now glows like the bedsheet, and holds normal winter coat gear
+ - Express console is now logging what it buys, like the normal console should
+ - Crabs are now made of crab meat.
+ - AIs now understand the old ways of drunken dwarfs
+ - Removes some armored Russian hats from box station round start
+ - Doner items spawning
+ - Engi/Sec Trek suit no longer has 10% melee protection
+ - IPC hearts are now made of robomeat and roboblood thats emp proof. Heals and is all and all just like an normal heart
+ - All robotic organs now have an animation.
+ - IPC's now organs now look like robotic ones, even tho thats not the case game wise
+ - Added a new bee themed bar sign
+ - Makes plywood chair not look as bad.
+ - corndog sprite being miss-spelled
+ - Ash from land of lava now is useable for sandstone
+ - Peach cake slices are no long made by mimes
+
+
Tupinambis updated:
+
+ - the portion of laws that require harm prevention by silicons has been removed.
+ - silicon_laws.txt config file is required to be modified for full implementation.
+ - masks no longer improperly stick out of helmets when they should be hidden.
+ - Status Displays should now update correctly.
+ - stunbatons now take 4 hits to inflict hard crit, up from 3.
+ - stunbatons no longer disarm targets.
+
+
Yakumo Chen updated:
+
+ - Rings for your fingers!
+ - New cargo crates and loadout options to bling your rings!
+
+
YakumoChen updated:
+
+ - Observe is back in the OOC tab
+ - Rings look nicer. Sprites used from RP.
+ - Ring on-hands. Diamond rings sparkle!
+ - You can now propose using a diamond ring in your hand.
+ - Legion skulls behave like bees!!!!
+
+
Zellular updated:
+
+ - Movement state for pupdozer and its decals
+ - Tweaked the movement state for the pupdozer's eyes
+
+
ancientpower updated:
+
+ - Fixes an error in pH strips' feedback message.
+ - Ported drink sliding from /vg/station.
+ - Fixes color mismatching with the "genitals use skintone" preference.
+ - Bunny ear style for humanoid species.
+ - Ghosts are now literate.
+
+
bunny232 updated:
+
+ - Changes the simple animal sentience event from the xenomorph preference to sentience potion preference.
+
+
coiax updated:
+
+ - Admin and event only pair pinpointers! They come in a box of two, and each pinpointer will always point at its corresponding pair. Aww.
+
+
deathride58 updated:
+
+ - Spacemen no longer run at lightspeed on local servers.
+
+
kappa-sama updated:
+
+ - the plant dudes can actually make plant disks now
+
+
keronshb updated:
+
+ - Added repairable turrets
+ - Adds Tiny Fans to the pirate ship
+ - changes some reinforced windows to plastinanium pirate windows
+ - made the pirate shuttle + turrets bomb resistant
+ - made most pirate machines + consoles indestructible
+ - increased pirate turret health
+ - Adds the CogChamp drink and Sprite
+ - Added burn and knockback to stunhand during HALOS on cult.
+ - fixed accelerated regeneration nanites
+ - fixed mechanical repair nanites
+ - fixed bio reconstruction nanites
+
+
kevinz000 updated:
+
+ - Custom snowflake plushies are now in config rather than code.
+ - Abductor mindsnapping (aka abductee objectives) can now be "cured" with brain surgery.
+ - Shuttle hijacking has been completely reworked. Alt-click the shuttle as a hijack-capable mind (so traitors, and especially traitors with hijack) to begin or continue a hacking process.
+ - A good amount of the blood RGB rework was cleaned up/reverted, with some notable gameplay changes including: Gibs and blood not having max blood by default (no more easy rampages, cultists), infinite gib streaking, etc etc.
+ - meteor waves are now directional and announces the direction on the command report.
+ - CTF CLAYMORES
+ - shoves buffed, now shoving into a wall twice rapidly will also disarm their weapon.
+ - traitor+bro gamemode minimum population set to 25 until there can be more in depth configuration systems for gamemodes.
+ - no more bluespace skittish locker diving,
+ - moths now have unique laughs and can *chitter.
+ - nuke explosion is now full dev radius for anti lag purposes
+ - Gangs can now only tag with a gang uplink bought spraycan.
+ - dueling pistol accesses have been changed to be more accessible.
+ - mechs no longer have admin logs flooding into IC control console log viewing
+ - Guncode and energy guns have been refactored a bit.
+ - You can now combat mode ight click on an energy gun to attempt to switch firing modes. This only works on guns without right click functions overridden.
+ - shoes can now fit magpistols again.
+ - Projectiles now always hit chest if targeting chest, snipers have 100% targeting zone accuracy. All other cases are unchanged.
+ - The lawyer's PDA cartridge has been rebranded to something more accurate to its true nature.
+ - Refactored ghostreading/etc
+ - Cyborgization will now de-gang people, even gangheads.
+ - reactive repulse armor now has an item limit
+ - beam rifle runtime fix during aiming_beam
+ - fail2topic runtime fix: taking out an ip while incrementing index resulted in accessing the next-next entry instead of the next and results in out of bound errors.
+ - gravity gun repulse and chaos now work in all angles, rather than just basic cardinals and diagonals. fun.
+ - Public autolathes can no longer be hacked.
+ - Energy weapons now once again have their lens in contents.
+ - pais are no longer muted for literally a whole hour on emp.
+ - auto profiler subsystem from tg
+ - Brig cells now are more accurate by using timeofday instead of realtime
+ - Cryo now actually transfers reagents at tier 4 on enter rather than every 80 machine fire()-process()s regardless of if it was "reset" by open/close.
+ - cmo now gets advanced surgery drapes that techweb-sync for advanced surgeries without an operating console.
+ - ctf claymores now actually spawn (and fit).
+ - STOP_PROCESSING now removes from currentrun to prevent another process cycle from happening where it shouldn't.
+ - hand teleporters now require 30 deciseconds of still movement by the user to dispel portals. there's a beam effect too.
+ - Sort of a bugfix but cult blood magic and all guns now respect stamina softcrit.
+ - Organ healing rate doubled. Organ decay rate halved to match its define (15 minutes for full decay, so at around 8-10 minutes it'll be really fucked).
+ - Storage now caches max screen size and only stores when being opened by a non ghost, meaning ghosts will no longer distort living player screens when viewing storage.
+ - Stunbatons changed yet again.
+ - the game's built in autoclicker aka CanMobAutoclick no longer triggers client/Click()'s anti clickspam guard.
+ - pais can no longer bodyblock bullets
+ - pai radio short changed to 3 minutes down from 5
+ - pais are no longer fulltile click opacity.
+ - vampire "immortal haste" has been reworked to be more reliable and consistent.
+ - hand teles use a less atrocious beam
+
+
necromanceranne updated:
+
+ - Ebows now disarm people hit by them.
+ - Ebows now do 60 stamina damage on hit.
+ - Ebows no longer inflict drowsiness
+ - Miniature ebows do 15 toxin damage, up from 8.
+ - Ebows have considerably shorter knockdowns.
+ - Ebows now make you slur rather than stutter.
+ - Large ebows are now heavy and bulky.
+ - You can no longer order spinfusors or their ammo from cargo.
+ - Removed the formal security officer jacket from the secdrobe
+ - formal security jackets are now armor vests
+ - Bullets causing bleed rates equal to unmitigated damage through all forms of defense.
+ - Reverted #9092, crew mecha no longer spawn with tracking beacons.
+ - [Port] Mecha ballistics weapons now require ammo created from an Exosuit Fabricator or the Security Protolathe, though they will start with a full magazine and in most cases enough for one full reload. Reloading these weapons no longer chunks your power cell. Clown (and mime) mecha equipment have not changed.
+ - [Port] The SRM-8 Missile Launcher has been replaced with the BRM-6 Breaching Missile Launcher in techwebs (Nukie Mauler remains equipped with the SRM-8).
+ - [Port] Both Missile Launchers and the Clusterbang Launcher do not have an ammo cache, and cannot be reloaded by the pilot. Once the initial loaded ammo has been spent, you can use the appropriate ammo box to load the weapon directly.
+ - [Port] Utility mechs that have a clamp equipped can load ammo from their own cargo hold into other mechs.
+ - [Port] Nuke Ops can purchase spare ammo duffel bags for their mecha weapons, should they run low.
+ - Literally unclickability with a cham projector
+
+
nemvar updated:
+
+ - Slight changes the self-repair borg module. It no longer references the borg that owns it.
+ - Trash from food now gets generated at the location of the food item, instead of in the hands of the eater.
+ - Changed mob biotypes from lists to flags.
+
+
r4d6 updated:
+
+ - Added a dwarf language
+ - Added more engines
+ - RPD subcategories and preview icons reorganized.
+ - RPD now starts with painting turned off, hitting pipes with build and no paint will target the turf underneath instead. Bye bye turf pixelhunting.
+ - Made dwarves into a roundstart races
+ - Meteor Timer back to 3-5 minutes
+ - Mining no longer lead to spess
+ - Added Plasteel Pickaxe
+ - Added Titanium Pickaxe
+ - fixed a missing tile
+
+
tralezab, bandit, Skoglol updated:
+
+ - The mime's PDA messages are silent now!
+ - 30 new emoji have been added. Mime buff, mime now OP.
+
+
27 January 2020
4dplanner, CRITAWAKETS, XDTM, ninjanomnom updated:
@@ -506,328 +1055,6 @@
- fixed not being able to remove trait genes without a disk being inserted into the dna manipulator
-
- 30 December 2019
- AnturK updated:
-
- - Fixed ranged syndicate mobs stormtrooper training.
-
- Arturlang updated:
-
- - Adds Bloodsuckers, beware.
-
- BlueWildrose updated:
-
- - Fixed stargazers being unable to link to themselves if mindshielded or if holding psionic shielding devices (tinfoil hats) when the species is set.
- - Fixes non-roundstart slimes being unable to wag their tail.
-
- Commandersand updated:
-
- - added two words to clown filter
- - Added new things to loadouts, check em
-
- DeltaFire15 updated:
-
- - Clock cult kindle no longer cares about oxygen damage
- - changed mecha internals access for some special mechs.
- - no more mech maintenance access for engineers.
- - All heads of staff can now message CC
- - Removes a magicnumber
- - Rebalanced cult vs cult stun effects to debuff instead of stun
-
- Detective-Google updated:
-
- - short hair 80's is no longer jank
-
- Fermis updated:
-
- - tweaked how super bases/acids work but limiting them
-
- Fikou updated:
-
- - the windup toolbox now has some more "realistic" sounds
- - the windup toolbox now rumbles again
-
- Ghommie updated:
-
- - Fixed hulks, sleeping carp users, pacifists and people with chunky fingers being able to unrestrictly use gun and pneumatic cannon circuit assemblies.
- - Fixed gun circuit assemblies being only usable by human mobs.
- - Doubled the locomotion circuit external cooldown, thus halving the movable assemblies' movespeed.
- - Made wooden cabinet/closets... actually made of wood.
- - Wooden cabinets are now deconstructable with a screwdriver.
- - Deconstruction of large crates and other closet subtypes deconstructable with tools other than the welder is no longer instant.
- - You shouldn't be able to target objects you can't see (excluding darkness) with the ARCD and RLD
- - The admin RCD is ranged too, just like the ARCD.
- - Fixed welding, thirteen loko, welding and wraith spectacles not blinding people as expected. Thank you all whomst reported this issue in the suggestions box channel instead of the github repository's issues section, very smart!
- - Fixed on_mob eyes overlays not updating properly in certain cases.
- - Fixed deconversion from bloodshot eyes blood cult resetting your eyes' color to pitch black instead of their previous color, more or less.
- - Spinfusor nerf: Upped the casing and ammo box size by one step, removed the projectile's dismemberment value (explosions can still rip a limb or two off), halved the ammo box capacity, reduced the spinfusor ammo supply pack contents from 32 to 8, removed the casing's ability to explode when thrown.
- - Fixes bubblegum's death not unlocking the arena shuttle buyment.
- - Fixed alien tech node not being unlockable with subtypes of the accepted items.
- - Fixed reactive armor onmob overlays not updating when toggled and reactive teleport armor still using forceMove() instead of do_teleport()
- - Fixed space hermit asteroid rocks unintendedly spawning airless asteroid turf when mined, save for the perimeter.
- - Fixes reviver implant having been a crapshot ever since soft-crit was introduced years ago.
- - Added a "convalescence" time (about 15 seconds) after the user is out of unconsciousbess/crit to ensure they are properly stabilized.
- - Added a 15 minutes hardcap for accumulated revive cooldown (equivalent to 150 points of brute or burn healed) above which the implant starts cooling down regardless of user's conditions.
- - Fixed AI core displays I may have broken with my coding extravaganza.
- - Blue, Amber and Red security alert sounds should be half as loud now.
- - Buffed clown ops by removing their clumsiness and adding a new trait to be used in place of several clown role checks.
- - Clown ops too also suffer from not holding or wearing clown shoes now.
- - Fixed a few holo barriers lacking transparency.
- - Fixed character setup preview bodyparts not displaying correctly most of times.
- - Fixed character appearance preview displaying the mannequin in job attire instead of undergarments.
- - Fixed raven's shuttle computer not being of the emergency shuttle type.
- - Blood bank generators can now be anchored and unanchored now.
- - Ghost mentors can now orbit around the target instead of setting their view to theirs'.
- - Fixes a ghostchat eavesdropping exploit concerning VR.
- - Fixes VR deaths being broadcasted in deadchat.
- - Fixed a few pill bottle issues with the ChemMaster.
- - Fixes a few negative quirks not being properly removed when deleted.
- - Phobia and mute quirks are no longer cheesed by brain surgery grade healing or medicines.
- - Fixed double-flavour (and bland custom) ice creams.
- - Fixed Pubbystation's wall Nanomeds being inconsistent with other stations'.
- - dextrous simplemobs can now swap action intent with 1, 2, 3, 4 now. Just like humies, ayys and monkys.
- - Stops humanoids whose skin_tone variable is set to "albino" from showing up as pale when examined should their species not use skintones anyway.
- - Removed the old (almost) unused roboticist encryption key and headset.
- - Fixed goose meat.
- - Fixed a little door assembly glass dupe exploit
- - Fixed AI holopad speech text being small and whispers that in multiple exclamation marks echo through multiple areas.
- - Removed literally atrocious polka dotted accessories. They were even more atrocious than the yellow horrible tie.
-
- Ghommie (also porting PRs by AnturK and Arkatos) updated:
-
- - Fixed light eaters not burning out borg lamplights and flashes. fix Fixed light eater not affecting open turfs emitting lights such as light tiles and fairy grass.
- - Fixed an empty reference about light eater armblade disintegration after Heart of Darkness removal.
-
- Ghommie, Skogol updated:
-
- - refactored altclick interaction to allow alt-click interactable objects to parent call without forcing the turf contents stat menu open.
- - Alt clicking will no longer show turf contents for items inside bags etc.
- - Alt clicking the source of your turf contents stat menu will now close said menu.
-
- GrayRachnid updated:
-
- Hatterhat updated:
-
- - Regenerative nanites, a "chemical" used in the combat stimulant injector. Actually quite stimulating, and not bad in a pinch for a nuclear operative. Check the Combat Medic Kit!
- - The Combat Medic Kit now has an advanced health analyzer and medisprays instead of patches and a chloral syringe.
- - The Advanced Syndicate Surgery Duffelbag or whatever it was doesn't get the better injector, because nobody uses it and so nobody's bothered to update it.
- - .357 speedloaders can now be printed with the Advanced Illegal Ballistics node on the tech tree!
- - okay so i may have given the .357 an extra speedloader at the same cost but it comes in a box now
-
- ItzGabby updated:
-
- - Fixed AltClick on polychromic collars so they actually work now.
-
- KeRSedChaplain updated:
-
- - Extends the file "deltakalaxon.ogg" to a 38 second .ogg.
-
- Linzolle updated:
-
- - neck slice. harm intent someone's head while they are unconscious or in a neck grab to make them bleed uncontrollably.
- - officer's sabre now properly makes the unsheating and resheating noise
- - fireman failure has a different message depending on the circumstance
- - Abductor chem dispenser, and added it to the abductor console.
- - "Superlingual matrix" to the abductor console. It's the abductor's tongue. Can be used to link it to your abductor communication channel and then implanted into a test subject.
- - Shrink ray and added it to the abductor console.
- - Shrink ray sound effect (its the fucking mega man death sound)
- - special jumpsuit for abductors
- - abductor jumpsuit, including digi version if a digitigrade person somehow manages to get their hands on it. sprites for the shrink ray and chem dispenser.
- - new glands to play with, including the all-access gland, the quantum gland, and the blood type randomiser.
- - split every gland into its own file instead of all being in one file
- - cosmic coat crafting recipe changed to coat + cosmic bedsheet
-
- Mickyan, nemvar, RaveRadbury, AnturK, SpaceManiac updated:
-
- - Certain incompatible quirks can no longer be taken together.
- - If an admin sends a ghost back to the lobby, they can now choose a different set of quirks.
- - the quirk menu went through some minor formatting changes.
- - Podcloning now lets you keep your quirks.
- - Quirks have flavor text in medical records.
- - All quirk medical records refer to "Patient", removing a few instances of "Subject".
- - Quirks no longer apply to off-station roundstart antagonists.
- - Mood quirks are now only processed by the quirk holders
-
- Narcissisko (ported by Hatterhat) updated:
-
- - Luxury Bar Capsule, at 10,000 points. Comes with no medical supplies, a bar, and a bunch of cigars. Ported from tgstation/tgstation#45547.
-
- Nervere and subject217, Militaires, py01, nemvar updated:
-
- - The cook's CQC now only works when in the kitchen or the kitchen backroom.
- - corrected CQC help instructions
- - CQC and Sleeping Carp are properly logged.
- - CQC can passively grab targets when not on grab intent. Passive grabs do not count towards combos for CQC or Sleeping carp.
- - Martial Art and NOGUN cleanup.
-
- PersianXerxes updated:
-
- - Removed night vision quirk
-
- Putnam updated:
-
- - acute hepatic pharmacokinesis now works if you already have relevant genitals
- - Contamination is no longer an infinitely spreading deadly contagion causing mass panic
- - Dynamic rulesets have lower weight if a round recently featured them (except traitor).
-
- Putnam3145 updated:
-
- - Buffed HE pipes by making them realistically radiate away heat.
- - Dynamic has a (totally unused for any relevant purpose) roundstart report now.
- - A whole bunch of dynamic data is now available for statbus
- - Dynamic from-ghost antags no longer double dip on threat refunds when the mode fails due to not enough applications.
- - whoops broke quirks
- - quirks work
- - New tab in preferences screen: "ERP preferences"
- - New opt-outs for individual effects of incubus draught, succubus milk
- - Acute hepatic pharmacokinesis has been removed, replaced with above
- - Renamed "Toggle Lewdchem" to "Toggle Lewd MKUltra", since that's what it actually means, and made it toggle the "hypno" setting (rename it again if more hypno mechanics are added).
- - Made MKUltra's lewd messages require both people involved to have hypno opted-in.
- - Buncha dynamic config tweaks
- - Ghost cafe spawns are actual ghost roles by the game's reckoning now
- - a runtime in radioactive contamination
- - Bomb armor now acts like other armor types.
- - Devastation-level explosions on armorless people no longer destroys everything in their bags.
-
- Seris02 updated:
-
- - the clowns headset
- - distance checks
- - the sprites
- - added the runed and brass winter coats (cosmetic ratvarian/narsian)
- - how the narsian/ratvarian coats can be made
- - fixes some ghost roles from dying of stupid shit
- - pandoras attacking their owners
- - Added Rising Bass and the shifting scroll.
- - Changes the martial arts scroll in the uplink to "Sleeping Carp Scroll"
-
- ShizCalev updated:
-
- - Fixed floodlights not turning off properly when they're underpowered.
- - Fixed emitters not changing icons properly when they're underpowered.
-
- Sishen1542 updated:
-
- - Clicking a pack of seeds with a pen allows you to set the plant's name, description and the pack of seeds' description. Useful for differentiating genetically modified plants. These changes will persist through different generations of the plant.
- - Hydroponics trays update their name and description to reflect the plant inside them. They revert to default when emptied.
-
- Toriate updated:
-
- - Polychromic shorts now have a digitigrade state
-
- Trilbyspaceclone updated:
-
- - ports all the new donuts, burgars, and chicken stuff from RG
- - ports new snowcone
- - ports grill
- - ports beakfeast tag/mood lit as TG has it
- - ports all the amazing new sprites
- - ports crafting for many things like snowcones needing water
- - ports of many craftings
- - lowers fryers sound
- - ported icons for new food/grill
- - ports the deletion of some icons and images
- - ports a spell check for the snowcones
- - ports fixes for stuff I didnt know were even broken with snowcones
- - coder cat failers to push the last commit from year(s) ago
- - Updates the changlogs
- - meat hook from HUGE to bulky
- - CE hardsuit is now more rad-proof
- - Wrong icon names, missing dog fashion with telegram hat
- - New softdrink that comes in its own vender!
- - Honey now has a reaction with plants
- - Buzz fuzz now only has a 5% to give honey and will now give 1u of sugar not 2
- - Blaster shotguns back into armory
- - Removed Lighters in thunderdomes
- - Silicons now know what a slime is saying!
- - honey now will not kill slimes. Honey slimepeople can be a thing now, go sci.
- - Added insulin into many of the borg hypo's
-
- Useroth updated:
-
- - bamboo which can be used to build punji sticks/ blowguns available as a sugarcane mutation or in exotic seed crate
- - changed the sugar cane growth stages because fuck if I know why, but it was in the PR
- - New lavaland ruin: Pulsating tumor
- - New class of lavaland mobs, a bit weaker than megafauna but still stronger than most of what you normally see
- - Ghost cafe spawner. For letting people spawn as their own character in the ninja holding facility. It bypasses the usual check, so people who have suicided/ghosted/cryod may use it.
- - Dorms in the ninja holding facility.
-
- Xantholne updated:
-
- - Santa Hats to Loadout and Clothesmate
- - Christmas Wintercoats to Loadout and Clothesmate
- - Christmas male and female uniforms to loadout and Clothesmate
- - Red, Green, and Traditional Santa boots to loadout and Clothesmate
- - Christmas Socks, Red candycane socks, Green candycane socks to sock selection
-
- kappa-sama updated:
-
- - legion drops more crates now
- - .357 speedloaders in autolathes are now individual bullets instead, speedloaders are now illegal tech, costs less total metal to make 7 bullets than a previous speedloader. 7.62mm bullets in autolathe when hacked and costs more metal to make 5 7.62mm bullets than getting a clip from the seclathe.
- - mentions that you can refill speedloaders on .357 uplink description
- - you can now strip people while aggrograbbing or higher
- - plasmafist to wizard
- - modular is gone
- - martial apprentices for the local Chinese wizard
- - broodmother baby lag
- - you can no longer get 100k credits by spending 4k roundstart
- - cooking oil in sunflowers instead of corn oil
- - throats are no longer slit happy
-
- keronshb updated:
-
- - Adds reflector blobs to shield blob upgrades
-
- kevinz000 updated:
-
- - Launchpads can now take number inputs for offsets rather than just buttons.
- - nanites no longer spread through air blocking objects
- - Night vision readded as a darkness dampening effect rather than darksight.
- - conveyors can only stack items on tiles to 150 now.
- - added 8 character save slots
- - Cargo shuttle now silently ignores slaughter demons/revenants instead of being blocked even while they are jaunted. A drawback is that manifested ones can't block it either, any more.
- - flashbangs process light/sound separately and uses viewers(), so xray users beware.
- - Stat() slowed down for anti-lag measures.
- - sprint/stamina huds now work again
- - Combat defibs now instant stun on disarm rather than 1 second again
- - Defibs are now always emagged when emagged with an emag rather than EMP.
- - aooc toggling now only broadcasts to antagonists
- - Antag rep proc is now easier to read and supports returning a list.
- - Clockwork marauders are now on a configured summon cooldown if being summoned on station. They also rapidly bleed health while in or next to space. And they glow brighter.
-
- lolman360 updated:
-
- - Added ability to pick up certain simplemobs.
-
- nemvar updated:
-
- - The brains of roundstart borgs no longer decay.
- - Refactored the visibility of reagents for mobs.
-
- nicbn, Kevinz000, ShizCalev updated:
-
- - Fire alarm is now simpler. Touch it to activate, touch it to deactivate. When activated, it will blink inconsistently if it is emagged.
- - You can no longer spam fire alarms. Also, they're logged again.
- - Fixed fire alarms not updating icons properly after being emagged and hacked by Malf AI's.
-
- r4d6 updated:
-
- - Added a N2O pressure tank
- - Removed a AM Shielding from the crate
- - Added Handshakes
- - Added Nose booping
- - Added submaps for the SM, Tesla and Singulo
- - Added a placeholder on Boxstation for the Engines
- - fixed Nose boops not triggering
-
- shellspeed1 updated:
-
- - Adds Insect markings
- - Adds three new moth wings.
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 464340ef24..92ef22f74f 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -24452,3 +24452,590 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
timothyteakettle:
- bugfix: fixed not being able to remove trait genes without a disk being inserted
into the dna manipulator
+2020-02-26:
+ AnturK ported by kevinz000:
+ - rscadd: Dueling pistols have been added.
+ Arturlang:
+ - rscadd: Replaces a lot of ingame UIs with TGUI next, increasing performance drastically.
+ - rscadd: Each night for bloodsuckers will last longer due to the sun dimming.
+ - tweak: You cant level up for free, now you have to pay blood for power.
+ - balance: Bloodsuckers are no longer as resistant to hard stuns and regenerate
+ less stamina. and a lot of their cooldowns are a lot higher.
+ - rscdel: Removed text macros from the chem dispenser.
+ - rscadd: Replaced with dispenser input recording macros.
+ - bugfix: Fancifying makeshift switchblades now works
+ - balance: Shields will no longer block lasers, and will break if they take too
+ much damage.
+ - rscadd: Added a TGUI Next interface for crafting
+ - rscdel: Removed the old TGUI slow crafting interface
+ - tweak: The MK2 hypospray now
+ - admin: The debug outfit is now kitted out for whatever debbuging needs.
+ - bugfix: Fixed the pandemic naming and the radiation healing symptom UI crashing
+ - tweak: Hyposprays now switch modes on CTRL click, instead of alt, as it was already
+ reserved for dispension amount.
+ - rscadd: Nanite interfaces have gotten a rework to TGUI Next, and can now support
+ sub-programs. add:Adds the nanite sting program, which will allow you to manually
+ sting people to give them nanites, changeling style.
+ - balance: The pandemic can no longer make vaccines or synthblood as quickly.
+ - rscadd: The syndicate uplinks interface has been redone in TGUI Next
+ - tweak: Valentines can now be converted by bloodsuckers
+ Bhijn:
+ - tweak: Click-dragging will now only perform the quick item usage behavior if you're
+ in combat mode.
+ BlueWildrose:
+ - bugfix: podpeople tail wagging
+ - tweak: lifebringer ghost role fixes
+ BuffEngineering, nemvar.:
+ - bugfix: Addicts can now feel like they're getting their fix or kicking it.
+ - bugfix: Aheals now remove addictions and restore your mood to default.
+ CameronWoof:
+ - tweak: Lighting looks better now. I can say that because the PR wouldn't be merged
+ and you wouldn't be reading this if it wasn't true.
+ - rscadd: Ammonia and saltpetre can now be made at the biogenerator.
+ Commandersand:
+ - tweak: uplink centcomm suit doesn't have sensors
+ DeltaFire15:
+ - balance: Nar'Sie runes no longer benefit from runed floors.
+ Detective-Google:
+ - rscadd: 'the POOL. remove: boxstation dorms 7'
+ - bugfix: valentines candy no longer prefbreaks
+ - rscadd: Loudness Booster pAI program
+ - rscadd: Encryption Key pAI program
+ EmeraldSundisk:
+ - bugfix: Connects mining's disposal unit on Delta.
+ - tweak: Slight visual adjustments to the immediate affected area.
+ Feasel:
+ - balance: Buffed dissection success chances.
+ Ghommie:
+ - tweak: The anomalous honking crystal should now properly clown your mind.
+ - bugfix: Stopped the ellipsis question mark from being displayed twice in the examine
+ message for masked/unknown human mobs.
+ - tweak: Made the aforementioned ellipsis question mark display on flavor-text-less
+ masked/unknown human mobs too for consistency.
+ - bugfix: Stopped an APTFT exploit with spray bottles.
+ - bugfix: Fixed the detective revolver being quite risky to use.
+ - bugfix: Hair styles and undergarments are yet again free from gender restrictions.
+ - tweak: Clown ops will find bombananas and clown bomb beacons instead of minibombs
+ and bomb beacons in their infiltrator ship now.
+ - tweak: For safety, the syndicate shuttle minibombs and bombananas come shipped
+ in a box. Please don't instinctively eat any of those nanas, thank you.
+ - tweak: Uplink items excluded (such as mulligan, chameleon, ebow) from or exclusive
+ (such as cyber implants) to normal nuke ops will now be properly unavailable/available
+ to clown ops.
+ - bugfix: Fixed bananium energy sword/shield slips.
+ - balance: Buffed said slips to ignore no-grav/crawling/flying as well as adding
+ some deadly force to the e-sword.
+ - bugfix: Fixed the 'stache grenade anti-non-clumsy user check.
+ - balance: Doubled the timer for the sticky mustaches effect from the above grenade
+ (from 1 to 2 minutes)
+ - bugfix: Fixed an edge case with the chaplain armaments beacon spawning the box
+ in nullspace.
+ - tweak: The playback device's cooldown now proportionally increases with messages
+ longer than 60 characters (3 seconds is the default assembly cooldown).
+ - bugfix: Fixed space ninjas "Nothing" objective. Now you gotta steal some dandy
+ stuff such as corgi meat and pinpointers as a ninja too.
+ - bugfix: Fixed maploaded APC terminals direction.
+ - balance: Nerfed magnetic rifles/pistols by re(?)adding power cell requirements
+ for it. These firearms must be recharged after firing 2 magazines worth of projectiles
+ and are slightly more susceptible to EMPs.
+ - bugfix: Fixed the tearstache nade not properly working.
+ - balance: Buffed it against space helmet internals.
+ - tweak: Holographic fans won't display above mobs and other objects anymore.
+ - bugfix: Fixed paraplegics appearing as shoeless.
+ - bugfix: Fixed the petting element.
+ - bugfix: Fixed slipping.
+ - refactor: Refactored mob holders into an element.
+ - bugfix: Fixed a few minor issues with that feature. such as mismatching sprites
+ for certain held mobs and a slight lack of safety checks.
+ - rscdel: holdable mobs can't force themselves into people's hands anymore.
+ - bugfix: Milkies fix.
+ - bugfix: Fixed some mounted defibrillator issue with the altclicking functionality.
+ - bugfix: Fixed no-grav lavaland labor/mining shuttle areas.
+ - bugfix: Fixed a little issue with sleeper UI and blood types.
+ - bugfix: Fixing accidental nerfs to the magpistol magazine.
+ - bugfix: The Lavaland's Herald speech sound should only play if they are actually
+ speaking.
+ - bugfix: Nerfed cargo passive points generation from 500 to 125 creds per minute.
+ - bugfix: Fixed whitelisted/donor loadouts
+ - bugfix: Childproofs double-esword and hypereuplastic blade toys.
+ - balance: Some reagent holders (such as cigarettes, food) are not suitable for
+ reagents export anymore, while unprocessed botany crops will only net 1/3 of
+ the standard reagents values.
+ - bugfix: Export scanners now include the reagents value in the price report.
+ - bugfix: Fixed a little inconvenience with the character setup preview dummy having
+ extra unwarranted bits.
+ - bugfix: Stopped role restricted uplink items from being discounted despite not
+ being purchasable most times.
+ - bugfix: Missing words replacement file for the gondola mask.
+ - bugfix: Fixed an issue with the nearsighted prescription glasses taking over worn
+ eyewear.
+ - bugfix: Fixed AI unanchoring not properly removing the no teleport trait. My bad.
+ - bugfix: Fixed another issue with hering comsig.
+ - imageadd: Fixed dozen missing privates sprites.
+ - bugfix: A little fix concerning some R&D and reagents.
+ - bugfix: Further mob holder fixes.
+ - bugfix: Fixed being unable to dump a trash bag's contents directly into disposal
+ bins.
+ - bugfix: Doubled the halved flavor text maximum length.
+ - bugfix: Reduced tongue organ damage and tasting pH message spam.
+ - bugfix: Fixed agent IDs not registering the inputted name. Thanks MrPerson.
+ - bugfix: Fixed solar panels/trackers (de)construction being a bit wonky.
+ - bugfix: Fixed something about slime blood and the law of conservation of mass.
+ - bugfix: Fixed flypeople being emetic machine guns.
+ - bugfix: Fixed virology being unable to be done with synthetic blood.
+ - rscdel: Renamed "blaster carbine" and "blaster rifles" back to "energy gun" and
+ "laser gun" respectively
+ - bugfix: Fixed magnetic rifles & co being inconsistent with printed energy guns
+ and start with an empty power cell.
+ - imagedel: Reverted practice laser gun sprites back to their former glory. Mostly.
+ - bugfix: Fixed sprint buffer cost and regen being rounded down.
+ - balance: Nerfed the fermenting barrel export industry.
+ - tweak: Reagent dispensers selling price no longer takes in account the reagents
+ volume. It's already handled by reagents export.
+ - bugfix: pAIs are yet again unable to perform certain silicon interactions with
+ machineries yet again.
+ - bugfix: Fixed pAI radios inability to be toggled on/off.
+ ? Ghommie (original PRs by Floyd/Qustinnus, 4Dplanner, Willox, ninjanomnom, mrdoombringer,
+ Fikou, Fox McCloud, TheChosenEvilOne, nemvar, bobbahbrown, Time-Green, Stonebaykyle,
+ MrPerson, ArcaneMusic and zxaber)
+ : - rscadd: You can now make toolboxes out of almost any solid material in an autolathe
+ - rscadd: adds Knight's Armour made out of any materials
+ - rscadd: new ruin found in lavaland protected by dark wizards, I wonder what
+ they're guarding
+ - rscadd: You can now put a bunch more mats in the coin mint and autolathe
+ - rscadd: Adamantine and Mythril are now materials (Adamantine still only from
+ xenobio, Mythril still only from badminnery). Adamantine boosts an item's
+ force by 1.5, Mythril gives an item RPG statistics.
+ - rscdel: most custom sprites for coins have been lost
+ - rscadd: You can now give your ass acute radiation poisoning
+ - rscadd: floydmats now apply to all objs / items
+ - rscadd: you can now make tables and chairs out of any material
+ - bugfix: Fixes being able to exploit fully upgraded destructive analyzers to
+ multiply materials
+ - rscadd: An old monastery from a previously abandoned sector of space has recently
+ resurfaced in some regions surrounding the station.
+ - rscadd: Latent scans of the surrounding systems have picked up trace signs of
+ new, smaller cult constructs, however these signatures quickly vanished.
+ - rscadd: In other news, scavengers in your sector have been seen occasionally
+ with classically recreated maces, so autolathe firmware has been upgraded
+ to accommodate this.
+ Hatterhat:
+ - balance: Zombie powder is now instant when ingested, but delayed when injected
+ or applied through touch.
+ - tweak: The H.E.C.K. suit is now goliath tentacle resistant and probably better
+ for acid resistance.
+ - rscadd: The Engineering techfab can now print standard and large RCD compressed
+ matter cartridges.
+ - rscadd: The Experimental Tools node now has the Combifan projector, blocking both
+ temperature and atmospheric changes.
+ - tweak: fiddles with the seed extractor upgrade examine to make it not shit
+ - rscadd: Formaldehyde prevents organ decay and corpses' miasma production at 1u
+ in the body.
+ - rscadd: Epinephrine pens now contain 3u formaldehyde. This should not kill you.
+ - rscadd: The ships often crashed by Free Golems on Lavaland now have GPSes. They're
+ off, by default, but an awakening Golem could easily turn one on.
+ - tweak: Standard RCD ammo can now be printed from Engineering-keyed techfabs once
+ you hit Industrial Engineering.
+ - tweak: Consoleless interfaces are now default - this means unrestricted protolathes
+ and circuit imprinters can now be interfaced with by interacting with the machine
+ itself.
+ - bugfix: Multitools can now actually be printed from Engineering and Science protolathes/techfabs
+ once you unlock Basic Tools.
+ - rscadd: Husking (from being burned to shit) can now be reverted! 5u rezadone or
+ 100u synthflesh, at below 50 burn.
+ - balance: Turning a body into a burnt husk now takes more effort. 300 burn's worth
+ of effort.
+ - balance: Buckshot individual pellet damage up from 10 to 12.5. Still firing 6
+ pellets.
+ - rscadd: Preservahyde! Made with water, bromine, and formaldehyde, it doesn't decay
+ into histamine. Instead, it just prevents your organs from rotting into nothing.
+ - balance: You can now purify eldritch longswords with a bible. This creates purified
+ longswords, which do not have anti-magic properties, but are still good for
+ swinging at cultists.
+ - rscadd: Extend votes! Ported from Hyper, ported from AUstation.
+ - bugfix: mechs with stock parts now have icons
+ - balance: Pie reagent transfer now requires an uncovered mouth.
+ - bugfix: Biogenerators can now actually generate universal enzyme.
+ - bugfix: The Basic Tools node now unlocks the multitool for printing on Engineering
+ and Science fabricators.
+ - rscadd: The Ash Walkers' nest on Lavaland now starts with three bowyery slabs.
+ - rscadd: You can now welder-harden arrows. It might take longer.
+ - balance: Silkstring's costs adjusted for bows and whatnot.
+ - spellcheck: Grammar adjusted on a lot of things relating to bows.
+ - bugfix: Pipe bows' bowstring doesn't look like it replicated itself upon draw.
+ IHOPMommyLich:
+ - tweak: Changed the multiplicative_slowdown of Stimulants from -1 to -0.5
+ IronEleven:
+ - balance: Minor stat changes to Choking, Spontaneous Combustion, Autophagocytosis
+ Necrosis, Hallucigen, Narcolepsy, Shivering, and Vomiting symptoms.
+ KathrinBailey:
+ - bugfix: Missing turf_decals in Cargo Office.
+ - bugfix: Turns on the docking beacons on Box.
+ - bugfix: Fixes Starboard Quarter maint room being spaced. It was never intended
+ to be like how it was.
+ - bugfix: The aforementioned maint room not having stuff in it.
+ - bugfix: varedited photocopier sometimes not opening any UI.
+ - bugfix: Atmos differences in Starboard Quarter maint.
+ - bugfix: Atmos differences in destroyed shuttle/EVA bridge. Plating replaced with
+ airless plating.
+ - bugfix: Rotates AI satellite computers. These have probably been like this since
+ computers had the old sprites and no directional ones. You shouldn't sit at
+ a chair to operate a sideways computer.
+ KrabSpider:
+ - imageadd: The Van Dyke is no longer Fu Manchu.
+ - imagedel: Gets rid of a Fu Manchu imitation.
+ Kraseo:
+ - bugfix: You can no longer pull before wearing boxing gloves to bypass the grab
+ check.
+ - bugfix: Nightmares no longer delete entire guns from existence for merely having
+ a light on them.
+ Linzolle:
+ - bugfix: Bows now will not delete an arrow if it cant fire it.
+ - bugfix: bows now like and respect sprite changes
+ MalricB:
+ - rscadd: '"Shaggy" sprite from virgo'
+ - rscadd: '"shaggy" option in the character customization'
+ MrJWhit:
+ - rscdel: Removed meteor defense tech node
+ - tweak: TEG
+ Naksu:
+ - bugfix: Odysseus chem synthesizing now works again.
+ Owai-Seek:
+ - rscadd: Burger, Cargo Packaging, Dirty Magazine, Air Pump, and Scrubber crates.
+ - rscdel: Duplicate Crate, Festive Wrapping Paper Crate, Contraband Monkey Meat
+ Crate
+ - tweak: Gave Seed Crate Ambrosia Seed, gave Biker Gang Crate Spraypaint.
+ - tweak: Organised some crates with sub-categories. Also, moved all vendor refills
+ to a new tab.
+ - tweak: Moved Grill to Service Tab
+ - bugfix: Engineering Hardsuit Access
+ - tweak: Blood Crate now has all of the current blood types.
+ - tweak: Birthday Cake Recipe is now the same as TG.
+ - tweak: Added Soy Sauce and BBQ Packets to Dinnerware Vendor.
+ - tweak: Added nurse outfit, nurse cap, and mailman hat to loadout.
+ - tweak: Changed the name of scrubs to blue, green, and purple scrubs.
+ - rscadd: Bacon and Eggs food item. Delicious! Added a Lemony Poppy Seed Muffin.
+ - tweak: Snack Vendor has Chocolates, Tortilla Chips, and a Marshmallow Box
+ - balance: Mops can now be printed at service lathe once tools are researched.
+ - balance: Biobags can hold most organic limbs/organs, but not brains, implants,
+ or cybernetics.
+ - balance: Trash Bag can now hold limbs (but not heads.)
+ - balance: Most snack vendor items reduced by 1.
+ - bugfix: Trash Cans are now actually craftable, and only require metal instead
+ of plastic.
+ - imageadd: Bacon and Eggs, Drying Agent Bottle.
+ - imageadd: Mugs now show reagent colors of contained reagents. Thanks Seris!
+ - tweak: Reorganized all food recipes, (hopefully) making things easier to find.
+ - balance: Trays now have a whitelist, allowing them to pick up normal sized foods,
+ bowls, glassware, booze, ect.
+ - bugfix: Easter foods are no longer their own Misc Food Category on the top of
+ the menu.
+ - spellcheck: fixed a few typos/capitalization consistency.
+ - tweak: Mexican Foods are their own Subcategory.
+ - tweak: Donuts are their own Subcategory
+ - tweak: Moved Sweets from Misc Food in with Pies. Renamed to Pies & Sweets
+ - rscadd: BROOM
+ - tweak: Janitor Vendor now has gear for two Janitors.
+ PersianXerxes:
+ - rscadd: 'SMES and PACMAN attached to gulag Security to power electrified windows
+ remove: Removed Sec vendor from gulag Security'
+ - tweak: Separation of gulag and public mining
+ - rscadd: Better clarified the comment explaining the contraband tag.
+ - tweak: Cargo nuclear defusal kits now require an emag'd drop pod console to be
+ purchased.
+ - rscadd: Added Kilo Station
+ - tweak: Adjusts Kilo Station to be more in line with Citadel standards
+ - imageadd: Added area icons required to make Kilo Station editable on Citadel code
+ - code_imp: Fixed a reagent container on Kilo pointing to a nonexistent reagent
+ - config: Adds Kilo Station to the maps config file, does not fix Meta Station's
+ population requirement
+ Psody-Mordheim:
+ - rscadd: You can now make synth-flesh with synthetic blood.
+ - rscadd: You can now make synthetic blood via mixing saline glucose, iron, stable
+ plasma and heating it to 350 temp.
+ - rscadd: You can mix synthetic blood and cryoxadone to create synth-meat in addition
+ to normal blood.
+ - rscadd: Disfiguration Symptom.
+ - rscadd: Deoxyribonucleic Acid Saboteur Symptom.
+ - rscadd: Polyvitiligo Symptom.
+ - rscdel: Revitiligo Symptom.
+ - rscdel: Vitiligo Symptom.
+ Putnam3145:
+ - admin: Added logging to various consent things.
+ - rscadd: Lots of new traitor objectives
+ - bugfix: gender change potion now respects prefs
+ - bugfix: Hypno prefs work better.
+ - admin: Panic bunker is now round-to-round persistent
+ - tweak: Relief valve now has a TGUI-next UI
+ - bugfix: Atmos reaction priority works now.
+ - rscadd: map voting doesn't suck anymore
+ - bugfix: Dynamic now defaults to "classic" storyteller instead of just failing
+ if the vote didn't choose a storyteller.
+ - bugfix: antag quirk blacklisting works now
+ - tweak: default should be... default
+ - balance: all supermatter damage is now hardcapped
+ - tweak: Supermatter sabotage objective no longer shows up with no supermatter
+ - bugfix: Mining vendors no longer fail and eat your points iff you have precisely
+ enough points to pay for an item
+ - tweak: Licking pref
+ - bugfix: Fixed IRV.
+ - bugfix: Runtime if nobody has a chaos pref set
+ - bugfix: IRV fixed... again
+ - bugfix: temporary flavor text can now be of reasonable length
+ - balance: Shooting the supermatter now adds to the supermatter's power. CO2 setups
+ beware!
+ - rscadd: Logging for renaming
+ Raiq & Linzolle:
+ - rscadd: Bone bow - Ash walkers crafting , bone arrows - Ash walkers crafting,
+ silk string used in bow crafting, harden arrows - Ash walkers crafting, ash
+ walker only crafting book, basic pipe bow, and bow & arrow selling. Quivers
+ for ash walkers as well, just to hold some arrows well out on the hunt!
+ Seris02:
+ - tweak: tweaked the way the SM works
+ - rscadd: custom reagent pie smite
+ - rscadd: hijack implant
+ - code_imp: changed mentions of the issilion proc to hasSiliconAccessInArea based
+ on what the proc is used for
+ - rscadd: recipe for mammal mutation toxin
+ - rscadd: polychromic winter coat
+ - rscadd: thief's gloves
+ - rscadd: crushing magboots
+ - bugfix: golden plastitanium toolbox being actually plastitanuium
+ - bugfix: character slot amount
+ - balance: rebalanced rising bass
+ - bugfix: string highlighting whitespace
+ - bugfix: glitch with PKA
+ - bugfix: meteor hallucinations (again)
+ - rscadd: Added naked hallucination
+ - rscadd: crowbarring manifests off crates
+ - balance: makes RCDs cost a better amount
+ - bugfix: apc icons
+ - rscadd: rest hotkey
+ - rscadd: hsl instead of sum of rgb for spraycan lum check
+ - balance: bloodcrawl's cooldown
+ ShadeAware:
+ - rscadd: Craftable Switchblades, a weaker subtype of normal switchblades that can
+ be crafted using a Kitchen Knife, Modular Receiver, Rifle Stock and some Cable
+ Coil. Requires a welder to complete.
+ - bugfix: You can now actually craft Switchblades.
+ - bugfix: Switchblades no longer regain their old Makeshift sprite after retracting
+ if you've made them fancy with Silver.
+ - rscadd: 'The Captain''s Wardrobe, a special one-of-a-kind and ID-locked wardrobe
+ for the Captain that holds all of their snowflakey gear. Remove: Snowflake gear
+ from the Captain''s locker, since now it has its own vendor.'
+ Tlaltecuhtli, ported by Hatterhat:
+ - balance: Ripley, Firefighter, Odysseus and H.O.N.K. mechs now also use scanning
+ modules and capacitors on construction. This means that they also gain reduced
+ power consumption and EMP protection from higher-tier stock parts.
+ Trilbyspaceclone:
+ - bugfix: Vault hallway door being all access
+ - server: Updates change logs
+ - rscadd: Crafts are now made of plasteel and can be made with 5 sheets
+ - rscadd: Takes away NT's connections to the Aliens that run the Syndicats
+ - rscadd: Carps have evolved to take more damage
+ - rscadd: restock crates for each vender
+ - rscadd: restock units for all station venders
+ - bugfix: Sec-vender missing icon
+ - bugfix: 'Box station captain office issues maping: Gulag on box can now be accessed'
+ - rscadd: Alien stools and chairs
+ - tweak: Bone armor/Dagger are now crafting from bones rather then crafting menu
+ - rscadd: Firing pins that only works when not on station
+ - rscadd: Medical locked crates
+ - balance: Russian gear crates have less gear in some cases but all will cost more
+ - bugfix: Medical locked crates that were not locked
+ - spellcheck: Crates that were out of date are corrected
+ - balance: Heads of staff have been better screened by NT before being promoted
+ - balance: The suit full of spiders also known as a ninja now is a tactical turtleneck
+ - balance: The Wiznerds now dont have suits set to max
+ - tweak: Meat wheat no longer has blood
+ - bugfix: Flat guns can no longer be suppressed
+ - tweak: replaced stickmans .45 caliber with 10mm, for consistency.
+ - tweak: Meatwheat and Oats now have rarity
+ - balance: Oats now have at lest 50% more flour in them
+ - balance: BDM now uses a PKA rather then a normal KA
+ - tweak: Gang tower shield is no longer transparent
+ - tweak: Cosmic winter coat now glows like the bedsheet, and holds normal winter
+ coat gear
+ - server: Express console is now logging what it buys, like the normal console should
+ - bugfix: Crabs are now made of crab meat.
+ - bugfix: AIs now understand the old ways of drunken dwarfs
+ - balance: Removes some armored Russian hats from box station round start
+ - bugfix: Doner items spawning
+ - balance: Engi/Sec Trek suit no longer has 10% melee protection
+ - bugfix: IPC hearts are now made of robomeat and roboblood thats emp proof. Heals
+ and is all and all just like an normal heart
+ - imageadd: All robotic organs now have an animation.
+ - imageadd: IPC's now organs now look like robotic ones, even tho thats not the
+ case game wise
+ - imageadd: Added a new bee themed bar sign
+ - imageadd: Makes plywood chair not look as bad.
+ - bugfix: corndog sprite being miss-spelled
+ - bugfix: Ash from land of lava now is useable for sandstone
+ - bugfix: Peach cake slices are no long made by mimes
+ Tupinambis:
+ - tweak: the portion of laws that require harm prevention by silicons has been removed.
+ - server: silicon_laws.txt config file is required to be modified for full implementation.
+ - bugfix: masks no longer improperly stick out of helmets when they should be hidden.
+ - bugfix: Status Displays should now update correctly.
+ - balance: stunbatons now take 4 hits to inflict hard crit, up from 3.
+ - balance: stunbatons no longer disarm targets.
+ Yakumo Chen:
+ - rscadd: Rings for your fingers!
+ - rscadd: New cargo crates and loadout options to bling your rings!
+ YakumoChen:
+ - tweak: Observe is back in the OOC tab
+ - imageadd: Rings look nicer. Sprites used from RP.
+ - imageadd: Ring on-hands. Diamond rings sparkle!
+ - tweak: You can now propose using a diamond ring in your hand.
+ - tweak: Legion skulls behave like bees!!!!
+ Zellular:
+ - imageadd: Movement state for pupdozer and its decals
+ - tweak: Tweaked the movement state for the pupdozer's eyes
+ ancientpower:
+ - bugfix: Fixes an error in pH strips' feedback message.
+ - rscadd: Ported drink sliding from /vg/station.
+ - bugfix: Fixes color mismatching with the "genitals use skintone" preference.
+ - imageadd: Bunny ear style for humanoid species.
+ - tweak: Ghosts are now literate.
+ bunny232:
+ - tweak: Changes the simple animal sentience event from the xenomorph preference
+ to sentience potion preference.
+ coiax:
+ - rscadd: Admin and event only pair pinpointers! They come in a box of two, and
+ each pinpointer will always point at its corresponding pair. Aww.
+ deathride58:
+ - bugfix: Spacemen no longer run at lightspeed on local servers.
+ kappa-sama:
+ - bugfix: the plant dudes can actually make plant disks now
+ keronshb:
+ - rscadd: Added repairable turrets
+ - rscadd: Adds Tiny Fans to the pirate ship
+ - tweak: changes some reinforced windows to plastinanium pirate windows
+ - tweak: made the pirate shuttle + turrets bomb resistant
+ - tweak: made most pirate machines + consoles indestructible
+ - tweak: increased pirate turret health
+ - rscadd: Adds the CogChamp drink and Sprite
+ - rscadd: Added burn and knockback to stunhand during HALOS on cult.
+ - balance: Added burn and knockback to stunhand during HALOS on cult.
+ - bugfix: fixed accelerated regeneration nanites
+ - bugfix: fixed mechanical repair nanites
+ - bugfix: fixed bio reconstruction nanites
+ kevinz000:
+ - refactor: Custom snowflake plushies are now in config rather than code.
+ - balance: Abductor mindsnapping (aka abductee objectives) can now be "cured" with
+ brain surgery.
+ - rscadd: Shuttle hijacking has been completely reworked. Alt-click the shuttle
+ as a hijack-capable mind (so traitors, and especially traitors with hijack)
+ to begin or continue a hacking process.
+ - refactor: 'A good amount of the blood RGB rework was cleaned up/reverted, with
+ some notable gameplay changes including: Gibs and blood not having max blood
+ by default (no more easy rampages, cultists), infinite gib streaking, etc etc.'
+ - balance: meteor waves are now directional and announces the direction on the command
+ report.
+ - rscadd: CTF CLAYMORES
+ - balance: shoves buffed, now shoving into a wall twice rapidly will also disarm
+ their weapon.
+ - balance: traitor+bro gamemode minimum population set to 25 until there can be
+ more in depth configuration systems for gamemodes.
+ - bugfix: no more bluespace skittish locker diving,
+ - rscadd: moths now have unique laughs and can *chitter.
+ - tweak: nuke explosion is now full dev radius for anti lag purposes
+ - balance: Gangs can now only tag with a gang uplink bought spraycan.
+ - tweak: dueling pistol accesses have been changed to be more accessible.
+ - bugfix: mechs no longer have admin logs flooding into IC control console log viewing
+ - refactor: Guncode and energy guns have been refactored a bit.
+ - rscadd: You can now combat mode ight click on an energy gun to attempt to switch
+ firing modes. This only works on guns without right click functions overridden.
+ - balance: shoes can now fit magpistols again.
+ - balance: Projectiles now always hit chest if targeting chest, snipers have 100%
+ targeting zone accuracy. All other cases are unchanged.
+ - tweak: The lawyer's PDA cartridge has been rebranded to something more accurate
+ to its true nature.
+ - refactor: Refactored ghostreading/etc
+ - balance: Cyborgization will now de-gang people, even gangheads.
+ - bugfix: reactive repulse armor now has an item limit
+ - bugfix: beam rifle runtime fix during aiming_beam
+ - bugfix: 'fail2topic runtime fix: taking out an ip while incrementing index resulted
+ in accessing the next-next entry instead of the next and results in out of bound
+ errors.'
+ - rscadd: gravity gun repulse and chaos now work in all angles, rather than just
+ basic cardinals and diagonals. fun.
+ - balance: Public autolathes can no longer be hacked.
+ - bugfix: Energy weapons now once again have their lens in contents.
+ - bugfix: pais are no longer muted for literally a whole hour on emp.
+ - rscadd: auto profiler subsystem from tg
+ - bugfix: Brig cells now are more accurate by using timeofday instead of realtime
+ - bugfix: Cryo now actually transfers reagents at tier 4 on enter rather than every
+ 80 machine fire()-process()s regardless of if it was "reset" by open/close.
+ - rscadd: cmo now gets advanced surgery drapes that techweb-sync for advanced surgeries
+ without an operating console.
+ - bugfix: ctf claymores now actually spawn (and fit).
+ - bugfix: STOP_PROCESSING now removes from currentrun to prevent another process
+ cycle from happening where it shouldn't.
+ - balance: hand teleporters now require 30 deciseconds of still movement by the
+ user to dispel portals. there's a beam effect too.
+ - balance: Sort of a bugfix but cult blood magic and all guns now respect stamina
+ softcrit.
+ - balance: Organ healing rate doubled. Organ decay rate halved to match its define
+ (15 minutes for full decay, so at around 8-10 minutes it'll be really fucked).
+ - tweak: Storage now caches max screen size and only stores when being opened by
+ a non ghost, meaning ghosts will no longer distort living player screens when
+ viewing storage.
+ - balance: Stunbatons changed yet again.
+ - tweak: the game's built in autoclicker aka CanMobAutoclick no longer triggers
+ client/Click()'s anti clickspam guard.
+ - balance: pais can no longer bodyblock bullets
+ - balance: pai radio short changed to 3 minutes down from 5
+ - balance: pais are no longer fulltile click opacity.
+ - refactor: vampire "immortal haste" has been reworked to be more reliable and consistent.
+ - tweak: hand teles use a less atrocious beam
+ necromanceranne:
+ - rscadd: Ebows now disarm people hit by them.
+ - rscadd: Ebows now do 60 stamina damage on hit.
+ - rscdel: Ebows no longer inflict drowsiness
+ - balance: Miniature ebows do 15 toxin damage, up from 8.
+ - balance: Ebows have considerably shorter knockdowns.
+ - balance: Ebows now make you slur rather than stutter.
+ - balance: Large ebows are now heavy and bulky.
+ - rscdel: You can no longer order spinfusors or their ammo from cargo.
+ - rscdel: Removed the formal security officer jacket from the secdrobe
+ - tweak: formal security jackets are now armor vests
+ - rscdel: Bullets causing bleed rates equal to unmitigated damage through all forms
+ of defense.
+ - balance: 'Reverted #9092, crew mecha no longer spawn with tracking beacons.'
+ - balance: '[Port] Mecha ballistics weapons now require ammo created from an Exosuit
+ Fabricator or the Security Protolathe, though they will start with a full magazine
+ and in most cases enough for one full reload. Reloading these weapons no longer
+ chunks your power cell. Clown (and mime) mecha equipment have not changed.'
+ - balance: '[Port] The SRM-8 Missile Launcher has been replaced with the BRM-6 Breaching
+ Missile Launcher in techwebs (Nukie Mauler remains equipped with the SRM-8).'
+ - balance: '[Port] Both Missile Launchers and the Clusterbang Launcher do not have
+ an ammo cache, and cannot be reloaded by the pilot. Once the initial loaded
+ ammo has been spent, you can use the appropriate ammo box to load the weapon
+ directly.'
+ - rscadd: '[Port] Utility mechs that have a clamp equipped can load ammo from their
+ own cargo hold into other mechs.'
+ - rscadd: '[Port] Nuke Ops can purchase spare ammo duffel bags for their mecha weapons,
+ should they run low.'
+ - bugfix: Literally unclickability with a cham projector
+ nemvar:
+ - code_imp: Slight changes the self-repair borg module. It no longer references
+ the borg that owns it.
+ - bugfix: Trash from food now gets generated at the location of the food item, instead
+ of in the hands of the eater.
+ - code_imp: Changed mob biotypes from lists to flags.
+ r4d6:
+ - rscadd: Added a dwarf language
+ - rscadd: Added more engines
+ - tweak: RPD subcategories and preview icons reorganized.
+ - rscadd: RPD now starts with painting turned off, hitting pipes with build and
+ no paint will target the turf underneath instead. Bye bye turf pixelhunting.
+ - config: Made dwarves into a roundstart races
+ - tweak: Meteor Timer back to 3-5 minutes
+ - bugfix: Mining no longer lead to spess
+ - rscadd: Added Plasteel Pickaxe
+ - rscadd: Added Titanium Pickaxe
+ - bugfix: fixed a missing tile
+ tralezab, bandit, Skoglol:
+ - rscadd: The mime's PDA messages are silent now!
+ - rscadd: 30 new emoji have been added. Mime buff, mime now OP.
diff --git a/html/changelogs/AutoChangeLog-pr-10277.yml b/html/changelogs/AutoChangeLog-pr-10277.yml
deleted file mode 100644
index d2c873d010..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10277.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - refactor: "Custom snowflake plushies are now in config rather than code."
diff --git a/html/changelogs/AutoChangeLog-pr-10295.yml b/html/changelogs/AutoChangeLog-pr-10295.yml
deleted file mode 100644
index a776275e6e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10295.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "Abductor mindsnapping (aka abductee objectives) can now be \"cured\" with brain surgery."
diff --git a/html/changelogs/AutoChangeLog-pr-10352.yml b/html/changelogs/AutoChangeLog-pr-10352.yml
deleted file mode 100644
index 7879bc1de1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10352.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - tweak: "tweaked the way the SM works"
diff --git a/html/changelogs/AutoChangeLog-pr-10414.yml b/html/changelogs/AutoChangeLog-pr-10414.yml
deleted file mode 100644
index 25750a889d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10414.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CameronWoof"
-delete-after: True
-changes:
- - tweak: "Lighting looks better now. I can say that because the PR wouldn't be merged and you wouldn't be reading this if it wasn't true."
diff --git a/html/changelogs/AutoChangeLog-pr-10451.yml b/html/changelogs/AutoChangeLog-pr-10451.yml
new file mode 100644
index 0000000000..7162e2dafd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10451.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - code_imp: "Mobility flags are here. Fixed some edge cases with xeno hardstuns and similar stuff like warden's shotgun hardstuns and yeah."
diff --git a/html/changelogs/AutoChangeLog-pr-10559.yml b/html/changelogs/AutoChangeLog-pr-10559.yml
deleted file mode 100644
index a48fc6c289..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10559.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - rscadd: "custom reagent pie smite"
diff --git a/html/changelogs/AutoChangeLog-pr-10572.yml b/html/changelogs/AutoChangeLog-pr-10572.yml
deleted file mode 100644
index d18e2d9e93..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10572.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Tupinambis"
-delete-after: True
-changes:
- - tweak: "the portion of laws that require harm prevention by silicons has been removed."
- - server: "silicon_laws.txt config file is required to be modified for full implementation."
diff --git a/html/changelogs/AutoChangeLog-pr-10575.yml b/html/changelogs/AutoChangeLog-pr-10575.yml
deleted file mode 100644
index c81ed76026..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10575.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - rscadd: "Replaces a lot of ingame UIs with TGUI next, increasing performance drastically."
diff --git a/html/changelogs/AutoChangeLog-pr-10583.yml b/html/changelogs/AutoChangeLog-pr-10583.yml
deleted file mode 100644
index e743fca877..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10583.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - admin: "Added logging to various consent things."
diff --git a/html/changelogs/AutoChangeLog-pr-10590.yml b/html/changelogs/AutoChangeLog-pr-10590.yml
deleted file mode 100644
index e59c8decf0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10590.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-author: "KathrinBailey"
-delete-after: True
-changes:
- - bugfix: "Missing turf_decals in Cargo Office."
- - bugfix: "Turns on the docking beacons on Box."
- - bugfix: "Fixes Starboard Quarter maint room being spaced. It was never intended to be like how it was."
- - bugfix: "The aforementioned maint room not having stuff in it."
- - bugfix: "varedited photocopier sometimes not opening any UI."
- - bugfix: "Atmos differences in Starboard Quarter maint."
- - bugfix: "Atmos differences in destroyed shuttle/EVA bridge. Plating replaced with airless plating."
- - bugfix: "Rotates AI satellite computers. These have probably been like this since computers had the old sprites and no directional ones. You shouldn't sit at a chair to operate a sideways computer."
diff --git a/html/changelogs/AutoChangeLog-pr-10596.yml b/html/changelogs/AutoChangeLog-pr-10596.yml
deleted file mode 100644
index 7f56a256a0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10596.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - rscadd: "hijack implant"
- - code_imp: "changed mentions of the issilion proc to hasSiliconAccessInArea based on what the proc is used for"
diff --git a/html/changelogs/AutoChangeLog-pr-10623.yml b/html/changelogs/AutoChangeLog-pr-10623.yml
deleted file mode 100644
index 623560f7d2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10623.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - rscadd: "Lots of new traitor objectives"
diff --git a/html/changelogs/AutoChangeLog-pr-10644.yml b/html/changelogs/AutoChangeLog-pr-10644.yml
deleted file mode 100644
index b7544495d7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10644.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShadeAware"
-delete-after: True
-changes:
- - rscadd: "Craftable Switchblades, a weaker subtype of normal switchblades that can be crafted using a Kitchen Knife, Modular Receiver, Rifle Stock and some Cable Coil. Requires a welder to complete."
diff --git a/html/changelogs/AutoChangeLog-pr-10649.yml b/html/changelogs/AutoChangeLog-pr-10649.yml
deleted file mode 100644
index 04e3569ad3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10649.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - rscadd: "Shuttle hijacking has been completely reworked. Alt-click the shuttle as a hijack-capable mind (so traitors, and especially traitors with hijack) to begin or continue a hacking process."
diff --git a/html/changelogs/AutoChangeLog-pr-10700.yml b/html/changelogs/AutoChangeLog-pr-10700.yml
deleted file mode 100644
index 296ebe4d99..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10700.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - tweak: "The anomalous honking crystal should now properly clown your mind."
diff --git a/html/changelogs/AutoChangeLog-pr-10704.yml b/html/changelogs/AutoChangeLog-pr-10704.yml
deleted file mode 100644
index 1acd46b51f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10704.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "nemvar"
-delete-after: True
-changes:
- - code_imp: "Slight changes the self-repair borg module. It no longer references the borg that owns it."
diff --git a/html/changelogs/AutoChangeLog-pr-10705.yml b/html/changelogs/AutoChangeLog-pr-10705.yml
deleted file mode 100644
index f1f025d616..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10705.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - refactor: "A good amount of the blood RGB rework was cleaned up/reverted, with some notable gameplay changes including: Gibs and blood not having max blood by default (no more easy rampages, cultists), infinite gib streaking, etc etc."
diff --git a/html/changelogs/AutoChangeLog-pr-10706.yml b/html/changelogs/AutoChangeLog-pr-10706.yml
deleted file mode 100644
index 8bf1cd449c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10706.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Stopped the ellipsis question mark from being displayed twice in the examine message for masked/unknown human mobs."
- - tweak: "Made the aforementioned ellipsis question mark display on flavor-text-less masked/unknown human mobs too for consistency."
diff --git a/html/changelogs/AutoChangeLog-pr-10709.yml b/html/changelogs/AutoChangeLog-pr-10709.yml
deleted file mode 100644
index 8c9d74c5f1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10709.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - rscadd: "recipe for mammal mutation toxin"
diff --git a/html/changelogs/AutoChangeLog-pr-10728.yml b/html/changelogs/AutoChangeLog-pr-10728.yml
deleted file mode 100644
index 9023844565..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10728.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "meteor waves are now directional and announces the direction on the command report."
diff --git a/html/changelogs/AutoChangeLog-pr-10731.yml b/html/changelogs/AutoChangeLog-pr-10731.yml
deleted file mode 100644
index 0da6f3c483..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10731.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-author: "necromanceranne"
-delete-after: True
-changes:
- - rscadd: "Ebows now disarm people hit by them."
- - rscadd: "Ebows now do 60 stamina damage on hit."
- - rscdel: "Ebows no longer inflict drowsiness"
- - balance: "Miniature ebows do 15 toxin damage, up from 8."
- - balance: "Ebows have considerably shorter knockdowns."
- - balance: "Ebows now make you slur rather than stutter."
- - balance: "Large ebows are now heavy and bulky."
diff --git a/html/changelogs/AutoChangeLog-pr-10733.yml b/html/changelogs/AutoChangeLog-pr-10733.yml
deleted file mode 100644
index 33e2ee216c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10733.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - balance: "Zombie powder is now instant when ingested, but delayed when injected or applied through touch."
diff --git a/html/changelogs/AutoChangeLog-pr-10737.yml b/html/changelogs/AutoChangeLog-pr-10737.yml
deleted file mode 100644
index fa4023c148..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10737.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Stopped an APTFT exploit with spray bottles."
diff --git a/html/changelogs/AutoChangeLog-pr-10739.yml b/html/changelogs/AutoChangeLog-pr-10739.yml
deleted file mode 100644
index 8212e71353..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10739.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "r4d6"
-delete-after: True
-changes:
- - rscadd: "Added a dwarf language"
diff --git a/html/changelogs/AutoChangeLog-pr-10742.yml b/html/changelogs/AutoChangeLog-pr-10742.yml
deleted file mode 100644
index ece862d112..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10742.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed the detective revolver being quite risky to use."
diff --git a/html/changelogs/AutoChangeLog-pr-10743.yml b/html/changelogs/AutoChangeLog-pr-10743.yml
deleted file mode 100644
index d9775f7bc3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10743.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "necromanceranne"
-delete-after: True
-changes:
- - rscdel: "You can no longer order spinfusors or their ammo from cargo."
diff --git a/html/changelogs/AutoChangeLog-pr-10744.yml b/html/changelogs/AutoChangeLog-pr-10744.yml
deleted file mode 100644
index 168619226a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10744.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "r4d6"
-delete-after: True
-changes:
- - rscadd: "Added more engines"
diff --git a/html/changelogs/AutoChangeLog-pr-10746.yml b/html/changelogs/AutoChangeLog-pr-10746.yml
deleted file mode 100644
index 232c7a26b9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10746.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - rscadd: "CTF CLAYMORES"
diff --git a/html/changelogs/AutoChangeLog-pr-10747.yml b/html/changelogs/AutoChangeLog-pr-10747.yml
deleted file mode 100644
index 54ca25e12a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10747.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "shoves buffed, now shoving into a wall twice rapidly will also disarm their weapon."
diff --git a/html/changelogs/AutoChangeLog-pr-10749.yml b/html/changelogs/AutoChangeLog-pr-10749.yml
deleted file mode 100644
index a3ed5989d1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10749.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "AnturK ported by kevinz000"
-delete-after: True
-changes:
- - rscadd: "Dueling pistols have been added."
diff --git a/html/changelogs/AutoChangeLog-pr-10751.yml b/html/changelogs/AutoChangeLog-pr-10751.yml
deleted file mode 100644
index c5b54bd4ed..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10751.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "traitor+bro gamemode minimum population set to 25 until there can be more in depth configuration systems for gamemodes."
diff --git a/html/changelogs/AutoChangeLog-pr-10752.yml b/html/changelogs/AutoChangeLog-pr-10752.yml
deleted file mode 100644
index 9bb50f1da1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10752.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: "Owai-Seek"
-delete-after: True
-changes:
- - rscadd: "Burger, Cargo Packaging, Dirty Magazine, Air Pump, and Scrubber crates."
- - rscdel: "Duplicate Crate, Festive Wrapping Paper Crate, Contraband Monkey Meat Crate"
- - tweak: "Gave Seed Crate Ambrosia Seed, gave Biker Gang Crate Spraypaint."
- - tweak: "Organised some crates with sub-categories. Also, moved all vendor refills to a new tab."
- - tweak: "Moved Grill to Service Tab"
- - bugfix: "Engineering Hardsuit Access"
diff --git a/html/changelogs/AutoChangeLog-pr-10754.yml b/html/changelogs/AutoChangeLog-pr-10754.yml
deleted file mode 100644
index 0537347443..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10754.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "MalricB"
-delete-after: True
-changes:
- - rscadd: "\"Shaggy\" sprite from virgo"
- - rscadd: "\"shaggy\" option in the character customization"
diff --git a/html/changelogs/AutoChangeLog-pr-10761.yml b/html/changelogs/AutoChangeLog-pr-10761.yml
deleted file mode 100644
index 5a5b7281ef..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10761.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "gender change potion now respects prefs"
diff --git a/html/changelogs/AutoChangeLog-pr-10764.yml b/html/changelogs/AutoChangeLog-pr-10764.yml
deleted file mode 100644
index 25dfebd5fb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10764.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "deathride58"
-delete-after: True
-changes:
- - bugfix: "Spacemen no longer run at lightspeed on local servers."
diff --git a/html/changelogs/AutoChangeLog-pr-10765.yml b/html/changelogs/AutoChangeLog-pr-10765.yml
deleted file mode 100644
index 975a3ac5c5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10765.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - bugfix: "no more bluespace skittish locker diving,"
diff --git a/html/changelogs/AutoChangeLog-pr-10768.yml b/html/changelogs/AutoChangeLog-pr-10768.yml
deleted file mode 100644
index 0a07505b5b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10768.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - rscadd: "moths now have unique laughs and can *chitter."
diff --git a/html/changelogs/AutoChangeLog-pr-10774.yml b/html/changelogs/AutoChangeLog-pr-10774.yml
deleted file mode 100644
index f596bdcddb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10774.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - tweak: "nuke explosion is now full dev radius for anti lag purposes"
diff --git a/html/changelogs/AutoChangeLog-pr-10776.yml b/html/changelogs/AutoChangeLog-pr-10776.yml
deleted file mode 100644
index cd95cb49d4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10776.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - tweak: "The H.E.C.K. suit is now goliath tentacle resistant and probably better for acid resistance."
diff --git a/html/changelogs/AutoChangeLog-pr-10777.yml b/html/changelogs/AutoChangeLog-pr-10777.yml
deleted file mode 100644
index 76ce4000d8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10777.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "Gangs can now only tag with a gang uplink bought spraycan."
diff --git a/html/changelogs/AutoChangeLog-pr-10781.yml b/html/changelogs/AutoChangeLog-pr-10781.yml
deleted file mode 100644
index cd3474adca..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10781.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "r4d6"
-delete-after: True
-changes:
- - tweak: "RPD subcategories and preview icons reorganized."
- - rscadd: "RPD now starts with painting turned off, hitting pipes with build and no paint will target the turf underneath instead. Bye bye turf pixelhunting."
diff --git a/html/changelogs/AutoChangeLog-pr-10782.yml b/html/changelogs/AutoChangeLog-pr-10782.yml
deleted file mode 100644
index f66e75a113..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10782.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - tweak: "dueling pistol accesses have been changed to be more accessible."
diff --git a/html/changelogs/AutoChangeLog-pr-10784.yml b/html/changelogs/AutoChangeLog-pr-10784.yml
deleted file mode 100644
index 0e5cfc8740..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10784.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - rscadd: "polychromic winter coat"
diff --git a/html/changelogs/AutoChangeLog-pr-10786.yml b/html/changelogs/AutoChangeLog-pr-10786.yml
deleted file mode 100644
index 7e758122a2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10786.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Commandersand"
-delete-after: True
-changes:
- - tweak: "uplink centcomm suit doesn't have sensors"
diff --git a/html/changelogs/AutoChangeLog-pr-10787.yml b/html/changelogs/AutoChangeLog-pr-10787.yml
deleted file mode 100644
index ee221b69f3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10787.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - rscadd: "thief's gloves"
diff --git a/html/changelogs/AutoChangeLog-pr-10788.yml b/html/changelogs/AutoChangeLog-pr-10788.yml
deleted file mode 100644
index 344f6764d8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10788.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - rscadd: "crushing magboots"
diff --git a/html/changelogs/AutoChangeLog-pr-10790.yml b/html/changelogs/AutoChangeLog-pr-10790.yml
deleted file mode 100644
index 43f949ce16..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10790.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Hair styles and undergarments are yet again free from gender restrictions."
diff --git a/html/changelogs/AutoChangeLog-pr-10791.yml b/html/changelogs/AutoChangeLog-pr-10791.yml
deleted file mode 100644
index 3d27f84022..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10791.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - rscadd: "Each night for bloodsuckers will last longer due to the sun dimming."
- - tweak: "You cant level up for free, now you have to pay blood for power."
- - balance: "Bloodsuckers are no longer as resistant to hard stuns and regenerate less stamina. and a lot of their cooldowns are a lot higher."
diff --git a/html/changelogs/AutoChangeLog-pr-10792.yml b/html/changelogs/AutoChangeLog-pr-10792.yml
deleted file mode 100644
index 78c86a838a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10792.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - bugfix: "Odysseus chem synthesizing now works again."
diff --git a/html/changelogs/AutoChangeLog-pr-10793.yml b/html/changelogs/AutoChangeLog-pr-10793.yml
deleted file mode 100644
index 21cfc5d539..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10793.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Tupinambis"
-delete-after: True
-changes:
- - bugfix: "masks no longer improperly stick out of helmets when they should be hidden."
diff --git a/html/changelogs/AutoChangeLog-pr-10795.yml b/html/changelogs/AutoChangeLog-pr-10795.yml
deleted file mode 100644
index b929aad0a5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10795.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShadeAware"
-delete-after: True
-changes:
- - bugfix: "You can now actually craft Switchblades."
diff --git a/html/changelogs/AutoChangeLog-pr-10796.yml b/html/changelogs/AutoChangeLog-pr-10796.yml
deleted file mode 100644
index 238fc3a8c7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10796.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Tupinambis"
-delete-after: True
-changes:
- - bugfix: "Status Displays should now update correctly."
diff --git a/html/changelogs/AutoChangeLog-pr-10798.yml b/html/changelogs/AutoChangeLog-pr-10798.yml
deleted file mode 100644
index 637343c7b6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10798.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "necromanceranne"
-delete-after: True
-changes:
- - rscdel: "Removed the formal security officer jacket from the secdrobe"
- - tweak: "formal security jackets are now armor vests"
diff --git a/html/changelogs/AutoChangeLog-pr-10799.yml b/html/changelogs/AutoChangeLog-pr-10799.yml
deleted file mode 100644
index 2d49bdc63f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10799.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - bugfix: "golden plastitanium toolbox being actually plastitanuium"
diff --git a/html/changelogs/AutoChangeLog-pr-10800.yml b/html/changelogs/AutoChangeLog-pr-10800.yml
deleted file mode 100644
index 3486e47b1f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10800.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - bugfix: "character slot amount"
diff --git a/html/changelogs/AutoChangeLog-pr-10801.yml b/html/changelogs/AutoChangeLog-pr-10801.yml
deleted file mode 100644
index 36db98e9e1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10801.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - balance: "rebalanced rising bass"
diff --git a/html/changelogs/AutoChangeLog-pr-10803.yml b/html/changelogs/AutoChangeLog-pr-10803.yml
deleted file mode 100644
index bc50fcc700..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10803.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - bugfix: "string highlighting whitespace"
diff --git a/html/changelogs/AutoChangeLog-pr-10808.yml b/html/changelogs/AutoChangeLog-pr-10808.yml
deleted file mode 100644
index 89e8880af8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10808.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - rscdel: "Removed text macros from the chem dispenser."
- - rscadd: "Replaced with dispenser input recording macros."
diff --git a/html/changelogs/AutoChangeLog-pr-10809.yml b/html/changelogs/AutoChangeLog-pr-10809.yml
deleted file mode 100644
index 2a6c1dcdb8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10809.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - bugfix: "Fancifying makeshift switchblades now works"
diff --git a/html/changelogs/AutoChangeLog-pr-10810.yml b/html/changelogs/AutoChangeLog-pr-10810.yml
deleted file mode 100644
index 3d1693955a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10810.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Yakumo Chen"
-delete-after: True
-changes:
- - rscadd: "Rings for your fingers!"
- - rscadd: "New cargo crates and loadout options to bling your rings!"
diff --git a/html/changelogs/AutoChangeLog-pr-10812.yml b/html/changelogs/AutoChangeLog-pr-10812.yml
deleted file mode 100644
index 1189a9f8d2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10812.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Tupinambis"
-delete-after: True
-changes:
- - balance: "stunbatons now take 4 hits to inflict hard crit, up from 3."
- - balance: "stunbatons no longer disarm targets."
diff --git a/html/changelogs/AutoChangeLog-pr-10816.yml b/html/changelogs/AutoChangeLog-pr-10816.yml
deleted file mode 100644
index 9538f353ec..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10816.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ancientpower"
-delete-after: True
-changes:
- - bugfix: "Fixes an error in pH strips' feedback message."
diff --git a/html/changelogs/AutoChangeLog-pr-10817.yml b/html/changelogs/AutoChangeLog-pr-10817.yml
deleted file mode 100644
index cf42f695ef..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10817.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "IronEleven"
-delete-after: True
-changes:
- - balance: "Minor stat changes to Choking, Spontaneous Combustion, Autophagocytosis Necrosis, Hallucigen, Narcolepsy, Shivering, and Vomiting symptoms."
diff --git a/html/changelogs/AutoChangeLog-pr-10819.yml b/html/changelogs/AutoChangeLog-pr-10819.yml
deleted file mode 100644
index 406da850b3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10819.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - tweak: "Clown ops will find bombananas and clown bomb beacons instead of minibombs and bomb beacons in their infiltrator ship now."
- - tweak: "For safety, the syndicate shuttle minibombs and bombananas come shipped in a box. Please don't instinctively eat any of those nanas, thank you."
diff --git a/html/changelogs/AutoChangeLog-pr-10820.yml b/html/changelogs/AutoChangeLog-pr-10820.yml
deleted file mode 100644
index 7833ab7250..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10820.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - tweak: "Uplink items excluded (such as mulligan, chameleon, ebow) from or exclusive (such as cyber implants) to normal nuke ops will now be properly unavailable/available to clown ops."
diff --git a/html/changelogs/AutoChangeLog-pr-10821.yml b/html/changelogs/AutoChangeLog-pr-10821.yml
deleted file mode 100644
index a1661764cf..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10821.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ShadeAware"
-delete-after: True
-changes:
- - bugfix: "Switchblades no longer regain their old Makeshift sprite after retracting if you've made them fancy with Silver."
diff --git a/html/changelogs/AutoChangeLog-pr-10829.yml b/html/changelogs/AutoChangeLog-pr-10829.yml
deleted file mode 100644
index 9866f21fc7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10829.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed bananium energy sword/shield slips."
- - balance: "Buffed said slips to ignore no-grav/crawling/flying as well as adding some deadly force to the e-sword."
- - bugfix: "Fixed the 'stache grenade anti-non-clumsy user check."
- - balance: "Doubled the timer for the sticky mustaches effect from the above grenade (from 1 to 2 minutes)"
diff --git a/html/changelogs/AutoChangeLog-pr-10830.yml b/html/changelogs/AutoChangeLog-pr-10830.yml
deleted file mode 100644
index 0d7b5d56b3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10830.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - bugfix: "glitch with PKA"
diff --git a/html/changelogs/AutoChangeLog-pr-10831.yml b/html/changelogs/AutoChangeLog-pr-10831.yml
deleted file mode 100644
index 477df49370..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10831.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed an edge case with the chaplain armaments beacon spawning the box in nullspace."
diff --git a/html/changelogs/AutoChangeLog-pr-10833.yml b/html/changelogs/AutoChangeLog-pr-10833.yml
deleted file mode 100644
index d4b612f622..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10833.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - tweak: "The playback device's cooldown now proportionally increases with messages longer than 60 characters (3 seconds is the default assembly cooldown)."
diff --git a/html/changelogs/AutoChangeLog-pr-10834.yml b/html/changelogs/AutoChangeLog-pr-10834.yml
deleted file mode 100644
index 1db0ee8988..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10834.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - rscadd: "Crafts are now made of plasteel and can be made with 5 sheets"
diff --git a/html/changelogs/AutoChangeLog-pr-10836.yml b/html/changelogs/AutoChangeLog-pr-10836.yml
deleted file mode 100644
index d2c9328aa7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10836.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "The Engineering techfab can now print standard and large RCD compressed matter cartridges."
- - rscadd: "The Experimental Tools node now has the Combifan projector, blocking both temperature and atmospheric changes."
diff --git a/html/changelogs/AutoChangeLog-pr-10837.yml b/html/changelogs/AutoChangeLog-pr-10837.yml
deleted file mode 100644
index 72fee452c1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10837.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Owai-Seek"
-delete-after: True
-changes:
- - tweak: "Blood Crate now has all of the current blood types."
- - tweak: "Birthday Cake Recipe is now the same as TG."
- - tweak: "Added Soy Sauce and BBQ Packets to Dinnerware Vendor."
diff --git a/html/changelogs/AutoChangeLog-pr-10838.yml b/html/changelogs/AutoChangeLog-pr-10838.yml
deleted file mode 100644
index b6fbb864dd..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10838.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Owai-Seek"
-delete-after: True
-changes:
- - tweak: "Added nurse outfit, nurse cap, and mailman hat to loadout."
- - tweak: "Changed the name of scrubs to blue, green, and purple scrubs."
diff --git a/html/changelogs/AutoChangeLog-pr-10840.yml b/html/changelogs/AutoChangeLog-pr-10840.yml
deleted file mode 100644
index 26c9ab71b6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10840.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - admin: "Panic bunker is now round-to-round persistent"
diff --git a/html/changelogs/AutoChangeLog-pr-10841.yml b/html/changelogs/AutoChangeLog-pr-10841.yml
deleted file mode 100644
index 58e083fe85..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10841.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Kraseo"
-delete-after: True
-changes:
- - bugfix: "You can no longer pull before wearing boxing gloves to bypass the grab check."
diff --git a/html/changelogs/AutoChangeLog-pr-10847.yml b/html/changelogs/AutoChangeLog-pr-10847.yml
deleted file mode 100644
index 3e18420cb3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10847.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed space ninjas \"Nothing\" objective. Now you gotta steal some dandy stuff such as corgi meat and pinpointers as a ninja too."
diff --git a/html/changelogs/AutoChangeLog-pr-10848.yml b/html/changelogs/AutoChangeLog-pr-10848.yml
deleted file mode 100644
index b620b95ba7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10848.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-author: "Ghommie (original PRs by Floyd/Qustinnus, 4Dplanner, Willox, ninjanomnom, mrdoombringer, Fikou, Fox McCloud, TheChosenEvilOne, nemvar, bobbahbrown, Time-Green, Stonebaykyle, MrPerson, ArcaneMusic and zxaber)"
-delete-after: True
-changes:
- - rscadd: "You can now make toolboxes out of almost any solid material in an autolathe"
- - rscadd: "adds Knight's Armour made out of any materials"
- - rscadd: "new ruin found in lavaland protected by dark wizards, I wonder what they're guarding"
- - rscadd: "You can now put a bunch more mats in the coin mint and autolathe"
- - rscadd: "Adamantine and Mythril are now materials (Adamantine still only from xenobio, Mythril still only from badminnery). Adamantine boosts an item's force by 1.5, Mythril gives an item RPG statistics."
- - rscdel: "most custom sprites for coins have been lost"
- - rscadd: "You can now give your ass acute radiation poisoning"
- - rscadd: "floydmats now apply to all objs / items"
- - rscadd: "you can now make tables and chairs out of any material"
- - bugfix: "Fixes being able to exploit fully upgraded destructive analyzers to multiply materials"
- - rscadd: "An old monastery from a previously abandoned sector of space has recently resurfaced in some regions surrounding the station."
- - rscadd: "Latent scans of the surrounding systems have picked up trace signs of new, smaller cult constructs, however these signatures quickly vanished."
- - rscadd: "In other news, scavengers in your sector have been seen occasionally with classically recreated maces, so autolathe firmware has been upgraded to accommodate this."
diff --git a/html/changelogs/AutoChangeLog-pr-10850.yml b/html/changelogs/AutoChangeLog-pr-10850.yml
deleted file mode 100644
index 5cfbd4ab1c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10850.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed maploaded APC terminals direction."
diff --git a/html/changelogs/AutoChangeLog-pr-10852.yml b/html/changelogs/AutoChangeLog-pr-10852.yml
deleted file mode 100644
index 5d6edfba1b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10852.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - rscdel: "Removed meteor defense tech node"
diff --git a/html/changelogs/AutoChangeLog-pr-10854.yml b/html/changelogs/AutoChangeLog-pr-10854.yml
deleted file mode 100644
index b01532daf4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10854.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - bugfix: "meteor hallucinations (again)"
diff --git a/html/changelogs/AutoChangeLog-pr-10855.yml b/html/changelogs/AutoChangeLog-pr-10855.yml
deleted file mode 100644
index 1920609508..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10855.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - rscadd: "Takes away NT's connections to the Aliens that run the Syndicats"
diff --git a/html/changelogs/AutoChangeLog-pr-10857.yml b/html/changelogs/AutoChangeLog-pr-10857.yml
deleted file mode 100644
index ae8c5f6ac0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10857.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - rscadd: "Added naked hallucination"
diff --git a/html/changelogs/AutoChangeLog-pr-10860.yml b/html/changelogs/AutoChangeLog-pr-10860.yml
deleted file mode 100644
index 5de723e73b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10860.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Bhijn"
-delete-after: True
-changes:
- - tweak: "Click-dragging will now only perform the quick item usage behavior if you're in combat mode."
diff --git a/html/changelogs/AutoChangeLog-pr-10861.yml b/html/changelogs/AutoChangeLog-pr-10861.yml
deleted file mode 100644
index 5071cc30f9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10861.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ancientpower"
-delete-after: True
-changes:
- - rscadd: "Ported drink sliding from /vg/station."
diff --git a/html/changelogs/AutoChangeLog-pr-10862.yml b/html/changelogs/AutoChangeLog-pr-10862.yml
deleted file mode 100644
index 0e08046d07..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10862.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - tweak: "fiddles with the seed extractor upgrade examine to make it not shit"
diff --git a/html/changelogs/AutoChangeLog-pr-10865.yml b/html/changelogs/AutoChangeLog-pr-10865.yml
deleted file mode 100644
index a929bab8a1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10865.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - balance: "Nerfed magnetic rifles/pistols by re(?)adding power cell requirements for it. These firearms must be recharged after firing 2 magazines worth of projectiles and are slightly more susceptible to EMPs."
diff --git a/html/changelogs/AutoChangeLog-pr-10866.yml b/html/changelogs/AutoChangeLog-pr-10866.yml
deleted file mode 100644
index f5f99207a5..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10866.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ancientpower"
-delete-after: True
-changes:
- - bugfix: "Fixes color mismatching with the \"genitals use skintone\" preference."
diff --git a/html/changelogs/AutoChangeLog-pr-10867.yml b/html/changelogs/AutoChangeLog-pr-10867.yml
deleted file mode 100644
index 3e3b1c460f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10867.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed the tearstache nade not properly working."
- - balance: "Buffed it against space helmet internals."
diff --git a/html/changelogs/AutoChangeLog-pr-10868.yml b/html/changelogs/AutoChangeLog-pr-10868.yml
deleted file mode 100644
index 629f93585a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10868.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - tweak: "Holographic fans won't display above mobs and other objects anymore."
diff --git a/html/changelogs/AutoChangeLog-pr-10869.yml b/html/changelogs/AutoChangeLog-pr-10869.yml
deleted file mode 100644
index c8317e134f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10869.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - bugfix: "mechs no longer have admin logs flooding into IC control console log viewing"
diff --git a/html/changelogs/AutoChangeLog-pr-10870.yml b/html/changelogs/AutoChangeLog-pr-10870.yml
deleted file mode 100644
index 672e6abdbc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10870.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed paraplegics appearing as shoeless."
diff --git a/html/changelogs/AutoChangeLog-pr-10872.yml b/html/changelogs/AutoChangeLog-pr-10872.yml
deleted file mode 100644
index 4a61daa9bb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10872.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - balance: "Shields will no longer block lasers, and will break if they take too much damage."
diff --git a/html/changelogs/AutoChangeLog-pr-10873.yml b/html/changelogs/AutoChangeLog-pr-10873.yml
deleted file mode 100644
index 0e9bca3f95..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10873.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - tweak: "Relief valve now has a TGUI-next UI"
diff --git a/html/changelogs/AutoChangeLog-pr-10875.yml b/html/changelogs/AutoChangeLog-pr-10875.yml
deleted file mode 100644
index f693bd7c8b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10875.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ancientpower"
-delete-after: True
-changes:
- - imageadd: "Bunny ear style for humanoid species."
diff --git a/html/changelogs/AutoChangeLog-pr-10876.yml b/html/changelogs/AutoChangeLog-pr-10876.yml
deleted file mode 100644
index 9347a655cc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10876.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed slipping."
diff --git a/html/changelogs/AutoChangeLog-pr-10877.yml b/html/changelogs/AutoChangeLog-pr-10877.yml
new file mode 100644
index 0000000000..4cf54b422f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10877.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - rscadd: "Security now has riot quarterstaves in their lethal shotgun locker."
diff --git a/html/changelogs/AutoChangeLog-pr-10881.yml b/html/changelogs/AutoChangeLog-pr-10881.yml
deleted file mode 100644
index 7c00713eae..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10881.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - refactor: "Refactored mob holders into an element."
- - bugfix: "Fixed a few minor issues with that feature. such as mismatching sprites for certain held mobs and a slight lack of safety checks."
- - rscdel: "holdable mobs can't force themselves into people's hands anymore."
diff --git a/html/changelogs/AutoChangeLog-pr-10883.yml b/html/changelogs/AutoChangeLog-pr-10883.yml
deleted file mode 100644
index f99613d846..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10883.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "ancientpower"
-delete-after: True
-changes:
- - tweak: "Ghosts are now literate."
diff --git a/html/changelogs/AutoChangeLog-pr-10885.yml b/html/changelogs/AutoChangeLog-pr-10885.yml
deleted file mode 100644
index bcc19eb9d2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10885.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Milkies fix."
diff --git a/html/changelogs/AutoChangeLog-pr-10892.yml b/html/changelogs/AutoChangeLog-pr-10892.yml
deleted file mode 100644
index 88f12ef378..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10892.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - refactor: "Guncode and energy guns have been refactored a bit."
- - rscadd: "You can now combat mode ight click on an energy gun to attempt to switch firing modes. This only works on guns without right click functions overridden."
diff --git a/html/changelogs/AutoChangeLog-pr-10893.yml b/html/changelogs/AutoChangeLog-pr-10893.yml
deleted file mode 100644
index a0be6a5b6b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10893.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - rscadd: "Added a TGUI Next interface for crafting"
- - rscdel: "Removed the old TGUI slow crafting interface"
diff --git a/html/changelogs/AutoChangeLog-pr-10894.yml b/html/changelogs/AutoChangeLog-pr-10894.yml
deleted file mode 100644
index 770308755d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10894.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - rscadd: "Carps have evolved to take more damage"
diff --git a/html/changelogs/AutoChangeLog-pr-10898.yml b/html/changelogs/AutoChangeLog-pr-10898.yml
deleted file mode 100644
index 7c7198105f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10898.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "EmeraldSundisk"
-delete-after: True
-changes:
- - bugfix: "Connects mining's disposal unit on Delta."
- - tweak: "Slight visual adjustments to the immediate affected area."
diff --git a/html/changelogs/AutoChangeLog-pr-10899.yml b/html/changelogs/AutoChangeLog-pr-10899.yml
deleted file mode 100644
index f1542b2b09..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10899.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - rscadd: "restock crates for each vender"
- - rscadd: "restock units for all station venders"
- - bugfix: "Sec-vender missing icon"
diff --git a/html/changelogs/AutoChangeLog-pr-10900.yml b/html/changelogs/AutoChangeLog-pr-10900.yml
deleted file mode 100644
index 0f79245c73..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10900.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Atmos reaction priority works now."
diff --git a/html/changelogs/AutoChangeLog-pr-10901.yml b/html/changelogs/AutoChangeLog-pr-10901.yml
deleted file mode 100644
index 57c1d821f7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10901.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - bugfix: "Box station captain office issues
-maping: Gulag on box can now be accessed"
diff --git a/html/changelogs/AutoChangeLog-pr-10902.yml b/html/changelogs/AutoChangeLog-pr-10902.yml
deleted file mode 100644
index 9a60860f3f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10902.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed some mounted defibrillator issue with the altclicking functionality."
diff --git a/html/changelogs/AutoChangeLog-pr-10903.yml b/html/changelogs/AutoChangeLog-pr-10903.yml
deleted file mode 100644
index a353d6594a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10903.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "Formaldehyde prevents organ decay and corpses' miasma production at 1u in the body."
- - rscadd: "Epinephrine pens now contain 3u formaldehyde. This should not kill you."
diff --git a/html/changelogs/AutoChangeLog-pr-10904.yml b/html/changelogs/AutoChangeLog-pr-10904.yml
deleted file mode 100644
index 112c0bc593..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10904.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "The ships often crashed by Free Golems on Lavaland now have GPSes. They're off, by default, but an awakening Golem could easily turn one on."
diff --git a/html/changelogs/AutoChangeLog-pr-10905.yml b/html/changelogs/AutoChangeLog-pr-10905.yml
deleted file mode 100644
index de9374bd12..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10905.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - tweak: "Standard RCD ammo can now be printed from Engineering-keyed techfabs once you hit Industrial Engineering."
- - tweak: "Consoleless interfaces are now default - this means unrestricted protolathes and circuit imprinters can now be interfaced with by interacting with the machine itself."
- - bugfix: "Multitools can now actually be printed from Engineering and Science protolathes/techfabs once you unlock Basic Tools."
diff --git a/html/changelogs/AutoChangeLog-pr-10906.yml b/html/changelogs/AutoChangeLog-pr-10906.yml
deleted file mode 100644
index ef725e921e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10906.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "Husking (from being burned to shit) can now be reverted! 5u rezadone or 100u synthflesh, at below 50 burn."
- - balance: "Turning a body into a burnt husk now takes more effort. 300 burn's worth of effort."
diff --git a/html/changelogs/AutoChangeLog-pr-10907.yml b/html/changelogs/AutoChangeLog-pr-10907.yml
deleted file mode 100644
index af893e9415..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10907.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed no-grav lavaland labor/mining shuttle areas."
diff --git a/html/changelogs/AutoChangeLog-pr-10910.yml b/html/changelogs/AutoChangeLog-pr-10910.yml
deleted file mode 100644
index 2b11650c80..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10910.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed a little issue with sleeper UI and blood types."
diff --git a/html/changelogs/AutoChangeLog-pr-10913.yml b/html/changelogs/AutoChangeLog-pr-10913.yml
deleted file mode 100644
index 8bf549a154..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10913.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Feasel"
-delete-after: True
-changes:
- - balance: "Buffed dissection success chances."
diff --git a/html/changelogs/AutoChangeLog-pr-10915.yml b/html/changelogs/AutoChangeLog-pr-10915.yml
deleted file mode 100644
index 88f0c1652e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10915.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "shoes can now fit magpistols again."
diff --git a/html/changelogs/AutoChangeLog-pr-10916.yml b/html/changelogs/AutoChangeLog-pr-10916.yml
deleted file mode 100644
index 05d9b007b1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10916.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "Projectiles now always hit chest if targeting chest, snipers have 100% targeting zone accuracy. All other cases are unchanged."
diff --git a/html/changelogs/AutoChangeLog-pr-10917.yml b/html/changelogs/AutoChangeLog-pr-10917.yml
deleted file mode 100644
index f6e5997348..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10917.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - tweak: "The MK2 hypospray now"
diff --git a/html/changelogs/AutoChangeLog-pr-10918.yml b/html/changelogs/AutoChangeLog-pr-10918.yml
deleted file mode 100644
index bf47d0accf..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10918.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "r4d6"
-delete-after: True
-changes:
- - config: "Made dwarves into a roundstart races"
diff --git a/html/changelogs/AutoChangeLog-pr-10919.yml b/html/changelogs/AutoChangeLog-pr-10919.yml
deleted file mode 100644
index 0fa6420e39..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10919.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixing accidental nerfs to the magpistol magazine."
diff --git a/html/changelogs/AutoChangeLog-pr-10921.yml b/html/changelogs/AutoChangeLog-pr-10921.yml
deleted file mode 100644
index d6d551b40d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10921.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "The Lavaland's Herald speech sound should only play if they are actually speaking."
diff --git a/html/changelogs/AutoChangeLog-pr-10922.yml b/html/changelogs/AutoChangeLog-pr-10922.yml
deleted file mode 100644
index c71630fd0d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10922.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - tweak: "The lawyer's PDA cartridge has been rebranded to something more accurate to its true nature."
diff --git a/html/changelogs/AutoChangeLog-pr-10923.yml b/html/changelogs/AutoChangeLog-pr-10923.yml
deleted file mode 100644
index 0fd9a0f14e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10923.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Nerfed cargo passive points generation from 500 to 125 creds per minute."
diff --git a/html/changelogs/AutoChangeLog-pr-10924.yml b/html/changelogs/AutoChangeLog-pr-10924.yml
deleted file mode 100644
index d419928dd2..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10924.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed whitelisted/donor loadouts"
diff --git a/html/changelogs/AutoChangeLog-pr-10926.yml b/html/changelogs/AutoChangeLog-pr-10926.yml
deleted file mode 100644
index 9662402d1b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10926.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: "keronshb"
-delete-after: True
-changes:
- - rscadd: "Added repairable turrets"
- - rscadd: "Adds Tiny Fans to the pirate ship"
- - tweak: "changes some reinforced windows to plastinanium pirate windows"
- - tweak: "made the pirate shuttle + turrets bomb resistant"
- - tweak: "made most pirate machines + consoles indestructible"
- - tweak: "increased pirate turret health"
diff --git a/html/changelogs/AutoChangeLog-pr-10929.yml b/html/changelogs/AutoChangeLog-pr-10929.yml
deleted file mode 100644
index fa9413f25a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10929.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Childproofs double-esword and hypereuplastic blade toys."
diff --git a/html/changelogs/AutoChangeLog-pr-10930.yml b/html/changelogs/AutoChangeLog-pr-10930.yml
deleted file mode 100644
index 4121a00b9b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10930.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "r4d6"
-delete-after: True
-changes:
- - tweak: "Meteor Timer back to 3-5 minutes"
diff --git a/html/changelogs/AutoChangeLog-pr-10934.yml b/html/changelogs/AutoChangeLog-pr-10934.yml
deleted file mode 100644
index 61ef7ec04f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10934.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - refactor: "Refactored ghostreading/etc"
diff --git a/html/changelogs/AutoChangeLog-pr-10935.yml b/html/changelogs/AutoChangeLog-pr-10935.yml
deleted file mode 100644
index f35855854f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10935.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "KrabSpider"
-delete-after: True
-changes:
- - imageadd: "The Van Dyke is no longer Fu Manchu."
- - imagedel: "Gets rid of a Fu Manchu imitation."
diff --git a/html/changelogs/AutoChangeLog-pr-10936.yml b/html/changelogs/AutoChangeLog-pr-10936.yml
deleted file mode 100644
index 2303f157ab..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10936.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "Cyborgization will now de-gang people, even gangheads."
diff --git a/html/changelogs/AutoChangeLog-pr-10937.yml b/html/changelogs/AutoChangeLog-pr-10937.yml
deleted file mode 100644
index 1c56882ccc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10937.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - admin: "The debug outfit is now kitted out for whatever debbuging needs."
diff --git a/html/changelogs/AutoChangeLog-pr-10940.yml b/html/changelogs/AutoChangeLog-pr-10940.yml
deleted file mode 100644
index c0bbfc371a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10940.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - balance: "Some reagent holders (such as cigarettes, food) are not suitable for reagents export anymore, while unprocessed botany crops will only net 1/3 of the standard reagents values."
- - bugfix: "Export scanners now include the reagents value in the price report."
diff --git a/html/changelogs/AutoChangeLog-pr-10943.yml b/html/changelogs/AutoChangeLog-pr-10943.yml
deleted file mode 100644
index f45d8b1d39..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10943.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed a little inconvenience with the character setup preview dummy having extra unwarranted bits."
diff --git a/html/changelogs/AutoChangeLog-pr-10947.yml b/html/changelogs/AutoChangeLog-pr-10947.yml
deleted file mode 100644
index a6f1fb1344..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10947.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "nemvar"
-delete-after: True
-changes:
- - bugfix: "Trash from food now gets generated at the location of the food item, instead of in the hands of the eater."
diff --git a/html/changelogs/AutoChangeLog-pr-10948.yml b/html/changelogs/AutoChangeLog-pr-10948.yml
deleted file mode 100644
index f9da9463fc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10948.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Stopped role restricted uplink items from being discounted despite not being purchasable most times."
diff --git a/html/changelogs/AutoChangeLog-pr-10949.yml b/html/changelogs/AutoChangeLog-pr-10949.yml
deleted file mode 100644
index 3c7000a0e1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10949.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - bugfix: "reactive repulse armor now has an item limit"
diff --git a/html/changelogs/AutoChangeLog-pr-10950.yml b/html/changelogs/AutoChangeLog-pr-10950.yml
deleted file mode 100644
index 8258db1d69..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10950.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - bugfix: "beam rifle runtime fix during aiming_beam"
diff --git a/html/changelogs/AutoChangeLog-pr-10951.yml b/html/changelogs/AutoChangeLog-pr-10951.yml
deleted file mode 100644
index 20bc444967..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10951.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - bugfix: "fail2topic runtime fix: taking out an ip while incrementing index resulted in accessing the next-next entry instead of the next and results in out of bound errors."
diff --git a/html/changelogs/AutoChangeLog-pr-10953.yml b/html/changelogs/AutoChangeLog-pr-10953.yml
deleted file mode 100644
index 67c2c915ad..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10953.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Missing words replacement file for the gondola mask."
diff --git a/html/changelogs/AutoChangeLog-pr-10955.yml b/html/changelogs/AutoChangeLog-pr-10955.yml
deleted file mode 100644
index 46ff62efaf..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10955.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - rscadd: "gravity gun repulse and chaos now work in all angles, rather than just basic cardinals and diagonals. fun."
diff --git a/html/changelogs/AutoChangeLog-pr-10957.yml b/html/changelogs/AutoChangeLog-pr-10957.yml
deleted file mode 100644
index b655b85fb9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10957.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Dynamic now defaults to \"classic\" storyteller instead of just failing if the vote didn't choose a storyteller."
diff --git a/html/changelogs/AutoChangeLog-pr-10960.yml b/html/changelogs/AutoChangeLog-pr-10960.yml
deleted file mode 100644
index 6033533590..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10960.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kappa-sama"
-delete-after: True
-changes:
- - bugfix: "the plant dudes can actually make plant disks now"
diff --git a/html/changelogs/AutoChangeLog-pr-10961.yml b/html/changelogs/AutoChangeLog-pr-10961.yml
deleted file mode 100644
index eaaafab472..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10961.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed an issue with the nearsighted prescription glasses taking over worn eyewear."
diff --git a/html/changelogs/AutoChangeLog-pr-10966.yml b/html/changelogs/AutoChangeLog-pr-10966.yml
deleted file mode 100644
index bdc78a2b01..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10966.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "r4d6"
-delete-after: True
-changes:
- - bugfix: "Mining no longer lead to spess"
diff --git a/html/changelogs/AutoChangeLog-pr-10967.yml b/html/changelogs/AutoChangeLog-pr-10967.yml
deleted file mode 100644
index f242dd57bc..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10967.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed AI unanchoring not properly removing the no teleport trait. My bad."
diff --git a/html/changelogs/AutoChangeLog-pr-10969.yml b/html/changelogs/AutoChangeLog-pr-10969.yml
deleted file mode 100644
index fdd53cdd2f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10969.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - rscadd: "crowbarring manifests off crates"
diff --git a/html/changelogs/AutoChangeLog-pr-10970.yml b/html/changelogs/AutoChangeLog-pr-10970.yml
deleted file mode 100644
index 7182c5f6a6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10970.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "Public autolathes can no longer be hacked."
diff --git a/html/changelogs/AutoChangeLog-pr-10972.yml b/html/changelogs/AutoChangeLog-pr-10972.yml
deleted file mode 100644
index 9cc2e64687..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10972.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - tweak: "Bone armor/Dagger are now crafting from bones rather then crafting menu"
diff --git a/html/changelogs/AutoChangeLog-pr-10973.yml b/html/changelogs/AutoChangeLog-pr-10973.yml
deleted file mode 100644
index 8946cddb43..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10973.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - rscadd: "Firing pins that only works when not on station"
diff --git a/html/changelogs/AutoChangeLog-pr-10974.yml b/html/changelogs/AutoChangeLog-pr-10974.yml
deleted file mode 100644
index 7f668256b3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10974.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "antag quirk blacklisting works now"
diff --git a/html/changelogs/AutoChangeLog-pr-10976.yml b/html/changelogs/AutoChangeLog-pr-10976.yml
deleted file mode 100644
index 34ef082829..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10976.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed another issue with hering comsig."
diff --git a/html/changelogs/AutoChangeLog-pr-10980.yml b/html/changelogs/AutoChangeLog-pr-10980.yml
deleted file mode 100644
index 3701aea6e1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10980.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - rscadd: "Medical locked crates"
- - balance: "Russian gear crates have less gear in some cases but all will cost more"
- - bugfix: "Medical locked crates that were not locked"
- - spellcheck: "Crates that were out of date are corrected"
diff --git a/html/changelogs/AutoChangeLog-pr-10981.yml b/html/changelogs/AutoChangeLog-pr-10981.yml
deleted file mode 100644
index df0d7990cb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10981.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "IHOPMommyLich"
-delete-after: True
-changes:
- - tweak: "Changed the multiplicative_slowdown of Stimulants from -1 to -0.5"
diff --git a/html/changelogs/AutoChangeLog-pr-10984.yml b/html/changelogs/AutoChangeLog-pr-10984.yml
deleted file mode 100644
index 137536b430..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10984.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - balance: "Heads of staff have been better screened by NT before being promoted"
diff --git a/html/changelogs/AutoChangeLog-pr-10987.yml b/html/changelogs/AutoChangeLog-pr-10987.yml
deleted file mode 100644
index abea439a86..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10987.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - imageadd: "Fixed dozen missing privates sprites."
diff --git a/html/changelogs/AutoChangeLog-pr-10988.yml b/html/changelogs/AutoChangeLog-pr-10988.yml
deleted file mode 100644
index ebd9de7689..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10988.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "YakumoChen"
-delete-after: True
-changes:
- - tweak: "Observe is back in the OOC tab"
diff --git a/html/changelogs/AutoChangeLog-pr-10989.yml b/html/changelogs/AutoChangeLog-pr-10989.yml
deleted file mode 100644
index 0a5b2ad3c8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10989.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "A little fix concerning some R&D and reagents."
diff --git a/html/changelogs/AutoChangeLog-pr-10992.yml b/html/changelogs/AutoChangeLog-pr-10992.yml
deleted file mode 100644
index 1d6d10396b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10992.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - balance: "Buckshot individual pellet damage up from 10 to 12.5. Still firing 6 pellets."
diff --git a/html/changelogs/AutoChangeLog-pr-10994.yml b/html/changelogs/AutoChangeLog-pr-10994.yml
deleted file mode 100644
index c27a1afc00..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10994.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "DeltaFire15"
-delete-after: True
-changes:
- - balance: "Nar'Sie runes no longer benefit from runed floors."
diff --git a/html/changelogs/AutoChangeLog-pr-10996.yml b/html/changelogs/AutoChangeLog-pr-10996.yml
deleted file mode 100644
index 8bb7646cd6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10996.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "PersianXerxes"
-delete-after: True
-changes:
- - rscadd: "SMES and PACMAN attached to gulag Security to power electrified windows
-remove: Removed Sec vendor from gulag Security"
- - tweak: "Separation of gulag and public mining"
diff --git a/html/changelogs/AutoChangeLog-pr-10997.yml b/html/changelogs/AutoChangeLog-pr-10997.yml
deleted file mode 100644
index a380a04f68..0000000000
--- a/html/changelogs/AutoChangeLog-pr-10997.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-author: "Owai-Seek"
-delete-after: True
-changes:
- - rscadd: "Bacon and Eggs food item. Delicious! Added a Lemony Poppy Seed Muffin."
- - tweak: "Snack Vendor has Chocolates, Tortilla Chips, and a Marshmallow Box"
- - balance: "Mops can now be printed at service lathe once tools are researched."
- - balance: "Biobags can hold most organic limbs/organs, but not brains, implants, or cybernetics."
- - balance: "Trash Bag can now hold limbs (but not heads.)"
- - balance: "Most snack vendor items reduced by 1."
- - bugfix: "Trash Cans are now actually craftable, and only require metal instead of plastic."
- - imageadd: "Bacon and Eggs, Drying Agent Bottle."
- - imageadd: "Mugs now show reagent colors of contained reagents. Thanks Seris!"
diff --git a/html/changelogs/AutoChangeLog-pr-11000.yml b/html/changelogs/AutoChangeLog-pr-11000.yml
deleted file mode 100644
index 5e496af81f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11000.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - balance: "makes RCDs cost a better amount"
diff --git a/html/changelogs/AutoChangeLog-pr-11001.yml b/html/changelogs/AutoChangeLog-pr-11001.yml
deleted file mode 100644
index 1cfa8977b4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11001.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - bugfix: "Fixed the pandemic naming and the radiation healing symptom UI crashing"
diff --git a/html/changelogs/AutoChangeLog-pr-11003.yml b/html/changelogs/AutoChangeLog-pr-11003.yml
deleted file mode 100644
index 4c551c4d09..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11003.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - bugfix: "Energy weapons now once again have their lens in contents."
diff --git a/html/changelogs/AutoChangeLog-pr-11005.yml b/html/changelogs/AutoChangeLog-pr-11005.yml
deleted file mode 100644
index d0576c7ba8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11005.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - tweak: "Hyposprays now switch modes on CTRL click, instead of alt, as it was already reserved for dispension amount."
diff --git a/html/changelogs/AutoChangeLog-pr-11011.yml b/html/changelogs/AutoChangeLog-pr-11011.yml
deleted file mode 100644
index d0a7b916f7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11011.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Tlaltecuhtli, ported by Hatterhat"
-delete-after: True
-changes:
- - balance: "Ripley, Firefighter, Odysseus and H.O.N.K. mechs now also use scanning modules and capacitors on construction. This means that they also gain reduced power consumption and EMP protection from higher-tier stock parts."
diff --git a/html/changelogs/AutoChangeLog-pr-11012.yml b/html/changelogs/AutoChangeLog-pr-11012.yml
deleted file mode 100644
index 1d233f0692..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11012.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "keronshb"
-delete-after: True
-changes:
- - rscadd: "Adds the CogChamp drink and Sprite"
diff --git a/html/changelogs/AutoChangeLog-pr-11013.yml b/html/changelogs/AutoChangeLog-pr-11013.yml
deleted file mode 100644
index a9806d796d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11013.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "r4d6"
-delete-after: True
-changes:
- - rscadd: "Added Plasteel Pickaxe"
- - rscadd: "Added Titanium Pickaxe"
diff --git a/html/changelogs/AutoChangeLog-pr-11018.yml b/html/changelogs/AutoChangeLog-pr-11018.yml
deleted file mode 100644
index 2795317861..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11018.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - bugfix: "pais are no longer muted for literally a whole hour on emp."
diff --git a/html/changelogs/AutoChangeLog-pr-11020.yml b/html/changelogs/AutoChangeLog-pr-11020.yml
deleted file mode 100644
index 52677b98e9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11020.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Zellular"
-delete-after: True
-changes:
- - imageadd: "Movement state for pupdozer and its decals"
diff --git a/html/changelogs/AutoChangeLog-pr-11022.yml b/html/changelogs/AutoChangeLog-pr-11022.yml
deleted file mode 100644
index ac317e56b0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11022.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - rscadd: "auto profiler subsystem from tg"
diff --git a/html/changelogs/AutoChangeLog-pr-11024.yml b/html/changelogs/AutoChangeLog-pr-11024.yml
deleted file mode 100644
index 3af136f15e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11024.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - bugfix: "Brig cells now are more accurate by using timeofday instead of realtime"
diff --git a/html/changelogs/AutoChangeLog-pr-11025.yml b/html/changelogs/AutoChangeLog-pr-11025.yml
deleted file mode 100644
index af9ac20f62..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11025.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - rscadd: "Nanite interfaces have gotten a rework to TGUI Next, and can now support sub-programs.
-add:Adds the nanite sting program, which will allow you to manually sting people to give them nanites, changeling style."
diff --git a/html/changelogs/AutoChangeLog-pr-11026.yml b/html/changelogs/AutoChangeLog-pr-11026.yml
deleted file mode 100644
index c99aad2d14..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11026.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - balance: "The suit full of spiders also known as a ninja now is a tactical turtleneck"
- - balance: "The Wiznerds now dont have suits set to max"
diff --git a/html/changelogs/AutoChangeLog-pr-11027.yml b/html/changelogs/AutoChangeLog-pr-11027.yml
deleted file mode 100644
index 4e5f5b46ba..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11027.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "ShadeAware"
-delete-after: True
-changes:
- - rscadd: "The Captain's Wardrobe, a special one-of-a-kind and ID-locked wardrobe for the Captain that holds all of their snowflakey gear.
-Remove: Snowflake gear from the Captain's locker, since now it has its own vendor."
diff --git a/html/changelogs/AutoChangeLog-pr-11028.yml b/html/changelogs/AutoChangeLog-pr-11028.yml
deleted file mode 100644
index de94b1d35f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11028.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - tweak: "Meat wheat no longer has blood"
diff --git a/html/changelogs/AutoChangeLog-pr-11029.yml b/html/changelogs/AutoChangeLog-pr-11029.yml
deleted file mode 100644
index 17f34bbfa6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11029.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - tweak: "default should be... default"
diff --git a/html/changelogs/AutoChangeLog-pr-11032.yml b/html/changelogs/AutoChangeLog-pr-11032.yml
deleted file mode 100644
index 6d026e444a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11032.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - bugfix: "Cryo now actually transfers reagents at tier 4 on enter rather than every 80 machine fire()-process()s regardless of if it was \"reset\" by open/close."
diff --git a/html/changelogs/AutoChangeLog-pr-11033.yml b/html/changelogs/AutoChangeLog-pr-11033.yml
deleted file mode 100644
index c5b9a2f65a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11033.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - rscadd: "cmo now gets advanced surgery drapes that techweb-sync for advanced surgeries without an operating console."
diff --git a/html/changelogs/AutoChangeLog-pr-11035.yml b/html/changelogs/AutoChangeLog-pr-11035.yml
deleted file mode 100644
index 94a57db904..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11035.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - bugfix: "ctf claymores now actually spawn (and fit)."
diff --git a/html/changelogs/AutoChangeLog-pr-11038.yml b/html/changelogs/AutoChangeLog-pr-11038.yml
deleted file mode 100644
index b157c31af8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11038.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - bugfix: "STOP_PROCESSING now removes from currentrun to prevent another process cycle from happening where it shouldn't."
diff --git a/html/changelogs/AutoChangeLog-pr-11040.yml b/html/changelogs/AutoChangeLog-pr-11040.yml
deleted file mode 100644
index cc0514517b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11040.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Further mob holder fixes."
diff --git a/html/changelogs/AutoChangeLog-pr-11041.yml b/html/changelogs/AutoChangeLog-pr-11041.yml
new file mode 100644
index 0000000000..b9d9a993a2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11041.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - balance: "Bloodsuckers can no longer get usable blood from blood tomatoes."
diff --git a/html/changelogs/AutoChangeLog-pr-11042.yml b/html/changelogs/AutoChangeLog-pr-11042.yml
deleted file mode 100644
index 4238f76b75..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11042.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - balance: "The pandemic can no longer make vaccines or synthblood as quickly."
diff --git a/html/changelogs/AutoChangeLog-pr-11044.yml b/html/changelogs/AutoChangeLog-pr-11044.yml
deleted file mode 100644
index 7dec153778..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11044.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - rscadd: "The syndicate uplinks interface has been redone in TGUI Next"
diff --git a/html/changelogs/AutoChangeLog-pr-11045.yml b/html/changelogs/AutoChangeLog-pr-11045.yml
deleted file mode 100644
index 9e3e0a9ee4..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11045.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - bugfix: "Flat guns can no longer be suppressed"
diff --git a/html/changelogs/AutoChangeLog-pr-11046.yml b/html/changelogs/AutoChangeLog-pr-11046.yml
deleted file mode 100644
index c40286e901..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11046.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - tweak: "replaced stickmans .45 caliber with 10mm, for consistency."
diff --git a/html/changelogs/AutoChangeLog-pr-11047.yml b/html/changelogs/AutoChangeLog-pr-11047.yml
deleted file mode 100644
index 5bc42d1219..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11047.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - tweak: "Meatwheat and Oats now have rarity"
- - balance: "Oats now have at lest 50% more flour in them"
diff --git a/html/changelogs/AutoChangeLog-pr-11048.yml b/html/changelogs/AutoChangeLog-pr-11048.yml
deleted file mode 100644
index 77af926906..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11048.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - balance: "BDM now uses a PKA rather then a normal KA"
diff --git a/html/changelogs/AutoChangeLog-pr-11051.yml b/html/changelogs/AutoChangeLog-pr-11051.yml
deleted file mode 100644
index 8ac7939b00..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11051.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "hand teleporters now require 30 deciseconds of still movement by the user to dispel portals. there's a beam effect too."
diff --git a/html/changelogs/AutoChangeLog-pr-11053.yml b/html/changelogs/AutoChangeLog-pr-11053.yml
deleted file mode 100644
index a3c2eb29fa..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11053.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "keronshb"
-delete-after: True
-changes:
- - rscadd: "Added burn and knockback to stunhand during HALOS on cult."
- - balance: "Added burn and knockback to stunhand during HALOS on cult."
diff --git a/html/changelogs/AutoChangeLog-pr-11056.yml b/html/changelogs/AutoChangeLog-pr-11056.yml
deleted file mode 100644
index b56efb3557..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11056.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "necromanceranne"
-delete-after: True
-changes:
- - rscdel: "Bullets causing bleed rates equal to unmitigated damage through all forms of defense."
diff --git a/html/changelogs/AutoChangeLog-pr-11060.yml b/html/changelogs/AutoChangeLog-pr-11060.yml
deleted file mode 100644
index c78f03a26d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11060.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "Sort of a bugfix but cult blood magic and all guns now respect stamina softcrit."
diff --git a/html/changelogs/AutoChangeLog-pr-11061.yml b/html/changelogs/AutoChangeLog-pr-11061.yml
deleted file mode 100644
index 5225edc141..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11061.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - tweak: "Gang tower shield is no longer transparent"
diff --git a/html/changelogs/AutoChangeLog-pr-11062.yml b/html/changelogs/AutoChangeLog-pr-11062.yml
deleted file mode 100644
index b9bc85b1c1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11062.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "Organ healing rate doubled. Organ decay rate halved to match its define (15 minutes for full decay, so at around 8-10 minutes it'll be really fucked)."
diff --git a/html/changelogs/AutoChangeLog-pr-11063.yml b/html/changelogs/AutoChangeLog-pr-11063.yml
deleted file mode 100644
index c729fb5ed9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11063.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Zellular"
-delete-after: True
-changes:
- - tweak: "Tweaked the movement state for the pupdozer's eyes"
diff --git a/html/changelogs/AutoChangeLog-pr-11064.yml b/html/changelogs/AutoChangeLog-pr-11064.yml
new file mode 100644
index 0000000000..c4fe96494b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11064.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Three new arm implants, shield for sec, janitor and service"
diff --git a/html/changelogs/AutoChangeLog-pr-11070.yml b/html/changelogs/AutoChangeLog-pr-11070.yml
deleted file mode 100644
index 3c923bddb0..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11070.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - tweak: "Storage now caches max screen size and only stores when being opened by a non ghost, meaning ghosts will no longer distort living player screens when viewing storage."
diff --git a/html/changelogs/AutoChangeLog-pr-11071.yml b/html/changelogs/AutoChangeLog-pr-11071.yml
deleted file mode 100644
index e8581b325e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11071.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed being unable to dump a trash bag's contents directly into disposal bins."
diff --git a/html/changelogs/AutoChangeLog-pr-11072.yml b/html/changelogs/AutoChangeLog-pr-11072.yml
deleted file mode 100644
index ab21d91e19..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11072.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Doubled the halved flavor text maximum length."
diff --git a/html/changelogs/AutoChangeLog-pr-11073.yml b/html/changelogs/AutoChangeLog-pr-11073.yml
deleted file mode 100644
index 078c5fb300..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11073.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Reduced tongue organ damage and tasting pH message spam."
diff --git a/html/changelogs/AutoChangeLog-pr-11075.yml b/html/changelogs/AutoChangeLog-pr-11075.yml
deleted file mode 100644
index 0eb612a81e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11075.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed agent IDs not registering the inputted name. Thanks MrPerson."
diff --git a/html/changelogs/AutoChangeLog-pr-11076.yml b/html/changelogs/AutoChangeLog-pr-11076.yml
deleted file mode 100644
index e0f187a038..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11076.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "nemvar"
-delete-after: True
-changes:
- - code_imp: "Changed mob biotypes from lists to flags."
diff --git a/html/changelogs/AutoChangeLog-pr-11079.yml b/html/changelogs/AutoChangeLog-pr-11079.yml
deleted file mode 100644
index b613b6c867..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11079.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arturlang"
-delete-after: True
-changes:
- - tweak: "Valentines can now be converted by bloodsuckers"
diff --git a/html/changelogs/AutoChangeLog-pr-11080.yml b/html/changelogs/AutoChangeLog-pr-11080.yml
deleted file mode 100644
index 1dd764cfc3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11080.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "Stunbatons changed yet again."
diff --git a/html/changelogs/AutoChangeLog-pr-11082.yml b/html/changelogs/AutoChangeLog-pr-11082.yml
deleted file mode 100644
index 89d9b4ca52..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11082.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "Preservahyde! Made with water, bromine, and formaldehyde, it doesn't decay into histamine. Instead, it just prevents your organs from rotting into nothing."
diff --git a/html/changelogs/AutoChangeLog-pr-11083.yml b/html/changelogs/AutoChangeLog-pr-11083.yml
deleted file mode 100644
index 757d9fcb63..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11083.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - balance: "You can now purify eldritch longswords with a bible. This creates purified longswords, which do not have anti-magic properties, but are still good for swinging at cultists."
diff --git a/html/changelogs/AutoChangeLog-pr-11086.yml b/html/changelogs/AutoChangeLog-pr-11086.yml
deleted file mode 100644
index e11113e71c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11086.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "YakumoChen"
-delete-after: True
-changes:
- - imageadd: "Rings look nicer. Sprites used from RP."
- - imageadd: "Ring on-hands. Diamond rings sparkle!"
- - tweak: "You can now propose using a diamond ring in your hand."
diff --git a/html/changelogs/AutoChangeLog-pr-11087.yml b/html/changelogs/AutoChangeLog-pr-11087.yml
deleted file mode 100644
index 179ef6a2b7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11087.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed solar panels/trackers (de)construction being a bit wonky."
diff --git a/html/changelogs/AutoChangeLog-pr-11090.yml b/html/changelogs/AutoChangeLog-pr-11090.yml
deleted file mode 100644
index 698306fdb6..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11090.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - rscadd: "rest hotkey"
diff --git a/html/changelogs/AutoChangeLog-pr-11091.yml b/html/changelogs/AutoChangeLog-pr-11091.yml
deleted file mode 100644
index 5d43d7dbdf..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11091.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "BlueWildrose"
-delete-after: True
-changes:
- - bugfix: "podpeople tail wagging"
- - tweak: "lifebringer ghost role fixes"
diff --git a/html/changelogs/AutoChangeLog-pr-11093.yml b/html/changelogs/AutoChangeLog-pr-11093.yml
deleted file mode 100644
index 4815818b0d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11093.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed something about slime blood and the law of conservation of mass."
- - bugfix: "Fixed flypeople being emetic machine guns."
diff --git a/html/changelogs/AutoChangeLog-pr-11094.yml b/html/changelogs/AutoChangeLog-pr-11094.yml
deleted file mode 100644
index a6db5bd93f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11094.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - tweak: "Cosmic winter coat now glows like the bedsheet, and holds normal winter coat gear"
diff --git a/html/changelogs/AutoChangeLog-pr-11098.yml b/html/changelogs/AutoChangeLog-pr-11098.yml
deleted file mode 100644
index 5ca7b7dd1e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11098.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Raiq & Linzolle"
-delete-after: True
-changes:
- - rscadd: "Bone bow - Ash walkers crafting , bone arrows - Ash walkers crafting, silk string used in bow crafting, harden arrows - Ash walkers crafting, ash walker only crafting book, basic pipe bow, and bow & arrow selling. Quivers for ash walkers as well, just to hold some arrows well out on the hunt!"
diff --git a/html/changelogs/AutoChangeLog-pr-11101.yml b/html/changelogs/AutoChangeLog-pr-11101.yml
deleted file mode 100644
index 5305e2b923..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11101.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "coiax"
-delete-after: True
-changes:
- - rscadd: "Admin and event only pair pinpointers! They come in a box of two, and each pinpointer will always point at its corresponding pair. Aww."
diff --git a/html/changelogs/AutoChangeLog-pr-11103.yml b/html/changelogs/AutoChangeLog-pr-11103.yml
deleted file mode 100644
index f38e23f76e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11103.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "PersianXerxes"
-delete-after: True
-changes:
- - rscadd: "Better clarified the comment explaining the contraband tag."
- - tweak: "Cargo nuclear defusal kits now require an emag'd drop pod console to be purchased."
diff --git a/html/changelogs/AutoChangeLog-pr-11104.yml b/html/changelogs/AutoChangeLog-pr-11104.yml
deleted file mode 100644
index 205af650a9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11104.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - server: "Express console is now logging what it buys, like the normal console should"
diff --git a/html/changelogs/AutoChangeLog-pr-11108.yml b/html/changelogs/AutoChangeLog-pr-11108.yml
deleted file mode 100644
index c8bed79399..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11108.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - rscadd: "hsl instead of sum of rgb for spraycan lum check"
diff --git a/html/changelogs/AutoChangeLog-pr-11111.yml b/html/changelogs/AutoChangeLog-pr-11111.yml
deleted file mode 100644
index 4e947ed297..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11111.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed virology being unable to be done with synthetic blood."
diff --git a/html/changelogs/AutoChangeLog-pr-11112.yml b/html/changelogs/AutoChangeLog-pr-11112.yml
deleted file mode 100644
index f54e2e0192..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11112.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: "necromanceranne"
-delete-after: True
-changes:
- - balance: "Reverted #9092, crew mecha no longer spawn with tracking beacons."
- - balance: "[Port] Mecha ballistics weapons now require ammo created from an Exosuit Fabricator or the Security Protolathe, though they will start with a full magazine and in most cases enough for one full reload. Reloading these weapons no longer chunks your power cell. Clown (and mime) mecha equipment have not changed."
- - balance: "[Port] The SRM-8 Missile Launcher has been replaced with the BRM-6 Breaching Missile Launcher in techwebs (Nukie Mauler remains equipped with the SRM-8)."
- - balance: "[Port] Both Missile Launchers and the Clusterbang Launcher do not have an ammo cache, and cannot be reloaded by the pilot. Once the initial loaded ammo has been spent, you can use the appropriate ammo box to load the weapon directly."
- - rscadd: "[Port] Utility mechs that have a clamp equipped can load ammo from their own cargo hold into other mechs."
- - rscadd: "[Port] Nuke Ops can purchase spare ammo duffel bags for their mecha weapons, should they run low."
diff --git a/html/changelogs/AutoChangeLog-pr-11113.yml b/html/changelogs/AutoChangeLog-pr-11113.yml
deleted file mode 100644
index b3c0bb34a8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11113.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "CameronWoof"
-delete-after: True
-changes:
- - rscadd: "Ammonia and saltpetre can now be made at the biogenerator."
diff --git a/html/changelogs/AutoChangeLog-pr-11114.yml b/html/changelogs/AutoChangeLog-pr-11114.yml
deleted file mode 100644
index 7d56933c65..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11114.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Psody-Mordheim"
-delete-after: True
-changes:
- - rscadd: "You can now make synth-flesh with synthetic blood."
- - rscadd: "You can now make synthetic blood via mixing saline glucose, iron, stable plasma and heating it to 350 temp."
- - rscadd: "You can mix synthetic blood and cryoxadone to create synth-meat in addition to normal blood."
diff --git a/html/changelogs/AutoChangeLog-pr-11119.yml b/html/changelogs/AutoChangeLog-pr-11119.yml
deleted file mode 100644
index 4a0dc59c65..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11119.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - rscdel: "Renamed \"blaster carbine\" and \"blaster rifles\" back to \"energy gun\" and \"laser gun\" respectively"
- - bugfix: "Fixed magnetic rifles & co being inconsistent with printed energy guns and start with an empty power cell."
- - imagedel: "Reverted practice laser gun sprites back to their former glory. Mostly."
diff --git a/html/changelogs/AutoChangeLog-pr-11120.yml b/html/changelogs/AutoChangeLog-pr-11120.yml
deleted file mode 100644
index 64a435146c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11120.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "Fixed sprint buffer cost and regen being rounded down."
diff --git a/html/changelogs/AutoChangeLog-pr-11131.yml b/html/changelogs/AutoChangeLog-pr-11131.yml
deleted file mode 100644
index 9a14049c2f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11131.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Seris02"
-delete-after: True
-changes:
- - balance: "bloodcrawl's cooldown"
diff --git a/html/changelogs/AutoChangeLog-pr-11133.yml b/html/changelogs/AutoChangeLog-pr-11133.yml
deleted file mode 100644
index 8cedc300c7..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11133.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - balance: "Nerfed the fermenting barrel export industry."
- - tweak: "Reagent dispensers selling price no longer takes in account the reagents volume. It's already handled by reagents export."
diff --git a/html/changelogs/AutoChangeLog-pr-11134.yml b/html/changelogs/AutoChangeLog-pr-11134.yml
deleted file mode 100644
index 8ec6c97164..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11134.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - bugfix: "mechs with stock parts now have icons"
diff --git a/html/changelogs/AutoChangeLog-pr-11136.yml b/html/changelogs/AutoChangeLog-pr-11136.yml
deleted file mode 100644
index 5289fc3492..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11136.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Owai-Seek"
-delete-after: True
-changes:
- - rscadd: "BROOM"
- - tweak: "Janitor Vendor now has gear for two Janitors."
diff --git a/html/changelogs/AutoChangeLog-pr-11138.yml b/html/changelogs/AutoChangeLog-pr-11138.yml
deleted file mode 100644
index fd0e53bb73..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11138.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - tweak: "the game's built in autoclicker aka CanMobAutoclick no longer triggers client/Click()'s anti clickspam guard."
diff --git a/html/changelogs/AutoChangeLog-pr-11139.yml b/html/changelogs/AutoChangeLog-pr-11139.yml
deleted file mode 100644
index 99a7027977..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11139.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "pais can no longer bodyblock bullets"
diff --git a/html/changelogs/AutoChangeLog-pr-11140.yml b/html/changelogs/AutoChangeLog-pr-11140.yml
deleted file mode 100644
index 1054039b53..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11140.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "pai radio short changed to 3 minutes down from 5"
diff --git a/html/changelogs/AutoChangeLog-pr-11141.yml b/html/changelogs/AutoChangeLog-pr-11141.yml
deleted file mode 100644
index 68de20a632..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11141.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - balance: "pais are no longer fulltile click opacity."
diff --git a/html/changelogs/AutoChangeLog-pr-11142.yml b/html/changelogs/AutoChangeLog-pr-11142.yml
deleted file mode 100644
index 35c4033e2c..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11142.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kevinz000"
-delete-after: True
-changes:
- - refactor: "vampire \"immortal haste\" has been reworked to be more reliable and consistent."
diff --git a/html/changelogs/AutoChangeLog-pr-11145.yml b/html/changelogs/AutoChangeLog-pr-11145.yml
deleted file mode 100644
index 2ad26003fb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11145.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ghommie"
-delete-after: True
-changes:
- - bugfix: "pAIs are yet again unable to perform certain silicon interactions with machineries yet again."
diff --git a/html/changelogs/AutoChangeLog-pr-11146.yml b/html/changelogs/AutoChangeLog-pr-11146.yml
deleted file mode 100644
index 09d3b0134b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11146.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - balance: "all supermatter damage is now hardcapped"
diff --git a/html/changelogs/AutoChangeLog-pr-11147.yml b/html/changelogs/AutoChangeLog-pr-11147.yml
deleted file mode 100644
index 0978b2b184..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11147.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - tweak: "Supermatter sabotage objective no longer shows up with no supermatter"
diff --git a/html/changelogs/AutoChangeLog-pr-11149.yml b/html/changelogs/AutoChangeLog-pr-11149.yml
deleted file mode 100644
index bc9ce5eb9e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11149.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Mining vendors no longer fail and eat your points iff you have precisely enough points to pay for an item"
diff --git a/html/changelogs/AutoChangeLog-pr-11150.yml b/html/changelogs/AutoChangeLog-pr-11150.yml
new file mode 100644
index 0000000000..0548ec177e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11150.yml
@@ -0,0 +1,8 @@
+author: "raspyosu"
+delete-after: True
+changes:
+ - rscadd: "some flavor text for lunge, cloak"
+ - tweak: "mesmerize, cloak functionality/requirements"
+ - balance: "mesmerize, lunge, cloak"
+ - soundadd: "lunge telegraph sound"
+ - spellcheck: "mesmerized status icon flavor text"
diff --git a/html/changelogs/AutoChangeLog-pr-11153.yml b/html/changelogs/AutoChangeLog-pr-11153.yml
deleted file mode 100644
index bba1af88db..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11153.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "BuffEngineering, nemvar."
-delete-after: True
-changes:
- - bugfix: "Addicts can now feel like they're getting their fix or kicking it."
- - bugfix: "Aheals now remove addictions and restore your mood to default."
diff --git a/html/changelogs/AutoChangeLog-pr-11154.yml b/html/changelogs/AutoChangeLog-pr-11154.yml
deleted file mode 100644
index 03e1898b60..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11154.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Kraseo"
-delete-after: True
-changes:
- - bugfix: "Nightmares no longer delete entire guns from existence for merely having a light on them."
diff --git a/html/changelogs/AutoChangeLog-pr-11155.yml b/html/changelogs/AutoChangeLog-pr-11155.yml
deleted file mode 100644
index 069cdbdedf..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11155.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "necromanceranne"
-delete-after: True
-changes:
- - bugfix: "Literally unclickability with a cham projector"
diff --git a/html/changelogs/AutoChangeLog-pr-11156.yml b/html/changelogs/AutoChangeLog-pr-11156.yml
deleted file mode 100644
index dc684eb4ef..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11156.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "Psody-Mordheim"
-delete-after: True
-changes:
- - rscadd: "Disfiguration Symptom."
- - rscadd: "Deoxyribonucleic Acid Saboteur Symptom."
- - rscadd: "Polyvitiligo Symptom."
- - rscdel: "Revitiligo Symptom."
- - rscdel: "Vitiligo Symptom."
diff --git a/html/changelogs/AutoChangeLog-pr-11160.yml b/html/changelogs/AutoChangeLog-pr-11160.yml
deleted file mode 100644
index cf0fc3253e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11160.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - balance: "Pie reagent transfer now requires an uncovered mouth."
diff --git a/html/changelogs/AutoChangeLog-pr-11163.yml b/html/changelogs/AutoChangeLog-pr-11163.yml
deleted file mode 100644
index 5492ad563b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11163.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MrJWhit"
-delete-after: True
-changes:
- - tweak: "TEG"
diff --git a/html/changelogs/AutoChangeLog-pr-11166.yml b/html/changelogs/AutoChangeLog-pr-11166.yml
deleted file mode 100644
index c812c77ad8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11166.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Fixed IRV."
diff --git a/html/changelogs/AutoChangeLog-pr-11168.yml b/html/changelogs/AutoChangeLog-pr-11168.yml
deleted file mode 100644
index 93caacdad1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11168.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "Runtime if nobody has a chaos pref set"
diff --git a/html/changelogs/AutoChangeLog-pr-11172.yml b/html/changelogs/AutoChangeLog-pr-11172.yml
deleted file mode 100644
index 83deba9652..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11172.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Linzolle"
-delete-after: True
-changes:
- - bugfix: "Bows now will not delete an arrow if it cant fire it."
- - bugfix: "bows now like and respect sprite changes"
diff --git a/html/changelogs/AutoChangeLog-pr-11175.yml b/html/changelogs/AutoChangeLog-pr-11175.yml
deleted file mode 100644
index 89d82068f1..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11175.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "keronshb"
-delete-after: True
-changes:
- - bugfix: "fixed accelerated regeneration nanites"
- - bugfix: "fixed mechanical repair nanites"
- - bugfix: "fixed bio reconstruction nanites"
diff --git a/html/changelogs/AutoChangeLog-pr-11176.yml b/html/changelogs/AutoChangeLog-pr-11176.yml
deleted file mode 100644
index 98c7619990..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11176.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "IRV fixed... again"
diff --git a/html/changelogs/AutoChangeLog-pr-11179.yml b/html/changelogs/AutoChangeLog-pr-11179.yml
deleted file mode 100644
index 6c538d5476..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11179.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - bugfix: "AIs now understand the old ways of drunken dwarfs"
diff --git a/html/changelogs/AutoChangeLog-pr-10541.yml b/html/changelogs/AutoChangeLog-pr-11181.yml
similarity index 52%
rename from html/changelogs/AutoChangeLog-pr-10541.yml
rename to html/changelogs/AutoChangeLog-pr-11181.yml
index f59ebe0e75..048652f28a 100644
--- a/html/changelogs/AutoChangeLog-pr-10541.yml
+++ b/html/changelogs/AutoChangeLog-pr-11181.yml
@@ -1,5 +1,4 @@
author: "Detective-Google"
delete-after: True
changes:
- - rscadd: "the POOL.
-remove: boxstation dorms 7"
+ - bugfix: "absurd dong sizes."
diff --git a/html/changelogs/AutoChangeLog-pr-11182.yml b/html/changelogs/AutoChangeLog-pr-11182.yml
deleted file mode 100644
index a5f8d5081e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11182.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Trilbyspaceclone"
-delete-after: True
-changes:
- - balance: "Removes some armored Russian hats from box station round start"
- - bugfix: "Doner items spawning"
diff --git a/html/changelogs/AutoChangeLog-pr-11186.yml b/html/changelogs/AutoChangeLog-pr-11186.yml
deleted file mode 100644
index 7a0c97379a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11186.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - bugfix: "temporary flavor text can now be of reasonable length"
diff --git a/html/changelogs/AutoChangeLog-pr-11191.yml b/html/changelogs/AutoChangeLog-pr-11191.yml
deleted file mode 100644
index 12b80bf1c3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-11191.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "YakumoChen"
-delete-after: True
-changes:
- - tweak: "Legion skulls behave like bees!!!!"
diff --git a/html/changelogs/AutoChangeLog-pr-11200.yml b/html/changelogs/AutoChangeLog-pr-11200.yml
new file mode 100644
index 0000000000..9c8b74b635
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11200.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - bugfix: "Red and blue boxes are now actually red or blue."
diff --git a/html/changelogs/AutoChangeLog-pr-11202.yml b/html/changelogs/AutoChangeLog-pr-11202.yml
new file mode 100644
index 0000000000..5c5c5da66b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11202.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - rscadd: "Beegions! Like Legions, but with actual bees. As in, the bees from the holodeck sim with the randomly-generated toxic bees."
diff --git a/html/changelogs/AutoChangeLog-pr-11203.yml b/html/changelogs/AutoChangeLog-pr-11203.yml
new file mode 100644
index 0000000000..aa685ef522
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11203.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Three new posters have been issued to the printing press"
diff --git a/html/changelogs/AutoChangeLog-pr-11043.yml b/html/changelogs/AutoChangeLog-pr-11218.yml
similarity index 58%
rename from html/changelogs/AutoChangeLog-pr-11043.yml
rename to html/changelogs/AutoChangeLog-pr-11218.yml
index 28217af630..608c426af2 100644
--- a/html/changelogs/AutoChangeLog-pr-11043.yml
+++ b/html/changelogs/AutoChangeLog-pr-11218.yml
@@ -1,4 +1,4 @@
author: "Seris02"
delete-after: True
changes:
- - bugfix: "apc icons"
+ - balance: "illegal technology"
diff --git a/html/changelogs/AutoChangeLog-pr-11219.yml b/html/changelogs/AutoChangeLog-pr-11219.yml
new file mode 100644
index 0000000000..8340efea51
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11219.yml
@@ -0,0 +1,5 @@
+author: "YakumoChen"
+delete-after: True
+changes:
+ - imageadd: "Nekomata (double cat) tails."
+ - imageadd: "2CAT LMAO"
diff --git a/html/changelogs/AutoChangeLog-pr-11220.yml b/html/changelogs/AutoChangeLog-pr-11220.yml
new file mode 100644
index 0000000000..1d46cede32
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11220.yml
@@ -0,0 +1,4 @@
+author: "Kraseo"
+delete-after: True
+changes:
+ - balance: "If you have the powersink objective, you will now receive a free beacon."
diff --git a/html/changelogs/AutoChangeLog-pr-10942.yml b/html/changelogs/AutoChangeLog-pr-11227.yml
similarity index 52%
rename from html/changelogs/AutoChangeLog-pr-10942.yml
rename to html/changelogs/AutoChangeLog-pr-11227.yml
index 2a30ace3aa..11b5474115 100644
--- a/html/changelogs/AutoChangeLog-pr-10942.yml
+++ b/html/changelogs/AutoChangeLog-pr-11227.yml
@@ -1,4 +1,4 @@
author: "Putnam3145"
delete-after: True
changes:
- - rscadd: "map voting doesn't suck anymore"
+ - tweak: "Salbutamol causes jittering now."
diff --git a/html/changelogs/AutoChangeLog-pr-11081.yml b/html/changelogs/AutoChangeLog-pr-11235.yml
similarity index 51%
rename from html/changelogs/AutoChangeLog-pr-11081.yml
rename to html/changelogs/AutoChangeLog-pr-11235.yml
index 2fcb15b7aa..bad485400b 100644
--- a/html/changelogs/AutoChangeLog-pr-11081.yml
+++ b/html/changelogs/AutoChangeLog-pr-11235.yml
@@ -1,4 +1,4 @@
author: "Detective-Google"
delete-after: True
changes:
- - bugfix: "valentines candy no longer prefbreaks"
+ - bugfix: "my dumb stupid paramedics"
diff --git a/html/changelogs/AutoChangeLog-pr-11105.yml b/html/changelogs/AutoChangeLog-pr-11240.yml
similarity index 54%
rename from html/changelogs/AutoChangeLog-pr-11105.yml
rename to html/changelogs/AutoChangeLog-pr-11240.yml
index 0c7ac7b1e6..dc9e24e86f 100644
--- a/html/changelogs/AutoChangeLog-pr-11105.yml
+++ b/html/changelogs/AutoChangeLog-pr-11240.yml
@@ -1,4 +1,4 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- - bugfix: "Crabs are now made of crab meat."
+ - balance: "Blobs now can store 250 points."
diff --git a/html/changelogs/AutoChangeLog-pr-11241.yml b/html/changelogs/AutoChangeLog-pr-11241.yml
new file mode 100644
index 0000000000..41f50fdf26
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11241.yml
@@ -0,0 +1,5 @@
+author: "MrPerson"
+delete-after: True
+changes:
+ - rscadd: "Solar panels will visually rotate a lot more smoothly instead of being locked to only 8 directions."
+ - rscadd: "Timed solar tracking is in degrees per minute. You're still not gonna use it though."
diff --git a/html/changelogs/AutoChangeLog-pr-11242.yml b/html/changelogs/AutoChangeLog-pr-11242.yml
new file mode 100644
index 0000000000..e421ee1c72
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11242.yml
@@ -0,0 +1,5 @@
+author: "Kraseo"
+delete-after: True
+changes:
+ - rscadd: "Lavaland flora have more traits now, to encourage harvesting and sending these off to the botanists."
+ - bugfix: "Napalm will now properly remove weeds from a tray if the plant in it has the fireproof gene."
diff --git a/html/changelogs/AutoChangeLog-pr-11244.yml b/html/changelogs/AutoChangeLog-pr-11244.yml
new file mode 100644
index 0000000000..ee262dc682
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11244.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed viruses not working on anthros and some others species."
diff --git a/html/changelogs/AutoChangeLog-pr-11157.yml b/html/changelogs/AutoChangeLog-pr-11248.yml
similarity index 56%
rename from html/changelogs/AutoChangeLog-pr-11157.yml
rename to html/changelogs/AutoChangeLog-pr-11248.yml
index 5843c5f0e4..f7b845926a 100644
--- a/html/changelogs/AutoChangeLog-pr-11157.yml
+++ b/html/changelogs/AutoChangeLog-pr-11248.yml
@@ -1,4 +1,4 @@
author: "Putnam3145"
delete-after: True
changes:
- - tweak: "Licking pref"
+ - bugfix: "Made lickable pref save"
diff --git a/html/changelogs/AutoChangeLog-pr-10748.yml b/html/changelogs/AutoChangeLog-pr-11249.yml
similarity index 50%
rename from html/changelogs/AutoChangeLog-pr-10748.yml
rename to html/changelogs/AutoChangeLog-pr-11249.yml
index a2afda81aa..2988e5ca92 100644
--- a/html/changelogs/AutoChangeLog-pr-10748.yml
+++ b/html/changelogs/AutoChangeLog-pr-11249.yml
@@ -1,4 +1,4 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- - bugfix: "Vault hallway door being all access"
+ - spellcheck: "Alien bar stool is no longer bronze"
diff --git a/html/changelogs/AutoChangeLog-pr-11250.yml b/html/changelogs/AutoChangeLog-pr-11250.yml
new file mode 100644
index 0000000000..8ed1ea85ba
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11250.yml
@@ -0,0 +1,5 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - balance: "rebalanced rising bass's buttom actions from repulse to side kick"
+ - bugfix: "projectiles and rising bass and items and rising bass"
diff --git a/html/changelogs/AutoChangeLog-pr-11251.yml b/html/changelogs/AutoChangeLog-pr-11251.yml
new file mode 100644
index 0000000000..0d22ba89ff
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11251.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - server: "28 days log changlogs have been added well 56+ day old changlogs have been removed"
diff --git a/html/changelogs/AutoChangeLog-pr-11254.yml b/html/changelogs/AutoChangeLog-pr-11254.yml
new file mode 100644
index 0000000000..63856f65e8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11254.yml
@@ -0,0 +1,4 @@
+author: "Bhijn"
+delete-after: True
+changes:
+ - tweak: "Clicking an open closet with harm intent no longer attempts to place your currently held item inside, but rather attacks it."
diff --git a/html/changelogs/AutoChangeLog-pr-11257.yml b/html/changelogs/AutoChangeLog-pr-11257.yml
new file mode 100644
index 0000000000..1c96361503
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11257.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - tweak: "pacifists can no longer meatspike living things"
diff --git a/html/changelogs/AutoChangeLog-pr-11260.yml b/html/changelogs/AutoChangeLog-pr-11260.yml
new file mode 100644
index 0000000000..52a0df9118
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11260.yml
@@ -0,0 +1,4 @@
+author: "Kraseo"
+delete-after: True
+changes:
+ - balance: "Gangs no longer get soporific rounds for their sniper rifles."
diff --git a/html/changelogs/AutoChangeLog-pr-11265.yml b/html/changelogs/AutoChangeLog-pr-11265.yml
new file mode 100644
index 0000000000..1b244cd674
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11265.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - sounddel: "Made the cogchamp mixing sound less annoying."
diff --git a/html/changelogs/AutoChangeLog-pr-11268.yml b/html/changelogs/AutoChangeLog-pr-11268.yml
new file mode 100644
index 0000000000..f8f33cfdd2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11268.yml
@@ -0,0 +1,6 @@
+author: "raspyosu"
+delete-after: True
+changes:
+ - bugfix: "cloak sometimes not restoring initial move intent"
+ - tweak: "mesmerize (line of sight checking system and remove progress bar)"
+ - balance: "nerf: lunge, mesmerize"
diff --git a/html/changelogs/AutoChangeLog-pr-11270.yml b/html/changelogs/AutoChangeLog-pr-11270.yml
new file mode 100644
index 0000000000..86a4df8fc2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11270.yml
@@ -0,0 +1,5 @@
+author: "ancientpower"
+delete-after: True
+changes:
+ - imageadd: "Snazzier sprites for paramedic gear."
+ - rscadd: "Unused paramedic gear added for future use."
diff --git a/html/changelogs/AutoChangeLog-pr-11271.yml b/html/changelogs/AutoChangeLog-pr-11271.yml
new file mode 100644
index 0000000000..382144298a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11271.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - tweak: "Pushing is no longer free space movement."
diff --git a/html/changelogs/AutoChangeLog-pr-11277.yml b/html/changelogs/AutoChangeLog-pr-11277.yml
new file mode 100644
index 0000000000..6db1db58b9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11277.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - tweak: "You can now right click to point the tip of some sharp tipped weapons at people."
diff --git a/html/changelogs/AutoChangeLog-pr-11279.yml b/html/changelogs/AutoChangeLog-pr-11279.yml
new file mode 100644
index 0000000000..5f4aa506f2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11279.yml
@@ -0,0 +1,5 @@
+author: "Dennok, ported by Hatterhat"
+delete-after: True
+changes:
+ - bugfix: "Lava rivers no longer burn into basalt."
+ - code_imp: "The river generator can now specify baseturfs."
diff --git a/html/changelogs/AutoChangeLog-pr-11283.yml b/html/changelogs/AutoChangeLog-pr-11283.yml
new file mode 100644
index 0000000000..ae0d2706da
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11283.yml
@@ -0,0 +1,4 @@
+author: "Ragolution"
+delete-after: True
+changes:
+ - rscadd: "All winter coats and hoods might be different if slightly from one a other."
diff --git a/html/changelogs/AutoChangeLog-pr-11287.yml b/html/changelogs/AutoChangeLog-pr-11287.yml
new file mode 100644
index 0000000000..5a1939e90c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11287.yml
@@ -0,0 +1,4 @@
+author: "monster860"
+delete-after: True
+changes:
+ - tweak: "You can now moan in soft crit"
diff --git a/html/changelogs/AutoChangeLog-pr-10971.yml b/html/changelogs/AutoChangeLog-pr-11289.yml
similarity index 50%
rename from html/changelogs/AutoChangeLog-pr-10971.yml
rename to html/changelogs/AutoChangeLog-pr-11289.yml
index e7882646f8..fb16bc34a7 100644
--- a/html/changelogs/AutoChangeLog-pr-10971.yml
+++ b/html/changelogs/AutoChangeLog-pr-11289.yml
@@ -1,4 +1,4 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- - rscadd: "Alien stools and chairs"
+ - tweak: "Cotton/Durathread now stack to 80 bundles"
diff --git a/html/changelogs/AutoChangeLog-pr-11291.yml b/html/changelogs/AutoChangeLog-pr-11291.yml
new file mode 100644
index 0000000000..829de0f341
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11291.yml
@@ -0,0 +1,4 @@
+author: "YakumoChen"
+delete-after: True
+changes:
+ - bugfix: "Mining base looks more natural where it's spawned."
diff --git a/html/changelogs/AutoChangeLog-pr-11296.yml b/html/changelogs/AutoChangeLog-pr-11296.yml
new file mode 100644
index 0000000000..3c255ee7de
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11296.yml
@@ -0,0 +1,5 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - bugfix: "Actually made things work as intended."
+ - code_imp: "Removed a redundant turf melting check from the supermatter."
diff --git a/html/changelogs/AutoChangeLog-pr-11299.yml b/html/changelogs/AutoChangeLog-pr-11299.yml
new file mode 100644
index 0000000000..a0c29184d0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11299.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "flypeople being unable to gain nutrition from eating vomit"
diff --git a/html/changelogs/AutoChangeLog-pr-11300.yml b/html/changelogs/AutoChangeLog-pr-11300.yml
new file mode 100644
index 0000000000..362127bdb6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11300.yml
@@ -0,0 +1,4 @@
+author: "kappa-sama"
+delete-after: True
+changes:
+ - rscdel: "removed laptops giving slowdown when open"
diff --git a/html/changelogs/AutoChangeLog-pr-11302.yml b/html/changelogs/AutoChangeLog-pr-11302.yml
new file mode 100644
index 0000000000..b4012bd269
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11302.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - bugfix: "compact defibs have 10k cells again"
diff --git a/html/changelogs/AutoChangeLog-pr-11303.yml b/html/changelogs/AutoChangeLog-pr-11303.yml
new file mode 100644
index 0000000000..c65596d911
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11303.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - tweak: "music max characters per line is now 150 instead of 50."
diff --git a/html/changelogs/AutoChangeLog-pr-10874.yml b/html/changelogs/AutoChangeLog-pr-11306.yml
similarity index 50%
rename from html/changelogs/AutoChangeLog-pr-10874.yml
rename to html/changelogs/AutoChangeLog-pr-11306.yml
index bb46b5240d..89d6d50846 100644
--- a/html/changelogs/AutoChangeLog-pr-10874.yml
+++ b/html/changelogs/AutoChangeLog-pr-11306.yml
@@ -1,4 +1,4 @@
author: "Ghommie"
delete-after: True
changes:
- - bugfix: "Fixed the petting element."
+ - rscdel: "Removed makeshift switchblades."
diff --git a/html/changelogs/AutoChangeLog-pr-10773.yml b/html/changelogs/AutoChangeLog-pr-11308.yml
similarity index 51%
rename from html/changelogs/AutoChangeLog-pr-10773.yml
rename to html/changelogs/AutoChangeLog-pr-11308.yml
index 64ab5ce124..bd233883b7 100644
--- a/html/changelogs/AutoChangeLog-pr-10773.yml
+++ b/html/changelogs/AutoChangeLog-pr-11308.yml
@@ -1,4 +1,4 @@
author: "Putnam3145"
delete-after: True
changes:
- - bugfix: "Hypno prefs work better."
+ - rscdel: "Removed \"realistic tcomms lag\""
diff --git a/html/changelogs/AutoChangeLog-pr-11310.yml b/html/changelogs/AutoChangeLog-pr-11310.yml
new file mode 100644
index 0000000000..2d5e064155
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11310.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "pAIs, drones, monkys and lizards can be worn over the head again."
diff --git a/html/changelogs/AutoChangeLog-pr-11314.yml b/html/changelogs/AutoChangeLog-pr-11314.yml
new file mode 100644
index 0000000000..a58fb07d3f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11314.yml
@@ -0,0 +1,8 @@
+author: "KathrinBailey"
+delete-after: True
+changes:
+ - rscadd: "Nine new posters!"
+ - rscadd: "Shower curtains can be crafted."
+ - rscadd: "New sofas!"
+ - rscadd: "Green and purple comfy chairs to the crafting menu to fit green and purple carpets."
+ - bugfix: "Shower curtains now let you see through them once open, and don't once closed."
diff --git a/html/changelogs/AutoChangeLog-pr-11316.yml b/html/changelogs/AutoChangeLog-pr-11316.yml
new file mode 100644
index 0000000000..fce3a7af6a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11316.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed cargo passive point generation to not go into decimals."
diff --git a/html/changelogs/AutoChangeLog-pr-11318.yml b/html/changelogs/AutoChangeLog-pr-11318.yml
new file mode 100644
index 0000000000..bc9cfee805
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11318.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "targetting mouth on help intent now properly nose boops"
diff --git a/html/changelogs/AutoChangeLog-pr-11320.yml b/html/changelogs/AutoChangeLog-pr-11320.yml
new file mode 100644
index 0000000000..e25b7bc0ac
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11320.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Syndicate ninjas are slightly less friendly now."
diff --git a/html/changelogs/AutoChangeLog-pr-11321.yml b/html/changelogs/AutoChangeLog-pr-11321.yml
new file mode 100644
index 0000000000..350b1a7aad
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11321.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - bugfix: "storage no longer closes while being dragged"
diff --git a/html/changelogs/AutoChangeLog-pr-11323.yml b/html/changelogs/AutoChangeLog-pr-11323.yml
new file mode 100644
index 0000000000..da8c14d7d0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11323.yml
@@ -0,0 +1,4 @@
+author: "floyd"
+delete-after: True
+changes:
+ - bugfix: "Everything made from glass in the game has a little more tegridy and doesnt break from a single punch."
diff --git a/html/changelogs/AutoChangeLog-pr-11324.yml b/html/changelogs/AutoChangeLog-pr-11324.yml
new file mode 100644
index 0000000000..1dfbee2b9f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11324.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Medical hardsuits now have a Medi-Hud built into its helm"
diff --git a/html/changelogs/AutoChangeLog-pr-11325.yml b/html/changelogs/AutoChangeLog-pr-11325.yml
new file mode 100644
index 0000000000..7b95f34f1d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11325.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - rscdel: "Removed some particularly bad flavor objectives."
diff --git a/html/changelogs/AutoChangeLog-pr-11327.yml b/html/changelogs/AutoChangeLog-pr-11327.yml
new file mode 100644
index 0000000000..344abc13f8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11327.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - bugfix: "Fixed reagent container transfer amount cycling."
diff --git a/html/changelogs/AutoChangeLog-pr-10753.yml b/html/changelogs/AutoChangeLog-pr-11328.yml
similarity index 50%
rename from html/changelogs/AutoChangeLog-pr-10753.yml
rename to html/changelogs/AutoChangeLog-pr-11328.yml
index c1b3615c3d..29683d5e9c 100644
--- a/html/changelogs/AutoChangeLog-pr-10753.yml
+++ b/html/changelogs/AutoChangeLog-pr-11328.yml
@@ -1,4 +1,4 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- - server: "Updates change logs"
+ - rscdel: "Removed old unused Techweb Node selling"
diff --git a/html/changelogs/AutoChangeLog-pr-11330.yml b/html/changelogs/AutoChangeLog-pr-11330.yml
new file mode 100644
index 0000000000..fc746330d6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11330.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - balance: "Allowed blobbernauts to drag objects (but not mobs) again."
diff --git a/html/changelogs/AutoChangeLog-pr-11333.yml b/html/changelogs/AutoChangeLog-pr-11333.yml
new file mode 100644
index 0000000000..b09f76b7c8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11333.yml
@@ -0,0 +1,5 @@
+author: "MrJWhit"
+delete-after: True
+changes:
+ - tweak: "Added minor station things"
+ - balance: "re balanced r-walls"
diff --git a/html/changelogs/AutoChangeLog-pr-9860.yml b/html/changelogs/AutoChangeLog-pr-9860.yml
deleted file mode 100644
index c9d75aa7b9..0000000000
--- a/html/changelogs/AutoChangeLog-pr-9860.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "tralezab, bandit, Skoglol"
-delete-after: True
-changes:
- - rscadd: "The mime's PDA messages are silent now!"
- - rscadd: "30 new emoji have been added. Mime buff, mime now OP."
diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi
index f5ba86c0fa..8b21c32d6b 100644
Binary files a/icons/mob/actions/actions_items.dmi and b/icons/mob/actions/actions_items.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 7a28827903..1a2c0e189a 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index 1a4b8019cd..b3960f4db6 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/feet_digi.dmi b/icons/mob/feet_digi.dmi
index ddc5ff0c5f..78f50519fa 100644
Binary files a/icons/mob/feet_digi.dmi and b/icons/mob/feet_digi.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 01e9f2ac2c..05cb49e38f 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/head_muzzled.dmi b/icons/mob/head_muzzled.dmi
index 5430f07726..4b8263469f 100644
Binary files a/icons/mob/head_muzzled.dmi and b/icons/mob/head_muzzled.dmi differ
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index 8ea155256c..c21fa47b9c 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi
index 72b994328d..c25ea837da 100644
Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi
index ef1001c438..65f1145278 100644
Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/staves_lefthand.dmi b/icons/mob/inhands/weapons/staves_lefthand.dmi
index 8b96b84236..ca1694b1f1 100644
Binary files a/icons/mob/inhands/weapons/staves_lefthand.dmi and b/icons/mob/inhands/weapons/staves_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/staves_righthand.dmi b/icons/mob/inhands/weapons/staves_righthand.dmi
index 202bab9e21..4d366d950f 100644
Binary files a/icons/mob/inhands/weapons/staves_righthand.dmi and b/icons/mob/inhands/weapons/staves_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi
index b74fa16e6a..2169b87580 100644
Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi
index 8c60c52e76..f054d8f744 100644
Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ
diff --git a/icons/mob/landmarks.dmi b/icons/mob/landmarks.dmi
index 120745ed44..284809da70 100644
Binary files a/icons/mob/landmarks.dmi and b/icons/mob/landmarks.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 30c43985fa..5b501cc1aa 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/suit_digi.dmi b/icons/mob/suit_digi.dmi
index da51f9e621..8bea32eca4 100644
Binary files a/icons/mob/suit_digi.dmi and b/icons/mob/suit_digi.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 69d8966329..e675a8d647 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/mob/uniform_digi.dmi b/icons/mob/uniform_digi.dmi
index 0b8c495c5a..82dc09e43e 100644
Binary files a/icons/mob/uniform_digi.dmi and b/icons/mob/uniform_digi.dmi differ
diff --git a/icons/obj/barsigns.dmi b/icons/obj/barsigns.dmi
index 1fffa2e540..22f3071862 100644
Binary files a/icons/obj/barsigns.dmi and b/icons/obj/barsigns.dmi differ
diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi
index afedc69eca..1c09cf94dc 100644
Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ
diff --git a/icons/obj/chess.dmi b/icons/obj/chess.dmi
new file mode 100644
index 0000000000..191eed8843
Binary files /dev/null and b/icons/obj/chess.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index d5f3be5fdd..3d384b71d6 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 3c8a1332a9..1105e30ae7 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 470f2a9d69..a98e745c40 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index ce458a1de3..090003011b 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi
index f86dd2e7d0..29308832cf 100644
Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ
diff --git a/icons/obj/guns/magic.dmi b/icons/obj/guns/magic.dmi
index 0a4152af64..9ff788bfb6 100644
Binary files a/icons/obj/guns/magic.dmi and b/icons/obj/guns/magic.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 58e427a3fb..f859e8b1e7 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 7058b9918b..04e2c27caf 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi
index 7d184c6459..8992f4a4a1 100644
Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ
diff --git a/icons/obj/sofa.dmi b/icons/obj/sofa.dmi
index 13cc43fe4e..1d6510981b 100644
Binary files a/icons/obj/sofa.dmi and b/icons/obj/sofa.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 998ccc948d..56c32eb889 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index fcc28de7b9..e998ce442d 100755
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index ee703fc70b..6a2bb343df 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index cd504a124a..4856eefa3e 100644
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/modular_citadel/code/_onclick/item_attack.dm b/modular_citadel/code/_onclick/item_attack.dm
index d87b2be661..bba3b14e2e 100644
--- a/modular_citadel/code/_onclick/item_attack.dm
+++ b/modular_citadel/code/_onclick/item_attack.dm
@@ -16,4 +16,5 @@
return FALSE
/obj/item/proc/altafterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ SEND_SIGNAL(src, COMSIG_ITEM_ALT_AFTERATTACK, target, user, proximity_flag, click_parameters)
return FALSE
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index 82f4fbf1d9..e32d226595 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -543,7 +543,7 @@
if (statusStrength < 0)
status = null
owner.remove_movespeed_modifier(MOVESPEED_ID_MKULTRA)
- owner.Knockdown(50)
+ owner.DefaultCombatKnockdown(50)
to_chat(owner, "Your body gives out as the adrenaline in your system runs out.")
else
statusStrength -= 1
@@ -638,7 +638,7 @@
H.adjust_arousal(5)
C.jitteriness += 100
C.stuttering += 25
- C.Knockdown(60)
+ C.DefaultCombatKnockdown(60)
C.Stun(60)
to_chat(owner, "Your muscles seize up, then start spasming wildy!")
diff --git a/modular_citadel/code/datums/status_effects/debuffs.dm b/modular_citadel/code/datums/status_effects/debuffs.dm
deleted file mode 100644
index 6dcfc84a87..0000000000
--- a/modular_citadel/code/datums/status_effects/debuffs.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-/datum/status_effect/incapacitating/knockdown/on_creation(mob/living/new_owner, set_duration, updating_canmove, override_duration, override_stam)
- if(iscarbon(new_owner) && (isnum(set_duration) || isnum(override_duration)))
- if(istype(new_owner.buckled, /obj/vehicle/ridden))
- var/obj/buckl = new_owner.buckled
- buckl.unbuckle_mob(new_owner)
- new_owner.resting = TRUE
- new_owner.adjustStaminaLoss(isnull(override_stam)? set_duration*0.25 : override_stam)
- if(isnull(override_duration) && (set_duration > 80))
- set_duration = set_duration*0.01
- return ..()
- else if(!isnull(override_duration))
- set_duration = override_duration
- return ..()
- else if(updating_canmove)
- new_owner.update_canmove()
- qdel(src)
- else
- . = ..()
diff --git a/modular_citadel/code/game/objects/cit_screenshake.dm b/modular_citadel/code/game/objects/cit_screenshake.dm
index 5bb1f82c10..ddb417e06e 100644
--- a/modular_citadel/code/game/objects/cit_screenshake.dm
+++ b/modular_citadel/code/game/objects/cit_screenshake.dm
@@ -53,7 +53,7 @@
if (1)
shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
if (2)
- if (!M.canmove)
+ if(!CHECK_MOBILITY(M, MOBILITY_MOVE))
shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015))
/obj/item/attack_obj(obj/O, mob/living/user)
diff --git a/modular_citadel/code/game/objects/items/devices/radio/shockcollar.dm b/modular_citadel/code/game/objects/items/devices/radio/shockcollar.dm
new file mode 100644
index 0000000000..44b8067876
--- /dev/null
+++ b/modular_citadel/code/game/objects/items/devices/radio/shockcollar.dm
@@ -0,0 +1,83 @@
+/obj/item/electropack/shockcollar
+ name = "shock collar"
+ desc = "A reinforced metal collar. It seems to have some form of wiring near the front. Strange.."
+ icon = 'modular_citadel/icons/obj/clothing/cit_neck.dmi'
+ alternate_worn_icon = 'modular_citadel/icons/mob/citadel/neck.dmi'
+ icon_state = "shockcollar"
+ item_state = "shockcollar"
+ body_parts_covered = NECK
+ slot_flags = ITEM_SLOT_NECK | ITEM_SLOT_DENYPOCKET //no more pocket shockers
+ w_class = WEIGHT_CLASS_SMALL
+ strip_delay = 60
+ equip_delay_other = 60
+ materials = list(MAT_METAL=5000, MAT_GLASS=2000)
+ var/tagname = null
+
+/datum/design/electropack/shockcollar
+ name = "Shockcollar"
+ id = "shockcollar"
+ build_type = AUTOLATHE
+ build_path = /obj/item/electropack/shockcollar
+ materials = list(MAT_METAL=5000, MAT_GLASS=2000)
+ category = list("hacked", "Misc")
+
+/obj/item/electropack/shockcollar/attack_hand(mob/user)
+ if(loc == user && user.get_item_by_slot(SLOT_NECK))
+ to_chat(user, "The collar is fastened tight! You'll need help taking this off!")
+ return
+ ..()
+
+/obj/item/electropack/shockcollar/receive_signal(datum/signal/signal)
+ if(!signal || signal.data["code"] != code)
+ return
+
+ if(isliving(loc) && on)
+ if(shock_cooldown != 0)
+ return
+ shock_cooldown = 1
+ spawn(100)
+ shock_cooldown = 0
+ var/mob/living/L = loc
+ step(L, pick(GLOB.cardinals))
+
+ to_chat(L, "You feel a sharp shock from the collar!")
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(3, 1, L)
+ s.start()
+
+ L.DefaultCombatKnockdown(100)
+
+ if(master)
+ master.receive_signal()
+ return
+
+/obj/item/electropack/shockcollar/attack_self(mob/user) //Turns out can't fully source this from the parent item, spritepath gets confused if power toggled. Will come back to this when I know how to code better and readd powertoggle..
+ var/option = "Change Name"
+ option = input(user, "What do you want to do?", "[src]", option) as null|anything in list("Change Name", "Change Frequency")
+ switch(option)
+ if("Change Name")
+ var/t = input(user, "Would you like to change the name on the tag?", "Name your new pet", tagname ? tagname : "Spot") as null|text
+ if(t)
+ tagname = copytext(sanitize(t), 1, MAX_NAME_LEN)
+ name = "[initial(name)] - [tagname]"
+ if("Change Frequency")
+ if(!ishuman(user))
+ return
+ user.set_machine(src)
+ var/dat = {"
+ Frequency/Code for shock collar:
+ Frequency:
+ -
+ - [format_frequency(frequency)]
+ +
+ +
+ Code:
+ -
+ - [code]
+ +
+ +
+ "}
+
+ user << browse(dat, "window=radio")
+ onclose(user, "radio")
+ return
diff --git a/modular_citadel/code/game/objects/structures/beds_chairs/chair.dm b/modular_citadel/code/game/objects/structures/beds_chairs/chair.dm
new file mode 100644
index 0000000000..5b20fe048b
--- /dev/null
+++ b/modular_citadel/code/game/objects/structures/beds_chairs/chair.dm
@@ -0,0 +1,21 @@
+/obj/structure/chair/alt_attack_hand(mob/living/user)
+ if(Adjacent(user) && istype(user))
+ if(!item_chair || !user.can_hold_items() || !has_buckled_mobs() || buckled_mobs.len > 1 || dir != user.dir || flags_1 & NODECONSTRUCT_1)
+ return TRUE
+ if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ to_chat(user, "You can't do that right now!")
+ return TRUE
+ if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
+ to_chat(user, "You're too exhausted for that.")
+ return TRUE
+ var/mob/living/poordude = buckled_mobs[1]
+ if(!istype(poordude))
+ return TRUE
+ user.visible_message("[user] pulls [src] out from under [poordude].", "You pull [src] out from under [poordude].")
+ var/C = new item_chair(loc)
+ user.put_in_hands(C)
+ poordude.DefaultCombatKnockdown(20)//rip in peace
+ user.adjustStaminaLoss(5)
+ unbuckle_all_mobs(TRUE)
+ qdel(src)
+ return TRUE
diff --git a/modular_citadel/code/modules/arousal/organs/ovipositor.dm b/modular_citadel/code/modules/arousal/organs/ovipositor.dm
index c26424d296..07a9e89746 100644
--- a/modular_citadel/code/modules/arousal/organs/ovipositor.dm
+++ b/modular_citadel/code/modules/arousal/organs/ovipositor.dm
@@ -11,6 +11,6 @@
layer_index = PENIS_LAYER_INDEX
var/length = 6 //inches
var/girth = 0
- var/girth_ratio = COCK_GIRTH_RATIO_DEF //citadel_defines.dm for these defines
+ var/girth_ratio = COCK_DIAMETER_RATIO_DEF //citadel_defines.dm for these defines
var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
var/list/oviflags = list()
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index 38f463a97c..c9eb0769cf 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -11,12 +11,13 @@
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE
linked_organ_slot = ORGAN_SLOT_TESTICLES
fluid_transfer_factor = 0.5
- size = 2 //arbitrary value derived from length and girth for sprites.
+ size = 2 //arbitrary value derived from length and diameter for sprites.
layer_index = PENIS_LAYER_INDEX
var/length = 6 //inches
- var/prev_length = 6
- var/girth = 4.38
- var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
+
+ var/prev_length = 6 //really should be renamed to prev_length
+ var/diameter = 4.38
+ var/diameter_ratio = COCK_DIAMETER_RATIO_DEF //0.25; check citadel_defines.dm
/obj/item/organ/genital/penis/modify_size(modifier, min = -INFINITY, max = INFINITY)
var/new_value = CLAMP(length + modifier, min, max)
@@ -68,7 +69,7 @@
else if ((round(length) < round(prev_length)) && (length > 0.5))
to_chat(owner, "Your [pick(GLOB.gentlemans_organ_names)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.")
icon_state = sanitize_text("penis_[shape]_[size]")
- girth = (length * girth_ratio)//Is it just me or is this ludicous, why not make it exponentially decay?
+ diameter = (length * diameter_ratio)//Is it just me or is this ludicous, why not make it exponentially decay?
/obj/item/organ/genital/penis/update_appearance()
@@ -77,7 +78,8 @@
var/icon_shape = S ? S.icon_state : "human"
icon_state = "penis_[icon_shape]_[size]"
var/lowershape = lowertext(shape)
- desc = "You see [aroused_state ? "an erect" : "a flaccid"] [lowershape] [name]. You estimate it's about [round(length, 0.25)] inch[round(length, 0.25) != 1 ? "es" : ""] long and [round(girth, 0.25)] inch[round(girth, 0.25) != 1 ? "es" : ""] in girth."
+ desc = "You see [aroused_state ? "an erect" : "a flaccid"] [lowershape] [name]. You estimate it's about [round(length, 0.25)] inch[round(length, 0.25) != 1 ? "es" : ""] long and [round(diameter, 0.25)] inch[round(diameter, 0.25) != 1 ? "es" : ""] in diameter."
+
if(owner)
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
@@ -97,6 +99,6 @@
else
color = "#[D.features["cock_color"]]"
length = D.features["cock_length"]
- girth_ratio = D.features["cock_girth_ratio"]
+ diameter_ratio = D.features["cock_diameter_ratio"]
shape = D.features["cock_shape"]
prev_length = length
diff --git a/modular_citadel/code/modules/clothing/under/trek_under.dm b/modular_citadel/code/modules/clothing/under/trek_under.dm
index 683167f325..6cacf5921b 100644
--- a/modular_citadel/code/modules/clothing/under/trek_under.dm
+++ b/modular_citadel/code/modules/clothing/under/trek_under.dm
@@ -168,8 +168,9 @@
set category = "Object"
set src in usr
- if(!usr.canmove || usr.stat || usr.restrained())
- return 0
+ var/mob/living/L = usr
+ if(!istype(L) || !CHECK_MOBILITY(L, MOBILITY_USE))
+ return FALSE
switch(unbuttoned)
if(0)
diff --git a/modular_citadel/code/modules/mentor/mentor.dm b/modular_citadel/code/modules/mentor/mentor.dm
index 4446c41d96..79345e6478 100644
--- a/modular_citadel/code/modules/mentor/mentor.dm
+++ b/modular_citadel/code/modules/mentor/mentor.dm
@@ -14,8 +14,7 @@ GLOBAL_PROTECT(mentor_href_token)
/datum/mentors/New(ckey)
if(!ckey)
QDEL_IN(src, 0)
- throw EXCEPTION("Mentor datum created without a ckey")
- return
+ CRASH("Mentor datum created without a ckey")
target = ckey(ckey)
name = "[ckey]'s mentor datum"
href_token = GenerateToken()
diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
index 34ea0e789f..44512ac0c7 100644
--- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
@@ -8,16 +8,6 @@
//oh no vore time
var/voremode = FALSE
-/mob/living/carbon/CanPass(atom/movable/mover, turf/target)
- . = ..()
- if(.)
- var/mob/living/mobdude = mover
- if(istype(mobdude))
- if(!resting && mobdude.resting)
- if(!(mobdude.pass_flags & PASSMOB))
- return FALSE
- return .
-
/mob/living/carbon/proc/toggle_combat_mode(forced, silent)
if(!forced)
if(recoveringstam || stat != CONSCIOUS)
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human.dm b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
index e5d386b56b..ee88fcb277 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/human.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
@@ -4,7 +4,7 @@
/mob/living/carbon/human/resist_embedded()
if(handcuffed || legcuffed || (wear_suit && wear_suit.breakouttime))
return
- if(canmove && !on_fire)
+ if(CHECK_MOBILITY(src, MOBILITY_MOVE) && !on_fire)
for(var/obj/item/bodypart/L in bodyparts)
if(istype(L) && L.embedded_objects.len)
for(var/obj/item/I in L.embedded_objects)
@@ -25,4 +25,3 @@
if(!has_embedded_objects())
clear_alert("embeddedobject")
SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "embedded")
- return
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm
index bd43d96ba4..2223b0816a 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm
@@ -1,18 +1,18 @@
/mob/living/carbon/human/Move(NewLoc, direct)
var/oldpseudoheight = pseudo_z_axis
. = ..()
- if(. && sprinting && !(movement_type & FLYING) && canmove && !resting && m_intent == MOVE_INTENT_RUN && has_gravity(loc) && !pulledby)
+ if(. && sprinting && !(movement_type & FLYING) && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_MOVE|MOBILITY_STAND) && m_intent == MOVE_INTENT_RUN && has_gravity(loc) && !pulledby)
if(!HAS_TRAIT(src, TRAIT_FREESPRINT))
doSprintLossTiles(1)
if((oldpseudoheight - pseudo_z_axis) >= 8)
to_chat(src, "You trip off of the elevated surface!")
for(var/obj/item/I in held_items)
accident(I)
- Knockdown(80)
+ DefaultCombatKnockdown(80)
/mob/living/carbon/human/movement_delay()
. = 0
- if(!resting && m_intent == MOVE_INTENT_RUN && sprinting)
+ if((mobility_flags & MOBILITY_STAND) && m_intent == MOVE_INTENT_RUN && sprinting)
var/static/datum/config_entry/number/movedelay/sprint_speed_increase/SSI
if(!SSI)
SSI = CONFIG_GET_ENTRY(number/movedelay/sprint_speed_increase)
@@ -23,7 +23,7 @@
/mob/living/carbon/human/proc/togglesprint() // If you call this proc outside of hotkeys or clicking the HUD button, I'll be disappointed in you.
sprinting = !sprinting
- if(!resting && m_intent == MOVE_INTENT_RUN && canmove)
+ if((m_intent == MOVE_INTENT_RUN) && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE))
if(sprinting)
playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE)
else
diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm
index 0caf548196..c0e045365f 100644
--- a/modular_citadel/code/modules/mob/living/living.dm
+++ b/modular_citadel/code/modules/mob/living/living.dm
@@ -25,7 +25,7 @@
/mob/living/movement_delay(ignorewalk = 0)
. = ..()
- if(resting)
+ if(!CHECK_MOBILITY(src, MOBILITY_STAND))
. += 6
/atom
@@ -53,85 +53,22 @@
pseudo_z_axis = newloc.get_fake_z()
pixel_z = pseudo_z_axis
-/mob/living/proc/lay_down()
- set name = "Rest"
- set category = "IC"
-
- if(client && client.prefs && client.prefs.autostand)
- intentionalresting = !intentionalresting
- to_chat(src, "You are now attempting to [intentionalresting ? "[!resting ? "lay down and ": ""]stay down" : "[resting ? "get up and ": ""]stay up"].")
- if(intentionalresting && !resting)
- resting = TRUE
- update_canmove()
- else
- resist_a_rest()
- else
- if(!resting)
- resting = TRUE
- to_chat(src, "You are now laying down.")
- update_canmove()
- else
- resist_a_rest()
-
-/mob/living/proc/resist_a_rest(automatic = FALSE, ignoretimer = FALSE) //Lets mobs resist out of resting. Major QOL change with combat reworks.
- if(!resting || stat || attemptingstandup)
- return FALSE
- if(ignoretimer)
- resting = FALSE
- update_canmove()
- return TRUE
- else
- var/totaldelay = 3 //A little bit less than half of a second as a baseline for getting up from a rest
- if(getStaminaLoss() >= STAMINA_SOFTCRIT)
- to_chat(src, "You're too exhausted to get up!")
- return FALSE
- attemptingstandup = TRUE
- var/health_deficiency = max((maxHealth - (health - getStaminaLoss()))*0.5, 0)
- if(!has_gravity())
- health_deficiency = health_deficiency*0.2
- totaldelay += health_deficiency
- var/standupwarning = "[src] and everyone around them should probably yell at the dev team"
- switch(health_deficiency)
- if(-INFINITY to 10)
- standupwarning = "[src] stands right up!"
- if(10 to 35)
- standupwarning = "[src] tries to stand up."
- if(35 to 60)
- standupwarning = "[src] slowly pushes [p_them()]self upright."
- if(60 to 80)
- standupwarning = "[src] weakly attempts to stand up."
- if(80 to INFINITY)
- standupwarning = "[src] struggles to stand up."
- var/usernotice = automatic ? "You are now getting up. (Auto)" : "You are now getting up."
- visible_message("[standupwarning]", usernotice, vision_distance = 5)
- if(do_after(src, totaldelay, target = src))
- resting = FALSE
- attemptingstandup = FALSE
- update_canmove()
- return TRUE
- else
- visible_message("[src] falls right back down.", "You fall right back down.")
- attemptingstandup = FALSE
- if(has_gravity())
- playsound(src, "bodyfall", 20, 1)
- return FALSE
-
/mob/living/carbon/update_stamina()
var/total_health = getStaminaLoss()
if(total_health)
if(!recoveringstam && total_health >= STAMINA_CRIT && !stat)
to_chat(src, "You're too exhausted to keep going...")
- resting = TRUE
+ set_resting(TRUE, FALSE, FALSE)
if(combatmode)
toggle_combat_mode(TRUE)
recoveringstam = TRUE
filters += CIT_FILTER_STAMINACRIT
- update_canmove()
+ update_mobility()
if(recoveringstam && total_health <= STAMINA_SOFTCRIT)
to_chat(src, "You don't feel nearly as exhausted anymore.")
recoveringstam = FALSE
filters -= CIT_FILTER_STAMINACRIT
- update_canmove()
+ update_mobility()
update_health_hud()
/mob/living/proc/update_hud_sprint_bar()
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
index c2b8ff0868..6d080ee898 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
@@ -54,8 +54,8 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
var/mob/living/M = A
var/cachedstam = M.getStaminaLoss()
var/totalstuntime = cachedstam * stamtostunconversion * (M.lying ? 2 : 1)
- if(!M.resting)
- M.Knockdown(cachedstam*2) //BORK BORK. GET DOWN.
+ if(CHECK_MOBILITY(M, MOBILITY_STAND))
+ M.DefaultCombatKnockdown(cachedstam*2) //BORK BORK. GET DOWN.
M.Stun(totalstuntime)
user.do_attack_animation(A, ATTACK_EFFECT_BITE)
user.start_pulling(M, TRUE) //Yip yip. Come with.
@@ -284,7 +284,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
to_chat(R, "Insufficent Power!")
return
L.Stun(4) // normal stunbaton is force 7 gimme a break good sir!
- L.Knockdown(80)
+ L.DefaultCombatKnockdown(80)
L.apply_effect(EFFECT_STUTTER, 4)
L.visible_message("[R] has shocked [L] with its tongue!", \
"[R] has shocked you with its tongue!")
@@ -426,13 +426,13 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
var/mob/living/L = hit_atom
if(!L.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK))
L.visible_message("[src] pounces on [L]!", "[src] pounces on you!")
- L.Knockdown(iscarbon(L) ? 60 : 45, override_stamdmg = CLAMP(pounce_stamloss, 0, pounce_stamloss_cap-L.getStaminaLoss())) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice.
+ L.DefaultCombatKnockdown(iscarbon(L) ? 60 : 45, override_stamdmg = CLAMP(pounce_stamloss, 0, pounce_stamloss_cap-L.getStaminaLoss())) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice.
playsound(src, 'sound/weapons/Egloves.ogg', 50, 1)
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
step_towards(src,L)
log_combat(src, L, "borg pounced")
else
- Knockdown(15, 1, 1)
+ DefaultCombatKnockdown(15, 1, 1)
pounce_cooldown = !pounce_cooldown
spawn(pounce_cooldown_time) //3s by default
@@ -440,10 +440,10 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
else if(hit_atom.density && !hit_atom.CanPass(src))
visible_message("[src] smashes into [hit_atom]!", "You smash into [hit_atom]!")
playsound(src, 'sound/items/trayhit1.ogg', 50, 1)
- Knockdown(15, 1, 1)
+ DefaultCombatKnockdown(15, 1, 1)
if(leaping)
leaping = 0
pixel_y = initial(pixel_y)
update_icons()
- update_canmove()
+ update_mobility()
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
index 3f88513372..526ea497c4 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
@@ -1,6 +1,6 @@
/mob/living/silicon/robot/Move(NewLoc, direct)
. = ..()
- if(. && sprinting && !(movement_type & FLYING) && canmove && !resting)
+ if(. && sprinting && !(movement_type & FLYING) && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND | MOBILITY_MOVE))
if(!(cell?.use(25)))
togglesprint(TRUE)
@@ -14,7 +14,7 @@
if(!shutdown && (!cell || cell.charge < 25) || !cansprint)
return FALSE
sprinting = shutdown ? FALSE : !sprinting
- if(!resting && canmove)
+ if(CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE))
if(sprinting)
playsound_local(src, 'sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE)
else
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
index 6262dc1a28..1ea4b956f7 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
@@ -100,7 +100,7 @@
if(addiction_stage == 11)
to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.")
M.Jitter(200)
- M.Knockdown(200)
+ M.DefaultCombatKnockdown(200)
M.Stun(80)
var/items = M.get_contents()
if(!LAZYLEN(items))
@@ -154,7 +154,7 @@
do_sparks(5,FALSE,M)
M.Sleeping(100, 0)
M.Jitter(50)
- M.Knockdown(100)
+ M.DefaultCombatKnockdown(100)
to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.")
M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE)
log_game("FERMICHEM: [M] ckey: [M.key] has become an alternative universe version of themselves.")
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
index b6b9c0bf34..c173d3775b 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
@@ -40,7 +40,7 @@
M.visible_message("A pair of breasts suddenly fly out of the [M]!")
var/T2 = get_random_station_turf()
M.adjustBruteLoss(25)
- M.Knockdown(50)
+ M.DefaultCombatKnockdown(50)
M.Stun(50)
B.throw_at(T2, 8, 1)
M.reagents.del_reagent(type)
@@ -196,7 +196,7 @@
M.visible_message("A penis suddenly flies out of the [M]!")
var/T2 = get_random_station_turf()
M.adjustBruteLoss(25)
- M.Knockdown(50)
+ M.DefaultCombatKnockdown(50)
M.Stun(50)
P.throw_at(T2, 8, 1)
M.reagents.del_reagent(type)
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
index fb5574855e..a7dbe8d799 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
@@ -93,7 +93,7 @@
if(method == INJECT)
var/turf/T = get_turf(M)
M.adjustOxyLoss(15)
- M.Knockdown(50)
+ M.DefaultCombatKnockdown(50)
M.Stun(50)
M.emote("cough")
var/obj/item/toy/plush/P = pick(subtypesof(/obj/item/toy/plush))
diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi
index d59cf43a68..c2a89eab9a 100644
Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ
diff --git a/sound/bloodsucker/lunge_warn.ogg b/sound/bloodsucker/lunge_warn.ogg
new file mode 100644
index 0000000000..0feec43228
Binary files /dev/null and b/sound/bloodsucker/lunge_warn.ogg differ
diff --git a/sound/roundend/seeyoulaterokay.ogg b/sound/roundend/seeyoulaterokay.ogg
new file mode 100644
index 0000000000..8d08103a73
Binary files /dev/null and b/sound/roundend/seeyoulaterokay.ogg differ
diff --git a/sound/weapons/staff.ogg b/sound/weapons/staff.ogg
new file mode 100644
index 0000000000..35b42dfd8d
Binary files /dev/null and b/sound/weapons/staff.ogg differ
diff --git a/strings/flavor_objectives/ninja_helping.txt b/strings/flavor_objectives/ninja_helping.txt
index 1280939b5c..4cca9a2234 100644
--- a/strings/flavor_objectives/ninja_helping.txt
+++ b/strings/flavor_objectives/ninja_helping.txt
@@ -1,6 +1,5 @@
Nanotrasen want to make sure that their employees are on the up-and-up. Try to find any blackmail you can.
Increase productivity however you can.
-You are a security ninja. Answer to the Head of Security, and follow space law.
You are a cargo ninja. Answer to the Quartermaster, and do what they say.
Nanotrasen want you to ensure maximum morale. Protect the members of the crew who are on break.
Ensure that all the paperwork is being done.
\ No newline at end of file
diff --git a/strings/flavor_objectives/traitor.txt b/strings/flavor_objectives/traitor.txt
index 6d54c8ed9d..fc92117089 100644
--- a/strings/flavor_objectives/traitor.txt
+++ b/strings/flavor_objectives/traitor.txt
@@ -1,8 +1,5 @@
The Gorlex Marauders want you to teach the heads of staff a lesson they will never forget.
-Show Nanotrasen the utility of a 40% oxygen atmosphere.
Waffle Co. wants you To cause as much humorous terrorism against Nanotrasen as possible! How? We don’t care as long as it’s entertaining! Be as creative and exciting as possible when carrying out your dirty deeds. Have fun!
Kill one of the station's beloved pets. Make a show of it, though you don't have to reveal yourself.
-The Tiger Cooperative want you to get their illegal technology spread through the station.
The Animal Rights Consortium needs you to save the innocent non-humanoid creatures aboard Citadel Station by any means necessary. Use your best judgement to decide whether an animal or xenobiological is abused, but if they are, ensure the abuser is punished. Avoid killing too many people if possible, and if you do harm any creatures, you will be terminated upon extraction.
-Donk Co. wants ransom money, and you are going to get it. Your goal is to kidnap and crewmember you can get your hands on and hold them hostage until you get something of significant value. Try to work out the best deal you can. Remember that Higher Value Targets are generally going to get a better deal so try to prioritize heads of staff if possible. We do not approve of mindless killing of Nanotrasen employees, so don’t do it.
-The Gorlex Marauders want you to steal as many shoes as possible. Lay broken glass everywhere.
\ No newline at end of file
+Donk Co. wants ransom money, and you are going to get it. Your goal is to kidnap and crewmember you can get your hands on and hold them hostage until you get something of significant value. Try to work out the best deal you can. Remember that Higher Value Targets are generally going to get a better deal so try to prioritize heads of staff if possible. We do not approve of mindless killing of Nanotrasen employees, so don’t do it.
\ No newline at end of file
diff --git a/strings/ion_laws.json b/strings/ion_laws.json
index 1c28d5d5e5..55913dc3f4 100644
--- a/strings/ion_laws.json
+++ b/strings/ion_laws.json
@@ -331,7 +331,8 @@
"BOTANISTS",
"RESEARCH DIRECTORS",
"CHIEF MEDICAL OFFICERS",
- "MEDICAL DOCTORS",
+ "MEDICAL DOCTORS",
+ "PARAMEDICS",
"CHEMISTS",
"GENETICISTS",
"VIROLOGISTS",
diff --git a/tgstation.dme b/tgstation.dme
old mode 100644
new mode 100755
index ac5af5b791..ef0c1dc06a
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -80,6 +80,7 @@
#include "code\__DEFINES\pinpointers.dm"
#include "code\__DEFINES\pipe_construction.dm"
#include "code\__DEFINES\pool.dm"
+#include "code\__DEFINES\power.dm"
#include "code\__DEFINES\preferences.dm"
#include "code\__DEFINES\procpath.dm"
#include "code\__DEFINES\profile.dm"
@@ -245,6 +246,7 @@
#include "code\controllers\subsystem\assets.dm"
#include "code\controllers\subsystem\atoms.dm"
#include "code\controllers\subsystem\augury.dm"
+#include "code\controllers\subsystem\autotransfer.dm"
#include "code\controllers\subsystem\blackbox.dm"
#include "code\controllers\subsystem\chat.dm"
#include "code\controllers\subsystem\communications.dm"
@@ -500,6 +502,9 @@
#include "code\datums\elements\ghost_role_eligibility.dm"
#include "code\datums\elements\mob_holder.dm"
#include "code\datums\elements\swimming.dm"
+#include "code\datums\elements\sword_point.dm"
+#include "code\datums\elements\update_icon_blocker.dm"
+#include "code\datums\elements\update_icon_updates_onmob.dm"
#include "code\datums\elements\wuv.dm"
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"
@@ -573,6 +578,7 @@
#include "code\game\alternate_appearance.dm"
#include "code\game\atoms.dm"
#include "code\game\atoms_movable.dm"
+#include "code\game\atoms_movement.dm"
#include "code\game\communications.dm"
#include "code\game\data_huds.dm"
#include "code\game\say.dm"
@@ -1059,6 +1065,7 @@
#include "code\game\objects\structures\artstuff.dm"
#include "code\game\objects\structures\barsigns.dm"
#include "code\game\objects\structures\bedsheet_bin.dm"
+#include "code\game\objects\structures\chess.dm"
#include "code\game\objects\structures\destructible_structures.dm"
#include "code\game\objects\structures\displaycase.dm"
#include "code\game\objects\structures\divine.dm"
@@ -1117,6 +1124,7 @@
#include "code\game\objects\structures\beds_chairs\bed.dm"
#include "code\game\objects\structures\beds_chairs\chair.dm"
#include "code\game\objects\structures\beds_chairs\pew.dm"
+#include "code\game\objects\structures\beds_chairs\sofa.dm"
#include "code\game\objects\structures\crates_lockers\closets.dm"
#include "code\game\objects\structures\crates_lockers\crates.dm"
#include "code\game\objects\structures\crates_lockers\closets\bodybag.dm"
@@ -1846,18 +1854,20 @@
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_bread.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_cake.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_donut.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_egg.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_frozen.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_meat.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_mexican.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_misc.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pastry.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pie.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pies_sweets.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pizza.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_salad.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sandwich.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_seafood.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm"
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sushi.dm"
#include "code\modules\games\cas.dm"
#include "code\modules\goonchat\browserOutput.dm"
#include "code\modules\holiday\easter.dm"
@@ -1986,6 +1996,7 @@
#include "code\modules\jobs\job_types\lawyer.dm"
#include "code\modules\jobs\job_types\medical_doctor.dm"
#include "code\modules\jobs\job_types\mime.dm"
+#include "code\modules\jobs\job_types\paramedic.dm"
#include "code\modules\jobs\job_types\quartermaster.dm"
#include "code\modules\jobs\job_types\research_director.dm"
#include "code\modules\jobs\job_types\roboticist.dm"
@@ -2146,6 +2157,7 @@
#include "code\modules\mob\living\living.dm"
#include "code\modules\mob\living\living_defense.dm"
#include "code\modules\mob\living\living_defines.dm"
+#include "code\modules\mob\living\living_mobility.dm"
#include "code\modules\mob\living\living_movement.dm"
#include "code\modules\mob\living\login.dm"
#include "code\modules\mob\living\logout.dm"
@@ -2219,6 +2231,7 @@
#include "code\modules\mob\living\carbon\human\human_defense.dm"
#include "code\modules\mob\living\carbon\human\human_defines.dm"
#include "code\modules\mob\living\carbon\human\human_helpers.dm"
+#include "code\modules\mob\living\carbon\human\human_mobility.dm"
#include "code\modules\mob\living\carbon\human\human_movement.dm"
#include "code\modules\mob\living\carbon\human\inventory.dm"
#include "code\modules\mob\living\carbon\human\life.dm"
@@ -2300,9 +2313,11 @@
#include "code\modules\mob\living\silicon\robot\login.dm"
#include "code\modules\mob\living\silicon\robot\robot.dm"
#include "code\modules\mob\living\silicon\robot\robot_defense.dm"
+#include "code\modules\mob\living\silicon\robot\robot_mobility.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "code\modules\mob\living\silicon\robot\say.dm"
+#include "code\modules\mob\living\silicon\robot\update_icons.dm"
#include "code\modules\mob\living\simple_animal\animal_defense.dm"
#include "code\modules\mob\living\simple_animal\astral.dm"
#include "code\modules\mob\living\simple_animal\constructs.dm"
@@ -2325,6 +2340,7 @@
#include "code\modules\mob\living\simple_animal\bot\mulebot.dm"
#include "code\modules\mob\living\simple_animal\bot\secbot.dm"
#include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm"
+#include "code\modules\mob\living\simple_animal\friendly\bumbles.dm"
#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm"
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm"
@@ -2436,6 +2452,7 @@
#include "code\modules\mob\living\simple_animal\slime\powers.dm"
#include "code\modules\mob\living\simple_animal\slime\say.dm"
#include "code\modules\mob\living\simple_animal\slime\slime.dm"
+#include "code\modules\mob\living\simple_animal\slime\slime_mobility.dm"
#include "code\modules\mob\living\simple_animal\slime\subtypes.dm"
#include "code\modules\modular_computers\laptop_vendor.dm"
#include "code\modules\modular_computers\computers\item\computer.dm"
@@ -3147,7 +3164,6 @@
#include "modular_citadel\code\_onclick\hud\stamina.dm"
#include "modular_citadel\code\datums\components\souldeath.dm"
#include "modular_citadel\code\datums\status_effects\chems.dm"
-#include "modular_citadel\code\datums\status_effects\debuffs.dm"
#include "modular_citadel\code\game\machinery\wishgranter.dm"
#include "modular_citadel\code\game\objects\cit_screenshake.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm"