Merge branch 'master' into master
This commit is contained in:
@@ -109,6 +109,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
var/list/grind_results //A reagent list containing the reagents this item produces when ground up in a grinder - this can be an empty list to allow for reagent transferring only
|
||||
var/list/juice_results //A reagent list containing blah blah... but when JUICED in a grinder!
|
||||
|
||||
|
||||
/obj/item/Initialize()
|
||||
|
||||
materials = typelist("materials", materials)
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
/obj/item/compressionkit
|
||||
name = "bluespace compression kit"
|
||||
desc = "An illegally modified BSRPED, capable of reducing the size of most items."
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "compression_c"
|
||||
item_state = "RPED"
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
var/charges = 5
|
||||
// var/damage_multiplier = 0.2 Not in use yet.
|
||||
var/mode = 0
|
||||
|
||||
/obj/item/compressionkit/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>It has [charges] charges left. Recharge with bluespace crystals.</span>")
|
||||
to_chat(user, "<span class='notice'>Use in-hand to swap toggle compress/expand mode (expand mode not yet implemented).</span>")
|
||||
|
||||
/obj/item/compressionkit/attack_self(mob/user)
|
||||
if(mode == 0)
|
||||
mode = 1
|
||||
icon_state = "compression_e"
|
||||
to_chat(user, "<span class='notice'>You switch the compressor to expand mode. This isn't implemented yet, so right now it wont do anything different!</span>")
|
||||
return
|
||||
if(mode == 1)
|
||||
mode = 0
|
||||
icon_state = "compression_c"
|
||||
to_chat(user, "<span class='notice'>You switch the compressor to compress mode. Usage will now reduce the size of objects.</span>")
|
||||
return
|
||||
else
|
||||
mode = 0
|
||||
icon_state = "compression_c"
|
||||
to_chat(user, "<span class='notice'>Some coder cocked up or an admin broke your compressor. It's been set back to compress mode..</span>")
|
||||
|
||||
/obj/item/compressionkit/proc/sparks()
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, get_turf(src))
|
||||
s.start()
|
||||
|
||||
/obj/item/compressionkit/suicide_act(mob/living/carbon/M)
|
||||
M.visible_message("<span class='suicide'>[M] is sticking their head in [src] and turning it on! [M.p_theyre(TRUE)] going to compress their own skull!</span>")
|
||||
var/obj/item/bodypart/head = M.get_bodypart("head")
|
||||
if(!head)
|
||||
return
|
||||
var/turf/T = get_turf(M)
|
||||
var/list/organs = M.getorganszone("head") + M.getorganszone("eyes") + M.getorganszone("mouth")
|
||||
for(var/internal_organ in organs)
|
||||
var/obj/item/organ/I = internal_organ
|
||||
I.Remove(M)
|
||||
I.forceMove(T)
|
||||
head.drop_limb()
|
||||
qdel(head)
|
||||
new M.gib_type(T,1,M.get_static_viruses())
|
||||
M.add_splatter_floor(T)
|
||||
playsound(M, 'sound/weapons/flash.ogg', 50, 1)
|
||||
playsound(M, 'sound/effects/splat.ogg', 50, 1)
|
||||
|
||||
return OXYLOSS
|
||||
|
||||
/obj/item/compressionkit/afterattack(atom/target, mob/user, proximity)
|
||||
. = ..()
|
||||
if(!proximity || !target)
|
||||
return
|
||||
else
|
||||
if(charges == 0)
|
||||
playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>The bluespace compression kit is out of charges! Recharge it with bluespace crystals.</span>")
|
||||
return
|
||||
if(istype(target, /obj/item))
|
||||
var/obj/item/O = target
|
||||
if(O.w_class == 1)
|
||||
playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>[target] cannot be compressed smaller!.</span>")
|
||||
return
|
||||
if(O.GetComponent(/datum/component/storage))
|
||||
to_chat(user, "<span class='notice'>You feel like compressing an item that stores other items would be counterproductive.</span>")
|
||||
return
|
||||
if(O.w_class > 1)
|
||||
playsound(get_turf(src), 'sound/weapons/flash.ogg', 50, 1)
|
||||
user.visible_message("<span class='warning'>[user] is compressing [O] with their bluespace compression kit!</span>")
|
||||
if(do_mob(user, O, 40) && charges > 0 && O.w_class > 1)
|
||||
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 50, 1)
|
||||
sparks()
|
||||
flash_lighting_fx(3, 3, LIGHT_COLOR_CYAN)
|
||||
O.w_class -= 1
|
||||
// O.force_mult -= damage_multiplier
|
||||
charges -= 1
|
||||
to_chat(user, "<span class='notice'>You successfully compress [target]! The compressor now has [charges] charges.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Anomalous error. Summon a coder.</span>")
|
||||
|
||||
if(istype(target, /mob/living))
|
||||
var/mob/living/victim = target
|
||||
if(istype(victim, /mob/living/carbon/human))
|
||||
if(user.zone_selected == "groin") // pp smol. There's probably a smarter way to do this but im retarded. If you have a simpler method let me know.
|
||||
var/list/organs = victim.getorganszone("groin")
|
||||
for(var/internal_organ in organs)
|
||||
if(istype(internal_organ, /obj/item/organ/genital/penis))
|
||||
var/obj/item/organ/genital/penis/O = internal_organ
|
||||
playsound(get_turf(src), 'sound/weapons/flash.ogg', 50, 1)
|
||||
victim.visible_message("<span class='warning'>[user] is preparing to shrink [victim]\'s [O.name] with their bluespace compression kit!</span>")
|
||||
if(do_mob(user, victim, 40) && charges > 0 && O.length > 0)
|
||||
victim.visible_message("<span class='warning'>[user] has shrunk [victim]\'s [O.name]!</span>")
|
||||
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 50, 1)
|
||||
sparks()
|
||||
flash_lighting_fx(3, 3, LIGHT_COLOR_CYAN)
|
||||
charges -= 1
|
||||
O.length -= 5
|
||||
if(O.length < 1)
|
||||
victim.visible_message("<span class='warning'>[user]\'s [O.name] vanishes!</span>")
|
||||
qdel(O) // no pp for you
|
||||
else
|
||||
O.update_size()
|
||||
O.update_appearance()
|
||||
|
||||
|
||||
|
||||
/obj/item/compressionkit/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(istype(I, /obj/item/stack/ore/bluespace_crystal))
|
||||
var/obj/item/stack/ore/bluespace_crystal/B = I
|
||||
charges += 2
|
||||
to_chat(user, "<span class='notice'>You insert [I] into [src]. It now has [charges] charges.</span>")
|
||||
if(B.amount > 1)
|
||||
B.amount -= 1
|
||||
else
|
||||
qdel(I)
|
||||
@@ -0,0 +1,32 @@
|
||||
/obj/item/syndie_glue
|
||||
name = "bottle of super glue"
|
||||
desc = "A black market brand of high strength adhesive, rarely sold to the public. Do not ingest."
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "glue"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/uses = 1
|
||||
|
||||
/obj/item/syndie_glue/suicide_act(mob/living/carbon/M)
|
||||
return //todo
|
||||
|
||||
/obj/item/syndie_glue/afterattack(atom/target, mob/user, proximity)
|
||||
. = ..()
|
||||
if(!proximity || !target)
|
||||
return
|
||||
else
|
||||
if(uses == 0)
|
||||
to_chat(user, "<span class='warning'>The bottle of glue is empty!</span>")
|
||||
return
|
||||
if(istype(target, /obj/item))
|
||||
var/obj/item/I = target
|
||||
if(I.item_flags & NODROP)
|
||||
to_chat(user, "<span class='warning'>[I] is already sticky!</span>")
|
||||
return
|
||||
uses -= 1
|
||||
I.item_flags |= NODROP
|
||||
I.desc += " It looks sticky."
|
||||
to_chat(user, "<span class='notice'>You smear the [I] with glue, making it incredibly sticky!</span>")
|
||||
if(uses == 0)
|
||||
icon_state = "glue_used"
|
||||
name = "empty bottle of super glue"
|
||||
return
|
||||
@@ -110,7 +110,7 @@
|
||||
to_chat(user, "The safety is [safety ? "on" : "off"].")
|
||||
|
||||
if(reagents.total_volume)
|
||||
to_chat(user, "<span class='notice'>Alt-click to empty it.</span>")
|
||||
to_chat(user, "<span class='notice'>You can loose its <b>screws</b> to empty it.</span>")
|
||||
|
||||
/obj/item/extinguisher/proc/AttemptRefill(atom/target, mob/user)
|
||||
if(istype(target, tanktype) && target.Adjacent(user))
|
||||
@@ -244,7 +244,7 @@
|
||||
var/turf/open/theturf = T
|
||||
theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
|
||||
|
||||
user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "<span class='info'>You quietly empty out \the [src] using its release valve.</span>")
|
||||
user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "<span class='info'>You quietly empty out \the [src] by loosing the release valve's screws.</span>")
|
||||
|
||||
//firebot assembly
|
||||
/obj/item/extinguisher/attackby(obj/O, mob/user, params)
|
||||
|
||||
@@ -87,6 +87,33 @@
|
||||
active = FALSE
|
||||
UpdateButtonIcon()
|
||||
|
||||
/obj/item/book/granter/action/origami
|
||||
granted_action = /datum/action/innate/origami
|
||||
name = "The Art of Origami"
|
||||
desc = "A meticulously in-depth manual explaining the art of paper folding."
|
||||
icon_state = "origamibook"
|
||||
actionname = "origami"
|
||||
oneuse = TRUE
|
||||
remarks = list("Dead-stick stability...", "Symmetry seems to play a rather large factor...", "Accounting for crosswinds... really?", "Drag coefficients of various paper types...", "Thrust to weight ratios?", "Positive dihedral angle?", "Center of gravity forward of the center of lift...")
|
||||
|
||||
/datum/action/innate/origami
|
||||
name = "Origami Folding"
|
||||
desc = "Toggles your ability to fold and catch robust paper airplanes."
|
||||
button_icon_state = "origami_off"
|
||||
check_flags = NONE
|
||||
|
||||
/datum/action/innate/origami/Activate()
|
||||
to_chat(owner, "<span class='notice'>You will now fold origami planes.</span>")
|
||||
button_icon_state = "origami_on"
|
||||
active = TRUE
|
||||
UpdateButtonIcon()
|
||||
|
||||
/datum/action/innate/origami/Deactivate()
|
||||
to_chat(owner, "<span class='notice'>You will no longer fold origami planes.</span>")
|
||||
button_icon_state = "origami_off"
|
||||
active = FALSE
|
||||
UpdateButtonIcon()
|
||||
|
||||
///SPELLS///
|
||||
|
||||
/obj/item/book/granter/spell
|
||||
|
||||
@@ -576,6 +576,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
reach = 2
|
||||
attack_verb = list("whipped", "lashed")
|
||||
hitsound = 'sound/weapons/chainhit.ogg'
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
/obj/item/implant/adrenalin/activate()
|
||||
. = ..()
|
||||
uses--
|
||||
imp_in.do_adrenaline(150, TRUE, 0, 0, TRUE, list("inaprovaline" = 3, "synaptizine" = 10, "omnizine" = 10, "stimulants" = 10), "<span class='boldnotice'>You feel a sudden surge of energy!</span>")
|
||||
imp_in.do_adrenaline(150, TRUE, 0, 0, TRUE, list("inaprovaline" = 3, "synaptizine" = 10, "regen_jelly" = 10, "stimulants" = 10), "<span class='boldnotice'>You feel a sudden surge of energy!</span>")
|
||||
to_chat(imp_in, "<span class='notice'>You feel a sudden surge of energy!</span>")
|
||||
if(!uses)
|
||||
qdel(src)
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 14
|
||||
throwforce = 10
|
||||
reach = 2
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
attack_verb = list("flogged", "whipped", "lashed", "disciplined")
|
||||
hitsound = 'sound/weapons/chainhit.ogg'
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
attack_verb = list("shoved", "bashed")
|
||||
var/cooldown = 0 //shield bash cooldown. based on world.time
|
||||
|
||||
|
||||
/obj/item/shield/riot/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/melee/baton))
|
||||
if(cooldown < world.time - 25)
|
||||
@@ -166,3 +165,14 @@
|
||||
block_chance = 25
|
||||
force = 5
|
||||
throwforce = 7
|
||||
|
||||
/obj/item/shield/riot/tower
|
||||
name = "tower shield"
|
||||
desc = "A massive shield that can block a lot of attacks, can take a lot of abuse before braking."
|
||||
armor = list("melee" = 95, "bullet" = 95, "laser" = 75, "energy" = 60, "bomb" = 90, "bio" = 90, "rad" = 0, "fire" = 90, "acid" = 10) //Armor for the item, dosnt transfer to user
|
||||
icon_state = "metal"
|
||||
block_chance = 75 //1/4 shots will hit*
|
||||
force = 10
|
||||
slowdown = 2
|
||||
throwforce = 15 //Massive pice of metal
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
|
||||
@@ -409,8 +409,10 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
|
||||
new/datum/stack_recipe("brass pinion airlock - windowed", /obj/machinery/door/airlock/clockwork/brass, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("brass windoor", /obj/machinery/door/window/clockwork, 2, time = 30, on_floor = TRUE, window_checks = TRUE), \
|
||||
null,
|
||||
new/datum/stack_recipe("directional brass window", /obj/structure/window/reinforced/clockwork/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("fulltile brass window", /obj/structure/window/reinforced/clockwork/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("brass reflector", /obj/structure/destructible/clockwork/reflector, 10, time = 100, one_per_turf = TRUE, on_floor = TRUE, window_checks = TRUE), \
|
||||
null,
|
||||
new/datum/stack_recipe("brass window - directional", /obj/structure/window/reinforced/clockwork/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("brass window - fulltile", /obj/structure/window/reinforced/clockwork/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("brass chair", /obj/structure/chair/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
null,
|
||||
|
||||
@@ -722,7 +722,7 @@
|
||||
new /obj/item/ammo_casing/shotgun/rubbershot(src)
|
||||
|
||||
/obj/item/storage/box/lethalshot
|
||||
name = "box of lethal shotgun shots"
|
||||
name = "box of buckshot (Lethal)"
|
||||
desc = "A box full of lethal shots, designed for riot shotguns."
|
||||
icon_state = "lethalshot_box"
|
||||
illustration = null
|
||||
@@ -749,7 +749,7 @@
|
||||
|
||||
/obj/item/storage/box/lethalslugs/PopulateContents()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/projectile/bullet/shotgun_slug(src)
|
||||
new /obj/item/ammo_casing/shotgun(src)
|
||||
|
||||
/obj/item/storage/box/stunslug
|
||||
name = "box of stun slugs"
|
||||
@@ -759,7 +759,7 @@
|
||||
|
||||
/obj/item/storage/box/stunslug/PopulateContents()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/projectile/bullet/shotgun_stunslug(src)
|
||||
new /obj/item/ammo_casing/shotgun/stunslug(src)
|
||||
|
||||
/obj/item/storage/box/techsslug
|
||||
name = "box of tech shotgun shells"
|
||||
@@ -773,11 +773,11 @@
|
||||
|
||||
/obj/item/storage/box/fireshot
|
||||
name = "box of incendiary ammo"
|
||||
desc = "A box full of tech incendiary ammo."
|
||||
desc = "A box full of incendiary ammo."
|
||||
icon_state = "fireshot_box"
|
||||
illustration = null
|
||||
|
||||
/obj/item/storage/box/techsslug/PopulateContents()
|
||||
/obj/item/storage/box/fireshot/PopulateContents()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/ammo_casing/shotgun/incendiary(src)
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
/obj/item/storage/briefcase/lawyer
|
||||
folder_path = /obj/item/folder/blue
|
||||
|
||||
/obj/item/storage/briefcase/lawyer/family
|
||||
/obj/item/storage/briefcase/lawyer/family
|
||||
name = "battered briefcase"
|
||||
desc = "An old briefcase, this one has seen better days in its time. It's clear they don't make them nowadays as good as they used to. Comes with an added belt clip!"
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
@@ -80,3 +80,12 @@
|
||||
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
|
||||
new /obj/item/suppressor/specialoffer(src)
|
||||
|
||||
/obj/item/storage/briefcase/medical
|
||||
name = "medical briefcase"
|
||||
icon_state = "medbriefcase"
|
||||
desc = "A white with a blue cross brieface, this is ment to hold medical gear that would not be able to normally fit in a bag."
|
||||
|
||||
/obj/item/storage/briefcase/medical/PopulateContents()
|
||||
new /obj/item/clothing/neck/stethoscope(src)
|
||||
new /obj/item/healthanalyzer(src)
|
||||
..() //In case of paperwork
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
/* First aid storage
|
||||
* Contains:
|
||||
* First Aid Kits
|
||||
@@ -331,12 +332,12 @@
|
||||
|
||||
/obj/item/storage/pill_bottle/penis_enlargement
|
||||
name = "penis enlargement pills"
|
||||
desc = "Made by Fermichem - They have a little picture of Doctor Ronald Hyatt with a giant dong on them. The warming states not to take more than 10u at a time."
|
||||
desc = "You want penis enlargement pills?"
|
||||
|
||||
/obj/item/storage/pill_bottle/penis_enlargement/PopulateContents()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/reagent_containers/pill/penis_enlargement(src)
|
||||
|
||||
|
||||
/obj/item/storage/pill_bottle/breast_enlargement
|
||||
name = "breast enlargement pills"
|
||||
desc = "Made by Fermichem - They have a woman with breasts larger than she is on them. The warming states not to take more than 10u at a time."
|
||||
@@ -344,3 +345,47 @@
|
||||
/obj/item/storage/pill_bottle/breast_enlargement/PopulateContents()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/reagent_containers/pill/breast_enlargement(src)
|
||||
|
||||
/////////////
|
||||
//Organ Box//
|
||||
/////////////
|
||||
|
||||
/obj/item/storage/belt/organbox
|
||||
name = "Organ Storge"
|
||||
desc = "A compact box that helps hold massive amounts of implants, organs, and some tools. Has a belt clip for easy carrying"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
icon = 'icons/obj/mysterybox.dmi'
|
||||
icon_state = "organbox_open"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
throw_speed = 1
|
||||
throw_range = 1
|
||||
|
||||
/obj/item/storage/belt/organbox/ComponentInitialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.max_items = 16
|
||||
STR.max_w_class = WEIGHT_CLASS_BULKY
|
||||
STR.max_combined_w_class = 20
|
||||
STR.can_hold = typecacheof(list(
|
||||
/obj/item/storage/pill_bottle,
|
||||
/obj/item/reagent_containers/hypospray,
|
||||
/obj/item/healthanalyzer,
|
||||
/obj/item/reagent_containers/syringe,
|
||||
/obj/item/clothing/glasses/hud/health,
|
||||
/obj/item/hemostat,
|
||||
/obj/item/scalpel,
|
||||
/obj/item/retractor,
|
||||
/obj/item/cautery,
|
||||
/obj/item/surgical_drapes,
|
||||
/obj/item/autosurgeon,
|
||||
/obj/item/organ,
|
||||
/obj/item/implant,
|
||||
/obj/item/implantpad,
|
||||
/obj/item/implantcase,
|
||||
/obj/item/implanter,
|
||||
/obj/item/circuitboard/computer/operating,
|
||||
/obj/item/stack/sheet/mineral/silver,
|
||||
/obj/item/organ_storage
|
||||
))
|
||||
|
||||
|
||||
@@ -183,6 +183,22 @@
|
||||
slab_type = /obj/item/clockwork/slab/debug
|
||||
fabricator_type = /obj/item/clockwork/replica_fabricator/scarab/debug
|
||||
|
||||
/obj/item/storage/toolbox/durasteel
|
||||
name = "durasteel toolbox"
|
||||
desc = "A toolbox made out of durasteel. Probably packs a massive punch."
|
||||
total_mass = 5
|
||||
icon_state = "blue"
|
||||
item_state = "toolbox_blue"
|
||||
w_class = WEIGHT_CLASS_HUGE //heyo no bohing this!
|
||||
force = 18 //spear damage
|
||||
|
||||
/obj/item/storage/toolbox/durasteel/afterattack(atom/A, mob/user, proximity)
|
||||
. = ..()
|
||||
if(proximity && isobj(A) && !isitem(A))
|
||||
var/obj/O = A
|
||||
//50 total object damage but split up for stuff like damage deflection.
|
||||
O.take_damage(22)
|
||||
O.take_damage(10)
|
||||
|
||||
/obj/item/storage/toolbox/artistic
|
||||
name = "artistic toolbox"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
/obj/item/storage/box/syndicate/PopulateContents()
|
||||
switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1)))
|
||||
if("bloodyspai") // 27 tc now this is more right
|
||||
if("bloodyspai") // 30 tc now this is more right
|
||||
new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set
|
||||
new /obj/item/clothing/mask/chameleon(src) // Goes with above
|
||||
new /obj/item/card/id/syndicate(src) // 2 tc
|
||||
@@ -11,7 +11,7 @@
|
||||
new /obj/item/multitool/ai_detect(src) // 1 tc
|
||||
new /obj/item/encryptionkey/syndicate(src) // 2 tc
|
||||
new /obj/item/reagent_containers/syringe/mulligan(src) // 4 tc
|
||||
new /obj/item/switchblade(src) //I'll count this as 2 tc
|
||||
new /obj/item/switchblade(src) //I'll count this as 5 tc
|
||||
new /obj/item/storage/fancy/cigarettes/cigpack_syndicate (src) // 2 tc this shit heals
|
||||
new /obj/item/flashlight/emp(src) // 2 tc
|
||||
new /obj/item/chameleon(src) // 7 tc
|
||||
@@ -25,13 +25,13 @@
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
|
||||
if("bond") // 29 tc
|
||||
new /obj/item/gun/ballistic/automatic/pistol(src)
|
||||
new /obj/item/suppressor(src)
|
||||
new /obj/item/gun/ballistic/automatic/pistol/suppressed(src)
|
||||
new /obj/item/ammo_box/magazine/m10mm(src)
|
||||
new /obj/item/ammo_box/magazine/m10mm(src)
|
||||
new /obj/item/clothing/under/chameleon(src)
|
||||
new /obj/item/card/id/syndicate(src)
|
||||
new /obj/item/reagent_containers/syringe/stimulants(src)
|
||||
new /obj/item/clothing/neck/tie/red(src)
|
||||
|
||||
if("screwed") // 29 tc
|
||||
new /obj/item/sbeacondrop/bomb(src)
|
||||
@@ -41,7 +41,7 @@
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
|
||||
new /obj/item/encryptionkey/syndicate(src)
|
||||
|
||||
if("guns") // 28 tc now
|
||||
if("guns") // 30 tc now
|
||||
new /obj/item/gun/ballistic/revolver(src)
|
||||
new /obj/item/ammo_box/a357(src)
|
||||
new /obj/item/ammo_box/a357(src)
|
||||
@@ -50,39 +50,53 @@
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/clothing/mask/gas/clown_hat(src)
|
||||
new /obj/item/clothing/under/suit_jacket/really_black(src)
|
||||
new /obj/item/screwdriver/power(src) //2 tc item
|
||||
|
||||
if("murder") // 28 tc now
|
||||
if("murder") // 35 tc now
|
||||
new /obj/item/melee/transforming/energy/sword/saber(src)
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
new /obj/item/card/emag(src)
|
||||
new /obj/item/clothing/shoes/chameleon/noslip(src)
|
||||
new /obj/item/encryptionkey/syndicate(src)
|
||||
new /obj/item/grenade/syndieminibomb(src)
|
||||
new /obj/item/clothing/glasses/phantomthief/syndicate(src)
|
||||
new /obj/item/reagent_containers/syringe/stimulants(src)
|
||||
|
||||
if("implant") // 55+ tc holy shit what the fuck this is a lottery disguised as fun boxes isn't it?
|
||||
if("implant") // 67+ tc holy shit what the fuck this is a lottery disguised as fun boxes isn't it?
|
||||
new /obj/item/implanter/freedom(src)
|
||||
new /obj/item/implanter/uplink/precharged(src)
|
||||
new /obj/item/implanter/emp(src)
|
||||
new /obj/item/implanter/adrenalin(src)
|
||||
new /obj/item/implanter/explosive(src)
|
||||
new /obj/item/implanter/storage(src)
|
||||
new /obj/item/implanter/radio/syndicate(src)
|
||||
new /obj/item/implanter/stealth(src)
|
||||
|
||||
if("hacker") // 26 tc
|
||||
if("hacker") // 30 tc
|
||||
new /obj/item/aiModule/syndicate(src)
|
||||
new /obj/item/card/emag(src)
|
||||
new /obj/item/encryptionkey/binary(src)
|
||||
new /obj/item/aiModule/toyAI(src)
|
||||
new /obj/item/multitool/ai_detect(src)
|
||||
new /obj/item/flashlight/emp(src)
|
||||
new /obj/item/emagrecharge(src)
|
||||
|
||||
if("lordsingulo") // 24 tc
|
||||
new /obj/item/sbeacondrop(src)
|
||||
new /obj/item/clothing/suit/space/syndicate/black/red(src)
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
|
||||
new /obj/item/card/emag(src)
|
||||
if("lordsingulo") // "36" tc aka 23 tc
|
||||
new /obj/item/sbeacondrop(src) // 14 kinda useless
|
||||
new /obj/item/clothing/suit/space/syndicate/black/red(src) //2
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) //2
|
||||
new /obj/item/card/emag(src) //6
|
||||
new /obj/item/emagrecharge(src) //2
|
||||
new /obj/item/storage/toolbox/syndicate(src) //1
|
||||
new /obj/item/card/id/syndicate(src) //2
|
||||
new /obj/item/flashlight/emp(src) //2
|
||||
new /obj/item/jammer(src) //5
|
||||
|
||||
if("sabotage") // 26 tc now
|
||||
if("sabotage") // ~28 tc now
|
||||
new /obj/item/grenade/plastic/c4 (src)
|
||||
new /obj/item/grenade/plastic/c4 (src)
|
||||
new /obj/item/grenade/plastic/x4 (src)
|
||||
new /obj/item/grenade/plastic/x4 (src)
|
||||
new /obj/item/doorCharge(src)
|
||||
new /obj/item/doorCharge(src)
|
||||
new /obj/item/camera_bug(src)
|
||||
@@ -117,15 +131,15 @@
|
||||
new /obj/item/grenade/plastic/c4 (src) // 1 tc
|
||||
new /obj/item/card/emag(src) // 6 tc
|
||||
|
||||
if("ninja") // 33 tc worth
|
||||
new /obj/item/katana(src) // Unique , hard to tell how much tc this is worth. 8 tc?
|
||||
if("ninja") // 40~ tc worth
|
||||
new /obj/item/katana(src) // Unique , basicly a better esword. 10 tc?
|
||||
new /obj/item/implanter/adrenalin(src) // 8 tc
|
||||
new /obj/item/throwing_star(src) // ~5 tc for all 6
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/implanter/emp(src)
|
||||
new /obj/item/grenade/smokebomb(src)
|
||||
new /obj/item/grenade/smokebomb(src)
|
||||
new /obj/item/storage/belt/chameleon(src) // Unique but worth at least 2 tc
|
||||
new /obj/item/card/id/syndicate(src) // 2 tc
|
||||
new /obj/item/chameleon(src) // 7 tc
|
||||
|
||||
@@ -22,7 +22,10 @@
|
||||
var/preload_cell_type //if not empty the baton starts with this type of cell
|
||||
|
||||
/obj/item/melee/baton/get_cell()
|
||||
return cell
|
||||
. = cell
|
||||
if(iscyborg(loc))
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
. = R.get_cell()
|
||||
|
||||
/obj/item/melee/baton/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
@@ -46,14 +49,18 @@
|
||||
/obj/item/melee/baton/loaded //this one starts with a cell pre-installed.
|
||||
preload_cell_type = /obj/item/stock_parts/cell/high
|
||||
|
||||
/obj/item/melee/baton/proc/deductcharge(chrgdeductamt, chargecheck = TRUE)
|
||||
if(!cell)
|
||||
/obj/item/melee/baton/proc/deductcharge(chrgdeductamt, chargecheck = TRUE, explode = TRUE)
|
||||
var/obj/item/stock_parts/cell/copper_top = get_cell()
|
||||
if(!copper_top)
|
||||
switch_status(FALSE, TRUE)
|
||||
return FALSE
|
||||
//Note this value returned is significant, as it will determine
|
||||
//if a stun is applied or not
|
||||
. = cell.use(chrgdeductamt)
|
||||
if(status && (!. || (chargecheck && cell.charge < hitcost * STUNBATON_CHARGE_LENIENCY)))
|
||||
|
||||
copper_top.use(min(chrgdeductamt, copper_top.charge), explode)
|
||||
if(QDELETED(src))
|
||||
return FALSE
|
||||
if(status && (!copper_top || !copper_top.charge || (chargecheck && copper_top.charge < (hitcost * STUNBATON_CHARGE_LENIENCY))))
|
||||
//we're below minimum, turn off
|
||||
switch_status(FALSE)
|
||||
|
||||
@@ -69,7 +76,7 @@
|
||||
update_icon()
|
||||
|
||||
/obj/item/melee/baton/process()
|
||||
deductcharge(hitcost * 0.004, FALSE)
|
||||
deductcharge(hitcost * 0.004, FALSE, FALSE)
|
||||
|
||||
/obj/item/melee/baton/update_icon()
|
||||
if(status)
|
||||
@@ -80,9 +87,10 @@
|
||||
icon_state = "[initial(name)]"
|
||||
|
||||
/obj/item/melee/baton/examine(mob/user)
|
||||
..()
|
||||
if(cell)
|
||||
to_chat(user, "<span class='notice'>\The [src] is [round(cell.percent())]% charged.</span>")
|
||||
. = ..()
|
||||
var/obj/item/stock_parts/cell/copper_top = get_cell()
|
||||
if(copper_top)
|
||||
to_chat(user, "<span class='notice'>\The [src] is [round(copper_top.percent())]% charged.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>\The [src] does not have a power source installed.</span>")
|
||||
|
||||
@@ -92,7 +100,7 @@
|
||||
if(cell)
|
||||
to_chat(user, "<span class='notice'>[src] already has a cell.</span>")
|
||||
else
|
||||
if(C.maxcharge < hitcost * STUNBATON_CHARGE_LENIENCY)
|
||||
if(C.maxcharge < (hitcost * STUNBATON_CHARGE_LENIENCY))
|
||||
to_chat(user, "<span class='notice'>[src] requires a higher capacity cell.</span>")
|
||||
return
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
@@ -112,15 +120,16 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/melee/baton/attack_self(mob/user)
|
||||
if(cell && cell.charge > hitcost * STUNBATON_CHARGE_LENIENCY)
|
||||
switch_status(!status)
|
||||
to_chat(user, "<span class='notice'>[src] is now [status ? "on" : "off"].</span>")
|
||||
else
|
||||
var/obj/item/stock_parts/cell/copper_top = get_cell()
|
||||
if(!copper_top || copper_top.charge < (hitcost * STUNBATON_CHARGE_LENIENCY))
|
||||
switch_status(FALSE, TRUE)
|
||||
if(!cell)
|
||||
if(!copper_top)
|
||||
to_chat(user, "<span class='warning'>[src] does not have a power source!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[src] is out of charge.</span>")
|
||||
else
|
||||
switch_status(!status)
|
||||
to_chat(user, "<span class='notice'>[src] is now [status ? "on" : "off"].</span>")
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/item/melee/baton/attack(mob/M, mob/living/carbon/human/user)
|
||||
@@ -164,16 +173,21 @@
|
||||
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
|
||||
return FALSE
|
||||
var/stunpwr = stunforce
|
||||
if(iscyborg(loc))
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
if(!istype(R) || !R.cell || !R.cell.use(hitcost))
|
||||
var/obj/item/stock_parts/cell/our_cell = get_cell()
|
||||
if(!our_cell)
|
||||
switch_status(FALSE)
|
||||
return FALSE
|
||||
var/stuncharge = our_cell.charge
|
||||
deductcharge(hitcost, FALSE)
|
||||
if(QDELETED(src) || QDELETED(our_cell)) //it was rigged
|
||||
return FALSE
|
||||
if(stuncharge < hitcost)
|
||||
if(stuncharge < (hitcost * STUNBATON_CHARGE_LENIENCY))
|
||||
L.visible_message("<span class='warning'>[user] has prodded [L] with [src]. Luckily it was out of charge.</span>", \
|
||||
"<span class='warning'>[user] has prodded you with [src]. Luckily it was out of charge.</span>")
|
||||
return FALSE
|
||||
else
|
||||
var/stuncharge = cell.charge
|
||||
if(!deductcharge(hitcost, FALSE))
|
||||
stunpwr *= round(stuncharge/hitcost)
|
||||
if(stunpwr < stunforce * STUNBATON_CHARGE_LENIENCY)
|
||||
return FALSE
|
||||
stunpwr *= round(stuncharge/hitcost, 0.1)
|
||||
|
||||
|
||||
L.Knockdown(stunpwr)
|
||||
L.adjustStaminaLoss(stunpwr*0.1, affected_zone = (istype(user) ? user.zone_selected : BODY_ZONE_CHEST))//CIT CHANGE - makes stunbatons deal extra staminaloss. Todo: make this also deal pain when pain gets implemented.
|
||||
@@ -198,14 +212,17 @@
|
||||
/obj/item/melee/baton/proc/clowning_around(mob/living/user)
|
||||
user.visible_message("<span class='danger'>[user] accidentally hits [user.p_them()]self with [src]!</span>", \
|
||||
"<span class='userdanger'>You accidentally hit yourself with [src]!</span>")
|
||||
SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
|
||||
user.Knockdown(stunforce*3)
|
||||
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
|
||||
deductcharge(hitcost)
|
||||
|
||||
/obj/item/melee/baton/emp_act(severity)
|
||||
. = ..()
|
||||
if (!(. & EMP_PROTECT_SELF))
|
||||
switch_status(FALSE)
|
||||
deductcharge(1000 / severity)
|
||||
if(!iscyborg(loc))
|
||||
deductcharge(1000 / severity, TRUE, FALSE)
|
||||
|
||||
//Makeshift stun baton. Replacement for stun gloves.
|
||||
/obj/item/melee/baton/cattleprod
|
||||
|
||||
@@ -1,237 +1,239 @@
|
||||
/obj/item/tank/jetpack
|
||||
name = "jetpack (empty)"
|
||||
desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution."
|
||||
icon_state = "jetpack"
|
||||
item_state = "jetpack"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/jetpacks_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/jetpacks_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
distribute_pressure = ONE_ATMOSPHERE * O2STANDARD
|
||||
actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
|
||||
var/gas_type = /datum/gas/oxygen
|
||||
var/on = FALSE
|
||||
var/stabilizers = FALSE
|
||||
var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not
|
||||
var/datum/effect_system/trail_follow/ion/ion_trail
|
||||
|
||||
/obj/item/tank/jetpack/New()
|
||||
..()
|
||||
if(gas_type)
|
||||
air_contents.gases[gas_type] = (6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)
|
||||
|
||||
ion_trail = new
|
||||
ion_trail.set_up(src)
|
||||
|
||||
/obj/item/tank/jetpack/ui_action_click(mob/user, action)
|
||||
if(istype(action, /datum/action/item_action/toggle_jetpack))
|
||||
cycle(user)
|
||||
else if(istype(action, /datum/action/item_action/jetpack_stabilization))
|
||||
if(on)
|
||||
stabilizers = !stabilizers
|
||||
to_chat(user, "<span class='notice'>You turn the jetpack stabilization [stabilizers ? "on" : "off"].</span>")
|
||||
else
|
||||
toggle_internals(user)
|
||||
|
||||
/obj/item/tank/jetpack/proc/cycle(mob/user)
|
||||
if(user.incapacitated())
|
||||
return
|
||||
|
||||
if(!on)
|
||||
turn_on()
|
||||
to_chat(user, "<span class='notice'>You turn the jetpack on.</span>")
|
||||
else
|
||||
turn_off()
|
||||
to_chat(user, "<span class='notice'>You turn the jetpack off.</span>")
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
/obj/item/tank/jetpack/proc/turn_on()
|
||||
on = TRUE
|
||||
icon_state = "[initial(icon_state)]-on"
|
||||
ion_trail.start()
|
||||
|
||||
/obj/item/tank/jetpack/proc/turn_off()
|
||||
on = FALSE
|
||||
stabilizers = FALSE
|
||||
icon_state = initial(icon_state)
|
||||
ion_trail.stop()
|
||||
|
||||
/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user)
|
||||
if(!on)
|
||||
return
|
||||
if((num < 0.005 || air_contents.total_moles() < num))
|
||||
turn_off()
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/removed = air_contents.remove(num)
|
||||
if(removed.total_moles() < 0.005)
|
||||
turn_off()
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(user)
|
||||
T.assume_air(removed)
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/tank/jetpack/suicide_act(mob/user)
|
||||
if (istype(user, /mob/living/carbon/human/))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.forcesay("WHAT THE FUCK IS CARBON DIOXIDE?")
|
||||
H.visible_message("<span class='suicide'>[user] is suffocating [user.p_them()]self with [src]! It looks like [user.p_they()] didn't read what that jetpack says!</span>")
|
||||
return (OXYLOSS)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/improvised
|
||||
name = "improvised jetpack"
|
||||
desc = "A jetpack made from two air tanks, a fire extinguisher and some atmospherics equipment. It doesn't look like it can hold much."
|
||||
icon_state = "jetpack-improvised"
|
||||
item_state = "jetpack-sec"
|
||||
volume = 30 //normal jetpacks have 70 volume
|
||||
gas_type = null //it starts empty
|
||||
full_speed = FALSE //moves at hardsuit jetpack speeds
|
||||
|
||||
/obj/item/tank/jetpack/improvised/allow_thrust(num, mob/living/user)
|
||||
if(!on)
|
||||
return
|
||||
if((num < 0.005 || air_contents.total_moles() < num))
|
||||
turn_off()
|
||||
return
|
||||
if(rand(0,250) == 0)
|
||||
to_chat(user, "<span class='notice'>You feel your jetpack's engines cut out.</span>")
|
||||
turn_off()
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/removed = air_contents.remove(num)
|
||||
if(removed.total_moles() < 0.005)
|
||||
turn_off()
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(user)
|
||||
T.assume_air(removed)
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/tank/jetpack/void
|
||||
name = "void jetpack (oxygen)"
|
||||
desc = "It works well in a void."
|
||||
volume = 60
|
||||
icon_state = "jetpack-void"
|
||||
item_state = "jetpack-void"
|
||||
full_speed = FALSE //Old pre-hardsuit tech
|
||||
|
||||
/obj/item/tank/jetpack/oxygen
|
||||
name = "jetpack (oxygen)"
|
||||
desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas. Use with caution."
|
||||
icon_state = "jetpack"
|
||||
item_state = "jetpack"
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/harness
|
||||
name = "jet harness (oxygen)"
|
||||
desc = "A lightweight tactical harness, used by those who don't want to be weighed down by traditional jetpacks."
|
||||
icon_state = "jetpack-mini"
|
||||
item_state = "jetpack-mini"
|
||||
volume = 50
|
||||
throw_range = 7
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/captain
|
||||
name = "\improper Captain's jetpack"
|
||||
desc = "A compact, lightweight jetpack containing a high amount of compressed oxygen."
|
||||
icon_state = "jetpack-captain"
|
||||
item_state = "jetpack-captain"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
volume = 90
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //steal objective items are hard to destroy.
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/security
|
||||
name = "security jetpack (oxygen)"
|
||||
desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas by security forces."
|
||||
icon_state = "jetpack-sec"
|
||||
item_state = "jetpack-sec"
|
||||
|
||||
/obj/item/tank/jetpack/carbondioxide
|
||||
name = "jetpack (carbon dioxide)"
|
||||
desc = "A tank of compressed carbon dioxide for use as propulsion in zero-gravity areas. Painted black to indicate that it should not be used as a source for internals."
|
||||
icon_state = "jetpack-black"
|
||||
item_state = "jetpack-black"
|
||||
distribute_pressure = 0
|
||||
gas_type = /datum/gas/carbon_dioxide
|
||||
|
||||
/obj/item/tank/jetpack/suit
|
||||
name = "hardsuit jetpack upgrade"
|
||||
desc = "A modular, compact set of thrusters designed to integrate with a hardsuit. It is fueled by a tank inserted into the suit's storage compartment."
|
||||
icon_state = "jetpack-mining"
|
||||
item_state = "jetpack-black"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
|
||||
volume = 1
|
||||
slot_flags = null
|
||||
gas_type = null
|
||||
full_speed = FALSE
|
||||
var/datum/gas_mixture/temp_air_contents
|
||||
var/obj/item/tank/internals/tank = null
|
||||
|
||||
/obj/item/tank/jetpack/suit/New()
|
||||
..()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
temp_air_contents = air_contents
|
||||
|
||||
/obj/item/tank/jetpack/suit/attack_self()
|
||||
return
|
||||
|
||||
/obj/item/tank/jetpack/suit/cycle(mob/user)
|
||||
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit))
|
||||
to_chat(user, "<span class='warning'>\The [src] must be connected to a hardsuit!</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!istype(H.s_store, /obj/item/tank/internals))
|
||||
to_chat(user, "<span class='warning'>You need a tank in your suit storage!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/suit/turn_on()
|
||||
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
|
||||
return
|
||||
var/mob/living/carbon/human/H = loc.loc
|
||||
tank = H.s_store
|
||||
air_contents = tank.air_contents
|
||||
START_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/suit/turn_off()
|
||||
tank = null
|
||||
air_contents = temp_air_contents
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/suit/process()
|
||||
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
|
||||
turn_off()
|
||||
return
|
||||
var/mob/living/carbon/human/H = loc.loc
|
||||
if(!tank || tank != H.s_store)
|
||||
turn_off()
|
||||
return
|
||||
..()
|
||||
|
||||
//Return a jetpack that the mob can use
|
||||
//Back worn jetpacks, hardsuit internal packs, and so on.
|
||||
//Used in Process_Spacemove() and wherever you want to check for/get a jetpack
|
||||
|
||||
/mob/proc/get_jetpack()
|
||||
return
|
||||
|
||||
/mob/living/carbon/get_jetpack()
|
||||
var/obj/item/tank/jetpack/J = back
|
||||
if(istype(J))
|
||||
return J
|
||||
|
||||
/mob/living/carbon/human/get_jetpack()
|
||||
var/obj/item/tank/jetpack/J = ..()
|
||||
if(!istype(J) && istype(wear_suit, /obj/item/clothing/suit/space/hardsuit))
|
||||
var/obj/item/clothing/suit/space/hardsuit/C = wear_suit
|
||||
J = C.jetpack
|
||||
return J
|
||||
/obj/item/tank/jetpack
|
||||
name = "jetpack (empty)"
|
||||
desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution."
|
||||
icon_state = "jetpack"
|
||||
item_state = "jetpack"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/jetpacks_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/jetpacks_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
distribute_pressure = ONE_ATMOSPHERE * O2STANDARD
|
||||
actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
|
||||
var/gas_type = /datum/gas/oxygen
|
||||
var/on = FALSE
|
||||
var/stabilizers = FALSE
|
||||
var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not
|
||||
var/datum/effect_system/trail_follow/ion/ion_trail
|
||||
|
||||
/obj/item/tank/jetpack/New()
|
||||
..()
|
||||
if(gas_type)
|
||||
air_contents.gases[gas_type] = (6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)
|
||||
|
||||
ion_trail = new
|
||||
ion_trail.set_up(src)
|
||||
|
||||
/obj/item/tank/jetpack/ui_action_click(mob/user, action)
|
||||
if(istype(action, /datum/action/item_action/toggle_jetpack))
|
||||
cycle(user)
|
||||
else if(istype(action, /datum/action/item_action/jetpack_stabilization))
|
||||
if(on)
|
||||
stabilizers = !stabilizers
|
||||
to_chat(user, "<span class='notice'>You turn the jetpack stabilization [stabilizers ? "on" : "off"].</span>")
|
||||
else
|
||||
toggle_internals(user)
|
||||
|
||||
/obj/item/tank/jetpack/proc/cycle(mob/user)
|
||||
if(user.incapacitated())
|
||||
return
|
||||
|
||||
if(!on)
|
||||
turn_on()
|
||||
to_chat(user, "<span class='notice'>You turn the jetpack on.</span>")
|
||||
else
|
||||
turn_off()
|
||||
to_chat(user, "<span class='notice'>You turn the jetpack off.</span>")
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
/obj/item/tank/jetpack/proc/turn_on()
|
||||
on = TRUE
|
||||
icon_state = "[initial(icon_state)]-on"
|
||||
ion_trail.start()
|
||||
|
||||
/obj/item/tank/jetpack/proc/turn_off()
|
||||
on = FALSE
|
||||
stabilizers = FALSE
|
||||
icon_state = initial(icon_state)
|
||||
ion_trail.stop()
|
||||
|
||||
/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user)
|
||||
if(!on)
|
||||
return
|
||||
if((num < 0.005 || air_contents.total_moles() < num))
|
||||
turn_off()
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/removed = air_contents.remove(num)
|
||||
if(removed.total_moles() < 0.005)
|
||||
turn_off()
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(user)
|
||||
T.assume_air(removed)
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/tank/jetpack/suicide_act(mob/user)
|
||||
if (istype(user, /mob/living/carbon/human/))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.forcesay("WHAT THE FUCK IS CARBON DIOXIDE?")
|
||||
H.visible_message("<span class='suicide'>[user] is suffocating [user.p_them()]self with [src]! It looks like [user.p_they()] didn't read what that jetpack says!</span>")
|
||||
return (OXYLOSS)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/improvised
|
||||
name = "improvised jetpack"
|
||||
desc = "A jetpack made from two air tanks, a fire extinguisher and some atmospherics equipment. It doesn't look like it can hold much."
|
||||
icon_state = "jetpack-improvised"
|
||||
item_state = "jetpack-sec"
|
||||
volume = 30 //normal jetpacks have 70 volume
|
||||
gas_type = null //it starts empty
|
||||
full_speed = FALSE //moves at hardsuit jetpack speeds
|
||||
|
||||
/obj/item/tank/jetpack/improvised/allow_thrust(num, mob/living/user)
|
||||
if(!on)
|
||||
return
|
||||
if((num < 0.005 || air_contents.total_moles() < num))
|
||||
turn_off()
|
||||
return
|
||||
if(rand(0,250) == 0)
|
||||
to_chat(user, "<span class='notice'>You feel your jetpack's engines cut out.</span>")
|
||||
turn_off()
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/removed = air_contents.remove(num)
|
||||
if(removed.total_moles() < 0.005)
|
||||
turn_off()
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(user)
|
||||
T.assume_air(removed)
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/tank/jetpack/void
|
||||
name = "void jetpack (oxygen)"
|
||||
desc = "It works well in a void."
|
||||
volume = 60
|
||||
icon_state = "jetpack-void"
|
||||
item_state = "jetpack-void"
|
||||
full_speed = FALSE //Old pre-hardsuit tech
|
||||
|
||||
/obj/item/tank/jetpack/oxygen
|
||||
name = "jetpack (oxygen)"
|
||||
desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas. Use with caution."
|
||||
icon_state = "jetpack"
|
||||
item_state = "jetpack"
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/harness
|
||||
name = "jet harness (oxygen)"
|
||||
desc = "A lightweight tactical harness, used by those who don't want to be weighed down by traditional jetpacks."
|
||||
icon_state = "jetpack-mini"
|
||||
item_state = "jetpack-mini"
|
||||
volume = 50
|
||||
throw_range = 7
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/captain
|
||||
name = "\improper Captain's jetpack"
|
||||
desc = "A compact, lightweight jetpack containing a high amount of compressed oxygen."
|
||||
icon_state = "jetpack-captain"
|
||||
item_state = "jetpack-captain"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
volume = 90
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //steal objective items are hard to destroy.
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/security
|
||||
name = "security jetpack (oxygen)"
|
||||
desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas by security forces."
|
||||
icon_state = "jetpack-sec"
|
||||
item_state = "jetpack-sec"
|
||||
full_speed = FALSE
|
||||
|
||||
/obj/item/tank/jetpack/carbondioxide
|
||||
name = "jetpack (carbon dioxide)"
|
||||
desc = "A tank of compressed carbon dioxide for use as propulsion in zero-gravity areas. Painted black to indicate that it should not be used as a source for internals."
|
||||
icon_state = "jetpack-black"
|
||||
item_state = "jetpack-black"
|
||||
distribute_pressure = 0
|
||||
gas_type = /datum/gas/carbon_dioxide
|
||||
|
||||
/obj/item/tank/jetpack/suit
|
||||
name = "hardsuit jetpack upgrade"
|
||||
desc = "A modular, compact set of thrusters designed to integrate with a hardsuit. It is fueled by a tank inserted into the suit's storage compartment."
|
||||
icon_state = "jetpack-mining"
|
||||
item_state = "jetpack-black"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
|
||||
volume = 1
|
||||
slot_flags = null
|
||||
gas_type = null
|
||||
full_speed = FALSE
|
||||
var/datum/gas_mixture/temp_air_contents
|
||||
var/obj/item/tank/internals/tank = null
|
||||
|
||||
/obj/item/tank/jetpack/suit/New()
|
||||
..()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
temp_air_contents = air_contents
|
||||
|
||||
/obj/item/tank/jetpack/suit/attack_self()
|
||||
return
|
||||
|
||||
/obj/item/tank/jetpack/suit/cycle(mob/user)
|
||||
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit))
|
||||
to_chat(user, "<span class='warning'>\The [src] must be connected to a hardsuit!</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!istype(H.s_store, /obj/item/tank/internals))
|
||||
to_chat(user, "<span class='warning'>You need a tank in your suit storage!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/suit/turn_on()
|
||||
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
|
||||
return
|
||||
var/mob/living/carbon/human/H = loc.loc
|
||||
tank = H.s_store
|
||||
air_contents = tank.air_contents
|
||||
START_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/suit/turn_off()
|
||||
tank = null
|
||||
air_contents = temp_air_contents
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/suit/process()
|
||||
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
|
||||
turn_off()
|
||||
return
|
||||
var/mob/living/carbon/human/H = loc.loc
|
||||
if(!tank || tank != H.s_store)
|
||||
turn_off()
|
||||
return
|
||||
..()
|
||||
|
||||
//Return a jetpack that the mob can use
|
||||
//Back worn jetpacks, hardsuit internal packs, and so on.
|
||||
//Used in Process_Spacemove() and wherever you want to check for/get a jetpack
|
||||
|
||||
/mob/proc/get_jetpack()
|
||||
return
|
||||
|
||||
/mob/living/carbon/get_jetpack()
|
||||
var/obj/item/tank/jetpack/J = back
|
||||
if(istype(J))
|
||||
return J
|
||||
|
||||
/mob/living/carbon/human/get_jetpack()
|
||||
var/obj/item/tank/jetpack/J = ..()
|
||||
if(!istype(J) && istype(wear_suit, /obj/item/clothing/suit/space/hardsuit))
|
||||
var/obj/item/clothing/suit/space/hardsuit/C = wear_suit
|
||||
J = C.jetpack
|
||||
return J
|
||||
|
||||
|
||||
@@ -10,15 +10,14 @@
|
||||
. = ..()
|
||||
if(!. || !istype(M) || M.anchored)
|
||||
return
|
||||
else
|
||||
SEND_SIGNAL(M, COMSIG_LIVING_MINOR_SHOCK)
|
||||
do_teleport(M, get_turf(M), 15)
|
||||
do_teleport(M, get_turf(M), 15)
|
||||
|
||||
/obj/item/melee/baton/cattleprod/teleprod/clowning_around(mob/living/user)
|
||||
user.visible_message("<span class='danger'>[user] accidentally hits [user.p_them()]self with [src]!</span>", \
|
||||
"<span class='userdanger'>You accidentally hit yourself with [src]!</span>")
|
||||
SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
|
||||
user.Knockdown(stunforce*3)
|
||||
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
|
||||
if(do_teleport(user, get_turf(user), 50))
|
||||
deductcharge(hitcost)
|
||||
else
|
||||
|
||||
@@ -106,6 +106,7 @@
|
||||
new /obj/item/radio/headset/headset_sec(src)
|
||||
new /obj/item/clothing/suit/armor/vest/warden(src)
|
||||
new /obj/item/clothing/head/warden(src)
|
||||
new /obj/item/clothing/head/warden/drill(src)
|
||||
new /obj/item/clothing/head/beret/sec/navywarden(src)
|
||||
new /obj/item/clothing/suit/armor/vest/warden/alt(src)
|
||||
new /obj/item/clothing/under/rank/warden/navyblue(src)
|
||||
|
||||
@@ -101,6 +101,12 @@
|
||||
icon_state = "festivus_pole"
|
||||
desc = "During last year's Feats of Strength the Research Director was able to suplex this passing immobile rod into a planter."
|
||||
|
||||
/obj/structure/festivus/anchored
|
||||
name = "suplexed rod"
|
||||
desc = "A true feat of strength, almost as good as last year."
|
||||
icon_state = "anchored_rod"
|
||||
anchored = TRUE
|
||||
|
||||
/obj/structure/flora/tree/dead/Initialize()
|
||||
icon_state = "tree_[rand(1, 6)]"
|
||||
. = ..()
|
||||
|
||||
Reference in New Issue
Block a user