diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm
index de74ad13308..757c51a23ab 100644
--- a/code/__DEFINES/genetics.dm
+++ b/code/__DEFINES/genetics.dm
@@ -86,6 +86,21 @@
//#define WHISPER 209 // causes quiet whispering
#define DIZZY 210 // Trippy.
+#define LISP 300
+#define RADIOACTIVE 301
+#define CHAV 302
+#define SWEDISH 303
+#define SCRAMBLED 304
+#define HORNS 305
+#define IMMOLATE 306
+#define CLOAK 307
+#define CHAMELEON 308
+#define CRYO 309
+#define EATER 310
+
+#define JUMPY 400
+#define POLYMORPH 401
+
//disabilities
#define NEARSIGHTED 1
#define EPILEPSY 2
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index f2bbb5df6c1..63cf67b20e6 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -19,6 +19,10 @@
//Lower left, persistant menu
#define ui_inventory "WEST:6,SOUTH:5"
+//Middle left indicators
+#define ui_lingchemdisplay "WEST:6,CENTER-1:15"
+#define ui_lingstingdisplay "WEST:6,CENTER-3:11"
+
//Lower center, persistant menu
#define ui_sstore1 "CENTER-5:10,SOUTH:5"
#define ui_id "CENTER-4:12,SOUTH:5"
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 7c1e933bfcd..f78bfd929a1 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -94,6 +94,8 @@ var/datum/global_hud/global_hud = new()
var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons)
var/obj/screen/lingchemdisplay
+ var/obj/screen/lingstingdisplay
+
var/obj/screen/blobpwrdisplay
var/obj/screen/blobhealthdisplay
var/obj/screen/vampire_blood_display
@@ -234,6 +236,8 @@ datum/hud/New(mob/owner)
src.client.screen -= src.internals
src.client.screen -= src.healthdoll
src.client.screen -= src.gun_setting_icon
+ src.client.screen -= src.hud_used.lingstingdisplay
+ src.client.screen -= src.hud_used.lingchemdisplay
//These ones are not a part of 'adding', 'other' or 'hotkeybuttons' but we want them gone.
src.client.screen -= src.zone_sel //zone_sel is a mob variable for some reason.
@@ -254,6 +258,10 @@ datum/hud/New(mob/owner)
src.client.screen |= src.internals
if(src.gun_setting_icon)
src.client.screen |= src.gun_setting_icon
+ if(src.hud_used.lingstingdisplay)
+ src.client.screen |= src.hud_used.lingstingdisplay
+ if(src.hud_used.lingchemdisplay)
+ src.client.screen |= src.hud_used.lingchemdisplay
src.hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position
src.client.screen += src.zone_sel //This one is a special snowflake
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 0c36b29db06..7236feb439f 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -25,6 +25,20 @@
var/mob/living/carbon/human/H = usr
H.quick_equip()
+/obj/screen/ling
+ invisibility = 101
+
+/obj/screen/ling/sting
+ name = "current sting"
+
+/obj/screen/ling/sting/Click()
+ var/mob/living/carbon/U = usr
+ U.unset_sting()
+
+/obj/screen/ling/chems
+ name = "chemical storage"
+ icon_state = "power_display"
+
/datum/hud/proc/human_hud(var/ui_style='icons/mob/screen1_White.dmi', var/ui_color = "#ffffff", var/ui_alpha = 255)
src.adding = list()
@@ -404,6 +418,12 @@
mymob.pullin.screen_loc = ui_pull_resist
src.hotkeybuttons += mymob.pullin
+ lingchemdisplay = new /obj/screen/ling/chems()
+ lingchemdisplay.screen_loc = ui_lingchemdisplay
+
+ lingstingdisplay = new /obj/screen/ling/sting()
+ lingstingdisplay.screen_loc = ui_lingstingdisplay
+
mymob.blind = new /obj/screen()
mymob.blind.icon = 'icons/mob/screen1_full.dmi'
mymob.blind.icon_state = "blackimageoverlay"
@@ -460,7 +480,7 @@
mymob.client.screen = list()
- mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach )
+ mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, mymob.gun_setting_icon, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach )
mymob.client.screen += src.adding + src.hotkeybuttons
mymob.client.screen += mymob.client.void
inventory_shown = 0;
diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm
index 85f91e53e30..18b45befa88 100644
--- a/code/_onclick/hud/monkey.dm
+++ b/code/_onclick/hud/monkey.dm
@@ -239,6 +239,12 @@
mymob.pullin.screen_loc = ui_pull_resist
src.hotkeybuttons += mymob.pullin
+ lingchemdisplay = new /obj/screen/ling/chems()
+ lingchemdisplay.screen_loc = ui_lingchemdisplay
+
+ lingstingdisplay = new /obj/screen/ling/sting()
+ lingstingdisplay.screen_loc = ui_lingstingdisplay
+
mymob.blind = new /obj/screen()
mymob.blind.icon = 'icons/mob/screen1_full.dmi'
mymob.blind.icon_state = "blackimageoverlay"
@@ -296,7 +302,7 @@
mymob.client.screen = list()
- mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, mymob.gun_setting_icon) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach )
+ mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.healthdoll, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, mymob.gun_setting_icon, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach )
mymob.client.screen += src.adding + src.hotkeybuttons
mymob.client.screen += mymob.client.void
diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm
index cbb074b8d24..5d2bdf58bf6 100644
--- a/code/datums/cargoprofile.dm
+++ b/code/datums/cargoprofile.dm
@@ -255,9 +255,9 @@
id = "weapons"
blacklist = null
//This one is hard since 'weapon contains a lot of things better categorized as devices
- whitelist = list(/obj/item/weapon/banhammer,/obj/item/weapon/sord,/obj/item/weapon/butch,/obj/item/weapon/claymore,/obj/item/weapon/holo/esword,
+ whitelist = list(/obj/item/weapon/banhammer,/obj/item/weapon/sord,/obj/item/weapon/claymore,/obj/item/weapon/holo/esword,
/obj/item/weapon/flamethrower,/obj/item/weapon/grenade,/obj/item/weapon/gun,/obj/item/weapon/hatchet,/obj/item/weapon/katana,
- /obj/item/weapon/kitchenknife,/obj/item/weapon/melee,/obj/item/weapon/nullrod,/obj/item/weapon/pickaxe,/obj/item/weapon/twohanded,
+ /obj/item/weapon/kitchen/knife,/obj/item/weapon/melee,/obj/item/weapon/nullrod,/obj/item/weapon/pickaxe,/obj/item/weapon/twohanded,
/obj/item/weapon/c4,/obj/item/weapon/scalpel,/obj/item/weapon/shield,/obj/item/weapon/grown/nettle/death)
/datum/cargoprofile/tools
diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm
index c2a5d938f78..867eb048903 100644
--- a/code/datums/spells/ethereal_jaunt.dm
+++ b/code/datums/spells/ethereal_jaunt.dm
@@ -19,6 +19,9 @@
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded
for(var/mob/living/target in targets)
+ if(!target.can_safely_leave_loc()) // No more brainmobs hopping out of their brains
+ target << "You are somehow too bound to your current location to abandon it."
+ continue
spawn(0)
if(target.buckled)
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 1570dccdafa..3523a69bf9c 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -289,6 +289,21 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 15
containername = "tactical armor crate"
+/datum/supply_packs/security/armory/swat
+ name = "SWAT gear crate"
+ contains = list(/obj/item/clothing/head/helmet/swat,
+ /obj/item/clothing/head/helmet/swat,
+ /obj/item/clothing/suit/space/swat,
+ /obj/item/clothing/suit/space/swat,
+ /obj/item/weapon/kitchen/knife/combat,
+ /obj/item/weapon/kitchen/knife/combat,
+ /obj/item/clothing/mask/gas/sechailer/swat,
+ /obj/item/clothing/mask/gas/sechailer/swat,
+ /obj/item/weapon/storage/belt/military/assault,
+ /obj/item/weapon/storage/belt/military/assault)
+ cost = 60
+ containername = "assault armor crate"
+
/datum/supply_packs/security/armory/laserarmor
name = "Ablative Armor Crate"
contains = list(/obj/item/clothing/suit/armor/laserproof,
@@ -532,9 +547,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/engineering/engine/spacesuit
name = "Space Suit Crate"
contains = list(/obj/item/clothing/suit/space,
+ /obj/item/clothing/suit/space,
/obj/item/clothing/head/helmet/space,
+ /obj/item/clothing/head/helmet/space,
+ /obj/item/clothing/mask/breath,
/obj/item/clothing/mask/breath,)
- cost = 80
+ cost = 30
containertype = /obj/structure/closet/crate/secure
containername = "space suit crate"
access = access_eva
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 9c30b3305f0..16d00449a55 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -135,7 +135,7 @@ var/list/uplink_items = list()
name = "Meat Cleaver"
desc = "A mean looking meat cleaver that does damage comparable to an Energy Sword but with the added benefit of chopping your victim into hunks of meat after they've died and the chance to stun when thrown."
reference = "MC"
- item = /obj/item/weapon/butch/meatcleaver
+ item = /obj/item/weapon/kitchen/knife/butcher/meatcleaver
cost = 10
job = list("Chef")
diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm
index 0431d666c53..cc957a94c34 100644
--- a/code/game/dna/genes/disabilities.dm
+++ b/code/game/dna/genes/disabilities.dm
@@ -142,6 +142,7 @@
desc = "I wonder wath thith doeth."
activation_message = "Thomething doethn't feel right."
deactivation_message = "You now feel able to pronounce consonants."
+ mutation = LISP
New()
..()
diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm
index 2db8f3e08f0..01c0b9ed535 100644
--- a/code/game/dna/genes/goon_disabilities.dm
+++ b/code/game/dna/genes/goon_disabilities.dm
@@ -31,6 +31,7 @@
activation_message = "You feel a strange sickness permeate your whole body."
deactivation_message = "You no longer feel awful and sick all over."
instability=5
+ mutation = RADIOACTIVE
New()
..()
@@ -130,6 +131,7 @@
desc = "Forces the language center of the subject's brain to construct sentences in a more rudimentary manner."
activation_message = "Ye feel like a reet prat like, innit?"
deactivation_message = "You no longer feel like being rude and sassy."
+ mutation = CHAV
New()
..()
@@ -168,6 +170,7 @@
desc = "Forces the language center of the subject's brain to construct sentences in a vaguely norse manner."
activation_message = "You feel Swedish, however that works."
deactivation_message = "The feeling of Swedishness passes."
+ mutation = SWEDISH
New()
..()
@@ -186,6 +189,7 @@
desc = "Heavily corrupts the part of the brain responsible for forming spoken sentences."
activation_message = "You can't seem to form any coherent thoughts!"
deactivation_message = "Your mind feels more clear."
+ mutation = SCRAMBLED
New()
..()
@@ -252,6 +256,7 @@
desc = "Enables the growth of a compacted keratin formation on the subject's head."
activation_message = "A pair of horns erupt from your head."
deactivation_message = "Your horns crumble away into nothing."
+ mutation = HORNS
New()
..()
@@ -297,6 +302,7 @@
activation_messages = list("You suddenly feel rather hot.")
deactivation_messages = list("You no longer feel uncomfortably hot.")
instability=5
+ mutation = IMMOLATE
spelltype=/obj/effect/proc_holder/spell/targeted/immolate
diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm
index e9e07437350..300074bfa54 100644
--- a/code/game/dna/genes/goon_powers.dm
+++ b/code/game/dna/genes/goon_powers.dm
@@ -48,6 +48,7 @@
activation_messages = list("You begin to fade into the shadows.")
deactivation_messages = list("You become fully visible.")
activation_prob=10
+ mutation = CLOAK
New()
block=SHADOWBLOCK
@@ -74,6 +75,7 @@
activation_messages = list("You feel one with your surroundings.")
deactivation_messages = list("You feel oddly exposed.")
activation_prob=10
+ mutation = CHAMELEON
New()
block=CHAMELEONBLOCK
@@ -120,6 +122,7 @@
activation_messages = list("You notice a strange cold tingle in your fingertips.")
deactivation_messages = list("Your fingers feel warmer.")
instability=10
+ mutation = CRYO
spelltype = /obj/effect/proc_holder/spell/targeted/cryokinesis
@@ -217,6 +220,7 @@
activation_messages = list("You feel hungry.")
deactivation_messages = list("You don't feel quite so hungry anymore.")
instability=3
+ mutation = EATER
spelltype=/obj/effect/proc_holder/spell/targeted/eat
@@ -359,6 +363,7 @@
activation_messages = list("Your leg muscles feel taut and strong.")
deactivation_messages = list("Your leg muscles shrink back to normal.")
instability=2
+ mutation = JUMPY
spelltype =/obj/effect/proc_holder/spell/targeted/leap
@@ -460,6 +465,7 @@
activation_messages = list("You don't feel entirely like yourself somehow.")
deactivation_messages = list("You feel secure in your identity.")
instability=5
+ mutation = POLYMORPH
New()
..()
diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm
index 26e5ffc27e2..65b6ae36acf 100644
--- a/code/game/dna/genes/powers.dm
+++ b/code/game/dna/genes/powers.dm
@@ -158,6 +158,7 @@
if ((HULK in M.mutations) && M.health <= 0)
M.mutations.Remove(HULK)
M.dna.SetSEState(HULKBLOCK,0)
+ genemutcheck(M, HULKBLOCK,null,MUTCHK_FORCED)
M.update_mutations() //update our mutation overlays
M.update_body()
M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | CANPUSH //temporary fix until the problem can be solved.
diff --git a/code/game/dna/genes/vg_disabilities.dm b/code/game/dna/genes/vg_disabilities.dm
index 6cb2c6f6ce8..fe35349e6d4 100644
--- a/code/game/dna/genes/vg_disabilities.dm
+++ b/code/game/dna/genes/vg_disabilities.dm
@@ -4,6 +4,7 @@
desc = "Forces the speaking centre of the subjects brain to yell every sentence."
activation_message = "YOU FEEL LIKE YELLING!"
deactivation_message = "You feel like being quiet.."
+ mutation = LOUD
New()
..()
@@ -43,6 +44,7 @@
desc = "Causes the cerebellum to shut down in some places."
activation_message = "You feel very dizzy..."
deactivation_message = "You regain your balance."
+ mutation = DIZZY
New()
..()
diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm
index ee6c6f50645..86fd12a5069 100644
--- a/code/game/gamemodes/changeling/evolution_menu.dm
+++ b/code/game/gamemodes/changeling/evolution_menu.dm
@@ -411,6 +411,9 @@ var/list/sting_paths
mind.changeling.purchasedpowers -= p
p.on_refund(src)
remove_language("Changeling")
+ if(hud_used)
+ hud_used.lingstingdisplay.icon_state = null
+ hud_used.lingstingdisplay.invisibility = 101
/datum/changeling/proc/has_sting(obj/effect/proc_holder/changeling/power)
for(var/obj/effect/proc_holder/changeling/P in purchasedpowers)
diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index 050f9a74b8e..dbfb14f66d7 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -16,10 +16,14 @@
/obj/effect/proc_holder/changeling/sting/proc/set_sting(var/mob/user)
user << "We prepare our sting, use alt+click or middle mouse button on target to sting them."
user.mind.changeling.chosen_sting = src
+ user.hud_used.lingstingdisplay.icon_state = sting_icon
+ user.hud_used.lingstingdisplay.invisibility = 0
/obj/effect/proc_holder/changeling/sting/proc/unset_sting(var/mob/user)
user << "We retract our sting, we can't sting anyone for now."
user.mind.changeling.chosen_sting = null
+ user.hud_used.lingstingdisplay.icon_state = null
+ user.hud_used.lingstingdisplay.invisibility = 101
/mob/living/carbon/proc/unset_sting()
if(mind && mind.changeling && mind.changeling.chosen_sting)
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 87cc9c46b58..a1a5d646544 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -276,6 +276,9 @@
var/area/A = get_area(cult_mind.current )
if ( is_type_in_list(A, centcom_areas))
acolytes_survived++
+ else if(A == shuttle_master.emergency.areaInstance && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) //snowflaked into objectives because shitty bay shuttles had areas to auto-determine this
+ acolytes_survived++
+
if(acolytes_survived>=acolytes_needed)
return 0
else
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 3b5127c10c6..af6961bae99 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -300,6 +300,8 @@ proc/issyndicate(mob/living/M as mob)
for(var/obj/item/weapon/disk/nuclear/D in world)
var/disk_area = get_area(D)
if(!is_type_in_list(disk_area, centcom_areas))
+ if(disk_area == shuttle_master.emergency.areaInstance && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) //snowflaked into objectives because shitty bay shuttles had areas to auto-determine this
+ break
disk_rescued = 0
break
var/crew_evacuated = (shuttle_master.emergency.mode >= SHUTTLE_ESCAPE)
diff --git a/code/game/gamemodes/vampire/hud.dm b/code/game/gamemodes/vampire/hud.dm
index 8df7e893273..727ae3bdc25 100644
--- a/code/game/gamemodes/vampire/hud.dm
+++ b/code/game/gamemodes/vampire/hud.dm
@@ -1,8 +1,8 @@
/datum/hud/proc/vampire_hud(ui_style = 'icons/mob/screen1_Midnight.dmi')
vampire_blood_display = new /obj/screen()
- vampire_blood_display.name = "Vampire Blood"
- vampire_blood_display.icon_state = "dark128"
+ vampire_blood_display.name = "Usable Blood"
+ vampire_blood_display.icon_state = "power_display"
vampire_blood_display.screen_loc = "WEST:6,CENTER-1:15"
vampire_blood_display.layer = 20
diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm
index 3cdcab84d17..40da7a5bca3 100644
--- a/code/game/gamemodes/vampire/vampire.dm
+++ b/code/game/gamemodes/vampire/vampire.dm
@@ -431,9 +431,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
if(hud_used)
if(!hud_used.vampire_blood_display)
hud_used.vampire_hud()
- hud_used.vampire_blood_display.maptext_width = 64
- hud_used.vampire_blood_display.maptext_height = 26
- hud_used.vampire_blood_display.maptext = "
U:[mind.vampire.bloodusable]
T:[mind.vampire.bloodtotal]
"
+ hud_used.vampire_blood_display.maptext = "[mind.vampire.bloodusable]
"
handle_vampire_cloak()
if(istype(loc, /turf/space))
check_sun()
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 7510a400e16..f23ef05ad57 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -520,7 +520,7 @@ var/global/list/multiverse = list()
M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/utensil/knife(M), slot_l_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
M.equip_to_slot_or_del(sword, slot_r_hand)
for(var/obj/item/carried_item in M.contents)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 22d33684c4a..0b34638ef44 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -208,6 +208,7 @@
active_power_usage = 500
var/printing = null
var/printing_text = null
+ var/known_implants = list(/obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking)
/obj/machinery/body_scanconsole/power_change()
if(stat & BROKEN)
@@ -345,6 +346,15 @@
bloodData["bloodMax"] = H.max_blood
occupantData["blood"] = bloodData
+ var/implantData[0]
+ for(var/obj/item/weapon/implant/I in H)
+ if(I.implanted && is_type_in_list(I, known_implants))
+ var/implantSubData[0]
+ implantSubData["name"] = sanitize(I.name)
+ implantData.Add(list(implantSubData))
+ occupantData["implant"] = implantData
+ occupantData["implant_len"] = implantData.len
+
var/extOrganData[0]
for(var/obj/item/organ/external/E in H.organs)
var/organData[0]
@@ -358,15 +368,15 @@
organData["bruised"] = E.min_bruised_damage
organData["broken"] = E.min_broken_damage
- var/implantData[0]
+ var/shrapnelData[0]
for(var/obj/I in E.implants)
- var/implantSubData[0]
- implantSubData["name"] = I.name
+ var/shrapnelSubData[0]
+ shrapnelSubData["name"] = I.name
- implantData.Add(list(implantSubData))
+ shrapnelData.Add(list(shrapnelSubData))
- organData["implants"] = implantData
- organData["implants_len"] = implantData.len
+ organData["shrapnel"] = shrapnelData
+ organData["shrapnel_len"] = shrapnelData.len
var/organStatus[0]
if(E.status & ORGAN_DESTROYED)
diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index fcc683646cd..517b96be864 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -249,6 +249,9 @@
/obj/machinery/smartfridge/attack_ai(mob/user as mob)
return 0
+/obj/machinery/smartfridge/attack_ghost(mob/user as mob)
+ return src.attack_hand(user)
+
/obj/machinery/smartfridge/attack_hand(mob/user as mob)
if(stat & (NOPOWER|BROKEN))
return
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 687032011b1..d9d766e9787 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -547,6 +547,9 @@ var/list/turret_icons
if(!istype(L))
return TURRET_NOT_TARGET
+ if(get_turf(L) == get_turf(src))
+ return TURRET_NOT_TARGET
+
if(L.invisibility >= INVISIBILITY_LEVEL_ONE) // Cannot see him. see_invisible is a mob-var
return TURRET_NOT_TARGET
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index f754155d7c7..2e99d634d60 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -242,9 +242,7 @@
badcount++
for(var/obj/item/device/transfer_valve/B in src.loc)
badcount++
- for(var/obj/item/weapon/kitchen/utensil/knife/K in src.loc)
- badcount++
- for(var/obj/item/weapon/kitchenknife/KK in src.loc)
+ for(var/obj/item/weapon/kitchen/knife/K in src.loc)
badcount++
for(var/obj/item/weapon/c4/KK in src.loc)
badcount++
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 0a1e3a1c1b5..c3f43ce7968 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1061,7 +1061,7 @@
product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
icon_state = "dinnerware"
products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,
- /obj/item/weapon/kitchenknife = 3,/obj/item/weapon/kitchen/rollingpin = 2,
+ /obj/item/weapon/kitchen/knife = 3,/obj/item/weapon/kitchen/rollingpin = 2,
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8, /obj/item/clothing/suit/chef/classic = 2,
/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,
/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5,
@@ -1069,7 +1069,7 @@
/obj/item/weapon/kitchen/mould/bean = 1, /obj/item/weapon/kitchen/mould/ball = 1,
/obj/item/weapon/kitchen/mould/cane = 1, /obj/item/weapon/kitchen/mould/cash = 1,
/obj/item/weapon/kitchen/mould/coin = 1, /obj/item/weapon/kitchen/mould/loli = 1)
- contraband = list(/obj/item/weapon/kitchen/utensil/spoon = 2,/obj/item/weapon/kitchen/utensil/knife = 2,/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2)
+ contraband = list(/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/kitchen/knife/butcher = 2)
/obj/machinery/vending/sovietsoda
name = "\improper BODA"
@@ -1146,7 +1146,7 @@
products = list(/obj/item/weapon/reagent_containers/food/snacks/tofu = 24,
/obj/item/weapon/reagent_containers/food/drinks/ice = 12,
/obj/item/weapon/reagent_containers/food/snacks/candy_corn = 6)
- contraband = list(/obj/item/weapon/kitchen/utensil/knife = 6)
+ contraband = list(/obj/item/weapon/kitchen/knife = 6)
/obj/machinery/vending/hatdispenser
name = "\improper Hatlord 9000"
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 3ea7afe0b8d..c482eac5412 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -434,8 +434,8 @@
P.failchance = 0
P.icon_state = "anom"
P.name = "wormhole"
- message_admins("[key_name_admin(chassis.occupant, chassis.occupant.client)](?) (FLW) used a Wormhole Generator in ([T.x],[T.y],[T.z] - JMP)",0,1)
- log_game("[key_name(chassis.occupant)] used a Wormhole Generator in ([T.x],[T.y],[T.z])")
+ message_admins("[key_name_admin(chassis.occupant, chassis.occupant.client)](?) (FLW) used a Wormhole Generator in ([loc.x],[loc.y],[loc.z] - JMP)",0,1)
+ log_game("[key_name(chassis.occupant)] used a Wormhole Generator in ([loc.x],[loc.y],[loc.z])")
do_after_cooldown()
src = null
spawn(rand(150,300))
@@ -1088,9 +1088,7 @@
return
var/list/occupant = list()
occupant |= mecha.occupant
- mecha.occupant.sight |= SEE_TURFS
scanning = 1
mineral_scan_pulse(occupant,get_turf(loc))
spawn(equip_cooldown)
- scanning = 0
- mecha.occupant.sight -= SEE_TURFS
+ scanning = 0
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index b984cc86719..e1c1994556e 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -57,7 +57,9 @@
return ..()
-/obj/item/device/radio/headset/receive_range(freq, level)
+/obj/item/device/radio/headset/receive_range(freq, level, aiOverride = 0)
+ if(aiOverride)
+ return ..(freq, level)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
if(H.l_ear == src || H.r_ear == src)
diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm
index 28c573be0bb..47efe52d21f 100644
--- a/code/game/objects/items/devices/uplinks.dm
+++ b/code/game/objects/items/devices/uplinks.dm
@@ -20,13 +20,13 @@ var/list/world_uplinks = list()
var/purchase_log = ""
var/uplink_owner = null//text-only
var/used_TC = 0
-
+
var/job = null
var/show_descriptions = 0
/obj/item/device/uplink/nano_host()
- return loc
-
+ return loc
+
/obj/item/device/uplink/New()
..()
welcome = ticker.mode.uplink_welcome
@@ -48,7 +48,7 @@ var/list/world_uplinks = list()
/obj/item/device/uplink/proc/generate_menu(mob/user as mob)
if(!job)
job = user.mind.assigned_role
-
+
var/dat = "[src.welcome]
"
dat += "Telecrystals left: [src.uses]
"
dat += "
"
@@ -82,7 +82,7 @@ var/list/world_uplinks = list()
/obj/item/device/uplink/proc/generate_item_lists(mob/user as mob)
if(!job)
job = user.mind.assigned_role
-
+
var/list/nano = new
var/list/reference = new
@@ -92,7 +92,7 @@ var/list/world_uplinks = list()
if(I.job && I.job.len)
if(!(I.job.Find(job)))
continue
- nano[nano.len]["items"] += list(list("Name" = I.name, "Description" = I.description(),"Cost" = I.cost, "obj_path" = I.reference))
+ nano[nano.len]["items"] += list(list("Name" = sanitize(I.name), "Description" = sanitize(I.description()),"Cost" = I.cost, "obj_path" = I.reference))
reference[I.reference] = I
var/datum/nano_item_lists/result = new
@@ -130,7 +130,7 @@ var/list/world_uplinks = list()
return
UI.buy(src,usr)
nanomanager.update_uis(src)
-
+
/* var/list/L = UI.spawn_item(get_turf(usr),src)
if(ishuman(usr))
var/mob/living/carbon/human/A = usr
@@ -244,7 +244,7 @@ var/list/world_uplinks = list()
update_nano_data(href_list["id"])
if(href_list["descriptions"])
show_descriptions = !show_descriptions
- update_nano_data()
+ update_nano_data()
nanomanager.update_uis(src)
return 1
@@ -253,7 +253,7 @@ var/list/world_uplinks = list()
if(nanoui_menu == 1)
var/permanentData[0]
for(var/datum/data/record/L in sortRecord(data_core.general))
- permanentData[++permanentData.len] = list(Name = L.fields["name"],"id" = L.fields["id"])
+ permanentData[++permanentData.len] = list(Name = sanitize(L.fields["name"]),"id" = L.fields["id"])
nanoui_data["exploit_records"] = permanentData
if(nanoui_menu == 11)
@@ -283,7 +283,7 @@ var/list/world_uplinks = list()
src.hidden_uplink.trigger(user)
return 1
return 0
-
+
//Refund proc for the borg teleporter (later I'll make a general refund proc if there is demand for it)
/obj/item/device/radio/uplink/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/antag_spawner/borg_tele))
@@ -293,8 +293,8 @@ var/list/world_uplinks = list()
qdel(S)
user << "Teleporter refunded."
else
- user << "This teleporter is already used, or is currently being used."
-
+ user << "This teleporter is already used, or is currently being used."
+
// PRESET UPLINKS
// A collection of preset uplinks.
//
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index bac1cdb68f5..b1659d8f2f2 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -91,8 +91,7 @@
//Step one - dehairing.
/obj/item/stack/sheet/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if( istype(W, /obj/item/weapon/kitchenknife) || \
- istype(W, /obj/item/weapon/kitchen/utensil/knife) || \
+ if( istype(W, /obj/item/weapon/kitchen/knife) || \
istype(W, /obj/item/weapon/twohanded/fireaxe) || \
istype(W, /obj/item/weapon/hatchet) )
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 47e90245760..9c508c07966 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -45,7 +45,7 @@ var/global/list/datum/stack_recipe/plastic_recipes = list ( \
new/datum/stack_recipe("plastic ashtray", /obj/item/ashtray/plastic, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("plastic fork", /obj/item/weapon/kitchen/utensil/pfork, 1, on_floor = 1), \
new/datum/stack_recipe("plastic spoon", /obj/item/weapon/kitchen/utensil/pspoon, 1, on_floor = 1), \
- new/datum/stack_recipe("plastic knife", /obj/item/weapon/kitchen/utensil/pknife, 1, on_floor = 1), \
+ new/datum/stack_recipe("plastic knife", /obj/item/weapon/kitchen/knife/plastic, 1, on_floor = 1), \
new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1), \
new/datum/stack_recipe("bear mould", /obj/item/weapon/kitchen/mould/bear, 1, on_floor = 1), \
new/datum/stack_recipe("worm mould", /obj/item/weapon/kitchen/mould/worm, 1, on_floor = 1), \
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index d6d0c8cf000..e738b7e6d60 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -92,110 +92,73 @@
/*
* Knives
*/
-/obj/item/weapon/kitchen/utensil/knife
- name = "knife"
- desc = "Can cut through any food."
- icon_state = "knife"
- force = 10.0
- throwforce = 10.0
- sharp = 1
- edge = 1
-
- suicide_act(mob/user)
- viewers(user) << pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
- "[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
- "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
- return (BRUTELOSS)
-
-/obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
- if ((CLUMSY in user.mutations) && prob(50))
- user << "\red You accidentally cut yourself with the [src]."
- user.take_organ_damage(20)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return
- return ..()
-
-/obj/item/weapon/kitchen/utensil/pknife
- name = "plastic knife"
- desc = "The bluntest of blades."
- icon_state = "pknife"
- force = 10.0
- throwforce = 10.0
-
-/*
- * Kitchen knives
- */
-/obj/item/weapon/kitchenknife
+/obj/item/weapon/kitchen/knife
name = "kitchen knife"
- icon = 'icons/obj/kitchen.dmi'
icon_state = "knife"
desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
flags = CONDUCT
- sharp = 1
- edge = 1
- force = 10.0
- w_class = 3.0
- throwforce = 6.0
+ force = 10
+ w_class = 2
+ throwforce = 10
+ hitsound = 'sound/weapons/bladeslice.ogg'
throw_speed = 3
throw_range = 6
materials = list(MAT_METAL=12000)
origin_tech = "materials=1"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- hitsound = 'sound/weapons/bladeslice.ogg'
+ no_embed = 1
+ sharp = 1
+ edge = 1
- suicide_act(mob/user)
- viewers(user) << pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
- "[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
- "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
- return (BRUTELOSS)
+/obj/item/weapon/kitchen/knife/suicide_act(mob/user)
+ user.visible_message(pick("[user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
+ "[user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
+ "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku."))
+ return (BRUTELOSS)
-/obj/item/weapon/kitchenknife/combat
- name = "combat knife"
- force = 15.0
- throwforce = 10.0
- w_class = 2
- origin_tech = "materials=2;combat=2"
- desc = "A razor sharp knife, built from advanced alloys, designed for quick, melee killing. Also not half bad as a kitchen knife."
- slot_flags = SLOT_BELT
- icon = 'icons/obj/weapons.dmi'
- icon_state = "combatknife"
+/obj/item/weapon/kitchen/knife/plastic
+ name = "plastic knife"
+ desc = "The bluntest of blades."
+ icon_state = "pknife"
+ item_state = "knife"
+ sharp = 0
+ edge = 0
-
-/obj/item/weapon/kitchenknife/ritual
+/obj/item/weapon/kitchen/knife/ritual
name = "ritual knife"
desc = "The unearthly energies that once powered this blade are now dormant."
icon = 'icons/obj/wizard.dmi'
icon_state = "render"
+ w_class = 3
-/*
- * Bucher's cleaver
- */
-/obj/item/weapon/butch
- name = "butcher's Cleaver"
- icon = 'icons/obj/kitchen.dmi'
+/obj/item/weapon/kitchen/knife/butcher
+ name = "butcher's cleaver"
icon_state = "butch"
desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products."
flags = CONDUCT
- force = 15.0
- w_class = 3.0
- throwforce = 8.0
- throw_speed = 3
- throw_range = 6
- materials = list(MAT_METAL=12000)
- origin_tech = "materials=1"
+ force = 15
+ throwforce = 8
attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharp = 1
- edge = 1
+ w_class = 3
-/obj/item/weapon/butch/meatcleaver
+/obj/item/weapon/kitchen/knife/butcher/meatcleaver
name = "Meat Cleaver"
icon_state = "mcleaver"
item_state = "butch"
desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products."
force = 25.0
throwforce = 15.0
- no_embed = 1
+
+/obj/item/weapon/kitchen/knife/combat
+ name = "combat knife"
+ icon_state = "combatknife"
+ item_state = "knife"
+ desc = "A military combat utility survival knife."
+ force = 20
+ throwforce = 20
+ origin_tech = "materials=2;combat=4"
+ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut")
+
/*
* Rolling Pins
*/
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index ffa9cfdb1cd..f727326b3f1 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -159,6 +159,7 @@
"/obj/item/ammo_box",
"/obj/item/weapon/reagent_containers/food/snacks/donut/normal",
"/obj/item/weapon/reagent_containers/food/snacks/donut/jelly",
+ "/obj/item/weapon/kitchen/knife/combat",
"/obj/item/weapon/melee/baton",
"/obj/item/weapon/melee/classic_baton",
"/obj/item/device/flashlight/seclite",
@@ -172,7 +173,7 @@
/obj/item/weapon/storage/belt/security/response_team/New()
..()
- new /obj/item/weapon/kitchenknife/combat(src)
+ new /obj/item/weapon/kitchen/knife/combat(src)
new /obj/item/weapon/melee/baton/loaded(src)
new /obj/item/device/flash(src)
new /obj/item/weapon/melee/classic_baton/telescopic(src)
@@ -215,6 +216,13 @@
icon_state = "militarybelt"
item_state = "military"
+/obj/item/weapon/storage/belt/military/assault
+ name = "assault belt"
+ desc = "A tactical assault belt."
+ icon_state = "assaultbelt"
+ item_state = "assault"
+ storage_slots = 6
+
/obj/item/weapon/storage/belt/janitor
name = "janibelt"
desc = "A belt used to hold most janitorial supplies."
@@ -245,7 +253,7 @@
desc = "A bandolier for holding shotgun ammunition."
icon_state = "bandolier"
item_state = "bandolier"
- storage_slots = 6
+ storage_slots = 8
can_hold = list(
"/obj/item/ammo_casing/shotgun"
)
@@ -258,6 +266,8 @@
new /obj/item/ammo_casing/shotgun/beanbag(src)
new /obj/item/ammo_casing/shotgun/beanbag(src)
new /obj/item/ammo_casing/shotgun/beanbag(src)
+ new /obj/item/ammo_casing/shotgun/beanbag(src)
+ new /obj/item/ammo_casing/shotgun/beanbag(src)
/obj/item/weapon/storage/belt/holster
name = "shoulder holster"
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 520de21301c..bb6b10cf730 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -26,6 +26,7 @@
throw_range = 4
throwforce = 10
w_class = 1
+ var/transformed = 0
suicide_act(mob/user)
viewers(user) << "[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide."
@@ -57,6 +58,28 @@
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
..()
+/obj/item/weapon/nullrod/afterattack(var/obj/item/I as obj, mob/user as mob, proximity)
+ if(!proximity)
+ return
+ if(istype(I, /obj/item/clothing/suit/armor/riot/knight/templar)) //Only the Chaplain's holy armor is capable fo performing this feat.
+ if(!transformed) // can't turn a sword into a sword.
+ user << "You sheath the [src] into the [I]'s scabbard, transforming it into a holy sword."
+ user.unEquip(src)
+ qdel(src)
+ var/obj/item/weapon/nullrod/sword/S = new /obj/item/weapon/nullrod/sword
+ user.put_in_hands(S)
+
+/obj/item/weapon/nullrod/sword
+ name = "holy sword"
+ desc = "A sword imbued with holy power, its very presence disrupts and dampens the powers of paranormal phenomenae."
+ icon_state = "claymore"
+ item_state = "claymore"
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ w_class = 3 //transforming it is not without its downsides.
+ sharp = 1
+ edge = 1
+ transformed = 1
+
/obj/item/weapon/sord
name = "\improper SORD"
desc = "This thing is so unspeakably shitty you are having a hard time even holding it."
@@ -159,7 +182,7 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params)
..()
if(istype(I, /obj/item/weapon/shard))
var/obj/item/weapon/twohanded/spear/S = new /obj/item/weapon/twohanded/spear
-
+
if(!remove_item_from_storage(user))
user.unEquip(src)
user.unEquip(I)
@@ -173,7 +196,7 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params)
var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod
if(!remove_item_from_storage(user))
- user.unEquip(src)
+ user.unEquip(src)
user.unEquip(I)
user.put_in_hands(P)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm
new file mode 100644
index 00000000000..d8577c53e27
--- /dev/null
+++ b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm
@@ -0,0 +1,33 @@
+/obj/structure/closet/secure_closet/chaplain
+ name = "chapel wardrobe"
+ desc = "A lockable storage unit for Nanotrasen-approved religious attire."
+ req_access = list(access_chapel_office)
+ icon_state = "chaplainsecure1"
+ icon_closed = "chaplainsecure"
+ icon_locked = "chaplainsecure1"
+ icon_opened = "chaplainsecureopen"
+ icon_broken = "chaplainsecurebroken"
+ icon_off = "chaplainsecureoff"
+
+/obj/structure/closet/secure_closet/chaplain/New()
+ ..()
+ sleep(2)
+ new /obj/item/clothing/under/rank/chaplain(src)
+ new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/suit/nun(src)
+ new /obj/item/clothing/head/nun_hood(src)
+ new /obj/item/clothing/suit/chaplain_hoodie(src)
+ new /obj/item/clothing/head/chaplain_hood(src)
+ new /obj/item/clothing/suit/holidaypriest(src)
+ new /obj/item/clothing/under/wedding/bride_white(src)
+ new /obj/item/weapon/storage/backpack/cultpack (src)
+ new /obj/item/clothing/head/helmet/knight/templar(src)
+ new /obj/item/clothing/suit/armor/riot/knight/templar(src)
+ new /obj/item/weapon/storage/fancy/candle_box/eternal(src)
+ new /obj/item/weapon/storage/fancy/candle_box/eternal(src)
+ new /obj/item/weapon/storage/fancy/candle_box/eternal(src)
+ new /obj/item/clothing/gloves/ring/silver(src)
+ new /obj/item/clothing/gloves/ring/silver(src)
+ new /obj/item/clothing/gloves/ring/gold(src)
+ new /obj/item/clothing/gloves/ring/gold(src)
+ return
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index be567173078..7b81a5b6460 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -249,6 +249,7 @@
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/clothing/glasses/hud/health/health_advanced
new /obj/item/clothing/head/beret/centcom/officer(src)
+ new /obj/item/clothing/head/beret/centcom/officer/navy(src)
new /obj/item/clothing/suit/armor/vest/blueshield(src)
new /obj/item/clothing/suit/storage/blueshield(src)
new /obj/item/clothing/shoes/centcom(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 1cd91b7c9a4..c5e3c92848b 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -111,35 +111,6 @@
new /obj/item/clothing/head/soft/black(src)
return
-
-/obj/structure/closet/wardrobe/chaplain_black
- name = "chapel wardrobe"
- desc = "It's a storage unit for Nanotrasen-approved religious attire."
- icon_state = "black"
- icon_closed = "black"
-
-/obj/structure/closet/wardrobe/chaplain_black/New()
- ..()
- sleep(2)
- new /obj/item/clothing/under/rank/chaplain(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/suit/nun(src)
- new /obj/item/clothing/head/nun_hood(src)
- new /obj/item/clothing/suit/chaplain_hoodie(src)
- new /obj/item/clothing/head/chaplain_hood(src)
- new /obj/item/clothing/suit/holidaypriest(src)
- new /obj/item/clothing/under/wedding/bride_white(src)
- new /obj/item/weapon/storage/backpack/cultpack (src)
- new /obj/item/weapon/storage/fancy/candle_box/eternal(src)
- new /obj/item/weapon/storage/fancy/candle_box/eternal(src)
- new /obj/item/weapon/storage/fancy/candle_box/eternal(src)
- new /obj/item/clothing/gloves/ring/silver(src)
- new /obj/item/clothing/gloves/ring/silver(src)
- new /obj/item/clothing/gloves/ring/gold(src)
- new /obj/item/clothing/gloves/ring/gold(src)
- return
-
-
/obj/structure/closet/wardrobe/green
name = "green wardrobe"
icon_state = "green"
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 1afa2d95504..fabaf4c63f0 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -314,6 +314,7 @@
if(dir != NORTH)
layer = 5
flipped = 1
+ smooth = SMOOTH_FALSE
flags |= ON_BORDER
for(var/D in list(turn(direction, 90), turn(direction, -90)))
if(locate(/obj/structure/table,get_step(src,D)))
@@ -339,6 +340,7 @@
layer = initial(layer)
flipped = 0
+ smooth = initial(smooth)
flags &= ~ON_BORDER
for(var/D in list(turn(dir, 90), turn(dir, -90)))
if(locate(/obj/structure/table,get_step(src,D)))
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index b17e51fef19..a8f5a8bba79 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -605,7 +605,7 @@ var/send_emergency_team
new /obj/item/clothing/mask/breath( src )
new /obj/item/weapon/tank/emergency_oxygen/engi( src )
new /obj/item/device/flashlight/flare( src )
- new /obj/item/weapon/kitchenknife/combat( src )
+ new /obj/item/weapon/kitchen/knife/combat( src )
new /obj/item/device/radio/centcom( src )
new /obj/item/weapon/reagent_containers/pill/salicylic( src )
new /obj/item/weapon/reagent_containers/pill/patch/synthflesh( src )
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index f40506230e9..25694f28fc3 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -232,13 +232,12 @@
CW.update_icon(0)
playsound(src, 'sound/items/Screwdriver.ogg', 80, 1)
-/turf/simulated/floor/airless
- icon_state = "floor"
+/turf/simulated/floor/plasteel/airless
name = "airless floor"
oxygen = 0.01
nitrogen = 0.01
temperature = TCMB
-/turf/simulated/floor/airless/New()
+/turf/simulated/floor/plasteel/airless/New()
..()
name = "floor"
\ No newline at end of file
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index ba1c8872937..db488c84649 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -194,21 +194,37 @@ var/list/admin_verbs_proccall = list (
/client/proc/add_admin_verbs()
if(holder)
verbs += admin_verbs_default
- if(holder.rights & R_BUILDMODE) verbs += /client/proc/togglebuildmodeself
- if(holder.rights & R_ADMIN) verbs += admin_verbs_admin
- if(holder.rights & R_BAN) verbs += admin_verbs_ban
- if(holder.rights & R_EVENT) verbs += admin_verbs_event
- if(holder.rights & R_SERVER) verbs += admin_verbs_server
- if(holder.rights & R_DEBUG) verbs += admin_verbs_debug
- if(holder.rights & R_POSSESS) verbs += admin_verbs_possess
- if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions
- if(holder.rights & R_STEALTH) verbs += /client/proc/stealth
- if(holder.rights & R_REJUVINATE) verbs += admin_verbs_rejuv
- if(holder.rights & R_SOUNDS) verbs += admin_verbs_sounds
- if(holder.rights & R_SPAWN) verbs += admin_verbs_spawn
- if(holder.rights & R_MOD) verbs += admin_verbs_mod
- if(holder.rights & R_MENTOR) verbs += admin_verbs_mentor
- if(holder.rights & R_PROCCALL) verbs += admin_verbs_proccall
+ if(holder.rights & R_BUILDMODE)
+ verbs += /client/proc/togglebuildmodeself
+ if(holder.rights & R_ADMIN)
+ verbs += admin_verbs_admin
+ control_freak = 0
+ if(holder.rights & R_BAN)
+ verbs += admin_verbs_ban
+ if(holder.rights & R_EVENT)
+ verbs += admin_verbs_event
+ if(holder.rights & R_SERVER)
+ verbs += admin_verbs_server
+ if(holder.rights & R_DEBUG)
+ verbs += admin_verbs_debug
+ if(holder.rights & R_POSSESS)
+ verbs += admin_verbs_possess
+ if(holder.rights & R_PERMISSIONS)
+ verbs += admin_verbs_permissions
+ if(holder.rights & R_STEALTH)
+ verbs += /client/proc/stealth
+ if(holder.rights & R_REJUVINATE)
+ verbs += admin_verbs_rejuv
+ if(holder.rights & R_SOUNDS)
+ verbs += admin_verbs_sounds
+ if(holder.rights & R_SPAWN)
+ verbs += admin_verbs_spawn
+ if(holder.rights & R_MOD)
+ verbs += admin_verbs_mod
+ if(holder.rights & R_MENTOR)
+ verbs += admin_verbs_mentor
+ if(holder.rights & R_PROCCALL)
+ verbs += admin_verbs_proccall
/client/proc/remove_admin_verbs()
verbs.Remove(
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 4b862a69453..c3489499058 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -670,7 +670,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_hand)
+ M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store)
@@ -694,9 +694,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/rollingpin(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_s_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand)
+ M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_r_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_s_store)
if ("tournament janitor")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform)
@@ -773,7 +773,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm
index 1144513f058..d609b5f8ac7 100644
--- a/code/modules/admin/verbs/striketeam_syndicate.dm
+++ b/code/modules/admin/verbs/striketeam_syndicate.dm
@@ -144,8 +144,7 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(src), slot_back)
- equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m762/buckshot, slot_in_backpack)
- equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m762/he, slot_in_backpack)
+ equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m762, slot_in_backpack)
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m45(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack)
@@ -163,7 +162,7 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store)
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol/m2411(src), slot_belt)
- equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/l6_saw/devastator(src), slot_r_hand)
+ equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/l6_saw(src), slot_r_hand)
var/obj/item/weapon/card/id/syndicate/W = new(src) //Untrackable by AI
W.name = "[real_name]'s ID Card"
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm
index 8b315661a34..4d9237bd11c 100644
--- a/code/modules/client/client defines.dm
+++ b/code/modules/client/client defines.dm
@@ -78,4 +78,6 @@
var/reset_stretch = 0 //Used by things that fiddle with client's stretch-to-fit.
- var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier
\ No newline at end of file
+ var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier
+
+ control_freak = CONTROL_FREAK_ALL | CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS
\ No newline at end of file
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 856106ba48f..0c3c59595b2 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -178,19 +178,20 @@ BLIND // can't see anything
/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wirecutters))
- if(clipped == 0)
+ if(!clipped)
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
- user.visible_message("\red [user] snips the fingertips off [src].","\red You snip the fingertips off [src].")
+ user.visible_message("[user] snips the fingertips off [src].","You snip the fingertips off [src].")
clipped = 1
+ name = "mangled [name]"
+ desc = "[desc] They have had the fingertips cut off of them."
if("exclude" in species_restricted)
- name = "mangled [name]"
- desc = "[desc] They have had the fingertips cut off of them."
species_restricted -= "Unathi"
species_restricted -= "Tajaran"
- else if(clipped == 1)
- user << "[src] have already been clipped!"
update_icon()
+ else
+ user << "[src] have already been clipped!"
return
+ else
..()
/obj/item/clothing/gloves/proc/Touch()
@@ -317,6 +318,8 @@ BLIND // can't see anything
desc = "Comfortable-looking shoes."
gender = PLURAL //Carn: for grammarically correct text-parsing
var/chained = 0
+ var/can_cut_open = 0
+ var/cut_open = 0
body_parts_covered = FEET
slot_flags = SLOT_FEET
@@ -333,16 +336,36 @@ BLIND // can't see anything
/obj/item/clothing/shoes/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/match) && src.loc == user)
var/obj/item/weapon/match/M = I
- if(M.lit == 0)
+ if(!M.lit) // Match isn't lit, but isn't burnt.
M.lit = 1
M.icon_state = "match_lit"
processing_objects.Add(M)
M.update_icon()
- user << "You strike the [M] along your [src] to light it."
- else if(M.lit == 1)
+ user.visible_message("[user] strikes a [M] on the bottom of [src], lighting it.","You strike the [M] on the bottom of [src] to light it.")
+ else if(M.lit == 1) // Match is lit, not extinguished.
M.dropped()
- user << "You crush the [M] into the bottom of your [src], extinguishing it."
+ user.visible_message("[user] crushes the [M] into the bottom of [src]. extinguishing it.","You crush the [M] into the bottom of [src], extinguishing it.")
+ else // Match has been previously lit and extinguished.
+ user << "The [M] has already been extinguished."
return
+
+ if(istype(I, /obj/item/weapon/wirecutters))
+ if(can_cut_open)
+ if(!cut_open)
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ user.visible_message("[user] cuts open the toes of [src].","You cut open the toes of [src].")
+ cut_open = 1
+ icon_state = "[icon_state]_opentoe"
+ item_state = "[item_state]_opentoe"
+ name = "mangled [name]"
+ desc = "[desc] They have had their toes opened up."
+ if("exclude" in species_restricted)
+ species_restricted -= "Unathi"
+ species_restricted -= "Tajaran"
+ update_icon()
+ else
+ user << "[src] have already had their toes cut open!"
+ return
else
..()
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 062aa169075..d079005087c 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -154,6 +154,35 @@ obj/item/clothing/head/blob
flags = HEADCOVERSEYES|HEADCOVERSMOUTH
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
+/obj/item/clothing/head/helmet/knight
+ name = "medieval helmet"
+ desc = "A classic metal helmet."
+ icon_state = "knight_green"
+ item_state = "knight_green"
+ armor = list(melee = 41, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0)
+ flags = BLOCKHAIR|HEADCOVERSEYES|HEADCOVERSMOUTH
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+ strip_delay = 80
+
+/obj/item/clothing/head/helmet/knight/blue
+ icon_state = "knight_blue"
+ item_state = "knight_blue"
+
+/obj/item/clothing/head/helmet/knight/yellow
+ icon_state = "knight_yellow"
+ item_state = "knight_yellow"
+
+/obj/item/clothing/head/helmet/knight/red
+ icon_state = "knight_red"
+ item_state = "knight_red"
+
+/obj/item/clothing/head/helmet/knight/templar
+ name = "crusader helmet"
+ desc = "Deus Vult."
+ icon_state = "knight_templar"
+ item_state = "knight_templar"
+
+
//Commander
/obj/item/clothing/head/helmet/ert/command
name = "emergency response team commander helmet"
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 7c353ed8c82..4112164f0e3 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -284,6 +284,15 @@
name = "officers beret"
desc = "A black beret adorned with the shield—a silver kite shield with an engraved sword—of the Nanotrasen security forces, announcing to the world that the wearer is a defender of Nanotrasen."
icon_state = "beret_centcom_officer"
+ armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ strip_delay = 60
+
+/obj/item/clothing/head/beret/centcom/officer/navy
+ name = "navy blue officers beret"
+ desc = "A navy blue beret adorned with the shield—a silver kite shield with an engraved sword—of the Nanotrasen security forces, announcing to the world that the wearer is a defender of Nanotrasen."
+ icon_state = "beret_centcom_officer_navy"
+ armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ strip_delay = 60
/obj/item/clothing/head/beret/centcom/captain
name = "captains beret"
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 3200c0edcad..9f334a658f8 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -93,6 +93,7 @@
/obj/item/clothing/shoes/jackboots
name = "jackboots"
desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
+ can_cut_open = 1
icon_state = "jackboots"
item_state = "jackboots"
item_color = "hosred"
diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm
index e54327b0e50..d4c0d3838f8 100644
--- a/code/modules/clothing/spacesuits/alien.dm
+++ b/code/modules/clothing/spacesuits/alien.dm
@@ -155,6 +155,9 @@
/obj/item/clothing/under/vox
has_sensor = 0
species_restricted = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/uniform.dmi'
+ )
/obj/item/clothing/under/vox/vox_casual
name = "alien clothing"
diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm
index 06d2b8a87ac..669c10d34c3 100644
--- a/code/modules/clothing/spacesuits/ert.dm
+++ b/code/modules/clothing/spacesuits/ert.dm
@@ -100,4 +100,25 @@
/obj/item/clothing/suit/space/rig/ert/janitor
name = "emergency response team janitor suit"
desc = "A suit worn by the janitorial of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured, space ready, and fire resistant."
- icon_state = "ert_janitor"
\ No newline at end of file
+ icon_state = "ert_janitor"
+
+/obj/item/clothing/head/helmet/space/rig/ert/paranormal
+ name = "paranormal response unit helmet"
+ desc = "A helmet worn by those who deal with paranormal threats for a living."
+ icon_state = "rig0-ert_paranormal"
+ item_color = "ert_paranormal"
+ max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
+ sprite_sheets = null
+
+/obj/item/clothing/suit/space/rig/ert/paranormal
+ name = "paranormal response team suit"
+ desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats."
+ icon_state = "knight_grey"
+ item_state = "knight_grey"
+ max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
+ sprite_sheets = null
+
+
+/obj/item/clothing/suit/space/rig/ert/paranormal/New()
+ ..()
+ new /obj/item/weapon/nullrod(src)
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index bfa2b3232b3..7d59f828643 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -53,13 +53,23 @@
desc = "A heavily armored, advanced space suit that protects against most forms of damage."
icon_state = "deathsquad"
item_state = "swat_suit"
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/kitchen/knife/combat)
armor = list(melee = 80, bullet = 80, laser = 50,energy = 50, bomb = 100, bio = 100, rad = 100)
slowdown = 1
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
unacidable = 1
strip_delay = 130
+ //NEW SWAT suit
+/obj/item/clothing/suit/space/swat
+ name = "SWAT armor"
+ desc = "Space-proof tactical SWAT armor."
+ icon_state = "heavy"
+ item_state = "swat_suit"
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/kitchen/knife/combat)
+ armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
+ strip_delay = 120
+
/obj/item/clothing/head/helmet/space/deathsquad/beret
name = "officer's beret"
desc = "An armored beret commonly used by special operations officers."
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index ccce69fe661..a6a8ad4b244 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -1,6 +1,6 @@
/obj/item/clothing/suit/armor
- allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic)
+ allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/kitchen/knife/combat)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
cold_protection = UPPER_TORSO|LOWER_TORSO
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
@@ -253,6 +253,33 @@
icon_state = "tdgreen"
item_state = "tdgreen"
+/obj/item/clothing/suit/armor/riot/knight
+ name = "plate armour"
+ desc = "A classic suit of plate armour, highly effective at stopping melee attacks."
+ icon_state = "knight_green"
+ item_state = "knight_green"
+ slowdown = 0
+ armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
+
+/obj/item/clothing/suit/armor/riot/knight/yellow
+ icon_state = "knight_yellow"
+ item_state = "knight_yellow"
+
+/obj/item/clothing/suit/armor/riot/knight/blue
+ icon_state = "knight_blue"
+ item_state = "knight_blue"
+
+/obj/item/clothing/suit/armor/riot/knight/red
+ icon_state = "knight_red"
+ item_state = "knight_red"
+
+/obj/item/clothing/suit/armor/riot/knight/templar
+ name = "crusader armour"
+ desc = "God wills it!"
+ icon_state = "knight_templar"
+ item_state = "knight_templar"
+ allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/nullrod/sword)
+
//Non-hardsuit ERT armor.
/obj/item/clothing/suit/armor/vest/ert
name = "emergency response team armor"
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 097955805c2..78820a130dc 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -104,7 +104,7 @@
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
- allowed = list (/obj/item/weapon/kitchenknife,/obj/item/weapon/butch)
+ allowed = list (/obj/item/weapon/kitchen/knife)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
@@ -118,7 +118,7 @@
item_state = "apronchef"
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
- allowed = list(/obj/item/weapon/kitchenknife,/obj/item/weapon/butch)
+ allowed = list(/obj/item/weapon/kitchen/knife)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index 0bf75d5911b..bd69d9776d6 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -100,10 +100,7 @@
..()
hold.max_combined_w_class = 4
hold.can_hold = list("/obj/item/weapon/hatchet/unathiknife",\
- "/obj/item/weapon/kitchen/utensil/knife",\
- "/obj/item/weapon/kitchen/utensil/pknife",\
- "/obj/item/weapon/kitchenknife",\
- "/obj/item/weapon/kitchenknife/ritual")
+ "/obj/item/weapon/kitchen/knife")
new /obj/item/weapon/hatchet/unathiknife(hold)
new /obj/item/weapon/hatchet/unathiknife(hold)
\ No newline at end of file
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 6304c606300..632dcff8d32 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -116,12 +116,13 @@
name = "royal marines commando beret"
desc = "Dark Green beret with an old insignia on it."
icon_state = "sparkyninja_beret"
+ item_state = "sparkyninja_beret"
/obj/item/clothing/head/beret/fluff/sigholt //sigholtstarsong: Sigholt Starsong
name = "Lieutenant Starsong's beret"
desc = "This beret bears insignia of the SOLGOV Marine Corps 417th Regiment, 2nd Battalion, Bravo Company. It looks meticulously maintained."
- icon_state = "hosberet"
- item_state = "hosberet"
+ icon_state = "beret_hos"
+ item_state = "beret_hos"
//////////// Suits ////////////
/obj/item/clothing/suit/storage/labcoat/fluff/aeneas_rinil //Socialsystem: Lynn Fea
diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm
index 0ed99cb5698..1d5ac326517 100644
--- a/code/modules/events/mass_hallucination.dm
+++ b/code/modules/events/mass_hallucination.dm
@@ -3,10 +3,10 @@
/datum/event/mass_hallucination/start()
for(var/mob/living/carbon/human/H in living_mob_list)
- var/armor = H.getarmor(attack_flag = "rad")
+ var/armor = H.getarmor(type = "rad")
if((H.species.flags & NO_DNA_RAD) || armor >= 75) // Leave DNA-less species/rad armored players completely unaffected
continue
H.hallucination += rand(50, 100)
-
+
/datum/event/mass_hallucination/announce()
command_announcement.Announce("It seems that station [station_name()] is passing through a minor radiation field, this may cause some hallucination, but no further damage")
\ No newline at end of file
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index 9562e51c385..b297f898feb 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -36,7 +36,7 @@
for(var/i = 0, i < 10, i++)
for(var/mob/living/carbon/human/H in living_mob_list)
- var/armor = H.getarmor(attack_flag = "rad")
+ var/armor = H.getarmor(type = "rad")
if((H.species.flags & NO_DNA_RAD) || armor >= 100) // Leave DNA-less species/fully rad armored players completely unaffected
continue
var/turf/T = get_turf(H)
diff --git a/code/modules/examine/descriptions/stacks.dm b/code/modules/examine/descriptions/stacks.dm
index 431e5c37b9a..6b47c1ab421 100644
--- a/code/modules/examine/descriptions/stacks.dm
+++ b/code/modules/examine/descriptions/stacks.dm
@@ -9,10 +9,10 @@
description_info = "Use in your hand to build a window. Can be upgraded to reinforced glass by adding metal rods, which are made from metal sheets.
\
As a synthetic, you can acquire more sheets of glass by recharging."
-/obj/item/stack/sheet/glass/reinforced
+/obj/item/stack/sheet/rglass
description_info = "Use in your hand to build a window. Reinforced glass is much stronger against damage."
-/obj/item/stack/sheet/glass/reinforced/cyborg
+/obj/item/stack/sheet/rglass/cyborg
description_info = "Use in your hand to build a window. Reinforced glass is much stronger against damage.
\
As a synthetic, you can gain more reinforced glass by recharging."
diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm
index 95c6e9350f4..c806bf0b8c1 100644
--- a/code/modules/hydroponics/grown_inedible.dm
+++ b/code/modules/hydroponics/grown_inedible.dm
@@ -117,7 +117,7 @@
/obj/item/weapon/corncob/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
- if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/utensil/knife) || istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/kitchenknife/ritual))
+ if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/knife))
user << "You use [W] to fashion a pipe out of the corn cob!"
new /obj/item/clothing/mask/cigarette/pipe/cobpipe (user.loc)
qdel(src)
diff --git a/code/modules/hydroponics/hydro_reagents.dm b/code/modules/hydroponics/hydro_reagents.dm
new file mode 100644
index 00000000000..5e5cb819b98
--- /dev/null
+++ b/code/modules/hydroponics/hydro_reagents.dm
@@ -0,0 +1,126 @@
+
+/obj/item/weapon/plantspray
+ icon = 'icons/obj/hydroponics_machines.dmi'
+ item_state = "spray"
+ flags = OPENCONTAINER | NOBLUDGEON
+ slot_flags = SLOT_BELT
+ throwforce = 4
+ w_class = 2.0
+ throw_speed = 2
+ throw_range = 10
+ var/toxicity = 4
+ var/pest_kill_str = 0
+ var/weed_kill_str = 0
+
+/obj/item/weapon/plantspray/weeds // -- Skie
+
+ name = "weed-spray"
+ desc = "It's a toxic mixture, in spray form, to kill small weeds."
+ icon_state = "weedspray"
+ weed_kill_str = 6
+
+/obj/item/weapon/plantspray/pests
+ name = "pest-spray"
+ desc = "It's some pest eliminator spray! Do not inhale!"
+ icon_state = "pestspray"
+ pest_kill_str = 6
+
+/obj/item/weapon/plantspray/pests/old
+ name = "bottle of pestkiller"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle16"
+
+/obj/item/weapon/plantspray/pests/old/carbaryl
+ name = "bottle of carbaryl"
+ icon_state = "bottle16"
+ toxicity = 4
+ pest_kill_str = 2
+
+/obj/item/weapon/plantspray/pests/old/lindane
+ name = "bottle of lindane"
+ icon_state = "bottle18"
+ toxicity = 6
+ pest_kill_str = 4
+
+/obj/item/weapon/plantspray/pests/old/phosmet
+ name = "bottle of phosmet"
+ icon_state = "bottle15"
+ toxicity = 8
+ pest_kill_str = 7
+
+
+// *************************************
+// Weedkiller defines for hydroponics
+// *************************************
+
+/obj/item/weedkiller
+ name = "bottle of weedkiller"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle16"
+ flags = OPENCONTAINER | NOBLUDGEON
+ var/toxicity = 0
+ var/weed_kill_str = 0
+
+/obj/item/weedkiller/triclopyr
+ name = "bottle of glyphosate"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle16"
+ toxicity = 4
+ weed_kill_str = 2
+
+/obj/item/weedkiller/lindane
+ name = "bottle of triclopyr"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle18"
+ toxicity = 6
+ weed_kill_str = 4
+
+/obj/item/weedkiller/D24
+ name = "bottle of 2,4-D"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle15"
+ toxicity = 8
+ weed_kill_str = 7
+
+// *************************************
+// Nutrient defines for hydroponics
+// *************************************
+
+/obj/item/weapon/reagent_containers/glass/fertilizer
+ name = "fertilizer bottle"
+ desc = "A small glass bottle. Can hold up to 10 units."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle16"
+ flags = OPENCONTAINER
+ possible_transfer_amounts = null
+ w_class = 2.0
+
+ var/fertilizer //Reagent contained, if any.
+
+ //Like a shot glass!
+ amount_per_transfer_from_this = 10
+ volume = 10
+
+/obj/item/weapon/reagent_containers/glass/fertilizer/New()
+ ..()
+
+ src.pixel_x = rand(-5.0, 5)
+ src.pixel_y = rand(-5.0, 5)
+
+ if(fertilizer)
+ reagents.add_reagent(fertilizer,10)
+
+/obj/item/weapon/reagent_containers/glass/fertilizer/ez
+ name = "bottle of E-Z-Nutrient"
+ icon_state = "bottle16"
+ fertilizer = "eznutrient"
+
+/obj/item/weapon/reagent_containers/glass/fertilizer/l4z
+ name = "bottle of Left 4 Zed"
+ icon_state = "bottle18"
+ fertilizer = "left4zed"
+
+/obj/item/weapon/reagent_containers/glass/fertilizer/rh
+ name = "bottle of Robust Harvest"
+ icon_state = "bottle15"
+ fertilizer = "robustharvest"
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index 86a4f19630d..2dbedafa353 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -771,7 +771,7 @@
// When the seed in this machine mutates/is modified, the tray seed value
// is set to a new datum copied from the original. This datum won't actually
// be put into the global datum list until the product is harvested, though.
-/datum/seed/proc/diverge(var/modified)
+/datum/seed/proc/diverge(var/modified = 0)
if(get_trait(TRAIT_IMMUTABLE) > 0) return
@@ -793,8 +793,17 @@
new_seed.modular_icon = modular_icon
new_seed.preset_icon = preset_icon
- new_seed.seed_name = "[(roundstart ? "[(modified ? "modified" : "mutant")] " : "")][seed_name]"
- new_seed.display_name = "[(roundstart ? "[(modified ? "modified" : "mutant")] " : "")][display_name]"
+ switch(modified)
+ if(0) //Mutant (default)
+ new_seed.seed_name = "mutant [seed_name]"
+ new_seed.display_name = "mutant [seed_name]"
+ if(1) //Modified
+ new_seed.seed_name = "modified [seed_name]"
+ new_seed.display_name = "modified [seed_name]"
+ if(2) //Enhanced
+ new_seed.seed_name = "enhanced [seed_name]"
+ new_seed.display_name = "enhanced [seed_name]"
+
new_seed.seed_noun = seed_noun
new_seed.traits = traits.Copy()
new_seed.update_growth_stages()
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index d4155f44dad..4eda71ebfd1 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -47,101 +47,14 @@
// Construction
var/unwrenchable = 1
- // Reagent information for process(), consider moving this to a controller along
- // with cycle information under 'mechanical concerns' at some point.
- var/global/list/toxic_reagents = list(
- "charcoal" = -2,
- "toxin" = 2,
- "fluorine" = 2.5,
- "chlorine" = 1.5,
- "sacid" = 1.5,
- "facid" = 3,
- "atrazine" = 3,
- "cryoxadone" = -3,
- "radium" = 2
- )
- var/global/list/nutrient_reagents = list(
- "milk" = 0.1,
- "beer" = 0.25,
- "phosphorus" = 0.1,
- "sugar" = 0.1,
- "sodawater" = 0.1,
- "ammonia" = 1,
- "diethylamine" = 2,
- "nutriment" = 1,
- "protein" = 1.75,
- "plantmatter" = 1.25,
- "adminordrazine" = 1,
- "eznutrient" = 1,
- "robustharvest" = 1,
- "left4zed" = 1,
- "fishwater" = 0.75,
- )
- var/global/list/weedkiller_reagents = list(
- "fluorine" = -4,
- "chlorine" = -3,
- "phosphorus" = -2,
- "sugar" = 2,
- "sacid" = -2,
- "facid" = -4,
- "atrazine" = -8,
- "adminordrazine" = -5
- )
- var/global/list/pestkiller_reagents = list(
- "sugar" = 2,
- "diethylamine" = -2,
- "adminordrazine" = -5
- )
- var/global/list/water_reagents = list(
- "water" = list(1, 0),
- "adminordrazine" = list(1, 0),
- "milk" = list(0.9, 0),
- "beer" = list(0.7, 0),
- "fluorine" = list(-0.5, 0),
- "chlorine" = list(-0.5, 0),
- "phosphorus" = list(-0.5, 0),
- "water" = list(1, 0),
- "sodawater" = list(1, 0),
- "fishwater" = list(1, 0),
- "holywater" = list(1, 0.1),
- )
-
- // Beneficial reagents also have values for modifying yield_mod and mut_mod (in that order).
- var/global/list/beneficial_reagents = list(
- // "reagent" = list(health, yield_Mod, mut_mod, production, potency),
- "beer" = list( -0.05, 0, 0, 0, 0),
- "fluorine" = list( -2, 0, 0, 0, 0),
- "chlorine" = list( -1, 0, 0, 0, 0),
- "phosphorus" = list( -0.75, 0, 0, 0, 0),
- "sodawater" = list( 0.1, 0, 0, 0, 0),
- "sacid" = list( -1, 0, 0, 0, 0),
- "facid" = list( -2, 0, 0, 0, 0),
- "atrazine" = list( -2, 0, 0.2, 0, 0),
- "cryoxadone" = list( 3, 0, 0, 0, 0),
- "ammonia" = list( 0.5, 0, 0, 0, 0),
- "diethylamine" = list( 1, 0, 0, 0, 0),
- "nutriment" = list( 0.25, 0.15, 0, 0, 0),
- "protein" = list( 0.25, 0.15, 0, 0, 0),
- "plantmatter" = list( 0.25, 0.15, 0, 0, 0),
- "radium" = list( -1.5, 0, 0.2, 0, 0),
- "adminordrazine" = list( 1, 1, 1, 0, 0),
- "robustharvest" = list( 0, 0.2, 0, 0, 0),
- "left4zed" = list( 0, 0, 0.2, 0, 0),
- "saltpetre" = list( 0.25, 0, 0, -0.02, 0.01),
- )
-
- //--FalseIncarnate
- // Mutagen list specifies reagent_min_value and reagent_step
- // Reagent_min_value (value 1) is the minimum number of units needed to begin mutations
- // Reagent_step (value 2) is the number of units between each mutation threshold
- var/global/list/mutagenic_reagents = list(
- "radium" = list(10,10),
- "mutagen" = list(1,5)
- )
- //--FalseIncarnate
-
var/last_plant_ikey //This is for debugging reference, and is otherwise useless. --FalseIncarnate
+/*
+* process() can be found in \code\modules\hydroponics\tray\tray_process.dm
+* reagent handling can be found in \code\modules\hydroponics\tray\tray_reagents.dm
+* icon handling can be found in \code\modules\hydroponics\tray\tray_update_icons.dm
+*/
+
/obj/machinery/portable_atmospherics/hydroponics/AltClick()
if(mechanical && !usr.stat && !usr.lying && Adjacent(usr))
close_lid(usr)
@@ -242,86 +155,6 @@
weedlevel += 1 * HYDRO_SPEED_MULTIPLIER
pestlevel = 0
-//Process reagents being input into the tray.
-/obj/machinery/portable_atmospherics/hydroponics/proc/process_reagents()
-
- if(!reagents) return
-
- if(reagents.total_volume <= 0)
- return
-
-/* I have plans for this at a later date, so it's just being commented out for now --FalseIncarnate
-
- reagents.trans_to(temp_chem_holder, min(reagents.total_volume,rand(1,3)))
-
- for(var/datum/reagent/R in temp_chem_holder.reagents.reagent_list)
-
- var/reagent_total = temp_chem_holder.reagents.get_reagent_amount(R.id)
-*/
-
- for(var/datum/reagent/R in reagents.reagent_list)
-
- var/reagent_total = reagents.get_reagent_amount(R.id)
-
- if(seed && !dead)
- //Handle some general level adjustments.
- if(toxic_reagents[R.id])
- toxins += toxic_reagents[R.id] * reagent_total
- if(weedkiller_reagents[R.id])
- weedlevel -= weedkiller_reagents[R.id] * reagent_total
- if(pestkiller_reagents[R.id])
- pestlevel += pestkiller_reagents[R.id] * reagent_total
-
- // Beneficial reagents have a few impacts along with health buffs.
- if(beneficial_reagents[R.id])
- health += beneficial_reagents[R.id][1] * reagent_total
- yield_mod = min(100, yield_mod + (beneficial_reagents[R.id][2] * reagent_total))
- mutation_mod += beneficial_reagents[R.id][3] * reagent_total
- if(seed.get_trait(TRAIT_PRODUCTION) > 1)
- seed.set_trait(TRAIT_PRODUCTION, max(2, seed.get_trait(TRAIT_PRODUCTION) + beneficial_reagents[R.id][4] * reagent_total))
- seed.set_trait(TRAIT_POTENCY, min(100, seed.get_trait(TRAIT_POTENCY) + beneficial_reagents[R.id][5] * reagent_total))
-
- // Mutagen is distinct from the previous types and mostly has a chance of proccing a mutation.
-
- //--FalseIncarnate
- // Mutation rework, will now use "thresholds" for proccing types of mutations and their respective chances.
- // This should make it easier to avoid species shifts when trying to only affect stats like potency.
- // Additionally, the chance of mutations will vary depending on the amount of mutagenic reagents added.
- if(mutagenic_reagents[R.id])
- var/reagent_min_value = mutagenic_reagents[R.id][1] //10 for radium, 1 for unstable mutagen
- var/reagent_step = mutagenic_reagents[R.id][2] //10 for radium, 5 for unstable mutagen
-
- if(reagent_total >= reagent_min_value + (3 * reagent_step)) //31+ for radium, 16+ for unstable mutagen
- mutate(4)
- else if(reagent_total >= reagent_min_value + (2 * reagent_step)) //21-30 for radium, 11-15 for unstable mutagen
- mutate(3)
- else if(reagent_total >= reagent_min_value + reagent_step) //11-20 for radium, 6-10 for unstable mutagen
- mutate(2)
- else if(reagent_total >= reagent_min_value) //1-10 for radium, 1-5 for unstable mutagen
- mutate(1)
-
- //--FalseIncarnate
-
- // Handle nutrient refilling.
- if(nutrient_reagents[R.id])
- nutrilevel += nutrient_reagents[R.id] * reagent_total
-
- // Handle water and water refilling.
- var/water_added = 0
- if(water_reagents[R.id])
- var/water_input = water_reagents[R.id][1] * reagent_total
- water_added += water_input
- waterlevel += water_input
- health += water_reagents[R.id][2] * reagent_total
-
- // Water dilutes toxin level.
- if(water_added > 0)
- toxins -= round(water_added/4)
-
-// temp_chem_holder.reagents.clear_reagents()
- reagents.clear_reagents()
- check_health()
-
//Harvests the product of a plant.
/obj/machinery/portable_atmospherics/hydroponics/proc/harvest(var/mob/user)
@@ -528,11 +361,12 @@
health = 0
dead = 0
- nutrilevel = max(0,min(nutrilevel,maxnutri))
- waterlevel = max(0,min(waterlevel,maxwater))
- pestlevel = max(0,min(pestlevel,10))
- weedlevel = max(0,min(weedlevel,10))
- toxins = max(0,min(toxins,10))
+ nutrilevel = max(0,min(nutrilevel,maxnutri))
+ waterlevel = max(0,min(waterlevel,maxwater))
+ pestlevel = max(0,min(pestlevel,10))
+ weedlevel = max(0,min(weedlevel,10))
+ toxins = max(0,min(toxins,10))
+ yield_mod = min(100, yield_mod)
/obj/machinery/portable_atmospherics/hydroponics/proc/mutate_species()
diff --git a/code/modules/hydroponics/trays/tray_reagents.dm b/code/modules/hydroponics/trays/tray_reagents.dm
index 5e5cb819b98..a2f308f9e33 100644
--- a/code/modules/hydroponics/trays/tray_reagents.dm
+++ b/code/modules/hydroponics/trays/tray_reagents.dm
@@ -1,126 +1,213 @@
-/obj/item/weapon/plantspray
- icon = 'icons/obj/hydroponics_machines.dmi'
- item_state = "spray"
- flags = OPENCONTAINER | NOBLUDGEON
- slot_flags = SLOT_BELT
- throwforce = 4
- w_class = 2.0
- throw_speed = 2
- throw_range = 10
- var/toxicity = 4
- var/pest_kill_str = 0
- var/weed_kill_str = 0
+//Process reagents being put into the tray.
+/obj/machinery/portable_atmospherics/hydroponics/proc/process_reagents()
-/obj/item/weapon/plantspray/weeds // -- Skie
+ if(!reagents) return
- name = "weed-spray"
- desc = "It's a toxic mixture, in spray form, to kill small weeds."
- icon_state = "weedspray"
- weed_kill_str = 6
+ if(reagents.total_volume <= 0)
+ return
-/obj/item/weapon/plantspray/pests
- name = "pest-spray"
- desc = "It's some pest eliminator spray! Do not inhale!"
- icon_state = "pestspray"
- pest_kill_str = 6
+ for(var/datum/reagent/R in reagents.reagent_list)
-/obj/item/weapon/plantspray/pests/old
- name = "bottle of pestkiller"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle16"
+ var/reagent_total = reagents.get_reagent_amount(R.id)
-/obj/item/weapon/plantspray/pests/old/carbaryl
- name = "bottle of carbaryl"
- icon_state = "bottle16"
- toxicity = 4
- pest_kill_str = 2
-
-/obj/item/weapon/plantspray/pests/old/lindane
- name = "bottle of lindane"
- icon_state = "bottle18"
- toxicity = 6
- pest_kill_str = 4
-
-/obj/item/weapon/plantspray/pests/old/phosmet
- name = "bottle of phosmet"
- icon_state = "bottle15"
- toxicity = 8
- pest_kill_str = 7
+ //These are here because they have checks that would clutter up the switch statement cases, and thus get handled after the switch (readability)
+ var/water_value = 0
+ var/health_value = 0
+ var/production_stat_value = 0
+ var/potency_stat_value = 0
-// *************************************
-// Weedkiller defines for hydroponics
-// *************************************
+ switch(R.id)
+ /* EXAMPLE:
+ *
+ * if("example")
+ * //Nutrients
+ * nutrilevel += reagent_total *
+ *
+ * //Water
+ * water_value =
+ *
+ * //Toxins
+ * toxins += reagent_total *
+ *
+ * //Weeds and Pests
+ * weedlevel += reagent_total *
+ * pestlevel += reagent_total *
+ *
+ * //Mutagens
+ * handle_mutagens(reagent_total, , )
+ *
+ * //Modifiers
+ * yield_mod += reagent_total *
+ * mutation_mod += reagent_total *
+ *
+ * //Health
+ * health_value =
+ *
+ * //Production Stat
+ * production_stat_value =
+ *
+ * //Potency Stat
+ * potency_stat_value =
+ *
+ */
-/obj/item/weedkiller
- name = "bottle of weedkiller"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle16"
- flags = OPENCONTAINER | NOBLUDGEON
- var/toxicity = 0
- var/weed_kill_str = 0
+ if("adminordrazine")
+ nutrilevel += reagent_total * 1
+ water_value = 1
+ weedlevel += reagent_total * -5
+ pestlevel += reagent_total * -5
+ yield_mod += reagent_total * 1
+ mutation_mod += reagent_total * 1
+ health_value = 1
+ if("ammonia")
+ nutrilevel += reagent_total * 1
+ health_value = 0.5
+ if("atrazine")
+ toxins += reagent_total * 3
+ weedlevel += reagent_total * -8
+ mutation_mod += reagent_total * 0.2
+ health_value = -2
+ if("beer")
+ nutrilevel += reagent_total * 0.25
+ water_value = 0.7
+ health_value = -0.05
+ if("charcoal")
+ toxins += reagent_total * -2
+ if("chlorine")
+ water_value = -0.5
+ toxins += reagent_total * 1.5
+ weedlevel += reagent_total * -3
+ health_value = -1
+ if("cryoxadone")
+ toxins += reagent_total * -3
+ if(seed && !dead)
+ health += reagent_total * 3
+ if("diethylamine")
+ nutrilevel += reagent_total * 2
+ pestlevel += reagent_total * -2
+ health_value = 1
+ if("eznutrient")
+ nutrilevel += reagent_total * 1
+ if("facid")
+ toxins += reagent_total * 3
+ weedlevel += reagent_total * -4
+ health_value = -2
+ if("fishwater")
+ nutrilevel += reagent_total * 0.75
+ water_value = 1
+ if("fluorine")
+ water_value = -0.5
+ toxins = reagent_total * 2.5
+ weedlevel += reagent_total * -4
+ health_value = -2
+ if("holywater")
+ water_value = 1
+ health_value = 0.1
+ if("left4zed")
+ nutrilevel += reagent_total * 1
+ mutation_mod += reagent_total * 0.2
+ if("milk")
+ nutrilevel += reagent_total * 0.1
+ water_value = 0.9
+ if("mutagen")
+ handle_mutagens(reagent_total, 1, 5)
+ if("nutriment")
+ nutrilevel += reagent_total * 1
+ yield_mod += reagent_total * 0.15
+ health_value = 0.25
+ if("phosphorus")
+ nutrilevel += reagent_total * 0.1
+ water_value = -0.5
+ weedlevel += reagent_total * -2
+ health_value = -0.75
+ if("plantmatter")
+ nutrilevel += reagent_total * 1.25
+ yield_mod += reagent_total * 0.15
+ health_value = 0.25
+ if("protein")
+ nutrilevel += reagent_total * 1.75
+ yield_mod += reagent_total * 0.15
+ health_value = 0.25
+ if("radium")
+ toxins += reagent_total * 2
+ handle_mutagens(reagent_total, 10, 10)
+ mutation_mod += reagent_total * 0.2
+ health_value = -1.5
+ if("robustharvest")
+ nutrilevel += reagent_total * 1
+ yield_mod += reagent_total * 0.2
+ if("sacid")
+ toxins += reagent_total * 1.5
+ weedlevel += reagent_total * -2
+ health_value = -1
+ if("saltpetre")
+ health_value = 0.25
+ production_stat_value = -0.02
+ potency_stat_value = 0.01
+ if("sodawater")
+ nutrilevel += reagent_total * 0.1
+ water_value = 1
+ health_value = 0.1
+ if("sugar")
+ nutrilevel += reagent_total * 0.1
+ weedlevel += reagent_total * 2
+ pestlevel += reagent_total * 2
+ if("toxin")
+ toxins += reagent_total * 2
+ if("water")
+ water_value = 1
-/obj/item/weedkiller/triclopyr
- name = "bottle of glyphosate"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle16"
- toxicity = 4
- weed_kill_str = 2
+ //END SWITCH
-/obj/item/weedkiller/lindane
- name = "bottle of triclopyr"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle18"
- toxicity = 6
- weed_kill_str = 4
+ //Handle water changes
+ if(water_value)
+ var/water_change = 0
+ water_change = reagent_total * water_value
+ waterlevel += water_change
+ if(water_value > 0) //adding water dilutes toxins
+ toxins -= round(water_change/4)
-/obj/item/weedkiller/D24
- name = "bottle of 2,4-D"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle15"
- toxicity = 8
- weed_kill_str = 7
+ //Handle health and stat changes (these require a non-dead seed to be present)
+ if(seed && !dead)
+ //Health
+ if(health_value)
+ health += reagent_total * health_value
+ //Stats
+ if(seed.get_trait(TRAIT_IMMUTABLE) <= 0)
+ //Production
+ if(production_stat_value && seed.get_trait(TRAIT_PRODUCTION) > 2)
+ if(!isnull(plant_controller.seeds[seed.name])) //This is so we don't affect plants in other trays unintentionally
+ seed = seed.diverge(2) //ENHANCE!
+ var/new_production = seed.get_trait(TRAIT_PRODUCTION) + (reagent_total * production_stat_value)
+ seed.set_trait(TRAIT_PRODUCTION, max(2, new_production)) //can't drop below 2 with this method
+ //Potency
+ if(potency_stat_value)
+ if(!isnull(plant_controller.seeds[seed.name])) //This is so we don't affect plants in other trays unintentionally
+ seed = seed.diverge(2) //ENHANCE!
+ var/new_potency = seed.get_trait(TRAIT_POTENCY) + (reagent_total * potency_stat_value)
+ seed.set_trait(TRAIT_POTENCY, max(0, min(100, new_potency))) //can't go above 100 or below 0 with this method
-// *************************************
-// Nutrient defines for hydroponics
-// *************************************
+ //END FOR LOOP
-/obj/item/weapon/reagent_containers/glass/fertilizer
- name = "fertilizer bottle"
- desc = "A small glass bottle. Can hold up to 10 units."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle16"
- flags = OPENCONTAINER
- possible_transfer_amounts = null
- w_class = 2.0
+ reagents.clear_reagents()
+ check_health() //This calls check_level_sanity, which is why it's not called from here directly
- var/fertilizer //Reagent contained, if any.
+/obj/machinery/portable_atmospherics/hydroponics/proc/handle_mutagens(var/amount, var/min_amount, var/step_amount)
+ //shouldn't be getting called without having reagent values supplied
+ if(!amount || !step_amount || !step_amount)
+ return
+ //shouldn't be getting called with negative values
+ if(amount < 0 || min_amount < 0 || step_amount < 0)
+ return
- //Like a shot glass!
- amount_per_transfer_from_this = 10
- volume = 10
-
-/obj/item/weapon/reagent_containers/glass/fertilizer/New()
- ..()
-
- src.pixel_x = rand(-5.0, 5)
- src.pixel_y = rand(-5.0, 5)
-
- if(fertilizer)
- reagents.add_reagent(fertilizer,10)
-
-/obj/item/weapon/reagent_containers/glass/fertilizer/ez
- name = "bottle of E-Z-Nutrient"
- icon_state = "bottle16"
- fertilizer = "eznutrient"
-
-/obj/item/weapon/reagent_containers/glass/fertilizer/l4z
- name = "bottle of Left 4 Zed"
- icon_state = "bottle18"
- fertilizer = "left4zed"
-
-/obj/item/weapon/reagent_containers/glass/fertilizer/rh
- name = "bottle of Robust Harvest"
- icon_state = "bottle15"
- fertilizer = "robustharvest"
+ if(amount > min_amount)
+ if(amount >= min_amount + (3 * step_amount))
+ mutate(4)
+ else if(amount >= min_amount + (2 * step_amount))
+ mutate(3)
+ else if(amount >= min_amount + step_amount)
+ mutate(2)
+ else if(amount >= min_amount)
+ mutate(1)
diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm
index 147f02f69c1..0c08ca44949 100644
--- a/code/modules/hydroponics/trays/tray_tools.dm
+++ b/code/modules/hydroponics/trays/tray_tools.dm
@@ -297,15 +297,6 @@
icon_state = "unathiknife"
attack_verb = list("ripped", "torn", "cut")
-/obj/item/weapon/hatchet/tacknife
- name = "tactical knife"
- desc = "You'd be killing loads of people if this was Medal of Valor: Heroes of Nyx."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "tacknife"
- item_state = "knife"
- attack_verb = list("stabbed", "chopped", "cut")
-
-
/obj/item/weapon/scythe
icon_state = "scythe0"
name = "scythe"
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 0b4375964eb..962470c4cf1 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -248,7 +248,7 @@
return
scanner.computer.inventory.Add(src)
user << "[W]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'"
- else if(istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/wirecutters))
+ else if(istype(W, /obj/item/weapon/kitchen/knife) || istype(W, /obj/item/weapon/wirecutters))
if(carved) return
user << "You begin to carve out [title]."
if(do_after(user, 30, target = src))
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 6e4defb9477..be291902af4 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -530,6 +530,9 @@ var/global/list/rockTurfEdgeCache
/turf/simulated/mineral/updateMineralOverlays()
return
+/turf/simulated/wall/updateMineralOverlays()
+ return
+
/turf/proc/fullUpdateMineralOverlays()
for (var/turf/t in range(1,src))
t.updateMineralOverlays()
diff --git a/code/modules/mining/surprises/vg.dm b/code/modules/mining/surprises/vg.dm
index cd5b7eddf59..79905da7e6b 100644
--- a/code/modules/mining/surprises/vg.dm
+++ b/code/modules/mining/surprises/vg.dm
@@ -62,7 +62,7 @@
/mining_surprise/human
name="Hidden Complex"
floortypes = list(
- /turf/simulated/floor/airless=95,
+ /turf/simulated/floor/plasteel/airless=95,
/turf/simulated/floor/plating/airless=5
)
walltypes = list(
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index ea350268792..3fe57ec2acc 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -95,4 +95,7 @@ I'm using this for Stat to give it a more nifty interface to work with
if(istype(src.loc, /obj/mecha))
var/obj/mecha/M = src.loc
stat("Exosuit Charge:", "[istype(M.cell) ? "[M.cell.charge] / [M.cell.maxcharge]" : "No cell detected"]")
- stat("Exosuit Integrity", "[!M.health ? "0" : "[(M.health / initial(M.health)) * 100]"]%")
\ No newline at end of file
+ stat("Exosuit Integrity", "[!M.health ? "0" : "[(M.health / initial(M.health)) * 100]"]%")
+
+/mob/living/carbon/brain/can_safely_leave_loc()
+ return 0 //You're not supposed to be ethereal jaunting, brains
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 72970927dfe..99b65376aa1 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -261,10 +261,11 @@
AdjustStunned(-3)
AdjustWeakened(-3)
playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- M.visible_message( \
- "\blue [M] shakes [src] trying to wake [t_him] up!", \
- "\blue You shake [src] trying to wake [t_him] up!", \
- )
+ if(!player_logged)
+ M.visible_message( \
+ "\blue [M] shakes [src] trying to wake [t_him] up!", \
+ "\blue You shake [src] trying to wake [t_him] up!", \
+ )
// BEGIN HUGCODE - N3X
else
if (istype(src,/mob/living/carbon/human) && src:w_uniform)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index c69f902c85a..1d864e8172e 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -45,6 +45,10 @@
dna.ready_dna(src)
dna.real_name = real_name
sync_organ_dna() //this shouldn't be necessaaaarrrryyyyyyyy
+
+ if(species)
+ species.handle_dna(src)
+
UpdateAppearance()
/mob/living/carbon/human/prepare_data_huds()
@@ -281,6 +285,10 @@
stat("Chemical Storage", "[mind.changeling.chem_charges]/[mind.changeling.chem_storage]")
stat("Absorbed DNA", mind.changeling.absorbedcount)
+ if(mind.vampire)
+ stat("Total Blood", "[mind.vampire.bloodtotal]")
+ stat("Usable Blood", "[mind.vampire.bloodusable]")
+
if(mind.nation)
stat("Nation Name", "[mind.nation.current_name ? "[mind.nation.current_name]" : "[mind.nation.default_name]"]")
stat("Nation Leader", "[mind.nation.current_leader ? "[mind.nation.current_leader]" : "None"]")
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index a5dc8f87f3b..d088720050f 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -189,7 +189,7 @@ emp_act
/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
if(!I || !user) return 0
- if((istype(I, /obj/item/weapon/butch/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == I_HARM)
+ if((istype(I, /obj/item/weapon/kitchen/knife/butcher/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == I_HARM)
var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(src.loc))
newmeat.name = src.real_name + newmeat.name
newmeat.subjectname = src.real_name
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 1decdb70bfd..5d53136a230 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1059,8 +1059,15 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
return
/mob/living/carbon/human/handle_changeling()
- if(mind && mind.changeling)
- mind.changeling.regenerate()
+ if(mind)
+ if(mind.changeling)
+ mind.changeling.regenerate()
+ if(hud_used)
+ hud_used.lingchemdisplay.invisibility = 0
+ hud_used.lingchemdisplay.maptext = "[round(mind.changeling.chem_charges)]
"
+ else
+ if(hud_used)
+ hud_used.lingchemdisplay.invisibility = 101
/mob/living/carbon/human/handle_shock()
..()
diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm
index 72d1a3a0e52..63806936e43 100644
--- a/code/modules/mob/living/carbon/human/species/monkey.dm
+++ b/code/modules/mob/living/carbon/human/species/monkey.dm
@@ -51,6 +51,7 @@
/datum/species/monkey/handle_dna(var/mob/living/carbon/human/H)
H.dna.SetSEState(MONKEYBLOCK,1)
+ genemutcheck(H, MONKEYBLOCK)
/datum/species/monkey/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user)
switch(slot)
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 79b5908ae8a..39a93731acb 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -312,10 +312,9 @@
return
/datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
- handle_dna(C)
return
-/datum/species/proc/handle_dna(var/mob/living/carbon/C, var/remove) //Handles DNA mutations, as that doesn't work at init.
+/datum/species/proc/handle_dna(var/mob/living/carbon/C, var/remove) //Handles DNA mutations, as that doesn't work at init. Make sure you call genemutcheck on any blocks changed here
return
// Used for species-specific names (Vox, etc)
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index e4f2e957394..5a77a7a51c4 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -109,32 +109,33 @@ Please contact me on #coderbus IRC. ~Carn x
#define TAIL_UNDERLIMBS_LAYER 2
#define LIMBS_LAYER 3
#define MARKINGS_LAYER 4
-#define MUTATIONS_LAYER 5
-#define DAMAGE_LAYER 6
-#define UNIFORM_LAYER 7
-#define ID_LAYER 8
-#define SHOES_LAYER 9
-#define GLOVES_LAYER 10
-#define EARS_LAYER 11
-#define SUIT_LAYER 12
-#define GLASSES_LAYER 13
-#define BELT_LAYER 14 //Possible make this an overlay of somethign required to wear a belt?
-#define SUIT_STORE_LAYER 15
-#define BACK_LAYER 16
-#define TAIL_LAYER 17 //bs12 specific. this hack is probably gonna come back to haunt me
-#define HAIR_LAYER 18 //TODO: make part of head layer?
-#define HEAD_ACCESSORY_LAYER 19
-#define FHAIR_LAYER 20
-#define FACEMASK_LAYER 21
-#define HEAD_LAYER 22
-#define COLLAR_LAYER 23
-#define HANDCUFF_LAYER 24
-#define LEGCUFF_LAYER 25
-#define L_HAND_LAYER 26
-#define R_HAND_LAYER 27
-#define TARGETED_LAYER 28 //BS12: Layer for the target overlay from weapon targeting system
-#define FIRE_LAYER 29 //If you're on fire
-#define TOTAL_LAYERS 29
+#define UNDERWEAR_LAYER 5
+#define MUTATIONS_LAYER 6
+#define DAMAGE_LAYER 7
+#define UNIFORM_LAYER 8
+#define ID_LAYER 9
+#define SHOES_LAYER 10
+#define GLOVES_LAYER 11
+#define EARS_LAYER 12
+#define SUIT_LAYER 13
+#define GLASSES_LAYER 14
+#define BELT_LAYER 15 //Possible make this an overlay of somethign required to wear a belt?
+#define SUIT_STORE_LAYER 16
+#define BACK_LAYER 17
+#define TAIL_LAYER 18 //bs12 specific. this hack is probably gonna come back to haunt me
+#define HAIR_LAYER 19 //TODO: make part of head layer?
+#define HEAD_ACCESSORY_LAYER 20
+#define FHAIR_LAYER 21
+#define FACEMASK_LAYER 22
+#define HEAD_LAYER 23
+#define COLLAR_LAYER 24
+#define HANDCUFF_LAYER 25
+#define LEGCUFF_LAYER 26
+#define L_HAND_LAYER 27
+#define R_HAND_LAYER 28
+#define TARGETED_LAYER 29 //BS12: Layer for the target overlay from weapon targeting system
+#define FIRE_LAYER 30 //If you're on fire
+#define TOTAL_LAYERS 30
@@ -274,6 +275,8 @@ var/global/list/damage_icon_parts = list()
icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]"
if(part.s_col)
icon_key += "[rgb(part.s_col[1], part.s_col[2], part.s_col[3])]"
+ if(part.s_tone)
+ icon_key += "[part.s_tone]"
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
@@ -329,21 +332,27 @@ var/global/list/damage_icon_parts = list()
overlays_standing[LIMBS_LAYER] = image(stand_icon) // Diverts limbs to their own layer so they can overlay things (i.e. tails).
//Underwear
+ overlays_standing[UNDERWEAR_LAYER] = null
+ var/icon/underwear_standing = new/icon('icons/mob/underwear.dmi',"nude")
+
if(underwear && species.clothing_flags & HAS_UNDERWEAR)
var/datum/sprite_accessory/underwear/U = underwear_list[underwear]
if(U)
- stand_icon.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY)
+ underwear_standing.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY)
if(undershirt && species.clothing_flags & HAS_UNDERSHIRT)
var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt]
if(U2)
- stand_icon.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY)
+ underwear_standing.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY)
if(socks && species.clothing_flags & HAS_SOCKS)
var/datum/sprite_accessory/socks/U3 = socks_list[socks]
if(U3)
- stand_icon.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY)
+ underwear_standing.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY)
+
+ if(underwear_standing)
+ overlays_standing[UNDERWEAR_LAYER] = image(underwear_standing)
if(update_icons)
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index dd514743aff..999ebacb58d 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -46,7 +46,7 @@
/mob/living/proc/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0, var/negate_armor = 0)
blocked = (100-blocked)/100
- if(!effect || (blocked <= 0))
+ if(!effect || (blocked <= 0))
return 0
switch(effecttype)
if(STUN)
@@ -77,7 +77,7 @@
updatehealth()
return 1
-/mob/living/carbon/human/apply_effect(var/effect = 0, var/effecttype = STUN, var/blocked = 0)
+/mob/living/carbon/human/apply_effect(var/effect = 0, var/effecttype = STUN, var/blocked = 0, var/negate_armor = 0)
if((effecttype == IRRADIATE) && (species.flags & NO_DNA_RAD))
return 0
return ..()
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm
index 34f98cb5893..7717834b7bb 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm
@@ -23,6 +23,13 @@
user << "\red Access denied."
return
+ interact(user)
+
+/obj/machinery/computer/drone_control/attack_ghost(mob/user as mob)
+ interact(user)
+
+/obj/machinery/computer/drone_control/interact(mob/user)
+
user.set_machine(src)
var/dat
dat += "Maintenance Units
"
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 638853c223c..5e65c6d75b8 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -26,11 +26,11 @@
return
else if (is_component_functioning("power cell") && cell)
if(module)
- for(var/obj/item/borg/B in module.modules)
+ for(var/obj/item/borg/B in get_all_slots())
if(B.powerneeded)
if((cell.charge * 100 / cell.maxcharge) < B.powerneeded)
src << "Deactivating [B.name] due to lack of power!"
- unEquip(B)
+ uneq_module(B)
if(cell.charge <= 0)
uneq_all()
update_headlamp(1)
diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm
index 219eaf59801..1c32975d5e8 100644
--- a/code/modules/mob/living/simple_animal/hostile/russian.dm
+++ b/code/modules/mob/living/simple_animal/hostile/russian.dm
@@ -20,7 +20,7 @@
attack_sound = 'sound/weapons/punch1.ogg'
a_intent = I_HARM
var/corpse = /obj/effect/landmark/mobcorpse/russian
- var/weapon1 = /obj/item/weapon/kitchenknife
+ var/weapon1 = /obj/item/weapon/kitchen/knife
min_oxy = 5
max_oxy = 0
min_tox = 0
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 399ae068586..61a94e883c3 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -412,7 +412,7 @@
user << "\blue [src] is dead, medical items won't bring it back to life."
return
else if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead.
- if(istype(O, /obj/item/weapon/kitchenknife) || istype(O, /obj/item/weapon/butch))
+ if(istype(O, /obj/item/weapon/kitchen/knife))
harvest()
else
user.changeNext_move(CLICK_CD_MELEE)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index ce81f116920..623905c75e7 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1436,4 +1436,8 @@ mob/proc/yank_out_object()
//Can the mob see reagents inside of containers?
/mob/proc/can_see_reagents()
- return 0
\ No newline at end of file
+ return 0
+
+//Can this mob leave its location without breaking things terrifically?
+/mob/proc/can_safely_leave_loc()
+ return 1 // Yes, you can
\ No newline at end of file
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index d1d05c3b7ac..a33e45b7544 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -394,12 +394,19 @@
if(!do_after(user, checktime(user, affecting), target = affecting)) return
user.visible_message("[user] devours \the [affecting]!")
+ if(affecting.mind)
+ affecting.attack_log += "\[[time_stamp()]\] Has been devoured by [attacker.name] ([attacker.ckey])"
+ attacker.attack_log += "\[[time_stamp()]\] Devoured [affecting.name] ([affecting.ckey])"
+ msg_admin_attack("[key_name(attacker)] devoured [key_name(affecting)]")
affecting.loc = user
attacker.stomach_contents.Add(affecting)
qdel(src)
/obj/item/weapon/grab/proc/checkvalid(var/mob/attacker, var/mob/prey) //does all the checking for the attack proc to see if a mob can eat another with the grab
+ if(ishuman(attacker) && (/datum/dna/gene/basic/grant_spell/mattereater in attacker.active_genes)) // MATTER EATER CARES NOT OF YOUR FORM
+ return 1
+
if(ishuman(attacker) && (FAT in attacker.mutations) && iscarbon(prey) && !isalien(prey)) //Fat people eating carbon mobs but not xenos
return 1
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 7eb20df76ea..c6105863622 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -627,7 +627,7 @@ datum/preferences
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
if(prob(1))
- clothes_s.Blend(new /icon('icons/mob/head.dmi', "hosberet"), ICON_OVERLAY)
+ clothes_s.Blend(new /icon('icons/mob/head.dmi', "beret_hos"), ICON_OVERLAY)
switch(backbag)
if(2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
@@ -668,7 +668,7 @@ datum/preferences
clothes_s = new /icon(uniform_dmi, "secred_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
if(prob(1))
- clothes_s.Blend(new /icon('icons/mob/head.dmi', "officerberet"), ICON_OVERLAY)
+ clothes_s.Blend(new /icon('icons/mob/head.dmi', "beret_officer"), ICON_OVERLAY)
switch(backbag)
if(2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 76128dae463..98c50af7dad 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -322,6 +322,7 @@
var/t = input("Enter what you want to write:", "Write", null, null) as message
var/obj/item/i = usr.get_active_hand() // Check to see if he still got that darn pen, also check if he's using a crayon or pen.
var/iscrayon = 0
+ add_hiddenprint(usr) // No more forging nasty documents as someone else, you jerks
if(!istype(i, /obj/item/weapon/pen))
if(!istype(i, /obj/item/toy/crayon))
return
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index ef5b764e7ad..af1e065bd91 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -114,13 +114,17 @@
lastwarning = world.timeofday
if(damage > explosion_point)
- for(var/mob/living/mob in living_mob_list)
- if(istype(mob, /mob/living/carbon/human))
- //Hilariously enough, running into a closet should make you get hit the hardest.
- var/mob/living/carbon/human/H = mob
- H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
- var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) )
- mob.apply_effect(rads, IRRADIATE)
+ if(get_turf(src))
+ var/turf/position = get_turf(src)
+ for(var/mob/living/mob in living_mob_list)
+ var/turf/mob_pos = get_turf(mob)
+ if(mob_pos && mob_pos.z == position.z)
+ if(ishuman(mob))
+ //Hilariously enough, running into a closet should make you get hit the hardest.
+ var/mob/living/carbon/human/H = mob
+ H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
+ var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) )
+ mob.apply_effect(rads, IRRADIATE)
explode()
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
index 40915270cd1..f4ed6c222ef 100644
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
@@ -663,40 +663,6 @@
..()
return
-/datum/reagent/ethanol/bananahonk
- name = "Banana Mama"
- id = "bananahonk"
- description = "A drink from Clown Heaven."
- nutriment_factor = 1 * FOOD_METABOLISM
- color = "#664300" // rgb: 102, 67, 0
-
-/datum/reagent/ethanol/bananahonk/on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- if(istype(M, /mob/living/carbon/human) && M.job in list("Clown"))
- if(!M) M = holder.my_atom
- M.heal_organ_damage(1,1)
- M.nutrition += nutriment_factor
- ..()
- return
- ..()
-
-/datum/reagent/ethanol/silencer
- name = "Silencer"
- id = "silencer"
- description = "A drink from Mime Heaven."
- nutriment_factor = 1 * FOOD_METABOLISM
- color = "#664300" // rgb: 102, 67, 0
-
-/datum/reagent/ethanol/silencer/on_mob_life(var/mob/living/M as mob)
- M.nutrition += nutriment_factor
- if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
- if(!M) M = holder.my_atom
- M.heal_organ_damage(1,1)
- M.nutrition += nutriment_factor
- ..()
- return
- ..()
-
/datum/reagent/ethanol/changelingsting
name = "Changeling Sting"
id = "changelingsting"
@@ -753,4 +719,18 @@
M.confused = max(M.confused+15,15)
..()
- return
\ No newline at end of file
+ return
+
+/datum/reagent/ethanol/kahlua
+ name = "Kahlua"
+ id = "kahlua"
+ description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!"
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/ethanol/kahlua/on_mob_life(var/mob/living/M as mob)
+ M.dizziness = max(0,M.dizziness-5)
+ M.drowsyness = max(0,M.drowsyness-3)
+ M.sleeping = max(0,M.sleeping-2)
+ M.Jitter(5)
+ ..()
+ return
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
index 2e26dd2ce83..dc43ffb54b4 100644
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
@@ -264,16 +264,36 @@
color = "#104038" // rgb: 16, 64, 56
adj_temp = -5
-/datum/reagent/drink/kahlua
- name = "Kahlua"
- id = "kahlua"
- description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!"
+/datum/reagent/drink/bananahonk
+ name = "Banana Mama"
+ id = "bananahonk"
+ description = "A drink from Clown Heaven."
+ nutriment_factor = 1 * FOOD_METABOLISM
color = "#664300" // rgb: 102, 67, 0
- adj_dizzy = -5
- adj_drowsy = -3
- adj_sleepy = -2
-/datum/reagent/drink/kahlua/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/drink/bananahonk/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ if(istype(M, /mob/living/carbon/human) && M.job in list("Clown"))
+ if(!M) M = holder.my_atom
+ M.heal_organ_damage(1,1)
+ M.nutrition += nutriment_factor
+ ..()
+ return
..()
- M.Jitter(5)
- return
\ No newline at end of file
+
+/datum/reagent/drink/silencer
+ name = "Silencer"
+ id = "silencer"
+ description = "A drink from Mime Heaven."
+ nutriment_factor = 1 * FOOD_METABOLISM
+ color = "#664300" // rgb: 102, 67, 0
+
+/datum/reagent/drink/silencer/on_mob_life(var/mob/living/M as mob)
+ M.nutrition += nutriment_factor
+ if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
+ if(!M) M = holder.my_atom
+ M.heal_organ_damage(1,1)
+ M.nutrition += nutriment_factor
+ ..()
+ return
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index b632503f012..f9d0f1136a8 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -142,45 +142,41 @@
..() // -> item/attackby(, params)
if(istype(W,/obj/item/weapon/kitchen/utensil))
- //This will allow forks/spoons/plastic cutlery to pick up sliceables, but requires it to be unsliceable for the knife to pick it up
- if((istype(W, /obj/item/weapon/kitchen/utensil/knife) && !slice_path) || !istype(W, /obj/item/weapon/kitchen/utensil/knife))
- var/obj/item/weapon/kitchen/utensil/U = W
+ var/obj/item/weapon/kitchen/utensil/U = W
- if(!U.reagents)
- U.create_reagents(5)
+ if(!U.reagents)
+ U.create_reagents(5)
- if (U.reagents.total_volume > 0)
- user << "\red You already have something on your [U]."
- return
-
- user.visible_message( \
- "[user] scoops up some [src] with \the [U]!", \
- "\blue You scoop up some [src] with \the [U]!" \
- )
-
- src.bitecount++
- U.overlays.Cut()
- U.loaded = "[src]"
- var/image/I = new(U.icon, "loadedfood")
- I.color = src.filling_color
- U.overlays += I
-
- reagents.trans_to(U,min(reagents.total_volume,5))
-
- if (reagents.total_volume <= 0)
- qdel(src)
+ if (U.reagents.total_volume > 0)
+ user << "\red You already have something on your [U]."
return
+ user.visible_message( \
+ "[user] scoops up some [src] with \the [U]!", \
+ "\blue You scoop up some [src] with \the [U]!" \
+ )
+
+ src.bitecount++
+ U.overlays.Cut()
+ U.loaded = "[src]"
+ var/image/I = new(U.icon, "loadedfood")
+ I.color = src.filling_color
+ U.overlays += I
+
+ reagents.trans_to(U,min(reagents.total_volume,5))
+
+ if (reagents.total_volume <= 0)
+ qdel(src)
+ return
+
if((slices_num <= 0 || !slices_num) || !slice_path)
return 0
var/inaccurate = 0
if( \
- istype(W, /obj/item/weapon/kitchenknife) || \
- istype(W, /obj/item/weapon/butch) || \
- istype(W, /obj/item/weapon/scalpel) || \
- istype(W, /obj/item/weapon/kitchen/utensil/knife) \
+ istype(W, /obj/item/weapon/kitchen/knife) || \
+ istype(W, /obj/item/weapon/scalpel) \
)
else if( \
istype(W, /obj/item/weapon/circular_saw) || \
@@ -3328,7 +3324,7 @@
// potato + knife = raw sticks
/obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W,/obj/item/weapon/kitchen/utensil/knife))
+ if(istype(W,/obj/item/weapon/kitchen/knife))
new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(src)
user << "You cut the potato."
qdel(src)
diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm
index 8c1e8544014..12fb6f6db69 100644
--- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm
@@ -11,10 +11,8 @@
/obj/item/weapon/reagent_containers/food/snacks/meat/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if( \
- istype(W, /obj/item/weapon/kitchenknife) || \
- istype(W, /obj/item/weapon/butch) || \
- istype(W, /obj/item/weapon/scalpel) || \
- istype(W, /obj/item/weapon/kitchen/utensil/knife) \
+ istype(W, /obj/item/weapon/kitchen/knife) || \
+ istype(W, /obj/item/weapon/scalpel) \
)
new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src)
new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src)
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index a09f058629c..6e5bcf0389b 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -183,7 +183,7 @@
id = "kitchen_knife"
build_type = AUTOLATHE
materials = list(MAT_METAL = 12000)
- build_path = /obj/item/weapon/kitchenknife
+ build_path = /obj/item/weapon/kitchen/knife
category = list("initial","Miscellaneous")
/datum/design/pipe_painter
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
index a4d33d1b4b2..b32bc190aee 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
@@ -43,7 +43,7 @@
/obj/item/weapon/autopsy_scanner,\
/obj/item/weapon/bikehorn,\
/obj/item/weapon/bonesetter,\
- /obj/item/weapon/butch,\
+ /obj/item/weapon/kitchen/knife/butcher,\
/obj/item/weapon/caution,\
/obj/item/clothing/head/cone,\
/obj/item/weapon/crowbar,\
@@ -53,7 +53,7 @@
/obj/item/weapon/hatchet,\
/obj/item/weapon/restraints/handcuffs,\
/obj/item/weapon/hemostat,\
- /obj/item/weapon/kitchenknife,\
+ /obj/item/weapon/kitchen/knife,\
/obj/item/weapon/lighter,\
/obj/item/weapon/lighter,\
/obj/item/weapon/light/bulb,\
diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/research/xenoarchaeology/finds/finds.dm
index 01ce550c045..6cbe31a7ed9 100644
--- a/code/modules/research/xenoarchaeology/finds/finds.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds.dm
@@ -138,7 +138,7 @@
if(prob(25))
new_item = new /obj/item/weapon/kitchen/utensil/fork(src.loc)
else if(prob(50))
- new_item = new /obj/item/weapon/kitchen/utensil/knife(src.loc)
+ new_item = new /obj/item/weapon/kitchen/knife(src.loc)
else
new_item = new /obj/item/weapon/kitchen/utensil/spoon(src.loc)
additional_desc = "[pick("It's like no [item_type] you've ever seen before",\
@@ -164,7 +164,7 @@
"You wonder what kind of music was made with it")]."
if(6)
item_type = "[pick("bladed knife","serrated blade","sharp cutting implement")]"
- new_item = new /obj/item/weapon/kitchenknife(src.loc)
+ new_item = new /obj/item/weapon/kitchen/knife(src.loc)
additional_desc = "[pick("It doesn't look safe.",\
"It looks wickedly jagged",\
"There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains along the edges")]."
diff --git a/code/modules/store/items.dm b/code/modules/store/items.dm
index aec8a45cc2c..489caa96a91 100644
--- a/code/modules/store/items.dm
+++ b/code/modules/store/items.dm
@@ -105,73 +105,73 @@
typepath = /obj/item/weapon/toddler
cost = 1000
-/datum/storeitem/flag/slime
+/datum/storeitem/flag_slime
name = "Slime People flag"
desc = "A flag proudly proclaiming the superior heritage of Slime People."
typepath = /obj/item/flag/species/slime
cost = 1000
-/datum/storeitem/flag/skrell
+/datum/storeitem/flag_skrell
name = "Skrell flag"
desc = "A flag proudly proclaiming the superior heritage of Skrell."
typepath = /obj/item/flag/species/skrell
cost = 1000
-/datum/storeitem/flag/vox
+/datum/storeitem/flag_vox
name = "Vox flag"
desc = "A flag proudly proclaiming the superior heritage of Vox."
typepath = /obj/item/flag/species/vox
cost = 1000
-/datum/storeitem/flag/machine
+/datum/storeitem/flag_machine
name = "Synthetics flag"
desc = "A flag proudly proclaiming the superior heritage of Synthetics."
typepath = /obj/item/flag/species/machine
cost = 1000
-/datum/storeitem/flag/diona
+/datum/storeitem/flag_diona
name = "Diona flag"
desc = "A flag proudly proclaiming the superior heritage of Dionae."
typepath = /obj/item/flag/species/diona
cost = 1000
-/datum/storeitem/flag/human
+/datum/storeitem/flag_human
name = "Human flag"
desc = "A flag proudly proclaiming the superior heritage of Humans."
typepath = /obj/item/flag/species/human
cost = 1000
-/datum/storeitem/flag/greys
+/datum/storeitem/flag_greys
name = "Greys flag"
desc = "A flag proudly proclaiming the superior heritage of Greys."
typepath = /obj/item/flag/species/greys
cost = 1000
-/datum/storeitem/flag/kidan
+/datum/storeitem/flag_kidan
name = "Kidan flag"
desc = "A flag proudly proclaiming the superior heritage of Kidan."
typepath = /obj/item/flag/species/kidan
cost = 1000
-/datum/storeitem/flag/taj
+/datum/storeitem/flag_taj
name = "Tajaran flag"
desc = "A flag proudly proclaiming the superior heritage of Tajara."
typepath = /obj/item/flag/species/taj
cost = 1000
-/datum/storeitem/flag/unathi
+/datum/storeitem/flag_unathi
name = "Unathi flag"
desc = "A flag proudly proclaiming the superior heritage of Unathi."
typepath = /obj/item/flag/species/unathi
cost = 1000
-/datum/storeitem/flag/vulp
+/datum/storeitem/flag_vulp
name = "Vulpkanin flag"
desc = "A flag proudly proclaiming the superior heritage of Vulpkanin."
typepath = /obj/item/flag/species/vulp
cost = 1000
-/datum/storeitem/flag/ian
+/datum/storeitem/flag_ian
name = "Ian flag"
desc = "The banner of Ian, because SQUEEEEE."
typepath = /obj/item/flag/ian
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index 3ab54efc376..1b48f015dd5 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -27,7 +27,7 @@
/obj/item/weapon/scalpel/laser1 = 105, \
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/kitchenknife = 75, \
+ /obj/item/weapon/kitchen/knife = 75, \
/obj/item/weapon/shard = 50, \
)
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index f07cef38b97..fd49360815f 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -30,7 +30,7 @@
/obj/item/weapon/scalpel/laser1 = 105, \
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/kitchenknife = 75, \
+ /obj/item/weapon/kitchen/knife = 75, \
/obj/item/weapon/shard = 50, \
/obj/item/weapon/scissors = 10, \
/obj/item/weapon/twohanded/chainsaw = 1, \
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 1121810b837..da775298e29 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -59,7 +59,7 @@
name = "remove dead tissue"
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/kitchenknife = 75, \
+ /obj/item/weapon/kitchen/knife = 75, \
/obj/item/weapon/shard = 50, \
)
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index 9a1460d98f2..cc3a6abeafb 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -52,7 +52,7 @@
allowed_tools = list(
/obj/item/weapon/screwdriver = 100,
/obj/item/weapon/coin = 50,
- /obj/item/weapon/kitchen/utensil/knife = 50
+ /obj/item/weapon/kitchen/knife = 50
)
max_duration = 110
diff --git a/code/modules/surgery/slime.dm b/code/modules/surgery/slime.dm
index c822dc0d8b4..198fc54effc 100644
--- a/code/modules/surgery/slime.dm
+++ b/code/modules/surgery/slime.dm
@@ -17,7 +17,7 @@
/datum/surgery_step/slime/cut_flesh
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/kitchenknife = 75, \
+ /obj/item/weapon/kitchen/knife = 75, \
/obj/item/weapon/shard = 50, \
)
@@ -45,7 +45,7 @@
/datum/surgery_step/slime/cut_innards
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/kitchenknife = 75, \
+ /obj/item/weapon/kitchen/knife = 75, \
/obj/item/weapon/shard = 50, \
)
diff --git a/config/example/config.txt b/config/example/config.txt
index 835edc66e4d..c21bbcec76e 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -70,23 +70,27 @@ KICK_INACTIVE
##
## default probablity is 1, increase to make that mode more likely to be picked
## set to 0 to disable that mode
-PROBABILITY EXTENDED 1
-PROBABILITY MALFUNCTION 4
-PROBABILITY NUCLEAR 4
-PROBABILITY CHANGELING 4
+PROBABILITY EXTENDED 2
+PROBABILITY MALFUNCTION 2
+PROBABILITY NUCLEAR 3
+PROBABILITY CHANGELING 3
PROBABILITY CULT 4
-PROBABILITY EXTEND-A-TRAITORMONGOUS 6
+PROBABILITY EXTEND-A-TRAITORMONGOUS 5
PROBABILITY TRAITORCHAN 4
-PROBABILITY BLOB 4
-PROBABILITY REVOLUTION 2
-PROBABILITY HEIST 4
+PROBABILITY BLOB 2
+PROBABILITY REVOLUTION 0
+PROBABILITY HEIST 1
PROBABILITY WIZARD 2
-PROBABILITY VAMPIRE 4
+PROBABILITY VAMPIRE 3
PROBABILITY RAGINMAGES 0
PROBABILITY BORER 0
-PROBABILITY XENOS 2
-PROBABILITY MUTINY 1
-PROBABILITY METEOR 0
+PROBABILITY XENOS 0
+PROBABILITY MUTINY 0
+PROBABILITY METEOR 1
+PROBABILITY TRAITOR 0
+PROBABILITY SHADOWLING 2
+PROBABILITY NATIONS 1
+PROBABILITY RP-REVOLUTION 0
## Hash out to disable random events during the round.
ALLOW_RANDOM_EVENTS
@@ -196,10 +200,10 @@ LOAD_JOBS_FROM_TXT
## Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR
ALLOW_HOLIDAYS
##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother.
-TICKLAG 0.9
+TICKLAG 0.5
## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered.
-TICKCOMP 0
+TICKCOMP 1
## Whether the server will talk to other processes through socket_talk
SOCKET_TALK 0
diff --git a/config/example/game_options.txt b/config/example/game_options.txt
index 69847e0a6b6..9ccb4871aef 100644
--- a/config/example/game_options.txt
+++ b/config/example/game_options.txt
@@ -69,7 +69,8 @@ BOMBCAP 20
### ROUNDSTART SILICON LAWS ###
## This controls what the AI's laws are at the start of the round.
-## Set to 0/commented for "off", silicons will just start with Crewsimov.
-## Set to 1 for "random", silicons will start with a random lawset picked from (at the time of writing): Nanotrasen Default, P.A.L.A.D.I.N., Corporate, Robop and Crewsimov. More can be added by changing the law datum "default" variable in ai_laws.dm.
+## Set to 0/commented for "off", silicons will just start with Asimov.
+## Set to 1 for "custom", silicons will start with the custom laws defined in silicon_laws.txt. (If silicon_laws.txt is empty, the AI will spawn with asimov and Custom boards will auto-delete.)
+## Set to 2 for "random", silicons will start with a random lawset picked from (at the time of writing): P.A.L.A.D.I.N., Corporate, Asimov. More can be added by changing the law datum paths in ai_laws.dm.
-DEFAULT_LAWS 1
\ No newline at end of file
+DEFAULT_LAWS 2
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index 909ef42baf8..5b3b5c496a2 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,57 @@
-->
+
24 January 2016
+
KasparoVy updated:
+
+ - Fixes markings overlaying underwear.
+ - Nude icon in underwear.dmi
+ - Fixes Vox robes not using the correct on-mob sprites.
+ - Fixes unreported bug where there was a slim chance during character preview icon generation that a character with Security Officer set to high would get rendered with either the wrong beret sprite or no beret sprite at all.
+ - Fixes an issue where Sigholt's fluff beret wasn't using the correct sprites.
+
+
Tastyfish updated:
+
+ - Passively power-consuming borg modules, such as the peacekeeper movement and shield module, won't spam the user infinitely if they're low on power anymore.
+
+
+
23 January 2016
+
Fox McCloud updated:
+
+ - Removes Vampire HUD
+ - moves the Vampire blood counter to a more easy to see location
+ - Adds in a Changeling chemical counter display
+ - Adds in a Changeling sting counter display
+ - Vampire total blood and usable blood will now appear under status
+ - Changes vampire blood display to be similar to ling chemical counter
+ - Fixes unnecessary toxin damage being dealt on severe bloodloss
+ - Fixes human mobs not receiving proper random names
+ - Adds in knight armor
+ - Grants the chaplain a set of crusader knight armor
+ - Adds in cult-resistant ERT paranormal space suit
+ - Allows the Chaplain to convert his null rod into a holy sword with crusader knight armor
+ - Chaplain's closet is now a secure closet
+ - Adds in Assault Gear crate to cargo
+ - Adds in military assault belt
+ - Adds in spaceworthy swat suits
+ - tweaks bandolier to hold 2 additional shotgun shells
+ - bartender starts off with +2 additional shells
+ - Reduces the cost of the space suit crate and doubles its contents
+ - Refactors knives so their behavior is more universal
+ - Fixes Hulk not properly being removed when your health drops below a threshold
+ - Fixes flickering vision in a mining mech
+
+
Tastyfish updated:
+
+ - Poly has taken a seminar on the latest trends in engine operations.
+ - Player-controller parrots can now hear their headsets.
+
+
Tigerbat2000 updated:
+
+ - The nuclear disk escaping on the shuttle no longer counts as a syndicate minor victory.
+ - Cultists can once again actually greentext the escape objective.
+
+
20 January 2016
DarkPyrolord updated: