mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-20 11:35:19 +01:00
Merge remote-tracking branch 'VOREStation/master' into medbeam
This commit is contained in:
@@ -64,6 +64,19 @@
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/resin/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
|
||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
user.do_attack_animation(src)
|
||||
health -= damage
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/resin/take_damage(var/damage)
|
||||
health -= damage
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/resin/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
@@ -246,6 +259,18 @@ Alien plants should do something if theres a lot of poison
|
||||
health -= damage
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/alien/weeds/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
|
||||
user.do_attack_animation(src)
|
||||
health -= damage
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/weeds/take_damage(var/damage)
|
||||
health -= damage
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/weeds/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
qdel(src)
|
||||
@@ -401,6 +426,18 @@ Alien plants should do something if theres a lot of poison
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/egg/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
|
||||
user.do_attack_animation(src)
|
||||
health -= damage
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/alien/egg/take_damage(var/damage)
|
||||
health -= damage
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
|
||||
/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
if(health <= 0)
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Home of the floor chemical coating.
|
||||
*/
|
||||
|
||||
/obj/effect/decal/cleanable/chemcoating
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "dirt"
|
||||
|
||||
/obj/effect/decal/cleanable/chemcoating/New()
|
||||
..()
|
||||
create_reagents(100)
|
||||
|
||||
/obj/effect/decal/cleanable/chemcoating/Initialize()
|
||||
..()
|
||||
var/turf/T = get_turf(src)
|
||||
if(T)
|
||||
for(var/obj/O in get_turf(src))
|
||||
if(O == src)
|
||||
continue
|
||||
if(istype(O, /obj/effect/decal/cleanable/chemcoating))
|
||||
var/obj/effect/decal/cleanable/chemcoating/C = O
|
||||
if(C.reagents && C.reagents.reagent_list.len)
|
||||
C.reagents.trans_to_obj(src,C.reagents.total_volume)
|
||||
qdel(O)
|
||||
|
||||
/obj/effect/decal/cleanable/chemcoating/Bumped(A as mob|obj)
|
||||
if(reagents)
|
||||
reagents.touch(A)
|
||||
return ..()
|
||||
|
||||
/obj/effect/decal/cleanable/chemcoating/Crossed(AM as mob|obj)
|
||||
Bumped(AM)
|
||||
|
||||
/obj/effect/decal/cleanable/chemcoating/update_icon()
|
||||
..()
|
||||
color = reagents.get_color()
|
||||
@@ -53,7 +53,7 @@ var/global/list/image/splatter_cache=list()
|
||||
blood_DNA |= B.blood_DNA.Copy()
|
||||
qdel(B)
|
||||
drytime = world.time + DRYING_TIME * (amount+1)
|
||||
START_PROCESSING(SSobj, src)
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/effect/decal/cleanable/blood/process()
|
||||
if(world.time > drytime)
|
||||
@@ -93,7 +93,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()
|
||||
|
||||
@@ -408,6 +408,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)
|
||||
|
||||
@@ -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]")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
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)
|
||||
..()
|
||||
@@ -26,6 +27,7 @@
|
||||
//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
|
||||
|
||||
@@ -54,6 +56,9 @@
|
||||
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)
|
||||
@@ -78,9 +83,16 @@
|
||||
to_chat(user,"<span class='notice'>You are not able to ring [src].</span>")
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/deskbell/attackby(obj/item/i, mob/user, params)
|
||||
if(!istype(i))
|
||||
/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)
|
||||
|
||||
|
||||
@@ -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()
|
||||
@@ -1544,3 +1520,37 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
/obj/item/device/pda/emp_act(severity)
|
||||
for(var/atom/A in src)
|
||||
A.emp_act(severity)
|
||||
|
||||
/obj/item/device/pda/proc/analyze_air()
|
||||
var/list/results = list()
|
||||
var/turf/T = get_turf(src.loc)
|
||||
if(!isnull(T))
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
var/pressure = environment.return_pressure()
|
||||
var/total_moles = environment.total_moles
|
||||
if (total_moles)
|
||||
var/o2_level = environment.gas["oxygen"]/total_moles
|
||||
var/n2_level = environment.gas["nitrogen"]/total_moles
|
||||
var/co2_level = environment.gas["carbon_dioxide"]/total_moles
|
||||
var/phoron_level = environment.gas["phoron"]/total_moles
|
||||
var/unknown_level = 1-(o2_level+n2_level+co2_level+phoron_level)
|
||||
|
||||
// entry is what the element is describing
|
||||
// Type identifies which unit or other special characters to use
|
||||
// Val is the information reported
|
||||
// Bad_high/_low are the values outside of which the entry reports as dangerous
|
||||
// Poor_high/_low are the values outside of which the entry reports as unideal
|
||||
// Values were extracted from the template itself
|
||||
results = list(
|
||||
list("entry" = "Pressure", "units" = "kPa", "val" = "[round(pressure,0.1)]", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80),
|
||||
list("entry" = "Temperature", "units" = "°C", "val" = "[round(environment.temperature-T0C,0.1)]", "bad_high" = 35, "poor_high" = 25, "poor_low" = 15, "bad_low" = 5),
|
||||
list("entry" = "Oxygen", "units" = "kPa", "val" = "[round(o2_level*100,0.1)]", "bad_high" = 140, "poor_high" = 135, "poor_low" = 19, "bad_low" = 17),
|
||||
list("entry" = "Nitrogen", "units" = "kPa", "val" = "[round(n2_level*100,0.1)]", "bad_high" = 105, "poor_high" = 85, "poor_low" = 50, "bad_low" = 40),
|
||||
list("entry" = "Carbon Dioxide", "units" = "kPa", "val" = "[round(co2_level*100,0.1)]", "bad_high" = 10, "poor_high" = 5, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Phoron", "units" = "kPa", "val" = "[round(phoron_level*100,0.01)]", "bad_high" = 0.5, "poor_high" = 0, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Other", "units" = "kPa", "val" = "[round(unknown_level, 0.01)]", "bad_high" = 1, "poor_high" = 0.5, "poor_low" = 0, "bad_low" = 0)
|
||||
)
|
||||
|
||||
if(isnull(results))
|
||||
results = list(list("entry" = "pressure", "units" = "kPa", "val" = "0", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80))
|
||||
return results
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
data["flashlight"] = fon
|
||||
data["manifest"] = PDA_Manifest
|
||||
data["feeds"] = compile_news()
|
||||
data["latest_news"] = get_recent_news()
|
||||
//data["latest_news"] = get_recent_news() //VOREStation Edit, bandaid for catastrophic runtime lag in helper.dm
|
||||
if(cartridge) // If there's a cartridge, we need to grab the information from it
|
||||
data["cart_devices"] = cartridge.get_device_status()
|
||||
data["cart_templates"] = cartridge.ui_templates
|
||||
|
||||
@@ -19,17 +19,17 @@
|
||||
// Poor_high/_low are the values outside of which the entry reports as unideal
|
||||
// Values were extracted from the template itself
|
||||
results = list(
|
||||
list("entry" = "Pressure", "type" = "pressure", "val" = "[round(pressure,0.1)]", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80),
|
||||
list("entry" = "Temperature", "type" = "temp", "val" = "[round(environment.temperature-T0C,0.1)]", "bad_high" = 35, "poor_high" = 25, "poor_low" = 15, "bad_low" = 5),
|
||||
list("entry" = "Oxygen", "type" = "pressure", "val" = "[round(o2_level*100,0.1)]", "bad_high" = 140, "poor_high" = 135, "poor_low" = 19, "bad_low" = 17),
|
||||
list("entry" = "Nitrogen", "type" = "pressure", "val" = "[round(n2_level*100,0.1)]", "bad_high" = 105, "poor_high" = 85, "poor_low" = 50, "bad_low" = 40),
|
||||
list("entry" = "Carbon Dioxide", "type" = "pressure", "val" = "[round(co2_level*100,0.1)]", "bad_high" = 10, "poor_high" = 5, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Phoron", "type" = "pressure", "val" = "[round(phoron_level*100,0.01)]", "bad_high" = 0.5, "poor_high" = 0, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Other", "type" = "pressure", "val" = "[round(unknown_level, 0.01)]", "bad_high" = 1, "poor_high" = 0.5, "poor_low" = 0, "bad_low" = 0)
|
||||
list("entry" = "Pressure", "units" = "kPa", "val" = "[round(pressure,0.1)]", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80),
|
||||
list("entry" = "Temperature", "units" = "°C", "val" = "[round(environment.temperature-T0C,0.1)]", "bad_high" = 35, "poor_high" = 25, "poor_low" = 15, "bad_low" = 5),
|
||||
list("entry" = "Oxygen", "units" = "kPa", "val" = "[round(o2_level*100,0.1)]", "bad_high" = 140, "poor_high" = 135, "poor_low" = 19, "bad_low" = 17),
|
||||
list("entry" = "Nitrogen", "units" = "kPa", "val" = "[round(n2_level*100,0.1)]", "bad_high" = 105, "poor_high" = 85, "poor_low" = 50, "bad_low" = 40),
|
||||
list("entry" = "Carbon Dioxide", "units" = "kPa", "val" = "[round(co2_level*100,0.1)]", "bad_high" = 10, "poor_high" = 5, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Phoron", "units" = "kPa", "val" = "[round(phoron_level*100,0.01)]", "bad_high" = 0.5, "poor_high" = 0, "poor_low" = 0, "bad_low" = 0),
|
||||
list("entry" = "Other", "units" = "kPa", "val" = "[round(unknown_level, 0.01)]", "bad_high" = 1, "poor_high" = 0.5, "poor_low" = 0, "bad_low" = 0)
|
||||
)
|
||||
|
||||
if(isnull(results))
|
||||
results = list(list("entry" = "pressure", "val" = "0"))
|
||||
results = list(list("entry" = "pressure", "units" = "kPa", "val" = "0", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80))
|
||||
return results
|
||||
|
||||
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -526,9 +526,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
|
||||
|
||||
@@ -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)
|
||||
@@ -114,7 +114,7 @@
|
||||
if(ismob(handset.loc))
|
||||
var/mob/M = handset.loc
|
||||
if(M.drop_from_inventory(handset, src))
|
||||
to_chat(user, "<span class='notice'>\The [handset] snap back into the main unit.</span>")
|
||||
to_chat(user, "<span class='notice'>\The [handset] snaps back into the main unit.</span>")
|
||||
else
|
||||
handset.forceMove(src)
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#define DEFIB_TIME_LIMIT (10 MINUTES) //VOREStation addition- past this many seconds, defib is useless.
|
||||
/*
|
||||
CONTAINS:
|
||||
T-RAY
|
||||
@@ -54,6 +55,8 @@ HALOGEN COUNTER - Radcount on mobs
|
||||
if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey")
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
|
||||
flick("[icon_state]-scan", src) //makes it so that it plays the scan animation on a succesful scan
|
||||
user.visible_message("<span class='notice'>[user] has analyzed [M]'s vitals.</span>","<span class='notice'>You have analyzed [M]'s vitals.</span>")
|
||||
|
||||
if (!ishuman(M) || M.isSynthetic())
|
||||
@@ -81,8 +84,13 @@ HALOGEN COUNTER - Radcount on mobs
|
||||
dat += "\tKey: <font color='cyan'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font><br>"
|
||||
dat += "\tDamage Specifics: <font color='cyan'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font><br>"
|
||||
dat += "Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)</span><br>"
|
||||
if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH)))
|
||||
dat += "<span class='notice'>Time of Death: [M.tod]</span><br>"
|
||||
//VOREStation edit/addition starts
|
||||
if(M.timeofdeath && (M.stat == DEAD || (M.status_flags & FAKEDEATH)))
|
||||
dat += "<span class='notice'>Time of Death: [worldtime2stationtime(M.timeofdeath)]</span><br>"
|
||||
var/tdelta = round(world.time - M.timeofdeath)
|
||||
if(tdelta < (DEFIB_TIME_LIMIT * 10))
|
||||
dat += "<span class='notice'><b>Subject died [DisplayTimeText(tdelta)] ago - resuscitation may be possible!</b></span><br>"
|
||||
//VOREStation edit/addition ends
|
||||
if(istype(M, /mob/living/carbon/human) && mode == 1)
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/list/damaged = H.get_damaged_organs(1,1)
|
||||
@@ -501,3 +509,5 @@ HALOGEN COUNTER - Radcount on mobs
|
||||
else
|
||||
to_chat(user, "<span class='notice'>No radiation detected.</span>")
|
||||
return
|
||||
|
||||
#undef DEFIB_TIME_LIMIT //VOREStation addition
|
||||
@@ -220,6 +220,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,6 +267,7 @@
|
||||
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"
|
||||
|
||||
@@ -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"
|
||||
@@ -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
|
||||
@@ -76,6 +76,10 @@
|
||||
name = "\improper \"LiquidFood\" ration"
|
||||
icon_state = "liquidfood"
|
||||
|
||||
/obj/item/trash/liquidprotein
|
||||
name = "\improper \"LiquidProtein\" ration"
|
||||
icon_state = "liquidprotein"
|
||||
|
||||
/obj/item/trash/tastybread
|
||||
name = "bread tube"
|
||||
icon_state = "tastybread"
|
||||
|
||||
@@ -26,11 +26,6 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/trash/liquidprotein
|
||||
name = "\improper \"LiquidProtein\" ration"
|
||||
icon = 'icons/obj/trash_vr.dmi'
|
||||
icon_state = "liquidprotein"
|
||||
|
||||
/obj/item/trash/fancyplate
|
||||
name = "dirty fancy plate"
|
||||
icon = 'icons/obj/trash_vr.dmi'
|
||||
|
||||
@@ -191,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
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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,58 @@
|
||||
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
|
||||
var/gloves_are_heavy = 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/h_gloves = list(/obj/item/clothing/gloves/captain, /obj/item/clothing/gloves/cyborg,
|
||||
/obj/item/clothing/gloves/swat, /obj/item/clothing/gloves/combat,
|
||||
/obj/item/clothing/gloves/botanic_leather, /obj/item/clothing/gloves/duty,
|
||||
/obj/item/clothing/gloves/tactical, /obj/item/clothing/gloves/vox,
|
||||
/obj/item/clothing/gloves/gauntlets)
|
||||
|
||||
if(istype(user.l_hand, src))
|
||||
active_hand = BP_L_HAND
|
||||
else
|
||||
active_hand = BP_R_HAND
|
||||
|
||||
if(prob(75))
|
||||
will_break = TRUE
|
||||
else
|
||||
will_break = FALSE
|
||||
|
||||
if(user.gloves && (user.gloves.body_parts_covered & HANDS))
|
||||
var/obj/item/clothing/gloves/UG = user.gloves.type
|
||||
for(var/I in h_gloves)
|
||||
if(UG == I)
|
||||
gloves_are_heavy = TRUE
|
||||
if(will_break)
|
||||
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)
|
||||
|
||||
if(gloves_are_heavy == FALSE)
|
||||
to_chat(user, "<span class='warning'>\The [src] partially cuts into your hand through your gloves as you hit \the [target]!</span>")
|
||||
if(will_break)
|
||||
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>")
|
||||
user.apply_damage(light_glove_d + break_damage, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge)
|
||||
playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
|
||||
qdel(src)
|
||||
else
|
||||
user.apply_damage(light_glove_d, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>\The [src] cuts into your hand as you hit \the [target]!</span>")
|
||||
if(will_break)
|
||||
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>")
|
||||
user.apply_damage(no_glove_d + break_damage, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge)
|
||||
playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
|
||||
qdel(src)
|
||||
else
|
||||
user.apply_damage(no_glove_d, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge)
|
||||
|
||||
/obj/item/weapon/material/shard/Crossed(AM as mob|obj)
|
||||
..()
|
||||
if(isliving(AM))
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
@@ -274,64 +351,7 @@
|
||||
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()
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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//
|
||||
////////////
|
||||
|
||||
@@ -160,6 +160,12 @@
|
||||
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
|
||||
*/
|
||||
|
||||
@@ -12,51 +12,61 @@
|
||||
name = "bottle of Rezadone pills"
|
||||
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 = "bottle of Peridaxon pills"
|
||||
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 = "bottle of Carthatoline pills"
|
||||
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 = "bottle of Alkysine pills"
|
||||
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 = "bottle of Imidazoline pills"
|
||||
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 = "bottle of Osteodaxon pills"
|
||||
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 = "bottle of Myelamine pills"
|
||||
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 = "bottle of Hyronalin pills"
|
||||
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 = "bottle of Arithrazine pills"
|
||||
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 = "bottle of Corophizine pills"
|
||||
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 = "bottle of Healing nanites capsules"
|
||||
|
||||
@@ -0,0 +1,276 @@
|
||||
/*
|
||||
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/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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
@@ -122,6 +125,21 @@
|
||||
..()
|
||||
|
||||
if(!deployed)
|
||||
if(camo_net)
|
||||
alpha = 255
|
||||
|
||||
icon_state = "beartrap0"
|
||||
else
|
||||
if(camo_net)
|
||||
alpha = 50
|
||||
|
||||
icon_state = "beartrap1"
|
||||
|
||||
/obj/item/weapon/beartrap/hunting
|
||||
name = "hunting trap"
|
||||
desc = "A mechanically activated leg trap. High-tech and reliable. Looks like it could really hurt if you set it off."
|
||||
stun_length = 1 SECOND
|
||||
camo_net = TRUE
|
||||
color = "#C9DCE1"
|
||||
|
||||
origin_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_PHORON = 2, TECH_ARCANE = 1)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
w_class = ITEMSIZE_LARGE
|
||||
var/max_fuel = 350
|
||||
var/obj/item/weapon/nozzle = null //Attached welder, or other spray device.
|
||||
var/nozzle_type = /obj/item/weapon/weldingtool/tubefed
|
||||
var/nozzle_attached = 0
|
||||
|
||||
/obj/item/weapon/weldpack/Initialize()
|
||||
@@ -15,7 +16,7 @@
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
R.add_reagent("fuel", max_fuel)
|
||||
nozzle = new/obj/item/weapon/weldingtool/tubefed(src)
|
||||
nozzle = new nozzle_type(src)
|
||||
nozzle_attached = 1
|
||||
|
||||
/obj/item/weapon/weldpack/Destroy()
|
||||
@@ -145,3 +146,14 @@
|
||||
..(user)
|
||||
user << text("\icon[] [] units of fuel left!", src, src.reagents.total_volume)
|
||||
return
|
||||
|
||||
/obj/item/weapon/weldpack/survival
|
||||
name = "emergency welding kit"
|
||||
desc = "A heavy-duty, portable welding fluid carrier."
|
||||
slot_flags = SLOT_BACK
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "welderpack-e"
|
||||
item_state = "welderpack"
|
||||
w_class = ITEMSIZE_LARGE
|
||||
max_fuel = 100
|
||||
nozzle_type = /obj/item/weapon/weldingtool/tubefed/survival
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
if(destructible)
|
||||
take_damage(Proj.get_structure_damage())
|
||||
|
||||
/obj/structure/mob_spawner/proc/take_damage(var/damage)
|
||||
/obj/structure/mob_spawner/take_damage(var/damage)
|
||||
health -= damage
|
||||
if(health <= 0)
|
||||
visible_message("<span class='warning'>\The [src] breaks apart!</span>")
|
||||
|
||||
@@ -173,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
|
||||
|
||||
|
||||
@@ -65,6 +65,21 @@
|
||||
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"
|
||||
@@ -396,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)
|
||||
|
||||
@@ -530,3 +530,161 @@
|
||||
|
||||
/obj/random/janusmodule/item_to_spawn()
|
||||
return pick(subtypesof(/obj/item/weapon/circuitboard/mecha/imperion))
|
||||
|
||||
/obj/random/curseditem
|
||||
name = "random cursed item"
|
||||
desc = "For use in dungeons."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "red"
|
||||
|
||||
/obj/random/curseditem/item_to_spawn()
|
||||
var/possible_object_paths = list(/obj/item/weapon/paper/carbon/cursedform)
|
||||
possible_object_paths |= subtypesof(/obj/item/clothing/head/psy_crown)
|
||||
return pick(possible_object_paths)
|
||||
|
||||
//Random MRE stuff
|
||||
|
||||
/obj/random/mre
|
||||
name = "random MRE"
|
||||
desc = "This is a random single MRE."
|
||||
icon = 'icons/obj/food.dmi'
|
||||
icon_state = "mre"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/item_to_spawn()
|
||||
return pick(/obj/item/weapon/storage/mre,
|
||||
/obj/item/weapon/storage/mre/menu2,
|
||||
/obj/item/weapon/storage/mre/menu3,
|
||||
/obj/item/weapon/storage/mre/menu4,
|
||||
/obj/item/weapon/storage/mre/menu5,
|
||||
/obj/item/weapon/storage/mre/menu6,
|
||||
/obj/item/weapon/storage/mre/menu7,
|
||||
/obj/item/weapon/storage/mre/menu8,
|
||||
/obj/item/weapon/storage/mre/menu9,
|
||||
/obj/item/weapon/storage/mre/menu10)
|
||||
|
||||
|
||||
/obj/random/mre/main
|
||||
name = "random MRE main course"
|
||||
desc = "This is a random main course for MREs."
|
||||
icon_state = "pouch"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/main/item_to_spawn()
|
||||
return pick(/obj/item/weapon/storage/mrebag,
|
||||
/obj/item/weapon/storage/mrebag/menu2,
|
||||
/obj/item/weapon/storage/mrebag/menu3,
|
||||
/obj/item/weapon/storage/mrebag/menu4,
|
||||
/obj/item/weapon/storage/mrebag/menu5,
|
||||
/obj/item/weapon/storage/mrebag/menu6,
|
||||
/obj/item/weapon/storage/mrebag/menu7,
|
||||
/obj/item/weapon/storage/mrebag/menu8)
|
||||
|
||||
/obj/random/mre/side
|
||||
name = "random MRE side dish"
|
||||
desc = "This is a random side dish for MREs."
|
||||
icon_state = "pouch"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/side/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/snacks/tossedsalad,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/boiledrice,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/poppypretzel,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/twobread,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast)
|
||||
|
||||
/obj/random/mre/dessert
|
||||
name = "random MRE dessert"
|
||||
desc = "This is a random dessert for MREs."
|
||||
icon_state = "pouch"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/dessert/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/snacks/candy,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/donut/normal,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cookie)
|
||||
|
||||
/obj/random/mre/dessert/vegan
|
||||
name = "random vegan MRE dessert"
|
||||
desc = "This is a random vegan dessert for MREs."
|
||||
|
||||
/obj/random/mre/dessert/vegan/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/snacks/candy,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit)
|
||||
|
||||
/obj/random/mre/drink
|
||||
name = "random MRE drink"
|
||||
desc = "This is a random drink for MREs."
|
||||
icon_state = "packet"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/drink/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/coffee,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/tea,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/cocoa,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/grape,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/orange,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/watermelon,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/apple)
|
||||
|
||||
/obj/random/mre/spread
|
||||
name = "random MRE spread"
|
||||
desc = "This is a random spread packet for MREs."
|
||||
icon_state = "packet"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/spread/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/honey)
|
||||
|
||||
/obj/random/mre/spread/vegan
|
||||
name = "random vegan MRE spread"
|
||||
desc = "This is a random vegan spread packet for MREs"
|
||||
|
||||
/obj/random/mre/spread/vegan/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly)
|
||||
|
||||
/obj/random/mre/sauce
|
||||
name = "random MRE sauce"
|
||||
desc = "This is a random sauce packet for MREs."
|
||||
icon_state = "packet"
|
||||
drop_get_turf = FALSE
|
||||
|
||||
/obj/random/mre/sauce/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/soy)
|
||||
|
||||
/obj/random/mre/sauce/vegan/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/soy)
|
||||
|
||||
/obj/random/mre/sauce/sugarfree/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/soy)
|
||||
|
||||
/obj/random/mre/sauce/crayon/item_to_spawn()
|
||||
return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/generic,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/red,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/orange,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/yellow,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/green,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/blue,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/purple,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/grey,
|
||||
/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/brown)
|
||||
|
||||
@@ -229,3 +229,6 @@
|
||||
prob(50);/obj/random/soap,
|
||||
prob(60);/obj/random/drinkbottle,
|
||||
prob(500);/obj/random/maintenance/clean)
|
||||
|
||||
/obj/random/action_figure/supplypack
|
||||
drop_get_turf = FALSE
|
||||
@@ -98,7 +98,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>")
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
/obj/structure/closet/secure_closet/paramedic/Initialize()
|
||||
starts_with += /obj/item/device/gps/medical
|
||||
return ..()
|
||||
@@ -302,7 +302,7 @@ GLOBAL_LIST_BOILERPLATE(all_brig_closets, /obj/structure/closet/secure_closet/br
|
||||
var/id = null
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/color/orange,
|
||||
/obj/item/clothing/under/color/orange/prison,
|
||||
/obj/item/clothing/shoes/orange)
|
||||
|
||||
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
icon_closed = "orange"
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/under/color/orange = 3,
|
||||
/obj/item/clothing/under/color/orange/prison = 3,
|
||||
/obj/item/clothing/shoes/orange = 3)
|
||||
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/obj/structure/closet/crate
|
||||
name = "crate"
|
||||
desc = "A rectangular steel crate."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon = 'icons/obj/storage_vr.dmi' //VOREStation edit
|
||||
icon_state = "crate"
|
||||
icon_opened = "crateopen"
|
||||
icon_closed = "crate"
|
||||
@@ -293,6 +293,9 @@
|
||||
|
||||
/obj/structure/closet/crate/solar
|
||||
name = "solar pack crate"
|
||||
icon_state = "engi_crate" //VOREStation Edit
|
||||
icon_opened = "engi_crateopen" //VOREStation Edit
|
||||
icon_closed = "engi_crate" //VOREStation Edit
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/solar_assembly = 21,
|
||||
@@ -343,12 +346,13 @@
|
||||
desc = "A crate of emergency rations."
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 4)
|
||||
/obj/random/mre = 6)
|
||||
|
||||
|
||||
/obj/structure/closet/crate/bin
|
||||
name = "large bin"
|
||||
desc = "A large bin."
|
||||
icon = 'icons/obj/storage.dmi' //VOREStation edit
|
||||
icon_state = "largebin"
|
||||
icon_opened = "largebinopen"
|
||||
icon_closed = "largebin"
|
||||
@@ -417,6 +421,7 @@
|
||||
/obj/structure/closet/crate/secure/bin
|
||||
name = "secure bin"
|
||||
desc = "A secure bin."
|
||||
icon = 'icons/obj/storage.dmi' //VOREStation edit
|
||||
icon_state = "largebins"
|
||||
icon_opened = "largebinsopen"
|
||||
icon_closed = "largebins"
|
||||
@@ -429,7 +434,7 @@
|
||||
/obj/structure/closet/crate/large
|
||||
name = "large crate"
|
||||
desc = "A hefty metal crate."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit
|
||||
icon_state = "largemetal"
|
||||
icon_opened = "largemetalopen"
|
||||
icon_closed = "largemetal"
|
||||
@@ -457,10 +462,10 @@
|
||||
/obj/structure/closet/crate/secure/large
|
||||
name = "large crate"
|
||||
desc = "A hefty metal crate with an electronic locking system."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "largemetal"
|
||||
icon_opened = "largemetalopen"
|
||||
icon_closed = "largemetal"
|
||||
icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit
|
||||
icon_state = "largemetalsecure" //VOREStation Edit
|
||||
icon_opened = "largemetalsecureopen" //VOREStation Edit
|
||||
icon_closed = "largemetalsecure" //VOREStation Edit
|
||||
redlight = "largemetalr"
|
||||
greenlight = "largemetalg"
|
||||
|
||||
|
||||
@@ -31,4 +31,9 @@
|
||||
|
||||
..()
|
||||
|
||||
return
|
||||
return
|
||||
|
||||
/obj/structure/closet/crate/medical/blood
|
||||
icon_state = "blood"
|
||||
icon_opened = "bloodopen"
|
||||
icon_closed = "blood"
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/structure/largecrate
|
||||
name = "large crate"
|
||||
desc = "A hefty wooden crate."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit
|
||||
icon_state = "densecrate"
|
||||
density = 1
|
||||
var/list/starts_with
|
||||
@@ -82,10 +82,11 @@
|
||||
starts_with = list(/obj/structure/vehiclecage/quadtrailer)
|
||||
|
||||
/obj/structure/largecrate/animal
|
||||
icon_state = "mulecrate"
|
||||
icon_state = "lisacrate" //VOREStation Edit
|
||||
|
||||
/obj/structure/largecrate/animal/mulebot
|
||||
name = "Mulebot crate"
|
||||
icon_state = "mulecrate" //VOREStation Edit
|
||||
starts_with = list(/mob/living/bot/mulebot)
|
||||
|
||||
/obj/structure/largecrate/animal/corgi
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
/mob/living/simple_mob/animal/wolf,
|
||||
/mob/living/simple_mob/animal/space/bear;0.5,
|
||||
/mob/living/simple_mob/animal/space/carp,
|
||||
/mob/living/simple_mob/animal/space/mimic,
|
||||
/mob/living/simple_mob/vore/aggressive/mimic,
|
||||
/mob/living/simple_mob/vore/aggressive/rat,
|
||||
/mob/living/simple_mob/vore/aggressive/rat/tame,
|
||||
// /mob/living/simple_mob/otie;0.5
|
||||
|
||||
@@ -1,14 +1,82 @@
|
||||
|
||||
/obj/structure/flora
|
||||
name = "flora"
|
||||
desc = "A perfectly generic plant."
|
||||
|
||||
anchored = TRUE // Usually, plants don't move. Usually.
|
||||
plane = DECAL_PLANE
|
||||
layer = BELOW_MOB_LAYER
|
||||
|
||||
var/randomize_size = FALSE
|
||||
var/max_x_scale = 1.25
|
||||
var/max_y_scale = 1.25
|
||||
var/min_x_scale = 0.9
|
||||
var/min_y_scale = 0.9
|
||||
|
||||
var/harvest_tool = null // The type of item used to harvest the plant.
|
||||
var/harvest_count = 0
|
||||
|
||||
var/randomize_harvest_count = TRUE
|
||||
var/max_harvests = 0
|
||||
var/min_harvests = -1
|
||||
var/list/harvest_loot = null // Should be an associative list for things to spawn, and their weights. An example would be a branch from a tree.
|
||||
|
||||
/obj/structure/flora/Initialize()
|
||||
..()
|
||||
|
||||
if(randomize_size)
|
||||
icon_scale_x = rand(min_x_scale * 100, max_x_scale * 100) / 100
|
||||
icon_scale_y = rand(min_y_scale * 100, max_y_scale * 100) / 100
|
||||
|
||||
if(prob(50))
|
||||
icon_scale_x *= -1
|
||||
update_transform()
|
||||
|
||||
if(randomize_harvest_count)
|
||||
max_harvests = max(0, rand(min_harvests, max_harvests)) // Incase you want to weight it more toward 'not harvestable', set min_harvests to a negative value.
|
||||
|
||||
/obj/structure/flora/examine(mob/user)
|
||||
. = ..(user)
|
||||
if(harvest_count < max_harvests)
|
||||
to_chat(user, "<span class='notice'>\The [src] seems to have something hanging from it.</span>")
|
||||
|
||||
/obj/structure/flora/attackby(var/obj/item/weapon/W, var/mob/living/user)
|
||||
if(can_harvest(W))
|
||||
var/harvest_spawn = pickweight(harvest_loot)
|
||||
var/atom/movable/AM = spawn_harvest(harvest_spawn, user)
|
||||
|
||||
if(!AM)
|
||||
to_chat(user, "<span class='notice'>You fail to harvest anything from \the [src].</span>")
|
||||
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You harvest \the [AM] from \the [src].</span>")
|
||||
return
|
||||
|
||||
..(W, user)
|
||||
|
||||
/obj/structure/flora/proc/can_harvest(var/obj/item/I)
|
||||
. = FALSE
|
||||
if(harvest_tool && istype(I, harvest_tool) && harvest_loot && harvest_loot.len && harvest_count < max_harvests)
|
||||
. = TRUE
|
||||
return .
|
||||
|
||||
/obj/structure/flora/proc/spawn_harvest(var/path = null, var/mob/user = null)
|
||||
if(!ispath(path))
|
||||
return 0
|
||||
var/turf/Target = get_turf(src)
|
||||
if(user)
|
||||
Target = get_turf(user)
|
||||
|
||||
var/atom/movable/AM = new path(Target)
|
||||
|
||||
harvest_count++
|
||||
return AM
|
||||
|
||||
//bushes
|
||||
/obj/structure/flora/bush
|
||||
name = "bush"
|
||||
icon = 'icons/obj/flora/snowflora.dmi'
|
||||
icon_state = "snowbush1"
|
||||
anchored = 1
|
||||
|
||||
/obj/structure/flora/bush/New()
|
||||
..()
|
||||
@@ -20,6 +88,7 @@
|
||||
icon = 'icons/obj/plants.dmi'
|
||||
icon_state = "plant-26"
|
||||
|
||||
anchored = FALSE
|
||||
|
||||
//newbushes
|
||||
|
||||
@@ -27,7 +96,6 @@
|
||||
name = "bush"
|
||||
icon = 'icons/obj/flora/ausflora.dmi'
|
||||
icon_state = "firstbush_1"
|
||||
anchored = 1
|
||||
|
||||
/obj/structure/flora/ausbushes/New()
|
||||
..()
|
||||
@@ -122,7 +190,7 @@
|
||||
|
||||
/obj/structure/flora/ausbushes/ppflowers/New()
|
||||
..()
|
||||
icon_state = "ppflowers_[rand(1, 4)]"
|
||||
icon_state = "ppflowers_[rand(1, 3)]"
|
||||
|
||||
/obj/structure/flora/ausbushes/sparsegrass
|
||||
icon_state = "sparsegrass_1"
|
||||
@@ -144,6 +212,7 @@
|
||||
icon_state = "hangskele"
|
||||
desc = "It's an anatomical model of a human skeletal system made of plaster."
|
||||
|
||||
plane = OBJ_PLANE
|
||||
|
||||
//potted plants credit: Flashkirby
|
||||
/obj/structure/flora/pottedplant
|
||||
@@ -152,6 +221,8 @@
|
||||
icon = 'icons/obj/plants.dmi'
|
||||
icon_state = "plant-01"
|
||||
|
||||
plane = OBJ_PLANE
|
||||
|
||||
/obj/structure/flora/pottedplant/large
|
||||
name = "large potted plant"
|
||||
desc = "This is a large plant. Three branches support pairs of waxy leaves."
|
||||
@@ -348,4 +419,22 @@
|
||||
|
||||
/obj/structure/flora/sif/eyes/Initialize()
|
||||
icon_state = "[initial(icon_state)][rand(1,3)]"
|
||||
. = ..()
|
||||
. = ..()
|
||||
|
||||
/datum/category_item/catalogue/flora/mosstendrils
|
||||
name = "Sivian Flora - Moss Stalks"
|
||||
desc = "A plant native to Sif. The plant is most closely related to the common, dense moss found covering Sif's terrain. \
|
||||
It has evolved a method of camouflage utilizing white hairs on its dorsal sides to make it appear as a small mound of snow from \
|
||||
above. It has no known use, though it is a common furnishing in contemporary homes."
|
||||
value = CATALOGUER_REWARD_TRIVIAL
|
||||
|
||||
/obj/structure/flora/sif/tendrils
|
||||
name = "stocky tendrils"
|
||||
desc = "A 'plant' made up of hardened moss. It has tiny hairs that bunch together to look like snow."
|
||||
icon_state = "grass"
|
||||
randomize_size = TRUE
|
||||
catalogue_data = list(/datum/category_item/catalogue/flora/mosstendrils)
|
||||
|
||||
/obj/structure/flora/sif/tendrils/Initialize()
|
||||
icon_state = "[initial(icon_state)][rand(1,3)]"
|
||||
. = ..()
|
||||
|
||||
@@ -14,19 +14,10 @@
|
||||
var/product_amount = 10 // How much of a stack you get, if the above is defined.
|
||||
var/is_stump = FALSE // If true, suspends damage tracking and most other effects.
|
||||
var/indestructable = FALSE // If true, the tree cannot die.
|
||||
var/randomize_size = FALSE // If true, the tree will choose a random scale in the X and Y directions to stretch.
|
||||
|
||||
/obj/structure/flora/tree/Initialize()
|
||||
icon_state = choose_icon_state()
|
||||
|
||||
if(randomize_size)
|
||||
icon_scale_x = rand(90, 125) / 100
|
||||
icon_scale_y = rand(90, 125) / 100
|
||||
|
||||
if(prob(50))
|
||||
icon_scale_x *= -1
|
||||
update_transform()
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/structure/flora/tree/update_transform()
|
||||
@@ -39,7 +30,17 @@
|
||||
/obj/structure/flora/tree/proc/choose_icon_state()
|
||||
return icon_state
|
||||
|
||||
/obj/structure/flora/tree/can_harvest(var/obj/item/I)
|
||||
. = FALSE
|
||||
if(!is_stump && harvest_tool && istype(I, harvest_tool) && harvest_loot && harvest_loot.len && harvest_count < max_harvests)
|
||||
. = TRUE
|
||||
return .
|
||||
|
||||
/obj/structure/flora/tree/attackby(var/obj/item/weapon/W, var/mob/living/user)
|
||||
if(can_harvest(W))
|
||||
..(W, user)
|
||||
return
|
||||
|
||||
if(!istype(W))
|
||||
return ..()
|
||||
|
||||
@@ -267,6 +268,14 @@
|
||||
product = /obj/item/stack/material/log/sif
|
||||
catalogue_data = list(/datum/category_item/catalogue/flora/sif_tree)
|
||||
randomize_size = TRUE
|
||||
|
||||
harvest_tool = /obj/item/weapon/material/knife
|
||||
max_harvests = 2
|
||||
min_harvests = -4
|
||||
harvest_loot = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/siffruit = 5
|
||||
)
|
||||
|
||||
var/light_shift = 0
|
||||
|
||||
/obj/structure/flora/tree/sif/choose_icon_state()
|
||||
|
||||
@@ -212,7 +212,7 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/girder/proc/take_damage(var/damage)
|
||||
/obj/structure/girder/take_damage(var/damage)
|
||||
health -= damage
|
||||
if(health <= 0)
|
||||
dismantle()
|
||||
|
||||
@@ -281,3 +281,8 @@
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/grille/take_damage(var/damage)
|
||||
health -= damage
|
||||
spawn(1) healthcheck()
|
||||
return 1
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
/obj/structure/handrail
|
||||
name = "handrail"
|
||||
icon = 'icons/obj/handrail_vr.dmi'
|
||||
icon_state = "handrail"
|
||||
desc = "A safety railing with buckles to secure yourself to when floor isn't stable enough."
|
||||
density = 0
|
||||
anchored = 1
|
||||
can_buckle = 1
|
||||
@@ -137,6 +137,13 @@
|
||||
user.visible_message("<span class='danger'>[user] [attack_verb] at [src]!</span>")
|
||||
return 1
|
||||
|
||||
/obj/structure/inflatable/take_damage(var/damage)
|
||||
health -= damage
|
||||
if(health <= 0)
|
||||
visible_message("<span class='danger'>The [src] deflates!</span>")
|
||||
spawn(1) puncture()
|
||||
return 1
|
||||
|
||||
/obj/item/inflatable/door/
|
||||
name = "inflatable door"
|
||||
desc = "A folded membrane which rapidly expands into a simple door on activation."
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
/obj/structure/ledge
|
||||
name = "rock ledge"
|
||||
desc = "An easily scaleable rocky ledge."
|
||||
icon = 'icons/obj/ledges.dmi'
|
||||
density = 1
|
||||
throwpass = 1
|
||||
climbable = 1
|
||||
anchored = 1
|
||||
var/solidledge = 1
|
||||
flags = ON_BORDER
|
||||
layer = STAIRS_LAYER
|
||||
icon_state = "ledge"
|
||||
|
||||
/obj/structure/ledge_corner
|
||||
icon_state = "ledge-corner"
|
||||
flags = 0
|
||||
name = "rock ledge"
|
||||
desc = "An easily scaleable rocky ledge."
|
||||
icon = 'icons/obj/ledges.dmi'
|
||||
density = 1
|
||||
throwpass = 1
|
||||
climbable = 1
|
||||
anchored = 1
|
||||
layer = STAIRS_LAYER
|
||||
|
||||
/obj/structure/ledge/ledge_nub
|
||||
desc = "Part of a rocky ledge."
|
||||
icon_state = "ledge-nub"
|
||||
density = 0
|
||||
solidledge = 0
|
||||
|
||||
/obj/structure/ledge/ledge_stairs
|
||||
name = "rock stairs"
|
||||
desc = "A colorful set of rocky stairs"
|
||||
icon_state = "ledge-stairs"
|
||||
density = 0
|
||||
solidledge = 0
|
||||
|
||||
/obj/structure/ledge/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||
return TRUE
|
||||
if(solidledge && get_dir(mover, target) == turn(dir, 180))
|
||||
return !density
|
||||
return TRUE
|
||||
|
||||
/obj/structure/ledge/CheckExit(atom/movable/O as mob|obj, target as turf)
|
||||
if(istype(O) && O.checkpass(PASSTABLE))
|
||||
return 1
|
||||
if(solidledge && get_dir(O.loc, target) == dir)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/structure/ledge/do_climb(var/mob/living/user)
|
||||
if(!can_climb(user))
|
||||
return
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
|
||||
climbers |= user
|
||||
|
||||
if(!do_after(user,(issmall(user) ? 20 : 34)))
|
||||
climbers -= user
|
||||
return
|
||||
|
||||
if(!can_climb(user, post_climb_check=1))
|
||||
climbers -= user
|
||||
return
|
||||
|
||||
if(get_turf(user) == get_turf(src))
|
||||
usr.forceMove(get_step(src, src.dir))
|
||||
else
|
||||
usr.forceMove(get_turf(src))
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
|
||||
climbers -= user
|
||||
|
||||
/obj/structure/ledge/can_climb(var/mob/living/user, post_climb_check=0)
|
||||
if(!..())
|
||||
return 0
|
||||
|
||||
if(get_turf(user) == get_turf(src))
|
||||
var/obj/occupied = neighbor_turf_impassable()
|
||||
if(occupied)
|
||||
to_chat(user, "<span class='danger'>You can't climb there, there's \a [occupied] in the way.</span>")
|
||||
return 0
|
||||
return 1
|
||||
@@ -340,7 +340,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
|
||||
/obj/item/weapon/stock_parts/subspace/transmitter,
|
||||
/obj/item/weapon/stock_parts/subspace/treatment,
|
||||
/obj/item/frame,
|
||||
/obj/item/broken_device,
|
||||
/obj/item/broken_device/random,
|
||||
/obj/item/borg/upgrade/restart,
|
||||
/obj/item/weapon/cell,
|
||||
/obj/item/weapon/cell/high,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
#define MUSICIAN_HEARCHECK_MINDELAY 4
|
||||
#define INSTRUMENT_MAX_LINE_LENGTH 300
|
||||
#define INSTRUMENT_MAX_LINE_NUMBER 50
|
||||
#define INSTRUMENT_MAX_LINE_LENGTH 50
|
||||
#define INSTRUMENT_MAX_LINE_NUMBER 300
|
||||
|
||||
/datum/song
|
||||
var/name = "Untitled"
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
layer = MOB_LAYER
|
||||
plane = MOB_PLANE
|
||||
explosion_resistance = 5
|
||||
var/can_pass_lying = 1
|
||||
var/list/mobs_can_pass = list(
|
||||
/mob/living/bot,
|
||||
/mob/living/simple_mob/slime/xenobio,
|
||||
@@ -18,9 +19,9 @@
|
||||
/obj/structure/plasticflaps/attackby(obj/item/P, mob/user)
|
||||
if(P.is_wirecutter())
|
||||
playsound(src, P.usesound, 50, 1)
|
||||
user << "<span class='notice'>You start to cut the plastic flaps.</span>"
|
||||
to_chat(user, "<span class='notice'>You start to cut the plastic flaps.</span>")
|
||||
if(do_after(user, 10 * P.toolspeed))
|
||||
user << "<span class='notice'>You cut the plastic flaps.</span>"
|
||||
to_chat(user, "<span class='notice'>You cut the plastic flaps.</span>")
|
||||
var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc )
|
||||
A.amount = 4
|
||||
qdel(src)
|
||||
@@ -41,7 +42,7 @@
|
||||
|
||||
var/mob/living/M = A
|
||||
if(istype(M))
|
||||
if(M.lying)
|
||||
if(M.lying && can_pass_lying)
|
||||
return ..()
|
||||
for(var/mob_type in mobs_can_pass)
|
||||
if(istype(A, mob_type))
|
||||
@@ -63,5 +64,6 @@
|
||||
|
||||
/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates
|
||||
name = "airtight plastic flaps"
|
||||
desc = "Heavy duty, airtight, plastic flaps."
|
||||
desc = "Heavy duty, airtight, plastic flaps. Have extra safety installed, preventing passage of living beings."
|
||||
can_atmos_pass = ATMOS_PASS_NO
|
||||
can_pass_lying = 0
|
||||
@@ -105,4 +105,28 @@
|
||||
**16/FEB/2562**<BR>
|
||||
<B>Something chitters.</B><BR>
|
||||
<B>End of transcript.</B>
|
||||
"}
|
||||
"}
|
||||
|
||||
/obj/structure/prop/blackbox/xenofrigate
|
||||
catalogue_data = list(/datum/category_item/catalogue/information/blackbox/xenofrigate)
|
||||
|
||||
/datum/category_item/catalogue/information/blackbox/xenofrigate
|
||||
name = "Black Box Data - MBT-540"
|
||||
desc = {"
|
||||
<BR>
|
||||
<B>Begin Log</B>
|
||||
<B>@$&@$& Human ##:##:##:</B> Attention unidentified vessel, state your designation and intent.<BR>
|
||||
<B>!#@$&&^ Human ##:##:##:</B> Commander I don't think they're going to stop.<BR>
|
||||
<B>@$&@$& Human ##:##:##:</B> Unidentified vessel, you have until the count of three before we engage weapon-<BR>
|
||||
<B>!#@$&&^ Human ##:##:##:</B> Commander! Think about what you're-<BR>
|
||||
<B>A repeating clicking, before silence.</B><BR>
|
||||
<B>End of first log.</B><BR>
|
||||
**<BR>
|
||||
<B>Begin Log</B><BR>
|
||||
<B>#!#^@$& Skrell ##:##:##:</B> Director, I think you should see this.<BR>
|
||||
<B>^@$& Skrell ##:##:##:</B> Yes? What is it?<BR>
|
||||
<B>#!#^@$& Skrell ##:##:##:</B> Another one of those ships has appeared near th-462$^ ---n colonies. I would strongly advise pursuing it.<BR>
|
||||
<B>^@$& Skrell ##:##:##:</B> A wise decision. If it is damaged like the last one, we may be able to finally see what is - What?<BR>
|
||||
<B>A repeating ping, before silence.</B><BR>
|
||||
<B>End of second log.</B>
|
||||
"}
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
if(0.5 to 1.0)
|
||||
to_chat(user, "<span class='notice'>It has a few scrapes and dents.</span>")
|
||||
|
||||
/obj/structure/railing/proc/take_damage(amount)
|
||||
/obj/structure/railing/take_damage(amount)
|
||||
health -= amount
|
||||
if(health <= 0)
|
||||
visible_message("<span class='warning'>\The [src] breaks down!</span>")
|
||||
|
||||
@@ -124,15 +124,22 @@
|
||||
icon_state = material.door_icon_base
|
||||
|
||||
/obj/structure/simple_door/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
if(istype(W,/obj/item/weapon/pickaxe))
|
||||
var/obj/item/weapon/pickaxe/digTool = W
|
||||
user << "You start digging the [name]."
|
||||
visible_message("<span class='danger'>[user] starts digging [src]!</span>")
|
||||
if(do_after(user,digTool.digspeed*hardness) && src)
|
||||
user << "You finished digging."
|
||||
visible_message("<span class='danger'>[user] finished digging [src]!</span>")
|
||||
Dismantle()
|
||||
else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc?
|
||||
hardness -= W.force/100
|
||||
user << "You hit the [name] with your [W.name]!"
|
||||
hardness -= W.force/10
|
||||
visible_message("<span class='danger'>[user] hits [src] with [W]!</span>")
|
||||
if(material == get_material_by_name("resin"))
|
||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD)))
|
||||
playsound(loc, 'sound/effects/woodcutting.ogg', 100, 1)
|
||||
else
|
||||
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
|
||||
CheckHardness()
|
||||
else if(istype(W,/obj/item/weapon/weldingtool))
|
||||
var/obj/item/weapon/weldingtool/WT = W
|
||||
@@ -142,12 +149,33 @@
|
||||
attack_hand(user)
|
||||
return
|
||||
|
||||
/obj/structure/simple_door/bullet_act(var/obj/item/projectile/Proj)
|
||||
hardness -= Proj.force/10
|
||||
CheckHardness()
|
||||
|
||||
/obj/structure/simple_door/take_damage(var/damage)
|
||||
hardness -= damage/10
|
||||
CheckHardness()
|
||||
|
||||
/obj/structure/simple_door/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
|
||||
if(material == get_material_by_name("resin"))
|
||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD)))
|
||||
playsound(loc, 'sound/effects/woodcutting.ogg', 100, 1)
|
||||
else
|
||||
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
|
||||
user.do_attack_animation(src)
|
||||
hardness -= damage/10
|
||||
CheckHardness()
|
||||
|
||||
/obj/structure/simple_door/proc/CheckHardness()
|
||||
if(hardness <= 0)
|
||||
Dismantle(1)
|
||||
|
||||
/obj/structure/simple_door/proc/Dismantle(devastated = 0)
|
||||
material.place_dismantled_product(get_turf(src))
|
||||
visible_message("<span class='danger'>The [src] is destroyed!</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/simple_door/ex_act(severity = 1)
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
prob(5);/obj/item/weapon/storage/backpack/satchel/norm,
|
||||
prob(5);/obj/item/weapon/storage/box,
|
||||
// prob(5);/obj/random/cigarettes,
|
||||
prob(4);/obj/item/broken_device,
|
||||
prob(4);/obj/item/broken_device/random,
|
||||
prob(4);/obj/item/clothing/head/hardhat,
|
||||
prob(4);/obj/item/clothing/mask/breath,
|
||||
prob(4);/obj/item/clothing/shoes/black,
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There is a thick layer of silicate covering it.</span>")
|
||||
|
||||
/obj/structure/window/proc/take_damage(var/damage = 0, var/sound_effect = 1)
|
||||
/obj/structure/window/take_damage(var/damage = 0, var/sound_effect = 1)
|
||||
var/initialhealth = health
|
||||
|
||||
if(silicate)
|
||||
|
||||
Reference in New Issue
Block a user