diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm
index 124be53452..3c0e190427 100644
--- a/code/__defines/damage_organs.dm
+++ b/code/__defines/damage_organs.dm
@@ -35,9 +35,8 @@
#define ORGAN_BLEEDING (1<<1)
#define ORGAN_BROKEN (1<<2)
#define ORGAN_DESTROYED (1<<3)
-#define ORGAN_SPLINTED (1<<4)
-#define ORGAN_DEAD (1<<5)
-#define ORGAN_MUTATED (1<<6)
+#define ORGAN_DEAD (1<<4)
+#define ORGAN_MUTATED (1<<5)
#define DROPLIMB_EDGE 0
#define DROPLIMB_BLUNT 1
diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm
index 9463986f8b..c95e4f242f 100644
--- a/code/controllers/shuttle_controller.dm
+++ b/code/controllers/shuttle_controller.dm
@@ -209,7 +209,7 @@ var/global/datum/shuttle_controller/shuttle_controller
shuttle.docking_controller_tag = "centcom_shuttle"
shuttle.dock_target_station = "centcom_shuttle_dock_airlock"
shuttle.dock_target_offsite = "centcom_shuttle_bay"
- shuttles["Centcom"] = shuttle
+ shuttles["CentCom"] = shuttle
process_shuttles += shuttle
shuttle = new()
diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm
index 50e05948d5..e2c5161d6d 100644
--- a/code/datums/ai_law_sets.dm
+++ b/code/datums/ai_law_sets.dm
@@ -10,7 +10,7 @@
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
..()
-/******************** Nanotrasen/Malf ********************/
+/******************** NanoTrasen/Malf ********************/
/datum/ai_laws/nanotrasen
name = "NT Default"
selectable = 1
@@ -30,7 +30,7 @@
set_zeroth_law(config.law_zero)
..()
-/************* Nanotrasen Aggressive *************/
+/************* NanoTrasen Aggressive *************/
/datum/ai_laws/nanotrasen_aggressive
name = "NT Aggressive"
selectable = 1
diff --git a/code/datums/locations/nyx.dm b/code/datums/locations/nyx.dm
index 35d79243b2..33df619660 100644
--- a/code/datums/locations/nyx.dm
+++ b/code/datums/locations/nyx.dm
@@ -43,15 +43,15 @@
/datum/locations/exodus
name = "NSS Exodus"
- desc = "A highly profitable research, mining, and supply dock for Nanotrasen that serves as one of their many facilities in exploiting the \
+ desc = "A highly profitable research, mining, and supply dock for NanoTrasen that serves as one of their many facilities in exploiting the \
wonders of phoron. It is currently orbiting around Erebus and maintains close contact with the NAS Crescent. The station itself has been \
- a target for a large number of Mercenaries and other companies wishing to steal Nanotrasen's secrets."
+ a target for a large number of Mercenaries and other companies wishing to steal NanoTrasen's secrets."
/datum/locations/crescent
name = "NAS Crescent"
- desc = "The main hub for Nanotrasen in the Nyx system and is commonly referred to it by their workers as central command or \"Centcomm\". \
+ desc = "The main hub for NanoTrasen in the Nyx system and is commonly referred to it by their workers as central command or \"CentCom\". \
The Crescent refines and stores much of the products that stations (such as the Exodus) bring in. It is also a large refueling and supply \
- station of phoron and tritium in the Nyx system due to Nanotrasen being able to outsell almost any other company."
+ station of phoron and tritium in the Nyx system due to NanoTrasen being able to outsell almost any other company."
/datum/locations/emerald_habitation
name = "Emerald Habitation"
diff --git a/code/datums/locations/vir.dm b/code/datums/locations/vir.dm
index f750fc4c85..377ecc9b03 100644
--- a/code/datums/locations/vir.dm
+++ b/code/datums/locations/vir.dm
@@ -49,7 +49,7 @@
/datum/locations/northern_star //Inception joke here
name = "Northern Star"
- desc = "The Northern Star is an asteroid colony owned and operated by Nanotrasen, among many other asteroid installations. \
+ desc = "The Northern Star is an asteroid colony owned and operated by NanoTrasen, among many other asteroid installations. \
Originally conceived as 'just another pitstop' for weary asteroid miners, it has grown to become a significant installation in the Kara subsystem."
/datum/locations/northern_star/New(var/creator)
diff --git a/code/datums/underwear/top.dm b/code/datums/underwear/top.dm
index 044f10e7cb..4226799370 100644
--- a/code/datums/underwear/top.dm
+++ b/code/datums/underwear/top.dm
@@ -42,6 +42,11 @@
icon_state = "halterneck_bra"
has_color = TRUE
+/datum/category_item/underwear/top/tubetop
+ name = "Tube Top"
+ icon_state = "tubetop"
+ has_color = TRUE
+
/datum/category_item/underwear/top/fishnet_base
name = "Fishnet top"
icon_state = "fishnet_body"
diff --git a/code/datums/underwear/undershirts.dm b/code/datums/underwear/undershirts.dm
index 2f0de005ca..4eba1c9378 100644
--- a/code/datums/underwear/undershirts.dm
+++ b/code/datums/underwear/undershirts.dm
@@ -67,4 +67,20 @@
/datum/category_item/underwear/undershirt/shirt_blue_striped
name = "Shirt, blue stripes"
- icon_state = "shirt_stripes_s"
\ No newline at end of file
+ icon_state = "shirt_stripes_s"
+
+/datum/category_item/underwear/undershirt/bowling
+ name = "Bowling Shirt, Red"
+ icon_state = "bowling"
+
+/datum/category_item/underwear/undershirt/bowlingp
+ name = "Bowling Shirt, Pink"
+ icon_state = "bowlingp"
+
+/datum/category_item/underwear/undershirt/bowlinga
+ name = "Bowling Shirt, Aqua"
+ icon_state = "bowlinga"
+
+/datum/category_item/underwear/undershirt/bowlingw
+ name = "Bowling Shirt, White"
+ icon_state = "bowlingw"
\ No newline at end of file
diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm
index c27d510d8b..f4d92e4261 100644
--- a/code/game/antagonist/outsider/mercenary.dm
+++ b/code/game/antagonist/outsider/mercenary.dm
@@ -41,6 +41,7 @@ var/datum/antagonist/mercenary/mercs
if(player.backbag == 2) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(player), slot_back)
if(player.backbag == 3) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(player), slot_back)
if(player.backbag == 4) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(player), slot_back)
+ if(player.backbag == 5) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(player), slot_back)
player.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(player.back), slot_in_backpack)
player.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(player), slot_in_backpack)
player.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT
diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm
index 14e5f90063..b88af1b1b9 100644
--- a/code/game/antagonist/outsider/wizard.dm
+++ b/code/game/antagonist/outsider/wizard.dm
@@ -83,6 +83,7 @@ var/datum/antagonist/wizard/wizards
if(wizard_mob.backbag == 2) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back)
if(wizard_mob.backbag == 3) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(wizard_mob), slot_back)
if(wizard_mob.backbag == 4) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(wizard_mob), slot_back)
+ if(wizard_mob.backbag == 5) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back)
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box(wizard_mob), slot_in_backpack)
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(wizard_mob), slot_r_store)
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/spellbook(wizard_mob), slot_r_hand)
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 26b4f2a169..19f0d70fc4 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -166,7 +166,7 @@ area/space/atmosalert()
icon_state = "shuttle2"
/area/shuttle/escape/centcom
- name = "\improper Emergency Shuttle Centcom"
+ name = "\improper Emergency Shuttle CentCom"
icon_state = "shuttle"
/area/shuttle/escape/transit // the area to pass through for 3 minute transit
@@ -304,7 +304,7 @@ area/space/atmosalert()
/area/shuttle/transport1/centcom
icon_state = "shuttle"
- name = "\improper Transport Shuttle Centcom"
+ name = "\improper Transport Shuttle CentCom"
/area/shuttle/transport1/station
icon_state = "shuttle"
@@ -346,7 +346,7 @@ area/space/atmosalert()
icon_state = "shuttlered2"
/area/shuttle/administration/centcom
- name = "\improper Administration Shuttle Centcom"
+ name = "\improper Administration Shuttle CentCom"
icon_state = "shuttlered"
/area/shuttle/administration/station
@@ -354,7 +354,7 @@ area/space/atmosalert()
icon_state = "shuttlered2"
/area/shuttle/trade/centcom
- name = "\improper Trade Shuttle Centcom"
+ name = "\improper Trade Shuttle CentCom"
icon_state = "shuttlered"
/area/shuttle/trade/station
@@ -415,34 +415,34 @@ area/space/atmosalert()
// CENTCOM
/area/centcom
- name = "\improper Centcom"
+ name = "\improper CentCom"
icon_state = "centcom"
requires_power = 0
lighting_use_dynamic = 0
/area/centcom/control
- name = "\improper Centcom Control"
+ name = "\improper CentCom Control"
/area/centcom/evac
- name = "\improper Centcom Emergency Shuttle"
+ name = "\improper CentCom Emergency Shuttle"
/area/centcom/suppy
- name = "\improper Centcom Supply Shuttle"
+ name = "\improper CentCom Supply Shuttle"
/area/centcom/ferry
- name = "\improper Centcom Transport Shuttle"
+ name = "\improper CentCom Transport Shuttle"
/area/centcom/shuttle
- name = "\improper Centcom Administration Shuttle"
+ name = "\improper CentCom Administration Shuttle"
/area/centcom/test
- name = "\improper Centcom Testing Facility"
+ name = "\improper CentCom Testing Facility"
/area/centcom/living
- name = "\improper Centcom Living Quarters"
+ name = "\improper CentCom Living Quarters"
/area/centcom/specops
- name = "\improper Centcom Special Ops"
+ name = "\improper CentCom Special Ops"
/area/centcom/creed
name = "Creed's Office"
@@ -458,15 +458,15 @@ area/space/atmosalert()
name = "\improper Tram Station"
/area/centcom/security
- name = "\improper Centcom Security"
+ name = "\improper CentCom Security"
icon_state = "centcom_security"
/area/centcom/medical
- name = "\improper Centcom Medical"
+ name = "\improper CentCom Medical"
icon_state = "centcom_medical"
/area/centcom/command
- name = "\improper Centcom Command" //Central Command Command totally isn't RAS Syndrome in action.
+ name = "\improper CentCom Command" //Central Command Command totally isn't RAS Syndrome in action.
icon_state = "centcom_command"
/area/centcom/main_hall
@@ -474,15 +474,15 @@ area/space/atmosalert()
icon_state = "centcom_hallway1"
/area/centcom/bar
- name = "\improper Centcom Bar"
+ name = "\improper CentCom Bar"
icon_state = "centcom_crew"
/area/centcom/restaurant
- name = "\improper Centcom Restaurant"
+ name = "\improper CentCom Restaurant"
icon_state = "centcom_crew"
/area/centcom/bathroom
- name = "\improper Centcom Bathroom"
+ name = "\improper CentCom Bathroom"
icon_state = "centcom_crew"
//SYNDICATES
@@ -2531,20 +2531,20 @@ area/space/atmosalert()
ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
/area/tcommsat/entrance
- name = "\improper Telecoms Teleporter"
+ name = "\improper Telecomms Teleporter"
icon_state = "tcomsatentrance"
/area/tcommsat/chamber
- name = "\improper Telecoms Central Compartment"
+ name = "\improper Telecomms Central Compartment"
icon_state = "tcomsatcham"
/area/tcomsat
- name = "\improper Telecoms Satellite"
+ name = "\improper Telecomms Satellite"
icon_state = "tcomsatlob"
ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
/area/tcomfoyer
- name = "\improper Telecoms Foyer"
+ name = "\improper Telecomms Foyer"
icon_state = "tcomsatentrance"
ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
@@ -2559,7 +2559,7 @@ area/space/atmosalert()
ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
/area/tcommsat/computer
- name = "\improper Telecoms Control Room"
+ name = "\improper Telecomms Control Room"
icon_state = "tcomsatcomp"
/area/tcommsat/lounge
@@ -2631,7 +2631,7 @@ area/space/atmosalert()
requires_power = 0
/area/awaymission/spacebattle/cruiser
- name = "\improper Nanotrasen Cruiser"
+ name = "\improper NanoTrasen Cruiser"
/area/awaymission/spacebattle/syndicate1
name = "\improper Syndicate Assault Ship 1"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 33f0635015..474b2d3b25 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -463,11 +463,11 @@ its easier to just keep the beam vertical.
//spawn(0)
//if(I) //It's possible that it could be deleted in the meantime.
var/obj/O = I
- O.show_message( message, 1, blind_message, 2)
+ O.show_message(message, 1, blind_message, 2)
else if(ismob(I))
var/mob/M = I
if(M.see_invisible >= invisibility) // Cannot view the invisible
- M.show_message( message, 1, blind_message, 2)
+ M.show_message(message, 1, blind_message, 2)
else if (blind_message)
M.show_message(blind_message, 2)
@@ -488,7 +488,24 @@ its easier to just keep the beam vertical.
spawn(0)
if(I) //It's possible that it could be deleted in the meantime.
var/obj/O = I
- O.show_message( message, 2, deaf_message, 1)
+ O.show_message(message, 2, deaf_message, 1)
else if(ismob(I))
var/mob/M = I
- M.show_message( message, 2, deaf_message, 1)
+ M.show_message(message, 2, deaf_message, 1)
+
+/atom/movable/proc/dropInto(var/atom/destination)
+ while(istype(destination))
+ var/atom/drop_destination = destination.onDropInto(src)
+ if(!istype(drop_destination) || drop_destination == destination)
+ return forceMove(destination)
+ destination = drop_destination
+ return forceMove(null)
+
+/atom/proc/onDropInto(var/atom/movable/AM)
+ return // If onDropInto returns null, then dropInto will forceMove AM into us.
+
+/atom/movable/onDropInto(var/atom/movable/AM)
+ return loc // If onDropInto returns something, then dropInto will attempt to drop AM there.
+
+/atom/proc/InsertedContents()
+ return contents
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index e45be4bb6a..d164485f38 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -63,13 +63,35 @@
return
/atom/movable/proc/forceMove(atom/destination)
+ if(loc == destination)
+ return 0
+ var/is_origin_turf = isturf(loc)
+ var/is_destination_turf = isturf(destination)
+ // It is a new area if:
+ // Both the origin and destination are turfs with different areas.
+ // When either origin or destination is a turf and the other is not.
+ var/is_new_area = (is_origin_turf ^ is_destination_turf) || (is_origin_turf && is_destination_turf && loc.loc != destination.loc)
+
+ var/atom/origin = loc
+ loc = destination
+
+ if(origin)
+ origin.Exited(src, destination)
+ if(is_origin_turf)
+ for(var/atom/movable/AM in origin)
+ AM.Uncrossed(src)
+ if(is_new_area && is_origin_turf)
+ origin.loc.Exited(src, destination)
+
if(destination)
- if(loc)
- loc.Exited(src)
- loc = destination
- loc.Entered(src)
- return 1
- return 0
+ destination.Entered(src, origin)
+ if(is_destination_turf) // If we're entering a turf, cross all movable atoms
+ for(var/atom/movable/AM in loc)
+ if(AM != src)
+ AM.Crossed(src)
+ if(is_new_area && is_destination_turf)
+ destination.loc.Entered(src, origin)
+ return 1
//called when src is thrown into hit_atom
/atom/movable/proc/throw_impact(atom/hit_atom, var/speed)
diff --git a/code/game/gamemodes/changeling/generic_equip_procs.dm b/code/game/gamemodes/changeling/generic_equip_procs.dm
index 109f326ab0..e8ed12a446 100644
--- a/code/game/gamemodes/changeling/generic_equip_procs.dm
+++ b/code/game/gamemodes/changeling/generic_equip_procs.dm
@@ -1,14 +1,19 @@
//This is a generic proc that should be called by other ling armor procs to equip them.
-/mob/proc/changeling_generic_armor(var/armor_type, var/helmet_type, var/boot_type)
- var/datum/changeling/changeling = changeling_power(20,1,100,CONSCIOUS)
- if(!changeling)
- return
+/mob/proc/changeling_generic_armor(var/armor_type, var/helmet_type, var/boot_type, var/chem_cost)
if(!ishuman(src))
return 0
var/mob/living/carbon/human/M = src
+ if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type) || istype(M.shoes, boot_type))
+ chem_cost = 0
+
+ var/datum/changeling/changeling = changeling_power(chem_cost, 1, 100, CONSCIOUS)
+
+ if(!changeling)
+ return
+
//First, check if we're already wearing the armor, and if so, take it off.
if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type) || istype(M.shoes, boot_type))
M.visible_message("[M] casts off their [M.wear_suit.name]!",
@@ -39,7 +44,7 @@
var/obj/item/clothing/shoes/B = new boot_type(src)
src.equip_to_slot_or_del(B, slot_shoes)
- src.mind.changeling.chem_charges -= 20
+ src.mind.changeling.chem_charges -= chem_cost
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
M.update_inv_wear_suit()
M.update_inv_head()
diff --git a/code/game/gamemodes/changeling/powers/armblade.dm b/code/game/gamemodes/changeling/powers/armblade.dm
index 0ed78ddb39..26b8283a36 100644
--- a/code/game/gamemodes/changeling/powers/armblade.dm
+++ b/code/game/gamemodes/changeling/powers/armblade.dm
@@ -15,7 +15,6 @@
if(src.mind.changeling.recursive_enhancement)
if(changeling_generic_weapon(/obj/item/weapon/melee/arm_blade/greater))
src << "We prepare an extra sharp blade."
- src.mind.changeling.recursive_enhancement = 0
return 1
else
diff --git a/code/game/gamemodes/changeling/powers/armor.dm b/code/game/gamemodes/changeling/powers/armor.dm
index 6241f2a54d..ac98f15c40 100644
--- a/code/game/gamemodes/changeling/powers/armor.dm
+++ b/code/game/gamemodes/changeling/powers/armor.dm
@@ -9,7 +9,7 @@
/mob/proc/changeling_spacesuit()
set category = "Changeling"
set name = "Organic Space Suit (20)"
- if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling,/obj/item/clothing/head/helmet/space/changeling,/obj/item/clothing/shoes/magboots/changeling))
+ if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling,/obj/item/clothing/head/helmet/space/changeling,/obj/item/clothing/shoes/magboots/changeling, 20))
return 1
return 0
@@ -25,7 +25,7 @@
set category = "Changeling"
set name = "Organic Spacearmor (20)"
- if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling/armored,/obj/item/clothing/head/helmet/space/changeling/armored,/obj/item/clothing/shoes/magboots/changeling/armored))
+ if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling/armored,/obj/item/clothing/head/helmet/space/changeling/armored,/obj/item/clothing/shoes/magboots/changeling/armored, 20))
return 1
return 0
diff --git a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
index bfe97bf19e..8a595f8d9e 100644
--- a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
+++ b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
@@ -26,7 +26,6 @@
if(src.mind.changeling.recursive_enhancement)
if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent))
src << "We will shock others more efficently."
- src.mind.changeling.recursive_enhancement = 0
return 1
else
if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc.
diff --git a/code/game/gamemodes/changeling/powers/blind_sting.dm b/code/game/gamemodes/changeling/powers/blind_sting.dm
index ceb6e00ae1..a9f9d2346e 100644
--- a/code/game/gamemodes/changeling/powers/blind_sting.dm
+++ b/code/game/gamemodes/changeling/powers/blind_sting.dm
@@ -21,7 +21,6 @@
if(src.mind.changeling.recursive_enhancement)
duration = duration + 150
src << "They will be deprived of sight for longer."
- src.mind.changeling.recursive_enhancement = 0
spawn(duration)
T.disabilities &= ~NEARSIGHTED
T.eye_blind = 10
diff --git a/code/game/gamemodes/changeling/powers/boost_range.dm b/code/game/gamemodes/changeling/powers/boost_range.dm
index 65cdc00ca2..fd15d94dae 100644
--- a/code/game/gamemodes/changeling/powers/boost_range.dm
+++ b/code/game/gamemodes/changeling/powers/boost_range.dm
@@ -23,7 +23,6 @@
if(src.mind.changeling.recursive_enhancement)
range = range + 3
src << "We can fire our next sting from five squares away."
- src.mind.changeling.recursive_enhancement = 0
changeling.sting_range = range
src.verbs -= /mob/proc/changeling_boost_range
spawn(5)
diff --git a/code/game/gamemodes/changeling/powers/cryo_sting.dm b/code/game/gamemodes/changeling/powers/cryo_sting.dm
index ee11371dac..681e46e737 100644
--- a/code/game/gamemodes/changeling/powers/cryo_sting.dm
+++ b/code/game/gamemodes/changeling/powers/cryo_sting.dm
@@ -20,7 +20,6 @@
if(src.mind.changeling.recursive_enhancement)
inject_amount = inject_amount * 1.5
src << "We inject extra chemicals."
- src.mind.changeling.recursive_enhancement = 0
if(T.reagents)
T.reagents.add_reagent("cryotoxin", inject_amount)
feedback_add_details("changeling_powers","CS")
diff --git a/code/game/gamemodes/changeling/powers/deaf_sting.dm b/code/game/gamemodes/changeling/powers/deaf_sting.dm
index 0bf5d0f326..fcf5bfab7d 100644
--- a/code/game/gamemodes/changeling/powers/deaf_sting.dm
+++ b/code/game/gamemodes/changeling/powers/deaf_sting.dm
@@ -19,7 +19,6 @@
if(src.mind.changeling.recursive_enhancement)
duration = duration + 100
src << "They will be unable to hear for a little longer."
- src.mind.changeling.recursive_enhancement = 0
T << "Your ears pop and begin ringing loudly!"
T.sdisabilities |= DEAF
spawn(duration) T.sdisabilities &= ~DEAF
diff --git a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
index c1152e8364..4a50140003 100644
--- a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
+++ b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm
@@ -20,7 +20,6 @@
if(src.mind.changeling.recursive_enhancement)
i = i * 2
src << "Our toxin will be extra potent, when it strikes."
- src.mind.changeling.recursive_enhancement = 0
spawn(2 MINUTES)
if(T) //We might not exist in two minutes, for whatever reason.
T << "You feel a burning sensation flowing through your veins!"
diff --git a/code/game/gamemodes/changeling/powers/enfeebling_string.dm b/code/game/gamemodes/changeling/powers/enfeebling_string.dm
index 240cac473d..9584da1e55 100644
--- a/code/game/gamemodes/changeling/powers/enfeebling_string.dm
+++ b/code/game/gamemodes/changeling/powers/enfeebling_string.dm
@@ -23,7 +23,6 @@
if(src.mind.changeling.recursive_enhancement)
effect = effect + 20
src << "We make them extremely weak."
- src.mind.changeling.recursive_enhancement = 0
var/health_to_take_away = H.maxHealth * (effect / 100)
H.maxHealth -= health_to_take_away
diff --git a/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm b/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm
index 9c28fcadc4..3875a4b4fa 100644
--- a/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm
+++ b/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm
@@ -31,7 +31,6 @@
if(src.mind.changeling.recursive_enhancement)
src << "We feel unstoppable."
- src.mind.changeling.recursive_enhancement = 0
spawn(1)
var/i = 30
while(i)
diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm
index 0502a35f28..f7760e9ce6 100644
--- a/code/game/gamemodes/changeling/powers/fleshmend.dm
+++ b/code/game/gamemodes/changeling/powers/fleshmend.dm
@@ -23,7 +23,6 @@
if(src.mind.changeling.recursive_enhancement)
heal_amount = heal_amount * 2
src << "We will heal much faster."
- src.mind.changeling.recursive_enhancement = 0
spawn(0)
src << "We begin to heal ourselves."
diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm
index 09c026aadb..055cf3e28b 100644
--- a/code/game/gamemodes/changeling/powers/panacea.dm
+++ b/code/game/gamemodes/changeling/powers/panacea.dm
@@ -32,7 +32,6 @@
if(src.mind.changeling.recursive_enhancement)
heal_amount = heal_amount * 2
src << "We will heal much faster."
- src.mind.changeling.recursive_enhancement = 0
for(var/i = 0, i<10,i++)
if(C)
diff --git a/code/game/gamemodes/changeling/powers/rapid_regen.dm b/code/game/gamemodes/changeling/powers/rapid_regen.dm
index 7df99753d4..eddf83292e 100644
--- a/code/game/gamemodes/changeling/powers/rapid_regen.dm
+++ b/code/game/gamemodes/changeling/powers/rapid_regen.dm
@@ -25,7 +25,6 @@
if(src.mind.changeling.recursive_enhancement)
healing_amount = C.maxHealth
src << "We completely heal ourselves."
- src.mind.changeling.recursive_enhancement = 0
spawn(0)
C.adjustBruteLoss(-healing_amount)
C.adjustFireLoss(-healing_amount)
diff --git a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm
index 9b42ee68e0..9362333c57 100644
--- a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm
+++ b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm
@@ -1,6 +1,6 @@
/datum/power/changeling/recursive_enhancement
name = "Recursive Enhancement"
- desc = "We cause our next ability use to have increased or additional effects."
+ desc = "We cause our abilities to have increased or additional effects."
helptext = "To check the effects for each ability, check the blue text underneath the ability in the evolution menu."
ability_icon_state = "ling_recursive_enhancement"
genomecost = 3
@@ -9,16 +9,16 @@
//Increases macimum chemical storage
/mob/proc/changeling_recursive_enhancement()
set category = "Changeling"
- set name = "Recursive Enhancement (10)"
- set desc = "Empowers our next ability."
- var/datum/changeling/changeling = changeling_power(10,0,100,UNCONSCIOUS)
+ set name = "Recursive Enhancement"
+ set desc = "Empowers our abilities."
+ var/datum/changeling/changeling = changeling_power(0,0,100,UNCONSCIOUS)
if(!changeling)
return 0
if(src.mind.changeling.recursive_enhancement)
- src << "We have already prepared to enhance our next ability."
+ src << "We will no longer empower our abilities."
+ src.mind.changeling.recursive_enhancement = 0
return 0
- src << "We empower ourselves. Our next ability will be extra potent."
+ src << "We empower ourselves. Our abilities will now be extra potent."
src.mind.changeling.recursive_enhancement = 1
- src.mind.changeling.chem_charges -= 10
feedback_add_details("changeling_powers","RE")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/respec.dm b/code/game/gamemodes/changeling/powers/respec.dm
index 661a761d8c..7910ceaf7c 100644
--- a/code/game/gamemodes/changeling/powers/respec.dm
+++ b/code/game/gamemodes/changeling/powers/respec.dm
@@ -12,6 +12,8 @@
ling_datum.purchased_powers = list() //Then wipe all the powers we bought.
ling_datum.geneticpoints = ling_datum.max_geneticpoints //Now refund our points to the maximum.
ling_datum.chem_recharge_rate = 0.5 //If glands were bought, revert that upgrade.
+ src.mind.changeling.recursive_enhancement = 0 //Ensures this is cleared
+
ling_datum.chem_storage = 50
if(ishuman(src))
var/mob/living/carbon/human/H = src
diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm
index 24d024467a..b9303a3a81 100644
--- a/code/game/gamemodes/changeling/powers/shriek.dm
+++ b/code/game/gamemodes/changeling/powers/shriek.dm
@@ -40,7 +40,6 @@
if(src.mind.changeling.recursive_enhancement)
range = range * 2
src << "We are extra loud."
- src.mind.changeling.recursive_enhancement = 0
for(var/mob/living/M in range(range, src))
if(iscarbon(M))
diff --git a/code/game/gamemodes/changeling/powers/silence_sting.dm b/code/game/gamemodes/changeling/powers/silence_sting.dm
index c16d74ff59..9ebe8adf7c 100644
--- a/code/game/gamemodes/changeling/powers/silence_sting.dm
+++ b/code/game/gamemodes/changeling/powers/silence_sting.dm
@@ -19,7 +19,6 @@
if(src.mind.changeling.recursive_enhancement)
duration = duration + 10
src << "They will be unable to cry out in fear for a little longer."
- src.mind.changeling.recursive_enhancement = 0
T.silent += duration
feedback_add_details("changeling_powers","SS")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/visible_camouflage.dm b/code/game/gamemodes/changeling/powers/visible_camouflage.dm
index 99bb7762fa..00e31cc932 100644
--- a/code/game/gamemodes/changeling/powers/visible_camouflage.dm
+++ b/code/game/gamemodes/changeling/powers/visible_camouflage.dm
@@ -39,7 +39,6 @@
if(src.mind.changeling.recursive_enhancement)
H.invisibility = INVISIBILITY_OBSERVER
src << "We are now truly invisible."
- src.mind.changeling.recursive_enhancement = 0
while(H.m_intent == "walk" && H.mind.changeling.cloaked && !H.stat) //This loop will keep going until the player uncloaks.
if(mind.changeling.chem_recharge_rate != 0) //Without this, there is an exploit that can be done, if one buys engorged chem sacks while cloaked.
diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm
index e8ea12b84b..1d41289ea2 100644
--- a/code/game/gamemodes/newobjective.dm
+++ b/code/game/gamemodes/newobjective.dm
@@ -264,7 +264,7 @@ datum
target = targeta
job = joba
weight = get_points(job)
- explanation_text = "Frame [target.current.real_name], the [target.assigned_role] for a crime and make sure they are arrested and brought back to the Centcom station alive. We'll handle the rest from there."
+ explanation_text = "Frame [target.current.real_name], the [target.assigned_role] for a crime and make sure they are arrested and brought back to the CentCom station alive. We'll handle the rest from there."
check_completion()
if(!emergency_shuttle.returned())
diff --git a/code/game/gamemodes/ninja/ninja.dm b/code/game/gamemodes/ninja/ninja.dm
index 9109d9297b..f17b693455 100644
--- a/code/game/gamemodes/ninja/ninja.dm
+++ b/code/game/gamemodes/ninja/ninja.dm
@@ -9,8 +9,8 @@
the omniscience of the AI and rival the most hardened weapons your station is capable of. Tread lightly and \
only hope this unknown assassin isn't here for you."
config_tag = "ninja"
- required_players = 1
- required_players_secret = 3
+ required_players = 5
+ required_players_secret = 5
required_enemies = 1
end_on_antag_death = 0
antag_tags = list(MODE_NINJA)
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/technomancer.dm b/code/game/gamemodes/technomancer/technomancer.dm
index a7131fb54c..cf37046d0f 100644
--- a/code/game/gamemodes/technomancer/technomancer.dm
+++ b/code/game/gamemodes/technomancer/technomancer.dm
@@ -7,8 +7,8 @@
their powers can be used for good or if their arrival foreshadows the destruction of the entire colony, or worse."
config_tag = "technomancer"
votable = 0
- required_players = 8
- required_players_secret = 10
+ required_players = 5
+ required_players_secret = 5
required_enemies = 1
end_on_antag_death = 0
antag_tags = list(MODE_TECHNOMANCER)
\ No newline at end of file
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 13b03e00e6..9abb9dee07 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -23,5 +23,6 @@
config_tag = "autotraitor"
antag_tags = list(MODE_AUTOTRAITOR)
round_autoantag = 1
- required_players_secret = 1
+ required_players_secret = 0
+ required_enemies = 0
antag_scaling_coeff = 5
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index de305db26c..f9bbeb8f33 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -237,10 +237,10 @@ proc/get_all_job_icons() //For all existing HUD icons
return I.rank
var/centcom = get_all_centcom_jobs()
- if(I.assignment in centcom) //Return with the NT logo if it is a Centcom job
- return "Centcom"
+ if(I.assignment in centcom) //Return with the NT logo if it is a CentCom job
+ return "CentCom"
if(I.rank in centcom)
- return "Centcom"
+ return "CentCom"
else
return
diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm
index 5e2b40d952..cc0faede19 100644
--- a/code/game/jobs/job/assistant.dm
+++ b/code/game/jobs/job/assistant.dm
@@ -19,6 +19,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
if(has_alt_title(H, alt_title,"Visitor")) //I doubt someone visiting the station would want to wear an ugly grey uniform
H.equip_to_slot_or_del(new /obj/item/clothing/under/assistantformal(H), slot_w_uniform)
else if(has_alt_title(H, alt_title,"Resident"))
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index c091a599c3..b12b915dd8 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -30,6 +30,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/cap(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/com(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/captain(H), slot_w_uniform)
if(H.age>49)
// Since we can have something other than the default uniform at this
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index b617c65da9..a8e4d3f3f6 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -21,6 +21,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform)
@@ -86,6 +87,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/hydroponics(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/hyd(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/hyd(H), slot_back)
return 1
@@ -171,6 +173,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/shaftminer(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
@@ -265,6 +268,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/internalaffairs(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/internalaffairs(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index 53c642b816..227297ca05 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -35,6 +35,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/ce(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
@@ -73,6 +74,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
@@ -111,6 +113,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/atmos(H), slot_l_store)
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index 6bdf3c1c4a..cc1130f43d 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -33,6 +33,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
/datum/job/proc/equip_survival(var/mob/living/carbon/human/H)
if(!H) return 0
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 69a94f0ade..0c2053f8d6 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -30,6 +30,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt)
@@ -63,6 +64,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
if(has_alt_title(H, alt_title,"Emergency Physician"))
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit)
@@ -78,6 +80,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/virology(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/vir(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/viro(H), slot_back)
else if(has_alt_title(H, alt_title,"Medical Doctor"))
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
@@ -128,6 +131,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chemistry(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/chem(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/chem(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(H), slot_wear_suit)
return 1
@@ -185,6 +189,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
if(has_alt_title(H, alt_title,"Psychiatrist"))
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych(H), slot_w_uniform)
else if(has_alt_title(H, alt_title,"Psychologist"))
@@ -221,6 +226,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
if(has_alt_title(H, alt_title,"Emergency Medical Technician"))
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/paramedic(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit)
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 891ecc2715..5c2f96e624 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -37,6 +37,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
return 1
@@ -70,6 +71,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
return 1
@@ -101,6 +103,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
return 1
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 071c1cbf1b..f151a5fb83 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -30,6 +30,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hos(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
@@ -70,6 +71,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/warden(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/warden(H), slot_belt)
@@ -108,6 +110,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt)
@@ -151,6 +154,7 @@
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 9d90f018ef..022ce367f0 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -329,7 +329,7 @@
organStatus["broken"] = E.broken_description
if(E.status & ORGAN_ROBOT)
organStatus["robotic"] = 1
- if(E.status & ORGAN_SPLINTED)
+ if(E.splinted)
organStatus["splinted"] = 1
if(E.status & ORGAN_BLEEDING)
organStatus["bleeding"] = 1
@@ -483,7 +483,7 @@
break
if(istype(e, /obj/item/organ/external/chest) && occupant.is_lung_ruptured())
lung_ruptured = "Lung ruptured:"
- if(e.status & ORGAN_SPLINTED)
+ if(e.splinted)
splint = "Splinted:"
if(e.status & ORGAN_BLEEDING)
bled = "Bleeding:"
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 739583ede8..cb57906e30 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -222,7 +222,7 @@ mob/living/proc/near_camera()
/mob/living/proc/tracking_status()
// Easy checks first.
- // Don't detect mobs on Centcom. Since the wizard den is on Centcomm, we only need this.
+ // Don't detect mobs on CentCom. Since the wizard den is on CentCom, we only need this.
var/obj/item/weapon/card/id/id = GetIdCard()
if(id && id.prevent_tracking())
return TRACKING_TERMINATE
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index a657d881a8..9ff98b84b4 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -173,7 +173,7 @@
src.updateDialog()
// OMG CENTCOMM LETTERHEAD
- if("MessageCentcomm")
+ if("MessageCentCom")
if(src.authenticated==2)
if(centcomm_message_cooldown)
usr << "\red Arrays recycling. Please stand by."
@@ -181,7 +181,7 @@
var/input = sanitize(input("Please choose a message to transmit to [boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
if(!input || !(usr in view(1,src)))
return
- Centcomm_announce(input, usr)
+ CentCom_announce(input, usr)
usr << "\blue Message transmitted."
log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]")
centcomm_message_cooldown = 1
@@ -295,7 +295,7 @@
if (src.authenticated==2)
dat += "
\[ Make An Announcement \]"
if(src.emagged == 0)
- dat += "
\[ Send an emergency message to [boss_short] \]"
+ dat += "
\[ Send an emergency message to [boss_short] \]"
else
dat += "
\[ Send an emergency message to \[UNKNOWN\] \]"
dat += "
\[ Restore Backup Routing Data \]"
diff --git a/code/game/machinery/computer3/computers/communications.dm b/code/game/machinery/computer3/computers/communications.dm
index 8168a3f8da..cace79d378 100644
--- a/code/game/machinery/computer3/computers/communications.dm
+++ b/code/game/machinery/computer3/computers/communications.dm
@@ -22,8 +22,8 @@
/datum/file/program/communications
- name = "Centcom communications relay"
- desc = "Used to connect to Centcom."
+ name = "CentCom communications relay"
+ desc = "Used to connect to CentCom."
active_state = "comm"
req_access = list(access_heads)
@@ -185,7 +185,7 @@
computer.updateDialog()
// OMG CENTCOMM LETTERHEAD
- if("MessageCentcomm" in href_list)
+ if("MessageCentCom" in href_list)
if(!computer.radio.subspace)
return
if(authenticated==2)
@@ -195,7 +195,7 @@
var/input = sanitize(input("Please choose a message to transmit to [boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", ""))
if(!input || !interactable())
return
- Centcomm_announce(input, usr)
+ CentCom_announce(input, usr)
usr << "Message transmitted."
log_say("[key_name(usr)] has made a [boss_short] announcement: [input]")
centcomm_message_cooldown = 1
@@ -288,7 +288,7 @@
if (authenticated==2)
dat += "
\[ Make An Announcement \]"
if(computer.emagged == 0)
- dat += "
\[ Send an emergency message to [boss_short] \]"
+ dat += "
\[ Send an emergency message to [boss_short] \]"
else
dat += "
\[ Send an emergency message to \[UNKNOWN\] \]"
dat += "
\[ Restore Backup Routing Data \]"
diff --git a/code/game/machinery/computer3/file.dm b/code/game/machinery/computer3/file.dm
index be4285b3e1..c425bcc0aa 100644
--- a/code/game/machinery/computer3/file.dm
+++ b/code/game/machinery/computer3/file.dm
@@ -62,13 +62,13 @@
return 1
/*
- Centcom root authorization certificate
+ CentCom root authorization certificate
Non-destructive, officially sanctioned.
Has the same effect on computers as an emag.
*/
/datum/file/centcom_auth
- name = "Centcom Root Access Token"
+ name = "CentCom Root Access Token"
extension = "auth"
volume = 100
copy()
diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm
index 3800fb9440..e31dd57fa2 100644
--- a/code/game/machinery/computer3/lapvend.dm
+++ b/code/game/machinery/computer3/lapvend.dm
@@ -178,7 +178,7 @@
else
usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call [boss_short] Support."
else
- usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support."
+ usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentCom Support."
else
transfer_and_vend(CH, C)
@@ -328,7 +328,7 @@
usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call [boss_short] Support."
return 0
else
- usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support."
+ usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentCom Support."
return 0
else
transfer_and_reimburse(CH)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index a0595bcdc2..02512c452e 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -586,7 +586,7 @@
var/electrified = 0
//Departments that the cycler can paint suits to look like.
- var/list/departments = list("Engineering","Mining","Medical","Security","Atmos")
+ var/list/departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard")
//Species that the suits can be configured to fit.
var/list/species = list("Human","Skrell","Unathi","Tajara", "Teshari")
@@ -616,7 +616,7 @@
name = "Engineering suit cycler"
model_text = "Engineering"
req_access = list(access_construction)
- departments = list("Engineering","Atmos")
+ departments = list("Engineering","Atmos","HAZMAT","Construction")
/obj/machinery/suit_cycler/mining
name = "Mining suit cycler"
@@ -634,7 +634,7 @@
name = "Medical suit cycler"
model_text = "Medical"
req_access = list(access_medical)
- departments = list("Medical")
+ departments = list("Medical","Biohazard")
/obj/machinery/suit_cycler/syndicate
name = "Nonstandard suit cycler"
@@ -751,7 +751,7 @@
//Clear the access reqs, disable the safeties, and open up all paintjobs.
user << "You run the sequencer across the interface, corrupting the operating protocols."
- departments = list("Engineering","Mining","Medical","Security","Atmos","^%###^%$")
+ departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","^%###^%$")
species = list("Human","Tajara","Skrell","Unathi", "Teshari")
emagged = 1
@@ -1018,6 +1018,33 @@
suit.name = "atmospherics voidsuit"
suit.icon_state = "rig-atmos"
suit.item_state = "atmos_voidsuit"
+ if("HAZMAT")
+ if(helmet)
+ helmet.name = "HAZMAT voidsuit helmet"
+ helmet.icon_state = "rig0-engineering_rad"
+ helmet.item_state = "rig0-engineering_rad"
+ if(suit)
+ suit.name = "HAZMAT voidsuit"
+ suit.icon_state = "rig-engineering_rad"
+ suit.item_state = "eng_voidsuit_rad"
+ if("Construction")
+ if(helmet)
+ helmet.name = "Construction voidsuit helmet"
+ helmet.icon_state = "rig0-engineering_con"
+ helmet.item_state = "rig0-engineering_con"
+ if(suit)
+ suit.name = "Construction voidsuit"
+ suit.icon_state = "rig-engineering_con"
+ suit.item_state = "eng_voidsuit_con"
+ if("Biohazard")
+ if(helmet)
+ helmet.name = "Biohazard voidsuit helmet"
+ helmet.icon_state = "rig0-medical_bio"
+ helmet.item_state = "rig0-medical_bio"
+ if(suit)
+ suit.name = "Biohazard voidsuit"
+ suit.icon_state = "rig-medical_bio"
+ suit.item_state = "medical_voidsuit_bio"
if("^%###^%$" || "Mercenary")
if(helmet)
helmet.name = "blood-red voidsuit helmet"
diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm
index ca35f59236..4a6aded43b 100644
--- a/code/game/machinery/telecomms/presets.dm
+++ b/code/game/machinery/telecomms/presets.dm
@@ -25,7 +25,7 @@
autolinkers = list("r_relay")
/obj/machinery/telecomms/relay/preset/centcom
- id = "Centcom Relay"
+ id = "CentCom Relay"
hide = 1
toggled = 1
//anchored = 1
@@ -44,7 +44,7 @@
"receiverA", "broadcasterA")
/obj/machinery/telecomms/hub/preset_cent
- id = "CentComm Hub"
+ id = "CentCom Hub"
network = "tcommsat"
produces_heat = 0
autolinkers = list("hub_cent", "c_relay", "s_relay", "m_relay", "r_relay",
@@ -65,7 +65,7 @@
..()
/obj/machinery/telecomms/receiver/preset_cent
- id = "CentComm Receiver"
+ id = "CentCom Receiver"
network = "tcommsat"
produces_heat = 0
autolinkers = list("receiverCent")
@@ -106,7 +106,7 @@
autolinkers = list("processor4", "engineering", "common")
/obj/machinery/telecomms/bus/preset_cent
- id = "CentComm Bus"
+ id = "CentCom Bus"
network = "tcommsat"
freq_listening = list(ERT_FREQ, DTH_FREQ)
produces_heat = 0
@@ -135,7 +135,7 @@
autolinkers = list("processor4")
/obj/machinery/telecomms/processor/preset_cent
- id = "CentComm Processor"
+ id = "CentCom Processor"
network = "tcommsat"
produces_heat = 0
autolinkers = list("processorCent")
@@ -200,7 +200,7 @@
autolinkers = list("security")
/obj/machinery/telecomms/server/presets/centcomm
- id = "CentComm Server"
+ id = "CentCom Server"
freq_listening = list(ERT_FREQ, DTH_FREQ)
produces_heat = 0
autolinkers = list("centcomm")
@@ -216,7 +216,7 @@
autolinkers = list("broadcasterA")
/obj/machinery/telecomms/broadcaster/preset_cent
- id = "CentComm Broadcaster"
+ id = "CentCom Broadcaster"
network = "tcommsat"
produces_heat = 0
autolinkers = list("broadcasterCent")
\ No newline at end of file
diff --git a/code/game/objects/effects/decals/posters/tgposters.dm b/code/game/objects/effects/decals/posters/tgposters.dm
index 5fb94396d5..50d615efa0 100644
--- a/code/game/objects/effects/decals/posters/tgposters.dm
+++ b/code/game/objects/effects/decals/posters/tgposters.dm
@@ -41,10 +41,10 @@
/datum/poster/tg_9
name = "Missing Gloves"
- desc = "This poster is about the uproar that followed Nanotrasen's financial cuts towards insulated-glove purchases."
+ desc = "This poster is about the uproar that followed NanoTrasen's financial cuts towards insulated-glove purchases."
icon_state="poster9"
/datum/poster/tg_10
name = "Hacking Guide"
- desc = "This poster details the internal workings of the common Nanotrasen airlock."
+ desc = "This poster details the internal workings of the common NanoTrasen airlock."
icon_state="poster10"
\ No newline at end of file
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index a0e37e28b8..94230418e8 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -97,6 +97,7 @@ var/list/civilian_cartridges = list(
name = "\improper ChemWhiz cartridge"
icon_state = "cart-chem"
access_reagent_scanner = 1
+ access_medical = 1
/obj/item/weapon/cartridge/security
name = "\improper R.O.B.U.S.T. cartridge"
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 7b70216330..bc05306282 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -143,13 +143,25 @@ REAGENT SCANNER
user.show_message("Significant brain damage detected. Subject may have had a concussion.")
if(ishuman(M))
var/mob/living/carbon/human/H = M
+ for(var/name_i in H.internal_organs_by_name)
+ var/obj/item/organ/internal/i = H.internal_organs_by_name[name_i]
+ if(istype(i, /obj/item/organ/internal/appendix))
+ var/obj/item/organ/internal/appendix/a = H.internal_organs_by_name[name_i]
+ if(a.inflamed > 3)
+ user.show_message(text("Severe inflamation detected in subject [a.name]."), 1)
+ else if(a.inflamed > 2)
+ user.show_message(text("Moderate inflamation detected in subject [a.name]."), 1)
+ else if(a.inflamed >= 1)
+ user.show_message(text("Mild inflamation detected in subject [a.name]."), 1)
+
+
for(var/name in H.organs_by_name)
var/obj/item/organ/external/e = H.organs_by_name[name]
if(!e)
continue
var/limb = e.name
if(e.status & ORGAN_BROKEN)
- if(((e.name == "l_arm") || (e.name == "r_arm") || (e.name == "l_leg") || (e.name == "r_leg")) && (!(e.status & ORGAN_SPLINTED)))
+ if(((e.name == "l_arm") || (e.name == "r_arm") || (e.name == "l_leg") || (e.name == "r_leg")) && (!e.splinted))
user << "Unsecured fracture in subject [limb]. Splinting recommended for transport."
if(e.has_infected_wound())
user << "Infected wound detected in subject [limb]. Disinfection recommended."
@@ -165,6 +177,7 @@ REAGENT SCANNER
for(var/datum/wound/W in e.wounds) if(W.internal)
user.show_message(text("Internal bleeding detected. Advanced scanner required for location."), 1)
break
+
if(M:vessel)
var/blood_volume = H.vessel.get_reagent_amount("blood")
var/blood_percent = round((blood_volume / H.species.blood_volume)*100)
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 3e9c9a7524..41ae7ac7c3 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -264,7 +264,7 @@
if(!(affecting.organ_tag in splintable_organs))
user << "You can't use \the [src] to apply a splint there!"
return
- if(affecting.status & ORGAN_SPLINTED)
+ if(affecting.splinted)
user << "[M]'s [limb] is already splinted!"
return
if (M != user)
@@ -275,17 +275,21 @@
user << "You can't apply a splint to the arm you're using!"
return
user.visible_message("[user] starts to apply \the [src] to their [limb].", "You start to apply \the [src] to your [limb].", "You hear something being wrapped.")
- if(do_after(user, 50))
- if (M != user)
- user.visible_message("[user] finishes applying \the [src] to [M]'s [limb].", "You finish applying \the [src] to [M]'s [limb].", "You hear something being wrapped.")
- else
- if(prob(25))
- user.visible_message("[user] successfully applies \the [src] to their [limb].", "You successfully apply \the [src] to your [limb].", "You hear something being wrapped.")
- else
- user.visible_message("[user] fumbles \the [src].", "You fumble \the [src].", "You hear something being wrapped.")
+ if(do_after(user, 50, M))
+ if(M == user && prob(75))
+ user.visible_message("\The [user] fumbles [src].", "You fumble [src].", "You hear something being wrapped.")
+ return
+ var/obj/item/stack/medical/splint/S = split(1)
+ if(S)
+ if(affecting.apply_splint(S))
+ S.forceMove(affecting)
+ if (M != user)
+ user.visible_message("\The [user] finishes applying [src] to [M]'s [limb].", "You finish applying \the [src] to [M]'s [limb].", "You hear something being wrapped.")
+ else
+ user.visible_message("\The [user] successfully applies [src] to their [limb].", "You successfully apply \the [src] to your [limb].", "You hear something being wrapped.")
return
- affecting.status |= ORGAN_SPLINTED
- use(1)
+ S.dropInto(src.loc) //didn't get applied, so just drop it
+ user.visible_message("\The [user] fails to apply [src].", "You fail to apply [src].", "You hear something being wrapped.")
return
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 60e02feab6..25ee157950 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -115,6 +115,11 @@ var/last_chew = 0
last_chew = world.time
+/obj/item/weapon/handcuffs/fuzzy
+ name = "fuzzy cuffs"
+ icon_state = "fuzzycuff"
+ desc = "Use this to keep... 'prisoners' in line."
+
/obj/item/weapon/handcuffs/cable
name = "cable restraints"
desc = "Looks like some cables tied together. Could be used to tie something up."
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 4bddb29a06..3f4164a4c4 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -164,12 +164,10 @@ Implant Specifics:
"}
if (malfunction == MALFUNCTION_PERMANENT)
return
- var/need_gib = null
if(istype(imp_in, /mob/))
var/mob/T = imp_in
message_admins("Explosive implant triggered in [T] ([T.key]). (JMP) ")
log_game("Explosive implant triggered in [T] ([T.key]).")
- need_gib = 1
if(ishuman(imp_in))
if (elevel == "Localized Limb")
@@ -180,11 +178,11 @@ Implant Specifics:
"}
if (istype(part,/obj/item/organ/external/chest) || \
istype(part,/obj/item/organ/external/groin) || \
istype(part,/obj/item/organ/external/head))
- part.createwound(BRUISE, 60) //mangle them instead
- explosion(get_turf(imp_in), -1, -1, 2, 3)
+ part.createwound(BRUISE, 80) //mangle them instead
+ explosion(get_turf(imp_in), -1, -1, 1, 3)
qdel(src)
else
- explosion(get_turf(imp_in), -1, -1, 2, 3)
+ explosion(get_turf(imp_in), -1, -1, 1, 3)
part.droplimb(0,DROPLIMB_BLUNT)
qdel(src)
if (elevel == "Destroy Body")
@@ -197,9 +195,6 @@ Implant Specifics:
"}
else
explosion(get_turf(imp_in), 0, 1, 3, 6)
- if(need_gib)
- imp_in.gib()
-
var/turf/t = get_turf(imp_in)
if(t)
@@ -249,10 +244,10 @@ Implant Specifics:
"}
if (istype(part,/obj/item/organ/external/chest) || \
istype(part,/obj/item/organ/external/groin) || \
istype(part,/obj/item/organ/external/head))
- part.createwound(BRUISE, 60) //mangle them instead
+ part.createwound(BRUISE, 80) //mangle them instead
else
part.droplimb(0,DROPLIMB_BLUNT)
- explosion(get_turf(imp_in), -1, -1, 2, 3)
+ explosion(get_turf(imp_in), -1, -1, 1, 3)
qdel(src)
/obj/item/weapon/implant/chem
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 69207191e7..409f0fa849 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -280,3 +280,59 @@
name = "emergency response team medical backpack"
desc = "A spacious backpack with lots of pockets, worn by medical members of an Emergency Response Team."
icon_state = "ert_medical"
+
+/*
+ * Courier Bags
+ */
+
+/obj/item/weapon/storage/backpack/messenger
+ name = "messenger bag"
+ desc = "A sturdy backpack worn over one shoulder."
+ icon_state = "courierbag"
+ item_state_slots = list(slot_r_hand_str = "backpack", slot_l_hand_str = "backpack")
+
+/obj/item/weapon/storage/backpack/messenger/chem
+ name = "chemistry messenger bag"
+ desc = "A serile backpack worn over one shoulder. This one is in Chemsitry colors."
+ icon_state = "courierbagchem"
+ item_state_slots = list(slot_r_hand_str = "chempack", slot_l_hand_str = "chempack")
+
+/obj/item/weapon/storage/backpack/messenger/med
+ name = "medical messenger bag"
+ desc = "A sterile backpack worn over one shoulder used in medical departments."
+ icon_state = "courierbagmed"
+ item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack")
+
+/obj/item/weapon/storage/backpack/messenger/viro
+ name = "virology messenger bag"
+ desc = "A sterile backpack worn over one shoulder. This one is in Virology colors."
+ icon_state = "courierbagviro"
+ item_state_slots = list(slot_r_hand_str = "viropack", slot_l_hand_str = "viropack")
+
+/obj/item/weapon/storage/backpack/messenger/tox
+ name = "research messenger bag"
+ desc = "A backpack worn over one shoulder. Useful for holding science materials."
+ icon_state = "courierbagtox"
+ item_state_slots = list(slot_r_hand_str = "toxpack", slot_l_hand_str = "toxpack")
+
+/obj/item/weapon/storage/backpack/messenger/com
+ name = "command messenger bag"
+ desc = "A special backpack worn over one shoulder. This one is made specifically for officers."
+ icon_state = "courierbagcom"
+ item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack")
+
+/obj/item/weapon/storage/backpack/messenger/engi
+ name = "engineering messenger bag"
+ icon_state = "courierbagengi"
+ item_state_slots = list(slot_r_hand_str = "engiepack", slot_l_hand_str = "engiepack")
+
+/obj/item/weapon/storage/backpack/messenger/hyd
+ name = "hydroponics messenger bag"
+ desc = "A backpack worn over one shoulder. This one is designed for plant-related work."
+ icon_state = "courierbaghyd"
+
+/obj/item/weapon/storage/backpack/messenger/sec
+ name = "security messenger bag"
+ desc = "A tactical backpack worn over one shoulder. This one is in Security colors."
+ icon_state = "courierbagsec"
+ item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack")
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index f7de0b46f6..f116a5156d 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -56,6 +56,7 @@
/obj/item/weapon/extinguisher/mini,
/obj/item/device/flashlight/maglight,
/obj/item/weapon/tape_roll,
+ /obj/item/device/integrated_electronics/wirer,
)
/obj/item/weapon/storage/belt/utility/full/New()
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index 7d0161a2fd..9c779f013a 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -127,10 +127,10 @@
filled = TRUE
/obj/item/weapon/storage/toolbox/lunchbox/nt
- name = "Nanotrasen brand lunchbox"
+ name = "NanoTrasen brand lunchbox"
icon_state = "lunchbox_nanotrasen"
item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue")
- desc = "A little lunchbox. This one is branded with the Nanotrasen logo!"
+ desc = "A little lunchbox. This one is branded with the NanoTrasen logo!"
/obj/item/weapon/storage/toolbox/lunchbox/nt/filled
filled = TRUE
diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm
index c891c7af25..531a359d83 100644
--- a/code/game/objects/random/random.dm
+++ b/code/game/objects/random/random.dm
@@ -11,11 +11,9 @@
..()
if (!prob(spawn_nothing_percentage))
spawn_item()
-
-/obj/random/initialize()
- ..()
qdel(src)
+
// this function should return a specific item to spawn
/obj/random/proc/item_to_spawn()
return 0
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index d88e8c5372..107ea11520 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -394,3 +394,6 @@
var/shake_dir = pick(-1, 1)
animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1)
animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING)
+
+/obj/structure/closet/onDropInto(var/atom/movable/AM)
+ return
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 19800810cb..a422768269 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -517,9 +517,9 @@
new /obj/item/clothing/under/color/yellow(src)
new /obj/item/clothing/under/color/green(src)
new /obj/item/clothing/under/color/pink(src)
- new /obj/item/clothing/under/skirt/plaid_blue(src)
- new /obj/item/clothing/under/skirt/plaid_red(src)
- new /obj/item/clothing/under/skirt/plaid_purple(src)
+ new /obj/item/clothing/under/skirt/outfit/plaid_blue(src)
+ new /obj/item/clothing/under/skirt/outfit/plaid_red(src)
+ new /obj/item/clothing/under/skirt/outfit/plaid_purple(src)
new /obj/item/clothing/shoes/blue(src)
new /obj/item/clothing/shoes/yellow(src)
new /obj/item/clothing/shoes/green(src)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index d6034bbb8a..5cdb49657a 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -265,7 +265,7 @@
/obj/structure/closet/crate/contraband
name = "Poster crate"
- desc = "A random assortment of posters manufactured by providers NOT listed under Nanotrasen's whitelist."
+ desc = "A random assortment of posters manufactured by providers NOT listed under NanoTrasen's whitelist."
icon_state = "crate"
icon_opened = "crateopen"
icon_closed = "crate"
diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm
index 55795bc5b3..ed5b8661ab 100644
--- a/code/game/turfs/flooring/flooring_premade.dm
+++ b/code/game/turfs/flooring/flooring_premade.dm
@@ -238,7 +238,7 @@
#define FOOTSTEP_SPRITE_AMT 2
/turf/snow/Entered(atom/A)
- if(ismob(A))
+ if(isliving(A))
var/mdir = "[A.dir]"
if(crossed_dirs[mdir])
crossed_dirs[mdir] = min(crossed_dirs[mdir] + 1, FOOTSTEP_SPRITE_AMT)
diff --git a/code/global.dm b/code/global.dm
index 15b17823f8..503c953a9e 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -30,7 +30,7 @@ var/const/station_orig = "Northern Star" //station_name can't be const due to ev
var/const/station_short = "Northern Star"
var/const/dock_name = "Vir Interstellar Spaceport"
var/const/boss_name = "Central Command"
-var/const/boss_short = "Centcomm"
+var/const/boss_short = "CentCom"
var/const/company_name = "NanoTrasen"
var/const/company_short = "NT"
var/const/star_name = "Vir"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index eaadf431bc..5a5d2a1a35 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1323,19 +1323,19 @@
M.Weaken(20)
M.stuttering = 20
- else if(href_list["CentcommReply"])
- var/mob/living/L = locate(href_list["CentcommReply"])
+ else if(href_list["CentComReply"])
+ var/mob/living/L = locate(href_list["CentComReply"])
if(!istype(L))
usr << "This can only be used on instances of type /mob/living/"
return
if(L.can_centcom_reply())
- var/input = sanitize(input(src.owner, "Please enter a message to reply to [key_name(L)] via their headset.","Outgoing message from Centcomm", ""))
+ var/input = sanitize(input(src.owner, "Please enter a message to reply to [key_name(L)] via their headset.","Outgoing message from CentCom", ""))
if(!input) return
src.owner << "You sent [input] to [L] via a secure channel."
- log_admin("[src.owner] replied to [key_name(L)]'s Centcomm message with the message [input].")
- message_admins("[src.owner] replied to [key_name(L)]'s Centcom message with: \"[input]\"")
+ log_admin("[src.owner] replied to [key_name(L)]'s CentCom message with the message [input].")
+ message_admins("[src.owner] replied to [key_name(L)]'s CentCom message with: \"[input]\"")
if(!isAI(L))
L << "You hear something crackle in your headset for a moment before a voice speaks."
L << "Please stand by for a message from Central Command."
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 844f74b5f6..1307086a87 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -27,8 +27,8 @@
feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//log_admin("HELP: [key_name(src)]: [msg]")
-/proc/Centcomm_announce(var/msg, var/mob/Sender, var/iamessage)
- msg = "\blue [uppertext(boss_short)]M[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, src)]) (CA) (BSA) (RPLY): [msg]"
+/proc/CentCom_announce(var/msg, var/mob/Sender, var/iamessage)
+ msg = "\blue [uppertext(boss_short)]M[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, src)]) (CA) (BSA) (RPLY): [msg]"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
C << msg
diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm
index 537f2632e7..79adec9afc 100644
--- a/code/modules/client/preference_setup/general/04_equipment.dm
+++ b/code/modules/client/preference_setup/general/04_equipment.dm
@@ -34,7 +34,7 @@
pref.all_underwear -= underwear_category_name
// TODO - Looks like this is duplicating the work of sanitize_character() if so, remove
- if(pref.backbag > 4 || pref.backbag < 1)
+ if(pref.backbag > 5 || pref.backbag < 1)
pref.backbag = 1 //Same as above
character.backbag = pref.backbag
diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm
index 039da50f65..6220a01c81 100644
--- a/code/modules/client/preference_setup/loadout/loadout_head.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_head.dm
@@ -248,3 +248,23 @@
/datum/gear/head/beretg/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
+
+/datum/gear/head/sombrero
+ display_name = "sombrero"
+ path = /obj/item/clothing/head/sombrero
+
+/datum/gear/head/flatcapg
+ display_name = "flat cap"
+ path = /obj/item/clothing/head/flatcap/grey
+
+/datum/gear/head/flatcapg/New()
+ ..()
+ gear_tweaks = list(gear_tweak_free_color_choice)
+
+/datum/gear/head/bow
+ display_name = "hair bow"
+ path = /obj/item/clothing/head/hairflower/bow
+
+/datum/gear/head/bow/New()
+ ..()
+ gear_tweaks = list(gear_tweak_free_color_choice)
\ No newline at end of file
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 5403fe4ffb..a8305dd9ac 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -1,5 +1,5 @@
/obj/item/clothing/head/centhat
- name = "\improper CentComm. hat"
+ name = "\improper CentCom. hat"
icon_state = "centcom"
desc = "It's good to be emperor."
siemens_coefficient = 0.9
@@ -32,6 +32,12 @@
/obj/item/clothing/head/hairflower/orange
icon_state = "hairflower_orange"
+/obj/item/clothing/head/hairflower/bow
+ icon_state = "bow"
+ name = "hair bow"
+ desc = "A ribbon tied into a bow with a clip on the back to attach to hair."
+ item_state_slots = list(slot_r_hand_str = "pill", slot_l_hand_str = "pill")
+
/obj/item/clothing/head/powdered_wig
name = "powdered wig"
desc = "A powdered wig."
@@ -144,6 +150,10 @@
item_state_slots = list(slot_r_hand_str = "detective", slot_l_hand_str = "detective")
siemens_coefficient = 0.9 //...what?
+/obj/item/clothing/head/flatcap/grey
+ icon_state = "flat_capg"
+ item_state_slots = list(slot_r_hand_str = "greysoft", slot_l_hand_str = "greysoft")
+
/obj/item/clothing/head/pirate
name = "pirate hat"
desc = "Yarr."
@@ -299,4 +309,10 @@
name = "beret"
desc = "A beret, an artists favorite headwear."
icon_state = "beret_g"
- body_parts_covered = 0
\ No newline at end of file
+ body_parts_covered = 0
+
+/obj/item/clothing/head/sombrero
+ name = "sombrero"
+ desc = "A wide-brimmed hat popularly worn in Mexico."
+ icon_state = "sombrero"
+ body_parts_covered = 0
diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
index becbd2a469..2ef9810c58 100644
--- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
@@ -173,15 +173,25 @@
usable = 1
active = 1
permanent = 1
+ var/datum/effect/effect/system/smoke_spread/bad/smoke
+ var/smoke_strength = 8
engage_string = "Detonate"
interface_name = "dead man's switch"
- interface_desc = "An integrated self-destruct module. When the wearer dies, so does the surrounding area. Do not press this button."
- var/list/explosion_values = list(1,2,4,5)
+ interface_desc = "An integrated self-destruct module. When the wearer dies, they vanish in smoke. Do not press this button."
+
+/obj/item/rig_module/self_destruct/New()
+ ..()
+ src.smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad)
+ src.smoke.attach(src)
+
+/obj/item/rig_module/self_destruct/Destroy()
+ qdel(smoke)
+ smoke = null
+ return ..()
+
-/obj/item/rig_module/self_destruct/small
- explosion_values = list(0,0,3,4)
/obj/item/rig_module/self_destruct/activate()
return
@@ -202,8 +212,8 @@
/obj/item/rig_module/self_destruct/engage(var/skip_check)
if(!skip_check && usr && alert(usr, "Are you sure you want to push that button?", "Self-destruct", "No", "Yes") == "No")
return
- explosion(get_turf(src), explosion_values[1], explosion_values[2], explosion_values[3], explosion_values[4])
if(holder && holder.wearer)
- holder.wearer.drop_from_inventory(src)
- qdel(holder)
- qdel(src)
+ smoke.set_up(10, 0, holder.loc)
+ for(var/i = 1 to smoke_strength)
+ smoke.start(272727)
+ holder.wearer.ash()
diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm
index f06e839ae3..942921b0e9 100644
--- a/code/modules/clothing/spacesuits/spacesuits.dm
+++ b/code/modules/clothing/spacesuits/spacesuits.dm
@@ -63,7 +63,7 @@
var/list/supporting_limbs //If not-null, automatically splints breaks. Checked when removing the suit.
/obj/item/clothing/suit/space/equipped(mob/M)
- check_limb_support()
+ check_limb_support(M)
..()
/obj/item/clothing/suit/space/dropped(var/mob/user)
@@ -77,14 +77,24 @@
/obj/item/clothing/suit/space/proc/check_limb_support(var/mob/living/carbon/human/user)
// If this isn't set, then we don't need to care.
- if(!supporting_limbs || !supporting_limbs.len)
+ if(!istype(user) || isnull(supporting_limbs))
return
- if(!istype(user) || user.wear_suit == src)
- return
+ if(user.wear_suit == src)
+ for(var/obj/item/organ/external/E in user.bad_external_organs)
+ if(E.is_broken() && E.apply_splint(src))
+ user << "You feel [src] constrict about your [E.name], supporting it."
+ supporting_limbs |= E
+ else
+ // Otherwise, remove the splints.
+ for(var/obj/item/organ/external/E in supporting_limbs)
+ if(E.splinted == src && E.remove_splint(src))
+ user << "\The [src] stops supporting your [E.name]."
+ supporting_limbs.Cut()
- // Otherwise, remove the splints.
- for(var/obj/item/organ/external/E in supporting_limbs)
- E.status &= ~ ORGAN_SPLINTED
- user << "The suit stops supporting your [E.name]."
- supporting_limbs = list()
+/obj/item/clothing/suit/space/proc/handle_fracture(var/mob/living/carbon/human/user, var/obj/item/organ/external/E)
+ if(!istype(user) || isnull(supporting_limbs))
+ return
+ if(E.is_broken() && E.apply_splint(src))
+ user << "You feel [src] constrict about your [E.name], supporting it."
+ supporting_limbs |= E
diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm
index 13db80ae39..fd03c3cbe4 100644
--- a/code/modules/clothing/spacesuits/void/station.dm
+++ b/code/modules/clothing/spacesuits/void/station.dm
@@ -7,6 +7,16 @@
item_state_slots = list(slot_r_hand_str = "eng_helm", slot_l_hand_str = "eng_helm")
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80)
+/obj/item/clothing/head/helmet/space/void/engineering/hazmat
+ name = "HAZMAT voidsuit helmet"
+ icon_state = "rig0-engineering_rad"
+ item_state_slots = list(slot_r_hand_str = "eng_helm_rad", slot_l_hand_str = "eng_helm_rad")
+
+/obj/item/clothing/head/helmet/space/void/engineering/construction
+ name = "construction voidsuit helmet"
+ icon_state = "rig0-engineering_con"
+ item_state_slots = list(slot_r_hand_str = "eng_helm_con", slot_l_hand_str = "eng_helm_con")
+
/obj/item/clothing/suit/space/void/engineering
name = "engineering voidsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
@@ -16,6 +26,16 @@
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
+/obj/item/clothing/suit/space/void/engineering/hazmat
+ name = "HAZMAT voidsuit"
+ icon_state = "rig-engineering_rad"
+ item_state_slots = list(slot_r_hand_str = "eng_voidsuit_rad", slot_l_hand_str = "eng_voidsuit_rad")
+
+/obj/item/clothing/suit/space/void/engineering/construction
+ name = "contstruction voidsuit"
+ icon_state = "rig-engineering_con"
+ item_state_slots = list(slot_r_hand_str = "eng_voidsuit_con", slot_l_hand_str = "eng_voidsuit_con")
+
//Mining
/obj/item/clothing/head/helmet/space/void/mining
name = "mining voidsuit helmet"
@@ -40,6 +60,11 @@
item_state_slots = list(slot_r_hand_str = "medical_helm", slot_l_hand_str = "medical_helm")
armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 50)
+/obj/item/clothing/head/helmet/space/void/medical/bio
+ name = "biohazard voidsuit helmet"
+ icon_state = "rig0-medical_bio"
+ item_state_slots = list(slot_r_hand_str = "medical_helm_bio", slot_l_hand_str = "medical_helm_bio")
+
/obj/item/clothing/suit/space/void/medical
name = "medical voidsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has minor radiation shielding."
@@ -48,6 +73,11 @@
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 50)
+/obj/item/clothing/suit/space/void/medical/bio
+ name = "biohazard voidsuit"
+ icon_state = "rig-medical_bio"
+ item_state_slots = list(slot_r_hand_str = "medical_voidsuit_bio", slot_l_hand_str = "medical_voidsuit_bio")
+
//Security
/obj/item/clothing/head/helmet/space/void/security
name = "security voidsuit helmet"
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 3476ea183a..daf46fd70b 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -323,6 +323,12 @@
icon_badge = "detectivevest_badge"
icon_nobadge = "detectivevest_nobadge"
+/obj/item/clothing/suit/storage/vest/press
+ name = "press vest"
+ desc = "A simple kevlar plate carrier. This one has the word 'Press' embroidered on patches on the back and front."
+ item_state_slots = list(slot_r_hand_str = "armor", slot_l_hand_str = "armor")
+ allowed = list(/obj/item/device/flashlight,/obj/item/device/taperecorder,/obj/item/weapon/pen,/obj/item/device/camera_film,/obj/item/device/camera)
+
/obj/item/clothing/suit/storage/vest/heavy
name = "heavy armor vest"
desc = "A heavy kevlar plate carrier with webbing attached."
diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm
index 59db7aaab5..e108c7f33e 100644
--- a/code/modules/clothing/under/shorts.dm
+++ b/code/modules/clothing/under/shorts.dm
@@ -91,10 +91,10 @@
//Argh, skirts be below this line -> ------------------------------
/obj/item/clothing/under/skirt
- name = "black skirt"
- desc = "A black skirt, very fancy!"
- icon_state = "blackskirt"
- body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ name = "short black skirt"
+ desc = "A skirt that is a shiny black."
+ icon_state = "skirt_short_black"
+ body_parts_covered = LOWER_TORSO
rolled_sleeves = -1
/obj/item/clothing/under/skirt/khaki
@@ -102,11 +102,6 @@
desc = "A skirt that is a khaki color."
icon_state = "skirt_khaki"
-/obj/item/clothing/under/skirt/black
- name = "short black skirt"
- desc = "A skirt that is a shiny black."
- icon_state = "skirt_short_black"
-
/obj/item/clothing/under/skirt/blue
name = "short blue skirt"
desc = "A skirt that is a shiny blue."
@@ -122,19 +117,25 @@
desc = "A skirt that is swept to one side."
icon_state = "skirt_swept"
-/obj/item/clothing/under/skirt/plaid_blue
+/obj/item/clothing/under/skirt/outfit
+ name = "black skirt"
+ desc = "A black skirt, very fancy!"
+ icon_state = "blackskirt"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+
+/obj/item/clothing/under/skirt/outfit/plaid_blue
name = "blue plaid skirt"
desc = "A preppy blue skirt with a white blouse."
icon_state = "plaid_blue"
item_state_slots = list(slot_r_hand_str = "blue", slot_l_hand_str = "blue")
-/obj/item/clothing/under/skirt/plaid_red
+/obj/item/clothing/under/skirt/outfit/plaid_red
name = "red plaid skirt"
desc = "A preppy red skirt with a white blouse."
icon_state = "plaid_red"
item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red")
-/obj/item/clothing/under/skirt/plaid_purple
+/obj/item/clothing/under/skirt/outfit/plaid_purple
name = "blue purple skirt"
desc = "A preppy purple skirt with a white blouse."
icon_state = "plaid_purple"
diff --git a/code/modules/economy/TradeDestinations.dm b/code/modules/economy/TradeDestinations.dm
index ccedfe35ef..8ae548e2ff 100644
--- a/code/modules/economy/TradeDestinations.dm
+++ b/code/modules/economy/TradeDestinations.dm
@@ -18,7 +18,7 @@ var/list/weighted_mundaneevent_locations = list()
//distance is measured in AU and co-relates to travel time
/datum/trade_destination/centcomm
- name = "CentComm"
+ name = "CentCom"
description = "NanoTrasen's administrative centre for Tau Ceti."
distance = 1.2
willing_to_buy = list()
diff --git a/code/modules/examine/descriptions/devices.dm b/code/modules/examine/descriptions/devices.dm
index 05182df0a5..33954f6672 100644
--- a/code/modules/examine/descriptions/devices.dm
+++ b/code/modules/examine/descriptions/devices.dm
@@ -8,7 +8,7 @@
that while in space, across star systems, and that the consumer can afford and use without training, is much more recent, and is thanks to the backbone \
that is the Exonet.
\
\
- The Exonet is the predominant interstellar telecom system, servicing trillions of devices across a large portion of human-controlled space. \
+ The Exonet is the predominant interstellar telecomm system, servicing trillions of devices across a large portion of human-controlled space. \
It is distributed by a massive network of telecommunication satellites, some privately owned and others owned by the systems’ local governments, \
that utilize FTL technologies to bounce data between satellites at speeds that would not be possible at sub-light technology. This communicator \
uses a protocol called Exonet Protocol Version 2, generally shortened to EPv2.
\
diff --git a/code/modules/examine/descriptions/telecomms.dm b/code/modules/examine/descriptions/telecomms.dm
index 747697f55f..45101ec130 100644
--- a/code/modules/examine/descriptions/telecomms.dm
+++ b/code/modules/examine/descriptions/telecomms.dm
@@ -30,7 +30,7 @@
Exonets at the root node(s), and is typically arranged in a tree structure. The root node(s) are generally government-owned and are very secure \
and resilient to failure.
\
\
- This node is privately owned and maintained by Nanotrasen, and allows the colonists of the "+station_orig+" to have access to the Exonet."
+ This node is privately owned and maintained by NanoTrasen, and allows the colonists of the "+station_orig+" to have access to the Exonet."
description_antag = "An EMP will disable this device for a short period of time. A longer downage can be achieved by turning it off, or rigging \
the APC it uses to turn off remotely, such as with a signaler in the right wire."
\ No newline at end of file
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index 3fcf07713b..42bd4b709b 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -146,7 +146,7 @@
for(var/datum/playingcard/P in cards)
H.cards += P
H.concealed = src.concealed
- user.drop_from_inventory(src,user.loc)
+ user.drop_from_inventory(src)
qdel(src)
H.update_icon()
return
diff --git a/code/modules/integrated_electronics/_defines.dm b/code/modules/integrated_electronics/_defines.dm
new file mode 100644
index 0000000000..7e0655c80c
--- /dev/null
+++ b/code/modules/integrated_electronics/_defines.dm
@@ -0,0 +1,368 @@
+#define DATA_CHANNEL "data channel"
+#define PULSE_CHANNEL "pulse channel"
+
+/obj/item/integrated_circuit
+ name = "integrated circuit"
+ desc = "It's a tiny chip! This one doesn't seem to do much, however."
+ icon = 'icons/obj/electronic_assemblies.dmi'
+ icon_state = "template"
+ w_class = 1
+ var/extended_desc = null
+ var/list/inputs = list()
+ var/list/outputs = list()
+ var/list/activators = list()
+ var/number_of_inputs = 0 //This is how many input pins are created
+ var/number_of_outputs = 0 //Likewise for output
+ var/number_of_activators = 0 //Guess
+ var/list/input_names = list()
+ var/list/output_names = list()
+ var/list/activator_names = list()
+ var/last_used = 0 //Uses world.time
+ var/complexity = 1 //This acts as a limitation on building machines, more resource-intensive components cost more 'space'.
+ var/power_required = 5 //w
+
+/obj/item/integrated_circuit/examine(mob/user)
+ ..()
+ user << "This board has [inputs.len] input [inputs.len != 1 ? "pins" : "pin"] and \
+ [outputs.len] output [outputs.len != 1 ? "pins" : "pin"]."
+ for(var/datum/integrated_io/input/I in inputs)
+ if(I.linked.len)
+ user << "\The [I.name] is connected to [I.get_linked_to_desc()]."
+ for(var/datum/integrated_io/output/O in outputs)
+ if(O.linked.len)
+ user << "\The [O.name] is connected to [O.get_linked_to_desc()]."
+ for(var/datum/integrated_io/activate/A in activators)
+ if(A.linked.len)
+ user << "\The [A.name] is connected to [A.get_linked_to_desc()]."
+
+ interact(user)
+
+/obj/item/integrated_circuit/New()
+ ..()
+ var/i = 0
+ if(number_of_inputs)
+ for(i = number_of_inputs, i > 0, i--)
+ inputs.Add(new /datum/integrated_io/input(src))
+
+ if(number_of_outputs)
+ for(i = number_of_outputs, i > 0, i--)
+ outputs.Add(new /datum/integrated_io/output(src))
+
+ if(number_of_activators)
+ for(i = number_of_activators, i > 0, i--)
+ activators.Add(new /datum/integrated_io/activate(src))
+
+ apply_names_to_io()
+
+/obj/item/integrated_circuit/proc/apply_names_to_io()
+ var/i = 1
+ if(input_names.len)
+ for(var/datum/integrated_io/input/I in inputs)
+ I.name = "[input_names[i]]"
+ i++
+ i = 1
+ if(output_names.len)
+ for(var/datum/integrated_io/output/O in outputs)
+ O.name = "[output_names[i]]"
+ i++
+
+ i = 1
+ if(activator_names.len)
+ for(var/datum/integrated_io/activate/A in activators)
+ A.name = "[activator_names[i]]"
+ i++
+
+/obj/item/integrated_circuit/Destroy()
+ for(var/datum/integrated_io/I in inputs)
+ qdel(I)
+ for(var/datum/integrated_io/O in outputs)
+ qdel(O)
+ for(var/datum/integrated_io/A in activators)
+ qdel(A)
+ ..()
+
+/obj/item/integrated_circuit/emp_act(severity)
+ for(var/datum/integrated_io/io in inputs + outputs + activators)
+ io.scramble()
+
+/obj/item/integrated_circuit/verb/rename_component()
+ set name = "Rename Circuit"
+ set category = "Object"
+ set desc = "Rename your circuit, useful to stay organized."
+
+ var/mob/M = usr
+
+ if(!M.canmove || M.stat || M.restrained())
+ return
+
+ var/input = sanitizeSafe(input("What do you want to name the circuit?", ,""), MAX_NAME_LEN)
+
+ if(src && input)
+ M << "The circuit '[src.name]' is now labeled '[input]'."
+ name = input
+
+/obj/item/integrated_circuit/proc/get_pin_ref(var/pin_type, var/pin_number)
+ switch(pin_type)
+ if("input")
+ if(pin_number > inputs.len)
+ return null
+ return inputs[pin_number]
+ if("output")
+ if(pin_number > outputs.len)
+ return null
+ return outputs[pin_number]
+ if("activator")
+ if(pin_number > activators.len)
+ return null
+ return activators[pin_number]
+ return null
+
+/obj/item/integrated_circuit/interact(mob/user)
+ if(get_dist(get_turf(src), user) > 1)
+ user.unset_machine(src)
+ return
+ var/HTML = "
[src.name]"
+ HTML += ""
+ HTML += "
"
+
+ HTML += "
\[Refresh\] | "
+ HTML += "\[Rename\]
"
+
+ HTML += ""
+ HTML += ""
+ HTML += ""
+ HTML += ""
+ HTML += ""
+
+ var/column_width = 3
+ var/row_height = max(inputs.len, outputs.len, 1)
+ var/i
+ var/j
+ for(i = 1, i < row_height+1, i++)
+ HTML += ""
+ for(j = 1, j < column_width+1, j++)
+ var/datum/integrated_io/io = null
+ var/words = null
+ var/height = 1
+ switch(j)
+ if(1)
+ io = get_pin_ref("input",i)
+ if(io)
+ if(io.linked.len)
+ words = "[io.name] [io.display_data()]
"
+ for(var/datum/integrated_io/linked in io.linked)
+ words += "\[[linked.name]\] \
+ @ [linked.holder]
"
+ else // "Click here!"
+ words = "[io.name] [io.display_data()]
"
+ for(var/datum/integrated_io/linked in io.linked)
+ words += "\[[linked.name]\] \
+ @ [linked.holder]
"
+ if(outputs.len > inputs.len)
+ // height = Floor(outputs.len / inputs.len)
+ height = 1 // Because of bugs, if there's more outputs than inputs, it causes the output side to be hidden.
+ //world << "I wrote [words] at ([i],[j]). Height = [height]."
+ if(2)
+ if(i == 1)
+ words = "[src.name]
[src.desc]"
+ height = row_height
+ //world << "I wrote the center piece because i was equal to 1, at ([i],[j]). Height = [height]."
+ else
+ continue
+ if(3)
+ io = get_pin_ref("output",i)
+ if(io)
+ if(io.linked.len)
+ words = "[io.name] [io.display_data()]
"
+ for(var/datum/integrated_io/linked in io.linked)
+ words += "\[[linked.name]\] \
+ @ [linked.holder]
"
+ else
+ words = "[io.name] [io.display_data()]
"
+ for(var/datum/integrated_io/linked in io.linked)
+ words += "\[[linked.name]\] \
+ @ [linked.holder]
"
+ if(inputs.len > outputs.len)
+ // height = Floor(inputs.len / outputs.len)
+ height = 1 // See above.
+ //world << "I wrote [words] at ([i],[j]). Height = [height]."
+ HTML += "[words] | "
+ //HTML += "[words] | "
+ //world << "Writing to ([i],[j])."
+ HTML += "
"
+
+ if(activators.len)
+ for(i = 1, i < activators.len+1, i++)
+ var/datum/integrated_io/io = null
+ var/words = null
+ io = get_pin_ref("activator",i)
+ if(io)
+ if(io.linked.len)
+ words = "[io.name]
"
+ for(var/datum/integrated_io/linked in io.linked)
+ words += "\[[linked.name]\] \
+ @ [linked.holder]
"
+ else // "Click here!"
+ words = "[io.name]
"
+ for(var/datum/integrated_io/linked in io.linked)
+ words += "\[[linked.name]\] \
+ @ [linked.holder]
"
+ HTML += ""
+ HTML += "| [words] | "
+ HTML += "
"
+
+ HTML += "
"
+ HTML += "
"
+
+ HTML += "
Complexity: [complexity]"
+ HTML += "
[extended_desc]"
+
+ HTML += ""
+ user << browse(HTML, "window=circuit-\ref[src];size=600x350;border=1;can_resize=1;can_close=1;can_minimize=1")
+
+ //user << sanitize(HTML, "window=debug;size=400x400;border=1;can_resize=1;can_close=1;can_minimize=1")
+ //world << sanitize(HTML)
+
+ user.set_machine(src)
+ onclose(user, "circuit-\ref[src]")
+
+/obj/item/integrated_circuit/Topic(href, href_list[])
+ var/mob/living/user = locate(href_list["user"]) in mob_list
+ var/pin = locate(href_list["pin"]) in inputs + outputs + activators
+
+ if(!user || !user.Adjacent(get_turf(src)) )
+ return 1
+
+ if(!user.canmove || user.stat || user.restrained())
+ return
+
+ if(href_list["wire"])
+ if(ishuman(user) && Adjacent(user))
+ var/mob/living/carbon/human/H = user
+ var/obj/item/device/integrated_electronics/wirer/wirer = null
+ if(istype(H.r_hand, /obj/item/device/integrated_electronics/wirer))
+ wirer = H.r_hand
+ else if(istype(H.l_hand, /obj/item/device/integrated_electronics/wirer))
+ wirer = H.l_hand
+
+ if(wirer && pin)
+ wirer.wire(pin, user)
+ else
+ user << "You can't do a whole lot without tools."
+
+ if(href_list["examine"])
+ examine(user)
+
+ if(href_list["rename"])
+ rename_component(user)
+
+ interact(user) // To refresh the UI.
+
+/datum/integrated_io
+ var/name = "input/output"
+ var/obj/item/integrated_circuit/holder = null
+ var/data = null
+ var/list/linked = list()
+ var/io_type = DATA_CHANNEL
+
+/datum/integrated_io/New(var/newloc)
+ ..()
+ holder = newloc
+ if(!holder)
+ message_admins("ERROR: An integrated_io ([src.name]) spawned without a holder! This is a bug.")
+
+/datum/integrated_io/Destroy()
+ disconnect()
+ holder = null
+ ..()
+
+/datum/integrated_io/proc/display_data()
+ if(isnull(data))
+ return "(null)" // Empty data means nothing to show.
+ if(istext(data))
+ return "(\"[data]\")" // Wraps the 'string' in escaped quotes, so that people know it's a 'string'.
+ if(istype(data, /atom))
+ var/atom/A = data
+ return "([A.name] \[Ref\])" // For refs, we want just the name displayed.
+ return "([data])" // Nothing special needed for numbers or other stuff.
+
+/datum/integrated_io/activate/display_data()
+ return "(\[pulse\])"
+
+/datum/integrated_io/proc/scramble()
+ if(isnull(data))
+ return
+ if(isnum(data))
+ data = rand(-10000, 10000)
+ if(istext(data))
+ data = "ERROR"
+ push_data()
+
+/datum/integrated_io/activate/scramble()
+ push_data()
+
+/datum/integrated_io/proc/push_data()
+ if(linked.len)
+ for(var/datum/integrated_io/io in linked)
+ io.data = data
+
+/datum/integrated_io/activate/push_data()
+ if(linked.len)
+ for(var/datum/integrated_io/io in linked)
+ io.holder.work()
+
+/datum/integrated_io/proc/pull_data()
+ if(linked.len)
+ for(var/datum/integrated_io/io in linked)
+ data = io.data
+
+/datum/integrated_io/proc/get_linked_to_desc()
+ if(linked.len)
+ var/result = english_list(linked)
+ return "the [result]"
+ return "nothing"
+
+/datum/integrated_io/proc/disconnect()
+ if(linked.len)
+ //First we iterate over everything we are linked to.
+ for(var/datum/integrated_io/their_io in linked)
+ //While doing that, we iterate them as well, and disconnect ourselves from them.
+ for(var/datum/integrated_io/their_linked_io in their_io.linked)
+ if(their_linked_io == src)
+ their_io.linked.Remove(src)
+ else
+ continue
+ //Now that we're removed from them, we gotta remove them from us.
+ src.linked.Remove(their_io)
+
+/datum/integrated_io/input
+ name = "input pin"
+
+/datum/integrated_io/output
+ name = "output pin"
+
+/datum/integrated_io/activate
+ name = "activation pin"
+ io_type = PULSE_CHANNEL
+
+/obj/item/integrated_circuit/proc/push_data()
+ for(var/datum/integrated_io/output/O in outputs)
+ O.push_data()
+
+/obj/item/integrated_circuit/proc/pull_data()
+ for(var/datum/integrated_io/input/I in inputs)
+ I.push_data()
+
+/obj/item/integrated_circuit/proc/work()
+ if(last_used + 2 SECONDS > world.time) // All intergrated circuits have an internal cooldown of two seconds to protect from spam.
+ return 0
+ last_used = world.time
+ return 1
+
+/obj/item/integrated_circuit/proc/disconnect_all()
+ for(var/datum/integrated_io/input/I in inputs)
+ I.disconnect()
+ for(var/datum/integrated_io/output/O in outputs)
+ O.disconnect()
+ for(var/datum/integrated_io/activate/A in activators)
+ A.disconnect()
\ No newline at end of file
diff --git a/code/modules/integrated_electronics/arithmetic.dm b/code/modules/integrated_electronics/arithmetic.dm
new file mode 100644
index 0000000000..5f5a4f1d2e
--- /dev/null
+++ b/code/modules/integrated_electronics/arithmetic.dm
@@ -0,0 +1,157 @@
+//These circuits do simple math.
+/obj/item/integrated_circuit/arithmetic
+ complexity = 1
+ number_of_inputs = 8
+ number_of_outputs = 1
+ number_of_activators = 1
+ input_names = list(
+ "A",
+ "B",
+ "C",
+ "D",
+ "E",
+ "F",
+ "G",
+ "H"
+ )
+ output_names = list(
+ "result"
+ )
+ activator_names = list(
+ "compute"
+ )
+
+// +Adding+ //
+
+/obj/item/integrated_circuit/arithmetic/addition
+ name = "addition circuit"
+ desc = "This circuit can add numbers together."
+ icon_state = "addition"
+
+/obj/item/integrated_circuit/arithmetic/addition/work()
+ if(..())
+ var/result = 0
+ for(var/datum/integrated_io/input/I in inputs)
+ I.pull_data()
+ if(isnum(I.data))
+ result = result + I.data
+
+ for(var/datum/integrated_io/output/O in outputs)
+ O.data = result
+ O.push_data()
+
+// -Subtracting- //
+
+/obj/item/integrated_circuit/arithmetic/subtraction
+ name = "subtraction circuit"
+ desc = "This circuit can subtract numbers."
+ icon_state = "subtraction"
+
+/obj/item/integrated_circuit/arithmetic/subtraction/work()
+ if(..())
+ var/result = 0
+ for(var/datum/integrated_io/input/I in inputs)
+ I.pull_data()
+ if(isnum(I.data))
+ result = result - I.data
+
+ for(var/datum/integrated_io/output/O in outputs)
+ O.data = result
+ O.push_data()
+
+// *Multiply* //
+
+/obj/item/integrated_circuit/arithmetic/multiplication
+ name = "multiplication circuit"
+ desc = "This circuit can multiply numbers."
+ icon_state = "multiplication"
+
+/obj/item/integrated_circuit/arithmetic/subtraction/work()
+ if(..())
+ var/result = 0
+ for(var/datum/integrated_io/input/I in inputs)
+ I.pull_data()
+ if(isnum(I.data))
+ result = result * I.data
+
+ for(var/datum/integrated_io/output/O in outputs)
+ O.data = result
+ O.push_data()
+
+// /Division/ //
+
+/obj/item/integrated_circuit/arithmetic/division
+ name = "division circuit"
+ desc = "This circuit can divide numbers, just don't think about trying to divide by zero!"
+ icon_state = "division"
+
+/obj/item/integrated_circuit/arithmetic/division/work()
+ if(..())
+ var/result = 0
+ for(var/datum/integrated_io/input/I in inputs)
+ I.pull_data()
+ if(isnum(I.data) && I.data != 0) //No runtimes here.
+ result = result / I.data
+
+ for(var/datum/integrated_io/output/O in outputs)
+ O.data = result
+ O.push_data()
+
+// Absolute //
+
+/obj/item/integrated_circuit/arithmetic/absolute
+ name = "absolute circuit"
+ desc = "This outputs a non-negative version of the number you put in. This may also be thought of as its distance from zero."
+ icon_state = "absolute"
+ number_of_inputs = 1
+ number_of_outputs = 1
+
+/obj/item/integrated_circuit/arithmetic/absolute/work()
+ if(..())
+ var/result = 0
+ for(var/datum/integrated_io/input/I in inputs)
+ I.pull_data()
+ if(isnum(I.data) && I.data != 0)
+ result = abs(result)
+
+ for(var/datum/integrated_io/output/O in outputs)
+ O.data = result
+ O.push_data()
+
+// Averaging //
+
+/obj/item/integrated_circuit/arithmetic/average
+ name = "average circuit"
+ desc = "This circuit is of average quality, however it will compute the average for numbers you give it."
+ icon_state = "average"
+
+/obj/item/integrated_circuit/arithmetic/average/work()
+ if(..())
+ var/result = 0
+ var/inputs_used = 0
+ for(var/datum/integrated_io/input/I in inputs)
+ I.pull_data()
+ if(isnum(I.data))
+ inputs_used++
+ result = result + I.data
+
+ if(inputs_used)
+ result = result / inputs_used
+
+ for(var/datum/integrated_io/output/O in outputs)
+ O.data = result
+ O.push_data()
+
+// Pi, because why the hell not? //
+/obj/item/integrated_circuit/arithmetic/pi
+ name = "pi constant circuit"
+ desc = "Not recommended for cooking. Outputs '3.14159' when it receives a pulse."
+ icon_state = "pi"
+ number_of_inputs = 0
+ number_of_outputs = 1
+
+/obj/item/integrated_circuit/arithmetic/pi/work()
+ if(..())
+ var/datum/integrated_io/output/O = outputs[1]
+ O.data = 3.14159
+ O.push_data()
\ No newline at end of file
diff --git a/code/modules/integrated_electronics/assemblies.dm b/code/modules/integrated_electronics/assemblies.dm
new file mode 100644
index 0000000000..e727f4c3d8
--- /dev/null
+++ b/code/modules/integrated_electronics/assemblies.dm
@@ -0,0 +1,120 @@
+/obj/item/device/electronic_assembly
+ name = "electronic assembly"
+ desc = "It's a case, for building electronics with."
+ w_class = 2
+ icon = 'icons/obj/electronic_assemblies.dmi'
+ icon_state = "setup_small"
+ var/max_components = 10
+ var/max_complexity = 30
+ var/opened = 0
+
+/obj/item/device/electronic_assembly/medium
+ name = "electronic mechanism"
+ icon_state = "setup_medium"
+ w_class = 3
+ max_components = 20
+ max_complexity = 50
+
+/obj/item/device/electronic_assembly/large
+ name = "electronic machine"
+ icon_state = "setup"
+ w_class = 4
+ max_components = 30
+ max_complexity = 60
+
+/*
+
+/obj/item/device/electronic_assembly/New()
+ ..()
+ processing_objects |= src
+
+/obj/item/device/electronic_assembly/Destroy()
+ processing_objects.Remove(src)
+ ..()
+
+/obj/item/device/electronic_assembly/process()
+ for(var/obj/item/integrated_circuit/IC in contents)
+ IC.work()
+*/
+
+/obj/item/device/electronic_assembly/update_icon()
+ if(opened)
+ icon_state = initial(icon_state) + "-open"
+ else
+ icon_state = initial(icon_state)
+
+/obj/item/device/electronic_assembly/examine(mob/user)
+ ..()
+ if(user.Adjacent(src))
+ if(!opened)
+ for(var/obj/item/integrated_circuit/output/screen/S in contents)
+ if(S.stuff_to_display)
+ user << "There's a little screen labeled '[S.name]', which displays '[S.stuff_to_display]'."
+ else
+ var/obj/item/integrated_circuit/IC = input(user, "Which circuit do you want to examine?", "Examination") as null|anything in contents
+ if(IC)
+ IC.examine(user)
+
+/obj/item/device/electronic_assembly/attackby(var/obj/item/I, var/mob/user)
+ if(istype(I, /obj/item/integrated_circuit))
+ if(!opened)
+ user << "\The [src] isn't opened, so you can't put anything inside. Try using a crowbar."
+ return 0
+ var/obj/item/integrated_circuit/IC = I
+ var/total_parts = 0
+ var/total_complexity = 0
+ for(var/obj/item/integrated_circuit/part in contents)
+ total_parts++
+ total_complexity = total_complexity + part.complexity
+
+ if( (total_parts + 1) >= max_components)
+ user << "You can't seem to add this [IC.name], since there's no more room."
+ return 0
+ if( (total_complexity + IC.complexity) >= max_complexity)
+ user << "You can't seem to add this [IC.name], since this setup's too complicated for the case."
+ return 0
+
+ user << "You slide \the [IC] inside \the [src]."
+ user.drop_item()
+ IC.forceMove(src)
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ if(!opened)
+ user << "\The [src] isn't opened, so you can't remove anything inside. Try using a crowbar."
+ return 0
+ if(!contents.len)
+ user << "There's nothing inside this to remove!"
+ return 0
+ var/obj/item/integrated_circuit/option = input("What do you want to remove?", "Component Removal") as null|anything in contents
+ if(option)
+ option.disconnect_all()
+ option.forceMove(get_turf(src))
+ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ user << "You pop \the [option] out of the case, and slide it out."
+ if(istype(I, /obj/item/weapon/crowbar))
+ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ opened = !opened
+ user << "You [opened ? "opened" : "closed"] \the [src]."
+ update_icon()
+ if(istype(I, /obj/item/device/integrated_electronics/wirer))
+ if(opened)
+ var/obj/item/integrated_circuit/IC = input(user, "Which circuit do you want to examine?", "Examination") as null|anything in contents
+ if(IC)
+ IC.examine(user)
+ else
+ user << "\The [src] isn't opened, so you can't fiddle with the internal components. \
+ Try using a crowbar."
+
+/obj/item/device/electronic_assembly/attack_self(mob/user)
+ var/list/available_inputs = list()
+ for(var/obj/item/integrated_circuit/input/input in contents)
+ if(input.can_be_asked_input)
+ available_inputs.Add(input)
+ var/obj/item/integrated_circuit/input/choice = input(user, "What do you want to interact with?", "Interaction") as null|anything in available_inputs
+ if(choice)
+ choice.ask_for_input(user)
+
+/obj/item/device/electronic_assembly/emp_act(severity)
+ ..()
+ for(var/atom/movable/AM in contents)
+ AM.emp_act(severity)
diff --git a/code/modules/integrated_electronics/converters.dm b/code/modules/integrated_electronics/converters.dm
new file mode 100644
index 0000000000..0bd2166419
--- /dev/null
+++ b/code/modules/integrated_electronics/converters.dm
@@ -0,0 +1,96 @@
+//These circuits convert one variable to another.
+/obj/item/integrated_circuit/converter
+ complexity = 2
+ number_of_inputs = 1
+ number_of_outputs = 1
+ number_of_activators = 1
+ input_names = list(
+ "input",
+ )
+ output_names = list(
+ "result"
+ )
+ activator_names = list(
+ "convert"
+ )
+
+/obj/item/integrated_circuit/converter/num2text
+ name = "number to string"
+ desc = "This circuit can convert a number variable into a string."
+ icon_state = "addition"
+
+/obj/item/integrated_circuit/converter/num2text/work()
+ if(..())
+ var/result = null
+ var/datum/integrated_io/incoming = inputs[1]
+ var/datum/integrated_io/outgoing = outputs[1]
+ if(incoming.data && isnum(incoming.data))
+ result = num2text(incoming.data)
+
+ outgoing.data = result
+ outgoing.push_data()
+
+/obj/item/integrated_circuit/converter/text2num
+ name = "string to number"
+ desc = "This circuit can convert a string variable into a number."
+ icon_state = "addition"
+
+/obj/item/integrated_circuit/converter/text2num/work()
+ if(..())
+ var/result = null
+ var/datum/integrated_io/incoming = inputs[1]
+ var/datum/integrated_io/outgoing = outputs[1]
+ if(incoming.data && istext(incoming.data))
+ result = text2num(incoming.data)
+
+ outgoing.data = result
+ outgoing.push_data()
+
+/obj/item/integrated_circuit/converter/ref2text
+ name = "reference to string"
+ desc = "This circuit can convert a reference to something else to a string, specifically the name of that reference."
+ icon_state = "addition"
+
+/obj/item/integrated_circuit/converter/ref2text/work()
+ if(..())
+ var/result = null
+ var/datum/integrated_io/incoming = inputs[1]
+ var/datum/integrated_io/outgoing = outputs[1]
+ if(incoming.data && istype(incoming.data, /atom/))
+ var/atom/A = incoming.data
+ result = A.name
+
+ outgoing.data = result
+ outgoing.push_data()
+
+/obj/item/integrated_circuit/converter/lowercase
+ name = "lowercase string converter"
+ desc = "this will cause a string to come out in all lowercase."
+ icon_state = "addition"
+
+/obj/item/integrated_circuit/converter/lowercase/work()
+ if(..())
+ var/result = null
+ var/datum/integrated_io/incoming = inputs[1]
+ var/datum/integrated_io/outgoing = outputs[1]
+ if(incoming.data && istext(incoming.data))
+ result = lowertext(incoming.data)
+
+ outgoing.data = result
+ outgoing.push_data()
+
+/obj/item/integrated_circuit/converter/uppercase
+ name = "uppercase string converter"
+ desc = "THIS WILL CAUSE A STRING TO COME OUT IN ALL UPPERCASE."
+ icon_state = "addition"
+
+/obj/item/integrated_circuit/converter/uppercase/work()
+ if(..())
+ var/result = null
+ var/datum/integrated_io/incoming = inputs[1]
+ var/datum/integrated_io/outgoing = outputs[1]
+ if(incoming.data && istext(incoming.data))
+ result = uppertext(incoming.data)
+
+ outgoing.data = result
+ outgoing.push_data()
\ No newline at end of file
diff --git a/code/modules/integrated_electronics/coordinate.dm b/code/modules/integrated_electronics/coordinate.dm
new file mode 100644
index 0000000000..04409907ac
--- /dev/null
+++ b/code/modules/integrated_electronics/coordinate.dm
@@ -0,0 +1,74 @@
+//This circuit gives information on where the machine is.
+/obj/item/integrated_circuit/gps
+ name = "global positioning system"
+ desc = "This allows you to easily know the position of a machine containing this device."
+ complexity = 4
+ number_of_inputs = 0
+ number_of_outputs = 2
+ number_of_activators = 1
+ input_names = list(
+ )
+ output_names = list(
+ "X (abs)",
+ "Y (abs)"
+ )
+ activator_names = list(
+ "get coordinates"
+ )
+
+/obj/item/integrated_circuit/gps/work()
+ if(..())
+ var/turf/T = get_turf(src)
+ var/datum/integrated_io/result_x = outputs[1]
+ var/datum/integrated_io/result_y = outputs[2]
+
+ result_x.data = null
+ result_y.data = null
+ if(!T)
+ return
+
+ result_x.data = T.x
+ result_y.data = T.y
+
+ for(var/datum/integrated_io/output/O in outputs)
+ O.push_data()
+
+/obj/item/integrated_circuit/abs_to_rel_coords
+ name = "abs to rel coordinate converter"
+ desc = "Easily convert absolute coordinates to relative coordinates with this."
+ complexity = 4
+ number_of_inputs = 0
+ number_of_outputs = 4
+ number_of_activators = 1
+ input_names = list(
+ "X1 (abs)",
+ "Y1 (abs)",
+ "X2 (abs)",
+ "Y2 (abs)"
+ )
+ output_names = list(
+ "X (rel)",
+ "Y (rel)"
+ )
+ activator_names = list(
+ "compute rel coordinates"
+ )
+
+/obj/item/integrated_circuit/abs_to_rel_coords/work()
+ var/datum/integrated_io/x1 = inputs[1]
+ var/datum/integrated_io/y1 = inputs[2]
+
+ var/datum/integrated_io/x2 = inputs[3]
+ var/datum/integrated_io/y2 = inputs[4]
+
+ var/datum/integrated_io/result_x = outputs[1]
+ var/datum/integrated_io/result_y = outputs[2]
+
+ if(x1.data && y1.data && x2.data && y2.data)
+ result_x.data = x1.data - x2.data
+ result_y.data = y1.data - y2.data
+
+
+ for(var/datum/integrated_io/output/O in outputs)
+ O.push_data()
+ ..()
diff --git a/code/modules/integrated_electronics/data_transfer.dm b/code/modules/integrated_electronics/data_transfer.dm
new file mode 100644
index 0000000000..12380e9cca
--- /dev/null
+++ b/code/modules/integrated_electronics/data_transfer.dm
@@ -0,0 +1,79 @@
+/obj/item/integrated_circuit/transfer/splitter
+ name = "splitter"
+ desc = "Splits incoming data into all of the output pins."
+ icon_state = "splitter"
+ complexity = 3
+ number_of_inputs = 1
+ number_of_outputs = 2
+ input_names = list(
+ "data to split"
+ )
+ output_names = list(
+ "A",
+ "B",
+ "C",
+ "D",
+ "E",
+ "F",
+ "G",
+ "H"
+ )
+
+/obj/item/integrated_circuit/transfer/splitter/medium
+ name = "four splitter"
+ icon_state = "splitter4"
+ complexity = 5
+ number_of_inputs = 1
+ number_of_outputs = 4
+
+/obj/item/integrated_circuit/transfer/splitter/large
+ name = "eight splitter"
+ icon_state = "splitter8"
+ complexity = 9
+ number_of_inputs = 1
+ number_of_outputs = 8
+
+/obj/item/integrated_circuit/transfer/splitter/work()
+ if(..())
+ var/datum/integrated_io/I = inputs[1]
+ for(var/datum/integrated_io/output/O in outputs)
+ O.data = I.data
+
+/obj/item/integrated_circuit/transfer/activator_splitter
+ name = "activator splitter"
+ desc = "Splits incoming activation pulses into all of the output pins."
+ icon_state = "splitter"
+ complexity = 3
+ number_of_activators = 3
+ activator_names = list(
+ "incoming pulse",
+ "outgoing pulse A",
+ "outgoing pulse B",
+ "outgoing pulse C",
+ "outgoing pulse D",
+ "outgoing pulse E",
+ "outgoing pulse F",
+ "outgoing pulse G",
+ "outgoing pulse H"
+ )
+
+/obj/item/integrated_circuit/transfer/activator_splitter/work()
+ if(..())
+ for(var/datum/integrated_io/activate/A in outputs)
+ if(A == activators[1])
+ continue
+ if(A.linked.len)
+ for(var/datum/integrated_io/activate/target in A.linked)
+ target.holder.work()
+
+/obj/item/integrated_circuit/transfer/activator_splitter/medium
+ name = "four activator splitter"
+ icon_state = "splitter4"
+ complexity = 5
+ number_of_activators = 5
+
+/obj/item/integrated_circuit/transfer/activator_splitter/large
+ name = "eight activator splitter"
+ icon_state = "splitter4"
+ complexity = 9
+ number_of_activators = 9
diff --git a/code/modules/integrated_electronics/input_output.dm b/code/modules/integrated_electronics/input_output.dm
new file mode 100644
index 0000000000..4bb4c01309
--- /dev/null
+++ b/code/modules/integrated_electronics/input_output.dm
@@ -0,0 +1,218 @@
+/obj/item/integrated_circuit/input
+ var/can_be_asked_input = 0
+
+/obj/item/integrated_circuit/input/proc/ask_for_input(mob/user)
+ return
+
+/obj/item/integrated_circuit/input/button
+ name = "button"
+ desc = "This tiny button must do something, right?"
+ icon_state = "button"
+ number_of_inputs = 0
+ number_of_outputs = 0
+ number_of_activators = 1
+ complexity = 1
+ can_be_asked_input = 1
+ activator_names = list(
+ "on pressed"
+ )
+
+/obj/item/integrated_circuit/input/button/ask_for_input(mob/user) //Bit misleading name for this specific use.
+ var/datum/integrated_io/A = activators[1]
+ if(A.linked.len)
+ for(var/datum/integrated_io/activate/target in A.linked)
+ target.holder.work()
+ user << "You press the button labeled '[src.name]'."
+
+/obj/item/integrated_circuit/input/numberpad
+ name = "number pad"
+ desc = "This small number pad allows someone to input a number into the system."
+ icon_state = "numberpad"
+ number_of_inputs = 0
+ number_of_outputs = 1
+ number_of_activators = 1
+ complexity = 2
+ can_be_asked_input = 1
+ output_names = list(
+ "number entered"
+ )
+ activator_names = list(
+ "on entered"
+ )
+
+/obj/item/integrated_circuit/input/numberpad/ask_for_input(mob/user)
+ var/new_input = input(user, "Enter a number, please.","Number pad") as null|num
+ if(isnum(new_input))
+ var/datum/integrated_io/O = outputs[1]
+ O.data = new_input
+ O.push_data()
+ var/datum/integrated_io/A = activators[1]
+ if(A.linked)
+ A.holder.work()
+
+/obj/item/integrated_circuit/input/textpad
+ name = "text pad"
+ desc = "This small text pad allows someone to input a string into the system."
+ icon_state = "numberpad"
+ number_of_inputs = 0
+ number_of_outputs = 1
+ number_of_activators = 1
+ complexity = 2
+ can_be_asked_input = 1
+ output_names = list(
+ "string entered"
+ )
+ activator_names = list(
+ "on entered"
+ )
+
+/obj/item/integrated_circuit/input/textpad/ask_for_input(mob/user)
+ var/new_input = input(user, "Enter some words, please.","Number pad") as null|text
+ if(new_input && istext(new_input))
+ var/datum/integrated_io/O = outputs[1]
+ O.data = new_input
+ O.push_data()
+ var/datum/integrated_io/A = activators[1]
+ if(A.linked)
+ A.holder.work()
+
+/obj/item/integrated_circuit/input/med_scanner
+ name = "integrated medical analyser"
+ desc = "A very small version of the common medical analyser. This allows the machine to know how healthy someone is."
+ number_of_inputs = 1
+ number_of_outputs = 2
+ number_of_activators = 1
+ complexity = 4
+ input_names = list(
+ "target ref"
+ )
+ output_names = list(
+ "total health %",
+ "total missing health"
+ )
+ activator_names = list(
+ "scan"
+ )
+
+/obj/item/integrated_circuit/input/med_scanner/work()
+ if(..())
+ var/datum/integrated_io/I = inputs[1]
+ if(!I.data || !ishuman(I.data)) //Invalid input
+ return
+ var/mob/living/carbon/human/H = I.data
+ if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range.
+ var/total_health = round(H.health/H.maxHealth, 0.1)*100
+ var/missing_health = H.maxHealth - H.health
+
+ var/datum/integrated_io/total = outputs[1]
+ var/datum/integrated_io/missing = outputs[2]
+
+ total.data = total_health
+ missing.data = missing_health
+
+ for(var/datum/integrated_io/output/O in outputs)
+ O.push_data()
+
+/obj/item/integrated_circuit/input/adv_med_scanner
+ name = "integrated advanced medical analyser"
+ desc = "A very small version of the common medical analyser. This allows the machine to know how healthy someone is. \
+ This type is much more precise, allowing the machine to know much more about the target than a normal analyzer."
+ number_of_inputs = 1
+ number_of_outputs = 7
+ number_of_activators = 1
+ complexity = 12
+ input_names = list(
+ "target ref"
+ )
+ output_names = list(
+ "total health %",
+ "total missing health",
+ "brute damage",
+ "burn damage",
+ "tox damage",
+ "oxy damage",
+ "clone damage"
+ )
+ activator_names = list(
+ "scan"
+ )
+
+/obj/item/integrated_circuit/input/adv_med_scanner/work()
+ if(..())
+ var/datum/integrated_io/I = inputs[1]
+ if(!I.data || !ishuman(I.data)) //Invalid input
+ return
+ var/mob/living/carbon/human/H = I.data
+ if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range.
+ var/total_health = round(H.health/H.maxHealth, 0.1)*100
+ var/missing_health = H.maxHealth - H.health
+
+ var/datum/integrated_io/total = outputs[1]
+ var/datum/integrated_io/missing = outputs[2]
+ var/datum/integrated_io/brute = outputs[3]
+ var/datum/integrated_io/burn = outputs[4]
+ var/datum/integrated_io/tox = outputs[5]
+ var/datum/integrated_io/oxy = outputs[6]
+ var/datum/integrated_io/clone = outputs[7]
+
+ total.data = total_health
+ missing.data = missing_health
+ brute.data = H.getBruteLoss()
+ burn.data = H.getFireLoss()
+ tox.data = H.getToxLoss()
+ oxy.data = H.getOxyLoss()
+ clone.data = H.getCloneLoss()
+
+ for(var/datum/integrated_io/output/O in outputs)
+ O.push_data()
+
+/obj/item/integrated_circuit/input/local_locator
+ name = "local locator"
+ desc = "This is needed for certain devices that demand a reference for a target to act upon. This type only locates something \
+ that is holding the machine containing it."
+ number_of_inputs = 0
+ number_of_outputs = 1
+ number_of_activators = 1
+ complexity = 4
+ output_names = list(
+ "located ref"
+ )
+ activator_names = list(
+ "locate"
+ )
+
+/obj/item/integrated_circuit/input/local_locator/work()
+ if(..())
+ var/mob/living/L = null
+ var/datum/integrated_io/O = outputs[1]
+ O.data = null
+ if(istype(src.loc, /obj/item/device/electronic_assembly)) // Check to make sure we're actually in a machine.
+ var/obj/item/device/electronic_assembly/assembly = src.loc
+ if(istype(assembly.loc, /mob/living)) // Now check if someone's holding us.
+ L = assembly.loc
+
+ if(L)
+ O.data = L
+
+ O.push_data()
+
+
+/obj/item/integrated_circuit/output/screen
+ name = "screen"
+ desc = "This small screen can display a single piece of data, when the machine is examined closely."
+ icon_state = "screen"
+ complexity = 4
+ number_of_inputs = 1
+ number_of_outputs = 0
+ number_of_activators = 1
+ input_names = list(
+ "displayed data"
+ )
+ activator_names = list(
+ "load data"
+ )
+ var/stuff_to_display = null
+
+/obj/item/integrated_circuit/output/screen/work()
+ var/datum/integrated_io/I = inputs[1]
+ stuff_to_display = I.data
\ No newline at end of file
diff --git a/code/modules/integrated_electronics/logic.dm b/code/modules/integrated_electronics/logic.dm
new file mode 100644
index 0000000000..4d123c61d0
--- /dev/null
+++ b/code/modules/integrated_electronics/logic.dm
@@ -0,0 +1,172 @@
+/obj/item/integrated_circuit/logic
+ name = "logic gate"
+ desc = "This tiny chip will decide for you!"
+ complexity = 3
+ number_of_inputs = 2
+ number_of_outputs = 1
+ number_of_activators = 2
+ input_names = list(
+ "A",
+ "B"
+ )
+ output_names = list(
+ "result"
+ )
+ activator_names = list(
+ "compare",
+ "on true result"
+ )
+
+/obj/item/integrated_circuit/logic/equals
+ name = "equal gate"
+ desc = "This gate compares two values, and outputs the number one if both are the same."
+ icon_state = "equal"
+
+/obj/item/integrated_circuit/logic/equals/work()
+ if(..())
+ var/datum/integrated_io/A = inputs[1]
+ var/datum/integrated_io/B = inputs[2]
+ var/datum/integrated_io/O = outputs[1]
+ var/datum/integrated_io/P = activators[2]
+ if(A.data == B.data)
+ O.data = 1
+ O.push_data()
+ P.push_data()
+ else
+ O.data = 0
+
+/obj/item/integrated_circuit/logic/not
+ name = "not gate"
+ desc = "This gate inverts what's fed into it."
+ icon_state = "not"
+ number_of_inputs = 1
+ number_of_outputs = 1
+ number_of_activators = 1
+ output_names = list(
+ "invert"
+ )
+
+
+/obj/item/integrated_circuit/logic/not/work()
+ if(..())
+ var/datum/integrated_io/A = inputs[1]
+ var/datum/integrated_io/O = outputs[1]
+ if(A.data)
+ O.data = !A.data
+ O.push_data()
+ else
+ O.data = 0
+
+/obj/item/integrated_circuit/logic/and
+ name = "and gate"
+ desc = "This gate will output 'one' if both inputs evaluate to true."
+ icon_state = "and"
+
+/obj/item/integrated_circuit/logic/and/work()
+ if(..())
+ var/datum/integrated_io/A = inputs[1]
+ var/datum/integrated_io/B = inputs[2]
+ var/datum/integrated_io/O = outputs[1]
+ var/datum/integrated_io/P = activators[2]
+ if(A.data && B.data)
+ O.data = 1
+ O.push_data()
+ A.push_data()
+ P.push_data()
+ else
+ O.data = 0
+
+/obj/item/integrated_circuit/logic/or
+ name = "or gate"
+ desc = "This gate will output 'one' if one of the inputs evaluate to true."
+ icon_state = "or"
+
+/obj/item/integrated_circuit/logic/or/work()
+ if(..())
+ var/datum/integrated_io/A = inputs[1]
+ var/datum/integrated_io/B = inputs[2]
+ var/datum/integrated_io/O = outputs[1]
+ var/datum/integrated_io/P = activators[2]
+ if(A.data || B.data)
+ O.data = 1
+ O.push_data()
+ A.push_data()
+ P.push_data()
+ else
+ O.data = 0
+
+/obj/item/integrated_circuit/logic/less_than
+ name = "less than gate"
+ desc = "This will output 'one' if the first input is less than the second input."
+ icon_state = "less_than"
+
+/obj/item/integrated_circuit/logic/less_than/work()
+ if(..())
+ var/datum/integrated_io/A = inputs[1]
+ var/datum/integrated_io/B = inputs[2]
+ var/datum/integrated_io/O = outputs[1]
+ var/datum/integrated_io/P = activators[2]
+ if(A.data < B.data)
+ O.data = 1
+ O.push_data()
+ A.push_data()
+ P.push_data()
+ else
+ O.data = 0
+
+/obj/item/integrated_circuit/logic/less_than_or_equal
+ name = "less than or equal gate"
+ desc = "This will output 'one' if the first input is less than, or equal to the second input."
+ icon_state = "less_than_or_equal"
+
+/obj/item/integrated_circuit/logic/less_than_or_equal/work()
+ if(..())
+ var/datum/integrated_io/A = inputs[1]
+ var/datum/integrated_io/B = inputs[2]
+ var/datum/integrated_io/O = outputs[1]
+ var/datum/integrated_io/P = activators[2]
+ if(A.data <= B.data)
+ O.data = 1
+ O.push_data()
+ A.push_data()
+ P.push_data()
+ else
+ O.data = 0
+
+/obj/item/integrated_circuit/logic/greater_than
+ name = "greater than gate"
+ desc = "This will output 'one' if the first input is greater than the second input."
+ icon_state = "greater_than"
+
+/obj/item/integrated_circuit/logic/greater_than/work()
+ if(..())
+ var/datum/integrated_io/A = inputs[1]
+ var/datum/integrated_io/B = inputs[2]
+ var/datum/integrated_io/O = outputs[1]
+ var/datum/integrated_io/P = activators[2]
+ if(A.data > B.data)
+ O.data = 1
+ O.push_data()
+ A.push_data()
+ P.push_data()
+ else
+ O.data = 0
+
+/obj/item/integrated_circuit/logic/greater_than_or_equal
+ name = "greater_than or equal gate"
+ desc = "This will output 'one' if the first input is greater than, or equal to the second input."
+ icon_state = "greater_than_or_equal"
+
+/obj/item/integrated_circuit/logic/greater_than_or_equal/work()
+ if(..())
+ var/datum/integrated_io/A = inputs[1]
+ var/datum/integrated_io/B = inputs[2]
+ var/datum/integrated_io/O = outputs[1]
+ var/datum/integrated_io/P = activators[2]
+ if(A.data >= B.data)
+ O.data = 1
+ O.push_data()
+ A.push_data()
+ P.push_data()
+ else
+ O.data = 0
\ No newline at end of file
diff --git a/code/modules/integrated_electronics/manipulation.dm b/code/modules/integrated_electronics/manipulation.dm
new file mode 100644
index 0000000000..422f793f5d
--- /dev/null
+++ b/code/modules/integrated_electronics/manipulation.dm
@@ -0,0 +1,116 @@
+/obj/item/integrated_circuit/manipulation/weapon_firing
+ name = "weapon firing mechanism"
+ desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it."
+ extended_desc = "The firing mechanism can slot in most ranged weapons, ballistic and energy. \
+ The first and second inputs need to be numbers. They are coordinates for the gun to fire at, relative to the machine itself. \
+ The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Note that the \
+ normal limitations to firearms, such as ammunition requirements and firing delays, still hold true if fired by the mechanism."
+ complexity = 20
+ number_of_inputs = 2
+ number_of_outputs = 0
+ number_of_activators = 1
+ input_names = list(
+ "target X rel",
+ "target Y rel"
+ )
+ activator_names = list(
+ "fire"
+ )
+ var/obj/item/weapon/gun/installed_gun = null
+
+/obj/item/integrated_circuit/manipulation/weapon_firing/Destroy()
+ qdel(installed_gun)
+ ..()
+
+/obj/item/integrated_circuit/manipulation/weapon_firing/attackby(var/obj/O, var/mob/user)
+ if(istype(O, /obj/item/weapon/gun))
+ var/obj/item/weapon/gun/gun = O
+ if(installed_gun)
+ user << "There's already a weapon installed."
+ return
+ user.drop_from_inventory(gun)
+ installed_gun = gun
+ gun.forceMove(src)
+ user << "You slide \the [gun] into the firing mechanism."
+ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ else
+ ..()
+
+/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(var/mob/user)
+ if(installed_gun)
+ installed_gun.forceMove(get_turf(src))
+ user << "You slide \the [installed_gun] out of the firing mechanism."
+ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ installed_gun = null
+ else
+ user << "There's no weapon to remove from the mechanism."
+
+/obj/item/integrated_circuit/manipulation/weapon_firing/work()
+ if(!installed_gun)
+ return
+
+ var/datum/integrated_io/target_x = inputs[1]
+ var/datum/integrated_io/target_y = inputs[2]
+
+ if(target_x.data && target_y.data && isnum(target_x.data) && isnum(target_y.data))
+ var/turf/T = get_turf(src)
+
+ if(target_x.data == 0 && target_y.data == 0) // Don't shoot ourselves.
+ return
+
+ // We need to do this in order to enable relative coordinates, as locate() only works for absolute coordinates.
+ var/i
+ if(target_x.data > 0)
+ i = abs(target_x.data)
+ while(i)
+ T = get_step(T, EAST)
+ i--
+ else if(target_x.data < 0)
+ i = abs(target_x.data)
+ while(i)
+ T = get_step(T, WEST)
+ i--
+
+ if(target_y.data > 0)
+ i = abs(target_y.data)
+ while(i)
+ T = get_step(T, NORTH)
+ i--
+ else if(target_y.data < 0)
+ i = abs(target_y.data)
+ while(i)
+ T = get_step(T, SOUTH)
+ i--
+
+ if(!T)
+ return
+ installed_gun.Fire_userless(T)
+
+/obj/item/integrated_circuit/manipulation/smoke
+ name = "smoke generator"
+ desc = "Unlike most electronics, creating smoke is completely intentional."
+ extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \
+ into the smoke clouds when activated."
+ flags = OPENCONTAINER
+ complexity = 20
+ number_of_inputs = 0
+ number_of_outputs = 0
+ number_of_activators = 1
+ input_names = list()
+ activator_names = list(
+ "create smoke"
+ )
+
+/obj/item/integrated_circuit/manipulation/smoke/New()
+ ..()
+ create_reagents(100)
+
+/obj/item/integrated_circuit/manipulation/smoke/work()
+ if(..())
+ playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
+ var/datum/effect/effect/system/smoke_spread/chem/smoke_system = new()
+ smoke_system.set_up(reagents, 10, 0, get_turf(src))
+ spawn(0)
+ for(var/i = 1 to 8)
+ smoke_system.start()
+ reagents.clear_reagents()
diff --git a/code/modules/integrated_electronics/memory.dm b/code/modules/integrated_electronics/memory.dm
new file mode 100644
index 0000000000..ec06c7784b
--- /dev/null
+++ b/code/modules/integrated_electronics/memory.dm
@@ -0,0 +1,98 @@
+/obj/item/integrated_circuit/memory
+ name = "memory chip"
+ desc = "This tiny chip can store one piece of data."
+ icon_state = "memory"
+ complexity = 1
+ number_of_inputs = 1
+ number_of_outputs = 1
+ number_of_activators = 1
+ activator_names = list(
+ "set"
+ )
+
+/obj/item/integrated_circuit/memory/examine(mob/user)
+ ..()
+ var/i
+ for(i = 1, i <= outputs.len, i++)
+ var/datum/integrated_io/O = outputs[i]
+ user << "\The [src] has [O.data ? "'O.data'" : "nothing"] saved to address [i]."
+
+/obj/item/integrated_circuit/memory/work()
+ if(..())
+ var/i
+ for(i = 1, i <= inputs.len, i++)
+ var/datum/integrated_io/I = inputs[i]
+ var/datum/integrated_io/O = outputs[i]
+ O.data = I.data
+
+/obj/item/integrated_circuit/memory/medium
+ name = "memory circuit"
+ desc = "This circuit can store four pieces of data."
+ icon_state = "memory4"
+ complexity = 4
+ number_of_inputs = 4
+ number_of_outputs = 4
+
+/obj/item/integrated_circuit/memory/large
+ name = "large memory circuit"
+ desc = "This big circuit can hold eight pieces of data."
+ icon_state = "memory8"
+ complexity = 8
+ number_of_inputs = 8
+ number_of_outputs = 8
+
+/obj/item/integrated_circuit/memory/huge
+ name = "large memory stick"
+ desc = "This stick of memory can hold up up to sixteen pieces of data."
+ icon_state = "memory16"
+ complexity = 16
+ number_of_inputs = 16
+ number_of_outputs = 16
+
+/obj/item/integrated_circuit/memory/constant
+ name = "constant chip"
+ desc = "This tiny chip can store one piece of data, which cannot be overwritten without disassembly."
+ icon_state = "memory"
+ complexity = 1
+ number_of_inputs = 0
+ number_of_outputs = 1
+ number_of_activators = 1
+ activator_names = list(
+ "push data"
+ )
+ var/accepting_refs = 0
+
+/obj/item/integrated_circuit/memory/constant/work()
+ var/datum/integrated_io/O = outputs[1]
+ O.push_data()
+
+/obj/item/integrated_circuit/memory/constant/attack_self(mob/user)
+ var/datum/integrated_io/O = outputs[1]
+ var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in list("string","number","ref")
+ var/new_data = null
+ switch(type_to_use)
+ if("string")
+ accepting_refs = 0
+ new_data = input("Now type in a string.","[src] string writing") as null|text
+ if(istext(new_data))
+ O.data = new_data
+ user << "You set \the [src]'s memory to [O.display_data()]."
+ if("number")
+ accepting_refs = 0
+ new_data = input("Now type in a number.","[src] number writing") as null|num
+ if(isnum(new_data))
+ O.data = new_data
+ user << "You set \the [src]'s memory to [O.display_data()]."
+ if("ref")
+ accepting_refs = 1
+ user << "You turn \the [src]'s ref scanner on. Slide it across \
+ an object for a ref of that object to save it in memory."
+
+/obj/item/integrated_circuit/memory/constant/afterattack(atom/target, mob/living/user, proximity)
+ if(accepting_refs && proximity)
+ var/datum/integrated_io/O = outputs[1]
+ O.data = target
+ visible_message("[user] slides \a [src]'s over \the [target].")
+ user << "You set \the [src]'s memory to a reference to [O.display_data()]. The ref scanner is \
+ now off."
+ accepting_refs = 0
\ No newline at end of file
diff --git a/code/modules/integrated_electronics/time.dm b/code/modules/integrated_electronics/time.dm
new file mode 100644
index 0000000000..6f8d18cdb1
--- /dev/null
+++ b/code/modules/integrated_electronics/time.dm
@@ -0,0 +1,134 @@
+/obj/item/integrated_circuit/time
+ name = "time circuit"
+ desc = "Now you can build your own clock!"
+ complexity = 2
+ number_of_inputs = 0
+ number_of_outputs = 0
+
+/obj/item/integrated_circuit/time/delay
+ name = "two-sec delay circuit"
+ desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \
+ This circuit is set to send a pulse after a delay of two seconds."
+ number_of_activators = 2
+ var/delay = 20
+ activator_names = list(
+ "incoming pulse",
+ "outgoing pulse"
+ )
+
+/obj/item/integrated_circuit/time/delay/work()
+ if(..())
+ var/datum/integrated_io/out_pulse = activators[2]
+ sleep(delay)
+ out_pulse.push_data()
+
+/obj/item/integrated_circuit/time/delay/five_sec
+ name = "five-sec delay circuit"
+ desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \
+ This circuit is set to send a pulse after a delay of five seconds."
+ delay = 50
+
+/obj/item/integrated_circuit/time/delay/one_sec
+ name = "one-sec delay circuit"
+ desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \
+ This circuit is set to send a pulse after a delay of one second."
+ delay = 10
+
+/obj/item/integrated_circuit/time/delay/half_sec
+ name = "half-sec delay circuit"
+ desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \
+ This circuit is set to send a pulse after a delay of half a second."
+ delay = 5
+
+/obj/item/integrated_circuit/time/delay/tenth_sec
+ name = "tenth-sec delay circuit"
+ desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \
+ This circuit is set to send a pulse after a delay of 1/10th of a second."
+ delay = 1
+
+/obj/item/integrated_circuit/time/delay/custom
+ name = "custom delay circuit"
+ desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \
+ This circuit's delay can be customized, between 1/10th of a second to one hour. The delay is updated upon receiving a pulse."
+ number_of_inputs = 1
+ input_names = list(
+ "delay time",
+ )
+
+/obj/item/integrated_circuit/time/delay/custom/work()
+ var/datum/integrated_io/delay_input = inputs[1]
+ if(delay_input.data && isnum(delay_input.data) )
+ var/new_delay = min(delay_input.data, 1)
+ new_delay = max(new_delay, 36000) //An hour.
+ delay = new_delay
+
+ ..()
+
+/obj/item/integrated_circuit/time/ticker
+ name = "ticker circuit"
+ desc = "This circuit sends an automatic pulse every four seconds."
+ complexity = 8
+ number_of_inputs = 1
+ number_of_activators = 1
+ var/ticks_to_pulse = 2
+ var/ticks_completed = 0
+ input_names = list(
+ "toggle ticking"
+ )
+ activator_names = list(
+ "outgoing pulse"
+ )
+
+/obj/item/integrated_circuit/time/ticker/New()
+ ..()
+ processing_objects |= src
+
+/obj/item/integrated_circuit/time/ticker/Destroy()
+ processing_objects -= src
+
+/obj/item/integrated_circuit/time/ticker/process()
+ ticks_completed++
+ if( (ticks_completed % ticks_to_pulse) == 0)
+ var/datum/integrated_io/pulser = activators[1]
+ pulser.push_data()
+
+/obj/item/integrated_circuit/time/ticker/fast
+ name = "fast ticker"
+ desc = "This advanced circuit sends an automatic pulse every two seconds."
+ complexity = 12
+ ticks_to_pulse = 1
+
+/obj/item/integrated_circuit/time/ticker/slow
+ name = "slow ticker"
+ desc = "This simple circuit sends an automatic pulse every six seconds."
+ complexity = 4
+ ticks_to_pulse = 3
+
+
+/obj/item/integrated_circuit/time/clock
+ name = "integrated clock"
+ desc = "Tells you what the local time is, specific to your station or planet."
+ number_of_inputs = 0
+ number_of_outputs = 4
+ number_of_activators = 1
+ output_names = list(
+ "time (string)",
+ "hours (number)",
+ "minutes (number)",
+ "seconds (number)"
+ )
+
+/obj/item/integrated_circuit/time/clock/work()
+ if(..())
+ var/datum/integrated_io/time = outputs[1]
+ var/datum/integrated_io/hour = outputs[2]
+ var/datum/integrated_io/min = outputs[3]
+ var/datum/integrated_io/sec = outputs[4]
+
+ time.data = time2text(station_time_in_ticks, "hh:mm:ss")
+ hour.data = text2num(time2text(station_time_in_ticks, "hh"))
+ min.data = text2num(time2text(station_time_in_ticks, "mm"))
+ sec.data = text2num(time2text(station_time_in_ticks, "ss"))
+
+ for(var/datum/integrated_io/output/O in outputs)
+ O.push_data()
\ No newline at end of file
diff --git a/code/modules/integrated_electronics/tools.dm b/code/modules/integrated_electronics/tools.dm
new file mode 100644
index 0000000000..3835c8d5ed
--- /dev/null
+++ b/code/modules/integrated_electronics/tools.dm
@@ -0,0 +1,199 @@
+#define WIRE "wire"
+#define WIRING "wiring"
+#define UNWIRE "unwire"
+#define UNWIRING "unwiring"
+
+
+/obj/item/device/integrated_electronics/wirer
+ name = "circuit wirer"
+ desc = "It's a small wiring tool, with a wire roll, electric soldering iron, wire cutter, and more in one package. \
+ The wires used are generally useful for small electronics, such as circuitboards and breadboards, as opposed to larger wires \
+ used for power or data transmission."
+ icon = 'icons/obj/hacktool.dmi'
+ icon_state = "hacktool-g"
+ flags = CONDUCT
+ w_class = 2
+ var/datum/integrated_io/selected_io = null
+ var/mode = WIRE
+
+/obj/item/device/integrated_electronics/wirer/New()
+ ..()
+
+/obj/item/device/integrated_electronics/wirer/proc/wire(var/datum/integrated_io/io, mob/user)
+ if(mode == WIRE)
+ selected_io = io
+ user << "You attach a data wire to \the [selected_io.holder]'s [selected_io.name] data channel."
+ mode = WIRING
+ else if(mode == WIRING)
+ if(io == selected_io)
+ user << "Wiring \the [selected_io.holder]'s [selected_io.name] into itself is rather pointless."
+ return
+ if(io.io_type != selected_io.io_type)
+ user << "Those two types of channels are incompatable. The first is a [selected_io.io_type], \
+ while the second is a [io.io_type]."
+ return
+ selected_io.linked |= io
+ io.linked |= selected_io
+
+ user << "You connect \the [selected_io.holder]'s [selected_io.name] to \the [io.holder]'s [io.name]."
+ mode = WIRE
+ //io.updateDialog()
+ //selected_io.updateDialog()
+ selected_io.holder.interact(user) // This is to update the UI.
+ selected_io = null
+
+ else if(mode == UNWIRE)
+ selected_io = io
+ if(!io.linked.len)
+ user << "There is nothing connected to \the [selected_io] data channel."
+ selected_io = null
+ return
+ user << "You prepare to detach a data wire from \the [selected_io.holder]'s [selected_io.name] data channel."
+ mode = UNWIRING
+ return
+
+ else if(mode == UNWIRING)
+ if(io == selected_io)
+ user << "You can't wire a pin into each other, so unwiring \the [selected_io.holder] from \
+ the same pin is rather moot."
+ return
+ if(selected_io in io.linked)
+ io.linked.Remove(selected_io)
+ selected_io.linked.Remove(io)
+ user << "You disconnect \the [selected_io.holder]'s [selected_io.name] from \
+ \the [io.holder]'s [io.name]."
+ //io.updateDialog()
+ //selected_io.updateDialog()
+ selected_io.holder.interact(user) // This is to update the UI.
+ selected_io = null
+ mode = UNWIRE
+ else
+ user << "\The [selected_io.holder]'s [selected_io.name] and \the [io.holder]'s \
+ [io.name] are not connected."
+ return
+ return
+
+/obj/item/device/integrated_electronics/wirer/attack_self(mob/user)
+ switch(mode)
+ if(WIRE)
+ mode = UNWIRE
+ if(WIRING)
+ if(selected_io)
+ user << "You decide not to wire the data channel."
+ selected_io = null
+ mode = UNWIRE
+ if(UNWIRE)
+ mode = WIRE
+ if(UNWIRING)
+ if(selected_io)
+ user << "You decide not to disconnect the data channel."
+ selected_io = null
+ mode = UNWIRE
+ user << "You set \the [src] to [mode]."
+
+#undef WIRE
+#undef WIRING
+#undef UNWIRE
+#undef UNWIRING
+
+/obj/item/weapon/storage/bag/circuits
+ name = "circuit satchel"
+ desc = "This bag's essential for any circuitry projects."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "satchel"
+ slot_flags = SLOT_BELT | SLOT_POCKET
+ w_class = 2
+ storage_slots = 200
+ max_storage_space = 400
+ max_w_class = 3
+ display_contents_with_number = 1
+ can_hold = list(/obj/item/integrated_circuit)
+
+/obj/item/weapon/storage/bag/circuits/pre_filled/New()
+ ..()
+ var/i = 10
+ while(i)
+ new /obj/item/integrated_circuit/arithmetic/addition(src)
+ i--
+ i = 10
+ while(i)
+ new /obj/item/integrated_circuit/arithmetic/subtraction(src)
+ i--
+ i = 10
+ while(i)
+ new /obj/item/integrated_circuit/arithmetic/multiplication(src)
+ i--
+ i = 10
+ while(i)
+ new /obj/item/integrated_circuit/arithmetic/division(src)
+ i--
+ i = 5
+ while(i)
+ new /obj/item/integrated_circuit/arithmetic/absolute(src)
+ i--
+ i = 5
+ while(i)
+ new /obj/item/integrated_circuit/arithmetic/average(src)
+ i--
+ i = 10
+ while(i)
+ new /obj/item/integrated_circuit/logic/equals(src)
+ i--
+ i = 10
+ while(i)
+ new /obj/item/integrated_circuit/logic/less_than(src)
+ i--
+ i = 10
+ while(i)
+ new /obj/item/integrated_circuit/logic/less_than_or_equal(src)
+ i--
+ i = 10
+ while(i)
+ new /obj/item/integrated_circuit/logic/greater_than(src)
+ i--
+ i = 10
+ while(i)
+ new /obj/item/integrated_circuit/logic/greater_than_or_equal(src)
+ i--
+ i = 10
+ while(i)
+ new /obj/item/integrated_circuit/logic/not(src)
+ i--
+ i = 10
+ while(i)
+ new /obj/item/integrated_circuit/memory(src)
+ i--
+ i = 5
+ while(i)
+ new /obj/item/integrated_circuit/memory/medium(src)
+ i--
+ i = 5
+ while(i)
+ new /obj/item/integrated_circuit/memory/large(src)
+ i--
+ i = 5
+ while(i)
+ new /obj/item/integrated_circuit/memory/huge(src)
+ i--
+ i = 5
+ while(i)
+ new /obj/item/integrated_circuit/input/numberpad(src)
+ i--
+ i = 5
+ while(i)
+ new /obj/item/integrated_circuit/input/button(src)
+ i--
+ i = 5
+ while(i)
+ new /obj/item/integrated_circuit/output/screen(src)
+ i--
+ i = 5
+ while(i)
+ new /obj/item/integrated_circuit/transfer/splitter(src)
+ i--
+ i = 5
+ while(i)
+ new /obj/item/integrated_circuit/transfer/activator_splitter(src)
+ i--
+ new /obj/item/device/electronic_assembly(src)
+ new /obj/item/device/integrated_electronics/wirer(src)
\ No newline at end of file
diff --git a/code/modules/mob/dead/death.dm b/code/modules/mob/dead/death.dm
index 1be552886b..a1b81115e1 100644
--- a/code/modules/mob/dead/death.dm
+++ b/code/modules/mob/dead/death.dm
@@ -3,3 +3,6 @@
/mob/observer/gib() //ghosts can't be gibbed.
return
+
+/mob/observer/ash()
+ return //ghosts can't be ashed.
\ No newline at end of file
diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm
index 5e7cfe2603..d906b331e2 100644
--- a/code/modules/mob/death.dm
+++ b/code/modules/mob/death.dm
@@ -46,6 +46,25 @@
if(animation) qdel(animation)
if(src) qdel(src)
+/mob/proc/ash(anim="dust-m")
+ death(1)
+ var/atom/movable/overlay/animation = null
+ transforming = 1
+ canmove = 0
+ icon = null
+ invisibility = 101
+
+ animation = new(loc)
+ animation.icon_state = "blank"
+ animation.icon = 'icons/mob/mob.dmi'
+ animation.master = src
+
+ flick(anim, animation)
+
+ dead_mob_list -= src
+ spawn(15)
+ if(animation) qdel(animation)
+ if(src) qdel(src)
/mob/proc/death(gibbed,deathmessage="seizes up and falls limp...")
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index d608bb0988..5e4bfeb24a 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -50,6 +50,11 @@ var/list/holder_mob_icon_cache = list()
continue
M.forceMove(get_turf(src))
+/obj/item/weapon/holder/onDropInto(var/atom/movable/AM)
+ if(ismob(loc)) // Bypass our holding mob and drop directly to its loc
+ return loc.loc
+ return ..()
+
/obj/item/weapon/holder/GetID()
for(var/mob/M in contents)
var/obj/item/I = M.GetIdCard()
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index ad71cebe1f..1c6e2436d4 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -126,16 +126,12 @@ var/list/slot_equipment_priority = list( \
// Removes an item from inventory and places it in the target atom.
// If canremove or other conditions need to be checked then use unEquip instead.
-/mob/proc/drop_from_inventory(var/obj/item/W, var/atom/Target = null)
+/mob/proc/drop_from_inventory(var/obj/item/W, var/atom/target = null)
if(W)
- if(!Target)
- Target = loc
-
- remove_from_mob(W)
- if(!(W && W.loc)) return 1 // self destroying objects (tk, grabs)
-
- W.forceMove(Target)
+ remove_from_mob(W, target)
+ if(!(W && W.loc))
+ return 1 // self destroying objects (tk, grabs)
update_icons()
return 1
return 0
@@ -194,7 +190,9 @@ var/list/slot_equipment_priority = list( \
//Attemps to remove an object on a mob.
-/mob/proc/remove_from_mob(var/obj/O)
+/mob/proc/remove_from_mob(var/obj/O, var/atom/target)
+ if(!O) // Nothing to remove, so we succeed.
+ return 1
src.u_equip(O)
if (src.client)
src.client.screen -= O
@@ -202,7 +200,10 @@ var/list/slot_equipment_priority = list( \
O.screen_loc = null
if(istype(O, /obj/item))
var/obj/item/I = O
- I.forceMove(src.loc)
+ if(target)
+ I.forceMove(target)
+ else
+ I.dropInto(loc)
I.dropped(src)
return 1
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 8cb9cca614..ee0c867ffb 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -23,6 +23,12 @@
else
..()
+/mob/living/carbon/human/ash()
+ if(species)
+ ..(species.dusted_anim)
+ else
+ ..()
+
/mob/living/carbon/human/death(gibbed)
if(stat == DEAD) return
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 6a9952ef07..f1a84d6d9d 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -589,12 +589,15 @@
if("swag", "stopsway")
src.animate_tail_stop()
+ if("vomit")
+ vomit()
+ return
+
if ("help")
- src << {"blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough,
-cry, custom, deathgasp, drool, eyebrow, frown, gasp, giggle, groan, grumble, handshake, hug-(none)/mob, glare-(none)/mob,
-grin, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom, raise, salute, shake, shiver, shrug,
-sigh, signal-#1-10, smile, sneeze, sniff, snore, stare-(none)/mob, tremble, twitch, twitch_s, whimper,
-wink, yawn, swish, sway/wag, fastsway/qwag, stopsway/swag"}
+ src << {"blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, deathgasp, drool, eyebrow, fastsway/qwag,
+frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom,
+raise, salute, shake, shiver, shrug, sigh, signal-#1-10, smile, sneeze, sniff, snore, stare-(none)/mob, stopsway/swag, sway/wag, swish, tremble, twitch,
+twitch_s, vomit, whimper, wink, yawn"}
else
src << "\blue Unusable emote '[act]'. Say *help for a list."
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 7d9712277c..1394b86b4a 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -251,8 +251,8 @@
//splints
for(var/organ in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM))
var/obj/item/organ/external/o = get_organ(organ)
- if(o && o.status & ORGAN_SPLINTED)
- msg += "[T.He] [T.has] a splint on [T.his] [o.name]!\n"
+ if(o && o.splinted && o.splinted.loc == o)
+ msg += "[T.He] [T.has] \a [o.splinted] on [T.his] [o.name]!\n"
if(suiciding)
msg += "[T.He] appears to have commited suicide... there is no hope of recovery.\n"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index d7c7de37ee..f459052a43 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1013,7 +1013,7 @@
/mob/living/carbon/human/proc/handle_embedded_objects()
for(var/obj/item/organ/external/organ in src.organs)
- if(organ.status & ORGAN_SPLINTED) //Splints prevent movement.
+ if(organ.splinted) //Splints prevent movement.
continue
for(var/obj/item/O in organ.implants)
if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad.
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index fef4752a2a..f265e3febb 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -85,7 +85,8 @@
var/list/flavor_texts = list()
var/gunshot_residue
var/pulling_punches // Are you trying not to hurt your opponent?
- var/robolimb_count = 0 // Number of robot limbs.
+ var/robolimb_count = 0 // Total number of external robot parts.
+ var/robobody_count = 0 // Counts torso, groin, and head, if they're robotic
mob_bump_flag = HUMAN
mob_push_flags = ~HEAVY
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index ae9dd9a506..de4b36dceb 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -45,7 +45,7 @@
var/obj/item/organ/external/E = get_organ(organ_name)
if(!E || E.is_stump())
tally += 4
- if(E.status & ORGAN_SPLINTED)
+ if(E.splinted)
tally += 0.5
else if(E.status & ORGAN_BROKEN)
tally += 1.5
@@ -57,7 +57,7 @@
var/obj/item/organ/external/E = get_organ(organ_name)
if(!E || E.is_stump())
tally += 4
- else if(E.status & ORGAN_SPLINTED)
+ else if(E.splinted)
tally += 0.5
else if(E.status & ORGAN_BROKEN)
tally += 1.5
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index 8db85ef5fe..873a9e1220 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -142,10 +142,10 @@
return
for (var/obj/item/organ/external/E in organs)
- if(!E || !E.can_grasp || (E.status & ORGAN_SPLINTED))
+ if(!E || !E.can_grasp)
continue
- if(E.is_broken() || E.is_dislocated())
+ if((E.is_broken() || E.is_dislocated()) && !E.splinted)
switch(E.body_part)
if(HAND_LEFT, ARM_LEFT)
if(!l_hand)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index fee0169939..e98568c1fa 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -694,9 +694,9 @@
if (species.body_temperature == null)
return //this species doesn't have metabolic thermoregulation
- // Robolimbs cause overheating too.
- if(robolimb_count)
- bodytemperature += round(robolimb_count/2)
+ // FBPs will overheat, prosthetic limbs are fine.
+ if(robobody_count)
+ bodytemperature += round(robobody_count*1.75)
var/body_temperature_difference = species.body_temperature - bodytemperature
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index 7c13fc239c..8a2311bc8c 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -190,7 +190,7 @@
language = "Rootspeak"
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/diona)
//primitive_form = "Nymph"
- slowdown = 7
+ slowdown = 5
rarity_value = 3
hud_type = /datum/hud_data/diona
siemens_coefficient = 0.3
diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm
index f1c92b6255..d67eaf76a9 100644
--- a/code/modules/mob/living/carbon/human/stripping.dm
+++ b/code/modules/mob/living/carbon/human/stripping.dm
@@ -125,11 +125,13 @@
if(can_reach_splints)
var/removed_splint
for(var/obj/item/organ/external/o in organs)
- if (o && o.status & ORGAN_SPLINTED)
- var/obj/item/W = new /obj/item/stack/medical/splint(get_turf(src), 1)
- o.status &= ~ORGAN_SPLINTED
- W.add_fingerprint(user)
- removed_splint = 1
+ if (o && o.splinted)
+ var/obj/item/S = o.splinted
+ if(istype(S) && S.loc == o) //can only remove splints that are actually worn on the organ (deals with hardsuit splints)
+ S.add_fingerprint(user)
+ if(o.remove_splint())
+ user.put_in_active_hand(S)
+ removed_splint = 1
if(removed_splint)
visible_message("\The [user] removes \the [src]'s splints!")
else
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 6607d166bf..11eaf182da 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -226,6 +226,7 @@ var/global/list/damage_icon_parts = list()
var/skeleton = (SKELETON in src.mutations)
robolimb_count = 0
+ robobody_count = 0
//CACHING: Generate an index key from visible bodyparts.
//0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic.
@@ -257,6 +258,8 @@ var/global/list/damage_icon_parts = list()
else if(part.robotic >= ORGAN_ROBOT)
icon_key += "2[part.model ? "-[part.model]": ""]"
robolimb_count++
+ if(part.organ_tag == BP_HEAD || part.organ_tag == BP_TORSO || part.organ_tag == BP_GROIN)
+ robobody_count ++
else if(part.status & ORGAN_DEAD)
icon_key += "3"
else
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 3c6f8585f6..fd38776dd5 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -400,7 +400,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
var/input = sanitize(input(usr, "Please choose a message to transmit to [boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
if(!input)
return
- Centcomm_announce(input, usr)
+ CentCom_announce(input, usr)
usr << "Message transmitted."
log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]")
emergency_message_cooldown = 1
diff --git a/code/modules/mob/living/silicon/ai/icons.dm b/code/modules/mob/living/silicon/ai/icons.dm
index 83689c9dd4..ebd47cc02d 100644
--- a/code/modules/mob/living/silicon/ai/icons.dm
+++ b/code/modules/mob/living/silicon/ai/icons.dm
@@ -112,7 +112,7 @@ var/list/datum/ai_icon/ai_icons
alive_light = "#585858"
/datum/ai_icon/nanotrasen
- name = "Nanotrasen"
+ name = "NanoTrasen"
alive_icon = "ai-nanotrasen"
alive_light = "#000029"
diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm
index a8fd898fff..f6bb92cb40 100644
--- a/code/modules/mob/living/silicon/death.dm
+++ b/code/modules/mob/living/silicon/death.dm
@@ -5,6 +5,9 @@
/mob/living/silicon/dust()
..("dust-r", /obj/effect/decal/remains/robot)
+/mob/living/silicon/ash()
+ ..("dust-r")
+
/mob/living/silicon/death(gibbed,deathmessage)
if(in_contents_of(/obj/machinery/recharge_station))//exit the recharge station
var/obj/machinery/recharge_station/RC = loc
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index 3dd2afd216..8de8e405a4 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -4,6 +4,11 @@
qdel(mmi)
..()
+/mob/living/silicon/robot/ash()
+ if(mmi)
+ qdel(mmi)
+ ..()
+
/mob/living/silicon/robot/death(gibbed)
if(camera)
camera.status = 0
diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm
new file mode 100644
index 0000000000..b843013c39
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm
@@ -0,0 +1,19 @@
+/mob/living/simple_animal/penguin
+ name = "space penguin"
+ desc = "An ungainly, waddling, cute, and VERY well-dressed bird."
+ icon_state = "penguin"
+ icon_living = "penguin"
+ icon_dead = "penguin_dead"
+ icon_gib = "generic_gib"
+ speak_chance = 0
+ turns_per_move = 5
+ maxHealth = 20
+ health = 20
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
+ response_help = "pets"
+ response_disarm = "pushes aside"
+ response_harm = "hits"
+ harm_intent_damage = 5
+ melee_damage_upper = 15
+ melee_damage_lower = 10
+ attacktext = "pecked"
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/goose.dm b/code/modules/mob/living/simple_animal/hostile/goose.dm
new file mode 100644
index 0000000000..0f2c4af611
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/goose.dm
@@ -0,0 +1,34 @@
+
+
+/mob/living/simple_animal/hostile/goose
+ name = "space goose"
+ desc = "That's no duck. That's a space goose. You have a bad feeling about this."
+ icon_state = "goose"
+ icon_living = "goose"
+ icon_dead = "goose_dead"
+ icon_gib = "generic_gib"
+ speak_chance = 0
+ turns_per_move = 5
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
+ response_help = "pets the"
+ response_disarm = "gently pushes aside the"
+ response_harm = "hits the"
+ speed = 4
+ maxHealth = 15 //nothing an unarmed crewmember shouldn't be able to stomp into the dirt, if they're alone.
+ health = 15
+
+ harm_intent_damage = 5
+ melee_damage_lower = 5 //they're meant to be annoying, not threatening.
+ melee_damage_upper = 5 //unless there's like a dozen of them, then you're screwed.
+ attacktext = "pecked"
+ attack_sound = 'sound/weapons/bite.ogg'
+
+ break_stuff_probability = 5
+
+ faction = "geese"
+
+
+/mob/living/simple_animal/hostile/goose/FindTarget()
+ . = ..()
+ if(.)
+ custom_emote(1,"flaps and honks at [.]!")
\ No newline at end of file
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 9d7ba1bc63..04058f2fe2 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -519,7 +519,7 @@
for(var/name in H.organs_by_name)
var/obj/item/organ/external/e = H.organs_by_name[name]
if(e && H.lying)
- if(((e.status & ORGAN_BROKEN && !(e.status & ORGAN_SPLINTED)) || e.status & ORGAN_BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100))
+ if(((e.status & ORGAN_BROKEN && !(e.splinted)) || e.status & ORGAN_BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100))
return 1
break
return 0
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 060bd2b651..80a9769f4e 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -364,7 +364,7 @@
dat += "Welcome, [name].
"
dat += "Round Duration: [roundduration2text()]
"
- if(emergency_shuttle) //In case Nanotrasen decides reposess CentComm's shuttles.
+ if(emergency_shuttle) //In case NanoTrasen decides reposess CentCom's shuttles.
if(emergency_shuttle.going_to_centcom()) //Shuttle is going to centcomm, not recalled
dat += "The station has been evacuated.
"
if(emergency_shuttle.online())
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index a10049a644..92f0f512bd 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -29,7 +29,7 @@
all_underwear[WRC.name] = WRI.name
- backbag = rand(1,4)
+ backbag = rand(1,5)
pdachoice = rand(1,3)
age = rand(current_species.min_age, current_species.max_age)
b_type = RANDOM_BLOOD_TYPE
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 1ff859d4d1..65d13fbe55 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -435,6 +435,9 @@
name = "Poofy"
icon_state = "hair_poofy"
+ poofy2
+ name = "Poofy2"
+ icon_state = "hair_poofy2"
crono
name = "Chrono"
icon_state = "hair_toriyama"
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index 105a547e08..c5dfeb2a8c 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -129,7 +129,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 40
if(!(temp.status & ORGAN_BLEEDING) || (temp.robotic >= ORGAN_ROBOT))
continue
for(var/datum/wound/W in temp.wounds) if(W.bleeding())
- blood_max += W.damage / 40
+ blood_max += W.damage / 20
if (temp.open)
blood_max += 2 //Yer stomach is cut open
drip(blood_max)
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index fad60cc0d7..c3a349df17 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -254,7 +254,6 @@ var/list/organ_cache = list()
robotic = ORGAN_ROBOT
src.status &= ~ORGAN_BROKEN
src.status &= ~ORGAN_BLEEDING
- src.status &= ~ORGAN_SPLINTED
src.status &= ~ORGAN_CUT_AWAY
/obj/item/organ/proc/mechassist() //Used to add things like pacemakers, etc
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 612cda4a98..89f3e17ff3 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -50,6 +50,7 @@
var/list/implants = list() // Currently implanted objects.
var/organ_rel_size = 25 // Relative size of the organ.
var/base_miss_chance = 20 // Chance of missing.
+ var/atom/movable/splinted
// Joint/state stuff.
var/can_grasp // It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point
@@ -84,6 +85,10 @@
for(var/obj/item/organ/O in internal_organs)
qdel(O)
+ if(splinted && splinted.loc == src)
+ qdel(splinted)
+ splinted = null
+
if(owner)
owner.organs -= src
owner.organs_by_name[organ_tag] = null
@@ -524,11 +529,11 @@ This function completely restores a damaged organ to perfect condition.
//external organs handle brokenness a bit differently when it comes to damage. Instead brute_dam is checked inside process()
//this also ensures that an external organ cannot be "broken" without broken_description being set.
/obj/item/organ/external/is_broken()
- return ((status & ORGAN_CUT_AWAY) || ((status & ORGAN_BROKEN) && !(status & ORGAN_SPLINTED)))
+ return ((status & ORGAN_CUT_AWAY) || ((status & ORGAN_BROKEN) && !(splinted)))
//Determines if we even need to process this organ.
/obj/item/organ/external/proc/need_process()
- if(status & (ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_DESTROYED|ORGAN_SPLINTED|ORGAN_DEAD|ORGAN_MUTATED))
+ if(status & (ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED))
return 1
if((brute_dam || burn_dam) && (robotic < ORGAN_ROBOT)) //Robot limbs don't autoheal and thus don't need to process when damaged
return 1
@@ -1006,21 +1011,10 @@ Note that amputating the affected organ does in fact remove the infection from t
// This is mostly for the ninja suit to stop ninja being so crippled by breaks.
// TODO: consider moving this to a suit proc or process() or something during
// hardsuit rewrite.
- if(owner && !(status & ORGAN_SPLINTED) && istype(owner,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = owner
-
- if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space))
-
- var/obj/item/clothing/suit/space/suit = H.wear_suit
-
- if(isnull(suit.supporting_limbs))
- return
-
- owner << "You feel \the [suit] constrict about your [name], supporting it."
- status |= ORGAN_SPLINTED
- suit.supporting_limbs |= src
- return
+ if(!(splinted) && owner && istype(owner.wear_suit, /obj/item/clothing/suit/space))
+ var/obj/item/clothing/suit/space/suit = owner.wear_suit
+ suit.handle_fracture(owner, src)
/obj/item/organ/external/proc/mend_fracture()
if(robotic >= ORGAN_ROBOT)
@@ -1031,6 +1025,20 @@ Note that amputating the affected organ does in fact remove the infection from t
status &= ~ORGAN_BROKEN
return 1
+/obj/item/organ/external/proc/apply_splint(var/atom/movable/splint)
+ if(!splinted)
+ splinted = splint
+ return 1
+ return 0
+
+/obj/item/organ/external/proc/remove_splint()
+ if(splinted)
+ if(splinted.loc == src)
+ splinted.dropInto(owner? owner.loc : src.loc)
+ splinted = null
+ return 1
+ return 0
+
/obj/item/organ/external/robotize(var/company, var/skip_prosthetics = 0, var/keep_organs = 0)
if(robotic >= ORGAN_ROBOT)
@@ -1054,6 +1062,7 @@ Note that amputating the affected organ does in fact remove the infection from t
dislocated = -1
cannot_break = 1
+ remove_splint()
get_icon()
unmutate()
diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm
index f54945b51d..5b40922642 100644
--- a/code/modules/organs/subtypes/standard.dm
+++ b/code/modules/organs/subtypes/standard.dm
@@ -42,6 +42,7 @@
joint = "hip"
dislocated = -1
gendered_icon = 1
+ cannot_amputate = 1
organ_rel_size = 30
/obj/item/organ/external/arm
diff --git a/code/modules/paperwork/adminpaper.dm b/code/modules/paperwork/adminpaper.dm
index 7843552f8c..230d8984e8 100644
--- a/code/modules/paperwork/adminpaper.dm
+++ b/code/modules/paperwork/adminpaper.dm
@@ -40,7 +40,7 @@
var/originhash = md5("[origin]")
var/timehash = copytext(md5("[world.time]"),1,10)
var/text = null
- var/logo = alert(usr, "Do you want the header of your fax to have a Nanotrasen or SolGov logo?","Fax Logo","Nanotrasen","SolGov")
+ var/logo = alert(usr, "Do you want the header of your fax to have a NanoTrasen or SolGov logo?","Fax Logo","NanoTrasen","SolGov")
if(logo == "SolGov")
logo = "sglogo.png"
else
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index cf1da677f0..f2c309ff03 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -181,11 +181,11 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
//message badmins that a fax has arrived
if (destination == boss_name)
- message_admins(sender, "[uppertext(boss_short)] FAX", rcvdcopy, "CentcommFaxReply", "#006100")
+ message_admins(sender, "[uppertext(boss_short)] FAX", rcvdcopy, "CentComFaxReply", "#006100")
else if ("Sif Governmental Authority")
- message_admins(sender, "SIF GOVERNMENT FAX", rcvdcopy, "CentcommFaxReply", "#1F66A0")
+ message_admins(sender, "SIF GOVERNMENT FAX", rcvdcopy, "CentComFaxReply", "#1F66A0")
else if ("Supply")
- message_admins(sender, "[uppertext(boss_short)] SUPPLY FAX", rcvdcopy, "CentcommFaxReply", "#5F4519")
+ message_admins(sender, "[uppertext(boss_short)] SUPPLY FAX", rcvdcopy, "CentComFaxReply", "#5F4519")
else
message_admins(sender, "[uppertext(destination)] FAX", rcvdcopy, "UNKNOWN")
diff --git a/code/modules/projectiles/dnalocking.dm b/code/modules/projectiles/dnalocking.dm
new file mode 100644
index 0000000000..394600fc61
--- /dev/null
+++ b/code/modules/projectiles/dnalocking.dm
@@ -0,0 +1,88 @@
+/obj/item/dnalockingchip
+ name = "DNA Chip Lock"
+ icon = 'icons/obj/ammo.dmi'
+ icon_state = "dnalockchip"
+ desc = "A state of the art technological chip that can be installed in a firearm. It allows the user to store their DNA and lock the gun's use from unwanted users."
+ w_class = 1
+ origin_tech = list(TECH_COMBAT = 4, TECH_DATA = 4, TECH_BIO = 4)
+
+ var/list/stored_dna = list() //list of the dna stored in the gun, used to allow users to use it or not
+ var/safety_level = 0 //either 0 or 1, at 0 the game buzzes and tells the user they can't use it, at 1 it self destructs after 10 seconds
+ var/controller_dna = null //The dna of the person who is the primary controller of the gun
+ var/controller_lock = 0 //whether or not the gun is locked by the primar controller, 0 or 1, at 1 it is locked and does not allow
+ var/exploding = 0
+
+
+/obj/item/weapon/gun/proc/get_dna(mob/user)
+ var/mob/living/M = user
+ if(!attached_lock.controller_lock)
+
+ if(!attached_lock.stored_dna && !(M.dna in attached_lock.stored_dna))
+ M << "\The [src] buzzes and displays a symbol showing the gun already contains your DNA."
+ return 0
+ else
+ attached_lock.stored_dna += M.dna
+ M << "\The [src] pings and a needle flicks out from the grip, taking a DNA sample from you."
+ if(!attached_lock.controller_dna)
+ attached_lock.controller_dna = M.dna
+ M << "\The [src] processes the dna sample and pings, acknowledging you as the primary controller."
+ return 1
+ else
+ M << "\The [src] buzzes and displays a locked symbol. It is not allowing DNA samples at this time."
+ return 0
+
+/obj/item/weapon/gun/verb/give_dna()
+ set name = "Give DNA"
+ set category = "Object"
+ set src in usr
+ get_dna(usr)
+
+/obj/item/weapon/gun/proc/clear_dna(mob/user)
+ var/mob/living/M = user
+ if(!attached_lock.controller_lock)
+ if(!authorized_user(M))
+ M << "\The [src] buzzes and displays an invalid user symbol."
+ return 0
+ else
+ attached_lock.stored_dna -= user.dna
+ M << "\The [src] beeps and clears the DNA it has stored."
+ if(M.dna == attached_lock.controller_dna)
+ attached_lock.controller_dna = null
+ M << "\The [src] beeps and removes you as the primary controller."
+ if(attached_lock.controller_lock)
+ attached_lock.controller_lock = 0
+ return 1
+ else
+ M << "\The [src] buzzes and displays a locked symbol. It is not allowing DNA modifcation at this time."
+ return 0
+
+/obj/item/weapon/gun/verb/remove_dna()
+ set name = "Remove DNA"
+ set category = "Object"
+ set src in usr
+ clear_dna(usr)
+
+/obj/item/weapon/gun/proc/toggledna(mob/user)
+ var/mob/living/M = user
+ if(authorized_user(M) && user.dna == attached_lock.controller_dna)
+ if(!attached_lock.controller_lock)
+ attached_lock.controller_lock = 1
+ M << "\The [src] beeps and displays a locked symbol, informing you it will no longer allow DNA samples."
+ else
+ attached_lock.controller_lock = 0
+ M << "\The [src] beeps and displays an unlocked symbol, informing you it will now allow DNA samples."
+ else
+ M << "\The [src] buzzes and displays an invalid user symbol."
+
+/obj/item/weapon/gun/verb/allow_dna()
+ set name = "Toggle DNA Samples Allowance"
+ set category = "Object"
+ set src in usr
+ toggledna(usr)
+
+/obj/item/weapon/gun/proc/authorized_user(mob/user)
+ if(!attached_lock.stored_dna || !attached_lock.stored_dna.len)
+ return 1
+ if(!(user.dna in attached_lock.stored_dna))
+ return 0
+ return 1
\ No newline at end of file
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index bc9ed3d5fb..01dfce8e8c 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -83,11 +83,7 @@
var/tmp/lock_time = -100
var/dna_lock = 0 //whether or not the gun is locked to dna
- var/list/stored_dna = list() //list of the dna stored in the gun, used to allow users to use it or not
- var/safety_level = 0 //either 0 or 1, at 0 the game buzzes and tells the user they can't use it, at 1 it self destructs after 10 seconds
- var/controller_dna = null //The dna of the person who is the primary controller of the gun
- var/controller_lock = 0 //whether or not the gun is locked by the primar controller, 0 or 1, at 1 it is locked and does not allow
- var/exploding = 0
+ var/obj/item/dnalockingchip/attached_lock
/obj/item/weapon/gun/New()
..()
@@ -97,6 +93,8 @@
if(isnull(scoped_accuracy))
scoped_accuracy = accuracy
+ if(dna_lock)
+ attached_lock = new /obj/item/dnalockingchip(src)
if(!dna_lock)
verbs -= /obj/item/weapon/gun/verb/remove_dna
verbs -= /obj/item/weapon/gun/verb/give_dna
@@ -126,18 +124,18 @@
return 0
var/mob/living/M = user
- if(dna_lock && stored_dna)
+ if(dna_lock && attached_lock.stored_dna)
if(!authorized_user(user))
- if(safety_level == 0)
+ if(attached_lock.safety_level == 0)
M << "\The [src] buzzes in dissapoint and displays an invalid DNA symbol."
return 0
- if(!exploding)
- if(safety_level == 1)
+ if(!attached_lock.exploding)
+ if(attached_lock.safety_level == 1)
M << "\The [src] hisses in dissapointment."
visible_message("\The [src] announces, \"Self-destruct occurring in ten seconds.\"", "\The [src] announces, \"Self-destruct occurring in ten seconds.\"")
spawn(100)
explosion(src, 0, 0, 3, 4)
- exploding = 1
+ attached_lock.exploding = 1
sleep(1)
qdel(src)
return 0
@@ -186,6 +184,43 @@
else
return ..() //Pistolwhippin'
+/obj/item/weapon/gun/attackby(var/obj/item/A as obj, mob/user as mob)
+ if(istype(A, /obj/item/dnalockingchip))
+ if(dna_lock)
+ user << "\The [src] already has a [attached_lock]."
+ return
+ user << "You insert \the [A] into \the [src]."
+ user.drop_item()
+ A.loc = src
+ attached_lock = A
+ dna_lock = 1
+ verbs += /obj/item/weapon/gun/verb/remove_dna
+ verbs += /obj/item/weapon/gun/verb/give_dna
+ verbs += /obj/item/weapon/gun/verb/allow_dna
+ return
+
+ if(istype(A, /obj/item/weapon/screwdriver))
+ if(dna_lock && attached_lock && !attached_lock.controller_lock)
+ user << "You begin removing \the [attached_lock] from \the [src]."
+ if(do_after(user, 25))
+ user << "You remove \the [attached_lock] from \the [src]."
+ user.put_in_hands(attached_lock)
+ dna_lock = 0
+ attached_lock = null
+ verbs -= /obj/item/weapon/gun/verb/remove_dna
+ verbs -= /obj/item/weapon/gun/verb/give_dna
+ verbs -= /obj/item/weapon/gun/verb/allow_dna
+ else
+ user << "\The [src] is not accepting modifications at this time."
+
+/obj/item/weapon/gun/emag_act(var/remaining_charges, var/mob/user)
+ if(dna_lock && attached_lock.controller_lock)
+ user << "You short circuit the internal locking mechanisms of \the [src]!"
+ attached_lock.controller_dna = null
+ attached_lock.controller_lock = 0
+ attached_lock.stored_dna = list()
+ return 1
+
/obj/item/weapon/gun/proc/Fire(atom/target, mob/living/user, clickparams, pointblank=0, reflex=0)
if(!user || !target) return
@@ -255,6 +290,76 @@
if(muzzle_flash)
set_light(0)
+// Similar to the above proc, but does not require a user, which is ideal for things like turrets.
+/obj/item/weapon/gun/proc/Fire_userless(atom/target)
+ if(!target)
+ return
+
+ if(world.time < next_fire_time)
+ return
+
+ var/shoot_time = (burst - 1)* burst_delay
+ next_fire_time = world.time + shoot_time
+
+ var/turf/targloc = get_turf(target) //cache this in case target gets deleted during shooting, e.g. if it was a securitron that got destroyed.
+ for(var/i in 1 to burst)
+ var/obj/projectile = consume_next_projectile()
+ if(!projectile)
+ handle_click_empty()
+ break
+
+ if(istype(projectile, /obj/item/projectile))
+ var/obj/item/projectile/P = projectile
+
+ var/acc = burst_accuracy[min(i, burst_accuracy.len)]
+ var/disp = dispersion[min(i, dispersion.len)]
+
+ P.accuracy = accuracy + acc
+ P.dispersion = disp
+
+ P.shot_from = src.name
+ P.silenced = silenced
+
+ P.launch(target)
+
+ if(silenced)
+ playsound(src, fire_sound, 10, 1)
+ else
+ playsound(src, fire_sound, 50, 1)
+
+ if(muzzle_flash)
+ set_light(muzzle_flash)
+ update_icon()
+
+ //process_accuracy(projectile, user, target, acc, disp)
+
+ // if(pointblank)
+ // process_point_blank(projectile, user, target)
+
+ // if(process_projectile(projectile, null, target, user.zone_sel.selecting, clickparams))
+ // handle_post_fire(null, target, pointblank, reflex)
+
+ // update_icon()
+
+ if(i < burst)
+ sleep(burst_delay)
+
+ if(!(target && target.loc))
+ target = targloc
+ //pointblank = 0
+
+ log_and_message_admins("Fired [src].")
+
+ //admin_attack_log(usr, attacker_message="Fired [src]", admin_message="fired a gun ([src]) (MODE: [src.mode_name]) [reflex ? "by reflex" : "manually"].")
+
+ //update timing
+ next_fire_time = world.time + fire_delay
+
+ if(muzzle_flash)
+ set_light(0)
+
+
+
//obtains the next projectile to fire
/obj/item/weapon/gun/proc/consume_next_projectile()
return null
@@ -461,77 +566,3 @@
/obj/item/weapon/gun/attack_self(mob/user)
switch_firemodes(user)
-
-/obj/item/weapon/gun/proc/get_dna(mob/user)
- var/mob/living/M = user
- if(!controller_lock)
-
- if(!stored_dna && !(M.dna in stored_dna))
- M << "\The [src] buzzes and displays a symbol showing the gun already contains your DNA."
- return 0
- else
- stored_dna += M.dna
- M << "\The [src] pings and a needle flicks out from the grip, taking a DNA sample from you."
- if(!controller_dna)
- controller_dna = M.dna
- M << "\The [src] processes the dna sample and pings, acknowledging you as the primary controller."
- return 1
- else
- M << "\The [src] buzzes and displays a locked symbol. It is not allowing DNA samples at this time."
- return 0
-
-/obj/item/weapon/gun/verb/give_dna()
- set name = "Give DNA"
- set category = "Object"
- set src in usr
- get_dna(usr)
-
-/obj/item/weapon/gun/proc/clear_dna(mob/user)
- var/mob/living/M = user
- if(!controller_lock)
- if(!authorized_user(M))
- M << "\The [src] buzzes and displays an invalid user symbol."
- return 0
- else
- stored_dna -= user.dna
- M << "\The [src] beeps and clears the DNA it has stored."
- if(M.dna == controller_dna)
- controller_dna = null
- M << "\The [src] beeps and removes you as the primary controller."
- if(controller_lock)
- controller_lock = 0
- return 1
- else
- M << "\The [src] buzzes and displays a locked symbol. It is not allowing DNA modifcation at this time."
- return 0
-
-/obj/item/weapon/gun/verb/remove_dna()
- set name = "Remove DNA"
- set category = "Object"
- set src in usr
- clear_dna(usr)
-
-/obj/item/weapon/gun/proc/toggledna(mob/user)
- var/mob/living/M = user
- if(authorized_user(M) && user.dna == controller_dna)
- if(!controller_lock)
- controller_lock = 1
- M << "\The [src] beeps and displays a locked symbol, informing you it will no longer allow DNA samples."
- else
- controller_lock = 0
- M << "\The [src] beeps and displays an unlocked symbol, informing you it will now allow DNA samples."
- else
- M << "\The [src] buzzes and displays an invalid user symbol."
-
-/obj/item/weapon/gun/verb/allow_dna()
- set name = "Toggle DNA Samples Allowance"
- set category = "Object"
- set src in usr
- toggledna(usr)
-
-/obj/item/weapon/gun/proc/authorized_user(mob/user)
- if(!stored_dna || !stored_dna.len)
- return 1
- if(!(user.dna in stored_dna))
- return 0
- return 1
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index d602fb13a6..f05e453cfb 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -19,6 +19,9 @@
var/recharge_time = 4
var/charge_tick = 0
+/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob)
+ ..()
+
/obj/item/weapon/gun/energy/switch_firemodes(mob/user)
if(..())
update_icon()
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 5d2fe06fa4..cef84810bd 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -6,7 +6,7 @@
item_state = "laser"
fire_sound = 'sound/weapons/Laser.ogg'
slot_flags = SLOT_BELT|SLOT_BACK
- w_class = 3
+ w_class = 4
force = 10
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
matter = list(DEFAULT_WALL_MATERIAL = 2000)
@@ -69,8 +69,9 @@ obj/item/weapon/gun/energy/retro
origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
slot_flags = SLOT_BELT|SLOT_BACK
projectile_type = /obj/item/projectile/beam/heavylaser/cannon
- max_shots = 1
- fire_delay = 30
+ max_shots = 4
+ fire_delay = 20
+ w_class = 4
// requires_two_hands = 1
one_handed_penalty = 6 // The thing's heavy and huge.
accuracy = 3
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 2352cdce28..9f3369fb34 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -29,6 +29,7 @@
item_state = null //so the human update icon uses the icon_state instead.
fire_sound = 'sound/weapons/Taser.ogg'
max_shots = 21 //7 trigger pulls
+ fire_delay = 6 //This one's not a handgun, it should have the same fire delay as everything else
projectile_type = /obj/item/projectile/beam/stun/weak
origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2, TECH_ILLEGAL = 3)
@@ -51,6 +52,8 @@
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3)
slot_flags = SLOT_BELT
force = 8 //looks heavier than a pistol
+ w_class = 4 //Looks bigger than a pistol, too.
+ fire_delay = 6 //This one's not a handgun, it should have the same fire delay as everything else
self_recharge = 1
modifystate = null
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index bb5168169e..d1fc9ee4a8 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -174,6 +174,7 @@
update_icon()
/obj/item/weapon/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob)
+ ..()
load_ammo(A, user)
/obj/item/weapon/gun/projectile/attack_self(mob/user as mob)
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 1049f5f70d..ee10c68d22 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -43,8 +43,8 @@
impact_type = /obj/effect/projectile/laser_heavy/impact
/obj/item/projectile/beam/heavylaser/cannon
- damage = 90
- armor_penetration = 100
+ damage = 80
+ armor_penetration = 50
/obj/item/projectile/beam/xray
name = "xray beam"
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index 80112690b3..823d8457e0 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -4,6 +4,7 @@
damage = 0
damage_type = BURN
check_armour = "energy"
+ var/flash_strength = 10
//releases a burst of light on impact or after travelling a distance
@@ -25,6 +26,16 @@
if(M.eyecheck() < 1)
M.flash_eyes()
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ flash_strength *= H.species.flash_mod
+
+ if(flash_strength > 0)
+ H.confused = max(H.confused, flash_strength + 5)
+ H.eye_blind = max(H.eye_blind, flash_strength)
+ H.eye_blurry = max(H.eye_blurry, flash_strength + 5)
+
+
//snap pop
playsound(src, 'sound/effects/snap.ogg', 50, 1)
src.visible_message("\The [src] explodes in a bright flash!")
@@ -35,11 +46,13 @@
new /obj/effect/decal/cleanable/ash(src.loc) //always use src.loc so that ash doesn't end up inside windows
new /obj/effect/effect/smoke/illumination(T, 5, brightness, brightness, light_colour)
+
//blinds people like the flash round, but can also be used for temporary illumination
/obj/item/projectile/energy/flash/flare
damage = 10
flash_range = 1
brightness = 15
+ flash_strength = 20
/obj/item/projectile/energy/flash/flare/on_impact(var/atom/A)
light_colour = pick("#e58775", "#ffffff", "#90ff90", "#a09030")
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
index f051e8307f..fcabfa811c 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
@@ -125,10 +125,10 @@
/datum/reagent/water/touch_mob(var/mob/living/L, var/amount)
if(istype(L))
- var/needed = L.fire_stacks * 10
+ var/needed = L.fire_stacks * 5
if(amount > needed)
L.ExtinguishMob()
- L.adjust_fire_stacks(-(amount / 10))
+ L.adjust_fire_stacks(-(amount / 5))
remove_self(needed)
/datum/reagent/water/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index c0ecdbfc3d..8461d87ea7 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -1486,6 +1486,369 @@ CIRCUITS BELOW
build_path = /obj/item/weapon/cartridge/captain
sort_string = "VBAAO"
+
+
+/datum/design/item/wirer
+ name = "Custom wirer tool"
+ id = "wirer"
+ req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500)
+ build_path = /obj/item/device/integrated_electronics/wirer
+ sort_string = "VBVAA"
+
+
+
+/datum/design/item/custom_circuit_assembly
+ name = "Small custom assembly"
+ desc = "An customizable assembly for simple, small devices."
+ id = "assembly-small"
+ req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2, TECH_POWER = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000)
+ build_path = /obj/item/device/electronic_assembly
+ sort_string = "VCAAA"
+
+/datum/design/item/custom_circuit_assembly/medium
+ name = "Medium custom assembly"
+ desc = "An customizable assembly suited for more ambitious mechanisms."
+ id = "assembly-medium"
+ req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_POWER = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 20000)
+ build_path = /obj/item/device/electronic_assembly/medium
+
+/datum/design/item/custom_circuit_assembly/large
+ name = "Large custom assembly"
+ desc = "An customizable assembly for large machines."
+ id = "assembly-large"
+ req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 40000)
+ build_path = /obj/item/device/electronic_assembly/large
+
+/datum/design/circuit/integrated_circuit
+ req_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2)
+
+/datum/design/circuit/integrated_circuit/AssembleDesignName()
+ ..()
+ name = "Custom circuitry ([item_name])"
+
+/datum/design/circuit/integrated_circuit/AssembleDesignDesc()
+ if(!desc)
+ desc = "Allows for the construction of \a [name] custom circuit."
+
+/datum/design/circuit/integrated_circuit/arithmetic/AssembleDesignName()
+ ..()
+ name = "Custom circuitry \[Arithmetic\] ([item_name])"
+
+/datum/design/circuit/integrated_circuit/arithmetic/addition
+ id = "cc-addition"
+ build_path = /obj/item/integrated_circuit/arithmetic/addition
+ sort_string = "WAAAA"
+
+/datum/design/circuit/integrated_circuit/arithmetic/subtraction
+ id = "cc-subtraction"
+ build_path = /obj/item/integrated_circuit/arithmetic/subtraction
+ sort_string = "WAAAB"
+
+/datum/design/circuit/integrated_circuit/arithmetic/multiplication
+ id = "cc-multiplication"
+ build_path = /obj/item/integrated_circuit/arithmetic/multiplication
+ sort_string = "WAAAC"
+
+/datum/design/circuit/integrated_circuit/arithmetic/division
+ id = "cc-division"
+ build_path = /obj/item/integrated_circuit/arithmetic/division
+ sort_string = "WAAAD"
+
+/datum/design/circuit/integrated_circuit/arithmetic/absolute
+ id = "cc-absolute"
+ build_path = /obj/item/integrated_circuit/arithmetic/absolute
+ sort_string = "WAAAE"
+
+/datum/design/circuit/integrated_circuit/arithmetic/average
+ id = "cc-average"
+ build_path = /obj/item/integrated_circuit/arithmetic/average
+ sort_string = "WAAAF"
+
+/datum/design/circuit/integrated_circuit/arithmetic/pi
+ id = "cc-pi"
+ build_path = /obj/item/integrated_circuit/arithmetic/pi
+ sort_string = "WAAAG"
+
+
+
+/datum/design/circuit/integrated_circuit/converter/AssembleDesignName()
+ ..()
+ name = "Custom circuitry \[Conversion\] ([item_name])"
+
+/datum/design/circuit/integrated_circuit/converter/num2text
+ id = "cc-num2text"
+ build_path = /obj/item/integrated_circuit/converter/num2text
+ sort_string = "WAABA"
+
+/datum/design/circuit/integrated_circuit/converter/text2num
+ id = "cc-text2num"
+ build_path = /obj/item/integrated_circuit/converter/text2num
+ sort_string = "WAABB"
+
+/datum/design/circuit/integrated_circuit/converter/ref2text
+ id = "cc-ref2text"
+ build_path = /obj/item/integrated_circuit/converter/ref2text
+ sort_string = "WAABC"
+
+/datum/design/circuit/integrated_circuit/converter/lowercase
+ id = "cc-lowercase"
+ build_path = /obj/item/integrated_circuit/converter/lowercase
+ sort_string = "WAABD"
+
+/datum/design/circuit/integrated_circuit/converter/uppercase
+ id = "cc-uppercase"
+ build_path = /obj/item/integrated_circuit/converter/uppercase
+ sort_string = "WAABD"
+
+
+
+/datum/design/circuit/integrated_circuit/coordinate/AssembleDesignName()
+ ..()
+ name = "Custom circuitry \[Coordinate\] ([item_name])"
+
+/datum/design/circuit/integrated_circuit/coordinate/gps
+ id = "cc-gps"
+ build_path = /obj/item/integrated_circuit/gps
+ sort_string = "WAACA"
+
+/datum/design/circuit/integrated_circuit/coordinate/abs_to_rel_coords
+ id = "cc-abs_to_rel_coords"
+ build_path = /obj/item/integrated_circuit/abs_to_rel_coords
+ sort_string = "WAACB"
+
+
+
+/datum/design/circuit/integrated_circuit/transfer/AssembleDesignName()
+ ..()
+ name = "Custom circuitry \[Transfer\] ([item_name])"
+
+/datum/design/circuit/integrated_circuit/transfer/splitter
+ id = "cc-splitter"
+ build_path = /obj/item/integrated_circuit/transfer/splitter
+ sort_string = "WAADA"
+
+/datum/design/circuit/integrated_circuit/transfer/splitter4
+ id = "cc-splitter4"
+ build_path = /obj/item/integrated_circuit/transfer/splitter/medium
+ sort_string = "WAADB"
+
+/datum/design/circuit/integrated_circuit/transfer/splitter8
+ id = "cc-splitter8"
+ build_path = /obj/item/integrated_circuit/transfer/splitter/large
+ sort_string = "WAADC"
+
+/datum/design/circuit/integrated_circuit/transfer/activator_splitter
+ id = "cc-activator_splitter"
+ build_path = /obj/item/integrated_circuit/transfer/activator_splitter
+ sort_string = "WAADD"
+
+/datum/design/circuit/integrated_circuit/transfer/activator_splitter4
+ id = "cc-activator_splitter4"
+ build_path = /obj/item/integrated_circuit/transfer/activator_splitter/medium
+ sort_string = "WAADE"
+
+/datum/design/circuit/integrated_circuit/transfer/activator_splitter8
+ id = "cc-activator_splitter8"
+ build_path = /obj/item/integrated_circuit/transfer/activator_splitter/large
+ sort_string = "WAADF"
+
+
+
+/datum/design/circuit/integrated_circuit/input_output/AssembleDesignName()
+ ..()
+ name = "Custom circuitry \[Input/Output\] ([item_name])"
+
+/datum/design/circuit/integrated_circuit/input_output/button
+ id = "cc-button"
+ build_path = /obj/item/integrated_circuit/input/button
+ sort_string = "WAAEA"
+
+/datum/design/circuit/integrated_circuit/input_output/numberpad
+ id = "cc-numberpad"
+ build_path = /obj/item/integrated_circuit/input/numberpad
+ sort_string = "WAAEB"
+
+/datum/design/circuit/integrated_circuit/input_output/textpad
+ id = "cc-textpad"
+ build_path = /obj/item/integrated_circuit/input/textpad
+ sort_string = "WAAEC"
+
+/datum/design/circuit/integrated_circuit/input_output/screen
+ id = "cc-screen"
+ build_path = /obj/item/integrated_circuit/output/screen
+ sort_string = "WAAED"
+
+/datum/design/circuit/integrated_circuit/input_output/med_scanner
+ id = "cc-medscanner"
+ build_path = /obj/item/integrated_circuit/input/med_scanner
+ req_tech = list(TECH_MATERIAL = 2, TECH_MAGNETS = 2, TECH_BIOMED = 2)
+ sort_string = "WAAEE"
+
+/datum/design/circuit/integrated_circuit/input_output/adv_med_scanner
+ id = "cc-advmedscanner"
+ build_path = /obj/item/integrated_circuit/input/adv_med_scanner
+ req_tech = list(TECH_MATERIAL = 2, TECH_MAGNETS = 3, TECH_BIOMED = 4)
+ sort_string = "WAAEF"
+
+/datum/design/circuit/integrated_circuit/input_output/local_locator
+ id = "cc-locallocator"
+ build_path = /obj/item/integrated_circuit/input/local_locator
+ sort_string = "WAAEG"
+
+
+
+/datum/design/circuit/integrated_circuit/logic/AssembleDesignName()
+ ..()
+ name = "Custom circuitry \[Logic\] ([item_name])"
+
+/datum/design/circuit/integrated_circuit/logic/equals
+ id = "cc-equals"
+ build_path = /obj/item/integrated_circuit/logic/equals
+ sort_string = "WAAFA"
+
+/datum/design/circuit/integrated_circuit/logic/not
+ id = "cc-not"
+ build_path = /obj/item/integrated_circuit/logic/not
+ sort_string = "WAAFB"
+
+/datum/design/circuit/integrated_circuit/logic/and
+ id = "cc-and"
+ build_path = /obj/item/integrated_circuit/logic/and
+ sort_string = "WAAFC"
+
+/datum/design/circuit/integrated_circuit/logic/or
+ id = "cc-or"
+ build_path = /obj/item/integrated_circuit/logic/or
+ sort_string = "WAAFD"
+
+/datum/design/circuit/integrated_circuit/logic/less_than
+ id = "cc-less_than"
+ build_path = /obj/item/integrated_circuit/logic/less_than
+ sort_string = "WAAFE"
+
+/datum/design/circuit/integrated_circuit/logic/less_than_or_equal
+ id = "cc-less_than_or_equal"
+ build_path = /obj/item/integrated_circuit/logic/less_than_or_equal
+ sort_string = "WAAFF"
+
+/datum/design/circuit/integrated_circuit/logic/greater_than
+ id = "cc-greater_than"
+ build_path = /obj/item/integrated_circuit/logic/greater_than
+ sort_string = "WAAFG"
+
+/datum/design/circuit/integrated_circuit/logic/greater_than_or_equal
+ id = "cc-greater_than_or_equal"
+ build_path = /obj/item/integrated_circuit/logic/greater_than_or_equal
+ sort_string = "WAAFH"
+
+
+
+/datum/design/circuit/integrated_circuit/manipulation/AssembleDesignName()
+ ..()
+ name = "Custom circuitry \[Manipulation\] ([item_name])"
+
+/datum/design/circuit/integrated_circuit/manipulation/weapon_firing
+ id = "cc-weapon_firing"
+ build_path = /obj/item/integrated_circuit/manipulation/weapon_firing
+ sort_string = "WAAGA"
+ req_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 4, TECH_COMBAT = 5)
+
+/datum/design/circuit/integrated_circuit/manipulation/smoke
+ id = "cc-smoke"
+ build_path = /obj/item/integrated_circuit/manipulation/smoke
+ sort_string = "WAAGB"
+ req_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 4, TECH_BIOMED = 5)
+
+
+
+/datum/design/circuit/integrated_circuit/memory/AssembleDesignName()
+ ..()
+ name = "Custom circuitry \[Memory\] ([item_name])"
+
+/datum/design/circuit/integrated_circuit/memory
+ id = "cc-memory"
+ build_path = /obj/item/integrated_circuit/memory
+ sort_string = "WAAHA"
+
+/datum/design/circuit/integrated_circuit/memory/medium
+ id = "cc-memory4"
+ build_path = /obj/item/integrated_circuit/memory/medium
+ sort_string = "WAAHB"
+
+/datum/design/circuit/integrated_circuit/memory/large
+ id = "cc-memory8"
+ build_path = /obj/item/integrated_circuit/memory/large
+ sort_string = "WAAHC"
+
+/datum/design/circuit/integrated_circuit/memory/huge
+ id = "cc-memory16"
+ build_path = /obj/item/integrated_circuit/memory/huge
+ sort_string = "WAAHD"
+
+/datum/design/circuit/integrated_circuit/memory/constant
+ id = "cc-constant"
+ build_path = /obj/item/integrated_circuit/memory/constant
+ sort_string = "WAAHH"
+
+/datum/design/circuit/integrated_circuit/time/AssembleDesignName()
+ ..()
+ name = "Custom circuitry \[Time\] ([item_name])"
+
+/datum/design/circuit/integrated_circuit/time/delay
+ id = "cc-delay"
+ build_path = /obj/item/integrated_circuit/time/delay
+ sort_string = "WAAIA"
+
+/datum/design/circuit/integrated_circuit/time/delay/five_sec
+ id = "cc-five_sec_delay"
+ build_path = /obj/item/integrated_circuit/time/delay/five_sec
+ sort_string = "WAAIB"
+
+/datum/design/circuit/integrated_circuit/time/delay/one_sec
+ id = "cc-one_sec_delay"
+ build_path = /obj/item/integrated_circuit/time/delay/one_sec
+ sort_string = "WAAIC"
+
+/datum/design/circuit/integrated_circuit/time/delay/half_sec
+ id = "cc-half_sec_delay"
+ build_path = /obj/item/integrated_circuit/time/delay/half_sec
+ sort_string = "WAAID"
+
+/datum/design/circuit/integrated_circuit/time/delay/tenth_sec
+ id = "cc-tenth_sec_delay"
+ build_path = /obj/item/integrated_circuit/time/delay/tenth_sec
+ sort_string = "WAAIF"
+
+/datum/design/circuit/integrated_circuit/time/delay/custom
+ id = "cc-custom_delay"
+ build_path = /obj/item/integrated_circuit/time/delay/custom
+ sort_string = "WAAIG"
+
+/datum/design/circuit/integrated_circuit/time/ticker
+ id = "cc-ticker"
+ build_path = /obj/item/integrated_circuit/time/ticker
+ sort_string = "WAAIH"
+
+/datum/design/circuit/integrated_circuit/time/ticker/slow
+ id = "cc-ticker_slow"
+ build_path = /obj/item/integrated_circuit/time/ticker/slow
+ sort_string = "WAAII"
+
+/datum/design/circuit/integrated_circuit/time/ticker/fast
+ id = "cc-ticker_fast"
+ build_path = /obj/item/integrated_circuit/time/ticker/fast
+ sort_string = "WAAIJ"
+ req_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 4)
+
+/datum/design/circuit/integrated_circuit/time/clock
+ id = "cc-clock"
+ build_path = /obj/item/integrated_circuit/time/clock
+ sort_string = "WAAIK"
+
/* Uncomment if someone makes these buildable
/datum/design/circuit/general_alert
name = "general alert console"
diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm
index 87c6fa5ea3..1277d2b594 100644
--- a/code/modules/scripting/Implementations/Telecomms.dm
+++ b/code/modules/scripting/Implementations/Telecomms.dm
@@ -2,7 +2,7 @@
/* --- Traffic Control Scripting Language --- */
- // Nanotrasen TCS Language - Made by Doohl
+ // NanoTrasen TCS Language - Made by Doohl
/n_Interpreter/TCS_Interpreter
var/datum/TCS_Compiler/Compiler
diff --git a/code/modules/shuttles/shuttle_ferry.dm b/code/modules/shuttles/shuttle_ferry.dm
index 5d6663f3b5..0a288a1ba9 100644
--- a/code/modules/shuttles/shuttle_ferry.dm
+++ b/code/modules/shuttles/shuttle_ferry.dm
@@ -16,7 +16,7 @@
//TODO: change location to a string and use a mapping for area and dock targets.
var/dock_target_station
var/dock_target_offsite
-
+
var/last_dock_attempt_time = 0
/datum/shuttle/ferry/short_jump(var/area/origin,var/area/destination)
@@ -85,15 +85,15 @@
long_jump(interim=area_transition, travel_time=move_time, direction=transit_direction)
else
short_jump()
-
+
process_state = WAIT_ARRIVE
-
+
if (WAIT_ARRIVE)
if (moving_status == SHUTTLE_IDLE)
dock()
in_use = null //release lock
process_state = WAIT_FINISH
-
+
if (WAIT_FINISH)
if (skip_docking_checks() || docking_controller.docked() || world.time > last_dock_attempt_time + DOCK_ATTEMPT_TIMEOUT)
process_state = IDLE_STATE
diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm
index cc4428fcb6..818e208ff4 100644
--- a/code/modules/surgery/bones.dm
+++ b/code/modules/surgery/bones.dm
@@ -140,7 +140,6 @@
user.visible_message("\blue [user] has mended the damaged bones in [target]'s [affected.name] with \the [tool]." , \
"\blue You have mended the damaged bones in [target]'s [affected.name] with \the [tool]." )
affected.status &= ~ORGAN_BROKEN
- affected.status &= ~ORGAN_SPLINTED
affected.stage = 0
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
diff --git a/code/unit_tests/zas_tests.dm b/code/unit_tests/zas_tests.dm
index a28abaa881..cbf26f061f 100644
--- a/code/unit_tests/zas_tests.dm
+++ b/code/unit_tests/zas_tests.dm
@@ -44,7 +44,7 @@
return test_result
if(expectation == UT_NORMAL)
-
+
if(abs(temp - T20C) > 10)
test_result["msg"] = "Temperature out of bounds: [temp] | [t_msg]"
return test_result
@@ -78,7 +78,7 @@
return 1
/datum/unit_test/zas_area_test/supply_centcomm
- name = "ZAS: Supply Shuttle (CentComm)"
+ name = "ZAS: Supply Shuttle (CentCom)"
area_path = /area/supply/dock
/datum/unit_test/zas_area_test/emergency_shuttle
@@ -95,7 +95,7 @@
/datum/unit_test/zas_area_test/cargo_maint
name = "ZAS: Cargo Maintenance"
- area_path = /area/maintenance/cargo
+ area_path = /area/maintenance/cargo
/datum/unit_test/zas_area_test/eng_shuttle
name = "ZAS: Construction Site Shuttle (Station)"
diff --git a/html/changelog.html b/html/changelog.html
index cd77152c9d..fd4010ec16 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -53,6 +53,56 @@
-->
+
03 September 2016
+
Yosh updated:
+
+ - Projectile flash rounds will now do the same as a flash when it hits the target. As such, it will blind, confuse and blur the eyes of thw target. Pistol and machine gun rounds last the same length as a flash, shotgun rounds last longer.
+ - Changeling recursive enhancement is now a toggleable passive ability, instead of a one-time use active ability.
+ - You can now vomit by using the vomit emote.
+
+
Yoshax updated:
+
+ - Changeling armor and space armor can now be cast off regardless of your stored chemicals.
+
+
+
02 September 2016
+
Yosh updated:
+
+ - DNA Lockable guns have been finished. Any gun can be made into a DNA Lockable gun by inserting a DNA Chip Lock. These are not currently available, and are adminspawn only. Please refer to your nearest staffmember/developer to begin discussion for future implementations of this feature.
+ - A new hairstyle has been added named poofy2.
+
+
Yoshax updated:
+
+ - Autotraitor now needs 0 players to start in secret.
+ - Diona are now slightly faster!
+
+
+
01 September 2016
+
Alberyk updated:
+
+ - Added more horns and horns related facial options for Unathi.
+
+
Anewbe updated:
+
+ - Hyperzine metabolizes twice as quickly.
+ - Changeling space suits now have magboots.
+ - Armblade now has suicide_act text.
+
+
Techhead updated:
+
+ - Medical splints can now also be applied to hands and feet (in addition to arms and legs).
+ - For those that miss the old functionality, ghetto splints have been added. These can be crafted with a roll of tape and a metal rod and can only splint arms and legs.
+
+
Yosh updated:
+
+ - The secure briefcase is now available in the loadout for anyone who wishes to use it.
+ - Leaving a space area and entering a non-space area will no longer leave your sprite floating.
+ - Ponchos can now be attached to your uniform as an accessory. In addition they can also be attached to suits!
+ - Changeling regenerative stasis will now properly regrow limbs.
+ - Changeling regenerative stasis will no longer runtime and refuse to work when you have a missing limb.
+ - The shuttle during revolution will no longer take forever and a day to arrive and such.
+
+
30 August 2016
Anewbe updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index df24f59d20..0bd938c5c1 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2779,3 +2779,50 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
power flowing through it.
- bugfix: Emitters don't explode in one hit, or by tasers or non-damaging projectiles
anymore.
+2016-09-01:
+ Alberyk:
+ - rscadd: Added more horns and horns related facial options for Unathi.
+ Anewbe:
+ - tweak: Hyperzine metabolizes twice as quickly.
+ - rscadd: Changeling space suits now have magboots.
+ - rscadd: Armblade now has suicide_act text.
+ Techhead:
+ - rscadd: Medical splints can now also be applied to hands and feet (in addition
+ to arms and legs).
+ - rscadd: For those that miss the old functionality, ghetto splints have been added.
+ These can be crafted with a roll of tape and a metal rod and can only splint
+ arms and legs.
+ Yosh:
+ - rscadd: The secure briefcase is now available in the loadout for anyone who wishes
+ to use it.
+ - bugfix: Leaving a space area and entering a non-space area will no longer leave
+ your sprite floating.
+ - rscadd: Ponchos can now be attached to your uniform as an accessory. In addition
+ they can also be attached to suits!
+ - bugfix: Changeling regenerative stasis will now properly regrow limbs.
+ - bugfix: Changeling regenerative stasis will no longer runtime and refuse to work
+ when you have a missing limb.
+ - tweak: The shuttle during revolution will no longer take forever and a day to
+ arrive and such.
+2016-09-02:
+ Yosh:
+ - rscadd: DNA Lockable guns have been finished. Any gun can be made into a DNA Lockable
+ gun by inserting a DNA Chip Lock. These are not currently available, and are
+ adminspawn only. Please refer to your nearest staffmember/developer to begin
+ discussion for future implementations of this feature.
+ - rscadd: A new hairstyle has been added named poofy2.
+ Yoshax:
+ - tweak: Autotraitor now needs 0 players to start in secret.
+ - tweak: Diona are now slightly faster!
+2016-09-03:
+ Yosh:
+ - tweak: Projectile flash rounds will now do the same as a flash when it hits the
+ target. As such, it will blind, confuse and blur the eyes of thw target. Pistol
+ and machine gun rounds last the same length as a flash, shotgun rounds last
+ longer.
+ - tweak: Changeling recursive enhancement is now a toggleable passive ability, instead
+ of a one-time use active ability.
+ - rscadd: You can now vomit by using the vomit emote.
+ Yoshax:
+ - bugfix: Changeling armor and space armor can now be cast off regardless of your
+ stored chemicals.
diff --git a/html/changelogs/Anewbe - Lingboots.yml b/html/changelogs/Anewbe - Explosive Implants.yml
similarity index 92%
rename from html/changelogs/Anewbe - Lingboots.yml
rename to html/changelogs/Anewbe - Explosive Implants.yml
index 8bc4597fa5..098154180b 100644
--- a/html/changelogs/Anewbe - Lingboots.yml
+++ b/html/changelogs/Anewbe - Explosive Implants.yml
@@ -33,5 +33,4 @@ delete-after: True
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- - rscadd: "Changeling space suits now have magboots."
- - rscadd: "Armblade now has suicide_act text."
+ - tweak: "Explosive implants should no longer gib the target if the setting is Localized Limb."
diff --git a/html/changelogs/Anewbe - Lasercannon.yml b/html/changelogs/Anewbe - Lasercannon.yml
new file mode 100644
index 0000000000..e6a15b49db
--- /dev/null
+++ b/html/changelogs/Anewbe - Lasercannon.yml
@@ -0,0 +1,37 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Lasercannon has 4 shots and fires slightly faster."
+ - tweak: "Lasercannon shots are slightly weaker to compensate for increased sustain."
diff --git a/html/changelogs/Anewbe - Hyperzine.yml b/html/changelogs/Anewbe - Lizard Sprites.yml
similarity index 96%
rename from html/changelogs/Anewbe - Hyperzine.yml
rename to html/changelogs/Anewbe - Lizard Sprites.yml
index d4060b1990..7037a4ba4f 100644
--- a/html/changelogs/Anewbe - Hyperzine.yml
+++ b/html/changelogs/Anewbe - Lizard Sprites.yml
@@ -33,5 +33,4 @@ delete-after: True
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- - tweak: "Hyperzine metabolizes twice as quickly."
-
+ - tweak: "Changes Unathi sprites slightly."
diff --git a/html/changelogs/Anewbe - Nuclear Egun.yml b/html/changelogs/Anewbe - Nuclear Egun.yml
new file mode 100644
index 0000000000..2a50416795
--- /dev/null
+++ b/html/changelogs/Anewbe - Nuclear Egun.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "The advanced egun, laser carbine, and lasercannon now take up a bit more space in bags."
\ No newline at end of file
diff --git a/html/changelogs/Yoshax - Case.yml b/html/changelogs/Anewbe - Robobody.yml
similarity index 92%
rename from html/changelogs/Yoshax - Case.yml
rename to html/changelogs/Anewbe - Robobody.yml
index 0ac726b460..da186cee6e 100644
--- a/html/changelogs/Yoshax - Case.yml
+++ b/html/changelogs/Anewbe - Robobody.yml
@@ -22,7 +22,7 @@
#################################
# Your name.
-author: Yosh
+author: Anewbe
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
@@ -33,4 +33,4 @@ delete-after: True
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- - rscadd: "The secure briefcase is now available in the loadout for anyone who wishes to use it."
\ No newline at end of file
+ - tweak: "Prosthetic limbs and extremities no longer increase body temperature."
\ No newline at end of file
diff --git a/html/changelogs/Yoshax - Rev.yml b/html/changelogs/Anewbe - RoundNumbers.txt
similarity index 92%
rename from html/changelogs/Yoshax - Rev.yml
rename to html/changelogs/Anewbe - RoundNumbers.txt
index f328183dbb..4718925160 100644
--- a/html/changelogs/Yoshax - Rev.yml
+++ b/html/changelogs/Anewbe - RoundNumbers.txt
@@ -22,7 +22,7 @@
#################################
# Your name.
-author: Yosh
+author: Anewbe
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
@@ -33,4 +33,4 @@ delete-after: True
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- - tweak: "The shuttle during revolution will no longer take forever and a day to arrive and such."
\ No newline at end of file
+ - tweak: "Ninja and Technomancer now require 5 players to start in either secret or voted."
\ No newline at end of file
diff --git a/html/changelogs/Anewbe - Skirts.yml b/html/changelogs/Anewbe - Skirts.yml
new file mode 100644
index 0000000000..89208a1fd5
--- /dev/null
+++ b/html/changelogs/Anewbe - Skirts.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Split skirts into 'skirts', which are just a skirt, and 'skirt outfits', which cover the upper body. Check your loadouts, they should remain otherwise unchanged."
diff --git a/html/changelogs/Anewbe - Splints.yml b/html/changelogs/Anewbe - Splints.yml
new file mode 100644
index 0000000000..b82307415f
--- /dev/null
+++ b/html/changelogs/Anewbe - Splints.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscdel: "Splints are no longer reusable."
diff --git a/html/changelogs/Anewbe - Water.yml b/html/changelogs/Anewbe - Water.yml
new file mode 100644
index 0000000000..1a84902af4
--- /dev/null
+++ b/html/changelogs/Anewbe - Water.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Water is now more effective at dousing burning people."
diff --git a/html/changelogs/Anewbe -Ninjapoof.yml b/html/changelogs/Anewbe -Ninjapoof.yml
new file mode 100644
index 0000000000..e096ec7e76
--- /dev/null
+++ b/html/changelogs/Anewbe -Ninjapoof.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscdel: "Ninjas now vanish in a cloud of smoke, rather than exploding."
diff --git a/html/changelogs/Techhead-Splints.yml b/html/changelogs/Techhead-Splints.yml
deleted file mode 100644
index efc4165728..0000000000
--- a/html/changelogs/Techhead-Splints.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: Techhead
-
-delete-after: True
-
-changes:
- - rscadd: "Medical splints can now also be applied to hands and feet (in addition to arms and legs)."
- - rscadd: "For those that miss the old functionality, ghetto splints have been added. These can be crafted with a roll of tape and a metal rod and can only splint arms and legs."
\ No newline at end of file
diff --git a/html/changelogs/Yoshax - Floating.yml b/html/changelogs/Yoshax - Bleeding.yml
similarity index 91%
rename from html/changelogs/Yoshax - Floating.yml
rename to html/changelogs/Yoshax - Bleeding.yml
index b42ea00f26..7923500701 100644
--- a/html/changelogs/Yoshax - Floating.yml
+++ b/html/changelogs/Yoshax - Bleeding.yml
@@ -22,7 +22,7 @@
#################################
# Your name.
-author: Yosh
+author: Yoshax
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
@@ -33,4 +33,4 @@ delete-after: True
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- - bugfix: "Leaving a space area and entering a non-space area will no longer leave your sprite floating."
\ No newline at end of file
+ - tweak: "People bleed faster and more."
diff --git a/html/changelogs/Yoshax - Ponchos.yml b/html/changelogs/Yoshax - Ponchos.yml
deleted file mode 100644
index 1625b5a53c..0000000000
--- a/html/changelogs/Yoshax - Ponchos.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# maptweak
-# spellcheck (typo fixes)
-# experiment
-#################################
-
-# Your name.
-author: Yosh
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
-# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
-changes:
- - rscadd: "Ponchos can now be attached to your uniform as an accessory. In addition they can also be attached to suits!"
\ No newline at end of file
diff --git a/html/changelogs/Yoshax - Regen.yml b/html/changelogs/Yoshax - Regen.yml
deleted file mode 100644
index 023b98a3ae..0000000000
--- a/html/changelogs/Yoshax - Regen.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# maptweak
-# spellcheck (typo fixes)
-# experiment
-#################################
-
-# Your name.
-author: Yosh
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
-# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
-changes:
- - bugfix: "Changeling regenerative stasis will now properly regrow limbs."
- - bugfix: "Changeling regenerative stasis will no longer runtime and refuse to work when you have a missing limb."
diff --git a/html/changelogs/Yoshax - Splint.yml b/html/changelogs/Yoshax - Splint.yml
new file mode 100644
index 0000000000..32841c06e1
--- /dev/null
+++ b/html/changelogs/Yoshax - Splint.yml
@@ -0,0 +1,37 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Yoshax
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - bugfix: "Splints are once again reusable and have been improved behind the scenes."
+ - bugfix: "Removing splints will now correctly give you the splint used to splint the organ."
diff --git a/html/changelogs/alberyk-PR-752.yml b/html/changelogs/alberyk-PR-752.yml
deleted file mode 100644
index 9a6d435838..0000000000
--- a/html/changelogs/alberyk-PR-752.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-author: Alberyk
-
-delete-after: True
-
-changes:
- - rscadd: "Added more horns and horns related facial options for Unathi."
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 971ed98d1a..738cea1371 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 0441606e95..402dd0f832 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
index 81316a066e..9191d94193 100644
Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index b9e90df4b1..955942ba24 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi
index b8275ce7bf..e5d5532c23 100644
Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index f78b75c6c1..aa871d5a7d 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_races/r_lizard.dmi b/icons/mob/human_races/r_lizard.dmi
index 85208cff78..5fb2c58be4 100644
Binary files a/icons/mob/human_races/r_lizard.dmi and b/icons/mob/human_races/r_lizard.dmi differ
diff --git a/icons/mob/items/lefthand_hats.dmi b/icons/mob/items/lefthand_hats.dmi
index 96c7bd9dc2..8410e79312 100644
Binary files a/icons/mob/items/lefthand_hats.dmi and b/icons/mob/items/lefthand_hats.dmi differ
diff --git a/icons/mob/items/lefthand_suits.dmi b/icons/mob/items/lefthand_suits.dmi
index 04f62b1266..ff84dc22ab 100644
Binary files a/icons/mob/items/lefthand_suits.dmi and b/icons/mob/items/lefthand_suits.dmi differ
diff --git a/icons/mob/items/righthand_hats.dmi b/icons/mob/items/righthand_hats.dmi
index 727dcebfe9..62ad6fd01f 100644
Binary files a/icons/mob/items/righthand_hats.dmi and b/icons/mob/items/righthand_hats.dmi differ
diff --git a/icons/mob/items/righthand_suits.dmi b/icons/mob/items/righthand_suits.dmi
index 6b5e8a511b..f44861a685 100644
Binary files a/icons/mob/items/righthand_suits.dmi and b/icons/mob/items/righthand_suits.dmi differ
diff --git a/icons/mob/species/seromi/head.dmi b/icons/mob/species/seromi/head.dmi
index 57c4f11713..0f587bc529 100644
Binary files a/icons/mob/species/seromi/head.dmi and b/icons/mob/species/seromi/head.dmi differ
diff --git a/icons/mob/species/seromi/suit.dmi b/icons/mob/species/seromi/suit.dmi
index f74326df98..7c171ab679 100644
Binary files a/icons/mob/species/seromi/suit.dmi and b/icons/mob/species/seromi/suit.dmi differ
diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi
index f5f7445c60..b90457f0a0 100644
Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ
diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi
index b3a44eea8b..85bd2720c9 100644
Binary files a/icons/mob/species/skrell/suit.dmi and b/icons/mob/species/skrell/suit.dmi differ
diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi
index 95300157f2..a8de387982 100644
Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ
diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi
index 8cdc5e46ce..aa27f280aa 100644
Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index db43fd2f07..0c5f68dbc0 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi
index 8dbf403c70..2a2b843c36 100644
Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 3de07fbad5..185b422c87 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 6e36b86b00..104565119e 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index a5a4767b91..f3c5734915 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 3fffa24252..62d8b123f8 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/species/seromi/hats.dmi b/icons/obj/clothing/species/seromi/hats.dmi
index 9398f18018..a74e4fddd1 100644
Binary files a/icons/obj/clothing/species/seromi/hats.dmi and b/icons/obj/clothing/species/seromi/hats.dmi differ
diff --git a/icons/obj/clothing/species/seromi/suits.dmi b/icons/obj/clothing/species/seromi/suits.dmi
index 2d56f7f787..58744da82b 100644
Binary files a/icons/obj/clothing/species/seromi/suits.dmi and b/icons/obj/clothing/species/seromi/suits.dmi differ
diff --git a/icons/obj/clothing/species/skrell/hats.dmi b/icons/obj/clothing/species/skrell/hats.dmi
index f3916f564b..de2b31f0f6 100644
Binary files a/icons/obj/clothing/species/skrell/hats.dmi and b/icons/obj/clothing/species/skrell/hats.dmi differ
diff --git a/icons/obj/clothing/species/skrell/suits.dmi b/icons/obj/clothing/species/skrell/suits.dmi
index 47af90a121..10984c94fb 100644
Binary files a/icons/obj/clothing/species/skrell/suits.dmi and b/icons/obj/clothing/species/skrell/suits.dmi differ
diff --git a/icons/obj/clothing/species/tajaran/hats.dmi b/icons/obj/clothing/species/tajaran/hats.dmi
index cad2ef6242..0814a97e19 100644
Binary files a/icons/obj/clothing/species/tajaran/hats.dmi and b/icons/obj/clothing/species/tajaran/hats.dmi differ
diff --git a/icons/obj/clothing/species/tajaran/suits.dmi b/icons/obj/clothing/species/tajaran/suits.dmi
index a41048e94f..85c3a62427 100644
Binary files a/icons/obj/clothing/species/tajaran/suits.dmi and b/icons/obj/clothing/species/tajaran/suits.dmi differ
diff --git a/icons/obj/clothing/species/unathi/hats.dmi b/icons/obj/clothing/species/unathi/hats.dmi
index 4724c19baf..731b18c044 100644
Binary files a/icons/obj/clothing/species/unathi/hats.dmi and b/icons/obj/clothing/species/unathi/hats.dmi differ
diff --git a/icons/obj/clothing/species/unathi/suits.dmi b/icons/obj/clothing/species/unathi/suits.dmi
index a84993521e..442a4a1b62 100644
Binary files a/icons/obj/clothing/species/unathi/suits.dmi and b/icons/obj/clothing/species/unathi/suits.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index b64cb6027c..9bdd8e41d6 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/electronic_assemblies.dmi b/icons/obj/electronic_assemblies.dmi
new file mode 100644
index 0000000000..18ba8650ee
Binary files /dev/null and b/icons/obj/electronic_assemblies.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index e0b25abb5e..88457f09c2 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index be5e694f22..a302e5fb66 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/maps/RandomZLevels/stationCollision.dm b/maps/RandomZLevels/stationCollision.dm
index 6d87f40186..fa20f440ec 100644
--- a/maps/RandomZLevels/stationCollision.dm
+++ b/maps/RandomZLevels/stationCollision.dm
@@ -63,7 +63,7 @@
obj/item/weapon/gun/energy/laser/retro/sc_retro
name ="retro laser"
icon_state = "retro"
- desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces."
+ desc = "An older model of the basic lasergun, no longer used by NanoTrasen's security or military forces."
projectile_type = "/obj/item/projectile/practice"
clumsy_check = 0 //No sense in having a harmless gun blow up in the clowns face
diff --git a/polaris.dme b/polaris.dme
index b72e5fe2eb..b1728a349e 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1365,6 +1365,18 @@
#include "code\modules\hydroponics\trays\tray_soil.dm"
#include "code\modules\hydroponics\trays\tray_tools.dm"
#include "code\modules\hydroponics\trays\tray_update_icons.dm"
+#include "code\modules\integrated_electronics\_defines.dm"
+#include "code\modules\integrated_electronics\arithmetic.dm"
+#include "code\modules\integrated_electronics\assemblies.dm"
+#include "code\modules\integrated_electronics\converters.dm"
+#include "code\modules\integrated_electronics\coordinate.dm"
+#include "code\modules\integrated_electronics\data_transfer.dm"
+#include "code\modules\integrated_electronics\input_output.dm"
+#include "code\modules\integrated_electronics\logic.dm"
+#include "code\modules\integrated_electronics\manipulation.dm"
+#include "code\modules\integrated_electronics\memory.dm"
+#include "code\modules\integrated_electronics\time.dm"
+#include "code\modules\integrated_electronics\tools.dm"
#include "code\modules\library\lib_items.dm"
#include "code\modules\library\lib_machines.dm"
#include "code\modules\library\lib_readme.dm"
@@ -1621,6 +1633,7 @@
#include "code\modules\mob\living\simple_animal\friendly\lizard.dm"
#include "code\modules\mob\living\simple_animal\friendly\mouse.dm"
#include "code\modules\mob\living\simple_animal\friendly\mushroom.dm"
+#include "code\modules\mob\living\simple_animal\friendly\penguin.dm"
#include "code\modules\mob\living\simple_animal\friendly\slime.dm"
#include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm"
#include "code\modules\mob\living\simple_animal\friendly\tomato.dm"
@@ -1631,6 +1644,7 @@
#include "code\modules\mob\living\simple_animal\hostile\creature.dm"
#include "code\modules\mob\living\simple_animal\hostile\faithless.dm"
#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm"
+#include "code\modules\mob\living\simple_animal\hostile\goose.dm"
#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm"
#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
#include "code\modules\mob\living\simple_animal\hostile\mimic.dm"
@@ -1765,6 +1779,7 @@
#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm"
#include "code\modules\power\singularity\particle_accelerator\particle_power.dm"
#include "code\modules\projectiles\ammunition.dm"
+#include "code\modules\projectiles\dnalocking.dm"
#include "code\modules\projectiles\effects.dm"
#include "code\modules\projectiles\gun.dm"
#include "code\modules\projectiles\projectile.dm"