Merge remote-tracking branch 'VOREStation/master' into medbeam

This commit is contained in:
Unknown
2019-08-31 15:32:22 -04:00
606 changed files with 34920 additions and 20083 deletions
+37
View File
@@ -64,6 +64,19 @@
healthcheck()
return
/obj/effect/alien/resin/attack_generic(var/mob/user, var/damage, var/attack_verb)
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
user.do_attack_animation(src)
health -= damage
healthcheck()
return
/obj/effect/alien/resin/take_damage(var/damage)
health -= damage
healthcheck()
return
/obj/effect/alien/resin/ex_act(severity)
switch(severity)
if(1.0)
@@ -246,6 +259,18 @@ Alien plants should do something if theres a lot of poison
health -= damage
healthcheck()
/obj/effect/alien/weeds/attack_generic(var/mob/user, var/damage, var/attack_verb)
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
user.do_attack_animation(src)
health -= damage
healthcheck()
return
/obj/effect/alien/weeds/take_damage(var/damage)
health -= damage
healthcheck()
return
/obj/effect/alien/weeds/proc/healthcheck()
if(health <= 0)
qdel(src)
@@ -401,6 +426,18 @@ Alien plants should do something if theres a lot of poison
healthcheck()
return
/obj/effect/alien/egg/attack_generic(var/mob/user, var/damage, var/attack_verb)
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
user.do_attack_animation(src)
health -= damage
healthcheck()
return
/obj/effect/alien/egg/take_damage(var/damage)
health -= damage
healthcheck()
return
/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user)
if(health <= 0)
+36
View File
@@ -0,0 +1,36 @@
/*
* Home of the floor chemical coating.
*/
/obj/effect/decal/cleanable/chemcoating
icon = 'icons/effects/effects.dmi'
icon_state = "dirt"
/obj/effect/decal/cleanable/chemcoating/New()
..()
create_reagents(100)
/obj/effect/decal/cleanable/chemcoating/Initialize()
..()
var/turf/T = get_turf(src)
if(T)
for(var/obj/O in get_turf(src))
if(O == src)
continue
if(istype(O, /obj/effect/decal/cleanable/chemcoating))
var/obj/effect/decal/cleanable/chemcoating/C = O
if(C.reagents && C.reagents.reagent_list.len)
C.reagents.trans_to_obj(src,C.reagents.total_volume)
qdel(O)
/obj/effect/decal/cleanable/chemcoating/Bumped(A as mob|obj)
if(reagents)
reagents.touch(A)
return ..()
/obj/effect/decal/cleanable/chemcoating/Crossed(AM as mob|obj)
Bumped(AM)
/obj/effect/decal/cleanable/chemcoating/update_icon()
..()
color = reagents.get_color()
@@ -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)
+12 -8
View File
@@ -492,13 +492,15 @@ var/list/global/slot_flags_enumeration = list(
user << "<span class='warning'>You cannot locate any eyes on [M]!</span>"
return
if(U.get_accuracy_penalty(U)) //Should only trigger if they're not aiming well
var/hit_zone = get_zone_with_miss_chance(U.zone_sel.selecting, M, U.get_accuracy_penalty(U))
if(!hit_zone)
U.do_attack_animation(M)
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<font color='red'><B>[U] attempts to stab [M] in the eyes, but misses!</B></font>")
return
//this should absolutely trigger even if not aim-impaired in some way
var/hit_zone = get_zone_with_miss_chance(U.zone_sel.selecting, M, U.get_accuracy_penalty(U))
if(!hit_zone)
U.do_attack_animation(M)
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
//visible_message("<span class='danger'>[U] attempts to stab [M] in the eyes, but misses!</span>")
for(var/mob/V in viewers(M))
V.show_message("<span class='danger'>[U] attempts to stab [M] in the eyes, but misses!</span>")
return
add_attack_logs(user,M,"Attack eyes with [name]")
@@ -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
+14 -2
View File
@@ -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)
+35 -25
View File
@@ -577,31 +577,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(mode==3)
var/turf/T = get_turf(user.loc)
if(!isnull(T))
var/datum/gas_mixture/environment = T.return_air()
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles
if (total_moles)
var/o2_level = environment.gas["oxygen"]/total_moles
var/n2_level = environment.gas["nitrogen"]/total_moles
var/co2_level = environment.gas["carbon_dioxide"]/total_moles
var/phoron_level = environment.gas["phoron"]/total_moles
var/unknown_level = 1-(o2_level+n2_level+co2_level+phoron_level)
data["aircontents"] = list(\
"pressure" = "[round(pressure,0.1)]",\
"nitrogen" = "[round(n2_level*100,0.1)]",\
"oxygen" = "[round(o2_level*100,0.1)]",\
"carbon_dioxide" = "[round(co2_level*100,0.1)]",\
"phoron" = "[round(phoron_level*100,0.01)]",\
"other" = "[round(unknown_level, 0.01)]",\
"temp" = "[round(environment.temperature-T0C,0.1)]",\
"reading" = 1\
)
if(isnull(data["aircontents"]))
data["aircontents"] = list("reading" = 0)
data["aircontents"] = src.analyze_air()
if(mode==6)
if(has_reception)
feeds.Cut()
@@ -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" = "&degC", "val" = "[round(environment.temperature-T0C,0.1)]", "bad_high" = 35, "poor_high" = 25, "poor_low" = 15, "bad_low" = 5),
list("entry" = "Oxygen", "units" = "kPa", "val" = "[round(o2_level*100,0.1)]", "bad_high" = 140, "poor_high" = 135, "poor_low" = 19, "bad_low" = 17),
list("entry" = "Nitrogen", "units" = "kPa", "val" = "[round(n2_level*100,0.1)]", "bad_high" = 105, "poor_high" = 85, "poor_low" = 50, "bad_low" = 40),
list("entry" = "Carbon Dioxide", "units" = "kPa", "val" = "[round(co2_level*100,0.1)]", "bad_high" = 10, "poor_high" = 5, "poor_low" = 0, "bad_low" = 0),
list("entry" = "Phoron", "units" = "kPa", "val" = "[round(phoron_level*100,0.01)]", "bad_high" = 0.5, "poor_high" = 0, "poor_low" = 0, "bad_low" = 0),
list("entry" = "Other", "units" = "kPa", "val" = "[round(unknown_level, 0.01)]", "bad_high" = 1, "poor_high" = 0.5, "poor_low" = 0, "bad_low" = 0)
)
if(isnull(results))
results = list(list("entry" = "pressure", "units" = "kPa", "val" = "0", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80))
return results
@@ -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" = "&degC", "val" = "[round(environment.temperature-T0C,0.1)]", "bad_high" = 35, "poor_high" = 25, "poor_low" = 15, "bad_low" = 5),
list("entry" = "Oxygen", "units" = "kPa", "val" = "[round(o2_level*100,0.1)]", "bad_high" = 140, "poor_high" = 135, "poor_low" = 19, "bad_low" = 17),
list("entry" = "Nitrogen", "units" = "kPa", "val" = "[round(n2_level*100,0.1)]", "bad_high" = 105, "poor_high" = 85, "poor_low" = 50, "bad_low" = 40),
list("entry" = "Carbon Dioxide", "units" = "kPa", "val" = "[round(co2_level*100,0.1)]", "bad_high" = 10, "poor_high" = 5, "poor_low" = 0, "bad_low" = 0),
list("entry" = "Phoron", "units" = "kPa", "val" = "[round(phoron_level*100,0.01)]", "bad_high" = 0.5, "poor_high" = 0, "poor_low" = 0, "bad_low" = 0),
list("entry" = "Other", "units" = "kPa", "val" = "[round(unknown_level, 0.01)]", "bad_high" = 1, "poor_high" = 0.5, "poor_low" = 0, "bad_low" = 0)
)
if(isnull(results))
results = list(list("entry" = "pressure", "val" = "0"))
results = list(list("entry" = "pressure", "units" = "kPa", "val" = "0", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80))
return results
+2 -2
View File
@@ -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>")
+29 -8
View File
@@ -4,12 +4,12 @@ var/list/GPS_list = list()
name = "global positioning system"
desc = "Triangulates the approximate co-ordinates using a nearby satellite network. Alt+click to toggle power."
icon = 'icons/obj/gps.dmi'
icon_state = "gps-c"
icon_state = "gps-gen"
w_class = ITEMSIZE_TINY
slot_flags = SLOT_BELT
origin_tech = list(TECH_MATERIAL = 2, TECH_BLUESPACE = 2, TECH_MAGNET = 1)
matter = list(DEFAULT_WALL_MATERIAL = 500)
var/gps_tag = "COM0"
var/gps_tag = "GEN0"
var/emped = FALSE
var/tracking = FALSE // Will not show other signals or emit its own signal if false.
var/long_range = FALSE // If true, can see farther, depending on get_map_levels().
@@ -171,22 +171,43 @@ var/list/GPS_list = list()
/obj/item/device/gps/on // Defaults to off to avoid polluting the signal list with a bunch of GPSes without owners. If you need to spawn active ones, use these.
tracking = TRUE
/obj/item/device/gps/command
icon_state = "gps-com"
gps_tag = "COM0"
/obj/item/device/gps/command/on
tracking = TRUE
/obj/item/device/gps/security
icon_state = "gps-sec"
gps_tag = "SEC0"
/obj/item/device/gps/security/on
tracking = TRUE
/obj/item/device/gps/medical
icon_state = "gps-med"
gps_tag = "MED0"
/obj/item/device/gps/medical/on
tracking = TRUE
/obj/item/device/gps/science
icon_state = "gps-s"
icon_state = "gps-sci"
gps_tag = "SCI0"
/obj/item/device/gps/science/on
tracking = TRUE
/obj/item/device/gps/engineering
icon_state = "gps-e"
icon_state = "gps-eng"
gps_tag = "ENG0"
/obj/item/device/gps/engineering/on
tracking = TRUE
/obj/item/device/gps/mining
icon_state = "gps-m"
icon_state = "gps-mine"
gps_tag = "MINE0"
desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life. Alt+click to toggle power."
@@ -194,15 +215,15 @@ var/list/GPS_list = list()
tracking = TRUE
/obj/item/device/gps/explorer
icon_state = "gps-ex"
gps_tag = "EX0"
icon_state = "gps-exp"
gps_tag = "EXP0"
desc = "A positioning system helpful for rescuing trapped or injured explorers, keeping one on you at all times while exploring might just save your life. Alt+click to toggle power."
/obj/item/device/gps/explorer/on
tracking = TRUE
/obj/item/device/gps/robot
icon_state = "gps-b"
icon_state = "gps-borg"
gps_tag = "SYNTH0"
desc = "A synthetic internal positioning system. Used as a recovery beacon for damaged synthetic assets, or a collaboration tool for mining or exploration teams. \
Alt+click to toggle power."
@@ -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)
+12 -2
View File
@@ -1,3 +1,4 @@
#define DEFIB_TIME_LIMIT (10 MINUTES) //VOREStation addition- past this many seconds, defib is useless.
/*
CONTAINS:
T-RAY
@@ -54,6 +55,8 @@ HALOGEN COUNTER - Radcount on mobs
if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey")
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
flick("[icon_state]-scan", src) //makes it so that it plays the scan animation on a succesful scan
user.visible_message("<span class='notice'>[user] has analyzed [M]'s vitals.</span>","<span class='notice'>You have analyzed [M]'s vitals.</span>")
if (!ishuman(M) || M.isSynthetic())
@@ -81,8 +84,13 @@ HALOGEN COUNTER - Radcount on mobs
dat += "\tKey: <font color='cyan'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font><br>"
dat += "\tDamage Specifics: <font color='cyan'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font><br>"
dat += "Body Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)</span><br>"
if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH)))
dat += "<span class='notice'>Time of Death: [M.tod]</span><br>"
//VOREStation edit/addition starts
if(M.timeofdeath && (M.stat == DEAD || (M.status_flags & FAKEDEATH)))
dat += "<span class='notice'>Time of Death: [worldtime2stationtime(M.timeofdeath)]</span><br>"
var/tdelta = round(world.time - M.timeofdeath)
if(tdelta < (DEFIB_TIME_LIMIT * 10))
dat += "<span class='notice'><b>Subject died [DisplayTimeText(tdelta)] ago - resuscitation may be possible!</b></span><br>"
//VOREStation edit/addition ends
if(istype(M, /mob/living/carbon/human) && mode == 1)
var/mob/living/carbon/human/H = M
var/list/damaged = H.get_damaged_organs(1,1)
@@ -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
+4
View File
@@ -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"
-5
View File
@@ -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
+30 -1
View File
@@ -13,6 +13,10 @@
var/atom/target = null
var/open_panel = 0
var/image_overlay = null
var/blast_dev = -1
var/blast_heavy = -1
var/blast_light = 2
var/blast_flash = 3
/obj/item/weapon/plastique/New()
wires = new(src)
@@ -72,7 +76,7 @@
if(!target)
target = src
if(location)
explosion(location, -1, -1, 2, 3)
explosion(location, blast_dev, blast_heavy, blast_light, blast_flash)
if(target)
if (istype(target, /turf/simulated/wall))
@@ -88,3 +92,28 @@
/obj/item/weapon/plastique/attack(mob/M as mob, mob/user as mob, def_zone)
return
/obj/item/weapon/plastique/seismic
name = "seismic charge"
desc = "Used to dig holes in specific areas without too much extra hole."
blast_heavy = 2
blast_light = 4
blast_flash = 7
/obj/item/weapon/plastique/seismic/attackby(var/obj/item/I, var/mob/user)
. = ..()
if(open_panel)
if(istype(I, /obj/item/weapon/stock_parts/micro_laser))
var/obj/item/weapon/stock_parts/SP = I
var/new_blast_power = max(1, round(SP.rating / 2) + 1)
if(new_blast_power > blast_heavy)
to_chat(user, "<span class='notice'>You install \the [I] into \the [src].</span>")
user.drop_from_inventory(I)
qdel(I)
blast_heavy = new_blast_power
blast_light = blast_heavy + round(new_blast_power * 0.5)
blast_flash = blast_light + round(new_blast_power * 0.75)
else
to_chat(user, "<span class='notice'>The [I] is not any better than the component already installed into this charge!</span>")
return .
@@ -0,0 +1,17 @@
/obj/item/weapon/plastique/seismic/locked
desc = "Used to dig holes in specific areas without too much extra hole. Has extra mechanism that safely implodes the bomb if it is used in close proximity to the facility."
/obj/item/weapon/plastique/seismic/locked/explode(var/location)
if(!target)
target = get_atom_on_turf(src)
if(!target)
target = src
var/turf/T = get_turf(target)
if(T.z in using_map.map_levels)
target.visible_message("<span class='danger'>\The [src] lets out a loud beep as safeties trigger, before imploding and falling apart.</span>")
target.overlays -= image_overlay
qdel(src)
return 0
else
return ..()
@@ -41,6 +41,19 @@
/obj/item/weapon/grenade/spawnergrenade/manhacks/raider
spawner_type = /mob/living/simple_mob/mechanical/viscerator/raider
/obj/item/weapon/grenade/spawnergrenade/manhacks/station
desc = "It is set to detonate in 5 seconds. It will deploy three weaponized survey drones."
deliveryamt = 3
spawner_type = /mob/living/simple_mob/mechanical/viscerator/station
origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_ILLEGAL = 1)
/obj/item/weapon/grenade/spawnergrenade/ward
name = "sentry delivery grenade"
desc = "It is set to detonate in 5 seconds. It will deploy a single thermal-optic sentry drone."
spawner_type = /mob/living/simple_mob/mechanical/ward/monitor/crew
deliveryamt = 1
origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_BLUESPACE = 2)
/obj/item/weapon/grenade/spawnergrenade/spesscarp
name = "carp delivery grenade"
spawner_type = /mob/living/simple_mob/animal/space/carp
@@ -0,0 +1,30 @@
/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked
desc = "It is set to detonate in 5 seconds. It will deploy three weaponized survey drones. This one has a safety interlock that prevents release if used while in proximity to the facility."
req_access = list(access_armory) //for toggling safety
var/locked = 1
/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/detonate()
if(locked)
var/turf/T = get_turf(src)
if(T.z in using_map.map_levels)
icon_state = initial(icon_state)
active = 0
return 0
return ..()
/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/attackby(obj/item/I, mob/user)
var/obj/item/weapon/card/id/id = I.GetID()
if(istype(id))
if(check_access(id))
locked = !locked
to_chat(user, "<span class='warning'>You [locked ? "enable" : "disable"] the safety lock on \the [src].</span>")
else
to_chat(user, "<span class='warning'>Access denied.</span>")
user.visible_message("<span class='notice'>[user] swipes \the [I] against \the [src].</span>")
else
return ..()
/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/emag_act(var/remaining_charges,var/mob/user)
..()
locked = !locked
to_chat(user, "<span class='warning'>You [locked ? "enable" : "disable"] the safety lock on \the [src]!</span>")
@@ -31,6 +31,7 @@
var/dorm = 0 // determines if this ID has claimed a dorm already
var/mining_points = 0 // For redeeming at mining equipment vendors
var/survey_points = 0 // For redeeming at explorer equipment vendors.
/obj/item/weapon/card/id/examine(mob/user)
set src in oview(1)
@@ -170,7 +171,7 @@
/obj/item/weapon/card/id/synthetic/Initialize()
. = ..()
access = get_all_station_access() + access_synth
access = get_all_station_access().Copy() + access_synth
/obj/item/weapon/card/id/centcom
name = "\improper CentCom. ID"
@@ -181,7 +182,7 @@
/obj/item/weapon/card/id/centcom/Initialize()
. = ..()
access = get_all_centcom_access()
access = get_all_centcom_access().Copy()
/obj/item/weapon/card/id/centcom/station/Initialize()
. = ..()
+17 -9
View File
@@ -98,11 +98,11 @@
<br>
<h2>OPERATING PRINCIPLES</h2>
<br>
<li>The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and phoron gas. As oxygen accelerates the reaction, and phoron carries the risk of fire, these must be filtered out. NOTE: Supermatter radiation will not charge radiation collectors.</li>
<li>The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and phoron gas. As oxygen accelerates the reaction and reacts with phoron to start a fire, it must be filtered out. It's recommended to filter out all gases besides nitrogen for standard operation. </li>
<br>
<li>Air in the reactor chamber housing the supermatter is circulated through the reactor loop, which passes through the filters and thermoelectric generators. The thermoelectric generators transfer heat from the reactor loop to the colder radiator loop, thereby generating power. Additional power is generated from internal turbines in the circulators.</li>
<li>Gas in the reactor chamber housing the supermatter is circulated through the reactor loop, which passes through the filters and thermoelectric generators. The thermoelectric generators transfer heat from the reactor loop to the colder radiator loop, thereby generating power. Additional power is generated from internal turbines in the circulators.</li>
<br>
<li>Air in the radiator loop is circulated through the radiator bank, located in space. This rapidly cools the air, preserving the temperature differential needed for power generation.</li>
<li>Gas in the radiator loop is circulated through the radiator bank, located in space. This rapidly cools the air, preserving the temperature differential needed for power generation.</li>
<br>
<li>The MK 1 Prototype Thermoelectric Supermatter Engine is designed to operate at reactor temperatures of 3000K to 4000K and generate up to 1MW of power. Beyond 1MW, the thermoelectric generators will begin to lose power through electrical discharge, reducing efficiency, but additional power generation remains feasible.</li>
<br>
@@ -113,19 +113,25 @@
<li>Do not allow supermatter to contact any solid object apart from specially-designed supporting pallet.</li>
<li>Do not directly view supermatter without meson goggles.</li>
<li>While handles on pallet allow moving the supermatter via pulling, pushing should not be attempted.</li>
<li>Note that prosthetics do not protect against radiation or viewing the supermatter.</li>
<br>
<h2>STARTUP PROCEDURE</h2>
<h2>STANDARD STARTUP PROCEDURE</h2>
<ol>
<li>Fill reactor loop and radiator loop with two (2) standard canisters of nitrogen gas each.</li>
<li>Ensure that pumps and filters are on and operating at maximum power.</li>
<li>Fire 8-9 pulses from emitter at supermatter crystal. Reactor blast doors must be open for this procedure.</li>
<li>Fill reactor loop and radiator loop with three (3) standard canisters of nitrogen gas each.</li>
<li>Fill the waste handling radiator loop with one (1) standard canister of carbon dioxide gas.</li>
<li>Enable both the high power gas pumps near the thermo-electric generators and maximize the desired output.</li>
<li>Enable both the omni-filters and ensure they are set to filter nitrogen back into the system.</li>
<li>Enable the gas pump from the filters to waste handling and maximize the desired output.</li>
<li>Close the monitoring room blast doors and open the reactor blast doors,</li>
<li>Fire 8-9 pulses from emitter at supermatter crystal. The expected power output is around a megawatt. NOTE: It will take a few minutes to heat up.</li>
<li>Close the reactor blast doors and keep the monitoring room blast doors closed to prevent radiation leaking.</li>
</ol>
<br>
<h2>OPERATION AND MAINTENANCE</h2>
<ol>
<li>Ensure that radiation protection and meson goggles are worn at all times while working in the engine room.</li>
<li>Ensure that reactor and radiator loops are undamaged and unobstructed.</li>
<li>Ensure that phoron and oxygen gas exhaust from filters is properly contained or disposed. Do not allow exhaust pressure to exceed 4500 kPa.</li>
<li>Ensure that, in a standard setup, only nitrogen is being filtered back into the system. Do not allow exhaust pressure to exceed 4500 kPa.</li>
<li>Ensure that engine room Area Power Controller (APC) and engine Superconducting Magnetic Energy Storage unit (SMES) are properly charged.</li>
<li>Ensure that reactor temperature does not exceed 5000K. In event of reactor temperature exceeding 5000K, see EMERGENCY COOLING PROCEDURE.</li>
<li>In event of imminent and/or unavoidable delamination, see EJECTION PROCEDURE.</li>
@@ -135,12 +141,14 @@
<ol>
<li>Open Emergency Cooling Valve 1 and Emergency Cooling Valve 2.</li>
<li>When reactor temperature returns to safe operating levels, close Emergency Cooling Valve 1 and Emergency Cooling Valve 2.</li>
<li>Adding additional gas to the loops can have a positive effect in reducing reactor temperature.</li>
<li>If reactor temperature does not return to safe operating levels, see EJECTION PROCEDURE.</li>
</ol>
<br>
<h2>EJECTION PROCEDURE</h2>
<ol>
<li>Press Engine Ventilatory Control button to open engine core vent to space.</li>
<li>Ensure the engine room has power. The blast doors and ejection platform are unresponsive without power.</li>
<li>Press Engine Ventilatory Control button to open engine core blast door to space.</li>
<li>Press Emergency Core Eject button to eject supermatter crystal. NOTE: Attempting crystal ejection while engine core vent is closed will result in ejection failure.</li>
<li>In event of ejection failure, <i>pending</i></li>
</ol>
@@ -42,6 +42,9 @@
if(!isnull(matter[material_type]))
matter[material_type] *= force_divisor // May require a new var instead.
if(!(material.conductive))
src.flags |= NOCONDUCT
/obj/item/weapon/material/get_material()
return material
@@ -67,7 +70,7 @@
if(applies_material_colour)
color = material.icon_colour
if(material.products_need_process())
START_PROCESSING(SSobj, src)
START_PROCESSING(SSobj, src)
update_force()
/obj/item/weapon/material/Destroy()
@@ -61,6 +61,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))
+78 -58
View File
@@ -12,6 +12,12 @@
var/lpower = 2
var/lcolor = "#0099FF"
// If it uses energy.
var/use_cell = FALSE
var/hitcost = 120
var/obj/item/weapon/cell/bcell = null
var/cell_type = /obj/item/weapon/cell/device
/obj/item/weapon/melee/energy/proc/activate(mob/living/user)
if(active)
return
@@ -38,7 +44,31 @@
w_class = initial(w_class)
set_light(0,0)
/obj/item/weapon/melee/energy/proc/use_charge(var/cost)
if(active)
if(bcell)
if(bcell.checked_use(cost))
return 1
else
return 0
return null
/obj/item/weapon/melee/energy/examine(mob/user)
if(!..(user, 1))
return
if(use_cell)
if(bcell)
to_chat(user, "<span class='notice'>The blade is [round(bcell.percent())]% charged.</span>")
if(!bcell)
to_chat(user, "<span class='warning'>The blade does not have a power source installed.</span>")
/obj/item/weapon/melee/energy/attack_self(mob/living/user as mob)
if(use_cell)
if((!bcell || bcell.charge < hitcost) && !active)
to_chat(user, "<span class='notice'>\The [src] does not seem to have power.</span>")
return
var/datum/gender/TU = gender_datums[user.get_visible_gender()]
if (active)
if ((CLUMSY in user.mutations) && prob(50))
@@ -64,6 +94,37 @@
"<span class='danger'>\The [user] is falling on \the [src]! It looks like [TU.he] [TU.is] trying to commit suicide.</span>"))
return (BRUTELOSS|FIRELOSS)
/obj/item/weapon/melee/energy/attack(mob/M, mob/user)
if(active && use_cell)
if(!use_charge(hitcost))
deactivate(user)
visible_message("<span class='notice'>\The [src]'s blade flickers, before deactivating.</span>")
return ..()
/obj/item/weapon/melee/energy/attackby(obj/item/weapon/W, mob/user)
if(use_cell)
if(istype(W, cell_type))
if(!bcell)
user.drop_item()
W.loc = src
bcell = W
to_chat(user, "<span class='notice'>You install a cell in [src].</span>")
update_icon()
else
to_chat(user, "<span class='notice'>[src] already has a cell.</span>")
else if(W.is_screwdriver() && bcell)
bcell.update_icon()
bcell.forceMove(get_turf(loc))
bcell = null
to_chat(user, "<span class='notice'>You remove the cell from \the [src].</span>")
deactivate()
update_icon()
return
return ..()
/obj/item/weapon/melee/energy/get_cell()
return bcell
/*
* Energy Axe
*/
@@ -90,11 +151,13 @@
/obj/item/weapon/melee/energy/axe/activate(mob/living/user)
..()
damtype = SEARING
icon_state = "axe1"
to_chat(user, "<span class='notice'>\The [src] is now energised.</span>")
/obj/item/weapon/melee/energy/axe/deactivate(mob/living/user)
..()
damtype = BRUTE
icon_state = initial(icon_state)
to_chat(user, "<span class='notice'>\The [src] is de-energised. It's just a regular axe now.</span>")
@@ -103,6 +166,20 @@
visible_message("<span class='warning'>\The [user] swings \the [src] towards [TU.his] head! It looks like [TU.he] [TU.is] trying to commit suicide.</span>")
return (BRUTELOSS|FIRELOSS)
/obj/item/weapon/melee/energy/axe/charge
name = "charge axe"
desc = "An energised axe."
active_force = 35
active_throwforce = 20
force = 15
use_cell = TRUE
hitcost = 120
/obj/item/weapon/melee/energy/axe/charge/loaded/New()
..()
bcell = new/obj/item/weapon/cell/device/weapon(src)
/*
* Energy Sword
*/
@@ -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()
..()
+1
View File
@@ -10,6 +10,7 @@ GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/weapon/mop)
throw_speed = 5
throw_range = 10
w_class = ITEMSIZE_NORMAL
flags = NOCONDUCT
attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
var/mopping = 0
var/mopcount = 0
@@ -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)
+11 -20
View File
@@ -9,6 +9,7 @@
sharp = 0
edge = 0
throwforce = 7
flags = NOCONDUCT
w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_COMBAT = 2)
attack_verb = list("beaten")
@@ -18,6 +19,7 @@
var/status = 0 //whether the thing is on or not
var/obj/item/weapon/cell/bcell = null
var/hitcost = 240
var/use_external_power = FALSE //only used to determine if it's a cyborg baton
/obj/item/weapon/melee/baton/New()
..()
@@ -108,6 +110,8 @@
user <<"<span class='warning'>The baton does not have a power source installed.</span>"
/obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user)
if(use_external_power)
return
if(istype(W, /obj/item/weapon/cell))
if(istype(W, /obj/item/weapon/cell/device))
if(!bcell)
@@ -136,6 +140,11 @@
return ..()
/obj/item/weapon/melee/baton/attack_self(mob/user)
if(use_external_power)
//try to find our power cell
var/mob/living/silicon/robot/R = loc
if (istype(R))
bcell = R.cell
if(bcell && bcell.charge > hitcost)
status = !status
user << "<span class='notice'>[src] is now [status ? "on" : "off"].</span>"
@@ -204,16 +213,7 @@
//secborg stun baton module
/obj/item/weapon/melee/baton/robot
hitcost = 500
/obj/item/weapon/melee/baton/robot/attack_self(mob/user)
//try to find our power cell
var/mob/living/silicon/robot/R = loc
if (istype(R))
bcell = R.cell
return ..()
/obj/item/weapon/melee/baton/robot/attackby(obj/item/weapon/W, mob/user)
return
use_external_power = TRUE
//Makeshift stun baton. Replacement for stun gloves.
/obj/item/weapon/melee/baton/cattleprod
@@ -274,13 +274,4 @@
// Borg version, for the lost module.
/obj/item/weapon/melee/baton/shocker/robot
/obj/item/weapon/melee/baton/shocker/robot/attack_self(mob/user)
//try to find our power cell
var/mob/living/silicon/robot/R = loc
if (istype(R))
bcell = R.cell
return ..()
/obj/item/weapon/melee/baton/shocker/robot/attackby(obj/item/weapon/W, mob/user)
return
use_external_power = TRUE
@@ -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
*/
+18
View File
@@ -11,6 +11,8 @@
origin_tech = list(TECH_MATERIAL = 1)
matter = list(DEFAULT_WALL_MATERIAL = 18750)
var/deployed = 0
var/camo_net = FALSE
var/stun_length = 0.25 SECONDS
/obj/item/weapon/beartrap/suicide_act(mob/user)
var/datum/gender/T = gender_datums[user.get_visible_gender()]
@@ -98,6 +100,7 @@
set_dir(L.dir)
can_buckle = 1
buckle_mob(L)
L.Stun(stun_length)
L << "<span class='danger'>The steel jaws of \the [src] bite into you, trapping you in place!</span>"
deployed = 0
can_buckle = initial(can_buckle)
@@ -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
+1 -1
View File
@@ -84,7 +84,7 @@
if(destructible)
take_damage(Proj.get_structure_damage())
/obj/structure/mob_spawner/proc/take_damage(var/damage)
/obj/structure/mob_spawner/take_damage(var/damage)
health -= damage
if(health <= 0)
visible_message("<span class='warning'>\The [src] breaks apart!</span>")
+3
View File
@@ -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
+64
View File
@@ -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)
+158
View File
@@ -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)
+3
View File
@@ -229,3 +229,6 @@
prob(50);/obj/random/soap,
prob(60);/obj/random/drinkbottle,
prob(500);/obj/random/maintenance/clean)
/obj/random/action_figure/supplypack
drop_get_turf = FALSE
+1 -1
View File
@@ -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
+93 -4
View File
@@ -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)]"
. = ..()
+18 -9
View File
@@ -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()
+1 -1
View File
@@ -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()
+5
View File
@@ -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."
+85
View File
@@ -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
+1 -1
View File
@@ -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,
+2 -2
View File
@@ -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"
+6 -4
View File
@@ -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
+25 -1
View File
@@ -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>
"}
+1 -1
View File
@@ -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>")
+32 -4
View File
@@ -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)
+1 -1
View File
@@ -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,
+1 -1
View File
@@ -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)