Merge branch 'master' into upstream-merge-31601

This commit is contained in:
LetterJay
2017-10-14 10:17:16 -04:00
committed by GitHub
101 changed files with 4200 additions and 11173 deletions
+3 -3
View File
@@ -34,11 +34,11 @@
to_chat(user, "<span class='notice'>You disassemble [src].</span>")
bombassembly.loc = user.loc
bombassembly.forceMove(user.drop_location())
bombassembly.master = null
bombassembly = null
bombtank.loc = user.loc
bombtank.forceMove(user.drop_location())
bombtank.master = null
bombtank = null
@@ -55,7 +55,7 @@
..()
/obj/item/device/onetankbomb/attack_self(mob/user) //pressing the bomb accesses its assembly
bombassembly.attack_self(user, 1)
bombassembly.attack_self(user, TRUE)
add_fingerprint(user)
return
@@ -48,6 +48,10 @@ Pipelines + Other Objects -> Pipe network
SSair.atmos_machinery += src
SetInitDirections()
/obj/machinery/atmospherics/ComponentInitialize()
. = ..()
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION) //This would be a bad idea
/obj/machinery/atmospherics/Destroy()
for(DEVICE_TYPE_LOOP)
nullifyNode(I)
@@ -1,4 +1,34 @@
//Academy Areas
/area/awaymission/academy
name = "Academy Asteroids"
icon_state = "away"
/area/awaymission/academy/headmaster
name = "Academy Fore Block"
icon_state = "away1"
/area/awaymission/academy/classrooms
name = "Academy Classroom Block"
icon_state = "away2"
/area/awaymission/academy/academyaft
name = "Academy Ship Aft Block"
icon_state = "away3"
/area/awaymission/academy/academygate
name = "Academy Gateway"
icon_state = "away4"
/area/awaymission/academy/academycellar
name = "Academy Cellar"
icon_state = "away4"
/area/awaymission/academy/academyengine
name = "Academy Engine"
icon_state = "away4"
//Academy Items
/obj/item/paper/fluff/awaymissions/academy/console_maint
@@ -1,4 +1,21 @@
/*Cabin areas*/
/area/awaymission/snowforest
name = "Snow Forest"
icon_state = "away"
requires_power = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
/area/awaymission/cabin
name = "Cabin"
icon_state = "away2"
requires_power = TRUE
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
/area/awaymission/snowforest/lumbermill
name = "Lumbermill"
icon_state = "away3"
/obj/structure/firepit
name = "firepit"
desc = "warm and toasty"
@@ -1,3 +1,33 @@
//Areas
/area/awaymission/caves/BMP_asteroid
name = "\improper BMP Asteroid Level 1"
icon_state = "awaycontent1"
/area/awaymission/caves/BMP_asteroid/level_two
name = "\improper BMP Asteroid Level 2"
icon_state = "awaycontent2"
/area/awaymission/caves/BMP_asteroid/level_three
name = "\improper BMP Asteroid Level 3"
icon_state = "awaycontent3"
/area/awaymission/caves/BMP_asteroid/level_four
name = "\improper BMP Asteroid Level 4"
icon_state = "awaycontent4"
/area/awaymission/caves/research
name = "Research Outpost"
icon_state = "awaycontent5"
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
/area/awaymission/caves/northblock //engineering, bridge (not really north but it doesnt really need its own APC)
/area/awaymission/caves/listeningpost
name = "Listening Post"
icon_state = "awaycontent6"
requires_power = FALSE
//caves papers
/obj/item/paper/crumpled/awaymissions/caves/unsafe_area
@@ -1,29 +1,63 @@
//centcomAway items
//centcomAway areas
/area/awaymission/centcomAway
name = "XCC-P5831"
icon_state = "away"
requires_power = FALSE
/area/awaymission/centcomAway/general
name = "XCC-P5831"
music = 'sound/ambience/ambigen3.ogg'
/area/awaymission/centcomAway/maint
name = "XCC-P5831 Maintenance"
icon_state = "away1"
music = 'sound/ambience/ambisin1.ogg'
/area/awaymission/centcomAway/thunderdome
name = "XCC-P5831 Thunderdome"
icon_state = "away2"
music = 'sound/ambience/ambisin2.ogg'
/area/awaymission/centcomAway/cafe
name = "XCC-P5831 Kitchen Arena"
icon_state = "away3"
music = 'sound/ambience/ambisin3.ogg'
/area/awaymission/centcomAway/courtroom
name = "XCC-P5831 Courtroom"
icon_state = "away4"
music = 'sound/ambience/ambisin4.ogg'
/area/awaymission/centcomAway/hangar
name = "XCC-P5831 Hangars"
icon_state = "away4"
music = 'sound/ambience/ambigen5.ogg'
//centcomAway items
/obj/item/paper/pamphlet/centcom/visitor_info
name = "Visitor Info Pamphlet"
info = "<b> XCC-P5831 Visitor Information </b><br>\
Greetings, visitor, to XCC-P5831! As you may know, this outpost was once \
used as Nanotrasen's CENTRAL COMMAND STATION, organizing and coordinating company \
projects across the vastness of space. <br>\
Since the completion of the much more efficient CC-A5831 on March 8, 2553, XCC-P5831 no longer \
acts as NT's base of operations but still plays a very important role its corporate affairs; \
serving as a supply and repair depot, as well as being host to its most important legal proceedings\
and the thrilling pay-per-view broadcasts of <i>PLASTEEL CHEF</i> and <i>THUNDERDOME LIVE</i>.<br> \
We hope you enjoy your stay!"
name = "Visitor Info Pamphlet"
info = "<b> XCC-P5831 Visitor Information </b><br>\
Greetings, visitor, to XCC-P5831! As you may know, this outpost was once \
used as Nanotrasen's CENTRAL COMMAND STATION, organizing and coordinating company \
projects across the vastness of space. <br>\
Since the completion of the much more efficient CC-A5831 on March 8, 2553, XCC-P5831 no longer \
acts as NT's base of operations but still plays a very important role its corporate affairs; \
serving as a supply and repair depot, as well as being host to its most important legal proceedings\
and the thrilling pay-per-view broadcasts of <i>PLASTEEL CHEF</i> and <i>THUNDERDOME LIVE</i>.<br> \
We hope you enjoy your stay!"
/obj/item/paper/fluff/awaymissions/centcom/gateway_memo
name = "Memo to XCC-P5831 QM"
info = "<b>From: XCC-P5831 Management Office</b><br>\
<b>To: Rolf Ingram, XCC-P5831 Quartermaster</b><br>\
Hey, Rolf, once you pack that gateway into the ferry hangar, <i>make absolutely sure</i> \
to deactivate it! As you may know, SS13 has recently got its network up and running, \
which means that until we get this gate shipped off to the next colonization staging \
area, they'll be able to hop straight in here if its hooked up on our end.<br>\
Obviously, that's something I'd very much rather avoid. Our forensics and medical \
teams never did figure out what happened that last time... and I can't wrap my head \
around it myself. Why would a shuttle full of evacuees all snap and beat each other \
to death the moment they reached safety?<br>\
- D. Cereza"
name = "Memo to XCC-P5831 QM"
info = "<b>From: XCC-P5831 Management Office</b><br>\
<b>To: Rolf Ingram, XCC-P5831 Quartermaster</b><br>\
Hey, Rolf, once you pack that gateway into the ferry hangar, <i>make absolutely sure</i> \
to deactivate it! As you may know, SS13 has recently got its network up and running, \
which means that until we get this gate shipped off to the next colonization staging \
area, they'll be able to hop straight in here if its hooked up on our end.<br>\
Obviously, that's something I'd very much rather avoid. Our forensics and medical \
teams never did figure out what happened that last time... and I can't wrap my head \
around it myself. Why would a shuttle full of evacuees all snap and beat each other \
to death the moment they reached safety?<br>\
- D. Cereza"
@@ -1,3 +1,19 @@
//Challenge Areas
/area/awaymission/challenge/start
name = "Where Am I?"
icon_state = "away"
/area/awaymission/challenge/main
name = "Danger Room"
icon_state = "away1"
requires_power = FALSE
/area/awaymission/challenge/end
name = "Administration"
icon_state = "away2"
requires_power = FALSE
/obj/machinery/power/emitter/energycannon
name = "Energy Cannon"
@@ -1,4 +1,43 @@
/////////// moonoutpost19 papers
// moonoutpost19
//Areas
/area/awaymission/moonoutpost19
name = "space"
icon_state = "awaycontent1"
/area/awaymission/moonoutpost19/arrivals
name = "MO19 Arrivals"
icon_state = "awaycontent2"
/area/awaymission/moonoutpost19/research
name = "MO19 Research"
icon_state = "awaycontent3"
/area/awaymission/moonoutpost19/syndicate
name = "Syndicate Outpost"
icon_state = "awaycontent4"
/area/awaymission/moonoutpost19/main
name = "Khonsu 19"
always_unpowered = TRUE
power_environ = FALSE
power_equip = FALSE
power_light = FALSE
poweralm = FALSE
ambientsounds = list('sound/ambience/ambimine.ogg')
icon_state = "awaycontent5"
/area/awaymission/moonoutpost19/hive
name = "The Hive"
always_unpowered = FALSE
has_gravity = FALSE
power_environ = FALSE
power_equip = FALSE
power_light = FALSE
poweralm = FALSE
icon_state = "awaycontent6"
//Papers
/obj/item/paper/crumpled/awaymissions/moonoutpost19/hastey_note
name = "Hastily Written Note"
@@ -1,3 +1,67 @@
//Research Base Areas//--
/area/awaymission/research
name = "Research Outpost"
icon_state = "away"
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
/area/awaymission/research/interior
name = "Research Inside"
requires_power = TRUE
icon_state = "away2"
/area/awaymission/research/interior/cryo
name = "Research Cryostasis Room"
icon_state = "medbay"
/area/awaymission/research/interior/clonestorage
name = "Research Clone Storage"
icon_state = "cloning"
/area/awaymission/research/interior/genetics
name = "Research Genetics Research"
icon_state = "genetics"
/area/awaymission/research/interior/engineering
name = "Research Engineering"
icon_state = "engine"
/area/awaymission/research/interior/security
name = "Research Security"
icon_state = "security"
/area/awaymission/research/interior/secure
name = "Research Secure Vault"
/area/awaymission/research/interior/maint
name = "Research Maintenance"
icon_state = "maintcentral"
/area/awaymission/research/interior/dorm
name = "Research Dorms"
icon_state = "Sleep"
/area/awaymission/research/interior/escapepods
name = "Research Escape Wing"
icon_state = "exit"
/area/awaymission/research/interior/gateway
name = "Research Gateway"
icon_state = "start"
/area/awaymission/research/interior/bathroom
name = "Research Bathrooms"
icon_state = "restrooms"
/area/awaymission/research/interior/medbay
name = "Research Medbay"
icon_state = "medbay"
/area/awaymission/research/exterior
name = "Research Exterior"
icon_state = "unknown"
//research papers
/obj/item/paper/crumpled/awaymissions/research/sensitive_info
@@ -1,3 +1,40 @@
//Snow Valley Areas//--
/area/awaymission/snowdin
name = "Snowdin Tundra Plains"
icon_state = "awaycontent1"
requires_power = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
/area/awaymission/snowdin/post
name = "Snowdin Outpost"
requires_power = TRUE
icon_state = "awaycontent2"
/area/awaymission/snowdin/igloo
name = "Snowdin Igloos"
icon_state = "awaycontent3"
/area/awaymission/snowdin/cave
name = "Snowdin Caves"
icon_state = "awaycontent4"
/area/awaymission/snowdin/base
name = "Snowdin Main Base"
icon_state = "awaycontent5"
requires_power = TRUE
/area/awaymission/snowdin/dungeon1
name = "Snowdin Depths"
icon_state = "awaycontent6"
/area/awaymission/snowdin/sekret
name = "Snowdin Operations"
icon_state = "awaycontent7"
requires_power = TRUE
/////////// papers
/obj/item/paper/crumpled/ruins/snowdin/snowdingatewaynotice
@@ -0,0 +1,42 @@
//Spacebattle Areas
/area/awaymission/spacebattle
name = "Space Battle"
icon_state = "awaycontent1"
requires_power = FALSE
/area/awaymission/spacebattle/cruiser
name = "Nanotrasen Cruiser"
icon_state = "awaycontent2"
/area/awaymission/spacebattle/syndicate1
name = "Syndicate Assault Ship 1"
icon_state = "awaycontent3"
/area/awaymission/spacebattle/syndicate2
name = "Syndicate Assault Ship 2"
icon_state = "awaycontent4"
/area/awaymission/spacebattle/syndicate3
name = "Syndicate Assault Ship 3"
icon_state = "awaycontent5"
/area/awaymission/spacebattle/syndicate4
name = "Syndicate War Sphere 1"
icon_state = "awaycontent6"
/area/awaymission/spacebattle/syndicate5
name = "Syndicate War Sphere 2"
icon_state = "awaycontent7"
/area/awaymission/spacebattle/syndicate6
name = "Syndicate War Sphere 3"
icon_state = "awaycontent8"
/area/awaymission/spacebattle/syndicate7
name = "Syndicate Fighter"
icon_state = "awaycontent9"
/area/awaymission/spacebattle/secret
name = "Hidden Chamber"
icon_state = "awaycontent10"
@@ -0,0 +1,39 @@
// undergroundoutpost45
//Areas
/area/awaymission/undergroundoutpost45
name = "space"
icon_state = "awaycontent1"
/area/awaymission/undergroundoutpost45/central
name = "UO45 Central Hall"
icon_state = "awaycontent2"
/area/awaymission/undergroundoutpost45/crew_quarters
name = "UO45 Crew Quarters"
icon_state = "awaycontent3"
/area/awaymission/undergroundoutpost45/engineering
name = "UO45 Engineering"
icon_state = "awaycontent4"
/area/awaymission/undergroundoutpost45/mining
name = "UO45 Mining"
icon_state = "awaycontent5"
/area/awaymission/undergroundoutpost45/research
name = "UO45 Research"
icon_state = "awaycontent6"
/area/awaymission/undergroundoutpost45/gateway
name = "UO45 Gateway"
icon_state = "awaycontent7"
/area/awaymission/undergroundoutpost45/caves
name = "UO45 Caves"
icon_state = "awaycontent8"
always_unpowered = TRUE
power_environ = FALSE
power_equip = FALSE
power_light = FALSE
poweralm = FALSE
@@ -4,6 +4,33 @@
* Meat Grinder
*/
//Areas
/area/awaymission/wildwest/mines
name = "Wild West Mines"
icon_state = "away1"
requires_power = FALSE
/area/awaymission/wildwest/gov
name = "Wild West Mansion"
icon_state = "away2"
requires_power = FALSE
/area/awaymission/wildwest/refine
name = "Wild West Refinery"
icon_state = "away3"
requires_power = FALSE
/area/awaymission/wildwest/vault
name = "Wild West Vault"
icon_state = "away3"
/area/awaymission/wildwest/vaultdoors
name = "Wild West Vault Doors" // this is to keep the vault area being entirely lit because of requires_power
icon_state = "away2"
requires_power = FALSE
////////// wildwest papers
/obj/item/paper/fluff/awaymissions/wildwest/grinder
+2 -1
View File
@@ -51,7 +51,8 @@
/obj/item/clothing/head/helmet/space/hardsuit/rad_act(severity)
..()
display_visor_message("Radiation pulse detected! Magnitude: <span class='green'>[severity]</span> RADs.")
if(severity > RAD_AMOUNT_EXTREME)
display_visor_message("Radiation pulse detected! Magnitude: <span class='green'>[severity]</span> RADs.")
/obj/item/clothing/head/helmet/space/hardsuit/emp_act(severity)
..()
+10
View File
@@ -116,6 +116,10 @@
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
resistance_flags = 0
/obj/item/clothing/head/radiation/ComponentInitialize()
. = ..()
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION, TRUE, FALSE)
/obj/item/clothing/suit/radiation
name = "radiation suit"
desc = "A suit that protects against radiation. The label reads, 'Made with lead. Please do not consume insulation.'"
@@ -133,3 +137,9 @@
equip_delay_other = 60
flags_inv = HIDEJUMPSUIT
resistance_flags = 0
/obj/item/clothing/suit/radiation/ComponentInitialize()
. = ..()
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION, TRUE, FALSE)
// Just don't want things to be irradiated inside this
// Except things on the mob aren't even inside the suit so ehhhhhh
+2
View File
@@ -23,6 +23,8 @@
if (l_color != NONSENSICAL_VALUE)
light_color = l_color
SendSignal(COMSIG_ATOM_SET_LIGHT, l_range, l_power, l_color)
update_light()
#undef NONSENSICAL_VALUE
+106 -108
View File
@@ -1,108 +1,106 @@
/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins)
if(!z_levels || !z_levels.len)
WARNING("No Z levels provided - Not generating ruins")
return
for(var/zl in z_levels)
var/turf/T = locate(1, 1, zl)
if(!T)
WARNING("Z level [zl] does not exist - Not generating ruins")
return
var/overall_sanity = 100
var/list/ruins = potentialRuins.Copy()
var/is_picking = FALSE
var/last_checked_ruin_index = 0
while(budget > 0 && overall_sanity > 0)
// Pick a ruin
var/datum/map_template/ruin/ruin = null
if(ruins && ruins.len)
last_checked_ruin_index++ //ruins with no cost come first in the ruin list, so they'll get picked really often
if(is_picking)
ruin = ruins[pick(ruins)]
else
var/ruin_key = ruins[last_checked_ruin_index] //get the ruin's key via index
ruin = ruins[ruin_key] //use that key to get the ruin datum itself
if(ruin.cost >= 0) //if it has a non-negative cost, cancel out and pick another, to ensure true randomness
is_picking = TRUE
ruin = ruins[pick(ruins)]
else
log_world("Ruin loader had no ruins to pick from with [budget] left to spend.")
break
// Can we afford it
if(ruin.cost > budget)
overall_sanity--
continue
// If so, try to place it
var/sanity = 100
// And if we can't fit it anywhere, give up, try again
while(sanity > 0)
sanity--
var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(ruin.width / 2)
var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(ruin.height / 2)
var/z_level = pick(z_levels)
var/turf/T = locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z_level)
var/valid = TRUE
for(var/turf/check in ruin.get_affected_turfs(T,1))
var/area/new_area = get_area(check)
if(!(istype(new_area, whitelist)))
valid = FALSE
break
if(!valid)
continue
log_world("Ruin \"[ruin.name]\" placed at ([T.x], [T.y], [T.z])")
var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T)
R.Load(ruins,ruin)
if(ruin.cost >= 0)
budget -= ruin.cost
if(!ruin.allow_duplicates)
for(var/m in ruins)
var/datum/map_template/ruin/ruin_to_remove = ruins[m]
if(ruin_to_remove.id == ruin.id) //remove all ruins with the same ID, to make sure that ruins with multiple variants work properly
ruins -= ruin_to_remove.name
last_checked_ruin_index--
break
if(!overall_sanity)
log_world("Ruin loader gave up with [budget] left to spend.")
/obj/effect/ruin_loader
name = "random ruin"
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "syndballoon"
invisibility = 0
/obj/effect/ruin_loader/proc/Load(list/potentialRuins, datum/map_template/template)
var/list/possible_ruins = list()
for(var/A in potentialRuins)
var/datum/map_template/T = potentialRuins[A]
if(!T.loaded)
possible_ruins += T
if(!template && possible_ruins.len)
template = safepick(possible_ruins)
if(!template)
return FALSE
var/turf/central_turf = get_turf(src)
for(var/i in template.get_affected_turfs(central_turf, 1))
var/turf/T = i
for(var/mob/living/simple_animal/monster in T)
qdel(monster)
for(var/obj/structure/flora/ash/plant in T)
qdel(plant)
template.load(central_turf,centered = TRUE)
template.loaded++
var/datum/map_template/ruin = template
if(istype(ruin))
new /obj/effect/landmark/ruin(central_turf, ruin)
qdel(src)
return TRUE
/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins)
if(!z_levels || !z_levels.len)
WARNING("No Z levels provided - Not generating ruins")
return
for(var/zl in z_levels)
var/turf/T = locate(1, 1, zl)
if(!T)
WARNING("Z level [zl] does not exist - Not generating ruins")
return
var/overall_sanity = 100
var/list/ruins = potentialRuins.Copy()
var/is_picking = FALSE
var/last_checked_ruin_index = 0
while(budget > 0 && overall_sanity > 0)
// Pick a ruin
var/datum/map_template/ruin/ruin = null
if(ruins && ruins.len)
last_checked_ruin_index++ //ruins with no cost come first in the ruin list, so they'll get picked really often
if(is_picking)
ruin = ruins[pick(ruins)]
else
var/ruin_key = ruins[last_checked_ruin_index] //get the ruin's key via index
ruin = ruins[ruin_key] //use that key to get the ruin datum itself
if(ruin.cost >= 0) //if it has a non-negative cost, cancel out and pick another, to ensure true randomness
is_picking = TRUE
ruin = ruins[pick(ruins)]
else
log_world("Ruin loader had no ruins to pick from with [budget] left to spend.")
break
// Can we afford it
if(ruin.cost > budget)
overall_sanity--
continue
// If so, try to place it
var/sanity = 100
// And if we can't fit it anywhere, give up, try again
while(sanity > 0)
sanity--
var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(ruin.width / 2)
var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(ruin.height / 2)
var/z_level = pick(z_levels)
var/turf/T = locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z_level)
var/valid = TRUE
for(var/turf/check in ruin.get_affected_turfs(T,1))
var/area/new_area = get_area(check)
if(!(istype(new_area, whitelist)) || check.flags_1 & NO_RUINS_1)
valid = FALSE
break
if(!valid)
continue
log_world("Ruin \"[ruin.name]\" placed at ([T.x], [T.y], [T.z])")
var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T)
R.Load(ruins,ruin)
if(ruin.cost >= 0)
budget -= ruin.cost
if(!ruin.allow_duplicates)
for(var/m in ruins)
var/datum/map_template/ruin/ruin_to_remove = ruins[m]
if(ruin_to_remove.id == ruin.id) //remove all ruins with the same ID, to make sure that ruins with multiple variants work properly
ruins -= ruin_to_remove.name
last_checked_ruin_index--
break
if(!overall_sanity)
log_world("Ruin loader gave up with [budget] left to spend.")
/obj/effect/ruin_loader
name = "random ruin"
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "syndballoon"
invisibility = 0
/obj/effect/ruin_loader/proc/Load(list/potentialRuins, datum/map_template/template)
var/list/possible_ruins = list()
for(var/A in potentialRuins)
var/datum/map_template/T = potentialRuins[A]
if(!T.loaded)
possible_ruins += T
if(!template && possible_ruins.len)
template = safepick(possible_ruins)
if(!template)
return FALSE
var/turf/central_turf = get_turf(src)
for(var/i in template.get_affected_turfs(central_turf, 1))
var/turf/T = i
for(var/mob/living/simple_animal/monster in T)
qdel(monster)
for(var/obj/structure/flora/ash/plant in T)
qdel(plant)
template.load(central_turf,centered = TRUE)
template.loaded++
var/datum/map_template/ruin = template
if(istype(ruin))
new /obj/effect/landmark/ruin(central_turf, ruin)
qdel(src)
return TRUE
@@ -24,6 +24,9 @@
loc = pick(GLOB.newplayer_start)
else
loc = locate(1,1,1)
ComponentInitialize()
. = ..()
/mob/dead/new_player/prepare_huds()
@@ -710,7 +710,7 @@
var/static/mutable_appearance/electrocution_skeleton_anim
if(!electrocution_skeleton_anim)
electrocution_skeleton_anim = mutable_appearance(icon, "electrocuted_base")
electrocution_skeleton_anim.appearance_flags |= RESET_COLOR
electrocution_skeleton_anim.appearance_flags |= RESET_COLOR|KEEP_APART
add_overlay(electrocution_skeleton_anim)
addtimer(CALLBACK(src, .proc/end_electrocution_animation, electrocution_skeleton_anim), anim_duration)
@@ -265,7 +265,6 @@
//delete all equipment without dropping anything
/mob/living/carbon/human/proc/delete_equipment()
for(var/slot in get_all_slots())//order matters, dependant slots go first
var/obj/item/I = get_item_by_slot(slot)
qdel(I)
qdel(slot)
for(var/obj/item/I in held_items)
qdel(I)
qdel(I)
+22 -27
View File
@@ -1135,36 +1135,31 @@
return 0
/datum/species/proc/handle_mutations_and_radiation(mob/living/carbon/human/H)
. = FALSE
var/radiation = H.radiation
if(!(RADIMMUNE in species_traits))
if(H.radiation)
if (H.radiation > 100)
if(!H.IsKnockdown())
H.emote("collapse")
H.Knockdown(200)
to_chat(H, "<span class='danger'>You feel weak.</span>")
switch(H.radiation)
if(50 to 75)
if(prob(5))
if(!H.IsKnockdown())
H.emote("collapse")
H.Knockdown(60)
to_chat(H, "<span class='danger'>You feel weak.</span>")
if(RADIMMUNE in species_traits)
radiation = 0
return TRUE
if(prob(15))
if(!( H.hair_style == "Shaved") || !(H.hair_style == "Bald") || (HAIR in species_traits))
to_chat(H, "<span class='danger'>Your hair starts to fall out in clumps...</span>")
addtimer(CALLBACK(src, .proc/go_bald, H), 50)
if(radiation > RAD_MOB_KNOCKDOWN)
if(!H.IsKnockdown())
H.emote("collapse")
H.Knockdown(RAD_KNOCKDOWN_TIME)
to_chat(H, "<span class='danger'>You feel weak.</span>")
if(radiation > RAD_MOB_MUTATE)
if(prob(1))
to_chat(H, "<span class='danger'>You mutate!</span>")
H.randmutb()
H.emote("gasp")
H.domutcheck()
if(75 to 100)
if(prob(1))
to_chat(H, "<span class='danger'>You mutate!</span>")
H.randmutb()
H.emote("gasp")
H.domutcheck()
return 0
H.radiation = 0
return 1
if(radiation > RAD_MOB_HAIRLOSS)
if(prob(15))
if(!( H.hair_style == "Shaved") || !(H.hair_style == "Bald") || (HAIR in species_traits))
to_chat(H, "<span class='danger'>Your hair starts to fall out in clumps...</span>")
addtimer(CALLBACK(src, .proc/go_bald, H), 50)
/datum/species/proc/go_bald(mob/living/carbon/human/H)
if(QDELETED(H)) //may be called from a timer
@@ -295,7 +295,7 @@
if(!active)
if(world.time > last_event+30)
active = 1
radiation_pulse(get_turf(H), 3, 3, 5, 0)
radiation_pulse(get_turf(H), 50)
last_event = world.time
active = null
..()
+3 -18
View File
@@ -280,24 +280,9 @@
HM.force_lose(src)
dna.temporary_mutations.Remove(mut)
if(radiation)
radiation = Clamp(radiation, 0, 100)
switch(radiation)
if(0 to 50)
radiation = max(radiation-1,0)
if(prob(25))
adjustToxLoss(1)
if(50 to 75)
radiation = max(radiation-2,0)
adjustToxLoss(1)
if(prob(5))
radiation = max(radiation-5,0)
if(75 to 100)
radiation = max(radiation-3,0)
adjustToxLoss(3)
radiation -= min(radiation, RAD_LOSS_PER_TICK)
if(radiation > RAD_MOB_SAFE)
adjustToxLoss(log(radiation-RAD_MOB_SAFE)*RAD_TOX_COEFFICIENT)
/mob/living/carbon/handle_stomach()
set waitfor = 0
+12 -21
View File
@@ -23,32 +23,23 @@
walk_to(src,0)
/mob/living/carbon/monkey/handle_mutations_and_radiation()
if (radiation)
if (radiation > 100)
if(radiation)
if(radiation > RAD_MOB_KNOCKDOWN)
if(!IsKnockdown())
emote("collapse")
Knockdown(200)
to_chat(src, "<span class='danger'>You feel weak.</span>")
if(radiation > 30 && prob((radiation - 30) * (radiation - 30) * 0.0002))
gorillize()
return
switch(radiation)
if(radiation > RAD_MOB_MUTATE)
if(prob(1))
to_chat(src, "<span class='danger'>You mutate!</span>")
randmutb()
emote("gasp")
domutcheck()
if(50 to 75)
if(prob(5))
if(!IsKnockdown())
emote("collapse")
Knockdown(60)
to_chat(src, "<span class='danger'>You feel weak.</span>")
if(75 to 100)
if(prob(1))
to_chat(src, "<span class='danger'>You mutate!</span>")
randmutb()
emote("gasp")
domutcheck()
..()
if(radiation > RAD_MOB_MUTATE * 2 && prob(50))
gorillize()
return
return ..()
/mob/living/carbon/monkey/handle_breath_temperature(datum/gas_mixture/breath)
if(abs(310.15 - breath.temperature) > 50)
+10
View File
@@ -885,6 +885,16 @@
G.Recall()
to_chat(G, "<span class='holoparasite'>Your summoner has changed form!</span>")
/mob/living/rad_act(amount)
amount = max(amount-RAD_BACKGROUND_RADIATION, 0)
if(amount)
var/blocked = getarmor(null, "rad")
apply_effect(amount * RAD_MOB_COEFFICIENT, IRRADIATE, blocked)
if(amount > RAD_AMOUNT_EXTREME)
apply_damage((amount-RAD_AMOUNT_EXTREME)/RAD_AMOUNT_EXTREME, BURN, null, blocked)
/mob/living/proc/fakefireextinguish()
return
+1 -1
View File
@@ -363,7 +363,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
/obj/machinery/gravity_generator/main/proc/pulse_radiation()
radiation_pulse(get_turf(src), 3, 7, 20)
radiation_pulse(get_turf(src), 200)
// Shake everyone on the z level to let them know that gravity was enagaged/disenagaged.
/obj/machinery/gravity_generator/main/proc/shake_everyone()
+1 -1
View File
@@ -28,7 +28,7 @@
..()
add_avail(power_gen)
if(panel_open && irradiate)
radiation_pulse(get_turf(src), 2, 3, 6) // Weak but noticeable.
radiation_pulse(get_turf(src), 60)
/obj/machinery/power/rtg/RefreshParts()
var/part_level = 0
+16 -15
View File
@@ -1,5 +1,7 @@
GLOBAL_LIST_EMPTY(rad_collectors)
// last_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT
#define RAD_COLLECTOR_EFFICIENCY 80 // radiation needs to be over this amount to get power
#define RAD_COLLECTOR_COEFFICIENT 100
#define RAD_COLLECTOR_STORED_OUT 0.04 // (this*100)% of stored power outputted per tick. Doesn't actualy change output total, lower numbers just means collectors output for longer in absence of a source
/obj/machinery/power/rad_collector
name = "Radiation Collector Array"
@@ -21,12 +23,11 @@ GLOBAL_LIST_EMPTY(rad_collectors)
/obj/machinery/power/rad_collector/anchored
anchored = TRUE
/obj/machinery/power/rad_collector/Initialize()
/obj/machinery/power/rad_collector/ComponentInitialize()
. = ..()
GLOB.rad_collectors += src
AddComponent(/datum/component/rad_insulation, RAD_EXTREME_INSULATION, FALSE, FALSE)
/obj/machinery/power/rad_collector/Destroy()
GLOB.rad_collectors -= src
return ..()
/obj/machinery/power/rad_collector/process()
@@ -37,8 +38,10 @@ GLOBAL_LIST_EMPTY(rad_collectors)
else
loaded_tank.air_contents.gases[/datum/gas/plasma][MOLES] -= 0.001*drainratio
loaded_tank.air_contents.garbage_collect()
return
var/power_produced = min(last_power, (last_power*RAD_COLLECTOR_STORED_OUT)+1000) //Produces at least 1000 watts if it has more than that stored
add_avail(power_produced)
last_power-=power_produced
/obj/machinery/power/rad_collector/attack_hand(mob/user)
if(..())
@@ -137,15 +140,9 @@ GLOBAL_LIST_EMPTY(rad_collectors)
else
update_icons()
/obj/machinery/power/rad_collector/proc/receive_pulse(pulse_strength)
if(loaded_tank && active)
var/power_produced = loaded_tank.air_contents.gases[/datum/gas/plasma] ? loaded_tank.air_contents.gases[/datum/gas/plasma][MOLES] : 0
power_produced *= pulse_strength*10
add_avail(power_produced)
last_power = power_produced
return
return
/obj/machinery/power/rad_collector/rad_act(pulse_strength)
if(loaded_tank && active && pulse_strength > RAD_COLLECTOR_EFFICIENCY)
last_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT
/obj/machinery/power/rad_collector/proc/update_icons()
cut_overlays()
@@ -167,3 +164,7 @@ GLOBAL_LIST_EMPTY(rad_collectors)
flick("ca_deactive", src)
update_icons()
return
#undef RAD_COLLECTOR_EFFICIENCY
#undef RAD_COLLECTOR_COEFFICIENT
#undef RAD_COLLECTOR_STORED_OUT
+2 -12
View File
@@ -114,7 +114,7 @@
/obj/singularity/process()
if(current_size >= STAGE_TWO)
move()
pulse()
radiation_pulse(get_turf(src), energy, 0.5)
if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit
event()
eat()
@@ -385,14 +385,10 @@
/obj/singularity/proc/toxmob()
var/toxrange = 10
var/radiation = 15
var/radiationmin = 3
if (energy>200)
radiation += round((energy-150)/10,1)
radiationmin = round((radiation/5),1)
for(var/mob/living/M in view(toxrange, src.loc))
M.rad_act(rand(radiationmin,radiation))
radiation_pulse(get_turf(src), radiation)
/obj/singularity/proc/combust_mobs()
@@ -428,12 +424,6 @@
empulse(src, 8, 10)
return
/obj/singularity/proc/pulse()
for(var/obj/machinery/power/rad_collector/R in GLOB.rad_collectors)
if(R.z == z && get_dist(R, src) <= 15) // Better than using orange() every process
R.receive_pulse(energy)
/obj/singularity/singularity_act()
var/gain = (energy/2)
var/dist = max((current_size - 2),1)
@@ -331,8 +331,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
power = max( (removed.temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0) //Total laser power plus an overload
//We've generated power, now let's transfer it to the collectors for storing/usage
transfer_energy()
if(prob(50))
radiation_pulse(get_turf(src), power * (1 + power_transmission_bonus/10 * freon_transmit_modifier))
var/device_energy = power * REACTION_POWER_MODIFIER
@@ -527,11 +527,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
Consume(nom)
/obj/machinery/power/supermatter_shard/proc/transfer_energy()
for(var/obj/machinery/power/rad_collector/R in GLOB.rad_collectors)
if(R.z == z && get_dist(R, src) <= 15) //Better than using orange() every process
R.receive_pulse(power * (1 + power_transmission_bonus)/10 * freon_transmit_modifier)
/obj/machinery/power/supermatter_shard/attackby(obj/item/W, mob/living/user, params)
if(!istype(W) || (W.flags_1 & ABSTRACT_1) || !istype(user))
return
@@ -550,7 +545,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
Consume(W)
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
radiation_pulse(get_turf(src), 1, 1, 150, 1)
radiation_pulse(get_turf(src), 150, 4)
/obj/machinery/power/supermatter_shard/CollidedWith(atom/movable/AM)
@@ -584,7 +579,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
matter_power += 200
//Some poor sod got eaten, go ahead and irradiate people nearby.
radiation_pulse(get_turf(src), 4, 10, 500, 1)
radiation_pulse(get_turf(src), 3000, 2, TRUE)
for(var/mob/living/L in range(10))
investigate_log("has irradiated [L] after consuming [AM].", INVESTIGATE_SUPERMATTER)
if(L in view())
@@ -454,7 +454,7 @@
/datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/M)
if(M.radiation > 0)
M.radiation--
M.radiation-=2
..()
/datum/reagent/medicine/pen_acid
@@ -466,11 +466,8 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
/datum/reagent/medicine/pen_acid/on_mob_life(mob/living/M)
if(M.radiation > 0)
M.radiation -= 4
M.radiation -= min(M.radiation, 8)
M.adjustToxLoss(-2*REM, 0)
if(M.radiation < 0)
M.radiation = 0
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
M.reagents.remove_reagent(R.id,2)
@@ -15,6 +15,10 @@
var/tomail = 0 //changes if contains wrapped package
var/hasmob = 0 //If it contains a mob
/obj/structure/disposalholder/ComponentInitialize()
. = ..()
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION)
/obj/structure/disposalholder/Destroy()
qdel(gas)
active = 0
@@ -176,6 +180,9 @@
if("pipe-j2s")
stored.ptype = DISP_SORTJUNCTION_FLIP
/obj/structure/disposalpipe/ComponentInitialize()
. = ..()
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION)
// pipe is deleted
// ensure if holder is present, it is expelled
@@ -639,6 +646,7 @@
/obj/structure/disposaloutlet/Initialize(mapload, obj/structure/disposalconstruct/make_from)
. = ..()
if(make_from)
setDir(make_from.dir)
make_from.loc = src
@@ -652,6 +660,10 @@
if(trunk)
trunk.linked = src // link the pipe trunk to self
/obj/structure/disposaloutlet/ComponentInitialize()
. = ..()
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION)
/obj/structure/disposaloutlet/Destroy()
if(trunk)
trunk.linked = null
+7 -4
View File
@@ -27,6 +27,7 @@
/obj/machinery/disposal/Initialize(mapload, obj/structure/disposalconstruct/make_from)
. = ..()
if(make_from)
setDir(make_from.dir)
make_from.loc = 0
@@ -40,6 +41,12 @@
//gas.volume = 1.05 * CELLSTANDARD
update_icon()
return INITIALIZE_HINT_LATELOAD //we need turfs to have air
/obj/machinery/disposal/ComponentInitialize()
. = ..()
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION)
/obj/machinery/disposal/proc/trunk_check()
trunk = locate() in loc
if(!trunk)
@@ -62,10 +69,6 @@
if(current_size >= STAGE_FIVE)
deconstruct()
/obj/machinery/disposal/Initialize(mapload)
..()
return INITIALIZE_HINT_LATELOAD //we need turfs to have air
/obj/machinery/disposal/LateInitialize()
//this will get a copy of the air turf and take a SEND PRESSURE amount of air from it
var/atom/L = loc
+1 -1
View File
@@ -255,7 +255,7 @@
ejectItem()
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("<span class='danger'>[src] malfunctions, melting [exp_on] and leaking radiation!</span>")
radiation_pulse(get_turf(src), 1, 1, 25, 1)
radiation_pulse(get_turf(src), 50)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("<span class='warning'>[src] malfunctions, spewing toxic waste!</span>")
@@ -1,4 +1,29 @@
/////////// crashedship items
// crashedship / packer ship
//Areas
/area/awaymission/BMPship
name = "BMP Asteroids"
icon_state = "away"
/area/awaymission/BMPship/Aft
name = "Aft Block"
icon_state = "away1"
requires_power = TRUE
/area/awaymission/BMPship/Midship
name = "Midship Block"
icon_state = "away2"
requires_power = TRUE
/area/awaymission/BMPship/Fore
name = "Fore Block"
icon_state = "away3"
requires_power = TRUE
// crashedship items
/obj/item/paper/fluff/ruins/crashedship/scribbled
name = "scribbled note"
@@ -1,5 +1,9 @@
/////////// listening station
/area/ruin/space/has_grav/powered/listeningstation
name = "Listening Post"
icon_state = "away"
/obj/item/paper/fluff/ruins/listeningstation/reports
info = "Nothing of interest to report."
+5 -1
View File
@@ -192,7 +192,7 @@
var/last_dock_time
/obj/docking_port/stationary/Initialize()
/obj/docking_port/stationary/Initialize(mapload)
. = ..()
SSshuttle.stationary += src
if(!id)
@@ -201,6 +201,10 @@
name = "dock[SSshuttle.stationary.len]"
baseturf_cache = typecacheof(baseturf_type)
if(mapload)
for(var/turf/T in return_turfs())
T.flags_1 |= NO_RUINS_1
#ifdef DOCKING_PORT_HIGHLIGHT
highlight("#f00")
#endif