Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into upstream-merge-32311
This commit is contained in:
@@ -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>")
|
||||
|
||||
@@ -85,6 +85,9 @@
|
||||
if(wear_id)
|
||||
msg += "[t_He] [t_is] wearing [wear_id.get_examine_string(user)].\n"
|
||||
|
||||
//Status effects
|
||||
msg += status_effect_examines()
|
||||
|
||||
//Jitters
|
||||
switch(jitteriness)
|
||||
if(300 to INFINITY)
|
||||
@@ -318,3 +321,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
|
||||
|
||||
@@ -1687,3 +1687,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