Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into dojo-ghostrole
This commit is contained in:
@@ -863,3 +863,205 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
|
||||
if(reagents && reagents.total_volume)
|
||||
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>", MSG_VISUAL)
|
||||
return
|
||||
|
||||
//Transfer reagents and remove the plant
|
||||
user.show_message("<span class='notice'>You stuff the [DP] into the [src]'s bowl.</span>", MSG_VISUAL)
|
||||
DP.reagents.trans_to(src, 100)
|
||||
qdel(DP)
|
||||
return
|
||||
else
|
||||
user.show_message("<span class='warning'>[DP] must be dried first!</span>", MSG_VISUAL)
|
||||
return
|
||||
|
||||
if (O.get_temperature() <= 500)
|
||||
return
|
||||
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>", MSG_VISUAL)
|
||||
bongturnon()
|
||||
else
|
||||
user.show_message("<span class='notice'>You rekindle [src]'s flame with the [O]!</span>", MSG_VISUAL)
|
||||
|
||||
firecharges = 1
|
||||
return
|
||||
else
|
||||
user.show_message("<span warning='notice'>There's nothing to light up in the bowl.</span>", MSG_VISUAL)
|
||||
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>", MSG_VISUAL)
|
||||
reagents.clear_reagents()
|
||||
if(firecharges)
|
||||
firecharges = 0
|
||||
bongturnoff()
|
||||
else
|
||||
user.show_message("<span class='notice'>The [src] is already empty.</span>", MSG_VISUAL)
|
||||
|
||||
/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>", MSG_VISUAL)
|
||||
return TRUE
|
||||
|
||||
/obj/item/bong/examine(mob/user)
|
||||
. = ..()
|
||||
if(!reagents.total_volume)
|
||||
. += "<span class='notice'>The bowl is empty.</span>"
|
||||
else if (reagents.total_volume > 80)
|
||||
. += "<span class='notice'>The bowl is filled to the brim.</span>"
|
||||
else if (reagents.total_volume > 40)
|
||||
. += "<span class='notice'>The bowl has plenty weed in it.</span>"
|
||||
else
|
||||
. += "<span class='notice'>The bowl has some weed in it.</span>"
|
||||
|
||||
. += "<span class='notice'>Ctrl+Shift-click to empty.</span>"
|
||||
. += "<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 (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)
|
||||
return ..()
|
||||
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))
|
||||
return
|
||||
if (!(reagents && reagents.total_volume))
|
||||
return
|
||||
|
||||
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)
|
||||
|
||||
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)
|
||||
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."
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "forcefield projector"
|
||||
desc = "An experimental device that can create several forcefields at a distance."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "signmaker_engi"
|
||||
icon_state = "signmaker_forcefield"
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
item_flags = NOBLUDGEON
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
/obj/item/holosign_creator/atmos
|
||||
name = "ATMOS holofan projector"
|
||||
desc = "A holographic projector that creates holographic barriers that prevent changes in atmosphere conditions."
|
||||
icon_state = "signmaker_engi"
|
||||
icon_state = "signmaker_atmos"
|
||||
holosign_type = /obj/structure/holosign/barrier/atmos
|
||||
creation_time = 0
|
||||
max_signs = 3
|
||||
|
||||
@@ -374,7 +374,7 @@
|
||||
It appears to have a wooden grip and a shaved down guard."
|
||||
icon_state = "cxsword_hilt_traitor"
|
||||
force_on = 30
|
||||
armour_penetration = 50
|
||||
armour_penetration = 35
|
||||
embedding = list("embedded_pain_multiplier" = 10, "embed_chance" = 75, "embedded_fall_chance" = 0, "embedded_impact_pain_multiplier" = 10)
|
||||
block_chance = 50
|
||||
hitsound_on = 'sound/weapons/blade1.ogg'
|
||||
|
||||
@@ -216,10 +216,11 @@
|
||||
return
|
||||
else
|
||||
if(last_hit < world.time)
|
||||
if(target.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
|
||||
playsound(target, 'sound/weapons/genhit.ogg', 50, 1)
|
||||
return
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if (H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
|
||||
return
|
||||
if(check_martial_counter(H, user))
|
||||
return
|
||||
playsound(get_turf(src), 'sound/effects/woodhit.ogg', 75, 1, -1)
|
||||
|
||||
@@ -11,11 +11,9 @@
|
||||
var/charge_cost = 30
|
||||
|
||||
/obj/item/borg/stun/attack(mob/living/M, mob/living/user)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.check_shields(src, 0, "[M]'s [name]", MELEE_ATTACK))
|
||||
playsound(M, 'sound/weapons/genhit.ogg', 50, 1)
|
||||
return FALSE
|
||||
if(M.check_shields(src, 0, "[M]'s [name]", MELEE_ATTACK))
|
||||
playsound(M, 'sound/weapons/genhit.ogg', 50, 1)
|
||||
return FALSE
|
||||
if(iscyborg(user))
|
||||
var/mob/living/silicon/robot/R = user
|
||||
if(!R.cell.use(charge_cost))
|
||||
|
||||
@@ -192,9 +192,14 @@
|
||||
var/obj/O
|
||||
if(R.max_res_amount > 1) //Is it a stack?
|
||||
O = new R.result_type(usr.drop_location(), R.res_amount * multiplier)
|
||||
else
|
||||
else if(ispath(R.result_type, /turf))
|
||||
var/turf/T = usr.drop_location()
|
||||
if(!isturf(T))
|
||||
return
|
||||
T.PlaceOnTop(R.result_type, flags = CHANGETURF_INHERIT_AIR)
|
||||
O = new R.result_type(usr.drop_location())
|
||||
O.setDir(usr.dir)
|
||||
if(O)
|
||||
O.setDir(usr.dir)
|
||||
use(R.req_amount * multiplier)
|
||||
|
||||
//START: oh fuck i'm so sorry
|
||||
|
||||
@@ -61,6 +61,7 @@
|
||||
/obj/item/radio,
|
||||
/obj/item/clothing/gloves,
|
||||
/obj/item/holosign_creator,
|
||||
/obj/item/forcefield_projector,
|
||||
/obj/item/assembly/signaler
|
||||
))
|
||||
STR.can_hold = can_hold
|
||||
@@ -458,8 +459,7 @@
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/radio,
|
||||
/obj/item/clothing/gloves,
|
||||
/obj/item/holosign_creator/atmos,
|
||||
/obj/item/holosign_creator/engineering,
|
||||
/obj/item/holosign_creator,
|
||||
/obj/item/forcefield_projector,
|
||||
/obj/item/assembly/signaler,
|
||||
/obj/item/lightreplacer,
|
||||
@@ -571,6 +571,7 @@
|
||||
/obj/item/reagent_containers/spray,
|
||||
/obj/item/soap,
|
||||
/obj/item/holosign_creator,
|
||||
/obj/item/forcefield_projector,
|
||||
/obj/item/key/janitor,
|
||||
/obj/item/clothing/gloves,
|
||||
/obj/item/melee/flyswatter,
|
||||
@@ -582,7 +583,7 @@
|
||||
|
||||
/obj/item/storage/belt/bandolier
|
||||
name = "bandolier"
|
||||
desc = "A bandolier for holding shotgun ammunition."
|
||||
desc = "A bandolier for holding ammunition."
|
||||
icon_state = "bandolier"
|
||||
item_state = "bandolier"
|
||||
|
||||
@@ -592,7 +593,7 @@
|
||||
STR.max_items = 18
|
||||
STR.display_numerical_stacking = TRUE
|
||||
STR.can_hold = typecacheof(list(
|
||||
/obj/item/ammo_casing/shotgun
|
||||
/obj/item/ammo_casing
|
||||
))
|
||||
|
||||
/obj/item/storage/belt/bandolier/durathread
|
||||
|
||||
@@ -1259,3 +1259,12 @@
|
||||
var/obj/item/stack/sheet/cardboard/I = new(user.drop_location())
|
||||
qdel(src)
|
||||
user.put_in_hands(I)
|
||||
|
||||
/obj/item/storage/box/marshmallow
|
||||
name = "box of marshmallows"
|
||||
desc = "A box of marshmallows."
|
||||
illustration = "marshmallow"
|
||||
|
||||
/obj/item/storage/box/marshmallow/PopulateContents()
|
||||
for (var/i in 1 to 5)
|
||||
new /obj/item/reagent_containers/food/snacks/marshmallow(src)
|
||||
@@ -36,7 +36,7 @@
|
||||
. = ..()
|
||||
if(preload_cell_type)
|
||||
if(!ispath(preload_cell_type,/obj/item/stock_parts/cell))
|
||||
log_world("### MAP WARNING, [src] at [AREACOORD(src)] had an invalid preload_cell_type: [preload_cell_type].")
|
||||
log_mapping("[src] at [AREACOORD(src)] had an invalid preload_cell_type: [preload_cell_type].")
|
||||
else
|
||||
cell = new preload_cell_type(src)
|
||||
update_icon()
|
||||
@@ -168,11 +168,9 @@
|
||||
|
||||
|
||||
/obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/user)
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that
|
||||
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
|
||||
return FALSE
|
||||
if(L.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that
|
||||
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
|
||||
return FALSE
|
||||
var/stunpwr = stunforce
|
||||
var/obj/item/stock_parts/cell/our_cell = get_cell()
|
||||
if(!our_cell)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
/obj/item/tele_iv/afterattack(atom/target, mob/user, proximity)
|
||||
. = ..()
|
||||
if(proximity|| isopenturf(target))
|
||||
if(proximity && isopenturf(target) && user.CanReach(target))
|
||||
deploy_iv(user, target)
|
||||
|
||||
/obj/item/tele_iv/proc/deploy_iv(mob/user, atom/location)
|
||||
|
||||
@@ -872,7 +872,7 @@
|
||||
user.visible_message("<span class='danger'>[user] blasts \the [target] with \the [src]!</span>")
|
||||
playsound(target, 'sound/magic/disintegrate.ogg', 100, 1)
|
||||
W.break_wall()
|
||||
W.ScrapeAway()
|
||||
W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
|
||||
return
|
||||
|
||||
//HF blade
|
||||
|
||||
Reference in New Issue
Block a user