Files
Paradise/code/game/objects/items/weapons/cigs.dm
T
Migratingcocofruit 2903560dc1 Pipe fix/tweak (#25431)
* Pipe fixes and tweaks.

Allows refilling of pipes using dried plants, removes their ability to conjure nicotine, and applies the  May 22, 2015 pipe tweak to cob pipes, and make them start empty(corn has no nicotine).

* refilling pipes now sets smoketime

* oops

* Adding spaces to comments
2024-05-24 18:30:45 +00:00

587 lines
19 KiB
Plaintext

#define REAGENT_TIME_RATIO 2.5
/*
CONTAINS:
CIGARETTES
CIGARS
SMOKING PIPES
HOLO-CIGAR
CIGARETTE PACKETS ARE IN FANCY.DM
LIGHTERS ARE IN LIGHTERS.DM
*/
//////////////////
//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"
slot_flags = SLOT_FLAG_MASK
w_class = WEIGHT_CLASS_TINY
body_parts_covered = null
attack_verb = null
container_type = INJECTABLE
var/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 = 150
var/chem_volume = 60
var/list/list_reagents = list("nicotine" = 40)
var/first_puff = TRUE // the first puff is a bit more reagents ingested
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/mask.dmi',
"Unathi" = 'icons/mob/clothing/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/clothing/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/clothing/species/vulpkanin/mask.dmi',
"Grey" = 'icons/mob/clothing/species/grey/mask.dmi')
var/static/things_that_light = typecacheof(list(
/obj/item/lighter,
/obj/item/match,
/obj/item/melee/energy/sword/saber,
/obj/item/assembly/igniter,
/obj/item/gun/magic/wand/fireball))
/obj/item/clothing/mask/cigarette/Initialize(mapload)
. = ..()
create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 30
reagents.set_reacting(FALSE) // so it doesn't react until you light it
if(list_reagents)
reagents.add_reagent_list(list_reagents)
RegisterSignal(src, COMSIG_ITEM_BEING_ATTACKED, PROC_REF(try_light))
/obj/item/clothing/mask/cigarette/Destroy()
QDEL_NULL(reagents)
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/mask/cigarette/proc/try_light(obj/item/cigarette, obj/item/lighting_item)
SIGNAL_HANDLER
if(lighting_item.get_heat())
light()
return COMPONENT_CANCEL_ATTACK_CHAIN
/obj/item/clothing/mask/cigarette/decompile_act(obj/item/matter_decompiler/C, mob/user)
if(isdrone(user))
C.stored_comms["wood"] += 1
qdel(src)
return TRUE
return ..()
/obj/item/clothing/mask/cigarette/attack(mob/living/M, mob/living/user, def_zone)
if(istype(M) && M.on_fire)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(M)
light("<span class='notice'>[user] coldly lights [src] with the burning body of [M]. Clearly, [user.p_they()] offer[user.p_s()] the warmest of regards...</span>")
return TRUE
else
return ..()
/obj/item/clothing/mask/cigarette/can_enter_storage(obj/item/storage/S, mob/user)
if(lit)
to_chat(user, "<span class='warning'>[S] can't hold [initial(name)] while it's lit!</span>") // initial(name) so it doesn't say "lit" twice in a row
return FALSE
else
return TRUE
/obj/item/clothing/mask/cigarette/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
light()
/obj/item/clothing/mask/cigarette/catch_fire()
if(!lit)
light("<span class='warning'>[src] is lit by the flames!</span>")
/obj/item/clothing/mask/cigarette/welder_act(mob/user, obj/item/I)
. = TRUE
if(I.tool_use_check(user, 0)) //Don't need to flash eyes because you are a badass
light("<span class='notice'>[user] casually lights [src] with [I], what a badass.</span>")
/obj/item/clothing/mask/cigarette/attackby(obj/item/I, mob/user, params)
..()
if(istype(I, /obj/item/lighter/zippo))
var/obj/item/lighter/zippo/Z = I
if(Z.lit)
light("<span class='rose'>With a single flick of [user.p_their()] wrist, [user] smoothly lights [user.p_their()] [name] with [user.p_their()] [Z]. Damn [user.p_theyre()] cool.</span>")
else if(istype(I, /obj/item/lighter))
var/obj/item/lighter/L = I
if(L.lit)
light("<span class='notice'>After some fiddling, [user] manages to light [user.p_their()] [name] with [L].</span>")
else if(istype(I, /obj/item/match/unathi))
var/obj/item/match/unathi/U = I
if(U.lit)
playsound(user.loc, 'sound/effects/unathiignite.ogg', 40, FALSE)
light("<span class='rose'>[user] spits fire at [user.p_their()] [name], igniting it.</span>")
U.matchburnout()
else if(istype(I, /obj/item/match))
var/obj/item/match/M = I
if(M.lit)
light("<span class='notice'>[user] lights [user.p_their()] [name] with [user.p_their()] [M].</span>")
else if(istype(I, /obj/item/melee/energy/sword/saber))
var/obj/item/melee/energy/sword/saber/S = I
if(S.active)
light("<span class='warning'>[user] makes a violent slashing motion, barely missing [user.p_their()] nose as light flashes. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [name] with [S] in the process.</span>")
else if(istype(I, /obj/item/assembly/igniter))
light("<span class='notice'>[user] fiddles with [I], and manages to light [user.p_their()] [name].</span>")
else if(istype(I, /obj/item/gun/magic/wand/fireball))
var/obj/item/gun/magic/wand/fireball/F = I
if(F.charges)
if(prob(50) || user.mind.assigned_role == "Wizard")
light("<span class='notice'>Holy shit, did [user] just manage to light [user.p_their()] [name] with [F], with only moderate eyebrow singing?</span>")
else
to_chat(user, "<span class='warning'>Unsure which end of the wand is which, [user] fails to light [name] with [F].</span>")
explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2)
F.charges--
//can't think of any other way to update the overlays :<
user.update_inv_wear_mask()
user.update_inv_l_hand()
user.update_inv_r_hand()
/obj/item/clothing/mask/cigarette/afterattack(obj/item/reagent_containers/glass/glass, mob/user, proximity)
..()
if(!proximity)
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
to_chat(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)
to_chat(user, "<span class='notice'>[glass] is empty.</span>")
else
to_chat(user, "<span class='notice'>[src] is full.</span>")
/obj/item/clothing/mask/cigarette/proc/light(flavor_text = null)
if(!lit)
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("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("fuel") / 5, 1), get_turf(src), 0, 0)
e.start()
if(ismob(loc))
var/mob/M = loc
M.unEquip(src, 1)
qdel(src)
return
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)
if(iscarbon(loc))
var/mob/living/carbon/C = loc
if(C.wear_mask == src) // Don't update if it's just in their hand
C.wear_mask_update(src)
set_light(2, 0.25, "#E38F46")
START_PROCESSING(SSobj, src)
playsound(src, 'sound/items/lighter/light.ogg', 25, TRUE)
/obj/item/clothing/mask/cigarette/process()
var/mob/living/M = loc
if(isliving(loc))
M.IgniteMob()
smoketime--
if(reagents.total_volume <= 0 || smoketime < 1)
die()
return
smoke()
/obj/item/clothing/mask/cigarette/extinguish_light(force)
if(!force)
return
die()
/obj/item/clothing/mask/cigarette/attack_self(mob/user)
if(lit)
user.visible_message("<span class='notice'>[user] calmly drops and treads on [src], putting it out instantly.</span>")
die()
return ..()
/obj/item/clothing/mask/cigarette/proc/smoke()
var/turf/location = get_turf(src)
var/is_being_smoked = FALSE
// Check whether this is actually in a mouth, being smoked
if(iscarbon(loc))
var/mob/living/carbon/C = loc
if(src == C.wear_mask)
// There used to be a species check here, but synthetics can smoke now
is_being_smoked = TRUE
if(location)
location.hotspot_expose(700, 5)
if(reagents && reagents.total_volume) // check if it has any reagents at all
if(is_being_smoked) // if it's being smoked, transfer reagents to the mob
var/mob/living/carbon/C = loc
for(var/datum/reagent/R in reagents.reagent_list)
reagents.trans_id_to(C, R.id, first_puff ? 1 : max(REAGENTS_METABOLISM / length(reagents.reagent_list), 0.1)) //transfer at least .1 of each chem
first_puff = FALSE
if(!reagents.total_volume) // There were reagents, but now they're gone
to_chat(C, "<span class='notice'>Your [name] loses its flavor.</span>")
else // else just remove some of the reagents
reagents.remove_any(REAGENTS_METABOLISM)
/obj/item/clothing/mask/cigarette/proc/die()
var/turf/T = get_turf(src)
set_light(0)
var/obj/item/butt = new type_butt(T)
transfer_fingerprints_to(butt)
if(ismob(loc))
var/mob/living/M = loc
to_chat(M, "<span class='notice'>Your [name] goes out.</span>")
M.unEquip(src, 1) //Force the un-equip so the overlays update
STOP_PROCESSING(SSobj, src)
qdel(src)
/obj/item/clothing/mask/cigarette/get_heat()
return lit * 1000
/obj/item/clothing/mask/cigarette/proc/can_light_fancy(obj/item/lighting_item)
return (istype(lighting_item, /obj/item/match) || istype(lighting_item, /obj/item/lighter/zippo))
/obj/item/clothing/mask/cigarette/menthol
list_reagents = list("nicotine" = 40, "menthol" = 20)
/obj/item/clothing/mask/cigarette/random
/obj/item/clothing/mask/cigarette/random/New()
list_reagents = list("nicotine" = 40, pick("fuel","saltpetre","synaptizine","green_vomit","potass_iodide","msg","lexorin","mannitol","spaceacillin","cryoxadone","holywater","tea","egg","haloperidol","mutagen","omnizine","carpet","aranesp","cryostylane","chocolate","bilk","cheese","rum","blood","charcoal","coffee","ectoplasm","space_drugs","milk","mutadone","antihol","teporone","insulin","salbutamol","toxin") = 20)
..()
/obj/item/clothing/mask/cigarette/syndicate
list_reagents = list("nicotine" = 40, "omnizine" = 20)
/obj/item/clothing/mask/cigarette/medical_marijuana
list_reagents = list("thc" = 40, "cbd" = 20)
/obj/item/clothing/mask/cigarette/robustgold
list_reagents = list("nicotine" = 40, "gold" = 1)
/obj/item/clothing/mask/cigarette/shadyjims
list_reagents = list("nicotine" = 40, "lipolicide" = 7.5, "ammonia" = 2, "atrazine" = 1, "toxin" = 1.5)
/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"
/obj/item/clothing/mask/cigarette/rollie/Initialize(mapload)
. = ..()
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
/obj/item/clothing/mask/cigarette/rollie/custom
list_reagents = list()
/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/Initialize(mapload)
. = ..()
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
////////////
// CIGARS //
////////////
/obj/item/clothing/mask/cigarette/cigar
name = "\improper 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 = 300
chem_volume = 120
list_reagents = list("nicotine" = 120)
/obj/item/clothing/mask/cigarette/cigar/try_light(obj/item/cigar, obj/item/lighting_item)
if(can_light_fancy(lighting_item))
return ..()
/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"
/obj/item/clothing/mask/cigarette/cigar/havana
name = "\improper Premium Havanian Cigar"
desc = "A cigar fit for only the best for the best."
icon_state = "cigar2off"
icon_on = "cigar2on"
icon_off = "cigar2off"
smoketime = 450
chem_volume = 180
list_reagents = list("nicotine" = 180)
/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 = 1
/obj/item/cigbutt/Initialize(mapload)
. = ..()
pixel_x = rand(-10,10)
pixel_y = rand(-10,10)
transform = turn(transform,rand(0,360))
/obj/item/cigbutt/decompile_act(obj/item/matter_decompiler/C, mob/user)
if(isdrone(user))
C.stored_comms["wood"] += 1
qdel(src)
return TRUE
return ..()
/obj/item/cigbutt/cigarbutt
name = "cigar butt"
desc = "A manky old cigar butt."
icon_state = "cigarbutt"
/obj/item/clothing/mask/cigarette/cigar/attackby(obj/item/I, mob/user, params)
if(!is_type_in_typecache(I, things_that_light))
return
if(can_light_fancy(I))
..()
else
to_chat(user, "<span class='notice'>[src] straight out REFUSES to be lit by such uncivilized means.</span>")
/obj/item/clothing/mask/holo_cigar
name = "Holo-Cigar"
desc = "A sleek electronic cigar imported straight from Sol. You feel badass merely glimpsing it..."
icon_state = "holocigaroff"
var/enabled = FALSE
/// Tracks if this is the first cycle smoking the cigar.
var/has_smoked = FALSE
/obj/item/clothing/mask/holo_cigar/Destroy()
. = ..()
STOP_PROCESSING(SSobj, src)
/obj/item/clothing/mask/holo_cigar/update_icon_state()
. = ..()
icon_state = "holocigar[enabled ? "on" : "off"]"
/obj/item/clothing/mask/holo_cigar/examine(mob/user)
. = ..()
if(enabled)
. += "[src] hums softly as it synthesizes nicotine."
else
. += "[src] seems to be inactive."
/obj/item/clothing/mask/holo_cigar/process()
if(!iscarbon(loc))
return
var/mob/living/carbon/C = loc
if(C.wear_mask != src)
return
if(!has_smoked)
C.reagents.add_reagent("nicotine", 2)
has_smoked = TRUE
else
C.reagents.add_reagent("nicotine", REAGENTS_METABOLISM)
/obj/item/clothing/mask/holo_cigar/equipped(mob/user, slot, initial)
. = ..()
if(enabled && slot == SLOT_HUD_WEAR_MASK)
if(!HAS_TRAIT_FROM(user, TRAIT_BADASS, HOLO_CIGAR))
ADD_TRAIT(user, TRAIT_BADASS, HOLO_CIGAR)
to_chat(user, "<span class='notice'>You feel more badass while smoking [src].</span>")
/obj/item/clothing/mask/holo_cigar/dropped(mob/user, silent)
. = ..()
has_smoked = FALSE
if(HAS_TRAIT_FROM(user, TRAIT_BADASS, HOLO_CIGAR))
REMOVE_TRAIT(user, TRAIT_BADASS, HOLO_CIGAR)
to_chat(user, "<span class='notice'>You feel less badass.</span>")
/obj/item/clothing/mask/holo_cigar/attack_self(mob/user)
. = ..()
if(enabled)
enabled = FALSE
to_chat(user, "<span class='notice'>You disable the holo-cigar.</span>")
STOP_PROCESSING(SSobj, src)
else
enabled = TRUE
to_chat(user, "<span class='notice'>You enable the holo-cigar.</span>")
START_PROCESSING(SSobj, src)
update_appearance(UPDATE_ICON_STATE)
/////////////////
//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 = 500
chem_volume = 200
list_reagents = list("nicotine" = 200)
/obj/item/clothing/mask/cigarette/pipe/die()
return
/obj/item/clothing/mask/cigarette/pipe/light(flavor_text = null)
if(!lit)
lit = TRUE
damtype = "fire"
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)
/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, "<span class='notice'>Your [name] goes out, and you empty the ash.</span>")
lit = FALSE
icon_state = icon_off
item_state = icon_off
M.update_inv_wear_mask()
STOP_PROCESSING(SSobj, src)
return
smoke()
/obj/item/clothing/mask/cigarette/pipe/attack_self(mob/user) // Extinguishes the pipe.
if(lit)
user.visible_message("<span class='notice'>[user] puts out [src].</span>")
lit = FALSE
icon_state = icon_off
item_state = icon_off
STOP_PROCESSING(SSobj, src)
return
/obj/item/clothing/mask/cigarette/pipe/try_light(obj/item/cigar, obj/item/lighting_item)
if(can_light_fancy(lighting_item))
return ..()
// Refill or light the pipe
/obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/food/snacks/grown))
var/obj/item/food/snacks/grown/O = I
if(O.dry)
if(reagents.total_volume == reagents.maximum_volume)
to_chat(user, "<span class='warning'>[src] is full!</span>")
return
O.reagents.trans_to(src, chem_volume)
to_chat(user, "<span class='notice'>You stuff the [O.name] into the pipe.</span>")
smoketime = max(reagents.total_volume * REAGENT_TIME_RATIO, smoketime)
qdel(O)
else
to_chat(user, "<span class='warning'>You need to dry this first!</span>")
return
if(!is_type_in_typecache(I, things_that_light))
return
if(can_light_fancy(I))
..()
else
to_chat(user, "<span class='notice'>[src] straight out REFUSES to be lit by such means.</span>")
/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."
icon_state = "cobpipeoff"
item_state = "cobpipeoff"
icon_on = "cobpipeon" //Note - these are in masks.dmi
icon_off = "cobpipeoff"
smoketime = 0 //there is nothing to smoke initially
chem_volume = 160
list_reagents = list()
///////////
//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/food/snacks/grown))
var/obj/item/food/snacks/grown/O = target
if(O.dry)
user.unEquip(target, 1)
user.unEquip(src, 1)
var/obj/item/clothing/mask/cigarette/rollie/custom/R = new /obj/item/clothing/mask/cigarette/rollie/custom(user.loc)
R.chem_volume = target.reagents.total_volume
target.reagents.trans_to(R, R.chem_volume)
user.put_in_active_hand(R)
to_chat(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
to_chat(user, "<span class='warning'>You need to dry this first!</span>")
else
..()
#undef REAGENT_TIME_RATIO