diff --git a/code/citadel/dogborgstuff.dm b/code/citadel/dogborgstuff.dm
index 4f3eae0fb7..20f6cfd8c3 100644
--- a/code/citadel/dogborgstuff.dm
+++ b/code/citadel/dogborgstuff.dm
@@ -23,7 +23,6 @@
attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
w_class = 3
sharpness = IS_SHARP
- var/emagged = 0
/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
..()
@@ -173,7 +172,6 @@
icon_state = "synthtongue"
hitsound = 'sound/effects/attackblob.ogg'
cleanspeed = 80
- var/emagged = 0
/obj/item/soap/tongue/New()
..()
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index f1dde24690..96dcba36cf 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -35,10 +35,10 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
pressure_resistance = 4
var/obj/item/master = null
- var/heat_protection = 0 //flags_1 which determine which body parts are protected from heat. Use the HEAD, CHEST, GROIN, etc. flags_1. See setup.dm
- var/cold_protection = 0 //flags_1 which determine which body parts are protected from cold. Use the HEAD, CHEST, GROIN, etc. flags_1. See setup.dm
- var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags_1
- var/min_cold_protection_temperature //Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags_1
+ var/heat_protection = 0 //flags which determine which body parts are protected from heat. Use the HEAD, CHEST, GROIN, etc. flags. See setup.dm
+ var/cold_protection = 0 //flags which determine which body parts are protected from cold. Use the HEAD, CHEST, GROIN, etc. flags. See setup.dm
+ var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags
+ var/min_cold_protection_temperature //Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags
var/list/actions //list of /datum/action's that this item has.
var/list/actions_types //list of paths of action datums to give to the item on New().
@@ -48,7 +48,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/item_color = null //this needs deprecating, soonish
- var/body_parts_covered = 0 //see setup.dm for appropriate bit flags_1
+ var/body_parts_covered = 0 //see setup.dm for appropriate bit flags
//var/heat_transfer_coefficient = 1 //0 prevents all transfers, 1 is invisible
var/gas_transfer_coefficient = 1 // for leaking gas from turf to mask and vice-versa (for masks right now, but at some point, i'd like to include space helmets)
var/permeability_coefficient = 1 // for chemicals/diseases
@@ -64,6 +64,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/list/materials
var/origin_tech = null //Used by R&D to determine what research bonuses it grants.
var/needs_permit = 0 //Used by security bots to determine if this item is safe for public use.
+ var/emagged = FALSE
var/list/attack_verb //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]"
var/list/species_exception = null // list() of species types, if a species cannot put items in a certain slot, but species type is in list, it will be able to wear that item
@@ -86,7 +87,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER //The coefficient of multiplication for the damage removing this without surgery causes (this*w_class)
var/embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME //A time in ticks, multiplied by the w_class.
- var/flags_cover = 0 //for flags_1 such as GLASSESCOVERSEYES
+ var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES
var/heat = 0
var/sharpness = IS_BLUNT
var/toolspeed = 1
@@ -128,6 +129,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
if(force_string)
force_string_override = TRUE
+ if(!hitsound)
+ if(damtype == "fire")
+ hitsound = 'sound/items/welder.ogg'
+ if(damtype == "brute")
+ hitsound = "swing_hit"
+
/obj/item/Destroy()
flags_1 &= ~DROPDEL_1 //prevent reqdels
if(ismob(loc))
diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm
index 42ba5a8c2f..9b0251e8dc 100644
--- a/code/game/objects/items/RSF.dm
+++ b/code/game/objects/items/RSF.dm
@@ -123,7 +123,6 @@ RSF
var/toxin = 0
var/cooldown = 0
var/cooldowndelay = 10
- var/emagged = FALSE
w_class = WEIGHT_CLASS_NORMAL
/obj/item/cookiesynth/examine(mob/user)
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 9045159f24..5595500bb7 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -1,790 +1,789 @@
-//cleansed 9/15/2012 17:48
-
-/*
-CONTAINS:
-MATCHES
-CIGARETTES
-CIGARS
-SMOKING PIPES
-CHEAP LIGHTERS
-ZIPPO
-
-CIGARETTE PACKETS ARE IN FANCY.DM
-*/
-
-///////////
-//MATCHES//
-///////////
-/obj/item/match
- name = "match"
- desc = "A simple match stick, used for lighting fine smokables."
- icon = 'icons/obj/cigarettes.dmi'
- icon_state = "match_unlit"
- var/lit = FALSE
- var/burnt = FALSE
- var/smoketime = 5
- w_class = WEIGHT_CLASS_TINY
- origin_tech = "materials=1"
- heat = 1000
-
-/obj/item/match/process()
- smoketime--
- if(smoketime < 1)
- matchburnout()
- else
- open_flame(heat)
-
-/obj/item/match/fire_act(exposed_temperature, exposed_volume)
- matchignite()
-
-/obj/item/match/proc/matchignite()
- if(!lit && !burnt)
- lit = TRUE
- icon_state = "match_lit"
- damtype = "fire"
- force = 3
- hitsound = 'sound/items/welder.ogg'
- item_state = "cigon"
- name = "lit match"
- desc = "A match. This one is lit."
- attack_verb = list("burnt","singed")
- START_PROCESSING(SSobj, src)
- update_icon()
-
-/obj/item/match/proc/matchburnout()
- if(lit)
- lit = FALSE
- burnt = TRUE
- damtype = "brute"
- force = initial(force)
- icon_state = "match_burnt"
- item_state = "cigoff"
- name = "burnt match"
- desc = "A match. This one has seen better days."
- attack_verb = list("flicked")
- STOP_PROCESSING(SSobj, src)
-
-/obj/item/match/dropped(mob/user)
- matchburnout()
- . = ..()
-
-/obj/item/match/attack(mob/living/carbon/M, mob/living/carbon/user)
- if(!isliving(M))
- return
- if(lit && M.IgniteMob())
- message_admins("[key_name_admin(user)] set [key_name_admin(M)] on fire")
- log_game("[key_name(user)] set [key_name(M)] on fire")
- var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
- if(lit && cig && user.a_intent == INTENT_HELP)
- if(cig.lit)
- to_chat(user, "The [cig.name] is already lit.")
- if(M == user)
- cig.attackby(src, user)
- else
- cig.light("[user] holds the [name] out for [M], and lights the [cig.name].")
- else
- ..()
-
-/obj/item/proc/help_light_cig(mob/living/M)
- var/mask_item = M.get_item_by_slot(slot_wear_mask)
- if(istype(mask_item, /obj/item/clothing/mask/cigarette))
- return mask_item
-
-/obj/item/match/is_hot()
- return lit * heat
-
-//////////////////
-//FINE SMOKABLES//
-//////////////////
-/obj/item/clothing/mask/cigarette
- name = "cigarette"
- desc = "A roll of tobacco and nicotine."
- icon_state = "cigoff"
- throw_speed = 0.5
- item_state = "cigoff"
- container_type = INJECTABLE_1
- w_class = WEIGHT_CLASS_TINY
- body_parts_covered = null
- var/lit = FALSE
- var/starts_lit = FALSE
- var/icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi
- var/icon_off = "cigoff"
- var/type_butt = /obj/item/cigbutt
- var/lastHolder = null
- var/smoketime = 300
- var/chem_volume = 30
- var/list/list_reagents = list("nicotine" = 15)
- heat = 1000
-
-/obj/item/clothing/mask/cigarette/suicide_act(mob/user)
- user.visible_message("[user] is huffing [src] as quickly as [user.p_they()] can! It looks like [user.p_theyre()] trying to give [user.p_them()]self cancer.")
- return (TOXLOSS|OXYLOSS)
-
-/obj/item/clothing/mask/cigarette/Initialize()
- ..()
- create_reagents(chem_volume)
- reagents.set_reacting(FALSE) // so it doesn't react until you light it
- if(list_reagents)
- reagents.add_reagent_list(list_reagents)
- if(starts_lit)
- light()
-
-/obj/item/clothing/mask/cigarette/Destroy()
- STOP_PROCESSING(SSobj, src)
- . = ..()
-
-/obj/item/clothing/mask/cigarette/attackby(obj/item/W, mob/user, params)
- if(!lit && smoketime > 0)
- var/lighting_text = W.ignition_effect(src, user)
- if(lighting_text)
- light(lighting_text)
- else
- return ..()
-
-/obj/item/clothing/mask/cigarette/afterattack(obj/item/reagent_containers/glass/glass, mob/user, proximity)
- if(!proximity || lit) //can't dip if cigarette is lit (it will heat the reagents in the glass instead)
- return
- if(istype(glass)) //you can dip cigarettes into beakers
- if(glass.reagents.trans_to(src, chem_volume)) //if reagents were transfered, show the message
- to_chat(user, "You dip \the [src] into \the [glass].")
- else //if not, either the beaker was empty, or the cigarette was full
- if(!glass.reagents.total_volume)
- to_chat(user, "[glass] is empty.")
- else
- to_chat(user, "[src] is full.")
-
-
-/obj/item/clothing/mask/cigarette/proc/light(flavor_text = null)
- if(lit)
- return
-
- lit = TRUE
- name = "lit [name]"
- attack_verb = list("burnt", "singed")
- hitsound = 'sound/items/welder.ogg'
- damtype = "fire"
- force = 4
- if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire
- var/datum/effect_system/reagents_explosion/e = new()
- e.set_up(round(reagents.get_reagent_amount("plasma") / 2.5, 1), get_turf(src), 0, 0)
- e.start()
- qdel(src)
- return
- if(reagents.get_reagent_amount("welding_fuel")) // the fuel explodes, too, but much less violently
- var/datum/effect_system/reagents_explosion/e = new()
- e.set_up(round(reagents.get_reagent_amount("welding_fuel") / 5, 1), get_turf(src), 0, 0)
- e.start()
- qdel(src)
- return
- // allowing reagents to react after being lit
- reagents.set_reacting(TRUE)
- reagents.handle_reactions()
- icon_state = icon_on
- item_state = icon_on
- if(flavor_text)
- var/turf/T = get_turf(src)
- T.visible_message(flavor_text)
- START_PROCESSING(SSobj, src)
-
- //can't think of any other way to update the overlays :<
- if(ismob(loc))
- var/mob/M = loc
- M.update_inv_wear_mask()
- M.update_inv_hands()
-
-
-/obj/item/clothing/mask/cigarette/proc/handle_reagents()
- if(reagents.total_volume)
- if(iscarbon(loc))
- var/mob/living/carbon/C = loc
- if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob
- if(prob(15)) // so it's not an instarape in case of acid
- var/fraction = min(REAGENTS_METABOLISM/reagents.total_volume, 1)
- reagents.reaction(C, INGEST, fraction)
- if(!reagents.trans_to(C, REAGENTS_METABOLISM))
- reagents.remove_any(REAGENTS_METABOLISM)
- return
- reagents.remove_any(REAGENTS_METABOLISM)
-
-
-/obj/item/clothing/mask/cigarette/process()
- var/turf/location = get_turf(src)
- var/mob/living/M = loc
- if(isliving(loc))
- M.IgniteMob()
- smoketime--
- if(smoketime < 1)
- new type_butt(location)
- if(ismob(loc))
- to_chat(M, "Your [name] goes out.")
- qdel(src)
- return
- open_flame()
- if(reagents && reagents.total_volume)
- handle_reagents()
-
-/obj/item/clothing/mask/cigarette/attack_self(mob/user)
- if(lit)
- user.visible_message("[user] calmly drops and treads on \the [src], putting it out instantly.")
- new type_butt(user.loc)
- new /obj/effect/decal/cleanable/ash(user.loc)
- qdel(src)
- . = ..()
-
-/obj/item/clothing/mask/cigarette/attack(mob/living/carbon/M, mob/living/carbon/user)
- if(!istype(M))
- return ..()
- var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
- if(lit && cig && user.a_intent == INTENT_HELP)
- if(cig.lit)
- to_chat(user, "The [cig.name] is already lit.")
- if(M == user)
- cig.attackby(src, user)
- else
- cig.light("[user] holds the [name] out for [M], and lights the [cig.name].")
- else
- return ..()
-
-/obj/item/clothing/mask/cigarette/fire_act(exposed_temperature, exposed_volume)
- light()
-
-/obj/item/clothing/mask/cigarette/is_hot()
- return lit * heat
-
-// Cigarette brands.
-
-/obj/item/clothing/mask/cigarette/space_cigarette
- desc = "A Space Cigarette brand cigarette."
-
-/obj/item/clothing/mask/cigarette/dromedary
- desc = "A DromedaryCo brand cigarette."
-
-/obj/item/clothing/mask/cigarette/uplift
- desc = "An Uplift Smooth brand cigarette."
- list_reagents = list("nicotine" = 7.5, "menthol" = 7.5)
-
-/obj/item/clothing/mask/cigarette/robust
- desc = "A Robust brand cigarette."
-
-/obj/item/clothing/mask/cigarette/robustgold
- desc = "A Robust Gold brand cigarette."
- list_reagents = list("nicotine" = 15, "gold" = 1)
-
-/obj/item/clothing/mask/cigarette/carp
- desc = "A Carp Classic brand cigarette."
-
-/obj/item/clothing/mask/cigarette/syndicate
- desc = "An unknown brand cigarette."
- list_reagents = list("nicotine" = 15, "omnizine" = 15)
-
-/obj/item/clothing/mask/cigarette/shadyjims
- desc = "A Shady Jim's Super Slims cigarette."
- list_reagents = list("nicotine" = 15, "lipolicide" = 4, "ammonia" = 2, "plantbgone" = 1, "toxin" = 1.5)
-
-// Rollies.
-
-/obj/item/clothing/mask/cigarette/rollie
- name = "rollie"
- desc = "A roll of dried plant matter wrapped in thin paper."
- icon_state = "spliffoff"
- icon_on = "spliffon"
- icon_off = "spliffoff"
- type_butt = /obj/item/cigbutt/roach
- throw_speed = 0.5
- item_state = "spliffoff"
- smoketime = 180
- chem_volume = 50
-
-/obj/item/clothing/mask/cigarette/rollie/New()
- ..()
- src.pixel_x = rand(-5, 5)
- src.pixel_y = rand(-5, 5)
-
-/obj/item/clothing/mask/cigarette/rollie/trippy
- list_reagents = list("nicotine" = 15, "mushroomhallucinogen" = 35)
- starts_lit = TRUE
-
-/obj/item/cigbutt/roach
- name = "roach"
- desc = "A manky old roach, or for non-stoners, a used rollup."
- icon_state = "roach"
-
-/obj/item/cigbutt/roach/New()
- ..()
- src.pixel_x = rand(-5, 5)
- src.pixel_y = rand(-5, 5)
-
-
-////////////
-// CIGARS //
-////////////
-/obj/item/clothing/mask/cigarette/cigar
- name = "premium cigar"
- desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!"
- icon_state = "cigaroff"
- icon_on = "cigaron"
- icon_off = "cigaroff"
- type_butt = /obj/item/cigbutt/cigarbutt
- throw_speed = 0.5
- item_state = "cigaroff"
- smoketime = 1500
- chem_volume = 40
-
-/obj/item/clothing/mask/cigarette/cigar/cohiba
- name = "\improper Cohiba Robusto cigar"
- desc = "There's little more you could want from a cigar."
- icon_state = "cigar2off"
- icon_on = "cigar2on"
- icon_off = "cigar2off"
- smoketime = 2000
- chem_volume = 80
-
-
-/obj/item/clothing/mask/cigarette/cigar/havana
- name = "premium Havanian cigar"
- desc = "A cigar fit for only the best of the best."
- icon_state = "cigar2off"
- icon_on = "cigar2on"
- icon_off = "cigar2off"
- smoketime = 7200
- chem_volume = 50
-
-/obj/item/cigbutt
- name = "cigarette butt"
- desc = "A manky old cigarette butt."
- icon = 'icons/obj/clothing/masks.dmi'
- icon_state = "cigbutt"
- w_class = WEIGHT_CLASS_TINY
- throwforce = 0
-
-/obj/item/cigbutt/cigarbutt
- name = "cigar butt"
- desc = "A manky old cigar butt."
- icon_state = "cigarbutt"
-
-/////////////////
-//SMOKING PIPES//
-/////////////////
-/obj/item/clothing/mask/cigarette/pipe
- name = "smoking pipe"
- desc = "A pipe, for smoking. Probably made of meershaum or something."
- icon_state = "pipeoff"
- item_state = "pipeoff"
- icon_on = "pipeon" //Note - these are in masks.dmi
- icon_off = "pipeoff"
- smoketime = 0
- chem_volume = 100
- list_reagents = null
- var/packeditem = 0
-
-/obj/item/clothing/mask/cigarette/pipe/Initialize()
- ..()
- name = "empty [initial(name)]"
-
-/obj/item/clothing/mask/cigarette/pipe/Destroy()
- STOP_PROCESSING(SSobj, src)
- . = ..()
-
-/obj/item/clothing/mask/cigarette/pipe/process()
- var/turf/location = get_turf(src)
- smoketime--
- if(smoketime < 1)
- new /obj/effect/decal/cleanable/ash(location)
- if(ismob(loc))
- var/mob/living/M = loc
- to_chat(M, "Your [name] goes out.")
- lit = 0
- icon_state = icon_off
- item_state = icon_off
- M.update_inv_wear_mask()
- packeditem = 0
- name = "empty [initial(name)]"
- STOP_PROCESSING(SSobj, src)
- return
- open_flame()
- if(reagents && reagents.total_volume) // check if it has any reagents at all
- handle_reagents()
-
-
-/obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/O, mob/user, params)
- if(istype(O, /obj/item/reagent_containers/food/snacks/grown))
- var/obj/item/reagent_containers/food/snacks/grown/G = O
- if(!packeditem)
- if(G.dry == 1)
- to_chat(user, "You stuff [O] into [src].")
- smoketime = 400
- packeditem = 1
- name = "[O.name]-packed [initial(name)]"
- if(O.reagents)
- O.reagents.trans_to(src, O.reagents.total_volume)
- qdel(O)
- else
- to_chat(user, "It has to be dried first!")
- else
- to_chat(user, "It is already packed!")
- else
- var/lighting_text = O.ignition_effect(src,user)
- if(lighting_text)
- if(smoketime > 0)
- light(lighting_text)
- else
- to_chat(user, "There is nothing to smoke!")
- else
- return ..()
-
-/obj/item/clothing/mask/cigarette/pipe/attack_self(mob/user)
- var/turf/location = get_turf(user)
- if(lit)
- user.visible_message("[user] puts out [src].", "You put out [src].")
- lit = 0
- icon_state = icon_off
- item_state = icon_off
- STOP_PROCESSING(SSobj, src)
- return
- if(!lit && smoketime > 0)
- to_chat(user, "You empty [src] onto [location].")
- new /obj/effect/decal/cleanable/ash(location)
- packeditem = 0
- smoketime = 0
- reagents.clear_reagents()
- name = "empty [initial(name)]"
- return
-
-/obj/item/clothing/mask/cigarette/pipe/cobpipe
- name = "corn cob pipe"
- desc = "A nicotine delivery system popularized by folksy backwoodsmen and kept popular in the modern age and beyond by space hipsters. Can be loaded with objects."
- icon_state = "cobpipeoff"
- item_state = "cobpipeoff"
- icon_on = "cobpipeon" //Note - these are in masks.dmi
- icon_off = "cobpipeoff"
- smoketime = 0
-
-
-/////////
-//ZIPPO//
-/////////
-/obj/item/lighter
- name = "\improper Zippo lighter"
- desc = "The zippo."
- icon = 'icons/obj/cigarettes.dmi'
- icon_state = "zippo"
- item_state = "zippo"
- w_class = WEIGHT_CLASS_TINY
- flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
- var/lit = 0
- var/fancy = TRUE
- heat = 1500
- resistance_flags = FIRE_PROOF
- light_color = LIGHT_COLOR_FIRE
-
-/obj/item/lighter/update_icon()
- if(lit)
- icon_state = "[initial(icon_state)]_on"
- else
- icon_state = "[initial(icon_state)]"
-
-/obj/item/lighter/ignition_effect(atom/A, mob/user)
- if(is_hot())
- . = "With a single flick of their wrist, [user] smoothly lights [A] with [src]. Damn [user.p_theyre()] cool."
-
-/obj/item/lighter/proc/set_lit(new_lit)
- lit = new_lit
- if(lit)
- force = 5
- damtype = "fire"
- hitsound = 'sound/items/welder.ogg'
- attack_verb = list("burnt", "singed")
- set_light(1)
- START_PROCESSING(SSobj, src)
- else
- hitsound = "swing_hit"
- force = 0
- attack_verb = null //human_defense.dm takes care of it
- set_light(0)
- STOP_PROCESSING(SSobj, src)
- update_icon()
-
-/obj/item/lighter/attack_self(mob/living/user)
- if(user.is_holding(src))
- if(!lit)
- set_lit(TRUE)
- if(fancy)
- user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.", "Without even breaking stride, you flip open and lights [src] in one smooth movement.")
- else
- var/prot = FALSE
- var/mob/living/carbon/human/H = user
-
- if(istype(H) && H.gloves)
- var/obj/item/clothing/gloves/G = H.gloves
- if(G.max_heat_protection_temperature)
- prot = (G.max_heat_protection_temperature > 360)
- else
- prot = TRUE
-
- if(prot || prob(75))
- user.visible_message("After a few attempts, [user] manages to light [src].", "After a few attempts, you manage to light [src].")
- else
- var/hitzone = user.held_index_to_dir(user.active_hand_index) == "r" ? "r_hand" : "l_hand"
- user.apply_damage(5, BURN, hitzone)
- user.visible_message("After a few attempts, [user] manages to light [src] - however, [user.p_they()] burn their finger in the process.", "You burn yourself while lighting the lighter!")
-
- else
- set_lit(FALSE)
- if(fancy)
- user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow.", "You quietly shut off [src] without even looking at what you're doing. Wow.")
- else
- user.visible_message("[user] quietly shuts off [src].", "You quietly shut off [src].")
- else
- . = ..()
-
-/obj/item/lighter/attack(mob/living/carbon/M, mob/living/carbon/user)
- if(lit && M.IgniteMob())
- message_admins("[key_name_admin(user)] set [key_name_admin(M)] on fire")
- log_game("[key_name(user)] set [key_name(M)] on fire")
- var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
- if(lit && cig && user.a_intent == INTENT_HELP)
- if(cig.lit)
- to_chat(user, "The [cig.name] is already lit.")
- if(M == user)
- cig.attackby(src, user)
- else
- if(fancy)
- cig.light("[user] whips the [name] out and holds it for [M]. [user.p_their(TRUE)] arm is as steady as the unflickering flame they light \the [cig] with.")
- else
- cig.light("[user] holds the [name] out for [M], and lights the [cig.name].")
- else
- ..()
-
-/obj/item/lighter/process()
- open_flame()
-
-/obj/item/lighter/is_hot()
- return lit * heat
-
-
-/obj/item/lighter/greyscale
- name = "cheap lighter"
- desc = "A cheap-as-free lighter."
- icon_state = "lighter"
- fancy = FALSE
-
-/obj/item/lighter/greyscale/Initialize()
- . = ..()
- add_atom_colour(color2hex(randomColor(1)), FIXED_COLOUR_PRIORITY)
- update_icon()
-
-/obj/item/lighter/greyscale/update_icon()
- cut_overlays()
- var/mutable_appearance/base_overlay = mutable_appearance(icon,"[initial(icon_state)]_base")
- base_overlay.appearance_flags = RESET_COLOR //the edging doesn't change color
- if(lit)
- base_overlay.icon_state = "[initial(icon_state)]_on"
- add_overlay(base_overlay)
-
-/obj/item/lighter/greyscale/ignition_effect(atom/A, mob/user)
- if(is_hot())
- . = "After some fiddling, [user] manages to light [A] with [src]."
-
-
-///////////
-//ROLLING//
-///////////
-/obj/item/rollingpaper
- name = "rolling paper"
- desc = "A thin piece of paper used to make fine smokeables."
- icon = 'icons/obj/cigarettes.dmi'
- icon_state = "cig_paper"
- w_class = WEIGHT_CLASS_TINY
-
-/obj/item/rollingpaper/afterattack(atom/target, mob/user, proximity)
- if(!proximity)
- return
- if(istype(target, /obj/item/reagent_containers/food/snacks/grown))
- var/obj/item/reagent_containers/food/snacks/grown/O = target
- if(O.dry)
- var/obj/item/clothing/mask/cigarette/rollie/R = new /obj/item/clothing/mask/cigarette/rollie(user.loc)
- R.chem_volume = target.reagents.total_volume
- target.reagents.trans_to(R, R.chem_volume)
- qdel(target)
- qdel(src)
- user.put_in_active_hand(R)
- to_chat(user, "You roll the [target.name] into a rolling paper.")
- R.desc = "Dried [target.name] rolled up in a thin piece of paper."
- else
- to_chat(user, "You need to dry this first!")
- else
- ..()
-
-///////////////
-//VAPE NATION//
-///////////////
-/obj/item/clothing/mask/vape
- name = "E-Cigarette"
- desc = "A classy and highly sophisticated electronic cigarette, for classy and dignified gentlemen. A warning label reads \"Warning: Do not fill with flammable materials.\""//<<< i'd vape to that.
- icon = 'icons/obj/clothing/masks.dmi'
- icon_state = null
- item_state = null
- w_class = WEIGHT_CLASS_TINY
- var/chem_volume = 100
- var/vapetime = 0 //this so it won't puff out clouds every tick
- var/screw = 0 // kinky
- var/super = 0 //for the fattest vapes dude.
- var/emagged = FALSE //LET THE GRIEF BEGIN
-
-/obj/item/clothing/mask/vape/suicide_act(mob/user)
- user.visible_message("[user] is puffin hard on dat vape, [user.p_they()] trying to join the vape life on a whole notha plane!")//it doesn't give you cancer, it is cancer
- return (TOXLOSS|OXYLOSS)
-
-
-/obj/item/clothing/mask/vape/Initialize(mapload, param_color)
- . = ..()
- create_reagents(chem_volume)
- reagents.set_reacting(FALSE) // so it doesn't react until you light it
- reagents.add_reagent("nicotine", 50)
- if(!icon_state)
- if(!param_color)
- param_color = pick("red","blue","black","white","green","purple","yellow","orange")
- icon_state = "[param_color]_vape"
- item_state = "[param_color]_vape"
-
-/obj/item/clothing/mask/vape/attackby(obj/item/O, mob/user, params)
- if(istype(O, /obj/item/reagent_containers) && (O.container_type & OPENCONTAINER_1))
- if(reagents.total_volume < chem_volume)
- if(O.reagents.total_volume > 0)
- O.reagents.trans_to(src,25)
- to_chat(user, "You add the contents of [O] to the [src]")
- else
- to_chat(user, "The [O] is empty!")
- else
- to_chat(user, "[src] can't hold anymore reagents!")
-
- if(istype(O, /obj/item/screwdriver))
- if(!screw)
- screw = 1
- to_chat(user, "You open the cap on the [src]")
- if(super)
- add_overlay("vapeopen_med")
- else
- add_overlay("vapeopen_low")
- else
- screw = 0
- to_chat(user, "You close the cap on the [src]")
- cut_overlays()
-
- if(istype(O, /obj/item/device/multitool))
- if(screw && !emagged)//also kinky
- if(!super)
- cut_overlays()
- super = 1
- to_chat(user, "You increase the voltage in the [src]")
- add_overlay("vapeopen_med")
- else
- cut_overlays()
- super = 0
- to_chat(user, "You decrease the voltage in the [src]")
- add_overlay("vapeopen_low")
-
- if(screw && emagged)
- to_chat(user, "The [name] can't be modified!")
-
-
-/obj/item/clothing/mask/vape/emag_act(mob/user)// I WON'T REGRET WRITTING THIS, SURLY.
- if(screw)
- if(!emagged)
- cut_overlays()
- emagged = TRUE
- super = 0
- to_chat(user, "You maximize the voltage in the [src]")
- add_overlay("vapeopen_high")
- var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect
- sp.set_up(5, 1, src)
- sp.start()
- else
- to_chat(user, "The [name] is already emagged!")
- else
- to_chat(user, "You need to open the cap to do that")
-
-/obj/item/clothing/mask/vape/attack_self(mob/user)
- if(reagents.total_volume > 0)
- to_chat(user, "you empty [src] of all reagents.")
- reagents.clear_reagents()
- return
-
-/obj/item/clothing/mask/vape/equipped(mob/user, slot)
- if(slot == slot_wear_mask)
- if(!screw)
- to_chat(user, "You start puffing on the vape.")
- reagents.set_reacting(TRUE)
- START_PROCESSING(SSobj, src)
- else //it will not start if the vape is opened.
- to_chat(user, "You need to close the cap first!")
-
-/obj/item/clothing/mask/vape/dropped(mob/user)
- var/mob/living/carbon/C = user
- if(C.get_item_by_slot(slot_wear_mask) == src)
- reagents.set_reacting(FALSE)
- STOP_PROCESSING(SSobj, src)
-
-/obj/item/clothing/mask/vape/proc/hand_reagents()//had to rename to avoid duplicate error
- if(reagents.total_volume)
- if(iscarbon(loc))
- var/mob/living/carbon/C = loc
- if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob
- var/fraction = min(REAGENTS_METABOLISM/reagents.total_volume, 1) //this will react instantly, making them a little more dangerous than cigarettes
- reagents.reaction(C, INGEST, fraction)
- if(!reagents.trans_to(C, REAGENTS_METABOLISM))
- reagents.remove_any(REAGENTS_METABOLISM)
- if(reagents.get_reagent_amount("welding_fuel"))
- //HOT STUFF
- C.fire_stacks = 2
- C.IgniteMob()
-
- if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire
- var/datum/effect_system/reagents_explosion/e = new()
- e.set_up(round(reagents.get_reagent_amount("plasma") / 2.5, 1), get_turf(src), 0, 0)
- e.start()
- qdel(src)
- return
- reagents.remove_any(REAGENTS_METABOLISM)
-
-/obj/item/clothing/mask/vape/process()
- var/mob/living/M = loc
-
- if(isliving(loc))
- M.IgniteMob()
-
- vapetime++
-
- if(!reagents.total_volume)
- if(ismob(loc))
- to_chat(M, "The [name] is empty!")
- STOP_PROCESSING(SSobj, src)
- //it's reusable so it won't unequip when empty
- return
- //open flame removed because vapes are a closed system, they wont light anything on fire
-
- if(super && vapetime > 3)//Time to start puffing those fat vapes, yo.
- var/datum/effect_system/smoke_spread/chem/s = new
- s.set_up(reagents, 1, loc, silent=TRUE)
- s.start()
- vapetime = 0
-
- if(emagged && vapetime > 3)
- var/datum/effect_system/smoke_spread/chem/s = new
- s.set_up(reagents, 4, loc, silent=TRUE)
- s.start()
- vapetime = 0
- if(prob(5))//small chance for the vape to break and deal damage if it's emagged
- playsound(get_turf(src), 'sound/effects/pop_expl.ogg', 50, 0)
- M.apply_damage(20, BURN, "head")
- M.Knockdown(300, 1, 0)
- var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread
- sp.set_up(5, 1, src)
- sp.start()
- to_chat(M, "The [name] suddenly explodes in your mouth!")
- qdel(src)
- return
-
- if(reagents && reagents.total_volume)
- hand_reagents()
+//cleansed 9/15/2012 17:48
+
+/*
+CONTAINS:
+MATCHES
+CIGARETTES
+CIGARS
+SMOKING PIPES
+CHEAP LIGHTERS
+ZIPPO
+
+CIGARETTE PACKETS ARE IN FANCY.DM
+*/
+
+///////////
+//MATCHES//
+///////////
+/obj/item/match
+ name = "match"
+ desc = "A simple match stick, used for lighting fine smokables."
+ icon = 'icons/obj/cigarettes.dmi'
+ icon_state = "match_unlit"
+ var/lit = FALSE
+ var/burnt = FALSE
+ var/smoketime = 5
+ w_class = WEIGHT_CLASS_TINY
+ origin_tech = "materials=1"
+ heat = 1000
+
+/obj/item/match/process()
+ smoketime--
+ if(smoketime < 1)
+ matchburnout()
+ else
+ open_flame(heat)
+
+/obj/item/match/fire_act(exposed_temperature, exposed_volume)
+ matchignite()
+
+/obj/item/match/proc/matchignite()
+ if(!lit && !burnt)
+ lit = TRUE
+ icon_state = "match_lit"
+ damtype = "fire"
+ force = 3
+ hitsound = 'sound/items/welder.ogg'
+ item_state = "cigon"
+ name = "lit match"
+ desc = "A match. This one is lit."
+ attack_verb = list("burnt","singed")
+ START_PROCESSING(SSobj, src)
+ update_icon()
+
+/obj/item/match/proc/matchburnout()
+ if(lit)
+ lit = FALSE
+ burnt = TRUE
+ damtype = "brute"
+ force = initial(force)
+ icon_state = "match_burnt"
+ item_state = "cigoff"
+ name = "burnt match"
+ desc = "A match. This one has seen better days."
+ attack_verb = list("flicked")
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/match/dropped(mob/user)
+ matchburnout()
+ . = ..()
+
+/obj/item/match/attack(mob/living/carbon/M, mob/living/carbon/user)
+ if(!isliving(M))
+ return
+ if(lit && M.IgniteMob())
+ message_admins("[key_name_admin(user)] set [key_name_admin(M)] on fire")
+ log_game("[key_name(user)] set [key_name(M)] on fire")
+ var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
+ if(lit && cig && user.a_intent == INTENT_HELP)
+ if(cig.lit)
+ to_chat(user, "The [cig.name] is already lit.")
+ if(M == user)
+ cig.attackby(src, user)
+ else
+ cig.light("[user] holds the [name] out for [M], and lights the [cig.name].")
+ else
+ ..()
+
+/obj/item/proc/help_light_cig(mob/living/M)
+ var/mask_item = M.get_item_by_slot(slot_wear_mask)
+ if(istype(mask_item, /obj/item/clothing/mask/cigarette))
+ return mask_item
+
+/obj/item/match/is_hot()
+ return lit * heat
+
+//////////////////
+//FINE SMOKABLES//
+//////////////////
+/obj/item/clothing/mask/cigarette
+ name = "cigarette"
+ desc = "A roll of tobacco and nicotine."
+ icon_state = "cigoff"
+ throw_speed = 0.5
+ item_state = "cigoff"
+ container_type = INJECTABLE_1
+ w_class = WEIGHT_CLASS_TINY
+ body_parts_covered = null
+ var/lit = FALSE
+ var/starts_lit = FALSE
+ var/icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi
+ var/icon_off = "cigoff"
+ var/type_butt = /obj/item/cigbutt
+ var/lastHolder = null
+ var/smoketime = 300
+ var/chem_volume = 30
+ var/list/list_reagents = list("nicotine" = 15)
+ heat = 1000
+
+/obj/item/clothing/mask/cigarette/suicide_act(mob/user)
+ user.visible_message("[user] is huffing [src] as quickly as [user.p_they()] can! It looks like [user.p_theyre()] trying to give [user.p_them()]self cancer.")
+ return (TOXLOSS|OXYLOSS)
+
+/obj/item/clothing/mask/cigarette/Initialize()
+ ..()
+ create_reagents(chem_volume)
+ reagents.set_reacting(FALSE) // so it doesn't react until you light it
+ if(list_reagents)
+ reagents.add_reagent_list(list_reagents)
+ if(starts_lit)
+ light()
+
+/obj/item/clothing/mask/cigarette/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+
+/obj/item/clothing/mask/cigarette/attackby(obj/item/W, mob/user, params)
+ if(!lit && smoketime > 0)
+ var/lighting_text = W.ignition_effect(src, user)
+ if(lighting_text)
+ light(lighting_text)
+ else
+ return ..()
+
+/obj/item/clothing/mask/cigarette/afterattack(obj/item/reagent_containers/glass/glass, mob/user, proximity)
+ if(!proximity || lit) //can't dip if cigarette is lit (it will heat the reagents in the glass instead)
+ return
+ if(istype(glass)) //you can dip cigarettes into beakers
+ if(glass.reagents.trans_to(src, chem_volume)) //if reagents were transfered, show the message
+ to_chat(user, "You dip \the [src] into \the [glass].")
+ else //if not, either the beaker was empty, or the cigarette was full
+ if(!glass.reagents.total_volume)
+ to_chat(user, "[glass] is empty.")
+ else
+ to_chat(user, "[src] is full.")
+
+
+/obj/item/clothing/mask/cigarette/proc/light(flavor_text = null)
+ if(lit)
+ return
+
+ lit = TRUE
+ name = "lit [name]"
+ attack_verb = list("burnt", "singed")
+ hitsound = 'sound/items/welder.ogg'
+ damtype = "fire"
+ force = 4
+ if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire
+ var/datum/effect_system/reagents_explosion/e = new()
+ e.set_up(round(reagents.get_reagent_amount("plasma") / 2.5, 1), get_turf(src), 0, 0)
+ e.start()
+ qdel(src)
+ return
+ if(reagents.get_reagent_amount("welding_fuel")) // the fuel explodes, too, but much less violently
+ var/datum/effect_system/reagents_explosion/e = new()
+ e.set_up(round(reagents.get_reagent_amount("welding_fuel") / 5, 1), get_turf(src), 0, 0)
+ e.start()
+ qdel(src)
+ return
+ // allowing reagents to react after being lit
+ reagents.set_reacting(TRUE)
+ reagents.handle_reactions()
+ icon_state = icon_on
+ item_state = icon_on
+ if(flavor_text)
+ var/turf/T = get_turf(src)
+ T.visible_message(flavor_text)
+ START_PROCESSING(SSobj, src)
+
+ //can't think of any other way to update the overlays :<
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_wear_mask()
+ M.update_inv_hands()
+
+
+/obj/item/clothing/mask/cigarette/proc/handle_reagents()
+ if(reagents.total_volume)
+ if(iscarbon(loc))
+ var/mob/living/carbon/C = loc
+ if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob
+ if(prob(15)) // so it's not an instarape in case of acid
+ var/fraction = min(REAGENTS_METABOLISM/reagents.total_volume, 1)
+ reagents.reaction(C, INGEST, fraction)
+ if(!reagents.trans_to(C, REAGENTS_METABOLISM))
+ reagents.remove_any(REAGENTS_METABOLISM)
+ return
+ reagents.remove_any(REAGENTS_METABOLISM)
+
+
+/obj/item/clothing/mask/cigarette/process()
+ var/turf/location = get_turf(src)
+ var/mob/living/M = loc
+ if(isliving(loc))
+ M.IgniteMob()
+ smoketime--
+ if(smoketime < 1)
+ new type_butt(location)
+ if(ismob(loc))
+ to_chat(M, "Your [name] goes out.")
+ qdel(src)
+ return
+ open_flame()
+ if(reagents && reagents.total_volume)
+ handle_reagents()
+
+/obj/item/clothing/mask/cigarette/attack_self(mob/user)
+ if(lit)
+ user.visible_message("[user] calmly drops and treads on \the [src], putting it out instantly.")
+ new type_butt(user.loc)
+ new /obj/effect/decal/cleanable/ash(user.loc)
+ qdel(src)
+ . = ..()
+
+/obj/item/clothing/mask/cigarette/attack(mob/living/carbon/M, mob/living/carbon/user)
+ if(!istype(M))
+ return ..()
+ var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
+ if(lit && cig && user.a_intent == INTENT_HELP)
+ if(cig.lit)
+ to_chat(user, "The [cig.name] is already lit.")
+ if(M == user)
+ cig.attackby(src, user)
+ else
+ cig.light("[user] holds the [name] out for [M], and lights the [cig.name].")
+ else
+ return ..()
+
+/obj/item/clothing/mask/cigarette/fire_act(exposed_temperature, exposed_volume)
+ light()
+
+/obj/item/clothing/mask/cigarette/is_hot()
+ return lit * heat
+
+// Cigarette brands.
+
+/obj/item/clothing/mask/cigarette/space_cigarette
+ desc = "A Space Cigarette brand cigarette."
+
+/obj/item/clothing/mask/cigarette/dromedary
+ desc = "A DromedaryCo brand cigarette."
+
+/obj/item/clothing/mask/cigarette/uplift
+ desc = "An Uplift Smooth brand cigarette."
+ list_reagents = list("nicotine" = 7.5, "menthol" = 7.5)
+
+/obj/item/clothing/mask/cigarette/robust
+ desc = "A Robust brand cigarette."
+
+/obj/item/clothing/mask/cigarette/robustgold
+ desc = "A Robust Gold brand cigarette."
+ list_reagents = list("nicotine" = 15, "gold" = 1)
+
+/obj/item/clothing/mask/cigarette/carp
+ desc = "A Carp Classic brand cigarette."
+
+/obj/item/clothing/mask/cigarette/syndicate
+ desc = "An unknown brand cigarette."
+ list_reagents = list("nicotine" = 15, "omnizine" = 15)
+
+/obj/item/clothing/mask/cigarette/shadyjims
+ desc = "A Shady Jim's Super Slims cigarette."
+ list_reagents = list("nicotine" = 15, "lipolicide" = 4, "ammonia" = 2, "plantbgone" = 1, "toxin" = 1.5)
+
+// Rollies.
+
+/obj/item/clothing/mask/cigarette/rollie
+ name = "rollie"
+ desc = "A roll of dried plant matter wrapped in thin paper."
+ icon_state = "spliffoff"
+ icon_on = "spliffon"
+ icon_off = "spliffoff"
+ type_butt = /obj/item/cigbutt/roach
+ throw_speed = 0.5
+ item_state = "spliffoff"
+ smoketime = 180
+ chem_volume = 50
+
+/obj/item/clothing/mask/cigarette/rollie/New()
+ ..()
+ src.pixel_x = rand(-5, 5)
+ src.pixel_y = rand(-5, 5)
+
+/obj/item/clothing/mask/cigarette/rollie/trippy
+ list_reagents = list("nicotine" = 15, "mushroomhallucinogen" = 35)
+ starts_lit = TRUE
+
+/obj/item/cigbutt/roach
+ name = "roach"
+ desc = "A manky old roach, or for non-stoners, a used rollup."
+ icon_state = "roach"
+
+/obj/item/cigbutt/roach/New()
+ ..()
+ src.pixel_x = rand(-5, 5)
+ src.pixel_y = rand(-5, 5)
+
+
+////////////
+// CIGARS //
+////////////
+/obj/item/clothing/mask/cigarette/cigar
+ name = "premium cigar"
+ desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!"
+ icon_state = "cigaroff"
+ icon_on = "cigaron"
+ icon_off = "cigaroff"
+ type_butt = /obj/item/cigbutt/cigarbutt
+ throw_speed = 0.5
+ item_state = "cigaroff"
+ smoketime = 1500
+ chem_volume = 40
+
+/obj/item/clothing/mask/cigarette/cigar/cohiba
+ name = "\improper Cohiba Robusto cigar"
+ desc = "There's little more you could want from a cigar."
+ icon_state = "cigar2off"
+ icon_on = "cigar2on"
+ icon_off = "cigar2off"
+ smoketime = 2000
+ chem_volume = 80
+
+
+/obj/item/clothing/mask/cigarette/cigar/havana
+ name = "premium Havanian cigar"
+ desc = "A cigar fit for only the best of the best."
+ icon_state = "cigar2off"
+ icon_on = "cigar2on"
+ icon_off = "cigar2off"
+ smoketime = 7200
+ chem_volume = 50
+
+/obj/item/cigbutt
+ name = "cigarette butt"
+ desc = "A manky old cigarette butt."
+ icon = 'icons/obj/clothing/masks.dmi'
+ icon_state = "cigbutt"
+ w_class = WEIGHT_CLASS_TINY
+ throwforce = 0
+
+/obj/item/cigbutt/cigarbutt
+ name = "cigar butt"
+ desc = "A manky old cigar butt."
+ icon_state = "cigarbutt"
+
+/////////////////
+//SMOKING PIPES//
+/////////////////
+/obj/item/clothing/mask/cigarette/pipe
+ name = "smoking pipe"
+ desc = "A pipe, for smoking. Probably made of meershaum or something."
+ icon_state = "pipeoff"
+ item_state = "pipeoff"
+ icon_on = "pipeon" //Note - these are in masks.dmi
+ icon_off = "pipeoff"
+ smoketime = 0
+ chem_volume = 100
+ list_reagents = null
+ var/packeditem = 0
+
+/obj/item/clothing/mask/cigarette/pipe/Initialize()
+ ..()
+ name = "empty [initial(name)]"
+
+/obj/item/clothing/mask/cigarette/pipe/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+
+/obj/item/clothing/mask/cigarette/pipe/process()
+ var/turf/location = get_turf(src)
+ smoketime--
+ if(smoketime < 1)
+ new /obj/effect/decal/cleanable/ash(location)
+ if(ismob(loc))
+ var/mob/living/M = loc
+ to_chat(M, "Your [name] goes out.")
+ lit = 0
+ icon_state = icon_off
+ item_state = icon_off
+ M.update_inv_wear_mask()
+ packeditem = 0
+ name = "empty [initial(name)]"
+ STOP_PROCESSING(SSobj, src)
+ return
+ open_flame()
+ if(reagents && reagents.total_volume) // check if it has any reagents at all
+ handle_reagents()
+
+
+/obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/O, mob/user, params)
+ if(istype(O, /obj/item/reagent_containers/food/snacks/grown))
+ var/obj/item/reagent_containers/food/snacks/grown/G = O
+ if(!packeditem)
+ if(G.dry == 1)
+ to_chat(user, "You stuff [O] into [src].")
+ smoketime = 400
+ packeditem = 1
+ name = "[O.name]-packed [initial(name)]"
+ if(O.reagents)
+ O.reagents.trans_to(src, O.reagents.total_volume)
+ qdel(O)
+ else
+ to_chat(user, "It has to be dried first!")
+ else
+ to_chat(user, "It is already packed!")
+ else
+ var/lighting_text = O.ignition_effect(src,user)
+ if(lighting_text)
+ if(smoketime > 0)
+ light(lighting_text)
+ else
+ to_chat(user, "There is nothing to smoke!")
+ else
+ return ..()
+
+/obj/item/clothing/mask/cigarette/pipe/attack_self(mob/user)
+ var/turf/location = get_turf(user)
+ if(lit)
+ user.visible_message("[user] puts out [src].", "You put out [src].")
+ lit = 0
+ icon_state = icon_off
+ item_state = icon_off
+ STOP_PROCESSING(SSobj, src)
+ return
+ if(!lit && smoketime > 0)
+ to_chat(user, "You empty [src] onto [location].")
+ new /obj/effect/decal/cleanable/ash(location)
+ packeditem = 0
+ smoketime = 0
+ reagents.clear_reagents()
+ name = "empty [initial(name)]"
+ return
+
+/obj/item/clothing/mask/cigarette/pipe/cobpipe
+ name = "corn cob pipe"
+ desc = "A nicotine delivery system popularized by folksy backwoodsmen and kept popular in the modern age and beyond by space hipsters. Can be loaded with objects."
+ icon_state = "cobpipeoff"
+ item_state = "cobpipeoff"
+ icon_on = "cobpipeon" //Note - these are in masks.dmi
+ icon_off = "cobpipeoff"
+ smoketime = 0
+
+
+/////////
+//ZIPPO//
+/////////
+/obj/item/lighter
+ name = "\improper Zippo lighter"
+ desc = "The zippo."
+ icon = 'icons/obj/cigarettes.dmi'
+ icon_state = "zippo"
+ item_state = "zippo"
+ w_class = WEIGHT_CLASS_TINY
+ flags_1 = CONDUCT_1
+ slot_flags = SLOT_BELT
+ var/lit = 0
+ var/fancy = TRUE
+ heat = 1500
+ resistance_flags = FIRE_PROOF
+ light_color = LIGHT_COLOR_FIRE
+
+/obj/item/lighter/update_icon()
+ if(lit)
+ icon_state = "[initial(icon_state)]_on"
+ else
+ icon_state = "[initial(icon_state)]"
+
+/obj/item/lighter/ignition_effect(atom/A, mob/user)
+ if(is_hot())
+ . = "With a single flick of their wrist, [user] smoothly lights [A] with [src]. Damn [user.p_theyre()] cool."
+
+/obj/item/lighter/proc/set_lit(new_lit)
+ lit = new_lit
+ if(lit)
+ force = 5
+ damtype = "fire"
+ hitsound = 'sound/items/welder.ogg'
+ attack_verb = list("burnt", "singed")
+ set_light(1)
+ START_PROCESSING(SSobj, src)
+ else
+ hitsound = "swing_hit"
+ force = 0
+ attack_verb = null //human_defense.dm takes care of it
+ set_light(0)
+ STOP_PROCESSING(SSobj, src)
+ update_icon()
+
+/obj/item/lighter/attack_self(mob/living/user)
+ if(user.is_holding(src))
+ if(!lit)
+ set_lit(TRUE)
+ if(fancy)
+ user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.", "Without even breaking stride, you flip open and lights [src] in one smooth movement.")
+ else
+ var/prot = FALSE
+ var/mob/living/carbon/human/H = user
+
+ if(istype(H) && H.gloves)
+ var/obj/item/clothing/gloves/G = H.gloves
+ if(G.max_heat_protection_temperature)
+ prot = (G.max_heat_protection_temperature > 360)
+ else
+ prot = TRUE
+
+ if(prot || prob(75))
+ user.visible_message("After a few attempts, [user] manages to light [src].", "After a few attempts, you manage to light [src].")
+ else
+ var/hitzone = user.held_index_to_dir(user.active_hand_index) == "r" ? "r_hand" : "l_hand"
+ user.apply_damage(5, BURN, hitzone)
+ user.visible_message("After a few attempts, [user] manages to light [src] - however, [user.p_they()] burn their finger in the process.", "You burn yourself while lighting the lighter!")
+
+ else
+ set_lit(FALSE)
+ if(fancy)
+ user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow.", "You quietly shut off [src] without even looking at what you're doing. Wow.")
+ else
+ user.visible_message("[user] quietly shuts off [src].", "You quietly shut off [src].")
+ else
+ . = ..()
+
+/obj/item/lighter/attack(mob/living/carbon/M, mob/living/carbon/user)
+ if(lit && M.IgniteMob())
+ message_admins("[key_name_admin(user)] set [key_name_admin(M)] on fire")
+ log_game("[key_name(user)] set [key_name(M)] on fire")
+ var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
+ if(lit && cig && user.a_intent == INTENT_HELP)
+ if(cig.lit)
+ to_chat(user, "The [cig.name] is already lit.")
+ if(M == user)
+ cig.attackby(src, user)
+ else
+ if(fancy)
+ cig.light("[user] whips the [name] out and holds it for [M]. [user.p_their(TRUE)] arm is as steady as the unflickering flame they light \the [cig] with.")
+ else
+ cig.light("[user] holds the [name] out for [M], and lights the [cig.name].")
+ else
+ ..()
+
+/obj/item/lighter/process()
+ open_flame()
+
+/obj/item/lighter/is_hot()
+ return lit * heat
+
+
+/obj/item/lighter/greyscale
+ name = "cheap lighter"
+ desc = "A cheap-as-free lighter."
+ icon_state = "lighter"
+ fancy = FALSE
+
+/obj/item/lighter/greyscale/Initialize()
+ . = ..()
+ add_atom_colour(color2hex(randomColor(1)), FIXED_COLOUR_PRIORITY)
+ update_icon()
+
+/obj/item/lighter/greyscale/update_icon()
+ cut_overlays()
+ var/mutable_appearance/base_overlay = mutable_appearance(icon,"[initial(icon_state)]_base")
+ base_overlay.appearance_flags = RESET_COLOR //the edging doesn't change color
+ if(lit)
+ base_overlay.icon_state = "[initial(icon_state)]_on"
+ add_overlay(base_overlay)
+
+/obj/item/lighter/greyscale/ignition_effect(atom/A, mob/user)
+ if(is_hot())
+ . = "After some fiddling, [user] manages to light [A] with [src]."
+
+
+///////////
+//ROLLING//
+///////////
+/obj/item/rollingpaper
+ name = "rolling paper"
+ desc = "A thin piece of paper used to make fine smokeables."
+ icon = 'icons/obj/cigarettes.dmi'
+ icon_state = "cig_paper"
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/rollingpaper/afterattack(atom/target, mob/user, proximity)
+ if(!proximity)
+ return
+ if(istype(target, /obj/item/reagent_containers/food/snacks/grown))
+ var/obj/item/reagent_containers/food/snacks/grown/O = target
+ if(O.dry)
+ var/obj/item/clothing/mask/cigarette/rollie/R = new /obj/item/clothing/mask/cigarette/rollie(user.loc)
+ R.chem_volume = target.reagents.total_volume
+ target.reagents.trans_to(R, R.chem_volume)
+ qdel(target)
+ qdel(src)
+ user.put_in_active_hand(R)
+ to_chat(user, "You roll the [target.name] into a rolling paper.")
+ R.desc = "Dried [target.name] rolled up in a thin piece of paper."
+ else
+ to_chat(user, "You need to dry this first!")
+ else
+ ..()
+
+///////////////
+//VAPE NATION//
+///////////////
+/obj/item/clothing/mask/vape
+ name = "E-Cigarette"
+ desc = "A classy and highly sophisticated electronic cigarette, for classy and dignified gentlemen. A warning label reads \"Warning: Do not fill with flammable materials.\""//<<< i'd vape to that.
+ icon = 'icons/obj/clothing/masks.dmi'
+ icon_state = null
+ item_state = null
+ w_class = WEIGHT_CLASS_TINY
+ var/chem_volume = 100
+ var/vapetime = 0 //this so it won't puff out clouds every tick
+ var/screw = 0 // kinky
+ var/super = 0 //for the fattest vapes dude.
+
+/obj/item/clothing/mask/vape/suicide_act(mob/user)
+ user.visible_message("[user] is puffin hard on dat vape, [user.p_they()] trying to join the vape life on a whole notha plane!")//it doesn't give you cancer, it is cancer
+ return (TOXLOSS|OXYLOSS)
+
+
+/obj/item/clothing/mask/vape/Initialize(mapload, param_color)
+ . = ..()
+ create_reagents(chem_volume)
+ reagents.set_reacting(FALSE) // so it doesn't react until you light it
+ reagents.add_reagent("nicotine", 50)
+ if(!icon_state)
+ if(!param_color)
+ param_color = pick("red","blue","black","white","green","purple","yellow","orange")
+ icon_state = "[param_color]_vape"
+ item_state = "[param_color]_vape"
+
+/obj/item/clothing/mask/vape/attackby(obj/item/O, mob/user, params)
+ if(istype(O, /obj/item/reagent_containers) && (O.container_type & OPENCONTAINER_1))
+ if(reagents.total_volume < chem_volume)
+ if(O.reagents.total_volume > 0)
+ O.reagents.trans_to(src,25)
+ to_chat(user, "You add the contents of [O] to the [src]")
+ else
+ to_chat(user, "The [O] is empty!")
+ else
+ to_chat(user, "[src] can't hold anymore reagents!")
+
+ if(istype(O, /obj/item/screwdriver))
+ if(!screw)
+ screw = 1
+ to_chat(user, "You open the cap on the [src]")
+ if(super)
+ add_overlay("vapeopen_med")
+ else
+ add_overlay("vapeopen_low")
+ else
+ screw = 0
+ to_chat(user, "You close the cap on the [src]")
+ cut_overlays()
+
+ if(istype(O, /obj/item/device/multitool))
+ if(screw && !emagged)//also kinky
+ if(!super)
+ cut_overlays()
+ super = 1
+ to_chat(user, "You increase the voltage in the [src]")
+ add_overlay("vapeopen_med")
+ else
+ cut_overlays()
+ super = 0
+ to_chat(user, "You decrease the voltage in the [src]")
+ add_overlay("vapeopen_low")
+
+ if(screw && emagged)
+ to_chat(user, "The [name] can't be modified!")
+
+
+/obj/item/clothing/mask/vape/emag_act(mob/user)// I WON'T REGRET WRITTING THIS, SURLY.
+ if(screw)
+ if(!emagged)
+ cut_overlays()
+ emagged = TRUE
+ super = 0
+ to_chat(user, "You maximize the voltage in the [src]")
+ add_overlay("vapeopen_high")
+ var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect
+ sp.set_up(5, 1, src)
+ sp.start()
+ else
+ to_chat(user, "The [name] is already emagged!")
+ else
+ to_chat(user, "You need to open the cap to do that")
+
+/obj/item/clothing/mask/vape/attack_self(mob/user)
+ if(reagents.total_volume > 0)
+ to_chat(user, "you empty [src] of all reagents.")
+ reagents.clear_reagents()
+ return
+
+/obj/item/clothing/mask/vape/equipped(mob/user, slot)
+ if(slot == slot_wear_mask)
+ if(!screw)
+ to_chat(user, "You start puffing on the vape.")
+ reagents.set_reacting(TRUE)
+ START_PROCESSING(SSobj, src)
+ else //it will not start if the vape is opened.
+ to_chat(user, "You need to close the cap first!")
+
+/obj/item/clothing/mask/vape/dropped(mob/user)
+ var/mob/living/carbon/C = user
+ if(C.get_item_by_slot(slot_wear_mask) == src)
+ reagents.set_reacting(FALSE)
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/clothing/mask/vape/proc/hand_reagents()//had to rename to avoid duplicate error
+ if(reagents.total_volume)
+ if(iscarbon(loc))
+ var/mob/living/carbon/C = loc
+ if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob
+ var/fraction = min(REAGENTS_METABOLISM/reagents.total_volume, 1) //this will react instantly, making them a little more dangerous than cigarettes
+ reagents.reaction(C, INGEST, fraction)
+ if(!reagents.trans_to(C, REAGENTS_METABOLISM))
+ reagents.remove_any(REAGENTS_METABOLISM)
+ if(reagents.get_reagent_amount("welding_fuel"))
+ //HOT STUFF
+ C.fire_stacks = 2
+ C.IgniteMob()
+
+ if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire
+ var/datum/effect_system/reagents_explosion/e = new()
+ e.set_up(round(reagents.get_reagent_amount("plasma") / 2.5, 1), get_turf(src), 0, 0)
+ e.start()
+ qdel(src)
+ return
+ reagents.remove_any(REAGENTS_METABOLISM)
+
+/obj/item/clothing/mask/vape/process()
+ var/mob/living/M = loc
+
+ if(isliving(loc))
+ M.IgniteMob()
+
+ vapetime++
+
+ if(!reagents.total_volume)
+ if(ismob(loc))
+ to_chat(M, "The [name] is empty!")
+ STOP_PROCESSING(SSobj, src)
+ //it's reusable so it won't unequip when empty
+ return
+ //open flame removed because vapes are a closed system, they wont light anything on fire
+
+ if(super && vapetime > 3)//Time to start puffing those fat vapes, yo.
+ var/datum/effect_system/smoke_spread/chem/s = new
+ s.set_up(reagents, 1, loc, silent=TRUE)
+ s.start()
+ vapetime = 0
+
+ if(emagged && vapetime > 3)
+ var/datum/effect_system/smoke_spread/chem/s = new
+ s.set_up(reagents, 4, loc, silent=TRUE)
+ s.start()
+ vapetime = 0
+ if(prob(5))//small chance for the vape to break and deal damage if it's emagged
+ playsound(get_turf(src), 'sound/effects/pop_expl.ogg', 50, 0)
+ M.apply_damage(20, BURN, "head")
+ M.Knockdown(300, 1, 0)
+ var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread
+ sp.set_up(5, 1, src)
+ sp.start()
+ to_chat(M, "The [name] suddenly explodes in your mouth!")
+ qdel(src)
+ return
+
+ if(reagents && reagents.total_volume)
+ hand_reagents()
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index f9564018f8..c25e188529 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -212,7 +212,6 @@
build_path = /obj/machinery/computer/cargo
origin_tech = "programming=3"
var/contraband = FALSE
- var/emagged = FALSE
/obj/item/circuitboard/computer/cargo/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/device/multitool))
diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm
index 069f8375cc..c9755727e7 100644
--- a/code/game/objects/items/devices/geiger_counter.dm
+++ b/code/game/objects/items/devices/geiger_counter.dm
@@ -16,7 +16,6 @@
materials = list(MAT_METAL = 150, MAT_GLASS = 150)
var/scanning = 0
var/radiation_count = 0
- var/emagged = FALSE
/obj/item/device/geiger_counter/New()
..()
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index 742a58a462..6bfbff9f3a 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -1,269 +1,268 @@
-
-// Light Replacer (LR)
-//
-// ABOUT THE DEVICE
-//
-// This is a device supposedly to be used by Janitors and Janitor Cyborgs which will
-// allow them to easily replace lights. This was mostly designed for Janitor Cyborgs since
-// they don't have hands or a way to replace lightbulbs.
-//
-// HOW IT WORKS
-//
-// You attack a light fixture with it, if the light fixture is broken it will replace the
-// light fixture with a working light; the broken light is then placed on the floor for the
-// user to then pickup with a trash bag. If it's empty then it will just place a light in the fixture.
-//
-// HOW TO REFILL THE DEVICE
-//
-// It will need to be manually refilled with lights.
-// If it's part of a robot module, it will charge when the Robot is inside a Recharge Station.
-//
-// EMAGGED FEATURES
-//
-// NOTICE: The Cyborg cannot use the emagged Light Replacer and the light's explosion was nerfed. It cannot create holes in the station anymore.
-//
-// I'm not sure everyone will react the emag's features so please say what your opinions are of it.
-//
-// When emagged it will rig every light it replaces, which will explode when the light is on.
-// This is VERY noticable, even the device's name changes when you emag it so if anyone
-// examines you when you're holding it in your hand, you will be discovered.
-// It will also be very obvious who is setting all these lights off, since only Janitor Borgs and Janitors have easy
-// access to them, and only one of them can emag their device.
-//
-// The explosion cannot insta-kill anyone with 30% or more health.
-
-#define LIGHT_OK 0
-#define LIGHT_EMPTY 1
-#define LIGHT_BROKEN 2
-#define LIGHT_BURNED 3
-
-
-/obj/item/device/lightreplacer
-
- name = "light replacer"
- desc = "A device to automatically replace lights. Refill with broken or working lightbulbs, or sheets of glass."
-
- icon = 'icons/obj/janitor.dmi'
- icon_state = "lightreplacer0"
- item_state = "electronic"
+
+// Light Replacer (LR)
+//
+// ABOUT THE DEVICE
+//
+// This is a device supposedly to be used by Janitors and Janitor Cyborgs which will
+// allow them to easily replace lights. This was mostly designed for Janitor Cyborgs since
+// they don't have hands or a way to replace lightbulbs.
+//
+// HOW IT WORKS
+//
+// You attack a light fixture with it, if the light fixture is broken it will replace the
+// light fixture with a working light; the broken light is then placed on the floor for the
+// user to then pickup with a trash bag. If it's empty then it will just place a light in the fixture.
+//
+// HOW TO REFILL THE DEVICE
+//
+// It will need to be manually refilled with lights.
+// If it's part of a robot module, it will charge when the Robot is inside a Recharge Station.
+//
+// EMAGGED FEATURES
+//
+// NOTICE: The Cyborg cannot use the emagged Light Replacer and the light's explosion was nerfed. It cannot create holes in the station anymore.
+//
+// I'm not sure everyone will react the emag's features so please say what your opinions are of it.
+//
+// When emagged it will rig every light it replaces, which will explode when the light is on.
+// This is VERY noticable, even the device's name changes when you emag it so if anyone
+// examines you when you're holding it in your hand, you will be discovered.
+// It will also be very obvious who is setting all these lights off, since only Janitor Borgs and Janitors have easy
+// access to them, and only one of them can emag their device.
+//
+// The explosion cannot insta-kill anyone with 30% or more health.
+
+#define LIGHT_OK 0
+#define LIGHT_EMPTY 1
+#define LIGHT_BROKEN 2
+#define LIGHT_BURNED 3
+
+
+/obj/item/device/lightreplacer
+
+ name = "light replacer"
+ desc = "A device to automatically replace lights. Refill with broken or working lightbulbs, or sheets of glass."
+
+ icon = 'icons/obj/janitor.dmi'
+ icon_state = "lightreplacer0"
+ item_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
-
+
flags_1 = CONDUCT_1
- slot_flags = SLOT_BELT
- origin_tech = "magnets=3;engineering=4"
-
- var/max_uses = 20
- var/uses = 0
- var/emagged = FALSE
- var/failmsg = ""
- // How much to increase per each glass?
- var/increment = 5
- // How much to take from the glass?
- var/decrement = 1
- var/charge = 1
-
- // Eating used bulbs gives us bulb shards
- var/bulb_shards = 0
- // when we get this many shards, we get a free bulb.
- var/shards_required = 4
-
-/obj/item/device/lightreplacer/New()
- uses = max_uses / 2
- failmsg = "The [name]'s refill light blinks red."
- ..()
-
-/obj/item/device/lightreplacer/examine(mob/user)
- ..()
- to_chat(user, status_string())
-
-/obj/item/device/lightreplacer/attackby(obj/item/W, mob/user, params)
-
- if(istype(W, /obj/item/stack/sheet/glass))
- var/obj/item/stack/sheet/glass/G = W
- if(uses >= max_uses)
- to_chat(user, "[src.name] is full.")
- return
- else if(G.use(decrement))
- AddUses(increment)
- to_chat(user, "You insert a piece of glass into the [src.name]. You have [uses] light\s remaining.")
- return
- else
- to_chat(user, "You need one sheet of glass to replace lights!")
-
- if(istype(W, /obj/item/shard))
- if(uses >= max_uses)
- to_chat(user, "[src.name] is full.")
- return
- if(!user.temporarilyRemoveItemFromInventory(W))
- return
- AddUses(round(increment*0.75))
- to_chat(user, "You insert a shard of glass into the [src.name]. You have [uses] light\s remaining.")
- qdel(W)
- return
-
- if(istype(W, /obj/item/light))
- var/obj/item/light/L = W
- if(L.status == 0) // LIGHT OKAY
- if(uses < max_uses)
- if(!user.temporarilyRemoveItemFromInventory(W))
- return
- AddUses(1)
- qdel(L)
- else
- if(!user.temporarilyRemoveItemFromInventory(W))
- return
- to_chat(user, "You insert the [L.name] into the [src.name]")
- AddShards(1, user)
- qdel(L)
- return
-
- if(istype(W, /obj/item/storage))
- var/obj/item/storage/S = W
- var/found_lightbulbs = FALSE
- var/replaced_something = TRUE
-
- for(var/obj/item/I in S.contents)
+ slot_flags = SLOT_BELT
+ origin_tech = "magnets=3;engineering=4"
+
+ var/max_uses = 20
+ var/uses = 0
+ var/failmsg = ""
+ // How much to increase per each glass?
+ var/increment = 5
+ // How much to take from the glass?
+ var/decrement = 1
+ var/charge = 1
+
+ // Eating used bulbs gives us bulb shards
+ var/bulb_shards = 0
+ // when we get this many shards, we get a free bulb.
+ var/shards_required = 4
+
+/obj/item/device/lightreplacer/New()
+ uses = max_uses / 2
+ failmsg = "The [name]'s refill light blinks red."
+ ..()
+
+/obj/item/device/lightreplacer/examine(mob/user)
+ ..()
+ to_chat(user, status_string())
+
+/obj/item/device/lightreplacer/attackby(obj/item/W, mob/user, params)
+
+ if(istype(W, /obj/item/stack/sheet/glass))
+ var/obj/item/stack/sheet/glass/G = W
+ if(uses >= max_uses)
+ to_chat(user, "[src.name] is full.")
+ return
+ else if(G.use(decrement))
+ AddUses(increment)
+ to_chat(user, "You insert a piece of glass into the [src.name]. You have [uses] light\s remaining.")
+ return
+ else
+ to_chat(user, "You need one sheet of glass to replace lights!")
+
+ if(istype(W, /obj/item/shard))
+ if(uses >= max_uses)
+ to_chat(user, "[src.name] is full.")
+ return
+ if(!user.temporarilyRemoveItemFromInventory(W))
+ return
+ AddUses(round(increment*0.75))
+ to_chat(user, "You insert a shard of glass into the [src.name]. You have [uses] light\s remaining.")
+ qdel(W)
+ return
+
+ if(istype(W, /obj/item/light))
+ var/obj/item/light/L = W
+ if(L.status == 0) // LIGHT OKAY
+ if(uses < max_uses)
+ if(!user.temporarilyRemoveItemFromInventory(W))
+ return
+ AddUses(1)
+ qdel(L)
+ else
+ if(!user.temporarilyRemoveItemFromInventory(W))
+ return
+ to_chat(user, "You insert the [L.name] into the [src.name]")
+ AddShards(1, user)
+ qdel(L)
+ return
+
+ if(istype(W, /obj/item/storage))
+ var/obj/item/storage/S = W
+ var/found_lightbulbs = FALSE
+ var/replaced_something = TRUE
+
+ for(var/obj/item/I in S.contents)
if(istype(I, /obj/item/light))
- var/obj/item/light/L = I
- found_lightbulbs = TRUE
- if(src.uses >= max_uses)
- break
- if(L.status == LIGHT_OK)
- replaced_something = TRUE
- AddUses(1)
- qdel(L)
-
- else if(L.status == LIGHT_BROKEN || L.status == LIGHT_BURNED)
- replaced_something = TRUE
- AddShards(1, user)
- qdel(L)
-
- if(!found_lightbulbs)
- to_chat(user, "\The [S] contains no bulbs.")
- return
-
- if(!replaced_something && src.uses == max_uses)
- to_chat(user, "\The [src] is full!")
- return
-
- to_chat(user, "You fill \the [src] with lights from \the [S]. " + status_string() + "")
-
-/obj/item/device/lightreplacer/emag_act()
+ var/obj/item/light/L = I
+ found_lightbulbs = TRUE
+ if(src.uses >= max_uses)
+ break
+ if(L.status == LIGHT_OK)
+ replaced_something = TRUE
+ AddUses(1)
+ qdel(L)
+
+ else if(L.status == LIGHT_BROKEN || L.status == LIGHT_BURNED)
+ replaced_something = TRUE
+ AddShards(1, user)
+ qdel(L)
+
+ if(!found_lightbulbs)
+ to_chat(user, "\The [S] contains no bulbs.")
+ return
+
+ if(!replaced_something && src.uses == max_uses)
+ to_chat(user, "\The [src] is full!")
+ return
+
+ to_chat(user, "You fill \the [src] with lights from \the [S]. " + status_string() + "")
+
+/obj/item/device/lightreplacer/emag_act()
if(emagged)
return
Emag()
-
-/obj/item/device/lightreplacer/attack_self(mob/user)
- to_chat(user, status_string())
-
-/obj/item/device/lightreplacer/update_icon()
- icon_state = "lightreplacer[emagged]"
-
-/obj/item/device/lightreplacer/proc/status_string()
- return "It has [uses] light\s remaining (plus [bulb_shards] fragment\s)."
-
-/obj/item/device/lightreplacer/proc/Use(mob/user)
- playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
- AddUses(-1)
- return 1
-
-// Negative numbers will subtract
-/obj/item/device/lightreplacer/proc/AddUses(amount = 1)
- uses = Clamp(uses + amount, 0, max_uses)
-
-/obj/item/device/lightreplacer/proc/AddShards(amount = 1, user)
- bulb_shards += amount
- var/new_bulbs = round(bulb_shards / shards_required)
- if(new_bulbs > 0)
- AddUses(new_bulbs)
- bulb_shards = bulb_shards % shards_required
- if(new_bulbs != 0)
- to_chat(user, "\The [src] has fabricated a new bulb from the broken glass it has stored. It now has [uses] uses.")
- playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
- return new_bulbs
-
-/obj/item/device/lightreplacer/proc/Charge(var/mob/user)
- charge += 1
- if(charge > 3)
- AddUses(1)
- charge = 1
-
-/obj/item/device/lightreplacer/proc/ReplaceLight(obj/machinery/light/target, mob/living/U)
-
- if(target.status != LIGHT_OK)
- if(CanUse(U))
- if(!Use(U)) return
- to_chat(U, "You replace the [target.fitting] with \the [src].")
-
- if(target.status != LIGHT_EMPTY)
- AddShards(1, U)
- target.status = LIGHT_EMPTY
- target.update()
-
- var/obj/item/light/L2 = new target.light_type()
-
- target.status = L2.status
- target.switchcount = L2.switchcount
- target.rigged = emagged
- target.brightness = L2.brightness
- target.on = target.has_power()
- target.update()
- qdel(L2)
-
- if(target.on && target.rigged)
- target.explode()
- return
-
- else
- to_chat(U, failmsg)
- return
- else
- to_chat(U, "There is a working [target.fitting] already inserted!")
- return
-
-/obj/item/device/lightreplacer/proc/Emag()
- emagged = !emagged
- playsound(src.loc, "sparks", 100, 1)
- if(emagged)
- name = "shortcircuited [initial(name)]"
- else
- name = initial(name)
- update_icon()
-
-/obj/item/device/lightreplacer/proc/CanUse(mob/living/user)
- src.add_fingerprint(user)
- if(uses > 0)
- return 1
- else
- return 0
-
-/obj/item/device/lightreplacer/afterattack(atom/T, mob/U, proximity)
- if(!proximity)
- return
- if(!isturf(T))
- return
-
- var/used = FALSE
- for(var/atom/A in T)
- if(!CanUse(U))
- break
- used = TRUE
- if(istype(A, /obj/machinery/light))
- ReplaceLight(A, U)
-
- if(!used)
- to_chat(U, failmsg)
-
-/obj/item/device/lightreplacer/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J)
- J.put_in_cart(src, user)
- J.myreplacer = src
- J.update_icon()
-
-/obj/item/device/lightreplacer/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
- return
-
-#undef LIGHT_OK
-#undef LIGHT_EMPTY
-#undef LIGHT_BROKEN
-#undef LIGHT_BURNED
+
+/obj/item/device/lightreplacer/attack_self(mob/user)
+ to_chat(user, status_string())
+
+/obj/item/device/lightreplacer/update_icon()
+ icon_state = "lightreplacer[emagged]"
+
+/obj/item/device/lightreplacer/proc/status_string()
+ return "It has [uses] light\s remaining (plus [bulb_shards] fragment\s)."
+
+/obj/item/device/lightreplacer/proc/Use(mob/user)
+ playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ AddUses(-1)
+ return 1
+
+// Negative numbers will subtract
+/obj/item/device/lightreplacer/proc/AddUses(amount = 1)
+ uses = Clamp(uses + amount, 0, max_uses)
+
+/obj/item/device/lightreplacer/proc/AddShards(amount = 1, user)
+ bulb_shards += amount
+ var/new_bulbs = round(bulb_shards / shards_required)
+ if(new_bulbs > 0)
+ AddUses(new_bulbs)
+ bulb_shards = bulb_shards % shards_required
+ if(new_bulbs != 0)
+ to_chat(user, "\The [src] has fabricated a new bulb from the broken glass it has stored. It now has [uses] uses.")
+ playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
+ return new_bulbs
+
+/obj/item/device/lightreplacer/proc/Charge(var/mob/user)
+ charge += 1
+ if(charge > 3)
+ AddUses(1)
+ charge = 1
+
+/obj/item/device/lightreplacer/proc/ReplaceLight(obj/machinery/light/target, mob/living/U)
+
+ if(target.status != LIGHT_OK)
+ if(CanUse(U))
+ if(!Use(U)) return
+ to_chat(U, "You replace the [target.fitting] with \the [src].")
+
+ if(target.status != LIGHT_EMPTY)
+ AddShards(1, U)
+ target.status = LIGHT_EMPTY
+ target.update()
+
+ var/obj/item/light/L2 = new target.light_type()
+
+ target.status = L2.status
+ target.switchcount = L2.switchcount
+ target.rigged = emagged
+ target.brightness = L2.brightness
+ target.on = target.has_power()
+ target.update()
+ qdel(L2)
+
+ if(target.on && target.rigged)
+ target.explode()
+ return
+
+ else
+ to_chat(U, failmsg)
+ return
+ else
+ to_chat(U, "There is a working [target.fitting] already inserted!")
+ return
+
+/obj/item/device/lightreplacer/proc/Emag()
+ emagged = !emagged
+ playsound(src.loc, "sparks", 100, 1)
+ if(emagged)
+ name = "shortcircuited [initial(name)]"
+ else
+ name = initial(name)
+ update_icon()
+
+/obj/item/device/lightreplacer/proc/CanUse(mob/living/user)
+ src.add_fingerprint(user)
+ if(uses > 0)
+ return 1
+ else
+ return 0
+
+/obj/item/device/lightreplacer/afterattack(atom/T, mob/U, proximity)
+ if(!proximity)
+ return
+ if(!isturf(T))
+ return
+
+ var/used = FALSE
+ for(var/atom/A in T)
+ if(!CanUse(U))
+ break
+ used = TRUE
+ if(istype(A, /obj/machinery/light))
+ ReplaceLight(A, U)
+
+ if(!used)
+ to_chat(U, failmsg)
+
+/obj/item/device/lightreplacer/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J)
+ J.put_in_cart(src, user)
+ J.myreplacer = src
+ J.update_icon()
+
+/obj/item/device/lightreplacer/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
+ return
+
+#undef LIGHT_OK
+#undef LIGHT_EMPTY
+#undef LIGHT_BROKEN
+#undef LIGHT_BURNED
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 607238e2e9..30cec4c5a1 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -8,7 +8,6 @@
w_class = WEIGHT_CLASS_SMALL
siemens_coefficient = 1
var/spamcheck = 0
- var/emagged = FALSE
var/list/voicespan = list(SPAN_COMMAND)
/obj/item/device/megaphone/get_held_item_speechspans(mob/living/carbon/user)
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index fa509ad65e..64fea6ef19 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -278,7 +278,6 @@
desc = "Releases a harmless blast that confuses most organics. For when the harm is JUST TOO MUCH"
icon_state = "megaphone"
var/cooldown = 0
- var/emagged = FALSE
/obj/item/device/harmalarm/emag_act(mob/user)
emagged = !emagged
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 88ec800c00..1447d03ef7 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -7,7 +7,7 @@
var/flash_protect = 0 //What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS
var/tint = 0 //Sets the item's level of visual impairment tint, normally set to the same as flash_protect
var/up = 0 //but separated to allow items to protect but not impair vision, like space helmets
- var/visor_flags = 0 //flags_1 that are added/removed when an item is adjusted up/down
+ var/visor_flags = 0 //flags that are added/removed when an item is adjusted up/down
var/visor_flags_inv = 0 //same as visor_flags, but for flags_inv
var/visor_flags_cover = 0 //same as above, but for flags_cover
//what to toggle when toggled with weldingvisortoggle()
@@ -193,7 +193,6 @@
var/invis_view = SEE_INVISIBLE_LIVING
var/invis_override = 0 //Override to allow glasses to set higher than normal see_invis
var/lighting_alpha
- var/emagged = FALSE
var/list/icon/current = list() //the current hud icons
var/vision_correction = 0 //does wearing these glasses correct some of our vision defects?
strip_delay = 20
@@ -475,6 +474,8 @@ BLIND // can't see anything
permeability_coefficient = 0.01
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50, fire = 80, acid = 70)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
+ dynamic_hair_suffix = ""
+ dynamic_fhair_suffix = ""
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -783,7 +784,7 @@ BLIND // can't see anything
A.UpdateButtonIcon()
return TRUE
-/obj/item/clothing/proc/visor_toggling() //handles all the actual toggling of flags_1
+/obj/item/clothing/proc/visor_toggling() //handles all the actual toggling of flags
up = !up
flags_1 ^= visor_flags
flags_inv ^= visor_flags_inv
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index c0db06f730..95e78391bb 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -13,7 +13,6 @@
var/last_battery_percent = 0 // Used for deciding if battery percentage has chandged
var/last_world_time = "00:00"
var/list/last_header_icons
- var/emagged = FALSE // Whether the computer is emagged.
var/base_active_power_usage = 50 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too.
var/base_idle_power_usage = 5 // Power usage when the computer is idle and screen is off (currently only applies to laptops)
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 232cb5987e..75066540cf 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -8,7 +8,6 @@
flags_1 = CONDUCT_1
w_class = WEIGHT_CLASS_TINY
attack_verb = list("poked")
- var/emagged = FALSE
var/fail_message = "INVALID USER."
var/selfdestruct = 0 // Explode when user check is failed.
var/force_replace = 0 // Can forcefully replace other pins.