diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 527ea37bb14..4c63722a2ff 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -580,10 +580,22 @@ datum/mind
new_objective.target_amount = target_number
if("identity theft")
+ var/list/possible_targets = list("Free objective")
+ for(var/datum/mind/possible_target in ticker.minds)
+ if ((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human))
+ possible_targets += possible_target.current
+
+ var/new_target = input("Select target:", "Objective target") as null|anything in possible_targets
+ if (!new_target)
+ return
+ var/datum/mind/targ = new_target
+ if(!istype(targ))
+ log_debug("Invalid target for identity theft objective, cancelling")
+ return
new_objective = new /datum/objective/escape/escape_with_identity
new_objective.owner = src
- new_objective.find_target()
-
+ new_objective.target = new_target
+ new_objective.explanation_text = "Escape on the shuttle or an escape pod with the identity of [targ.current.real_name], the [targ.assigned_role] while wearing their identification card."
if ("custom")
var/expl = sanitize(copytext(input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null,1,MAX_MESSAGE_LEN))
if (!expl) return
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index a3fbd9c9f86..126255e5ad0 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -146,7 +146,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/grenade/smokebomb,
/obj/item/weapon/grenade/smokebomb,
/obj/item/weapon/grenade/smokebomb,
- /obj/item/weapon/pen/paralysis,
+ /obj/item/weapon/pen/sleepy,
/obj/item/weapon/grenade/chem_grenade/incendiary)
cost = 20
containertype = /obj/structure/closet/crate
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 832749d6bcc..9006433602a 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -371,10 +371,11 @@ var/list/uplink_items = list()
/datum/uplink_item/stealthy_weapons
category = "Stealthy and Inconspicuous Weapons"
-/datum/uplink_item/stealthy_weapons/para_pen
- name = "Paralysis Pen"
- desc = "A syringe disguised as a functional pen, filled with a neuromuscular-blocking drug that renders a target mute on injection that will eventually cause them to pass out. The pen holds one dose of paralyzing agent,though it can be refilled."
- item = /obj/item/weapon/pen/paralysis
+/datum/uplink_item/stealthy_weapons/sleepy_pen
+ name = "Sleepy Pen"
+ desc = "A syringe disguised as a functional pen, filled with a potent mix of drugs, including a strong anaesthetic and a chemical that is capable of blocking the movement of the vocal chords. \
+ The pen holds one dose of the mixture. The pen can be refilled."
+ item = /obj/item/weapon/pen/sleepy
cost = 8
excludefrom = list("nuclear emergency")
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index d981da20efe..3a0ebf2d928 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -120,9 +120,9 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/datum/objective/escape/escape_with_identity/identity_theft = new
identity_theft.owner = changeling
identity_theft.target = kill_objective.target
+ identity_theft.target_real_name = kill_objective.target.current.real_name //Whoops, forgot this.
if(identity_theft.target && identity_theft.target.current)
- var/target_real_name = identity_theft.target.current.real_name
- identity_theft.explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [identity_theft.target.assigned_role] while wearing their identification card."
+ identity_theft.explanation_text = "Escape on the shuttle or an escape pod with the identity of [identity_theft.target_real_name], the [identity_theft.target.assigned_role] while wearing their identification card."
else
identity_theft.explanation_text = "Free objective"
changeling.objectives += identity_theft
@@ -310,4 +310,4 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
user << "We already have this DNA in storage!"
return 1
-
\ No newline at end of file
+
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index a54d336c5dd..09453727f4b 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -42,7 +42,7 @@
/obj/item/weapon/storage/box/emps:3:5 EMP Grenades;
Whitespace:Seperator;
Stealthy and Inconspicuous Weapons;
-/obj/item/weapon/pen/paralysis:3:Paralysis Pen;
+/obj/item/weapon/pen/sleepy:3:Sleepy Pen;
/obj/item/weapon/soap/syndie:1:Syndicate Soap;
/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge;
Whitespace:Seperator;
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 2a7d8b14368..d79a7f8b6ae 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -749,12 +749,14 @@ datum/objective/absorb
return 0
datum/objective/destroy
+ var/target_real_name
find_target()
var/list/possible_targets = active_ais(1)
var/mob/living/silicon/ai/target_ai = pick(possible_targets)
target = target_ai.mind
if(target && target.current)
- explanation_text = "Destroy [target.current.real_name], the experimental AI."
+ target_real_name = target.current.real_name
+ explanation_text = "Destroy [target_real_name], the AI."
else
explanation_text = "Free Objective"
return target
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index f201cb9e772..13275b5f3c1 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -19,17 +19,13 @@
user << "You don't have the dexterity to do this!"
return 1
+
if (istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
- if(affecting.display_name == "head")
- if(H.head && istype(H.head,/obj/item/clothing/head/helmet/space))
- user << "You can't apply [src] through [H.head]!"
- return 1
- else
- if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space))
- user << "You can't apply [src] through [H.wear_suit]!"
+ if(isliving(M))
+ if(!M.can_inject(user, 1))
return 1
if(affecting.status & ORGAN_ROBOT)
@@ -48,7 +44,7 @@
use(1)
M.updatehealth()
-
+
/obj/item/stack/medical/bruise_pack
name = "roll of gauze"
singular_name = "gauze length"
@@ -82,12 +78,12 @@
user.visible_message( "\blue [user] places a bandaid over \the [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place a bandaid over \the [W.desc] on [M]'s [affecting.display_name]." )
- affecting.heal_damage(src.heal_brute, src.heal_burn, 0)
+ affecting.heal_damage(src.heal_brute, src.heal_burn, 0)
use(1)
else
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
use(1)
-
+
/obj/item/stack/medical/ointment
name = "ointment"
desc = "Used to treat those nasty burns."
@@ -112,7 +108,7 @@
else
user.visible_message( "\blue [user] salves the wounds on [M]'s [affecting.display_name].", \
"\blue You salve the wounds on [M]'s [affecting.display_name]." )
- affecting.heal_damage(src.heal_brute, src.heal_burn, 0)
+ affecting.heal_damage(src.heal_brute, src.heal_burn, 0)
use(1)
else
if (can_operate(H)) //Checks if mob is lying down on table for surgery
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 6b4fc5a43bd..1d7e72fd1bc 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -12,7 +12,7 @@
if("stealth")
new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow(src)
- new /obj/item/weapon/pen/paralysis(src)
+ new /obj/item/weapon/pen/sleepy(src)
new /obj/item/device/chameleon(src)
return
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 86905b08b8a..fd68636f599 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -280,7 +280,7 @@ BLIND // can't see anything
name = "Space helmet"
icon_state = "space"
desc = "A special helmet designed for work in a hazardous, low-pressure environment."
- flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE
+ flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL
item_state = "s_helmet"
permeability_coefficient = 0.01
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
@@ -301,7 +301,7 @@ BLIND // can't see anything
w_class = 4//bulky item
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
- flags = STOPSPRESSUREDMAGE
+ flags = STOPSPRESSUREDMAGE | THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
slowdown = 2
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index c642aed8b20..2995df68f1a 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -198,6 +198,7 @@
w_class = 4//bulky item
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
+ flags = THICKMATERIAL
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
@@ -210,6 +211,7 @@
item_state = "swat_suit"
w_class = 4//bulky item
gas_transfer_coefficient = 0.90
+ flags = THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
slowdown = 3
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
@@ -218,6 +220,9 @@
/obj/item/clothing/suit/armor/tdome
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+ flags = THICKMATERIAL
+ cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+ heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
/obj/item/clothing/suit/armor/tdome/red
name = "Thunderdome suit (red)"
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 4527c6395c2..6764838430b 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -4,7 +4,7 @@
icon_state = "bio"
desc = "A hood that protects the head and face from biological comtaminants."
permeability_coefficient = 0.01
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
+ flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR | THICKMATERIAL
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
siemens_coefficient = 0.9
@@ -18,7 +18,7 @@
w_class = 4//bulky item
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
- flags = ONESIZEFITSALL
+ flags = ONESIZEFITSALL | THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
slowdown = 1.0
allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen)
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index ca86eb92755..08d3757a95f 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -21,7 +21,7 @@
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/extinguisher)
slowdown = 1.0
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
- flags = STOPSPRESSUREDMAGE
+ flags = STOPSPRESSUREDMAGE | THICKMATERIAL
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
@@ -55,7 +55,7 @@
name = "bomb hood"
desc = "Use in case of bomb."
icon_state = "bombsuit"
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
+ flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR | THICKMATERIAL
armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
cold_protection = HEAD
@@ -74,6 +74,7 @@
w_class = 4//bulky item
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
+ flags = THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
slowdown = 2
armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
@@ -102,7 +103,7 @@
name = "Radiation Hood"
icon_state = "rad"
desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation"
- flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
+ flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR|THICKMATERIAL
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100)
loose = 8
@@ -114,6 +115,7 @@
w_class = 4//bulky item
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
+ flags = THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen)
slowdown = 1.5
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 1435949c6a6..778f9079d59 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -42,7 +42,7 @@
// Set up DNA.
if(!delay_ready_dna)
dna.ready_dna(src)
-
+
/mob/living/carbon/human/dummy
real_name = "Test Dummy"
status_flags = GODMODE|CANPUSH
@@ -205,8 +205,8 @@
stat("Distribution Pressure", internal.distribute_pressure)
if(mind)
if(mind.changeling)
- stat("Chemical Storage", mind.changeling.chem_charges)
- stat("Genetic Damage Time", mind.changeling.geneticdamage)
+ stat("Chemical Storage", "[mind.changeling.chem_charges]/[mind.changeling.chem_storage]")
+ stat("Absorbed DNA", mind.changeling.absorbedcount)
if (istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)&&wear_suit:s_initialized)
stat("Energy Charge", (wear_suit:cell:charge))
@@ -539,8 +539,8 @@
if(id)
return id.rank ? id.rank : if_no_job
else
- return if_no_id
-
+ return if_no_id
+
//gets assignment from ID or ID inside PDA or PDA itself
//Useful when player do something with computers
/mob/living/carbon/human/proc/get_assignment(var/if_no_id = "No id", var/if_no_job = "No job")
@@ -1073,6 +1073,21 @@
xylophone=0
return
+/mob/living/carbon/human/can_inject(var/mob/user, var/error_msg, var/target_zone)
+ . = 1 // Default to returning true.
+ if(user && !target_zone)
+ target_zone = user.zone_sel.selecting
+ // If targeting the head, see if the head item is thin enough.
+ // If targeting anything else, see if the wear suit is thin enough.
+ if(above_neck(target_zone))
+ if(head && head.flags & THICKMATERIAL)
+ . = 0
+ else
+ if(wear_suit && wear_suit.flags & THICKMATERIAL)
+ . = 0
+ if(!. && error_msg && user)
+ // Might need re-wording.
+ user << "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"]."
/mob/living/carbon/human/proc/vomit(hairball=0)
if(stat==2)return
@@ -1301,7 +1316,7 @@
usr << "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]."
/mob/living/carbon/human/proc/set_species(var/new_species, var/force_organs, var/default_colour)
-
+
var/datum/species/oldspecies = species
if(!dna)
if(!new_species)
@@ -1318,26 +1333,26 @@
if(species.language)
remove_language(species.language)
-
+
if(species.default_language)
- remove_language(species.default_language)
-
+ remove_language(species.default_language)
+
species = all_species[new_species]
-
+
if(oldspecies)
if(oldspecies.default_genes.len)
oldspecies.handle_dna(src,1) // Remove any genes that belong to the old species
if(force_organs || !organs || !organs.len)
species.create_organs(src)
-
+
if(vessel)
vessel = null
make_blood()
if(species.language)
add_language(species.language)
-
+
if(species.default_language)
add_language(species.default_language)
@@ -1359,7 +1374,7 @@
r_skin = 0
g_skin = 0
b_skin = 0
-
+
if(!dna)
dna = new /datum/dna(null)
dna.species = species.name
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 1eb36aa0c19..9b46dbba82f 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -124,6 +124,11 @@
/mob/living/silicon/proc/damage_mob(var/brute = 0, var/fire = 0, var/tox = 0)
return
+/mob/living/silicon/can_inject(var/mob/user, var/error_msg)
+ if(error_msg)
+ user << "Their outer shell is too tough."
+ return 0
+
/mob/living/silicon/IsAdvancedToolUser()
return 1
@@ -207,7 +212,7 @@
show_emergency_shuttle_eta()
show_system_integrity()
show_malf_ai()
-
+
//Silicon mob language procs
/mob/living/silicon/can_speak(datum/language/speaking)
@@ -290,7 +295,7 @@
set category = "IC"
flavor_text = sanitize(copytext(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text, 1))
-
+
/mob/living/silicon/binarycheck()
return 1
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 4c5a6d09372..74ebd7eeefc 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -213,6 +213,13 @@ proc/hassensorlevel(A, var/level)
return zone
+/proc/above_neck(zone)
+ var/list/zones = list("head", "mouth", "eyes")
+ if(zones.Find(zone))
+ return 1
+ else
+ return 0
+
/proc/stars(n, pr)
if (pr == null)
pr = 25
@@ -491,4 +498,4 @@ var/list/intents = list("help","disarm","grab","harm")
else // Everyone else (dead people who didn't ghost yet, etc.)
lname = name
lname = "[lname] "
- M << "[lname][follow][message]"
+ M << "[lname][follow][message]"
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 6c96b62a328..6a6ffdc2d55 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -18,8 +18,8 @@
slot_flags = SLOT_BELT | SLOT_EARS
throwforce = 0
w_class = 1.0
- throw_speed = 7
- throw_range = 15
+ throw_speed = 3
+ throw_range = 7
m_amt = 10
var/colour = "black" //what colour the ink is!
pressure_resistance = 2
@@ -41,72 +41,37 @@
colour = "white"
-/obj/item/weapon/pen/attack(mob/M as mob, mob/user as mob)
- if(!ismob(M))
+/obj/item/weapon/pen/attack(mob/living/M, mob/user)
+ if(!istype(M))
return
- user << "You stab [M] with the pen."
-// M << "\red You feel a tiny prick!" //That's a whole lot of meta!
- M.attack_log += text("\[[time_stamp()]\] Has been stabbed with [name] by [user.name] ([user.ckey])")
- user.attack_log += text("\[[time_stamp()]\] Used the [name] to stab [M.name] ([M.ckey])")
- if(!iscarbon(user))
- M.LAssailant = null
- else
- M.LAssailant = user
- return
+ if(M.can_inject(user, 1))
+ user << "You stab [M] with the pen."
+// M << "You feel a tiny prick!"
+ . = 1
+
+ add_logs(user, M, "stabbed", object="[name]")
/*
- * Sleepy Pens
+ * Sleepypens
*/
-/obj/item/weapon/pen/sleepypen
- desc = "It's a black ink pen with a sharp point and a carefully engraved \"Waffle Co.\""
+/obj/item/weapon/pen/sleepy
flags = OPENCONTAINER
origin_tech = "materials=2;syndicate=5"
-/obj/item/weapon/pen/sleepypen/New()
- var/datum/reagents/R = new/datum/reagents(30) //Used to be 300
- reagents = R
- R.my_atom = src
- R.add_reagent("chloralhydrate", 22) //Used to be 100 sleep toxin//30 Chloral seems to be fatal, reducing it to 22./N
+/obj/item/weapon/pen/sleepy/attack(mob/living/M, mob/user)
+ if(!istype(M)) return
+
+ if(..())
+ if(reagents.total_volume)
+ if(M.reagents)
+ reagents.trans_to(M, 55)
+
+
+/obj/item/weapon/pen/sleepy/New()
+ create_reagents(55)
+ reagents.add_reagent("stoxin", 30)
+ reagents.add_reagent("mutetoxin", 15)
+ reagents.add_reagent("tirizene", 10)
..()
- return
-
-
-/obj/item/weapon/pen/sleepypen/attack(mob/M as mob, mob/user as mob)
- if(!ismob(M))
- return
- ..()
- msg_admin_attack("[user.name] ([user.ckey]) Used the [name] to stab [M.name] ([M.ckey]) (JMP)")
- if(reagents.total_volume)
- if(M.reagents) reagents.trans_to(M, 50) //used to be 150
- return
-
-
-/*
- * Parapens
- */
-/obj/item/weapon/pen/paralysis
- flags = OPENCONTAINER
- origin_tech = "materials=2;syndicate=5"
-
-
-/obj/item/weapon/pen/paralysis/New()
- var/datum/reagents/R = new/datum/reagents(55)
- reagents = R
- R.my_atom = src
- R.add_reagent("stoxin", 30)
- R.add_reagent("mutetoxin", 15)
- R.add_reagent("tirizene", 10)
- ..()
- return
-
-
-/obj/item/weapon/pen/paralysis/attack(mob/M as mob, mob/user as mob)
- if(!ismob(M))
- return
- ..()
- msg_admin_attack("[user.name] ([user.ckey]) Used the [name] to stab [M.name] ([M.ckey]) (JMP)")
- if(reagents.total_volume)
- if(M.reagents) reagents.trans_to(M, 55) //used to be 150
- return
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 27a669cf98f..bb634735667 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -125,6 +125,11 @@
/obj/item/ammo_casing/shotgun/dart/attackby()
return
+/obj/item/ammo_casing/syringegun
+ name = "syringe gun spring"
+ desc = "A high-power spring that throws syringes."
+ projectile_type = null
+
/obj/item/ammo_casing/shotgun/fakebeanbag
name = "beanbag shell"
desc = "A weak beanbag shell."
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index c45bb04a6b0..368ba27af2f 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -24,18 +24,24 @@
return
-/obj/item/weapon/gun/projectile/process_chambered()
+/obj/item/weapon/gun/projectile/process_chambered(var/eject_casing = 1, var/empty_chamber = 1)
// if(in_chamber)
// return 1
var/obj/item/ammo_casing/AC = chambered //Find chambered round
if(isnull(AC) || !istype(AC))
return 0
- AC.loc = get_turf(src) //Eject casing onto ground.
- AC.SpinAnimation(10, 1) //next gen special effects
- chambered = null
+ if(eject_casing)
+ AC.loc = get_turf(src) //Eject casing onto ground.
+ AC.SpinAnimation(10, 1) //next gen special effects
+ if(empty_chamber)
+ chambered = null
chamber_round()
if(AC.BB)
+ if(AC.reagents && AC.BB.reagents)
+ var/datum/reagents/casting_reagents = AC.reagents
+ casting_reagents.trans_to(AC.BB, casting_reagents.total_volume) //For chemical darts/bullets
+ casting_reagents.delete()
in_chamber = AC.BB //Load projectile into chamber.
AC.BB.loc = src //Set projectile loc to gun.
AC.update_icon()
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index d0dcee8fb2b..0e2c4d86611 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -12,18 +12,7 @@
return
/obj/item/weapon/gun/projectile/revolver/process_chambered()
- var/obj/item/ammo_casing/AC = chambered //Find chambered round
- if(isnull(AC) || !istype(AC))
- return 0
- chambered = null
- chamber_round()
- if(AC.BB)
- in_chamber = AC.BB //Load projectile into chamber.
- AC.BB.loc = src //Set projectile loc to gun.
- AC.BB = null
- AC.update_icon()
- return 1
- return 0
+ return ..(0, 1)
/obj/item/weapon/gun/projectile/revolver/attackby(var/obj/item/A as obj, mob/user as mob)
var/num_loaded = 0
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index a4c006512de..69ff0a8116a 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -36,21 +36,10 @@
/obj/item/weapon/gun/projectile/shotgun/process_chambered()
- var/obj/item/ammo_casing/AC = chambered //Find chambered round
- if(isnull(AC) || !istype(AC))
- return 0
- if(AC.BB)
- if(AC.reagents && AC.BB.reagents)
- var/datum/reagents/casting_reagents = AC.reagents
- casting_reagents.trans_to(AC.BB, casting_reagents.total_volume) //For chemical darts
- casting_reagents.delete()
- in_chamber = AC.BB //Load projectile into chamber.
- AC.BB.loc = src //Set projectile loc to gun.
- AC.BB = null
- AC.update_icon()
- return 1
- return 0
+ return ..(0, 0)
+/obj/item/weapon/gun/projectile/shotgun/chamber_round()
+ return
/obj/item/weapon/gun/projectile/shotgun/attack_self(mob/living/user as mob)
if(recentpump) return
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index a7a02867871..af9d5338d42 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -75,7 +75,7 @@
proj_hit = 1
qdel(src)
- proc/on_hit(var/atom/target, var/blocked = 0)
+ proc/on_hit(var/atom/target, var/blocked = 0, var/hit_zone)
if(!isliving(target)) return 0
if(isanimal(target)) return 0
var/mob/living/L = target
@@ -107,6 +107,12 @@
loc = A.loc
return 0// nope.avi
+ var/reagent_note
+ if(reagents && reagents.reagent_list)
+ reagent_note = " REAGENTS:"
+ for(var/datum/reagent/R in reagents.reagent_list)
+ reagent_note += R.id + " ("
+ reagent_note += num2text(R.volume) + ") "
//Lower accurancy/longer range tradeoff. Distance matters a lot here, so at
// close distance, actually RAISE the chance to hit.
var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
@@ -124,18 +130,18 @@
playsound(loc, hitsound, 20, 1, -1)
visible_message("\red [A.name] is hit by the [src.name] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
if(istype(firer, /mob))
- M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type]"
- firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type]"
+ M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type][reagent_note]"
+ firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type][reagent_note]"
if(M.ckey && chatlog_attacks)
- msg_admin_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src] (JMP)") //BS12 EDIT ALG
+ msg_admin_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src][reagent_note] (JMP)") //BS12 EDIT ALG
if(!iscarbon(firer))
M.LAssailant = null
else
M.LAssailant = firer
else
- M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src]"
+ M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src][reagent_note]"
if(M.ckey && chatlog_attacks)
- msg_admin_attack("UNKNOWN shot [M] ([M.ckey]) with a [src] (JMP)") //BS12 EDIT ALG
+ msg_admin_attack("UNKNOWN shot [M] ([M.ckey]) with a [src][reagent_note] (JMP)") //BS12 EDIT ALG
spawn(0)
if(A)
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 0c8fb7ec0fe..0cf1a336331 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -144,6 +144,8 @@
name = "dart"
icon_state = "cbbolt"
damage = 6
+ embed = 0
+ sharp = 0
New()
..()
diff --git a/code/modules/reagents/dartgun.dm b/code/modules/reagents/dartgun.dm
index 1381fa5b6d7..7760654c715 100644
--- a/code/modules/reagents/dartgun.dm
+++ b/code/modules/reagents/dartgun.dm
@@ -297,4 +297,17 @@
starting_chems = list("kelotane","bicaridine","anti_toxin")
/obj/item/weapon/gun/dartgun/vox/raider
- starting_chems = list("space_drugs","stoxin","impedrezene")
\ No newline at end of file
+ starting_chems = list("space_drugs","stoxin","impedrezene")
+
+/obj/effect/syringe_gun_dummy //moved this shitty thing here
+ name = ""
+ desc = ""
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "null"
+ anchored = 1
+ density = 0
+
+ New()
+ var/datum/reagents/R = new/datum/reagents(15)
+ reagents = R
+ R.my_atom = src
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 4d19e402f3d..e690f0ac52e 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -14,18 +14,19 @@
possible_transfer_amounts = list(1,2,3,4,5,10,15,20,25,30)
flags = OPENCONTAINER
slot_flags = SLOT_BELT
+ var/ignore_flags = 0
/obj/item/weapon/reagent_containers/hypospray/attack_paw(mob/user as mob)
return src.attack_hand(user)
-/obj/item/weapon/reagent_containers/hypospray/attack(mob/M as mob, mob/user as mob)
+/obj/item/weapon/reagent_containers/hypospray/attack(mob/living/M, mob/user)
if(!reagents.total_volume)
user << "\red [src] is empty."
return
- if (!( istype(M, /mob) ))
+ if(!istype(M))
return
- if (reagents.total_volume)
+ if(reagents.total_volume && (ignore_flags || M.can_inject(user, 1)))
user << "\blue You inject [M] with [src]."
M << "\red You feel a tiny prick!"
@@ -61,6 +62,7 @@
possible_transfer_amounts = list(10)
icon_state = "combat_hypo"
volume = 60
+ ignore_flags = 1 // So they can heal their comrades.
/obj/item/weapon/reagent_containers/hypospray/combat/New()
..()
@@ -75,6 +77,7 @@
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(10)
volume = 10
+ ignore_flags = 1 //so you can medipen through hardsuits
flags = null
/obj/item/weapon/reagent_containers/hypospray/autoinjector/New()
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 7ef798f86e5..34ae1e1d65c 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -55,6 +55,11 @@
if(!proximity) return
if(!target.reagents) return
+ if(isliving(target))
+ var/mob/living/M = target
+ if(!M.can_inject(user, 1))
+ return
+
if(mode == SYRINGE_BROKEN)
user << "\red This syringe is broken!"
return
diff --git a/code/modules/reagents/syringe_gun.dm b/code/modules/reagents/syringe_gun.dm
index d869c2b4899..7192eaf1c12 100644
--- a/code/modules/reagents/syringe_gun.dm
+++ b/code/modules/reagents/syringe_gun.dm
@@ -1,136 +1,67 @@
-
-
-
/obj/item/weapon/gun/syringe
name = "syringe gun"
- desc = "A spring loaded rifle designed to fit syringes, designed to incapacitate unruly patients from a distance."
- icon = 'icons/obj/gun.dmi'
+ desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance."
icon_state = "syringegun"
item_state = "syringegun"
- w_class = 3.0
+ w_class = 3
throw_speed = 2
throw_range = 10
- force = 4.0
- var/list/syringes = new/list()
- var/max_syringes = 1
+ force = 4
m_amt = 2000
+ clumsy_check = 0
+ fire_sound = 'sound/items/syringeproj.ogg'
+ var/list/syringes = list()
+ var/max_syringes = 1
+
+/obj/item/weapon/gun/syringe/process_chambered()
+ if(!syringes.len) return 0
+
+ var/obj/item/weapon/reagent_containers/syringe/S = syringes[1]
+
+ if(!S) return 0
+
+ in_chamber = new /obj/item/projectile/bullet/dart/syringe(src)
+ S.reagents.trans_to(in_chamber, S.reagents.total_volume)
+ in_chamber.name = S.name
+ syringes.Remove(S)
+
+ del(S)
+ return 1
/obj/item/weapon/gun/syringe/examine()
- set src in view()
..()
- if (!(usr in view(2)) && usr!=src.loc) return
- usr << "\blue [syringes.len] / [max_syringes] syringes."
+ usr << "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining."
+ return
-/obj/item/weapon/gun/syringe/attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I, /obj/item/weapon/reagent_containers/syringe))
- var/obj/item/weapon/reagent_containers/syringe/S = I
- if(S.mode != 2)//SYRINGE_BROKEN in syringes.dm
- if(syringes.len < max_syringes)
- user.drop_item()
- I.loc = src
- syringes += I
- user << "\blue You put the syringe in [src]."
- user << "\blue [syringes.len] / [max_syringes] syringes."
- else
- usr << "\red [src] cannot hold more syringes."
+/obj/item/weapon/gun/syringe/attack_self(mob/living/user as mob)
+ if(!syringes.len)
+ user << "[src] is empty."
+ return 0
+
+ var/obj/item/weapon/reagent_containers/syringe/S = syringes[syringes.len]
+
+ if(!S) return 0
+ S.loc = user.loc
+
+ syringes.Remove(S)
+ user << "You unload [S] from \the [src]!"
+
+ return 1
+
+/obj/item/weapon/gun/syringe/attackby(var/obj/item/A as obj, mob/user as mob, var/show_msg = 1)
+ if(istype(A, /obj/item/weapon/reagent_containers/syringe))
+ if(syringes.len < max_syringes)
+ user.drop_item()
+ user << "You load [A] into \the [src]!"
+ syringes.Add(A)
+ A.loc = src
+ return 1
else
- usr << "\red This syringe is broken!"
-
-
-/obj/item/weapon/gun/syringe/afterattack(obj/target, mob/user , flag)
- if(!isturf(target.loc) || target == user) return
- ..()
-
-/obj/item/weapon/gun/syringe/can_fire()
- return syringes.len
-
-/obj/item/weapon/gun/syringe/can_hit(var/mob/living/target as mob, var/mob/living/user as mob)
- return 1 //SHOOT AND LET THE GOD GUIDE IT (probably will hit a wall anyway)
-
-/obj/item/weapon/gun/syringe/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0)
- if(syringes.len)
- spawn(0) fire_syringe(target,user)
- else
- usr << "\red [src] is empty."
-
-/obj/item/weapon/gun/syringe/proc/fire_syringe(atom/target, mob/user)
- if (locate (/obj/structure/table, src.loc))
- return
- else
- var/turf/trg = get_turf(target)
- var/obj/effect/syringe_gun_dummy/D = new/obj/effect/syringe_gun_dummy(get_turf(src))
- var/obj/item/weapon/reagent_containers/syringe/S = syringes[1]
- if((!S) || (!S.reagents)) //ho boy! wot runtimes!
- return
- S.reagents.trans_to(D, S.reagents.total_volume)
- syringes -= S
- del(S)
- D.icon_state = "syringeproj"
- D.name = "syringe"
- playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
-
- for(var/i=0, i<6, i++)
- if(!D) break
- if(D.loc == trg) break
- step_towards(D,trg)
-
- if(D)
- for(var/mob/living/carbon/M in D.loc)
- if(!istype(M,/mob/living/carbon)) continue
- if(M == user) continue
- //Syringe gun attack logging by Yvarov
- var/R
- if(D.reagents)
- for(var/datum/reagent/A in D.reagents.reagent_list)
- R += A.id + " ("
- R += num2text(A.volume) + "),"
- if (istype(M, /mob))
- M.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])"
- user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a syringegun ([R])"
- if(M.ckey)
- msg_admin_attack("[user] ([user.ckey]) shot [M] ([M.ckey]) with a syringegun ([R]) (JMP)")
- if(!iscarbon(user))
- M.LAssailant = null
- else
- M.LAssailant = user
-
- else
- M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a syringegun ([R])"
- msg_admin_attack("UNKNOWN shot [M] ([M.ckey]) with a syringegun ([R]) (JMP)")
-
- if(D.reagents)
- D.reagents.trans_to(M, 15)
- M.visible_message("[M] is hit by the syringe!")
-
- del(D)
- break
- if(D)
- for(var/atom/A in D.loc)
- if(A == user) continue
- if(A.density) del(D)
-
- sleep(1)
-
- if (D) spawn(10) del(D)
-
- return
+ usr << "[src] cannot hold more syringes."
+ return 0
/obj/item/weapon/gun/syringe/rapidsyringe
name = "rapid syringe gun"
- desc = "A modification of the syringe gun design, using a rotating cylinder to store up to four syringes."
+ desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes."
icon_state = "rapidsyringegun"
- max_syringes = 4
-
-
-/obj/effect/syringe_gun_dummy
- name = ""
- desc = ""
- icon = 'icons/obj/chemical.dmi'
- icon_state = "null"
- anchored = 1
- density = 0
-
- New()
- var/datum/reagents/R = new/datum/reagents(15)
- reagents = R
- R.my_atom = src
\ No newline at end of file
+ max_syringes = 6
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/research/xenoarchaeology/finds/finds.dm
index 6b07fbb16a9..f657b006ccf 100644
--- a/code/modules/research/xenoarchaeology/finds/finds.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds.dm
@@ -250,7 +250,7 @@
if(prob(75))
new_item = new /obj/item/weapon/pen(src.loc)
else
- new_item = new /obj/item/weapon/pen/sleepypen(src.loc)
+ new_item = new /obj/item/weapon/pen/sleepy(src.loc)
if(prob(30))
apply_image_decorations = 1
if(16)
diff --git a/code/setup.dm b/code/setup.dm
index 5f23e47bca1..ff4d3f1abec 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -216,7 +216,8 @@ var/MAX_EX_FLASH_RANGE = 14
#define HEADBANGPROTECT 4096
#define EARBANGPROTECT 1024
-#define NOSLIP 1024 //prevents from slipping on wet floors, in space etc
+#define THICKMATERIAL 1024 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with NOSLIP)
+#define NOSLIP 1024 //prevents from slipping on wet floors, in space etc (NOTE: flag shared with THICKMATERIAL for external suits and helmet)
#define OPENCONTAINER 4096 // is an open container for chemistry purposes