Merge branch 'master' of https://github.com/VOREStation/VOREStation into making-of-shadekin

This commit is contained in:
Heroman3003
2019-10-29 09:33:48 +10:00
1698 changed files with 269984 additions and 473924 deletions
+37
View File
@@ -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)
+36
View File
@@ -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
View File
@@ -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
+102
View File
@@ -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 -20
View File
@@ -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
+36 -26
View File
@@ -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" = "&degC", "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
+8 -7
View File
@@ -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 = "&#8594;", comma_text = "&#8594;", final_comma_text = "&#8594;") // 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" = "&degC", "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
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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>")
+1 -1
View File
@@ -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()
+29 -8
View File
@@ -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')
+21 -26
View File
@@ -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)
+37 -3
View File
@@ -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]&deg;C ([M.bodytemperature*1.8-459.67]&deg;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)
+7 -1
View File
@@ -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."
+2 -2
View File
@@ -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
+82 -2
View File
@@ -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"
+7 -4
View File
@@ -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
+20 -1
View File
@@ -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
+7 -1
View File
@@ -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
+8
View File
@@ -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"
+3 -3
View File
@@ -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"
+23 -1
View File
@@ -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&trade;"
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()
+30 -1
View File
@@ -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)
+17 -9
View File
@@ -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
+134 -59
View File
@@ -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
*/
+1
View File
@@ -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
+11 -20
View File
@@ -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
+18
View File
@@ -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
+1 -1
View File
@@ -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>")
+5 -1
View File
@@ -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
+8
View File
@@ -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()
+69
View File
@@ -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)
+168 -1
View File
@@ -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)
+3
View File
@@ -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
+1 -1
View File
@@ -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