Files
GS13NG/code/game/objects/items/weapons/cigs_lighters.dm
T

605 lines
18 KiB
Plaintext

//cleansed 9/15/2012 17:48
/*
CONTAINS:
MATCHES
CIGARETTES
CIGARS
SMOKING PIPES
CHEAP LIGHTERS
ZIPPO
CIGARETTE PACKETS ARE IN FANCY.DM
*/
///////////
//MATCHES//
///////////
/obj/item/weapon/match
name = "match"
desc = "A simple match stick, used for lighting fine smokables."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "match_unlit"
var/lit = 0
var/smoketime = 5
w_class = 1
origin_tech = "materials=1"
heat = 1000
/obj/item/weapon/match/process()
var/turf/location = get_turf(src)
smoketime--
if(smoketime < 1)
matchburnout()
return
if(location)
location.hotspot_expose(700, 5)
return
/obj/item/weapon/match/fire_act()
matchignite()
/obj/item/weapon/match/proc/matchignite()
if(lit == 0)
lit = 1
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()
return
/obj/item/weapon/match/proc/matchburnout()
if(lit == 1)
lit = -1
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 = null
STOP_PROCESSING(SSobj, src)
/obj/item/weapon/match/dropped(mob/user)
matchburnout()
return ..()
/obj/item/weapon/match/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!isliving(M))
return
if(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,user)
if(lit && cig && user.a_intent == "help")
if(cig.lit)
user << "<span class='notice'>The [cig.name] is already lit.</span>"
if(M == user)
cig.attackby(src, user)
else
cig.light("<span class='notice'>[user] holds the [name] out for [M], and lights the [cig.name].</span>")
else
..()
/obj/item/proc/help_light_cig(mob/living/carbon/M, mob/living/carbon/user)
if(!iscarbon(M))
return
if(istype(M.wear_mask, /obj/item/clothing/mask/cigarette))
var/obj/item/clothing/mask/cigarette/cig = M.wear_mask
return cig
/obj/item/weapon/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"
w_class = 1
body_parts_covered = null
var/lit = 0
var/icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi
var/icon_off = "cigoff"
var/type_butt = /obj/item/weapon/cigbutt
var/lastHolder = null
var/smoketime = 300
var/chem_volume = 30
heat = 1000
/obj/item/clothing/mask/cigarette/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is huffing the [src.name] as quickly as they can! It looks like \he's trying to give \himself cancer.</span>")
return (TOXLOSS|OXYLOSS)
/obj/item/clothing/mask/cigarette/New()
..()
create_reagents(chem_volume) // making the cigarette a chemical holder with a maximum volume of 15
reagents.set_reacting(FALSE) // so it doesn't react until you light it
reagents.add_reagent("nicotine", 15)
/obj/item/clothing/mask/cigarette/Destroy()
if(reagents)
qdel(reagents)
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/item/clothing/mask/cigarette/attackby(obj/item/weapon/W, mob/user, params)
if(!lit && smoketime > 0 && W.is_hot())
var/lighting_text = is_lighter(W,user)
if(lighting_text)
light(lighting_text)
else
return ..()
/obj/item/clothing/mask/cigarette/afterattack(obj/item/weapon/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
var/transfered = glass.reagents.trans_to(src, chem_volume)
if(transfered) //if reagents were transfered, show the message
user << "<span class='notice'>You dip \the [src] into \the [glass].</span>"
else //if not, either the beaker was empty, or the cigarette was full
if(!glass.reagents.total_volume)
user << "<span class='notice'>[glass] is empty.</span>"
else
user << "<span class='notice'>[src] is full.</span>"
/obj/item/clothing/mask/cigarette/proc/is_lighter(obj/item/O, mob/user)
var/lighting_text = null
if(istype(O, /obj/item/weapon/weldingtool))
lighting_text = "<span class='notice'>[user] casually lights the [name] with [O], what a badass.</span>"
else if(istype(O, /obj/item/weapon/lighter/greyscale)) // we have to check for this first -- zippo lighters are default
lighting_text = "<span class='notice'>After some fiddling, [user] manages to light their [name] with [O].</span>"
else if(istype(O, /obj/item/weapon/lighter))
lighting_text = "<span class='rose'>With a single flick of their wrist, [user] smoothly lights their [name] with [O]. Damn they're cool.</span>"
else if(istype(O, /obj/item/weapon/melee/energy))
var/in_mouth = ""
if(iscarbon(user))
var/mob/living/carbon/C = user
if(C.wear_mask == src)
in_mouth = ", barely missing their nose"
lighting_text = "<span class='warning'>[user] swings their \
[O][in_mouth]. They light their [name] in the process.</span>"
else if(istype(O, /obj/item/device/assembly/igniter))
lighting_text = "<span class='notice'>[user] fiddles with [O], and manages to light their [name].</span>"
else if(istype(O, /obj/item/device/flashlight/flare))
lighting_text = "<span class='notice'>[user] lights their [name] with [O] like a real badass.</span>"
else if(O.is_hot())
lighting_text = "<span class='notice'>[user] lights their [name] with [O].</span>"
return lighting_text
/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()
if(ismob(loc))
var/mob/M = loc
M.unEquip(src, 1)
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()
if(ismob(loc))
var/mob/M = loc
M.unEquip(src, 1)
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_l_hand()
M.update_inv_r_hand()
/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)
reagents.trans_to(C, 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))
M << "<span class='notice'>Your [name] goes out.</span>"
M.unEquip(src, 1) //un-equip it so the overlays can update //Force the un-equip so the overlays update
qdel(src)
return
open_flame()
if(reagents && reagents.total_volume)
handle_reagents()
/obj/item/clothing/mask/cigarette/attack_self(mob/user)
if(lit == 1)
user.visible_message("<span class='notice'>[user] calmly drops and treads on \the [src], putting it out instantly.</span>")
new type_butt(user.loc)
new /obj/effect/decal/cleanable/ash(user.loc)
qdel(src)
return ..()
/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,user)
if(lit && cig && user.a_intent == "help")
if(cig.lit)
user << "<span class='notice'>The [cig.name] is already lit.</span>"
if(M == user)
cig.attackby(src, user)
else
cig.light("<span class='notice'>[user] holds the [name] out for [M], and lights the [cig.name].</span>")
else
return ..()
/obj/item/clothing/mask/cigarette/fire_act()
light()
/obj/item/clothing/mask/cigarette/is_hot()
return lit * heat
/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/weapon/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/New()
..()
reagents.add_reagent("mushroomhallucinogen", 50)
light()
//for(var/mob/M in player_list) M << 'sound/misc/Smoke_Weed_Everyday.ogg'
/obj/item/weapon/cigbutt/roach
name = "roach"
desc = "A manky old roach, or for non-stoners, a used rollup."
icon_state = "roach"
/obj/item/weapon/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/weapon/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/weapon/cigbutt
name = "cigarette butt"
desc = "A manky old cigarette butt."
icon = 'icons/obj/clothing/masks.dmi'
icon_state = "cigbutt"
w_class = 1
throwforce = 0
/obj/item/weapon/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
var/packeditem = 0
/obj/item/clothing/mask/cigarette/pipe/New()
..()
name = "empty [initial(name)]"
/obj/item/clothing/mask/cigarette/pipe/Destroy()
if(reagents)
qdel(reagents)
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
M << "<span class='notice'>Your [name] goes out.</span>"
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()
return
/obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O
if(!packeditem)
if(G.dry == 1)
user << "<span class='notice'>You stuff [O] into [src].</span>"
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
user << "<span class='warning'>It has to be dried first!</span>"
else
user << "<span class='warning'>It is already packed!</span>"
else
var/lighting_text = is_lighter(O,user)
if(lighting_text)
if(smoketime > 0)
light(lighting_text)
else
user << "<span class='warning'>There is nothing to smoke!</span>"
else
return ..()
/obj/item/clothing/mask/cigarette/pipe/attack_self(mob/user)
var/turf/location = get_turf(user)
if(lit)
user.visible_message("<span class='notice'>[user] puts out [src].</span>", "<span class='notice'>You put out [src].</span>")
lit = 0
icon_state = icon_off
item_state = icon_off
STOP_PROCESSING(SSobj, src)
return
if(!lit && smoketime > 0)
user << "<span class='notice'>You empty [src] onto [location].</span>"
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/weapon/lighter
name = "\improper Zippo lighter"
desc = "The zippo."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "zippo"
item_state = "zippo"
w_class = 1
flags = CONDUCT
slot_flags = SLOT_BELT
var/lit = 0
heat = 1500
/obj/item/weapon/lighter/greyscale
name = "cheap lighter"
desc = "A cheap-as-free lighter."
icon_state = "lighter"
/obj/item/weapon/lighter/greyscale/New()
var/image/I = image(icon,"lighter-overlay")
I.color = color2hex(randomColor(1))
add_overlay(I)
/obj/item/weapon/lighter/update_icon()
icon_state = lit ? "[icon_state]_on" : "[initial(icon_state)]"
/obj/item/weapon/lighter/attack_self(mob/living/user)
if(user.r_hand == src || user.l_hand == src)
if(!lit)
lit = 1
update_icon()
force = 5
damtype = "fire"
hitsound = 'sound/items/welder.ogg'
attack_verb = list("burnt", "singed")
if(!istype(src, /obj/item/weapon/lighter/greyscale))
user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.", "<span class='notice'>Without even breaking stride, you flip open and lights [src] in one smooth movement.</span>")
else
if(prob(75))
user.visible_message("After a few attempts, [user] manages to light [src].", "<span class='notice'>After a few attempts, you manage to light [src].</span>")
else
var/hitzone = user.r_hand == src ? "r_hand" : "l_hand"
user.apply_damage(5, BURN, hitzone)
user.visible_message("<span class='warning'>After a few attempts, [user] manages to light [src] - they however burn their finger in the process.</span>", "<span class='warning'>You burn yourself while lighting the lighter!</span>")
user.AddLuminosity(1)
START_PROCESSING(SSobj, src)
else
lit = 0
update_icon()
hitsound = "swing_hit"
force = 0
attack_verb = null //human_defense.dm takes care of it
if(!istype(src, /obj/item/weapon/lighter/greyscale))
user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing. Wow.", "<span class='notice'>You quietly shut off [src] without even looking at what you're doing. Wow.</span>")
else
user.visible_message("[user] quietly shuts off [src].", "<span class='notice'>You quietly shut off [src].")
user.AddLuminosity(-1)
STOP_PROCESSING(SSobj, src)
else
return ..()
return
/obj/item/weapon/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,user)
if(lit && cig && user.a_intent == "help")
if(cig.lit)
user << "<span class='notice'>The [cig.name] is already lit.</span>"
if(M == user)
cig.attackby(src, user)
else
if(!istype(src, /obj/item/weapon/lighter/greyscale))
cig.light("<span class='rose'>[user] whips the [name] out and holds it for [M]. Their arm is as steady as the unflickering flame they light \the [cig] with.</span>")
else
cig.light("<span class='notice'>[user] holds the [name] out for [M], and lights the [cig.name].</span>")
else
..()
/obj/item/weapon/lighter/process()
var/turf/location = get_turf(src)
if(location)
location.hotspot_expose(700, 5)
return
/obj/item/weapon/lighter/pickup(mob/user)
..()
if(lit)
SetLuminosity(0)
user.AddLuminosity(1)
return
/obj/item/weapon/lighter/dropped(mob/user)
..()
if(lit)
if(user)
user.AddLuminosity(-1)
SetLuminosity(1)
return
/obj/item/weapon/lighter/is_hot()
return lit * heat
///////////
//ROLLING//
///////////
/obj/item/weapon/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 = 1
/obj/item/weapon/rollingpaper/afterattack(atom/target, mob/user, proximity)
if(!proximity)
return
if(istype(target, /obj/item/weapon/reagent_containers/food/snacks/grown))
var/obj/item/weapon/reagent_containers/food/snacks/grown/O = target
if(O.dry)
user.unEquip(target, 1)
user.unEquip(src, 1)
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)
user.put_in_active_hand(R)
user << "<span class='notice'>You roll the [target.name] into a rolling paper.</span>"
R.desc = "Dried [target.name] rolled up in a thin piece of paper."
qdel(target)
qdel(src)
else
user << "<span class='warning'>You need to dry this first!</span>"
else
..()