cocooooonuuuuuuts
@@ -863,3 +863,201 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
|||||||
|
|
||||||
if(reagents && reagents.total_volume)
|
if(reagents && reagents.total_volume)
|
||||||
hand_reagents()
|
hand_reagents()
|
||||||
|
|
||||||
|
///////////////
|
||||||
|
/////BONGS/////
|
||||||
|
///////////////
|
||||||
|
|
||||||
|
/obj/item/bong
|
||||||
|
name = "bong"
|
||||||
|
desc = "A water bong used for smoking dried plants."
|
||||||
|
icon = 'icons/obj/bongs.dmi'
|
||||||
|
icon_state = null
|
||||||
|
item_state = null
|
||||||
|
w_class = WEIGHT_CLASS_NORMAL
|
||||||
|
light_color = "#FFCC66"
|
||||||
|
var/icon_off = "bong"
|
||||||
|
var/icon_on = "bong_lit"
|
||||||
|
var/chem_volume = 100
|
||||||
|
var/last_used_time //for cooldown
|
||||||
|
var/firecharges = 0 //used for counting how many hits can be taken before the flame goes out
|
||||||
|
var/list/list_reagents = list() //For the base reagents bongs could get
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/bong/Initialize()
|
||||||
|
. = ..()
|
||||||
|
create_reagents(chem_volume, NO_REACT) // so it doesn't react until you light it
|
||||||
|
reagents.add_reagent_list(list_reagents)
|
||||||
|
icon_state = icon_off
|
||||||
|
|
||||||
|
/obj/item/bong/attackby(obj/item/O, mob/user, params)
|
||||||
|
. = ..()
|
||||||
|
//If we're using a dried plant..
|
||||||
|
if(istype(O,/obj/item/reagent_containers/food/snacks))
|
||||||
|
var/obj/item/reagent_containers/food/snacks/DP = O
|
||||||
|
if (DP.dry)
|
||||||
|
//Nothing if our bong is full
|
||||||
|
if (reagents.holder_full())
|
||||||
|
user.show_message("<span class='notice'>The bowl is full!</span>", 1)
|
||||||
|
return
|
||||||
|
|
||||||
|
//Transfer reagents and remove the plant
|
||||||
|
user.show_message("<span class='notice'>You stuff the [DP] into the [src]'s bowl.</span>", 1)
|
||||||
|
DP.reagents.trans_to(src, 100)
|
||||||
|
qdel(DP)
|
||||||
|
return
|
||||||
|
else
|
||||||
|
user.show_message("<span class='warning'>[DP] must be dried first!</span>", 1)
|
||||||
|
return
|
||||||
|
|
||||||
|
if (O.heat > 500)
|
||||||
|
if (reagents && reagents.total_volume) //if there's stuff in the bong
|
||||||
|
var/lighting_text = O.ignition_effect(src, user)
|
||||||
|
if(lighting_text)
|
||||||
|
//Logic regarding igniting it on
|
||||||
|
if (firecharges == 0)
|
||||||
|
user.show_message("<span class='notice'>You light the [src] with the [O]!</span>", 1)
|
||||||
|
bongturnon()
|
||||||
|
else
|
||||||
|
user.show_message("<span class='notice'>You rekindle [src]'s flame with the [O]!</span>", 1)
|
||||||
|
|
||||||
|
firecharges = 1
|
||||||
|
return
|
||||||
|
else
|
||||||
|
user.show_message("<span warning='notice'>There's nothing to light up in the bowl.</span>", 1)
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/item/bong/CtrlShiftClick(mob/user) //empty reagents on alt click
|
||||||
|
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||||
|
return
|
||||||
|
|
||||||
|
if (reagents && reagents.total_volume)
|
||||||
|
user.show_message("<span class='notice'>You empty the [src].</span>", 1)
|
||||||
|
reagents.clear_reagents()
|
||||||
|
if(firecharges)
|
||||||
|
firecharges = 0
|
||||||
|
bongturnoff()
|
||||||
|
else
|
||||||
|
user.show_message("<span class='notice'>The [src] is already empty.</span>", 1)
|
||||||
|
|
||||||
|
/obj/item/bong/AltClick(mob/user)
|
||||||
|
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||||
|
return
|
||||||
|
|
||||||
|
if(firecharges)
|
||||||
|
firecharges = 0
|
||||||
|
bongturnoff()
|
||||||
|
user.show_message("<span class='notice'>You quench the flame.</span>", 1)
|
||||||
|
|
||||||
|
/obj/item/bong/examine(mob/user)
|
||||||
|
..()
|
||||||
|
if(!reagents.total_volume)
|
||||||
|
to_chat(user, "<span class='notice'>The bowl is empty.</span>")
|
||||||
|
else if (reagents.total_volume > 80)
|
||||||
|
to_chat(user, "<span class='notice'>The bowl is filled to the brim.</span>")
|
||||||
|
else if (reagents.total_volume > 40)
|
||||||
|
to_chat(user, "<span class='notice'>The bowl has plenty weed in it.</span>")
|
||||||
|
else
|
||||||
|
to_chat(user, "<span class='notice'>The bowl has some weed in it.</span>")
|
||||||
|
|
||||||
|
to_chat(user, "<span class='notice'>Ctrl+Shift-click to empty.</span>")
|
||||||
|
to_chat(user, "<span class='notice'>Alt-click to extinguish.</span>")
|
||||||
|
|
||||||
|
/obj/item/bong/ignition_effect(atom/A, mob/user)
|
||||||
|
if(firecharges)
|
||||||
|
. = "<span class='notice'>[user] lights [A] off of the [src].</span>"
|
||||||
|
else
|
||||||
|
. = ""
|
||||||
|
|
||||||
|
/obj/item/bong/attack(mob/living/carbon/M, mob/living/carbon/user, obj/target)
|
||||||
|
//if it's lit up, some stuff in the bowl and the user is a target, and we're not on cooldown
|
||||||
|
if (!reagents)
|
||||||
|
return
|
||||||
|
|
||||||
|
if (M ==! user)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(user.is_mouth_covered(head_only = 1))
|
||||||
|
to_chat(user, "<span class='warning'>Remove your headgear first.</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
if(user.is_mouth_covered(mask_only = 1))
|
||||||
|
to_chat(user, "<span class='warning'>Remove your mask first.</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
if (!reagents.total_volume)
|
||||||
|
to_chat(user, "<span class='warning'>There's nothing in the bowl.</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
if (!firecharges)
|
||||||
|
to_chat(user, "<span class='warning'>You have to light it up first.</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
if (last_used_time + 30 < world.time)
|
||||||
|
var/hit_strength
|
||||||
|
var/noise
|
||||||
|
var/hittext = ""
|
||||||
|
//if the intent is help then you take a small hit, else a big one
|
||||||
|
if (user.a_intent == INTENT_HARM)
|
||||||
|
hit_strength = 2
|
||||||
|
noise = 100
|
||||||
|
hittext = "big hit"
|
||||||
|
else
|
||||||
|
hit_strength = 1
|
||||||
|
noise = 70
|
||||||
|
hittext = "hit"
|
||||||
|
//bubbling sound
|
||||||
|
playsound(user.loc,'sound/effects/bonghit.ogg', noise, 1)
|
||||||
|
|
||||||
|
last_used_time = world.time
|
||||||
|
|
||||||
|
//message
|
||||||
|
user.visible_message("<span class='notice'>[user] begins to take a "+ hittext +" from the [src]!</span>", \
|
||||||
|
"<span class='notice'>You begin to take a "+ hittext +" from [src].</span>")
|
||||||
|
|
||||||
|
//we take a hit here, after an uninterrupted delay
|
||||||
|
if(do_after(user, 25, target = user))
|
||||||
|
if (reagents && reagents.total_volume)
|
||||||
|
var/fraction = 12 * hit_strength
|
||||||
|
|
||||||
|
var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new
|
||||||
|
s.set_up(reagents, hit_strength, 18, user.loc)
|
||||||
|
s.start()
|
||||||
|
|
||||||
|
reagents.reaction(user, INGEST, fraction)
|
||||||
|
if(!reagents.trans_to(user, fraction))
|
||||||
|
reagents.remove_any(fraction)
|
||||||
|
|
||||||
|
if (hit_strength == 2 && prob(15))
|
||||||
|
user.emote("cough")
|
||||||
|
user.adjustOxyLoss(15)
|
||||||
|
|
||||||
|
//playsound(user.loc, 'sound/effects/smoke.ogg', 10, 1, -3)
|
||||||
|
|
||||||
|
user.visible_message("<span class='notice'>[user] takes a "+ hittext +" from the [src]!</span>", \
|
||||||
|
"<span class='notice'>You take a "+ hittext +" from [src].</span>")
|
||||||
|
|
||||||
|
firecharges = firecharges - 1
|
||||||
|
if (firecharges == 0)
|
||||||
|
bongturnoff()
|
||||||
|
if (!reagents.total_volume)
|
||||||
|
firecharges = 0
|
||||||
|
bongturnoff()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/bong/proc/bongturnon()
|
||||||
|
icon_state = icon_on
|
||||||
|
set_light(3, 0.8)
|
||||||
|
|
||||||
|
/obj/item/bong/proc/bongturnoff()
|
||||||
|
icon_state = icon_off
|
||||||
|
set_light(0, 0.0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/bong/coconut
|
||||||
|
name = "coconut bong"
|
||||||
|
icon_off = "coconut_bong"
|
||||||
|
icon_on = "coconut_bong_lit"
|
||||||
|
desc = "A water bong used for smoking dried plants. This one's made out of a coconut and some bamboo"
|
||||||
@@ -358,3 +358,11 @@
|
|||||||
time = 100
|
time = 100
|
||||||
category = CAT_MISC
|
category = CAT_MISC
|
||||||
always_availible = FALSE // Disabled til learned
|
always_availible = FALSE // Disabled til learned
|
||||||
|
|
||||||
|
/datum/crafting_recipe/coconut_bong
|
||||||
|
name = "Coconut Bong"
|
||||||
|
result = /obj/item/bong/coconut
|
||||||
|
reqs = list(/obj/item/stack/sheet/mineral/bamboo = 2,
|
||||||
|
/obj/item/reagent_containers/food/snacks/grown/coconut = 1)
|
||||||
|
time = 70
|
||||||
|
category = CAT_MISC
|
||||||
@@ -240,7 +240,7 @@
|
|||||||
dat += "</table>"
|
dat += "</table>"
|
||||||
else
|
else
|
||||||
dat += "No trait-related genes detected in sample.<br>"
|
dat += "No trait-related genes detected in sample.<br>"
|
||||||
if(can_insert && istype(disk.gene, /datum/plant_gene/trait))
|
if(can_insert && istype(disk.gene, /datum/plant_gene/trait) && !seed.is_gene_forbidden(disk.gene))
|
||||||
dat += "<a href='?src=[REF(src)];op=insert'>Insert: [disk.gene.get_name()]</a>"
|
dat += "<a href='?src=[REF(src)];op=insert'>Insert: [disk.gene.get_name()]</a>"
|
||||||
dat += "</div>"
|
dat += "</div>"
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -244,3 +244,283 @@
|
|||||||
product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit
|
product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit
|
||||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||||
growthstages = 2
|
growthstages = 2
|
||||||
|
|
||||||
|
|
||||||
|
// Coconut
|
||||||
|
/obj/item/seeds/coconut
|
||||||
|
name = "pack of coconut seeds"
|
||||||
|
desc = "They're seeds that grow into coconut palm trees."
|
||||||
|
icon_state = "seed-coconut"
|
||||||
|
species = "coconut"
|
||||||
|
plantname = "Coconut Palm Tree"
|
||||||
|
product = /obj/item/reagent_containers/food/snacks/grown/coconut
|
||||||
|
lifespan = 50
|
||||||
|
endurance = 30
|
||||||
|
potency = 35
|
||||||
|
growing_icon = 'icons/obj/hydroponics/growing.dmi'
|
||||||
|
icon_dead = "coconut-dead"
|
||||||
|
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||||
|
forbiddengenes = list(/datum/plant_gene/trait/squash, /datum/plant_gene/trait/stinging)
|
||||||
|
reagents_add = list("coconutmilk" = 0.3)
|
||||||
|
|
||||||
|
/obj/item/reagent_containers/food/snacks/grown/coconut
|
||||||
|
seed = /obj/item/seeds/coconut
|
||||||
|
name = "coconut"
|
||||||
|
desc = "Hard shell of a nut containing delicious milk inside. Perhaps try using something sharp?"
|
||||||
|
icon_state = "coconut"
|
||||||
|
item_state = "coconut"
|
||||||
|
possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50)
|
||||||
|
spillable = FALSE
|
||||||
|
resistance_flags = ACID_PROOF
|
||||||
|
volume = 150 //so it won't cut reagents despite having the capacity for them
|
||||||
|
w_class = WEIGHT_CLASS_SMALL
|
||||||
|
force = 5
|
||||||
|
throwforce = 5
|
||||||
|
hitsound = 'sound/weapons/klonk.ogg'
|
||||||
|
attack_verb = list("klonked", "donked", "bonked")
|
||||||
|
var/opened = FALSE
|
||||||
|
var/carved = FALSE
|
||||||
|
var/chopped = FALSE
|
||||||
|
var/straw = FALSE
|
||||||
|
var/fused = FALSE
|
||||||
|
var/fusedactive = FALSE
|
||||||
|
var/defused = FALSE
|
||||||
|
|
||||||
|
/obj/item/reagent_containers/food/snacks/grown/coconut/Initialize(mapload, obj/item/seeds/new_seed)
|
||||||
|
. = ..()
|
||||||
|
var/newvolume
|
||||||
|
newvolume = 50 + round(seed.potency,10)
|
||||||
|
if (seed.get_gene(/datum/plant_gene/trait/maxchem))
|
||||||
|
newvolume = newvolume + 50
|
||||||
|
volume = newvolume
|
||||||
|
reagents.maximum_volume = newvolume
|
||||||
|
reagents.update_total()
|
||||||
|
|
||||||
|
transform *= TRANSFORM_USING_VARIABLE(40, 100) + 0.5 //temporary fix for size?
|
||||||
|
|
||||||
|
/obj/item/reagent_containers/food/snacks/grown/coconut/attack_self(mob/user)
|
||||||
|
if (opened == TRUE)
|
||||||
|
if(possible_transfer_amounts.len)
|
||||||
|
var/i=0
|
||||||
|
for(var/A in possible_transfer_amounts)
|
||||||
|
i++
|
||||||
|
if(A == amount_per_transfer_from_this)
|
||||||
|
if(i<possible_transfer_amounts.len)
|
||||||
|
amount_per_transfer_from_this = possible_transfer_amounts[i+1]
|
||||||
|
else
|
||||||
|
amount_per_transfer_from_this = possible_transfer_amounts[1]
|
||||||
|
to_chat(user, "<span class='notice'>[src]'s transfer amount is now [amount_per_transfer_from_this] units.</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/item/reagent_containers/food/snacks/grown/coconut/attackby(obj/item/W, mob/user, params)
|
||||||
|
//DEFUSING NADE LOGIC
|
||||||
|
if (W.tool_behaviour == TOOL_WIRECUTTER && fused == TRUE)
|
||||||
|
user.show_message("<span class='notice'>You cut the fuse!</span>", 1)
|
||||||
|
playsound(user, W.hitsound, 50, 1, -1)
|
||||||
|
icon_state = "coconut_carved"
|
||||||
|
desc = "A coconut. This one's got a hole in it."
|
||||||
|
name = "coconut"
|
||||||
|
defused = TRUE
|
||||||
|
fused = FALSE
|
||||||
|
fusedactive = FALSE
|
||||||
|
if(!seed.get_gene(/datum/plant_gene/trait/glow))
|
||||||
|
set_light(0, 0.0)
|
||||||
|
return
|
||||||
|
//IGNITING NADE LOGIC
|
||||||
|
if(fusedactive == FALSE && fused == TRUE)
|
||||||
|
var/lighting_text = W.ignition_effect(src, user)
|
||||||
|
if(lighting_text)
|
||||||
|
user.visible_message("<span class='warning'>[user] ignites [src]'s fuse!</span>", "<span class='userdanger'>You ignite the [src]'s fuse!</span>")
|
||||||
|
fusedactive = TRUE
|
||||||
|
defused = FALSE
|
||||||
|
playsound(src, 'sound/effects/fuse.ogg', 100, 0)
|
||||||
|
message_admins("[ADMIN_LOOKUPFLW(user)] ignited a coconut bomb for detonation at [ADMIN_VERBOSEJMP(user)] "+ pretty_string_from_reagent_list(reagents.reagent_list))
|
||||||
|
log_game("[key_name(user)] primed a coconut grenade for detonation at [AREACOORD(user)].")
|
||||||
|
addtimer(CALLBACK(src, .proc/prime), 5 SECONDS)
|
||||||
|
icon_state = "coconut_grenade_active"
|
||||||
|
desc = "RUN!"
|
||||||
|
if(!seed.get_gene(/datum/plant_gene/trait/glow))
|
||||||
|
light_color = "#FFCC66" //for the fuse
|
||||||
|
set_light(3, 0.8)
|
||||||
|
return
|
||||||
|
|
||||||
|
//ADDING A FUSE, NADE LOGIC
|
||||||
|
if (istype(W,/obj/item/stack/sheet/cloth) || istype(W,/obj/item/stack/sheet/durathread))
|
||||||
|
if (carved == TRUE && straw == FALSE && fused == FALSE)
|
||||||
|
user.show_message("<span class='notice'>You add a fuse to the coconut!</span>", 1)
|
||||||
|
W.use(1)
|
||||||
|
fused = TRUE
|
||||||
|
icon_state = "coconut_grenade"
|
||||||
|
desc = "A makeshift bomb made out of a coconut. You estimate the fuse is long enough for 5 seconds."
|
||||||
|
name = "coconut bomb"
|
||||||
|
return
|
||||||
|
//ADDING STRAW LOGIC
|
||||||
|
if (istype(W,/obj/item/stack/sheet/mineral/bamboo) && opened == TRUE && straw == FALSE && fused == FALSE)
|
||||||
|
user.show_message("<span class='notice'>You add a bamboo straw to the coconut!</span>", 1)
|
||||||
|
straw = TRUE
|
||||||
|
W.use(1)
|
||||||
|
icon_state += "_straw"
|
||||||
|
desc = "You can already feel like you're on a tropical vacation."
|
||||||
|
//OPENING THE NUT LOGIC
|
||||||
|
if (carved == FALSE && chopped == FALSE)
|
||||||
|
if(W.tool_behaviour == TOOL_SCREWDRIVER)
|
||||||
|
user.show_message("<span class='notice'>You make a hole in the coconut!</span>", 1)
|
||||||
|
carved = TRUE
|
||||||
|
opened = TRUE
|
||||||
|
reagent_flags = OPENCONTAINER
|
||||||
|
ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||||
|
icon_state = "coconut_carved"
|
||||||
|
desc = "A coconut. This one's got a hole in it."
|
||||||
|
playsound(user, W.hitsound, 50, 1, -1)
|
||||||
|
return
|
||||||
|
else if(W.sharpness)
|
||||||
|
user.show_message("<span class='notice'>You slice the coconut open!</span>", 1)
|
||||||
|
chopped = TRUE
|
||||||
|
opened = TRUE
|
||||||
|
reagent_flags = OPENCONTAINER
|
||||||
|
ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
|
||||||
|
spillable = TRUE
|
||||||
|
icon_state = "coconut_chopped"
|
||||||
|
desc = "A coconut. This one's sliced open, with all its delicious contents for your eyes to savour."
|
||||||
|
playsound(user, W.hitsound, 50, 1, -1)
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/item/reagent_containers/food/snacks/grown/coconut/attack(mob/living/M, mob/user, obj/target)
|
||||||
|
if(M && user.a_intent == INTENT_HARM && spillable == FALSE)
|
||||||
|
var/obj/item/bodypart/affecting = user.zone_selected //Find what the player is aiming at
|
||||||
|
if (affecting == BODY_ZONE_HEAD && prob(15))
|
||||||
|
//smash the nut open
|
||||||
|
var/armor_block = min(90, M.run_armor_check(affecting, "melee", null, null,armour_penetration)) // For normal attack damage
|
||||||
|
M.apply_damage(force, BRUTE, affecting, armor_block)
|
||||||
|
|
||||||
|
//Sound
|
||||||
|
playsound(user, hitsound, 100, 1, -1)
|
||||||
|
|
||||||
|
//Attack logs
|
||||||
|
log_combat(user, M, "attacked", src)
|
||||||
|
|
||||||
|
//Display an attack message.
|
||||||
|
if(M != user)
|
||||||
|
M.visible_message("<span class='danger'>[user] has cracked open a [src.name] on [M]'s head!</span>", \
|
||||||
|
"<span class='userdanger'>[user] has cracked open a [src.name] on [M]'s head!</span>")
|
||||||
|
else
|
||||||
|
user.visible_message("<span class='danger'>[M] cracks open a [src.name] on their [M.p_them()] head!</span>", \
|
||||||
|
"<span class='userdanger'>[M] cracks open a [src.name] on [M.p_their()] head!</span>")
|
||||||
|
|
||||||
|
//The coconut breaks open so splash its reagents
|
||||||
|
spillable = TRUE
|
||||||
|
SplashReagents(M)
|
||||||
|
|
||||||
|
//Lastly we remove the nut
|
||||||
|
qdel(src)
|
||||||
|
else
|
||||||
|
. = ..()
|
||||||
|
return
|
||||||
|
|
||||||
|
if(fusedactive)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(opened == FALSE)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!canconsume(M, user))
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!reagents || !reagents.total_volume)
|
||||||
|
to_chat(user, "<span class='warning'>[src] is empty!</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
if(istype(M))
|
||||||
|
if(user.a_intent == INTENT_HARM && spillable == TRUE)
|
||||||
|
var/R
|
||||||
|
M.visible_message("<span class='danger'>[user] splashes the contents of [src] onto [M]!</span>", \
|
||||||
|
"<span class='userdanger'>[user] splashes the contents of [src] onto [M]!</span>")
|
||||||
|
if(reagents)
|
||||||
|
for(var/datum/reagent/A in reagents.reagent_list)
|
||||||
|
R += A.id + " ("
|
||||||
|
R += num2text(A.volume) + "),"
|
||||||
|
if(isturf(target) && reagents.reagent_list.len && thrownby)
|
||||||
|
log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]")
|
||||||
|
message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].")
|
||||||
|
reagents.reaction(M, TOUCH)
|
||||||
|
log_combat(user, M, "splashed", R)
|
||||||
|
reagents.clear_reagents()
|
||||||
|
else
|
||||||
|
if(M != user)
|
||||||
|
M.visible_message("<span class='danger'>[user] attempts to feed something to [M].</span>", \
|
||||||
|
"<span class='userdanger'>[user] attempts to feed something to you.</span>")
|
||||||
|
if(!do_mob(user, M))
|
||||||
|
return
|
||||||
|
if(!reagents || !reagents.total_volume)
|
||||||
|
return // The drink might be empty after the delay, such as by spam-feeding
|
||||||
|
M.visible_message("<span class='danger'>[user] feeds something to [M].</span>", "<span class='userdanger'>[user] feeds something to you.</span>")
|
||||||
|
log_combat(user, M, "fed", reagents.log_list())
|
||||||
|
else
|
||||||
|
to_chat(user, "<span class='notice'>You swallow a gulp of [src].</span>")
|
||||||
|
var/fraction = min(5/reagents.total_volume, 1)
|
||||||
|
reagents.reaction(M, INGEST, fraction)
|
||||||
|
addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5), 5)
|
||||||
|
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
|
||||||
|
|
||||||
|
/obj/item/reagent_containers/food/snacks/grown/coconut/afterattack(obj/target, mob/user, proximity)
|
||||||
|
. = ..()
|
||||||
|
if(fusedactive)
|
||||||
|
return
|
||||||
|
|
||||||
|
if((!proximity) || !check_allowed_items(target,target_self=1))
|
||||||
|
return
|
||||||
|
|
||||||
|
if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it.
|
||||||
|
if(!reagents.total_volume)
|
||||||
|
to_chat(user, "<span class='warning'>[src] is empty!</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
if(target.reagents.holder_full())
|
||||||
|
to_chat(user, "<span class='warning'>[target] is full.</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
var/trans = reagents.trans_to(target, amount_per_transfer_from_this)
|
||||||
|
to_chat(user, "<span class='notice'>You transfer [trans] unit\s of the solution to [target].</span>")
|
||||||
|
|
||||||
|
else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us.
|
||||||
|
if(!target.reagents.total_volume)
|
||||||
|
to_chat(user, "<span class='warning'>[target] is empty and can't be refilled!</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
if(reagents.holder_full())
|
||||||
|
to_chat(user, "<span class='warning'>[src] is full.</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
|
||||||
|
to_chat(user, "<span class='notice'>You fill [src] with [trans] unit\s of the contents of [target].</span>")
|
||||||
|
|
||||||
|
else if(reagents.total_volume)
|
||||||
|
if(user.a_intent == INTENT_HARM && spillable == TRUE)
|
||||||
|
user.visible_message("<span class='danger'>[user] splashes the contents of [src] onto [target]!</span>", \
|
||||||
|
"<span class='notice'>You splash the contents of [src] onto [target].</span>")
|
||||||
|
reagents.reaction(target, TOUCH)
|
||||||
|
reagents.clear_reagents()
|
||||||
|
|
||||||
|
/obj/item/reagent_containers/food/snacks/grown/coconut/dropped(mob/user)
|
||||||
|
. = ..()
|
||||||
|
transform *= TRANSFORM_USING_VARIABLE(40, 100) + 0.5 //temporary fix for size?
|
||||||
|
|
||||||
|
/obj/item/reagent_containers/food/snacks/grown/coconut/proc/prime()
|
||||||
|
if (!defused)
|
||||||
|
var/turf/T = get_turf(src)
|
||||||
|
reagents.chem_temp = 1000
|
||||||
|
//Disable seperated contents when the grenade primes
|
||||||
|
if (seed.get_gene(/datum/plant_gene/trait/noreact))
|
||||||
|
DISABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT)
|
||||||
|
reagents.handle_reactions()
|
||||||
|
log_game("Coconut bomb detonation at [AREACOORD(T)], location [loc]")
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/item/reagent_containers/food/snacks/grown/coconut/ex_act(severity)
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/item/reagent_containers/food/snacks/grown/coconut/deconstruct(disassembled = TRUE)
|
||||||
|
if(!disassembled && fused)
|
||||||
|
prime()
|
||||||
|
if(!QDELETED(src))
|
||||||
|
qdel(src)
|
||||||
@@ -27,6 +27,7 @@
|
|||||||
var/rarity = 0 // How rare the plant is. Used for giving points to cargo when shipping off to CentCom.
|
var/rarity = 0 // How rare the plant is. Used for giving points to cargo when shipping off to CentCom.
|
||||||
var/list/mutatelist = list() // The type of plants that this plant can mutate into.
|
var/list/mutatelist = list() // The type of plants that this plant can mutate into.
|
||||||
var/list/genes = list() // Plant genes are stored here, see plant_genes.dm for more info.
|
var/list/genes = list() // Plant genes are stored here, see plant_genes.dm for more info.
|
||||||
|
var/list/forbiddengenes = list()
|
||||||
var/list/reagents_add = list()
|
var/list/reagents_add = list()
|
||||||
// A list of reagents to add to product.
|
// A list of reagents to add to product.
|
||||||
// Format: "reagent_id" = potency multiplier
|
// Format: "reagent_id" = potency multiplier
|
||||||
@@ -96,6 +97,10 @@
|
|||||||
S.reagents_add = reagents_add.Copy() // Faster than grabbing the list from genes.
|
S.reagents_add = reagents_add.Copy() // Faster than grabbing the list from genes.
|
||||||
return S
|
return S
|
||||||
|
|
||||||
|
obj/item/seeds/proc/is_gene_forbidden(typepath)
|
||||||
|
return (locate(typepath) in forbiddengenes)
|
||||||
|
|
||||||
|
|
||||||
/obj/item/seeds/proc/get_gene(typepath)
|
/obj/item/seeds/proc/get_gene(typepath)
|
||||||
return (locate(typepath) in genes)
|
return (locate(typepath) in genes)
|
||||||
|
|
||||||
@@ -448,7 +453,7 @@
|
|||||||
for(var/i in 1 to amount_random_traits)
|
for(var/i in 1 to amount_random_traits)
|
||||||
var/random_trait = pick((subtypesof(/datum/plant_gene/trait)-typesof(/datum/plant_gene/trait/plant_type)))
|
var/random_trait = pick((subtypesof(/datum/plant_gene/trait)-typesof(/datum/plant_gene/trait/plant_type)))
|
||||||
var/datum/plant_gene/trait/T = new random_trait
|
var/datum/plant_gene/trait/T = new random_trait
|
||||||
if(T.can_add(src))
|
if(T.can_add(src) && !is_gene_forbidden(T))
|
||||||
genes += T
|
genes += T
|
||||||
else
|
else
|
||||||
qdel(T)
|
qdel(T)
|
||||||
|
|||||||
@@ -247,6 +247,23 @@
|
|||||||
. = 1
|
. = 1
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
/datum/reagent/consumable/coconutmilk
|
||||||
|
name = "Coconut Milk"
|
||||||
|
id = "coconutmilk"
|
||||||
|
description = "A transparent white liquid extracted from coconuts. Rich in taste."
|
||||||
|
color = "#DFDFDF" // rgb: 223, 223, 223
|
||||||
|
taste_description = "sweet milk"
|
||||||
|
quality = DRINK_GOOD
|
||||||
|
glass_icon_state = "glass_white"
|
||||||
|
glass_name = "glass of coconut milk"
|
||||||
|
glass_desc = "White and nutritious goodness!"
|
||||||
|
|
||||||
|
/datum/reagent/consumable/coconutmilk/on_mob_life(mob/living/carbon/M)
|
||||||
|
if(M.getBruteLoss() && prob(20))
|
||||||
|
M.heal_bodypart_damage(2,0, 0)
|
||||||
|
. = 1
|
||||||
|
..()
|
||||||
|
|
||||||
/datum/reagent/consumable/cream
|
/datum/reagent/consumable/cream
|
||||||
name = "Cream"
|
name = "Cream"
|
||||||
id = "cream"
|
id = "cream"
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
/obj/item/seeds/chanter = 3,
|
/obj/item/seeds/chanter = 3,
|
||||||
/obj/item/seeds/chili = 3,
|
/obj/item/seeds/chili = 3,
|
||||||
/obj/item/seeds/cocoapod = 3,
|
/obj/item/seeds/cocoapod = 3,
|
||||||
|
/obj/item/seeds/coconut = 3,
|
||||||
/obj/item/seeds/coffee = 3,
|
/obj/item/seeds/coffee = 3,
|
||||||
/obj/item/seeds/cotton = 3,
|
/obj/item/seeds/cotton = 3,
|
||||||
/obj/item/seeds/corn = 3,
|
/obj/item/seeds/corn = 3,
|
||||||
|
|||||||
BIN
icons/obj/bongs.dmi
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |