Files
AlphaM01andGitHub 154e024607 Blud changes, seasonal consumables, new cocktail recipe, and other miscellaneous fixes. (#7592)
## About The Pull Request
This PR includes a few different things mostly revolving around food and
drinks:
1) **BLUD REBALANCE**
Blud has been changed significantly. This change will be accompanied by
an IC bulletin and OOC dev blog post, the changes are as follows:
- Blud can now always be consumed, even when you're starving.
- Blud is now metabolized after ingestion at the same rate as regular
blood (a lot faster than previously).
- Blud's blood_content values have been bumped significantly. 30u of
real Blood restores ~120 nutrition, while 30u of Blud restores 25% less
nutrition, at ~90 (tested in-game).
- Blud boxes now contain 50u instead of 30u. For reference,
regular-sized milk cartons are 50u and mini milk cartons are 30u.
- Cargo's Vetalan Care Package now consists of 5 boxes of Blud MAX and
another 5 boxes of Blud MAX Light, for a total of 250u of real Blood and
250u of Synthblood. Previously it consisted of 3 bags of AB+ which are
200u each for 600u of Blood.
The suit that comes in the care package was also deleted, but it still
comes in a nice coffin.

2) **SEASONAL ITEMS**
All of the items from last year's Christmas testmerge have been re-added
with a few minor updates.
New Halloween themed items have also been added.
These seasonal items are fully functional, but **can't be obtained
currently since they're not taking advantage of the seasonal item
rotation code at this time.**
The full list of items is as follows:
- Two new cigarette varieties, Temperamento Vanilla (Xmas) and Kaiju
Cherry (Halloween)
- Three new types of bottled alcohol, Caramel Whiskey (Xmas), Sour Apple
Schnapps (Halloween) and Candy Corn Flavored Vodka (Halloween)
- Seven new cocktails using seasonal ingredients, Caramel White Russian
(Xmas), Salted Caramel Cider (Xmas), Appletini (Halloween), Sour Apple
Mimosa (Halloween), Sour Apple Fizz (Halloween), Candy Corn Martini
(Halloween) and Halloween Punch (Halloween).
- There is also a "food synthesis" recipe for turning the candy corn
martini into edible jello shots using water and protein.
- Three new snacks, Gingerbread Cookies (Xmas), Stroopwafels (Xmas) and
Holiday Cake (Xmas, Contraband). Halloween snacks will hopefully be
added later down the line.
- Four new soda varieties: Space Cola Cinnamon (Xmas), Space-Up
Cranberry (Xmas), Space Cola Licorice (Halloween) and Dr. Gibb Mystery
(Halloween).
- One new canned coffee variety: Peppermint Mocha (Xmas). Halloween
variety will hopefully come along with the snacks. It's a lot of
spriting work.

3) **ASSORTED FIXES AND QOL IMPROVEMENTS**
- Bar and Cafe vendors now stock canned Pineapple juice year-round, this
is generally useful but especially handy for the halloween vodka
cocktails.
- One new year-round cocktail recipe: The AMF.
- Robust Softdrinks no longer stocks KyoCola, Ocha Midori and Ramune,
since those are already present in the NipponTan vending machines. This
cuts down on that particular menu's bloat a little.
- Temperamento Menthol Company now called Temperamento Tobacco Company
- CC's Hard Rootbeer proof is now calculated as VODKA/2, slightly
lowering it's proof from 50 to 40. This was done because the bottle desc
for this drink states it's regular rootbeer with vodka added.
- BludBox MAX no longer calls donors "free-range", the blood is now
"ethically-sourced" instead.
- The lore entry on Vetalan Outreach Society has been brushed up and
also had typos corrected.
## Why It's Good For The Game
1) Vetalans, Medical and Blud have been in need of addressing for a
while now, and this is the mechanical part of the effort, making
Vetalans less reliant on blood bags.
2) The seasonal item system is here. The groundwork and the first batch
of items are laid out, I just need to figure out how to implement and
test the seasonal rotations.
3) Most of these are QoL and fixes. The AMF came into being very late at
night after the brainworms won.
## Changelog
🆑
add: Added two new brands of seasonal cigarette.
add: Added three new brands of seasonal alcohol.
add: Added four new varieties of seasonal soda.
add: Added seven new varieties of seasonal cocktails.
add: Added one seasonal variety of food synthesis reaction.
add: Added three new varieties of seasonal snack food.
add: Added one seasonal variety of canned coffee.
add: Added one new regular cocktail.
add: Added Pineapple Juice cans to Bar and Cafe vendors.
del: Removed NipponTan drinks from Robust Softdrinks stock.
tweak: Temperamento Menthol Company renamed to Temperamento Tobacco
Company.
tweak: Small changes to the Vetalan Outreach Society advertisement.
tweak: Small changes to BludBox MAX description.
tweak: Blud now always nourishes Vetalans regardless of nutrition
status.
tweak: Blud now metabolizes at the same rate as Blood when ingested.
tweak: Blud now provides Vetalans with 75% the nutritional value
compared to Blood.
tweak: Vetalan Care Package now contains BludBox MAX and BludBox MAX
Light cartons instead of AB+ Blood Packs.
tweak: Vetalan Care Package no longer contains a suit.
tweak: BludBox cartons now hold 50u, up from 30u.
tweak: CC's Hard Rootbeer proof now calculated in a more lore-friendly
manner.
fix: Pineapple juice no longer purple when poured into a metamorphic
glass.
imageadd: added sprites for all item additions listed above.
/🆑
2026-05-29 02:45:35 -04:00

772 lines
25 KiB
Plaintext

//cleansed 9/15/2012 17:48
/*
CONTAINS:
MATCHES
CIGARETTES
CIGARS
SMOKING PIPES
CUSTOM CIGS
CHEAP LIGHTERS
ZIPPO
CIGARETTE PACKETS ARE IN FANCY.DM
*/
//For anything that can light stuff on fire
/obj/item/flame
var/lit = 0
/obj/item/flame/is_hot()
return lit
///////////
//MATCHES//
///////////
/obj/item/flame/match
name = "match"
desc = "A simple match stick, used for lighting fine smokables."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "match_unlit"
var/burnt = 0
var/smoketime = 5
w_class = WEIGHT_CLASS_TINY
origin_tech = list(TECH_MATERIAL = 1)
slot_flags = SLOT_EARS
attack_verb = list("burnt", "singed")
drop_sound = 'sound/items/drop/food.ogg'
pickup_sound = 'sound/items/pickup/food.ogg'
/obj/item/flame/match/process(delta_time)
if(isliving(loc))
var/mob/living/M = loc
M.IgniteMob()
var/turf/location = get_turf(src)
smoketime--
if(smoketime < 1)
burn_out()
return
if(location)
location.hotspot_expose(700, 5)
return
/obj/item/flame/match/dropped(mob/user, flags, atom/newLoc)
//If dropped, put ourselves out
//not before lighting up the turf we land on, though.
if(lit)
spawn(0)
var/turf/location = src.loc
if(istype(location))
location.hotspot_expose(700, 5)
burn_out()
return ..()
/obj/item/flame/match/proc/burn_out()
lit = 0
burnt = 1
damage_type = DAMAGE_TYPE_BRUTE
icon_state = "match_burnt"
item_state = "cigoff"
name = "burnt match"
desc = "A match. This one has seen better days."
STOP_PROCESSING(SSobj, src)
//////////////////
//FINE SMOKABLES//
//////////////////
/obj/item/clothing/mask/smokable
name = "smokable item"
desc = "You're not sure what this is. You should probably ahelp it."
body_cover_flags = 0
var/lit = 0
var/icon_on
var/type_butt = null
var/chem_volume = 0
var/max_smoketime = 0 //Related to sprites
var/smoketime = 0
var/is_pipe = 0 //Prevents a runtime with pipes
var/matchmes = "USER lights NAME with FLAME"
var/lightermes = "USER lights NAME with FLAME"
var/zippomes = "USER lights NAME with FLAME"
var/weldermes = "USER lights NAME with FLAME"
var/ignitermes = "USER lights NAME with FLAME"
var/brand
blood_sprite_state = null //Can't bloody these
/obj/item/clothing/mask/smokable/Initialize(mapload)
. = ..()
atom_flags |= NOREACT // so it doesn't react until you light it
create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15
if(smoketime && !max_smoketime)
max_smoketime = smoketime
/obj/item/clothing/mask/smokable/proc/smoke(amount)
if(smoketime > max_smoketime)
smoketime = max_smoketime
smoketime -= amount
if(reagents && reagents.total_volume) // check if it has any reagents at all
if(ishuman(loc))
var/mob/living/carbon/human/C = loc
if (src == C.wear_mask && C.check_has_mouth()) // if it's in the human/monkey mouth, transfer reagents to the mob
reagents.trans_to_mob(C, REM, CHEM_INGEST, 0.2) // Most of it is not inhaled... balance reasons.
else // else just remove some of the reagents
reagents.remove_any(REM)
/obj/item/clothing/mask/smokable/process(delta_time)
var/turf/location = get_turf(src)
smoke(1)
if(smoketime < 1)
die()
return
if(location)
location.hotspot_expose(700, 5)
/obj/item/clothing/mask/smokable/update_icon()
if(lit)
icon_state = "[initial(icon_state)]_on"
item_state = "[initial(item_state)]_on"
else if(smoketime < max_smoketime)
if(is_pipe)
icon_state = initial(icon_state)
item_state = initial(item_state)
else
icon_state = "[initial(icon_state)]_burnt"
item_state = "[initial(item_state)]_burnt"
update_worn_icon()
..()
/obj/item/clothing/mask/smokable/examine(mob/user, dist)
. = ..()
if(is_pipe)
return
var/smoke_percent = round((smoketime / max_smoketime) * 100)
switch(smoke_percent)
if(90 to INFINITY)
. += "[src] is still fresh."
if(60 to 90)
. += "[src] has a good amount of burn time remaining."
if(30 to 60)
. += "[src] is about half finished."
if(10 to 30)
. += "[src] is starting to burn low."
else
. += "[src] is nearly burnt out!"
/obj/item/clothing/mask/smokable/proc/light(var/flavor_text = "[usr] lights the [name].")
if(!src.lit)
src.lit = 1
damage_type = DAMAGE_TYPE_BURN
if(reagents.get_reagent_amount("phoron")) // the phoron explodes when exposed to fire
var/datum/effect_system/reagents_explosion/e = new()
e.set_up(round(reagents.get_reagent_amount("phoron") / 2.5, 1), get_turf(src), 0, 0)
e.start()
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()
qdel(src)
return
reagents.set_no_react(FALSE)
var/turf/T = get_turf(src)
T.visible_message(flavor_text)
update_icon()
set_light(2, 0.25, "#E38F46")
START_PROCESSING(SSobj, src)
/obj/item/clothing/mask/smokable/proc/die(var/nomessage = 0)
var/turf/T = get_turf(src)
set_light(0)
STOP_PROCESSING(SSobj, src)
if (type_butt)
var/obj/item/butt = new type_butt(T)
transfer_fingerprints_to(butt)
if(brand)
butt.desc += " This one is \a [brand]."
if(ismob(loc))
var/mob/living/M = loc
if (!nomessage)
to_chat(M, "<span class='notice'>Your [name] goes out.</span>")
if(ishuman(M))
var/mob/living/carbon/human/H=M
if(H.a_intent==INTENT_HELP && !H.incapacitated())
H.put_in_hands(butt)
qdel(src)
else
new /obj/effect/debris/cleanable/ash(T)
if(ismob(loc))
var/mob/living/M = loc
if (!nomessage)
to_chat(M, "<span class='notice'>Your [name] goes out, and you empty the ash.</span>")
lit = 0
icon_state = initial(icon_state)
item_state = initial(item_state)
update_worn_icon()
smoketime = 0
reagents.clear_reagents()
name = "empty [initial(name)]"
/obj/item/clothing/mask/smokable/proc/quench()
lit = 0
STOP_PROCESSING(SSobj, src)
update_icon()
/obj/item/clothing/mask/smokable/legacy_mob_melee_hook(mob/target, mob/user, clickchain_flags, list/params, mult, target_zone, intent)
var/mob/living/carbon/human/H = target
if(lit && H == user && istype(H))
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
to_chat(H, "<span class='warning'>\The [blocked] is in the way!</span>")
return CLICKCHAIN_DO_NOT_PROPAGATE
to_chat(H, "<span class='notice'>You take a drag on your [name].</span>")
smoke(5)
return CLICKCHAIN_DO_NOT_PROPAGATE
return ..()
/obj/item/clothing/mask/smokable/attackby(obj/item/W as obj, mob/user as mob)
..()
if(W.is_hot())
var/text = matchmes
if(istype(W, /obj/item/flame/match))
text = matchmes
else if(istype(W, /obj/item/flame/lighter/zippo))
text = zippomes
else if(istype(W, /obj/item/flame/lighter))
text = lightermes
else if(istype(W, /obj/item/weldingtool))
text = weldermes
else if(istype(W, /obj/item/assembly/igniter))
text = ignitermes
text = replacetext(text, "USER", "[user]")
text = replacetext(text, "NAME", "[name]")
text = replacetext(text, "FLAME", "[W.name]")
light(text)
/obj/item/clothing/mask/smokable/legacy_mob_melee_hook(mob/target, mob/user, clickchain_flags, list/params, mult, target_zone, intent)
var/mob/living/L = target
if(istype(L) && L.on_fire)
user.do_attack_animation(L)
light("<span class='notice'>[user] coldly lights the [name] with the burning body of [L].</span>")
return
else
return ..()
/obj/item/clothing/mask/smokable/water_act(amount)
if(amount >= 5)
quench()
/obj/item/clothing/mask/smokable/cigarette
name = "cigarette"
desc = "A roll of tobacco and nicotine."
icon_state = "cig"
item_state = "cig"
throw_speed = 0.5
w_class = WEIGHT_CLASS_TINY
slot_flags = SLOT_EARS | SLOT_MASK
worn_render_flags = WORN_RENDER_INHAND_NO_RENDER | WORN_RENDER_SLOT_ALLOW_DEFAULT
attack_verb = list("burnt", "singed")
type_butt = /obj/item/cigbutt
chem_volume = 15
max_smoketime = 300
smoketime = 300
var/nicotine_amt = 2
matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>"
lightermes = "<span class='notice'>USER manages to light their NAME with FLAME.</span>"
zippomes = "<span class='rose'>With a flick of their wrist, USER lights their NAME with their FLAME.</span>"
weldermes = "<span class='notice'>USER casually lights the NAME with FLAME.</span>"
ignitermes = "<span class='notice'>USER fiddles with FLAME, and manages to light their NAME.</span>"
/obj/item/clothing/mask/smokable/cigarette/Initialize(mapload)
. = ..()
if(nicotine_amt)
reagents.add_reagent("nicotine", nicotine_amt)
/obj/item/clothing/mask/smokable/cigarette/attackby(obj/item/W as obj, mob/user as mob)
..()
if(istype(W, /obj/item/melee/transforming/energy/sword))
var/obj/item/melee/transforming/energy/sword/S = W
if(S.active)
light("<span class='warning'>[user] swings their [W], barely missing their nose. They light their [name] in the process.</span>")
return
/obj/item/clothing/mask/smokable/cigarette/afterattack(atom/target, mob/user, clickchain_flags, list/params)
..()
if(!(clickchain_flags & CLICKCHAIN_HAS_PROXIMITY))
return
var/obj/item/reagent_containers/glass/glass = target
if(istype(glass)) //you can dip cigarettes into beakers
var/transfered = glass.reagents.trans_to_obj(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/smokable/cigarette/attack_self(mob/user, datum/event_args/actor/actor)
if(lit == 1)
if(user.a_intent == INTENT_HARM)
user.visible_message("<span class='notice'>[user] drops and treads on the lit [src], putting it out instantly.</span>")
die(1)
else
user.visible_message("<span class='notice'>[user] puts out \the [src].</span>")
quench()
/obj/item/clothing/mask/smokable/cigarette/import
desc = "A roll of exotic blended herbs."
icon_state = "cigimp"
item_state = "cigimp"
type_butt = /obj/item/cigbutt/imp
nicotine_amt = 0
/obj/item/clothing/mask/smokable/cigarette/light
icon_state = "ciglite"
item_state = "ciglite"
type_butt = /obj/item/cigbutt/light
nicotine_amt = 1
/obj/item/clothing/mask/smokable/cigarette/herbal
desc = "A roll of aromatic blended herbs."
icon_state = "cigherbal"
item_state = "cigherbal"
type_butt = /obj/item/cigbutt/herbal
nicotine_amt = 0
/obj/item/clothing/mask/smokable/cigarette/kaiju
desc = "The black paper smells pleasantly sweet."
icon_state = "cigkaiju"
item_state = "cigkaiju"
type_butt = /obj/item/cigbutt/kaiju
nicotine_amt = 1
////////////
// CIGARS //
////////////
/obj/item/clothing/mask/smokable/cigarette/cigar
name = "premium cigar"
desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!"
icon_state = "cigar2"
type_butt = /obj/item/cigbutt/cigarbutt
throw_speed = 0.5
item_state = "cigar"
max_smoketime = 1500
smoketime = 1500
chem_volume = 20
nicotine_amt = 4
matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>"
lightermes = "<span class='notice'>USER manages to offend their NAME by lighting it with FLAME.</span>"
zippomes = "<span class='rose'>With a flick of their wrist, USER lights their NAME with their FLAME.</span>"
weldermes = "<span class='notice'>USER insults NAME by lighting it with FLAME.</span>"
ignitermes = "<span class='notice'>USER fiddles with FLAME, and manages to light their NAME with the power of science.</span>"
/obj/item/clothing/mask/smokable/cigarette/cigar/cohiba
name = "\improper Cohiba Robusto cigar"
desc = "There's little more you could want from a cigar."
icon_state = "cigar2"
nicotine_amt = 7
/obj/item/clothing/mask/smokable/cigarette/cigar/havana
name = "premium Havanian cigar"
desc = "A cigar fit for only the best of the best."
icon_state = "cigar2"
max_smoketime = 7200
smoketime = 7200
chem_volume = 30
nicotine_amt = 10
/obj/item/clothing/mask/smokable/cigarette/cigar/taj
name = "S'rendarr's Hand"
desc = "A Tajaran smokable herb similar to tobacco, produced at one of the countless plantations on Adhomai. It is known to have medicinal properties."
icon_state = "cigar3"
/obj/item/clothing/mask/smokable/cigarette/cigar/taj/Initialize(mapload)
. = ..()
if(nicotine_amt)
reagents.add_reagent("bicaridine", nicotine_amt)
/obj/item/clothing/mask/smokable/cigarette/cigar/taj/premium
name = "S'rendarr's Own"
desc = "A premium Tajaran cigar, licensed for export by Confederate Commonwealth of Adhomai representing the best product of all Tajaran nations."
icon_state = "cigar2"
nicotine_amt = 7
/obj/item/clothing/mask/smokable/cigarette/cigar/taj/premium/Initialize(mapload)
. = ..()
if(nicotine_amt)
reagents.add_reagent("bicaridine", nicotine_amt)
/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
slot_flags = SLOT_EARS
throw_force = 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/cigarbutt
name = "cigar butt"
desc = "A manky old cigar butt."
icon_state = "cigarbutt"
/obj/item/clothing/mask/smokable/cigarette/cigar/attackby(obj/item/W as obj, mob/user as mob)
..()
update_worn_icon()
/obj/item/cigbutt/imp
icon_state = "cigimpbutt"
/obj/item/cigbutt/light
icon_state = "ciglitebutt"
/obj/item/cigbutt/herbal
icon_state = "cigherbalbutt"
/obj/item/cigbutt/kaiju
icon_state = "cigkaijubutt"
/////////////////
//SMOKING PIPES//
/////////////////
/obj/item/clothing/mask/smokable/pipe
name = "smoking pipe"
desc = "A pipe, for smoking. Made of fine, stained cherry wood."
icon_state = "pipe"
item_state = "pipe"
smoketime = 0
chem_volume = 50
matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>"
lightermes = "<span class='notice'>USER manages to light their NAME with FLAME.</span>"
zippomes = "<span class='rose'>With much care, USER lights their NAME with their FLAME.</span>"
weldermes = "<span class='notice'>USER recklessly lights NAME with FLAME.</span>"
ignitermes = "<span class='notice'>USER fiddles with FLAME, and manages to light their NAME with the power of science.</span>"
is_pipe = 1
/obj/item/clothing/mask/smokable/pipe/Initialize(mapload)
. = ..()
name = "empty [initial(name)]"
/obj/item/clothing/mask/smokable/pipe/attack_self(mob/user, datum/event_args/actor/actor)
if(lit == 1)
if(user.a_intent == INTENT_HARM)
user.visible_message("<span class='notice'>[user] empties the lit [src] on the floor!.</span>")
die(1)
else
user.visible_message("<span class='notice'>[user] puts out \the [src].</span>")
quench()
/obj/item/clothing/mask/smokable/pipe/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/melee/transforming/energy/sword))
return
..()
if (istype(W, /obj/item/reagent_containers/food/snacks))
var/obj/item/reagent_containers/food/snacks/grown/G = W
if (!G.dry)
to_chat(user, "<span class='notice'>[G] must be dried before you stuff it into [src].</span>")
return
if (smoketime)
to_chat(user, "<span class='notice'>[src] is already packed.</span>")
return
max_smoketime = 1000
smoketime = 1000
if(G.reagents)
G.reagents.trans_to_obj(src, G.reagents.total_volume)
name = "[G.name]-packed [initial(name)]"
qdel(G)
else if(istype(W, /obj/item/flame/lighter))
var/obj/item/flame/lighter/L = W
if(L.lit)
light("<span class='notice'>[user] manages to light their [name] with [W].</span>")
else if(istype(W, /obj/item/flame/match))
var/obj/item/flame/match/M = W
if(M.lit)
light("<span class='notice'>[user] lights their [name] with their [W].</span>")
else if(istype(W, /obj/item/assembly/igniter))
light("<span class='notice'>[user] fiddles with [W], and manages to light their [name] with the power of science.</span>")
update_worn_icon()
/obj/item/clothing/mask/smokable/pipe/cobpipe
name = "corn cob pipe"
desc = "A nicotine delivery system popularized by folksy backwoodsmen, kept popular in the modern age and beyond by space hipsters."
icon_state = "cobpipe"
item_state = "cobpipe"
chem_volume = 35
/obj/item/clothing/mask/smokable/pipe/bonepipe
name = "bone pipe"
desc = "A fragile pipe, masterfully carved by hand from the bone of an unknown creature."
icon_state = "bonepipe"
item_state = "bonepipe"
chem_volume = 25
///////////////
//CUSTOM CIGS//
///////////////
//and by custom cigs i mean craftable joints. smoke weed every day
/obj/item/clothing/mask/smokable/cigarette/joint
name = "joint"
desc = "This probably shouldn't ever show up."
icon_state = "joint"
max_smoketime = 500
smoketime = 500
nicotine_amt = 0
/obj/item/clothing/mask/smokable/cigarette/blunt
name = "blunt"
desc = "This probably shouldn't ever show up."
icon_state = "blunt"
max_smoketime = 750
smoketime = 750
nicotine_amt = 0
/obj/item/rollingpaper
name = "rolling paper"
desc = "A small, thin piece of easily flammable paper, commonly used for rolling and smoking various dried plants."
icon = 'icons/obj/cigarettes.dmi'
w_class = WEIGHT_CLASS_TINY
icon_state = "cig paper"
/obj/item/rollingpaper/attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/reagent_containers/food/snacks))
var/obj/item/reagent_containers/food/snacks/grown/G = W
if (!G.dry)
to_chat(user, "<span class='notice'>[G] must be dried before you roll it into [src].</span>")
return
var/obj/item/clothing/mask/smokable/cigarette/joint/J = new /obj/item/clothing/mask/smokable/cigarette/joint(user.loc)
to_chat(usr,"<span class='notice'>You roll the [G.name] into a joint!</span>")
J.add_fingerprint(user)
if(G.reagents)
G.reagents.trans_to_obj(J, G.reagents.total_volume)
J.name = "[G.name] joint"
J.desc = "A joint lovingly rolled and filled with [G.name]. Blaze it."
qdel(G)
qdel(src)
/obj/item/rollingblunt
name = "blunt paper"
desc = "A small, thin piece of tobacco-based paper, commonly used for rolling and smoking various dried plants."
icon = 'icons/obj/cigarettes.dmi'
w_class = WEIGHT_CLASS_TINY
icon_state = "blunt paper"
/obj/item/rollingblunt/attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/reagent_containers/food/snacks))
var/obj/item/reagent_containers/food/snacks/grown/G = W
if (!G.dry)
to_chat(user, "<span class='notice'>[G] must be dried before you roll it into [src].</span>")
return
var/obj/item/clothing/mask/smokable/cigarette/blunt/B = new /obj/item/clothing/mask/smokable/cigarette/blunt(user.loc)
to_chat(usr,"<span class='notice'>You roll the [G.name] into a blunt!</span>")
B.add_fingerprint(user)
if(G.reagents)
G.reagents.trans_to_obj(B, G.reagents.total_volume)
B.name = "[G.name] blunt"
B.desc = "A blunt lovingly rolled and filled with [G.name]. Blaze it."
qdel(G)
qdel(src)
/////////
//ZIPPO//
/////////
/obj/item/flame/lighter
name = "cheap lighter"
desc = "A cheap-as-free lighter."
icon = 'icons/obj/items.dmi'
icon_state = "lighter-g"
item_state = "lighter-g"
w_class = WEIGHT_CLASS_TINY
throw_force = 4
suit_storage_class = SUIT_STORAGE_CLASS_SOFTWEAR
belt_storage_class = BELT_CLASS_SMALL
slot_flags = SLOT_BELT
attack_verb = list("burnt", "singed")
var/base_state
/obj/item/flame/lighter/zippo
name = "\improper Zippo lighter"
desc = "The zippo."
icon = 'icons/obj/zippo.dmi'
icon_state = "zippo"
item_state = "zippo"
/obj/item/flame/lighter/random/Initialize(mapload)
. = ..()
icon_state = "lighter-[pick("r","c","y","g")]"
item_state = icon_state
base_state = icon_state
/obj/item/flame/lighter/attack_self(mob/user, datum/event_args/actor/actor)
if(!base_state)
base_state = icon_state
if(!lit)
if(return_air_immutable()?.moles_by_flag(GAS_FLAG_OXIDIZER)<0.01)
user.visible_message("<span class='notice'>The [name] fails to light.")
return
lit = 1
icon_state = "[base_state]on"
item_state = "[base_state]on"
if(istype(src, /obj/item/flame/lighter/zippo) )
user.visible_message("<span class='rose'>Without even breaking stride, [user] flips open and lights [src] in one smooth movement.</span>")
playsound(loc, "sound/items/zippo_open.ogg", 75, 1, -1)
else
if(prob(95))
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src].</span>")
else
to_chat(user, "<span class='warning'>You burn yourself while lighting the lighter.</span>")
var/mob/living/carbon/human/H = ishuman(user)? user : null
if (user.get_held_index(1) == src)
H?.apply_damage(2,DAMAGE_TYPE_BURN,"l_hand")
else
H?.apply_damage(2,DAMAGE_TYPE_BURN,"r_hand")
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src], they however burn their finger in the process.</span>")
set_light(2)
START_PROCESSING(SSobj, src)
else
lit = 0
icon_state = "[base_state]"
item_state = "[base_state]"
if(istype(src, /obj/item/flame/lighter/zippo) )
user.visible_message("<span class='rose'>You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.</span>")
playsound(loc, "sound/items/zippo_close.ogg", 75, 1, -1)
else
user.visible_message("<span class='notice'>[user] quietly shuts off the [src].</span>")
set_light(0)
STOP_PROCESSING(SSobj, src)
/obj/item/flame/lighter/legacy_mob_melee_hook(mob/target, mob/user, clickchain_flags, list/params, mult, target_zone, intent)
var/mob/living/carbon/human/H = target
if(!istype(H))
return ..()
if(lit == 1)
H.IgniteMob()
add_attack_logs(user,H,"Lit on fire with [src]")
if(istype(H.wear_mask, /obj/item/clothing/mask/smokable/cigarette) && user.zone_sel.selecting == O_MOUTH && lit)
var/obj/item/clothing/mask/smokable/cigarette/cig = H.wear_mask
if(H == user)
cig.attackby(src, user)
else
if(istype(src, /obj/item/flame/lighter/zippo))
cig.light("<span class='rose'>[user] whips the [name] out and holds it for [H].</span>")
else
cig.light("<span class='notice'>[user] holds the [name] out for [H], and lights the [cig.name].</span>")
return CLICKCHAIN_DO_NOT_PROPAGATE
return ..()
/obj/item/flame/lighter/process(delta_time)
var/turf/location = get_turf(src)
if(location)
var/datum/gas_mixture/env=location.return_air_immutable()
if(env?.moles_by_flag(GAS_FLAG_OXIDIZER)<0.01)
visible_message("<span class='notice'>The [name] suddenly goes out.")
lit=0
icon_state = "[base_state]"
item_state = "[base_state]"
set_light(0)
STOP_PROCESSING(SSobj, src)
return
location.hotspot_expose(700, 5)
return
//Here we add Zippo skins.
/obj/item/flame/lighter/zippo/black
name = "\improper holy Zippo lighter"
desc = "Only in regards to Christianity, that is."
icon_state = "blackzippo"
/obj/item/flame/lighter/zippo/blue
name = "\improper blue Zippo lighter"
icon_state = "bluezippo"
/obj/item/flame/lighter/zippo/engraved
name = "\improper engraved Zippo lighter"
icon_state = "engravedzippo"
item_state = "zippo"
/obj/item/flame/lighter/zippo/gold
name = "\improper golden Zippo lighter"
icon_state = "goldzippo"
/obj/item/flame/lighter/zippo/moff
name = "\improper moth Zippo lighter"
desc = "Too cute to be a Tymisian."
icon_state = "moffzippo"
/obj/item/flame/lighter/zippo/red
name = "\improper red Zippo lighter"
icon_state = "redzippo"
/obj/item/flame/lighter/zippo/ironic
name = "\improper ironic Zippo lighter"
desc = "What a quiant idea."
icon_state = "ironiczippo"
/obj/item/flame/lighter/zippo/capitalist
name = "\improper capitalist Zippo lighter"
desc = "Made of gold and obsidian, this is truly not worth however much you spent on it."
icon_state = "cappiezippo"
/obj/item/flame/lighter/zippo/communist
name = "\improper communist Zippo lighter"
desc = "All you need to spark a revolution."
icon_state = "commiezippo"
/obj/item/flame/lighter/zippo/royal
name = "\improper royal Zippo lighter"
desc = "An incredibly fancy lighter, gilded and covered in the color of royalty."
icon_state = "royalzippo"
/obj/item/flame/lighter/zippo/gonzo
name = "\improper Gonzo Zippo lighter"
desc = "A lighter with the iconic Gonzo fist painted on it."
icon_state = "gonzozippo"
/obj/item/flame/lighter/zippo/rainbow
name = "\improper rainbow Zippo lighter"
icon_state = "rainbowzippo"
/obj/item/flame/lighter/zippo/cowgirl
name = "\improper Cyan Cowgirl Zippo lighter"
icon_state = "cowzippo"
/obj/item/flame/lighter/zippo/bullet
name = "\improper bullet lighter"
desc = "A lighter fashioned out of an old bullet casing."
icon_state = "bulletlighter"
//Tajaran Lighters
/obj/item/flame/lighter/zippo/taj
name = "\improper Adhomian lighter"
desc = "A brass mechanical lighter made on Adhomai. Its robust design made it a staple tool for Tajara on all sides of the civil war."
icon_state = "tajzippo"
//Ashlander Lighters
/obj/item/flame/lighter/ashlander
name = "spark striker"
desc = "A fragment of elder stone and a chunk of charcoal, bound together by sinew and bone to easily create sparks."
icon = 'icons/obj/items.dmi'
icon_state = "striker"
item_state = "lighter-r"