mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-27 22:18:27 +01:00
Merge branch 'master' of https://github.com/VOREStation/VOREStation into making-of-shadekin
This commit is contained in:
@@ -64,6 +64,19 @@
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/resin/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
|
||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
user.do_attack_animation(src)
|
||||
health -= damage
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/resin/take_damage(var/damage)
|
||||
health -= damage
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/resin/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
@@ -246,6 +259,18 @@ Alien plants should do something if theres a lot of poison
|
||||
health -= damage
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/alien/weeds/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
|
||||
user.do_attack_animation(src)
|
||||
health -= damage
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/weeds/take_damage(var/damage)
|
||||
health -= damage
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/weeds/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
qdel(src)
|
||||
@@ -401,6 +426,18 @@ Alien plants should do something if theres a lot of poison
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/egg/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
|
||||
user.do_attack_animation(src)
|
||||
health -= damage
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/egg/take_damage(var/damage)
|
||||
health -= damage
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
|
||||
/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
if(health <= 0)
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Home of the floor chemical coating.
|
||||
*/
|
||||
|
||||
/obj/effect/decal/cleanable/chemcoating
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "dirt"
|
||||
|
||||
/obj/effect/decal/cleanable/chemcoating/New()
|
||||
..()
|
||||
create_reagents(100)
|
||||
|
||||
/obj/effect/decal/cleanable/chemcoating/Initialize()
|
||||
..()
|
||||
var/turf/T = get_turf(src)
|
||||
if(T)
|
||||
for(var/obj/O in get_turf(src))
|
||||
if(O == src)
|
||||
continue
|
||||
if(istype(O, /obj/effect/decal/cleanable/chemcoating))
|
||||
var/obj/effect/decal/cleanable/chemcoating/C = O
|
||||
if(C.reagents && C.reagents.reagent_list.len)
|
||||
C.reagents.trans_to_obj(src,C.reagents.total_volume)
|
||||
qdel(O)
|
||||
|
||||
/obj/effect/decal/cleanable/chemcoating/Bumped(A as mob|obj)
|
||||
if(reagents)
|
||||
reagents.touch(A)
|
||||
return ..()
|
||||
|
||||
/obj/effect/decal/cleanable/chemcoating/Crossed(AM as mob|obj)
|
||||
Bumped(AM)
|
||||
|
||||
/obj/effect/decal/cleanable/chemcoating/update_icon()
|
||||
..()
|
||||
color = reagents.get_color()
|
||||
@@ -99,7 +99,6 @@ var/global/list/image/splatter_cache=list()
|
||||
S.overlays += S.blood_overlay
|
||||
if(S.blood_overlay && S.blood_overlay.color != basecolor)
|
||||
S.blood_overlay.color = basecolor
|
||||
S.overlays.Cut()
|
||||
S.overlays += S.blood_overlay
|
||||
S.blood_DNA |= blood_DNA.Copy()
|
||||
perp.update_inv_shoes()
|
||||
|
||||
@@ -414,6 +414,10 @@ steam.start() -- spawns the effect
|
||||
src.processing = 0
|
||||
spawn(0)
|
||||
var/turf/T = get_turf(src.holder)
|
||||
if(istype(holder, /atom/movable))
|
||||
var/atom/movable/AM = holder
|
||||
if(AM.locs && AM.locs.len)
|
||||
T = pick(AM.locs)
|
||||
if(T != src.oldposition)
|
||||
if(isturf(T))
|
||||
var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition)
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
// Constantly emites radiation from the tile it's placed on.
|
||||
/obj/effect/map_effect/radiation_emitter
|
||||
name = "radiation emitter"
|
||||
icon_state = "radiation_emitter"
|
||||
var/radiation_power = 30 // Bigger numbers means more radiation.
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/Initialize()
|
||||
START_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/process()
|
||||
radiation_repository.radiate(src, radiation_power)
|
||||
|
||||
// Constantly emites radiation from the tile it's placed on.
|
||||
/obj/effect/map_effect/radiation_emitter
|
||||
name = "radiation emitter"
|
||||
icon_state = "radiation_emitter"
|
||||
var/radiation_power = 30 // Bigger numbers means more radiation.
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/Initialize()
|
||||
START_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/process()
|
||||
SSradiation.radiate(src, radiation_power)
|
||||
|
||||
/obj/effect/map_effect/radiation_emitter/strong
|
||||
radiation_power = 100
|
||||
@@ -6,6 +6,8 @@
|
||||
invisibility = 99 // nope cant see this shit
|
||||
plane = ABOVE_PLANE
|
||||
anchored = 1
|
||||
icon = 'icons/mob/screen1.dmi' //VS Edit
|
||||
icon_state = "centermarker" //VS Edit
|
||||
|
||||
/obj/effect/step_trigger/proc/Trigger(var/atom/movable/A)
|
||||
return 0
|
||||
@@ -233,6 +235,10 @@ var/global/list/tele_landmarks = list() // Terrible, but the alternative is loop
|
||||
if(isobserver(A))
|
||||
A.forceMove(T) // Harmlessly move ghosts.
|
||||
return
|
||||
//VOREStation Edit Start
|
||||
if(!(A.can_fall()))
|
||||
return // Phased shifted kin should not fall
|
||||
//VOREStation Edit End
|
||||
|
||||
A.forceMove(T)
|
||||
// Living things should probably be logged when they fall...
|
||||
|
||||
@@ -44,3 +44,14 @@
|
||||
icon_state = "explosionfast"
|
||||
duration = 4
|
||||
// VOREStation Add End
|
||||
|
||||
//VOREStation edit: medigun
|
||||
/obj/effect/temp_visual/heal
|
||||
name = "healing glow"
|
||||
icon_state = "heal"
|
||||
duration = 15
|
||||
|
||||
/obj/effect/temp_visual/heal/Initialize(mapload)
|
||||
pixel_x = rand(-12, 12)
|
||||
pixel_y = rand(-9, 0)
|
||||
//VOREStation edit ends
|
||||
@@ -79,3 +79,12 @@
|
||||
light_range = 4
|
||||
light_power = 3
|
||||
light_color = "#3300ff"
|
||||
|
||||
//VOREStation edit: medigun
|
||||
/obj/effect/projectile/impact/medigun
|
||||
icon = 'icons/obj/projectiles_vr.dmi'
|
||||
icon_state = "impact_medbeam"
|
||||
light_range = 2
|
||||
light_power = 0.5
|
||||
light_color = "#80F5FF"
|
||||
//VOREStation edit ends
|
||||
@@ -91,3 +91,12 @@
|
||||
light_range = 4
|
||||
light_power = 3
|
||||
light_color = "#3300ff"
|
||||
|
||||
//VOREStation edit: medigun
|
||||
/obj/effect/projectile/muzzle/medigun
|
||||
icon = 'icons/obj/projectiles_vr.dmi'
|
||||
icon_state = "muzzle_medbeam"
|
||||
light_range = 2
|
||||
light_power = 0.5
|
||||
light_color = "#80F5FF"
|
||||
//VOREStation edit ends
|
||||
@@ -1,4 +1,12 @@
|
||||
/proc/generate_tracer_between_points(datum/point/starting, datum/point/ending, beam_type, color, qdel_in = 5, light_range = 2, light_color_override, light_intensity = 1, instance_key) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported!
|
||||
/datum/beam_components_cache
|
||||
var/list/beam_components = list()
|
||||
|
||||
/datum/beam_components_cache/Destroy()
|
||||
for(var/component in beam_components)
|
||||
qdel(component)
|
||||
return ..()
|
||||
|
||||
/proc/generate_tracer_between_points(datum/point/starting, datum/point/ending, datum/beam_components_cache/beam_components, beam_type, color, qdel_in = 5, light_range = 2, light_color_override, light_intensity = 1, instance_key) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported!
|
||||
if(!istype(starting) || !istype(ending) || !ispath(beam_type))
|
||||
return
|
||||
var/datum/point/midpoint = point_midpoint_points(starting, ending)
|
||||
@@ -21,10 +29,9 @@
|
||||
for(var/obj/effect/projectile_lighting/PL in T)
|
||||
if(PL.owner == instance_key)
|
||||
continue tracing_line
|
||||
QDEL_IN(new /obj/effect/projectile_lighting(T, light_color_override, light_range, light_intensity, instance_key), qdel_in > 0? qdel_in : 5)
|
||||
beam_components.beam_components += new /obj/effect/projectile_lighting(T, light_color_override, light_range, light_intensity, instance_key)
|
||||
line = null
|
||||
if(qdel_in)
|
||||
QDEL_IN(PB, qdel_in)
|
||||
beam_components.beam_components += PB
|
||||
|
||||
/obj/effect/projectile/tracer
|
||||
name = "beam"
|
||||
@@ -107,3 +114,12 @@
|
||||
light_range = 4
|
||||
light_power = 3
|
||||
light_color = "#3300ff"
|
||||
|
||||
//VOREStation edit: medigun
|
||||
/obj/effect/projectile/tracer/medigun
|
||||
icon = 'icons/obj/projectiles_vr.dmi'
|
||||
icon_state = "medbeam"
|
||||
light_range = 2
|
||||
light_power = 0.5
|
||||
light_color = "#80F5FF"
|
||||
//VOREStation edit ends
|
||||
+16
-12
@@ -492,13 +492,15 @@ var/list/global/slot_flags_enumeration = list(
|
||||
user << "<span class='warning'>You cannot locate any eyes on [M]!</span>"
|
||||
return
|
||||
|
||||
if(U.get_accuracy_penalty(U)) //Should only trigger if they're not aiming well
|
||||
var/hit_zone = get_zone_with_miss_chance(U.zone_sel.selecting, M, U.get_accuracy_penalty(U))
|
||||
if(!hit_zone)
|
||||
U.do_attack_animation(M)
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<font color='red'><B>[U] attempts to stab [M] in the eyes, but misses!</B></font>")
|
||||
return
|
||||
//this should absolutely trigger even if not aim-impaired in some way
|
||||
var/hit_zone = get_zone_with_miss_chance(U.zone_sel.selecting, M, U.get_accuracy_penalty(U))
|
||||
if(!hit_zone)
|
||||
U.do_attack_animation(M)
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
//visible_message("<span class='danger'>[U] attempts to stab [M] in the eyes, but misses!</span>")
|
||||
for(var/mob/V in viewers(M))
|
||||
V.show_message("<span class='danger'>[U] attempts to stab [M] in the eyes, but misses!</span>")
|
||||
return
|
||||
|
||||
add_attack_logs(user,M,"Attack eyes with [name]")
|
||||
|
||||
@@ -579,10 +581,9 @@ var/list/global/slot_flags_enumeration = list(
|
||||
if( !blood_overlay )
|
||||
generate_blood_overlay()
|
||||
|
||||
//apply the blood-splatter overlay if it isn't already in there
|
||||
if(!blood_DNA.len)
|
||||
blood_overlay.color = blood_color
|
||||
overlays += blood_overlay
|
||||
//Make the blood_overlay have the proper color then apply it.
|
||||
blood_overlay.color = blood_color
|
||||
overlays += blood_overlay
|
||||
|
||||
//if this blood isn't already in the list, add it
|
||||
if(istype(M))
|
||||
@@ -591,6 +592,7 @@ var/list/global/slot_flags_enumeration = list(
|
||||
blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
|
||||
return 1 //we applied blood to the item
|
||||
|
||||
|
||||
/obj/item/proc/generate_blood_overlay()
|
||||
if(blood_overlay)
|
||||
return
|
||||
@@ -714,7 +716,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
|
||||
icon = 'icons/obj/device.dmi'
|
||||
|
||||
//Worn icon generation for on-mob sprites
|
||||
/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer)
|
||||
/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer,var/icon/clip_mask = null) //VOREStation edit - add 'clip mask' argument.
|
||||
//Get the required information about the base icon
|
||||
var/icon/icon2use = get_worn_icon_file(body_type = body_type, slot_name = slot_name, default_icon = default_icon, inhands = inhands)
|
||||
var/state2use = get_worn_icon_state(slot_name = slot_name)
|
||||
@@ -736,6 +738,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
|
||||
if(!inhands)
|
||||
apply_custom(standing_icon) //Pre-image overridable proc to customize the thing
|
||||
apply_addblends(icon2use,standing_icon) //Some items have ICON_ADD blend shaders
|
||||
if(istype(clip_mask)) //VOREStation Edit - For taur bodies/tails clipping off parts of uniforms and suits.
|
||||
standing_icon = get_icon_difference(standing_icon, clip_mask, 1)
|
||||
|
||||
var/image/standing = image(standing_icon)
|
||||
standing.alpha = alpha
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
/obj/item/weapon/deskbell
|
||||
name = "desk bell"
|
||||
desc = "An annoying bell. Ring for service."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "deskbell"
|
||||
force = 2
|
||||
throwforce = 2
|
||||
w_class = 2.0
|
||||
var/broken
|
||||
attack_verb = list("annoyed")
|
||||
var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine")
|
||||
var/static/radial_use = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_use")
|
||||
var/static/radial_pickup = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_pickup")
|
||||
|
||||
/obj/item/weapon/deskbell/examine(mob/user)
|
||||
..()
|
||||
if(broken)
|
||||
to_chat(user,"<b>It looks damaged, the ringer is stuck firmly inside.</b>")
|
||||
|
||||
/obj/item/weapon/deskbell/attack(mob/target as mob, mob/living/user as mob)
|
||||
if(!broken)
|
||||
playsound(user.loc, 'sound/effects/deskbell.ogg', 50, 1)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/deskbell/attack_hand(mob/user)
|
||||
|
||||
//This defines the radials and what call we're assiging to them.
|
||||
var/list/options = list()
|
||||
options["examine"] = radial_examine
|
||||
options["pick up"] = radial_pickup
|
||||
if(!broken)
|
||||
options["use"] = radial_use
|
||||
|
||||
|
||||
// Just an example, if the bell had no options, due to conditionals, nothing would happen here.
|
||||
if(length(options) < 1)
|
||||
return
|
||||
|
||||
// Right, if there's only one available radial...
|
||||
// For example, say, the bell's broken so you can only examine, it just does that (doesn't show radial)..
|
||||
var/list/choice = list()
|
||||
if(length(options) == 1)
|
||||
for(var/key in options)
|
||||
choice = key
|
||||
else
|
||||
// If we have other options, it will show the radial menu for the player to decide.
|
||||
choice = show_radial_menu(user, src, options, require_near = !issilicon(user))
|
||||
|
||||
// Once the player has decided their option, choose the behaviour that will happen under said option.
|
||||
switch(choice)
|
||||
if("examine")
|
||||
examine(user)
|
||||
|
||||
if("use")
|
||||
if(check_ability(user))
|
||||
ring(user)
|
||||
add_fingerprint(user)
|
||||
|
||||
if("pick up")
|
||||
..()
|
||||
|
||||
/obj/item/weapon/deskbell/proc/ring(mob/user)
|
||||
if(user.a_intent == "harm")
|
||||
playsound(user.loc, 'sound/effects/deskbell_rude.ogg', 50, 1)
|
||||
to_chat(user,"<span class='notice'>You hammer [src] rudely!</span>")
|
||||
if (prob(2))
|
||||
break_bell(user)
|
||||
else
|
||||
playsound(user.loc, 'sound/effects/deskbell.ogg', 50, 1)
|
||||
to_chat(user,"<span class='notice'>You gracefully ring [src].</span>")
|
||||
|
||||
/obj/item/weapon/deskbell/proc/check_ability(mob/user)
|
||||
if (ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
|
||||
if (H.hand)
|
||||
temp = H.organs_by_name["l_hand"]
|
||||
if(temp && !temp.is_usable())
|
||||
to_chat(H,"<span class='notice'>You try to move your [temp.name], but cannot!</span>")
|
||||
return 0
|
||||
return 1
|
||||
else
|
||||
to_chat(user,"<span class='notice'>You are not able to ring [src].</span>")
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/deskbell/attackby(obj/item/W, mob/user, params)
|
||||
if(!istype(W))
|
||||
return
|
||||
if(W.is_wrench() && isturf(loc))
|
||||
if(do_after(5))
|
||||
if(!src) return
|
||||
to_chat(user, "<span class='notice'>You dissasemble the desk bell</span>")
|
||||
new /obj/item/stack/material/steel(get_turf(src), 1)
|
||||
qdel(src)
|
||||
return
|
||||
if(!broken)
|
||||
ring(user)
|
||||
|
||||
|
||||
/obj/item/weapon/deskbell/proc/break_bell(mob/user)
|
||||
to_chat(user,"<span class='notice'>The ringing abruptly stops as [src]'s ringer gets jammed inside!</span>")
|
||||
broken = 1
|
||||
@@ -4,30 +4,14 @@
|
||||
/obj/item/weapon/storage/pill_bottle/happy
|
||||
name = "bottle of Happy pills"
|
||||
desc = "Highly illegal drug. When you want to see the rainbow."
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/happy/New()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/pill/happy( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/happy( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/happy( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/happy( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/happy( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/happy( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/happy( src )
|
||||
wrapper_color = COLOR_PINK
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/happy = 7)
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/zoom
|
||||
name = "bottle of Zoom pills"
|
||||
desc = "Highly illegal drug. Trade brain for speed."
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/zoom/New()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/pill/zoom( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/zoom( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/zoom( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/zoom( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/zoom( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/zoom( src )
|
||||
new /obj/item/weapon/reagent_containers/pill/zoom( src )
|
||||
wrapper_color = COLOR_BLUE
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/zoom = 7)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/beaker/vial/random
|
||||
flags = 0
|
||||
|
||||
@@ -577,31 +577,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
|
||||
|
||||
if(mode==3)
|
||||
var/turf/T = get_turf(user.loc)
|
||||
if(!isnull(T))
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
|
||||
var/pressure = environment.return_pressure()
|
||||
var/total_moles = environment.total_moles
|
||||
|
||||
if (total_moles)
|
||||
var/o2_level = environment.gas["oxygen"]/total_moles
|
||||
var/n2_level = environment.gas["nitrogen"]/total_moles
|
||||
var/co2_level = environment.gas["carbon_dioxide"]/total_moles
|
||||
var/phoron_level = environment.gas["phoron"]/total_moles
|
||||
var/unknown_level = 1-(o2_level+n2_level+co2_level+phoron_level)
|
||||
data["aircontents"] = list(\
|
||||
"pressure" = "[round(pressure,0.1)]",\
|
||||
"nitrogen" = "[round(n2_level*100,0.1)]",\
|
||||
"oxygen" = "[round(o2_level*100,0.1)]",\
|
||||
"carbon_dioxide" = "[round(co2_level*100,0.1)]",\
|
||||
"phoron" = "[round(phoron_level*100,0.01)]",\
|
||||
"other" = "[round(unknown_level, 0.01)]",\
|
||||
"temp" = "[round(environment.temperature-T0C,0.1)]",\
|
||||
"reading" = 1\
|
||||
)
|
||||
if(isnull(data["aircontents"]))
|
||||
data["aircontents"] = list("reading" = 0)
|
||||
data["aircontents"] = src.analyze_air()
|
||||
if(mode==6)
|
||||
if(has_reception)
|
||||
feeds.Cut()
|
||||
@@ -1120,7 +1096,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
P.conversations.Add("\ref[src]")
|
||||
|
||||
|
||||
if (prob(15)) //Give the AI a chance of intercepting the message
|
||||
if (prob(5) && security_level >= SEC_LEVEL_BLUE) //Give the AI a chance of intercepting the message //VOREStation Edit: no spam interception on lower codes + lower interception chance
|
||||
var/who = src.owner
|
||||
if(prob(50))
|
||||
who = P.owner
|
||||
@@ -1550,3 +1526,37 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
/obj/item/device/pda/emp_act(severity)
|
||||
for(var/atom/A in src)
|
||||
A.emp_act(severity)
|
||||
|
||||
/obj/item/device/pda/proc/analyze_air()
|
||||
var/list/results = list()
|
||||
var/turf/T = get_turf(src.loc)
|
||||
if(!isnull(T))
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
var/pressure = environment.return_pressure()
|
||||
var/total_moles = environment.total_moles
|
||||
if (total_moles)
|
||||
var/o2_level = environment.gas["oxygen"]/total_moles
|
||||
var/n2_level = environment.gas["nitrogen"]/total_moles
|
||||
var/co2_level = environment.gas["carbon_dioxide"]/total_moles
|
||||
var/phoron_level = environment.gas["phoron"]/total_moles
|
||||
var/unknown_level = 1-(o2_level+n2_level+co2_level+phoron_level)
|
||||
|
||||
// entry is what the element is describing
|
||||
// Type identifies which unit or other special characters to use
|
||||
// Val is the information reported
|
||||
// Bad_high/_low are the values outside of which the entry reports as dangerous
|
||||
// Poor_high/_low are the values outside of which the entry reports as unideal
|
||||
// Values were extracted from the template itself
|
||||
results = list(
|
||||
list("entry" = "Pressure", "units" = "kPa", "val" = "[round(pressure,0.1)]", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80),
|
||||
list("entry" = "Temperature", "units" = "°C", "val" = "[round(environment.temperature-T0C,0.1)]", "bad_high" = 35, "poor_high" = 25, "poor_low" = 15, "bad_low" = 5),
|
||||
list("entry" = "Oxygen", "units" = "kPa", "val" = "[round(o2_level*100,0.1)]", "bad_high" = 140, "poor_high" = 135, "poor_low" = 19, "bad_low" = 17),
|
||||
list("entry" = "Nitrogen", "units" = "kPa", "val" = "[round(n2_level*100,0.1)]", "bad_high" = 105, "poor_high" = 85, "poor_low" = 50, "bad_low" = 40),
|
||||
list("entry" = "Carbon Dioxide", "units" = "kPa", "val" = "[round(co2_level*100,0.1)]", "bad_high" = 10, "poor_high" = 5, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Phoron", "units" = "kPa", "val" = "[round(phoron_level*100,0.01)]", "bad_high" = 0.5, "poor_high" = 0, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Other", "units" = "kPa", "val" = "[round(unknown_level, 0.01)]", "bad_high" = 1, "poor_high" = 0.5, "poor_low" = 0, "bad_low" = 0)
|
||||
)
|
||||
|
||||
if(isnull(results))
|
||||
results = list(list("entry" = "pressure", "units" = "kPa", "val" = "0", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80))
|
||||
return results
|
||||
|
||||
@@ -4,6 +4,7 @@ var/list/command_cartridges = list(
|
||||
/obj/item/weapon/cartridge/hos,
|
||||
/obj/item/weapon/cartridge/ce,
|
||||
/obj/item/weapon/cartridge/rd,
|
||||
/obj/item/weapon/cartridge/cmo,
|
||||
/obj/item/weapon/cartridge/head,
|
||||
/obj/item/weapon/cartridge/lawyer // Internal Affaris,
|
||||
)
|
||||
@@ -149,7 +150,7 @@ var/list/civilian_cartridges = list(
|
||||
*/
|
||||
|
||||
/obj/item/weapon/cartridge/service
|
||||
name = "\improper Serv-U Pro"
|
||||
name = "\improper Serv-U Pro cartridge"
|
||||
desc = "A data cartridge designed to serve YOU!"
|
||||
|
||||
/obj/item/weapon/cartridge/signal
|
||||
@@ -175,12 +176,12 @@ var/list/civilian_cartridges = list(
|
||||
access_quartermaster = 1
|
||||
|
||||
/obj/item/weapon/cartridge/miner
|
||||
name = "\improper Drill-Jockey 4.5"
|
||||
name = "\improper Drill-Jockey 4.5 cartridge"
|
||||
desc = "It's covered in some sort of sand."
|
||||
icon_state = "cart-q"
|
||||
|
||||
/obj/item/weapon/cartridge/head
|
||||
name = "\improper Easy-Record DELUXE"
|
||||
name = "\improper Easy-Record DELUXE cartridge"
|
||||
icon_state = "cart-h"
|
||||
access_status_display = 1
|
||||
|
||||
@@ -193,7 +194,7 @@ var/list/civilian_cartridges = list(
|
||||
access_security = 1
|
||||
|
||||
/obj/item/weapon/cartridge/hos
|
||||
name = "\improper R.O.B.U.S.T. DELUXE"
|
||||
name = "\improper R.O.B.U.S.T. DELUXE cartridge"
|
||||
icon_state = "cart-hos"
|
||||
access_status_display = 1
|
||||
access_security = 1
|
||||
@@ -203,21 +204,21 @@ var/list/civilian_cartridges = list(
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/cartridge/ce
|
||||
name = "\improper Power-On DELUXE"
|
||||
name = "\improper Power-On DELUXE cartridge"
|
||||
icon_state = "cart-ce"
|
||||
access_status_display = 1
|
||||
access_engine = 1
|
||||
access_atmos = 1
|
||||
|
||||
/obj/item/weapon/cartridge/cmo
|
||||
name = "\improper Med-U DELUXE"
|
||||
name = "\improper Med-U DELUXE cartridge"
|
||||
icon_state = "cart-cmo"
|
||||
access_status_display = 1
|
||||
access_reagent_scanner = 1
|
||||
access_medical = 1
|
||||
|
||||
/obj/item/weapon/cartridge/rd
|
||||
name = "\improper Signal Ace DELUXE"
|
||||
name = "\improper Signal Ace DELUXE cartridge"
|
||||
icon_state = "cart-rd"
|
||||
access_status_display = 1
|
||||
access_reagent_scanner = 1
|
||||
|
||||
@@ -77,6 +77,8 @@
|
||||
"Temperature" = planet.weather_holder.temperature - T0C,
|
||||
"High" = planet.weather_holder.current_weather.temp_high - T0C,
|
||||
"Low" = planet.weather_holder.current_weather.temp_low - T0C,
|
||||
"WindDir" = planet.weather_holder.wind_dir ? dir2text(planet.weather_holder.wind_dir) : "None",
|
||||
"WindSpeed" = planet.weather_holder.wind_speed ? "[planet.weather_holder.wind_speed > 2 ? "Severe" : "Normal"]" : "None",
|
||||
"Forecast" = english_list(planet.weather_holder.forecast, and_text = "→", comma_text = "→", final_comma_text = "→") // Unicode RIGHTWARDS ARROW.
|
||||
)
|
||||
weather[++weather.len] = W
|
||||
@@ -114,7 +116,7 @@
|
||||
data["flashlight"] = fon
|
||||
data["manifest"] = PDA_Manifest
|
||||
data["feeds"] = compile_news()
|
||||
data["latest_news"] = get_recent_news()
|
||||
//data["latest_news"] = get_recent_news() //VOREStation Edit, bandaid for catastrophic runtime lag in helper.dm
|
||||
if(cartridge) // If there's a cartridge, we need to grab the information from it
|
||||
data["cart_devices"] = cartridge.get_device_status()
|
||||
data["cart_templates"] = cartridge.ui_templates
|
||||
|
||||
@@ -19,17 +19,17 @@
|
||||
// Poor_high/_low are the values outside of which the entry reports as unideal
|
||||
// Values were extracted from the template itself
|
||||
results = list(
|
||||
list("entry" = "Pressure", "type" = "pressure", "val" = "[round(pressure,0.1)]", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80),
|
||||
list("entry" = "Temperature", "type" = "temp", "val" = "[round(environment.temperature-T0C,0.1)]", "bad_high" = 35, "poor_high" = 25, "poor_low" = 15, "bad_low" = 5),
|
||||
list("entry" = "Oxygen", "type" = "pressure", "val" = "[round(o2_level*100,0.1)]", "bad_high" = 140, "poor_high" = 135, "poor_low" = 19, "bad_low" = 17),
|
||||
list("entry" = "Nitrogen", "type" = "pressure", "val" = "[round(n2_level*100,0.1)]", "bad_high" = 105, "poor_high" = 85, "poor_low" = 50, "bad_low" = 40),
|
||||
list("entry" = "Carbon Dioxide", "type" = "pressure", "val" = "[round(co2_level*100,0.1)]", "bad_high" = 10, "poor_high" = 5, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Phoron", "type" = "pressure", "val" = "[round(phoron_level*100,0.01)]", "bad_high" = 0.5, "poor_high" = 0, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Other", "type" = "pressure", "val" = "[round(unknown_level, 0.01)]", "bad_high" = 1, "poor_high" = 0.5, "poor_low" = 0, "bad_low" = 0)
|
||||
list("entry" = "Pressure", "units" = "kPa", "val" = "[round(pressure,0.1)]", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80),
|
||||
list("entry" = "Temperature", "units" = "°C", "val" = "[round(environment.temperature-T0C,0.1)]", "bad_high" = 35, "poor_high" = 25, "poor_low" = 15, "bad_low" = 5),
|
||||
list("entry" = "Oxygen", "units" = "kPa", "val" = "[round(o2_level*100,0.1)]", "bad_high" = 140, "poor_high" = 135, "poor_low" = 19, "bad_low" = 17),
|
||||
list("entry" = "Nitrogen", "units" = "kPa", "val" = "[round(n2_level*100,0.1)]", "bad_high" = 105, "poor_high" = 85, "poor_low" = 50, "bad_low" = 40),
|
||||
list("entry" = "Carbon Dioxide", "units" = "kPa", "val" = "[round(co2_level*100,0.1)]", "bad_high" = 10, "poor_high" = 5, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Phoron", "units" = "kPa", "val" = "[round(phoron_level*100,0.01)]", "bad_high" = 0.5, "poor_high" = 0, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Other", "units" = "kPa", "val" = "[round(unknown_level, 0.01)]", "bad_high" = 1, "poor_high" = 0.5, "poor_low" = 0, "bad_low" = 0)
|
||||
)
|
||||
|
||||
if(isnull(results))
|
||||
results = list(list("entry" = "pressure", "val" = "0"))
|
||||
results = list(list("entry" = "pressure", "units" = "kPa", "val" = "0", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80))
|
||||
return results
|
||||
|
||||
|
||||
|
||||
@@ -610,12 +610,12 @@
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/shockpaddles/standalone/checked_use(var/charge_amt)
|
||||
radiation_repository.radiate(src, charge_amt/12) //just a little bit of radiation. It's the price you pay for being powered by magic I guess
|
||||
SSradiation.radiate(src, charge_amt/12) //just a little bit of radiation. It's the price you pay for being powered by magic I guess
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/shockpaddles/standalone/process()
|
||||
if(fail_counter > 0)
|
||||
radiation_repository.radiate(src, fail_counter--)
|
||||
SSradiation.radiate(src, fail_counter--)
|
||||
else
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
|
||||
@@ -122,9 +122,9 @@
|
||||
if(use_external_power)
|
||||
battery = get_external_power_supply()
|
||||
|
||||
if(times_used <= max_flashes && battery && battery.checked_use(charge_cost))
|
||||
if(times_used <= max_flashes && battery && battery.charge >= charge_cost)
|
||||
last_used = world.time
|
||||
if(prob( max(0, times_used - safe_flashes) * 2 + (times_used >= 1) ) && can_break) //if you use it 10 times in a minute it has a 30% chance to break.
|
||||
if(prob( max(0, times_used - safe_flashes) * 2 + (times_used >= safe_flashes)) && can_break) //if you use it 10 times in a minute it has a 30% chance to break.
|
||||
broken = TRUE
|
||||
if(user)
|
||||
to_chat(user, "<span class='warning'>The bulb has burnt out!</span>")
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
/obj/item/device/geiger/proc/get_radiation()
|
||||
if(!scanning)
|
||||
return
|
||||
radiation_count = radiation_repository.get_rads_at_turf(get_turf(src))
|
||||
radiation_count = SSradiation.get_rads_at_turf(get_turf(src))
|
||||
update_icon()
|
||||
update_sound()
|
||||
|
||||
|
||||
@@ -4,12 +4,12 @@ var/list/GPS_list = list()
|
||||
name = "global positioning system"
|
||||
desc = "Triangulates the approximate co-ordinates using a nearby satellite network. Alt+click to toggle power."
|
||||
icon = 'icons/obj/gps.dmi'
|
||||
icon_state = "gps-c"
|
||||
icon_state = "gps-gen"
|
||||
w_class = ITEMSIZE_TINY
|
||||
slot_flags = SLOT_BELT
|
||||
origin_tech = list(TECH_MATERIAL = 2, TECH_BLUESPACE = 2, TECH_MAGNET = 1)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 500)
|
||||
var/gps_tag = "COM0"
|
||||
var/gps_tag = "GEN0"
|
||||
var/emped = FALSE
|
||||
var/tracking = FALSE // Will not show other signals or emit its own signal if false.
|
||||
var/long_range = FALSE // If true, can see farther, depending on get_map_levels().
|
||||
@@ -171,22 +171,43 @@ var/list/GPS_list = list()
|
||||
/obj/item/device/gps/on // Defaults to off to avoid polluting the signal list with a bunch of GPSes without owners. If you need to spawn active ones, use these.
|
||||
tracking = TRUE
|
||||
|
||||
/obj/item/device/gps/command
|
||||
icon_state = "gps-com"
|
||||
gps_tag = "COM0"
|
||||
|
||||
/obj/item/device/gps/command/on
|
||||
tracking = TRUE
|
||||
|
||||
/obj/item/device/gps/security
|
||||
icon_state = "gps-sec"
|
||||
gps_tag = "SEC0"
|
||||
|
||||
/obj/item/device/gps/security/on
|
||||
tracking = TRUE
|
||||
|
||||
/obj/item/device/gps/medical
|
||||
icon_state = "gps-med"
|
||||
gps_tag = "MED0"
|
||||
|
||||
/obj/item/device/gps/medical/on
|
||||
tracking = TRUE
|
||||
|
||||
/obj/item/device/gps/science
|
||||
icon_state = "gps-s"
|
||||
icon_state = "gps-sci"
|
||||
gps_tag = "SCI0"
|
||||
|
||||
/obj/item/device/gps/science/on
|
||||
tracking = TRUE
|
||||
|
||||
/obj/item/device/gps/engineering
|
||||
icon_state = "gps-e"
|
||||
icon_state = "gps-eng"
|
||||
gps_tag = "ENG0"
|
||||
|
||||
/obj/item/device/gps/engineering/on
|
||||
tracking = TRUE
|
||||
|
||||
/obj/item/device/gps/mining
|
||||
icon_state = "gps-m"
|
||||
icon_state = "gps-mine"
|
||||
gps_tag = "MINE0"
|
||||
desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life. Alt+click to toggle power."
|
||||
|
||||
@@ -194,15 +215,15 @@ var/list/GPS_list = list()
|
||||
tracking = TRUE
|
||||
|
||||
/obj/item/device/gps/explorer
|
||||
icon_state = "gps-ex"
|
||||
gps_tag = "EX0"
|
||||
icon_state = "gps-exp"
|
||||
gps_tag = "EXP0"
|
||||
desc = "A positioning system helpful for rescuing trapped or injured explorers, keeping one on you at all times while exploring might just save your life. Alt+click to toggle power."
|
||||
|
||||
/obj/item/device/gps/explorer/on
|
||||
tracking = TRUE
|
||||
|
||||
/obj/item/device/gps/robot
|
||||
icon_state = "gps-b"
|
||||
icon_state = "gps-borg"
|
||||
gps_tag = "SYNTH0"
|
||||
desc = "A synthetic internal positioning system. Used as a recovery beacon for damaged synthetic assets, or a collaboration tool for mining or exploration teams. \
|
||||
Alt+click to toggle power."
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
/obj/item/device/holowarrant
|
||||
name = "warrant projector"
|
||||
desc = "The practical paperwork replacement for the officer on the go."
|
||||
icon_state = "holowarrant"
|
||||
item_state = "flashtool"
|
||||
throwforce = 5
|
||||
w_class = ITEMSIZE_SMALL
|
||||
throw_speed = 4
|
||||
throw_range = 10
|
||||
var/datum/data/record/warrant/active
|
||||
|
||||
//look at it
|
||||
/obj/item/device/holowarrant/examine(mob/user)
|
||||
. = ..()
|
||||
if(active)
|
||||
to_chat(user, "It's a holographic warrant for '[active.fields["namewarrant"]]'.")
|
||||
if(in_range(user, src) || istype(user, /mob/observer/dead))
|
||||
show_content(user)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You have to go closer if you want to read it.</span>")
|
||||
|
||||
//hit yourself with it
|
||||
/obj/item/device/holowarrant/attack_self(mob/living/user as mob)
|
||||
active = null
|
||||
var/list/warrants = list()
|
||||
if(!isnull(data_core.general))
|
||||
for(var/datum/data/record/warrant/W in data_core.warrants)
|
||||
warrants += W.fields["namewarrant"]
|
||||
if(warrants.len == 0)
|
||||
to_chat(user,"<span class='notice'>There are no warrants available</span>")
|
||||
return
|
||||
var/temp
|
||||
temp = input(user, "Which warrant would you like to load?") as null|anything in warrants
|
||||
for(var/datum/data/record/warrant/W in data_core.warrants)
|
||||
if(W.fields["namewarrant"] == temp)
|
||||
active = W
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/holowarrant/attackby(obj/item/weapon/W, mob/user)
|
||||
if(active)
|
||||
var/obj/item/weapon/card/id/I = W.GetIdCard()
|
||||
if(I)
|
||||
var/choice = alert(user, "Would you like to authorize this warrant?","Warrant authorization","Yes","No")
|
||||
if(choice == "Yes")
|
||||
active.fields["auth"] = "[I.registered_name] - [I.assignment ? I.assignment : "(Unknown)"]"
|
||||
user.visible_message("<span class='notice'>You swipe \the [I] through the [src].</span>", \
|
||||
"<span class='notice'>[user] swipes \the [I] through the [src].</span>")
|
||||
return 1
|
||||
..()
|
||||
|
||||
//hit other people with it
|
||||
/obj/item/device/holowarrant/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
user.visible_message("<span class='notice'>You show the warrant to [M].</span>", \
|
||||
"<span class='notice'>[user] holds up a warrant projector and shows the contents to [M].</span>")
|
||||
M.examinate(src)
|
||||
|
||||
/obj/item/device/holowarrant/update_icon()
|
||||
if(active)
|
||||
icon_state = "holowarrant_filled"
|
||||
else
|
||||
icon_state = "holowarrant"
|
||||
|
||||
/obj/item/device/holowarrant/proc/show_content(mob/user, forceshow)
|
||||
if(!active)
|
||||
return
|
||||
if(active.fields["arrestsearch"] == "arrest")
|
||||
var/output = {"
|
||||
<HTML><HEAD><TITLE>[active.fields["namewarrant"]]</TITLE></HEAD>
|
||||
<BODY bgcolor='#FFFFFF'><center><large><b>Sol Central Government Colonial Marshal Bureau</b></large></br>
|
||||
in the jurisdiction of the</br>
|
||||
[using_map.boss_name] in [using_map.station_name]</br>
|
||||
</br>
|
||||
<b>ARREST WARRANT</b></center></br>
|
||||
</br>
|
||||
This document serves as authorization and notice for the arrest of _<u>[active.fields["namewarrant"]]</u>____ for the crime(s) of:</br>[active.fields["charges"]]</br>
|
||||
</br>
|
||||
Vessel or habitat: _<u>[using_map.station_name]</u>____</br>
|
||||
</br>_<u>[active.fields["auth"]]</u>____</br>
|
||||
<small>Person authorizing arrest</small></br>
|
||||
</BODY></HTML>
|
||||
"}
|
||||
|
||||
show_browser(user, output, "window=Warrant for the arrest of [active.fields["namewarrant"]]")
|
||||
if(active.fields["arrestsearch"] == "search")
|
||||
var/output= {"
|
||||
<HTML><HEAD><TITLE>Search Warrant: [active.fields["namewarrant"]]</TITLE></HEAD>
|
||||
<BODY bgcolor='#FFFFFF'><center>in the jurisdiction of the</br>
|
||||
[using_map.boss_name] in [using_map.station_name]</br>
|
||||
</br>
|
||||
<b>SEARCH WARRANT</b></center></br>
|
||||
</br>
|
||||
<small><i>The Security Officer(s) bearing this Warrant are hereby authorized by the Issuer </br>
|
||||
to conduct a one time lawful search of the Suspect's person/belongings/premises and/or Department </br>
|
||||
for any items and materials that could be connected to the suspected criminal act described below, </br>
|
||||
pending an investigation in progress. The Security Officer(s) are obligated to remove any and all</br>
|
||||
such items from the Suspects posession and/or Department and file it as evidence. The Suspect/Department </br>
|
||||
staff is expected to offer full co-operation. In the event of the Suspect/Department staff attempting </br>
|
||||
to resist/impede this search or flee, they must be taken into custody immediately! </br>
|
||||
All confiscated items must be filed and taken to Evidence!</small></i></br>
|
||||
</br>
|
||||
<b>Suspect's/location name: </b>[active.fields["namewarrant"]]</br>
|
||||
</br>
|
||||
<b>For the following reasons: </b> [active.fields["charges"]]</br>
|
||||
</br>
|
||||
<b>Warrant issued by: </b> [active.fields ["auth"]]</br>
|
||||
</br>
|
||||
Vessel or habitat: _<u>[using_map.station_name]</u>____</br>
|
||||
</BODY></HTML>
|
||||
"}
|
||||
show_browser(user, output, "window=Search warrant for [active.fields["namewarrant"]]")
|
||||
@@ -121,48 +121,18 @@
|
||||
|
||||
/obj/item/device/lightreplacer/proc/ReplaceLight(var/obj/machinery/light/target, var/mob/living/U)
|
||||
|
||||
if(target.status != LIGHT_OK)
|
||||
if(CanUse(U))
|
||||
if(!Use(U)) return
|
||||
U << "<span class='notice'>You replace the [target.fitting] with the [src].</span>"
|
||||
if(target.status == LIGHT_OK)
|
||||
to_chat(U, "There is a working [target.get_fitting_name()] already inserted.")
|
||||
else if(!CanUse(U))
|
||||
to_chat(U, failmsg)
|
||||
else if(Use(U))
|
||||
to_chat(U, "<span class='notice'>You replace the [target.get_fitting_name()] with the [src].</span>")
|
||||
|
||||
if(target.status != LIGHT_EMPTY)
|
||||
if(target.status != LIGHT_EMPTY)
|
||||
target.remove_bulb()
|
||||
|
||||
var/obj/item/weapon/light/L1 = new target.light_type(target.loc)
|
||||
L1.status = target.status
|
||||
L1.rigged = target.rigged
|
||||
L1.brightness_range = target.brightness_range
|
||||
L1.brightness_power = target.brightness_power
|
||||
L1.brightness_color = target.brightness_color
|
||||
L1.switchcount = target.switchcount
|
||||
target.switchcount = 0
|
||||
L1.update()
|
||||
|
||||
target.status = LIGHT_EMPTY
|
||||
target.update()
|
||||
|
||||
var/obj/item/weapon/light/L2 = new target.light_type()
|
||||
|
||||
target.status = L2.status
|
||||
target.switchcount = L2.switchcount
|
||||
target.rigged = emagged
|
||||
target.brightness_range = L2.brightness_range
|
||||
target.brightness_power = L2.brightness_power
|
||||
target.brightness_color = L2.brightness_color
|
||||
target.on = target.has_power()
|
||||
target.update()
|
||||
qdel(L2)
|
||||
|
||||
if(target.on && target.rigged)
|
||||
target.explode()
|
||||
return
|
||||
|
||||
else
|
||||
U << failmsg
|
||||
return
|
||||
else
|
||||
U << "There is a working [target.fitting] already inserted."
|
||||
return
|
||||
var/obj/item/weapon/light/L = new target.light_type()
|
||||
target.insert_bulb(L)
|
||||
|
||||
/obj/item/device/lightreplacer/emag_act(var/remaining_charges, var/mob/user)
|
||||
emagged = !emagged
|
||||
|
||||
@@ -18,3 +18,9 @@
|
||||
name = "research director's encryption key"
|
||||
icon_state = "rd_cypherkey"
|
||||
channels = list("Command" = 1, "Science" = 1, "Explorer" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/ert
|
||||
channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1, "Explorer" = 1)
|
||||
|
||||
/obj/item/device/encryptionkey/omni //Literally only for the admin intercoms
|
||||
channels = list("Mercenary" = 1, "Raider" = 1, "Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1, "Explorer" = 1)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "The headset of the boss's boss."
|
||||
icon_state = "cent_headset"
|
||||
item_state = "headset"
|
||||
centComm = 1
|
||||
ks2type = /obj/item/device/encryptionkey/ert
|
||||
|
||||
/obj/item/device/radio/headset/centcom/alt
|
||||
@@ -13,5 +14,9 @@
|
||||
name = "\improper NT radio headset"
|
||||
desc = "The headset of a Nanotrasen corporate employee."
|
||||
icon_state = "nt_headset"
|
||||
centComm = 1
|
||||
ks2type = /obj/item/device/encryptionkey/ert
|
||||
|
||||
/obj/item/device/radio/headset
|
||||
sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi',
|
||||
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi')
|
||||
@@ -95,7 +95,7 @@ var/global/list/default_medbay_channels = list(
|
||||
|
||||
/obj/item/device/radio/interact(mob/user)
|
||||
if(!user)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(b_stat)
|
||||
wires.Interact(user)
|
||||
@@ -151,10 +151,10 @@ var/global/list/default_medbay_channels = list(
|
||||
|
||||
/obj/item/device/radio/proc/has_channel_access(var/mob/user, var/freq)
|
||||
if(!user)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(!(freq in internal_channels))
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
return user.has_internal_radio_channel_access(internal_channels[freq])
|
||||
|
||||
@@ -191,7 +191,7 @@ var/global/list/default_medbay_channels = list(
|
||||
|
||||
/obj/item/device/radio/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
usr.set_machine(src)
|
||||
if (href_list["track"])
|
||||
@@ -229,7 +229,7 @@ var/global/list/default_medbay_channels = list(
|
||||
set_frequency(text2num(freq))
|
||||
. = 1
|
||||
if(href_list["nowindow"]) // here for pAIs, maybe others will want it, idk
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
if(.)
|
||||
SSnanoui.update_uis(src)
|
||||
@@ -246,8 +246,6 @@ var/global/list/default_medbay_channels = list(
|
||||
channel = null
|
||||
if (!istype(connection))
|
||||
return
|
||||
if (!connection)
|
||||
return
|
||||
|
||||
var/static/mob/living/silicon/ai/announcer/A = new /mob/living/silicon/ai/announcer(src, null, null, 1)
|
||||
A.SetName(from)
|
||||
@@ -274,18 +272,18 @@ var/global/list/default_medbay_channels = list(
|
||||
return null
|
||||
|
||||
/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, var/verb = "says", var/datum/language/speaking = null)
|
||||
if(!on) return 0 // the device has to be on
|
||||
if(!on) return FALSE // the device has to be on
|
||||
// Fix for permacell radios, but kinda eh about actually fixing them.
|
||||
if(!M || !message) return 0
|
||||
if(!M || !message) return FALSE
|
||||
|
||||
if(speaking && (speaking.flags & (SIGNLANG|NONVERBAL))) return 0
|
||||
if(speaking && (speaking.flags & (SIGNLANG|NONVERBAL))) return FALSE
|
||||
|
||||
if(istype(M)) M.trigger_aiming(TARGET_CAN_RADIO)
|
||||
|
||||
// Uncommenting this. To the above comment:
|
||||
// The permacell radios aren't suppose to be able to transmit, this isn't a bug and this "fix" is just making radio wires useless. -Giacom
|
||||
if(wires.IsIndexCut(WIRE_TRANSMIT)) // The device has to have all its wires and shit intact
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
if(!radio_connection)
|
||||
set_frequency(frequency)
|
||||
@@ -304,9 +302,7 @@ var/global/list/default_medbay_channels = list(
|
||||
//#### Grab the connection datum ####//
|
||||
var/datum/radio_frequency/connection = handle_message_mode(M, message, channel)
|
||||
if (!istype(connection))
|
||||
return 0
|
||||
if (!connection)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/turf/position = get_turf(src)
|
||||
|
||||
@@ -360,13 +356,12 @@ var/global/list/default_medbay_channels = list(
|
||||
|
||||
|
||||
/* ###### Radio headsets can only broadcast through subspace ###### */
|
||||
|
||||
if(subspace_transmission)
|
||||
var/list/jamming = is_jammed(src)
|
||||
if(jamming)
|
||||
var/distance = jamming["distance"]
|
||||
to_chat(M,"<span class='danger'>\icon[src] You hear the [distance <= 2 ? "loud hiss" : "soft hiss"] of static.</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
// First, we want to generate a new radio signal
|
||||
var/datum/signal/signal = new
|
||||
@@ -414,6 +409,7 @@ var/global/list/default_medbay_channels = list(
|
||||
for(var/obj/machinery/telecomms/allinone/R in telecomms_list)
|
||||
R.receive_signal(signal)
|
||||
|
||||
// Receiving code can be located in Telecommunications.dm
|
||||
if(signal.data["done"] && position.z in signal.data["level"])
|
||||
return TRUE //Huzzah, sent via subspace
|
||||
|
||||
@@ -422,7 +418,7 @@ var/global/list/default_medbay_channels = list(
|
||||
subspace_transmission = FALSE
|
||||
return Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
|
||||
src, message, displayname, jobname, real_name, M.voice_name,
|
||||
signal.transmission_method, signal.data["compression"], list(position.z), connection.frequency,verb,speaking)
|
||||
signal.transmission_method, signal.data["compression"], GetConnectedZlevels(position.z), connection.frequency,verb,speaking)
|
||||
|
||||
/* ###### Intercoms and station-bounced radios ###### */
|
||||
|
||||
@@ -474,13 +470,13 @@ var/global/list/default_medbay_channels = list(
|
||||
to_chat(loc,"<span class='notice'>\The [src] pings as it reestablishes subspace communications.</span>")
|
||||
subspace_transmission = TRUE
|
||||
// we're done here.
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
// Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level.
|
||||
// Send a mundane broadcast with limited targets:
|
||||
|
||||
//THIS IS TEMPORARY. YEAH RIGHT
|
||||
if(!connection) return 0 //~Carn
|
||||
if(!connection) return FALSE //~Carn
|
||||
|
||||
//VOREStation Add Start
|
||||
if(bluespace_radio)
|
||||
@@ -491,7 +487,7 @@ var/global/list/default_medbay_channels = list(
|
||||
|
||||
return Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
|
||||
src, message, displayname, jobname, real_name, M.voice_name,
|
||||
filter_type, signal.data["compression"], list(position.z), connection.frequency,verb,speaking)
|
||||
filter_type, signal.data["compression"], GetConnectedZlevels(position.z), connection.frequency,verb,speaking)
|
||||
|
||||
|
||||
/obj/item/device/radio/hear_talk(mob/M as mob, msg, var/verb = "says", var/datum/language/speaking = null)
|
||||
@@ -504,7 +500,7 @@ var/global/list/default_medbay_channels = list(
|
||||
/obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message)
|
||||
|
||||
if ((R.frequency == frequency && message))
|
||||
return 1
|
||||
return TRUE
|
||||
else if
|
||||
|
||||
else
|
||||
@@ -526,9 +522,8 @@ var/global/list/default_medbay_channels = list(
|
||||
return -1
|
||||
if(!(0 in level))
|
||||
var/turf/position = get_turf(src)
|
||||
if(!position || !(position.z in level))
|
||||
if(!bluespace_radio) //VOREStation Edit
|
||||
return -1
|
||||
if((!position || !(position.z in level)) && !bluespace_radio) //VOREStation Edit
|
||||
return -1
|
||||
if(freq in ANTAG_FREQS)
|
||||
if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
|
||||
return -1
|
||||
@@ -545,7 +540,7 @@ var/global/list/default_medbay_channels = list(
|
||||
if (!accept)
|
||||
for (var/ch_name in channels)
|
||||
var/datum/radio_frequency/RF = secure_radio_connections[ch_name]
|
||||
if (RF.frequency==freq && (channels[ch_name]&FREQ_LISTENING))
|
||||
if (RF && RF.frequency==freq && (channels[ch_name]&FREQ_LISTENING))
|
||||
accept = 1
|
||||
break
|
||||
if (!accept)
|
||||
@@ -696,7 +691,7 @@ var/global/list/default_medbay_channels = list(
|
||||
|
||||
/obj/item/device/radio/borg/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
return TRUE
|
||||
if (href_list["mode"])
|
||||
var/enable_subspace_transmission = text2num(href_list["mode"])
|
||||
if(enable_subspace_transmission != subspace_transmission)
|
||||
|
||||
@@ -56,14 +56,14 @@
|
||||
..()
|
||||
|
||||
/obj/item/device/subspaceradio/MouseDrop()
|
||||
if(ismob(loc))
|
||||
if(!CanMouseDrop(src))
|
||||
return
|
||||
var/mob/M = loc
|
||||
if(!M.unEquip(src))
|
||||
return
|
||||
add_fingerprint(usr)
|
||||
M.put_in_any_hand_if_possible(src)
|
||||
if(ismob(loc))
|
||||
if(!CanMouseDrop(src))
|
||||
return
|
||||
var/mob/M = loc
|
||||
if(!M.unEquip(src))
|
||||
return
|
||||
add_fingerprint(usr)
|
||||
M.put_in_any_hand_if_possible(src)
|
||||
|
||||
/obj/item/device/subspaceradio/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(W == handset)
|
||||
@@ -99,7 +99,7 @@
|
||||
|
||||
if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_back) == src)
|
||||
return 1
|
||||
if((slot_flags & SLOT_BELT) && M.get_equipped_item(slot_belt) == src)
|
||||
if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_s_store) == src)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
@@ -114,7 +114,7 @@
|
||||
if(ismob(handset.loc))
|
||||
var/mob/M = handset.loc
|
||||
if(M.drop_from_inventory(handset, src))
|
||||
to_chat(user, "<span class='notice'>\The [handset] snap back into the main unit.</span>")
|
||||
to_chat(user, "<span class='notice'>\The [handset] snaps back into the main unit.</span>")
|
||||
else
|
||||
handset.forceMove(src)
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#define DEFIB_TIME_LIMIT (10 MINUTES) //VOREStation addition- past this many seconds, defib is useless.
|
||||
/*
|
||||
CONTAINS:
|
||||
T-RAY
|
||||
@@ -54,6 +55,8 @@ HALOGEN COUNTER - Radcount on mobs
|
||||
if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey")
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
|
||||
flick("[icon_state]-scan", src) //makes it so that it plays the scan animation on a succesful scan
|
||||
user.visible_message("<span class='notice'>[user] has analyzed [M]'s vitals.</span>","<span class='notice'>You have analyzed [M]'s vitals.</span>")
|
||||
|
||||
if (!ishuman(M) || M.isSynthetic())
|
||||
@@ -81,8 +84,13 @@ HALOGEN COUNTER - Radcount on mobs
|
||||
dat += "\tKey: <font color='cyan'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font><br>"
|
||||
dat += "\tDamage Specifics: <font color='cyan'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font><br>"
|
||||
dat += "Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)</span><br>"
|
||||
if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH)))
|
||||
dat += "<span class='notice'>Time of Death: [M.tod]</span><br>"
|
||||
//VOREStation edit/addition starts
|
||||
if(M.timeofdeath && (M.stat == DEAD || (M.status_flags & FAKEDEATH)))
|
||||
dat += "<span class='notice'>Time of Death: [worldtime2stationtime(M.timeofdeath)]</span><br>"
|
||||
var/tdelta = round(world.time - M.timeofdeath)
|
||||
if(tdelta < (DEFIB_TIME_LIMIT * 10))
|
||||
dat += "<span class='notice'><b>Subject died [DisplayTimeText(tdelta)] ago - resuscitation may be possible!</b></span><br>"
|
||||
//VOREStation edit/addition ends
|
||||
if(istype(M, /mob/living/carbon/human) && mode == 1)
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/list/damaged = H.get_damaged_organs(1,1)
|
||||
@@ -167,6 +175,30 @@ HALOGEN COUNTER - Radcount on mobs
|
||||
dat += stomachunknownreagents[d]
|
||||
else
|
||||
dat += "<span class='warning'>Unknown substance[(unknown > 1)?"s":""] found in subject's stomach.</span><br>"
|
||||
if(C.touching && C.touching.total_volume)
|
||||
var/unknown = 0
|
||||
var/touchreagentdata[0]
|
||||
var/touchunknownreagents[0]
|
||||
for(var/B in C.touching.reagent_list)
|
||||
var/datum/reagent/T = B
|
||||
if(T.scannable)
|
||||
touchreagentdata["[T.id]"] = "<span class='notice'>\t[round(C.touching.get_reagent_amount(T.id), 1)]u [T.name]</span><br>"
|
||||
if (advscan == 0 || showadvscan == 0)
|
||||
dat += "<span class='notice'>[T.name] found in subject's dermis.</span><br>"
|
||||
else
|
||||
++unknown
|
||||
touchunknownreagents["[T.id]"] = "<span class='notice'>\t[round(C.ingested.get_reagent_amount(T.id), 1)]u [T.name]</span><br>"
|
||||
if(advscan >= 1 && showadvscan == 1)
|
||||
dat += "<span class='notice'>Beneficial reagents detected in subject's dermis:</span><br>"
|
||||
for(var/d in touchreagentdata)
|
||||
dat += touchreagentdata[d]
|
||||
if(unknown)
|
||||
if(advscan >= 3 && showadvscan == 1)
|
||||
dat += "<span class='warning'>Warning: Non-medical reagent[(unknown > 1)?"s":""] found in subject's dermis:</span><br>"
|
||||
for(var/d in touchunknownreagents)
|
||||
dat += touchunknownreagents[d]
|
||||
else
|
||||
dat += "<span class='warning'>Unknown substance[(unknown > 1)?"s":""] found in subject's dermis.</span><br>"
|
||||
if(C.virus2.len)
|
||||
for (var/ID in C.virus2)
|
||||
if (ID in virusDB)
|
||||
@@ -211,7 +243,7 @@ HALOGEN COUNTER - Radcount on mobs
|
||||
continue
|
||||
// Broken limbs
|
||||
if(e.status & ORGAN_BROKEN)
|
||||
if((e.name in list("l_arm", "r_arm", "l_leg", "r_leg")) && (!e.splinted))
|
||||
if((e.name in list("l_arm", "r_arm", "l_leg", "r_leg", "head", "chest", "groin")) && (!e.splinted))
|
||||
fracture_dat += "<span class='warning'>Unsecured fracture in subject [e.name]. Splinting recommended for transport.</span><br>"
|
||||
else if(advscan >= 1 && showadvscan == 1)
|
||||
fracture_dat += "<span class='warning'>Bone fractures detected in subject [e.name].</span><br>"
|
||||
@@ -501,3 +533,5 @@ HALOGEN COUNTER - Radcount on mobs
|
||||
else
|
||||
to_chat(user, "<span class='notice'>No radiation detected.</span>")
|
||||
return
|
||||
|
||||
#undef DEFIB_TIME_LIMIT //VOREStation addition
|
||||
@@ -74,7 +74,6 @@ var/datum/uplink_random_selection/all_uplink_selection = new/datum/uplink_random
|
||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/chameleon_kit)
|
||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/chameleon_projector)
|
||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/voice)
|
||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/stealth_items/camera_floppy, 10, 0)
|
||||
|
||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/armor/heavy_vest)
|
||||
items += new/datum/uplink_random_item(/datum/uplink_item/item/armor/combat)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
w_class = ITEMSIZE_SMALL
|
||||
matter = list("glass" = 200)
|
||||
flags = NOBLUDGEON
|
||||
var/list/accept_mobs = list(/mob/living/simple_mob/animal/passive/lizard, /mob/living/simple_mob/animal/passive/mouse)
|
||||
var/list/accept_mobs = list(/mob/living/simple_mob/animal/passive/lizard, /mob/living/simple_mob/animal/passive/mouse, /mob/living/simple_mob/animal/sif/leech, /mob/living/simple_mob/animal/sif/frostfly, /mob/living/simple_mob/animal/sif/glitterfly)
|
||||
var/contains = 0 // 0 = nothing, 1 = money, 2 = animal, 3 = spiderling
|
||||
|
||||
/obj/item/glass_jar/New()
|
||||
@@ -96,6 +96,12 @@
|
||||
for(var/mob/M in src)
|
||||
var/image/victim = image(M.icon, M.icon_state)
|
||||
victim.pixel_y = 6
|
||||
victim.color = M.color
|
||||
if(M.plane == PLANE_LIGHTING_ABOVE) // This will only show up on the ground sprite, due to the HuD being over it, so we need both images.
|
||||
var/image/victim_glow = image(M.icon, M.icon_state)
|
||||
victim_glow.pixel_y = 6
|
||||
victim_glow.color = M.color
|
||||
underlays += victim_glow
|
||||
underlays += victim
|
||||
name = "glass jar with [M]"
|
||||
desc = "A small jar with [M] inside."
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/poi/pascalb/process()
|
||||
radiation_repository.radiate(src, 5)
|
||||
SSradiation.radiate(src, 5)
|
||||
|
||||
/obj/item/poi/pascalb/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
@@ -41,7 +41,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/poi/brokenoldreactor/process()
|
||||
radiation_repository.radiate(src, 25)
|
||||
SSradiation.radiate(src, 25)
|
||||
|
||||
/obj/item/poi/brokenoldreactor/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
R.add_language(LANGUAGE_ECUREUILIAN, 1)
|
||||
R.add_language(LANGUAGE_DAEMON, 1)
|
||||
R.add_language(LANGUAGE_ENOCHIAN, 1)
|
||||
R.add_language(LANGUAGE_SLAVIC, 1)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -50,4 +50,9 @@
|
||||
/datum/matter_synth/wire
|
||||
name = "Wire Synthesizer"
|
||||
max_energy = 50
|
||||
recharge_rate = 2
|
||||
recharge_rate = 2
|
||||
|
||||
/datum/matter_synth/bandage
|
||||
name = "Bandage Synthesizer"
|
||||
max_energy = 10
|
||||
recharge_rate = 1
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
var/heal_burn = 0
|
||||
var/apply_sounds
|
||||
|
||||
var/upgrade_to // The type path this stack can be upgraded to.
|
||||
|
||||
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
|
||||
if (!istype(M))
|
||||
user << "<span class='warning'>\The [src] cannot be applied to [M]!</span>"
|
||||
@@ -59,6 +61,80 @@
|
||||
use(1)
|
||||
|
||||
M.updatehealth()
|
||||
|
||||
/obj/item/stack/medical/proc/upgrade_stack(var/upgrade_amount)
|
||||
. = FALSE
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
if(ispath(upgrade_to) && use(upgrade_amount))
|
||||
var/obj/item/stack/medical/M = new upgrade_to(T, upgrade_amount)
|
||||
return M
|
||||
|
||||
return .
|
||||
|
||||
/obj/item/stack/medical/crude_pack
|
||||
name = "crude bandage"
|
||||
singular_name = "crude bandage length"
|
||||
desc = "Some bandages to wrap around bloody stumps."
|
||||
icon_state = "gauze"
|
||||
origin_tech = list(TECH_BIO = 1)
|
||||
no_variants = FALSE
|
||||
apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg')
|
||||
|
||||
upgrade_to = /obj/item/stack/medical/bruise_pack
|
||||
|
||||
/obj/item/stack/medical/crude_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if (istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
||||
|
||||
if(affecting.open)
|
||||
to_chat(user, "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>")
|
||||
return
|
||||
|
||||
if(affecting.is_bandaged())
|
||||
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been bandaged.</span>")
|
||||
return 1
|
||||
else
|
||||
user.visible_message("<span class='notice'>\The [user] starts bandaging [M]'s [affecting.name].</span>", \
|
||||
"<span class='notice'>You start bandaging [M]'s [affecting.name].</span>" )
|
||||
var/used = 0
|
||||
for (var/datum/wound/W in affecting.wounds)
|
||||
if (W.internal)
|
||||
continue
|
||||
if(W.bandaged)
|
||||
continue
|
||||
if(used == amount)
|
||||
break
|
||||
if(!do_mob(user, M, W.damage/3))
|
||||
to_chat(user, "<span class='notice'>You must stand still to bandage wounds.</span>")
|
||||
break
|
||||
|
||||
if(affecting.is_bandaged()) // We do a second check after the delay, in case it was bandaged after the first check.
|
||||
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been bandaged.</span>")
|
||||
return 1
|
||||
|
||||
if (W.current_stage <= W.max_bleeding_stage)
|
||||
user.visible_message("<span class='notice'>\The [user] bandages \a [W.desc] on [M]'s [affecting.name].</span>", \
|
||||
"<span class='notice'>You bandage \a [W.desc] on [M]'s [affecting.name].</span>" )
|
||||
else
|
||||
user.visible_message("<span class='notice'>\The [user] places a bandage over \a [W.desc] on [M]'s [affecting.name].</span>", \
|
||||
"<span class='notice'>You place a bandage over \a [W.desc] on [M]'s [affecting.name].</span>" )
|
||||
W.bandage()
|
||||
playsound(src, pick(apply_sounds), 25)
|
||||
used++
|
||||
affecting.update_damages()
|
||||
if(used == amount)
|
||||
if(affecting.is_bandaged())
|
||||
to_chat(user, "<span class='warning'>\The [src] is used up.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>\The [src] is used up, but there are more wounds to treat on \the [affecting.name].</span>")
|
||||
use(used)
|
||||
|
||||
/obj/item/stack/medical/bruise_pack
|
||||
name = "roll of gauze"
|
||||
singular_name = "gauze length"
|
||||
@@ -68,6 +144,8 @@
|
||||
no_variants = FALSE
|
||||
apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg')
|
||||
|
||||
upgrade_to = /obj/item/stack/medical/advanced/bruise_pack
|
||||
|
||||
/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
|
||||
if(..())
|
||||
return 1
|
||||
@@ -220,6 +298,7 @@
|
||||
W.heal_damage(heal_brute)
|
||||
playsound(src, pick(apply_sounds), 25)
|
||||
used = 1 //VOREStation Edit
|
||||
update_icon() // VOREStation Edit - Support for stack icons
|
||||
affecting.update_damages()
|
||||
if(used == amount)
|
||||
if(affecting.is_bandaged())
|
||||
@@ -266,16 +345,17 @@
|
||||
use(1)
|
||||
affecting.salve()
|
||||
playsound(src, pick(apply_sounds), 25)
|
||||
update_icon() // VOREStation Edit - Support for stack icons
|
||||
|
||||
/obj/item/stack/medical/splint
|
||||
name = "medical splints"
|
||||
singular_name = "medical splint"
|
||||
desc = "Modular splints capable of supporting and immobilizing bones in both limbs and appendages."
|
||||
desc = "Modular splints capable of supporting and immobilizing bones in all areas of the body."
|
||||
icon_state = "splint"
|
||||
amount = 5
|
||||
max_amount = 5
|
||||
|
||||
var/list/splintable_organs = list(BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG, BP_L_HAND, BP_R_HAND, BP_L_FOOT, BP_R_FOOT) //List of organs you can splint, natch.
|
||||
var/list/splintable_organs = list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO) //List of organs you can splint, natch.
|
||||
|
||||
/obj/item/stack/medical/splint/attack(mob/living/carbon/M as mob, mob/living/user as mob)
|
||||
if(..())
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
/obj/item/stack/medical/advanced
|
||||
icon = 'icons/obj/stacks_vr.dmi'
|
||||
|
||||
/obj/item/stack/medical/advanced/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/stack/medical/advanced/update_icon()
|
||||
switch(amount)
|
||||
if(1 to 2)
|
||||
icon_state = initial(icon_state)
|
||||
if(3 to 4)
|
||||
icon_state = "[initial(icon_state)]_4"
|
||||
if(5 to 6)
|
||||
icon_state = "[initial(icon_state)]_6"
|
||||
if(7 to 8)
|
||||
icon_state = "[initial(icon_state)]_8"
|
||||
if(9)
|
||||
icon_state = "[initial(icon_state)]_9"
|
||||
else
|
||||
icon_state = "[initial(icon_state)]_10"
|
||||
@@ -29,18 +29,21 @@
|
||||
if (istype(M,/mob/living/carbon/human)) //Repairing robolimbs
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/external/S = H.get_organ(user.zone_sel.selecting)
|
||||
|
||||
//VOREStation Edit Start
|
||||
if (S && (S.robotic >= ORGAN_ROBOT))
|
||||
if(!S.get_damage())
|
||||
user << "<span class='notice'>Nothing to fix here.</span>"
|
||||
to_chat(user, "<span class='notice'>Nothing to fix here.</span>")
|
||||
else if((S.open < 2) && (S.brute_dam + S.burn_dam >= S.min_broken_damage) && !repair_external)
|
||||
to_chat(user, "<span class='notice'>The damage is too extensive for this nanite swarm to handle.</span>")
|
||||
else if(can_use(1))
|
||||
user.setClickCooldown(user.get_attack_speed(src))
|
||||
if(S.open >= 2)
|
||||
if(do_after(user,5 * toolspeed))
|
||||
S.heal_damage(20, 20, robo_repair = 1)
|
||||
S.heal_damage(restoration_internal, restoration_internal, robo_repair = 1)
|
||||
else if(do_after(user,5 * toolspeed))
|
||||
S.heal_damage(10,10, robo_repair =1)
|
||||
S.heal_damage(restoration_external,restoration_external, robo_repair =1)
|
||||
H.updatehealth()
|
||||
use(1)
|
||||
user.visible_message("<span class='notice'>\The [user] applies some nanite paste on [user != M ? "[M]'s [S.name]" : "[S]"] with [src].</span>",\
|
||||
"<span class='notice'>You apply some nanite paste on [user == M ? "your" : "[M]'s"] [S.name].</span>")
|
||||
//VOREStation Edit End
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
/obj/item/stack/nanopaste
|
||||
var/restoration_external = 5
|
||||
var/restoration_internal = 20
|
||||
var/repair_external = FALSE
|
||||
|
||||
/obj/item/stack/nanopaste/advanced
|
||||
name = "advanced nanopaste"
|
||||
singular_name = "advanced nanite swarm"
|
||||
desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery. These ones are capable of restoring condition even of most thrashed robotic parts"
|
||||
icon = 'icons/obj/stacks_vr.dmi'
|
||||
icon_state = "adv_nanopaste"
|
||||
restoration_external = 10
|
||||
repair_external = TRUE
|
||||
@@ -24,6 +24,9 @@
|
||||
var/list/datum/matter_synth/synths = null
|
||||
var/no_variants = TRUE // Determines whether the item should update it's sprites based on amount.
|
||||
|
||||
var/pass_color = FALSE // Will the item pass its own color var to the created item? Dyed cloth, wood, etc.
|
||||
var/strict_color_stacking = FALSE // Will the stack merge with other stacks that are different colors? (Dyed cloth, wood, etc)
|
||||
|
||||
/obj/item/stack/New(var/loc, var/amount=null)
|
||||
..()
|
||||
if (!stacktype)
|
||||
@@ -159,6 +162,17 @@
|
||||
for (var/obj/item/I in O)
|
||||
qdel(I)
|
||||
|
||||
if ((pass_color || recipe.pass_color))
|
||||
if(!color)
|
||||
if(recipe.use_material)
|
||||
var/material/MAT = get_material_by_name(recipe.use_material)
|
||||
if(MAT.icon_colour)
|
||||
O.color = MAT.icon_colour
|
||||
else
|
||||
return
|
||||
else
|
||||
O.color = color
|
||||
|
||||
/obj/item/stack/Topic(href, href_list)
|
||||
..()
|
||||
if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
|
||||
@@ -242,6 +256,9 @@
|
||||
return 0
|
||||
if ((stacktype != S.stacktype) && !type_verified)
|
||||
return 0
|
||||
if ((strict_color_stacking || S.strict_color_stacking) && S.color != color)
|
||||
return 0
|
||||
|
||||
if (isnull(tamount))
|
||||
tamount = src.get_amount()
|
||||
|
||||
@@ -355,8 +372,9 @@
|
||||
var/one_per_turf = 0
|
||||
var/on_floor = 0
|
||||
var/use_material
|
||||
var/pass_color
|
||||
|
||||
New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null)
|
||||
New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null, pass_stack_color)
|
||||
src.title = title
|
||||
src.result_type = result_type
|
||||
src.req_amount = req_amount
|
||||
@@ -366,6 +384,7 @@
|
||||
src.one_per_turf = one_per_turf
|
||||
src.on_floor = on_floor
|
||||
src.use_material = supplied_material
|
||||
src.pass_color = pass_stack_color
|
||||
|
||||
/*
|
||||
* Recipe list datum
|
||||
|
||||
@@ -202,4 +202,12 @@
|
||||
name = "roofing"
|
||||
singular_name = "roofing"
|
||||
desc = "A section of roofing material. You can use it to repair the ceiling, or expand it."
|
||||
icon_state = "techtile_grid"
|
||||
icon_state = "techtile_grid"
|
||||
|
||||
/obj/item/stack/tile/roofing/cyborg
|
||||
name = "roofing synthesizer"
|
||||
desc = "A device that makes roofing tiles."
|
||||
uses_charge = 1
|
||||
charge_costs = list(250)
|
||||
stacktype = /obj/item/stack/tile/roofing
|
||||
build_type = /obj/item/stack/tile/roofing
|
||||
@@ -935,6 +935,12 @@
|
||||
icon_state = "nymphplushie"
|
||||
pokephrase = "Chirp!"
|
||||
|
||||
/obj/item/toy/plushie/teshari
|
||||
name = "teshari plush"
|
||||
desc = "This is a plush teshari. Very soft, with a pompom on the tail. The toy is made well, as if alive. Looks like she is sleeping. Shhh!"
|
||||
icon_state = "teshariplushie"
|
||||
pokephrase = "Rya!"
|
||||
|
||||
/obj/item/toy/plushie/mouse
|
||||
name = "mouse plush"
|
||||
desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend."
|
||||
@@ -1363,4 +1369,4 @@
|
||||
icon_state = "tinyxmastree"
|
||||
w_class = ITEMSIZE_TINY
|
||||
force = 1
|
||||
throwforce = 1
|
||||
throwforce = 1
|
||||
|
||||
@@ -76,6 +76,14 @@
|
||||
name = "\improper \"LiquidFood\" ration"
|
||||
icon_state = "liquidfood"
|
||||
|
||||
/obj/item/trash/liquidprotein
|
||||
name = "\improper \"LiquidProtein\" ration"
|
||||
icon_state = "liquidprotein"
|
||||
|
||||
/obj/item/trash/liquidvitamin
|
||||
name = "\improper \"VitaPaste\" ration"
|
||||
icon_state = "liquidvitamin"
|
||||
|
||||
/obj/item/trash/tastybread
|
||||
name = "bread tube"
|
||||
icon_state = "tastybread"
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/trash/liquidprotein
|
||||
name = "\improper \"LiquidProtein\" ration"
|
||||
/obj/item/trash/fancyplate
|
||||
name = "dirty fancy plate"
|
||||
icon = 'icons/obj/trash_vr.dmi'
|
||||
icon_state = "liquidprotein"
|
||||
icon_state = "fancyplate"
|
||||
|
||||
@@ -14,6 +14,10 @@
|
||||
..()
|
||||
network = using_map.station_networks
|
||||
|
||||
/obj/item/weapon/circuitboard/security/tv
|
||||
name = T_BOARD("security camera monitor - television")
|
||||
build_path = /obj/machinery/computer/security/wooden_tv
|
||||
|
||||
/obj/item/weapon/circuitboard/security/engineering
|
||||
name = T_BOARD("engineering camera monitor")
|
||||
build_path = /obj/machinery/computer/security/engineering
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
name = T_BOARD("medical records console")
|
||||
build_path = /obj/machinery/computer/med_data
|
||||
|
||||
/obj/item/weapon/circuitboard/med_data/laptop
|
||||
name = T_BOARD("medical records laptop")
|
||||
build_path = /obj/machinery/computer/med_data/laptop
|
||||
|
||||
/obj/item/weapon/circuitboard/scan_consolenew
|
||||
name = T_BOARD("DNA machine")
|
||||
build_path = /obj/machinery/computer/scan_consolenew
|
||||
@@ -187,3 +191,8 @@
|
||||
name = T_BOARD("RCON remote control console")
|
||||
build_path = /obj/machinery/computer/rcon
|
||||
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_POWER = 5)
|
||||
|
||||
/obj/item/weapon/circuitboard/shutoff_monitor
|
||||
name = T_BOARD("automatic shutoff valve monitor")
|
||||
build_path = /obj/machinery/computer/shutoff_monitor
|
||||
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4)
|
||||
@@ -144,6 +144,14 @@
|
||||
build_path = /obj/machinery/recharger/wallcharger
|
||||
board_type = new /datum/frame/frame_types/wall_charger
|
||||
|
||||
/obj/item/weapon/circuitboard/cell_charger
|
||||
name = T_BOARD("heavy-duty cell charger")
|
||||
build_path = /obj/machinery/cell_charger
|
||||
board_type = new /datum/frame/frame_types/cell_charger
|
||||
req_components = list(
|
||||
/obj/item/weapon/stock_parts/capacitor = 1,
|
||||
/obj/item/stack/cable_coil = 5)
|
||||
|
||||
/obj/item/weapon/circuitboard/washing
|
||||
name = T_BOARD("washing machine")
|
||||
build_path = /obj/machinery/washing_machine
|
||||
@@ -162,6 +170,15 @@
|
||||
/obj/item/weapon/stock_parts/gear = 1,
|
||||
/obj/item/weapon/reagent_containers/glass/beaker/large = 1)
|
||||
|
||||
/obj/item/weapon/circuitboard/distiller
|
||||
build_path = /obj/machinery/portable_atmospherics/powered/reagent_distillery
|
||||
board_type = new /datum/frame/frame_types/reagent_distillery
|
||||
req_components = list(
|
||||
/obj/item/weapon/stock_parts/capacitor = 1,
|
||||
/obj/item/weapon/stock_parts/micro_laser = 1,
|
||||
/obj/item/weapon/stock_parts/motor = 2,
|
||||
/obj/item/weapon/stock_parts/gear = 1)
|
||||
|
||||
/obj/item/weapon/circuitboard/teleporter_hub
|
||||
name = T_BOARD("teleporter hub")
|
||||
build_path = /obj/machinery/teleport/hub
|
||||
|
||||
@@ -85,4 +85,12 @@ obj/item/weapon/circuitboard/rdserver/attackby(obj/item/I as obj, mob/user as mo
|
||||
/obj/item/weapon/stock_parts/matter_bin = 2,
|
||||
/obj/item/weapon/stock_parts/manipulator = 1,
|
||||
/obj/item/weapon/stock_parts/micro_laser = 1,
|
||||
/obj/item/weapon/stock_parts/console_screen = 1)
|
||||
/obj/item/weapon/stock_parts/console_screen = 1)
|
||||
|
||||
obj/item/weapon/circuitboard/ntnet_relay
|
||||
name = "Circuit board (NTNet Quantum Relay)"
|
||||
build_path = "/obj/machinery/ntnet_relay"
|
||||
board_type = "machine"
|
||||
origin_tech = list(TECH_DATA = 4)
|
||||
req_components = list(
|
||||
"/obj/item/stack/cable_coil" = 15)
|
||||
|
||||
@@ -32,6 +32,11 @@
|
||||
icon_state = "mcontroller"
|
||||
origin_tech = list(TECH_DATA = 4, TECH_COMBAT = 4)
|
||||
|
||||
/obj/item/weapon/circuitboard/mecha/gygax/medical
|
||||
name = T_BOARD_MECHA("Serenity medical control")
|
||||
icon_state = "mcontroller"
|
||||
origin_tech = list(TECH_DATA = 4, TECH_BIO = 4)
|
||||
|
||||
/obj/item/weapon/circuitboard/mecha/gygax/main
|
||||
name = T_BOARD_MECHA("Gygax central control")
|
||||
icon_state = "mainboard"
|
||||
|
||||
@@ -87,4 +87,26 @@
|
||||
text = "guy"
|
||||
if(FEMALE)
|
||||
text = "lady"
|
||||
user.visible_message("<span class='notice'>[user] uses [src] to comb their hair with incredible style and sophistication. What a [text].</span>")
|
||||
user.visible_message("<span class='notice'>[user] uses [src] to comb their hair with incredible style and sophistication. What a [text].</span>")
|
||||
|
||||
/obj/item/weapon/makeover
|
||||
name = "makeover kit"
|
||||
desc = "A tiny case containing a mirror and some contact lenses."
|
||||
w_class = ITEMSIZE_TINY
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "trinketbox"
|
||||
var/list/ui_users = list()
|
||||
|
||||
/obj/item/weapon/makeover/attack_self(mob/living/carbon/user as mob)
|
||||
if(ishuman(user))
|
||||
to_chat(user, "<span class='notice'>You flip open \the [src] and begin to adjust your appearance.</span>")
|
||||
var/datum/nano_module/appearance_changer/AC = ui_users[user]
|
||||
if(!AC)
|
||||
AC = new(src, user)
|
||||
AC.name = "SalonPro Porta-Makeover Deluxe™"
|
||||
ui_users[user] = AC
|
||||
AC.ui_interact(user)
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
|
||||
if(istype(E))
|
||||
E.change_eye_color()
|
||||
@@ -13,6 +13,10 @@
|
||||
var/atom/target = null
|
||||
var/open_panel = 0
|
||||
var/image_overlay = null
|
||||
var/blast_dev = -1
|
||||
var/blast_heavy = -1
|
||||
var/blast_light = 2
|
||||
var/blast_flash = 3
|
||||
|
||||
/obj/item/weapon/plastique/New()
|
||||
wires = new(src)
|
||||
@@ -72,7 +76,7 @@
|
||||
if(!target)
|
||||
target = src
|
||||
if(location)
|
||||
explosion(location, -1, -1, 2, 3)
|
||||
explosion(location, blast_dev, blast_heavy, blast_light, blast_flash)
|
||||
|
||||
if(target)
|
||||
if (istype(target, /turf/simulated/wall))
|
||||
@@ -88,3 +92,28 @@
|
||||
|
||||
/obj/item/weapon/plastique/attack(mob/M as mob, mob/user as mob, def_zone)
|
||||
return
|
||||
|
||||
/obj/item/weapon/plastique/seismic
|
||||
name = "seismic charge"
|
||||
desc = "Used to dig holes in specific areas without too much extra hole."
|
||||
|
||||
blast_heavy = 2
|
||||
blast_light = 4
|
||||
blast_flash = 7
|
||||
|
||||
/obj/item/weapon/plastique/seismic/attackby(var/obj/item/I, var/mob/user)
|
||||
. = ..()
|
||||
if(open_panel)
|
||||
if(istype(I, /obj/item/weapon/stock_parts/micro_laser))
|
||||
var/obj/item/weapon/stock_parts/SP = I
|
||||
var/new_blast_power = max(1, round(SP.rating / 2) + 1)
|
||||
if(new_blast_power > blast_heavy)
|
||||
to_chat(user, "<span class='notice'>You install \the [I] into \the [src].</span>")
|
||||
user.drop_from_inventory(I)
|
||||
qdel(I)
|
||||
blast_heavy = new_blast_power
|
||||
blast_light = blast_heavy + round(new_blast_power * 0.5)
|
||||
blast_flash = blast_light + round(new_blast_power * 0.75)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The [I] is not any better than the component already installed into this charge!</span>")
|
||||
return .
|
||||
@@ -0,0 +1,17 @@
|
||||
/obj/item/weapon/plastique/seismic/locked
|
||||
desc = "Used to dig holes in specific areas without too much extra hole. Has extra mechanism that safely implodes the bomb if it is used in close proximity to the facility."
|
||||
|
||||
/obj/item/weapon/plastique/seismic/locked/explode(var/location)
|
||||
if(!target)
|
||||
target = get_atom_on_turf(src)
|
||||
if(!target)
|
||||
target = src
|
||||
|
||||
var/turf/T = get_turf(target)
|
||||
if(T.z in using_map.map_levels)
|
||||
target.visible_message("<span class='danger'>\The [src] lets out a loud beep as safeties trigger, before imploding and falling apart.</span>")
|
||||
target.overlays -= image_overlay
|
||||
qdel(src)
|
||||
return 0
|
||||
else
|
||||
return ..()
|
||||
@@ -41,6 +41,19 @@
|
||||
/obj/item/weapon/grenade/spawnergrenade/manhacks/raider
|
||||
spawner_type = /mob/living/simple_mob/mechanical/viscerator/raider
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/manhacks/station
|
||||
desc = "It is set to detonate in 5 seconds. It will deploy three weaponized survey drones."
|
||||
deliveryamt = 3
|
||||
spawner_type = /mob/living/simple_mob/mechanical/viscerator/station
|
||||
origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_ILLEGAL = 1)
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/ward
|
||||
name = "sentry delivery grenade"
|
||||
desc = "It is set to detonate in 5 seconds. It will deploy a single thermal-optic sentry drone."
|
||||
spawner_type = /mob/living/simple_mob/mechanical/ward/monitor/crew
|
||||
deliveryamt = 1
|
||||
origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_BLUESPACE = 2)
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/spesscarp
|
||||
name = "carp delivery grenade"
|
||||
spawner_type = /mob/living/simple_mob/animal/space/carp
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked
|
||||
desc = "It is set to detonate in 5 seconds. It will deploy three weaponized survey drones. This one has a safety interlock that prevents release if used while in proximity to the facility."
|
||||
req_access = list(access_armory) //for toggling safety
|
||||
var/locked = 1
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/detonate()
|
||||
if(locked)
|
||||
var/turf/T = get_turf(src)
|
||||
if(T.z in using_map.map_levels)
|
||||
icon_state = initial(icon_state)
|
||||
active = 0
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/attackby(obj/item/I, mob/user)
|
||||
var/obj/item/weapon/card/id/id = I.GetID()
|
||||
if(istype(id))
|
||||
if(check_access(id))
|
||||
locked = !locked
|
||||
to_chat(user, "<span class='warning'>You [locked ? "enable" : "disable"] the safety lock on \the [src].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Access denied.</span>")
|
||||
user.visible_message("<span class='notice'>[user] swipes \the [I] against \the [src].</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/emag_act(var/remaining_charges,var/mob/user)
|
||||
..()
|
||||
locked = !locked
|
||||
to_chat(user, "<span class='warning'>You [locked ? "enable" : "disable"] the safety lock on \the [src]!</span>")
|
||||
@@ -31,6 +31,7 @@
|
||||
var/dorm = 0 // determines if this ID has claimed a dorm already
|
||||
|
||||
var/mining_points = 0 // For redeeming at mining equipment vendors
|
||||
var/survey_points = 0 // For redeeming at explorer equipment vendors.
|
||||
|
||||
/obj/item/weapon/card/id/examine(mob/user)
|
||||
set src in oview(1)
|
||||
@@ -170,7 +171,7 @@
|
||||
|
||||
/obj/item/weapon/card/id/synthetic/Initialize()
|
||||
. = ..()
|
||||
access = get_all_station_access() + access_synth
|
||||
access = get_all_station_access().Copy() + access_synth
|
||||
|
||||
/obj/item/weapon/card/id/centcom
|
||||
name = "\improper CentCom. ID"
|
||||
@@ -181,7 +182,7 @@
|
||||
|
||||
/obj/item/weapon/card/id/centcom/Initialize()
|
||||
. = ..()
|
||||
access = get_all_centcom_access()
|
||||
access = get_all_centcom_access().Copy()
|
||||
|
||||
/obj/item/weapon/card/id/centcom/station/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
var/implant_color = "b"
|
||||
var/allow_reagents = 0
|
||||
var/malfunction = 0
|
||||
var/initialize_loc = BP_TORSO
|
||||
show_messages = 1
|
||||
|
||||
/obj/item/weapon/implant/proc/trigger(emote, source as mob)
|
||||
@@ -30,7 +31,7 @@
|
||||
var/mob/living/carbon/human/H = source
|
||||
var/obj/item/organ/external/affected = H.get_organ(target_zone)
|
||||
if(affected)
|
||||
affected.implants += src
|
||||
affected.implants |= src
|
||||
part = affected
|
||||
if(part)
|
||||
forceMove(part)
|
||||
@@ -65,8 +66,9 @@
|
||||
|
||||
/obj/item/weapon/implant/proc/implant_loadout(var/mob/living/carbon/human/H)
|
||||
if(H)
|
||||
var/obj/item/organ/external/affected = H.organs_by_name[BP_HEAD]
|
||||
var/obj/item/organ/external/affected = H.organs_by_name[initialize_loc]
|
||||
if(handle_implant(H, affected))
|
||||
invisibility = initial(invisibility)
|
||||
post_implant(H)
|
||||
|
||||
/obj/item/weapon/implant/Destroy()
|
||||
@@ -110,7 +112,7 @@ GLOBAL_LIST_BOILERPLATE(all_tracking_implants, /obj/item/weapon/implant/tracking
|
||||
..()
|
||||
|
||||
/obj/item/weapon/implant/tracking/post_implant(var/mob/source)
|
||||
START_PROCESSING(SSobj, src)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/weapon/implant/tracking/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
@@ -563,7 +565,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
|
||||
/obj/item/weapon/implant/death_alarm/post_implant(mob/source as mob)
|
||||
mobname = source.real_name
|
||||
START_PROCESSING(SSobj, src)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
//////////////////////////////
|
||||
// Compressed Matter Implant
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
source.add_language(LANGUAGE_BIRDSONG)
|
||||
source.add_language(LANGUAGE_SAGARU)
|
||||
source.add_language(LANGUAGE_CANILUNZT)
|
||||
source.add_language(LANGUAGE_SLAVIC)
|
||||
source.add_language(LANGUAGE_SOL_COMMON) //In case they're giving a xenomorph an implant or something.
|
||||
|
||||
/obj/item/weapon/implant/vrlanguage/post_implant(mob/source)
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
//////////////////////////////
|
||||
// Nanite Organ Implant
|
||||
//////////////////////////////
|
||||
/obj/item/weapon/implant/organ
|
||||
name = "nanite fabrication implant"
|
||||
desc = "A buzzing implant covered in a writhing layer of metal insects."
|
||||
icon_state = "implant_evil"
|
||||
origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 2, TECH_ILLEGAL = 2)
|
||||
|
||||
var/organ_to_implant = /obj/item/organ/internal/augment/bioaugment/thermalshades
|
||||
var/organ_display_name = "unknown organ"
|
||||
|
||||
/obj/item/weapon/implant/organ/get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> \"GreyDoctor\" Class Nanite Hive<BR>
|
||||
<b>Life:</b> Activates upon implantation, destroying itself in the process.<BR>
|
||||
<b>Important Notes:</b> Nanites will fail to complete their task if a suitable location cannot be found for the organ.<BR>
|
||||
<HR>
|
||||
<b>Implant Details:</b><BR>
|
||||
<b>Function:</b> Nanites will fabricate: <span class='alien'>[organ_display_name]</span><BR>
|
||||
<b>Special Features:</b> Organ identification protocols.<BR>
|
||||
<b>Integrity:</b> N/A"}
|
||||
return dat
|
||||
|
||||
/obj/item/weapon/implant/organ/post_implant(var/mob/M)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
var/obj/item/organ/NewOrgan = new organ_to_implant()
|
||||
|
||||
var/obj/item/organ/external/E = H.get_organ(NewOrgan.parent_organ)
|
||||
to_chat(H, "<span class='notice'>You feel a tingling sensation in your [part].</span>")
|
||||
if(E && !(H.internal_organs_by_name[NewOrgan.organ_tag]))
|
||||
spawn(rand(1 SECONDS, 30 SECONDS))
|
||||
to_chat(H, "<span class='alien'>You feel a pressure in your [E] as the tingling fades, the lump caused by the implant now gone.</span>")
|
||||
|
||||
NewOrgan.forceMove(H)
|
||||
NewOrgan.owner = H
|
||||
if(E.internal_organs == null)
|
||||
E.internal_organs = list()
|
||||
E.internal_organs |= NewOrgan
|
||||
H.internal_organs_by_name[NewOrgan.organ_tag] = NewOrgan
|
||||
H.internal_organs |= NewOrgan
|
||||
NewOrgan.handle_organ_mod_special()
|
||||
|
||||
spawn(1)
|
||||
if(!QDELETED(src))
|
||||
qdel(src)
|
||||
|
||||
else
|
||||
qdel(NewOrgan)
|
||||
to_chat(H, "<span class='warning'>You feel a pinching sensation in your [part]. The implant remains.</span>")
|
||||
|
||||
/obj/item/weapon/implant/organ/islegal()
|
||||
return 0
|
||||
|
||||
/*
|
||||
* Arm / leg mounted augments.
|
||||
*/
|
||||
|
||||
/obj/item/weapon/implant/organ/limbaugment
|
||||
name = "nanite implant"
|
||||
|
||||
organ_to_implant = /obj/item/organ/internal/augment/armmounted/taser
|
||||
organ_display_name = "physiological augment"
|
||||
|
||||
var/list/possible_targets = list(O_AUG_L_FOREARM, O_AUG_R_FOREARM)
|
||||
|
||||
/obj/item/weapon/implant/organ/limbaugment/post_implant(var/mob/M)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
var/obj/item/organ/NewOrgan = new organ_to_implant()
|
||||
|
||||
var/obj/item/organ/external/E = setup_augment_slots(H, NewOrgan)
|
||||
to_chat(H, "<span class='notice'>You feel a tingling sensation in your [part].</span>")
|
||||
if(E && istype(E) && !(H.internal_organs_by_name[NewOrgan.organ_tag]))
|
||||
spawn(rand(1 SECONDS, 30 SECONDS))
|
||||
to_chat(H, "<span class='alien'>You feel a pressure in your [E] as the tingling fades, the lump caused by the implant now gone.</span>")
|
||||
|
||||
NewOrgan.forceMove(H)
|
||||
NewOrgan.owner = H
|
||||
if(E.internal_organs == null)
|
||||
E.internal_organs = list()
|
||||
E.internal_organs |= NewOrgan
|
||||
H.internal_organs_by_name[NewOrgan.organ_tag] = NewOrgan
|
||||
H.internal_organs |= NewOrgan
|
||||
NewOrgan.handle_organ_mod_special()
|
||||
|
||||
spawn(1)
|
||||
if(!QDELETED(src))
|
||||
qdel(src)
|
||||
|
||||
else
|
||||
qdel(NewOrgan)
|
||||
to_chat(H, "<span class='warning'>You feel a pinching sensation in your [part]. The implant remains.</span>")
|
||||
|
||||
/obj/item/weapon/implant/organ/limbaugment/proc/setup_augment_slots(var/mob/living/carbon/human/H, var/obj/item/organ/internal/augment/armmounted/I)
|
||||
var/list/Choices = possible_targets.Copy()
|
||||
|
||||
for(var/targ in possible_targets)
|
||||
if(H.internal_organs_by_name[targ])
|
||||
Choices -= targ
|
||||
|
||||
var/target_choice = null
|
||||
if(Choices && Choices.len)
|
||||
if(Choices.len == 1)
|
||||
target_choice = Choices[1]
|
||||
else
|
||||
target_choice = input("Choose augment location:") in Choices
|
||||
|
||||
else
|
||||
return FALSE
|
||||
|
||||
if(target_choice)
|
||||
switch(target_choice)
|
||||
if(O_AUG_R_HAND)
|
||||
I.organ_tag = O_AUG_R_HAND
|
||||
I.parent_organ = BP_R_HAND
|
||||
I.target_slot = slot_r_hand
|
||||
if(O_AUG_L_HAND)
|
||||
I.organ_tag = O_AUG_L_HAND
|
||||
I.parent_organ = BP_L_HAND
|
||||
I.target_slot = slot_l_hand
|
||||
|
||||
if(O_AUG_R_FOREARM)
|
||||
I.organ_tag = O_AUG_R_FOREARM
|
||||
I.parent_organ = BP_R_ARM
|
||||
I.target_slot = slot_r_hand
|
||||
if(O_AUG_L_FOREARM)
|
||||
I.organ_tag = O_AUG_L_FOREARM
|
||||
I.parent_organ = BP_L_ARM
|
||||
I.target_slot = slot_l_hand
|
||||
|
||||
if(O_AUG_R_UPPERARM)
|
||||
I.organ_tag = O_AUG_R_UPPERARM
|
||||
I.parent_organ = BP_R_ARM
|
||||
I.target_slot = slot_r_hand
|
||||
if(O_AUG_L_UPPERARM)
|
||||
I.organ_tag = O_AUG_L_UPPERARM
|
||||
I.parent_organ = BP_L_ARM
|
||||
I.target_slot = slot_l_hand
|
||||
|
||||
. = H.get_organ(I.parent_organ)
|
||||
|
||||
/*
|
||||
* Limb implant primary subtypes.
|
||||
*/
|
||||
|
||||
/obj/item/weapon/implant/organ/limbaugment/upperarm
|
||||
organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/multiple
|
||||
organ_display_name = "multi-use augment"
|
||||
|
||||
possible_targets = list(O_AUG_R_UPPERARM,O_AUG_L_UPPERARM)
|
||||
|
||||
/obj/item/weapon/implant/organ/limbaugment/wrist
|
||||
organ_to_implant = /obj/item/organ/internal/augment/armmounted/hand
|
||||
organ_display_name = "wrist augment"
|
||||
|
||||
possible_targets = list(O_AUG_R_HAND,O_AUG_L_HAND)
|
||||
|
||||
/*
|
||||
* Limb implant general subtypes.
|
||||
*/
|
||||
|
||||
// Wrist
|
||||
/obj/item/weapon/implant/organ/limbaugment/wrist/sword
|
||||
organ_to_implant = /obj/item/organ/internal/augment/armmounted/hand/sword
|
||||
organ_display_name = "weapon augment"
|
||||
|
||||
// Fore-arm
|
||||
/obj/item/weapon/implant/organ/limbaugment/laser
|
||||
organ_to_implant = /obj/item/organ/internal/augment/armmounted
|
||||
organ_display_name = "weapon augment"
|
||||
|
||||
/obj/item/weapon/implant/organ/limbaugment/dart
|
||||
organ_to_implant = /obj/item/organ/internal/augment/armmounted/dartbow
|
||||
organ_display_name = "weapon augment"
|
||||
|
||||
// Upper-arm.
|
||||
/obj/item/weapon/implant/organ/limbaugment/upperarm/medkit
|
||||
organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/multiple/medical
|
||||
|
||||
/obj/item/weapon/implant/organ/limbaugment/upperarm/surge
|
||||
organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/surge
|
||||
|
||||
/*
|
||||
* Others
|
||||
*/
|
||||
|
||||
/obj/item/weapon/implant/organ/pelvic
|
||||
name = "nanite fabrication implant"
|
||||
|
||||
organ_to_implant = /obj/item/organ/internal/augment/bioaugment/sprint_enhance
|
||||
organ_display_name = "pelvic augment"
|
||||
@@ -179,3 +179,103 @@
|
||||
src.imp = new /obj/item/weapon/implant/language/eal( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implantcase/shades
|
||||
name = "glass case - 'Integrated Shades'"
|
||||
desc = "A case containing a nanite fabricator implant."
|
||||
icon_state = "implantcase-b"
|
||||
|
||||
/obj/item/weapon/implantcase/shades/New()
|
||||
src.imp = new /obj/item/weapon/implant/organ( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implantcase/taser
|
||||
name = "glass case - 'Taser'"
|
||||
desc = "A case containing a nanite fabricator implant."
|
||||
icon_state = "implantcase-b"
|
||||
|
||||
/obj/item/weapon/implantcase/taser/New()
|
||||
src.imp = new /obj/item/weapon/implant/organ/limbaugment( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implantcase/laser
|
||||
name = "glass case - 'Laser'"
|
||||
desc = "A case containing a nanite fabricator implant."
|
||||
icon_state = "implantcase-b"
|
||||
|
||||
/obj/item/weapon/implantcase/laser/New()
|
||||
src.imp = new /obj/item/weapon/implant/organ/limbaugment/laser( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implantcase/dart
|
||||
name = "glass case - 'Dart'"
|
||||
desc = "A case containing a nanite fabricator implant."
|
||||
icon_state = "implantcase-b"
|
||||
|
||||
/obj/item/weapon/implantcase/dart/New()
|
||||
src.imp = new /obj/item/weapon/implant/organ/limbaugment/dart( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implantcase/toolkit
|
||||
name = "glass case - 'Toolkit'"
|
||||
desc = "A case containing a nanite fabricator implant."
|
||||
icon_state = "implantcase-b"
|
||||
|
||||
/obj/item/weapon/implantcase/toolkit/New()
|
||||
src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implantcase/medkit
|
||||
name = "glass case - 'Toolkit'"
|
||||
desc = "A case containing a nanite fabricator implant."
|
||||
icon_state = "implantcase-b"
|
||||
|
||||
/obj/item/weapon/implantcase/medkit/New()
|
||||
src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm/medkit( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implantcase/surge
|
||||
name = "glass case - 'Muscle Overclocker'"
|
||||
desc = "A case containing a nanite fabricator implant."
|
||||
icon_state = "implantcase-b"
|
||||
|
||||
/obj/item/weapon/implantcase/surge/New()
|
||||
src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm/surge( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implantcase/analyzer
|
||||
name = "glass case - 'Scanner'"
|
||||
desc = "A case containing a nanite fabricator implant."
|
||||
icon_state = "implantcase-b"
|
||||
|
||||
/obj/item/weapon/implantcase/analyzer/New()
|
||||
src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implantcase/sword
|
||||
name = "glass case - 'Scanner'"
|
||||
desc = "A case containing a nanite fabricator implant."
|
||||
icon_state = "implantcase-b"
|
||||
|
||||
/obj/item/weapon/implantcase/sword/New()
|
||||
src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist/sword( src )
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/weapon/implantcase/sprinter
|
||||
name = "glass case - 'Sprinter'"
|
||||
desc = "A case containing a nanite fabricator implant."
|
||||
icon_state = "implantcase-b"
|
||||
|
||||
/obj/item/weapon/implantcase/sprinter/New()
|
||||
src.imp = new /obj/item/weapon/implant/organ/pelvic( src )
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
/obj/item/weapon/implant/dud
|
||||
name = "unknown implant"
|
||||
desc = "A small device with small connector wires."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "implant"
|
||||
initialize_loc = BP_HEAD
|
||||
var/roundstart = TRUE
|
||||
|
||||
/obj/item/weapon/implant/dud/torso
|
||||
name = "unknown implant"
|
||||
desc = "A small device with small connector wires."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "implant"
|
||||
initialize_loc = BP_TORSO
|
||||
|
||||
/obj/item/weapon/implant/dud/old
|
||||
name = "old implant"
|
||||
desc = "A small device with small connector wires."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "implant"
|
||||
roundstart = FALSE
|
||||
|
||||
/obj/item/weapon/implant/dud/Initialize()
|
||||
..()
|
||||
if(roundstart)
|
||||
invisibility = 100
|
||||
..()
|
||||
spawn(3)
|
||||
if(!ishuman(loc) && !QDELETED(src))
|
||||
qdel(src)
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/item/weapon/implant/neural
|
||||
name = "neural framework implant"
|
||||
desc = "A small metal casing with numerous wires stemming off of it."
|
||||
initialize_loc = BP_HEAD
|
||||
var/obj/item/organ/internal/brain/my_brain = null
|
||||
var/target_state = null
|
||||
var/robotic_brain = FALSE
|
||||
@@ -104,3 +105,10 @@ Implant Specifics:<BR>"}
|
||||
my_brain.take_damage(15)
|
||||
my_brain = null
|
||||
return
|
||||
|
||||
/obj/item/weapon/implant/neural/roundstart/Initialize()
|
||||
invisibility = 100
|
||||
..()
|
||||
spawn(3)
|
||||
if(!ishuman(loc) && !QDELETED(src))
|
||||
qdel(src)
|
||||
|
||||
@@ -98,11 +98,11 @@
|
||||
<br>
|
||||
<h2>OPERATING PRINCIPLES</h2>
|
||||
<br>
|
||||
<li>The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and phoron gas. As oxygen accelerates the reaction, and phoron carries the risk of fire, these must be filtered out. NOTE: Supermatter radiation will not charge radiation collectors.</li>
|
||||
<li>The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and phoron gas. As oxygen accelerates the reaction and reacts with phoron to start a fire, it must be filtered out. It's recommended to filter out all gases besides nitrogen for standard operation. </li>
|
||||
<br>
|
||||
<li>Air in the reactor chamber housing the supermatter is circulated through the reactor loop, which passes through the filters and thermoelectric generators. The thermoelectric generators transfer heat from the reactor loop to the colder radiator loop, thereby generating power. Additional power is generated from internal turbines in the circulators.</li>
|
||||
<li>Gas in the reactor chamber housing the supermatter is circulated through the reactor loop, which passes through the filters and thermoelectric generators. The thermoelectric generators transfer heat from the reactor loop to the colder radiator loop, thereby generating power. Additional power is generated from internal turbines in the circulators.</li>
|
||||
<br>
|
||||
<li>Air in the radiator loop is circulated through the radiator bank, located in space. This rapidly cools the air, preserving the temperature differential needed for power generation.</li>
|
||||
<li>Gas in the radiator loop is circulated through the radiator bank, located in space. This rapidly cools the air, preserving the temperature differential needed for power generation.</li>
|
||||
<br>
|
||||
<li>The MK 1 Prototype Thermoelectric Supermatter Engine is designed to operate at reactor temperatures of 3000K to 4000K and generate up to 1MW of power. Beyond 1MW, the thermoelectric generators will begin to lose power through electrical discharge, reducing efficiency, but additional power generation remains feasible.</li>
|
||||
<br>
|
||||
@@ -113,19 +113,25 @@
|
||||
<li>Do not allow supermatter to contact any solid object apart from specially-designed supporting pallet.</li>
|
||||
<li>Do not directly view supermatter without meson goggles.</li>
|
||||
<li>While handles on pallet allow moving the supermatter via pulling, pushing should not be attempted.</li>
|
||||
<li>Note that prosthetics do not protect against radiation or viewing the supermatter.</li>
|
||||
<br>
|
||||
<h2>STARTUP PROCEDURE</h2>
|
||||
<h2>STANDARD STARTUP PROCEDURE</h2>
|
||||
<ol>
|
||||
<li>Fill reactor loop and radiator loop with two (2) standard canisters of nitrogen gas each.</li>
|
||||
<li>Ensure that pumps and filters are on and operating at maximum power.</li>
|
||||
<li>Fire 8-9 pulses from emitter at supermatter crystal. Reactor blast doors must be open for this procedure.</li>
|
||||
<li>Fill reactor loop and radiator loop with three (3) standard canisters of nitrogen gas each.</li>
|
||||
<li>Fill the waste handling radiator loop with one (1) standard canister of carbon dioxide gas.</li>
|
||||
<li>Enable both the high power gas pumps near the thermo-electric generators and maximize the desired output.</li>
|
||||
<li>Enable both the omni-filters and ensure they are set to filter nitrogen back into the system.</li>
|
||||
<li>Enable the gas pump from the filters to waste handling and maximize the desired output.</li>
|
||||
<li>Close the monitoring room blast doors and open the reactor blast doors,</li>
|
||||
<li>Fire 8-9 pulses from emitter at supermatter crystal. The expected power output is around a megawatt. NOTE: It will take a few minutes to heat up.</li>
|
||||
<li>Close the reactor blast doors and keep the monitoring room blast doors closed to prevent radiation leaking.</li>
|
||||
</ol>
|
||||
<br>
|
||||
<h2>OPERATION AND MAINTENANCE</h2>
|
||||
<ol>
|
||||
<li>Ensure that radiation protection and meson goggles are worn at all times while working in the engine room.</li>
|
||||
<li>Ensure that reactor and radiator loops are undamaged and unobstructed.</li>
|
||||
<li>Ensure that phoron and oxygen gas exhaust from filters is properly contained or disposed. Do not allow exhaust pressure to exceed 4500 kPa.</li>
|
||||
<li>Ensure that, in a standard setup, only nitrogen is being filtered back into the system. Do not allow exhaust pressure to exceed 4500 kPa.</li>
|
||||
<li>Ensure that engine room Area Power Controller (APC) and engine Superconducting Magnetic Energy Storage unit (SMES) are properly charged.</li>
|
||||
<li>Ensure that reactor temperature does not exceed 5000K. In event of reactor temperature exceeding 5000K, see EMERGENCY COOLING PROCEDURE.</li>
|
||||
<li>In event of imminent and/or unavoidable delamination, see EJECTION PROCEDURE.</li>
|
||||
@@ -135,12 +141,14 @@
|
||||
<ol>
|
||||
<li>Open Emergency Cooling Valve 1 and Emergency Cooling Valve 2.</li>
|
||||
<li>When reactor temperature returns to safe operating levels, close Emergency Cooling Valve 1 and Emergency Cooling Valve 2.</li>
|
||||
<li>Adding additional gas to the loops can have a positive effect in reducing reactor temperature.</li>
|
||||
<li>If reactor temperature does not return to safe operating levels, see EJECTION PROCEDURE.</li>
|
||||
</ol>
|
||||
<br>
|
||||
<h2>EJECTION PROCEDURE</h2>
|
||||
<ol>
|
||||
<li>Press Engine Ventilatory Control button to open engine core vent to space.</li>
|
||||
<li>Ensure the engine room has power. The blast doors and ejection platform are unresponsive without power.</li>
|
||||
<li>Press Engine Ventilatory Control button to open engine core blast door to space.</li>
|
||||
<li>Press Emergency Core Eject button to eject supermatter crystal. NOTE: Attempting crystal ejection while engine core vent is closed will result in ejection failure.</li>
|
||||
<li>In event of ejection failure, <i>pending</i></li>
|
||||
</ol>
|
||||
|
||||
@@ -42,6 +42,9 @@
|
||||
if(!isnull(matter[material_type]))
|
||||
matter[material_type] *= force_divisor // May require a new var instead.
|
||||
|
||||
if(!(material.conductive))
|
||||
src.flags |= NOCONDUCT
|
||||
|
||||
/obj/item/weapon/material/get_material()
|
||||
return material
|
||||
|
||||
@@ -67,7 +70,7 @@
|
||||
if(applies_material_colour)
|
||||
color = material.icon_colour
|
||||
if(material.products_need_process())
|
||||
START_PROCESSING(SSobj, src)
|
||||
START_PROCESSING(SSobj, src)
|
||||
update_force()
|
||||
|
||||
/obj/item/weapon/material/Destroy()
|
||||
|
||||
@@ -61,6 +61,51 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/material/shard/afterattack(var/atom/target, mob/living/carbon/human/user as mob)
|
||||
var/active_hand //hand the shard is in
|
||||
var/will_break = FALSE
|
||||
var/protected_hands = FALSE //this is a fucking mess
|
||||
var/break_damage = 4
|
||||
var/light_glove_d = rand(2, 4)
|
||||
var/no_glove_d = rand(4, 6)
|
||||
var/list/forbidden_gloves = list(
|
||||
/obj/item/clothing/gloves/sterile,
|
||||
/obj/item/clothing/gloves/knuckledusters
|
||||
)
|
||||
|
||||
if(src == user.l_hand)
|
||||
active_hand = BP_L_HAND
|
||||
else if(src == user.r_hand)
|
||||
active_hand = BP_R_HAND
|
||||
else
|
||||
return // If it's not actually in our hands anymore, we were probably gentle with it
|
||||
|
||||
active_hand = (src == user.l_hand) ? BP_L_HAND : BP_R_HAND // May not actually be faster than an if-else block, but a little bit cleaner -Ater
|
||||
|
||||
if(prob(75))
|
||||
will_break = TRUE
|
||||
|
||||
if(user.gloves && (user.gloves.body_parts_covered & HANDS) && istype(user.gloves, /obj/item/clothing/gloves)) // Not-gloves aren't gloves, and therefore don't protect us
|
||||
protected_hands = TRUE // If we're wearing gloves we can probably handle it just fine
|
||||
for(var/I in forbidden_gloves)
|
||||
if(istype(user.gloves, I)) // forbidden_gloves is a blacklist, so if we match anything in there, our hands are not protected
|
||||
protected_hands = FALSE
|
||||
break
|
||||
|
||||
if(user.gloves && !protected_hands)
|
||||
to_chat(user, "<span class='warning'>\The [src] partially cuts into your hand through your gloves as you hit \the [target]!</span>")
|
||||
user.apply_damage(light_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src, src.sharp, src.edge) // Ternary to include break damage
|
||||
|
||||
else if(!user.gloves)
|
||||
to_chat(user, "<span class='warning'>\The [src] cuts into your hand as you hit \the [target]!</span>")
|
||||
user.apply_damage(no_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src, src.sharp, src.edge)
|
||||
|
||||
if(will_break && src.loc == user) // If it's not in our hand anymore
|
||||
user.visible_message("<span class='danger'>[user] hit \the [target] with \the [src], shattering it!</span>", "<span class='warning'>You shatter \the [src] in your hand!</span>")
|
||||
playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/material/shard/Crossed(AM as mob|obj)
|
||||
..()
|
||||
//VOREStation Edit begin: SHADEKIN
|
||||
|
||||
@@ -11,8 +11,7 @@
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/item/weapon/material/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
|
||||
if(default_parry_check(user, attacker, damage_source) && prob(50))
|
||||
if(unique_parry_check(user, attacker, damage_source) && prob(50))
|
||||
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
|
||||
playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1)
|
||||
return 1
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* The home of basic deflect / defense code.
|
||||
*/
|
||||
|
||||
/obj/item/weapon/melee
|
||||
var/defend_chance = 5 // The base chance for the weapon to parry.
|
||||
var/projectile_parry_chance = 0 // The base chance for a projectile to be deflected.
|
||||
|
||||
/obj/item/weapon/melee/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
if(.)
|
||||
return .
|
||||
if(default_parry_check(user, attacker, damage_source) && prob(defend_chance))
|
||||
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
|
||||
return 1
|
||||
if(unique_parry_check(user, attacker, damage_source) && prob(projectile_parry_chance))
|
||||
user.visible_message("<span class='danger'>\The [user] deflects [attack_text] with \the [src]!</span>")
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/melee/unique_parry_check(mob/user, mob/attacker, atom/damage_source)
|
||||
if(.)
|
||||
return .
|
||||
if(user.incapacitated() || !istype(damage_source, /obj/item/projectile))
|
||||
return 0
|
||||
|
||||
var/bad_arc = reverse_direction(user.dir)
|
||||
if(!check_shield_arc(user, bad_arc, damage_source, attacker))
|
||||
return 0
|
||||
|
||||
return 1
|
||||
@@ -12,6 +12,12 @@
|
||||
var/lpower = 2
|
||||
var/lcolor = "#0099FF"
|
||||
|
||||
// If it uses energy.
|
||||
var/use_cell = FALSE
|
||||
var/hitcost = 120
|
||||
var/obj/item/weapon/cell/bcell = null
|
||||
var/cell_type = /obj/item/weapon/cell/device
|
||||
|
||||
/obj/item/weapon/melee/energy/proc/activate(mob/living/user)
|
||||
if(active)
|
||||
return
|
||||
@@ -38,7 +44,31 @@
|
||||
w_class = initial(w_class)
|
||||
set_light(0,0)
|
||||
|
||||
/obj/item/weapon/melee/energy/proc/use_charge(var/cost)
|
||||
if(active)
|
||||
if(bcell)
|
||||
if(bcell.checked_use(cost))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return null
|
||||
|
||||
/obj/item/weapon/melee/energy/examine(mob/user)
|
||||
if(!..(user, 1))
|
||||
return
|
||||
|
||||
if(use_cell)
|
||||
if(bcell)
|
||||
to_chat(user, "<span class='notice'>The blade is [round(bcell.percent())]% charged.</span>")
|
||||
if(!bcell)
|
||||
to_chat(user, "<span class='warning'>The blade does not have a power source installed.</span>")
|
||||
|
||||
/obj/item/weapon/melee/energy/attack_self(mob/living/user as mob)
|
||||
if(use_cell)
|
||||
if((!bcell || bcell.charge < hitcost) && !active)
|
||||
to_chat(user, "<span class='notice'>\The [src] does not seem to have power.</span>")
|
||||
return
|
||||
|
||||
var/datum/gender/TU = gender_datums[user.get_visible_gender()]
|
||||
if (active)
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
@@ -64,6 +94,37 @@
|
||||
"<span class='danger'>\The [user] is falling on \the [src]! It looks like [TU.he] [TU.is] trying to commit suicide.</span>"))
|
||||
return (BRUTELOSS|FIRELOSS)
|
||||
|
||||
/obj/item/weapon/melee/energy/attack(mob/M, mob/user)
|
||||
if(active && use_cell)
|
||||
if(!use_charge(hitcost))
|
||||
deactivate(user)
|
||||
visible_message("<span class='notice'>\The [src]'s blade flickers, before deactivating.</span>")
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/melee/energy/attackby(obj/item/weapon/W, mob/user)
|
||||
if(use_cell)
|
||||
if(istype(W, cell_type))
|
||||
if(!bcell)
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
bcell = W
|
||||
to_chat(user, "<span class='notice'>You install a cell in [src].</span>")
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] already has a cell.</span>")
|
||||
else if(W.is_screwdriver() && bcell)
|
||||
bcell.update_icon()
|
||||
bcell.forceMove(get_turf(loc))
|
||||
bcell = null
|
||||
to_chat(user, "<span class='notice'>You remove the cell from \the [src].</span>")
|
||||
deactivate()
|
||||
update_icon()
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/melee/energy/get_cell()
|
||||
return bcell
|
||||
|
||||
/*
|
||||
* Energy Axe
|
||||
*/
|
||||
@@ -90,11 +151,13 @@
|
||||
|
||||
/obj/item/weapon/melee/energy/axe/activate(mob/living/user)
|
||||
..()
|
||||
damtype = SEARING
|
||||
icon_state = "axe1"
|
||||
to_chat(user, "<span class='notice'>\The [src] is now energised.</span>")
|
||||
|
||||
/obj/item/weapon/melee/energy/axe/deactivate(mob/living/user)
|
||||
..()
|
||||
damtype = BRUTE
|
||||
icon_state = initial(icon_state)
|
||||
to_chat(user, "<span class='notice'>\The [src] is de-energised. It's just a regular axe now.</span>")
|
||||
|
||||
@@ -103,6 +166,20 @@
|
||||
visible_message("<span class='warning'>\The [user] swings \the [src] towards [TU.his] head! It looks like [TU.he] [TU.is] trying to commit suicide.</span>")
|
||||
return (BRUTELOSS|FIRELOSS)
|
||||
|
||||
/obj/item/weapon/melee/energy/axe/charge
|
||||
name = "charge axe"
|
||||
desc = "An energised axe."
|
||||
active_force = 35
|
||||
active_throwforce = 20
|
||||
force = 15
|
||||
|
||||
use_cell = TRUE
|
||||
hitcost = 120
|
||||
|
||||
/obj/item/weapon/melee/energy/axe/charge/loaded/New()
|
||||
..()
|
||||
bcell = new/obj/item/weapon/cell/device/weapon(src)
|
||||
|
||||
/*
|
||||
* Energy Sword
|
||||
*/
|
||||
@@ -127,6 +204,8 @@
|
||||
var/random_color = TRUE
|
||||
var/active_state = "sword"
|
||||
|
||||
projectile_parry_chance = 65
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/dropped(var/mob/user)
|
||||
..()
|
||||
if(!istype(loc,/mob))
|
||||
@@ -173,7 +252,7 @@
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
if(active && default_parry_check(user, attacker, damage_source) && prob(50))
|
||||
if(active && default_parry_check(user, attacker, damage_source) && prob(60))
|
||||
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
@@ -181,8 +260,27 @@
|
||||
spark_system.start()
|
||||
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
return 1
|
||||
if(active && unique_parry_check(user, attacker, damage_source) && prob(projectile_parry_chance))
|
||||
user.visible_message("<span class='danger'>\The [user] deflects [attack_text] with \the [src]!</span>")
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, user.loc)
|
||||
spark_system.start()
|
||||
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/unique_parry_check(mob/user, mob/attacker, atom/damage_source)
|
||||
if(user.incapacitated() || !istype(damage_source, /obj/item/projectile/))
|
||||
return 0
|
||||
|
||||
var/bad_arc = reverse_direction(user.dir)
|
||||
if(!check_shield_arc(user, bad_arc, damage_source, attacker))
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/pirate
|
||||
name = "energy cutlass"
|
||||
desc = "Arrrr matey."
|
||||
@@ -215,6 +313,7 @@
|
||||
lpower = 2
|
||||
lcolor = "#0000FF"
|
||||
active_state = "ionic_rapier"
|
||||
projectile_parry_chance = 30 // It's not specifically designed for cutting and slashing, but it can still, maybe, save your life.
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/ionic_rapier/afterattack(var/atom/movable/AM, var/mob/living/user, var/proximity)
|
||||
if(istype(AM, /obj) && proximity && active)
|
||||
@@ -250,65 +349,9 @@
|
||||
origin_tech = list(TECH_COMBAT = 5, TECH_MAGNET = 3, TECH_ILLEGAL = 4)
|
||||
active_force = 25
|
||||
armor_penetration = 25
|
||||
projectile_parry_chance = 40
|
||||
|
||||
var/hitcost = 75
|
||||
var/obj/item/weapon/cell/bcell = null
|
||||
var/cell_type = /obj/item/weapon/cell/device
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/charge/proc/use_charge(var/cost)
|
||||
if(active)
|
||||
if(bcell)
|
||||
if(bcell.checked_use(cost))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return null
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/charge/examine(mob/user)
|
||||
if(!..(user, 1))
|
||||
return
|
||||
|
||||
if(bcell)
|
||||
to_chat(user, "<span class='notice'>The blade is [round(bcell.percent())]% charged.</span>")
|
||||
if(!bcell)
|
||||
to_chat(user, "<span class='warning'>The blade does not have a power source installed.</span>")
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/charge/attack_self(mob/user as mob)
|
||||
if((!bcell || bcell.charge < hitcost) && !active)
|
||||
to_chat(user, "<span class='notice'>\The [src] does not seem to have power.</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/charge/attack(mob/M, mob/user)
|
||||
if(active)
|
||||
if(!use_charge(hitcost))
|
||||
deactivate(user)
|
||||
visible_message("<span class='notice'>\The [src]'s blade flickers, before retracting.</span>")
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/charge/attackby(obj/item/weapon/W, mob/user)
|
||||
if(istype(W, cell_type))
|
||||
if(!bcell)
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
bcell = W
|
||||
to_chat(user, "<span class='notice'>You install a cell in [src].</span>")
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] already has a cell.</span>")
|
||||
else if(W.is_screwdriver() && bcell)
|
||||
bcell.update_icon()
|
||||
bcell.forceMove(get_turf(loc))
|
||||
bcell = null
|
||||
to_chat(user, "<span class='notice'>You remove the cell from \the [src].</span>")
|
||||
deactivate()
|
||||
update_icon()
|
||||
return
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/charge/get_cell()
|
||||
return bcell
|
||||
hitcost = 75
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/charge/loaded/New()
|
||||
..()
|
||||
@@ -336,6 +379,7 @@
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
var/mob/living/creator
|
||||
var/datum/effect/effect/system/spark_spread/spark_system
|
||||
projectile_parry_chance = 60
|
||||
lcolor = "#00FF00"
|
||||
|
||||
/obj/item/weapon/melee/energy/blade/New()
|
||||
@@ -373,6 +417,37 @@
|
||||
host.drop_from_inventory(src)
|
||||
spawn(1) if(src) qdel(src)
|
||||
|
||||
/obj/item/weapon/melee/energy/blade/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
if(default_parry_check(user, attacker, damage_source) && prob(60))
|
||||
user.visible_message("<span class='danger'>\The [user] parries [attack_text] with \the [src]!</span>")
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, user.loc)
|
||||
spark_system.start()
|
||||
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
return 1
|
||||
if(unique_parry_check(user, attacker, damage_source) && prob(projectile_parry_chance))
|
||||
user.visible_message("<span class='danger'>\The [user] deflects [attack_text] with \the [src]!</span>")
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, user.loc)
|
||||
spark_system.start()
|
||||
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/melee/energy/blade/unique_parry_check(mob/user, mob/attacker, atom/damage_source)
|
||||
|
||||
if(user.incapacitated() || !istype(damage_source, /obj/item/projectile/))
|
||||
return 0
|
||||
|
||||
var/bad_arc = reverse_direction(user.dir)
|
||||
if(!check_shield_arc(user, bad_arc, damage_source, attacker))
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
/*
|
||||
*Energy Spear
|
||||
*/
|
||||
|
||||
@@ -10,6 +10,7 @@ GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/weapon/mop)
|
||||
throw_speed = 5
|
||||
throw_range = 10
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
flags = NOCONDUCT
|
||||
attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
|
||||
var/mopping = 0
|
||||
var/mopcount = 0
|
||||
|
||||
@@ -29,6 +29,9 @@
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/proc/unique_parry_check(mob/user, mob/attacker, atom/damage_source) // An overrideable version of the above proc.
|
||||
return default_parry_check(user, attacker, damage_source)
|
||||
|
||||
/obj/item/weapon/shield
|
||||
name = "shield"
|
||||
var/base_block_chance = 50
|
||||
|
||||
@@ -422,3 +422,10 @@
|
||||
H.visible_message("<span class='notice'>\The [src] decides not to unpack \the [src]!</span>", \
|
||||
"<span class='notice'>You decide not to unpack \the [src]!</span>")
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel/ranger
|
||||
name = "ranger satchel"
|
||||
desc = "A satchel designed for the Go Go ERT Rangers series to allow for slightly bigger carry capacity for the ERT-Rangers.\
|
||||
Unlike the show claims, it is not a phoron-enhanced satchel of holding with plot-relevant content."
|
||||
icon = 'icons/obj/clothing/ranger.dmi'
|
||||
icon_state = "ranger_satchel"
|
||||
@@ -128,4 +128,9 @@
|
||||
/obj/item/weapon/storage/backpack/dufflebag/fluff //Black dufflebag without syndie buffs.
|
||||
name = "plain black dufflebag"
|
||||
desc = "A large dufflebag for holding extra tactical supplies."
|
||||
icon_state = "duffle_syndie"
|
||||
icon_state = "duffle_syndie"
|
||||
|
||||
/obj/item/weapon/storage/backpack
|
||||
sprite_sheets = list(
|
||||
SPECIES_TESHARI = 'icons/mob/species/seromi/back.dmi',
|
||||
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/back.dmi')
|
||||
|
||||
@@ -177,7 +177,8 @@
|
||||
/obj/item/weapon/gun/projectile/sec,
|
||||
/obj/item/weapon/gun/projectile/p92x,
|
||||
/obj/item/taperoll,
|
||||
/obj/item/weapon/gun/projectile/colt/detective
|
||||
/obj/item/weapon/gun/projectile/colt/detective,
|
||||
/obj/item/device/holowarrant
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/belt/detective
|
||||
@@ -219,7 +220,8 @@
|
||||
/obj/item/weapon/flame/lighter,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/donut/,
|
||||
/obj/item/ammo_magazine,
|
||||
/obj/item/weapon/gun/projectile/colt/detective
|
||||
/obj/item/weapon/gun/projectile/colt/detective,
|
||||
/obj/item/device/holowarrant
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/belt/soulstone
|
||||
@@ -433,3 +435,8 @@
|
||||
icon_state = "fannypack_yellow"
|
||||
item_state = "fannypack_yellow"
|
||||
|
||||
/obj/item/weapon/storage/belt/ranger
|
||||
name = "ranger belt"
|
||||
desc = "The fancy utility-belt holding the tools, cuffs and gadgets of the Go Go ERT-Rangers. The belt buckle is not real phoron, but it is still surprisingly comfortable to wear."
|
||||
icon = 'icons/obj/clothing/ranger.dmi'
|
||||
icon_state = "ranger_belt"
|
||||
@@ -0,0 +1,4 @@
|
||||
/obj/item/weapon/storage/belt
|
||||
sprite_sheets = list(
|
||||
SPECIES_TESHARI = 'icons/mob/species/seromi/belt.dmi',
|
||||
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/belt.dmi')
|
||||
@@ -36,3 +36,16 @@
|
||||
name = "box of command keys"
|
||||
desc = "A box full of service keys, for the HoP to give out as necessary."
|
||||
starts_with = list(/obj/item/device/encryptionkey/headset_service = 7)
|
||||
|
||||
/obj/item/weapon/storage/box/survival/space
|
||||
name = "boxed emergency suit and helmet"
|
||||
icon_state = "survivaleng"
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/space/emergency,
|
||||
/obj/item/clothing/head/helmet/space/emergency,
|
||||
/obj/item/clothing/mask/breath,
|
||||
/obj/item/weapon/tank/emergency/oxygen/double
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/secure/briefcase/trashmoney
|
||||
starts_with = list(/obj/item/weapon/spacecash/c200 = 10)
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
item_state = "candlebox5"
|
||||
throwforce = 2
|
||||
slot_flags = SLOT_BELT
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 5
|
||||
starts_with = list(/obj/item/weapon/flame/candle = 5)
|
||||
|
||||
/obj/item/weapon/storage/fancy/whitecandle_box
|
||||
@@ -78,6 +79,7 @@
|
||||
item_state = "whitecandlebox5"
|
||||
throwforce = 2
|
||||
slot_flags = SLOT_BELT
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 5
|
||||
starts_with = list(/obj/item/weapon/flame/candle/white = 5)
|
||||
|
||||
/obj/item/weapon/storage/fancy/blackcandle_box
|
||||
@@ -89,6 +91,7 @@
|
||||
item_state = "blackcandlebox5"
|
||||
throwforce = 2
|
||||
slot_flags = SLOT_BELT
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 5
|
||||
starts_with = list(/obj/item/weapon/flame/candle/black = 5)
|
||||
|
||||
|
||||
@@ -179,6 +182,21 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/*
|
||||
* Cracker Packet
|
||||
*/
|
||||
|
||||
/obj/item/weapon/storage/fancy/crackers
|
||||
name = "\improper Getmore Crackers"
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "crackerbox"
|
||||
icon_type = "cracker"
|
||||
max_storage_space = ITEMSIZE_COST_TINY * 6
|
||||
max_w_class = ITEMSIZE_TINY
|
||||
w_class = ITEMSIZE_SMALL
|
||||
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/cracker)
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/cracker = 6)
|
||||
|
||||
////////////
|
||||
//CIG PACK//
|
||||
////////////
|
||||
|
||||
@@ -156,10 +156,15 @@
|
||||
/obj/item/weapon/storage/firstaid/clotting
|
||||
name = "clotting kit"
|
||||
desc = "Contains chemicals to stop bleeding."
|
||||
icon_state = "clottingkit" // VOREStation edit
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 7
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting = 8)
|
||||
|
||||
/obj/item/weapon/storage/firstaid/bonemed
|
||||
name = "bone repair kit"
|
||||
desc = "Contains chemicals to mend broken bones."
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 7
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed = 8)
|
||||
|
||||
/*
|
||||
* Pill Bottles
|
||||
*/
|
||||
@@ -177,15 +182,25 @@
|
||||
use_sound = null
|
||||
max_storage_space = ITEMSIZE_COST_TINY * 14
|
||||
max_w_class = ITEMSIZE_TINY
|
||||
var/wrapper_color
|
||||
var/label
|
||||
|
||||
var/label_text = ""
|
||||
var/base_name = " "
|
||||
var/base_desc = " "
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/New()
|
||||
..()
|
||||
/obj/item/weapon/storage/pill_bottle/Initialize()
|
||||
. = ..()
|
||||
base_name = name
|
||||
base_desc = desc
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/update_icon()
|
||||
overlays.Cut()
|
||||
if(wrapper_color)
|
||||
var/image/I = image(icon, "pillbottle_wrap")
|
||||
I.color = wrapper_color
|
||||
overlays += I
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/device/flashlight/pen))
|
||||
@@ -216,61 +231,71 @@
|
||||
desc = "[base_desc] It is labeled \"[label_text]\"."
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/antitox
|
||||
name = "bottle of Dylovene pills"
|
||||
name = "pill bottle (Dylovene)"
|
||||
desc = "Contains pills used to counter toxins."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/antitox = 7)
|
||||
wrapper_color = COLOR_GREEN
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/bicaridine
|
||||
name = "bottle of Bicaridine pills"
|
||||
name = "pill bottle (Bicaridine)"
|
||||
desc = "Contains pills used to stabilize the severely injured."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/bicaridine = 7)
|
||||
wrapper_color = COLOR_MAROON
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dexalin_plus
|
||||
name = "bottle of Dexalin Plus pills"
|
||||
name = "pill bottle (Dexalin Plus)"
|
||||
desc = "Contains pills used to treat extreme cases of oxygen deprivation."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/dexalin_plus = 7)
|
||||
wrapper_color = "#3366cc"
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dermaline
|
||||
name = "bottle of Dermaline pills"
|
||||
name = "pill bottle (Dermaline)"
|
||||
desc = "Contains pills used to treat burn wounds."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/dermaline = 7)
|
||||
wrapper_color = "#e8d131"
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/dylovene
|
||||
name = "bottle of Dylovene pills"
|
||||
name = "pill bottle (Dylovene)"
|
||||
desc = "Contains pills used to treat toxic substances in the blood."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/dylovene = 7)
|
||||
wrapper_color = COLOR_GREEN
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/inaprovaline
|
||||
name = "bottle of Inaprovaline pills"
|
||||
name = "pill bottle (Inaprovaline)"
|
||||
desc = "Contains pills used to stabilize patients."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/inaprovaline = 7)
|
||||
wrapper_color = COLOR_PALE_BLUE_GRAY
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/kelotane
|
||||
name = "bottle of kelotane pills"
|
||||
name = "pill bottle (Kelotane)"
|
||||
desc = "Contains pills used to treat burns."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/kelotane = 7)
|
||||
wrapper_color = "#ec8b2f"
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/spaceacillin
|
||||
name = "bottle of Spaceacillin pills"
|
||||
name = "pill bottle (Spaceacillin)"
|
||||
desc = "A theta-lactam antibiotic. Effective against many diseases likely to be encountered in space."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/spaceacillin = 7)
|
||||
wrapper_color = COLOR_PALE_GREEN_GRAY
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/tramadol
|
||||
name = "bottle of Tramadol pills"
|
||||
name = "pill bottle (Tramadol)"
|
||||
desc = "Contains pills used to relieve pain."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/tramadol = 7)
|
||||
wrapper_color = COLOR_PURPLE_GRAY
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/citalopram
|
||||
name = "bottle of Citalopram pills"
|
||||
name = "pill bottle (Citalopram)"
|
||||
desc = "Contains pills used to stabilize a patient's mood."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/citalopram = 7)
|
||||
wrapper_color = COLOR_GRAY
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/carbon
|
||||
name = "bottle of Carbon pills"
|
||||
name = "pill bottle (Carbon)"
|
||||
desc = "Contains pills used to neutralise chemicals in the stomach."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/carbon = 7)
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/iron
|
||||
name = "bottle of Iron pills"
|
||||
name = "pill bottle (Iron)"
|
||||
desc = "Contains pills used to aid in blood regeneration."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/iron = 7)
|
||||
|
||||
@@ -1,4 +1,97 @@
|
||||
/obj/item/weapon/storage/firstaid/clotting
|
||||
icon_state = "clottingkit"
|
||||
|
||||
/obj/item/weapon/storage/firstaid/bonemed
|
||||
icon_state = "pinky"
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/adminordrazine
|
||||
name = "pill bottle (Adminordrazine)"
|
||||
desc = "It's magic. We don't have to explain it."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/adminordrazine = 21)
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/nutriment
|
||||
name = "bottle of Nutriment pills"
|
||||
name = "pill bottle (Food)"
|
||||
desc = "Contains pills used to feed people."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/nutriment = 7)
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/nutriment = 7, /obj/item/weapon/reagent_containers/pill/protein = 7)
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/rezadone
|
||||
name = "pill bottle (Rezadone)"
|
||||
desc = "A powder with almost magical properties, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/rezadone = 7)
|
||||
wrapper_color = COLOR_GREEN_GRAY
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/peridaxon
|
||||
name = "pill bottle (Peridaxon)"
|
||||
desc = "Used to encourage recovery of internal organs and nervous systems. Medicate cautiously."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/peridaxon = 7)
|
||||
wrapper_color = COLOR_PURPLE
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/carthatoline
|
||||
name = "pill bottle (Carthatoline)"
|
||||
desc = "Carthatoline is strong evacuant used to treat severe poisoning."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/carthatoline = 7)
|
||||
wrapper_color = COLOR_GREEN_GRAY
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/alkysine
|
||||
name = "pill bottle (Alkysine)"
|
||||
desc = "Alkysine is a drug used to lessen the damage to neurological tissue after a catastrophic injury. Can heal brain tissue."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/alkysine = 7)
|
||||
wrapper_color = COLOR_YELLOW
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/imidazoline
|
||||
name = "pill bottle (Imidazoline)"
|
||||
desc = "Heals eye damage."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/imidazoline = 7)
|
||||
wrapper_color = COLOR_PURPLE_GRAY
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/osteodaxon
|
||||
name = "pill bottle (Osteodaxon)"
|
||||
desc = "An experimental drug used to heal bone fractures."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/osteodaxon = 7)
|
||||
wrapper_color = COLOR_WHITE
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/myelamine
|
||||
name = "pill bottle (Myelamine)"
|
||||
desc = "Used to rapidly clot internal hemorrhages by increasing the effectiveness of platelets."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/myelamine = 7)
|
||||
wrapper_color = COLOR_PALE_PURPLE_GRAY
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/hyronalin
|
||||
name = "pill bottle (Hyronalin)"
|
||||
desc = "Hyronalin is a medicinal drug used to counter the effect of radiation poisoning."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/hyronalin = 7)
|
||||
wrapper_color = COLOR_TEAL
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/arithrazine
|
||||
name = "pill bottle (Arithrazine)"
|
||||
desc = "Arithrazine is an unstable medication used for the most extreme cases of radiation poisoning."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/arithrazine = 7)
|
||||
wrapper_color = COLOR_TEAL
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/corophizine
|
||||
name = "pill bottle (Corophizine)"
|
||||
desc = "A wide-spectrum antibiotic drug. Powerful and uncomfortable in equal doses."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/corophizine = 7)
|
||||
wrapper_color = COLOR_PALE_GREEN_GRAY
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/healing_nanites
|
||||
name = "pill bottle (Healing nanites)"
|
||||
desc = "Miniature medical robots that swiftly restore bodily damage."
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/pill/healing_nanites = 7)
|
||||
|
||||
/obj/item/weapon/storage/firstaid/insiderepair
|
||||
name = "combat organ kit"
|
||||
desc = "Contains advanced organ medical treatments."
|
||||
icon_state = "bezerk"
|
||||
item_state_slots = list(slot_r_hand_str = "firstaid-advanced", slot_l_hand_str = "firstaid-advanced")
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/pill_bottle/rezadone,
|
||||
/obj/item/weapon/storage/pill_bottle/peridaxon,
|
||||
/obj/item/weapon/storage/pill_bottle/carthatoline,
|
||||
/obj/item/weapon/storage/pill_bottle/alkysine,
|
||||
/obj/item/weapon/storage/pill_bottle/imidazoline,
|
||||
/obj/item/weapon/storage/pill_bottle/osteodaxon,
|
||||
/obj/item/weapon/storage/pill_bottle/myelamine,
|
||||
/obj/item/weapon/storage/pill_bottle/arithrazine,
|
||||
/obj/item/device/healthanalyzer/advanced
|
||||
)
|
||||
|
||||
@@ -24,3 +24,46 @@
|
||||
|
||||
/obj/item/weapon/storage/box/donut/empty
|
||||
empty = TRUE
|
||||
|
||||
/obj/item/weapon/storage/box/wormcan
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "wormcan"
|
||||
name = "can of worms"
|
||||
desc = "You probably do want to open this can of worms."
|
||||
max_storage_space = ITEMSIZE_COST_TINY * 6
|
||||
can_hold = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/wormsickly,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/worm,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/wormdeluxe
|
||||
)
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/worm = 6)
|
||||
|
||||
/obj/item/weapon/storage/box/wormcan/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/storage/box/wormcan/update_icon(var/itemremoved = 0)
|
||||
if (contents.len == 0)
|
||||
icon_state = "wormcan_empty"
|
||||
|
||||
/obj/item/weapon/storage/box/wormcan/sickly
|
||||
icon_state = "wormcan_sickly"
|
||||
name = "can of sickly worms"
|
||||
desc = "You probably don't want to open this can of worms."
|
||||
max_storage_space = ITEMSIZE_COST_TINY * 6
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/wormsickly = 6)
|
||||
|
||||
/obj/item/weapon/storage/box/wormcan/sickly/update_icon(var/itemremoved = 0)
|
||||
if (contents.len == 0)
|
||||
icon_state = "wormcan_empty_sickly"
|
||||
|
||||
/obj/item/weapon/storage/box/wormcan/deluxe
|
||||
icon_state = "wormcan_deluxe"
|
||||
name = "can of deluxe worms"
|
||||
desc = "You absolutely want to open this can of worms."
|
||||
max_storage_space = ITEMSIZE_COST_TINY * 6
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/wormdeluxe = 6)
|
||||
|
||||
/obj/item/weapon/storage/box/wormcan/deluxe/update_icon(var/itemremoved = 0)
|
||||
if (contents.len == 0)
|
||||
icon_state = "wormcan_empty_deluxe"
|
||||
@@ -0,0 +1,290 @@
|
||||
/*
|
||||
MRE Stuff
|
||||
*/
|
||||
|
||||
/obj/item/weapon/storage/mre
|
||||
name = "standard MRE"
|
||||
desc = "A vacuum-sealed bag containing a day's worth of nutrients for an adult in strenuous situations. There is no visible expiration date on the package."
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "mre"
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 6
|
||||
max_w_class = ITEMSIZE_SMALL
|
||||
var/opened = FALSE
|
||||
var/meal_desc = "This one is menu 1, meat pizza."
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/mrebag,
|
||||
/obj/item/weapon/storage/mrebag/side,
|
||||
/obj/item/weapon/storage/mrebag/dessert,
|
||||
/obj/item/weapon/storage/fancy/crackers,
|
||||
/obj/random/mre/spread,
|
||||
/obj/random/mre/drink,
|
||||
/obj/random/mre/sauce,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mre/examine(mob/user)
|
||||
. = ..()
|
||||
to_chat(user, meal_desc)
|
||||
|
||||
/obj/item/weapon/storage/mre/update_icon()
|
||||
if(opened)
|
||||
icon_state = "[initial(icon_state)][opened]"
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/storage/mre/attack_self(mob/user)
|
||||
open(user)
|
||||
|
||||
/obj/item/weapon/storage/mre/open(mob/user)
|
||||
if(!opened)
|
||||
to_chat(usr, "<span class='notice'>You tear open the bag, breaking the vacuum seal.</span>")
|
||||
opened = 1
|
||||
update_icon()
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/storage/mre/menu2
|
||||
meal_desc = "This one is menu 2, margherita."
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/mrebag/menu2,
|
||||
/obj/item/weapon/storage/mrebag/side,
|
||||
/obj/item/weapon/storage/mrebag/dessert,
|
||||
/obj/item/weapon/storage/fancy/crackers,
|
||||
/obj/random/mre/spread,
|
||||
/obj/random/mre/drink,
|
||||
/obj/random/mre/sauce,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mre/menu3
|
||||
meal_desc = "This one is menu 3, vegetable pizza."
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/mrebag/menu3,
|
||||
/obj/item/weapon/storage/mrebag/side,
|
||||
/obj/item/weapon/storage/mrebag/dessert,
|
||||
/obj/item/weapon/storage/fancy/crackers,
|
||||
/obj/random/mre/spread,
|
||||
/obj/random/mre/drink,
|
||||
/obj/random/mre/sauce,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mre/menu4
|
||||
meal_desc = "This one is menu 4, hamburger."
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/mrebag/menu4,
|
||||
/obj/item/weapon/storage/mrebag/side,
|
||||
/obj/item/weapon/storage/mrebag/dessert,
|
||||
/obj/item/weapon/storage/fancy/crackers,
|
||||
/obj/random/mre/spread,
|
||||
/obj/random/mre/drink,
|
||||
/obj/random/mre/sauce,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mre/menu5
|
||||
meal_desc = "This one is menu 5, taco."
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/mrebag/menu5,
|
||||
/obj/item/weapon/storage/mrebag/side,
|
||||
/obj/item/weapon/storage/mrebag/dessert,
|
||||
/obj/item/weapon/storage/fancy/crackers,
|
||||
/obj/random/mre/spread,
|
||||
/obj/random/mre/drink,
|
||||
/obj/random/mre/sauce,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mre/menu6
|
||||
meal_desc = "This one is menu 6, meatbread."
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/mrebag/menu6,
|
||||
/obj/item/weapon/storage/mrebag/side,
|
||||
/obj/item/weapon/storage/mrebag/dessert,
|
||||
/obj/item/weapon/storage/fancy/crackers,
|
||||
/obj/random/mre/spread,
|
||||
/obj/random/mre/drink,
|
||||
/obj/random/mre/sauce,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mre/menu7
|
||||
meal_desc = "This one is menu 7, salad."
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/mrebag/menu7,
|
||||
/obj/item/weapon/storage/mrebag/side,
|
||||
/obj/item/weapon/storage/mrebag/dessert,
|
||||
/obj/item/weapon/storage/fancy/crackers,
|
||||
/obj/random/mre/spread,
|
||||
/obj/random/mre/drink,
|
||||
/obj/random/mre/sauce,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mre/menu8
|
||||
meal_desc = " This one is menu 8, hot chili."
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/mrebag/menu8,
|
||||
/obj/item/weapon/storage/mrebag/side,
|
||||
/obj/item/weapon/storage/mrebag/dessert,
|
||||
/obj/item/weapon/storage/fancy/crackers,
|
||||
/obj/random/mre/spread,
|
||||
/obj/random/mre/drink,
|
||||
/obj/random/mre/sauce,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mre/menu9
|
||||
name = "vegan MRE"
|
||||
meal_desc = "This one is menu 9, boiled rice (skrell-safe)."
|
||||
icon_state = "vegmre"
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/mrebag/menu9,
|
||||
/obj/item/weapon/storage/mrebag/side,
|
||||
/obj/item/weapon/storage/mrebag/dessert/menu9,
|
||||
/obj/item/weapon/storage/fancy/crackers,
|
||||
/obj/random/mre/spread/vegan,
|
||||
/obj/random/mre/drink,
|
||||
/obj/random/mre/sauce/vegan,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mre/menu10
|
||||
name = "protein MRE"
|
||||
meal_desc = "This one is menu 10, protein."
|
||||
icon_state = "meatmre"
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/mrebag/menu10,
|
||||
/obj/item/weapon/storage/mrebag/menu10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/protein,
|
||||
/obj/random/mre/sauce/sugarfree,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mre/menu11
|
||||
name = "emergency MRE"
|
||||
meal_desc = "This one is menu 11, nutriment paste. Only for emergencies."
|
||||
icon_state = "crayonmre"
|
||||
starts_with = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mre/menu12
|
||||
name = "crayon MRE"
|
||||
meal_desc = "This one doesn't have a menu listing. How very odd."
|
||||
icon_state = "crayonmre"
|
||||
starts_with = list(
|
||||
/obj/item/weapon/storage/fancy/crayons,
|
||||
/obj/item/weapon/storage/mrebag/dessert/menu11,
|
||||
/obj/random/mre/sauce/crayon,
|
||||
/obj/random/mre/sauce/crayon,
|
||||
/obj/random/mre/sauce/crayon
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mre/menu13
|
||||
name = "medical MRE"
|
||||
meal_desc = "This one is menu 13, vitamin paste & dessert. Only for emergencies."
|
||||
icon_state = "crayonmre"
|
||||
starts_with = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
|
||||
/obj/random/mre/drink,
|
||||
/obj/item/weapon/storage/mrebag/dessert,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mre/random
|
||||
meal_desc = "The menu label is faded out."
|
||||
starts_with = list(
|
||||
/obj/random/mre/main,
|
||||
/obj/item/weapon/storage/mrebag/side,
|
||||
/obj/item/weapon/storage/mrebag/dessert,
|
||||
/obj/item/weapon/storage/fancy/crackers,
|
||||
/obj/random/mre/spread,
|
||||
/obj/random/mre/drink,
|
||||
/obj/random/mre/sauce,
|
||||
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
|
||||
)
|
||||
|
||||
/obj/item/weapon/storage/mrebag
|
||||
name = "main course"
|
||||
desc = "A vacuum-sealed bag containing the MRE's main course. Self-heats when opened."
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "pouch_medium"
|
||||
storage_slots = 1
|
||||
w_class = ITEMSIZE_SMALL
|
||||
max_w_class = ITEMSIZE_SMALL
|
||||
var/opened = FALSE
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/meatpizza/filled)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/Initialize()
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/storage/mrebag/update_icon()
|
||||
if(opened)
|
||||
icon_state = "[initial(icon_state)][opened]"
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/storage/mrebag/attack_self(mob/user)
|
||||
open(user)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/open(mob/user)
|
||||
if(!opened)
|
||||
to_chat(usr, "<span class='notice'>The pouch heats up as you break the vaccum seal.</span>")
|
||||
opened = 1
|
||||
update_icon()
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/storage/mrebag/menu2
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/margherita/filled)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/menu3
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/vegetablepizza/filled)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/menu4
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/monkeyburger)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/menu5
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/taco)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/menu6
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/meatbread/filled)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/menu7
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/tossedsalad)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/menu8
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/hotchili)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/menu9
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/boiledrice)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/menu10
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/meatcube)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/side
|
||||
name = "side dish"
|
||||
desc = "A vacuum-sealed bag containing the MRE's side dish. Self-heats when opened."
|
||||
icon_state = "pouch_small"
|
||||
starts_with = list(/obj/random/mre/side)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/side/menu10
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/meatcube)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/dessert
|
||||
name = "dessert"
|
||||
desc = "A vacuum-sealed bag containing the MRE's dessert."
|
||||
icon_state = "pouch_small"
|
||||
starts_with = list(/obj/random/mre/dessert)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/dessert/menu9
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit)
|
||||
|
||||
/obj/item/weapon/storage/mrebag/dessert/menu11
|
||||
starts_with = list(/obj/item/weapon/pen/crayon/rainbow)
|
||||
@@ -0,0 +1,10 @@
|
||||
/obj/item/weapon/storage/toolbox/lunchbox/survival
|
||||
name = "survival lunchbox"
|
||||
icon = 'icons/obj/storage_vr.dmi'
|
||||
icon_state = "lunchbox_survival"
|
||||
item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi")
|
||||
desc = "A little lunchbox. This one seems to be much sturdier than normal, made of a durable steel!"
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 6
|
||||
|
||||
/obj/item/weapon/storage/toolbox/lunchbox/survival/zaddat
|
||||
starts_with = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 6)
|
||||
@@ -93,6 +93,42 @@
|
||||
O.update()
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/imp_aug
|
||||
name = "boxed augment implant (with injector)"
|
||||
var/case_type = /obj/item/weapon/implantcase/shades
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/imp_aug/Initialize()
|
||||
new /obj/item/weapon/implanter(src)
|
||||
new case_type(src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/imp_aug/taser
|
||||
case_type = /obj/item/weapon/implantcase/taser
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/imp_aug/laser
|
||||
case_type = /obj/item/weapon/implantcase/laser
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/imp_aug/dart
|
||||
case_type = /obj/item/weapon/implantcase/dart
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/imp_aug/toolkit
|
||||
case_type = /obj/item/weapon/implantcase/toolkit
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/imp_aug/medkit
|
||||
case_type = /obj/item/weapon/implantcase/medkit
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/imp_aug/surge
|
||||
case_type = /obj/item/weapon/implantcase/surge
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/imp_aug/analyzer
|
||||
case_type = /obj/item/weapon/implantcase/analyzer
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/imp_aug/sword
|
||||
case_type = /obj/item/weapon/implantcase/sword
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/imp_aug/sprinter
|
||||
case_type = /obj/item/weapon/implantcase/sprinter
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/space
|
||||
name = "boxed space suit and helmet"
|
||||
starts_with = list(
|
||||
|
||||
@@ -35,7 +35,8 @@
|
||||
/obj/item/weapon/tool/screwdriver,
|
||||
/obj/item/weapon/stamp,
|
||||
/obj/item/clothing/accessory/permit,
|
||||
/obj/item/clothing/accessory/badge
|
||||
/obj/item/clothing/accessory/badge,
|
||||
/obj/item/weapon/makeover
|
||||
)
|
||||
cant_hold = list(/obj/item/weapon/tool/screwdriver/power)
|
||||
slot_flags = SLOT_ID
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
sharp = 0
|
||||
edge = 0
|
||||
throwforce = 7
|
||||
flags = NOCONDUCT
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
origin_tech = list(TECH_COMBAT = 2)
|
||||
attack_verb = list("beaten")
|
||||
@@ -18,6 +19,7 @@
|
||||
var/status = 0 //whether the thing is on or not
|
||||
var/obj/item/weapon/cell/bcell = null
|
||||
var/hitcost = 240
|
||||
var/use_external_power = FALSE //only used to determine if it's a cyborg baton
|
||||
|
||||
/obj/item/weapon/melee/baton/New()
|
||||
..()
|
||||
@@ -108,6 +110,8 @@
|
||||
user <<"<span class='warning'>The baton does not have a power source installed.</span>"
|
||||
|
||||
/obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user)
|
||||
if(use_external_power)
|
||||
return
|
||||
if(istype(W, /obj/item/weapon/cell))
|
||||
if(istype(W, /obj/item/weapon/cell/device))
|
||||
if(!bcell)
|
||||
@@ -136,6 +140,11 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/melee/baton/attack_self(mob/user)
|
||||
if(use_external_power)
|
||||
//try to find our power cell
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
if (istype(R))
|
||||
bcell = R.cell
|
||||
if(bcell && bcell.charge > hitcost)
|
||||
status = !status
|
||||
user << "<span class='notice'>[src] is now [status ? "on" : "off"].</span>"
|
||||
@@ -204,16 +213,7 @@
|
||||
//secborg stun baton module
|
||||
/obj/item/weapon/melee/baton/robot
|
||||
hitcost = 500
|
||||
|
||||
/obj/item/weapon/melee/baton/robot/attack_self(mob/user)
|
||||
//try to find our power cell
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
if (istype(R))
|
||||
bcell = R.cell
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/melee/baton/robot/attackby(obj/item/weapon/W, mob/user)
|
||||
return
|
||||
use_external_power = TRUE
|
||||
|
||||
//Makeshift stun baton. Replacement for stun gloves.
|
||||
/obj/item/weapon/melee/baton/cattleprod
|
||||
@@ -274,13 +274,4 @@
|
||||
|
||||
// Borg version, for the lost module.
|
||||
/obj/item/weapon/melee/baton/shocker/robot
|
||||
|
||||
/obj/item/weapon/melee/baton/shocker/robot/attack_self(mob/user)
|
||||
//try to find our power cell
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
if (istype(R))
|
||||
bcell = R.cell
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/melee/baton/shocker/robot/attackby(obj/item/weapon/W, mob/user)
|
||||
return
|
||||
use_external_power = TRUE
|
||||
@@ -128,6 +128,15 @@
|
||||
icon_state = "scalpel_manager_on"
|
||||
force = 7.5
|
||||
|
||||
/obj/item/weapon/surgical/scalpel/ripper
|
||||
name = "organ pincers"
|
||||
desc = "A horrifying bladed tool with a large metal spike in its center. The tool is used for rapidly removing organs from hopefully willing patients."
|
||||
icon_state = "organ_ripper"
|
||||
item_state = "bone_setter"
|
||||
force = 15.0
|
||||
toolspeed = 0.75
|
||||
origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 3, TECH_ILLEGAL = 2)
|
||||
|
||||
/*
|
||||
* Circular Saw
|
||||
*/
|
||||
@@ -147,6 +156,19 @@
|
||||
sharp = 1
|
||||
edge = 1
|
||||
|
||||
/obj/item/weapon/surgical/circular_saw/manager
|
||||
name = "energetic bone diverter"
|
||||
desc = "For heavy duty cutting (and sealing), with science!"
|
||||
icon_state = "adv_saw"
|
||||
item_state = "saw3"
|
||||
hitsound = 'sound/weapons/emitter2.ogg'
|
||||
damtype = SEARING
|
||||
w_class = ITEMSIZE_LARGE
|
||||
origin_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 6)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 12500)
|
||||
attack_verb = list("attacked", "slashed", "seared", "cut")
|
||||
toolspeed = 0.75
|
||||
|
||||
//misc, formerly from code/defines/weapons.dm
|
||||
/obj/item/weapon/surgical/bonegel
|
||||
name = "bone gel"
|
||||
@@ -245,4 +267,4 @@
|
||||
|
||||
/obj/item/weapon/surgical/bone_clamp/alien
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
toolspeed = 0.75
|
||||
toolspeed = 0.75
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
/obj/item/weapon/tool/crowbar/hybrid/is_crowbar()
|
||||
if(prob(10))
|
||||
var/turf/T = get_turf(src)
|
||||
radiation_repository.radiate(get_turf(src), 5)
|
||||
SSradiation.radiate(get_turf(src), 5)
|
||||
T.visible_message("<span class='alien'>\The [src] shudders!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
/obj/item/weapon/tool/screwdriver/hybrid/is_screwdriver()
|
||||
if(prob(10))
|
||||
var/turf/T = get_turf(src)
|
||||
radiation_repository.radiate(get_turf(src), 5)
|
||||
SSradiation.radiate(get_turf(src), 5)
|
||||
T.visible_message("<span class='alien'>\The [src] shudders!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -504,6 +504,14 @@
|
||||
mounted_pack.return_nozzle()
|
||||
to_chat(user, "<span class='notice'>\The [src] retracts to its fueltank.</span>")
|
||||
|
||||
/obj/item/weapon/weldingtool/tubefed/survival
|
||||
name = "tube-fed emergency welding tool"
|
||||
desc = "A bulky, cooler-burning welding tool that draws from a worn welding tank."
|
||||
icon_state = "tubewelder"
|
||||
max_fuel = 5
|
||||
toolspeed = 1.75
|
||||
eye_safety_modifier = 2
|
||||
|
||||
/*
|
||||
* Electric/Arc Welder
|
||||
*/
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
/obj/item/weapon/tool/wirecutters/hybrid/is_wirecutter()
|
||||
if(prob(10))
|
||||
var/turf/T = get_turf(src)
|
||||
radiation_repository.radiate(get_turf(src), 5)
|
||||
SSradiation.radiate(get_turf(src), 5)
|
||||
T.visible_message("<span class='alien'>\The [src] shudders!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
/obj/item/weapon/tool/wrench/hybrid/is_wrench()
|
||||
if(prob(10))
|
||||
var/turf/T = get_turf(src)
|
||||
radiation_repository.radiate(get_turf(src), 5)
|
||||
SSradiation.radiate(get_turf(src), 5)
|
||||
T.visible_message("<span class='alien'>\The [src] shudders!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
origin_tech = list(TECH_MATERIAL = 1)
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 18750)
|
||||
var/deployed = 0
|
||||
var/camo_net = FALSE
|
||||
var/stun_length = 0.25 SECONDS
|
||||
|
||||
/obj/item/weapon/beartrap/suicide_act(mob/user)
|
||||
var/datum/gender/T = gender_datums[user.get_visible_gender()]
|
||||
@@ -98,6 +100,7 @@
|
||||
set_dir(L.dir)
|
||||
can_buckle = 1
|
||||
buckle_mob(L)
|
||||
L.Stun(stun_length)
|
||||
L << "<span class='danger'>The steel jaws of \the [src] bite into you, trapping you in place!</span>"
|
||||
deployed = 0
|
||||
can_buckle = initial(can_buckle)
|
||||
@@ -128,6 +131,21 @@
|
||||
..()
|
||||
|
||||
if(!deployed)
|
||||
if(camo_net)
|
||||
alpha = 255
|
||||
|
||||
icon_state = "beartrap0"
|
||||
else
|
||||
if(camo_net)
|
||||
alpha = 50
|
||||
|
||||
icon_state = "beartrap1"
|
||||
|
||||
/obj/item/weapon/beartrap/hunting
|
||||
name = "hunting trap"
|
||||
desc = "A mechanically activated leg trap. High-tech and reliable. Looks like it could really hurt if you set it off."
|
||||
stun_length = 1 SECOND
|
||||
camo_net = TRUE
|
||||
color = "#C9DCE1"
|
||||
|
||||
origin_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_PHORON = 2, TECH_ARCANE = 1)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
w_class = ITEMSIZE_LARGE
|
||||
var/max_fuel = 350
|
||||
var/obj/item/weapon/nozzle = null //Attached welder, or other spray device.
|
||||
var/nozzle_type = /obj/item/weapon/weldingtool/tubefed
|
||||
var/nozzle_attached = 0
|
||||
|
||||
/obj/item/weapon/weldpack/Initialize()
|
||||
@@ -15,7 +16,7 @@
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
R.add_reagent("fuel", max_fuel)
|
||||
nozzle = new/obj/item/weapon/weldingtool/tubefed(src)
|
||||
nozzle = new nozzle_type(src)
|
||||
nozzle_attached = 1
|
||||
|
||||
/obj/item/weapon/weldpack/Destroy()
|
||||
@@ -145,3 +146,14 @@
|
||||
..(user)
|
||||
user << text("\icon[] [] units of fuel left!", src, src.reagents.total_volume)
|
||||
return
|
||||
|
||||
/obj/item/weapon/weldpack/survival
|
||||
name = "emergency welding kit"
|
||||
desc = "A heavy-duty, portable welding fluid carrier."
|
||||
slot_flags = SLOT_BACK
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "welderpack-e"
|
||||
item_state = "welderpack"
|
||||
w_class = ITEMSIZE_LARGE
|
||||
max_fuel = 100
|
||||
nozzle_type = /obj/item/weapon/weldingtool/tubefed/survival
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
if(destructible)
|
||||
take_damage(Proj.get_structure_damage())
|
||||
|
||||
/obj/structure/mob_spawner/proc/take_damage(var/damage)
|
||||
/obj/structure/mob_spawner/take_damage(var/damage)
|
||||
health -= damage
|
||||
if(health <= 0)
|
||||
visible_message("<span class='warning'>\The [src] breaks apart!</span>")
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
var/unacidable = 0 //universal "unacidabliness" var, here so you can use it in any obj.
|
||||
animate_movement = 2
|
||||
var/throwforce = 1
|
||||
var/catchable = 1 // can it be caught on throws/flying?
|
||||
var/sharp = 0 // whether this object cuts
|
||||
var/edge = 0 // whether this object is more likely to dismember
|
||||
var/pry = 0 //Used in attackby() to open doors
|
||||
@@ -54,7 +55,7 @@
|
||||
CouldNotUseTopic(usr)
|
||||
return 1
|
||||
|
||||
/obj/CanUseTopic(var/mob/user, var/datum/topic_state/state)
|
||||
/obj/CanUseTopic(var/mob/user, var/datum/topic_state/state = default_state)
|
||||
if(user.CanUseObjTopic(src))
|
||||
return ..()
|
||||
to_chat(user, "<span class='danger'>\icon[src]Access Denied!</span>")
|
||||
@@ -172,6 +173,9 @@
|
||||
*/
|
||||
return
|
||||
|
||||
/obj/proc/hear_signlang(mob/M as mob, text, verb, datum/language/speaking) // Saycode gets worse every day.
|
||||
return FALSE
|
||||
|
||||
/obj/proc/see_emote(mob/M as mob, text, var/emote_type)
|
||||
return
|
||||
|
||||
|
||||
@@ -11,7 +11,15 @@
|
||||
. = ..()
|
||||
if (!prob(spawn_nothing_percentage))
|
||||
spawn_item()
|
||||
Random_SafeDestroy(0)
|
||||
|
||||
// This function should, theoretically, guarantee the deletion of the random object. Not all of them destroy themselves for some reason, especially if created through non-standard means.
|
||||
/obj/random/proc/Random_SafeDestroy(var/recursion_level)
|
||||
set waitfor = FALSE
|
||||
sleep(30)
|
||||
qdel(src)
|
||||
if(src && recursion_level < 5)
|
||||
Random_SafeDestroy(recursion_level + 1)
|
||||
|
||||
// this function should return a specific item to spawn
|
||||
/obj/random/proc/item_to_spawn()
|
||||
|
||||
@@ -65,11 +65,31 @@
|
||||
prob(10);/obj/effect/mine/stun,
|
||||
prob(10);/obj/effect/mine/incendiary,)
|
||||
|
||||
/obj/random/humanoidremains
|
||||
name = "Random Humanoid Remains"
|
||||
desc = "This is a random pile of remains."
|
||||
spawn_nothing_percentage = 15
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "remains"
|
||||
|
||||
/obj/random/humanoidremains/item_to_spawn()
|
||||
return pick(prob(30);/obj/effect/decal/remains/human,
|
||||
prob(25);/obj/effect/decal/remains/ribcage,
|
||||
prob(25);/obj/effect/decal/remains/tajaran,
|
||||
prob(10);/obj/effect/decal/remains/unathi,
|
||||
prob(10);/obj/effect/decal/remains/posi
|
||||
)
|
||||
|
||||
/obj/random_multi/single_item/captains_spare_id
|
||||
name = "Multi Point - Captain's Spare"
|
||||
id = "Captain's spare id"
|
||||
item_path = /obj/item/weapon/card/id/gold/captain/spare
|
||||
|
||||
/obj/random_multi/single_item/hand_tele
|
||||
name = "Multi Point - Hand Teleporter"
|
||||
id = "hand tele"
|
||||
item_path = /obj/item/weapon/hand_tele
|
||||
|
||||
/obj/random_multi/single_item/sfr_headset
|
||||
name = "Multi Point - headset"
|
||||
id = "SFR headset"
|
||||
@@ -391,5 +411,54 @@
|
||||
/obj/item/clothing/mask/luchador/rudos,
|
||||
/obj/item/clothing/mask/luchador/tecnicos,
|
||||
/obj/structure/closet/crate
|
||||
),
|
||||
prob(1);list(
|
||||
/obj/machinery/artifact,
|
||||
/obj/structure/anomaly_container
|
||||
),
|
||||
prob(1);list(
|
||||
/obj/random/curseditem,
|
||||
/obj/random/humanoidremains,
|
||||
/obj/structure/closet/crate
|
||||
)
|
||||
)
|
||||
|
||||
/*
|
||||
* Turf swappers.
|
||||
*/
|
||||
|
||||
/obj/random/turf
|
||||
name = "random Sif turf"
|
||||
desc = "This is a random Sif turf."
|
||||
|
||||
spawn_nothing_percentage = 20
|
||||
|
||||
var/override_outdoors = FALSE // Do we override our chosen turf's outdoors?
|
||||
var/turf_outdoors = TRUE // Will our turf be outdoors?
|
||||
|
||||
/obj/random/turf/spawn_item()
|
||||
var/build_path = item_to_spawn()
|
||||
|
||||
var/turf/T1 = get_turf(src)
|
||||
T1.ChangeTurf(build_path, 1, 1, FALSE)
|
||||
|
||||
if(override_outdoors)
|
||||
T1.outdoors = turf_outdoors
|
||||
|
||||
/obj/random/turf/item_to_spawn()
|
||||
return pick(prob(25);/turf/simulated/floor/outdoors/grass/sif,
|
||||
prob(25);/turf/simulated/floor/outdoors/dirt,
|
||||
prob(25);/turf/simulated/floor/outdoors/grass/sif/forest,
|
||||
prob(25);/turf/simulated/floor/outdoors/rocks)
|
||||
|
||||
/obj/random/turf/lava
|
||||
name = "random Lava spawn"
|
||||
desc = "This is a random lava spawn."
|
||||
|
||||
override_outdoors = TRUE
|
||||
turf_outdoors = FALSE
|
||||
|
||||
/obj/random/turf/lava/item_to_spawn()
|
||||
return pick(prob(5);/turf/simulated/floor/lava,
|
||||
prob(3);/turf/simulated/floor/outdoors/rocks/caves,
|
||||
prob(1);/turf/simulated/mineral)
|
||||
|
||||
@@ -519,4 +519,171 @@
|
||||
/obj/effect/decal/cleanable/ash,
|
||||
/obj/item/weapon/cigbutt,
|
||||
/obj/item/weapon/cigbutt/cigarbutt,
|
||||
/obj/effect/decal/remains/mouse)
|
||||
/obj/effect/decal/remains/mouse)
|
||||
|
||||
/obj/random/janusmodule
|
||||
name = "random janus circuit"
|
||||
desc = "A random (possibly broken) Janus module."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "circuit_damaged"
|
||||
|
||||
/obj/random/janusmodule/item_to_spawn()
|
||||
return pick(subtypesof(/obj/item/weapon/circuitboard/mecha/imperion))
|
||||
|
||||
/obj/random/curseditem
|
||||
name = "random cursed item"
|
||||
desc = "For use in dungeons."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "red"
|
||||
|
||||
/obj/random/curseditem/item_to_spawn()
|
||||
var/possible_object_paths = list(/obj/item/weapon/paper/carbon/cursedform)
|
||||
possible_object_paths |= subtypesof(/obj/item/clothing/head/psy_crown)
|
||||
return pick(possible_object_paths)
|
||||
|
||||
//Random MRE stuff
|
||||
|
||||
/obj/random/mre
|
||||
name = "random MRE"
|
||||
desc = "This is a random single MRE."
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "mre"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/item_to_spawn()
|
||||
return pick(/obj/item/weapon/storage/mre,
|
||||
/obj/item/weapon/storage/mre/menu2,
|
||||
/obj/item/weapon/storage/mre/menu3,
|
||||
/obj/item/weapon/storage/mre/menu4,
|
||||
/obj/item/weapon/storage/mre/menu5,
|
||||
/obj/item/weapon/storage/mre/menu6,
|
||||
/obj/item/weapon/storage/mre/menu7,
|
||||
/obj/item/weapon/storage/mre/menu8,
|
||||
/obj/item/weapon/storage/mre/menu9,
|
||||
/obj/item/weapon/storage/mre/menu10)
|
||||
|
||||
|
||||
/obj/random/mre/main
|
||||
name = "random MRE main course"
|
||||
desc = "This is a random main course for MREs."
|
||||
icon_state = "pouch"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/main/item_to_spawn()
|
||||
return pick(/obj/item/weapon/storage/mrebag,
|
||||
/obj/item/weapon/storage/mrebag/menu2,
|
||||
/obj/item/weapon/storage/mrebag/menu3,
|
||||
/obj/item/weapon/storage/mrebag/menu4,
|
||||
/obj/item/weapon/storage/mrebag/menu5,
|
||||
/obj/item/weapon/storage/mrebag/menu6,
|
||||
/obj/item/weapon/storage/mrebag/menu7,
|
||||
/obj/item/weapon/storage/mrebag/menu8)
|
||||
|
||||
/obj/random/mre/side
|
||||
name = "random MRE side dish"
|
||||
desc = "This is a random side dish for MREs."
|
||||
icon_state = "pouch"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/side/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/snacks/tossedsalad,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/boiledrice,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/poppypretzel,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/twobread,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast)
|
||||
|
||||
/obj/random/mre/dessert
|
||||
name = "random MRE dessert"
|
||||
desc = "This is a random dessert for MREs."
|
||||
icon_state = "pouch"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/dessert/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/snacks/candy,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/donut/normal,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cookie)
|
||||
|
||||
/obj/random/mre/dessert/vegan
|
||||
name = "random vegan MRE dessert"
|
||||
desc = "This is a random vegan dessert for MREs."
|
||||
|
||||
/obj/random/mre/dessert/vegan/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/snacks/candy,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit)
|
||||
|
||||
/obj/random/mre/drink
|
||||
name = "random MRE drink"
|
||||
desc = "This is a random drink for MREs."
|
||||
icon_state = "packet"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/drink/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/coffee,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/tea,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/cocoa,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/grape,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/orange,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/watermelon,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/apple)
|
||||
|
||||
/obj/random/mre/spread
|
||||
name = "random MRE spread"
|
||||
desc = "This is a random spread packet for MREs."
|
||||
icon_state = "packet"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/spread/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/honey)
|
||||
|
||||
/obj/random/mre/spread/vegan
|
||||
name = "random vegan MRE spread"
|
||||
desc = "This is a random vegan spread packet for MREs"
|
||||
|
||||
/obj/random/mre/spread/vegan/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly)
|
||||
|
||||
/obj/random/mre/sauce
|
||||
name = "random MRE sauce"
|
||||
desc = "This is a random sauce packet for MREs."
|
||||
icon_state = "packet"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/sauce/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/soy)
|
||||
|
||||
/obj/random/mre/sauce/vegan/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/soy)
|
||||
|
||||
/obj/random/mre/sauce/sugarfree/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/soy)
|
||||
|
||||
/obj/random/mre/sauce/crayon/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/generic,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/red,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/orange,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/yellow,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/green,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/blue,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/purple,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/grey,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/brown)
|
||||
|
||||
@@ -229,3 +229,6 @@
|
||||
prob(50);/obj/random/soap,
|
||||
prob(60);/obj/random/drinkbottle,
|
||||
prob(500);/obj/random/maintenance/clean)
|
||||
|
||||
/obj/random/action_figure/supplypack
|
||||
drop_get_turf = FALSE
|
||||
@@ -104,7 +104,7 @@
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/structure/catwalk/proc/take_damage(amount)
|
||||
/obj/structure/catwalk/take_damage(amount)
|
||||
health -= amount
|
||||
if(health <= 0)
|
||||
visible_message("<span class='warning'>\The [src] breaks down!</span>")
|
||||
|
||||
@@ -385,7 +385,7 @@
|
||||
if(!opened)
|
||||
icon_state = icon_closed
|
||||
if(sealed)
|
||||
overlays += "sealed"
|
||||
overlays += "welded"
|
||||
else
|
||||
icon_state = icon_opened
|
||||
|
||||
@@ -468,3 +468,10 @@
|
||||
if(istype(src.loc, /obj/structure/closet))
|
||||
return (loc.return_air_for_internal_lifeform(L))
|
||||
return return_air()
|
||||
|
||||
/obj/structure/closet/take_damage(var/damage)
|
||||
if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD)
|
||||
return
|
||||
dump_contents()
|
||||
spawn(1) qdel(src)
|
||||
return 1
|
||||
@@ -0,0 +1,3 @@
|
||||
/obj/structure/closet/secure_closet/miner/Initialize()
|
||||
starts_with += /obj/item/device/gps/mining
|
||||
return ..()
|
||||
@@ -11,6 +11,8 @@
|
||||
starts_with = list(
|
||||
/obj/item/clothing/accessory/storage/brown_vest,
|
||||
/obj/item/blueprints,
|
||||
///obj/item/clamp, //VOREStation Removal: without leaks those are pointless,
|
||||
///obj/item/clamp, //VOREStation Removal: without leaks those are pointless,
|
||||
/obj/item/clothing/under/rank/chief_engineer,
|
||||
/obj/item/clothing/under/rank/chief_engineer/skirt,
|
||||
/obj/item/clothing/head/hardhat/white,
|
||||
@@ -95,6 +97,7 @@
|
||||
/obj/item/clothing/glasses/meson,
|
||||
/obj/item/weapon/cartridge/engineering,
|
||||
/obj/item/taperoll/engineering,
|
||||
/obj/item/clothing/head/hardhat,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering,
|
||||
/obj/item/clothing/shoes/boots/winter/engineering,
|
||||
/obj/item/weapon/tank/emergency/oxygen/engi,
|
||||
@@ -123,8 +126,10 @@
|
||||
starts_with = list(
|
||||
/obj/item/clothing/accessory/storage/brown_vest,
|
||||
/obj/item/clothing/suit/fire/firefighter,
|
||||
/obj/item/clothing/head/hardhat/red,
|
||||
/obj/item/device/flashlight,
|
||||
/obj/item/weapon/extinguisher,
|
||||
///obj/item/clamp, //VOREStation Removal: without leaks those are pointless,
|
||||
/obj/item/device/radio/headset/headset_eng,
|
||||
/obj/item/device/radio/headset/headset_eng/alt,
|
||||
/obj/item/clothing/suit/storage/hazardvest,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user