"
+ 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/head/misc.dm b/code/modules/clothing/head/misc.dm
index 201c9e0bea..73675257e4 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -437,3 +437,12 @@
item_state = "hunter"
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/obj/item/clothing/head/kepi
+ name = "kepi"
+ desc = "A white cap with visor. Oui oui, mon capitane!"
+ icon_state = "kepi"
+
+/obj/item/clothing/head/kepi/old
+ icon_state = "kepi_old"
+ desc = "A flat, white circular cap with a visor, that demands some honor from it's wearer."
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/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm
index 43c3337a4b..860d3898f2 100644
--- a/code/modules/flufftext/Dreaming.dm
+++ b/code/modules/flufftext/Dreaming.dm
@@ -1,7 +1,3 @@
-/mob/living/carbon/proc/handle_dreams()
- if(prob(10) && !dreaming)
- dream()
-
/mob/living/carbon/proc/dream()
set waitfor = FALSE
var/list/dream_fragments = list()
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..3f82033760 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)
//Reagent processing needs to come before breathing, to prevent edge cases.
handle_organs()
-
- . = ..()
-
- if (QDELETED(src))
+ if(stat == DEAD)
+ return FALSE
+ 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/living_mobility.dm b/code/modules/mob/living/living_mobility.dm
index 32038a6102..654a979445 100644
--- a/code/modules/mob/living/living_mobility.dm
+++ b/code/modules/mob/living/living_mobility.dm
@@ -96,7 +96,13 @@
mobility_flags &= ~MOBILITY_STAND
setMovetype(movement_type | CRAWLING)
if(!lying) //force them on the ground
- lying = pick(90, 270)
+ switch(dir)
+ if(NORTH, SOUTH)
+ lying = pick(90, 270)
+ if(EAST)
+ lying = 90
+ else //West
+ lying = 270
if(has_gravity() && !buckled)
playsound(src, "bodyfall", 20, 1)
else
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/apc.dm b/code/modules/power/apc.dm
index 6772fe3cf1..7d0ecf3e66 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -1141,6 +1141,7 @@
return
if(!is_station_level(z))
return
+ malf.ShutOffDoomsdayDevice()
occupier = new /mob/living/silicon/ai(src, malf.laws, malf) //DEAR GOD WHY? //IKR????
occupier.adjustOxyLoss(malf.getOxyLoss())
if(!findtext(occupier.name, "APC Copy"))
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/power/smes.dm b/code/modules/power/smes.dm
index 85999707a2..788b4b1441 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -228,6 +228,11 @@
var/last_chrg = inputting
var/last_onln = outputting
+ //check for self-recharging cells in stock parts and use them to self-charge
+ for(var/obj/item/stock_parts/cell/C in component_parts)
+ if(C.self_recharge)
+ charge += min(capacity-charge, C.chargerate) // If capacity-charge is smaller than the attempted charge rate, this avoids overcharging
+
//inputting
if(terminal && input_attempt)
input_available = terminal.surplus()
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/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index 50e818abe6..042d80dab3 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -386,7 +386,8 @@
return FALSE
if("analyze")
- var/datum/reagent/R = GLOB.name2reagent[params["id"]]
+ var/reagent = GLOB.name2reagent[params["id"]]
+ var/datum/reagent/R = GLOB.chemical_reagents_list[reagent]
if(R)
var/state = "Unknown"
if(initial(R.reagent_state) == 1)
@@ -399,13 +400,9 @@
var/T = initial(R.metabolization_rate) * (60 / P)
if(istype(R, /datum/reagent/fermi))
fermianalyze = TRUE
- var/datum/chemical_reaction/Rcr = get_chemical_reaction(R)
+ var/datum/chemical_reaction/Rcr = get_chemical_reaction(reagent)
var/pHpeakCache = (Rcr.OptimalpHMin + Rcr.OptimalpHMax)/2
- var/datum/reagent/targetReagent = reagents.has_reagent(R)
-
- if(!targetReagent)
- CRASH("Tried to find a reagent that doesn't exist in the chem_master!")
- analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold), "purityF" = targetReagent.purity, "inverseRatioF" = initial(R.inverse_chem_val), "purityE" = initial(Rcr.PurityMin), "minTemp" = initial(Rcr.OptimalTempMin), "maxTemp" = initial(Rcr.OptimalTempMax), "eTemp" = initial(Rcr.ExplodeTemp), "pHpeak" = pHpeakCache)
+ analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold), "purityF" = R.purity, "inverseRatioF" = initial(R.inverse_chem_val), "purityE" = initial(Rcr.PurityMin), "minTemp" = initial(Rcr.OptimalTempMin), "maxTemp" = initial(Rcr.OptimalTempMax), "eTemp" = initial(Rcr.ExplodeTemp), "pHpeak" = pHpeakCache)
else
fermianalyze = FALSE
analyzeVars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "addicD" = initial(R.addiction_threshold))
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/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 328b30d092..37ea2ca70d 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -386,6 +386,20 @@
/obj/item/reagent_containers/glass/beaker/waterbottle/large/empty
list_reagents = list()
+/obj/item/reagent_containers/glass/beaker/waterbottle/wataur
+ name = "Bottled Wataur"
+ desc = "Finally, a bottle as proportionate as you."
+ icon = 'icons/obj/drinks.dmi'
+ icon_state = "wataur"
+ custom_materials = list(/datum/material/plastic=0)
+ list_reagents = list(/datum/reagent/water = 100)
+ volume = 100
+ amount_per_transfer_from_this = 20
+ possible_transfer_amounts = list(5,10,15,20,25,30,50, 100)
+ container_flags = TEMP_WEAK|APTFT_ALTCLICK|APTFT_VERB
+ container_HP = 1
+ cached_icon = "wataur"
+
/obj/item/reagent_containers/glass/get_belt_overlay()
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "bottle")
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 02d16b8c2e..4efcad97ba 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -264,6 +264,79 @@
construction_time = 600
category = list("Gygax")
+//Medical Gygax
+/datum/design/medigax_chassis
+ name = "Exosuit Chassis (\"Medical Gygax\")"
+ id = "medigax_chassis"
+ build_type = MECHFAB
+ build_path = /obj/item/mecha_parts/chassis/medigax
+ materials = list(/datum/material/iron=20000)
+ construction_time = 100
+ category = list("Medical-Spec Gygax")
+
+/datum/design/medigax_torso
+ name = "Exosuit Torso (\"Medical Gygax\")"
+ id = "medigax_torso"
+ build_type = MECHFAB
+ build_path = /obj/item/mecha_parts/part/medigax_torso
+ materials = list(/datum/material/iron=20000,/datum/material/glass=10000,/datum/material/diamond=2000)
+ construction_time = 300
+ category = list("Medical-Spec Gygax")
+
+/datum/design/medigax_head
+ name = "Exosuit Head (\"Medical Gygax\")"
+ id = "medigax_head"
+ build_type = MECHFAB
+ build_path = /obj/item/mecha_parts/part/medigax_head
+ materials = list(/datum/material/iron=10000,/datum/material/glass=5000, /datum/material/diamond=2000)
+ construction_time = 200
+ category = list("Medical-Spec Gygax")
+
+/datum/design/medigax_left_arm
+ name = "Exosuit Left Arm (\"Medical Gygax\")"
+ id = "medigax_left_arm"
+ build_type = MECHFAB
+ build_path = /obj/item/mecha_parts/part/medigax_left_arm
+ materials = list(/datum/material/iron=15000, /datum/material/diamond=1000)
+ construction_time = 200
+ category = list("Medical-Spec Gygax")
+
+/datum/design/medigax_right_arm
+ name = "Exosuit Right Arm (\"Medical Gygax\")"
+ id = "medigax_right_arm"
+ build_type = MECHFAB
+ build_path = /obj/item/mecha_parts/part/medigax_right_arm
+ materials = list(/datum/material/iron=15000, /datum/material/diamond=1000)
+ construction_time = 200
+ category = list("Medical-Spec Gygax")
+
+/datum/design/medigax_left_leg
+ name = "Exosuit Left Leg (\"Medical Gygax\")"
+ id = "medigax_left_leg"
+ build_type = MECHFAB
+ build_path = /obj/item/mecha_parts/part/medigax_left_leg
+ materials = list(/datum/material/iron=15000, /datum/material/diamond=2000)
+ construction_time = 200
+ category = list("Medical-Spec Gygax")
+
+/datum/design/medigax_right_leg
+ name = "Exosuit Right Leg (\"Medical Gygax\")"
+ id = "medigax_right_leg"
+ build_type = MECHFAB
+ build_path = /obj/item/mecha_parts/part/medigax_right_leg
+ materials = list(/datum/material/iron=15000, /datum/material/diamond=2000)
+ construction_time = 200
+ category = list("Medical-Spec Gygax")
+
+/datum/design/medigax_armor
+ name = "Exosuit Armor (\"Medical Gygax\")"
+ id = "medigax_armor"
+ build_type = MECHFAB
+ build_path = /obj/item/mecha_parts/part/medigax_armor
+ materials = list(/datum/material/iron=15000,/datum/material/diamond=10000,/datum/material/titanium=10000)
+ construction_time = 600
+ category = list("Medical-Spec Gygax")
+
//Durand
/datum/design/durand_chassis
name = "Exosuit Chassis (\"Durand\")"
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/research/techweb/nodes/mecha_nodes.dm b/code/modules/research/techweb/nodes/mecha_nodes.dm
index 4d1b703cae..2e77f697da 100644
--- a/code/modules/research/techweb/nodes/mecha_nodes.dm
+++ b/code/modules/research/techweb/nodes/mecha_nodes.dm
@@ -42,6 +42,14 @@
"gygax_peri", "gygax_targ", "gygax_armor")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+/datum/techweb_node/medigax
+ id = "mech_medigax"
+ display_name = "EXOSUIT: Medical-Spec Gygax"
+ description = "Medical-Spec Gygax designs"
+ prereq_ids = list("mech_gygax", "mecha_odysseus")
+ design_ids = list("medigax_chassis", "medigax_torso", "medigax_head", "medigax_left_arm", "medigax_right_arm", "medigax_left_leg", "medigax_right_leg", "medigax_armor")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
/datum/techweb_node/durand
id = "mech_durand"
display_name = "EXOSUIT: Durand"
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/cola.dm b/code/modules/vending/cola.dm
index b667f4c7c9..bb5b8ef288 100644
--- a/code/modules/vending/cola.dm
+++ b/code/modules/vending/cola.dm
@@ -15,7 +15,8 @@
/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 10,
/obj/item/reagent_containers/glass/beaker/waterbottle = 10)
contraband = list(/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6,
- /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6)
+ /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6,
+ /obj/item/reagent_containers/glass/beaker/waterbottle/wataur = 2)
premium = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1,
/obj/item/reagent_containers/food/drinks/soda_cans/air = 1,
/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull = 1,
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..768942c434 100644
--- a/config/awaymissionconfig.txt
+++ b/config/awaymissionconfig.txt
@@ -7,16 +7,13 @@
#Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once.
#DO tick the associated code file for the away mission you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors!
-#_maps/RandomZLevels/away_mission/blackmarketpackers.dmm
-#_maps/RandomZLevels/away_mission/spacebattle.dmm
#_maps/RandomZLevels/away_mission/TheBeach.dmm
#_maps/RandomZLevels/away_mission/Academy.dmm
#_maps/RandomZLevels/away_mission/wildwest.dmm
#_maps/RandomZLevels/away_mission/challenge.dmm
-#_maps/RandomZLevels/away_mission/centcomAway.dmm
#_maps/RandomZLevels/away_mission/moonoutpost19.dmm
#_maps/RandomZLevels/away_mission/undergroundoutpost45.dmm
#_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
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index d2d9945e9a..da337ce33f 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,300 @@
-->
+
26 June 2020
+
Ghommie updated:
+
+
Snore spam.
+
Hostile mobs shouldn't hit their original spawner structures or thoses of the same faction.
+
+
silicons updated:
+
+
soap cleans blood again
+
+
+
25 June 2020
+
Anonymous updated:
+
+
Added kepi and orvilike kepi. Available through loadout.
+
+
Detective Google updated:
+
+
Medigygax
+
+
Detective-Google updated:
+
+
malf AIs can no longer yeet the station while shunted
+
SMESes can now properly use self charging cells
+
ghosts now show up when the round ends
+
away missions
+
+
Funce updated:
+
+
Mentor SQL queries are now deleted properly.
+
+
Linzolle updated:
+
+
analyze function on chem master is no longer broken
+
organs now decay inside dead bodies again
+
+
dapnee updated:
+
+
wataur bottle item
+
wataur bottle and overlay
+
+
+
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:
+
+
Adds IV bags.
+
+
+
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:
+
+
Atmos can no longer become completely bricked
+
+
Funce updated:
+
+
Square root circuit should now actually work.
+
+
SmArtKar updated:
+
+
Fixed my runtimes
+
+
TheSpaghetti updated:
+
+
more insectoid insects
+
+
kevinz000 updated:
+
+
bay/polaris style say_emphasis has been added. You can now |italicize| _underline_ and +bold+ your messages.
+
+
timothyteakettle updated:
+
+
Adds the brain trauma event, where one player gets a random brain trauma!
+
Adds the wisdom cow event, where the wisdom cow appears on the station!
+
Adds the fake virus event, where people get fake virus symptoms.
+
Adds the stray cargo pod event, where a cargo pod crashes into the station.
+
Adds the fugitives event, where fugitives are loose on the station, and it's the hunters jobs to capture them.
+
+
+
18 June 2020
+
Detective-Google updated:
+
+
cog is now less the suck
+
couple little derpy bits
+
malf disk and illegal tech disk moved from ashwalker base (guaranteed) to tendrils (chance based)
+
+
SmArtKar updated:
+
+
Ported shuttles from beestation
+
+
timothyteakettle updated:
+
+
embeds got reworked, sticky tape was added, more bullets that ricochet also added
+
medbots can now be tipped over
+
added more medbot sounds
+
+
+
17 June 2020
+
SmArtKar updated:
+
+
New ID icons
+
Sutures and Meshes
+
+
Trilbyspaceclone updated:
+
+
Gin export takes gin now
+
+
+
16 June 2020
+
Ghommie updated:
+
+
You can't blink nor use LOOC/AOOC as a petrified statue anymore.
+
+
Trilbyspaceclone updated:
+
+
BEPIS decal painter has been moved to venders, replacing it being the flashdark
+
+
kevinz000 updated:
+
+
projectile ricochets now use a less hilariously terrible way of being handled and should be easier to w
+
projectile runtime/ricocheting
+
Lobotomy no longer has a 50% chance of giving you a nigh-unremovable trauma, but does 50 brain damage even on success. On failure, it will give you a lobotomy-class trauma.
+
spinesnapping from tackling now only gives a lobotomy class trauma instead of magic.
+
+
timothyteakettle updated:
+
+
Food carts now function as intended, allowing the pouring and mixing of drinks.
+
slimes can now change their color using alter form
+
+
+
15 June 2020
+
Anturk, kevinz000 updated:
+
+
VV now properly allows access to datums in associative lists
+
SDQL2 printout has been upgraded for the 5th time.
Improvised Energy Gun. Fires 5 shots of 10 burn damage each. Can be upgraded with a lens made from glassworking and T4 parts for a minor buff.
+
Ammo + gun part loot spawners for mappers.
+
New sprites for Improvised Rifle, the ability to sling the rifle and a sprite for that.
+
New sprites for the Improvised Shotgun and its sling sprite.
+
Improvised shotguns are now two-handed only.
+
Improvised shotguns now only have a much less harsh 0.9* modifier, keeping them two hits to crit with slugs and buckshot. It can no longer be dual-wielded but can still be sawn off for w_class medium (can fit in backpacks).
+
Missing handsaw icons added in.
+
Crafting table cleaned up into sections.
+
+
Ghommie updated:
+
+
changed the weak attack message prefix from "inefficiently" to "limply", "feebly" and "saplessly" and lowered the threshold.
+
Fixing old beserker hardsuits having the wrong helmet type.
+
+
The0bserver and Stewydeadmike updated:
+
+
Hey, there's a bit of dust in this recipe book! Recipes using peas? How many recipes does this book even have?
+
Adds 6 new food items, and 1 new consumable reagent using all forms of the recently discovered peas. Ask your local botanist and chef for them today!
+
+
YakumoChen updated:
+
+
Adds polychrome options to loadout
+
Adds risque polychrome options to Kinkmate vendors
+
+
kevinz000 updated:
+
+
emissive blockers can no longer be radioactive.
+
Ghosts can now scan air inside most objects that contain air by clicking on them.
+
Directional blocking has been added, keybound to G. This will reduce a portion of incoming damage if done with eligible items at the cost of stamina damage incurred to the user based on damage blocked as well as while active, as well as in most cases preventing the user from doing any attacks while this is active.
+
Parrying has been added, keybound to F. Timing-based counterattacks, effect heavily dependent on the item, WIP.
+
Disks are now smaller.
+
+
+
12 June 2020
+
EmeraldSundisk updated:
+
+
The Detective's Office has been commandeered in order to serve a Head of Security. Detectives will find their new office within starboard maintenance.
+
Adds the Head of Security's standard equipment to their new office.
+
Slight adjustment/expansion to the main security department
+
Additional maintenance work
+
+
timothyteakettle updated:
+
+
Crabs, cockroaches, slimes and crabs are now small enough to fit in pet carriers
+
+
+
11 June 2020
+
Ghommie updated:
+
+
Balanced vending machine prices to be generally more affordable, a minority has been priced up though.
+
+
+
10 June 2020
+
DeltaFire15 updated:
+
+
Golems / simillar now inherit the neutered antag datum if the creator is neutered.
+
+
Ghommie updated:
+
+
Fixing missing pill type buttons from the chem master UI.
+
+
Naksu updated:
+
+
Lighting corner updates are ever so slightly faster.
+
+
Putnam for helping me code the contamination clearing on people updated:
+
+
Lab made Zeolites have been remade anew and more affective now that they refined the best possable way to mix and make a supper Zeolite capable of clearing contamination form not only people but items!
+
+
Trilbyspaceclone updated:
+
+
Tank Dispender has been moved into toxin storage from toxins
+
+
kevinz000 updated:
+
+
traitor classes can now be poplocked. hijack/glorious death are now locked to 25/20 respectively.
+
+
timothyteakettle updated:
+
+
adds a new fermichem, used for creating sentient plushies!
+
Mice can now breed using cheese wedges
+
Royal cheese can be crafted to convert a mouse into king rat
+
+
09 June 2020
DeltaFire15 updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index c6dd56df92..468ba0e049 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -25849,6 +25849,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
value
- bugfix: kudzu seeds now actually spawn vines
2020-06-09:
+ Anonymous:
+ - rscadd: Added Orville-inspired clothing as a worthy alternative to Trek stuff.
+ - tweak: Adds chaplain role allowance to the TMP Service Uniform loadout.
+ - tweak: Adds paramedic in every medsci mentioned uniform loadout.
DeltaFire15:
- bugfix: Offstation AIs can once again only interact with their z-level
Ghommie:
@@ -25856,3 +25860,227 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
Trilbyspaceclone:
- tweak: Gasses like BZ and Masiam seem to just sell for less in cargo, markets
seem to change it seems
+ kevinz000:
+ - balance: plantpeople should stop dying in the halls now
+ - rscadd: Modifier-independent hotkey bindings have been added.
+2020-06-10:
+ DeltaFire15:
+ - bugfix: Golems / simillar now inherit the neutered antag datum if the creator
+ is neutered.
+ Ghommie:
+ - bugfix: Fixing missing pill type buttons from the chem master UI.
+ Naksu:
+ - code_imp: Lighting corner updates are ever so slightly faster.
+ Putnam for helping me code the contamination clearing on people:
+ - rscadd: Lab made Zeolites have been remade anew and more affective now that they
+ refined the best possable way to mix and make a supper Zeolite capable of clearing
+ contamination form not only people but items!
+ Trilbyspaceclone:
+ - tweak: Tank Dispender has been moved into toxin storage from toxins
+ kevinz000:
+ - rscadd: traitor classes can now be poplocked. hijack/glorious death are now locked
+ to 25/20 respectively.
+ timothyteakettle:
+ - rscadd: adds a new fermichem, used for creating sentient plushies!
+ - rscadd: Mice can now breed using cheese wedges
+ - rscadd: Royal cheese can be crafted to convert a mouse into king rat
+2020-06-11:
+ Ghommie:
+ - balance: Balanced vending machine prices to be generally more affordable, a minority
+ has been priced up though.
+2020-06-12:
+ EmeraldSundisk:
+ - tweak: The Detective's Office has been commandeered in order to serve a Head of
+ Security. Detectives will find their new office within starboard maintenance.
+ - rscadd: Adds the Head of Security's standard equipment to their new office.
+ - tweak: Slight adjustment/expansion to the main security department
+ - rscadd: Additional maintenance work
+ timothyteakettle:
+ - rscadd: Crabs, cockroaches, slimes and crabs are now small enough to fit in pet
+ carriers
+2020-06-14:
+ Bhijn:
+ - bugfix: raw HTML can no longer be used in flavortext
+ - rscadd: Added Lesbian Visibility Day (April 26th)
+ - rscadd: Added Bisexual Visibility Day (September 23rd)
+ - rscadd: Added Coming Out Day! (October 11th)
+ - rscadd: Added Intersex Awareness Day (October 26th)
+ - rscadd: Added Transgender Awareness Week (November 13th - 19th)
+ - rscadd: Added the Transgender Day of Remembrance (November 20th)
+ - rscadd: Added Asexual Awareness Week (Last full week of October, this year it'll
+ be Oct. 25-31)
+ - rscadd: Added the Stonewall Riot Anniversary (June 28)
+ - bugfix: Moth week is now *actually* the last full week of July, instead of the
+ 4th of every weekday + the 5th Sunday.
+ Floof Ball / Kathrin Morrison / Floof Ball#0798:
+ - rscadd: Improvised Pistol + 32 ACP ammo.
+ - rscadd: Improvised Energy Gun. Fires 5 shots of 10 burn damage each. Can be upgraded
+ with a lens made from glassworking and T4 parts for a minor buff.
+ - rscadd: Ammo + gun part loot spawners for mappers.
+ - rscadd: New sprites for Improvised Rifle, the ability to sling the rifle and a
+ sprite for that.
+ - rscadd: New sprites for the Improvised Shotgun and its sling sprite.
+ - balance: Improvised shotguns are now two-handed only.
+ - balance: Improvised shotguns now only have a much less harsh 0.9* modifier, keeping
+ them two hits to crit with slugs and buckshot. It can no longer be dual-wielded
+ but can still be sawn off for w_class medium (can fit in backpacks).
+ - bugfix: Missing handsaw icons added in.
+ - tweak: Crafting table cleaned up into sections.
+ Ghommie:
+ - tweak: changed the weak attack message prefix from "inefficiently" to "limply",
+ "feebly" and "saplessly" and lowered the threshold.
+ - bugfix: Fixing old beserker hardsuits having the wrong helmet type.
+ The0bserver and Stewydeadmike:
+ - rscadd: Hey, there's a bit of dust in this recipe book! Recipes using peas? How
+ many recipes does this book even have?
+ - rscadd: Adds 6 new food items, and 1 new consumable reagent using all forms of
+ the recently discovered peas. Ask your local botanist and chef for them today!
+ YakumoChen:
+ - tweak: Adds polychrome options to loadout
+ - tweak: Adds risque polychrome options to Kinkmate vendors
+ kevinz000:
+ - bugfix: emissive blockers can no longer be radioactive.
+ - rscadd: Ghosts can now scan air inside most objects that contain air by clicking
+ on them.
+ - rscadd: Directional blocking has been added, keybound to G. This will reduce a
+ portion of incoming damage if done with eligible items at the cost of stamina
+ damage incurred to the user based on damage blocked as well as while active,
+ as well as in most cases preventing the user from doing any attacks while this
+ is active.
+ - rscadd: Parrying has been added, keybound to F. Timing-based counterattacks, effect
+ heavily dependent on the item, WIP.
+ - balance: Disks are now smaller.
+2020-06-15:
+ Anturk, kevinz000:
+ - bugfix: VV now properly allows access to datums in associative lists
+ - rscadd: SDQL2 printout has been upgraded for the 5th time.
+ kevinz000:
+ - bugfix: plushies now work. credits to timothytea.
+ - rscadd: You can now tape knives to cleanbots
+ kevinz000 (port from VOREStation):
+ - imageadd: Ported zoomba skins for cyborgs.
+2020-06-16:
+ Ghommie:
+ - bugfix: You can't blink nor use LOOC/AOOC as a petrified statue anymore.
+ Trilbyspaceclone:
+ - tweak: BEPIS decal painter has been moved to venders, replacing it being the flashdark
+ kevinz000:
+ - refactor: projectile ricochets now use a less hilariously terrible way of being
+ handled and should be easier to w
+ - bugfix: projectile runtime/ricocheting
+ - balance: Lobotomy no longer has a 50% chance of giving you a nigh-unremovable
+ trauma, but does 50 brain damage even on success. On failure, it will give you
+ a lobotomy-class trauma.
+ - balance: spinesnapping from tackling now only gives a lobotomy class trauma instead
+ of magic.
+ timothyteakettle:
+ - bugfix: Food carts now function as intended, allowing the pouring and mixing of
+ drinks.
+ - rscadd: slimes can now change their color using alter form
+2020-06-17:
+ SmArtKar:
+ - rscadd: New ID icons
+ - rscadd: Sutures and Meshes
+ Trilbyspaceclone:
+ - bugfix: Gin export takes gin now
+2020-06-18:
+ Detective-Google:
+ - tweak: cog is now less the suck
+ - bugfix: couple little derpy bits
+ - balance: malf disk and illegal tech disk moved from ashwalker base (guaranteed)
+ to tendrils (chance based)
+ SmArtKar:
+ - rscadd: Ported shuttles from beestation
+ timothyteakettle:
+ - rscadd: embeds got reworked, sticky tape was added, more bullets that ricochet
+ also added
+ - rscadd: medbots can now be tipped over
+ - soundadd: added more medbot sounds
+2020-06-19:
+ Bhijn:
+ - bugfix: Atmos can no longer become completely bricked
+ Funce:
+ - bugfix: Square root circuit should now actually work.
+ SmArtKar:
+ - bugfix: Fixed my runtimes
+ TheSpaghetti:
+ - rscadd: more insectoid insects
+ kevinz000:
+ - rscadd: bay/polaris style say_emphasis has been added. You can now |italicize|
+ _underline_ and +bold+ your messages.
+ timothyteakettle:
+ - rscadd: Adds the brain trauma event, where one player gets a random brain trauma!
+ - rscadd: Adds the wisdom cow event, where the wisdom cow appears on the station!
+ - rscadd: Adds the fake virus event, where people get fake virus symptoms.
+ - 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
+2020-06-25:
+ Anonymous:
+ - rscadd: Added kepi and orvilike kepi. Available through loadout.
+ Detective Google:
+ - rscadd: Medigygax
+ Detective-Google:
+ - bugfix: malf AIs can no longer yeet the station while shunted
+ - bugfix: SMESes can now properly use self charging cells
+ - rscadd: ghosts now show up when the round ends
+ - balance: away missions
+ Funce:
+ - bugfix: Mentor SQL queries are now deleted properly.
+ Linzolle:
+ - bugfix: analyze function on chem master is no longer broken
+ - bugfix: organs now decay inside dead bodies again
+ dapnee:
+ - rscadd: wataur bottle item
+ - imageadd: wataur bottle and overlay
+2020-06-26:
+ Ghommie:
+ - bugfix: Snore spam.
+ - bugfix: Hostile mobs shouldn't hit their original spawner structures or thoses
+ of the same faction.
+ silicons:
+ - bugfix: soap cleans blood again
diff --git a/html/changelogs/AutoChangeLog-pr-12592.yml b/html/changelogs/AutoChangeLog-pr-12592.yml
new file mode 100644
index 0000000000..6f6fa81dcc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12592.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - rscadd: "felinids now nya when tabled"
diff --git a/html/changelogs/AutoChangeLog-pr-12610.yml b/html/changelogs/AutoChangeLog-pr-12610.yml
new file mode 100644
index 0000000000..8ce28484a7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12610.yml
@@ -0,0 +1,4 @@
+author: "Detective-Google"
+delete-after: True
+changes:
+ - tweak: "Lying down is better"
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/mecha/mech_construct.dmi b/icons/mecha/mech_construct.dmi
index 6d48367f2a..2ae4a93a2e 100644
Binary files a/icons/mecha/mech_construct.dmi and b/icons/mecha/mech_construct.dmi differ
diff --git a/icons/mecha/mech_construction.dmi b/icons/mecha/mech_construction.dmi
index a1ac490f00..1f50346b71 100644
Binary files a/icons/mecha/mech_construction.dmi and b/icons/mecha/mech_construction.dmi differ
diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi
index 4b09f791c3..310dd6709c 100644
Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.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/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index ccd902ec03..167332b630 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.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/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 93e499f595..b349161f8e 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 27caef76b2..5962e7522d 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi
index f07928741d..d7a9a03c41 100644
Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ
diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm
index 28c6e8e8a6..a02c98a9f0 100644
--- a/modular_citadel/code/modules/client/loadout/head.dm
+++ b/modular_citadel/code/modules/client/loadout/head.dm
@@ -98,6 +98,46 @@
restricted_desc = "Engineering, Security, and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
+// orvilike "original" kepi
+/datum/gear/orvkepicom
+ name = "Federation Kepi, command"
+ description = "A visored cap. Intended to be used with ORV uniform."
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/kepi/orvi/command
+ restricted_desc = "Heads of Staff"
+ restricted_roles = list("Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Research Director", "Chief Medical Officer", "Quartermaster")
+
+/datum/gear/orvkepiops
+ name = "Federation Kepi, ops/sec"
+ description = "A visored cap. Intended to be used with ORV uniform."
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/kepi/orvi/engsec
+ restricted_desc = "Engineering, Security and Cargo"
+ restricted_roles = list("Chief Engineer", "Atmospheric Technician", "Station Engineer", "Warden", "Detective", "Security Officer", "Head of Security", "Cargo Technician", "Shaft Miner", "Quartermaster")
+
+/datum/gear/orvkepimedsci
+ name = "Federation Kepi, medsci"
+ description = "A visored cap. Intended to be used with ORV uniform."
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/kepi/orvi/medsci
+ restricted_desc = "Medical and Science"
+ restricted_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Virologist", "Paramedic", "Geneticist", "Research Director", "Scientist", "Roboticist")
+
+/datum/gear/orvkepisrv
+ name = "Federation Kepi, service"
+ description = "A visored cap. Intended to be used with ORV uniform."
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/kepi/orvi/service
+ restricted_desc = "Service and Civilian, barring Clown, Mime and Lawyer"
+ restricted_roles = list("Assistant", "Bartender", "Botanist", "Cook", "Curator", "Janitor", "Chaplain")
+
+/datum/gear/orvkepiass
+ name = "Federation Kepi, assistant"
+ description = "A visored cap. Intended to be used with ORV uniform."
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/kepi/orvi
+ restricted_roles = list("Assistant")
+
/*Commenting out Until next Christmas or made automatic
/datum/gear/santahatr
name = "Red Santa Hat"
@@ -137,3 +177,9 @@
path = /obj/item/clothing/head/cowboyhat/sec
restricted_desc = "Security"
restricted_roles = list("Warden","Detective","Security Officer","Head of Security")
+
+// Misc
+/datum/gear/wkepi
+ name = "white kepi"
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/kepi
diff --git a/modular_citadel/code/modules/clothing/trek.dm b/modular_citadel/code/modules/clothing/trek.dm
index c522d1af81..f7e8b6778e 100644
--- a/modular_citadel/code/modules/clothing/trek.dm
+++ b/modular_citadel/code/modules/clothing/trek.dm
@@ -162,3 +162,21 @@
/obj/item/clothing/head/caphat/formal/fedcover/black
icon_state = "fedcapblack"
item_state = "fedcapblack"
+
+//orvilike caps
+/obj/item/clothing/head/kepi/orvi
+ name = "\improper Federation kepi"
+ desc = "A visored cap worn by all officers since 2550s."
+ icon_state = "kepi_ass"
+
+/obj/item/clothing/head/kepi/orvi/command
+ icon_state = "kepi_com"
+
+/obj/item/clothing/head/kepi/orvi/engsec
+ icon_state = "kepi_ops"
+
+/obj/item/clothing/head/kepi/orvi/medsci
+ icon_state = "kepi_medsci"
+
+/obj/item/clothing/head/kepi/orvi/service
+ icon_state = "kepi_srv"
diff --git a/modular_citadel/code/modules/mentor/mentor_memo.dm b/modular_citadel/code/modules/mentor/mentor_memo.dm
index b9f6833e32..8110c5ffcc 100644
--- a/modular_citadel/code/modules/mentor/mentor_memo.dm
+++ b/modular_citadel/code/modules/mentor/mentor_memo.dm
@@ -33,11 +33,14 @@
var/datum/DBQuery/query_memocheck = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("mentor_memo")] WHERE ckey = '[sql_ckey]'")
if(!query_memocheck.Execute())
var/err = query_memocheck.ErrorMsg()
+ qdel(query_memocheck)
log_game("SQL ERROR obtaining ckey from memo table. Error : \[[err]\]\n")
return
if(query_memocheck.NextRow())
+ qdel(query_memocheck)
to_chat(src, "You already have set a memo.")
return
+ qdel(query_memocheck)
var/memotext = input(src,"Write your Memo","Memo") as message
if(!memotext)
return
@@ -46,20 +49,24 @@
var/datum/DBQuery/query_memoadd = SSdbcore.NewQuery("INSERT INTO [format_table_name("mentor_memo")] (ckey, memotext, timestamp) VALUES ('[sql_ckey]', '[memotext]', '[timestamp]')")
if(!query_memoadd.Execute())
var/err = query_memoadd.ErrorMsg()
+ qdel(query_memoadd)
log_game("SQL ERROR adding new memo. Error : \[[err]\]\n")
return
log_admin("[key_name(src)] has set a mentor memo: [memotext]")
message_admins("[key_name_admin(src)] has set a mentor memo: [memotext]")
+ qdel(query_memoadd)
if("Edit")
var/datum/DBQuery/query_memolist = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("mentor_memo")]")
if(!query_memolist.Execute())
var/err = query_memolist.ErrorMsg()
+ qdel(query_memolist)
log_game("SQL ERROR obtaining ckey from memo table. Error : \[[err]\]\n")
return
var/list/memolist = list()
while(query_memolist.NextRow())
var/lkey = query_memolist.item[1]
memolist += "[lkey]"
+ qdel(query_memolist)
if(!memolist.len)
to_chat(src, "No memos found in database.")
return
@@ -70,10 +77,12 @@
var/datum/DBQuery/query_memofind = SSdbcore.NewQuery("SELECT memotext FROM [format_table_name("mentor_memo")] WHERE ckey = '[target_sql_ckey]'")
if(!query_memofind.Execute())
var/err = query_memofind.ErrorMsg()
+ qdel(query_memofind)
log_game("SQL ERROR obtaining memotext from memo table. Error : \[[err]\]\n")
return
if(query_memofind.NextRow())
var/old_memo = query_memofind.item[1]
+ qdel(query_memofind)
var/new_memo = input("Input new memo", "New Memo", "[old_memo]", null) as message
if(!new_memo)
return
@@ -83,6 +92,7 @@
var/datum/DBQuery/update_query = SSdbcore.NewQuery("UPDATE [format_table_name("mentor_memo")] SET memotext = '[new_memo]', last_editor = '[sql_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE ckey = '[target_sql_ckey]'")
if(!update_query.Execute())
var/err = update_query.ErrorMsg()
+ qdel(update_query)
log_game("SQL ERROR editing memo. Error : \[[err]\]\n")
return
if(target_sql_ckey == sql_ckey)
@@ -91,10 +101,14 @@
else
log_admin("[key_name(src)] has edited [target_sql_ckey]'s mentor memo from [old_memo] to [new_memo]")
message_admins("[key_name_admin(src)] has edited [target_sql_ckey]'s mentor memo from [old_memo] to [new_memo]")
+ qdel(update_query)
+ else
+ qdel(query_memofind)
if("Show")
var/datum/DBQuery/query_memoshow = SSdbcore.NewQuery("SELECT ckey, memotext, timestamp, last_editor FROM [format_table_name("mentor_memo")]")
if(!query_memoshow.Execute())
var/err = query_memoshow.ErrorMsg()
+ qdel(query_memoshow)
log_game("SQL ERROR obtaining ckey, memotext, timestamp, last_editor from memo table. Error : \[[err]\]\n")
return
var/output = null
@@ -107,6 +121,7 @@
if(last_editor)
output += " Last edit by [last_editor] (Click here to see edit log)"
output += " [memotext] "
+ qdel(query_memoshow)
if(!output)
to_chat(src, "No memos found in database.")
return
@@ -115,12 +130,14 @@
var/datum/DBQuery/query_memodellist = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("mentor_memo")]")
if(!query_memodellist.Execute())
var/err = query_memodellist.ErrorMsg()
+ qdel(query_memodellist)
log_game("SQL ERROR obtaining ckey from memo table. Error : \[[err]\]\n")
return
var/list/memolist = list()
while(query_memodellist.NextRow())
var/ckey = query_memodellist.item[1]
memolist += "[ckey]"
+ qdel(query_memodellist)
if(!memolist.len)
to_chat(src, "No memos found in database.")
return
@@ -131,6 +148,7 @@
var/datum/DBQuery/query_memodel = SSdbcore.NewQuery("DELETE FROM [format_table_name("memo")] WHERE ckey = '[target_sql_ckey]'")
if(!query_memodel.Execute())
var/err = query_memodel.ErrorMsg()
+ qdel(query_memodel)
log_game("SQL ERROR removing memo. Error : \[[err]\]\n")
return
if(target_sql_ckey == sql_ckey)
@@ -138,4 +156,4 @@
message_admins("[key_name_admin(src)] has removed their mentor memo.")
else
log_admin("[key_name(src)] has removed [target_sql_ckey]'s mentor memo.")
- message_admins("[key_name_admin(src)] has removed [target_sql_ckey]'s mentor memo.")
\ No newline at end of file
+ message_admins("[key_name_admin(src)] has removed [target_sql_ckey]'s mentor memo.")
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..b13f220eb5 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"
@@ -875,6 +876,7 @@
#include "code\game\mecha\equipment\weapons\mecha_ammo.dm"
#include "code\game\mecha\equipment\weapons\weapons.dm"
#include "code\game\mecha\medical\medical.dm"
+#include "code\game\mecha\medical\medigax.dm"
#include "code\game\mecha\medical\odysseus.dm"
#include "code\game\mecha\working\ripley.dm"
#include "code\game\mecha\working\working.dm"
@@ -1355,6 +1357,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"
@@ -1705,7 +1708,6 @@
#include "code\modules\awaymissions\mission_code\murderdome.dm"
#include "code\modules\awaymissions\mission_code\research.dm"
#include "code\modules\awaymissions\mission_code\snowdin.dm"
-#include "code\modules\awaymissions\mission_code\spacebattle.dm"
#include "code\modules\awaymissions\mission_code\stationCollision.dm"
#include "code\modules\awaymissions\mission_code\undergroundoutpost45.dm"
#include "code\modules\awaymissions\mission_code\wildwest.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/Bepis.js b/tgui-next/packages/tgui/interfaces/Bepis.js
index 993af415dc..71ba5c8cb6 100644
--- a/tgui-next/packages/tgui/interfaces/Bepis.js
+++ b/tgui-next/packages/tgui/interfaces/Bepis.js
@@ -87,15 +87,15 @@ export const Bepis = props => {
- Average technology cost: {data.mean_value}
+ Average technology cost: {data.mean_value}
- Current chance of Success: Est. {data.success_estimate}%
+ Current chance of Success: Est. {data.success_estimate}%
{data.error_name && (
Previous Failure Reason: Deposited cash value too low.
- Please insert more money for future success.
+ Please insert more money for future success.
)}
diff --git a/tgui-next/packages/tgui/interfaces/Canvas.js b/tgui-next/packages/tgui/interfaces/Canvas.js
index b30639697c..9571d94e22 100644
--- a/tgui-next/packages/tgui/interfaces/Canvas.js
+++ b/tgui-next/packages/tgui/interfaces/Canvas.js
@@ -73,7 +73,7 @@ class PaintCanvas extends Component {
height={y_size || 300}
{...rest}
onClick={e => this.clickwrapper(e)}>
- Canvas failed to render.
+ Canvas failed to render.
);
}
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
+ )}
+