Merge branch 'master' into upstream-merge-33660
This commit is contained in:
@@ -32,6 +32,7 @@
|
||||
#define STASIS_MUTE "stasis"
|
||||
#define GENETICS_SPELL "genetics_spell"
|
||||
#define TRAUMA_DISABILITY "trauma"
|
||||
#define CHEMICAL_DISABILITY "chemical"
|
||||
|
||||
// bitflags for machine stat variable
|
||||
#define BROKEN 1
|
||||
|
||||
@@ -64,6 +64,8 @@
|
||||
|
||||
#define STATUS_EFFECT_KINDLE /datum/status_effect/kindle //A knockdown reduced by 1 second for every 3 points of damage the target takes.
|
||||
|
||||
#define STATUS_EFFECT_ICHORIAL_STAIN /datum/status_effect/ichorial_stain //Prevents a servant from being revived by vitality matrices for one minute.
|
||||
|
||||
/////////////
|
||||
// NEUTRAL //
|
||||
/////////////
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
#define CHANGETURF_DEFER_CHANGE 1
|
||||
#define CHANGETURF_IGNORE_AIR 2
|
||||
#define CHANGETURF_FORCEOP 4
|
||||
@@ -434,7 +434,10 @@
|
||||
|
||||
|
||||
/proc/printplayer(datum/mind/ply, fleecheck)
|
||||
var/text = "<b>[ply.key]</b> was <b>[ply.name]</b> the <b>[ply.assigned_role]</b> and"
|
||||
var/jobtext = ""
|
||||
if(ply.assigned_role)
|
||||
jobtext = " the <b>[ply.assigned_role]</b>"
|
||||
var/text = "<b>[ply.key]</b> was <b>[ply.name]</b>[jobtext] and"
|
||||
if(ply.current)
|
||||
if(ply.current.stat == DEAD)
|
||||
text += " <span class='redtext'>died</span>"
|
||||
|
||||
@@ -58,9 +58,11 @@
|
||||
SendSignal(COMSIG_ITEM_ATTACK, M, user)
|
||||
if(flags_1 & NOBLUDGEON_1)
|
||||
return
|
||||
|
||||
if(user.has_disability(DISABILITY_PACIFISM))
|
||||
|
||||
if(force && user.has_disability(DISABILITY_PACIFISM))
|
||||
to_chat(user, "<span class='warning'>You don't want to harm other living beings!</span>")
|
||||
return
|
||||
|
||||
if(!force)
|
||||
playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), 1, -1)
|
||||
else if(hitsound)
|
||||
|
||||
@@ -10,6 +10,14 @@
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
flags_1 = NOBLUDGEON_1
|
||||
|
||||
/obj/item/soap/cebu //real versions, for admin shenanigans. Adminspawn only
|
||||
desc = "A bright blue bar of soap that smells of wolves"
|
||||
icon = 'icons/obj/custom.dmi'
|
||||
icon_state = "cebu"
|
||||
|
||||
/obj/item/soap/cebu/fast //speedyquick cleaning version. Still not as fast as Syndiesoap. Adminspawn only.
|
||||
cleanspeed = 15
|
||||
|
||||
|
||||
/*Inferno707*/
|
||||
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
var/datum/disease/D = new /datum/disease/transformation/jungle_fever/monkeymode
|
||||
if(!owner.current.HasDisease(D))
|
||||
D.affected_mob = owner
|
||||
owner.current.viruses += D
|
||||
owner.current.AddDisease(D)
|
||||
else
|
||||
QDEL_NULL(D)
|
||||
|
||||
|
||||
@@ -205,13 +205,13 @@
|
||||
new_comp = new nt(arglist(args))
|
||||
if(!QDELETED(new_comp))
|
||||
old_comp.InheritComponent(new_comp, TRUE)
|
||||
qdel(new_comp)
|
||||
QDEL_NULL(new_comp)
|
||||
if(COMPONENT_DUPE_HIGHLANDER)
|
||||
if(!new_comp)
|
||||
new_comp = new nt(arglist(args))
|
||||
if(!QDELETED(new_comp))
|
||||
new_comp.InheritComponent(old_comp, FALSE)
|
||||
qdel(old_comp)
|
||||
QDEL_NULL(old_comp)
|
||||
if(COMPONENT_DUPE_UNIQUE_PASSARGS)
|
||||
if(!new_comp)
|
||||
var/list/arguments = args.Copy(2)
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
if(amount >= 50)
|
||||
var/burning_time = max(100, 100-amount)
|
||||
master = master.ChangeTurf(master.baseturf)
|
||||
master = master.ScrapeAway()
|
||||
master.burn_tile()
|
||||
if(user)
|
||||
master.add_hiddenprint(user)
|
||||
|
||||
@@ -55,6 +55,8 @@ GLOBAL_LIST_EMPTY(explosions)
|
||||
var/orig_heavy_range = heavy_impact_range
|
||||
var/orig_light_range = light_impact_range
|
||||
|
||||
var/orig_max_distance = max(devastation_range, heavy_impact_range, light_impact_range, flash_range, flame_range)
|
||||
|
||||
//Zlevel specific bomb cap multiplier
|
||||
var/cap_multiplier = 1
|
||||
switch(epicenter.z)
|
||||
@@ -119,11 +121,13 @@ GLOBAL_LIST_EMPTY(explosions)
|
||||
// If inside the blast radius + world.view - 2
|
||||
if(dist <= round(max_range + world.view - 2, 1))
|
||||
M.playsound_local(epicenter, null, 100, 1, frequency, falloff = 5, S = explosion_sound)
|
||||
shake_camera(M, 25, min(orig_max_distance - dist, 100))
|
||||
// You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station.
|
||||
else if(dist <= far_dist)
|
||||
var/far_volume = CLAMP(far_dist, 30, 50) // Volume is based on explosion size and dist
|
||||
far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion
|
||||
M.playsound_local(epicenter, null, far_volume, 1, frequency, falloff = 5, S = far_explosion_sound)
|
||||
shake_camera(M, 10, min(orig_max_distance - dist, 50))
|
||||
EX_PREPROCESS_CHECK_TICK
|
||||
|
||||
//postpone processing for a bit
|
||||
|
||||
@@ -479,3 +479,27 @@
|
||||
desc = "Blinding light dances in your vision, stunning and silencing you. <i>Any damage taken will shorten the light's effects!</i>"
|
||||
icon_state = "kindle"
|
||||
alerttooltipstyle = "clockcult"
|
||||
|
||||
|
||||
//Ichorial Stain: Applied to servants revived by a vitality matrix. Prevents them from being revived by one again until the effect fades.
|
||||
/datum/status_effect/ichorial_stain
|
||||
id = "ichorial_stain"
|
||||
status_type = STATUS_EFFECT_UNIQUE
|
||||
duration = 600
|
||||
examine_text = "<span class='warning'>SUBJECTPRONOUN is drenched in thick, blue ichor!</span>"
|
||||
alert_type = /obj/screen/alert/status_effect/ichorial_stain
|
||||
|
||||
/datum/status_effect/ichorial_stain/on_apply()
|
||||
owner.visible_message("<span class='danger'>[owner] gets back up, [owner.p_their()] body dripping blue ichor!</span>", \
|
||||
"<span class='userdanger'>Thick blue ichor covers your body; you can't be revived like this again until it dries!</span>")
|
||||
return TRUE
|
||||
|
||||
/datum/status_effect/ichorial_stain/on_remove()
|
||||
owner.visible_message("<span class='danger'>The blue ichor on [owner]'s body dries out!</span>", \
|
||||
"<span class='boldnotice'>The ichor on your body is dry - you can now be revived by vitality matrices again!</span>")
|
||||
|
||||
/obj/screen/alert/status_effect/ichorial_stain
|
||||
name = "Ichorial Stain"
|
||||
desc = "Your body is covered in blue ichor! You can't be revived by vitality matrices."
|
||||
icon_state = "ichorial_stain"
|
||||
alerttooltipstyle = "clockcult"
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
var/mob/living/owner //The mob affected by the status effect.
|
||||
var/status_type = STATUS_EFFECT_UNIQUE //How many of the effect can be on one mob, and what happens when you try to add another
|
||||
var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted
|
||||
var/examine_text //If defined, this text will appear when the mob is examined - to use he, she etc. use "SUBJECTPRONOUN" and replace it in the examines themselves
|
||||
var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description
|
||||
var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
|
||||
/obj/effect/proc_holder/changeling/headcrab/sting_action(mob/user)
|
||||
set waitfor = FALSE
|
||||
if(alert("Are we sure we wish to kill ourself and create a headslug?",,"Yes", "No") == "No")
|
||||
return
|
||||
var/datum/mind/M = user.mind
|
||||
var/list/organs = user.getorganszone("head", 1)
|
||||
|
||||
@@ -35,4 +37,4 @@
|
||||
if(crab.origin)
|
||||
crab.origin.active = 1
|
||||
crab.origin.transfer_to(crab)
|
||||
to_chat(crab, "<span class='warning'>You burst out of the remains of your former body in a shower of gore!</span>")
|
||||
to_chat(crab, "<span class='warning'>You burst out of the remains of your former body in a shower of gore!</span>")
|
||||
|
||||
@@ -278,7 +278,7 @@
|
||||
animate(src, alpha = 255, time = 10, flags = ANIMATION_END_NOW) //we may have a previous animation going. finish it first, then do this one without delay.
|
||||
sleep(10)
|
||||
//as long as they're still on the sigil and are either not a servant or they're a servant AND it has remaining vitality
|
||||
while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || GLOB.clockwork_vitality))) && get_turf(L) == get_turf(src))
|
||||
while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || GLOB.clockwork_vitality))) && get_turf(L) == get_turf(src) && !L.buckled)
|
||||
sigil_active = TRUE
|
||||
if(animation_number >= 4)
|
||||
new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src))
|
||||
@@ -313,21 +313,28 @@
|
||||
revival_cost = 0
|
||||
var/mob/dead/observer/ghost = L.get_ghost(TRUE)
|
||||
if(GLOB.clockwork_vitality >= revival_cost && (ghost || (L.mind && L.mind.active)))
|
||||
if(ghost)
|
||||
ghost.reenter_corpse()
|
||||
L.revive(1, 1)
|
||||
var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src))
|
||||
animate(V, alpha = 0, transform = matrix()*2, time = 8)
|
||||
playsound(L, 'sound/magic/staff_healing.ogg', 50, 1)
|
||||
L.visible_message("<span class='warning'>[L] suddenly gets back up, [L.p_their()] body dripping blue ichor!</span>", "<span class='inathneq'>\"[text2ratvar("You will be okay, child.")]\"</span>")
|
||||
GLOB.clockwork_vitality -= revival_cost
|
||||
if(L.has_status_effect(STATUS_EFFECT_ICHORIAL_STAIN))
|
||||
visible_message("<span class='boldwarning'>[src] strains, but nothing happens...</span>")
|
||||
if(L.pulledby)
|
||||
to_chat(L.pulledby, "<span class='userdanger'>[L] was already revived recently by a vitality matrix! Wait a bit longer!</span>")
|
||||
break
|
||||
else
|
||||
if(ghost)
|
||||
ghost.reenter_corpse()
|
||||
L.revive(1, 1)
|
||||
var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src))
|
||||
animate(V, alpha = 0, transform = matrix()*2, time = 8)
|
||||
playsound(L, 'sound/magic/staff_healing.ogg', 50, 1)
|
||||
to_chat(L, "<span class='inathneq'>\"[text2ratvar("You will be okay, child.")]\"</span>")
|
||||
L.apply_status_effect(STATUS_EFFECT_ICHORIAL_STAIN)
|
||||
GLOB.clockwork_vitality -= revival_cost
|
||||
break
|
||||
if(!L.client || L.client.is_afk())
|
||||
set waitfor = FALSE
|
||||
var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a [L.name], an inactive clock cultist?", "[name]", null, "Clock Cultist", 50, L)
|
||||
var/mob/dead/observer/theghost = null
|
||||
if(candidates.len)
|
||||
to_chat(L, "Your physical form has been taken over by another soul due to your inactivity! Ahelp if you wish to regain your form!")
|
||||
to_chat(L, "<span class='userdanger'>Your physical form has been taken over by another soul due to your inactivity! Ahelp if you wish to regain your form!</span>")
|
||||
message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(L)]) to replace an inactive clock cultist.")
|
||||
L.ghostize(0)
|
||||
L.key = theghost.key
|
||||
|
||||
@@ -70,6 +70,12 @@
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Creates a Vitality Matrix, which drains non-Servants on it to heal Servants that cross it."
|
||||
|
||||
/datum/clockwork_scripture/create_object/vitality_matrix/check_special_requirements()
|
||||
if(locate(object_path) in range(1, invoker))
|
||||
to_chat(invoker, "<span class='danger'>Vitality matrices placed next to each other could interfere and cause a feedback loop! Move away from the other ones!</span>")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
|
||||
//Judicial Visor: Creates a judicial visor, which can smite an area.
|
||||
/datum/clockwork_scripture/create_object/judicial_visor
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
name = "pressure sensor"
|
||||
desc = "A thin plate of brass, barely visible but clearly distinct."
|
||||
clockwork_desc = "A trigger that will activate when a non-servant runs across it."
|
||||
max_integrity = 25
|
||||
max_integrity = 5
|
||||
icon_state = "pressure_sensor"
|
||||
alpha = 80
|
||||
layer = LOW_ITEM_LAYER
|
||||
|
||||
@@ -21,9 +21,10 @@
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
if(buckled_mobs && buckled_mobs.len)
|
||||
var/mob/living/L = buckled_mobs[1]
|
||||
L.Knockdown(100)
|
||||
L.visible_message("<span class='warning'>[L] is maimed as the skewer shatters while still in their body!</span>")
|
||||
L.adjustBruteLoss(15)
|
||||
if(iscarbon(L))
|
||||
L.Knockdown(100)
|
||||
L.visible_message("<span class='warning'>[L] is maimed as the skewer shatters while still in their body!</span>")
|
||||
L.adjustBruteLoss(15)
|
||||
unbuckle_mob(L)
|
||||
return ..()
|
||||
|
||||
@@ -48,14 +49,22 @@
|
||||
/obj/structure/destructible/clockwork/trap/brass_skewer/activate()
|
||||
if(density)
|
||||
return
|
||||
var/mob/living/carbon/squirrel = locate() in get_turf(src)
|
||||
var/mob/living/squirrel = locate() in get_turf(src)
|
||||
if(squirrel)
|
||||
squirrel.visible_message("<span class='boldwarning'>A massive brass spike erupts from the ground, impaling [squirrel]!</span>", \
|
||||
"<span class='userdanger'>A massive brass spike rams through your chest, hoisting you into the air!</span>")
|
||||
squirrel.emote("scream")
|
||||
playsound(squirrel, 'sound/effects/splat.ogg', 50, TRUE)
|
||||
playsound(squirrel, 'sound/misc/desceration-03.ogg', 50, TRUE)
|
||||
squirrel.apply_damage(20, BRUTE, "chest")
|
||||
if(iscyborg(squirrel))
|
||||
if(!squirrel.stat)
|
||||
squirrel.visible_message("<span class='boldwarning'>A massive brass spike erupts from the ground, rending [squirrel]'s chassis but shattering into pieces!</span>", \
|
||||
"<span class='userdanger'>A massive brass spike rips through your chassis and bursts into shrapnel in your casing!</span>")
|
||||
squirrel.adjustBruteLoss(50)
|
||||
squirrel.Stun(20)
|
||||
addtimer(CALLBACK(src, .proc/take_damage, max_integrity), 1)
|
||||
else
|
||||
squirrel.visible_message("<span class='boldwarning'>A massive brass spike erupts from the ground, impaling [squirrel]!</span>", \
|
||||
"<span class='userdanger'>A massive brass spike rams through your chest, hoisting you into the air!</span>")
|
||||
squirrel.emote("scream")
|
||||
playsound(squirrel, 'sound/effects/splat.ogg', 50, TRUE)
|
||||
playsound(squirrel, 'sound/misc/desceration-03.ogg', 50, TRUE)
|
||||
squirrel.apply_damage(20, BRUTE, "chest")
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE //So players can interact with the tile it's on to pull them off
|
||||
buckle_mob(squirrel, TRUE)
|
||||
else
|
||||
|
||||
@@ -59,9 +59,9 @@
|
||||
brass_floor = TRUE
|
||||
if(W.use(2 - brass_floor))
|
||||
if(anchored)
|
||||
T.ChangeTurf(/turf/closed/wall/clockwork)
|
||||
T.PlaceOnTop(/turf/closed/wall/clockwork)
|
||||
else
|
||||
T.ChangeTurf(/turf/open/floor/clockwork)
|
||||
T.PlaceOnTop(/turf/open/floor/clockwork)
|
||||
new /obj/structure/falsewall/brass(T)
|
||||
qdel(src)
|
||||
else
|
||||
|
||||
@@ -149,8 +149,6 @@
|
||||
|
||||
if(href_list["make"])
|
||||
|
||||
var/turf/T = loc
|
||||
|
||||
/////////////////
|
||||
//href protection
|
||||
being_built = stored_research.isDesignResearchedID(href_list["make"])
|
||||
@@ -174,34 +172,8 @@
|
||||
use_power(power)
|
||||
icon_state = "autolathe"
|
||||
flick("autolathe_n",src)
|
||||
if(is_stack)
|
||||
spawn(32*coeff)
|
||||
use_power(power)
|
||||
var/list/materials_used = list(MAT_METAL=metal_cost*multiplier, MAT_GLASS=glass_cost*multiplier)
|
||||
materials.use_amount(materials_used)
|
||||
|
||||
var/obj/item/stack/N = new being_built.build_path(T, multiplier)
|
||||
N.update_icon()
|
||||
N.autolathe_crafted(src)
|
||||
|
||||
for(var/obj/item/stack/S in T.contents - N)
|
||||
if(istype(S, N.merge_type))
|
||||
N.merge(S)
|
||||
busy = FALSE
|
||||
updateUsrDialog()
|
||||
|
||||
else
|
||||
spawn(32*coeff*multiplier)
|
||||
use_power(power)
|
||||
var/list/materials_used = list(MAT_METAL=metal_cost*coeff*multiplier, MAT_GLASS=glass_cost*coeff*multiplier)
|
||||
materials.use_amount(materials_used)
|
||||
for(var/i=1, i<=multiplier, i++)
|
||||
var/obj/item/new_item = new being_built.build_path(T)
|
||||
for(var/mat in materials_used)
|
||||
new_item.materials[mat] = materials_used[mat] / multiplier
|
||||
new_item.autolathe_crafted(src)
|
||||
busy = FALSE
|
||||
updateUsrDialog()
|
||||
var/time = is_stack ? 32 : 32*coeff*multiplier
|
||||
addtimer(CALLBACK(src, .proc/make_item, power, metal_cost, glass_cost, multiplier, coeff, is_stack), time)
|
||||
|
||||
if(href_list["search"])
|
||||
matching_designs.Cut()
|
||||
@@ -218,6 +190,30 @@
|
||||
|
||||
return
|
||||
|
||||
/obj/machinery/autolathe/proc/make_item(power, metal_cost, glass_cost, multiplier, coeff, is_stack)
|
||||
GET_COMPONENT(materials, /datum/component/material_container)
|
||||
var/atom/A = drop_location()
|
||||
use_power(power)
|
||||
var/list/materials_used = list(MAT_METAL=metal_cost*coeff*multiplier, MAT_GLASS=glass_cost*coeff*multiplier)
|
||||
materials.use_amount(materials_used)
|
||||
|
||||
if(is_stack)
|
||||
var/obj/item/stack/N = new being_built.build_path(A, multiplier)
|
||||
N.update_icon()
|
||||
N.autolathe_crafted(src)
|
||||
for(var/obj/item/stack/S in (A.contents - N))
|
||||
if(istype(S, N.merge_type))
|
||||
N.merge(S)
|
||||
else
|
||||
for(var/i=1, i<=multiplier, i++)
|
||||
var/obj/item/new_item = new being_built.build_path(A)
|
||||
for(var/mat in materials_used)
|
||||
new_item.materials[mat] = materials_used[mat] / multiplier
|
||||
new_item.autolathe_crafted(src)
|
||||
|
||||
busy = FALSE
|
||||
updateDialog()
|
||||
|
||||
/obj/machinery/autolathe/RefreshParts()
|
||||
var/T = 0
|
||||
for(var/obj/item/stock_parts/matter_bin/MB in component_parts)
|
||||
|
||||
@@ -528,7 +528,7 @@
|
||||
playsound(loc, 'sound/effects/bang.ogg', 100, 1)
|
||||
var/turf/open/floor/F
|
||||
for(F in orange(1, src))
|
||||
F.ChangeTurf(F.baseturf)
|
||||
F.ScrapeAway()
|
||||
say("Something slams into the floor around [src], exposing it to space!")
|
||||
if(hull)
|
||||
sleep(10)
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
for(var/turf/closed/T in range(2, src))
|
||||
here.ChangeTurf(T.type)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
here.ChangeTurf(/turf/closed/wall)
|
||||
here.PlaceOnTop(/turf/closed/wall)
|
||||
if(9 to 11)
|
||||
lights = FALSE
|
||||
locked = TRUE
|
||||
|
||||
@@ -22,6 +22,7 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
var/creationTime
|
||||
var/authorCensor
|
||||
var/bodyCensor
|
||||
var/photo_file
|
||||
|
||||
/datum/newscaster/feed_message/proc/returnAuthor(censor)
|
||||
if(censor == -1)
|
||||
@@ -97,6 +98,7 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
var/scannedUser
|
||||
var/isAdminMsg
|
||||
var/icon/img
|
||||
var/photo_file
|
||||
|
||||
/datum/newscaster/feed_network
|
||||
var/list/datum/newscaster/feed_channel/network_channels = list()
|
||||
@@ -126,6 +128,7 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
if(photo)
|
||||
newMsg.img = photo.img
|
||||
newMsg.caption = photo.scribble
|
||||
newMsg.photo_file = save_photo(photo.img)
|
||||
for(var/datum/newscaster/feed_channel/FC in network_channels)
|
||||
if(FC.channel_name == channel_name)
|
||||
FC.messages += newMsg
|
||||
@@ -143,6 +146,7 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
wanted_issue.isAdminMsg = adminMsg
|
||||
if(photo)
|
||||
wanted_issue.img = photo.img
|
||||
wanted_issue.photo_file = save_photo(photo.img)
|
||||
if(newMessage)
|
||||
for(var/obj/machinery/newscaster/N in GLOB.allCasters)
|
||||
N.newsAlert()
|
||||
@@ -157,7 +161,12 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters)
|
||||
NEWSCASTER.update_icon()
|
||||
|
||||
|
||||
/datum/newscaster/feed_network/proc/save_photo(icon/photo)
|
||||
var/photo_file = copytext(md5("\icon[photo]"), 1, 6)
|
||||
if(!fexists("[GLOB.log_directory]/photos/[photo_file].png"))
|
||||
var/icon/p = icon(photo, frame = 1)
|
||||
fcopy(p, "[GLOB.log_directory]/photos/[photo_file].png")
|
||||
return photo_file
|
||||
|
||||
/obj/item/wallframe/newscaster
|
||||
name = "newscaster frame"
|
||||
|
||||
@@ -684,10 +684,10 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
|
||||
desc = "Uh oh!"
|
||||
|
||||
/obj/machinery/vending/snack/random/Initialize()
|
||||
..()
|
||||
var/T = pick(subtypesof(/obj/machinery/vending/snack) - /obj/machinery/vending/snack/random)
|
||||
new T(get_turf(src))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
..()
|
||||
var/T = pick(subtypesof(/obj/machinery/vending/snack) - /obj/machinery/vending/snack/random)
|
||||
new T(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/machinery/vending/snack/blue
|
||||
icon_state = "snackblue"
|
||||
@@ -737,10 +737,10 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
|
||||
desc = "Uh oh!"
|
||||
|
||||
/obj/machinery/vending/cola/random/Initialize()
|
||||
. = ..()
|
||||
var/T = pick(subtypesof(/obj/machinery/vending/cola) - /obj/machinery/vending/cola/random)
|
||||
new T(get_turf(src))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
..()
|
||||
var/T = pick(subtypesof(/obj/machinery/vending/cola) - /obj/machinery/vending/cola/random)
|
||||
new T(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/machinery/vending/cola/blue
|
||||
icon_state = "Cola_Machine"
|
||||
|
||||
@@ -222,14 +222,14 @@
|
||||
occupant_message("Deconstructing [W]...")
|
||||
if(do_after_cooldown(W))
|
||||
chassis.spark_system.start()
|
||||
W.ChangeTurf(/turf/open/floor/plating)
|
||||
W.ScrapeAway()
|
||||
playsound(W, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
else if(isfloorturf(target))
|
||||
var/turf/open/floor/F = target
|
||||
occupant_message("Deconstructing [F]...")
|
||||
if(do_after_cooldown(target))
|
||||
chassis.spark_system.start()
|
||||
F.ChangeTurf(F.baseturf)
|
||||
F.ScrapeAway()
|
||||
playsound(F, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
else if (istype(target, /obj/machinery/door/airlock))
|
||||
occupant_message("Deconstructing [target]...")
|
||||
@@ -242,14 +242,14 @@
|
||||
var/turf/open/space/S = target
|
||||
occupant_message("Building Floor...")
|
||||
if(do_after_cooldown(S))
|
||||
S.ChangeTurf(/turf/open/floor/plating)
|
||||
S.PlaceOnTop(/turf/open/floor/plating)
|
||||
playsound(S, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
chassis.spark_system.start()
|
||||
else if(isfloorturf(target))
|
||||
var/turf/open/floor/F = target
|
||||
occupant_message("Building Wall...")
|
||||
if(do_after_cooldown(F))
|
||||
F.ChangeTurf(/turf/closed/wall)
|
||||
F.PlaceOnTop(/turf/closed/wall)
|
||||
playsound(F, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
chassis.spark_system.start()
|
||||
if(2)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "recharge_floor" // Some people just want to watch the world burn i guess
|
||||
|
||||
/turf/open/floor/mech_bay_recharge_floor/break_tile()
|
||||
src.ChangeTurf(/turf/open/floor/plating)
|
||||
ScrapeAway()
|
||||
|
||||
/turf/open/floor/mech_bay_recharge_floor/airless
|
||||
icon_state = "recharge_floor_asteroid"
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
if(metal)
|
||||
var/turf/T = get_turf(src)
|
||||
if(isspaceturf(T)) //Block up any exposed space
|
||||
T.ChangeTurf(/turf/open/floor/plating/foam)
|
||||
T.PlaceOnTop(/turf/open/floor/plating/foam)
|
||||
for(var/direction in GLOB.cardinals)
|
||||
var/turf/cardinal_turf = get_step(T, direction)
|
||||
if(get_area(cardinal_turf) != get_area(T)) //We're at an area boundary, so let's block off this turf!
|
||||
|
||||
@@ -5,19 +5,29 @@
|
||||
var/lootcount = 1 //how many items will be spawned
|
||||
var/lootdoubles = TRUE //if the same item can be spawned twice
|
||||
var/list/loot //a list of possible items to spawn e.g. list(/obj/item, /obj/structure, /obj/effect)
|
||||
var/fan_out_items = FALSE //Whether the items should be distributed to offsets 0,3,-3,6,-6,9,-9.. This overrides pixel_x/y on the spawner itself
|
||||
|
||||
/obj/effect/spawner/lootdrop/Initialize(mapload)
|
||||
..()
|
||||
if(loot && loot.len)
|
||||
var/turf/T = get_turf(src)
|
||||
while(lootcount && loot.len)
|
||||
var/loot_spawned = 0
|
||||
while((lootcount-loot_spawned) && loot.len)
|
||||
var/lootspawn = pickweight(loot)
|
||||
if(!lootdoubles)
|
||||
loot.Remove(lootspawn)
|
||||
|
||||
if(lootspawn)
|
||||
new lootspawn(T)
|
||||
lootcount--
|
||||
var/atom/movable/spawned_loot = new lootspawn(T)
|
||||
if (!fan_out_items)
|
||||
if (pixel_x != 0)
|
||||
spawned_loot.pixel_x = pixel_x
|
||||
if (pixel_y != 0)
|
||||
spawned_loot.pixel_y = pixel_y
|
||||
else
|
||||
if (loot_spawned)
|
||||
spawned_loot.pixel_x = spawned_loot.pixel_y = ((!(loot_spawned%2)*loot_spawned/2)*-3)+((loot_spawned%2)*(loot_spawned+1)/2*3)
|
||||
loot_spawned++
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/effect/spawner/lootdrop/armory_contraband
|
||||
|
||||
@@ -20,9 +20,9 @@
|
||||
for(var/j = lowBoundY,j<=hiBoundY,j++)
|
||||
var/turf/T = locate(i,j,z)
|
||||
if(i == lowBoundX || i == hiBoundX || j == lowBoundY || j == hiBoundY)
|
||||
T.ChangeTurf(/turf/closed/wall/vault)
|
||||
T.PlaceOnTop(/turf/closed/wall/vault)
|
||||
else
|
||||
T.ChangeTurf(/turf/open/floor/vault)
|
||||
T.PlaceOnTop(/turf/open/floor/vault)
|
||||
T.icon_state = "[type]vault"
|
||||
|
||||
qdel(src)
|
||||
|
||||
@@ -493,7 +493,7 @@
|
||||
color = null
|
||||
|
||||
/obj/item/device/flashlight/glowstick/random/Initialize()
|
||||
. = ..()
|
||||
..()
|
||||
var/T = pick(typesof(/obj/item/device/flashlight/glowstick) - /obj/item/device/flashlight/glowstick/random)
|
||||
new T(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
@@ -233,7 +233,7 @@
|
||||
/obj/item/flamethrower/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
var/obj/item/projectile/P = hitby
|
||||
if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && prob(15))
|
||||
owner.visible_message("<span class='danger'>[attack_text] hits the fueltank on [owner]'s [src], rupturing it! What a shot!</span>")
|
||||
owner.visible_message("<span class='danger'>\The [attack_text] hits the fueltank on [owner]'s [name], rupturing it! What a shot!</span>")
|
||||
var/target_turf = get_turf(owner)
|
||||
igniter.ignite_turf(src,target_turf, release_amount = 100)
|
||||
qdel(ptank)
|
||||
|
||||
@@ -77,3 +77,40 @@
|
||||
if (!healthstring)
|
||||
healthstring = "ERROR"
|
||||
return healthstring
|
||||
|
||||
/obj/item/implant/radio
|
||||
name = "internal radio implant"
|
||||
desc = "Are you there God? It's me, Syndicate Comms Agent."
|
||||
activated = TRUE
|
||||
var/obj/item/device/radio/radio
|
||||
var/radio_key = /obj/item/device/encryptionkey/syndicate
|
||||
icon = 'icons/obj/radio.dmi'
|
||||
icon_state = "walkietalkie"
|
||||
|
||||
/obj/item/implant/radio/activate()
|
||||
// needs to be GLOB.deep_inventory_state otherwise it won't open
|
||||
radio.ui_interact(usr, "main", null, FALSE, null, GLOB.deep_inventory_state)
|
||||
|
||||
/obj/item/implant/radio/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
radio = new(src)
|
||||
// almost like an internal headset, but without the
|
||||
// "must be in ears to hear" restriction.
|
||||
radio.name = "internal radio"
|
||||
radio.subspace_transmission = TRUE
|
||||
radio.canhear_range = 0
|
||||
radio.keyslot = new radio_key
|
||||
radio.recalculateChannels()
|
||||
|
||||
|
||||
/obj/item/implant/radio/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Internal Radio Implant<BR>
|
||||
<b>Life:</b> 24 hours<BR>
|
||||
<b>Implant Details:</b> Allows user to use an internal radio, useful if user expects equipment loss, or cannot equip conventional radios."}
|
||||
return dat
|
||||
|
||||
/obj/item/implanter/radio
|
||||
name = "implanter (internal radio)"
|
||||
imp_type = /obj/item/implant/radio
|
||||
|
||||
@@ -275,13 +275,14 @@
|
||||
consume_turf(target)
|
||||
|
||||
/obj/item/melee/supermatter_sword/proc/consume_turf(turf/T)
|
||||
if(istype(T, T.baseturf))
|
||||
return //Can't void the void, baby!
|
||||
var/oldtype = T.type
|
||||
var/turf/newT = T.ScrapeAway()
|
||||
if(newT.type == oldtype)
|
||||
return
|
||||
playsound(T, 'sound/effects/supermatter.ogg', 50, 1)
|
||||
T.visible_message("<span class='danger'>[T] smacks into [src] and rapidly flashes to ash.</span>",\
|
||||
"<span class='italics'>You hear a loud crack as you are washed with a wave of heat.</span>")
|
||||
shard.Consume()
|
||||
T.ChangeTurf(T.baseturf)
|
||||
T.CalculateAdjacentTurfs()
|
||||
|
||||
/obj/item/melee/supermatter_sword/add_blood(list/blood_dna)
|
||||
|
||||
@@ -1,307 +1,310 @@
|
||||
/obj/item/storage/box/syndicate
|
||||
|
||||
/obj/item/storage/box/syndicate/PopulateContents()
|
||||
switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1)))
|
||||
if("bloodyspai") // 27 tc now this is more right
|
||||
new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set
|
||||
new /obj/item/clothing/mask/chameleon(src) // Goes with above
|
||||
new /obj/item/card/id/syndicate(src) // 2 tc
|
||||
new /obj/item/clothing/shoes/chameleon(src) // 2 tc
|
||||
new /obj/item/device/camera_bug(src) // 1 tc
|
||||
new /obj/item/device/multitool/ai_detect(src) // 1 tc
|
||||
new /obj/item/device/encryptionkey/syndicate(src) // 2 tc
|
||||
new /obj/item/reagent_containers/syringe/mulligan(src) // 4 tc
|
||||
new /obj/item/switchblade(src) //I'll count this as 2 tc
|
||||
new /obj/item/storage/fancy/cigarettes/cigpack_syndicate (src) // 2 tc this shit heals
|
||||
new /obj/item/device/flashlight/emp(src) // 2 tc
|
||||
new /obj/item/device/chameleon(src) // 7 tc
|
||||
|
||||
if("stealth") // 31 tc
|
||||
new /obj/item/gun/energy/kinetic_accelerator/crossbow(src)
|
||||
new /obj/item/pen/sleepy(src)
|
||||
new /obj/item/device/healthanalyzer/rad_laser(src)
|
||||
new /obj/item/device/chameleon(src)
|
||||
new /obj/item/soap/syndie(src)
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
|
||||
if("bond") // 29 tc
|
||||
new /obj/item/gun/ballistic/automatic/pistol(src)
|
||||
new /obj/item/suppressor(src)
|
||||
new /obj/item/ammo_box/magazine/m10mm(src)
|
||||
new /obj/item/ammo_box/magazine/m10mm(src)
|
||||
new /obj/item/clothing/under/chameleon(src)
|
||||
new /obj/item/card/id/syndicate(src)
|
||||
new /obj/item/reagent_containers/syringe/stimulants(src)
|
||||
|
||||
if("screwed") // 29 tc
|
||||
new /obj/item/device/sbeacondrop/bomb(src)
|
||||
new /obj/item/grenade/syndieminibomb(src)
|
||||
new /obj/item/device/sbeacondrop/powersink(src)
|
||||
new /obj/item/clothing/suit/space/syndicate/black/red(src)
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
|
||||
new /obj/item/device/encryptionkey/syndicate(src)
|
||||
|
||||
if("guns") // 28 tc now
|
||||
new /obj/item/gun/ballistic/revolver(src)
|
||||
new /obj/item/ammo_box/a357(src)
|
||||
new /obj/item/ammo_box/a357(src)
|
||||
new /obj/item/card/emag(src)
|
||||
new /obj/item/grenade/plastic/c4(src)
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/clothing/mask/gas/clown_hat(src)
|
||||
new /obj/item/clothing/under/suit_jacket/really_black(src)
|
||||
|
||||
if("murder") // 28 tc now
|
||||
new /obj/item/melee/transforming/energy/sword/saber(src)
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
new /obj/item/card/emag(src)
|
||||
new /obj/item/clothing/shoes/chameleon(src)
|
||||
new /obj/item/device/encryptionkey/syndicate(src)
|
||||
new /obj/item/grenade/syndieminibomb(src)
|
||||
|
||||
if("implant") // 55+ tc holy shit what the fuck this is a lottery disguised as fun boxes isn't it?
|
||||
new /obj/item/implanter/freedom(src)
|
||||
new /obj/item/implanter/uplink/precharged(src)
|
||||
new /obj/item/implanter/emp(src)
|
||||
new /obj/item/implanter/adrenalin(src)
|
||||
new /obj/item/implanter/explosive(src)
|
||||
new /obj/item/implanter/storage(src)
|
||||
|
||||
if("hacker") // 26 tc
|
||||
new /obj/item/aiModule/syndicate(src)
|
||||
new /obj/item/card/emag(src)
|
||||
new /obj/item/device/encryptionkey/binary(src)
|
||||
new /obj/item/aiModule/toyAI(src)
|
||||
new /obj/item/device/multitool/ai_detect(src)
|
||||
|
||||
if("lordsingulo") // 24 tc
|
||||
new /obj/item/device/sbeacondrop(src)
|
||||
new /obj/item/clothing/suit/space/syndicate/black/red(src)
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
|
||||
new /obj/item/card/emag(src)
|
||||
|
||||
if("sabotage") // 26 tc now
|
||||
new /obj/item/grenade/plastic/c4 (src)
|
||||
new /obj/item/grenade/plastic/c4 (src)
|
||||
new /obj/item/device/doorCharge(src)
|
||||
new /obj/item/device/doorCharge(src)
|
||||
new /obj/item/device/camera_bug(src)
|
||||
new /obj/item/device/sbeacondrop/powersink(src)
|
||||
new /obj/item/cartridge/virus/syndicate(src)
|
||||
new /obj/item/storage/toolbox/syndicate(src) //To actually get to those places
|
||||
new /obj/item/pizzabox/bomb
|
||||
|
||||
if("darklord") //20 tc + tk + summon item close enough for now
|
||||
new /obj/item/twohanded/dualsaber(src)
|
||||
new /obj/item/dnainjector/telemut/darkbundle(src)
|
||||
new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
|
||||
new /obj/item/card/id/syndicate(src)
|
||||
new /obj/item/clothing/shoes/chameleon(src) //because slipping while being a dark lord sucks
|
||||
new /obj/item/spellbook/oneuse/summonitem(src)
|
||||
|
||||
if("sniper") //This shit is unique so can't really balance it around tc, also no silencer because getting killed without ANY indicator on what killed you sucks
|
||||
new /obj/item/gun/ballistic/automatic/sniper_rifle(src) // 12 tc
|
||||
new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src)
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/clothing/mask/gas/clown_hat(src)
|
||||
new /obj/item/clothing/under/suit_jacket/really_black(src)
|
||||
|
||||
if("metaops") // 30 tc
|
||||
new /obj/item/clothing/suit/space/hardsuit/syndi(src) // 8 tc
|
||||
new /obj/item/gun/ballistic/automatic/shotgun/bulldog/unrestricted(src) // 8 tc
|
||||
new /obj/item/implanter/explosive(src) // 2 tc
|
||||
new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc
|
||||
new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc
|
||||
new /obj/item/grenade/plastic/c4 (src) // 1 tc
|
||||
new /obj/item/grenade/plastic/c4 (src) // 1 tc
|
||||
new /obj/item/card/emag(src) // 6 tc
|
||||
|
||||
if("ninja") // 33 tc worth
|
||||
new /obj/item/katana(src) // Unique , hard to tell how much tc this is worth. 8 tc?
|
||||
new /obj/item/implanter/adrenalin(src) // 8 tc
|
||||
new /obj/item/throwing_star(src) // ~5 tc for all 6
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/storage/belt/chameleon(src) // Unique but worth at least 2 tc
|
||||
new /obj/item/card/id/syndicate(src) // 2 tc
|
||||
new /obj/item/device/chameleon(src) // 7 tc
|
||||
|
||||
/obj/item/storage/box/syndie_kit
|
||||
name = "box"
|
||||
desc = "A sleek, sturdy box."
|
||||
icon_state = "syndiebox"
|
||||
illustration = "writing_syndie"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_freedom
|
||||
name = "boxed freedom implant (with injector)"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_freedom/PopulateContents()
|
||||
var/obj/item/implanter/O = new(src)
|
||||
O.imp = new /obj/item/implant/freedom(O)
|
||||
O.update_icon()
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_microbomb
|
||||
name = "Microbomb Implant (with injector)"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_microbomb/PopulateContents()
|
||||
var/obj/item/implanter/O = new(src)
|
||||
O.imp = new /obj/item/implant/explosive(O)
|
||||
O.update_icon()
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_macrobomb
|
||||
name = "Macrobomb Implant (with injector)"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_macrobomb/PopulateContents()
|
||||
var/obj/item/implanter/O = new(src)
|
||||
O.imp = new /obj/item/implant/explosive/macro(O)
|
||||
O.update_icon()
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_uplink
|
||||
name = "boxed uplink implant (with injector)"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_uplink/PopulateContents()
|
||||
..()
|
||||
var/obj/item/implanter/O = new(src)
|
||||
O.imp = new /obj/item/implant/uplink(O)
|
||||
O.update_icon()
|
||||
|
||||
/obj/item/storage/box/syndie_kit/bioterror
|
||||
name = "bioterror syringe box"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/bioterror/PopulateContents()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/reagent_containers/syringe/bioterror(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_adrenal
|
||||
name = "boxed adrenal implant (with injector)"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_adrenal/PopulateContents()
|
||||
var/obj/item/implanter/O = new(src)
|
||||
O.imp = new /obj/item/implant/adrenalin(O)
|
||||
O.update_icon()
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_storage
|
||||
name = "boxed storage implant (with injector)"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_storage/PopulateContents()
|
||||
new /obj/item/implanter/storage(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/space
|
||||
name = "boxed space suit and helmet"
|
||||
can_hold = list(/obj/item/clothing/suit/space/syndicate, /obj/item/clothing/head/helmet/space/syndicate)
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/storage/box/syndie_kit/space/PopulateContents()
|
||||
new /obj/item/clothing/suit/space/syndicate/black/red(src) // Black and red is so in right now
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/emp
|
||||
name = "boxed EMP kit"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/emp/PopulateContents()
|
||||
new /obj/item/grenade/empgrenade(src)
|
||||
new /obj/item/grenade/empgrenade(src)
|
||||
new /obj/item/grenade/empgrenade(src)
|
||||
new /obj/item/grenade/empgrenade(src)
|
||||
new /obj/item/grenade/empgrenade(src)
|
||||
new /obj/item/implanter/emp(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/chemical
|
||||
name = "boxed chemical kit"
|
||||
storage_slots = 14
|
||||
|
||||
/obj/item/storage/box/syndie_kit/chemical/PopulateContents()
|
||||
new /obj/item/reagent_containers/glass/bottle/polonium(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/venom(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/neurotoxin2(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/formaldehyde(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/spewium(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/cyanide(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/histamine(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/initropidril(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/pancuronium(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/sodium_thiopental(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/coniine(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/curare(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/amanitin(src)
|
||||
new /obj/item/reagent_containers/syringe(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/nuke
|
||||
name = "box"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/nuke/PopulateContents()
|
||||
new /obj/item/screwdriver/nuke(src)
|
||||
new /obj/item/nuke_core_container(src)
|
||||
new /obj/item/paper/guides/antag/nuke_instructions(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/supermatter
|
||||
name = "box"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/supermatter/PopulateContents()
|
||||
new /obj/item/scalpel/supermatter(src)
|
||||
new /obj/item/hemostat/supermatter(src)
|
||||
new /obj/item/nuke_core_container/supermatter(src)
|
||||
new /obj/item/paper/guides/antag/supermatter_sliver(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/tuberculosisgrenade
|
||||
name = "boxed virus grenade kit"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/tuberculosisgrenade/PopulateContents()
|
||||
new /obj/item/grenade/chem_grenade/tuberculosis(src)
|
||||
for(var/i in 1 to 5)
|
||||
new /obj/item/reagent_containers/hypospray/medipen/tuberculosiscure(src)
|
||||
new /obj/item/reagent_containers/syringe(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/tuberculosiscure(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/chameleon
|
||||
name = "chameleon kit"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/chameleon/PopulateContents()
|
||||
new /obj/item/clothing/under/chameleon(src)
|
||||
new /obj/item/clothing/suit/chameleon(src)
|
||||
new /obj/item/clothing/gloves/chameleon(src)
|
||||
new /obj/item/clothing/shoes/chameleon(src)
|
||||
new /obj/item/clothing/glasses/chameleon(src)
|
||||
new /obj/item/clothing/head/chameleon(src)
|
||||
new /obj/item/clothing/mask/chameleon(src)
|
||||
new /obj/item/storage/backpack/chameleon(src)
|
||||
new /obj/item/device/radio/headset/chameleon(src)
|
||||
new /obj/item/stamp/chameleon(src)
|
||||
new /obj/item/device/pda/chameleon(src)
|
||||
new /obj/item/gun/energy/laser/chameleon(src)
|
||||
|
||||
//5*(2*4) = 5*8 = 45, 45 damage if you hit one person with all 5 stars.
|
||||
//Not counting the damage it will do while embedded (2*4 = 8, at 15% chance)
|
||||
/obj/item/storage/box/syndie_kit/throwing_weapons/PopulateContents()
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/restraints/legcuffs/bola/tactical(src)
|
||||
new /obj/item/restraints/legcuffs/bola/tactical(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/cutouts/PopulateContents()
|
||||
for(var/i in 1 to 3)
|
||||
new/obj/item/cardboard_cutout/adaptive(src)
|
||||
new/obj/item/toy/crayon/rainbow(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/romerol/PopulateContents()
|
||||
new /obj/item/reagent_containers/glass/bottle/romerol(src)
|
||||
new /obj/item/reagent_containers/syringe(src)
|
||||
new /obj/item/reagent_containers/dropper(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/ez_clean/PopulateContents()
|
||||
for(var/i in 1 to 3)
|
||||
new/obj/item/grenade/chem_grenade/ez_clean(src)
|
||||
|
||||
/obj/item/storage/box/hug/reverse_revolver/PopulateContents()
|
||||
new /obj/item/gun/ballistic/revolver/reverse(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/mimery/PopulateContents()
|
||||
new /obj/item/spellbook/oneuse/mimery_blockade(src)
|
||||
new /obj/item/spellbook/oneuse/mimery_guns(src)
|
||||
/obj/item/storage/box/syndicate
|
||||
|
||||
/obj/item/storage/box/syndicate/PopulateContents()
|
||||
switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1)))
|
||||
if("bloodyspai") // 27 tc now this is more right
|
||||
new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set
|
||||
new /obj/item/clothing/mask/chameleon(src) // Goes with above
|
||||
new /obj/item/card/id/syndicate(src) // 2 tc
|
||||
new /obj/item/clothing/shoes/chameleon(src) // 2 tc
|
||||
new /obj/item/device/camera_bug(src) // 1 tc
|
||||
new /obj/item/device/multitool/ai_detect(src) // 1 tc
|
||||
new /obj/item/device/encryptionkey/syndicate(src) // 2 tc
|
||||
new /obj/item/reagent_containers/syringe/mulligan(src) // 4 tc
|
||||
new /obj/item/switchblade(src) //I'll count this as 2 tc
|
||||
new /obj/item/storage/fancy/cigarettes/cigpack_syndicate (src) // 2 tc this shit heals
|
||||
new /obj/item/device/flashlight/emp(src) // 2 tc
|
||||
new /obj/item/device/chameleon(src) // 7 tc
|
||||
|
||||
if("stealth") // 31 tc
|
||||
new /obj/item/gun/energy/kinetic_accelerator/crossbow(src)
|
||||
new /obj/item/pen/sleepy(src)
|
||||
new /obj/item/device/healthanalyzer/rad_laser(src)
|
||||
new /obj/item/device/chameleon(src)
|
||||
new /obj/item/soap/syndie(src)
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
|
||||
if("bond") // 29 tc
|
||||
new /obj/item/gun/ballistic/automatic/pistol(src)
|
||||
new /obj/item/suppressor(src)
|
||||
new /obj/item/ammo_box/magazine/m10mm(src)
|
||||
new /obj/item/ammo_box/magazine/m10mm(src)
|
||||
new /obj/item/clothing/under/chameleon(src)
|
||||
new /obj/item/card/id/syndicate(src)
|
||||
new /obj/item/reagent_containers/syringe/stimulants(src)
|
||||
|
||||
if("screwed") // 29 tc
|
||||
new /obj/item/device/sbeacondrop/bomb(src)
|
||||
new /obj/item/grenade/syndieminibomb(src)
|
||||
new /obj/item/device/sbeacondrop/powersink(src)
|
||||
new /obj/item/clothing/suit/space/syndicate/black/red(src)
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
|
||||
new /obj/item/device/encryptionkey/syndicate(src)
|
||||
|
||||
if("guns") // 28 tc now
|
||||
new /obj/item/gun/ballistic/revolver(src)
|
||||
new /obj/item/ammo_box/a357(src)
|
||||
new /obj/item/ammo_box/a357(src)
|
||||
new /obj/item/card/emag(src)
|
||||
new /obj/item/grenade/plastic/c4(src)
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/clothing/mask/gas/clown_hat(src)
|
||||
new /obj/item/clothing/under/suit_jacket/really_black(src)
|
||||
|
||||
if("murder") // 28 tc now
|
||||
new /obj/item/melee/transforming/energy/sword/saber(src)
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
new /obj/item/card/emag(src)
|
||||
new /obj/item/clothing/shoes/chameleon(src)
|
||||
new /obj/item/device/encryptionkey/syndicate(src)
|
||||
new /obj/item/grenade/syndieminibomb(src)
|
||||
|
||||
if("implant") // 55+ tc holy shit what the fuck this is a lottery disguised as fun boxes isn't it?
|
||||
new /obj/item/implanter/freedom(src)
|
||||
new /obj/item/implanter/uplink/precharged(src)
|
||||
new /obj/item/implanter/emp(src)
|
||||
new /obj/item/implanter/adrenalin(src)
|
||||
new /obj/item/implanter/explosive(src)
|
||||
new /obj/item/implanter/storage(src)
|
||||
|
||||
if("hacker") // 26 tc
|
||||
new /obj/item/aiModule/syndicate(src)
|
||||
new /obj/item/card/emag(src)
|
||||
new /obj/item/device/encryptionkey/binary(src)
|
||||
new /obj/item/aiModule/toyAI(src)
|
||||
new /obj/item/device/multitool/ai_detect(src)
|
||||
|
||||
if("lordsingulo") // 24 tc
|
||||
new /obj/item/device/sbeacondrop(src)
|
||||
new /obj/item/clothing/suit/space/syndicate/black/red(src)
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
|
||||
new /obj/item/card/emag(src)
|
||||
|
||||
if("sabotage") // 26 tc now
|
||||
new /obj/item/grenade/plastic/c4 (src)
|
||||
new /obj/item/grenade/plastic/c4 (src)
|
||||
new /obj/item/device/doorCharge(src)
|
||||
new /obj/item/device/doorCharge(src)
|
||||
new /obj/item/device/camera_bug(src)
|
||||
new /obj/item/device/sbeacondrop/powersink(src)
|
||||
new /obj/item/cartridge/virus/syndicate(src)
|
||||
new /obj/item/storage/toolbox/syndicate(src) //To actually get to those places
|
||||
new /obj/item/pizzabox/bomb
|
||||
|
||||
if("darklord") //20 tc + tk + summon item close enough for now
|
||||
new /obj/item/twohanded/dualsaber(src)
|
||||
new /obj/item/dnainjector/telemut/darkbundle(src)
|
||||
new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
|
||||
new /obj/item/card/id/syndicate(src)
|
||||
new /obj/item/clothing/shoes/chameleon(src) //because slipping while being a dark lord sucks
|
||||
new /obj/item/spellbook/oneuse/summonitem(src)
|
||||
|
||||
if("sniper") //This shit is unique so can't really balance it around tc, also no silencer because getting killed without ANY indicator on what killed you sucks
|
||||
new /obj/item/gun/ballistic/automatic/sniper_rifle(src) // 12 tc
|
||||
new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src)
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/clothing/mask/gas/clown_hat(src)
|
||||
new /obj/item/clothing/under/suit_jacket/really_black(src)
|
||||
|
||||
if("metaops") // 30 tc
|
||||
new /obj/item/clothing/suit/space/hardsuit/syndi(src) // 8 tc
|
||||
new /obj/item/gun/ballistic/automatic/shotgun/bulldog/unrestricted(src) // 8 tc
|
||||
new /obj/item/implanter/explosive(src) // 2 tc
|
||||
new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc
|
||||
new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc
|
||||
new /obj/item/grenade/plastic/c4 (src) // 1 tc
|
||||
new /obj/item/grenade/plastic/c4 (src) // 1 tc
|
||||
new /obj/item/card/emag(src) // 6 tc
|
||||
|
||||
if("ninja") // 33 tc worth
|
||||
new /obj/item/katana(src) // Unique , hard to tell how much tc this is worth. 8 tc?
|
||||
new /obj/item/implanter/adrenalin(src) // 8 tc
|
||||
new /obj/item/throwing_star(src) // ~5 tc for all 6
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/storage/belt/chameleon(src) // Unique but worth at least 2 tc
|
||||
new /obj/item/card/id/syndicate(src) // 2 tc
|
||||
new /obj/item/device/chameleon(src) // 7 tc
|
||||
|
||||
/obj/item/storage/box/syndie_kit
|
||||
name = "box"
|
||||
desc = "A sleek, sturdy box."
|
||||
icon_state = "syndiebox"
|
||||
illustration = "writing_syndie"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_freedom
|
||||
name = "boxed freedom implant (with injector)"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_freedom/PopulateContents()
|
||||
var/obj/item/implanter/O = new(src)
|
||||
O.imp = new /obj/item/implant/freedom(O)
|
||||
O.update_icon()
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_microbomb
|
||||
name = "Microbomb Implant (with injector)"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_microbomb/PopulateContents()
|
||||
var/obj/item/implanter/O = new(src)
|
||||
O.imp = new /obj/item/implant/explosive(O)
|
||||
O.update_icon()
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_macrobomb
|
||||
name = "Macrobomb Implant (with injector)"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_macrobomb/PopulateContents()
|
||||
var/obj/item/implanter/O = new(src)
|
||||
O.imp = new /obj/item/implant/explosive/macro(O)
|
||||
O.update_icon()
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_uplink
|
||||
name = "boxed uplink implant (with injector)"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_uplink/PopulateContents()
|
||||
..()
|
||||
var/obj/item/implanter/O = new(src)
|
||||
O.imp = new /obj/item/implant/uplink(O)
|
||||
O.update_icon()
|
||||
|
||||
/obj/item/storage/box/syndie_kit/bioterror
|
||||
name = "bioterror syringe box"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/bioterror/PopulateContents()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/reagent_containers/syringe/bioterror(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_adrenal
|
||||
name = "boxed adrenal implant (with injector)"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_adrenal/PopulateContents()
|
||||
var/obj/item/implanter/O = new(src)
|
||||
O.imp = new /obj/item/implant/adrenalin(O)
|
||||
O.update_icon()
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_storage
|
||||
name = "boxed storage implant (with injector)"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_storage/PopulateContents()
|
||||
new /obj/item/implanter/storage(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/space
|
||||
name = "boxed space suit and helmet"
|
||||
can_hold = list(/obj/item/clothing/suit/space/syndicate, /obj/item/clothing/head/helmet/space/syndicate)
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/storage/box/syndie_kit/space/PopulateContents()
|
||||
new /obj/item/clothing/suit/space/syndicate/black/red(src) // Black and red is so in right now
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/emp
|
||||
name = "boxed EMP kit"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/emp/PopulateContents()
|
||||
new /obj/item/grenade/empgrenade(src)
|
||||
new /obj/item/grenade/empgrenade(src)
|
||||
new /obj/item/grenade/empgrenade(src)
|
||||
new /obj/item/grenade/empgrenade(src)
|
||||
new /obj/item/grenade/empgrenade(src)
|
||||
new /obj/item/implanter/emp(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/chemical
|
||||
name = "boxed chemical kit"
|
||||
storage_slots = 14
|
||||
|
||||
/obj/item/storage/box/syndie_kit/chemical/PopulateContents()
|
||||
new /obj/item/reagent_containers/glass/bottle/polonium(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/venom(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/neurotoxin2(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/formaldehyde(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/spewium(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/cyanide(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/histamine(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/initropidril(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/pancuronium(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/sodium_thiopental(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/coniine(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/curare(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/amanitin(src)
|
||||
new /obj/item/reagent_containers/syringe(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/nuke
|
||||
name = "box"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/nuke/PopulateContents()
|
||||
new /obj/item/screwdriver/nuke(src)
|
||||
new /obj/item/nuke_core_container(src)
|
||||
new /obj/item/paper/guides/antag/nuke_instructions(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/supermatter
|
||||
name = "box"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/supermatter/PopulateContents()
|
||||
new /obj/item/scalpel/supermatter(src)
|
||||
new /obj/item/hemostat/supermatter(src)
|
||||
new /obj/item/nuke_core_container/supermatter(src)
|
||||
new /obj/item/paper/guides/antag/supermatter_sliver(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/tuberculosisgrenade
|
||||
name = "boxed virus grenade kit"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/tuberculosisgrenade/PopulateContents()
|
||||
new /obj/item/grenade/chem_grenade/tuberculosis(src)
|
||||
for(var/i in 1 to 5)
|
||||
new /obj/item/reagent_containers/hypospray/medipen/tuberculosiscure(src)
|
||||
new /obj/item/reagent_containers/syringe(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/tuberculosiscure(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/chameleon
|
||||
name = "chameleon kit"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/chameleon/PopulateContents()
|
||||
new /obj/item/clothing/under/chameleon(src)
|
||||
new /obj/item/clothing/suit/chameleon(src)
|
||||
new /obj/item/clothing/gloves/chameleon(src)
|
||||
new /obj/item/clothing/shoes/chameleon(src)
|
||||
new /obj/item/clothing/glasses/chameleon(src)
|
||||
new /obj/item/clothing/head/chameleon(src)
|
||||
new /obj/item/clothing/mask/chameleon(src)
|
||||
new /obj/item/storage/backpack/chameleon(src)
|
||||
new /obj/item/device/radio/headset/chameleon(src)
|
||||
new /obj/item/stamp/chameleon(src)
|
||||
new /obj/item/device/pda/chameleon(src)
|
||||
new /obj/item/gun/energy/laser/chameleon(src)
|
||||
|
||||
//5*(2*4) = 5*8 = 45, 45 damage if you hit one person with all 5 stars.
|
||||
//Not counting the damage it will do while embedded (2*4 = 8, at 15% chance)
|
||||
/obj/item/storage/box/syndie_kit/throwing_weapons/PopulateContents()
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/throwing_star(src)
|
||||
new /obj/item/restraints/legcuffs/bola/tactical(src)
|
||||
new /obj/item/restraints/legcuffs/bola/tactical(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/cutouts/PopulateContents()
|
||||
for(var/i in 1 to 3)
|
||||
new/obj/item/cardboard_cutout/adaptive(src)
|
||||
new/obj/item/toy/crayon/rainbow(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/romerol/PopulateContents()
|
||||
new /obj/item/reagent_containers/glass/bottle/romerol(src)
|
||||
new /obj/item/reagent_containers/syringe(src)
|
||||
new /obj/item/reagent_containers/dropper(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/ez_clean/PopulateContents()
|
||||
for(var/i in 1 to 3)
|
||||
new/obj/item/grenade/chem_grenade/ez_clean(src)
|
||||
|
||||
/obj/item/storage/box/hug/reverse_revolver/PopulateContents()
|
||||
new /obj/item/gun/ballistic/revolver/reverse(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/mimery/PopulateContents()
|
||||
new /obj/item/spellbook/oneuse/mimery_blockade(src)
|
||||
new /obj/item/spellbook/oneuse/mimery_guns(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/imp_radio/PopulateContents()
|
||||
new /obj/item/implanter/radio(src)
|
||||
|
||||
@@ -231,10 +231,10 @@ LINEN BINS
|
||||
desc = "If you're reading this description ingame, something has gone wrong! Honk!"
|
||||
|
||||
/obj/item/bedsheet/random/Initialize()
|
||||
. = INITIALIZE_HINT_QDEL
|
||||
..()
|
||||
var/type = pick(typesof(/obj/item/bedsheet) - /obj/item/bedsheet/random)
|
||||
new type(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/structure/bedsheetbin
|
||||
name = "linen bin"
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
|
||||
/obj/structure/falsewall/proc/ChangeToWall(delete = 1)
|
||||
var/turf/T = get_turf(src)
|
||||
T.ChangeTurf(walltype)
|
||||
T.PlaceOnTop(walltype)
|
||||
if(delete)
|
||||
qdel(src)
|
||||
return T
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
S.use(5)
|
||||
to_chat(user, "<span class='notice'>You add the plating.</span>")
|
||||
var/turf/T = get_turf(src)
|
||||
T.ChangeTurf(/turf/closed/wall/mineral/iron)
|
||||
T.PlaceOnTop(/turf/closed/wall/mineral/iron)
|
||||
transfer_fingerprints_to(T)
|
||||
qdel(src)
|
||||
return
|
||||
@@ -120,7 +120,7 @@
|
||||
S.use(2)
|
||||
to_chat(user, "<span class='notice'>You add the plating.</span>")
|
||||
var/turf/T = get_turf(src)
|
||||
T.ChangeTurf(/turf/closed/wall)
|
||||
T.PlaceOnTop(/turf/closed/wall)
|
||||
transfer_fingerprints_to(T)
|
||||
qdel(src)
|
||||
return
|
||||
@@ -150,7 +150,7 @@
|
||||
S.use(1)
|
||||
to_chat(user, "<span class='notice'>You fully reinforce the wall.</span>")
|
||||
var/turf/T = get_turf(src)
|
||||
T.ChangeTurf(/turf/closed/wall/r_wall)
|
||||
T.PlaceOnTop(/turf/closed/wall/r_wall)
|
||||
transfer_fingerprints_to(T)
|
||||
qdel(src)
|
||||
return
|
||||
@@ -194,7 +194,7 @@
|
||||
S.use(2)
|
||||
to_chat(user, "<span class='notice'>You add the plating.</span>")
|
||||
var/turf/T = get_turf(src)
|
||||
T.ChangeTurf(text2path("/turf/closed/wall/mineral/[M]"))
|
||||
T.PlaceOnTop(text2path("/turf/closed/wall/mineral/[M]"))
|
||||
transfer_fingerprints_to(T)
|
||||
qdel(src)
|
||||
return
|
||||
@@ -397,7 +397,7 @@
|
||||
user.visible_message("<span class='notice'>[user] plates [src] with runed metal.</span>", "<span class='notice'>You construct a runed wall.</span>")
|
||||
R.use(1)
|
||||
var/turf/T = get_turf(src)
|
||||
T.ChangeTurf(/turf/closed/wall/mineral/cult)
|
||||
T.PlaceOnTop(/turf/closed/wall/mineral/cult)
|
||||
qdel(src)
|
||||
|
||||
else
|
||||
@@ -424,7 +424,7 @@
|
||||
switch(passed_mode)
|
||||
if(RCD_FLOORWALL)
|
||||
to_chat(user, "<span class='notice'>You finish a wall.</span>")
|
||||
T.ChangeTurf(/turf/closed/wall)
|
||||
T.PlaceOnTop(/turf/closed/wall)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
if(RCD_DECONSTRUCT)
|
||||
|
||||
@@ -184,10 +184,10 @@
|
||||
var/obj/machinery/manned_turret/turret
|
||||
|
||||
/obj/item/gun_control/Initialize()
|
||||
. = ..()
|
||||
turret = loc
|
||||
if(!istype(turret))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
. = ..()
|
||||
turret = loc
|
||||
if(!istype(turret))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/item/gun_control/Destroy()
|
||||
turret = null
|
||||
|
||||
@@ -0,0 +1,232 @@
|
||||
/turf/proc/empty(turf_type=/turf/open/space, baseturf_type, list/ignore_typecache, flags)
|
||||
// Remove all atoms except observers, landmarks, docking ports
|
||||
var/static/list/ignored_atoms = typecacheof(list(/mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object))
|
||||
var/list/allowed_contents = typecache_filter_list_reverse(GetAllContentsIgnoring(ignore_typecache), ignored_atoms)
|
||||
allowed_contents -= src
|
||||
for(var/i in 1 to allowed_contents.len)
|
||||
var/thing = allowed_contents[i]
|
||||
qdel(thing, force=TRUE)
|
||||
|
||||
var/turf/newT = ChangeTurf(turf_type, baseturf_type, flags)
|
||||
|
||||
SSair.remove_from_active(newT)
|
||||
newT.CalculateAdjacentTurfs()
|
||||
SSair.add_to_active(newT,1)
|
||||
|
||||
/turf/proc/copyTurf(turf/T)
|
||||
if(T.type != type)
|
||||
var/obj/O
|
||||
if(underlays.len) //we have underlays, which implies some sort of transparency, so we want to a snapshot of the previous turf as an underlay
|
||||
O = new()
|
||||
O.underlays.Add(T)
|
||||
T.ChangeTurf(type)
|
||||
for(var/group in decals)
|
||||
T.add_decal(decals[group],group)
|
||||
if(underlays.len)
|
||||
T.underlays = O.underlays
|
||||
if(T.icon_state != icon_state)
|
||||
T.icon_state = icon_state
|
||||
if(T.icon != icon)
|
||||
T.icon = icon
|
||||
if(color)
|
||||
T.atom_colours = atom_colours.Copy()
|
||||
T.update_atom_colour()
|
||||
if(T.dir != dir)
|
||||
T.setDir(dir)
|
||||
return T
|
||||
|
||||
//wrapper for ChangeTurf()s that you want to prevent/affect without overriding ChangeTurf() itself
|
||||
/turf/proc/TerraformTurf(path, new_baseturf, flags)
|
||||
return ChangeTurf(path, new_baseturf, flags)
|
||||
|
||||
// Creates a new turf
|
||||
// new_baseturfs can be either a single type or list of types, formated the same as baseturfs. see turf.dm
|
||||
/turf/proc/ChangeTurf(path, list/new_baseturfs, flags)
|
||||
if(!path)
|
||||
return
|
||||
if(!GLOB.use_preloader && path == type && !(flags & CHANGETURF_FORCEOP)) // Don't no-op if the map loader requires it to be reconstructed
|
||||
return src
|
||||
|
||||
var/old_opacity = opacity
|
||||
var/old_dynamic_lighting = dynamic_lighting
|
||||
var/old_affecting_lights = affecting_lights
|
||||
var/old_lighting_object = lighting_object
|
||||
var/old_corners = corners
|
||||
|
||||
var/old_exl = explosion_level
|
||||
var/old_exi = explosion_id
|
||||
var/old_bp = blueprint_data
|
||||
blueprint_data = null
|
||||
|
||||
var/list/old_baseturfs = baseturfs
|
||||
changing_turf = TRUE
|
||||
|
||||
qdel(src) //Just get the side effects and call Destroy
|
||||
var/turf/W = new path(src)
|
||||
|
||||
if(new_baseturfs)
|
||||
W.baseturfs = new_baseturfs
|
||||
else
|
||||
W.baseturfs = old_baseturfs
|
||||
|
||||
W.explosion_id = old_exi
|
||||
W.explosion_level = old_exl
|
||||
|
||||
if(!(flags & CHANGETURF_DEFER_CHANGE))
|
||||
W.AfterChange(flags)
|
||||
|
||||
W.blueprint_data = old_bp
|
||||
|
||||
if(SSlighting.initialized)
|
||||
recalc_atom_opacity()
|
||||
lighting_object = old_lighting_object
|
||||
affecting_lights = old_affecting_lights
|
||||
corners = old_corners
|
||||
if (old_opacity != opacity || dynamic_lighting != old_dynamic_lighting)
|
||||
reconsider_lights()
|
||||
|
||||
if (dynamic_lighting != old_dynamic_lighting)
|
||||
if (IS_DYNAMIC_LIGHTING(src))
|
||||
lighting_build_overlay()
|
||||
else
|
||||
lighting_clear_overlay()
|
||||
|
||||
for(var/turf/open/space/S in RANGE_TURFS(1, src)) //RANGE_TURFS is in code\__HELPERS\game.dm
|
||||
S.update_starlight()
|
||||
|
||||
return W
|
||||
|
||||
// Take off the top layer turf and replace it with the next baseturf down
|
||||
/turf/proc/ScrapeAway()
|
||||
if(length(baseturfs))
|
||||
var/list/new_baseturfs = baseturfs
|
||||
var/turf_type = new_baseturfs[new_baseturfs.len]
|
||||
new_baseturfs.len--
|
||||
switch(new_baseturfs.len)
|
||||
if(1)
|
||||
new_baseturfs = new_baseturfs[1]
|
||||
if(0)
|
||||
new_baseturfs = turf_type
|
||||
// We must never end up with a situation where there is no baseturf
|
||||
WARNING("turf of type [type] had a baseturfs length 1 still in list form.")
|
||||
return ChangeTurf(turf_type, new_baseturfs)
|
||||
|
||||
if(baseturfs == type)
|
||||
return src
|
||||
|
||||
return ChangeTurf(baseturfs, baseturfs) // The bottom baseturf will never go away
|
||||
|
||||
// Take the input as baseturfs and put it underneath the current baseturfs
|
||||
// If fake_turf_type is provided and new_baseturfs is not the baseturfs list will be created identical to the turf type's
|
||||
// If both or just new_baseturfs is provided they will be inserted below the existing baseturfs
|
||||
/turf/proc/PlaceOnBottom(list/new_baseturfs, turf/fake_turf_type)
|
||||
if(fake_turf_type)
|
||||
if(!new_baseturfs)
|
||||
var/list/old_baseturfs = baseturfs.Copy()
|
||||
assemble_baseturfs(fake_turf_type)
|
||||
if(!length(baseturfs))
|
||||
baseturfs = list(baseturfs)
|
||||
baseturfs += old_baseturfs
|
||||
return
|
||||
else if(!length(new_baseturfs))
|
||||
new_baseturfs = list(new_baseturfs, fake_turf_type)
|
||||
else
|
||||
new_baseturfs += fake_turf_type
|
||||
if(!length(baseturfs))
|
||||
baseturfs = list(baseturfs)
|
||||
baseturfs.Insert(1, new_baseturfs)
|
||||
|
||||
// Make a new turf and put it on top
|
||||
// The args behave identical to PlaceOnBottom except they go on top
|
||||
/turf/proc/PlaceOnTop(list/new_baseturfs, turf/fake_turf_type)
|
||||
if(fake_turf_type)
|
||||
if(!new_baseturfs)
|
||||
var/list/old_baseturfs = baseturfs.Copy()
|
||||
assemble_baseturfs(fake_turf_type)
|
||||
if(!length(baseturfs))
|
||||
baseturfs = list(baseturfs)
|
||||
baseturfs.Insert(1, old_baseturfs)
|
||||
return
|
||||
else if(!length(new_baseturfs))
|
||||
new_baseturfs = list(new_baseturfs, fake_turf_type)
|
||||
else
|
||||
new_baseturfs += fake_turf_type
|
||||
if(!length(baseturfs))
|
||||
baseturfs = list(baseturfs)
|
||||
baseturfs += new_baseturfs
|
||||
|
||||
|
||||
// Copy an existing turf and put it on top
|
||||
/turf/proc/CopyOnTop(turf/copytarget, ignore_bottom=1, depth=INFINITY) // x, 1, 0
|
||||
var/list/new_baseturfs = list()
|
||||
new_baseturfs += baseturfs
|
||||
new_baseturfs += type
|
||||
|
||||
if(depth)
|
||||
var/list/target_baseturfs = copytarget.baseturfs
|
||||
var/base_len = length(target_baseturfs)
|
||||
if(!base_len)
|
||||
if(!ignore_bottom)
|
||||
new_baseturfs += target_baseturfs
|
||||
else if(base_len > ignore_bottom)
|
||||
if(base_len - ignore_bottom <= depth)
|
||||
new_baseturfs += target_baseturfs.Copy(ignore_bottom + 1)
|
||||
else
|
||||
new_baseturfs += target_baseturfs.Copy(base_len - depth)
|
||||
|
||||
var/turf/newT = copytarget.copyTurf(src)
|
||||
newT.baseturfs = new_baseturfs
|
||||
return newT
|
||||
|
||||
/turf/proc/AfterChange(flags) //called after a turf has been replaced in ChangeTurf()
|
||||
levelupdate()
|
||||
CalculateAdjacentTurfs()
|
||||
|
||||
//update firedoor adjacency
|
||||
var/list/turfs_to_check = get_adjacent_open_turfs(src) | src
|
||||
for(var/I in turfs_to_check)
|
||||
var/turf/T = I
|
||||
for(var/obj/machinery/door/firedoor/FD in T)
|
||||
FD.CalculateAffectingAreas()
|
||||
|
||||
queue_smooth_neighbors(src)
|
||||
|
||||
HandleTurfChange(src)
|
||||
|
||||
/turf/open/AfterChange(flags)
|
||||
..()
|
||||
RemoveLattice()
|
||||
if(!(flags & CHANGETURF_IGNORE_AIR))
|
||||
Assimilate_Air()
|
||||
|
||||
//////Assimilate Air//////
|
||||
/turf/open/proc/Assimilate_Air()
|
||||
var/turf_count = LAZYLEN(atmos_adjacent_turfs)
|
||||
if(blocks_air || !turf_count) //if there weren't any open turfs, no need to update.
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/total = new//Holders to assimilate air from nearby turfs
|
||||
var/list/total_gases = total.gases
|
||||
|
||||
for(var/T in atmos_adjacent_turfs)
|
||||
var/turf/open/S = T
|
||||
if(!S.air)
|
||||
continue
|
||||
var/list/S_gases = S.air.gases
|
||||
for(var/id in S_gases)
|
||||
ASSERT_GAS(id, total)
|
||||
total_gases[id][MOLES] += S_gases[id][MOLES]
|
||||
total.temperature += S.air.temperature
|
||||
|
||||
air.copy_from(total)
|
||||
|
||||
var/list/air_gases = air.gases
|
||||
for(var/id in air_gases)
|
||||
air_gases[id][MOLES] /= turf_count //Averages contents of the turfs, ignoring walls and the like
|
||||
|
||||
air.temperature /= turf_count
|
||||
SSair.add_to_active(src)
|
||||
|
||||
/turf/proc/ReplaceWithLattice()
|
||||
ScrapeAway()
|
||||
new /obj/structure/lattice(locate(x, y, z))
|
||||
@@ -58,21 +58,6 @@
|
||||
if("icon")
|
||||
SStitle.icon = icon
|
||||
|
||||
/turf/closed/indestructible/reebe
|
||||
name = "void"
|
||||
icon_state = "reebe"
|
||||
opacity = FALSE
|
||||
baseturf = /turf/closed/indestructible/reebe
|
||||
|
||||
/turf/closed/indestructible/reebe/ratvar_act()
|
||||
return
|
||||
|
||||
/turf/closed/indestructible/reebe/narsie_act()
|
||||
return
|
||||
|
||||
/turf/closed/indestructible/reebe/CollidedWith(atom/movable/AM)
|
||||
playsound(src, 'sound/effects/bamf.ogg', 25, TRUE)
|
||||
|
||||
/turf/closed/indestructible/riveted
|
||||
icon = 'icons/turf/walls/riveted.dmi'
|
||||
icon_state = "riveted"
|
||||
@@ -136,7 +121,7 @@
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
icon_state = "necro"
|
||||
explosion_block = 50
|
||||
baseturf = /turf/closed/indestructible/necropolis
|
||||
baseturfs = /turf/closed/indestructible/necropolis
|
||||
|
||||
/turf/closed/indestructible/necropolis/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
|
||||
underlay_appearance.icon = 'icons/turf/floors.dmi'
|
||||
@@ -150,7 +135,7 @@
|
||||
icon_state = "wall"
|
||||
canSmoothWith = list(/turf/closed/indestructible/riveted/boss, /turf/closed/indestructible/riveted/boss/see_through)
|
||||
explosion_block = 50
|
||||
baseturf = /turf/closed/indestructible/riveted/boss
|
||||
baseturfs = /turf/closed/indestructible/riveted/boss
|
||||
|
||||
/turf/closed/indestructible/riveted/boss/see_through
|
||||
opacity = FALSE
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
desc = "It's regarding you suspiciously."
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "necro1"
|
||||
baseturf = /turf/open/indestructible/necropolis
|
||||
baseturfs = /turf/open/indestructible/necropolis
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
|
||||
/turf/open/indestructible/necropolis/Initialize()
|
||||
@@ -45,7 +45,7 @@
|
||||
name = "necropolis floor"
|
||||
icon = 'icons/turf/boss_floors.dmi'
|
||||
icon_state = "boss"
|
||||
baseturf = /turf/open/indestructible/boss
|
||||
baseturfs = /turf/open/indestructible/boss
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
|
||||
/turf/open/indestructible/boss/air
|
||||
@@ -54,7 +54,7 @@
|
||||
/turf/open/indestructible/hierophant
|
||||
icon = 'icons/turf/floors/hierophant_floor.dmi'
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
baseturf = /turf/open/indestructible/hierophant
|
||||
baseturfs = /turf/open/indestructible/hierophant
|
||||
smooth = SMOOTH_TRUE
|
||||
|
||||
/turf/open/indestructible/hierophant/two
|
||||
@@ -71,7 +71,7 @@
|
||||
name = "cogmetal"
|
||||
desc = "Brass plating that gently radiates heat. For some reason, it reminds you of blood."
|
||||
icon_state = "reebe"
|
||||
baseturf = /turf/open/indestructible/clock_spawn_room
|
||||
baseturfs = /turf/open/indestructible/clock_spawn_room
|
||||
|
||||
/turf/open/indestructible/clock_spawn_room/Entered()
|
||||
..()
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/turf/open/chasm
|
||||
name = "chasm"
|
||||
desc = "Watch your step."
|
||||
baseturf = /turf/open/chasm
|
||||
baseturfs = /turf/open/chasm
|
||||
smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE
|
||||
icon = 'icons/turf/floors/chasms.dmi'
|
||||
icon_state = "smooth"
|
||||
@@ -55,7 +55,7 @@
|
||||
playsound(src, 'sound/weapons/genhit.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>You build a floor.</span>")
|
||||
// Create a floor, which has this chasm underneath it
|
||||
ChangeTurf(/turf/open/floor/plating, type)
|
||||
PlaceOnTop(/turf/open/floor/plating)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need one floor tile to build a floor!</span>")
|
||||
else
|
||||
@@ -67,7 +67,7 @@
|
||||
|
||||
// Naive "down" which just subtracts a z-level
|
||||
/turf/open/chasm/straight_down
|
||||
baseturf = /turf/open/chasm/straight_down
|
||||
baseturfs = /turf/open/chasm/straight_down
|
||||
|
||||
/turf/open/chasm/straight_down/Initialize()
|
||||
. = ..()
|
||||
@@ -78,7 +78,7 @@
|
||||
/turf/open/chasm/lavaland
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
planetary_atmos = TRUE
|
||||
baseturf = /turf/open/chasm/lavaland
|
||||
baseturfs = /turf/open/chasm/lavaland
|
||||
light_range = 1.9 //slightly less range than lava
|
||||
light_power = 0.65 //less bright, too
|
||||
light_color = LIGHT_COLOR_LAVA //let's just say you're falling into lava, that makes sense right
|
||||
@@ -89,7 +89,7 @@
|
||||
icon = 'icons/turf/floors/junglechasm.dmi'
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
planetary_atmos = TRUE
|
||||
baseturf = /turf/open/chasm/jungle
|
||||
baseturfs = /turf/open/chasm/jungle
|
||||
|
||||
/turf/open/chasm/jungle/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
|
||||
underlay_appearance.icon = 'icons/turf/floors.dmi'
|
||||
@@ -97,7 +97,7 @@
|
||||
return TRUE
|
||||
|
||||
/turf/open/chasm/jungle/straight_down
|
||||
baseturf = /turf/open/chasm/jungle/straight_down
|
||||
baseturfs = /turf/open/chasm/jungle/straight_down
|
||||
|
||||
/turf/open/chasm/jungle/straight_down/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -51,13 +51,13 @@
|
||||
if(severity != 1 && shielded && target != src)
|
||||
return
|
||||
if(target == src)
|
||||
src.ChangeTurf(src.baseturf)
|
||||
ScrapeAway()
|
||||
if(target != null)
|
||||
severity = 3
|
||||
|
||||
switch(severity)
|
||||
if(1)
|
||||
src.ChangeTurf(src.baseturf)
|
||||
ScrapeAway()
|
||||
if(2)
|
||||
switch(pick(1,2;75,3))
|
||||
if(1)
|
||||
@@ -65,7 +65,7 @@
|
||||
if(prob(33))
|
||||
new /obj/item/stack/sheet/metal(src)
|
||||
if(2)
|
||||
src.ChangeTurf(src.baseturf)
|
||||
ScrapeAway()
|
||||
if(3)
|
||||
if(prob(80))
|
||||
src.break_tile_to_plating()
|
||||
@@ -119,7 +119,7 @@
|
||||
/turf/open/floor/proc/make_plating()
|
||||
return ChangeTurf(/turf/open/floor/plating)
|
||||
|
||||
/turf/open/floor/ChangeTurf(path, new_baseturf, defer_change = FALSE, ignore_air = FALSE, forceop = FALSE)
|
||||
/turf/open/floor/ChangeTurf(path, new_baseturf, flags)
|
||||
if(!isfloorturf(src))
|
||||
return ..() //fucking turfs switch the fucking src of the fucking running procs
|
||||
if(!ispath(path, /turf/open/floor))
|
||||
@@ -202,7 +202,7 @@
|
||||
ChangeTurf(/turf/open/floor/clockwork)
|
||||
|
||||
/turf/open/floor/acid_melt()
|
||||
ChangeTurf(baseturf)
|
||||
ScrapeAway()
|
||||
|
||||
/turf/open/floor/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
switch(the_rcd.mode)
|
||||
@@ -223,7 +223,7 @@
|
||||
switch(passed_mode)
|
||||
if(RCD_FLOORWALL)
|
||||
to_chat(user, "<span class='notice'>You build a wall.</span>")
|
||||
ChangeTurf(/turf/closed/wall)
|
||||
PlaceOnTop(/turf/closed/wall)
|
||||
return TRUE
|
||||
if(RCD_AIRLOCK)
|
||||
if(locate(/obj/machinery/door/airlock) in src)
|
||||
@@ -244,10 +244,9 @@
|
||||
A.autoclose = TRUE
|
||||
return TRUE
|
||||
if(RCD_DECONSTRUCT)
|
||||
if(istype(src, baseturf))
|
||||
if(ScrapeAway() == src)
|
||||
return FALSE
|
||||
to_chat(user, "<span class='notice'>You deconstruct [src].</span>")
|
||||
ChangeTurf(baseturf)
|
||||
return TRUE
|
||||
if(RCD_WINDOWGRILLE)
|
||||
if(locate(/obj/structure/grille) in src)
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
icon_state = "light_off"
|
||||
|
||||
|
||||
/turf/open/floor/light/ChangeTurf(path, new_baseturf, defer_change = FALSE, ignore_air = FALSE, forceop = FALSE)
|
||||
/turf/open/floor/light/ChangeTurf(path, new_baseturf, flags)
|
||||
set_light(0)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
name = "clockwork floor"
|
||||
desc = "Tightly-pressed brass tiles. They emit minute vibration."
|
||||
icon_state = "plating"
|
||||
baseturf = /turf/open/floor/clockwork
|
||||
baseturfs = /turf/open/floor/clockwork
|
||||
var/uses_overlay = TRUE
|
||||
var/obj/effect/clockwork/overlay/floor/realappearence
|
||||
|
||||
@@ -161,9 +161,7 @@
|
||||
return ..()
|
||||
|
||||
/turf/open/floor/clockwork/ReplaceWithLattice()
|
||||
if(baseturf == type)
|
||||
return
|
||||
..()
|
||||
. = ..()
|
||||
for(var/obj/structure/lattice/L in src)
|
||||
L.ratvar_act()
|
||||
|
||||
@@ -196,7 +194,7 @@
|
||||
L.adjustToxLoss(-3, TRUE, TRUE)
|
||||
|
||||
/turf/open/floor/clockwork/attackby(obj/item/I, mob/living/user, params)
|
||||
if(baseturf == type)
|
||||
if(baseturfs == type)
|
||||
return
|
||||
if(istype(I, /obj/item/crowbar))
|
||||
user.visible_message("<span class='notice'>[user] begins slowly prying up [src]...</span>", "<span class='notice'>You begin painstakingly prying up [src]...</span>")
|
||||
@@ -225,7 +223,7 @@
|
||||
name = "cogplate"
|
||||
desc = "Warm brass plating. You can feel it gently vibrating, as if machinery is on the other side."
|
||||
icon_state = "reebe"
|
||||
baseturf = /turf/open/floor/clockwork/reebe
|
||||
baseturfs = /turf/open/floor/clockwork/reebe
|
||||
uses_overlay = FALSE
|
||||
|
||||
/turf/open/floor/bluespace
|
||||
|
||||
@@ -109,10 +109,10 @@
|
||||
if(prob(I.force * 20 - 25))
|
||||
user.visible_message("<span class='danger'>[user] smashes through [src]!</span>", \
|
||||
"<span class='danger'>You smash through [src] with [I]!</span>")
|
||||
ChangeTurf(baseturf)
|
||||
ScrapeAway()
|
||||
else
|
||||
to_chat(user, "<span class='danger'>You hit [src], to no effect!</span>")
|
||||
|
||||
/turf/open/floor/plating/foam/ex_act()
|
||||
..()
|
||||
ChangeTurf(baseturf)
|
||||
ScrapeAway()
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
/turf/open/floor/plating/asteroid //floor piece
|
||||
name = "asteroid sand"
|
||||
baseturf = /turf/open/floor/plating/asteroid
|
||||
baseturfs = /turf/open/floor/plating/asteroid
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "asteroid"
|
||||
icon_plating = "asteroid"
|
||||
@@ -61,7 +61,7 @@
|
||||
/turf/open/floor/plating/asteroid/singularity_act()
|
||||
if(turf_z_is_planet(src))
|
||||
return ..()
|
||||
ChangeTurf(/turf/open/space)
|
||||
ScrapeAway()
|
||||
|
||||
/turf/open/floor/plating/asteroid/ex_act(severity, target)
|
||||
. = SendSignal(COMSIG_ATOM_EX_ACT, severity, target)
|
||||
@@ -70,7 +70,7 @@
|
||||
|
||||
/turf/open/floor/plating/asteroid/basalt
|
||||
name = "volcanic floor"
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt
|
||||
baseturfs = /turf/open/floor/plating/asteroid/basalt
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "basalt"
|
||||
icon_plating = "basalt"
|
||||
@@ -79,7 +79,7 @@
|
||||
floor_variance = 15
|
||||
|
||||
/turf/open/floor/plating/asteroid/basalt/lava //lava underneath
|
||||
baseturf = /turf/open/lava/smooth
|
||||
baseturfs = /turf/open/lava/smooth
|
||||
|
||||
/turf/open/floor/plating/asteroid/basalt/airless
|
||||
initial_gas_mix = "TEMP=2.7"
|
||||
@@ -103,7 +103,7 @@
|
||||
/turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
planetary_atmos = TRUE
|
||||
baseturf = /turf/open/lava/smooth/lava_land_surface
|
||||
baseturfs = /turf/open/lava/smooth/lava_land_surface
|
||||
|
||||
|
||||
|
||||
@@ -206,7 +206,7 @@
|
||||
if(istype(tunnel))
|
||||
// Small chance to have forks in our tunnel; otherwise dig our tunnel.
|
||||
if(i > 3 && prob(20))
|
||||
var/turf/open/floor/plating/asteroid/airless/cave/C = tunnel.ChangeTurf(data_having_type,FALSE,FALSE,TRUE)
|
||||
var/turf/open/floor/plating/asteroid/airless/cave/C = tunnel.ChangeTurf(data_having_type, null, CHANGETURF_IGNORE_AIR)
|
||||
C.going_backwards = FALSE
|
||||
C.produce_tunnel_from_data(rand(10, 15), dir)
|
||||
else
|
||||
@@ -232,7 +232,7 @@
|
||||
SpawnFlora(T)
|
||||
|
||||
SpawnMonster(T)
|
||||
T.ChangeTurf(turf_type,FALSE,FALSE,TRUE)
|
||||
T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR)
|
||||
|
||||
/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T)
|
||||
if(prob(30))
|
||||
@@ -279,7 +279,7 @@
|
||||
name = "snow"
|
||||
desc = "Looks cold."
|
||||
icon = 'icons/turf/snow.dmi'
|
||||
baseturf = /turf/open/floor/plating/asteroid/snow
|
||||
baseturfs = /turf/open/floor/plating/asteroid/snow
|
||||
icon_state = "snow"
|
||||
icon_plating = "snow"
|
||||
initial_gas_mix = "TEMP=180"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "Upon closer examination, it's still dirt."
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "dirt"
|
||||
baseturf = /turf/open/chasm/jungle/straight_down
|
||||
baseturfs = /turf/open/chasm/jungle/straight_down
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
planetary_atmos = TRUE
|
||||
attachment_holes = FALSE
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
smooth = SMOOTH_MORE|SMOOTH_BORDER
|
||||
var/smooth_icon = 'icons/turf/floors/ash.dmi'
|
||||
desc = "The ground is covered in volcanic ash."
|
||||
baseturf = /turf/open/floor/plating/ashplanet/wateryrock //I assume this will be a chasm eventually, once this becomes an actual surface
|
||||
baseturfs = /turf/open/floor/plating/ashplanet/wateryrock //I assume this will be a chasm eventually, once this becomes an actual surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
planetary_atmos = TRUE
|
||||
attachment_holes = FALSE
|
||||
@@ -91,24 +91,24 @@
|
||||
name = "sand"
|
||||
desc = "Surf's up."
|
||||
icon_state = "sand"
|
||||
baseturf = /turf/open/floor/plating/beach/sand
|
||||
baseturfs = /turf/open/floor/plating/beach/sand
|
||||
|
||||
/turf/open/floor/plating/beach/coastline_t
|
||||
name = "coastline"
|
||||
desc = "Tide's high tonight. Charge your batons."
|
||||
icon_state = "sandwater_t"
|
||||
baseturf = /turf/open/floor/plating/beach/coastline_t
|
||||
baseturfs = /turf/open/floor/plating/beach/coastline_t
|
||||
|
||||
/turf/open/floor/plating/beach/coastline_b
|
||||
name = "coastline"
|
||||
icon_state = "sandwater_b"
|
||||
baseturf = /turf/open/floor/plating/beach/coastline_b
|
||||
baseturfs = /turf/open/floor/plating/beach/coastline_b
|
||||
|
||||
/turf/open/floor/plating/beach/water
|
||||
name = "water"
|
||||
desc = "You get the feeling that nobody's bothered to actually make this water functional..."
|
||||
icon_state = "water"
|
||||
baseturf = /turf/open/floor/plating/beach/water
|
||||
baseturfs = /turf/open/floor/plating/beach/water
|
||||
|
||||
|
||||
/turf/open/floor/plating/ironsand
|
||||
@@ -129,7 +129,7 @@
|
||||
icon = 'icons/turf/snow.dmi'
|
||||
icon_state = "ice"
|
||||
temperature = 180
|
||||
baseturf = /turf/open/floor/plating/ice
|
||||
baseturfs = /turf/open/floor/plating/ice
|
||||
slowdown = 1
|
||||
wet = TURF_WET_PERMAFROST
|
||||
attachment_holes = FALSE
|
||||
|
||||
@@ -48,14 +48,14 @@
|
||||
if(severity != 1 && shielded && target != src)
|
||||
return
|
||||
if(target == src)
|
||||
src.ChangeTurf(src.baseturf)
|
||||
ScrapeAway()
|
||||
return
|
||||
switch(severity)
|
||||
if(1)
|
||||
if(prob(80))
|
||||
ReplaceWithLattice()
|
||||
else if(prob(50))
|
||||
ChangeTurf(src.baseturf)
|
||||
ScrapeAway()
|
||||
else
|
||||
make_plating(1)
|
||||
if(2)
|
||||
@@ -122,7 +122,7 @@
|
||||
be_removed()
|
||||
return ..()
|
||||
|
||||
/turf/open/floor/engine/cult/ChangeTurf(path, new_baseturf, defer_change = FALSE, ignore_air = FALSE, forceop = FALSE)
|
||||
/turf/open/floor/engine/cult/ChangeTurf(path, new_baseturf, flags)
|
||||
if(path != type)
|
||||
be_removed()
|
||||
return ..()
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
name = "lava"
|
||||
icon_state = "lava"
|
||||
gender = PLURAL //"That's some lava."
|
||||
baseturf = /turf/open/lava //lava all the way down
|
||||
baseturfs = /turf/open/lava //lava all the way down
|
||||
slowdown = 2
|
||||
|
||||
light_range = 2
|
||||
@@ -128,7 +128,7 @@
|
||||
|
||||
/turf/open/lava/smooth
|
||||
name = "lava"
|
||||
baseturf = /turf/open/lava/smooth
|
||||
baseturfs = /turf/open/lava/smooth
|
||||
icon = 'icons/turf/floors/lava.dmi'
|
||||
icon_state = "unsmooth"
|
||||
smooth = SMOOTH_MORE | SMOOTH_BORDER
|
||||
@@ -137,7 +137,7 @@
|
||||
/turf/open/lava/smooth/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
planetary_atmos = TRUE
|
||||
baseturf = /turf/open/chasm/lavaland
|
||||
baseturfs = /turf/open/chasm/lavaland
|
||||
|
||||
/turf/open/lava/smooth/airless
|
||||
initial_gas_mix = "TEMP=2.7"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
var/smooth_icon = 'icons/turf/smoothrocks.dmi'
|
||||
smooth = SMOOTH_MORE|SMOOTH_BORDER
|
||||
canSmoothWith
|
||||
baseturf = /turf/open/floor/plating/asteroid/airless
|
||||
baseturfs = /turf/open/floor/plating/asteroid/airless
|
||||
initial_gas_mix = "TEMP=2.7"
|
||||
opacity = 1
|
||||
density = TRUE
|
||||
@@ -78,7 +78,10 @@
|
||||
SSblackbox.record_feedback("tally", "ore_mined", 1, mineralType)
|
||||
for(var/obj/effect/temp_visual/mining_overlay/M in src)
|
||||
qdel(M)
|
||||
ChangeTurf(turf_type, FALSE, defer_change)
|
||||
var/flags = NONE
|
||||
if(defer_change) // TODO: make the defer change var a var for any changeturf flag
|
||||
flags = CHANGETURF_DEFER_CHANGE
|
||||
ChangeTurf(turf_type, null, flags)
|
||||
addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE)
|
||||
playsound(src, 'sound/effects/break_stone.ogg', 50, 1) //beautiful destruction
|
||||
|
||||
@@ -111,7 +114,7 @@
|
||||
return
|
||||
|
||||
/turf/closed/mineral/acid_melt()
|
||||
ChangeTurf(baseturf)
|
||||
ScrapeAway()
|
||||
|
||||
/turf/closed/mineral/ex_act(severity, target)
|
||||
..()
|
||||
@@ -153,7 +156,7 @@
|
||||
M.mineralAmt = rand(1, 5)
|
||||
M.environment_type = src.environment_type
|
||||
M.turf_type = src.turf_type
|
||||
M.baseturf = src.baseturf
|
||||
M.baseturfs = src.baseturfs
|
||||
src = M
|
||||
M.levelupdate()
|
||||
|
||||
@@ -168,7 +171,7 @@
|
||||
/turf/closed/mineral/random/high_chance/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/open/lava/smooth/lava_land_surface
|
||||
baseturfs = /turf/open/lava/smooth/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
mineralSpawnChanceList = list(
|
||||
@@ -189,7 +192,7 @@
|
||||
/turf/closed/mineral/random/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/open/lava/smooth/lava_land_surface
|
||||
baseturfs = /turf/open/lava/smooth/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
|
||||
@@ -211,7 +214,7 @@
|
||||
/turf/closed/mineral/random/labormineral/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/open/lava/smooth/lava_land_surface
|
||||
baseturfs = /turf/open/lava/smooth/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
mineralSpawnChanceList = list(
|
||||
@@ -230,7 +233,7 @@
|
||||
/turf/closed/mineral/iron/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
|
||||
@@ -244,7 +247,7 @@
|
||||
/turf/closed/mineral/uranium/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
|
||||
@@ -258,7 +261,7 @@
|
||||
/turf/closed/mineral/diamond/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
|
||||
@@ -272,7 +275,7 @@
|
||||
/turf/closed/mineral/gold/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
|
||||
@@ -286,7 +289,7 @@
|
||||
/turf/closed/mineral/silver/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
|
||||
@@ -300,7 +303,7 @@
|
||||
/turf/closed/mineral/titanium/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
|
||||
@@ -314,7 +317,7 @@
|
||||
/turf/closed/mineral/plasma/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
|
||||
@@ -337,7 +340,7 @@
|
||||
/turf/closed/mineral/bscrystal/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
|
||||
@@ -345,13 +348,13 @@
|
||||
/turf/closed/mineral/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt
|
||||
baseturfs = /turf/open/floor/plating/asteroid/basalt
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
|
||||
/turf/closed/mineral/volcanic/lava_land_surface
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/open/lava/smooth/lava_land_surface
|
||||
baseturfs = /turf/open/lava/smooth/lava_land_surface
|
||||
defer_change = 1
|
||||
|
||||
/turf/closed/mineral/ash_rock //wall piece
|
||||
@@ -361,7 +364,7 @@
|
||||
icon_state = "rock2"
|
||||
smooth = SMOOTH_MORE|SMOOTH_BORDER
|
||||
canSmoothWith = list (/turf/closed)
|
||||
baseturf = /turf/open/floor/plating/ashplanet/wateryrock
|
||||
baseturfs = /turf/open/floor/plating/ashplanet/wateryrock
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
environment_type = "waste"
|
||||
turf_type = /turf/open/floor/plating/ashplanet/rocky
|
||||
@@ -459,13 +462,16 @@
|
||||
G.quality = 2
|
||||
G.icon_state = "Gibtonite ore 2"
|
||||
|
||||
ChangeTurf(turf_type, FALSE, defer_change)
|
||||
var/flags = NONE
|
||||
if(defer_change)
|
||||
flags = CHANGETURF_DEFER_CHANGE
|
||||
ChangeTurf(turf_type, null, flags)
|
||||
addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE)
|
||||
|
||||
|
||||
/turf/closed/mineral/gibtonite/volcanic
|
||||
environment_type = "basalt"
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "void"
|
||||
icon_state = "reebemap"
|
||||
layer = SPACE_LAYER
|
||||
baseturf = /turf/open/indestructible/reebe_void
|
||||
baseturfs = /turf/open/indestructible/reebe_void
|
||||
planetary_atmos = TRUE
|
||||
|
||||
/turf/open/indestructible/reebe_void/Initialize(mapload)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
continue
|
||||
W.connected = 1
|
||||
var/turf/cur_turf = get_turf(W)
|
||||
cur_turf.ChangeTurf(turf_type,FALSE,FALSE,TRUE)
|
||||
cur_turf.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR)
|
||||
var/turf/target_turf = get_turf(pick(river_nodes - W))
|
||||
if(!target_turf)
|
||||
break
|
||||
@@ -49,7 +49,7 @@
|
||||
cur_turf = get_step(cur_turf, cur_dir)
|
||||
continue
|
||||
else
|
||||
var/turf/river_turf = cur_turf.ChangeTurf(turf_type,FALSE,FALSE,TRUE)
|
||||
var/turf/river_turf = cur_turf.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR)
|
||||
river_turf.Spread(25, 11, whitelist_area)
|
||||
|
||||
for(var/WP in river_nodes)
|
||||
@@ -85,16 +85,16 @@
|
||||
|
||||
for(var/F in cardinal_turfs) //cardinal turfs are always changed but don't always spread
|
||||
var/turf/T = F
|
||||
if(!istype(T, logged_turf_type) && T.ChangeTurf(type,FALSE,FALSE,TRUE) && prob(probability))
|
||||
if(!istype(T, logged_turf_type) && T.ChangeTurf(type, null, CHANGETURF_IGNORE_AIR) && prob(probability))
|
||||
T.Spread(probability - prob_loss, prob_loss, whitelisted_area)
|
||||
|
||||
for(var/F in diagonal_turfs) //diagonal turfs only sometimes change, but will always spread if changed
|
||||
var/turf/T = F
|
||||
if(!istype(T, logged_turf_type) && prob(probability) && T.ChangeTurf(type,FALSE,FALSE,TRUE))
|
||||
if(!istype(T, logged_turf_type) && prob(probability) && T.ChangeTurf(type, null, CHANGETURF_IGNORE_AIR))
|
||||
T.Spread(probability - prob_loss, prob_loss, whitelisted_area)
|
||||
else if(ismineralturf(T))
|
||||
var/turf/closed/mineral/M = T
|
||||
M.ChangeTurf(M.turf_type,FALSE,FALSE,TRUE)
|
||||
M.ChangeTurf(M.turf_type, null, CHANGETURF_IGNORE_AIR)
|
||||
|
||||
|
||||
#undef RANDOM_UPPER_X
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
sheet_type = /obj/item/stack/tile/brass
|
||||
sheet_amount = 1
|
||||
girder_type = /obj/structure/destructible/clockwork/wall_gear
|
||||
baseturf = /turf/open/floor/clockwork/reebe
|
||||
baseturfs = /turf/open/floor/clockwork/reebe
|
||||
var/heated
|
||||
var/obj/effect/clockwork/overlay/wall/realappearence
|
||||
|
||||
@@ -88,13 +88,13 @@
|
||||
/turf/closed/wall/clockwork/dismantle_wall(devastated=0, explode=0)
|
||||
if(devastated)
|
||||
devastate_wall()
|
||||
ChangeTurf(/turf/open/floor/plating)
|
||||
ScrapeAway()
|
||||
else
|
||||
playsound(src, 'sound/items/welder.ogg', 100, 1)
|
||||
var/newgirder = break_wall()
|
||||
if(newgirder) //maybe we want a gear!
|
||||
transfer_fingerprints_to(newgirder)
|
||||
ChangeTurf(/turf/open/floor/clockwork)
|
||||
ScrapeAway()
|
||||
|
||||
for(var/obj/O in src) //Eject contents!
|
||||
if(istype(O, /obj/structure/sign/poster))
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT
|
||||
heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall
|
||||
|
||||
baseturfs = /turf/open/floor/plating
|
||||
|
||||
var/hardness = 40 //lower numbers are harder. Used to determine the probability of a hulk smashing through.
|
||||
var/slicing_duration = 100 //default time taken to slice the wall
|
||||
var/sheet_type = /obj/item/stack/sheet/metal
|
||||
@@ -78,7 +80,7 @@
|
||||
var/obj/structure/sign/poster/P = O
|
||||
P.roll_and_drop(src)
|
||||
|
||||
ChangeTurf(/turf/open/floor/plating)
|
||||
ScrapeAway()
|
||||
|
||||
/turf/closed/wall/proc/break_wall()
|
||||
new sheet_type(src, sheet_amount)
|
||||
@@ -96,7 +98,7 @@
|
||||
switch(severity)
|
||||
if(1)
|
||||
//SN src = null
|
||||
var/turf/NT = ChangeTurf(baseturf)
|
||||
var/turf/NT = ScrapeAway()
|
||||
NT.contents_explosion(severity, target)
|
||||
return
|
||||
if(2)
|
||||
@@ -294,7 +296,7 @@
|
||||
switch(passed_mode)
|
||||
if(RCD_DECONSTRUCT)
|
||||
to_chat(user, "<span class='notice'>You deconstruct the wall.</span>")
|
||||
ChangeTurf(/turf/open/floor/plating)
|
||||
ScrapeAway()
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "Shallow water."
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "riverwater"
|
||||
baseturf = /turf/open/chasm/lavaland
|
||||
baseturfs = /turf/open/chasm/lavaland
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
planetary_atmos = TRUE
|
||||
slowdown = 1
|
||||
|
||||
@@ -118,7 +118,7 @@
|
||||
qdel(L)
|
||||
playsound(src, 'sound/weapons/genhit.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>You build a floor.</span>")
|
||||
ChangeTurf(/turf/open/floor/plating)
|
||||
PlaceOnTop(/turf/open/floor/plating)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need one floor tile to build a floor!</span>")
|
||||
else
|
||||
@@ -192,7 +192,7 @@
|
||||
switch(passed_mode)
|
||||
if(RCD_FLOORWALL)
|
||||
to_chat(user, "<span class='notice'>You build a floor.</span>")
|
||||
ChangeTurf(/turf/open/floor/plating)
|
||||
PlaceOnTop(/turf/open/floor/plating)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/turf/open/space/transit
|
||||
icon_state = "black"
|
||||
dir = SOUTH
|
||||
baseturf = /turf/open/space/transit
|
||||
baseturfs = /turf/open/space/transit
|
||||
flags_1 = NOJAUNT_1 //This line goes out to every wizard that ever managed to escape the den. I'm sorry.
|
||||
explosion_block = INFINITY
|
||||
|
||||
|
||||
+59
-154
@@ -3,7 +3,13 @@
|
||||
level = 1
|
||||
|
||||
var/intact = 1
|
||||
var/turf/baseturf = /turf/open/space
|
||||
|
||||
// baseturfs can be either a list or a single turf type.
|
||||
// In class definition like here it should always be a single type.
|
||||
// A list will be created in initialization that figures out the baseturf's baseturf etc.
|
||||
// In the case of a list it is sorted from bottom layer to top.
|
||||
// This shouldn't be modified directly, use the helper procs.
|
||||
var/list/baseturfs = /turf/open/space
|
||||
|
||||
var/temperature = T20C
|
||||
var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed
|
||||
@@ -35,6 +41,8 @@
|
||||
stack_trace("Warning: [src]([type]) initialized multiple times!")
|
||||
initialized = TRUE
|
||||
|
||||
assemble_baseturfs()
|
||||
|
||||
levelupdate()
|
||||
if(smooth)
|
||||
queue_smooth(src)
|
||||
@@ -180,6 +188,55 @@
|
||||
/turf/proc/is_plasteel_floor()
|
||||
return FALSE
|
||||
|
||||
// A proc in case it needs to be recreated or badmins want to change the baseturfs
|
||||
/turf/proc/assemble_baseturfs(turf/fake_baseturf_type)
|
||||
var/static/list/created_baseturf_lists = list()
|
||||
var/turf/current_target
|
||||
if(fake_baseturf_type)
|
||||
if(length(fake_baseturf_type)) // We were given a list, just apply it and move on
|
||||
baseturfs = fake_baseturf_type
|
||||
return
|
||||
current_target = fake_baseturf_type
|
||||
else
|
||||
if(length(baseturfs))
|
||||
return // No replacement baseturf has been given and the current baseturfs value is already a list/assembled
|
||||
if(!baseturfs)
|
||||
current_target = initial(baseturfs) || type // This should never happen but just in case...
|
||||
stack_trace("baseturfs var was null for [type]. Failsafe activated and it has been given a new baseturfs value of [current_target].")
|
||||
else
|
||||
current_target = baseturfs
|
||||
|
||||
// If we've made the output before we don't need to regenerate it
|
||||
if(created_baseturf_lists[current_target])
|
||||
var/list/premade_baseturfs = created_baseturf_lists[current_target]
|
||||
if(length(premade_baseturfs))
|
||||
baseturfs = premade_baseturfs.Copy()
|
||||
else
|
||||
baseturfs = premade_baseturfs
|
||||
return baseturfs
|
||||
|
||||
var/turf/next_target = initial(current_target.baseturfs)
|
||||
//Most things only have 1 baseturf so this loop won't run in most cases
|
||||
if(current_target == next_target)
|
||||
baseturfs = current_target
|
||||
created_baseturf_lists[current_target] = current_target
|
||||
return current_target
|
||||
var/list/new_baseturfs = list(current_target)
|
||||
for(var/i=0;current_target != next_target;i++)
|
||||
if(i > 100)
|
||||
// A baseturfs list over 100 members long is silly
|
||||
// Because of how this is all structured it will only runtime/message once per type
|
||||
stack_trace("A turf <[type]> created a baseturfs list over 100 members long. This is most likely an infinite loop.")
|
||||
message_admins("A turf <[type]> created a baseturfs list over 100 members long. This is most likely an infinite loop.")
|
||||
break
|
||||
new_baseturfs.Insert(1, next_target)
|
||||
current_target = next_target
|
||||
next_target = initial(current_target.baseturfs)
|
||||
|
||||
baseturfs = new_baseturfs
|
||||
created_baseturf_lists[new_baseturfs[new_baseturfs.len]] = new_baseturfs.Copy()
|
||||
return new_baseturfs
|
||||
|
||||
/turf/proc/levelupdate()
|
||||
for(var/obj/O in src)
|
||||
if(O.level == 1)
|
||||
@@ -197,119 +254,6 @@
|
||||
if(L)
|
||||
qdel(L)
|
||||
|
||||
//wrapper for ChangeTurf()s that you want to prevent/affect without overriding ChangeTurf() itself
|
||||
/turf/proc/TerraformTurf(path, new_baseturf, defer_change = FALSE, ignore_air = FALSE, forceop = FALSE)
|
||||
return ChangeTurf(path, new_baseturf, defer_change, ignore_air, forceop)
|
||||
|
||||
//Creates a new turf
|
||||
/turf/proc/ChangeTurf(path, new_baseturf, defer_change = FALSE, ignore_air = FALSE, forceop = FALSE)
|
||||
if(!path)
|
||||
return
|
||||
if(!GLOB.use_preloader && path == type && !forceop) // Don't no-op if the map loader requires it to be reconstructed
|
||||
return src
|
||||
|
||||
var/old_opacity = opacity
|
||||
var/old_dynamic_lighting = dynamic_lighting
|
||||
var/old_affecting_lights = affecting_lights
|
||||
var/old_lighting_object = lighting_object
|
||||
var/old_corners = corners
|
||||
|
||||
var/old_exl = explosion_level
|
||||
var/old_exi = explosion_id
|
||||
var/old_bp = blueprint_data
|
||||
blueprint_data = null
|
||||
|
||||
var/old_baseturf = baseturf
|
||||
changing_turf = TRUE
|
||||
|
||||
qdel(src) //Just get the side effects and call Destroy
|
||||
var/turf/W = new path(src)
|
||||
|
||||
if(new_baseturf)
|
||||
W.baseturf = new_baseturf
|
||||
else
|
||||
W.baseturf = old_baseturf
|
||||
|
||||
W.explosion_id = old_exi
|
||||
W.explosion_level = old_exl
|
||||
|
||||
if(!defer_change)
|
||||
W.AfterChange(ignore_air)
|
||||
|
||||
W.blueprint_data = old_bp
|
||||
|
||||
if(SSlighting.initialized)
|
||||
recalc_atom_opacity()
|
||||
lighting_object = old_lighting_object
|
||||
affecting_lights = old_affecting_lights
|
||||
corners = old_corners
|
||||
if (old_opacity != opacity || dynamic_lighting != old_dynamic_lighting)
|
||||
reconsider_lights()
|
||||
|
||||
if (dynamic_lighting != old_dynamic_lighting)
|
||||
if (IS_DYNAMIC_LIGHTING(src))
|
||||
lighting_build_overlay()
|
||||
else
|
||||
lighting_clear_overlay()
|
||||
|
||||
for(var/turf/open/space/S in RANGE_TURFS(1, src)) //RANGE_TURFS is in code\__HELPERS\game.dm
|
||||
S.update_starlight()
|
||||
|
||||
return W
|
||||
|
||||
/turf/proc/AfterChange(ignore_air = FALSE) //called after a turf has been replaced in ChangeTurf()
|
||||
levelupdate()
|
||||
CalculateAdjacentTurfs()
|
||||
|
||||
//update firedoor adjacency
|
||||
var/list/turfs_to_check = get_adjacent_open_turfs(src) | src
|
||||
for(var/I in turfs_to_check)
|
||||
var/turf/T = I
|
||||
for(var/obj/machinery/door/firedoor/FD in T)
|
||||
FD.CalculateAffectingAreas()
|
||||
|
||||
queue_smooth_neighbors(src)
|
||||
|
||||
HandleTurfChange(src)
|
||||
|
||||
/turf/open/AfterChange(ignore_air)
|
||||
..()
|
||||
RemoveLattice()
|
||||
if(!ignore_air)
|
||||
Assimilate_Air()
|
||||
|
||||
//////Assimilate Air//////
|
||||
/turf/open/proc/Assimilate_Air()
|
||||
var/turf_count = LAZYLEN(atmos_adjacent_turfs)
|
||||
if(blocks_air || !turf_count) //if there weren't any open turfs, no need to update.
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/total = new//Holders to assimilate air from nearby turfs
|
||||
var/list/total_gases = total.gases
|
||||
|
||||
for(var/T in atmos_adjacent_turfs)
|
||||
var/turf/open/S = T
|
||||
if(!S.air)
|
||||
continue
|
||||
var/list/S_gases = S.air.gases
|
||||
for(var/id in S_gases)
|
||||
ASSERT_GAS(id, total)
|
||||
total_gases[id][MOLES] += S_gases[id][MOLES]
|
||||
total.temperature += S.air.temperature
|
||||
|
||||
air.copy_from(total)
|
||||
|
||||
var/list/air_gases = air.gases
|
||||
for(var/id in air_gases)
|
||||
air_gases[id][MOLES] /= turf_count //Averages contents of the turfs, ignoring walls and the like
|
||||
|
||||
air.temperature /= turf_count
|
||||
SSair.add_to_active(src)
|
||||
|
||||
/turf/proc/ReplaceWithLattice()
|
||||
ChangeTurf(baseturf)
|
||||
new /obj/structure/lattice(locate(x, y, z))
|
||||
|
||||
/turf/proc/phase_damage_creatures(damage,mob/U = null)//>Ninja Code. Hurts and knocks out creatures on this turf //NINJACODE
|
||||
for(var/mob/living/M in src)
|
||||
if(M==U)
|
||||
@@ -361,7 +305,7 @@
|
||||
continue
|
||||
if(O.invisibility == INVISIBILITY_MAXIMUM)
|
||||
O.singularity_act()
|
||||
ChangeTurf(src.baseturf)
|
||||
ScrapeAway()
|
||||
return(2)
|
||||
|
||||
/turf/proc/can_have_cabling()
|
||||
@@ -437,21 +381,6 @@
|
||||
if(!SSticker.HasRoundStarted())
|
||||
add_blueprints(AM)
|
||||
|
||||
/turf/proc/empty(turf_type=/turf/open/space, baseturf_type, list/ignore_typecache, forceop = FALSE)
|
||||
// Remove all atoms except observers, landmarks, docking ports
|
||||
var/static/list/ignored_atoms = typecacheof(list(/mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object))
|
||||
var/list/allowed_contents = typecache_filter_list_reverse(GetAllContentsIgnoring(ignore_typecache), ignored_atoms)
|
||||
allowed_contents -= src
|
||||
for(var/i in 1 to allowed_contents.len)
|
||||
var/thing = allowed_contents[i]
|
||||
qdel(thing, force=TRUE)
|
||||
|
||||
var/turf/newT = ChangeTurf(turf_type, baseturf_type, FALSE, FALSE, forceop)
|
||||
|
||||
SSair.remove_from_active(newT)
|
||||
newT.CalculateAdjacentTurfs()
|
||||
SSair.add_to_active(newT,1)
|
||||
|
||||
/turf/proc/is_transition_turf()
|
||||
return
|
||||
|
||||
@@ -473,33 +402,9 @@
|
||||
if(!has_acid_effect)
|
||||
new acid_type(src, acidpwr, acid_volume)
|
||||
|
||||
|
||||
/turf/proc/acid_melt()
|
||||
return
|
||||
|
||||
|
||||
/turf/proc/copyTurf(turf/T)
|
||||
if(T.type != type)
|
||||
var/obj/O
|
||||
if(underlays.len) //we have underlays, which implies some sort of transparency, so we want to a snapshot of the previous turf as an underlay
|
||||
O = new()
|
||||
O.underlays.Add(T)
|
||||
T.ChangeTurf(type)
|
||||
for(var/group in decals)
|
||||
T.add_decal(decals[group],group)
|
||||
if(underlays.len)
|
||||
T.underlays = O.underlays
|
||||
if(T.icon_state != icon_state)
|
||||
T.icon_state = icon_state
|
||||
if(T.icon != icon)
|
||||
T.icon = icon
|
||||
if(color)
|
||||
T.atom_colours = atom_colours.Copy()
|
||||
T.update_atom_colour()
|
||||
if(T.dir != dir)
|
||||
T.setDir(dir)
|
||||
return T
|
||||
|
||||
/turf/handle_fall(mob/faller, forced)
|
||||
faller.lying = pick(90, 270)
|
||||
if(!forced)
|
||||
|
||||
@@ -472,7 +472,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if(!holder)
|
||||
to_chat(src, "Only administrators may use this command.")
|
||||
return
|
||||
var/input = input(usr, "Please enter anything you want. Anything. Serious.", "What?", "") as message|null
|
||||
var/input = input(usr, "Enter a Command Report. Ensure it makes sense IC.", "What?", "") as message|null
|
||||
if(!input)
|
||||
return
|
||||
|
||||
@@ -523,7 +523,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
if(isturf(D))
|
||||
var/turf/T = D
|
||||
T.ChangeTurf(T.baseturf)
|
||||
T.ScrapeAway()
|
||||
else
|
||||
qdel(D)
|
||||
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
else
|
||||
chance_of_deletion = 100
|
||||
if(prob(chance_of_deletion))
|
||||
T.ChangeTurf(T.baseturf)
|
||||
T.ScrapeAway()
|
||||
else
|
||||
T.to_be_destroyed = FALSE
|
||||
T.max_fire_temperature_sustained = 0
|
||||
|
||||
@@ -75,7 +75,8 @@
|
||||
|
||||
//Logs all hrefs, except chat pings
|
||||
if(!(href_list["_src_"] == "chat" && href_list["proc"] == "ping" && LAZYLEN(href_list) == 2))
|
||||
WRITE_FILE(GLOB.world_href_log, "<small>[time_stamp(show_ds = TRUE)] [src] (usr:[usr])</small> || [hsrc ? "[hsrc] " : ""][href]<br>")
|
||||
WRITE_FILE(GLOB.world_href_log, "<small>[time_stamp(show_ds = TRUE)] [src] (usr:[usr]\[[COORD(usr)]\])</small> || [hsrc ? "[hsrc] " : ""][href]<br>")
|
||||
|
||||
// Admin PM
|
||||
if(href_list["priv_msg"])
|
||||
cmd_admin_pm(href_list["priv_msg"],null)
|
||||
|
||||
@@ -206,6 +206,7 @@
|
||||
sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle??
|
||||
random_sensor = FALSE
|
||||
resistance_flags = NONE
|
||||
can_adjust = FALSE
|
||||
armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
|
||||
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
materials = list(MAT_GLASS = 250)
|
||||
var/vision_flags = 0
|
||||
var/darkness_view = 2//Base human is 2
|
||||
var/invis_view = SEE_INVISIBLE_LIVING
|
||||
var/invis_view = SEE_INVISIBLE_LIVING //admin only for now
|
||||
var/invis_override = 0 //Override to allow glasses to set higher than normal see_invis
|
||||
var/lighting_alpha
|
||||
var/list/icon/current = list() //the current hud icons
|
||||
@@ -261,7 +261,7 @@
|
||||
icon_state = "thermal"
|
||||
item_state = "glasses"
|
||||
vision_flags = SEE_MOBS
|
||||
invis_view = 2
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||
flash_protect = 0
|
||||
glass_colour_type = /datum/client_colour/glass_colour/red
|
||||
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
icon_state = "thermal"
|
||||
hud_type = DATA_HUD_SECURITY_ADVANCED
|
||||
vision_flags = SEE_MOBS
|
||||
invis_view = 2
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||
glass_colour_type = /datum/client_colour/glass_colour/red
|
||||
|
||||
/obj/item/clothing/glasses/hud/toggle/thermal/attack_self(mob/user)
|
||||
|
||||
@@ -192,7 +192,7 @@
|
||||
item_state = "wgloves"
|
||||
item_color = "mime"
|
||||
|
||||
/obj/item/clothing/gloves/color/random/New()
|
||||
/obj/item/clothing/gloves/color/random/Initialize()
|
||||
..()
|
||||
var/list/gloves = list(
|
||||
/obj/item/clothing/gloves/color/orange = 1,
|
||||
@@ -202,12 +202,14 @@
|
||||
/obj/item/clothing/gloves/color/green = 1,
|
||||
/obj/item/clothing/gloves/color/grey = 1,
|
||||
/obj/item/clothing/gloves/color/light_brown = 1,
|
||||
/obj/item/clothing/gloves/color/brown = 1)
|
||||
/obj/item/clothing/gloves/color/brown = 1,
|
||||
/obj/item/clothing/gloves/color/white = 1,
|
||||
/obj/item/clothing/gloves/color/rainbow = 1)
|
||||
|
||||
var/obj/item/clothing/gloves/color/selected = pick(gloves)
|
||||
|
||||
name = initial(selected.name)
|
||||
desc = initial(selected.desc)
|
||||
icon_state = initial(selected.icon_state)
|
||||
item_state = initial(selected.item_state)
|
||||
item_color = initial(selected.item_color)
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.equip_to_slot_or_del(new selected(H), slot_gloves)
|
||||
else
|
||||
new selected(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
@@ -4,13 +4,15 @@
|
||||
/obj/item/clothing/under/color/random
|
||||
icon_state = "random_jumpsuit"
|
||||
|
||||
/obj/item/clothing/under/color/random/New()
|
||||
/obj/item/clothing/under/color/random/Initialize()
|
||||
..()
|
||||
var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - /obj/item/clothing/under/color/random)
|
||||
name = initial(C.name)
|
||||
icon_state = initial(C.icon_state)
|
||||
item_state = initial(C.item_state)
|
||||
item_color = initial(C.item_color)
|
||||
var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/glorf - /obj/item/clothing/under/color/black/ghost)
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.equip_to_slot_or_del(new C(H), slot_w_uniform) //or else you end up with naked assistants running around everywhere...
|
||||
else
|
||||
new C(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/item/clothing/under/color/black
|
||||
name = "black jumpsuit"
|
||||
|
||||
@@ -274,6 +274,7 @@
|
||||
icon_state = "burial"
|
||||
item_state = "burial"
|
||||
item_color = "burial"
|
||||
has_sensor = NO_SENSORS
|
||||
|
||||
/obj/item/clothing/under/skirt/black
|
||||
name = "black skirt"
|
||||
|
||||
@@ -13,11 +13,15 @@
|
||||
. = ..()
|
||||
var/area/thearea = get_area(src)
|
||||
for(var/turf/T in get_area_turfs(thearea, z))
|
||||
if(T.baseturf != T.type) //Don't break indestructible walls and the like
|
||||
T.baseturf = baseturf
|
||||
if(T.baseturfs != T.type) //Don't break indestructible walls and the like
|
||||
T.baseturfs = baseturf
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
|
||||
/obj/effect/baseturf_helper/space
|
||||
name = "space baseturf editor"
|
||||
baseturf = /turf/open/space
|
||||
|
||||
/obj/effect/baseturf_helper/asteroid
|
||||
name = "asteroid baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/asteroid
|
||||
|
||||
@@ -339,7 +339,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
|
||||
|
||||
if(crds)
|
||||
if(!no_changeturf && ispath(path, /turf))
|
||||
. = crds.ChangeTurf(path, FALSE, TRUE)
|
||||
. = crds.ChangeTurf(path, null, CHANGETURF_DEFER_CHANGE)
|
||||
else
|
||||
. = create_atom(path, crds)//first preloader pass
|
||||
|
||||
|
||||
@@ -257,9 +257,8 @@
|
||||
if("Release")
|
||||
|
||||
if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user
|
||||
var/out = get_step(src, output_dir)
|
||||
if(params["id"] == "all")
|
||||
materials.retrieve_all(out)
|
||||
materials.retrieve_all(get_step(src, output_dir))
|
||||
else
|
||||
var/mat_id = params["id"]
|
||||
if(!materials.materials[mat_id])
|
||||
@@ -277,7 +276,7 @@
|
||||
desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
|
||||
|
||||
var/sheets_to_remove = round(min(desired,50,stored_amount))
|
||||
materials.retrieve_sheets(sheets_to_remove, mat_id, out)
|
||||
materials.retrieve_sheets(sheets_to_remove, mat_id, get_step(src, output_dir))
|
||||
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Required access not found.</span>")
|
||||
|
||||
@@ -121,6 +121,9 @@
|
||||
if(wear_id)
|
||||
msg += "[t_He] [t_is] wearing [icon2html(wear_id, user)] \a [wear_id].\n"
|
||||
|
||||
//Status effects
|
||||
msg += status_effect_examines()
|
||||
|
||||
//Jitters
|
||||
switch(jitteriness)
|
||||
if(300 to INFINITY)
|
||||
@@ -354,3 +357,16 @@
|
||||
msg += "*---------*</span>"
|
||||
|
||||
to_chat(user, msg)
|
||||
|
||||
/mob/living/proc/status_effect_examines(pronoun_replacement) //You can include this in any mob's examine() to show the examine texts of status effects!
|
||||
var/list/dat = list()
|
||||
if(!pronoun_replacement)
|
||||
pronoun_replacement = p_they(TRUE)
|
||||
for(var/V in status_effects)
|
||||
var/datum/status_effect/E = V
|
||||
if(E.examine_text)
|
||||
var/new_text = replacetext(E.examine_text, "SUBJECTPRONOUN", pronoun_replacement)
|
||||
new_text = replacetext(new_text, "[pronoun_replacement] is", "[pronoun_replacement] [p_are()]") //To make sure something become "They are" or "She is", not "They are" and "She are"
|
||||
dat += "[new_text]\n" //dat.Join("\n") doesn't work here, for some reason
|
||||
if(dat.len)
|
||||
return dat.Join()
|
||||
|
||||
@@ -72,6 +72,10 @@
|
||||
else if(eye_blurry) //blurry eyes heal slowly
|
||||
adjust_blurriness(-1)
|
||||
|
||||
if(has_disability(DISABILITY_PACIFISM) && a_intent == INTENT_HARM)
|
||||
to_chat(src, "<span class='notice'>You don't feel like harming anybody.</span>")
|
||||
a_intent_change(INTENT_HELP)
|
||||
|
||||
/mob/living/carbon/human/handle_mutations_and_radiation()
|
||||
if(!dna || !dna.species.handle_mutations_and_radiation(src))
|
||||
..()
|
||||
|
||||
@@ -20,11 +20,6 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
"t" = "Syndicate",
|
||||
"y" = "CentCom",
|
||||
|
||||
// Species
|
||||
"b" = "binary",
|
||||
"g" = "changeling",
|
||||
"a" = "alientalk",
|
||||
|
||||
// Admin
|
||||
"p" = "admin",
|
||||
"d" = "deadmin",
|
||||
@@ -55,11 +50,6 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
"å" = "Syndicate",
|
||||
"í" = "CentCom",
|
||||
|
||||
// Species
|
||||
"è" = "binary",
|
||||
"ï" = "changeling",
|
||||
"ô" = "alientalk",
|
||||
|
||||
// Admin
|
||||
"ç" = "admin",
|
||||
"â" = "deadmin",
|
||||
@@ -81,13 +71,14 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
if(!message || message == "")
|
||||
return
|
||||
|
||||
var/datum/saymode/saymode = SSradio.saymodes[talk_key]
|
||||
var/message_mode = get_message_mode(message)
|
||||
var/original_message = message
|
||||
var/in_critical = InCritical()
|
||||
|
||||
if(one_character_prefix[message_mode])
|
||||
message = copytext(message, 2)
|
||||
else if(message_mode)
|
||||
else if(message_mode || saymode)
|
||||
message = copytext(message, 3)
|
||||
if(findtext(message, " ", 1, 2))
|
||||
message = copytext(message, 2)
|
||||
@@ -135,8 +126,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
// AIs use inherent channels for the holopad. Most inherent channels
|
||||
// ignore the language argument however.
|
||||
|
||||
var/datum/saymode/SM = SSradio.saymodes[talk_key]
|
||||
if(SM && !SM.handle_message(src, message, language))
|
||||
if(saymode && !saymode.handle_message(src, message, language))
|
||||
return
|
||||
|
||||
if(!can_speak_vocal(message))
|
||||
@@ -341,6 +331,15 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
return message
|
||||
|
||||
/mob/living/proc/radio(message, message_mode, list/spans, language)
|
||||
var/obj/item/implant/radio/imp = locate() in src
|
||||
if(imp && imp.radio.on)
|
||||
if(message_mode == MODE_HEADSET)
|
||||
imp.radio.talk_into(src, message, , spans, language)
|
||||
return ITALICS | REDUCE_RANGE
|
||||
if(message_mode == MODE_DEPARTMENT || message_mode in GLOB.radiochannels)
|
||||
imp.radio.talk_into(src, message, message_mode, spans, language)
|
||||
return ITALICS | REDUCE_RANGE
|
||||
|
||||
switch(message_mode)
|
||||
if(MODE_WHISPER)
|
||||
return ITALICS
|
||||
@@ -362,6 +361,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
|
||||
if(MODE_BINARY)
|
||||
return ITALICS | REDUCE_RANGE //Does not return 0 since this is only reached by humans, not borgs or AIs.
|
||||
|
||||
return 0
|
||||
|
||||
/mob/living/say_mod(input, message_mode)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
var/obj/act_module = get_active_held_item()
|
||||
if(act_module)
|
||||
msg += "It is holding [icon2html(act_module, user)] \a [act_module].\n"
|
||||
msg += status_effect_examines()
|
||||
msg += "<span class='warning'>"
|
||||
if (src.getBruteLoss())
|
||||
if (src.getBruteLoss() < maxHealth*0.5)
|
||||
|
||||
@@ -321,9 +321,9 @@
|
||||
sleep(50)
|
||||
if(mode == BOT_REPAIRING && src.loc == target_turf)
|
||||
if(autotile) //Build the floor and include a tile.
|
||||
target_turf.ChangeTurf(/turf/open/floor/plasteel)
|
||||
target_turf.PlaceOnTop(/turf/open/floor/plasteel)
|
||||
else //Build a hull plating without a floor tile.
|
||||
target_turf.ChangeTurf(/turf/open/floor/plating)
|
||||
target_turf.PlaceOnTop(/turf/open/floor/plating)
|
||||
|
||||
else
|
||||
var/turf/open/floor/F = target_turf
|
||||
|
||||
@@ -235,7 +235,8 @@
|
||||
LoseTarget()
|
||||
return 0
|
||||
if(target in possible_targets)
|
||||
if(target.z != z)
|
||||
var/turf/T = get_turf(src)
|
||||
if(target.z != T.z)
|
||||
LoseTarget()
|
||||
return 0
|
||||
var/target_distance = get_dist(targets_from,target)
|
||||
@@ -417,7 +418,7 @@ mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with mega
|
||||
if(buckled)
|
||||
buckled.attack_animal(src)
|
||||
if(!isturf(targets_from.loc) && targets_from.loc != null)//Did someone put us in something?
|
||||
var/atom/A = get_turf(targets_from)
|
||||
var/atom/A = targets_from.loc
|
||||
A.attack_animal(src)//Bang on it till we get out
|
||||
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
for(var/F in RANGE_TURFS(1, src))
|
||||
if(ismineralturf(F))
|
||||
var/turf/closed/mineral/M = F
|
||||
M.ChangeTurf(M.turf_type,FALSE,FALSE,TRUE)
|
||||
M.ChangeTurf(M.turf_type, null, CHANGETURF_IGNORE_AIR)
|
||||
gps = new /obj/item/device/gps/internal(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/Destroy()
|
||||
|
||||
+25
-6
@@ -254,24 +254,43 @@
|
||||
|
||||
return 0
|
||||
|
||||
// reset_perspective(thing) set the eye to the thing (if it's equal to current default reset to mob perspective)
|
||||
// reset_perspective() set eye to common default : mob on turf, loc otherwise
|
||||
/mob/proc/reset_perspective(atom/A)
|
||||
if(client)
|
||||
if(ismovableatom(A))
|
||||
client.perspective = EYE_PERSPECTIVE
|
||||
client.eye = A
|
||||
if(A)
|
||||
if(ismovableatom(A))
|
||||
//Set the the thing unless it's us
|
||||
if(A != src)
|
||||
client.perspective = EYE_PERSPECTIVE
|
||||
client.eye = A
|
||||
else
|
||||
client.eye = client.mob
|
||||
client.perspective = MOB_PERSPECTIVE
|
||||
else if(isturf(A))
|
||||
//Set to the turf unless it's our current turf
|
||||
if(A != loc)
|
||||
client.perspective = EYE_PERSPECTIVE
|
||||
client.eye = A
|
||||
else
|
||||
client.eye = client.mob
|
||||
client.perspective = MOB_PERSPECTIVE
|
||||
else
|
||||
//Do nothing
|
||||
else
|
||||
if(isturf(loc) && (!A || loc == A))
|
||||
//Reset to common defaults: mob if on turf, otherwise current loc
|
||||
if(isturf(loc))
|
||||
client.eye = client.mob
|
||||
client.perspective = MOB_PERSPECTIVE
|
||||
else
|
||||
client.perspective = EYE_PERSPECTIVE
|
||||
client.eye = A
|
||||
client.eye = loc
|
||||
return 1
|
||||
|
||||
/mob/living/reset_perspective(atom/A)
|
||||
if(..())
|
||||
update_sight()
|
||||
if(client.eye != src)
|
||||
if(client.eye && client.eye != src)
|
||||
var/atom/AT = client.eye
|
||||
AT.get_remote_view_fullscreens(src)
|
||||
else
|
||||
|
||||
@@ -33,7 +33,9 @@
|
||||
orbiting = null
|
||||
return ..()
|
||||
|
||||
/datum/orbit/proc/Check(turf/targetloc)
|
||||
/datum/orbit/proc/Check(turf/targetloc, list/checked_already = list())
|
||||
//Avoid infinite loops for people who end up orbiting themself through another orbiter
|
||||
checked_already[src] = TRUE
|
||||
if (!orbiter)
|
||||
qdel(src)
|
||||
return
|
||||
@@ -55,9 +57,10 @@
|
||||
lastloc = orbiter.loc
|
||||
for(var/other_orbit in orbiter.orbiters)
|
||||
var/datum/orbit/OO = other_orbit
|
||||
if(OO == src)
|
||||
//Skip if checked already
|
||||
if(checked_already[OO])
|
||||
continue
|
||||
OO.Check(targetloc)
|
||||
OO.Check(targetloc, checked_already)
|
||||
|
||||
/atom/movable/var/datum/orbit/orbiting = null
|
||||
/atom/var/list/orbiters = null
|
||||
|
||||
@@ -1688,3 +1688,23 @@
|
||||
description = "blue sparkles that get everywhere"
|
||||
color = "#4040FF" //A blueish color
|
||||
glitter_type = /obj/effect/decal/cleanable/glitter/blue
|
||||
|
||||
/datum/reagent/pax
|
||||
name = "pax"
|
||||
id = "pax"
|
||||
description = "A colorless liquid that suppresses violence on the subjects."
|
||||
color = "#AAAAAA55"
|
||||
taste_description = "water"
|
||||
metabolization_rate = 0.25 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/pax/on_mob_add(mob/M)
|
||||
..()
|
||||
if(isliving(M))
|
||||
var/mob/living/L = M
|
||||
L.add_disability(DISABILITY_PACIFISM, CHEMICAL_DISABILITY)
|
||||
|
||||
/datum/reagent/pax/on_mob_delete(mob/M)
|
||||
if(isliving(M))
|
||||
var/mob/living/L = M
|
||||
L.remove_disability(DISABILITY_PACIFISM, CHEMICAL_DISABILITY)
|
||||
..()
|
||||
@@ -51,7 +51,7 @@
|
||||
if(isplatingturf(T))
|
||||
var/turf/open/floor/plating/F = T
|
||||
if(prob(10 + F.burnt + 5*F.broken)) //broken or burnt plating is more susceptible to being destroyed
|
||||
F.ChangeTurf(F.baseturf)
|
||||
F.ScrapeAway()
|
||||
if(isfloorturf(T))
|
||||
var/turf/open/floor/F = T
|
||||
if(prob(reac_volume))
|
||||
@@ -65,7 +65,7 @@
|
||||
if(iswallturf(T))
|
||||
var/turf/closed/wall/W = T
|
||||
if(prob(reac_volume))
|
||||
W.ChangeTurf(/turf/open/floor/plating)
|
||||
W.ScrapeAway()
|
||||
|
||||
/datum/reagent/clf3/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
if(istype(M))
|
||||
|
||||
@@ -671,3 +671,9 @@
|
||||
var/location = get_turf(holder.my_atom)
|
||||
for(var/i in 1 to 10)
|
||||
new /obj/item/stack/sheet/plastic(location)
|
||||
|
||||
/datum/chemical_reaction/pax
|
||||
name = "pax"
|
||||
id = "pax"
|
||||
results = list("pax" = 3)
|
||||
required_reagents = list("mindbreaker" = 1, "synaptizine" = 1, "water" = 1)
|
||||
|
||||
@@ -199,12 +199,24 @@
|
||||
to_chat(SM, "<span class='userdanger'>You are grateful to be self aware and owe [user.real_name] a great debt. Serve [user.real_name], and assist [user.p_them()] in completing [user.p_their()] goals at any cost.</span>")
|
||||
to_chat(user, "<span class='notice'>[SM] accepts [src] and suddenly becomes attentive and aware. It worked!</span>")
|
||||
SM.copy_known_languages_from(user, TRUE)
|
||||
after_success(user, SM)
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[SM] looks interested for a moment, but then looks back down. Maybe you should try again later.</span>")
|
||||
being_used = 0
|
||||
..()
|
||||
|
||||
/obj/item/slimepotion/sentience/proc/after_success(mob/living/user, mob/living/simple_animal/SM)
|
||||
return
|
||||
|
||||
/obj/item/slimepotion/sentience/nuclear
|
||||
name = "syndicate intelligence potion"
|
||||
desc = "A miraculous chemical mix that grants human like intelligence to living beings. It has been modified with Syndicate technology to also grant an internal radio implant to the target."
|
||||
|
||||
/obj/item/slimepotion/sentience/nuclear/after_success(mob/living/user, mob/living/simple_animal/SM)
|
||||
var/obj/item/implant/radio/imp = new(src)
|
||||
imp.implant(SM, user)
|
||||
|
||||
/obj/item/slimepotion/transference
|
||||
name = "consciousness transference potion"
|
||||
desc = "A strange slime-based chemical that, when used, allows the user to transfer their consciousness to a lesser being."
|
||||
|
||||
@@ -7,8 +7,15 @@ All ShuttleMove procs go here
|
||||
// Called on every turf in the shuttle region, returns a bitflag for allowed movements of that turf
|
||||
// returns the new move_mode (based on the old)
|
||||
/turf/proc/fromShuttleMove(turf/newT, turf_type, list/baseturf_cache, move_mode)
|
||||
if(!(move_mode & MOVE_AREA) || (istype(src, turf_type) && baseturf_cache[baseturf]))
|
||||
if(!(move_mode & MOVE_AREA))
|
||||
return move_mode
|
||||
if(istype(src, turf_type))
|
||||
if(length(baseturfs))
|
||||
if(baseturf_cache[baseturfs[1]])
|
||||
return move_mode
|
||||
else if(baseturf_cache[baseturfs])
|
||||
return move_mode
|
||||
|
||||
return move_mode | MOVE_TURF | MOVE_CONTENTS
|
||||
|
||||
// Called from the new turf before anything has been moved
|
||||
@@ -45,9 +52,7 @@ All ShuttleMove procs go here
|
||||
if(newT == src) // In case of in place shuttle rotation shenanigans.
|
||||
return
|
||||
//Destination turf changes
|
||||
var/destination_turf_type = newT.type
|
||||
newT = copyTurf(newT)
|
||||
newT.baseturf = destination_turf_type
|
||||
newT.CopyOnTop(src, 1, 0) // We only want a surface copy
|
||||
//Air stuff
|
||||
newT.blocks_air = TRUE
|
||||
newT.air_update_turf(TRUE)
|
||||
@@ -63,9 +68,8 @@ All ShuttleMove procs go here
|
||||
/turf/proc/afterShuttleMove(turf/oldT, turf_type, baseturf_type, rotation)
|
||||
//Dealing with the turf we left behind
|
||||
oldT.TransferComponents(src)
|
||||
oldT.ChangeTurf(turf_type, baseturf_type, FALSE, TRUE)
|
||||
oldT.ChangeTurf(turf_type, baseturf_type, CHANGETURF_IGNORE_AIR) // TODO: make this oldT.ScrapeAway() which requires templating all shuttles
|
||||
|
||||
// Rotate and let the air move again
|
||||
if(rotation)
|
||||
shuttleRotate(rotation) //see shuttle_rotate.dm
|
||||
|
||||
|
||||
@@ -465,7 +465,7 @@
|
||||
var/turf/T1 = L1[i]
|
||||
if(!T1)
|
||||
continue
|
||||
if(T0.type != T0.baseturf)
|
||||
if(T0.type != T0.baseturfs)
|
||||
ripple_turfs += T1
|
||||
|
||||
return ripple_turfs
|
||||
|
||||
@@ -104,4 +104,10 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate
|
||||
//prevents shuttles attempting to rotate this since it messes up sprites
|
||||
/obj/machinery/gravity_generator/shuttleRotate(rotation, params)
|
||||
params = NONE
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/door/airlock/shuttleRotate(rotation, params)
|
||||
. = ..()
|
||||
if(cyclelinkeddir)
|
||||
cyclelinkeddir = angle2dir(rotation+dir2angle(cyclelinkeddir))
|
||||
cyclelinkairlock()
|
||||
|
||||
@@ -1059,9 +1059,9 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/device_tools/potion
|
||||
name = "Sentience Potion"
|
||||
item = /obj/item/slimepotion/sentience
|
||||
desc = "A potion recovered at great risk by undercover syndicate operatives. Using it will make any animal sentient, and bound to serve you."
|
||||
name = "Syndicate Sentience Potion"
|
||||
item = /obj/item/slimepotion/sentience/nuclear
|
||||
desc = "A potion recovered at great risk by undercover syndicate operatives and then subsequently modified with syndicate technology. Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication."
|
||||
cost = 4
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
@@ -1152,6 +1152,12 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
|
||||
cost = 20
|
||||
include_modes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/implants/radio
|
||||
name = "Internal Syndicate Radio Implant"
|
||||
desc = "An implant injected into the body, allowing the use of an internal syndicate radio. Used just like a regular headset, but can be disabled to use external headsets normally and to avoid detection."
|
||||
item = /obj/item/storage/box/syndie_kit/imp_radio
|
||||
cost = 4
|
||||
|
||||
|
||||
// Cybernetics
|
||||
/datum/uplink_item/cyber_implants
|
||||
|
||||
Reference in New Issue
Block a user