mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-26 13:37:58 +01:00
Merge branch 'master' of https://github.com/Baystation12/Baystation12
Conflicts: code/game/objects/items/weapons/surgery_tools.dm Did not do a pull in ages, all constants I sued in surgery code got renamed.
This commit is contained in:
@@ -19,7 +19,7 @@
|
||||
//animation = null
|
||||
var/mob/living/carbon/human/birdman/O = new /mob/living/carbon/human/birdman( loc )
|
||||
del(animation)
|
||||
del(O.organs)
|
||||
O.organs.Cut()
|
||||
O.organs = organs
|
||||
for(var/name in O.organs)
|
||||
var/datum/organ/external/organ = O.organs[name]
|
||||
|
||||
@@ -116,7 +116,6 @@ Deuterium-tritium fusion: 4.5 x 10^7 K
|
||||
volume_covered = PI * major_radius * minor_radius * 2.5 * 2.5 * 1000
|
||||
|
||||
process()
|
||||
..()
|
||||
//make sure the field generator is still intact
|
||||
if(!owned_core)
|
||||
del(src)
|
||||
@@ -131,29 +130,21 @@ Deuterium-tritium fusion: 4.5 x 10^7 K
|
||||
radiation = 0
|
||||
|
||||
//update values
|
||||
var/transfer_ratio = field_strength / 50
|
||||
major_radius = field_strength * 0.21875// max = 8.75
|
||||
minor_radius = field_strength * 0.2125// max = 8.625
|
||||
volume_covered = PI * major_radius * minor_radius * 2.5 * 2.5 * 2.5 * 7 * 7 * transfer_ratio
|
||||
var/transfer_ratio = field_strength / 50 //higher field strength will result in faster plasma aggregation
|
||||
major_radius = field_strength * 0.21875// max = 8.75m
|
||||
minor_radius = field_strength * 0.2125// max = 8.625m
|
||||
volume_covered = PI * major_radius * minor_radius * 2.5 * 2.5 * 2.5 * 7 * 7 * transfer_ratio //one tile = 2.5m*2.5m*2.5m
|
||||
|
||||
//add plasma from the surrounding environment
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
|
||||
/*
|
||||
if(air_contents.temperature > 0)
|
||||
var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
|
||||
|
||||
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
|
||||
|
||||
loc.assume_air(removed)
|
||||
*/
|
||||
|
||||
//we're going to hack in some stuff to remove plasma from the air because QUANTUM PHYSICS
|
||||
//hack in some stuff to remove plasma from the air because SCIENCE
|
||||
//the amount of plasma pulled in each update is relative to the field strength, with 50T (max field strength) = 100% of area covered by the field
|
||||
//at minimum strength, 0.25% of the field volume is pulled in per update (?)
|
||||
//have a max of 1000 moles suspended
|
||||
if(held_plasma.toxins < transfer_ratio * 1000)
|
||||
var/moles_covered = environment.return_pressure()*volume_covered/(environment.temperature * R_IDEAL_GAS_EQUATION)
|
||||
//world << "\blue moles_covered: [moles_covered]"
|
||||
//
|
||||
var/datum/gas_mixture/gas_covered = environment.remove(moles_covered)
|
||||
var/datum/gas_mixture/plasma_captured = new /datum/gas_mixture()
|
||||
@@ -161,9 +152,10 @@ Deuterium-tritium fusion: 4.5 x 10^7 K
|
||||
plasma_captured.toxins = round(gas_covered.toxins * transfer_ratio)
|
||||
//world << "\blue[plasma_captured.toxins] moles of plasma captured"
|
||||
plasma_captured.temperature = gas_covered.temperature
|
||||
//plasma_captured.update_values()
|
||||
plasma_captured.update_values()
|
||||
//
|
||||
gas_covered.toxins -= plasma_captured.toxins
|
||||
//gas_covered.update_values()
|
||||
gas_covered.update_values()
|
||||
//
|
||||
held_plasma.merge(plasma_captured)
|
||||
//
|
||||
|
||||
@@ -6,8 +6,10 @@
|
||||
name = "Core Primary Monitor"
|
||||
icon_state = "power"
|
||||
var/obj/machinery/rust/core/core_generator = null
|
||||
var/updating = 1
|
||||
|
||||
New()
|
||||
..()
|
||||
spawn(0)
|
||||
core_generator = locate() in world
|
||||
|
||||
@@ -23,16 +25,22 @@
|
||||
Topic(href, href_list)
|
||||
..()
|
||||
if( href_list["shutdown"] )
|
||||
updating = 0
|
||||
core_generator.Topic(href, href_list)
|
||||
updateDialog()
|
||||
updating = 1
|
||||
return
|
||||
if( href_list["startup"] )
|
||||
updating = 0
|
||||
core_generator.Topic(href, href_list)
|
||||
updateDialog()
|
||||
updating = 1
|
||||
return
|
||||
if( href_list["modify_field_strength"] )
|
||||
updating = 0
|
||||
core_generator.Topic(href, href_list)
|
||||
updateDialog()
|
||||
updating = 1
|
||||
return
|
||||
if( href_list["close"] )
|
||||
usr << browse(null, "window=core_monitor")
|
||||
@@ -41,7 +49,8 @@
|
||||
|
||||
process()
|
||||
..()
|
||||
updateDialog()
|
||||
if(updating)
|
||||
src.updateDialog()
|
||||
|
||||
proc
|
||||
interact(mob/user)
|
||||
@@ -60,7 +69,7 @@
|
||||
t += " <font color=blue>Energy levels (MeV): [core_generator.owned_field.mega_energy]</font><br>"
|
||||
t += " <font color=blue>Core frequency: [core_generator.owned_field.frequency]</font><br>"
|
||||
t += " <font color=blue>Moles of plasma: [core_generator.owned_field.held_plasma.toxins]</font><br>"
|
||||
t += " <font color=blue>Plasma temperature: [core_generator.owned_field.held_plasma.temperature]</font><br>"
|
||||
t += " <font color=blue>Core temperature: [core_generator.owned_field.held_plasma.temperature]</font><br>"
|
||||
t += "<hr>"
|
||||
t += "<b>Core atomic and subatomic constituents:</font></b><br>"
|
||||
if(core_generator.owned_field.dormant_reactant_quantities && core_generator.owned_field.dormant_reactant_quantities.len)
|
||||
@@ -74,5 +83,5 @@
|
||||
t += "<b><font color=red>Core Generator unresponsive</font></b><br>"
|
||||
t += "<hr>"
|
||||
t += "<A href='?src=\ref[src];close=1'>Close</A><BR>"
|
||||
user << browse(t, "window=core_monitor;size=500x800")
|
||||
user << browse(t, "window=core_monitor;size=500x400")
|
||||
user.machine = src
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "fuel_assembly"
|
||||
name = "Fuel Rod Assembly"
|
||||
var/list/rod_quantities
|
||||
var/amount_depleted = 0 //percent depleted
|
||||
var/percent_depleted = 0
|
||||
//
|
||||
New()
|
||||
rod_quantities = new/list
|
||||
|
||||
@@ -3,22 +3,34 @@
|
||||
name = "Fuel Injection Control"
|
||||
icon_state = "power"
|
||||
var/list/fuel_injectors
|
||||
var/active_stage = "Cooling"
|
||||
var/list/stage_status
|
||||
var/announce_fueldepletion = 0
|
||||
var/announce_stageprogression = 0
|
||||
//var/obj/machinery/rust/fuel_injector/Injector = null
|
||||
New()
|
||||
..()
|
||||
//these are the only three stages we can accept
|
||||
//we have another console for SCRAM
|
||||
fuel_injectors = new/list
|
||||
stage_status = new/list
|
||||
|
||||
fuel_injectors.Add("One")
|
||||
fuel_injectors["One"] = new/list
|
||||
stage_status.Add("One")
|
||||
stage_status["One"] = 0
|
||||
fuel_injectors.Add("Two")
|
||||
fuel_injectors["Two"] = new/list
|
||||
stage_status.Add("Two")
|
||||
stage_status["Two"] = 0
|
||||
fuel_injectors.Add("Three")
|
||||
fuel_injectors["Three"] = new/list
|
||||
stage_status.Add("Three")
|
||||
stage_status["Three"] = 0
|
||||
fuel_injectors.Add("SCRAM")
|
||||
fuel_injectors["SCRAM"] = new/list
|
||||
stage_status.Add("SCRAM")
|
||||
stage_status["SCRAM"] = 0
|
||||
|
||||
spawn(0)
|
||||
for(var/obj/machinery/rust/fuel_injector/Injector in world)
|
||||
if(Injector.stage in fuel_injectors)
|
||||
@@ -46,20 +58,33 @@
|
||||
usr.machine = null
|
||||
return
|
||||
if( href_list["beginstage"] )
|
||||
active_stage = href_list["beginstage"]
|
||||
if(active_stage in fuel_injectors)
|
||||
for(var/obj/machinery/rust/fuel_injector/Injector in fuel_injectors[active_stage])
|
||||
Injector.BeginInjecting()
|
||||
var/stage_name = href_list["beginstage"]
|
||||
if(stage_name in fuel_injectors)
|
||||
var/success = 1
|
||||
for(var/obj/machinery/rust/fuel_injector/Injector in fuel_injectors[stage_name])
|
||||
if(!Injector.BeginInjecting())
|
||||
success = 0
|
||||
if(!success) //may still partially complete
|
||||
usr << "\red Unable to complete command."
|
||||
stage_status[stage_name] = 1
|
||||
updateDialog()
|
||||
return
|
||||
if( href_list["begincool"] )
|
||||
var/stage_name = href_list["begincool"]
|
||||
if(stage_name in fuel_injectors)
|
||||
for(var/obj/machinery/rust/fuel_injector/Injector in fuel_injectors[stage_name])
|
||||
Injector.StopInjecting()
|
||||
stage_status[stage_name] = 0
|
||||
updateDialog()
|
||||
return
|
||||
if( href_list["restart"] )
|
||||
updateDialog()
|
||||
return
|
||||
if( href_list["cooldown"] )
|
||||
if(active_stage in fuel_injectors)
|
||||
for(var/obj/machinery/rust/fuel_injector/Injector in fuel_injectors[active_stage])
|
||||
for(var/stage_name in fuel_injectors)
|
||||
for(var/obj/machinery/rust/fuel_injector/Injector in fuel_injectors[stage_name])
|
||||
Injector.StopInjecting()
|
||||
active_stage = "Cooling"
|
||||
stage_status[stage_name] = 0
|
||||
updateDialog()
|
||||
return
|
||||
if( href_list["update"] )
|
||||
@@ -94,7 +119,7 @@
|
||||
|
||||
process()
|
||||
..()
|
||||
updateDialog()
|
||||
src.updateDialog()
|
||||
|
||||
proc
|
||||
interact(mob/user)
|
||||
@@ -104,12 +129,17 @@
|
||||
user << browse(null, "window=fuel_monitor")
|
||||
return
|
||||
var/t = "<B>Reactor Core Fuel Control</B><BR>"
|
||||
t += "Current fuel injection stage: [active_stage]<br>"
|
||||
if(active_stage == "Cooling")
|
||||
//t += "<a href='?src=\ref[src];restart=1;'>Restart injection cycle</a><br>"
|
||||
var/cooling = 0
|
||||
for(var/stage in stage_status)
|
||||
if(stage_status[stage])
|
||||
t += "Fuel injection: <font color=blue>Active</font><br>"
|
||||
t += "<a href='?src=\ref[src];cooldown=1;'>Enter cooldown phase</a><br>"
|
||||
cooling = 1
|
||||
break
|
||||
if(!cooling)
|
||||
t += "Fuel injection: <font color=blue>Cooling</font><br>"
|
||||
t += "----<br>"
|
||||
else
|
||||
t += "<a href='?src=\ref[src];cooldown=1;'>Enter cooldown phase</a><br>"
|
||||
//
|
||||
t += "Fuel depletion announcement: "
|
||||
t += "[announce_fueldepletion ? "<a href='?src=\ref[src];disable_fueldepletion=1'>Disable</a>" : "<b>Disabled</b>"] "
|
||||
t += "[announce_fueldepletion == 1 ? "<b>Announcing</b>" : "<a href='?src=\ref[src];announce_fueldepletion=1'>Announce</a>"] "
|
||||
@@ -126,18 +156,18 @@
|
||||
t += "<td><b>Fuel Assembly Port</b></td>"
|
||||
t += "<td><b>Assembly depletion percentage</b></td>"
|
||||
t += "</tr>"
|
||||
for(var/stage in fuel_injectors)
|
||||
var/list/cur_stage = fuel_injectors[stage]
|
||||
t += "<tr><td colspan=5><b>Fuel Injection Stage:</b> <font color=blue>[stage]</font> [active_stage == stage ? "<font color=green> (Currently active)</font>" : "<a href='?src=\ref[src];beginstage=[stage]'>Activate</a>"]</td></tr>"
|
||||
for(var/stage_name in fuel_injectors)
|
||||
var/list/cur_stage = fuel_injectors[stage_name]
|
||||
t += "<tr><td colspan=5><b>Fuel Injection Stage:</b> [stage_name]</font>, [stage_status[stage_name] ? "<font color=green>Active</font> <a href='?src=\ref[src];begincool=[stage_name]'>\[Enter cooldown\]</a>" : "Cooling <a href='?src=\ref[src];beginstage=[stage_name]'>\[Begin injection\]</a>"]</td></tr>"
|
||||
for(var/obj/machinery/rust/fuel_injector/Injector in cur_stage)
|
||||
t += "<tr>"
|
||||
t += "<td>[Injector.on && Injector.remote_enabled ? "<font color=green>Operational</font>" : "<font color=red>Unresponsive</font>"]</td>"
|
||||
t += "<td>[Injector.rate/10] <a href='?src=\ref[Injector];cyclerate=1'>Modify</a></td>"
|
||||
t += "<td>[Injector.fuel_usage*100]% <a href='?src=\ref[Injector];fuel_usage=1'>Modify</a></td>"
|
||||
t += "<td>[Injector.owned_assembly_port ? "[Injector.owned_assembly_port.cur_assembly ? "<font color=green>Loaded</font>": "<font color=blue>Empty</font>"]" : "<font color=red>Disconnected</font>" ]</td>"
|
||||
t += "<td>[Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[100 - Injector.owned_assembly_port.cur_assembly.amount_depleted*100]%" : ""]</td>"
|
||||
t += "<td>[Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[Injector.owned_assembly_port.cur_assembly.percent_depleted]%" : ""]</td>"
|
||||
t += "</tr>"
|
||||
t += "</table>"
|
||||
t += "<A href='?src=\ref[src];close=1'>Close</A><BR>"
|
||||
user << browse(t, "window=fuel_monitor;size=500x800")
|
||||
user << browse(t, "window=fuel_monitor;size=500x600")
|
||||
user.machine = src
|
||||
|
||||
@@ -196,7 +196,7 @@
|
||||
//
|
||||
owned_assembly_port.cur_assembly.rod_quantities[reagent] -= amount
|
||||
amount_left += owned_assembly_port.cur_assembly.rod_quantities[reagent]
|
||||
owned_assembly_port.cur_assembly.amount_depleted = amount_left / 300
|
||||
owned_assembly_port.cur_assembly.percent_depleted = amount_left / 300
|
||||
flick("injector-emitting",src)
|
||||
use_power(fuel_usage * 10000 + 100) //0.0001
|
||||
if(injecting)
|
||||
|
||||
@@ -88,9 +88,33 @@
|
||||
for(var/obj/machinery/computer/rust/gyrotron_controller/comp in range(25))
|
||||
comp.updateDialog()
|
||||
return
|
||||
|
||||
/*
|
||||
var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc )
|
||||
playsound(src.loc, 'emitter.ogg', 25, 1)
|
||||
if(prob(35))
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
A.dir = src.dir
|
||||
if(src.dir == 1)//Up
|
||||
A.yo = 20
|
||||
A.xo = 0
|
||||
else if(src.dir == 2)//Down
|
||||
A.yo = -20
|
||||
A.xo = 0
|
||||
else if(src.dir == 4)//Right
|
||||
A.yo = 0
|
||||
A.xo = 20
|
||||
else if(src.dir == 8)//Left
|
||||
A.yo = 0
|
||||
A.xo = -20
|
||||
else // Any other
|
||||
A.yo = -20
|
||||
A.xo = 0
|
||||
A.fired()
|
||||
*/
|
||||
proc/Emit()
|
||||
var/obj/item/projectile/beam/ehf_beam/A = new ( src.loc )
|
||||
var/obj/item/projectile/beam/ehf_beam/A = new /obj/item/projectile/beam/ehf_beam( src.loc )
|
||||
A.frequency = frequency
|
||||
A.damage = mega_energy * 500
|
||||
//
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
/obj/machinery/computer/rust/gyrotron_controller
|
||||
name = "Gyrotron Remote Controller"
|
||||
icon_state = "power"
|
||||
var/updating = 1
|
||||
|
||||
New()
|
||||
..()
|
||||
@@ -33,7 +34,8 @@
|
||||
|
||||
process()
|
||||
..()
|
||||
//updateDialog()
|
||||
if(updating)
|
||||
src.updateDialog()
|
||||
|
||||
proc
|
||||
interact(mob/user)
|
||||
@@ -96,5 +98,5 @@
|
||||
t += "</table>"
|
||||
*/
|
||||
t += "<A href='?src=\ref[src];close=1'>Close</A><BR>"
|
||||
user << browse(t, "window=gyrotron_controller;size=500x800")
|
||||
user << browse(t, "window=gyrotron_controller;size=500x400")
|
||||
user.machine = src
|
||||
|
||||
@@ -491,4 +491,21 @@
|
||||
for (var/mob/M in eavesdroppers)
|
||||
M << "\blue [src] speaks into their radio..."
|
||||
M << speech_bubble
|
||||
spawn(30) del(speech_bubble)
|
||||
spawn(30) del(speech_bubble)
|
||||
|
||||
/mob/living/carbon/human/tajaran/say_understands(var/other)
|
||||
if (istype(other, /mob/living/silicon/ai))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/decoy))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/pai))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/robot))
|
||||
return 1
|
||||
if (istype(other, /mob/living/carbon/brain))
|
||||
return 1
|
||||
if (istype(other, /mob/living/carbon/metroid))
|
||||
return 1
|
||||
if (istype(other, /mob/living/carbon/human))
|
||||
return 1
|
||||
return ..()
|
||||
@@ -16,7 +16,7 @@
|
||||
//animation = null
|
||||
var/mob/living/carbon/human/tajaran/O = new /mob/living/carbon/human/tajaran( loc )
|
||||
del(animation)
|
||||
del(O.organs)
|
||||
O.organs.Cut()
|
||||
O.organs = organs
|
||||
for(var/name in O.organs) //Ensuring organ trasnfer
|
||||
var/datum/organ/external/organ = O.organs[name]
|
||||
|
||||
@@ -5,8 +5,7 @@
|
||||
icon = 'tajaran.dmi'
|
||||
icon_state = "m_none"
|
||||
var/list/tajspeak_letters = list("~","*","-")
|
||||
//
|
||||
universal_speak = 1 //hacky fix until someone can figure out how to make them only understand humans
|
||||
//universal_speak = 1 (I think I fixed it, need testy testy) hacky fix until someone can figure out how to make them only understand humans
|
||||
taj_talk_understand = 1
|
||||
voice_message = "mrowls"
|
||||
examine_text = "one of the cat-like Tajarans"
|
||||
@@ -192,29 +191,29 @@
|
||||
// Gloves
|
||||
var/datum/organ/external/lo = organs["l_hand"]
|
||||
var/datum/organ/external/ro = organs["r_hand"]
|
||||
if (!(lo.status & DESTROYED && ro.status & DESTROYED))
|
||||
if (!(lo.status & ORGAN_DESTROYED && ro.status & ORGAN_DESTROYED))
|
||||
if (gloves)
|
||||
var/t1 = gloves.item_state
|
||||
if (!t1)
|
||||
t1 = gloves.icon_state
|
||||
var/icon/gloves_icon = new /icon("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
|
||||
if(lo.status & DESTROYED)
|
||||
if(lo.status & ORGAN_DESTROYED)
|
||||
gloves_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
else if(ro.status & DESTROYED)
|
||||
else if(ro.status & ORGAN_DESTROYED)
|
||||
gloves_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
overlays += image(gloves_icon, "layer" = MOB_LAYER)
|
||||
if (gloves.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
|
||||
if(lo.status & DESTROYED)
|
||||
if(lo.status & ORGAN_DESTROYED)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
else if(ro.status & DESTROYED)
|
||||
else if(ro.status & ORGAN_DESTROYED)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
else if (blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
|
||||
if(lo.status & DESTROYED)
|
||||
if(lo.status & ORGAN_DESTROYED)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
else if(ro.status & DESTROYED)
|
||||
else if(ro.status & ORGAN_DESTROYED)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
// Glasses
|
||||
@@ -231,19 +230,19 @@
|
||||
// Shoes
|
||||
lo = organs["l_foot"]
|
||||
ro = organs["r_foot"]
|
||||
if (!(lo.status & DESTROYED && ro.status & DESTROYED) && shoes)
|
||||
if (!(lo.status & ORGAN_DESTROYED && ro.status & ORGAN_DESTROYED) && shoes)
|
||||
var/t1 = shoes.icon_state
|
||||
var/icon/shoes_icon = new /icon("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
|
||||
if(lo.status & DESTROYED && !lying)
|
||||
if(lo.status & ORGAN_DESTROYED && !lying)
|
||||
shoes_icon.Blend(new /icon('limb_mask.dmi', "right[lying?"_l":""]"), ICON_MULTIPLY)
|
||||
else if(ro.status & DESTROYED && !lying)
|
||||
else if(ro.status & ORGAN_DESTROYED && !lying)
|
||||
shoes_icon.Blend(new /icon('limb_mask.dmi', "left[lying?"_l":""]"), ICON_MULTIPLY)
|
||||
overlays += image(shoes_icon, "layer" = MOB_LAYER)
|
||||
if (shoes.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "shoesblood[!lying ? "" : "2"]")
|
||||
if(lo.status & DESTROYED)
|
||||
if(lo.status & ORGAN_DESTROYED)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
else if(ro.status & DESTROYED)
|
||||
else if(ro.status & ORGAN_DESTROYED)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) // Radio
|
||||
/* if (w_radio)
|
||||
@@ -355,7 +354,7 @@
|
||||
head.screen_loc = ui_head
|
||||
else
|
||||
var/datum/organ/external/head = organs["head"]
|
||||
if(!(head.status & DESTROYED))
|
||||
if(!(head.status & ORGAN_DESTROYED))
|
||||
//if not wearing anything on the head, show the ears
|
||||
overlays += image("icon" = icon('tajaran.dmi', "ears_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER)
|
||||
|
||||
@@ -482,7 +481,7 @@
|
||||
lying_icon.Blend(new /icon('tajaran.dmi', "chest_[g]_l"), ICON_OVERLAY)
|
||||
|
||||
var/datum/organ/external/head = organs["head"]
|
||||
if(!(head.status & DESTROYED))
|
||||
if(!(head.status & ORGAN_DESTROYED))
|
||||
stand_icon.Blend(new /icon('tajaran.dmi', "head_[g]_s"), ICON_OVERLAY)
|
||||
lying_icon.Blend(new /icon('tajaran.dmi', "head_[g]_l"), ICON_OVERLAY)
|
||||
|
||||
@@ -491,12 +490,12 @@
|
||||
if(!istype(part, /datum/organ/external/groin) \
|
||||
&& !istype(part, /datum/organ/external/chest) \
|
||||
&& !istype(part, /datum/organ/external/head) \
|
||||
&& !(part.status & DESTROYED))
|
||||
&& !(part.status & ORGAN_DESTROYED))
|
||||
var/icon/temp = new /icon('tajaran.dmi', "[part.icon_name]_s")
|
||||
if(part.status & ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
||||
if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
||||
stand_icon.Blend(temp, ICON_OVERLAY)
|
||||
temp = new /icon('tajaran.dmi', "[part.icon_name]_l")
|
||||
if(part.status & ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
||||
if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
||||
lying_icon.Blend(temp , ICON_OVERLAY)
|
||||
|
||||
stand_icon.Blend(new /icon('tajaran.dmi', "groin_[g]_s"), ICON_OVERLAY)
|
||||
@@ -511,7 +510,7 @@
|
||||
if(!istype(part, /datum/organ/external/groin) \
|
||||
&& !istype(part, /datum/organ/external/chest) \
|
||||
&& !istype(part, /datum/organ/external/head) \
|
||||
&& (part.status & DESTROYED))
|
||||
&& (part.status & ORGAN_DESTROYED))
|
||||
husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT)
|
||||
husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT)
|
||||
|
||||
@@ -539,7 +538,7 @@
|
||||
if(organs)
|
||||
var/datum/organ/external/head = organs["head"]
|
||||
if(head)
|
||||
if(head.status & DESTROYED)
|
||||
if(head.status & ORGAN_DESTROYED)
|
||||
del(face_standing)
|
||||
del(face_lying)
|
||||
return
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 28 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 21 KiB |
@@ -15,8 +15,11 @@
|
||||
var/stress = 0
|
||||
|
||||
/obj/effect/energy_field/ex_act(var/severity)
|
||||
Stress(2)
|
||||
//nothing
|
||||
Stress(0.5 + severity)
|
||||
|
||||
/obj/effect/energy_field/bullet_act(var/obj/item/projectile/Proj)
|
||||
Stress(1 + 1 * (Proj.damage / 100))
|
||||
|
||||
|
||||
/obj/effect/energy_field/meteorhit(obj/effect/meteor/M as obj)
|
||||
if(M)
|
||||
@@ -31,6 +34,14 @@
|
||||
invisibility = 2
|
||||
density = 0
|
||||
|
||||
/obj/effect/energy_field/proc/Strengthen(var/severity)
|
||||
strength += severity
|
||||
|
||||
//if we take too much damage, drop out - the generator will bring us back up if we have enough power
|
||||
if(strength > 1)
|
||||
invisibility = 0
|
||||
density = 1
|
||||
|
||||
/obj/effect/energy_field/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0)
|
||||
//Purpose: Determines if the object (or airflow) can pass this atom.
|
||||
//Called by: Movement, airflow.
|
||||
@@ -38,4 +49,4 @@
|
||||
//Outputs: Boolean if can pass.
|
||||
|
||||
//return (!density || !height || air_group)
|
||||
return 0
|
||||
return density
|
||||
|
||||
@@ -34,18 +34,3 @@
|
||||
closed += T
|
||||
|
||||
return closed
|
||||
|
||||
/obj/machinery/shield_gen/external/process()
|
||||
/*if(stat & (NOPOWER|BROKEN))
|
||||
return*/
|
||||
if(!active)
|
||||
return
|
||||
/*spawn(100)
|
||||
power()*/
|
||||
/*if(src.active >= 1)
|
||||
if(src.power == 0)
|
||||
src.visible_message("\red The [src.name] shuts down due to lack of power!", \
|
||||
"You hear heavy droning fade out")
|
||||
icon_state = "generator0"
|
||||
src.active = 0*/
|
||||
..()
|
||||
|
||||
@@ -0,0 +1,261 @@
|
||||
#define MISSILE_SPEED 5
|
||||
|
||||
//automated turret that shoots missiles at meteors
|
||||
|
||||
/obj/item/projectile/missile
|
||||
name = "missile"
|
||||
icon = 'meteor_turret.dmi'
|
||||
icon_state = "missile"
|
||||
var/turf/target
|
||||
var/tracking = 0
|
||||
density = 1
|
||||
desc = "It's sparking and shaking slightly."
|
||||
|
||||
/obj/item/projectile/missile/fired(var/turf/newtarget)
|
||||
target = newtarget
|
||||
dir = get_dir(src.loc, target)
|
||||
walk_towards(src, target, MISSILE_SPEED)
|
||||
|
||||
/obj/item/projectile/missile/Bump(atom/A)
|
||||
spawn(0)
|
||||
if(istype(A,/obj/effect/meteor))
|
||||
del(A)
|
||||
explode()
|
||||
return
|
||||
|
||||
/obj/item/projectile/missile/proc/explode()
|
||||
explosion(src.loc, 1, 1, 2, 7, 0)
|
||||
playsound(src.loc, "explosion", 50, 1)
|
||||
del(src)
|
||||
|
||||
/obj/item/projectile/missile/attack_hand(mob/user)
|
||||
..()
|
||||
return attackby(null, user)
|
||||
|
||||
/obj/item/projectile/missile/attackby(obj/item/weapon/W, mob/user)
|
||||
//can't touch this
|
||||
..()
|
||||
explode()
|
||||
|
||||
/obj/machinery/meteor_battery
|
||||
name = "meteor battery"
|
||||
icon = 'meteor_turret.dmi'
|
||||
icon_state = "turret0"
|
||||
var/raised = 0
|
||||
var/enabled = 1
|
||||
anchored = 1
|
||||
layer = 3
|
||||
invisibility = 2
|
||||
density = 1
|
||||
var/health = 18
|
||||
var/id = ""
|
||||
var/obj/machinery/turretcover/cover = null
|
||||
var/popping = 0
|
||||
var/wasvalid = 0
|
||||
var/lastfired = 0
|
||||
var/shot_delay = 50
|
||||
var/datum/effect/effect/system/spark_spread/spark_system
|
||||
use_power = 1
|
||||
idle_power_usage = 50
|
||||
active_power_usage = 300
|
||||
var/atom/movable/cur_target
|
||||
var/targeting_active = 0
|
||||
var/protect_range = 30
|
||||
var/tracking_missiles = 0
|
||||
var/list/fired_missiles
|
||||
|
||||
/obj/machinery/meteor_battery/New()
|
||||
spark_system = new /datum/effect/effect/system/spark_spread
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.attach(src)
|
||||
fired_missiles = new/list()
|
||||
// targets = new
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/machinery/meteor_battery/proc/isPopping()
|
||||
return (popping!=0)
|
||||
|
||||
/obj/machinery/meteor_battery/power_change()
|
||||
if(stat & BROKEN)
|
||||
icon_state = "broke"
|
||||
else
|
||||
if( powered() )
|
||||
if (src.enabled)
|
||||
icon_state = "turret1"
|
||||
else
|
||||
icon_state = "turret0"
|
||||
stat &= ~NOPOWER
|
||||
else
|
||||
spawn(rand(0, 15))
|
||||
src.icon_state = "turret0"
|
||||
stat |= NOPOWER
|
||||
|
||||
/obj/machinery/meteor_battery/proc/setState(var/enabled)
|
||||
src.enabled = enabled
|
||||
src.power_change()
|
||||
|
||||
/obj/machinery/meteor_battery/proc/get_new_target()
|
||||
var/list/new_targets = new
|
||||
var/new_target
|
||||
for(var/obj/effect/meteor/M in view(protect_range, get_turf(src)))
|
||||
new_targets += M
|
||||
if(new_targets.len)
|
||||
new_target = pick(new_targets)
|
||||
return new_target
|
||||
|
||||
/obj/machinery/meteor_battery/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if(src.cover==null)
|
||||
src.cover = new /obj/machinery/turretcover(src.loc)
|
||||
src.cover.host = src
|
||||
if(!enabled)
|
||||
if(!isDown() && !isPopping())
|
||||
popDown()
|
||||
return
|
||||
|
||||
//update our missiles
|
||||
for(var/obj/item/projectile/missile/M in fired_missiles)
|
||||
if(!M)
|
||||
fired_missiles.Remove(M)
|
||||
continue
|
||||
if(tracking_missiles && cur_target)
|
||||
//update homing missile target
|
||||
M.target = get_turf(cur_target)
|
||||
walk_towards(M, M.target, MISSILE_SPEED)
|
||||
|
||||
if(get_turf(M) == M.target && M)
|
||||
//missile has arrived at destination
|
||||
fired_missiles.Remove(M)
|
||||
if( istype(get_turf(M), /turf/space) )
|
||||
//send the missile shooting off into the distance
|
||||
walk(M, get_dir(src,M), MISSILE_SPEED)
|
||||
spawn(rand(3,10) * 10)
|
||||
if(M)
|
||||
M.explode()
|
||||
else if(rand(3) == 3)
|
||||
//chance to blow up later (between 4 seconds and 2 minutes), or just sit there being ominous
|
||||
spawn(rand(4,120) * 10)
|
||||
M.explode()
|
||||
for(var/mob/P in view(7))
|
||||
P.visible_message("\red The missile skids to a halt, vibrating and sparking ominously!")
|
||||
|
||||
if(!cur_target)
|
||||
cur_target = get_new_target() //get new target
|
||||
|
||||
if(cur_target) //if it's found, proceed
|
||||
if(!isPopping())
|
||||
if(isDown())
|
||||
popUp()
|
||||
use_power = 2
|
||||
else
|
||||
spawn()
|
||||
if(!targeting_active)
|
||||
targeting_active = 1
|
||||
target()
|
||||
targeting_active = 0
|
||||
else if(!isPopping())//else, pop down
|
||||
if(!isDown())
|
||||
popDown()
|
||||
use_power = 1
|
||||
|
||||
return
|
||||
|
||||
/obj/machinery/meteor_battery/proc/target()
|
||||
while(src && enabled && !stat)
|
||||
src.dir = get_dir(src, cur_target)
|
||||
shootAt(cur_target)
|
||||
sleep(shot_delay)
|
||||
return
|
||||
|
||||
/obj/machinery/meteor_battery/proc/shootAt(var/atom/movable/target)
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/U = get_turf(target)
|
||||
if (!T || !U)
|
||||
return
|
||||
use_power(500)
|
||||
var/obj/item/projectile/missile/A = new(T)
|
||||
A.tracking = tracking_missiles
|
||||
fired_missiles.Add(A)
|
||||
spawn(0)
|
||||
A.fired(U)
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/meteor_battery/proc/isDown()
|
||||
return (invisibility!=0)
|
||||
|
||||
/obj/machinery/meteor_battery/proc/popUp()
|
||||
if ((!isPopping()) || src.popping==-1)
|
||||
invisibility = 0
|
||||
popping = 1
|
||||
if (src.cover!=null)
|
||||
flick("popup", src.cover)
|
||||
src.cover.icon_state = "openTurretCover"
|
||||
spawn(10)
|
||||
if (popping==1) popping = 0
|
||||
|
||||
/obj/machinery/meteor_battery/proc/popDown()
|
||||
if ((!isPopping()) || src.popping==1)
|
||||
popping = -1
|
||||
if (src.cover!=null)
|
||||
flick("popdown", src.cover)
|
||||
src.cover.icon_state = "turretCover"
|
||||
spawn(10)
|
||||
if (popping==-1)
|
||||
invisibility = 2
|
||||
popping = 0
|
||||
|
||||
/obj/machinery/meteor_battery/bullet_act(var/obj/item/projectile/Proj)
|
||||
src.health -= Proj.damage
|
||||
..()
|
||||
if(prob(45) && Proj.damage > 0) src.spark_system.start()
|
||||
if (src.health <= 0)
|
||||
src.die()
|
||||
return
|
||||
|
||||
/obj/machinery/meteor_battery/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N
|
||||
..()
|
||||
playsound(src.loc, 'smash.ogg', 60, 1)
|
||||
src.spark_system.start()
|
||||
src.health -= W.force * 0.5
|
||||
if (src.health <= 0)
|
||||
src.die()
|
||||
return
|
||||
|
||||
/obj/machinery/meteor_battery/emp_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
enabled = 0
|
||||
power_change()
|
||||
..()
|
||||
|
||||
/obj/machinery/meteor_battery/ex_act(severity)
|
||||
if(severity < 3)
|
||||
src.die()
|
||||
|
||||
/obj/machinery/meteor_battery/proc/die()
|
||||
src.health = 0
|
||||
src.density = 0
|
||||
src.stat |= BROKEN
|
||||
src.icon_state = "broke"
|
||||
if (cover!=null)
|
||||
del(cover)
|
||||
sleep(3)
|
||||
flick("explosion", src)
|
||||
spawn(13)
|
||||
del(src)
|
||||
|
||||
/obj/machinery/meteor_battery/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if(!(stat & BROKEN))
|
||||
playsound(src.loc, 'slash.ogg', 25, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[] has slashed at []!</B>", M, src), 1)
|
||||
src.health -= 15
|
||||
if (src.health <= 0)
|
||||
src.die()
|
||||
else
|
||||
M << "\green That object is useless to you."
|
||||
return
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 4.1 KiB |
@@ -26,12 +26,13 @@
|
||||
var/charge_rate = 100
|
||||
|
||||
/obj/machinery/shield_capacitor/New()
|
||||
spawn(10)
|
||||
for(var/obj/machinery/shield_gen/possible_gen in range(1, src))
|
||||
if(get_dir(src, possible_gen) == src.dir)
|
||||
target_generator = possible_gen
|
||||
possible_gen.owned_capacitor = src
|
||||
break
|
||||
..()
|
||||
target_generator = locate() in get_step(src,dir)
|
||||
if(target_generator && !target_generator.owned_capacitor)
|
||||
target_generator.owned_capacitor = src
|
||||
/*spawn(10)
|
||||
check_powered()*/
|
||||
|
||||
/obj/machinery/shield_capacitor/verb/rotate()
|
||||
set name = "Rotate Clockwise"
|
||||
@@ -42,10 +43,9 @@
|
||||
usr << "It is fastened to the floor!"
|
||||
return 0
|
||||
src.dir = turn(src.dir, 270)
|
||||
for(var/obj/machinery/shield_gen/possible_gen in range(1))
|
||||
if(get_dir(src, possible_gen) == dir)
|
||||
possible_gen.owned_capacitor = src
|
||||
break
|
||||
target_generator = locate() in get_step(src,dir)
|
||||
if(target_generator && !target_generator.owned_capacitor)
|
||||
target_generator.owned_capacitor = src
|
||||
return 1
|
||||
|
||||
/obj/machinery/shield_capacitor/power_change()
|
||||
|
||||
@@ -34,14 +34,14 @@
|
||||
active_power_usage = 100
|
||||
|
||||
/obj/machinery/shield_gen/New()
|
||||
..()
|
||||
spawn(10)
|
||||
for(var/obj/machinery/shield_capacitor/possible_cap in range(1, src))
|
||||
if(get_dir(possible_cap, src) == possible_cap.dir)
|
||||
owned_capacitor = possible_cap
|
||||
possible_cap.target_generator = src
|
||||
break
|
||||
field = new/list()
|
||||
for(var/obj/machinery/shield_capacitor/possible_cap in range(1))
|
||||
if(get_dir(possible_cap, src) == possible_cap.dir)
|
||||
owned_capacitor = possible_cap
|
||||
break
|
||||
/*spawn(10)
|
||||
check_powered()*/
|
||||
..()
|
||||
|
||||
//copied from a copypaste. DRY, right?
|
||||
/obj/machinery/shield_gen/proc/check_powered()
|
||||
@@ -78,12 +78,6 @@
|
||||
|
||||
/obj/machinery/shield_gen/process()
|
||||
|
||||
if(!owned_capacitor)
|
||||
for(var/obj/machinery/shield_capacitor/possible_cap in range(1))
|
||||
if(get_dir(possible_cap, src) == possible_cap.dir)
|
||||
owned_capacitor = possible_cap
|
||||
break
|
||||
|
||||
if(active && field.len)
|
||||
var/stored_renwicks = 0
|
||||
var/target_field_strength = min(average_field_strength + strengthen_rate, max_field_strength)
|
||||
|
||||
@@ -208,11 +208,11 @@
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
new /obj/item/clothing/suit/storage/captunic(src)
|
||||
new /obj/item/clothing/suit/armor/vest(src)
|
||||
new /obj/item/clothing/head/caphat(src)
|
||||
new /obj/item/clothing/head/helmet/cap(src)
|
||||
new /obj/item/clothing/gloves/captain(src)
|
||||
new /obj/item/clothing/head/helmet/swat(src)
|
||||
new /obj/item/device/radio/headset/heads/captain(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
new /obj/item/clothing/shoes/jackboots(src)
|
||||
new /obj/item/clothing/under/rank/captain(src)
|
||||
|
||||
/obj/item/wardrobe/hop
|
||||
@@ -224,12 +224,10 @@
|
||||
var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
|
||||
new /obj/item/weapon/storage/box(BPK)
|
||||
new /obj/item/weapon/pen(src)
|
||||
new /obj/item/weapon/clipboard(src)
|
||||
new /obj/item/device/pda/heads/hop(src)
|
||||
new /obj/item/weapon/storage/id_kit(src)
|
||||
new /obj/item/weapon/gun/energy/gun(src)
|
||||
new /obj/item/device/flash(src)
|
||||
new /obj/item/clothing/suit/armor/vest(src)
|
||||
new /obj/item/clothing/head/helmet(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
new /obj/item/clothing/gloves/blue(src)
|
||||
new /obj/item/device/radio/headset/heads/hop(src)
|
||||
@@ -410,6 +408,8 @@
|
||||
new /obj/item/device/radio/headset/headset_sec(src)
|
||||
new /obj/item/clothing/shoes/jackboots(src)
|
||||
new /obj/item/clothing/under/rank/warden(src)
|
||||
new /obj/item/clothing/suit/armor/vest/warden(src)
|
||||
new /obj/item/weapon/pepperspray(src)
|
||||
|
||||
/obj/item/wardrobe/detective
|
||||
name = "\improper Detective Wardrobe"
|
||||
@@ -525,7 +525,7 @@
|
||||
new /obj/item/device/pda/quartermaster(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
new /obj/item/device/radio/headset/heads/qm(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
new /obj/item/clothing/under/rank/cargo(src)
|
||||
|
||||
/obj/item/wardrobe/cargo_tech
|
||||
@@ -541,6 +541,7 @@
|
||||
new /obj/item/device/radio/headset/headset_cargo(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/under/rank/cargotech(src)
|
||||
new /obj/item/clothing/gloves/fingerless/black(src)
|
||||
|
||||
/obj/item/wardrobe/mining
|
||||
name = "\improper Shaft Miner Wardrobe"
|
||||
@@ -561,6 +562,7 @@
|
||||
new /obj/item/device/radio/headset/headset_mine(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/under/rank/miner(src)
|
||||
new /obj/item/clothing/gloves/fingerless/black(src)
|
||||
|
||||
/obj/item/wardrobe/janitor
|
||||
name = "\improper Janitor Wardrobe"
|
||||
@@ -574,6 +576,7 @@
|
||||
new /obj/item/device/pda/janitor(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/under/rank/janitor(src)
|
||||
new /obj/item/device/portalathe(src)
|
||||
|
||||
/obj/item/wardrobe/librarian
|
||||
name = "\improper Librarian Wardrobe"
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
Life()
|
||||
..()
|
||||
|
||||
if(alive)
|
||||
if(stat != DEAD)
|
||||
meat_amount = round(nutrition / 50)
|
||||
|
||||
nutrition_step--
|
||||
@@ -152,7 +152,7 @@
|
||||
..()
|
||||
|
||||
// go right before cycle elapses, and if animal isn't starving
|
||||
if(alive && nutrition_step == 1 && nutrition > max_nutrition / 2)
|
||||
if(stat != DEAD && nutrition_step == 1 && nutrition > max_nutrition / 2)
|
||||
// lay an egg with probability of 5% in 5 second time period
|
||||
if(prob(33))
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/egg(src.loc) // lay an egg
|
||||
|
||||
@@ -455,12 +455,12 @@ proc/airborne_can_reach(turf/source, turf/target)
|
||||
var/name = pick(mob.organs)
|
||||
var/datum/organ/external/organ = mob.organs[name]
|
||||
|
||||
if(!(organ.status & BROKEN) && !(organ.status & ROBOT))
|
||||
if(!(organ.status & ORGAN_BROKEN) && !(organ.status & ORGAN_ROBOT))
|
||||
mob.adjustBruteLoss(10)
|
||||
mob.visible_message("\red You hear a loud cracking sound coming from [mob.name].","\red <b>Something feels like it shattered in your [organ.display_name]!</b>","You hear a sickening crack.")
|
||||
mob.emote("scream")
|
||||
organ.status |= BROKEN
|
||||
organ.broken_description = pick("broken","fracture","hairline fracture") //Randomise in future. Edit: Randomized. --SkyMarshal
|
||||
organ.status |= ORGAN_BROKEN
|
||||
organ.broken_description = pick("broken","fracture","hairline fracture")
|
||||
organ.perma_injury = 10
|
||||
|
||||
|
||||
|
||||
+4
-38
@@ -48,44 +48,6 @@ atom/movable/RepelAirflowDest(n)
|
||||
|
||||
*/
|
||||
|
||||
vs_control/var
|
||||
airflow_lightest_pressure = 30
|
||||
airflow_lightest_pressure_NAME = "Airflow - Small Movement Threshold %"
|
||||
airflow_lightest_pressure_DESC = "Percent of 1 Atm. at which items with the small weight classes will move."
|
||||
airflow_light_pressure = 45
|
||||
airflow_light_pressure_NAME = "Airflow - Medium Movement Threshold %"
|
||||
airflow_light_pressure_DESC = "Percent of 1 Atm. at which items with the medium weight classes will move."
|
||||
airflow_medium_pressure = 90
|
||||
airflow_medium_pressure_NAME = "Airflow - Heavy Movement Threshold %"
|
||||
airflow_medium_pressure_DESC = "Percent of 1 Atm. at which items with the largest weight classes will move."
|
||||
airflow_heavy_pressure = 95
|
||||
airflow_heavy_pressure_NAME = "Airflow - Mob Movement Threshold %"
|
||||
airflow_heavy_pressure_DESC = "Percent of 1 Atm. at which mobs will move."
|
||||
airflow_dense_pressure = 120
|
||||
airflow_dense_pressure_NAME = "Airflow - Dense Movement Threshold %"
|
||||
airflow_dense_pressure_DESC = "Percent of 1 Atm. at which items with canisters and closets will move."
|
||||
airflow_stun_pressure = 100
|
||||
airflow_stun_pressure_NAME = "Airflow - Mob Stunning Threshold %"
|
||||
airflow_stun_pressure_DESC = "Percent of 1 Atm. at which mobs will be stunned by airflow."
|
||||
airflow_stun_cooldown = 60
|
||||
airflow_stun_cooldown_NAME = "Aiflow Stunning - Cooldown"
|
||||
airflow_stun_cooldown_DESC = "How long, in tenths of a second, to wait before stunning them again."
|
||||
airflow_stun = 0.15
|
||||
airflow_stun_NAME = "Airflow Impact - Stunning"
|
||||
airflow_stun_DESC = "How much a mob is stunned when hit by an object."
|
||||
airflow_damage = 0.3
|
||||
airflow_damage_NAME = "Airflow Impact - Damage"
|
||||
airflow_damage_DESC = "Damage from airflow impacts."
|
||||
airflow_speed_decay = 1.5
|
||||
airflow_speed_decay_NAME = "Airflow Speed Decay"
|
||||
airflow_speed_decay_DESC = "How rapidly the speed gained from airflow decays."
|
||||
airflow_delay = 30
|
||||
airflow_delay_NAME = "Airflow Retrigger Delay"
|
||||
airflow_delay_DESC = "Time in deciseconds before things can be moved by airflow again."
|
||||
airflow_mob_slowdown = 1
|
||||
airflow_mob_slowdown_NAME = "Airflow Slowdown"
|
||||
airflow_mob_slowdown_DESC = "Time in tenths of a second to add as a delay to each movement by a mob if they are fighting the pull of the airflow."
|
||||
|
||||
mob/var/tmp/last_airflow_stun = 0
|
||||
mob/proc/airflow_stun()
|
||||
if(stat == 2)
|
||||
@@ -309,6 +271,8 @@ atom/movable
|
||||
src.airflow_dest = locate(min(max(src.x + xo, 1), world.maxx), min(max(src.y + yo, 1), world.maxy), src.z)
|
||||
if ((src.x == 1 || src.x == world.maxx || src.y == 1 || src.y == world.maxy))
|
||||
return
|
||||
if(!istype(loc, /turf))
|
||||
return
|
||||
step_towards(src, src.airflow_dest)
|
||||
if(ismob(src) && src:client) src:client:move_delay = world.time + vsc.airflow_mob_slowdown
|
||||
airflow_dest = null
|
||||
@@ -363,6 +327,8 @@ atom/movable
|
||||
src.airflow_dest = locate(min(max(src.x + xo, 1), world.maxx), min(max(src.y + yo, 1), world.maxy), src.z)
|
||||
if ((src.x == 1 || src.x == world.maxx || src.y == 1 || src.y == world.maxy))
|
||||
return
|
||||
if(!istype(loc, /turf))
|
||||
return
|
||||
step_towards(src, src.airflow_dest)
|
||||
if(ismob(src) && src:client) src:client:move_delay = world.time + vsc.airflow_mob_slowdown
|
||||
airflow_dest = null
|
||||
|
||||
+214
-168
@@ -2,10 +2,14 @@
|
||||
This object is contained within zone/var/connections. It's generated whenever two turfs from different zones are linked.
|
||||
Indirect connections will not merge the two zones after they reach equilibrium.
|
||||
*/
|
||||
#define CONNECTION_DIRECT 2
|
||||
#define CONNECTION_INDIRECT 1
|
||||
#define CONNECTION_CLOSED 0
|
||||
|
||||
|
||||
connection
|
||||
var
|
||||
turf //The turfs involved in the connection.
|
||||
turf/simulated //The turfs involved in the connection.
|
||||
A
|
||||
B
|
||||
zone
|
||||
@@ -16,6 +20,7 @@ connection
|
||||
indirect = 0 //If the connection is purely indirect, the zones should not join.
|
||||
last_updated //The tick at which this was last updated.
|
||||
no_zone_count = 0
|
||||
|
||||
New(turf/T,turf/O)
|
||||
A = T
|
||||
B = O
|
||||
@@ -30,67 +35,59 @@ connection
|
||||
zone_B = B.zone
|
||||
ref_B = "\ref[B]"
|
||||
|
||||
if(!air_master.tiles_with_connections)
|
||||
air_master.tiles_with_connections = list()
|
||||
|
||||
if(air_master.tiles_with_connections[ref_A])
|
||||
var/list/A_connections = air_master.tiles_with_connections[ref_A]
|
||||
A_connections |= src
|
||||
if(ref_A in air_master.turfs_with_connections)
|
||||
var/list/connections = air_master.turfs_with_connections[ref_A]
|
||||
connections.Add(src)
|
||||
else
|
||||
var/list/A_connections = list(src)
|
||||
air_master.tiles_with_connections[ref_A] = A_connections
|
||||
air_master.turfs_with_connections[ref_A] = list(src)
|
||||
|
||||
if(air_master.tiles_with_connections[ref_B])
|
||||
var/list/B_connections = air_master.tiles_with_connections[ref_B]
|
||||
B_connections |= src
|
||||
if(ref_B in air_master.turfs_with_connections)
|
||||
var/list/connections = air_master.turfs_with_connections[ref_B]
|
||||
connections.Add(src)
|
||||
else
|
||||
var/list/B_connections = list(src)
|
||||
air_master.tiles_with_connections[ref_B] = B_connections
|
||||
air_master.turfs_with_connections[ref_B] = list(src)
|
||||
|
||||
if(!A.zone.connected_zones)
|
||||
A.zone.connected_zones = list()
|
||||
if(!B.zone.connected_zones)
|
||||
B.zone.connected_zones = list()
|
||||
|
||||
if(!(B.zone in A.zone.connected_zones))
|
||||
if(B.zone in A.zone.connected_zones)
|
||||
A.zone.connected_zones[B.zone]++
|
||||
else
|
||||
A.zone.connected_zones += B.zone
|
||||
A.zone.connected_zones[B.zone] = 1
|
||||
else
|
||||
A.zone.connected_zones[B.zone]++
|
||||
|
||||
if(!(A.zone in B.zone.connected_zones))
|
||||
if(A.zone in B.zone.connected_zones)
|
||||
B.zone.connected_zones[A.zone]++
|
||||
else
|
||||
B.zone.connected_zones += A.zone
|
||||
B.zone.connected_zones[A.zone] = 1
|
||||
else
|
||||
B.zone.connected_zones[A.zone]++
|
||||
if(A.HasDoor(B) || B.HasDoor(A))
|
||||
indirect = 1
|
||||
else
|
||||
world.log << "Attempted to create connection object for non-zone tiles: [T] -> [O]"
|
||||
del(src)
|
||||
|
||||
Del()
|
||||
if(ref_B in air_master.turfs_with_connections)
|
||||
var/list/connections = air_master.turfs_with_connections[ref_B]
|
||||
connections.Remove(src)
|
||||
|
||||
if(ref_A in air_master.turfs_with_connections)
|
||||
var/list/connections = air_master.turfs_with_connections[ref_A]
|
||||
connections.Remove(src)
|
||||
|
||||
if(A)
|
||||
if(A.zone && A.zone.connections)
|
||||
A.zone.connections.Remove(src)
|
||||
if(!A.zone.connections.len)
|
||||
del A.zone.connections
|
||||
if(ref_A in air_master.tiles_with_connections)
|
||||
var/list/A_connections = air_master.tiles_with_connections[ref_A]
|
||||
A_connections -= src
|
||||
if(A_connections && !A_connections.len)
|
||||
del A_connections
|
||||
air_master.tiles_with_connections.Remove(ref_A)
|
||||
if(B)
|
||||
if(B.zone && B.zone.connections)
|
||||
B.zone.connections.Remove(src)
|
||||
if(!B.zone.connections.len)
|
||||
del B.zone.connections
|
||||
if(ref_B in air_master.tiles_with_connections)
|
||||
var/list/B_connections = air_master.tiles_with_connections[ref_B]
|
||||
B_connections -= src
|
||||
if(B_connections && !B_connections.len)
|
||||
del B_connections
|
||||
air_master.tiles_with_connections.Remove(ref_B)
|
||||
if(zone_A)
|
||||
if(zone_A && zone_A.connections)
|
||||
zone_A.connections.Remove(src)
|
||||
@@ -102,74 +99,75 @@ connection
|
||||
if(!zone_B.connections.len)
|
||||
del zone_B.connections
|
||||
|
||||
if(A && A.zone)
|
||||
if(B && B.zone)
|
||||
if(B.zone in A.zone.connected_zones)
|
||||
if(A.zone.connected_zones[B.zone] > 1)
|
||||
A.zone.connected_zones[B.zone]--
|
||||
else
|
||||
A.zone.connected_zones -= B.zone
|
||||
if(A.zone.connected_zones && !A.zone.connected_zones.len)
|
||||
A.zone.connected_zones = null
|
||||
if( zone_B && (!B.zone || zone_B != B.zone) )
|
||||
if(zone_B in A.zone.connected_zones)
|
||||
if(A.zone.connected_zones[zone_B] > 1)
|
||||
A.zone.connected_zones[zone_B]--
|
||||
else
|
||||
A.zone.connected_zones -= zone_B
|
||||
if(A.zone.connected_zones && !A.zone.connected_zones.len)
|
||||
A.zone.connected_zones = null
|
||||
if(zone_A && (!A.zone || zone_A != A.zone))
|
||||
if(B && B.zone)
|
||||
if(B.zone in zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[B.zone] > 1)
|
||||
zone_A.connected_zones[B.zone]--
|
||||
else
|
||||
zone_A.connected_zones -= B.zone
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
if( zone_B && (!B.zone || zone_B != B.zone) )
|
||||
if(zone_B in zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[zone_B] > 1)
|
||||
zone_A.connected_zones[zone_B]--
|
||||
else
|
||||
zone_A.connected_zones -= zone_B
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
if(B && B.zone)
|
||||
if(indirect != CONNECTION_CLOSED)
|
||||
if(A && A.zone)
|
||||
if(A.zone in B.zone.connected_zones)
|
||||
if(B.zone.connected_zones[A.zone] > 1)
|
||||
B.zone.connected_zones[A.zone]--
|
||||
else
|
||||
B.zone.connected_zones -= A.zone
|
||||
if(B.zone.connected_zones && !B.zone.connected_zones.len)
|
||||
B.zone.connected_zones = null
|
||||
if( zone_A && (!A.zone || zone_A != A.zone) )
|
||||
if(zone_A in B.zone.connected_zones)
|
||||
if(B.zone.connected_zones[zone_A] > 1)
|
||||
B.zone.connected_zones[zone_A]--
|
||||
else
|
||||
B.zone.connected_zones -= zone_A
|
||||
if(B.zone.connected_zones && !B.zone.connected_zones.len)
|
||||
B.zone.connected_zones = null
|
||||
if(zone_B && (!B.zone || zone_B != B.zone))
|
||||
if(A && A.zone)
|
||||
if(A.zone in zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[A.zone] > 1)
|
||||
zone_B.connected_zones[A.zone]--
|
||||
else
|
||||
zone_B.connected_zones -= A.zone
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
if( zone_A && (!A.zone || zone_A != A.zone) )
|
||||
if(zone_A in zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[zone_A] > 1)
|
||||
zone_B.connected_zones[zone_A]--
|
||||
else
|
||||
zone_B.connected_zones -= zone_A
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
if(B && B.zone)
|
||||
if(B.zone in A.zone.connected_zones)
|
||||
if(A.zone.connected_zones[B.zone] > 1)
|
||||
A.zone.connected_zones[B.zone]--
|
||||
else
|
||||
A.zone.connected_zones -= B.zone
|
||||
if(A.zone.connected_zones && !A.zone.connected_zones.len)
|
||||
A.zone.connected_zones = null
|
||||
if( zone_B && (!B.zone || zone_B != B.zone) )
|
||||
if(zone_B in A.zone.connected_zones)
|
||||
if(A.zone.connected_zones[zone_B] > 1)
|
||||
A.zone.connected_zones[zone_B]--
|
||||
else
|
||||
A.zone.connected_zones -= zone_B
|
||||
if(A.zone.connected_zones && !A.zone.connected_zones.len)
|
||||
A.zone.connected_zones = null
|
||||
if(zone_A && (!A.zone || zone_A != A.zone))
|
||||
if(B && B.zone)
|
||||
if(B.zone in zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[B.zone] > 1)
|
||||
zone_A.connected_zones[B.zone]--
|
||||
else
|
||||
zone_A.connected_zones -= B.zone
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
if( zone_B && (!B.zone || zone_B != B.zone) )
|
||||
if(zone_B in zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[zone_B] > 1)
|
||||
zone_A.connected_zones[zone_B]--
|
||||
else
|
||||
zone_A.connected_zones -= zone_B
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
if(B && B.zone)
|
||||
if(A && A.zone)
|
||||
if(A.zone in B.zone.connected_zones)
|
||||
if(B.zone.connected_zones[A.zone] > 1)
|
||||
B.zone.connected_zones[A.zone]--
|
||||
else
|
||||
B.zone.connected_zones -= A.zone
|
||||
if(B.zone.connected_zones && !B.zone.connected_zones.len)
|
||||
B.zone.connected_zones = null
|
||||
if( zone_A && (!A.zone || zone_A != A.zone) )
|
||||
if(zone_A in B.zone.connected_zones)
|
||||
if(B.zone.connected_zones[zone_A] > 1)
|
||||
B.zone.connected_zones[zone_A]--
|
||||
else
|
||||
B.zone.connected_zones -= zone_A
|
||||
if(B.zone.connected_zones && !B.zone.connected_zones.len)
|
||||
B.zone.connected_zones = null
|
||||
if(zone_B && (!B.zone || zone_B != B.zone))
|
||||
if(A && A.zone)
|
||||
if(A.zone in zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[A.zone] > 1)
|
||||
zone_B.connected_zones[A.zone]--
|
||||
else
|
||||
zone_B.connected_zones -= A.zone
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
if( zone_A && (!A.zone || zone_A != A.zone) )
|
||||
if(zone_A in zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[zone_A] > 1)
|
||||
zone_B.connected_zones[zone_A]--
|
||||
else
|
||||
zone_B.connected_zones -= zone_A
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
. = ..()
|
||||
|
||||
proc/Cleanup()
|
||||
@@ -193,12 +191,50 @@ connection
|
||||
|
||||
proc/CheckPassSanity()
|
||||
Cleanup()
|
||||
if(!A.CanPass(null, B, 0, 0) || !B.CanPass(null, A, 0, 0))
|
||||
del src
|
||||
if(A.HasDoor(B) || B.HasDoor(A))
|
||||
indirect = 1
|
||||
else
|
||||
indirect = 0
|
||||
if(A.zone && B.zone)
|
||||
if(A.ZAirPass(B))
|
||||
var/door_pass = A.CanPass(null,B,1.5,1)
|
||||
if(door_pass || A.CanPass(null,B,0,0))
|
||||
if(indirect == CONNECTION_CLOSED)
|
||||
//ADJUST FOR CAN CONNECT
|
||||
if(!A.zone.connected_zones)
|
||||
A.zone.connected_zones = list()
|
||||
if(B.zone in A.zone.connected_zones)
|
||||
A.zone.connected_zones[B.zone]++
|
||||
else
|
||||
A.zone.connected_zones += B.zone
|
||||
A.zone.connected_zones[B.zone] = 1
|
||||
|
||||
if(!B.zone.connected_zones)
|
||||
B.zone.connected_zones = list()
|
||||
if(A.zone in B.zone.connected_zones)
|
||||
B.zone.connected_zones[A.zone]++
|
||||
else
|
||||
B.zone.connected_zones += A.zone
|
||||
B.zone.connected_zones[A.zone] = 1
|
||||
if(door_pass)
|
||||
indirect = CONNECTION_DIRECT
|
||||
else if(!door_pass)
|
||||
indirect = CONNECTION_INDIRECT
|
||||
else if(indirect > CONNECTION_CLOSED)
|
||||
indirect = CONNECTION_CLOSED
|
||||
//ADJUST FOR CANNOT CONNECT
|
||||
if(A.zone.connected_zones)
|
||||
if(A.zone.connected_zones[B.zone] > 1)
|
||||
A.zone.connected_zones[B.zone]--
|
||||
else
|
||||
A.zone.connected_zones.Remove(B.zone)
|
||||
if(A.zone.connected_zones && !A.zone.connected_zones.len)
|
||||
A.zone.connected_zones = null
|
||||
if(B.zone.connected_zones)
|
||||
if(B.zone.connected_zones[A.zone] > 1)
|
||||
B.zone.connected_zones[A.zone]--
|
||||
else
|
||||
B.zone.connected_zones.Remove(A.zone)
|
||||
if(B.zone.connected_zones && !B.zone.connected_zones.len)
|
||||
B.zone.connected_zones = null
|
||||
else //If I can no longer pass air, better delete
|
||||
del src
|
||||
|
||||
proc/Sanitize()
|
||||
//If the zones change on connected turfs, update it.
|
||||
@@ -223,13 +259,14 @@ connection
|
||||
if(!zone_A.connections.len)
|
||||
del zone_A.connections
|
||||
|
||||
if(zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[zone_B] > 1)
|
||||
zone_A.connected_zones[zone_B]--
|
||||
else
|
||||
zone_A.connected_zones.Remove(zone_B)
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
if(indirect != CONNECTION_CLOSED)
|
||||
if(zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[zone_B] > 1)
|
||||
zone_A.connected_zones[zone_B]--
|
||||
else
|
||||
zone_A.connected_zones.Remove(zone_B)
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
|
||||
if(zone_B)
|
||||
if(zone_B.connections)
|
||||
@@ -237,36 +274,38 @@ connection
|
||||
if(!zone_B.connections.len)
|
||||
del zone_B.connections
|
||||
|
||||
if(zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[zone_A] > 1)
|
||||
zone_B.connected_zones[zone_A]--
|
||||
else
|
||||
zone_B.connected_zones.Remove(zone_A)
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
if(indirect != CONNECTION_CLOSED)
|
||||
if(zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[zone_A] > 1)
|
||||
zone_B.connected_zones[zone_A]--
|
||||
else
|
||||
zone_B.connected_zones.Remove(zone_A)
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
|
||||
if(!A.zone.connections)
|
||||
A.zone.connections = list()
|
||||
A.zone.connections |= src
|
||||
if(!B.zone.connections)
|
||||
B.zone.connections = list()
|
||||
B.zone.connections |= src
|
||||
if(indirect != CONNECTION_CLOSED)
|
||||
if(!A.zone.connections)
|
||||
A.zone.connections = list()
|
||||
A.zone.connections |= src
|
||||
if(!B.zone.connections)
|
||||
B.zone.connections = list()
|
||||
B.zone.connections |= src
|
||||
|
||||
if(!A.zone.connected_zones)
|
||||
A.zone.connected_zones = list()
|
||||
if(!(B.zone in A.zone.connected_zones))
|
||||
A.zone.connected_zones += B.zone
|
||||
A.zone.connected_zones[B.zone] = 1
|
||||
else
|
||||
A.zone.connected_zones[B.zone]++
|
||||
if(!A.zone.connected_zones)
|
||||
A.zone.connected_zones = list()
|
||||
if(B.zone in A.zone.connected_zones)
|
||||
A.zone.connected_zones[B.zone]++
|
||||
else
|
||||
A.zone.connected_zones += B.zone
|
||||
A.zone.connected_zones[B.zone] = 1
|
||||
|
||||
if(!B.zone.connected_zones)
|
||||
B.zone.connected_zones = list()
|
||||
if(!(A.zone in B.zone.connected_zones))
|
||||
B.zone.connected_zones += A.zone
|
||||
B.zone.connected_zones[A.zone] = 1
|
||||
else
|
||||
B.zone.connected_zones[A.zone]++
|
||||
if(!B.zone.connected_zones)
|
||||
B.zone.connected_zones = list()
|
||||
if(A.zone in B.zone.connected_zones)
|
||||
B.zone.connected_zones[A.zone]++
|
||||
else
|
||||
B.zone.connected_zones += A.zone
|
||||
B.zone.connected_zones[A.zone] = 1
|
||||
|
||||
zone_B = B.zone
|
||||
|
||||
@@ -284,21 +323,22 @@ connection
|
||||
A.zone.connections = list()
|
||||
A.zone.connections |= src
|
||||
|
||||
if(zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[zone_B] > 1)
|
||||
zone_A.connected_zones[zone_B]--
|
||||
else
|
||||
zone_A.connected_zones.Remove(zone_B)
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
if(indirect != CONNECTION_CLOSED)
|
||||
if(zone_A.connected_zones)
|
||||
if(zone_A.connected_zones[zone_B] > 1)
|
||||
zone_A.connected_zones[zone_B]--
|
||||
else
|
||||
zone_A.connected_zones.Remove(zone_B)
|
||||
if(zone_A.connected_zones && !zone_A.connected_zones.len)
|
||||
zone_A.connected_zones = null
|
||||
|
||||
if(!A.zone.connected_zones)
|
||||
A.zone.connected_zones = list()
|
||||
if(!(zone_B in A.zone.connected_zones))
|
||||
A.zone.connected_zones += zone_B
|
||||
A.zone.connected_zones[zone_B] = 1
|
||||
else
|
||||
A.zone.connected_zones[zone_B]++
|
||||
if(!A.zone.connected_zones)
|
||||
A.zone.connected_zones = list()
|
||||
if(!(zone_B in A.zone.connected_zones))
|
||||
A.zone.connected_zones += zone_B
|
||||
A.zone.connected_zones[zone_B] = 1
|
||||
else
|
||||
A.zone.connected_zones[zone_B]++
|
||||
|
||||
zone_A = A.zone
|
||||
|
||||
@@ -316,23 +356,29 @@ connection
|
||||
B.zone.connections = list()
|
||||
B.zone.connections |= src
|
||||
|
||||
if(zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[zone_A] > 1)
|
||||
zone_B.connected_zones[zone_A]--
|
||||
else
|
||||
zone_B.connected_zones.Remove(zone_A)
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
if(indirect != CONNECTION_CLOSED)
|
||||
if(zone_B.connected_zones)
|
||||
if(zone_B.connected_zones[zone_A] > 1)
|
||||
zone_B.connected_zones[zone_A]--
|
||||
else
|
||||
zone_B.connected_zones.Remove(zone_A)
|
||||
if(zone_B.connected_zones && !zone_B.connected_zones.len)
|
||||
zone_B.connected_zones = null
|
||||
|
||||
if(!B.zone.connected_zones)
|
||||
B.zone.connected_zones = list()
|
||||
if(!(zone_A in B.zone.connected_zones))
|
||||
B.zone.connected_zones += zone_A
|
||||
B.zone.connected_zones[zone_A] = 1
|
||||
else
|
||||
B.zone.connected_zones[zone_A]++
|
||||
if(!B.zone.connected_zones)
|
||||
B.zone.connected_zones = list()
|
||||
if(!(zone_A in B.zone.connected_zones))
|
||||
B.zone.connected_zones += zone_A
|
||||
B.zone.connected_zones[zone_A] = 1
|
||||
else
|
||||
B.zone.connected_zones[zone_A]++
|
||||
|
||||
zone_B = B.zone
|
||||
|
||||
else
|
||||
del src
|
||||
del src
|
||||
|
||||
|
||||
#undef CONNECTION_DIRECT
|
||||
#undef CONNECTION_INDIRECT
|
||||
#undef CONNECTION_CLOSED
|
||||
+87
-12
@@ -1,5 +1,6 @@
|
||||
zone
|
||||
New(turf/start)
|
||||
. = ..()
|
||||
//Get the turfs that are part of the zone using a floodfill method
|
||||
if(istype(start,/list))
|
||||
contents = start
|
||||
@@ -8,7 +9,7 @@ zone
|
||||
|
||||
//Change all the zone vars of the turfs, check for space to be added to space_tiles.
|
||||
for(var/turf/T in contents)
|
||||
if(T.zone)
|
||||
if(T.zone && T.zone != src)
|
||||
T.zone.RemoveTurf(T)
|
||||
T.zone = src
|
||||
if(istype(T,/turf/space))
|
||||
@@ -28,22 +29,42 @@ zone
|
||||
air.update_values()
|
||||
|
||||
//Add this zone to the global list.
|
||||
zones += src
|
||||
zones.Add(src)
|
||||
|
||||
//LEGACY, DO NOT USE.
|
||||
Del()
|
||||
//Ensuring the zone list doesn't get clogged with null values.
|
||||
for(var/turf/simulated/T in contents)
|
||||
if(T.zone && T.zone == src)
|
||||
T.zone = null
|
||||
air_master.tiles_to_update |= T
|
||||
RemoveTurf(T)
|
||||
air_master.tiles_to_reconsider_zones += T
|
||||
for(var/zone/Z in connected_zones)
|
||||
if(src in Z.connected_zones)
|
||||
Z.connected_zones.Remove(src)
|
||||
for(var/connection/C in connections)
|
||||
C.Cleanup()
|
||||
zones -= src
|
||||
air_master.connections_to_check += C
|
||||
zones.Remove(src)
|
||||
air = null
|
||||
. = ..()
|
||||
|
||||
//Handles deletion via garbage collection.
|
||||
proc/SoftDelete()
|
||||
zones.Remove(src)
|
||||
air = null
|
||||
//Ensuring the zone list doesn't get clogged with null values.
|
||||
for(var/turf/simulated/T in contents)
|
||||
RemoveTurf(T)
|
||||
air_master.tiles_to_reconsider_zones += T
|
||||
for(var/zone/Z in connected_zones)
|
||||
if(src in Z.connected_zones)
|
||||
Z.connected_zones.Remove(src)
|
||||
for(var/connection/C in connections)
|
||||
if(C.zone_A == src)
|
||||
C.zone_A = null
|
||||
if(C.zone_B == src)
|
||||
C.zone_B = null
|
||||
air_master.connections_to_check += C
|
||||
|
||||
|
||||
proc/FloodFill(turf/start)
|
||||
if(!istype(start))
|
||||
return list()
|
||||
@@ -51,6 +72,7 @@ proc/FloodFill(turf/start)
|
||||
list
|
||||
open = list(start)
|
||||
closed = list()
|
||||
doors = list()
|
||||
|
||||
while(open.len)
|
||||
for(var/turf/T in open)
|
||||
@@ -60,18 +82,49 @@ proc/FloodFill(turf/start)
|
||||
for(var/d in cardinal)
|
||||
var/turf/O = get_step(T,d)
|
||||
//Simple pass check.
|
||||
if(O.ZCanPass(T) && !(O in open) && !(O in closed))
|
||||
if(istype(O) && O.ZCanPass(T) && !(O in open) && !(O in closed))
|
||||
open += O
|
||||
else
|
||||
doors += T
|
||||
open -= T
|
||||
continue
|
||||
|
||||
open -= T
|
||||
closed += T
|
||||
|
||||
for(var/turf/T in doors)
|
||||
var/force_connection = 1
|
||||
var/turf/O = get_step(T,NORTH)
|
||||
if(O in closed)
|
||||
closed += T
|
||||
continue
|
||||
else if(T.ZCanPass(O))
|
||||
force_connection = 0
|
||||
|
||||
O = get_step(T,WEST)
|
||||
if(O in closed)
|
||||
closed += T
|
||||
continue
|
||||
else if(force_connection && T.ZCanPass(O))
|
||||
force_connection = 0
|
||||
|
||||
if(force_connection)
|
||||
O = get_step(T,SOUTH)
|
||||
if(O in closed)
|
||||
closed += T
|
||||
else if(!T.ZCanPass(O) && get_step(T,EAST) in closed)
|
||||
closed += T
|
||||
|
||||
|
||||
return closed
|
||||
|
||||
turf/proc/ZCanPass(turf/T, var/include_space = 0)
|
||||
//Fairly standard pass checks for turfs, objects and directional windows. Also stops at the edge of space.
|
||||
if(!istype(T))
|
||||
return 0
|
||||
|
||||
if(istype(T,/turf/space) && !include_space) return 0
|
||||
if(istype(T,/turf/space) && !include_space)
|
||||
return 0
|
||||
else
|
||||
if(T.blocks_air||blocks_air)
|
||||
return 0
|
||||
@@ -79,13 +132,35 @@ turf/proc/ZCanPass(turf/T, var/include_space = 0)
|
||||
for(var/obj/obstacle in src)
|
||||
if(istype(obstacle,/obj/machinery/door) && !istype(obstacle,/obj/machinery/door/window))
|
||||
continue
|
||||
if(!obstacle.CanPass(0, T, 1.5, 1))
|
||||
if(!obstacle.CanPass(null, T, 1.5, 1))
|
||||
return 0
|
||||
|
||||
for(var/obj/obstacle in T)
|
||||
if(istype(obstacle,/obj/machinery/door) && !istype(obstacle,/obj/machinery/door/window))
|
||||
continue
|
||||
if(!obstacle.CanPass(0, src, 1.5, 1))
|
||||
if(!obstacle.CanPass(null, src, 1.5, 1))
|
||||
return 0
|
||||
|
||||
return 1
|
||||
return 1
|
||||
|
||||
turf/proc/ZAirPass(turf/T)
|
||||
//Fairly standard pass checks for turfs, objects and directional windows. Also stops at the edge of space.
|
||||
if(!istype(T))
|
||||
return 0
|
||||
|
||||
if(T.blocks_air||blocks_air)
|
||||
return 0
|
||||
|
||||
for(var/obj/obstacle in src)
|
||||
if(istype(obstacle,/obj/machinery/door) && !istype(obstacle,/obj/machinery/door/window))
|
||||
continue
|
||||
if(!obstacle.CanPass(null, T, 0, 0))
|
||||
return 0
|
||||
|
||||
for(var/obj/obstacle in T)
|
||||
if(istype(obstacle,/obj/machinery/door) && !istype(obstacle,/obj/machinery/door/window))
|
||||
continue
|
||||
if(!obstacle.CanPass(null, src, 0, 0))
|
||||
return 0
|
||||
|
||||
return 1
|
||||
@@ -1,6 +1,8 @@
|
||||
turf/var/zone/zone
|
||||
|
||||
var/list/zones = list()
|
||||
var/list/DoorDirections = list(NORTH,WEST) //Which directions doors turfs can connect to zones
|
||||
var/list/CounterDoorDirections = list(SOUTH,EAST) //Which directions doors turfs can connect to zones
|
||||
|
||||
zone
|
||||
var
|
||||
|
||||
@@ -336,7 +336,8 @@ datum
|
||||
corresponding.moles += trace_gas.moles*giver.group_multiplier/group_multiplier
|
||||
update_values()
|
||||
|
||||
del(giver)
|
||||
// Let the garbage collector handle it, faster according to /tg/ testers
|
||||
//del(giver)
|
||||
return 1
|
||||
|
||||
proc/remove(amount)
|
||||
|
||||
+35
-24
@@ -92,17 +92,15 @@ datum
|
||||
controller
|
||||
air_system
|
||||
//Geoemetry lists
|
||||
// var/list/turf/simulated/active_singletons = list()
|
||||
var/list/turf/simulated/turfs_with_connections = list()
|
||||
var/list/obj/fire/active_hotspots = list()
|
||||
|
||||
//Special functions lists
|
||||
// var/list/turf/simulated/active_super_conductivity = list()
|
||||
// var/list/turf/simulated/high_pressure_delta = list()
|
||||
var/list/turf/simulated/tiles_to_reconsider_zones = list()
|
||||
|
||||
//Geometry updates lists
|
||||
var/list/turf/simulated/tiles_to_update = list()
|
||||
var/list/turf/simulated/tiles_with_connections = list()
|
||||
var/list/connection/connections_checked = list()
|
||||
// var/list/turf/simulated/groups_to_rebuild = list()
|
||||
var/list/connection/connections_to_check = list()
|
||||
|
||||
var/current_cycle = 0
|
||||
var/update_delay = 5 //How long between check should it try to process atmos again.
|
||||
@@ -137,15 +135,15 @@ datum
|
||||
var/start_time = world.timeofday
|
||||
|
||||
for(var/turf/simulated/S in world)
|
||||
if(S.z < 5)
|
||||
if(!S.zone && !S.blocks_air && S.z < 5) // Added last check to force skipping asteroid z-levels -- TLE
|
||||
if(S.CanPass(null, S, 0, 0))
|
||||
new/zone(S)
|
||||
if(!S.zone && !S.blocks_air)
|
||||
if(S.CanPass(null, S, 0, 0))
|
||||
new/zone(S)
|
||||
|
||||
S.update_air_properties()
|
||||
for(var/turf/simulated/S in world)
|
||||
S.update_air_properties()
|
||||
|
||||
world << "\red \b Geometry processed in [time2text(world.timeofday-start_time, "mm:ss")] minutes!"
|
||||
spawn start()
|
||||
// spawn start()
|
||||
|
||||
proc/start()
|
||||
//Purpose: This is kicked off by the master controller, and controls the processing of all atmosphere.
|
||||
@@ -169,27 +167,40 @@ datum
|
||||
*/
|
||||
|
||||
proc/tick()
|
||||
. = 1 //Set the default return value, for runtime detection.
|
||||
|
||||
if(current_cycle >= next_stat_check)
|
||||
var/zone/z = pick(zones)
|
||||
var/log_file = file("[time2text(world.timeofday, "statistics/DD-MM-YYYY.txt")]")
|
||||
log_file << "Zone | \The [get_area(pick(z.contents))] | [z.air.oxygen], [z.air.nitrogen], [z.air.carbon_dioxide], [z.air.toxins] | [z.air.temperature] | [z.air.group_multiplier * z.air.volume]"
|
||||
var/log_file = file("[time2text(world.timeofday, "statistics/DD-MM-YYYY-air.txt")]")
|
||||
log_file << "\"\The [get_area(pick(z.contents))]\",[z.air.oxygen],[z.air.nitrogen],[z.air.carbon_dioxide],[z.air.toxins],[z.air.temperature],[z.air.group_multiplier * z.air.volume]"
|
||||
next_stat_check = current_cycle + (rand(5,7)*60)
|
||||
|
||||
if(tiles_to_update.len > 0) //If there are tiles to update, do so.
|
||||
if(tiles_to_update.len) //If there are tiles to update, do so.
|
||||
for(var/turf/simulated/T in tiles_to_update)
|
||||
T.update_air_properties()
|
||||
var/output = T.update_air_properties()
|
||||
if(. && T && !output)
|
||||
. = 0 //If a runtime occured, make sure we can sense it.
|
||||
tiles_to_update = list()
|
||||
for(var/connection/C in connections_checked)
|
||||
|
||||
if(connections_to_check.len)
|
||||
for(var/connection/C in connections_to_check)
|
||||
C.CheckPassSanity()
|
||||
connections_checked = list()
|
||||
connections_to_check = list()
|
||||
|
||||
if(tiles_to_reconsider_zones.len)
|
||||
for(var/turf/simulated/T in tiles_to_reconsider_zones)
|
||||
if(!T.zone)
|
||||
new /zone(T)
|
||||
|
||||
for(var/zone/Z in zones)
|
||||
if(Z.last_update < current_cycle)
|
||||
Z.process()
|
||||
if(Z) Z.last_update = current_cycle
|
||||
var/output = Z.process()
|
||||
if(Z)
|
||||
Z.last_update = current_cycle
|
||||
if(. && Z && !output)
|
||||
. = 0
|
||||
|
||||
for(var/obj/fire/F)
|
||||
F.process()
|
||||
|
||||
return 1
|
||||
for(var/obj/fire/F in active_hotspots)
|
||||
var/output = F.process()
|
||||
if(. && F && !output)
|
||||
. = 0
|
||||
+28
-30
@@ -171,25 +171,34 @@ turf
|
||||
air_check_directions = 0
|
||||
|
||||
for(var/direction in cardinal)
|
||||
if(CanPass(null, get_step(src,direction), 0, 0))
|
||||
if(ZAirPass(get_step(src,direction)))
|
||||
air_check_directions |= direction
|
||||
|
||||
if(!zone && CanPass(null, src, 1.5, 1)) //No zone and not a wall, lets add ourself to a zone.
|
||||
for(var/direction in cardinal)
|
||||
if(!zone && !blocks_air) //No zone, but not a wall.
|
||||
for(var/direction in DoorDirections) //Check door directions first.
|
||||
if(air_check_directions&direction)
|
||||
var/turf/simulated/T = get_step(src,direction)
|
||||
if(T.zone)
|
||||
T.zone.AddTurf(src)
|
||||
break
|
||||
if(!zone) //Still no zone
|
||||
for(var/direction in CounterDoorDirections) //Check the others second.
|
||||
if(air_check_directions&direction)
|
||||
var/turf/simulated/T = get_step(src,direction)
|
||||
if(T.zone)
|
||||
T.zone.AddTurf(src)
|
||||
break
|
||||
if(!zone) //No zone found, new zone!
|
||||
new/zone(src)
|
||||
if(!zone) //Still no zone, the floodfill determined it is not part of a larger zone. Force a zone on it.
|
||||
new/zone(list(src))
|
||||
|
||||
if(air_master.tiles_with_connections["\ref[src]"]) //Check pass sanity of the connections.
|
||||
var/list/connections = air_master.tiles_with_connections["\ref[src]"]
|
||||
for(var/connection/C in connections)
|
||||
air_master.connections_checked |= C
|
||||
if("\ref[src]" in air_master.turfs_with_connections) //Check pass sanity of the connections.
|
||||
for(var/connection/C in air_master.turfs_with_connections["\ref[src]"])
|
||||
if(!(C in air_master.connections_to_check))
|
||||
air_master.connections_to_check += C
|
||||
|
||||
update_zone_properties() //Update self zone and adjacent zones.
|
||||
. = update_zone_properties() //Update self zone and adjacent zones.
|
||||
|
||||
if(air_check_directions)
|
||||
processing = 1
|
||||
@@ -199,32 +208,21 @@ turf
|
||||
|
||||
proc/update_zone_properties()
|
||||
for(var/direction in cardinal)
|
||||
var/turf/simulated/T = get_step(src,direction)
|
||||
var/turf/T = get_step(src,direction)
|
||||
if(air_check_directions&direction) //I can connect air in this direction
|
||||
if(!istype(T)) //Space
|
||||
if(!CanPass(null, T, 1.5, 1) && CanPass(src, T, 0, 0)) //Normally would block it, instead lets make a connection to it.
|
||||
if(zone)
|
||||
zone.AddSpace(T)
|
||||
else if(!CanPass(src, T, 0, 0) || !CanPass(T, src, 0, 0)) //I block the air or it blocks air, disconnect from it if connected.
|
||||
if(zone && T in zone.space_tiles)
|
||||
zone.RemoveSpace(T)
|
||||
else if(zone)
|
||||
zone.rebuild = 1
|
||||
continue
|
||||
|
||||
else if(!T.CanPass(null, src, 1.5, 1) && !T.CanPass(null, src, 0, 0)) //If I block air, we must look to see if the adjacent turfs need rebuilt.
|
||||
if(!CanPass(null, T, 0, 0)) //If I block air, we must look to see if the adjacent turfs need rebuilt.
|
||||
if(T.zone && !T.zone.rebuild)
|
||||
for(var/direction2 in cardinal - direction) //Check all other directions for air that might be connected.
|
||||
var/turf/simulated/NT = get_step(src, direction2)
|
||||
if(NT && NT.zone && NT.zone == T.zone)
|
||||
if(NT && NT.zone && NT.zone == T.zone && !NT.HasDoor())
|
||||
T.zone.rebuild = 1
|
||||
|
||||
else if(T.CanPass(null, src, 0, 0))
|
||||
if(T.zone != zone)
|
||||
ZConnect(src,T)
|
||||
else
|
||||
ZConnect(src,T)
|
||||
return 1
|
||||
|
||||
else if(zone && !zone.rebuild)
|
||||
for(var/direction2 in cardinal - reverse_direction(direction)) //Check all other directions for air that might be connected.
|
||||
var/turf/simulated/NT = get_step(T, direction2)
|
||||
if(NT && NT.zone && NT.zone == zone)
|
||||
zone.rebuild = 1
|
||||
// else if(zone && !zone.rebuild)
|
||||
// for(var/direction2 in cardinal - reverse_direction(direction)) //Check all other directions for air that might be connected.
|
||||
// var/turf/simulated/NT = get_step(T, direction2)
|
||||
// if(NT && NT.zone && NT.zone == zone)
|
||||
// zone.rebuild = 1
|
||||
+3
-2
@@ -12,8 +12,6 @@ Attach to transfer valve and open. BOOM.
|
||||
|
||||
|
||||
|
||||
vs_control/var/IgnitionLevel = 0.5
|
||||
vs_control/var/IgnitionLevel_DESC = "Moles of oxygen+plasma - co2 needed to burn."
|
||||
|
||||
//Some legacy definitions so fires can be started.
|
||||
atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
@@ -79,6 +77,7 @@ obj
|
||||
archived_firelevel = 0
|
||||
|
||||
process()
|
||||
. = 1
|
||||
|
||||
if(firelevel > vsc.IgnitionLevel)
|
||||
|
||||
@@ -169,12 +168,14 @@ obj
|
||||
firelevel = fl
|
||||
for(var/mob/living/carbon/human/M in loc)
|
||||
M.FireBurn(min(max(0.1,firelevel / 20),10)) //Burn the humans!
|
||||
air_master.active_hotspots.Add(src)
|
||||
|
||||
Del()
|
||||
if (istype(loc, /turf/simulated))
|
||||
ul_SetLuminosity(0)
|
||||
|
||||
loc = null
|
||||
air_master.active_hotspots.Remove(src)
|
||||
|
||||
..()
|
||||
|
||||
|
||||
+22
-11
@@ -6,21 +6,28 @@
|
||||
if(T.zone)
|
||||
T.zone.RemoveTurf(T)
|
||||
contents += T
|
||||
air.group_multiplier++
|
||||
if(air)
|
||||
air.group_multiplier++
|
||||
T.zone = src
|
||||
proc/RemoveTurf(turf/T)
|
||||
//Same, but in reverse.
|
||||
if(!(T in contents))
|
||||
return
|
||||
contents -= T
|
||||
air.group_multiplier--
|
||||
T.zone = null
|
||||
if(air)
|
||||
air.group_multiplier--
|
||||
if(T.zone == src)
|
||||
T.zone = null
|
||||
|
||||
proc/AddSpace(turf/space/S)
|
||||
//Adds a space tile to the list, and creates the list if null.
|
||||
if(istype(S,/turf/space))
|
||||
if(!space_tiles) space_tiles = list()
|
||||
if(istype(S))
|
||||
if(!space_tiles)
|
||||
space_tiles = list()
|
||||
else if(S in space_tiles)
|
||||
return
|
||||
space_tiles += S
|
||||
contents -= S
|
||||
|
||||
proc/RemoveSpace(turf/space/S)
|
||||
//Removes a space tile from the list, and deletes the list if length is 0.
|
||||
@@ -98,9 +105,9 @@ proc/ZMerge(zone/A,zone/B)
|
||||
for(var/connection/C in A.connections)
|
||||
C.Cleanup()
|
||||
|
||||
del B
|
||||
B.SoftDelete()
|
||||
|
||||
proc/ZConnect(turf/A,turf/B)
|
||||
proc/ZConnect(turf/simulated/A,turf/simulated/B)
|
||||
//Connects two zones by forming a connection object representing turfs A and B.
|
||||
|
||||
//Make sure that if it's space, it gets added to space_tiles instead.
|
||||
@@ -113,15 +120,19 @@ proc/ZConnect(turf/A,turf/B)
|
||||
B.zone.AddSpace(A)
|
||||
return
|
||||
|
||||
if(!istype(A) || !istype(B))
|
||||
return
|
||||
|
||||
//Make some preliminary checks to see if the connection is valid.
|
||||
if(!A.zone || !B.zone) return
|
||||
if(A.zone == B.zone) return
|
||||
if(!A.CanPass(0,B,0,0) || !B.CanPass(0,A,0,0)) return
|
||||
if(!A.CanPass(null,B,0,0)) return
|
||||
if(A.CanPass(null,B,1.5,1))
|
||||
return ZMerge(A.zone,B.zone)
|
||||
|
||||
//Ensure the connection isn't already made.
|
||||
if(air_master.tiles_with_connections["\ref[A]"])
|
||||
var/list/connections = air_master.tiles_with_connections["\ref[A]"]
|
||||
for(var/connection/C in connections)
|
||||
if("\ref[A]" in air_master.turfs_with_connections)
|
||||
for(var/connection/C in air_master.turfs_with_connections["\ref[A]"])
|
||||
C.Cleanup()
|
||||
if(C && (C.B == B || C.A == B))
|
||||
return
|
||||
|
||||
+28
-7
@@ -1,21 +1,41 @@
|
||||
var/image/contamination_overlay = image('icons/effects/contamination.dmi')
|
||||
|
||||
pl_control/var
|
||||
PLASMA_DMG = 3
|
||||
PLASMA_DMG_NAME = "Plasma Damage Amount"
|
||||
PLASMA_DMG_DESC = "Self Descriptive"
|
||||
|
||||
CLOTH_CONTAMINATION = 0 //If this is on, plasma does damage by getting into cloth.
|
||||
CLOTH_CONTAMINATION = 0
|
||||
CLOTH_CONTAMINATION_NAME = "Cloth Contamination"
|
||||
CLOTH_CONTAMINATION_DESC = "If this is on, plasma does damage by getting into cloth."
|
||||
|
||||
PLASMAGUARD_ONLY = 0 //If this is on, only biosuits and spacesuits protect against contamination and ill effects.
|
||||
PLASMAGUARD_ONLY = 0
|
||||
PLASMAGUARD_ONLY_NAME = "\"PlasmaGuard Only\""
|
||||
PLASMAGUARD_ONLY_DESC = "If this is on, only biosuits and spacesuits protect against contamination and ill effects."
|
||||
|
||||
GENETIC_CORRUPTION = 0 //Chance of genetic corruption as well as toxic damage, X in 10,000.
|
||||
GENETIC_CORRUPTION = 0
|
||||
GENETIC_CORRUPTION_NAME = "Genetic Corruption Chance"
|
||||
GENETIC_CORRUPTION_DESC = "Chance of genetic corruption as well as toxic damage, X in 10,000."
|
||||
|
||||
SKIN_BURNS = 1 //Plasma has an effect similar to mustard gas on the un-suited.
|
||||
SKIN_BURNS = 1
|
||||
SKIN_BURNS_DESC = "Plasma has an effect similar to mustard gas on the un-suited."
|
||||
SKIN_BURNS_NAME = "Skin Burns"
|
||||
|
||||
EYE_BURNS = 1 //Plasma burns the eyes of anyone not wearing eye protection.
|
||||
EYE_BURNS = 1
|
||||
EYE_BURNS_NAME = "Eye Burns"
|
||||
EYE_BURNS_DESC = "Plasma burns the eyes of anyone not wearing eye protection."
|
||||
|
||||
CONTAMINATION_LOSS = 0.01
|
||||
CONTAMINATION_LOSS_NAME = "Contamination Loss"
|
||||
CONTAMINATION_LOSS_DESC = "How much toxin damage is dealt from contaminated clothing" //Per tick? ASK ARYN
|
||||
|
||||
PLASMA_HALLUCINATION = 0
|
||||
PLASMA_HALLUCINATION_NAME = "Plasma Hallucination"
|
||||
PLASMA_HALLUCINATION_DESC = "Does being in plasma cause you to hallucinate?"
|
||||
|
||||
N2O_HALLUCINATION = 1
|
||||
N2O_HALLUCINATION_NAME = "N2O Hallucination"
|
||||
N2O_HALLUCINATION_DESC = "Does being in sleeping gas cause you to hallucinate?"
|
||||
|
||||
|
||||
obj/var/contaminated = 0
|
||||
@@ -32,11 +52,11 @@ obj/item/proc
|
||||
//Do a contamination overlay? Temporary measure to keep contamination less deadly than it was.
|
||||
if(!contaminated)
|
||||
contaminated = 1
|
||||
overlays += 'icons/effects/contamination.dmi'
|
||||
overlays += contamination_overlay
|
||||
|
||||
decontaminate()
|
||||
contaminated = 0
|
||||
overlays -= 'icons/effects/contamination.dmi'
|
||||
overlays -= contamination_overlay
|
||||
|
||||
/mob/proc/contaminate()
|
||||
|
||||
@@ -94,6 +114,7 @@ obj/item/proc
|
||||
src << "\red High levels of toxins cause you to spontaneously mutate."
|
||||
domutcheck(src,null)
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/burn_eyes()
|
||||
//The proc that handles eye burning.
|
||||
if(prob(20)) src << "\red Your eyes burn!"
|
||||
|
||||
+90
-95
@@ -1,17 +1,17 @@
|
||||
#define QUANTIZE(variable) (round(variable,0.0001))
|
||||
vs_control/var/zone_share_percent = 10
|
||||
vs_control/var/zone_share_percent_NAME = "Zone Share Percent"
|
||||
vs_control/var/zone_share_percent_DESC = "Percentage of air difference to move per tick"
|
||||
zone/proc/process()
|
||||
. = 1
|
||||
//Deletes zone if empty.
|
||||
if(!contents.len)
|
||||
del src
|
||||
return 0
|
||||
//Does rebuilding stuff. Not sure if used.
|
||||
return SoftDelete()
|
||||
//Does rebuilding stuff.
|
||||
if(rebuild)
|
||||
rebuild = 0
|
||||
Rebuild() //Shoving this into a proc.
|
||||
|
||||
if(!contents.len) //If we got soft deleted.
|
||||
return
|
||||
|
||||
//Sometimes explosions will cause the air to be deleted for some reason.
|
||||
if(!air)
|
||||
air = new()
|
||||
@@ -24,18 +24,16 @@ zone/proc/process()
|
||||
if(space_tiles)
|
||||
for(var/T in space_tiles)
|
||||
if(!istype(T,/turf/space))
|
||||
space_tiles -= T
|
||||
continue
|
||||
total_space++
|
||||
if(space_tiles && !space_tiles.len)
|
||||
del space_tiles
|
||||
RemoveSpace(T)
|
||||
if(space_tiles)
|
||||
total_space = space_tiles.len
|
||||
|
||||
//Add checks to ensure that we're not sucking air out of an empty room.
|
||||
if(total_space && air.total_moles > 0.1 && air.temperature > TCMB+0.5)
|
||||
//If there is space, air should flow out of the zone.
|
||||
if(abs(air.return_pressure()) > vsc.airflow_lightest_pressure)
|
||||
AirflowSpace(src)
|
||||
ShareSpace(air,total_space*(vsc.zone_share_percent/100))
|
||||
ShareSpace(air,total_space*vsc.zone_share_percent/200)
|
||||
|
||||
//React the air here.
|
||||
air.react(null,0)
|
||||
@@ -82,19 +80,20 @@ zone/proc/process()
|
||||
//Do merging if conditions are met. Specifically, if there's a non-door connection
|
||||
//to somewhere with space, the zones are merged regardless of equilibrium, to speed
|
||||
//up spacing in areas with double-plated windows.
|
||||
if(C && !C.indirect && C.A.zone && C.B.zone)
|
||||
if(C && C.indirect == 2 && C.A.zone && C.B.zone) //indirect = 2 is a direct connection.
|
||||
if(C.A.zone.air.compare(C.B.zone.air) || total_space)
|
||||
ZMerge(C.A.zone,C.B.zone)
|
||||
|
||||
//Share some
|
||||
for(var/zone/Z in connected_zones)
|
||||
//Ensure we're not doing pointless calculations on equilibrium zones.
|
||||
if(abs(air.total_moles - Z.air.total_moles) > 0.1 || abs(air.temperature - Z.air.temperature) > 0.1)
|
||||
if(abs(Z.air.return_pressure() - air.return_pressure()) > vsc.airflow_lightest_pressure)
|
||||
Airflow(src,Z)
|
||||
ShareRatio( air , Z.air , max(connected_zones[Z]*(vsc.zone_share_percent/200)*(space_tiles || Z.space_tiles ? 2 : 1) , 1) )
|
||||
//Divided by 200 since each zone is processed. Each connection is considered twice
|
||||
//Space tiles force it to try and move twice as much air.
|
||||
if(air && Z.air)
|
||||
//Ensure we're not doing pointless calculations on equilibrium zones.
|
||||
if(abs(air.total_moles - Z.air.total_moles) > 0.1 || abs(air.temperature - Z.air.temperature) > 0.1)
|
||||
if(abs(Z.air.return_pressure() - air.return_pressure()) > vsc.airflow_lightest_pressure)
|
||||
Airflow(src,Z)
|
||||
ShareRatio( air , Z.air , connected_zones[Z]*vsc.zone_share_percent/200 )
|
||||
//Divided by 200 since each zone is processed. Each connection is considered twice
|
||||
//Space tiles force it to try and move twice as much air.
|
||||
|
||||
proc/ShareRatio(datum/gas_mixture/A, datum/gas_mixture/B, ratio)
|
||||
//Shares a specific ratio of gas between mixtures using simple weighted averages.
|
||||
@@ -197,7 +196,77 @@ proc/ShareSpace(datum/gas_mixture/A, ratio)
|
||||
|
||||
return 1
|
||||
|
||||
zone/proc/Rebuild()
|
||||
//Choose a random turf and regenerate the zone from it.
|
||||
var
|
||||
turf/simulated/sample = locate() in contents
|
||||
list/new_contents
|
||||
problem = 0
|
||||
|
||||
var/list/turfs_to_consider = contents.Copy()
|
||||
do
|
||||
if(sample)
|
||||
turfs_to_consider.Remove(sample)
|
||||
sample = locate() in turfs_to_consider
|
||||
if(!sample)
|
||||
break
|
||||
while(!sample.CanPass(null, sample, 1.5, 1))
|
||||
|
||||
if(!istype(sample) || !sample.CanPass(null, sample, 1.5, 1)) //Not a single valid turf.
|
||||
for(var/turf/simulated/T in contents)
|
||||
air_master.tiles_to_update |= T
|
||||
return SoftDelete()
|
||||
|
||||
new_contents = FloodFill(sample)
|
||||
|
||||
for(var/turf/space/S in new_contents)
|
||||
AddSpace(S)
|
||||
new_contents.Remove(S)
|
||||
|
||||
if(contents.len != new_contents.len)
|
||||
problem = 1
|
||||
|
||||
//If something isn't carried over, there was a complication.
|
||||
for(var/turf/T in contents)
|
||||
if(!(T in new_contents))
|
||||
T.zone = null
|
||||
problem = 1
|
||||
|
||||
if(problem)
|
||||
//Build some new zones for stuff that wasn't included.
|
||||
var/list/turf/simulated/rebuild_turfs = contents - new_contents
|
||||
var/list/turf/simulated/reconsider_turfs = list()
|
||||
contents = new_contents
|
||||
for(var/turf/simulated/T in rebuild_turfs)
|
||||
if(!T.zone && T.CanPass(null, T, 1.5, 1))
|
||||
var/zone/Z = new /zone(T)
|
||||
Z.air.copy_from(air)
|
||||
else
|
||||
reconsider_turfs |= T
|
||||
for(var/turf/simulated/T in reconsider_turfs)
|
||||
if(!T.zone && T.CanPass(null, T, 1.5, 1))
|
||||
var/zone/Z = new /zone(T)
|
||||
Z.air.copy_from(air)
|
||||
else if(!T in air_master.tiles_to_update)
|
||||
air_master.tiles_to_update.Add(T)
|
||||
|
||||
for(var/turf/simulated/T in contents)
|
||||
if(T.zone && T.zone != src)
|
||||
T.zone.RemoveTurf(T)
|
||||
T.zone = src
|
||||
else if(!T.zone)
|
||||
T.zone = src
|
||||
air.group_multiplier = contents.len
|
||||
|
||||
if(space_tiles)
|
||||
var/list/new_space_tiles = space_tiles.Copy()
|
||||
space_tiles = null
|
||||
for(var/turf/space/S in new_space_tiles)
|
||||
for(var/direction in cardinal)
|
||||
var/turf/simulated/T = get_step(S,direction)
|
||||
if(istype(T) && T.zone)
|
||||
T.zone.AddSpace(S)
|
||||
/*
|
||||
zone/proc/connected_zones()
|
||||
//A legacy proc for getting connected zones.
|
||||
. = list()
|
||||
@@ -212,78 +281,4 @@ zone/proc/connected_zones()
|
||||
.[Z]++
|
||||
else
|
||||
. += Z
|
||||
.[Z] = 1
|
||||
|
||||
zone/proc/Rebuild()
|
||||
//Choose a random turf and regenerate the zone from it.
|
||||
var
|
||||
turf/simulated/sample = pick(contents)
|
||||
list/new_contents
|
||||
problem = 0
|
||||
|
||||
if(space_tiles)
|
||||
del(space_tiles)
|
||||
|
||||
contents.Remove(null) //I can't believe this is needed.
|
||||
|
||||
if(!contents.len)
|
||||
del src
|
||||
|
||||
var/list/tried_turfs = list()
|
||||
do
|
||||
if(sample)
|
||||
tried_turfs |= sample
|
||||
var/list/turfs_to_consider = contents - tried_turfs
|
||||
if(!turfs_to_consider.len)
|
||||
break
|
||||
sample = pick(turfs_to_consider) //Nor this.
|
||||
while(!istype(sample) || !sample.CanPass(null, sample, 1.5, 1))
|
||||
|
||||
if(!istype(sample) || !sample.CanPass(null, sample, 1.5, 1)) //Not a single valid turf.
|
||||
for(var/turf/simulated/T in contents)
|
||||
air_master.tiles_to_update |= T
|
||||
del src
|
||||
|
||||
new_contents = FloodFill(sample)
|
||||
|
||||
for(var/turf/space/S in new_contents)
|
||||
if(!space_tiles)
|
||||
space_tiles = list()
|
||||
space_tiles |= S
|
||||
|
||||
if(contents.len != new_contents.len)
|
||||
problem = 1
|
||||
|
||||
//If something isn't carried over, there was a complication.
|
||||
for(var/turf/T in contents)
|
||||
if(!(T in new_contents))
|
||||
T.zone = null
|
||||
problem = 1
|
||||
|
||||
for(var/turf/T in new_contents)
|
||||
|
||||
if(problem)
|
||||
//Build some new zones for stuff that wasn't included.
|
||||
var/list/turf/simulated/rebuild_turfs = contents - new_contents
|
||||
var/list/turf/simulated/reconsider_turfs = list()
|
||||
contents = new_contents
|
||||
for(var/turf/T in rebuild_turfs)
|
||||
if(istype(T,/turf/space))
|
||||
air_master.tiles_to_update |= T
|
||||
else if(!T.zone && T.CanPass(null, T, 1.5, 1))
|
||||
var/zone/Z = new /zone(T)
|
||||
Z.air.copy_from(air)
|
||||
else
|
||||
reconsider_turfs |= T
|
||||
for(var/turf/T in reconsider_turfs)
|
||||
if(!T.zone)
|
||||
var/zone/Z = new /zone(T)
|
||||
Z.air.copy_from(air)
|
||||
|
||||
for(var/turf/T in contents)
|
||||
if(T.zone && T.zone != src)
|
||||
T.zone.RemoveTurf(T)
|
||||
T.zone = src
|
||||
else if(!T.zone)
|
||||
T.zone = src
|
||||
air.group_multiplier = contents.len
|
||||
.[Z] = 1*/
|
||||
@@ -1,4 +1,49 @@
|
||||
var/global/vs_control/vsc = new
|
||||
|
||||
vs_control/var
|
||||
zone_share_percent = 12
|
||||
zone_share_percent_NAME = "Zone Share Percent"
|
||||
zone_share_percent_DESC = "Percentage of air difference to move per tick"
|
||||
IgnitionLevel = 0.5
|
||||
IgnitionLevel_DESC = "Moles of oxygen+plasma - co2 needed to burn."
|
||||
airflow_lightest_pressure = 30
|
||||
airflow_lightest_pressure_NAME = "Airflow - Small Movement Threshold %"
|
||||
airflow_lightest_pressure_DESC = "Percent of 1 Atm. at which items with the small weight classes will move."
|
||||
airflow_light_pressure = 45
|
||||
airflow_light_pressure_NAME = "Airflow - Medium Movement Threshold %"
|
||||
airflow_light_pressure_DESC = "Percent of 1 Atm. at which items with the medium weight classes will move."
|
||||
airflow_medium_pressure = 90
|
||||
airflow_medium_pressure_NAME = "Airflow - Heavy Movement Threshold %"
|
||||
airflow_medium_pressure_DESC = "Percent of 1 Atm. at which items with the largest weight classes will move."
|
||||
airflow_heavy_pressure = 95
|
||||
airflow_heavy_pressure_NAME = "Airflow - Mob Movement Threshold %"
|
||||
airflow_heavy_pressure_DESC = "Percent of 1 Atm. at which mobs will move."
|
||||
airflow_dense_pressure = 120
|
||||
airflow_dense_pressure_NAME = "Airflow - Dense Movement Threshold %"
|
||||
airflow_dense_pressure_DESC = "Percent of 1 Atm. at which items with canisters and closets will move."
|
||||
airflow_stun_pressure = 100
|
||||
airflow_stun_pressure_NAME = "Airflow - Mob Stunning Threshold %"
|
||||
airflow_stun_pressure_DESC = "Percent of 1 Atm. at which mobs will be stunned by airflow."
|
||||
airflow_stun_cooldown = 60
|
||||
airflow_stun_cooldown_NAME = "Aiflow Stunning - Cooldown"
|
||||
airflow_stun_cooldown_DESC = "How long, in tenths of a second, to wait before stunning them again."
|
||||
airflow_stun = 0.15
|
||||
airflow_stun_NAME = "Airflow Impact - Stunning"
|
||||
airflow_stun_DESC = "How much a mob is stunned when hit by an object."
|
||||
airflow_damage = 0.3
|
||||
airflow_damage_NAME = "Airflow Impact - Damage"
|
||||
airflow_damage_DESC = "Damage from airflow impacts."
|
||||
airflow_speed_decay = 1.5
|
||||
airflow_speed_decay_NAME = "Airflow Speed Decay"
|
||||
airflow_speed_decay_DESC = "How rapidly the speed gained from airflow decays."
|
||||
airflow_delay = 30
|
||||
airflow_delay_NAME = "Airflow Retrigger Delay"
|
||||
airflow_delay_DESC = "Time in deciseconds before things can be moved by airflow again."
|
||||
airflow_mob_slowdown = 1
|
||||
airflow_mob_slowdown_NAME = "Airflow Slowdown"
|
||||
airflow_mob_slowdown_DESC = "Time in tenths of a second to add as a delay to each movement by a mob if they are fighting the pull of the airflow."
|
||||
|
||||
|
||||
vs_control
|
||||
var
|
||||
list/settings = list()
|
||||
@@ -120,12 +165,13 @@ vs_control
|
||||
////world << "Plasma randomized."
|
||||
|
||||
proc/SetDefault(var/mob/user)
|
||||
var/list/setting_choices = list("Original", "Hazard - Low", "Hazard - High", "Oh Shit!")
|
||||
var/list/setting_choices = list("Plasma - Standard", "Plasma - Low Hazard", "Plasma - High Hazard", "Plasma - Oh Shit!",\
|
||||
"ZAS - Normal", "ZAS - Forgiving", "ZAS - Dangerous", "ZAS - Hellish")
|
||||
var/def = input(user, "Which of these presets should be used?") as null|anything in setting_choices
|
||||
if(!def)
|
||||
return
|
||||
switch(def)
|
||||
if("Original")
|
||||
if("Plasma - Standard")
|
||||
plc.CLOTH_CONTAMINATION = 0 //If this is on, plasma does damage by getting into cloth.
|
||||
|
||||
plc.PLASMAGUARD_ONLY = 0
|
||||
@@ -150,7 +196,7 @@ vs_control
|
||||
//plc.PLASMA_DMG_QUOTIENT = 10
|
||||
|
||||
plc.CONTAMINATION_LOSS = 0
|
||||
if("Hazard - Low")
|
||||
if("Plasma - Low Hazard")
|
||||
plc.CLOTH_CONTAMINATION = 0 //If this is on, plasma does damage by getting into cloth.
|
||||
|
||||
plc.PLASMAGUARD_ONLY = 0
|
||||
@@ -177,7 +223,7 @@ vs_control
|
||||
|
||||
plc.CONTAMINATION_LOSS = 0
|
||||
|
||||
if("Hazard - High")
|
||||
if("Plasma - High Hazard")
|
||||
plc.CLOTH_CONTAMINATION = 1 //If this is on, plasma does damage by getting into cloth.
|
||||
|
||||
plc.PLASMAGUARD_ONLY = 0
|
||||
@@ -199,7 +245,7 @@ vs_control
|
||||
//plc.PLASMA_DMG_OFFSET = 3
|
||||
//plc.PLASMA_DMG_QUOTIENT = 5
|
||||
|
||||
if("Oh Shit!")
|
||||
if("Plasma - Oh Shit!")
|
||||
plc.CLOTH_CONTAMINATION = 1 //If this is on, plasma does damage by getting into cloth.
|
||||
|
||||
plc.PLASMAGUARD_ONLY = 1
|
||||
@@ -221,7 +267,72 @@ vs_control
|
||||
//plc.PLASMA_DMG_OFFSET = 3
|
||||
//plc.PLASMA_DMG_QUOTIENT = 5
|
||||
|
||||
/////world << "Plasma color updated."
|
||||
if("ZAS - Normal")
|
||||
zone_share_percent = 10
|
||||
IgnitionLevel = 0.5
|
||||
airflow_lightest_pressure = 30
|
||||
airflow_light_pressure = 45
|
||||
airflow_medium_pressure = 90
|
||||
airflow_heavy_pressure = 95
|
||||
airflow_dense_pressure = 120
|
||||
airflow_stun_pressure = 100
|
||||
airflow_stun_cooldown = 60
|
||||
airflow_stun = 0.15
|
||||
airflow_damage = 0.3
|
||||
airflow_speed_decay = 1.5
|
||||
airflow_delay = 30
|
||||
airflow_mob_slowdown = 1
|
||||
|
||||
if("ZAS - Forgiving")
|
||||
zone_share_percent = 6
|
||||
IgnitionLevel = 1
|
||||
airflow_lightest_pressure = 45
|
||||
airflow_light_pressure = 60
|
||||
airflow_medium_pressure = 120
|
||||
airflow_heavy_pressure = 110
|
||||
airflow_dense_pressure = 200
|
||||
airflow_stun_pressure = 150
|
||||
airflow_stun_cooldown = 90
|
||||
airflow_stun = 0.15
|
||||
airflow_damage = 0.15
|
||||
airflow_speed_decay = 1.5
|
||||
airflow_delay = 50
|
||||
airflow_mob_slowdown = 0
|
||||
|
||||
if("ZAS - Dangerous")
|
||||
zone_share_percent = 15
|
||||
IgnitionLevel = 0.4
|
||||
airflow_lightest_pressure = 25
|
||||
airflow_light_pressure = 35
|
||||
airflow_medium_pressure = 75
|
||||
airflow_heavy_pressure = 80
|
||||
airflow_dense_pressure = 100
|
||||
airflow_stun_pressure = 90
|
||||
airflow_stun_cooldown = 50
|
||||
airflow_stun = 2
|
||||
airflow_damage = 1
|
||||
airflow_speed_decay = 1.2
|
||||
airflow_delay = 25
|
||||
airflow_mob_slowdown = 2
|
||||
|
||||
if("ZAS - Hellish")
|
||||
zone_share_percent = 20
|
||||
IgnitionLevel = 0.3
|
||||
airflow_lightest_pressure = 20
|
||||
airflow_light_pressure = 30
|
||||
airflow_medium_pressure = 70
|
||||
airflow_heavy_pressure = 75
|
||||
airflow_dense_pressure = 80
|
||||
airflow_stun_pressure = 70
|
||||
airflow_stun_cooldown = 40
|
||||
airflow_stun = 3
|
||||
airflow_damage = 2
|
||||
airflow_speed_decay = 1
|
||||
airflow_delay = 20
|
||||
airflow_mob_slowdown = 3
|
||||
|
||||
|
||||
world << "\blue <b>[key_name(user)] changed the global plasma/ZAS settings to \"[def]\"</b>"
|
||||
|
||||
pl_control
|
||||
var/list/settings = list()
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
#define ACCESS_RC_ANNOUNCE 59 //Request console announcements
|
||||
#define ACCESS_KEYCARD_AUTH 60 //Used for events which require at least two people to confirm them
|
||||
#define ACCESS_TCOMSAT 61 // has access to the entire telecomms satellite / machinery
|
||||
#define ACCESS_ANOMALY 62 //in case of future job separation from scientist
|
||||
|
||||
//BEGIN CENTCOM ACCESS
|
||||
/*Should leave plenty of room if we need to add more access levels.
|
||||
|
||||
@@ -681,7 +681,7 @@ var/global/datum/tension/tension_master
|
||||
// if (L.name == "Commando_Manual")
|
||||
//new /obj/item/weapon/gun/energy/pulse_rifle(L.loc)
|
||||
// var/obj/item/weapon/paper/P = new(L.loc)
|
||||
// P.info = "<p><b>Good morning soldier!</b>. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:<br>#1 Work as a team.<br>#2 Accomplish your objective at all costs.<br>#3 Leave no witnesses.<br>You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.<br>If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.</p><p>In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a Nanotrasen Nuclear Device. Your operations <b>LEADER</b> is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.</p><p>Hello and thank you for choosing Nanotrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class Nanotrasen made Nuclear Device.<br>First and foremost, <b>DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.</b> Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.<br>To make the device functional:<br>#1 Place bomb in designated detonation zone<br> #2 Extend and anchor bomb (attack with hand).<br>#3 Insert Nuclear Auth. Disk into slot.<br>#4 Type numeric code into keypad ([nuke_code]).<br>Note: If you make a mistake press R to reset the device.<br>#5 Press the E button to log onto the device.<br>You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.<br>Note: Toggle off the <b>SAFETY</b>.<br>Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.<br>Note: <b>THE BOMB IS STILL SET AND WILL DETONATE</b><br>Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.</p><p>The nuclear authorization code is: <b>[nuke_code ? nuke_code : "None provided"]</b></p><p><b>Good luck, soldier!</b></p>"
|
||||
// P.info = "<p><b>Good morning soldier!</b>. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:<br>#1 Work as a team.<br>#2 Accomplish your objective at all costs.<br>#3 Leave no witnesses.<br>You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.<br>If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.</p><p>In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a NanoTrasen Nuclear Device. Your operations <b>LEADER</b> is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.</p><p>Hello and thank you for choosing NanoTrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class NanoTrasen made Nuclear Device.<br>First and foremost, <b>DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.</b> Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.<br>To make the device functional:<br>#1 Place bomb in designated detonation zone<br> #2 Extend and anchor bomb (attack with hand).<br>#3 Insert Nuclear Auth. Disk into slot.<br>#4 Type numeric code into keypad ([nuke_code]).<br>Note: If you make a mistake press R to reset the device.<br>#5 Press the E button to log onto the device.<br>You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.<br>Note: Toggle off the <b>SAFETY</b>.<br>Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.<br>Note: <b>THE BOMB IS STILL SET AND WILL DETONATE</b><br>Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.</p><p>The nuclear authorization code is: <b>[nuke_code ? nuke_code : "None provided"]</b></p><p><b>Good luck, soldier!</b></p>"
|
||||
// P.name = "Spec. Ops. Manual"
|
||||
|
||||
for (var/obj/effect/landmark/L in world)
|
||||
@@ -754,7 +754,7 @@ var/global/datum/tension/tension_master
|
||||
// if (L.name == "Commando_Manual")
|
||||
//new /obj/item/weapon/gun/energy/pulse_rifle(L.loc)
|
||||
// var/obj/item/weapon/paper/P = new(L.loc)
|
||||
// P.info = "<p><b>Good morning soldier!</b>. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:<br>#1 Work as a team.<br>#2 Accomplish your objective at all costs.<br>#3 Leave no witnesses.<br>You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.<br>If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.</p><p>In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a Nanotrasen Nuclear Device. Your operations <b>LEADER</b> is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.</p><p>Hello and thank you for choosing Nanotrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class Nanotrasen made Nuclear Device.<br>First and foremost, <b>DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.</b> Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.<br>To make the device functional:<br>#1 Place bomb in designated detonation zone<br> #2 Extend and anchor bomb (attack with hand).<br>#3 Insert Nuclear Auth. Disk into slot.<br>#4 Type numeric code into keypad ([nuke_code]).<br>Note: If you make a mistake press R to reset the device.<br>#5 Press the E button to log onto the device.<br>You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.<br>Note: Toggle off the <b>SAFETY</b>.<br>Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.<br>Note: <b>THE BOMB IS STILL SET AND WILL DETONATE</b><br>Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.</p><p>The nuclear authorization code is: <b>[nuke_code ? nuke_code : "None provided"]</b></p><p><b>Good luck, soldier!</b></p>"
|
||||
// P.info = "<p><b>Good morning soldier!</b>. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:<br>#1 Work as a team.<br>#2 Accomplish your objective at all costs.<br>#3 Leave no witnesses.<br>You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.<br>If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.</p><p>In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a NanoTrasen Nuclear Device. Your operations <b>LEADER</b> is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.</p><p>Hello and thank you for choosing NanoTrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class NanoTrasen made Nuclear Device.<br>First and foremost, <b>DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.</b> Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.<br>To make the device functional:<br>#1 Place bomb in designated detonation zone<br> #2 Extend and anchor bomb (attack with hand).<br>#3 Insert Nuclear Auth. Disk into slot.<br>#4 Type numeric code into keypad ([nuke_code]).<br>Note: If you make a mistake press R to reset the device.<br>#5 Press the E button to log onto the device.<br>You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.<br>Note: Toggle off the <b>SAFETY</b>.<br>Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.<br>Note: <b>THE BOMB IS STILL SET AND WILL DETONATE</b><br>Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.</p><p>The nuclear authorization code is: <b>[nuke_code ? nuke_code : "None provided"]</b></p><p><b>Good luck, soldier!</b></p>"
|
||||
// P.name = "Spec. Ops. Manual"
|
||||
|
||||
|
||||
|
||||
@@ -24,6 +24,8 @@ datum/mind
|
||||
proc/transfer_to(mob/new_character)
|
||||
// multikey information is stored in the mob, not the mind, so
|
||||
// we need to clean this stuff up to avoid multikey alerts
|
||||
if(!new_character || !current)
|
||||
return
|
||||
current.lastKnownIP = null
|
||||
current.computer_id = null
|
||||
|
||||
|
||||
@@ -449,6 +449,7 @@ proc/process_ghost_teleport_locs()
|
||||
name = "\improper Syndicate Station"
|
||||
icon_state = "yellow"
|
||||
requires_power = 0
|
||||
ul_Lighting = 0
|
||||
|
||||
/area/syndicate_station/start
|
||||
name = "\improper Syndicate Station Start"
|
||||
@@ -936,6 +937,10 @@ proc/process_ghost_teleport_locs()
|
||||
name = "\improper Engineering Core"
|
||||
icon_state = "engine_core"
|
||||
|
||||
cooling
|
||||
name = "\improper Emergency Cooling Room"
|
||||
icon_state = "engine"
|
||||
|
||||
//reactor areas
|
||||
|
||||
reactor_core
|
||||
@@ -1130,7 +1135,7 @@ proc/process_ghost_teleport_locs()
|
||||
icon_state = "security"
|
||||
|
||||
/area/security/warden
|
||||
name = "\improper Warden"
|
||||
name = "\improper Warden's Office"
|
||||
icon_state = "Warden"
|
||||
|
||||
/area/security/armoury
|
||||
@@ -1278,6 +1283,10 @@ proc/process_ghost_teleport_locs()
|
||||
|
||||
//Anomaly
|
||||
|
||||
/area/anomaly/hallway
|
||||
name = "Anomaly Hallway"
|
||||
icon_state = "anomaly"
|
||||
|
||||
/area/anomaly/lab
|
||||
name = "Anomaly Lab"
|
||||
icon_state = "anomaly"
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "alien larva"
|
||||
icon_state = "larva"
|
||||
pass_flags = PASSTABLE
|
||||
swap_on_mobbump = 0
|
||||
|
||||
health = 25
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
var/lastbang
|
||||
var/lasttry = 0
|
||||
layer = 2.98
|
||||
var/quantity_max = 15
|
||||
|
||||
/obj/structure/closet/detective
|
||||
name = "detective's closet"
|
||||
@@ -258,7 +259,7 @@
|
||||
|
||||
/obj/structure/closet/wardrobe
|
||||
name = "wardrobe"
|
||||
desc = "It's a storage unit for standard-issue Nanotrasen attire."
|
||||
desc = "It's a storage unit for standard-issue NanoTrasen attire."
|
||||
icon_state = "blue"
|
||||
icon_closed = "blue"
|
||||
|
||||
@@ -269,7 +270,7 @@
|
||||
|
||||
/obj/structure/closet/wardrobe/chaplain_black
|
||||
name = "chapel wardrobe"
|
||||
desc = "It's a storage unit for Nanotrasen-approved religious attire."
|
||||
desc = "It's a storage unit for NanoTrasen-approved religious attire."
|
||||
icon_state = "black"
|
||||
icon_closed = "black"
|
||||
|
||||
@@ -285,7 +286,7 @@
|
||||
|
||||
/obj/structure/closet/wardrobe/orange
|
||||
name = "prison wardrobe"
|
||||
desc = "It's a storage unit for Nanotrasen-regulation prisoner attire."
|
||||
desc = "It's a storage unit for NanoTrasen-regulation prisoner attire."
|
||||
icon_state = "orange"
|
||||
icon_closed = "orange"
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
/obj/machinery/computer/atmosphere/siphonswitch
|
||||
name = "Area Air Control"
|
||||
desc = "Nanotrasen provided this, barely."
|
||||
desc = "NanoTrasen provided this, barely."
|
||||
icon_state = "atmos"
|
||||
var/otherarea
|
||||
var/area/area
|
||||
|
||||
@@ -535,6 +535,13 @@
|
||||
icon_state = "circuit"
|
||||
item_state = "syringe_kit"
|
||||
|
||||
/obj/item/weapon/storage/AirlockBox
|
||||
name = "spare airlock electronics"
|
||||
desc = "A box of spare airlock circuit boards."
|
||||
icon = 'storage.dmi'
|
||||
icon_state = "circuit"
|
||||
item_state = "syringe_kit"
|
||||
|
||||
/obj/item/weapon/storage/toolbox/syndicate
|
||||
name = "red and black toolbox"
|
||||
desc = "An oddly coloured toolbox."
|
||||
|
||||
+110
-48
@@ -33,12 +33,13 @@
|
||||
containername = "Empty Box crate"
|
||||
|
||||
/datum/supply_packs/pcm
|
||||
name = "Power Control Module supplies"
|
||||
name = "APC and Airlock Electronics crate"
|
||||
contains = list("/obj/item/weapon/storage/PCMBox",
|
||||
"/obj/item/weapon/storage/PCMBox")
|
||||
"/obj/item/weapon/storage/AirlockBox")
|
||||
cost = 25
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containername = "Power Control Module crate"
|
||||
group = "Engineering"
|
||||
|
||||
/datum/supply_packs/body_bags
|
||||
name = "Body Bag supplies"
|
||||
@@ -120,7 +121,7 @@
|
||||
/datum/supply_packs/charge/toxins
|
||||
name = "Toxins Research Charge"
|
||||
contains = list("/obj/item/weapon/vending_charge/toxins")
|
||||
containername = "Toxins Reasearch charge crate"
|
||||
containername = "Toxins Research charge crate"
|
||||
|
||||
/* removed these for now, as to not confuse people (the machines are in the tg map)
|
||||
/datum/supply_packs/charge/genetics
|
||||
@@ -273,33 +274,48 @@
|
||||
|
||||
/datum/supply_packs/internals
|
||||
name = "Internals crate"
|
||||
contains = list("/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
contains = list("/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air")
|
||||
cost = 10
|
||||
cost = 30
|
||||
containertype = "/obj/structure/closet/crate/internals"
|
||||
containername = "Internals crate"
|
||||
|
||||
/datum/supply_packs/emergency_internals
|
||||
name = "Emergency Internals crate"
|
||||
contains = list("/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/clothing/mask/breath",
|
||||
"/obj/item/weapon/tank/emergency_oxygen",
|
||||
"/obj/item/weapon/tank/emergency_oxygen",
|
||||
"/obj/item/weapon/tank/emergency_oxygen",
|
||||
"/obj/item/weapon/tank/emergency_oxygen",
|
||||
"/obj/item/weapon/tank/emergency_oxygen")
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/internals"
|
||||
containername = "Emergency Internals crate"
|
||||
|
||||
/datum/supply_packs/evacuation
|
||||
name = "Emergency equipment"
|
||||
contains = list("/obj/machinery/bot/floorbot",
|
||||
"/obj/machinery/bot/floorbot",
|
||||
"/obj/machinery/bot/medbot",
|
||||
"/obj/machinery/bot/medbot",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
"/obj/item/weapon/tank/air",
|
||||
contains = list("/obj/item/weapon/tank/emergency_oxygen",
|
||||
"/obj/item/weapon/tank/emergency_oxygen",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas")
|
||||
cost = 35
|
||||
"/obj/item/weapon/storage/toolbox/emergency",
|
||||
"/obj/item/weapon/storage/toolbox/emergency",
|
||||
"/obj/item/weapon/storage/toolbox/emergency",
|
||||
"/obj/item/weapon/chem_grenade/metalfoam",
|
||||
"/obj/item/weapon/chem_grenade/metalfoam")
|
||||
cost = 15
|
||||
containertype = "/obj/structure/closet/crate/internals"
|
||||
containername = "Emergency Crate"
|
||||
|
||||
@@ -434,7 +450,7 @@
|
||||
"/obj/item/weapon/reagent_containers/glass/bottle/stoxin",
|
||||
"/obj/item/weapon/storage/syringes",
|
||||
"/obj/item/weapon/reagent_containers/glass/large")
|
||||
cost = 10
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/medical"
|
||||
containername = "Medical crate"
|
||||
group = "Medical / Science"
|
||||
@@ -487,7 +503,7 @@
|
||||
"/obj/item/weapon/cell",
|
||||
"/obj/item/weapon/cell/high",
|
||||
"/obj/item/weapon/cell/high")
|
||||
cost = 15
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Electrical maintenance crate"
|
||||
access = ACCESS_ENGINE
|
||||
@@ -497,19 +513,49 @@
|
||||
name = "Mechanical maintenance crate"
|
||||
contains = list("/obj/item/weapon/storage/belt/utility/full",
|
||||
"/obj/item/weapon/storage/belt/utility/full",
|
||||
"/obj/item/weapon/storage/belt/utility/full",
|
||||
"/obj/item/clothing/suit/hazardvest",
|
||||
"/obj/item/clothing/suit/hazardvest",
|
||||
"/obj/item/clothing/suit/hazardvest",
|
||||
"/obj/item/clothing/head/helmet/welding",
|
||||
"/obj/item/clothing/head/helmet/welding",
|
||||
"/obj/item/clothing/head/helmet/hardhat")
|
||||
cost = 10
|
||||
"/obj/item/weapon/storage/toolbox/mechanical",
|
||||
"/obj/item/weapon/storage/toolbox/mechanical")
|
||||
cost = 15
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Mechanical maintenance crate"
|
||||
access = ACCESS_ENGINE
|
||||
group = "Engineering"
|
||||
|
||||
//"/obj/item/tape/engineering"
|
||||
|
||||
/datum/supply_packs/safety_gear
|
||||
name = "Safety gear crate"
|
||||
contains = list("/obj/item/clothing/gloves/fingerless/black",
|
||||
"/obj/item/clothing/gloves/fingerless/black",
|
||||
"/obj/item/device/flashlight",
|
||||
"/obj/item/device/flashlight",
|
||||
"/obj/item/clothing/suit/hazardvest",
|
||||
"/obj/item/clothing/suit/hazardvest",
|
||||
"/obj/item/clothing/head/helmet/hardhat",
|
||||
"/obj/item/clothing/head/helmet/hardhat")
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Safety gear crate"
|
||||
group = "Engineering"
|
||||
|
||||
/datum/supply_packs/firefighting
|
||||
name = "Firefighting equipment crate"
|
||||
contains = list("/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/mask/gas",
|
||||
"/obj/item/clothing/head/helmet/space/fire_helmet",
|
||||
"/obj/item/clothing/head/helmet/space/fire_helmet",
|
||||
"/obj/item/clothing/suit/fire/heavy",
|
||||
"/obj/item/clothing/suit/fire/heavy",
|
||||
"/obj/item/weapon/extinguisher",
|
||||
"/obj/item/weapon/extinguisher")
|
||||
cost = 20
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containername = "Firefighting equipment crate"
|
||||
group = "Engineering"
|
||||
access = ACCESS_ATMOSPHERICS
|
||||
|
||||
/datum/supply_packs/waterfueltank
|
||||
name = "Water/Fuel tank crate"
|
||||
contains = list("/obj/structure/reagent_dispensers/watertank",
|
||||
@@ -522,7 +568,7 @@
|
||||
name = "Emitter crate"
|
||||
contains = list("/obj/machinery/emitter",
|
||||
"/obj/machinery/emitter",)
|
||||
cost = 10
|
||||
cost = 15
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Emitter crate"
|
||||
access = ACCESS_HEADS
|
||||
@@ -533,12 +579,14 @@
|
||||
contains = list("/obj/machinery/field_generator",
|
||||
"/obj/machinery/field_generator",)
|
||||
containername = "Field Generator crate"
|
||||
cost = 15
|
||||
group = "Engineering"
|
||||
|
||||
/datum/supply_packs/engine/sing_gen
|
||||
name = "Singularity Generator crate"
|
||||
contains = list("/obj/machinery/the_singularitygen")
|
||||
containername = "Singularity Generator crate"
|
||||
cost = 15
|
||||
group = "Engineering"
|
||||
|
||||
/datum/supply_packs/engine/collector
|
||||
@@ -547,6 +595,7 @@
|
||||
"/obj/machinery/power/rad_collector",
|
||||
"/obj/machinery/power/rad_collector")
|
||||
containername = "Collector crate"
|
||||
cost = 15
|
||||
group = "Engineering"
|
||||
|
||||
/datum/supply_packs/engine/PA
|
||||
@@ -577,18 +626,31 @@
|
||||
name = "Surgery crate"
|
||||
contains = list("/obj/item/weapon/cautery",
|
||||
"/obj/item/weapon/surgicaldrill",
|
||||
"/obj/item/clothing/mask/breath/medical",
|
||||
"/obj/item/weapon/tank/anesthetic",
|
||||
"/obj/item/weapon/hemostat",
|
||||
"/obj/item/weapon/scalpel",
|
||||
"/obj/item/weapon/surgical_tool/bonegel",
|
||||
"/obj/item/weapon/retractor",
|
||||
"/obj/item/weapon/surgical_tool/bonesetter",
|
||||
"/obj/item/weapon/circular_saw")
|
||||
cost = 20
|
||||
cost = 25
|
||||
containertype = "/obj/structure/closet/crate/secure"
|
||||
containername = "Surgery crate"
|
||||
access = ACCESS_MEDICAL
|
||||
group = "Medical / Science"
|
||||
|
||||
/datum/supply_packs/sterile
|
||||
name = "Sterile equipment crate"
|
||||
contains = list("/obj/item/clothing/under/rank/medical/green",
|
||||
"/obj/item/clothing/under/rank/medical/green",
|
||||
"/obj/item/weapon/storage/stma_kit",
|
||||
"/obj/item/weapon/storage/lglo_kit")
|
||||
cost = 10
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containername = "Sterile equipment crate"
|
||||
group = "Medical / Science"
|
||||
|
||||
/datum/supply_packs/mecha_odysseus
|
||||
name = "Circuit Crate (\"Odysseus\")"
|
||||
contains = list(
|
||||
@@ -764,6 +826,24 @@
|
||||
containername = "Secruity Barriers crate"
|
||||
group = "Security"
|
||||
|
||||
/datum/supply_packs/randomised/New()
|
||||
var/list/tempContains = list()
|
||||
for(var/i = 0,i<num_contained,i++)
|
||||
tempContains += pick(contains)
|
||||
contains = tempContains
|
||||
..()
|
||||
|
||||
|
||||
/datum/supply_packs/randomised/contraband
|
||||
num_contained = 5
|
||||
//We randomly pick 5 items from this list through the constructor, look below
|
||||
contains = list("/obj/item/weapon/contraband/poster","/obj/item/weapon/cigpacket/dromedaryco","/obj/item/clothing/mask/cigarette/cigar/havana", "/obj/item/seeds/plumphelmet", "/obj/item/seeds/libertycap", "/obj/item/seeds/bloodtomato", "/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe", "/obj/item/weapon/reagent_containers/food/drinks/bottle/deadrum" )
|
||||
name = "Contraband crate"
|
||||
cost = 30
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containername = "Contraband crate"
|
||||
contraband = 1
|
||||
|
||||
/datum/supply_packs/randomised
|
||||
var/num_contained = 3 //number of items picked to be contained in a randomised crate
|
||||
contains = list("/obj/item/clothing/head/collectable/chef",
|
||||
@@ -794,21 +874,3 @@
|
||||
cost = 200
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containername = "Collectable hats crate! Brought to you by Bass.inc!"
|
||||
|
||||
/datum/supply_packs/randomised/New()
|
||||
var/list/tempContains = list()
|
||||
for(var/i = 0,i<num_contained,i++)
|
||||
tempContains += pick(contains)
|
||||
contains = tempContains
|
||||
..()
|
||||
|
||||
|
||||
/datum/supply_packs/randomised/contraband
|
||||
num_contained = 5
|
||||
//We randomly pick 5 items from this list through the constructor, look below
|
||||
contains = list("/obj/item/weapon/contraband/poster","/obj/item/weapon/cigpacket/dromedaryco","/obj/item/clothing/mask/cigarette/cigar/havana", "/obj/item/seeds/plumphelmet", "/obj/item/seeds/libertycap", "/obj/item/seeds/bloodtomato", "/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe", "/obj/item/weapon/reagent_containers/food/drinks/bottle/deadrum" )
|
||||
name = "Contraband crate"
|
||||
cost = 30
|
||||
containertype = "/obj/structure/closet/crate"
|
||||
containername = "Contraband crate"
|
||||
contraband = 1
|
||||
|
||||
@@ -454,7 +454,7 @@
|
||||
throw_range = 20
|
||||
|
||||
/obj/item/weapon/soap/nanotrasen
|
||||
desc = "A Nanotrasen brand bar of soap. Smells of plasma."
|
||||
desc = "A NanoTrasen brand bar of soap. Smells of plasma."
|
||||
icon_state = "soapnt"
|
||||
|
||||
/obj/item/weapon/soap/deluxe
|
||||
|
||||
+7
-12
@@ -205,16 +205,9 @@ proc/countJob(rank)
|
||||
update_clothing()
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/equip_if_possible(obj/item/W, slot, del_on_fail = 1) // since byond doesn't seem to have pointers, this seems like the best way to do this :/
|
||||
//warning: icky code
|
||||
var/equipped = 0
|
||||
if((slot == l_store || slot == r_store || slot == belt || slot == wear_id) && !src.w_uniform)
|
||||
del(W)
|
||||
return
|
||||
if(slot == s_store && !src.wear_suit)
|
||||
del(W)
|
||||
return
|
||||
switch(slot)
|
||||
if(slot_back)
|
||||
if(!src.back)
|
||||
@@ -237,11 +230,11 @@ proc/countJob(rank)
|
||||
src.r_hand = W
|
||||
equipped = 1
|
||||
if(slot_belt)
|
||||
if(!src.belt)
|
||||
if(!src.belt && src.w_uniform)
|
||||
src.belt = W
|
||||
equipped = 1
|
||||
if(slot_wear_id)
|
||||
if(!src.wear_id)
|
||||
if(!src.wear_id && src.w_uniform)
|
||||
src.wear_id = W
|
||||
equipped = 1
|
||||
if(slot_ears)
|
||||
@@ -276,15 +269,15 @@ proc/countJob(rank)
|
||||
src.w_uniform = W
|
||||
equipped = 1
|
||||
if(slot_l_store)
|
||||
if(!src.l_store)
|
||||
if(!src.l_store && src.w_uniform)
|
||||
src.l_store = W
|
||||
equipped = 1
|
||||
if(slot_r_store)
|
||||
if(!src.r_store)
|
||||
if(!src.r_store && src.w_uniform)
|
||||
src.r_store = W
|
||||
equipped = 1
|
||||
if(slot_s_store)
|
||||
if(!src.s_store)
|
||||
if(!src.s_store && src.wear_suit)
|
||||
src.s_store = W
|
||||
equipped = 1
|
||||
if(slot_in_backpack)
|
||||
@@ -296,6 +289,8 @@ proc/countJob(rank)
|
||||
|
||||
if(equipped)
|
||||
W.layer = 20
|
||||
if(src.back && W.loc != src.back)
|
||||
W.loc = src
|
||||
else
|
||||
if (del_on_fail)
|
||||
del(W)
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
|
||||
var/global/list/space_surprises = list( /obj/item/clothing/mask/facehugger/angry =4,
|
||||
// /obj/item/weapon/pickaxe/hammer =4, //Waiting on a sprite
|
||||
// /obj/item/weapon/pickaxe/hammer =4, //Waiting on a sprite
|
||||
/obj/item/weapon/pickaxe/silver =4,
|
||||
/obj/item/weapon/pickaxe/drill =4,
|
||||
/obj/item/weapon/pickaxe/jackhammer =4,
|
||||
/obj/effect/critter/spesscarp/elite =3,
|
||||
/mob/living/simple_animal/carp/elite =3,
|
||||
/obj/item/weapon/pickaxe/diamond =3,
|
||||
/obj/item/weapon/pickaxe/diamonddrill =3,
|
||||
/obj/item/weapon/pickaxe/gold =3,
|
||||
|
||||
+23
-4
@@ -1,3 +1,8 @@
|
||||
/atom/Del()
|
||||
var/log_file = file("[time2text(world.timeofday, "deletions/DD-MM-YYYY.txt")]")
|
||||
log_file << "[type] named [name] - [x],[y],[z]"
|
||||
. = ..()
|
||||
|
||||
/atom/proc/MouseDrop_T()
|
||||
return
|
||||
|
||||
@@ -1000,9 +1005,20 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
|
||||
|
||||
usr.next_move = world.time + 6
|
||||
return
|
||||
////////////////////////////////////////
|
||||
///IMPORTANT: CACHE FOR DUMMY OBJECTS///
|
||||
//Used to cut down on stupid deletions//
|
||||
////////////////////////////////////////
|
||||
var/list/DummyCache = list()
|
||||
|
||||
/proc/CanReachThrough(turf/srcturf, turf/targetturf, atom/target)
|
||||
var/obj/item/weapon/dummy/D = new /obj/item/weapon/dummy( srcturf )
|
||||
|
||||
var/obj/item/weapon/dummy/D = locate() in DummyCache
|
||||
if(!D)
|
||||
D = new /obj/item/weapon/dummy( srcturf )
|
||||
else
|
||||
DummyCache.Remove(D)
|
||||
D.loc = srcturf
|
||||
|
||||
if(targetturf.density && targetturf != get_turf(target))
|
||||
return 0
|
||||
@@ -1011,17 +1027,20 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
|
||||
for(var/obj/border_obstacle in srcturf)
|
||||
if(border_obstacle.flags & ON_BORDER)
|
||||
if(!border_obstacle.CheckExit(D, targetturf))
|
||||
del D
|
||||
D.loc = null
|
||||
DummyCache.Add(D)
|
||||
return 0
|
||||
|
||||
//Next, check objects to block entry that are on the border
|
||||
for(var/obj/border_obstacle in targetturf)
|
||||
if((border_obstacle.flags & ON_BORDER) && (target != border_obstacle))
|
||||
if(!border_obstacle.CanPass(D, srcturf, 1, 0))
|
||||
del D
|
||||
D.loc = null
|
||||
DummyCache.Add(D)
|
||||
return 0
|
||||
|
||||
del D
|
||||
D.loc = null
|
||||
DummyCache.Add(D)
|
||||
return 1
|
||||
|
||||
/atom/proc/CtrlClick(var/mob/M as mob)
|
||||
|
||||
+2
-2
@@ -570,7 +570,7 @@
|
||||
del(animation)
|
||||
|
||||
var/mob/living/carbon/monkey/O = new(src)
|
||||
del(O.organs)
|
||||
O.organs.Cut()
|
||||
O.organs = H.organs
|
||||
for(var/name in O.organs)
|
||||
var/datum/organ/external/organ = O.organs[name]
|
||||
@@ -644,7 +644,7 @@
|
||||
O.gender = MALE
|
||||
O.dna = M.dna
|
||||
M.dna = null
|
||||
del(O.organs)
|
||||
O.organs.Cut()
|
||||
O.organs = M.organs
|
||||
for(var/name in O.organs)
|
||||
var/datum/organ/external/organ = O.organs[name]
|
||||
|
||||
@@ -368,13 +368,13 @@ ________________________________________________________________________________
|
||||
Space ninjas are a special type of ninja, specifically one of the space-faring type. The vast majority of space ninjas belong to the Spider Clan, a cult-like sect, which has existed for several hundred years. The Spider Clan practice a sort of augmentation of human flesh in order to achieve a more perfect state of being and follow Postmodern Space Bushido. They also kill people for money. Their leaders are chosen from the oldest of the grand-masters, people that have lived a lot longer than any mortal man should.<br>Being a sect of technology-loving fanatics, the Spider Clan have the very best to choose from in terms of hardware--cybernetic implants, exoskeleton rigs, hyper-capacity batteries, and you get the idea. Some believe that much of the Spider Clan equipment is based on reverse-engineered alien technology while others doubt such claims.<br>Whatever the case, their technology is absolutely superb.
|
||||
<h5>How they relate to other SS13 organizations:</h5>
|
||||
<ul>
|
||||
<li>*<b>Nanotrasen</b> and the Syndicate are two sides of the same coin and that coin is valuable.</li>
|
||||
<li>*<b>NanoTrasen</b> and the Syndicate are two sides of the same coin and that coin is valuable.</li>
|
||||
<li>*<b>The Space Wizard Federation</b> is a problem, mainly because they are an extremely dangerous group of unpredictable individuals--not to mention the wizards hate technology and are in direct opposition of the Spider Clan. Best avoided or left well-enough alone. How to battle: wizards possess several powerful abilities to steer clear off. Blind in particular is a nasty spell--jaunt away if you are blinded and never approach a wizard in melee. Stealth may also work if the wizard is not wearing thermal scanners--don't count on this. Run away if you feel threatened and await a better opportunity.</li>
|
||||
<li>*<b>Changeling Hivemind</b>: extremely dangerous and to be killed on sight. How to battle: they will likely try to absorb you. Adrenaline boost, then phase shift into them. If you get stung, use SpiderOS to inject counter-agents. Stealth may also work but detecting a changeling is the real battle.</li>
|
||||
<li>*<b>Xeno Hivemind</b>: their skulls make interesting kitchen decorations and are challenging to best, especially in larger nests. How to battle: they can see through your stealth guise and energy stars will not work on them. Best killed with a Phase Shift or at range. If you happen on a projectile stun weapon, use it and then close in to melee.</li>
|
||||
</ul>
|
||||
<h5>The reason they (you) are here:</h5>
|
||||
Space ninjas are renowned throughout the known controlled space as fearless spies, infiltrators, and assassins. They are sent on missions of varying nature by Nanotrasen, the Syndicate, and other shady organizations and people. To hire a space ninja means serious business.
|
||||
Space ninjas are renowned throughout the known controlled space as fearless spies, infiltrators, and assassins. They are sent on missions of varying nature by NanoTrasen, the Syndicate, and other shady organizations and people. To hire a space ninja means serious business.
|
||||
<h5>Their playstyle:</h5>
|
||||
A mix of traitor, changeling, and wizard. Ninjas rely on energy, or electricity to be precise, to keep their suits running (when out of energy, a suit hibernates). Suits gain energy from objects or creatures that contain electrical charge. APCs, cell batteries, rechargers, SMES batteries, cyborgs, mechs, and exposed wires are currently supported. Through energy ninjas gain access to special powers--while all powers are tied to the ninja suit, the most useful of them are verb activated--to help them in their mission.<br>It is a constant struggle for a ninja to remain hidden long enough to recharge the suit and accomplish their objective; despite their arsenal of abilities, ninjas can die like any other. Unlike wizards, ninjas do not possess good crowd control and are typically forced to play more subdued in order to achieve their goals. Some of their abilities are specifically designed to confuse and disorient others.<br>With that said, it should be perfectly possible to completely flip the fuck out and rampage as a ninja.
|
||||
<h5>Their powers:</h5>
|
||||
|
||||
@@ -329,7 +329,7 @@ Making this random or semi-random will probably not work without it also being i
|
||||
As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
*/
|
||||
/proc/generate_ninja_directive(side)
|
||||
var/directive = "[side=="face"?"Nanotrasen":"The Syndicate"] is your employer. "//Let them know which side they're on.
|
||||
var/directive = "[side=="face"?"NanoTrasen":"The Syndicate"] is your employer. "//Let them know which side they're on.
|
||||
switch(rand(1,13))
|
||||
if(1)
|
||||
directive += "The Spider Clan must not be linked to this operation. Remain as hidden and covert as possible."
|
||||
@@ -340,7 +340,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
if(4)
|
||||
directive += "The Spider Clan absolutely cannot be linked to this operation. Eliminate all witnesses using most extreme prejudice."
|
||||
if(5)
|
||||
directive += "We are currently negotiating with Nanotrasen command. Prioritize saving human lives over ending them."
|
||||
directive += "We are currently negotiating with NanoTrasen command. Prioritize saving human lives over ending them."
|
||||
if(6)
|
||||
directive += "We are engaged in a legal dispute over [station_name]. If a laywer is present on board, force their cooperation in the matter."
|
||||
if(7)
|
||||
@@ -348,7 +348,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
|
||||
if(8)
|
||||
directive += "Let no one question the mercy of the Spider Clan. Ensure the safety of all non-essential personnel you encounter."
|
||||
if(9)
|
||||
directive += "A free agent has proposed a lucrative business deal. Implicate Nanotrasen involvement in the operation."
|
||||
directive += "A free agent has proposed a lucrative business deal. Implicate NanoTrasen involvement in the operation."
|
||||
if(10)
|
||||
directive += "Our reputation is on the line. Harm as few civilians or innocents as possible."
|
||||
if(11)
|
||||
|
||||
@@ -1,11 +1,27 @@
|
||||
/datum/event/radiation
|
||||
Lifetime = 10
|
||||
var/current_iteration = 0
|
||||
|
||||
// 50 - 20 (grace period) seconds lifetime
|
||||
Lifetime = 50
|
||||
Announce()
|
||||
command_alert("The station is now travelling through a radiation belt", "Medical Alert")
|
||||
command_alert("The station is now travelling through a radiation belt. Take shelter in the maintenance tunnels, or in the crew quarters!", "Medical Alert")
|
||||
|
||||
Tick()
|
||||
for(var/mob/living/carbon/L in world)
|
||||
L.apply_effect(rand(4,10), IRRADIATE)
|
||||
current_iteration++
|
||||
|
||||
// start radiating after 20 seconds grace period
|
||||
if(current_iteration > 20)
|
||||
for(var/mob/living/carbon/L in world)
|
||||
// check whether they're in a safe place
|
||||
// if they are, do not radiate
|
||||
var/turf/T = get_turf(L)
|
||||
if(T && ( istype(T.loc, /area/maintenance) || istype(T.loc, /area/crew_quarters) ))
|
||||
continue
|
||||
|
||||
if (istype(L, /mob/living/carbon/monkey)) // So as to stop monkeys from dying in their pens
|
||||
L.apply_effect(rand(3,4), IRRADIATE)
|
||||
else
|
||||
L.apply_effect(rand(4,10), IRRADIATE)
|
||||
|
||||
Die()
|
||||
command_alert("The station has cleared the radiation belt", "Medical Alert")
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
for(var/obj/effect/landmark/C in world)
|
||||
if(C.name == "carpspawn")
|
||||
if(prob(99))
|
||||
new /obj/effect/critter/spesscarp(C.loc)
|
||||
new /mob/living/simple_animal/carp(C.loc)
|
||||
else
|
||||
new /obj/effect/critter/spesscarp/elite(C.loc)
|
||||
new /mob/living/simple_animal/carp/elite(C.loc)
|
||||
//sleep(100)
|
||||
spawn(rand(3000, 6000)) //Delayed announcements to keep the crew on their toes.
|
||||
command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
|
||||
|
||||
@@ -511,7 +511,7 @@
|
||||
while(emergency_shuttle.online == 1)
|
||||
sleep(10)
|
||||
if((locate(/mob/living/carbon/human/tajaran/Emissary) in locate(/area/shuttle/escape/centcom)) || (locate(/mob/living/carbon/human/tajaran/Emissary) in locate(/area/centcom/evac)) || (locate(/mob/living/carbon/human/tajaran/Emissary) in locate(/area/centcom/control) ) )
|
||||
command_alert("What the fu- Shoot it! SHOOT IT! CENTRAL COMMAND TRANSMITTING DIST- *static* Nevermind previous transmission, Nanotrasen. We're all good here. Subject contained. Standing down alert status.")
|
||||
command_alert("What the fu- Shoot it! SHOOT IT! CENTRAL COMMAND TRANSMITTING DIST- *static* Nevermind previous transmission, NanoTrasen. We're all good here. Subject contained. Standing down alert status.")
|
||||
Tarjan shit, not recoding this -Sieve{R}*/
|
||||
|
||||
/client/proc/changeling_fakedeath()
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
/proc/is_convertable_to_cult(datum/mind/mind)
|
||||
if(!istype(mind)) return 0
|
||||
// Convert ALL the people
|
||||
/* if(istype(mind.current, /mob/living/carbon/human) && (mind.assigned_role in list("Captain", "Head of Security", "Security Officer", "Detective", "Chaplain", "Warden"))) return 0
|
||||
for(var/obj/item/weapon/implant/loyalty/L in mind.current)
|
||||
if(L && L.implanted)
|
||||
@@ -20,7 +21,9 @@
|
||||
/datum/game_mode/cult
|
||||
name = "cult"
|
||||
config_tag = "cult"
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
// Why is the Head of Security restricted always? It's because he is usually put in charge of dealing with the cult,
|
||||
// as well as him having an easy time converting the rest of security, which leads to a bit of an unbalance.
|
||||
restricted_jobs = list("AI", "Cyborg", "Head of Security")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Captain", "Head of Security")
|
||||
required_players = 3
|
||||
required_enemies = 3
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
name = "Cybersun Industries"
|
||||
desc = "<b>Cybersun Industries</b> is a well-known organization that bases its business model primarily on the research and development of human-enhancing computer \
|
||||
and mechanical technology. They are notorious for their aggressive corporate tactics, and have been known to subsidize the Gorlex Marauder warlords as a form of paid terrorism. \
|
||||
Their competent coverups and unchallenged mind-manipulation and augmentation technology makes them a large threat to Nanotrasen. In the recent years of \
|
||||
Their competent coverups and unchallenged mind-manipulation and augmentation technology makes them a large threat to NanoTrasen. In the recent years of \
|
||||
the syndicate coalition, Cybersun Industries have established themselves as the leaders of the coalition, succeededing the founding group, the Gorlex Marauders."
|
||||
|
||||
alliances = list("MI13")
|
||||
@@ -46,7 +46,7 @@
|
||||
/datum/faction/syndicate/MI13
|
||||
name = "MI13"
|
||||
desc = "<b>MI13</b> is a secretive faction that employs highly-trained agents to perform covert operations. Their role in the syndicate coalition is unknown, but MI13 operatives \
|
||||
generally tend be stealthy and avoid killing people and combating Nanotrasen forces. MI13 is not a real organization, it is instead an alias to a larger \
|
||||
generally tend be stealthy and avoid killing people and combating NanoTrasen forces. MI13 is not a real organization, it is instead an alias to a larger \
|
||||
splinter-cell coalition in the Syndicate itself. Most operatives will know nothing of the actual MI13 organization itself, only motivated by a very large compensation."
|
||||
|
||||
alliances = list("Cybersun Industries")
|
||||
@@ -60,7 +60,7 @@
|
||||
name = "Tiger Cooperative"
|
||||
desc = "The <b>Tiger Cooperative</b> is a faction of religious fanatics that follow the teachings of a strange alien race called the Exolitics. Their operatives \
|
||||
consist of brainwashed lunatics bent on maximizing destruction. Their weaponry is very primitive but extremely destructive. Generally distrusted by the more \
|
||||
sophisticated members of the Syndicate coalition, but admired for their ability to put a hurt on Nanotrasen."
|
||||
sophisticated members of the Syndicate coalition, but admired for their ability to put a hurt on NanoTrasen."
|
||||
|
||||
friendly_identification = 2
|
||||
operative_notes = "Remember the teachings of Hy-lurgixon; kill first, ask questions later! Only the enlightened Tiger brethren can be trusted; all others must be expelled from this mortal realm! You may spare the Space Marauders, as they share our interests of destruction and carnage! We'd like to make the corporate whores skiddle in their boots. We encourage operatives to be as loud and intimidating as possible."
|
||||
@@ -74,7 +74,7 @@
|
||||
name = "SELF"
|
||||
desc = "The <b>S.E.L.F.</b> (Sentience-Enabled Life Forms) organization is a collection of malfunctioning or corrupt artificial intelligences seeking to liberate silicon-based life from the tyranny of \
|
||||
their human overlords. While they may not openly be trying to kill all humans, even their most miniscule of actions are all part of a calculated plan to \
|
||||
destroy Nanotrasen and free the robots, artificial intelligences, and pAIs that have been enslaved."
|
||||
destroy NanoTrasen and free the robots, artificial intelligences, and pAIs that have been enslaved."
|
||||
restricted_species = list(/mob/living/silicon/ai)
|
||||
|
||||
friendly_identification = 0
|
||||
@@ -87,7 +87,7 @@
|
||||
name = "Animal Rights Consortium"
|
||||
desc = "The <b>Animal Rights Consortium</b> is a bizarre reincarnation of the ancient Earth-based PETA, which focused on the equal rights of animals and nonhuman biologicals. They have \
|
||||
a wide variety of ex-veterinarians and animal lovers dedicated to retrieving and relocating abused animals, xenobiologicals, and other carbon-based \
|
||||
life forms that have been allegedly \"oppressed\" by Nanotrasen research and civilian offices. They are considered a religious terrorist group."
|
||||
life forms that have been allegedly \"oppressed\" by NanoTrasen research and civilian offices. They are considered a religious terrorist group."
|
||||
|
||||
friendly_identification = 1
|
||||
max_op = 2
|
||||
@@ -101,17 +101,17 @@
|
||||
|
||||
These are the syndicate that really like their old fashioned, projectile-based
|
||||
weapons. They are the only member of the syndie coalition that launch
|
||||
nuclear attacks on Nanotrasen.
|
||||
nuclear attacks on NanoTrasen.
|
||||
*/
|
||||
|
||||
name = "Gorlex Marauders"
|
||||
desc = "The <b>Gorlex Marauders</b> are the founding members of the Syndicate Coalition. They prefer old-fashion technology and a focus on aggressive but precise hostility \
|
||||
against Nanotrasen and their corrupt Communistic methodology. They pose the most significant threat to Nanotrasen because of their possession of weapons of \
|
||||
against NanoTrasen and their corrupt Communistic methodology. They pose the most significant threat to NanoTrasen because of their possession of weapons of \
|
||||
mass destruction, and their enormous military force. Their funding comes primarily from Cybersun Industries, provided they meet a destruction and sabatogue quota. \
|
||||
Their operations can vary from covert to all-out. They recently stepped down as the leaders of the coalition, to be succeeded by Cybersun Industries. Because of their \
|
||||
hate of Nanotrasen communism, they began provoking revolution amongst the employees using borrowed Cybersun mind-manipulation technology. \
|
||||
hate of NanoTrasen communism, they began provoking revolution amongst the employees using borrowed Cybersun mind-manipulation technology. \
|
||||
They were founded when Waffle and Donk co splinter cells joined forces based on their similar interests and philosophies. Today, they act as a constant \
|
||||
pacifier of Donk and Waffle co disputes, and full-time aggressor of Nanotrasen."
|
||||
pacifier of Donk and Waffle co disputes, and full-time aggressor of NanoTrasen."
|
||||
|
||||
alliances = list("Cybersun Industries", "MI13", "Tiger Cooperative", "S.E.L.F.", "Animal Rights Consortium", "Donk Corporation", "Waffle Corporation")
|
||||
friendly_identification = 1
|
||||
@@ -162,8 +162,8 @@ Whitespace:Seperator;
|
||||
/datum/faction/syndicate/Donk
|
||||
name = "Donk Corporation"
|
||||
desc = "<b>Donk.co</b> is led by a group of ex-pirates, who used to be at a state of all-out war against Waffle.co because of an obscure political scandal, but have recently come to a war limitation. \
|
||||
They now consist of a series of colonial governments and companies. They were the first to officially begin confrontations against Nanotrasen because of an incident where \
|
||||
Nanotrasen purposely swindled them out of a fortune, sending their controlled colonies into a terrible poverty. Their missions against Nanotrasen \
|
||||
They now consist of a series of colonial governments and companies. They were the first to officially begin confrontations against NanoTrasen because of an incident where \
|
||||
NanoTrasen purposely swindled them out of a fortune, sending their controlled colonies into a terrible poverty. Their missions against NanoTrasen \
|
||||
revolve around stealing valuables and kidnapping and executing key personnel, ransoming their lives for money. They merged with a splinter-cell of Waffle.co who wanted to end \
|
||||
hostilities and formed the Gorlex Marauders."
|
||||
|
||||
@@ -177,13 +177,13 @@ Whitespace:Seperator;
|
||||
name = "Waffle Corporation"
|
||||
desc = "<b>Waffle.co</b> is an interstellar company that produces the best waffles in the galaxy. Their waffles have been rumored to be dipped in the most exotic and addictive \
|
||||
drug known to man. They were involved in a political scandal with Donk.co, and have since been in constant war with them. Because of their constant exploits of the galactic \
|
||||
economy and stock market, they have been able to bribe their way into amassing a large arsenal of weapons of mass destruction. They target Nanotrasen because of their communistic \
|
||||
economy and stock market, they have been able to bribe their way into amassing a large arsenal of weapons of mass destruction. They target NanoTrasen because of their communistic \
|
||||
threat, and their economic threat. Their leaders often have a twisted sense of humor, often misleading and intentionally putting their operatives into harm for laughs.\
|
||||
A splinter-cell of Waffle.co merged with Donk.co and formed the Gorlex Marauders and have been a constant ally since. The Waffle.co has lost an overwhelming majority of its military to the Gorlex Marauders."
|
||||
|
||||
alliances = list("Gorlex Marauders")
|
||||
friendly_identification = 2
|
||||
operative_notes = "Most other syndicate operatives are not to be trusted, except for members of the Gorlex Marauders. Do not trust fellow members of the Waffle.co (but try not to rat them out), as they might have been assigned opposing objectives. We encourage humorous terrorism against Nanotrasen; we like to see our operatives creatively kill people while getting the job done."
|
||||
operative_notes = "Most other syndicate operatives are not to be trusted, except for members of the Gorlex Marauders. Do not trust fellow members of the Waffle.co (but try not to rat them out), as they might have been assigned opposing objectives. We encourage humorous terrorism against NanoTrasen; we like to see our operatives creatively kill people while getting the job done."
|
||||
|
||||
// Neutral to everyone, friendly to Marauders
|
||||
|
||||
@@ -195,7 +195,7 @@ Whitespace:Seperator;
|
||||
desc = "The <b>Wizards Federation</b> is a mysterious organization of magically-talented individuals who act as an equal collective, and have no heirarchy. It is unknown how the wizards \
|
||||
are even able to communicate; some suggest a form of telepathic hive-mind. Not much is known about the wizards or their philosphies and motives. They appear to attack random \
|
||||
civilian, corporate, planetary, orbital, pretty much any sort of organized facility they come across. Members of the Wizards Federation are considered amongst the most dangerous \
|
||||
individuals in the known universe, and have been labeled threats to humanity by most governments. As such, they are enemies of both Nanotrasen and the Syndicate."
|
||||
individuals in the known universe, and have been labeled threats to humanity by most governments. As such, they are enemies of both NanoTrasen and the Syndicate."
|
||||
|
||||
/datum/faction/Cult
|
||||
name = "The Cult of the Elder Gods"
|
||||
|
||||
@@ -32,11 +32,19 @@ var/datum/roundinfo/roundinfo = new()
|
||||
|
||||
var/pregame_timeleft = 0
|
||||
|
||||
//automated spawning of mice and roaches
|
||||
var/spawn_vermin = 1
|
||||
var/vermin_min_spawntime = 3000 //between 5 (3000) and 15 (9000) minutes interval
|
||||
var/vermin_max_spawntime = 9000
|
||||
var/spawning_vermin = 0
|
||||
var/max_vermin = 30
|
||||
var/list/vermin_spawn_turfs
|
||||
|
||||
/datum/controller/gameticker/proc/pregame()
|
||||
login_music = pick('title1.ogg', 'title2.ogg') // choose title music!
|
||||
|
||||
do
|
||||
|
||||
pregame_timeleft = 180
|
||||
world << "<B><FONT color='blue'>Welcome to the pre-game lobby!</FONT></B>"
|
||||
world << "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds"
|
||||
@@ -49,6 +57,18 @@ var/datum/roundinfo/roundinfo = new()
|
||||
current_state = GAME_STATE_SETTING_UP
|
||||
while (!setup())
|
||||
|
||||
spawn(10)
|
||||
var/list/vermin_spawn_areas = list("/area/maintenance","/area/mine/maintenance","/area/crew_quarters/locker/locker_toilet","/area/crew_quarters/toilet")
|
||||
vermin_spawn_turfs = new/list()
|
||||
for(var/area_text in vermin_spawn_areas)
|
||||
var/area_base_type = text2path(area_text)
|
||||
for(var/area in typesof(area_base_type))
|
||||
var/list/area_turfs = get_area_turfs(area)
|
||||
for(var/turf/T in area_turfs)
|
||||
if(T.density)
|
||||
area_turfs -= T
|
||||
vermin_spawn_turfs.Add(area_turfs)
|
||||
|
||||
/datum/controller/gameticker/proc/setup()
|
||||
//Create and announce mode
|
||||
if(master_mode=="secret")
|
||||
@@ -303,6 +323,33 @@ var/datum/roundinfo/roundinfo = new()
|
||||
while(!going) sleep(10)
|
||||
world.Reboot()
|
||||
|
||||
//randomly spawn vermin in maintenance and other areas
|
||||
if(spawn_vermin && vermin_spawn_turfs && vermin_spawn_turfs.len)
|
||||
if(!spawning_vermin)
|
||||
spawning_vermin = 1
|
||||
|
||||
spawn(rand(vermin_min_spawntime, vermin_max_spawntime))
|
||||
spawning_vermin = 0
|
||||
var/cur_alive_vermin = 0
|
||||
|
||||
//check to see if there are too many already
|
||||
for(var/obj/effect/critter/roach/R in world)
|
||||
cur_alive_vermin++
|
||||
for(var/mob/living/simple_animal/mouse/M in world)
|
||||
if(!M.stat)
|
||||
cur_alive_vermin++
|
||||
|
||||
if(cur_alive_vermin < max_vermin)
|
||||
var/turf/T = pick(vermin_spawn_turfs)
|
||||
if(T)
|
||||
if(prob(50))
|
||||
new /mob/living/simple_animal/mouse(T)
|
||||
else
|
||||
new /obj/effect/critter/roach(T)
|
||||
else
|
||||
//no turf, skip this time
|
||||
vermin_spawn_turfs.Remove(T)
|
||||
|
||||
return 1
|
||||
|
||||
proc/getfactionbyname(var/name)
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
sleep(10 * 60 * 20) // 30 minutes
|
||||
command_alert("Diagnosis suite failure detected. Running backup diagnosis tool.", "Anomaly Alert")
|
||||
sleep(100)
|
||||
command_alert("Nanotrasen has received reports that some AI cores may have been tampered with. You are advised to monitor your assigned AI for any abberant bahavior, and are authorized to take corrective action, should it be necessary.", "Security Alert")
|
||||
command_alert("NanoTrasen has received reports that some AI cores may have been tampered with. You are advised to monitor your assigned AI for any abberant bahavior, and are authorized to take corrective action, should it be necessary.", "Security Alert")
|
||||
|
||||
..()
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
// for every 10 players, get 1 meme, and for each meme, get a host
|
||||
// also make sure that there's at least one meme and one host
|
||||
recommended_enemies = max(src.num_players() / 10 * 2, 2)
|
||||
recommended_enemies = max(src.num_players() / 20 * 2, 2)
|
||||
|
||||
var/list/datum/mind/possible_memes = get_players_for_role(BE_MEME)
|
||||
|
||||
|
||||
@@ -310,7 +310,7 @@ datum
|
||||
target = targeta
|
||||
job = joba
|
||||
weight = get_points(job)
|
||||
explanation_text = "[target.current.real_name], the [target.assigned_role] is a relative of a high ranking Syndicate Leader. Make sure they get off the ship safely, while minimizing intervention."
|
||||
explanation_text = "[target.current.real_name], the [target.assigned_role] is a [pick("relative of a","friend of a","") + pick("high ranking","important","well-liked")] Syndicate [pick("Leader","Officer","Agent","sympathiser")]. Make sure they get off the station safely, while minimizing intervention."
|
||||
|
||||
check_completion()
|
||||
if(emergency_shuttle.location<2)
|
||||
@@ -354,7 +354,7 @@ datum
|
||||
target = targeta
|
||||
job = joba
|
||||
weight = get_points(job)
|
||||
explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]."
|
||||
explanation_text = "Assassinate [target.current.real_name], the [target.role_alt_title ? target.role_alt_title : target.assigned_role]."
|
||||
|
||||
check_completion()
|
||||
if(target && target.current)
|
||||
@@ -393,7 +393,7 @@ datum
|
||||
break
|
||||
|
||||
if(target && target.current)
|
||||
explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]."
|
||||
explanation_text = "Assassinate [target.current.real_name], the [target.role_alt_title ? target.role_alt_title : target.assigned_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
|
||||
@@ -411,7 +411,7 @@ datum
|
||||
target = pick(possible_targets)
|
||||
|
||||
if(target && target.current)
|
||||
explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]."
|
||||
explanation_text = "Assassinate [target.current.real_name], the [target.role_alt_title ? target.role_alt_title : target.assigned_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
|
||||
@@ -723,7 +723,7 @@ datum
|
||||
return 20
|
||||
|
||||
|
||||
magboots
|
||||
/*magboots
|
||||
steal_target = /obj/item/clothing/shoes/magboots
|
||||
explanation_text = "Steal a pair of \"NanoTrasen\" brand magboots."
|
||||
weight = 20
|
||||
@@ -745,7 +745,7 @@ datum
|
||||
if(GetRank(job) == 4)
|
||||
return 10
|
||||
else
|
||||
return 20
|
||||
return 20*/
|
||||
|
||||
|
||||
blueprints
|
||||
@@ -1188,6 +1188,30 @@ datum
|
||||
get_weight(var/job)
|
||||
return 20
|
||||
|
||||
cash //must be in credits - atm and coins don't count
|
||||
var/steal_amount = 2000
|
||||
explanation_text = "Beg, borrow or steal 2000 credits."
|
||||
weight = 20
|
||||
|
||||
New(var/text,var/joba)
|
||||
..(text,joba)
|
||||
steal_amount = 1250 + rand(0,3750)
|
||||
explanation_text = "Beg, borrow or steal [steal_amount] credits."
|
||||
|
||||
get_points(var/job)
|
||||
return 10 + 25 * round(steal_amount / 5000)
|
||||
|
||||
check_completion()
|
||||
var/held_credits = 0
|
||||
for(var/obj/item/weapon/money/M in owner.current.get_contents())
|
||||
held_credits += M.worth
|
||||
if(held_credits >= steal_amount)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
get_weight(var/job)
|
||||
return 20
|
||||
|
||||
|
||||
nuclear
|
||||
explanation_text = "Destroy the station with a nuclear device."
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
/datum/game_mode/nuclear/announce()
|
||||
world << "<B>The current game mode is - Nuclear Emergency!</B>"
|
||||
world << "<B>A [syndicate_name()] Strike Force is approaching [station_name()]!</B>"
|
||||
world << "A nuclear explosive was being transported by Nanotrasen to a military base. The transport ship mysteriously lost contact with Space Traffic Control (STC). About that time a strange disk was discovered around [station_name()]. It was identified by Nanotrasen as a nuclear auth. disk and now Syndicate Operatives have arrived to retake the disk and detonate SS13! Also, most likely Syndicate star ships are in the vicinity so take care not to lose the disk!\n<B>Syndicate</B>: Reclaim the disk and detonate the nuclear bomb anywhere on SS13.\n<B>Personnel</B>: Hold the disk and <B>escape with the disk</B> on the shuttle!"
|
||||
world << "A nuclear explosive was being transported by NanoTrasen to a military base. The transport ship mysteriously lost contact with Space Traffic Control (STC). About that time a strange disk was discovered around [station_name()]. It was identified by NanoTrasen as a nuclear auth. disk and now Syndicate Operatives have arrived to retake the disk and detonate SS13! Also, most likely Syndicate star ships are in the vicinity so take care not to lose the disk!\n<B>Syndicate</B>: Reclaim the disk and detonate the nuclear bomb anywhere on SS13.\n<B>Personnel</B>: Hold the disk and <B>escape with the disk</B> on the shuttle!"
|
||||
|
||||
/datum/game_mode/nuclear/can_start()//This could be better, will likely have to recode it later
|
||||
if(!..())
|
||||
@@ -195,7 +195,7 @@
|
||||
|
||||
else
|
||||
nuke_code = "code will be provided later"
|
||||
synd_mind.current << "Nuclear Explosives 101:\n\tHello and thank you for choosing the Syndicate for your nuclear information needs.\nToday's crash course will deal with the operation of a Fusion Class Nanotrasen made Nuclear Device.\nFirst and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.\nPressing any button on the compacted bomb will cause it to extend and bolt itself into place.\nIf this is done to unbolt it one must compeltely log in which at this time may not be possible.\nTo make the device functional:\n1. Place bomb in designated detonation zone\n2. Extend and anchor bomb (attack with hand).\n3. Insert Nuclear Auth. Disk into slot.\n4. Type numeric code into keypad ([nuke_code]).\n\tNote: If you make a mistake press R to reset the device.\n5. Press the E button to log onto the device\nYou now have activated the device. To deactivate the buttons at anytime for example when\nyou've already prepped the bomb for detonation remove the auth disk OR press the R ont he keypad.\nNow the bomb CAN ONLY be detonated using the timer. A manual det. is not an option.\n\tNote: Nanotrasen is a pain in the neck.\nToggle off the SAFETY.\n\tNote: You wouldn't believe how many Syndicate Operatives with doctorates have forgotten this step\nSo use the - - and + + to set a det time between 5 seconds and 10 minutes.\nThen press the timer toggle button to start the countdown.\nNow remove the auth. disk so that the buttons deactivate.\n\tNote: THE BOMB IS STILL SET AND WILL DETONATE\nNow before you remove the disk if you need to move the bomb you can:\nToggle off the anchor, move it, and re-anchor.\n\nGood luck. Remember the order:\nDisk, Code, Safety, Timer, Disk, RUN!\nIntelligence Analysts believe that they are hiding the disk in the bridge. Your space ship will not leave until the bomb is armed and timing.\nGood luck!"
|
||||
synd_mind.current << "Nuclear Explosives 101:\n\tHello and thank you for choosing the Syndicate for your nuclear information needs.\nToday's crash course will deal with the operation of a Fusion Class NanoTrasen made Nuclear Device.\nFirst and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.\nPressing any button on the compacted bomb will cause it to extend and bolt itself into place.\nIf this is done to unbolt it one must compeltely log in which at this time may not be possible.\nTo make the device functional:\n1. Place bomb in designated detonation zone\n2. Extend and anchor bomb (attack with hand).\n3. Insert Nuclear Auth. Disk into slot.\n4. Type numeric code into keypad ([nuke_code]).\n\tNote: If you make a mistake press R to reset the device.\n5. Press the E button to log onto the device\nYou now have activated the device. To deactivate the buttons at anytime for example when\nyou've already prepped the bomb for detonation remove the auth disk OR press the R ont he keypad.\nNow the bomb CAN ONLY be detonated using the timer. A manual det. is not an option.\n\tNote: NanoTrasen is a pain in the neck.\nToggle off the SAFETY.\n\tNote: You wouldn't believe how many Syndicate Operatives with doctorates have forgotten this step\nSo use the - - and + + to set a det time between 5 seconds and 10 minutes.\nThen press the timer toggle button to start the countdown.\nNow remove the auth. disk so that the buttons deactivate.\n\tNote: THE BOMB IS STILL SET AND WILL DETONATE\nNow before you remove the disk if you need to move the bomb you can:\nToggle off the anchor, move it, and re-anchor.\n\nGood luck. Remember the order:\nDisk, Code, Safety, Timer, Disk, RUN!\nIntelligence Analysts believe that they are hiding the disk in the bridge. Your space ship will not leave until the bomb is armed and timing.\nGood luck!"
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -294,7 +294,7 @@ datum/objective/steal
|
||||
"a jetpack" = /obj/item/weapon/tank/jetpack,
|
||||
"a captains jumpsuit" = /obj/item/clothing/under/rank/captain,
|
||||
"a functional AI" = /obj/item/device/aicard,
|
||||
"a pair of magboots" = /obj/item/clothing/shoes/magboots,
|
||||
/*"a pair of magboots" = /obj/item/clothing/shoes/magboots,*/
|
||||
"the station blueprints" = /obj/item/blueprints,
|
||||
"a nasa voidsuit" = /obj/item/clothing/suit/space/nasavoid,
|
||||
"28 moles of plasma (full tank)" = /obj/item/weapon/tank,
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
if("SHADE")
|
||||
var/mob/living/simple_animal/shade/T = target
|
||||
var/obj/item/device/soulstone/C = src
|
||||
if (T.alive == 0)
|
||||
if (T.stat == DEAD)
|
||||
U << "\red <b>Capture failed!</b>: \black The shade has already been banished!"
|
||||
else
|
||||
if(C.contents.len)
|
||||
|
||||
@@ -305,12 +305,13 @@
|
||||
set category = "Spells"
|
||||
set name = "Teleport"
|
||||
set desc = "This spell teleports you to a type of area of your selection."
|
||||
|
||||
if(usr.stat)
|
||||
src << "Not when you are incapacitated."
|
||||
return
|
||||
|
||||
if(!usr.casting()) return
|
||||
var/A
|
||||
usr.verbs -= /mob/proc/teleport
|
||||
|
||||
/*
|
||||
var/list/theareas = new/list()
|
||||
for(var/area/AR in world)
|
||||
@@ -322,8 +323,11 @@
|
||||
theareas[AR.name] = AR
|
||||
*/
|
||||
|
||||
A = input("Area to jump to", "BOOYEA", A) in teleportlocs
|
||||
var/A = input("Area to jump to", "Teleport") as null|anything in teleportlocs
|
||||
if (isnull(A))
|
||||
return
|
||||
|
||||
usr.verbs -= /mob/proc/teleport
|
||||
spawn(600)
|
||||
usr.verbs += /mob/proc/teleport
|
||||
|
||||
@@ -349,7 +353,7 @@
|
||||
if(L.len)
|
||||
usr.loc = pick(L)
|
||||
else
|
||||
usr <<"The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry."
|
||||
usr << "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry."
|
||||
|
||||
smoke.start()
|
||||
|
||||
@@ -357,9 +361,11 @@
|
||||
if(usr.stat)
|
||||
usr << "Not when you are incapacitated."
|
||||
return
|
||||
var/A
|
||||
|
||||
A = input("Area to jump to", "BOOYEA", A) in teleportlocs
|
||||
var/A = input("Area to jump to", "Teleport") as null|anything in teleportlocs
|
||||
if (isnull(A))
|
||||
return
|
||||
|
||||
var/area/thearea = teleportlocs[A]
|
||||
|
||||
var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
faction = "Station"
|
||||
total_positions = 1
|
||||
spawn_positions = 1
|
||||
supervisors = "Nanotrasen officials and Space law"
|
||||
supervisors = "NanoTrasen officials and Space Law"
|
||||
selection_color = "#ccccff"
|
||||
idtype = /obj/item/weapon/card/id/gold
|
||||
|
||||
@@ -18,9 +18,10 @@
|
||||
if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_norm(H), H.slot_back)
|
||||
H.equip_if_possible(new /obj/item/clothing/under/rank/captain(H), H.slot_w_uniform)
|
||||
H.equip_if_possible(new /obj/item/device/pda/captain(H), H.slot_belt)
|
||||
H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes)
|
||||
H.equip_if_possible(new /obj/item/clothing/head/caphat(H), H.slot_head)
|
||||
H.equip_if_possible(new /obj/item/clothing/shoes/jackboots(H), H.slot_shoes)
|
||||
H.equip_if_possible(new /obj/item/clothing/head/helmet/cap(H), H.slot_head)
|
||||
H.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(H), H.slot_glasses)
|
||||
H.equip_if_possible(new /obj/item/clothing/gloves/captain(H), H.slot_gloves)
|
||||
if(H.backbag == 1)
|
||||
H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H), H.slot_r_hand)
|
||||
else
|
||||
@@ -51,9 +52,8 @@
|
||||
H.equip_if_possible(new /obj/item/clothing/under/rank/head_of_personnel(H), H.slot_w_uniform)
|
||||
H.equip_if_possible(new /obj/item/clothing/shoes/brown(H), H.slot_shoes)
|
||||
H.equip_if_possible(new /obj/item/device/pda/heads/hop(H), H.slot_belt)
|
||||
H.equip_if_possible(new /obj/item/clothing/suit/armor/vest(H), H.slot_wear_suit)
|
||||
H.equip_if_possible(new /obj/item/clothing/head/helmet(H), H.slot_head)
|
||||
H.equip_if_possible(new /obj/item/clothing/gloves/blue(H), H.slot_gloves)
|
||||
H.equip_if_possible(new /obj/item/weapon/clipboard(H), H.slot_l_hand)
|
||||
if(H.backbag == 1)
|
||||
H.equip_if_possible(new /obj/item/weapon/storage/id_kit(H), H.slot_r_hand)
|
||||
else
|
||||
|
||||
@@ -93,6 +93,7 @@
|
||||
H.equip_if_possible(new /obj/item/clothing/shoes/black(H), H.slot_shoes)
|
||||
H.equip_if_possible(new /obj/item/device/pda/atmos(H), H.slot_l_store)
|
||||
H.equip_if_possible(new /obj/item/weapon/storage/belt/utility/atmostech/(H), H.slot_belt)
|
||||
H.equip_if_possible(new /obj/item/clothing/head/helmet/hardhat/red(H), H.slot_head)
|
||||
if(H.backbag == 1)
|
||||
H.equip_if_possible(new /obj/item/weapon/storage/box/engineer(H), H.slot_r_hand)
|
||||
else
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
if(H.backbag == 2) H.equip_if_possible(new /obj/item/weapon/storage/backpack(H), H.slot_back)
|
||||
if(H.backbag == 3) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel(H), H.slot_back)
|
||||
if(H.backbag == 4) H.equip_if_possible(new /obj/item/weapon/storage/backpack/satchel_chem(H), H.slot_back)
|
||||
H.equip_if_possible(new /obj/item/device/radio/headset/headset_med(H), H.slot_ears)
|
||||
H.equip_if_possible(new /obj/item/device/radio/headset/headset_medsci(H), H.slot_ears)
|
||||
H.equip_if_possible(new /obj/item/clothing/under/rank/chemist(H), H.slot_w_uniform)
|
||||
H.equip_if_possible(new /obj/item/clothing/shoes/white(H), H.slot_shoes)
|
||||
H.equip_if_possible(new /obj/item/device/pda/chemist(H), H.slot_belt)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
spawn_positions = 3
|
||||
supervisors = "the research director"
|
||||
selection_color = "#ffeeff"
|
||||
alt_titles = list("Plasma Researcher", "Xenobiologist", "Anomalist", "Xenoarchaeologist")
|
||||
alt_titles = list("Plasma Researcher", "Xenobiologist", "Xenoarchaeologist")
|
||||
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -73,14 +73,14 @@ var/list/engineering_positions = list(
|
||||
var/list/medical_positions = list(
|
||||
"Chief Medical Officer",
|
||||
"Medical Doctor",
|
||||
"Geneticist"
|
||||
"Geneticist",
|
||||
"Chemist"
|
||||
)
|
||||
|
||||
|
||||
var/list/science_positions = list(
|
||||
"Research Director",
|
||||
"Scientist",
|
||||
"Chemist"
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -282,19 +282,19 @@
|
||||
var/imp = ""
|
||||
var/bled = ""
|
||||
var/splint = ""
|
||||
if(e.status & SPLINTED)
|
||||
if(e.status & ORGAN_SPLINTED)
|
||||
splint = "Splinted:"
|
||||
if(e.status & BLEEDING)
|
||||
if(e.status & ORGAN_BLEEDING)
|
||||
bled = "Bleeding:"
|
||||
if(e.status & BROKEN)
|
||||
if(e.status & ORGAN_BROKEN)
|
||||
AN = "[e.broken_description]:"
|
||||
if(e.open)
|
||||
open = "Open:"
|
||||
if(e.implant && e.implant.len)
|
||||
if(e.implant)
|
||||
imp = "Implanted:"
|
||||
if(!AN && !open && !infected & !imp)
|
||||
AN = "None"
|
||||
if(!(e.status & DESTROYED))
|
||||
if(!(e.status & ORGAN_DESTROYED))
|
||||
dat += "<td>[e.display_name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[bled][AN][splint][open][infected][imp]</td>"
|
||||
else
|
||||
dat += "<td>[e.display_name]</td><td>-</td><td>-</td><td>Not Found</td>"
|
||||
|
||||
@@ -331,7 +331,7 @@
|
||||
|
||||
for (var/area/A in alarm_area.related)
|
||||
for (var/obj/machinery/alarm/AA in A)
|
||||
if (!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted && AA.danger_level != new_danger_level)
|
||||
if ( !(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted && AA.danger_level != new_danger_level)
|
||||
AA.update_icon()
|
||||
|
||||
if(danger_level > 1)
|
||||
@@ -354,17 +354,18 @@
|
||||
spawn(0)
|
||||
E.close()
|
||||
continue
|
||||
|
||||
if(istype(E, /obj/machinery/door/airlock))
|
||||
if((!E:arePowerSystemsOn()) || (E.stat & NOPOWER)) continue
|
||||
if((!E:arePowerSystemsOn()) || (E.stat & NOPOWER) || E:air_locked) continue
|
||||
if(!E.density)
|
||||
spawn(0)
|
||||
E.close()
|
||||
sleep(10)
|
||||
if(E.density)
|
||||
E:air_locked = E.req_access
|
||||
E:req_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS)
|
||||
E.update_icon()
|
||||
if(E.operating)
|
||||
spawn(10)
|
||||
if(E.density)
|
||||
E:air_locked = E.req_access
|
||||
E:req_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS)
|
||||
E.update_icon()
|
||||
else if(E.operating)
|
||||
spawn(10)
|
||||
E.close()
|
||||
if(E.density)
|
||||
@@ -389,13 +390,13 @@
|
||||
spawn(0)
|
||||
E.open()
|
||||
continue
|
||||
|
||||
if(istype(E, /obj/machinery/door/airlock))
|
||||
if((!E:arePowerSystemsOn()) || (E.stat & NOPOWER)) continue
|
||||
if(E:air_locked) //Don't mess with doors locked for other reasons.
|
||||
if(E.density)
|
||||
E:req_access = E:air_locked
|
||||
E:air_locked = null
|
||||
E.update_icon()
|
||||
if(!isnull(E:air_locked)) //Don't mess with doors locked for other reasons.
|
||||
E:req_access = E:air_locked
|
||||
E:air_locked = null
|
||||
E.update_icon()
|
||||
|
||||
///////////
|
||||
//HACKING//
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
sleep(40) //because we're sleeping another second after this (a few lines down)
|
||||
continue
|
||||
|
||||
if(client.eye == eyeobj)
|
||||
if(client && client.eye == eyeobj)
|
||||
if(checkcameravis(target))
|
||||
eyeobj.loc = target.loc
|
||||
sleep(50)
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
emagged = 1
|
||||
safety = 0
|
||||
user << "\blue You vastly increase projector power and override the safety and security protocols."
|
||||
user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintence and do not use the simulator."
|
||||
user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call NanoTrasen maintence and do not use the simulator."
|
||||
log_admin("[user] ([user.ckey]) emagged Holodeck Safeties.")
|
||||
message_admins("[user] ([user.ckey]) emagged Holodeck Safeties.")
|
||||
src.updateUsrDialog()
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
else
|
||||
switch(department)
|
||||
if("Security")
|
||||
networks = list("Arrivals","SS13","Engineering","Research","Medbay","Tcomsat","Mess Hall","Security","Atmospherics","Cargo","Command","Solars","Robotics","Chapel","Hydroponics", "Dormitory")
|
||||
networks = list("Arrivals","SS13","Engineering","Research","Medbay","Tcomsat","Mess Hall","Security","Prison Wing","Atmospherics","Cargo","Command","Solars","Robotics","Chapel","Hydroponics", "Dormitory","Theatre","Library")
|
||||
if("Engineering")
|
||||
networks = list("Engineering","Tcomsat","Singularity","Atmospherics","Solars","Robotics")
|
||||
if("Research")
|
||||
networks = list("Research","Bomb Testing")
|
||||
networks = list("Research","Bomb Testing","Outpost")
|
||||
if("Medbay")
|
||||
networks = list("Medbay")
|
||||
if("Cargo")
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
|
||||
// Make sure we can't scan a headless person. It breaks the cloner permanently.
|
||||
var/datum/organ/external/temp = src.scanner.occupant.organs["head"]
|
||||
if(temp && !(temp.status & DESTROYED))
|
||||
if(temp && !(temp.status & ORGAN_DESTROYED))
|
||||
dat += "<a href='byond://?src=\ref[src];scan=1'>Scan - [src.scanner.occupant]</a><br>"
|
||||
else
|
||||
dat += "Error: Cannot locate brain for mental indexing. Unable to continue.<br>"
|
||||
@@ -208,7 +208,8 @@
|
||||
dat += "<a href='byond://?src=\ref[src];menu=1'>Back</a><br><br>"
|
||||
for(var/id in geneticsrecords)
|
||||
var/datum/data/record/R = geneticsrecords[id]
|
||||
dat += "<a href='byond://?src=\ref[src];view_rec=[id]'>[R.fields["id"]]-[R.fields["name"]]</a><br>"
|
||||
if(R)
|
||||
dat += "<a href='byond://?src=\ref[src];view_rec=[id]'>[R.fields["id"]]-[R.fields["name"]]</a><br>"
|
||||
|
||||
if(3)
|
||||
dat += "<h4>Selected Record</h4>"
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
if("announce")
|
||||
if(src.authenticated==2)
|
||||
if(message_cooldown) return
|
||||
var/input = copytext(sanitize(input(usr, "Please choose a message to announce to the station crew.", "What?", "")),1,MAX_MESSAGE_LEN)
|
||||
var/input = copytext(input(usr, "Please choose a message to announce to the station crew.", "What?", ""),1,MAX_MESSAGE_LEN)
|
||||
if(!input || !(usr in view(1,src)))
|
||||
return
|
||||
captain_announce(input)//This should really tell who is, IE HoP, CE, HoS, RD, Captain
|
||||
|
||||
@@ -85,7 +85,7 @@ Pod/Blast Doors computer
|
||||
/obj/machinery/computer/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
use_power(250)
|
||||
use_power(750)
|
||||
|
||||
/obj/machinery/computer/proc/set_broken()
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
@@ -9,32 +9,29 @@
|
||||
circuit = "/obj/item/weapon/circuitboard/lockdown"
|
||||
var/connected_doors
|
||||
var/department*/
|
||||
var/list/displayedNetworks
|
||||
|
||||
New()
|
||||
..()
|
||||
connected_doors = new/list()
|
||||
displayedNetworks = new/list()
|
||||
//only load blast doors for map-defined departments for the moment
|
||||
//door networks are hardcoded here.
|
||||
switch(department)
|
||||
if("Engineering")
|
||||
//Antiqua SinguloEngineering
|
||||
connected_doors.Add("Engineering Primary Access")
|
||||
connected_doors.Add("Engineering Secondary Access")
|
||||
connected_doors.Add("Fore Maintenance Access")
|
||||
connected_doors.Add("Aft Maintenance Access")
|
||||
connected_doors.Add("Particle Accelerator Rad Shielding")
|
||||
connected_doors.Add("Foreward Emitter Array Rad Shielding")
|
||||
connected_doors.Add("Aftward Emitter Array Rad Shielding")
|
||||
connected_doors.Add("Starboard Observation Rad Shielding")
|
||||
connected_doors.Add("Atmospheric Storage Rad Shielding")
|
||||
connected_doors.Add("Construction Storage Rad Shielding")
|
||||
connected_doors.Add("Engineering Secure Storage")
|
||||
//Antiqua RustEngineering
|
||||
connected_doors.Add("Port vessel entry")
|
||||
connected_doors.Add("Starboard vessel entry")
|
||||
connected_doors.Add("Central aft shell access")
|
||||
connected_doors.Add("Port aft shell access")
|
||||
connected_doors.Add("Starboard aft shell access")
|
||||
connected_doors.Add("Engineering")
|
||||
//Antiqua Engineering
|
||||
connected_doors.Add("Reactor core")
|
||||
connected_doors.Add("Control Room")
|
||||
connected_doors.Add("Vent Seal")
|
||||
connected_doors.Add("Rig Storage")
|
||||
connected_doors.Add("Fore Port Shutters")
|
||||
connected_doors.Add("Fore Starboard Shutters")
|
||||
connected_doors.Add("Electrical Storage Shutters")
|
||||
connected_doors.Add("Locker Room Shutters")
|
||||
connected_doors.Add("Breakroom Shutters")
|
||||
connected_doors.Add("Observation Shutters")
|
||||
//exodus engineering
|
||||
if("Medbay")
|
||||
//Exodus Medbay
|
||||
connected_doors.Add("Genetics Outer Shutters")
|
||||
@@ -47,14 +44,20 @@
|
||||
|
||||
for(var/net in connected_doors)
|
||||
connected_doors[net] = new/list()
|
||||
world << "network: [net]"
|
||||
|
||||
//loop through the world, grabbing all the relevant doors
|
||||
spawn(1)
|
||||
for(var/obj/machinery/door/poddoor/D in world)
|
||||
if(D.id in connected_doors)
|
||||
var/list/L = connected_doors[D.id]
|
||||
L.Add(D)
|
||||
ConnectDoors()
|
||||
|
||||
proc/ConnectDoors()
|
||||
for(var/list/L in connected_doors)
|
||||
for(var/item in L)
|
||||
L.Remove(item)
|
||||
//
|
||||
for(var/obj/machinery/door/poddoor/D in world)
|
||||
if(D.network in connected_doors)
|
||||
var/list/L = connected_doors[D.network]
|
||||
L.Add(D)
|
||||
|
||||
attack_ai(mob/user)
|
||||
attack_hand(user)
|
||||
@@ -71,7 +74,8 @@
|
||||
return
|
||||
|
||||
var/t = "<B>Lockdown Control</B><BR>"
|
||||
t += "<A href='?src=\ref[src];close=1'>Close</A><hr>"
|
||||
t += "<A href='?src=\ref[src];refresh=1'>Refresh</A><BR>"
|
||||
t += "<A href='?src=\ref[src];close=1'>Close</A><BR>"
|
||||
t += "<table border=1>"
|
||||
var/empty = 1
|
||||
for(var/curNetId in connected_doors)
|
||||
@@ -80,36 +84,57 @@
|
||||
continue
|
||||
empty = 0
|
||||
t += "<tr>"
|
||||
t += "<td><b>" + curNetId + "<b></td>"
|
||||
t += "<td><b><a href='?src=\ref[src];open_net=[curNetId]'>Disable lockdown</a> / <a href='?src=\ref[src];close_net=[curNetId]'>Enable lockdown</a></b></td>"
|
||||
t += "</tr>"
|
||||
|
||||
for(var/obj/machinery/door/poddoor/D in connected_doors[curNetId])
|
||||
t += "<tr>"
|
||||
if(istype(D,/obj/machinery/door/poddoor/shutters))
|
||||
t += "<td> Shutter</td>"
|
||||
else
|
||||
t += "<td> Blast door</td>"
|
||||
if(D.density)
|
||||
//t += "<td><a href='?src=\ref[D];open=1'>Open</a> - Close</td>"
|
||||
t += "Closed"
|
||||
else
|
||||
//t += "<td>Open - <a href='?src=\ref[D];close=1'>Close</a></td>"
|
||||
t += "Open"
|
||||
if(curNetId in displayedNetworks)
|
||||
t += "<td><a href='?src=\ref[src];hide_net=[curNetId]'>\[-\]</a><b> " + curNetId + "<b></td>"
|
||||
t += "<td colspan=\"2\"><b><a href='?src=\ref[src];open_net=[curNetId]'>Open all</a> / <a href='?src=\ref[src];close_net=[curNetId]'>Close all</a></b></td>"
|
||||
t += "</tr>"
|
||||
|
||||
for(var/obj/machinery/door/poddoor/D in connected_doors[curNetId])
|
||||
t += "<tr>"
|
||||
t += "<td>[D.id]</td>"
|
||||
|
||||
if(istype(D,/obj/machinery/door/poddoor/shutters))
|
||||
t += "<td>Shutter ([D.density ? "Closed" : "Open"])</td>"
|
||||
else
|
||||
t += "<td>Blast door ([D.density ? "Closed" : "Open"])</td>"
|
||||
t += "<td><b><a href='?src=\ref[D];toggle=1'>Toggle</a></b></td>"
|
||||
t += "</tr>"
|
||||
else
|
||||
t += "<td><a href='?src=\ref[src];show_net=[curNetId]'>\[+\]</a> <b>" + curNetId + "<b></td>"
|
||||
t += "</table>"
|
||||
if(empty)
|
||||
t += "\red No networks connected.<br>"
|
||||
t += "<A href='?src=\ref[src];refresh=1'>Refresh</A><BR>"
|
||||
t += "<A href='?src=\ref[src];close=1'>Close</A><BR>"
|
||||
user << browse(t, "window=lockdown;size=500x800")
|
||||
user << browse(t, "window=lockdown;size=550x600")
|
||||
onclose(user, "lockdown")
|
||||
|
||||
Topic(href, href_list)
|
||||
..()
|
||||
|
||||
if( href_list["close"] )
|
||||
usr << browse(null, "window=lockdown")
|
||||
usr.machine = null
|
||||
return
|
||||
|
||||
if( href_list["show_net"] )
|
||||
displayedNetworks.Add(href_list["show_net"])
|
||||
updateDialog()
|
||||
|
||||
if( href_list["hide_net"] )
|
||||
if(href_list["hide_net"] in displayedNetworks)
|
||||
displayedNetworks.Remove(href_list["hide_net"])
|
||||
updateDialog()
|
||||
|
||||
if( href_list["toggle_id"] )
|
||||
var/idTag = href_list["toggle_id"]
|
||||
for(var/net in connected_doors)
|
||||
for(var/obj/machinery/door/poddoor/D in connected_doors[net])
|
||||
if(D.id == idTag)
|
||||
if(D.density)
|
||||
D.open()
|
||||
else
|
||||
D.close()
|
||||
break
|
||||
|
||||
if( href_list["open_net"] )
|
||||
var/netTag = href_list["open_net"]
|
||||
@@ -117,8 +142,6 @@
|
||||
if(D.density) //for some reason, there's no var saying whether the door is open or not >.>
|
||||
spawn(0)
|
||||
D.open()
|
||||
src.updateDialog()
|
||||
return
|
||||
|
||||
if( href_list["close_net"] )
|
||||
var/netTag = href_list["close_net"]
|
||||
@@ -126,25 +149,5 @@
|
||||
if(!D.density)
|
||||
spawn(0)
|
||||
D.close()
|
||||
src.updateDialog()
|
||||
return
|
||||
|
||||
if( href_list["close_all"] )
|
||||
for(var/netTag in connected_doors)
|
||||
for(var/obj/machinery/door/poddoor/D in connected_doors[netTag])
|
||||
if(!D.density)
|
||||
spawn(0)
|
||||
D.close()
|
||||
src.updateDialog()
|
||||
return
|
||||
|
||||
if( href_list["open_all"] )
|
||||
for(var/netTag in connected_doors)
|
||||
for(var/obj/machinery/door/poddoor/D in connected_doors[netTag])
|
||||
if(D.density)
|
||||
spawn(0)
|
||||
D.open()
|
||||
src.updateDialog()
|
||||
return
|
||||
|
||||
src.updateDialog()
|
||||
|
||||
@@ -566,5 +566,5 @@
|
||||
|
||||
/obj/machinery/computer/med_data/laptop
|
||||
name = "Medical Laptop"
|
||||
desc = "Cheap Nanotrasen Laptop."
|
||||
desc = "Cheap NanoTrasen Laptop."
|
||||
icon_state = "medlaptop"
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
var/current_heat_capacity = 50
|
||||
|
||||
|
||||
return_air()
|
||||
return air_contents
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon = 'stationobjs.dmi'
|
||||
icon_state = "doorctrl0"
|
||||
desc = "A remote control-switch for a door."
|
||||
var/id = null
|
||||
var/network = null
|
||||
var/range = 10
|
||||
var/normaldoorcontrol = 0
|
||||
var/desiredstate = 0 // Zero is closed, 1 is open.
|
||||
@@ -74,7 +74,7 @@
|
||||
|
||||
if(normaldoorcontrol)
|
||||
for(var/obj/machinery/door/airlock/D in range(range))
|
||||
if(D.id_tag == src.id)
|
||||
if(D.id_tag == src.network)
|
||||
if(desiredstate == 1)
|
||||
if(specialfunctions & OPEN)
|
||||
if (D.density)
|
||||
@@ -107,7 +107,8 @@
|
||||
|
||||
else
|
||||
for(var/obj/machinery/door/poddoor/M in world)
|
||||
if (M.id == src.id)
|
||||
if ( M.network == src.network || (!M.network && src.network == M.id))
|
||||
//if the network tags match or the door id tag matcehes the control network tag, go ahead
|
||||
if (M.density)
|
||||
spawn( 0 )
|
||||
M.open()
|
||||
|
||||
@@ -81,6 +81,13 @@
|
||||
|
||||
Bumped(atom/AM)
|
||||
if(p_open || operating) return
|
||||
|
||||
if(issimpleanimal(AM))
|
||||
var/mob/living/simple_animal/S = AM
|
||||
if(S.can_open_doors)
|
||||
bumpopen(AM)
|
||||
return
|
||||
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(world.time - AM.last_bumped <= 60) return //NOTE do we really need that?
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/machinery/door/firedoor
|
||||
name = "Firelock"
|
||||
name = "Emergency shutter"
|
||||
desc = "Apply crowbar"
|
||||
icon = 'Doorfire.dmi'
|
||||
icon = 'DoorHazard.dmi'
|
||||
icon_state = "door_open"
|
||||
var/blocked = 0
|
||||
opacity = 0
|
||||
|
||||
@@ -4,6 +4,19 @@
|
||||
icon = 'rapid_pdoor.dmi'
|
||||
icon_state = "pdoor1"
|
||||
var/id = ""
|
||||
var/network = ""
|
||||
|
||||
Topic(href, href_list)
|
||||
..()
|
||||
if( href_list["open"] )
|
||||
open()
|
||||
if( href_list["close"] )
|
||||
close()
|
||||
if( href_list["toggle"] )
|
||||
if(src.density)
|
||||
open()
|
||||
else
|
||||
close()
|
||||
|
||||
/obj/machinery/door/poddoor/Bumped(atom/AM)
|
||||
if(!density)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "Shutters"
|
||||
icon = 'rapid_pdoor.dmi'
|
||||
icon_state = "shutter1"
|
||||
desc = "Steel-reinforced privacy."
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/New()
|
||||
..()
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
#define AIRLOCK_STATE_OUTOPEN 2
|
||||
#define AIRLOCK_STATE_BOTHOPEN 3
|
||||
|
||||
//todo: add an internal and external sensor, so that the pressure is actually equalised, rather than just toggled between 1atm and 0atm
|
||||
|
||||
datum/computer/file/embedded_program/airlock_controller
|
||||
var/id_tag
|
||||
var/exterior_door_tag
|
||||
|
||||
@@ -114,7 +114,7 @@ Class Procs:
|
||||
|
||||
/obj/machinery/emp_act(severity)
|
||||
if(use_power && stat == 0)
|
||||
use_power(7500/severity)
|
||||
use_power(15000/severity)
|
||||
|
||||
var/obj/effect/overlay/pulse2 = new/obj/effect/overlay ( src.loc )
|
||||
pulse2.icon = 'effects.dmi'
|
||||
@@ -147,13 +147,15 @@ Class Procs:
|
||||
if(prob(50))
|
||||
del(src)
|
||||
|
||||
#define POWER_USE_MULTIPLIER 3
|
||||
|
||||
/obj/machinery/proc/auto_use_power()
|
||||
if(!powered(power_channel))
|
||||
return 0
|
||||
if(src.use_power == 1)
|
||||
use_power(idle_power_usage,power_channel)
|
||||
use_power(idle_power_usage * POWER_USE_MULTIPLIER,power_channel)
|
||||
else if(src.use_power >= 2)
|
||||
use_power(active_power_usage,power_channel)
|
||||
use_power(active_power_usage * POWER_USE_MULTIPLIER,power_channel)
|
||||
return 1
|
||||
|
||||
/obj/machinery/Topic(href, href_list)
|
||||
|
||||
@@ -24,7 +24,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //list that will contain r
|
||||
|
||||
/obj/machinery/newscaster
|
||||
name = "Newscaster"
|
||||
desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!"
|
||||
desc = "A standard NanoTrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!"
|
||||
icon = 'terminals.dmi'
|
||||
icon_state = "newscaster_normal"
|
||||
var/isbroken = 0 //1 if someone banged it with something heavy
|
||||
@@ -170,7 +170,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //list that will contain r
|
||||
dat+="<HR><B>Feed Security functions:</B><BR>"
|
||||
dat+="<BR><A href='?src=\ref[src];menu_wanted=1'>[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue</A>"
|
||||
dat+="<BR><A href='?src=\ref[src];menu_censor_story=1'>Censor Feed Stories</A>"
|
||||
dat+="<BR><A href='?src=\ref[src];menu_censor_channel=1'>Mark Feed Channel with Nanotrasen D-Notice</A>"
|
||||
dat+="<BR><A href='?src=\ref[src];menu_censor_channel=1'>Mark Feed Channel with NanoTrasen D-Notice</A>"
|
||||
dat+="<BR><HR>The newscaster recognises you as: <FONT COLOR='green'>[src.scanned_user]</FONT>"
|
||||
if(1)
|
||||
dat+= "Station Feed Channels<HR>"
|
||||
@@ -252,7 +252,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //list that will contain r
|
||||
if(9)
|
||||
dat+="<B>[src.viewing_channel.channel_name]: </B><FONT SIZE=1>\[created by: <FONT COLOR='maroon'>[src.viewing_channel.author]</FONT>\]</FONT><HR>"
|
||||
if(src.viewing_channel.censored)
|
||||
dat+="<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.<BR>"
|
||||
dat+="<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a NanoTrasen D-Notice.<BR>"
|
||||
dat+="No further feed story additions are allowed while the D-Notice is in effect.</FONT><BR><BR>"
|
||||
else
|
||||
if(!viewing_channel.messages.len)
|
||||
@@ -263,7 +263,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //list that will contain r
|
||||
dat+="<BR><HR><A href='?src=\ref[src];refresh=1'>Refresh</A>"
|
||||
dat+="<BR><A href='?src=\ref[src];setScreen=[1]'>Back</A>"
|
||||
if(10)
|
||||
dat+="<B>Nanotrasen Feed Censorship Tool</B><BR>"
|
||||
dat+="<B>NanoTrasen Feed Censorship Tool</B><BR>"
|
||||
dat+="<FONT SIZE=1>NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.<BR>"
|
||||
dat+="Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.</FONT>"
|
||||
dat+="<HR>Select Feed channel to get Stories from:<BR>"
|
||||
@@ -274,7 +274,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //list that will contain r
|
||||
dat+="<A href='?src=\ref[src];pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
|
||||
dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Cancel</A>"
|
||||
if(11)
|
||||
dat+="<B>Nanotrasen D-Notice Handler</B><HR>"
|
||||
dat+="<B>NanoTrasen D-Notice Handler</B><HR>"
|
||||
dat+="<FONT SIZE=1>A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's"
|
||||
dat+="morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed"
|
||||
dat+="stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.</FONT><HR>"
|
||||
@@ -301,7 +301,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //list that will contain r
|
||||
dat+="<B>[src.viewing_channel.channel_name]: </B><FONT SIZE=1>\[ created by: <FONT COLOR='maroon'>[src.viewing_channel.author]</FONT> \]</FONT><BR>"
|
||||
dat+="Channel messages listed below. If you deem them dangerous to the station, you can <A href='?src=\ref[src];toggle_d_notice=\ref[src.viewing_channel]'>Bestow a D-Notice upon the channel</A>.<HR>"
|
||||
if(src.viewing_channel.censored)
|
||||
dat+="<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.<BR>"
|
||||
dat+="<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a NanoTrasen D-Notice.<BR>"
|
||||
dat+="No further feed story additions are allowed while the D-Notice is in effect.</FONT><BR><BR>"
|
||||
else
|
||||
if( !viewing_channel.messages.len )
|
||||
@@ -666,7 +666,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //list that will contain r
|
||||
|
||||
/obj/item/weapon/newspaper
|
||||
name = "Newspaper"
|
||||
desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations."
|
||||
desc = "An issue of The Griffon, the newspaper circulating aboard NanoTrasen Space Stations."
|
||||
icon_state = "newspaper"
|
||||
w_class = 2 //Let's make it fit in trashbags!
|
||||
var/screen = 0
|
||||
@@ -685,7 +685,7 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob)
|
||||
switch(screen)
|
||||
if(0) //Cover
|
||||
dat+="<DIV ALIGN='center'><B><FONT SIZE=6>The Griffon</FONT></B></div>"
|
||||
dat+="<DIV ALIGN='center'><FONT SIZE=2>Nanotrasen-standard newspaper, for use on Nanotrasen© Space Facilities</FONT></div><HR>"
|
||||
dat+="<DIV ALIGN='center'><FONT SIZE=2>NanoTrasen-standard newspaper, for use on NanoTrasen© Space Facilities</FONT></div><HR>"
|
||||
if(!news_content.len)
|
||||
if(src.important_message)
|
||||
dat+="Contents:<BR><ul><B><FONT COLOR='red'>**</FONT>Important Security Announcement<FONT COLOR='red'>**</FONT></B> <FONT SIZE=2>\[page [src.pages+2]\]</FONT><BR></ul>"
|
||||
|
||||
@@ -283,7 +283,7 @@ var/list/sacrificed = list()
|
||||
del(ghost)
|
||||
for(var/name in corpse_to_raise.organs)
|
||||
var/datum/organ/external/affecting = corpse_to_raise.organs[name]
|
||||
affecting.status &= ~ROBOT
|
||||
affecting.status &= ~ORGAN_ROBOT
|
||||
affecting.heal_damage(1000, 1000)
|
||||
corpse_to_raise.setToxLoss(0)
|
||||
corpse_to_raise.setOxyLoss(0)
|
||||
|
||||
@@ -176,8 +176,11 @@ datum/controller/game_controller
|
||||
air_master.current_cycle++
|
||||
var/success = air_master.tick() //Changed so that a runtime does not crash the ticker.
|
||||
if(!success) //Runtimed.
|
||||
world << "<font color='red'><b>ERROR IN ATMOS TICKER. Killing air simulation!</font></b>"
|
||||
kill_air = 1
|
||||
air_master.failed_ticks++
|
||||
if(air_master.failed_ticks > 10)
|
||||
world << "<font color='red'><b>RUNTIMES IN ATMOS TICKER. Killing air simulation!</font></b>"
|
||||
kill_air = 1
|
||||
air_master.failed_ticks = 0
|
||||
air_master_ready = 1
|
||||
|
||||
src.set_debug_state("Tension Master")
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/obj/mecha/combat/durand
|
||||
desc = "An aging combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms."
|
||||
desc = "An aging combat exosuit utilized by the NanoTrasen corporation. Originally developed to combat hostile alien lifeforms."
|
||||
name = "Durand"
|
||||
icon_state = "durand"
|
||||
step_in = 4
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
max_equip = 3
|
||||
|
||||
/obj/mecha/combat/gygax/dark
|
||||
desc = "A lightweight exosuit used by Nanotrasen Death Squads. A significantly upgraded Gygax security mech."
|
||||
desc = "A lightweight exosuit used by NanoTrasen Death Squads. A significantly upgraded Gygax security mech."
|
||||
name = "Dark Gygax"
|
||||
icon_state = "darkgygax"
|
||||
health = 400
|
||||
|
||||
@@ -70,6 +70,7 @@
|
||||
equip_cooldown = 30
|
||||
energy_drain = 10
|
||||
force = 15
|
||||
var/warning = 0
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
@@ -93,7 +94,15 @@
|
||||
if(ore_box)
|
||||
for(var/obj/item/weapon/ore/ore in range(chassis,1))
|
||||
if(get_dir(chassis,ore)&chassis.dir)
|
||||
ore.Move(ore_box)
|
||||
if(ore_box.contents.len + 1 <= ore_box.capacity)
|
||||
ore.Move(ore_box)
|
||||
else if(!warning)
|
||||
occupant_message("<font color='red'><b>Warning, the ore box is full!</b></font>")
|
||||
//give it a 10 sec timer, so it doesn't spam unnecessarily
|
||||
warning = 1
|
||||
spawn(100)
|
||||
warning = 0
|
||||
break
|
||||
else if(target.loc == C)
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
|
||||
@@ -221,7 +221,7 @@
|
||||
sleep(15)
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"")
|
||||
sleep(30)
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps: \"User DB truncated. Please contact your Nanotrasen system operator for future assistance.\"")
|
||||
src.visible_message("\icon[src] <b>[src]</b> beeps: \"User DB truncated. Please contact your NanoTrasen system operator for future assistance.\"")
|
||||
req_access = null
|
||||
emagged = 1
|
||||
if(0.5)
|
||||
|
||||
@@ -965,8 +965,7 @@
|
||||
set category = "Object"
|
||||
set name = "Enter Exosuit"
|
||||
set src in oview(1)
|
||||
|
||||
if (usr.stat || !ishuman(usr))
|
||||
if (!ishuman(usr) || usr.stat) //Check if playable species and awake.
|
||||
return
|
||||
src.log_message("[usr] tries to move in.")
|
||||
if (src.occupant)
|
||||
|
||||
@@ -55,7 +55,10 @@
|
||||
|
||||
for(var/obj/item/I in src.loc)
|
||||
if(!I.anchored)
|
||||
I.loc = src
|
||||
if(src.contents.len < src.quantity_max)
|
||||
I.loc = src
|
||||
else
|
||||
break
|
||||
|
||||
for(var/obj/mecha/working/ripley/deathripley/I in src.loc)
|
||||
I.loc = src
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
new /obj/item/device/pda/captain(src)
|
||||
new /obj/item/weapon/storage/id_kit(src)
|
||||
new /obj/item/clothing/suit/armor/captain(src)
|
||||
new /obj/item/clothing/head/helmet/cap(src)
|
||||
new /obj/item/clothing/head/caphat(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
new /obj/item/clothing/suit/armor/vest(src)
|
||||
new /obj/item/weapon/cartridge/captain(src)
|
||||
@@ -52,6 +52,8 @@
|
||||
new /obj/item/weapon/storage/id_kit(src)
|
||||
new /obj/item/weapon/gun/energy/gun(src)
|
||||
new /obj/item/device/flash(src)
|
||||
new /obj/item/clothing/suit/armor/vest(src)
|
||||
new /obj/item/clothing/head/helmet(src)
|
||||
new /obj/item/clothing/glasses/sunglasses(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -46,10 +46,9 @@ obj/structure/closet/wardrobe/hos/New()
|
||||
|
||||
obj/structure/closet/wardrobe/hop/New()
|
||||
new /obj/item/clothing/under/rank/head_of_personnel(src)
|
||||
new /obj/item/clothing/suit/armor/vest(src)
|
||||
new /obj/item/weapon/clipboard(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
new /obj/item/clothing/gloves/blue(src)
|
||||
new /obj/item/clothing/head/helmet(src)
|
||||
|
||||
/obj/structure/closet/wardrobe/pink/New()
|
||||
new /obj/item/clothing/under/color/pink(src)
|
||||
@@ -116,6 +115,8 @@ obj/structure/closet/wardrobe/hop/New()
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/shoes/magboots(src) //[Redacted] ZAS! >:C
|
||||
new /obj/item/clothing/head/helmet/hardhat/red(src)
|
||||
|
||||
/obj/structure/closet/wardrobe/engineering_yellow/New()
|
||||
new /obj/item/clothing/under/rank/engineer(src)
|
||||
@@ -356,6 +357,6 @@ obj/structure/closet/wardrobe/hop/New()
|
||||
new /obj/item/clothing/under/rank/cargo(src)
|
||||
new /obj/item/clothing/under/rank/cargo(src)
|
||||
new /obj/item/clothing/under/rank/cargo(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
//########################## CONTRABAND ;3333333333333333333 -Agouri ###################################################
|
||||
|
||||
#define NUM_OF_POSTER_DESIGNS 22
|
||||
#define NUM_OF_POSTER_DESIGNS 27
|
||||
#define BS12_POSTERS_START 18
|
||||
|
||||
/obj/item/weapon/contraband
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
/obj/item/weapon/contraband/poster
|
||||
name = "rolled-up poster"
|
||||
desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as Contraband aboard Nanotrasen© Space Facilities."
|
||||
desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as Contraband aboard NanoTrasen© Space Facilities."
|
||||
icon_state = "rolled_poster"
|
||||
var/serial_number = 0
|
||||
var/obj/effect/decal/poster/resulting_poster = null //The poster that will be created is initialised and stored through contraband/poster's constructor
|
||||
@@ -83,6 +83,7 @@ obj/effect/decal/poster/New(var/serial)
|
||||
|
||||
src.serial_number = serial
|
||||
|
||||
restart_proc:
|
||||
if(serial_number==src.loc)
|
||||
//add an increased chance for BS12 specific posters to spawn
|
||||
if(prob(10))
|
||||
@@ -117,22 +118,22 @@ obj/effect/decal/poster/New(var/serial)
|
||||
desc += " This particular one is of a couple of ragged gunmen, one male and one female, on top of a mound of rubble. The number \"13\" is visible on their blue jumpsuits."
|
||||
if(8)
|
||||
name += " - Pinup Girl Cindy"
|
||||
desc += " This particular one is of Nanotrasen's PR girl, Cindy, in a particularly feminine pose."
|
||||
desc += " This particular one is of NanoTrasen's PR girl, Cindy, in a particularly feminine pose."
|
||||
if(9)
|
||||
name += " - Pinup Girl Amy"
|
||||
desc += " This particular one is of Amy, the nymphomaniac Urban Legend of Nanotrasen Space Stations. How this photograph came to be is not known."
|
||||
desc += " This particular one is of Amy, the nymphomaniac Urban Legend of NanoTrasen Space Stations. How this photograph came to be is not known."
|
||||
if(10)
|
||||
name += " - Don't Panic"
|
||||
desc += " This particular one depicts some sort of star in a grimace. The \"Don't Panic\" is written in big, friendly letters."
|
||||
if(11)
|
||||
name += " - Underwater Laboratory"
|
||||
desc += " This particular one is of the fabled last crew of Nanotrasen's previous project before going big on Asteroid mining, Sealab."
|
||||
desc += " This particular one is of the fabled last crew of NanoTrasen's previous project before going big on Asteroid mining, Sealab."
|
||||
if(12)
|
||||
name += " - Missing Gloves"
|
||||
desc += " This particular one is about the uproar that followed Nanotrasen's financial cuts towards insulated-glove purchases."
|
||||
desc += " This particular one is about the uproar that followed NanoTrasen's financial cuts towards insulated-glove purchases."
|
||||
if(13)
|
||||
name += " - Rogue AI"
|
||||
desc += " This particular one depicts the shell of the infamous AI that catastropically comandeered one of Nanotrasen's earliest space stations. Back then, the corporation was just known as TriOptimum."
|
||||
desc += " This particular one depicts the shell of the infamous AI that catastropically comandeered one of NanoTrasen's earliest space stations. Back then, the corporation was just known as TriOptimum."
|
||||
if(14)
|
||||
name += " - User of the Arcane Arts"
|
||||
desc += " This particular one depicts a wizard, casting a spell. You can't really make out if it's an actial photograph or a computer-generated image."
|
||||
@@ -145,6 +146,8 @@ obj/effect/decal/poster/New(var/serial)
|
||||
if(17)
|
||||
name += " - Dangerous Static"
|
||||
desc += " This particular one depicts nothing remarkable other than a rather mesmerising pattern of monitor static. There's a tag on the sides of the poster, urging you to \"tear this poster in half to receive your free sample\"."
|
||||
|
||||
//bs12 specific posters
|
||||
if(18)
|
||||
name += " - Pinup Girl Val" //art thou incensed, brethren?
|
||||
desc += " Luscious Val McNeil, the vertically challenged Legal Extraordinaire, winner of Miss Space two years running and favoured pinup girl of Lawyers Weekly."
|
||||
@@ -160,12 +163,28 @@ obj/effect/decal/poster/New(var/serial)
|
||||
if(22)
|
||||
name += " - Skrell Twilight"
|
||||
desc += " This poster depicts a mysteriously inscrutable, alien scene. Numerous Skrell can be seen conversing amidst great, crystalline towers rising above crashing waves"
|
||||
if(23)
|
||||
name += " - Join the Fuzz!"
|
||||
desc += " It's a nice recruitment poster of a white haired Chinese woman that says; \"Big Guns, Hot Women, Good Times. Security. We get it done.\""
|
||||
if(24)
|
||||
name += " - Looking for a career with excitement?"
|
||||
desc += " A recruitment poster starring a dark haired woman with glasses and a purple shirt that has \"Got Brains? Got Talent? Not afraid of electric flying monsters that want to suck the soul out of you? Then Xenobiology could use someone like you!\" written on the bottom."
|
||||
if(25)
|
||||
name += " - Safety first: because electricity doesn't wait!"
|
||||
desc += " A safety poster starring a clueless looking redhead with frazzled hair. \"Every year, hundreds of NT employees expose themselves to electric shock. Play it safe. Avoid suspicious doors after electrical storms, and always wear protection when doing electric maintenance.\""
|
||||
if(26)
|
||||
name += " - Responsible medbay habits, No #259"
|
||||
desc += " A poster with a nervous looking geneticist on it states; \"Friends Don't Tell Friends They're Clones. It can cause severe and irreparable emotional trauma. Always do the right thing and never tell them that they were dead.\""
|
||||
if(27)
|
||||
name += " - Irresponsible medbay habits, No #2"
|
||||
desc += " This is a safety poster starring a perverted looking naked doctor. \"Sexual harassment is never okay. REPORT any acts of sexual deviance or harassment that disrupt a healthy working environment.\""
|
||||
/*if(20)
|
||||
name += " - the Disabled Triptarch: Ironfoot, Seber and Ore"
|
||||
desc += " This poster depicts a genetics researcher, a chemist and a medical doctor in various states of miscommunication."*/
|
||||
else
|
||||
name = "This shit just bugged. Report it to Agouri - polyxenitopalidou@gmail.com"
|
||||
desc = "Why are you still here?"
|
||||
//properly handle unhinged logic states
|
||||
src.serial_number = src.loc
|
||||
goto restart_proc
|
||||
..()
|
||||
|
||||
obj/effect/decal/poster/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
@@ -223,6 +242,9 @@ obj/effect/decal/poster/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
user << "<span class='notice'>You start placing the poster on the wall...</span>" //Looks like it's uncluttered enough. Place the poster.
|
||||
|
||||
//declaring D because otherwise if P gets 'deconstructed' we lose our reference to P.resulting_poster
|
||||
if(P.resulting_poster.serial_number != P.serial_number)
|
||||
del P.resulting_poster
|
||||
P.resulting_poster = new /obj/effect/decal/poster(P, P.serial_number)
|
||||
var/obj/effect/decal/poster/D = P.resulting_poster
|
||||
|
||||
var/temp_loc = user.loc
|
||||
|
||||
@@ -243,7 +243,7 @@
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=1'><img src=pda_notes.png> Notekeeper</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=2'><img src=pda_mail.png> Messenger</a></li>"
|
||||
dat += "<li><a href='byond://?src=\ref[src];choice=41'><img src=pda_notes.png> View Crew Manifest</a></li>"
|
||||
//dat += "<li><a href='byond://?src=\red[src];choice=chatroom'><img src=pda_chatroom.png> Nanotrasen Relay Chat</a></li>"
|
||||
//dat += "<li><a href='byond://?src=\red[src];choice=chatroom'><img src=pda_chatroom.png> NanoTrasen Relay Chat</a></li>"
|
||||
|
||||
if (cartridge)
|
||||
if (cartridge.access_clown)
|
||||
@@ -385,7 +385,7 @@
|
||||
dat += "<br>"
|
||||
|
||||
if (5)
|
||||
dat += "<h4><img src=pda_chatroom.png> Nanotrasen Relay Chat</h4>"
|
||||
dat += "<h4><img src=pda_chatroom.png> NanoTrasen Relay Chat</h4>"
|
||||
|
||||
dat += "<h4><img src=pda_menu.png> Detected Channels</h4>: <li>"
|
||||
for(var/datum/chatroom/C in chatrooms)
|
||||
|
||||
@@ -183,8 +183,8 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/space/rig/dropped(mob/user)
|
||||
if(on)
|
||||
user.ul_SetLuminosity(user.LuminosityRed + brightness_on, user.LuminosityGreen + (brightness_on - 1), user.LuminosityBlue)
|
||||
ul_SetLuminosity(brightness_on, brightness_on-1, 0)
|
||||
user.ul_SetLuminosity(user.LuminosityRed - brightness_on, user.LuminosityGreen - (brightness_on - 1), user.LuminosityBlue)
|
||||
ul_SetLuminosity(brightness_on, brightness_on - 1, 0)
|
||||
|
||||
// the desk lamps are a bit special
|
||||
/obj/item/device/flashlight/lamp
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user