You are once more concealed.")
if(unstun_time && world.time >= unstun_time)
unstun_time = 0
- notransform = FALSE
+ mob_transforming = FALSE
to_chat(src, "You can move again!")
if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate
essence = min(essence_regen_cap, essence+essence_regen_amount)
update_action_buttons_icon() //because we update something required by our spells in life, we need to update our buttons
update_spooky_icon()
update_health_hud()
- ..()
/mob/living/simple_animal/revenant/Stat()
..()
@@ -218,7 +219,7 @@
return 0
stasis = TRUE
to_chat(src, "NO! No... it's too late, you can feel your essence [pick("breaking apart", "drifting away")]...")
- notransform = TRUE
+ mob_transforming = TRUE
revealed = TRUE
invisibility = 0
playsound(src, 'sound/effects/screech.ogg', 100, 1)
@@ -260,7 +261,7 @@
return
if(time <= 0)
return
- notransform = TRUE
+ mob_transforming = TRUE
if(!unstun_time)
to_chat(src, "You cannot move!")
unstun_time = world.time + time
@@ -271,7 +272,7 @@
/mob/living/simple_animal/revenant/proc/update_spooky_icon()
if(revealed)
- if(notransform)
+ if(mob_transforming)
if(draining)
icon_state = icon_drain
else
@@ -320,7 +321,7 @@
/mob/living/simple_animal/revenant/proc/death_reset()
revealed = FALSE
unreveal_time = 0
- notransform = 0
+ mob_transforming = 0
unstun_time = 0
inhibited = FALSE
draining = FALSE
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index ff3d95598d..eaef7a35f5 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -369,7 +369,7 @@
var/mob/living/carbon/last_user
/obj/item/warpwhistle/proc/interrupted(mob/living/carbon/user)
- if(!user || QDELETED(src) || user.notransform)
+ if(!user || QDELETED(src) || user.mob_transforming)
on_cooldown = FALSE
return TRUE
return FALSE
diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm
index a13fecd11c..1b099a22db 100644
--- a/code/modules/awaymissions/mission_code/Cabin.dm
+++ b/code/modules/awaymissions/mission_code/Cabin.dm
@@ -1,20 +1,39 @@
/*Cabin areas*/
-/area/awaymission/snowforest
- name = "Snow Forest"
- icon_state = "away"
- requires_power = FALSE
- dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
-
/area/awaymission/cabin
name = "Cabin"
icon_state = "away2"
requires_power = TRUE
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
-/area/awaymission/snowforest/lumbermill
+/area/awaymission/cabin/snowforest
+ name = "Snow Forest"
+ icon_state = "away"
+ dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
+
+/area/awaymission/cabin/snowforest/sovietsurface
+ name = "Snow Forest"
+ icon_state = "awaycontent29"
+ requires_power = FALSE
+
+/area/awaymission/cabin/lumbermill
name = "Lumbermill"
icon_state = "away3"
+ requires_power = FALSE
+ dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
+
+/area/awaymission/cabin/caves/sovietcave
+ name = "Soviet Bunker"
+ icon_state = "awaycontent4"
+
+/area/awaymission/cabin/caves
+ name = "North Snowdin Caves"
+ icon_state = "awaycontent15"
+ dynamic_lighting = DYNAMIC_LIGHTING_FORCED
+
+/area/awaymission/cabin/caves/mountain
+ name = "North Snowdin Mountains"
+ icon_state = "awaycontent24"
/obj/structure/firepit
name = "firepit"
@@ -92,7 +111,7 @@
egg_type = null
speak = list()
-/*Cabin's forest*/
+/*Cabin's forest. Removed in the new cabin map since it was buggy and I prefer manual placement.*/
/datum/mapGenerator/snowy
modules = list(/datum/mapGeneratorModule/bottomlayer/snow, \
/datum/mapGeneratorModule/snow/pineTrees, \
@@ -136,4 +155,4 @@
endTurfX = 159
endTurfY = 157
startTurfX = 37
- startTurfY = 35
+ startTurfY = 35
\ No newline at end of file
diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm
index 6968a5ccd8..d010cee761 100644
--- a/code/modules/cargo/console.dm
+++ b/code/modules/cargo/console.dm
@@ -18,6 +18,7 @@
var/obj/item/radio/headset/radio
/// var that tracks message cooldown
var/message_cooldown
+ var/list/loaded_coupons
light_color = "#E2853D"//orange
@@ -134,6 +135,8 @@
"cost" = P.cost,
"id" = pack,
"desc" = P.desc || P.name, // If there is a description, use it. Otherwise use the pack's name.
+ "private_goody" = P.goody == PACK_GOODY_PRIVATE,
+ "goody" = P.goody == PACK_GOODY_PUBLIC,
"access" = P.access,
"can_private_buy" = P.can_private_buy
))
@@ -215,8 +218,22 @@
if(isnull(reason) || ..())
return
+ if(pack.goody == PACK_GOODY_PRIVATE && !self_paid)
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE)
+ say("ERROR: Private small crates may only be purchased by private accounts.")
+ return
+
+ var/obj/item/coupon/applied_coupon
+ for(var/i in loaded_coupons)
+ var/obj/item/coupon/coupon_check = i
+ if(pack.type == coupon_check.discounted_pack)
+ say("Coupon found! [round(coupon_check.discount_pct_off * 100)]% off applied!")
+ coupon_check.moveToNullspace()
+ applied_coupon = coupon_check
+ break
+
var/turf/T = get_turf(src)
- var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account)
+ var/datum/supply_order/SO = new(pack, name, rank, ckey, reason, account, applied_coupon)
SO.generateRequisition(T)
if(requestonly && !self_paid)
SSshuttle.requestlist += SO
@@ -229,6 +246,9 @@
var/id = text2num(params["id"])
for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
if(SO.id == id)
+ if(SO.applied_coupon)
+ say("Coupon refunded.")
+ SO.applied_coupon.forceMove(get_turf(src))
SSshuttle.shoppinglist -= SO
. = TRUE
break
diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm
new file mode 100644
index 0000000000..c77050c530
--- /dev/null
+++ b/code/modules/cargo/coupon.dm
@@ -0,0 +1,50 @@
+
+#define COUPON_OMEN "omen"
+
+/obj/item/coupon
+ name = "coupon"
+ desc = "It doesn't matter if you didn't want it before, what matters now is that you've got a coupon for it!"
+ icon_state = "data_1"
+ icon = 'icons/obj/card.dmi'
+ item_flags = NOBLUDGEON
+ w_class = WEIGHT_CLASS_TINY
+ var/datum/supply_pack/discounted_pack
+ var/discount_pct_off = 0.05
+ var/obj/machinery/computer/cargo/inserted_console
+
+/// Choose what our prize is :D
+/obj/item/coupon/proc/generate()
+ discounted_pack = pick(subtypesof(/datum/supply_pack/goody))
+ var/list/chances = list("0.10" = 4, "0.15" = 8, "0.20" = 10, "0.25" = 8, "0.50" = 4, COUPON_OMEN = 1)
+ discount_pct_off = pickweight(chances)
+ if(discount_pct_off == COUPON_OMEN)
+ name = "coupon - fuck you"
+ desc = "The small text reads, 'You will be slaughtered'... That doesn't sound right, does it?"
+ if(ismob(loc))
+ var/mob/M = loc
+ to_chat(M, "The coupon reads 'fuck you' in large, bold text... is- is that a prize, or?")
+ M.AddComponent(/datum/component/omen, TRUE, src)
+ else
+ discount_pct_off = text2num(discount_pct_off)
+ name = "coupon - [round(discount_pct_off * 100)]% off [initial(discounted_pack.name)]"
+
+/obj/item/coupon/attack_obj(obj/O, mob/living/user)
+ if(!istype(O, /obj/machinery/computer/cargo))
+ return ..()
+ if(discount_pct_off == COUPON_OMEN)
+ to_chat(user, "\The [O] validates the coupon as authentic, but refuses to accept it...")
+ O.say("Coupon fulfillment already in progress...")
+ return
+
+ inserted_console = O
+ LAZYADD(inserted_console.loaded_coupons, src)
+ inserted_console.say("Coupon for [initial(discounted_pack.name)] applied!")
+ forceMove(inserted_console)
+
+/obj/item/coupon/Destroy()
+ if(inserted_console)
+ LAZYREMOVE(inserted_console.loaded_coupons, src)
+ inserted_console = null
+ . = ..()
+
+#undef COUPON_OMEN
diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm
index 3d1caf6ba6..4fa6a4eade 100644
--- a/code/modules/cargo/order.dm
+++ b/code/modules/cargo/order.dm
@@ -27,10 +27,12 @@
var/orderer_rank
var/orderer_ckey
var/reason
+ var/discounted_pct
var/datum/supply_pack/pack
var/datum/bank_account/paying_account
+ var/obj/item/coupon/applied_coupon
-/datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason, paying_account)
+/datum/supply_order/New(datum/supply_pack/pack, orderer, orderer_rank, orderer_ckey, reason, paying_account, coupon)
id = SSshuttle.ordernum++
src.pack = pack
src.orderer = orderer
@@ -38,6 +40,7 @@
src.orderer_ckey = orderer_ckey
src.reason = reason
src.paying_account = paying_account
+ src.applied_coupon = coupon
/datum/supply_order/proc/generateRequisition(turf/T)
var/obj/item/paper/P = new(T)
@@ -57,58 +60,64 @@
P.update_icon()
return P
-/datum/supply_order/proc/generateManifest(obj/structure/closet/crate/C)
- var/obj/item/paper/fluff/jobs/cargo/manifest/P = new(C, id, pack.cost)
+/datum/supply_order/proc/generateManifest(obj/container, owner, packname) //generates-the-manifests.
+ var/obj/item/paper/fluff/jobs/cargo/manifest/P = new(container, id, 0)
var/station_name = (P.errors & MANIFEST_ERROR_NAME) ? new_station_name() : station_name()
- P.name = "shipping manifest - #[id] ([pack.name])"
+ P.name = "shipping manifest - [packname?"#[id] ([pack.name])":"(Grouped Item Crate)"]"
P.info += "[command_name()] Shipping Manifest
"
P.info += "
"
- if(paying_account)
- P.info += "Direct purchase from [paying_account.account_holder]
"
- P.name += " - Purchased by [paying_account.account_holder]"
+ if(id && !(id == "Cargo"))
+ P.info += "Direct purchase from [owner]
"
+ P.name += " - Purchased by [owner]"
P.info += "Order #[id]
"
P.info += "Destination: [station_name]
"
- P.info += "Item: [pack.name]
"
+ if(packname)
+ P.info += "Item: [packname]
"
P.info += "Contents:
"
P.info += ""
- for(var/atom/movable/AM in C.contents - P - C.lockerelectronics)
+ var/list/ignore_this = list(P)
+ if(istype(container, /obj/structure/closet))
+ var/obj/structure/closet/C = container
+ ignore_this += C.lockerelectronics
+ for(var/atom/movable/AM in container.contents - ignore_this)
if((P.errors & MANIFEST_ERROR_CONTENTS) && prob(50))
continue
P.info += "- [AM.name]
"
P.info += "
"
P.info += "Stamp below to confirm receipt of goods:
"
+ if(P.errors & MANIFEST_ERROR_ITEM)
+ var/static/list/blacklisted_error = typecacheof(list(
+ /obj/structure/closet/crate/secure,
+ /obj/structure/closet/crate/large,
+ /obj/structure/closet/secure_closet/goodies
+ ))
+ if(blacklisted_error[container.type])
+ P.errors &= ~MANIFEST_ERROR_ITEM
+ else
+ var/lost = max(round(container.contents.len / 10), 1)
+ while(--lost >= 0)
+ qdel(pick(container.contents))
+
P.update_icon()
- P.forceMove(C)
- C.manifest = P
- C.update_icon()
+ P.forceMove(container)
+
+ if(istype(container, /obj/structure/closet/crate))
+ var/obj/structure/closet/crate/C = container
+ C.manifest = P
+ C.update_icon()
return P
/datum/supply_order/proc/generate(atom/A)
var/obj/structure/closet/crate/C = pack.generate(A, paying_account)
- var/obj/item/paper/fluff/jobs/cargo/manifest/M = generateManifest(C)
-
- if(M.errors & MANIFEST_ERROR_ITEM)
- if(istype(C, /obj/structure/closet/crate/secure) || istype(C, /obj/structure/closet/crate/large))
- M.errors &= ~MANIFEST_ERROR_ITEM
- else
- var/lost = max(round(C.contents.len / 10), 1)
- while(--lost >= 0)
- qdel(pick(C.contents))
+ generateManifest(C, paying_account, pack)
return C
-//Paperwork for NT
-/obj/item/folder/paperwork
- name = "Incomplete Paperwork"
- desc = "These should've been filled out four months ago! Unfinished grant papers issued by Nanotrasen's finance department. Complete this page for additional funding."
- icon = 'icons/obj/bureaucracy.dmi'
- icon_state = "docs_generic"
-
-/obj/item/folder/paperwork_correct
- name = "Finished Paperwork"
- desc = "A neat stack of filled-out forms, in triplicate and signed. Is there anything more satisfying? Make sure they get stamped."
- icon = 'icons/obj/bureaucracy.dmi'
- icon_state = "docs_verified"
+/datum/supply_order/proc/generateCombo(var/miscbox, var/misc_own, var/misc_contents)
+ for (var/I in misc_contents)
+ new I(miscbox)
+ generateManifest(miscbox, misc_own, "")
+ return
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index f82e16ad5c..7ec3a775a5 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -15,6 +15,7 @@
var/special_enabled = FALSE
var/DropPodOnly = FALSE //only usable by the Bluespace Drop Pod via the express cargo console
var/admin_spawned = FALSE //Can only an admin spawn this crate?
+ var/goody = PACK_GOODY_NONE //Small items can be grouped into a single crate.They also come in a closet/lockbox instead of a full crate, so the 700 min doesn't apply
var/can_private_buy = TRUE //Can it be purchased privately by each crewmember?
/datum/supply_pack/proc/generate(atom/A, datum/bank_account/paying_account)
diff --git a/code/modules/cargo/packs/armory.dm b/code/modules/cargo/packs/armory.dm
index 3a3357cc42..835457536f 100644
--- a/code/modules/cargo/packs/armory.dm
+++ b/code/modules/cargo/packs/armory.dm
@@ -37,15 +37,6 @@
contains = list(/obj/item/storage/box/chemimp)
crate_name = "chemical implant crate"
-/datum/supply_pack/security/armory/combatknives
- name = "Combat Knives Crate"
- desc = "Contains three sharpened combat knives. Each knife guaranteed to fit snugly inside any Nanotrasen-standard boot. Requires Armory access to open."
- cost = 3200
- contains = list(/obj/item/kitchen/knife/combat,
- /obj/item/kitchen/knife/combat,
- /obj/item/kitchen/knife/combat)
- crate_name = "combat knife crate"
-
/datum/supply_pack/security/armory/ballistic
name = "Combat Shotguns Crate"
desc = "For when the enemy absolutely needs to be replaced with lead. Contains three Aussec-designed Combat Shotguns, with three Shotgun Bandoliers, as well as seven buchshot and 12g shotgun slugs. Requires Armory access to open."
diff --git a/code/modules/cargo/packs/engineering.dm b/code/modules/cargo/packs/engineering.dm
index 22258d19a7..9af18e13f6 100644
--- a/code/modules/cargo/packs/engineering.dm
+++ b/code/modules/cargo/packs/engineering.dm
@@ -90,16 +90,6 @@
crate_name = "industrial rcd"
crate_type = /obj/structure/closet/crate/secure/engineering
-/datum/supply_pack/engineering/powergamermitts
- name = "Insulated Gloves Crate"
- desc = "The backbone of modern society. Barely ever ordered for actual engineering. Contains three insulated gloves."
- cost = 2300 //Made of pure-grade bullshittinium
- contains = list(/obj/item/clothing/gloves/color/yellow,
- /obj/item/clothing/gloves/color/yellow,
- /obj/item/clothing/gloves/color/yellow)
- crate_name = "insulated gloves crate"
- crate_type = /obj/structure/closet/crate/engineering/electrical
-
/datum/supply_pack/engineering/inducers
name = "NT-75 Electromagnetic Power Inducers Crate"
desc = "No rechargers? No problem, with the NT-75 EPI, you can recharge any standard cell-based equipment anytime, anywhere. Contains two Inducers."
@@ -162,6 +152,7 @@
/obj/item/storage/toolbox/mechanical)
cost = 1200
crate_name = "toolbox crate"
+ special = TRUE //Department resupply shuttle loan event.
/datum/supply_pack/engineering/bsa
name = "Bluespace Artillery Parts"
diff --git a/code/modules/cargo/packs/goodies.dm b/code/modules/cargo/packs/goodies.dm
new file mode 100644
index 0000000000..ac8b1e9032
--- /dev/null
+++ b/code/modules/cargo/packs/goodies.dm
@@ -0,0 +1,77 @@
+
+/datum/supply_pack/goody
+ access = NONE
+ group = "Goodies"
+ goody = PACK_GOODY_PRIVATE
+
+/datum/supply_pack/goody/combatknives_single
+ name = "Combat Knife Single-Pack"
+ desc = "Contains one sharpened combat knive. Guaranteed to fit snugly inside any Nanotrasen-standard boot."
+ cost = 800
+ contains = list(/obj/item/kitchen/knife/combat)
+
+/datum/supply_pack/goody/sologamermitts
+ name = "Insulated Gloves Single-Pack"
+ desc = "The backbone of modern society. Barely ever ordered for actual engineering."
+ cost = 800
+ contains = list(/obj/item/clothing/gloves/color/yellow)
+
+/datum/supply_pack/goody/firstaidbruises_single
+ name = "Bruise Treatment Kit Single-Pack"
+ desc = "A single brute first-aid kit, perfect for recovering from being crushed in an airlock. Did you know people get crushed in airlocks all the time? Interesting..."
+ cost = 330
+ contains = list(/obj/item/storage/firstaid/brute)
+
+/datum/supply_pack/goody/firstaidburns_single
+ name = "Burn Treatment Kit Single-Pack"
+ desc = "A single burn first-aid kit. The advertisement displays a winking atmospheric technician giving a thumbs up, saying \"Mistakes happen!\""
+ cost = 330
+ contains = list(/obj/item/storage/firstaid/fire)
+
+/datum/supply_pack/goody/firstaid_single
+ name = "First Aid Kit Single-Pack"
+ desc = "A single first-aid kit, fit for healing most types of bodily harm."
+ cost = 250
+ contains = list(/obj/item/storage/firstaid/regular)
+
+/datum/supply_pack/goody/firstaidoxygen_single
+ name = "Oxygen Deprivation Kit Single-Pack"
+ desc = "A single oxygen deprivation first-aid kit, marketed heavily to those with crippling fears of asphyxiation."
+ cost = 330
+ contains = list(/obj/item/storage/firstaid/o2)
+
+/datum/supply_pack/goody/firstaidtoxins_single
+ name = "Toxin Treatment Kit Single-Pack"
+ desc = "A single first aid kit focused on healing damage dealt by heavy toxins."
+ cost = 330
+ contains = list(/obj/item/storage/firstaid/toxin)
+
+/datum/supply_pack/goody/toolbox // mostly just to water down coupon probability
+ name = "Mechanical Toolbox"
+ desc = "A fully stocked mechanical toolbox, for when you're too lazy to just print them out."
+ cost = 300
+ contains = list(/obj/item/storage/toolbox/mechanical)
+
+/datum/supply_pack/goody/electrical_toolbox // mostly just to water down coupon probability
+ name = "Mechanical Toolbox"
+ desc = "A fully stocked electrical toolbox, for when you're too lazy to just print them out."
+ cost = 300
+ contains = list(/obj/item/storage/toolbox/electrical)
+
+/datum/supply_pack/goody/valentine
+ name = "Valentine Card"
+ desc = "Make an impression on that special someone! Comes with one valentine card and a free candy heart!"
+ cost = 150
+ contains = list(/obj/item/valentine, /obj/item/reagent_containers/food/snacks/candyheart)
+
+/datum/supply_pack/goody/beeplush
+ name = "Bee Plushie"
+ desc = "The most important thing you could possibly spend your hard-earned money on."
+ cost = 1500
+ contains = list(/obj/item/toy/plush/beeplushie)
+
+/datum/supply_pack/goody/beach_ball
+ name = "Beach Ball"
+ desc = "The simple beach ball is one of Nanotrasen's most popular products. 'Why do we make beach balls? Because we can! (TM)' - Nanotrasen"
+ cost = 200
+ contains = list(/obj/item/toy/beach_ball)
diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm
index 771f7ce222..0cf12fbc5d 100644
--- a/code/modules/cargo/packs/materials.dm
+++ b/code/modules/cargo/packs/materials.dm
@@ -14,53 +14,60 @@
//////////////////////////////////////////////////////////////////////////////
/datum/supply_pack/materials/cardboard50
+ goody = PACK_GOODY_PUBLIC
name = "50 Cardboard Sheets"
desc = "Create a bunch of boxes."
- cost = 1000
+ cost = 300 //thrice their export value
contains = list(/obj/item/stack/sheet/cardboard/fifty)
- crate_name = "cardboard sheets crate"
/datum/supply_pack/materials/glass50
+ goody = PACK_GOODY_PUBLIC
name = "50 Glass Sheets"
desc = "Let some nice light in with fifty glass sheets!"
- cost = 850
+ cost = 300 //double their export value
contains = list(/obj/item/stack/sheet/glass/fifty)
- crate_name = "glass sheets crate"
/datum/supply_pack/materials/metal50
+ goody = PACK_GOODY_PUBLIC
name = "50 Metal Sheets"
desc = "Any construction project begins with a good stack of fifty metal sheets!"
- cost = 850
+ cost = 300 //double their export value
contains = list(/obj/item/stack/sheet/metal/fifty)
- crate_name = "metal sheets crate"
/datum/supply_pack/materials/plasteel20
+ goody = PACK_GOODY_PUBLIC
name = "20 Plasteel Sheets"
desc = "Reinforce the station's integrity with twenty plasteel sheets!"
- cost = 4700
+ cost = 4000
contains = list(/obj/item/stack/sheet/plasteel/twenty)
- crate_name = "plasteel sheets crate"
-
-/datum/supply_pack/materials/plasteel50
- name = "50 Plasteel Sheets"
- desc = "For when you REALLY have to reinforce something."
- cost = 9050
- contains = list(/obj/item/stack/sheet/plasteel/fifty)
- crate_name = "plasteel sheets crate"
/datum/supply_pack/materials/plastic50
+ goody = PACK_GOODY_PUBLIC
name = "50 Plastic Sheets"
desc = "Build a limitless amount of toys with fifty plastic sheets!"
- cost = 950
- contains = list(/obj/item/stack/sheet/plastic/fifty)
- crate_name = "plastic sheets crate"
+ cost = 200 // double their export
+ contains = list(/obj/item/stack/sheet/plastic/twenty)
/datum/supply_pack/materials/sandstone30
+ goody = PACK_GOODY_PUBLIC
name = "30 Sandstone Blocks"
desc = "Neither sandy nor stoney, these thirty blocks will still get the job done."
- cost = 800
+ cost = 150 // five times their export
contains = list(/obj/item/stack/sheet/mineral/sandstone/thirty)
- crate_name = "sandstone blocks crate"
+
+/datum/supply_pack/materials/wood50
+ goody = PACK_GOODY_PUBLIC
+ name = "50 Wood Planks"
+ desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with fifty wooden planks!"
+ cost = 400 // 6-7 planks shy from having equal import/export prices
+ contains = list(/obj/item/stack/sheet/mineral/wood/twenty)
+
+/datum/supply_pack/materials/rcdammo
+ goody = PACK_GOODY_PUBLIC
+ name = "Large RCD ammo Single-Pack"
+ desc = "A single large compressed RCD matter pack, to help with any holes or projects people might be working on."
+ cost = 600
+ contains = list(/obj/item/rcd_ammo/large)
/datum/supply_pack/materials/rawlumber
name = "50 Towercap Logs"
@@ -74,35 +81,6 @@
for(var/i in 1 to 49)
new /obj/item/grown/log(.)
-/datum/supply_pack/materials/wood50
- name = "50 Wood Planks"
- desc = "Turn cargo's boring metal groundwork into beautiful panelled flooring and much more with fifty wooden planks!"
- cost = 1450
- contains = list(/obj/item/stack/sheet/mineral/wood/fifty)
- crate_name = "wood planks crate"
-
-/datum/supply_pack/materials/rcdammo
- name = "Spare RCD ammo"
- desc = "This crate contains sixteen RCD compressed matter packs, to help with any holes or projects people might be working on."
- cost = 3750
- contains = list(/obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo,
- /obj/item/rcd_ammo)
- crate_name = "rcd ammo"
-
//////////////////////////////////////////////////////////////////////////////
///////////////////////////// Canisters //////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm
index ab188f235b..2bb629308c 100644
--- a/code/modules/cargo/packs/medical.dm
+++ b/code/modules/cargo/packs/medical.dm
@@ -141,34 +141,6 @@
///////////////////////////// Medical Kits ///////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
-/datum/supply_pack/medical/firstaidbruises
- name = "Bruise Treatment Kit Crate"
- desc = "Contains three first aid kits focused on healing bruises and broken bones."
- cost = 1000
- contains = list(/obj/item/storage/firstaid/brute,
- /obj/item/storage/firstaid/brute,
- /obj/item/storage/firstaid/brute)
- crate_name = "brute treatment kit crate"
-
-/datum/supply_pack/medical/firstaidburns
- name = "Burn Treatment Kit Crate"
- desc = "Contains three first aid kits focused on healing severe burns."
- cost = 1000
- contains = list(/obj/item/storage/firstaid/fire,
- /obj/item/storage/firstaid/fire,
- /obj/item/storage/firstaid/fire)
- crate_name = "burn treatment kit crate"
-
-/datum/supply_pack/medical/firstaid
- name = "First Aid Kit Crate"
- desc = "Contains four first aid kits for healing most types of wounds."
- cost = 1000
- contains = list(/obj/item/storage/firstaid/regular,
- /obj/item/storage/firstaid/regular,
- /obj/item/storage/firstaid/regular,
- /obj/item/storage/firstaid/regular)
- crate_name = "first aid kit crate"
-
/datum/supply_pack/medical/sprays
name = "Medical Sprays"
desc = "Contains two cans of Styptic Spray, Silver Sulfadiazine Spray, Synthflesh Spray and Sterilizer Compound Spray."
@@ -183,35 +155,6 @@
/obj/item/reagent_containers/medspray/sterilizine)
crate_name = "medical supplies crate"
-/datum/supply_pack/medical/firstaidmixed
- name = "Mixed Medical Kits"
- desc = "Contains one of each medical kits for dealing with a variety of injured crewmembers."
- cost = 1250
- contains = list(/obj/item/storage/firstaid/toxin,
- /obj/item/storage/firstaid/o2,
- /obj/item/storage/firstaid/brute,
- /obj/item/storage/firstaid/fire,
- /obj/item/storage/firstaid/regular)
- crate_name = "medical supplies crate"
-
-/datum/supply_pack/medical/firstaidoxygen
- name = "Oxygen Deprivation Kit Crate"
- desc = "Contains three first aid kits focused on helping oxygen deprivation victims."
- cost = 1000
- contains = list(/obj/item/storage/firstaid/o2,
- /obj/item/storage/firstaid/o2,
- /obj/item/storage/firstaid/o2)
- crate_name = "oxygen deprivation kit crate"
-
-/datum/supply_pack/medical/firstaidtoxins
- name = "Toxin Treatment Kit Crate"
- desc = "Contains three first aid kits focused on healing damage dealt by heavy toxins."
- cost = 1000
- contains = list(/obj/item/storage/firstaid/toxin,
- /obj/item/storage/firstaid/toxin,
- /obj/item/storage/firstaid/toxin)
- crate_name = "toxin treatment kit crate"
-
/datum/supply_pack/medical/advrad
name = "Radiation Treatment Crate Deluxe"
desc = "A crate for when radiation is out of hand... Contains two rad-b-gone kits, one bottle of anti radiation deluxe pills, as well as a radiation treatment deluxe pill bottle!"
diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm
index 7df9d851a4..2b7ae21f88 100644
--- a/code/modules/cargo/packs/misc.dm
+++ b/code/modules/cargo/packs/misc.dm
@@ -333,45 +333,58 @@
//////////////////////////// Misc + Decor ////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
-/datum/supply_pack/misc/carpet_exotic
- name = "Exotic Carpet Crate"
- desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 10 different flooring patterns."
- cost = 7000
- contains = list(/obj/item/stack/tile/carpet/blue/fifty,
- /obj/item/stack/tile/carpet/blue/fifty,
- /obj/item/stack/tile/carpet/cyan/fifty,
- /obj/item/stack/tile/carpet/cyan/fifty,
- /obj/item/stack/tile/carpet/green/fifty,
- /obj/item/stack/tile/carpet/green/fifty,
- /obj/item/stack/tile/carpet/orange/fifty,
- /obj/item/stack/tile/carpet/orange/fifty,
- /obj/item/stack/tile/carpet/purple/fifty,
- /obj/item/stack/tile/carpet/purple/fifty,
- /obj/item/stack/tile/carpet/red/fifty,
- /obj/item/stack/tile/carpet/red/fifty,
- /obj/item/stack/tile/carpet/royalblue/fifty,
- /obj/item/stack/tile/carpet/royalblue/fifty,
- /obj/item/stack/tile/carpet/royalblack/fifty,
- /obj/item/stack/tile/carpet/royalblack/fifty,
- /obj/item/stack/tile/carpet/blackred/fifty,
- /obj/item/stack/tile/carpet/blackred/fifty,
- /obj/item/stack/tile/carpet/monochrome/fifty,
- /obj/item/stack/tile/carpet/monochrome/fifty)
- crate_name = "exotic carpet crate"
-
/datum/supply_pack/misc/carpet
- name = "Premium Carpet Crate"
- desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains some classic carpet, along with black, red, and monochrome varients."
- cost = 1350
- contains = list(/obj/item/stack/tile/carpet/fifty,
- /obj/item/stack/tile/carpet/fifty,
- /obj/item/stack/tile/carpet/black/fifty,
- /obj/item/stack/tile/carpet/black/fifty,
- /obj/item/stack/tile/carpet/blackred/fifty,
- /obj/item/stack/tile/carpet/blackred/fifty,
- /obj/item/stack/tile/carpet/monochrome/fifty,
- /obj/item/stack/tile/carpet/monochrome/fifty)
- crate_name = "premium carpet crate"
+ goody = PACK_GOODY_PUBLIC
+ name = "Classic Carpet Single-Pack"
+ desc = "Plasteel floor tiles getting on your nerves? This 50 units stack of extra soft carpet will tie any room together."
+ cost = 200
+ contains = list(/obj/item/stack/tile/carpet/fifty)
+
+/datum/supply_pack/misc/carpet/black
+ name = "Black Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/black/fifty)
+
+/datum/supply_pack/misc/carpet/premium
+ name = "Monochrome Carpet Single-Pack"
+ desc = "Exotic carpets for all your decorating needs. This 30 units stack of extra soft carpet will tie any room together."
+ cost = 250
+ contains = list(/obj/item/stack/tile/carpet/monochrome/thirty)
+
+/datum/supply_pack/misc/carpet/premium/blackred
+ name = "Black-Red Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/blackred/thirty)
+
+/datum/supply_pack/misc/carpet/premium/royalblack
+ name = "Royal Black Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/royalblack/thirty)
+
+/datum/supply_pack/misc/carpet/premium/royalblue
+ name = "Royal Blue Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/royalblue/thirty)
+
+/datum/supply_pack/misc/carpet/premium/red
+ name = "Red Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/red/thirty)
+
+/datum/supply_pack/misc/carpet/premium/purple
+ name = "Purple Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/purple/thirty)
+
+/datum/supply_pack/misc/carpet/premium/orange
+ name = "Orange Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/orange/thirty)
+
+/datum/supply_pack/misc/carpet/premium/green
+ name = "Green Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/green/thirty)
+
+/datum/supply_pack/misc/carpet/premium/cyan
+ name = "Cyan Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/cyan/thirty)
+
+/datum/supply_pack/misc/carpet/premium/blue
+ name = "Blue Carpet Single-Pack"
+ contains = list(/obj/item/stack/tile/carpet/blue/thirty)
/datum/supply_pack/misc/noslipfloor
name = "High-traction Floor Tiles"
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 94ccdf94c6..4590d46219 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -84,7 +84,7 @@
user.alpha = 255
user.update_atom_colour()
user.animate_movement = FORWARD_STEPS
- user.notransform = 0
+ user.mob_transforming = 0
user.anchored = FALSE
teleporting = 0
for(var/obj/item/I in user.held_items)
@@ -125,7 +125,7 @@
ADD_TRAIT(I, TRAIT_NODROP, CHRONOSUIT_TRAIT)
user.animate_movement = NO_STEPS
user.changeNext_move(8 + phase_in_ds)
- user.notransform = 1
+ user.mob_transforming = 1
user.anchored = TRUE
user.Stun(INFINITY)
diff --git a/code/modules/events/stray_cargo.dm b/code/modules/events/stray_cargo.dm
index 43c51fd5c8..02d02a8510 100644
--- a/code/modules/events/stray_cargo.dm
+++ b/code/modules/events/stray_cargo.dm
@@ -85,8 +85,8 @@
/datum/round_event_control/stray_cargo/syndicate
name = "Stray Syndicate Cargo Pod"
typepath = /datum/round_event/stray_cargo/syndicate
- weight = 6
- max_occurrences = 1
+ weight = 0
+ max_occurrences = 0
earliest_start = 30 MINUTES
/datum/round_event/stray_cargo/syndicate
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index ccac1d4a77..900fc99171 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -303,12 +303,12 @@ All foods are distributed among various categories. Use common sense.
var/obj/item/result
if(cooked_type)
result = new cooked_type(T)
- //if the result is food, set its food quality to the original food item's quality
- if(isfood(result))
- var/obj/item/reagent_containers/food/food_output = result
- food_output.adjust_food_quality(food_quality + M.quality_increase)
if(istype(M))
initialize_cooked_food(result, M.efficiency)
+ //if the result is food, set its food quality to the original food item's quality
+ if(isfood(result))
+ var/obj/item/reagent_containers/food/food_output = result
+ food_output.adjust_food_quality(food_quality + M.quality_increase)
else
initialize_cooked_food(result, 1)
SSblackbox.record_feedback("tally", "food_made", 1, result.type)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 67a636eb9c..891a6abec2 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -463,7 +463,7 @@
return TRUE
if(!O.reagents || !O.reagents.reagent_list.len) // other empty containers not accepted
return FALSE
- if(istype(O, /obj/item/reagent_containers/syringe) || istype(O, /obj/item/reagent_containers/glass/bottle) || istype(O, /obj/item/reagent_containers/glass/beaker) || istype(O, /obj/item/reagent_containers/spray) || istype(O, /obj/item/reagent_containers/medspray))
+ if(istype(O, /obj/item/reagent_containers/syringe) || istype(O, /obj/item/reagent_containers/glass/bottle) || istype(O, /obj/item/reagent_containers/glass/beaker) || istype(O, /obj/item/reagent_containers/spray) || istype(O, /obj/item/reagent_containers/medspray) || istype(O, /obj/item/reagent_containers/chem_pack))
return TRUE
return FALSE
diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm
index 107282b642..957d9df376 100644
--- a/code/modules/holiday/halloween/jacqueen.dm
+++ b/code/modules/holiday/halloween/jacqueen.dm
@@ -56,8 +56,9 @@
cached_z = z
poof()
-/mob/living/simple_animal/jacq/Life()
- ..()
+/mob/living/simple_animal/jacq/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(!ckey)
if((last_poof+3 MINUTES) < world.realtime)
poof()
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index b511cc793e..e611ccf232 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -492,7 +492,7 @@
setDir(user.dir)
user.forceMove(src)
- user.notransform = TRUE
+ user.mob_transforming = TRUE
user.status_flags |= GODMODE
can_destroy = FALSE
@@ -501,7 +501,7 @@
/obj/effect/immortality_talisman/proc/unvanish(mob/user)
user.status_flags &= ~GODMODE
- user.notransform = FALSE
+ user.mob_transforming = FALSE
user.forceMove(get_turf(src))
user.visible_message("[user] pops back into reality!")
diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm
index 0c50cb0468..bd3a3d304a 100644
--- a/code/modules/mob/dead/dead.dm
+++ b/code/modules/mob/dead/dead.dm
@@ -68,7 +68,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
set category = "OOC"
set name = "Server Hop!"
set desc= "Jump to the other server"
- if(notransform)
+ if(mob_transforming)
return
var/list/csa = CONFIG_GET(keyed_list/cross_server)
var/pick
@@ -93,9 +93,9 @@ INITIALIZE_IMMEDIATE(/mob/dead)
to_chat(C, "Sending you to [pick].")
new /obj/screen/splash(C)
- notransform = TRUE
+ mob_transforming = TRUE
sleep(29) //let the animation play
- notransform = FALSE
+ mob_transforming = FALSE
if(!C)
return
diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm
index 3547d5f846..d3dbfac8c8 100644
--- a/code/modules/mob/living/bloodcrawl.dm
+++ b/code/modules/mob/living/bloodcrawl.dm
@@ -37,10 +37,10 @@
C.put_in_hands(B1)
C.put_in_hands(B2)
C.regenerate_icons()
- src.notransform = TRUE
+ src.mob_transforming = TRUE
spawn(0)
bloodpool_sink(B)
- src.notransform = FALSE
+ src.mob_transforming = FALSE
return 1
/mob/living/proc/bloodpool_sink(obj/effect/decal/cleanable/B)
@@ -155,7 +155,7 @@
addtimer(CALLBACK(src, /atom/.proc/remove_atom_colour, TEMPORARY_COLOUR_PRIORITY, newcolor), 6 SECONDS)
/mob/living/proc/phasein(obj/effect/decal/cleanable/B)
- if(src.notransform)
+ if(src.mob_transforming)
to_chat(src, "Finish eating first!")
return 0
B.visible_message("[B] starts to bubble...")
diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm
index 51be1f6971..6d06da41ae 100644
--- a/code/modules/mob/living/brain/life.dm
+++ b/code/modules/mob/living/brain/life.dm
@@ -1,11 +1,7 @@
-/mob/living/brain/Life()
- set invisibility = 0
- if (notransform)
+/mob/living/brain/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
- if(!loc)
- return
- . = ..()
handle_emp_damage()
/mob/living/brain/update_stat()
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index 042451b7dd..5b92bf3dea 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -8,9 +8,6 @@
/mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
return ..(AM, skipcatch = TRUE, hitpush = FALSE)
-/mob/living/carbon/alien/can_embed(obj/item/I)
- return FALSE
-
/*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other.
As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble.
In all, this is a lot like the monkey code. /N
diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm
index a4da38c4da..f0004b5ed9 100644
--- a/code/modules/mob/living/carbon/alien/larva/life.dm
+++ b/code/modules/mob/living/carbon/alien/larva/life.dm
@@ -1,14 +1,10 @@
-
-
-/mob/living/carbon/alien/larva/Life()
- set invisibility = 0
- if (notransform)
+/mob/living/carbon/alien/larva/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
- if(..()) //not dead
- // GROW!
- if(amount_grown < max_grown)
- amount_grown++
- update_icons()
+ // GROW!
+ if(amount_grown < max_grown)
+ amount_grown++
+ update_icons()
/mob/living/carbon/alien/larva/update_stat()
diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm
index 75aadd69c9..70c59d4943 100644
--- a/code/modules/mob/living/carbon/alien/life.dm
+++ b/code/modules/mob/living/carbon/alien/life.dm
@@ -1,6 +1,7 @@
-/mob/living/carbon/alien/Life()
+/mob/living/carbon/alien/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
findQueen()
- return..()
/mob/living/carbon/alien/check_breath(datum/gas_mixture/breath)
if(status_flags & GODMODE)
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 0e8764a372..9bb50bdf42 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -92,7 +92,7 @@
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.Paralyze(6)
- new_xeno.notransform = TRUE
+ new_xeno.mob_transforming = TRUE
new_xeno.invisibility = INVISIBILITY_MAXIMUM
sleep(6)
@@ -102,7 +102,7 @@
if(new_xeno)
new_xeno.SetParalyzed(0)
- new_xeno.notransform = FALSE
+ new_xeno.mob_transforming = FALSE
new_xeno.invisibility = 0
var/mob/living/carbon/old_owner = owner
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 41a034ecd8..7ce0fd38da 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -65,17 +65,6 @@
throw_mode_off()
return TRUE
-/mob/living/carbon/embed_item(obj/item/I)
- throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
- var/obj/item/bodypart/L = pick(bodyparts)
- L.embedded_objects |= I
- I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
- I.forceMove(src)
- I.embedded()
- L.receive_damage(I.w_class*I.embedding["impact_pain_mult"])
- visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!")
- SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded)
-
/mob/living/carbon/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
var/totitemdamage = pre_attacked_by(I, user) * damage_multiplier
var/impacting_zone = (user == src)? check_zone(user.zone_selected) : ran_zone(user.zone_selected)
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index 5528669afa..b5835aef52 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -1,20 +1,21 @@
-/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
+/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE)
SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone)
var/hit_percent = (100-blocked)/100
if(!forced && hit_percent <= 0)
return 0
var/obj/item/bodypart/BP = null
- if(isbodypart(def_zone)) //we specified a bodypart object
- BP = def_zone
- else
- if(!def_zone)
- def_zone = ran_zone(def_zone)
- BP = get_bodypart(check_zone(def_zone))
- if(!BP)
- BP = bodyparts[1]
+ if(!spread_damage)
+ if(isbodypart(def_zone)) //we specified a bodypart object
+ BP = def_zone
+ else
+ if(!def_zone)
+ def_zone = ran_zone(def_zone)
+ BP = get_bodypart(check_zone(def_zone))
+ if(!BP)
+ BP = bodyparts[1]
var/damage_amount = forced ? damage : damage * hit_percent
switch(damagetype)
diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm
index 9f6a572fc8..651fec8415 100644
--- a/code/modules/mob/living/carbon/human/damage_procs.dm
+++ b/code/modules/mob/living/carbon/human/damage_procs.dm
@@ -1,5 +1,5 @@
-/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
+/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage)
// depending on the species, it will run the corresponding apply_damage code there
- return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced)
+ return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 86b6406081..56ab1f1b10 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -18,32 +18,21 @@
#define THERMAL_PROTECTION_HAND_LEFT 0.025
#define THERMAL_PROTECTION_HAND_RIGHT 0.025
-/mob/living/carbon/human/Life(seconds, times_fired)
- set invisibility = 0
- if (notransform)
+/mob/living/carbon/human/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
+ handle_active_genes()
+ //heart attack stuff
+ handle_heart()
+ dna.species.spec_life(src) // for mutantraces
+ return (stat != DEAD) && !QDELETED(src)
- . = ..()
-
- if (QDELETED(src))
- return 0
-
- if(.) //not dead
- handle_active_genes()
-
- if(stat != DEAD)
- //heart attack stuff
- handle_heart()
-
+/mob/living/carbon/human/PhysicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
//Update our name based on whether our face is obscured/disfigured
name = get_visible_name()
- dna.species.spec_life(src) // for mutantraces
-
- if(stat != DEAD)
- return 1
-
-
/mob/living/carbon/human/calculate_affecting_pressure(pressure)
var/headless = !get_bodypart(BODY_ZONE_HEAD) //should the mob be perennially headless (see dullahans), we only take the suit into account, so they can into space.
if (wear_suit && istype(wear_suit, /obj/item/clothing) && (headless || (head && istype(head, /obj/item/clothing))))
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index e1a7a3b221..f256345c68 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1492,12 +1492,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases
if(user.dna.species.punchdamagelow)
- if(HAS_TRAIT(user, TRAIT_PUGILIST)) //pugilists have a flat 10% miss chance
- miss_chance = 10
if(atk_verb == ATTACK_EFFECT_KICK) //kicks never miss (provided your species deals more than 0 damage)
miss_chance = 0
+ else if(HAS_TRAIT(user, TRAIT_PUGILIST)) //pugilists have a flat 10% miss chance
+ miss_chance = 10
else
- miss_chance = min(10 + ((puncherstam + puncherbrute)*0.5), 100) //probability of miss has a base of 10, and modified based on half brute total. Capped at max 100 to prevent weirdness in prob()
+ miss_chance = min(10 + max(puncherstam * 0.5, puncherbrute * 0.5), 100) //probability of miss has a base of 10, and modified based on half brute total. Capped at max 100 to prevent weirdness in prob()
if(!damage || !affecting || prob(miss_chance))//future-proofing for species that have 0 damage/weird cases where no zone is targeted
playsound(target.loc, user.dna.species.miss_sound, 25, TRUE, -1)
@@ -1939,7 +1939,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
append_message += ", causing them to drop [target_held_item]"
log_combat(user, target, "shoved", append_message)
-/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE)
+/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE)
SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone)
var/hit_percent = (100-(blocked+armor))/100
hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100
@@ -1947,20 +1947,20 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return 0
var/obj/item/bodypart/BP = null
- if(isbodypart(def_zone))
- if(damagetype == STAMINA && istype(def_zone, /obj/item/bodypart/head))
- BP = H.get_bodypart(check_zone(BODY_ZONE_CHEST))
+ if(!spread_damage)
+ if(isbodypart(def_zone))
+ if(damagetype == STAMINA && istype(def_zone, /obj/item/bodypart/head))
+ BP = H.get_bodypart(check_zone(BODY_ZONE_CHEST))
+ else
+ BP = def_zone
else
- BP = def_zone
- else
- if(!def_zone)
- def_zone = ran_zone(def_zone)
- if(damagetype == STAMINA && def_zone == BODY_ZONE_HEAD)
- def_zone = BODY_ZONE_CHEST
- BP = H.get_bodypart(check_zone(def_zone))
-
- if(!BP)
- BP = H.bodyparts[1]
+ if(!def_zone)
+ def_zone = ran_zone(def_zone)
+ if(damagetype == STAMINA && def_zone == BODY_ZONE_HEAD)
+ def_zone = BODY_ZONE_CHEST
+ BP = H.get_bodypart(check_zone(def_zone))
+ if(!BP)
+ BP = H.bodyparts[1]
switch(damagetype)
if(BRUTE)
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 b780af6b8a..5bdc0bbb39 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -239,7 +239,7 @@
"You focus intently on moving your body while \
standing perfectly still...")
- H.notransform = TRUE
+ H.mob_transforming = TRUE
if(do_after(owner, delay=60, needhand=FALSE, target=owner, progress=TRUE))
if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT)
@@ -249,7 +249,7 @@
else
to_chat(H, "...but fail to stand perfectly still!")
- H.notransform = FALSE
+ H.mob_transforming = FALSE
/datum/action/innate/split_body/proc/make_dupe()
var/mob/living/carbon/human/H = owner
@@ -267,7 +267,7 @@
spare.Move(get_step(H.loc, pick(NORTH,SOUTH,EAST,WEST)))
H.blood_volume *= 0.45
- H.notransform = 0
+ H.mob_transforming = 0
var/datum/species/jelly/slime/origin_datum = H.dna.species
origin_datum.bodies |= spare
@@ -466,8 +466,9 @@
if(new_color)
var/temp_hsv = RGBtoHSV(new_color)
if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright
- H.dna.features["mcolor"] = sanitize_hexcolor(new_color)
+ H.dna.features["mcolor"] = sanitize_hexcolor(new_color, 6)
H.update_body()
+ H.update_hair()
else
to_chat(H, "Invalid color. Your color is not bright enough.")
else if(select_alteration == "Hair Style")
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 4e5b033688..f9c5db4789 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -1,29 +1,19 @@
-/mob/living/carbon/Life()
- set invisibility = 0
-
- if(notransform)
- return
-
- if(damageoverlaytemp)
- damageoverlaytemp = 0
- update_damage_hud()
-
+/mob/living/carbon/BiologicalLife(seconds, times_fired)
+ if(stat == DEAD)
+ return FALSE
//Reagent processing needs to come before breathing, to prevent edge cases.
handle_organs()
-
- . = ..()
-
- if (QDELETED(src))
+ if(!(. = ..()))
return
-
- if(.) //not dead
- handle_blood()
-
+ handle_blood()
+ // handle_blood *could* kill us.
+ // we should probably have a better system for if we need to check for death or something in the future hmw
if(stat != DEAD)
var/bprv = handle_bodyparts()
if(bprv & BODYPART_LIFE_UPDATE_HEALTH)
updatehealth()
update_stamina()
+ doSprintBufferRegen()
if(stat != DEAD)
handle_brain_damage()
@@ -35,12 +25,17 @@
stop_sound_channel(CHANNEL_HEARTBEAT)
handle_death()
rot()
+ . = FALSE
//Updates the number of stored chemicals for powers
handle_changeling()
- if(stat != DEAD)
- return 1
+/mob/living/carbon/PhysicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
+ if(damageoverlaytemp)
+ damageoverlaytemp = 0
+ update_damage_hud()
//Procs called while dead
/mob/living/carbon/proc/handle_death()
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index edbd1562b3..7ba29dbf30 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -3,30 +3,26 @@
/mob/living/carbon/monkey
-/mob/living/carbon/monkey/Life()
- set invisibility = 0
-
- if (notransform)
+/mob/living/carbon/monkey/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
-
- if(..())
-
- if(!client)
- if(stat == CONSCIOUS)
- 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)
- resist()
- else if(resisting)
- resisting = FALSE
- else if((mode == MONKEY_IDLE && !pickupTarget && !prob(MONKEY_SHENANIGAN_PROB)) || !handle_combat())
- 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"))
- else
+ if(client)
+ return
+ if(stat == CONSCIOUS)
+ 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)
+ resist()
+ else if(resisting)
+ resisting = FALSE
+ else if((mode == MONKEY_IDLE && !pickupTarget && !prob(MONKEY_SHENANIGAN_PROB)) || !handle_combat())
+ 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"))
+ else
+ walk_to(src,0)
/mob/living/carbon/monkey/handle_mutations_and_radiation()
if(radiation)
diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm
index fbe4bc9900..c5cb4dc713 100644
--- a/code/modules/mob/living/carbon/monkey/punpun.dm
+++ b/code/modules/mob/living/carbon/monkey/punpun.dm
@@ -31,11 +31,12 @@
if(relic_mask)
equip_to_slot_or_del(new relic_mask, SLOT_WEAR_MASK)
-/mob/living/carbon/monkey/punpun/Life()
+/mob/living/carbon/monkey/punpun/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory(FALSE, FALSE)
memory_saved = TRUE
- ..()
/mob/living/carbon/monkey/punpun/death(gibbed)
if(!memory_saved)
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index 9a1c6c54b6..4899067d7b 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -12,7 +12,7 @@
overlays_standing[cache_index] = null
/mob/living/carbon/regenerate_icons()
- if(notransform)
+ if(mob_transforming)
return 1
update_inv_hands()
update_inv_handcuffed()
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 87d5abb89e..0c049ab5c1 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -1,14 +1,20 @@
-/*
- apply_damage(a,b,c)
- args
- a:damage - How much damage to take
- b:damage_type - What type of damage to take, brute, burn
- c:def_zone - Where to take the damage if its brute or burn
- Returns
- standard 0 if fail
-*/
-/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
+/**
+ * Applies damage to this mob
+ *
+ * Sends [COMSIG_MOB_APPLY_DAMGE]
+ *
+ * Arguuments:
+ * * damage - amount of damage
+ * * damagetype - one of [BRUTE], [BURN], [TOX], [OXY], [CLONE], [STAMINA]
+ * * def_zone - zone that is being hit if any
+ * * blocked - armor value applied
+ * * forced - bypass hit percentage
+ * * spread_damage - used in overrides
+ *
+ * Returns TRUE if damage applied
+ */
+/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE)
var/hit_percent = (100-blocked)/100
if(!damage || (hit_percent <= 0))
return 0
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 5e04e3ec16..7c99c452a1 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -1,12 +1,20 @@
+/**
+ * Called by SSmobs at (hopefully) an interval of 1 second.
+ * Splits off into PhysicalLife() and BiologicalLife(). Override those instead of this.
+ */
/mob/living/proc/Life(seconds, times_fired)
- set waitfor = FALSE
- set invisibility = 0
+ set waitfor = FALSE // yeah hey we're kind of on a subsystem, no sleeping will be tolerated here!
+ if(mob_transforming)
+ return
- if(digitalinvis)
- handle_diginvis() //AI becomes unable to see mob
+ . = SEND_SIGNAL(src, COMSIG_LIVING_LIFE, seconds, times_fired)
+ if(!(. & COMPONENT_INTERRUPT_LIFE_PHYSICAL))
+ PhysicalLife(seconds, times_fired)
+ if(!(. & COMPONENT_INTERRUPT_LIFE_BIOLOGICAL))
+ BiologicalLife(seconds, times_fired)
- if((movement_type & FLYING) && !(movement_type & FLOATING)) //TODO: Better floating
- float(on = TRUE)
+ // CODE BELOW SHOULD ONLY BE THINGS THAT SHOULD HAPPEN NO MATTER WHAT AND CAN NOT BE SUSPENDED!
+ // Otherwise, it goes into one of the two split Life procs!
if (client)
var/turf/T = get_turf(src)
@@ -30,28 +38,54 @@
log_game("Z-TRACKING: [src] of type [src.type] has a Z-registration despite not having a client.")
update_z(null)
- if (notransform)
- return
- if(!loc)
- return
- var/datum/gas_mixture/environment = loc.return_air()
-
- if(stat != DEAD)
- //Mutations and radiation
- handle_mutations_and_radiation()
-
- if(stat != DEAD)
- //Breathing, if applicable
- handle_breathing(times_fired)
-
+/**
+ * Handles biological life processes like chemical metabolism, breathing, etc
+ * Returns TRUE or FALSE based on if we were interrupted. This is used by overridden variants to check if they should stop.
+ */
+/mob/living/proc/BiologicalLife(seconds, times_fired)
handle_diseases()// DEAD check is in the proc itself; we want it to spread even if the mob is dead, but to handle its disease-y properties only if you're not.
- if (QDELETED(src)) // diseases can qdel the mob via transformations
- return
+ // Everything after this shouldn't process while dead (as of the time of writing)
+ if(stat == DEAD)
+ return FALSE
- if(stat != DEAD)
- //Random events (vomiting etc)
- handle_random_events()
+ //Mutations and radiation
+ handle_mutations_and_radiation()
+
+ //Breathing, if applicable
+ handle_breathing(times_fired)
+
+ if (QDELETED(src)) // diseases can qdel the mob via transformations
+ return FALSE
+
+ //Random events (vomiting etc)
+ handle_random_events()
+
+ //stuff in the stomach
+ handle_stomach()
+
+ handle_block_parry(seconds)
+
+ // These two MIGHT need to be moved to base Life() if we get any in the future that's a "physical" effect that needs to fire even while in stasis.
+ handle_traits() // eye, ear, brain damages
+ handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc
+ return TRUE
+
+/**
+ * Handles physical life processes like being on fire. Don't ask why this is considered "Life".
+ * Returns TRUE or FALSE based on if we were interrupted. This is used by overridden variants to check if they should stop.
+ */
+/mob/living/proc/PhysicalLife(seconds, times_fired)
+ if(digitalinvis)
+ handle_diginvis() //AI becomes unable to see mob
+
+ if((movement_type & FLYING) && !(movement_type & FLOATING)) //TODO: Better floating
+ float(on = TRUE)
+
+ if(!loc)
+ return FALSE
+
+ var/datum/gas_mixture/environment = loc.return_air()
//Handle temperature/pressure differences between body and environment
if(environment)
@@ -59,23 +93,11 @@
handle_fire()
- //stuff in the stomach
- handle_stomach()
-
handle_gravity()
- handle_block_parry(seconds)
-
if(machine)
machine.check_eye(src)
-
- if(stat != DEAD)
- handle_traits() // eye, ear, brain damages
- if(stat != DEAD)
- handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc
-
- if(stat != DEAD)
- return 1
+ return TRUE
/mob/living/proc/handle_breathing(times_fired)
return
@@ -168,4 +190,4 @@
/mob/living/proc/handle_high_gravity(gravity)
if(gravity >= GRAVITY_DAMAGE_TRESHOLD) //Aka gravity values of 3 or more
var/grav_stregth = gravity - GRAVITY_DAMAGE_TRESHOLD
- adjustBruteLoss(min(grav_stregth,3))
\ No newline at end of file
+ adjustBruteLoss(min(grav_stregth,3))
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index d0aff933b5..07252b4c45 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -1,7 +1,7 @@
/mob/living/proc/run_armor_check(def_zone = null, attack_flag = "melee", absorb_text = "Your armor absorbs the blow!", soften_text = "Your armor softens the blow!", armour_penetration, penetrated_text = "Your armor was penetrated!", silent=FALSE)
var/armor = getarmor(def_zone, attack_flag)
-
+
if(silent)
return max(0, armor - armour_penetration)
@@ -108,12 +108,6 @@
/mob/living/proc/catch_item(obj/item/I, skip_throw_mode_check = FALSE)
return FALSE
-/mob/living/proc/embed_item(obj/item/I)
- return
-
-/mob/living/proc/can_embed(obj/item/I)
- return FALSE
-
/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
// Throwingdatum can be null if someone had an accident() while slipping with an item in hand.
var/obj/item/I
@@ -129,30 +123,17 @@
skipcatch = TRUE
blocked = TRUE
total_damage = block_calculate_resultant_damage(total_damage, block_return)
- else if(I && I.throw_speed >= EMBED_THROWSPEED_THRESHOLD && can_embed(I, src) && prob(I.embedding["embed_chance"]) && !HAS_TRAIT(src, TRAIT_PIERCEIMMUNE) && (!HAS_TRAIT(src, TRAIT_AUTO_CATCH_ITEM) || incapacitated() || get_active_held_item()))
- embed_item(I)
- hitpush = FALSE
- skipcatch = TRUE //can't catch the now embedded item
if(I)
+ var/nosell_hit = SEND_SIGNAL(I, COMSIG_MOVABLE_IMPACT_ZONE, src, impacting_zone, throwingdatum, FALSE, blocked)
+ if(nosell_hit)
+ skipcatch = TRUE
+ hitpush = FALSE
if(!skipcatch && isturf(I.loc) && catch_item(I))
return TRUE
var/dtype = BRUTE
- var/volume = I.get_volume_by_throwforce_and_or_w_class()
- SEND_SIGNAL(I, COMSIG_MOVABLE_IMPACT_ZONE, src, impacting_zone)
+
dtype = I.damtype
- if (I.throwforce > 0) //If the weapon's throwforce is greater than zero...
- if (I.throwhitsound) //...and throwhitsound is defined...
- playsound(loc, I.throwhitsound, volume, 1, -1) //...play the weapon's throwhitsound.
- else if(I.hitsound) //Otherwise, if the weapon's hitsound is defined...
- playsound(loc, I.hitsound, volume, 1, -1) //...play the weapon's hitsound.
- else if(!I.throwhitsound) //Otherwise, if throwhitsound isn't defined...
- playsound(loc, 'sound/weapons/genhit.ogg',volume, 1, -1) //...play genhit.ogg.
-
- else if(!I.throwhitsound && I.throwforce > 0) //Otherwise, if the item doesn't have a throwhitsound and has a throwforce greater than zero...
- playsound(loc, 'sound/weapons/genhit.ogg', volume, 1, -1)//...play genhit.ogg
- if(!I.throwforce)// Otherwise, if the item's throwforce is 0...
- playsound(loc, 'sound/weapons/throwtap.ogg', 1, volume, -1)//...play throwtap.ogg.
if(!blocked)
visible_message("[src] has been hit by [I].", \
"You have been hit by [I].")
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 1147042c8c..4f2332e99d 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -3,48 +3,48 @@
#define POWER_RESTORATION_SEARCH_APC 2
#define POWER_RESTORATION_APC_FOUND 3
-/mob/living/silicon/ai/Life()
- if (stat == DEAD)
+/mob/living/silicon/ai/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
- else //I'm not removing that shitton of tabs, unneeded as they are. -- Urist
+ //I'm not removing that shitton of tabs, unneeded as they are. -- Urist
//Being dead doesn't mean your temperature never changes
- update_gravity(mob_has_gravity())
+ update_gravity(mob_has_gravity())
- handle_status_effects()
+ handle_status_effects()
- if(malfhack && malfhack.aidisabled)
- deltimer(malfhacking)
- // This proc handles cleanup of screen notifications and
- // messenging the client
- malfhacked(malfhack)
+ if(malfhack && malfhack.aidisabled)
+ deltimer(malfhacking)
+ // This proc handles cleanup of screen notifications and
+ // messenging the client
+ malfhacked(malfhack)
- if(isturf(loc) && (QDELETED(eyeobj) || !eyeobj.loc))
- view_core()
+ if(isturf(loc) && (QDELETED(eyeobj) || !eyeobj.loc))
+ view_core()
- if(machine)
- machine.check_eye(src)
+ if(machine)
+ machine.check_eye(src)
- // Handle power damage (oxy)
- if(aiRestorePowerRoutine)
- // Lost power
- adjustOxyLoss(1)
- else
- // Gain Power
- if(getOxyLoss())
- adjustOxyLoss(-1)
+ // Handle power damage (oxy)
+ if(aiRestorePowerRoutine)
+ // Lost power
+ adjustOxyLoss(1)
+ else
+ // Gain Power
+ if(getOxyLoss())
+ adjustOxyLoss(-1)
- if(!lacks_power())
- var/area/home = get_area(src)
- if(home.powered(EQUIP))
- home.use_power(1000, EQUIP)
+ if(!lacks_power())
+ var/area/home = get_area(src)
+ if(home.powered(EQUIP))
+ home.use_power(1000, EQUIP)
- if(aiRestorePowerRoutine >= POWER_RESTORATION_SEARCH_APC)
- ai_restore_power()
- return
+ if(aiRestorePowerRoutine >= POWER_RESTORATION_SEARCH_APC)
+ ai_restore_power()
+ return
- else if(!aiRestorePowerRoutine)
- ai_lose_power()
+ else if(!aiRestorePowerRoutine)
+ ai_lose_power()
/mob/living/silicon/ai/proc/lacks_power()
var/turf/T = get_turf(src)
diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm
index 91a6709bc9..2a03afb61a 100644
--- a/code/modules/mob/living/silicon/damage_procs.dm
+++ b/code/modules/mob/living/silicon/damage_procs.dm
@@ -1,5 +1,5 @@
-/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE)
+/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE)
var/hit_percent = (100-blocked)/100
if(!damage || (!forced && hit_percent <= 0))
return 0
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 4b1b108b0e..704a23b8db 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -146,10 +146,11 @@
if(possible_chassis[chassis])
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)
-/mob/living/silicon/pai/Life()
+/mob/living/silicon/pai/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(hacking)
process_hack()
- return ..()
/mob/living/silicon/pai/proc/process_hack()
@@ -282,17 +283,19 @@
. = ..()
. += "A personal AI in holochassis mode. Its master ID string seems to be [master]."
-/mob/living/silicon/pai/Life()
- if(stat == DEAD)
- return
+/mob/living/silicon/pai/PhysicalLife()
+ . = ..()
if(cable)
if(get_dist(src, cable) > 1)
var/turf/T = get_turf(src.loc)
T.visible_message("[src.cable] rapidly retracts back into its spool.", "You hear a click and the sound of wire spooling rapidly.")
qdel(src.cable)
cable = null
+
+/mob/living/silicon/pai/BiologicalLife()
+ if(!(. = ..()))
+ return
silent = max(silent - 1, 0)
- . = ..()
/mob/living/silicon/pai/updatehealth()
if(status_flags & GODMODE)
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index e04943a8c5..0feb8b98b7 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -1,9 +1,6 @@
-/mob/living/silicon/robot/Life()
- set invisibility = 0
- if (src.notransform)
+/mob/living/silicon/robot/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
-
- ..()
adjustOxyLoss(-10) //we're a robot!
handle_robot_hud_updates()
handle_robot_cell()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index bf66556399..cb43a8489a 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -259,7 +259,7 @@
var/prev_locked_down = R.locked_down
sleep(1)
flick("[cyborg_base_icon]_transform", R)
- R.notransform = TRUE
+ R.mob_transforming = TRUE
R.SetLockdown(1)
R.anchored = TRUE
sleep(1)
@@ -270,7 +270,7 @@
R.SetLockdown(0)
R.setDir(SOUTH)
R.anchored = FALSE
- R.notransform = FALSE
+ R.mob_transforming = FALSE
R.update_headlamp()
R.notify_ai(NEW_MODULE)
if(R.hud_used)
diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm
index 4fb9e9273e..eee42c214f 100644
--- a/code/modules/mob/living/simple_animal/astral.dm
+++ b/code/modules/mob/living/simple_animal/astral.dm
@@ -62,7 +62,7 @@
log_reagent("FERMICHEM: [src] has astrally transmitted [message] into [A]")
//Delete the mob if there's no mind! Pay that mob no mind.
-/mob/living/simple_animal/astral/Life()
- if(!mind)
- qdel(src)
+/mob/living/simple_animal/astral/PhysicalLife(seconds, times_fired)
. = ..()
+ if(!mind && !QDELETED(src))
+ qdel(src)
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 5f7ff198e2..d30fa1b49f 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -115,13 +115,14 @@
Read_Memory()
. = ..()
-/mob/living/simple_animal/pet/cat/Runtime/Life()
+/mob/living/simple_animal/pet/cat/Runtime/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(!cats_deployed && SSticker.current_state >= GAME_STATE_SETTING_UP)
Deploy_The_Cats()
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory()
memory_saved = TRUE
- ..()
/mob/living/simple_animal/pet/cat/Runtime/make_babies()
var/mob/baby = ..()
@@ -177,7 +178,9 @@
gold_core_spawnable = NO_SPAWN
unique_pet = TRUE
-/mob/living/simple_animal/pet/cat/Life()
+/mob/living/simple_animal/pet/cat/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(!stat && !buckled && !client)
if(prob(1))
emote("me", EMOTE_VISIBLE, pick("stretches out for a belly rub.", "wags its tail.", "lies down."))
@@ -269,8 +272,9 @@
to_chat(src, "Your name is now \"new_name\"!")
name = new_name
-/mob/living/simple_animal/pet/cat/cak/Life()
- ..()
+/mob/living/simple_animal/pet/cat/cak/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(stat)
return
if(health < maxHealth)
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index e00e0648b5..7f3693f622 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -27,8 +27,9 @@
var/obj/item/inventory_mask
gold_core_spawnable = FRIENDLY_SPAWN
-/mob/living/simple_animal/crab/Life()
- ..()
+/mob/living/simple_animal/crab/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
//CRAB movement
if(!ckey && !stat)
if(isturf(loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc.
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 57a4ecc5c9..0584995583 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -366,11 +366,12 @@
RemoveElement(/datum/element/mob_holder, held_icon)
AddElement(/datum/element/mob_holder, "old_corgi")
-/mob/living/simple_animal/pet/dog/corgi/Ian/Life()
+/mob/living/simple_animal/pet/dog/corgi/Ian/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory(FALSE)
memory_saved = TRUE
- ..()
/mob/living/simple_animal/pet/dog/corgi/Ian/death()
if(!memory_saved)
@@ -419,8 +420,9 @@
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
-/mob/living/simple_animal/pet/dog/corgi/Ian/Life()
- ..()
+/mob/living/simple_animal/pet/dog/corgi/Ian/BiologicalLife()
+ if(!(. = ..()))
+ return
//Feeding, chasing food, FOOOOODDDD
if(!stat && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) && !buckled)
@@ -490,8 +492,9 @@
nofur = TRUE
unique_pet = TRUE
-/mob/living/simple_animal/pet/dog/corgi/narsie/Life()
- ..()
+/mob/living/simple_animal/pet/dog/corgi/narsie/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
for(var/mob/living/simple_animal/pet/P in range(1, src))
if(P != src && prob(5))
visible_message("[src] devours [P]!", \
@@ -615,8 +618,9 @@
return
..()
-/mob/living/simple_animal/pet/dog/corgi/Lisa/Life()
- ..()
+/mob/living/simple_animal/pet/dog/corgi/Lisa/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
make_babies()
@@ -628,8 +632,9 @@
setDir(i)
sleep(1)
-/mob/living/simple_animal/pet/dog/pug/Life()
- ..()
+/mob/living/simple_animal/pet/dog/pug/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(!stat && CHECK_MULTIPLE_BITFIELDS(mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) && !buckled)
if(prob(1))
emote("me", EMOTE_VISIBLE, pick("chases its tail."))
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 8c73665b9b..ba9cdfda64 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -46,9 +46,10 @@
udder = null
return ..()
-/mob/living/simple_animal/hostile/retaliate/goat/Life()
- . = ..()
- if(.)
+/mob/living/simple_animal/hostile/retaliate/goat/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
+ if(stat == CONSCIOUS)
//chance to go crazy and start wacking stuff
if(!enemies.len && prob(1))
Retaliate()
@@ -57,7 +58,6 @@
enemies = list()
LoseTarget()
src.visible_message("[src] calms down.")
- if(stat == CONSCIOUS)
udder.generateMilk(milk_reagent)
eat_plants()
if(!pulledby)
@@ -160,8 +160,9 @@
else
return ..()
-/mob/living/simple_animal/cow/Life()
- . = ..()
+/mob/living/simple_animal/cow/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(stat == CONSCIOUS)
udder.generateMilk(milk_reagent)
@@ -244,9 +245,8 @@
pixel_x = rand(-6, 6)
pixel_y = rand(0, 10)
-/mob/living/simple_animal/chick/Life()
- . =..()
- if(!.)
+/mob/living/simple_animal/chick/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
if(!stat && !ckey)
amount_grown += rand(1,2)
@@ -254,8 +254,9 @@
new /mob/living/simple_animal/chicken(src.loc)
qdel(src)
-/mob/living/simple_animal/chick/holo/Life()
- ..()
+/mob/living/simple_animal/chick/holo/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
amount_grown = 0
/mob/living/simple_animal/chicken
@@ -328,9 +329,8 @@
else
..()
-/mob/living/simple_animal/chicken/Life()
- . =..()
- if(!.)
+/mob/living/simple_animal/chicken/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
if((!stat && prob(3) && eggsleft > 0) && egg_type)
visible_message("[src] [pick(layMessage)]")
@@ -403,9 +403,8 @@
. = ..()
++kiwi_count
-/mob/living/simple_animal/kiwi/Life()
- . =..()
- if(!.)
+/mob/living/simple_animal/kiwi/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
if((!stat && prob(3) && eggsleft > 0) && egg_type)
visible_message("[src] [pick(layMessage)]")
@@ -478,9 +477,8 @@
pixel_x = rand(-6, 6)
pixel_y = rand(0, 10)
-/mob/living/simple_animal/babyKiwi/Life()
- . =..()
- if(!.)
+/mob/living/simple_animal/babyKiwi/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
if(!stat && !ckey)
amount_grown += rand(1,2)
@@ -546,4 +544,4 @@
health = 75
maxHealth = 75
blood_volume = BLOOD_VOLUME_NORMAL
- footstep_type = FOOTSTEP_MOB_SHOE
\ No newline at end of file
+ footstep_type = FOOTSTEP_MOB_SHOE
diff --git a/code/modules/mob/living/simple_animal/friendly/plushie.dm b/code/modules/mob/living/simple_animal/friendly/plushie.dm
index d992c704f5..ff95e8fe86 100644
--- a/code/modules/mob/living/simple_animal/friendly/plushie.dm
+++ b/code/modules/mob/living/simple_animal/friendly/plushie.dm
@@ -72,8 +72,8 @@
qdel(src)
//low regen over time
-/mob/living/simple_animal/pet/plushie/Life()
- if(stat)
+/mob/living/simple_animal/pet/plushie/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
if(health < maxHealth)
heal_overall_damage(5) //Decent life regen, they're not able to hurt anyone so this shouldn't be an issue (butterbear for reference has 10 regen)
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 9d94992747..73ebfa7c77 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -160,7 +160,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
to_chat(src, "Your new name [new_name] anchors itself in your mind.")
fully_replace_character_name(null, new_name)
-/mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies
+/mob/living/simple_animal/hostile/guardian/PhysicalLife() //Dies if the summoner dies
. = ..()
update_health_hud() //we need to update all of our health displays to match our summoner and we can't practically give the summoner a hook to do it
med_hud_set_health()
diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
index e82d6cd16a..885f907997 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
@@ -19,8 +19,9 @@
. = ..()
stealthcooldown = 0
-/mob/living/simple_animal/hostile/guardian/assassin/Life()
- . = ..()
+/mob/living/simple_animal/hostile/guardian/assassin/PhysicalLife()
+ if(!(. = ..()))
+ return
updatestealthalert()
if(loc == summoner && toggle)
ToggleMode(0)
diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
index c60e43ff01..0b4952aa9e 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
@@ -11,8 +11,9 @@
var/charging = 0
var/obj/screen/alert/chargealert
-/mob/living/simple_animal/hostile/guardian/charger/Life()
- . = ..()
+/mob/living/simple_animal/hostile/guardian/charger/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(ranged_cooldown <= world.time)
if(!chargealert)
chargealert = throw_alert("charge", /obj/screen/alert/cancharge)
diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm
index 97003a53e2..a05cd517fb 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm
@@ -13,8 +13,9 @@
tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online."
carp_fluff_string = "CARP CARP CARP! You caught one! OH GOD, EVERYTHING'S ON FIRE. Except you and the fish."
-/mob/living/simple_animal/hostile/guardian/fire/Life()
- . = ..()
+/mob/living/simple_animal/hostile/guardian/fire/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(summoner)
summoner.ExtinguishMob()
summoner.adjust_fire_stacks(-20)
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 0e864a1e37..5dbf3e8e3b 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -125,7 +125,7 @@ mob/living/simple_animal/hostile/bear/butter //The mighty companion to Cak. Seve
attack_verb_continuous = "slaps"
attack_verb_simple = "slap"
-/mob/living/simple_animal/hostile/bear/butter/Life() //Heals butter bear really fast when he takes damage.
+/mob/living/simple_animal/hostile/bear/butter/BiologicalLife(seconds, times_fired) //Heals butter bear really fast when he takes damage.
if(stat)
return
if(health < maxHealth)
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index a56a8dcc29..f775d6600c 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -47,8 +47,9 @@
if(regen_amount)
regen_cooldown = world.time + REGENERATION_DELAY
-/mob/living/simple_animal/hostile/carp/Life()
- . = ..()
+/mob/living/simple_animal/hostile/carp/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(regen_amount && regen_cooldown < world.time)
heal_overall_damage(regen_amount)
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index e8991df358..945842d5ed 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -67,11 +67,10 @@
foes = null
return ..()
-/mob/living/simple_animal/hostile/Life()
- . = ..()
- if(!.) //dead
+/mob/living/simple_animal/hostile/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
walk(src, 0) //stops walking
- return 0
+ return
/mob/living/simple_animal/hostile/handle_automated_action()
if(AIStatus == AI_OFF)
diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm
index cab87010ef..f561f0d43c 100644
--- a/code/modules/mob/living/simple_animal/hostile/illusion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm
@@ -23,13 +23,12 @@
deathmessage = "vanishes into thin air! It was a fake!"
has_field_of_vision = FALSE //not meant to be played anyway.
-
-/mob/living/simple_animal/hostile/illusion/Life()
- ..()
+/mob/living/simple_animal/hostile/illusion/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(world.time > life_span)
death()
-
/mob/living/simple_animal/hostile/illusion/proc/Copy_Parent(mob/living/original, life = 50, hp = 100, damage = 0, replicate = 0 )
appearance = original.appearance
parent_mob = original
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 574811c968..51f61fa158 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
@@ -166,8 +166,9 @@
if(!hopping)
Hop()
-/mob/living/simple_animal/hostile/jungle/leaper/Life()
- . = ..()
+/mob/living/simple_animal/hostile/jungle/leaper/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
update_icons()
/mob/living/simple_animal/hostile/jungle/leaper/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
@@ -197,7 +198,7 @@
hopping = TRUE
density = FALSE
pass_flags |= PASSMOB
- notransform = TRUE
+ mob_transforming = TRUE
var/turf/new_turf = locate((target.x + rand(-3,3)),(target.y + rand(-3,3)),target.z)
if(player_hop)
new_turf = get_turf(target)
@@ -209,7 +210,7 @@
/mob/living/simple_animal/hostile/jungle/leaper/proc/FinishHop()
density = TRUE
- notransform = FALSE
+ mob_transforming = FALSE
pass_flags &= ~PASSMOB
hopping = FALSE
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 100, 1)
@@ -220,7 +221,7 @@
/mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlop()
var/turf/new_turf = get_turf(target)
hopping = TRUE
- notransform = TRUE
+ mob_transforming = TRUE
new /obj/effect/temp_visual/leaper_crush(new_turf)
addtimer(CALLBACK(src, .proc/BellyFlopHop, new_turf), 30)
@@ -231,7 +232,7 @@
/mob/living/simple_animal/hostile/jungle/leaper/proc/Crush()
hopping = FALSE
density = TRUE
- notransform = FALSE
+ mob_transforming = FALSE
playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1)
for(var/mob/living/L in orange(1, src))
L.adjustBruteLoss(35)
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm
index 40274c0029..99349168f0 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm
@@ -27,8 +27,9 @@
footstep_type = FOOTSTEP_MOB_CLAW
-/mob/living/simple_animal/hostile/jungle/mega_arachnid/Life()
- ..()
+/mob/living/simple_animal/hostile/jungle/mega_arachnid/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(target && ranged_cooldown > world.time && iscarbon(target))
var/mob/living/carbon/C = target
if(!C.legcuffed && C.health < 50)
@@ -40,7 +41,6 @@
minimum_distance = 0
alpha = 255
-
/mob/living/simple_animal/hostile/jungle/mega_arachnid/Aggro()
..()
alpha = 255
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index fe6c2290c4..b191eaf3fb 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -65,8 +65,9 @@ Difficulty: Hard
desc = "You're not quite sure how a signal can be bloody."
invisibility = 100
-/mob/living/simple_animal/hostile/megafauna/bubblegum/Life()
- ..()
+/mob/living/simple_animal/hostile/megafauna/bubblegum/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
move_to_delay = clamp(round((health/maxHealth) * 10), 3, 10)
/mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 04ff9413aa..5816be2917 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -731,7 +731,7 @@ Difficulty: Very Hard
/obj/structure/closet/stasis/Entered(atom/A)
if(isliving(A) && holder_animal)
var/mob/living/L = A
- L.notransform = 1
+ L.mob_transforming = 1
ADD_TRAIT(L, TRAIT_MUTE, STASIS_MUTE)
L.status_flags |= GODMODE
L.mind.transfer_to(holder_animal)
@@ -744,7 +744,7 @@ Difficulty: Very Hard
for(var/mob/living/L in src)
REMOVE_TRAIT(L, TRAIT_MUTE, STASIS_MUTE)
L.status_flags &= ~GODMODE
- L.notransform = 0
+ L.mob_transforming = 0
if(holder_animal)
holder_animal.mind.transfer_to(L)
L.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/exit_possession)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 4ade831f95..a66ee7b1de 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -88,9 +88,10 @@ Difficulty: Normal
/mob/living/simple_animal/hostile/megafauna/hierophant/spawn_crusher_loot()
new /obj/item/crusher_trophy/vortex_talisman(get_turf(spawned_beacon))
-/mob/living/simple_animal/hostile/megafauna/hierophant/Life()
- . = ..()
- if(. && spawned_beacon && !QDELETED(spawned_beacon) && !client)
+/mob/living/simple_animal/hostile/megafauna/hierophant/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
+ if(spawned_beacon && !QDELETED(spawned_beacon) && !client)
if(target || loc == spawned_beacon.loc)
timeout_time = initial(timeout_time)
else
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 50c6025378..db6468d1b5 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
@@ -73,14 +73,13 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
step(R, ddir) //Step the swarmers, instead of spawning them there, incase the turf is solid
-/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/Life()
- . = ..()
- if(.)
- var/createtype = GetUncappedAISwarmerType()
- if(createtype && world.time > swarmer_spawn_cooldown && GLOB.AISwarmers.len < (GetTotalAISwarmerCap()*0.5))
- swarmer_spawn_cooldown = world.time + swarmer_spawn_cooldown_amt
- new createtype(loc)
-
+/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
+ var/createtype = GetUncappedAISwarmerType()
+ if(createtype && world.time > swarmer_spawn_cooldown && GLOB.AISwarmers.len < (GetTotalAISwarmerCap()*0.5))
+ swarmer_spawn_cooldown = world.time + swarmer_spawn_cooldown_amt
+ new createtype(loc)
/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 5afe109550..c2d05e43d9 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -118,8 +118,9 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
overlay_googly_eyes = FALSE
CopyObject(copy, creator, destroy_original)
-/mob/living/simple_animal/hostile/mimic/copy/Life()
- ..()
+/mob/living/simple_animal/hostile/mimic/copy/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(idledamage && !target && !ckey) //Objects eventually revert to normal if no one is around to terrorize
adjustBruteLoss(1)
for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
index 306011dc80..13738b20e1 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
@@ -88,8 +88,9 @@
wanted_objects = list(/obj/item/pen/survival, /obj/item/stack/ore/diamond)
field_of_vision_type = FOV_270_DEGREES //Obviously, it's one eyeball.
-/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/Life()
- . = ..()
+/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(stat == CONSCIOUS)
consume_bait()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
index e662f4e525..80489e0e40 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
@@ -97,9 +97,8 @@
if(CALL_CHILDREN)
call_children()
-/mob/living/simple_animal/hostile/asteroid/elite/broodmother/Life()
- . = ..()
- if(!.) //Checks if they are dead as a rock.
+/mob/living/simple_animal/hostile/asteroid/elite/broodmother/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
if(health < maxHealth * 0.5 && rand_tent < world.time)
rand_tent = world.time + 30
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
index ebbf032859..cdef0c50d3 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
@@ -95,8 +95,9 @@
if(AOE_SQUARES)
aoe_squares(target)
-/mob/living/simple_animal/hostile/asteroid/elite/pandora/Life()
- . = ..()
+/mob/living/simple_animal/hostile/asteroid/elite/pandora/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(health >= maxHealth * 0.5)
cooldown_time = 20
return
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
index a61f1924c8..5f6c21bbbd 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
@@ -39,8 +39,9 @@
footstep_type = FOOTSTEP_MOB_HEAVY
-/mob/living/simple_animal/hostile/asteroid/goliath/Life()
- . = ..()
+/mob/living/simple_animal/hostile/asteroid/goliath/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
handle_preattack()
/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack()
@@ -129,9 +130,8 @@
var/turf/last_location
var/tentacle_recheck_cooldown = 100
-/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/Life()
- . = ..()
- if(!.) // dead
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
if(isturf(loc))
if(!LAZYLEN(cached_tentacle_turfs) || loc != last_location || tentacle_recheck_cooldown <= world.time)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
index c9e650531c..69d4ebe4df 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
@@ -114,8 +114,9 @@
name = "guthen"
gender = FEMALE
-/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/Life()
- ..()
+/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(udder.reagents.total_volume == udder.reagents.maximum_volume) //Only breed when we're full.
make_babies()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index d21e39ef54..c371242bf2 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -196,12 +196,13 @@
swarming = TRUE
var/can_infest_dead = FALSE
-/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life()
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(isturf(loc))
for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile
if(H.stat == UNCONSCIOUS || (can_infest_dead && H.stat == DEAD))
infest(H)
- ..()
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H)
visible_message("[name] burrows into the flesh of [H]!")
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm
index 66241e3d75..d40cd8636c 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm
@@ -62,9 +62,10 @@
SLEEP_CHECK_DEATH(8)
return ..()
-/mob/living/simple_animal/hostile/asteroid/ice_demon/Life()
- . = ..()
- if(!. || target)
+/mob/living/simple_animal/hostile/asteroid/ice_demon/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
+ if(target)
return
adjustHealth(-maxHealth*0.025)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm
index b62fb4a665..7214fd71e0 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm
@@ -43,9 +43,10 @@
var/list/burn_turfs = getline(src, T) - get_turf(src)
dragon_fire_line(src, burn_turfs)
-/mob/living/simple_animal/hostile/asteroid/ice_whelp/Life()
- . = ..()
- if(!. || target)
+/mob/living/simple_animal/hostile/asteroid/ice_whelp/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
+ if(target)
return
adjustHealth(-maxHealth*0.025)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm
index ac2ce37d3f..de9464cc16 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm
@@ -44,9 +44,10 @@
aggressive_message_said = TRUE
rapid_melee = 2
-/mob/living/simple_animal/hostile/asteroid/polarbear/Life()
- . = ..()
- if(!. || target)
+/mob/living/simple_animal/hostile/asteroid/polarbear/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
+ if(target)
return
adjustHealth(-maxHealth*0.025)
aggressive_message_said = FALSE
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm
index 013a75be75..8c4db48434 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm
@@ -51,9 +51,10 @@
retreat_message_said = TRUE
retreat_distance = 30
-/mob/living/simple_animal/hostile/asteroid/wolf/Life()
- . = ..()
- if(!. || target)
+/mob/living/simple_animal/hostile/asteroid/wolf/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
+ if(target)
return
adjustHealth(-maxHealth*0.025)
retreat_message_said = FALSE
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index 1b13200729..4c9afd3784 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -48,8 +48,9 @@
else
. += "It looks like it's been roughed up."
-/mob/living/simple_animal/hostile/mushroom/Life()
- ..()
+/mob/living/simple_animal/hostile/mushroom/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(!stat)//Mushrooms slowly regenerate if conscious, for people who want to save them from being eaten
adjustBruteLoss(-2)
diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
index ca5d047326..1db6854f96 100644
--- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm
+++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
@@ -46,8 +46,9 @@
var/chosen_sound = pick(migo_sounds)
playsound(src, chosen_sound, 100, TRUE)
-/mob/living/simple_animal/hostile/netherworld/migo/Life()
- ..()
+/mob/living/simple_animal/hostile/netherworld/migo/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(stat)
return
if(prob(10))
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index 35f2817028..03aac4037a 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -51,8 +51,9 @@
..()
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE)
-/mob/living/simple_animal/hostile/retaliate/clown/Life()
- . = ..()
+/mob/living/simple_animal/hostile/retaliate/clown/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(banana_time && banana_time < world.time)
var/turf/T = get_turf(src)
var/list/adjacent = T.GetAtmosAdjacentTurfs(1)
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index 23304a2ef3..3490d757a1 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -82,8 +82,9 @@
return 0
return ..()
-/mob/living/simple_animal/hostile/statue/Life()
- ..()
+/mob/living/simple_animal/hostile/statue/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(!client && target) // If we have a target and we're AI controlled
var/mob/watching = can_be_seen()
// If they're not our target
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index 3aa3c9e566..f65f1613c9 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -44,8 +44,9 @@
gold_core_spawnable = HOSTILE_SPAWN
del_on_death = 1
-/mob/living/simple_animal/hostile/tree/Life()
- ..()
+/mob/living/simple_animal/hostile/tree/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(isopenturf(loc))
var/turf/open/T = src.loc
if(T.air && T.air.gases[/datum/gas/carbon_dioxide])
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 5111b0b180..fdb088934c 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
@@ -100,8 +100,9 @@
/mob/living/simple_animal/hostile/venus_human_trap/ghost_playable
playable_plant = TRUE //For admins that want to buss some harmless plants
-/mob/living/simple_animal/hostile/venus_human_trap/Life()
- . = ..()
+/mob/living/simple_animal/hostile/venus_human_trap/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
pull_vines()
/mob/living/simple_animal/hostile/venus_human_trap/AttackingTarget()
diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
index 5c881a7b0d..dc6154c05e 100644
--- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
+++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
@@ -47,12 +47,13 @@
QDEL_NULL(E)
return ..()
-/mob/living/simple_animal/hostile/asteroid/fugu/Life()
+/mob/living/simple_animal/hostile/asteroid/fugu/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(!wumbo)
inflate_cooldown = max((inflate_cooldown - 1), 0)
if(target && AIStatus == AI_ON)
E.Activate()
- ..()
/mob/living/simple_animal/hostile/asteroid/fugu/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
if(!forced && wumbo)
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index e8d6411c01..de8a6fb6a0 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -357,9 +357,9 @@
/*
* AI - Not really intelligent, but I'm calling it AI anyway.
*/
-/mob/living/simple_animal/parrot/Life()
- ..()
-
+/mob/living/simple_animal/parrot/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
//Sprite update for when a parrot gets pulled
if(pulledby && !stat && parrot_state != PARROT_WANDER)
if(buckled)
@@ -369,8 +369,6 @@
parrot_state = PARROT_WANDER
pixel_x = initial(pixel_x)
pixel_y = initial(pixel_y)
- return
-
//-----SPEECH
/* Parrot speech mimickry!
@@ -911,11 +909,12 @@
if(. && !client && prob(1) && prob(1)) //Only the one true bird may speak across dimensions.
world.TgsTargetedChatBroadcast("A stray squawk is heard... \"[message]\"", FALSE)
-/mob/living/simple_animal/parrot/Poly/Life()
+/mob/living/simple_animal/parrot/Poly/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
+ return
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory(FALSE)
memory_saved = TRUE
- ..()
/mob/living/simple_animal/parrot/Poly/death(gibbed)
if(!memory_saved)
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index 6e8c79c3d0..9cc385fc77 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -7,19 +7,17 @@
var/SStun = 0 // stun variable
-/mob/living/simple_animal/slime/Life()
- set invisibility = 0
- if (notransform)
+/mob/living/simple_animal/slime/BiologicalLife(seconds, times_fired)
+ if(!(. = ..()))
return
- if(..())
- if(buckled)
- handle_feeding()
- if(!stat) // Slimes in stasis don't lose nutrition, don't change mood and don't respond to speech
- handle_nutrition()
- handle_targets()
- if (!ckey)
- handle_mood()
- handle_speech()
+ if(buckled)
+ handle_feeding()
+ if(!stat) // Slimes in stasis don't lose nutrition, don't change mood and don't respond to speech
+ handle_nutrition()
+ handle_targets()
+ if (!ckey)
+ handle_mood()
+ handle_speech()
// Unlike most of the simple animals, slimes support UNCONSCIOUS
/mob/living/simple_animal/slime/update_stat()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 4c692e7175..c5d2a34f89 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -678,7 +678,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
return FALSE
if(anchored)
return FALSE
- if(notransform)
+ if(mob_transforming)
return FALSE
if(restrained())
return FALSE
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 9dcfb4e99a..dbf7b7f350 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -37,7 +37,9 @@
var/next_move = null
var/create_area_cooldown
- var/notransform = null //Carbon
+ /// Whether or not the mob is currently being transformed into another mob or into another state of being. This will prevent it from moving or doing realistically anything.
+ /// Don't you DARE use this for a cheap way to ensure someone is stunned in your code.
+ var/mob_transforming = FALSE
var/eye_blind = 0 //Carbon
var/eye_blurry = 0 //Carbon
var/real_name = null
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 9867da1ed4..e977c397c9 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -32,7 +32,7 @@
if(!n || !direction || !mob?.loc)
return FALSE
//GET RID OF THIS SOON AS MOBILITY FLAGS IS DONE
- if(mob.notransform)
+ if(mob.mob_transforming)
return FALSE
if(mob.control_object)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 56ec5bb816..5fd94c8a89 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -1,5 +1,5 @@
/mob/living/carbon/proc/monkeyize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG))
- if (notransform)
+ if (mob_transforming)
return
//Handle items on mob
@@ -29,7 +29,7 @@
dropItemToGround(W)
//Make mob invisible and spawn animation
- notransform = TRUE
+ mob_transforming = TRUE
Stun(INFINITY, ignore_canstun = TRUE)
icon = null
cut_overlays()
@@ -150,7 +150,7 @@
//Could probably be merged with monkeyize but other transformations got their own procs, too
/mob/living/carbon/proc/humanize(tr_flags = (TR_KEEPITEMS | TR_KEEPVIRUS | TR_DEFAULTMSG))
- if (notransform)
+ if (mob_transforming)
return
//Handle items on mob
@@ -185,7 +185,7 @@
//Make mob invisible and spawn animation
- notransform = TRUE
+ mob_transforming = TRUE
Stun(22, ignore_canstun = TRUE)
icon = null
cut_overlays()
@@ -304,7 +304,7 @@
qdel(src)
/mob/living/carbon/human/AIize()
- if (notransform)
+ if (mob_transforming)
return
for(var/t in bodyparts)
qdel(t)
@@ -312,12 +312,12 @@
return ..()
/mob/living/carbon/AIize()
- if(notransform)
+ if(mob_transforming)
return
for(var/obj/item/W in src)
dropItemToGround(W)
regenerate_icons()
- notransform = TRUE
+ mob_transforming = TRUE
Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
@@ -353,7 +353,7 @@
qdel(src)
/mob/living/carbon/human/proc/Robotize(delete_items = 0, transfer_after = TRUE)
- if (notransform)
+ if (mob_transforming)
return
for(var/obj/item/W in src)
if(delete_items)
@@ -361,7 +361,7 @@
else
dropItemToGround(W)
regenerate_icons()
- notransform = TRUE
+ mob_transforming = TRUE
Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
@@ -398,12 +398,12 @@
//human -> alien
/mob/living/carbon/human/proc/Alienize(mind_transfer = TRUE)
- if (notransform)
+ if (mob_transforming)
return
for(var/obj/item/W in src)
dropItemToGround(W)
regenerate_icons()
- notransform = 1
+ mob_transforming = 1
Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
@@ -432,12 +432,12 @@
qdel(src)
/mob/living/carbon/human/proc/slimeize(reproduce, mind_transfer = TRUE)
- if (notransform)
+ if (mob_transforming)
return
for(var/obj/item/W in src)
dropItemToGround(W)
regenerate_icons()
- notransform = 1
+ mob_transforming = 1
Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
@@ -477,12 +477,12 @@
/mob/living/carbon/human/proc/corgize(mind_transfer = TRUE)
- if (notransform)
+ if (mob_transforming)
return
for(var/obj/item/W in src)
dropItemToGround(W)
regenerate_icons()
- notransform = TRUE
+ mob_transforming = TRUE
Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
@@ -501,7 +501,7 @@
qdel(src)
/mob/living/carbon/proc/gorillize(mind_transfer = TRUE)
- if(notransform)
+ if(mob_transforming)
return
SSblackbox.record_feedback("amount", "gorillas_created", 1)
@@ -512,7 +512,7 @@
dropItemToGround(W, TRUE)
regenerate_icons()
- notransform = TRUE
+ mob_transforming = TRUE
Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
@@ -535,13 +535,13 @@
if(mind)
mind_transfer = alert("Want to transfer their mind into the new mob", "Mind Transfer", "Yes", "No") == "Yes" ? TRUE : FALSE
- if(notransform)
+ if(mob_transforming)
return
for(var/obj/item/W in src)
dropItemToGround(W)
regenerate_icons()
- notransform = TRUE
+ mob_transforming = TRUE
Paralyze(INFINITY)
icon = null
invisibility = INVISIBILITY_MAXIMUM
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index f84b639d68..d5b19b495c 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -299,8 +299,8 @@
//siemens_coeff - layman's terms, conductivity
//dist_check - set to only shock mobs within 1 of source (vendors, airlocks, etc.)
//No animations will be performed by this proc.
-/proc/electrocute_mob(mob/living/carbon/M, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE)
- if(!M || ismecha(M.loc))
+/proc/electrocute_mob(mob/living/M, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE)
+ if(!istype(M) || ismecha(M.loc))
return 0 //feckin mechs are dumb
if(dist_check)
if(!in_range(source,M))
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index 34572d609d..004f78235a 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -144,13 +144,13 @@
user.visible_message("[user] aims [src] at the ground! It looks like [user.p_theyre()] performing a sick rocket jump!", \
"You aim [src] at the ground to perform a bisnasty rocket jump...")
if(can_shoot())
- user.notransform = TRUE
+ user.mob_transforming = TRUE
playsound(src, 'sound/vehicles/rocketlaunch.ogg', 80, 1, 5)
animate(user, pixel_z = 300, time = 30, easing = LINEAR_EASING)
sleep(70)
animate(user, pixel_z = 0, time = 5, easing = LINEAR_EASING)
sleep(5)
- user.notransform = FALSE
+ user.mob_transforming = FALSE
process_fire(user, user, TRUE)
if(!QDELETED(user)) //if they weren't gibbed by the explosion, take care of them for good.
user.gib()
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 493a02d74c..7ef52aef25 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -121,10 +121,10 @@
qdel(src)
/proc/wabbajack(mob/living/M)
- if(!istype(M) || M.stat == DEAD || M.notransform || (GODMODE & M.status_flags))
+ if(!istype(M) || M.stat == DEAD || M.mob_transforming || (GODMODE & M.status_flags))
return
- M.notransform = TRUE
+ M.mob_transforming = TRUE
M.Paralyze(INFINITY)
M.icon = null
M.cut_overlays()
diff --git a/code/modules/reagents/reagent_containers/chem_pack.dm b/code/modules/reagents/reagent_containers/chem_pack.dm
new file mode 100644
index 0000000000..35ec588ec5
--- /dev/null
+++ b/code/modules/reagents/reagent_containers/chem_pack.dm
@@ -0,0 +1,51 @@
+/obj/item/reagent_containers/chem_pack
+ name = "intravenous medicine bag"
+ desc = "A plastic pressure bag, or 'chem pack', for IV administration of drugs. It is fitted with a thermosealing strip."
+ icon = 'icons/obj/bloodpack.dmi'
+ icon_state = "chempack"
+ volume = 100
+ reagent_flags = OPENCONTAINER
+ spillable = TRUE
+ obj_flags = UNIQUE_RENAME
+ resistance_flags = ACID_PROOF
+ var/sealed = FALSE
+
+/obj/item/reagent_containers/chem_pack/on_reagent_change(changetype)
+ update_icon()
+
+/obj/item/reagent_containers/chem_pack/update_icon()
+ cut_overlays()
+
+ var/v = min(round(reagents.total_volume / volume * 10), 10)
+ if(v > 0)
+ var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "chempack1")
+ filling.icon_state = "chempack[v]"
+ filling.color = mix_color_from_reagents(reagents.reagent_list)
+ add_overlay(filling)
+
+/obj/item/reagent_containers/chem_pack/AltClick(mob/living/user)
+ if(user.canUseTopic(src, BE_CLOSE, NO_DEXTERY) && !sealed)
+ if(iscarbon(user) && (HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)))
+ to_chat(user, "Uh... whoops! You accidentally spill the content of the bag onto yourself.")
+ SplashReagents(user)
+ return
+ else
+ DISABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
+ ENABLE_BITFIELD(reagents.reagents_holder_flags, DRAWABLE |INJECTABLE )
+ spillable = FALSE
+ sealed = TRUE
+ to_chat(user, "You seal the bag.")
+
+
+/obj/item/reagent_containers/chem_pack/examine()
+ . = ..()
+ if(sealed)
+ . += "The bag is sealed shut."
+ else
+ . += "Alt-click to seal it."
+
+
+obj/item/reagent_containers/chem_pack/attack_self(mob/user)
+ if(sealed)
+ return
+ ..()
\ No newline at end of file
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 69bf039428..e1e55f3476 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -212,6 +212,16 @@
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+/datum/design/chem_pack
+ name = "Intravenous Medicine Bag"
+ desc = "A plastic pressure bag for IV administration of drugs."
+ id = "chem_pack"
+ build_type = PROTOLATHE
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+ materials = list(/datum/material/plastic = 1500)
+ build_path = /obj/item/reagent_containers/chem_pack
+ category = list("Medical Designs")
+
/datum/design/cloning_disk
name = "Cloning Data Disk"
desc = "Produce additional disks for storing genetic data."
diff --git a/code/modules/research/techweb/nodes/biotech_nodes.dm b/code/modules/research/techweb/nodes/biotech_nodes.dm
index 8f7d978a99..977f8685d6 100644
--- a/code/modules/research/techweb/nodes/biotech_nodes.dm
+++ b/code/modules/research/techweb/nodes/biotech_nodes.dm
@@ -5,7 +5,7 @@
display_name = "Biological Technology"
description = "What makes us tick." //the MC, silly!
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","genescanner")
+ 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","genescanner","chem_pack")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/adv_biotech
diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm
index 70b0545ded..92e24e3bc4 100644
--- a/code/modules/ruins/lavalandruin_code/puzzle.dm
+++ b/code/modules/ruins/lavalandruin_code/puzzle.dm
@@ -289,7 +289,7 @@
/obj/effect/sliding_puzzle/prison/dispense_reward()
prisoner.forceMove(get_turf(src))
- prisoner.notransform = FALSE
+ prisoner.mob_transforming = FALSE
prisoner = null
//Some armor so it's harder to kill someone by mistake.
@@ -329,7 +329,7 @@
return FALSE
//First grab the prisoner and move them temporarily into the generator so they won't get thrown around.
- prisoner.notransform = TRUE
+ prisoner.mob_transforming = TRUE
prisoner.forceMove(cube)
to_chat(prisoner,"You're trapped by the prison cube! You will remain trapped until someone solves it.")
@@ -350,4 +350,4 @@
//Move them into random block
var/obj/structure/puzzle_element/E = pick(cube.elements)
prisoner.forceMove(E)
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
index a60d564631..ec5e98b2e6 100644
--- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm
+++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
@@ -413,13 +413,13 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
. = ..()
if(ismob(AM))
var/mob/M = AM
- M.notransform = TRUE
+ M.mob_transforming = TRUE
/obj/item/abstracthotelstorage/Exited(atom/movable/AM, atom/newLoc)
. = ..()
if(ismob(AM))
var/mob/M = AM
- M.notransform = FALSE
+ M.mob_transforming = FALSE
//Space Ruin stuff
/area/ruin/space/has_grav/hilbertresearchfacility
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index b782eccfcc..bce2da74e4 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -507,7 +507,7 @@
if(M.mind && !istype(t, /turf/open/floor/plasteel/shuttle/red) && !istype(t, /turf/open/floor/mineral/plastitanium/red/brig))
M.mind.force_escaped = TRUE
// Ghostize them and put them in nullspace stasis (for stat & possession checks)
- M.notransform = TRUE
+ M.mob_transforming = TRUE
M.ghostize(FALSE)
M.moveToNullspace()
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index a4ef2dfde9..7af0315934 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -101,6 +101,10 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
if(!SSshuttle.shoppinglist.len)
return
+ var/list/obj/miscboxes = list() //miscboxes are combo boxes that contain all goody orders grouped
+ var/list/misc_order_num = list() //list of strings of order numbers, so that the manifest can show all orders in a box
+ var/list/misc_contents = list() //list of lists of items that each box will contain
+
var/list/empty_turfs = list()
for(var/place in shuttle_areas)
var/area/shuttle/shuttle_area = place
@@ -117,10 +121,13 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
break
var/price = SO.pack.cost
+ if(SO.applied_coupon)
+ price *= (1 - SO.applied_coupon.discount_pct_off)
var/datum/bank_account/D
if(SO.paying_account) //Someone paid out of pocket
D = SO.paying_account
- price *= 1.1 //TODO make this customizable by the quartermaster
+ if(!SO.pack.goody)
+ price *= 1.1 //TODO make this customizable by the quartermaster
else
D = cargo_budget
if(D)
@@ -136,14 +143,46 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
value += SO.pack.cost
SSshuttle.shoppinglist -= SO
SSshuttle.orderhistory += SO
+ QDEL_NULL(SO.applied_coupon)
+
+ if(SO.pack.goody) //goody means it gets piled in the miscbox
+ if(SO.paying_account)
+ if(!miscboxes.len || !miscboxes[D.account_holder]) //if there's no miscbox for this person
+ miscboxes[D.account_holder] = new /obj/item/storage/lockbox/order(pick_n_take(empty_turfs))
+ var/obj/item/storage/lockbox/order/our_box = miscboxes[D.account_holder]
+ our_box.buyer_account = SO.paying_account
+ miscboxes[D.account_holder].name = "small items case - purchased by [D.account_holder]"
+ misc_contents[D.account_holder] = list()
+ for (var/item in SO.pack.contains)
+ misc_contents[D.account_holder] += item
+ misc_order_num[D.account_holder] = "[misc_order_num[D.account_holder]]#[SO.id] "
+ else //No private payment, so we just stuff it all into a generic crate
+ if(!miscboxes.len || !miscboxes["Cargo"])
+ miscboxes["Cargo"] = new /obj/structure/closet/secure_closet/goodies(pick_n_take(empty_turfs))
+ miscboxes["Cargo"].name = "small items closet"
+ misc_contents["Cargo"] = list()
+ miscboxes["Cargo"].req_access = list()
+ for (var/item in SO.pack.contains)
+ misc_contents["Cargo"] += item
+ //new item(miscboxes["Cargo"])
+ if(SO.pack.access)
+ miscboxes["Cargo"].req_access += SO.pack.access
+ misc_order_num["Cargo"] = "[misc_order_num["Cargo"]]#[SO.id] "
+ else
+ SO.generate(pick_n_take(empty_turfs))
- SO.generate(pick_n_take(empty_turfs))
SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[SO.pack.cost]", "[SO.pack.name]"))
investigate_log("Order #[SO.id] ([SO.pack.name], placed by [key_name(SO.orderer_ckey)]), paid by [D.account_holder] has shipped.", INVESTIGATE_CARGO)
if(SO.pack.dangerous)
message_admins("\A [SO.pack.name] ordered by [ADMIN_LOOKUPFLW(SO.orderer_ckey)], paid by [D.account_holder] has shipped.")
purchases++
+ for(var/I in miscboxes)
+ var/datum/supply_order/SO = new/datum/supply_order()
+ SO.id = misc_order_num[I]
+ SO.generateCombo(miscboxes[I], I, misc_contents[I])
+ qdel(SO)
+
investigate_log("[purchases] orders in this shipment, worth [value] credits. [cargo_budget.account_balance] credits left.", INVESTIGATE_CARGO)
/obj/docking_port/mobile/supply/proc/sell()
diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm
index 34b033fd17..438c762ef6 100644
--- a/code/modules/spells/spell_types/devil.dm
+++ b/code/modules/spells/spell_types/devil.dm
@@ -118,14 +118,14 @@
revert_cast()
return ..()
else
- user.notransform = TRUE
+ user.mob_transforming = TRUE
user.fakefire()
to_chat(src, "You begin to phase back into sinful flames.")
if(do_mob(user,user,150))
user.infernalphaseout()
else
to_chat(user, "You must remain still while exiting.")
- user.notransform = FALSE
+ user.mob_transforming = FALSE
user.fakefireextinguish()
start_recharge()
return
@@ -149,11 +149,11 @@
ExtinguishMob()
forceMove(holder)
holder = holder
- notransform = 0
+ mob_transforming = 0
fakefireextinguish()
/mob/living/proc/infernalphasein()
- if(notransform)
+ if(mob_transforming)
to_chat(src, "You're too busy to jaunt in.")
return FALSE
fakefire()
diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm
index f485ae578f..8cf51d45c6 100644
--- a/code/modules/spells/spell_types/ethereal_jaunt.dm
+++ b/code/modules/spells/spell_types/ethereal_jaunt.dm
@@ -22,14 +22,14 @@
INVOKE_ASYNC(src, .proc/do_jaunt, target)
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/do_jaunt(mob/living/target)
- target.notransform = 1
+ target.mob_transforming = 1
var/turf/mobloc = get_turf(target)
var/obj/effect/dummy/phased_mob/spell_jaunt/holder = new /obj/effect/dummy/phased_mob/spell_jaunt(mobloc)
new jaunt_out_type(mobloc, target.dir)
target.ExtinguishMob()
target.forceMove(holder)
target.reset_perspective(holder)
- target.notransform=0 //mob is safely inside holder now, no need for protection.
+ target.mob_transforming=0 //mob is safely inside holder now, no need for protection.
jaunt_steam(mobloc)
sleep(jaunt_duration)
@@ -102,4 +102,4 @@
return
/obj/effect/dummy/phased_mob/spell_jaunt/bullet_act(blah)
- return BULLET_ACT_FORCE_PIERCE
\ No newline at end of file
+ return BULLET_ACT_FORCE_PIERCE
diff --git a/code/modules/spells/spell_types/rod_form.dm b/code/modules/spells/spell_types/rod_form.dm
index 7a96d0ac55..6b974608d6 100644
--- a/code/modules/spells/spell_types/rod_form.dm
+++ b/code/modules/spells/spell_types/rod_form.dm
@@ -18,7 +18,7 @@
W.damage_bonus += spell_level * 20 //You do more damage when you upgrade the spell
W.start_turf = start
M.forceMove(W)
- M.notransform = 1
+ M.mob_transforming = 1
M.status_flags |= GODMODE
//Wizard Version of the Immovable Rod
@@ -37,7 +37,7 @@
/obj/effect/immovablerod/wizard/Destroy()
if(wizard)
wizard.status_flags &= ~GODMODE
- wizard.notransform = 0
+ wizard.mob_transforming = 0
wizard.forceMove(get_turf(src))
return ..()
diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm
index c6966ccee9..a8f9c8bce5 100644
--- a/code/modules/spells/spell_types/shapeshift.dm
+++ b/code/modules/spells/spell_types/shapeshift.dm
@@ -100,7 +100,7 @@
if(stored.mind)
stored.mind.transfer_to(shape)
stored.forceMove(src)
- stored.notransform = TRUE
+ stored.mob_transforming = TRUE
if(source.convert_damage)
var/damage_percent = (stored.maxHealth - stored.health)/stored.maxHealth;
var/damapply = damage_percent * shape.maxHealth;
@@ -148,7 +148,7 @@
restoring = TRUE
qdel(slink)
stored.forceMove(get_turf(src))
- stored.notransform = FALSE
+ stored.mob_transforming = FALSE
if(shape.mind)
shape.mind.transfer_to(stored)
if(death)
diff --git a/code/modules/uplink/uplink_items/uplink_bundles.dm b/code/modules/uplink/uplink_items/uplink_bundles.dm
index 321b9121bc..d40e2fcbda 100644
--- a/code/modules/uplink/uplink_items/uplink_bundles.dm
+++ b/code/modules/uplink/uplink_items/uplink_bundles.dm
@@ -193,6 +193,8 @@
var/datum/uplink_item/I = uplink_items[category][item]
if(src == I || !I.item)
continue
+ if(istype(I, /datum/uplink_item/bundles_TC/reroll)) //oops!
+ continue
if(U.telecrystals < I.cost)
continue
if(I.limited_stock == 0)
diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm
index 4a0e2f0b58..d125453e5a 100644
--- a/code/modules/vehicles/atv.dm
+++ b/code/modules/vehicles/atv.dm
@@ -68,7 +68,7 @@
/obj/vehicle/ridden/atv/snowmobile/Moved()
. = ..()
- var/static/list/snow_typecache = typecacheof(list(/turf/open/floor/plating/asteroid/snow/icemoon, /turf/open/floor/plating/snowed/smoothed/icemoon))
+ var/static/list/snow_typecache = typecacheof(list(/turf/open/floor/plating/asteroid/snow/icemoon, /turf/open/floor/plating/snowed/smoothed/icemoon, /turf/open/floor/plating/snowed, /turf/open/floor/plating/asteroid/snow))
var/datum/component/riding/E = LoadComponent(/datum/component/riding)
if(snow_typecache[loc.type])
E.vehicle_move_delay = 1
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 6e6636cd62..b9d60af1b6 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -105,6 +105,12 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
///Last world tick we sent a slogan message out
var/last_slogan
var/last_shopper
+ var/tilted = FALSE
+ var/tiltable = TRUE
+ var/squish_damage = 75
+ var/forcecrit = 0
+ var/num_shards = 7
+ var/list/pinned_mobs = list()
///How many ticks until we can send another
var/slogan_delay = 6000
///Icon when vending an item to the user
@@ -372,6 +378,7 @@ GLOBAL_LIST_EMPTY(vending_products)
..()
if(panel_open)
default_unfasten_wrench(user, I, time = 60)
+ unbuckle_all_mobs(TRUE)
return TRUE
/obj/machinery/vending/screwdriver_act(mob/living/user, obj/item/I)
@@ -435,6 +442,133 @@ GLOBAL_LIST_EMPTY(vending_products)
updateUsrDialog()
else
. = ..()
+ if(tiltable && !tilted && I.force)
+ switch(rand(1, 100))
+ if(1 to 5)
+ freebie(user, 3)
+ if(6 to 15)
+ freebie(user, 2)
+ if(16 to 25)
+ freebie(user, 1)
+ if(76 to 90)
+ tilt(user)
+ if(91 to 100)
+ tilt(user, crit=TRUE)
+
+/obj/machinery/vending/proc/freebie(mob/fatty, freebies)
+ visible_message("[src] yields [freebies > 1 ? "several free goodies" : "a free goody"]!")
+
+ for(var/i in 1 to freebies)
+ playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3)
+ for(var/datum/data/vending_product/R in shuffle(product_records))
+
+ if(R.amount <= 0) //Try to use a record that actually has something to dump.
+ continue
+ var/dump_path = R.product_path
+ if(!dump_path)
+ continue
+
+ R.amount--
+ new dump_path(get_turf(src))
+ break
+
+/obj/machinery/vending/proc/tilt(mob/fatty, crit=FALSE)
+ visible_message("[src] tips over!")
+ tilted = TRUE
+ layer = ABOVE_MOB_LAYER
+
+ var/crit_case
+ if(crit)
+ crit_case = rand(1,5)
+
+ if(forcecrit)
+ crit_case = forcecrit
+
+ if(in_range(fatty, src))
+ for(var/mob/living/L in get_turf(fatty))
+ var/mob/living/carbon/C = L
+
+ if(istype(C))
+ var/crit_rebate = 0 // lessen the normal damage we deal for some of the crits
+
+ if(crit_case != 5) // the head asplode case has its own description
+ C.visible_message("[C] is crushed by [src]!", \
+ "You are crushed by [src]!")
+
+ switch(crit_case) // only carbons can have the fun crits
+ if(1) // shatter their legs and bleed 'em
+ crit_rebate = 60
+ C.bleed(150)
+ var/obj/item/bodypart/l_leg/l = C.get_bodypart(BODY_ZONE_L_LEG)
+ if(l)
+ l.receive_damage(brute=200, updating_health=TRUE)
+ var/obj/item/bodypart/r_leg/r = C.get_bodypart(BODY_ZONE_R_LEG)
+ if(r)
+ r.receive_damage(brute=200, updating_health=TRUE)
+ if(l || r)
+ C.visible_message("[C]'s legs shatter with a sickening crunch!", \
+ "Your legs shatter with a sickening crunch!")
+ if(2) // pin them beneath the machine until someone untilts it
+ forceMove(get_turf(C))
+ buckle_mob(C, force=TRUE)
+ C.visible_message("[C] is pinned underneath [src]!", \
+ "You are pinned down by [src]!")
+ if(3) // glass candy
+ crit_rebate = 50
+ for(var/i = 0, i < num_shards, i++)
+ var/obj/item/shard/shard = new /obj/item/shard(get_turf(C))
+ shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult=1, pain_chance=5)
+ shard.updateEmbedding()
+ C.hitby(shard, skipcatch = TRUE, hitpush = FALSE)
+ shard.embedding = list()
+ shard.updateEmbedding()
+ if(4) // paralyze this binch
+ // the new paraplegic gets like 4 lines of losing their legs so skip them
+ visible_message("[C]'s spinal cord is obliterated with a sickening crunch!", ignored_mobs = list(C))
+ C.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic)
+ if(5) // skull squish!
+ var/obj/item/bodypart/head/O = C.get_bodypart(BODY_ZONE_HEAD)
+ if(O)
+ C.visible_message("[O] explodes in a shower of gore beneath [src]!", \
+ "Oh f-")
+ O.dismember()
+ O.drop_organs()
+ qdel(O)
+ new /obj/effect/gibspawner/human/bodypartless(get_turf(C))
+
+ C.apply_damage(max(0, squish_damage - crit_rebate), forced=TRUE, spread_damage=TRUE)
+ C.AddElement(/datum/element/squish, 18 SECONDS)
+ else
+ L.visible_message("[L] is crushed by [src]!", \
+ "You are crushed by [src]!")
+ L.apply_damage(squish_damage, forced=TRUE)
+ if(crit_case)
+ L.apply_damage(squish_damage, forced=TRUE)
+
+ L.Paralyze(60)
+ L.emote("scream")
+ playsound(L, 'sound/effects/blobattack.ogg', 40, TRUE)
+ playsound(L, 'sound/effects/splat.ogg', 50, TRUE)
+
+ var/matrix/M = matrix()
+ M.Turn(pick(90, 270))
+ transform = M
+
+ if(get_turf(fatty) != get_turf(src))
+ throw_at(get_turf(fatty), 1, 1, spin=FALSE)
+
+/obj/machinery/vending/proc/untilt(mob/user)
+ user.visible_message("[user] rights [src].", \
+ "You right [src].")
+
+ unbuckle_all_mobs(TRUE)
+
+ tilted = FALSE
+ layer = initial(layer)
+
+ var/matrix/M = matrix()
+ M.Turn(0)
+ transform = M
/obj/machinery/vending/proc/loadingAttempt(obj/item/I, mob/user)
. = TRUE
@@ -447,6 +581,12 @@ GLOBAL_LIST_EMPTY(vending_products)
to_chat(user, "You insert [I] into [src]'s input compartment.")
loaded_items++
+
+/obj/machinery/vending/unbuckle_mob(mob/living/buckled_mob, force=FALSE)
+ if(!force)
+ return
+ . = ..()
+
/**
* Is the passed in user allowed to load this vending machines compartments
*
@@ -511,12 +651,13 @@ GLOBAL_LIST_EMPTY(vending_products)
if(seconds_electrified && !(stat & NOPOWER))
if(shock(user, 100))
return
+ if(tilted && !user.buckled && !isAI(user))
+ to_chat(user, "You begin righting [src].")
+ if(do_after(user, 50, target=src))
+ untilt(user)
+ return
return ..()
-/obj/machinery/vending/ui_base_html(html)
- var/datum/asset/spritesheet/assets = get_asset_datum(/datum/asset/spritesheet/vending)
- . = replacetext(html, "", assets.css_tag())
-
/obj/machinery/vending/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
@@ -922,7 +1063,7 @@ GLOBAL_LIST_EMPTY(vending_products)
C = H.get_idcard(TRUE)
if(C?.registered_account)
private_a = C.registered_account
- say("\The [src] has been linked to [C].")
+ say("[src] has been linked to [C].")
if(compartmentLoadAccessCheck(user))
if(istype(I, /obj/item/pen))
diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm
index 694d2b0c34..09719e1d56 100644
--- a/code/modules/vending/medical_wall.dm
+++ b/code/modules/vending/medical_wall.dm
@@ -22,6 +22,7 @@
extra_price = PRICE_NORMAL
payment_department = ACCOUNT_MED
cost_multiplier_per_dept = list(ACCOUNT_MED = 0)
+ tiltable = FALSE
/obj/item/vending_refill/wallmed
machine_name = "NanoMed"
diff --git a/config/awaymissionconfig.txt b/config/awaymissionconfig.txt
index c6a5d9ef8f..ef30ba732e 100644
--- a/config/awaymissionconfig.txt
+++ b/config/awaymissionconfig.txt
@@ -19,4 +19,4 @@
#_maps/RandomZLevels/away_mission/caves.dmm
#_maps/RandomZLevels/away_mission/snowdin.dmm
#_maps/RandomZLevels/away_mission/research.dmm
-#_maps/RandomZLevels/away_mission/Cabin.dmm
+#_maps/RandomZLevels/away_mission/SnowCabin.dmm
diff --git a/html/changelog.html b/html/changelog.html
index 248425b507..2ba1b142a1 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,60 @@
-->
+
24 June 2020
+
DeltaFire15 updated:
+
+ - Choosing a random item in your uplink will no longer sometimes reroll your contract.
+ - Syndicate crate event cannot fire as a random event anymore.
+
+
Detective-Google updated:
+
+ - singulos no longer succ infinite rods out of the ice
+ - one of the directions for the diag hudpatch was blu instead of orang
+
+
timothyteakettle updated:
+
+ - bonfires/grills no longer produce infinite quantities of food
+ - slime's alter form ability now updates their hair colour when changing their body colour
+
+
+
22 June 2020
+
Ghommie (porting PRs by zxaber, Ryll-Ryll, AnturK) updated:
+
+ - Certain small items purchased through cargo now get grouped into a single box. They also are immune to the 10% private account fee.
+ - Added single-order options for several existing products in the Cargo Catalog.
+ - Medkit listings are now single-pack items, and considered small items that get grouped into single boxes. Price for medkits is as close to unchanged as is reasonable.
+ - You can now beat on vending machines to try and knock loose free stuff! You can also almost kill yourself doing it, so it's your call if your life is worth ten bucks.
+ - Cigarette packets now have coupons on the back for small cargo items! Smoking DOES pay!
+ - Some single/small items in cargo have been rebranded as goodies, come in lockboxes rather than crates, and can only be purchased with private accounts.
+
+
kevinz000 updated:
+
+ - Life() is split into BiologicalLife() and PhysicalLife. A component signal has been added that can prevent either from ticking.
+
+
shellspeed1 updated:
+
+
+
21 June 2020
+
kevinz000 updated:
+
+ - calculations for punch hit chance has been drastically buffed in favor of the attacker.
+
+
+
20 June 2020
+
LetterN updated:
+
+ - Asset cache from tg
+ - Made the map viewer not look bad
+ - Admin matrix right-bracket
+
+
bunny232 updated:
+
+ - Removed unsavory things from the vent clog event
+
+
19 June 2020
Bhijn updated:
@@ -296,79 +350,6 @@
- newly created areas using blueprints now maintain the previous areas noteleport value
- kudzu seeds now actually spawn vines
-
-
19 April 2020
-
Anonymous updated:
-
- - Xenohybrids will now scream like xeno.
-
-
Arturlang updated:
-
- - You can no longer spam craft things using the crafting menu
-
-
Detective-Google updated:
-
- - uncorks some of Lambda's rooms.
-
-
Ghommie updated:
-
- - Custom skin tone preferences.
- - Normalized box dorm lockers. Also removed a straight jacket found in the same area.
-
-
Jake Park updated:
-
- - fixed path name for youtool vending
-
-
Putnam3145 updated:
-
- - Objectives now clean theirselves up instead of leaving null entries in lists everywhere.
-
-
Seris02 updated:
-
- - stops magboots from not updating slowdowns
-
-
Trilbyspaceclone updated:
-
- - Maints have seen an uptick in left over types of welders, and tools. As well as different types of masks
- - New type of 02 locker - Rng! It can have almost any type of gas/breath mask and almost any type of o2 tank as well as even plasma men internals - Fancy!
- - Tool lockers have 70% odds to have a spare random tool inside!
- - 12 new more drinks for most races!
- - New animations for mauna loa, and colour swap from red to blue for a Paramedic Hardsuit helm
- - Lowers cog champ ((the drink)) flare rate
- - Six more Sci based bounties have been posted at your local Cargo Bounty Request console
- - Mimes have made catnip plants not become invisible. How helpful.
- - Honey Palm now distills into mead rather then wine
-
-
UristMcAstronaut updated:
-
- - Adds circuit analyzers to maps and to integrated circuit printer and circuitry starter crate.
-
-
kappa-sama updated:
-
- - aranesp heals 10 instead of 18 stamina per tick
- - removed roundstart hyper earrape screams from xenohybrids
-
-
kevinz000 updated:
-
- - you can no longer stun xenos
- - Contractor kits are now poplocked to 30 players.
- - Shield bashing has been added
-
-
necromanceranne updated:
-
- - You can now craft armwraps!
- - Pugilists disarm you more easily and are harder to disarm. They also get a discount on disarm.
- - Pugilists only suffer a flat 10% chance to miss you. It's just like old punches! Kinda.
- - Chaplain's armbands are a +2, up from a +1!
- - Martial artists spend stamina when they disarm.
- - Rising Bass had several moves shortened and made stronger. Has a disarm override attack which does stamina damage and trips people on a disarm stun punch.
- - CQC had it's disarm move altered to be a stronger version of Krav Maga's. Dizzies and disarms on a disarm stun punch or just does some stamina damage and brute damage.
- - Sleeping Carp can punch you to the floor on a harm stun punch.
- - Hugs of the Northstar are no longer nodrop.
- - Adding in some overrides and proper flag checks for martial arts.
- - Stun thresholding stops disarm spams at extremely high stamina loss.
- - Ashen Arrows are actually called Ashen Arrows in the crafting menu.
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index ee2511d0f5..b4ea0e1aef 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -26015,3 +26015,47 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: Adds the stray cargo pod event, where a cargo pod crashes into the station.
- rscadd: Adds the fugitives event, where fugitives are loose on the station, and
it's the hunters jobs to capture them.
+2020-06-20:
+ LetterN:
+ - rscadd: Asset cache from tg
+ - tweak: Made the map viewer not look bad
+ - bugfix: Admin matrix right-bracket
+ bunny232:
+ - rscdel: Removed unsavory things from the vent clog event
+2020-06-21:
+ kevinz000:
+ - balance: calculations for punch hit chance has been drastically buffed in favor
+ of the attacker.
+2020-06-22:
+ Ghommie (porting PRs by zxaber, Ryll-Ryll, AnturK):
+ - tweak: Certain small items purchased through cargo now get grouped into a single
+ box. They also are immune to the 10% private account fee.
+ - rscadd: Added single-order options for several existing products in the Cargo
+ Catalog.
+ - tweak: Medkit listings are now single-pack items, and considered small items that
+ get grouped into single boxes. Price for medkits is as close to unchanged as
+ is reasonable.
+ - rscadd: You can now beat on vending machines to try and knock loose free stuff!
+ You can also almost kill yourself doing it, so it's your call if your life is
+ worth ten bucks.
+ - rscadd: Cigarette packets now have coupons on the back for small cargo items!
+ Smoking DOES pay!
+ - tweak: Some single/small items in cargo have been rebranded as goodies, come in
+ lockboxes rather than crates, and can only be purchased with private accounts.
+ kevinz000:
+ - refactor: Life() is split into BiologicalLife() and PhysicalLife. A component
+ signal has been added that can prevent either from ticking.
+ shellspeed1:
+ - rscadd: Adds IV bags.
+2020-06-24:
+ DeltaFire15:
+ - balance: Choosing a random item in your uplink will no longer sometimes reroll
+ your contract.
+ - rscdel: Syndicate crate event cannot fire as a random event anymore.
+ Detective-Google:
+ - bugfix: singulos no longer succ infinite rods out of the ice
+ - bugfix: one of the directions for the diag hudpatch was blu instead of orang
+ timothyteakettle:
+ - bugfix: bonfires/grills no longer produce infinite quantities of food
+ - bugfix: slime's alter form ability now updates their hair colour when changing
+ their body colour
diff --git a/html/changelogs/AutoChangeLog-pr-12414.yml b/html/changelogs/AutoChangeLog-pr-12414.yml
deleted file mode 100644
index de95e898f8..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12414.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "LetterN"
-delete-after: True
-changes:
- - rscadd: "Asset cache from tg"
- - tweak: "Made the map viewer not look bad"
- - bugfix: "Admin matrix right-bracket"
diff --git a/html/changelogs/AutoChangeLog-pr-12542.yml b/html/changelogs/AutoChangeLog-pr-12542.yml
deleted file mode 100644
index 0f9f9105d3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12542.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "bunny232"
-delete-after: True
-changes:
- - rscdel: "Removed unsavory things from the vent clog event"
diff --git a/icons/effects/freeze.dmi b/icons/effects/freeze.dmi
index 28db97d87b..0461619064 100644
Binary files a/icons/effects/freeze.dmi and b/icons/effects/freeze.dmi differ
diff --git a/icons/mob/clothing/eyes.dmi b/icons/mob/clothing/eyes.dmi
index 54ef7c5814..cd2b84a143 100644
Binary files a/icons/mob/clothing/eyes.dmi and b/icons/mob/clothing/eyes.dmi differ
diff --git a/icons/obj/bloodpack.dmi b/icons/obj/bloodpack.dmi
index 82b4c2e543..2355a81f8f 100644
Binary files a/icons/obj/bloodpack.dmi and b/icons/obj/bloodpack.dmi differ
diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi
index d3f055d1f2..b71b021d80 100644
Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ
diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi
index f07928741d..05337721c7 100644
Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ
diff --git a/modular_citadel/code/modules/mob/living/carbon/life.dm b/modular_citadel/code/modules/mob/living/carbon/life.dm
deleted file mode 100644
index e94bd75985..0000000000
--- a/modular_citadel/code/modules/mob/living/carbon/life.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-/mob/living/carbon/Life()
- . = ..()
- doSprintBufferRegen()
diff --git a/tgstation.dme b/tgstation.dme
index 5d1ce52784..78cce84a0c 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -425,6 +425,7 @@
#include "code\datums\components\mood.dm"
#include "code\datums\components\nanites.dm"
#include "code\datums\components\ntnet_interface.dm"
+#include "code\datums\components\omen.dm"
#include "code\datums\components\orbiter.dm"
#include "code\datums\components\paintable.dm"
#include "code\datums\components\pellet_cloud.dm"
@@ -1355,6 +1356,7 @@
#include "code\modules\antagonists\_common\antag_spawner.dm"
#include "code\modules\antagonists\_common\antag_team.dm"
#include "code\modules\antagonists\abductor\abductor.dm"
+#include "code\modules\antagonists\abductor\ice_abductor.dm"
#include "code\modules\antagonists\abductor\abductee\abductee.dm"
#include "code\modules\antagonists\abductor\abductee\abductee_objectives.dm"
#include "code\modules\antagonists\abductor\abductee\trauma.dm"
@@ -1727,6 +1729,7 @@
#include "code\modules\cargo\bounty_console.dm"
#include "code\modules\cargo\centcom_podlauncher.dm"
#include "code\modules\cargo\console.dm"
+#include "code\modules\cargo\coupon.dm"
#include "code\modules\cargo\export_scanner.dm"
#include "code\modules\cargo\exports.dm"
#include "code\modules\cargo\expressconsole.dm"
@@ -1767,6 +1770,7 @@
#include "code\modules\cargo\packs\emergency.dm"
#include "code\modules\cargo\packs\engine.dm"
#include "code\modules\cargo\packs\engineering.dm"
+#include "code\modules\cargo\packs\goodies.dm"
#include "code\modules\cargo\packs\livestock.dm"
#include "code\modules\cargo\packs\materials.dm"
#include "code\modules\cargo\packs\medical.dm"
@@ -2988,6 +2992,7 @@
#include "code\modules\reagents\reagent_containers\blood_pack.dm"
#include "code\modules\reagents\reagent_containers\borghydro.dm"
#include "code\modules\reagents\reagent_containers\bottle.dm"
+#include "code\modules\reagents\reagent_containers\chem_pack.dm"
#include "code\modules\reagents\reagent_containers\dropper.dm"
#include "code\modules\reagents\reagent_containers\glass.dm"
#include "code\modules\reagents\reagent_containers\hypospray.dm"
@@ -3445,7 +3450,6 @@
#include "modular_citadel\code\modules\mob\living\living.dm"
#include "modular_citadel\code\modules\mob\living\carbon\carbon.dm"
#include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\life.dm"
#include "modular_citadel\code\modules\mob\living\carbon\reindex_screams.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm"
diff --git a/tgui-next/packages/tgui/interfaces/Cargo.js b/tgui-next/packages/tgui/interfaces/Cargo.js
index 133b1b00ab..85a528d901 100644
--- a/tgui-next/packages/tgui/interfaces/Cargo.js
+++ b/tgui-next/packages/tgui/interfaces/Cargo.js
@@ -147,6 +147,16 @@ const Catalog = props => {
{pack.name}:
|
+
+ {!!pack.private_goody && (
+ Private Only
+ )}
+ |
+
+ {!!pack.goody && (
+ Small Item
+ )}
+ |
{!!pack.access && (
Restrictions Apply
@@ -158,9 +168,14 @@ const Catalog = props => {
&& !pack.can_private_buy
&& !data.emagged
)}
- content={(data.self_paid
- ? Math.round(pack.cost * 1.1)
- : pack.cost) + ' credits'}
+ content={(
+ (
+ data.self_paid
+ && !pack.private_goody
+ && !pack.goody
+ )
+ ? Math.round(pack.cost * 1.1)
+ : pack.cost) + ' cr'}
tooltip={pack.desc}
tooltipPosition="left"
onClick={() => act(ref, 'add', {
|