Merge branch 'master' into holy-chapel
@@ -1,4 +1,78 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"aa" = (
|
||||
/obj/structure/cable{
|
||||
d1 = 4;
|
||||
d2 = 8;
|
||||
icon_state = "4-8";
|
||||
pixel_y = 0;
|
||||
tag = ""
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4;
|
||||
level = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/fans/tiny,
|
||||
/obj/machinery/door/poddoor{
|
||||
id_tag = "SSBtestchamber";
|
||||
name = "Syndicate Test Lab Blast Door"
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "dark"
|
||||
},
|
||||
/area/ruin/unpowered/syndicate_space_base/testlab)
|
||||
"ab" = (
|
||||
/obj/machinery/door_control{
|
||||
id = "SSBtestchamber";
|
||||
name = "Blast Door Control"
|
||||
},
|
||||
/turf/simulated/wall/mineral/plastitanium/nodiagonal,
|
||||
/area/ruin/unpowered/syndicate_space_base/testlab)
|
||||
"ac" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/fans/tiny,
|
||||
/obj/machinery/door/poddoor{
|
||||
id_tag = "SSBtestchamber";
|
||||
name = "Syndicate Test Lab Blast Door"
|
||||
},
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "dark"
|
||||
},
|
||||
/area/ruin/unpowered/syndicate_space_base/testlab)
|
||||
"ad" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
|
||||
/obj/machinery/camera/emp_proof{
|
||||
c_tag = "Test Lab West";
|
||||
dir = 4;
|
||||
network = list("SyndicateTestLab")
|
||||
},
|
||||
/turf/simulated/floor/engine,
|
||||
/area/ruin/unpowered/syndicate_space_base/testlab)
|
||||
"ae" = (
|
||||
/obj/machinery/camera/emp_proof{
|
||||
c_tag = "Test Lab East";
|
||||
dir = 9;
|
||||
network = list("SyndicateTestLab")
|
||||
},
|
||||
/turf/simulated/floor/engine,
|
||||
/area/ruin/unpowered/syndicate_space_base/testlab)
|
||||
"aj" = (
|
||||
/obj/effect/spawner/window/reinforced,
|
||||
/turf/simulated/floor/plasteel{
|
||||
@@ -1191,18 +1265,6 @@
|
||||
icon_state = "dark"
|
||||
},
|
||||
/area/ruin/unpowered/syndicate_space_base/telecomms)
|
||||
"mE" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/fans/tiny,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "dark"
|
||||
},
|
||||
/area/ruin/unpowered/syndicate_space_base/testlab)
|
||||
"mP" = (
|
||||
/obj/machinery/power/generator,
|
||||
/obj/structure/cable/yellow,
|
||||
@@ -1404,14 +1466,6 @@
|
||||
icon_state = "brown"
|
||||
},
|
||||
/area/ruin/unpowered/syndicate_space_base/cargo)
|
||||
"ol" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
|
||||
/turf/simulated/floor/engine,
|
||||
/area/ruin/unpowered/syndicate_space_base/testlab)
|
||||
"ow" = (
|
||||
/obj/structure/closet/crate/medical,
|
||||
/obj/item/storage/firstaid/fire{
|
||||
@@ -1861,32 +1915,6 @@
|
||||
icon_state = "dark"
|
||||
},
|
||||
/area/ruin/unpowered/syndicate_space_base/main)
|
||||
"un" = (
|
||||
/obj/structure/cable{
|
||||
d1 = 4;
|
||||
d2 = 8;
|
||||
icon_state = "4-8";
|
||||
pixel_y = 0;
|
||||
tag = ""
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
|
||||
dir = 4;
|
||||
level = 1
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/fans/tiny,
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "dark"
|
||||
},
|
||||
/area/ruin/unpowered/syndicate_space_base/testlab)
|
||||
"uq" = (
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "freezerfloor"
|
||||
@@ -4926,6 +4954,13 @@
|
||||
icon_state = "dark"
|
||||
},
|
||||
/area/ruin/unpowered/syndicate_space_base/main)
|
||||
"ZG" = (
|
||||
/obj/machinery/computer/security/telescreen{
|
||||
name = "Test Lab Monitor";
|
||||
network = list("SyndicateTestLab")
|
||||
},
|
||||
/turf/simulated/wall/mineral/plastitanium/nodiagonal,
|
||||
/area/ruin/unpowered/syndicate_space_base/testlab)
|
||||
"ZR" = (
|
||||
/turf/simulated/floor/plasteel{
|
||||
icon_state = "dark"
|
||||
@@ -6837,8 +6872,8 @@ TD
|
||||
TD
|
||||
rr
|
||||
CM
|
||||
TD
|
||||
TD
|
||||
ZG
|
||||
ab
|
||||
TD
|
||||
CM
|
||||
ZR
|
||||
@@ -6897,13 +6932,13 @@ ia
|
||||
ia
|
||||
ia
|
||||
TD
|
||||
un
|
||||
aa
|
||||
TD
|
||||
ia
|
||||
ia
|
||||
ia
|
||||
TD
|
||||
mE
|
||||
ac
|
||||
TD
|
||||
AV
|
||||
AV
|
||||
@@ -7022,7 +7057,7 @@ fH
|
||||
fH
|
||||
RC
|
||||
uN
|
||||
ol
|
||||
ad
|
||||
RF
|
||||
RF
|
||||
dH
|
||||
@@ -7952,7 +7987,7 @@ qv
|
||||
Vl
|
||||
Vl
|
||||
Vl
|
||||
Vl
|
||||
ae
|
||||
Vl
|
||||
Vl
|
||||
Vl
|
||||
|
||||
@@ -31,19 +31,20 @@
|
||||
return 1
|
||||
|
||||
|
||||
/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams.
|
||||
if(!start || !end) return 0
|
||||
/proc/get_angle(atom/movable/start, atom/movable/end)//For beams.
|
||||
if(!start || !end)
|
||||
return 0
|
||||
var/dy
|
||||
var/dx
|
||||
dy=(32*end.y+end.pixel_y)-(32*start.y+start.pixel_y)
|
||||
dx=(32*end.x+end.pixel_x)-(32*start.x+start.pixel_x)
|
||||
dy = (32 * end.y + end.pixel_y) - (32 * start.y + start.pixel_y)
|
||||
dx = (32 * end.x + end.pixel_x) - (32 * start.x + start.pixel_x)
|
||||
if(!dy)
|
||||
return (dx>=0)?90:270
|
||||
.=arctan(dx/dy)
|
||||
if(dy<0)
|
||||
.+=180
|
||||
else if(dx<0)
|
||||
.+=360
|
||||
return (dx >= 0) ? 90 : 270
|
||||
. = arctan(dx / dy)
|
||||
if(dy < 0)
|
||||
. += 180
|
||||
else if(dx < 0)
|
||||
. += 360
|
||||
|
||||
//Returns location. Returns null if no location was found.
|
||||
/proc/get_teleport_loc(turf/location,mob/target,distance = 1, density = 0, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0)
|
||||
@@ -1246,10 +1247,6 @@ GLOBAL_LIST_INIT(wall_items, typecacheof(list(/obj/machinery/power/apc, /obj/mac
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/proc/get_angle(atom/a, atom/b)
|
||||
return atan2(b.y - a.y, b.x - a.x)
|
||||
|
||||
/proc/atan2(x, y)
|
||||
if(!x && !y) return 0
|
||||
return y >= 0 ? arccos(x / sqrt(x * x + y * y)) : -arccos(x / sqrt(x * x + y * y))
|
||||
|
||||
@@ -40,7 +40,7 @@ GLOBAL_LIST_INIT(drinks, list("beer2","hot_coco","orangejuice","tomatojuice","li
|
||||
"booger","bloodymary","gargleblaster","bravebull","tequilasunrise","toxinsspecial",
|
||||
"beepskysmash","salglu_solution","irishcream","manlydorf","longislandicedtea",
|
||||
"moonshine","b52","irishcoffee","margarita","blackrussian","manhattan",
|
||||
"manhattan_proj","whiskeysoda","antifreeze","barefoot","snowwhite","demonsblood",
|
||||
"manhattan_proj","whiskeysoda","adminfreeze","antifreeze","barefoot","snowwhite","demonsblood",
|
||||
"vodkatonic","ginfizz","bahama_mama","singulo","sbiten","devilskiss","red_mead",
|
||||
"mead","iced_beer","grog","aloe","andalusia","alliescocktail","soy_latte",
|
||||
"cafe_latte","acidspit","amasec","neurotoxin","hippiesdelight","bananahonk",
|
||||
|
||||
@@ -139,6 +139,12 @@
|
||||
|
||||
|
||||
else
|
||||
if(focus.buckled_mobs)
|
||||
to_chat(user, "<span class='notice'>This object is too heavy to move with something buckled to it!</span>")
|
||||
return
|
||||
if(length(focus.client_mobs_in_contents))
|
||||
to_chat(user, "<span class='notice'>This object is too heavy to move with something inside of it!</span>")
|
||||
return
|
||||
apply_focus_overlay()
|
||||
focus.throw_at(target, 10, 1, user)
|
||||
last_throw = world.time
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
SUBSYSTEM_DEF(chat_pings)
|
||||
name = "Chat Pings"
|
||||
flags = SS_NO_INIT
|
||||
runlevels = RUNLEVEL_INIT | RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME // ALL OF THEM
|
||||
wait = 30 SECONDS // Chat pings every 30 seconds
|
||||
/// List of all held chat datums
|
||||
var/list/datum/chatOutput/chat_datums = list() // Do NOT put this in Initialize(). You will cause issues.
|
||||
|
||||
/datum/controller/subsystem/chat_pings/fire(resumed)
|
||||
for(var/datum/chatOutput/CO as anything in chat_datums)
|
||||
CO.updatePing()
|
||||
if(MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
/datum/controller/subsystem/chat_pings/stat_entry()
|
||||
..("P: [length(chat_datums)]")
|
||||
@@ -58,7 +58,7 @@
|
||||
return ..()
|
||||
|
||||
/datum/beam/proc/Draw()
|
||||
var/Angle = round(Get_Angle(origin,target))
|
||||
var/Angle = round(get_angle(origin, target))
|
||||
|
||||
var/matrix/rot_matrix = matrix()
|
||||
rot_matrix.Turn(Angle)
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
var/list/stage3 = list("You feel utterly plain.")
|
||||
var/list/stage4 = list("You feel white bread.")
|
||||
var/list/stage5 = list("Oh the humanity!")
|
||||
var/transformation_text = null
|
||||
var/new_form = /mob/living/carbon/human
|
||||
|
||||
/datum/disease/transformation/stage_act()
|
||||
@@ -44,6 +45,8 @@
|
||||
return
|
||||
if(affected_mob.notransform)
|
||||
return
|
||||
if(transformation_text)
|
||||
to_chat(affected_mob, transformation_text)
|
||||
affected_mob.notransform = 1
|
||||
affected_mob.canmove = 0
|
||||
affected_mob.icon = null
|
||||
@@ -243,4 +246,5 @@
|
||||
stage3 = list("<span class='danger'>Your appendages are melting away.</span>", "<span class='danger'>Your limbs begin to lose their shape.</span>")
|
||||
stage4 = list("<span class='danger'>You're ravenous.</span>")
|
||||
stage5 = list("<span class='danger'>You have become a morph.</span>")
|
||||
transformation_text = "<span class='userdanger'>This transformation does NOT make you an antagonist if you were not one already. If you were not an antagonist, you should not eat any steal objectives or the contents of the armory.</span>"
|
||||
new_form = /mob/living/simple_animal/hostile/morph
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
shoes = /obj/item/clothing/shoes/magboots/syndie
|
||||
r_pocket = /obj/item/radio/uplink/nuclear
|
||||
l_pocket = /obj/item/pinpointer/advpinpointer
|
||||
l_hand = /obj/item/tank/jetpack/oxygen/harness
|
||||
l_hand = /obj/item/tank/internals/oxygen/red
|
||||
|
||||
backpack_contents = list(
|
||||
/obj/item/storage/box/survival_syndi = 1,
|
||||
|
||||
@@ -1017,6 +1017,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
cost = 11
|
||||
surplus = 0
|
||||
cant_discount = TRUE
|
||||
hijack_only = TRUE
|
||||
|
||||
/datum/uplink_item/explosives/emp_bomb
|
||||
name = "EMP bomb"
|
||||
|
||||
@@ -1072,7 +1072,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
|
||||
Returning TRUE here will override the above proc's result.
|
||||
*/
|
||||
/atom/proc/CanAStarPassTo(ID, dir, obj/destination)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/** Call this when you want to present a renaming prompt to the user.
|
||||
|
||||
@@ -1139,3 +1139,11 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
|
||||
else
|
||||
name = "[prefix][t]"
|
||||
return t
|
||||
|
||||
/atom/proc/set_angle(degrees)
|
||||
var/matrix/M = matrix()
|
||||
M.Turn(degrees)
|
||||
// If we aint 0, make it NN transform
|
||||
if(degrees)
|
||||
appearance_flags |= PIXEL_SCALE
|
||||
transform = M
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/datum/action/changeling/digitalcamo
|
||||
name = "Digital Camouflage"
|
||||
desc = "By evolving the ability to distort our form and proprotions, we defeat common altgorithms used to detect lifeforms on cameras."
|
||||
helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us... uncanny."
|
||||
helptext = "We cannot be tracked by camera while using this skill."
|
||||
button_icon_state = "digital_camo"
|
||||
dna_cost = 1
|
||||
|
||||
//Prevents AIs tracking you but makes you easily detectable to the human-eye.
|
||||
//Prevents AIs tracking you.
|
||||
/datum/action/changeling/digitalcamo/sting_action(mob/user)
|
||||
|
||||
if(user.digitalcamo)
|
||||
|
||||
@@ -872,8 +872,12 @@
|
||||
/obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user)
|
||||
if(user.holy_check())
|
||||
return
|
||||
var/list/options = list("Blood Orb (50)", "Blood Recharge (75)", "Blood Spear (150)", "Blood Bolt Barrage (300)")
|
||||
var/choice = input(user, "Choose a greater blood rite...", "Greater Blood Rites") as null|anything in options
|
||||
var/list/options = list("Blood Orb (50)" = image(icon = 'icons/obj/cult.dmi', icon_state = "summoning_orb"),
|
||||
"Blood Recharge (75)" = image(icon = 'icons/mob/actions/actions_cult.dmi', icon_state = "blood_charge"),
|
||||
"Blood Spear (150)" = image(icon = 'icons/mob/actions/actions_cult.dmi', icon_state = "bloodspear"),
|
||||
"Blood Bolt Barrage (300)" = image(icon = 'icons/mob/actions/actions_cult.dmi', icon_state = "blood_barrage"))
|
||||
var/choice = show_radial_menu(user, src, options)
|
||||
|
||||
switch(choice)
|
||||
if("Blood Orb (50)")
|
||||
if(uses < BLOOD_ORB_COST)
|
||||
|
||||
@@ -446,7 +446,7 @@
|
||||
|
||||
/datum/spellbook_entry/item/warp_cubes
|
||||
name = "Warp Cubes"
|
||||
desc = "Two magic cubes, that when they are twisted in hand, teleports the user to the location of the other cube instantly. Great for silently teleporting to a fixed location, or teleporting you to an appretnance, or vice versa. Do not leave on the wizard den, it will not work."
|
||||
desc = "Two magic cubes, that when they are twisted in hand, teleports the user to the location of the other cube instantly. Great for silently teleporting to a fixed location, or teleporting you to an apprentice, or vice versa. Do not leave on the wizard den, it will not work."
|
||||
item_path = /obj/item/warp_cube/red
|
||||
log_name = "WC"
|
||||
cost = 1
|
||||
@@ -479,7 +479,7 @@
|
||||
|
||||
/datum/spellbook_entry/item/singularity_hammer
|
||||
name = "Singularity Hammer"
|
||||
desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everthing nearby to the point of impact."
|
||||
desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everything nearby to the point of impact."
|
||||
item_path = /obj/item/twohanded/singularityhammer
|
||||
log_name = "SI"
|
||||
category = "Weapons and Armors"
|
||||
|
||||
@@ -225,7 +225,7 @@
|
||||
to_chat(H, "<span class='danger'>Failed to locate a storage object on your mob, either you spawned with no hands free and no backpack or this is a bug.</span>")
|
||||
qdel(G)
|
||||
|
||||
qdel(gear_leftovers)
|
||||
gear_leftovers.Cut()
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
for(var/obj/machinery/camera/C in GLOB.cameranet.cameras)
|
||||
if(!C.can_use())
|
||||
continue
|
||||
if(C.network&networks)
|
||||
if(length(C.network & networks))
|
||||
camera_location = get_turf(C)
|
||||
break
|
||||
if(camera_location)
|
||||
|
||||
@@ -720,6 +720,10 @@
|
||||
// Won't announce when used for cryoing.
|
||||
silent = TRUE
|
||||
|
||||
/obj/machinery/cryopod/offstation/right
|
||||
orient_right = TRUE
|
||||
icon_state = "body_scanner_0-r"
|
||||
|
||||
/obj/machinery/computer/cryopod/robot
|
||||
name = "robotic storage console"
|
||||
desc = "An interface between crew and the robotic storage systems"
|
||||
|
||||
@@ -657,6 +657,7 @@ GLOBAL_LIST_EMPTY(turret_icons)
|
||||
qdel(flick_holder)
|
||||
|
||||
set_raised_raising(FALSE, FALSE)
|
||||
set_angle(0)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/porta_turret/on_assess_perp(mob/living/carbon/human/perp)
|
||||
@@ -678,7 +679,8 @@ GLOBAL_LIST_EMPTY(turret_icons)
|
||||
last_target = target
|
||||
if(has_cover)
|
||||
popUp() //pop the turret up if it's not already up.
|
||||
setDir(get_dir(src, target)) //even if you can't shoot, follow the target
|
||||
// Set angle
|
||||
set_angle(get_angle(src, target))
|
||||
shootAt(target)
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
name = "syndicate suit storage unit"
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
mask_type = /obj/item/clothing/mask/gas/syndicate
|
||||
storage_type = /obj/item/tank/jetpack/oxygen/harness
|
||||
storage_type = /obj/item/tank/internals/oxygen/red
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
safeties = FALSE //in a syndicate base, everything can be used as a murder weapon at a moment's notice.
|
||||
|
||||
|
||||
@@ -313,7 +313,7 @@
|
||||
name = "teleporter hub"
|
||||
desc = "It's the hub of a teleporting machine."
|
||||
icon_state = "tele0"
|
||||
var/accurate = FALSE
|
||||
var/accurate = 0
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 2000
|
||||
@@ -353,6 +353,8 @@
|
||||
for(var/obj/item/stock_parts/matter_bin/M in component_parts)
|
||||
A += M.rating
|
||||
accurate = A
|
||||
if(accurate >= 3)
|
||||
calibrated = TRUE
|
||||
|
||||
/obj/machinery/teleport/hub/proc/link_power_station()
|
||||
if(power_station)
|
||||
@@ -401,12 +403,13 @@
|
||||
if(!calibrated && com.cc_beacon)
|
||||
visible_message("<span class='alert'>Cannot lock on target. Please calibrate the teleporter before attempting long range teleportation.</span>")
|
||||
else if(!calibrated && prob(25 - ((accurate) * 10)) && !com.cc_beacon) //oh dear a problem
|
||||
var/list/target_z = levels_by_trait(REACHABLE)
|
||||
var/list/target_z = levels_by_trait(SPAWN_RUINS)
|
||||
target_z -= M.z //Where to sir? Anywhere but here.
|
||||
. = do_teleport(M, locate(rand((2*TRANSITIONEDGE), world.maxx - (2*TRANSITIONEDGE)), rand((2*TRANSITIONEDGE), world.maxy - (2*TRANSITIONEDGE)), pick(target_z)), 2, bypass_area_flag = com.area_bypass)
|
||||
else
|
||||
. = do_teleport(M, com.target, bypass_area_flag = com.area_bypass)
|
||||
calibrated = FALSE
|
||||
if(accurate < 3)
|
||||
calibrated = FALSE
|
||||
|
||||
/obj/machinery/teleport/hub/update_icon()
|
||||
if(panel_open)
|
||||
|
||||
@@ -483,7 +483,7 @@
|
||||
if(R.can_synth && add_known_reagent(R.id, R.name))
|
||||
occupant_message("Reagent analyzed, identified as [R.name] and added to database.")
|
||||
send_byjax(chassis.occupant,"msyringegun.browser","reagents_form",get_reagents_form())
|
||||
occupant_message("Analyzis complete.")
|
||||
occupant_message("Analysis complete.")
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/add_known_reagent(r_id,r_name)
|
||||
|
||||
@@ -1200,7 +1200,8 @@
|
||||
|
||||
/obj/mecha/Exited(atom/movable/M, atom/newloc)
|
||||
if(occupant && occupant == M) // The occupant exited the mech without calling go_out()
|
||||
go_out(1, newloc)
|
||||
if(!isAI(occupant)) //This causes carded AIS to gib, so we do not want this to be called during carding.
|
||||
go_out(1, newloc)
|
||||
|
||||
/obj/mecha/proc/go_out(forced, atom/newloc = loc)
|
||||
if(!occupant)
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
var/precision = TRUE // how close to the portal you will teleport. FALSE = on the portal, TRUE = adjacent
|
||||
var/can_multitool_to_remove = FALSE
|
||||
var/ignore_tele_proof_area_setting = FALSE
|
||||
var/one_use = FALSE // Does this portal go away after one teleport?
|
||||
|
||||
/obj/effect/portal/New(loc, turf/target, creator = null, lifespan = 300)
|
||||
..()
|
||||
@@ -101,14 +102,17 @@
|
||||
|
||||
if(prob(failchance))
|
||||
icon_state = fail_icon
|
||||
if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space.
|
||||
var/list/target_z = levels_by_trait(SPAWN_RUINS)
|
||||
target_z -= M.z
|
||||
if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), pick(target_z)), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space.
|
||||
invalid_teleport()
|
||||
return FALSE
|
||||
else
|
||||
if(!do_teleport(M, target, precision, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to a turf adjacent to target.
|
||||
invalid_teleport()
|
||||
return FALSE
|
||||
|
||||
if(one_use)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
|
||||
/obj/effect/portal/proc/invalid_teleport()
|
||||
|
||||
@@ -50,6 +50,10 @@
|
||||
/obj/item/radio/beacon/bacon/proc/digest_delay()
|
||||
QDEL_IN(src, 600)
|
||||
|
||||
/obj/item/radio/beacon/emagged
|
||||
syndicate = TRUE
|
||||
emagged = TRUE
|
||||
|
||||
// SINGULO BEACON SPAWNER
|
||||
/obj/item/radio/beacon/syndicate
|
||||
name = "suspicious beacon"
|
||||
|
||||
@@ -273,20 +273,20 @@ effective or pretty fucking useless.
|
||||
/obj/item/teleporter/proc/dir_correction(mob/user) //Direction movement, screws with teleport distance and saving throw, and thus must be removed first
|
||||
var/temp_direction = user.dir
|
||||
switch(temp_direction)
|
||||
if(NORTHEAST || SOUTHEAST)
|
||||
if(NORTHEAST, SOUTHEAST)
|
||||
user.dir = EAST
|
||||
if(NORTHWEST || SOUTHWEST)
|
||||
if(NORTHWEST, SOUTHWEST)
|
||||
user.dir = WEST
|
||||
|
||||
/obj/item/teleporter/proc/panic_teleport(mob/user, turf/destination, direction = NORTH)
|
||||
var/saving_throw
|
||||
switch(direction)
|
||||
if(NORTH || SOUTH)
|
||||
if(NORTH, SOUTH)
|
||||
if(prob(50))
|
||||
saving_throw = EAST
|
||||
else
|
||||
saving_throw = WEST
|
||||
if(EAST || WEST)
|
||||
if(EAST, WEST)
|
||||
if(prob(50))
|
||||
saving_throw = NORTH
|
||||
else
|
||||
|
||||
@@ -28,5 +28,5 @@
|
||||
return TRUE
|
||||
|
||||
/obj/item/mounted/frame/apc_frame/do_build(turf/on_wall, mob/user)
|
||||
new /obj/machinery/power/apc(get_turf(src), get_dir(user, on_wall), 1)
|
||||
new /obj/machinery/power/apc(get_turf(src), get_dir(user, on_wall), TRUE)
|
||||
qdel(src)
|
||||
|
||||
@@ -19,7 +19,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
|
||||
new/datum/stack_recipe/window("fulltile window", /obj/structure/window/full/basic, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("fishbowl", /obj/machinery/fishtank/bowl, 1, time = 10), \
|
||||
new/datum/stack_recipe("fish tank", /obj/machinery/fishtank/tank, 3, time = 20, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("wall aquariam", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \
|
||||
new/datum/stack_recipe("wall aquarium", /obj/machinery/fishtank/wall, 4, time = 40, on_floor = TRUE) \
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/glass
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
|
||||
/obj/item/stock_parts/matter_bin
|
||||
name = "matter bin"
|
||||
desc = "A container for hold compressed matter awaiting re-construction."
|
||||
desc = "A container used to hold compressed matter awaiting re-construction."
|
||||
icon_state = "matter_bin"
|
||||
origin_tech = "materials=1"
|
||||
materials = list(MAT_METAL=80)
|
||||
@@ -145,7 +145,7 @@
|
||||
|
||||
/obj/item/stock_parts/matter_bin/adv
|
||||
name = "advanced matter bin"
|
||||
desc = "A container for hold compressed matter awaiting re-construction."
|
||||
desc = "A container used to hold compressed matter awaiting re-construction."
|
||||
icon_state = "advanced_matter_bin"
|
||||
origin_tech = "materials=3"
|
||||
rating = 2
|
||||
@@ -187,7 +187,7 @@
|
||||
|
||||
/obj/item/stock_parts/matter_bin/super
|
||||
name = "super matter bin"
|
||||
desc = "A container for hold compressed matter awaiting re-construction."
|
||||
desc = "A container used to hold compressed matter awaiting re-construction."
|
||||
icon_state = "super_matter_bin"
|
||||
origin_tech = "materials=4;engineering=4"
|
||||
rating = 3
|
||||
@@ -229,7 +229,7 @@
|
||||
|
||||
/obj/item/stock_parts/matter_bin/bluespace
|
||||
name = "bluespace matter bin"
|
||||
desc = "A container for hold compressed matter awaiting re-construction."
|
||||
desc = "A container used to hold compressed matter awaiting re-construction."
|
||||
icon_state = "bluespace_matter_bin"
|
||||
origin_tech = "materials=6;programming=4;engineering=4"
|
||||
rating = 4
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
/obj/item/storage/proc/show_to(mob/user)
|
||||
if(!user.client)
|
||||
return
|
||||
if(user.s_active != src) // Switching from another container
|
||||
if(user.s_active != src && !isobserver(user))
|
||||
for(var/obj/item/I in src)
|
||||
if(I.on_found(user)) // For mouse traps and such
|
||||
return // If something triggered, don't open the UI
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
/obj/structure/closet/syndicate/suits/populate_contents()
|
||||
new /obj/item/clothing/mask/gas/syndicate(src)
|
||||
new /obj/item/clothing/suit/space/hardsuit/syndi(src)
|
||||
new /obj/item/tank/jetpack/oxygen/harness(src)
|
||||
new /obj/item/tank/internals/oxygen/red(src)
|
||||
|
||||
/obj/structure/closet/syndicate/nuclear
|
||||
desc = "It's a storage unit for a Syndicate boarding party."
|
||||
@@ -37,6 +37,7 @@
|
||||
new /obj/item/storage/box/teargas(src)
|
||||
new /obj/item/storage/box/flashbangs(src)
|
||||
new /obj/item/storage/backpack/duffel/syndie/med(src)
|
||||
new /obj/item/tank/jetpack/oxygen/harness(src)
|
||||
new /obj/item/gun/projectile/automatic/shotgun/bulldog(src)
|
||||
new /obj/item/gun/projectile/automatic/shotgun/bulldog(src)
|
||||
new /obj/item/gun/projectile/automatic/shotgun/bulldog(src)
|
||||
@@ -50,7 +51,7 @@
|
||||
/obj/structure/closet/syndicate/sst/populate_contents()
|
||||
new /obj/item/ammo_box/magazine/mm556x45(src)
|
||||
new /obj/item/gun/projectile/automatic/l6_saw(src)
|
||||
new /obj/item/tank/jetpack/oxygen/harness(src)
|
||||
new /obj/item/tank/internals/oxygen/red(src)
|
||||
new /obj/item/storage/belt/military/sst(src)
|
||||
new /obj/item/clothing/glasses/thermal(src)
|
||||
new /obj/item/clothing/shoes/magboots/syndie/advance(src)
|
||||
|
||||
@@ -153,7 +153,7 @@ GLOBAL_VAR_INIT(sent_syndicate_strike_team, 0)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite/sst(src), slot_wear_suit)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
|
||||
equip_to_slot_or_del(new /obj/item/storage/belt/military/sst(src), slot_belt)
|
||||
equip_to_slot_or_del(new /obj/item/tank/jetpack/oxygen/harness(src), slot_s_store)
|
||||
equip_to_slot_or_del(new /obj/item/tank/internals/oxygen/red(src), slot_s_store)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/gun/projectile/automatic/l6_saw(src), slot_r_hand)
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/mm556x45(src), slot_in_backpack)
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
/datum/rep_purchase/item/pinpointer,
|
||||
/datum/rep_purchase/item/baton,
|
||||
/datum/rep_purchase/item/fulton,
|
||||
/datum/rep_purchase/item/flare,
|
||||
/datum/rep_purchase/blackout,
|
||||
/datum/rep_purchase/item/zippo,
|
||||
/datum/rep_purchase/item/balloon,
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* # Rep Purchase - Emergency escape flare
|
||||
*/
|
||||
/datum/rep_purchase/item/flare
|
||||
name = "Emergency extraction kit"
|
||||
description = "A kit that comes with an emergency escape flare, which will allow you to teleport to any beacon after a short activation delay. Also comes with a Syndicate teleporter beacon that only these flares and emagged teleporters can target."
|
||||
cost = 2
|
||||
stock = 3
|
||||
item_type = /obj/item/storage/box/syndie_kit/escape_flare
|
||||
@@ -421,6 +421,7 @@
|
||||
GLOB.admins -= src
|
||||
GLOB.directory -= ckey
|
||||
GLOB.clients -= src
|
||||
QDEL_NULL(chatOutput)
|
||||
if(movingmob)
|
||||
movingmob.client_mobs_in_contents -= mob
|
||||
UNSETEMPTY(movingmob.client_mobs_in_contents)
|
||||
|
||||
@@ -63,10 +63,6 @@
|
||||
display_name = "Fur Cap"
|
||||
path = /obj/item/clothing/head/furcap
|
||||
|
||||
/datum/gear/donor/mouse
|
||||
display_name = "Mouse Headband"
|
||||
path = /obj/item/clothing/head/kitty/mouse
|
||||
|
||||
/datum/gear/donor/fawkes
|
||||
display_name = "Guy Fawkes mask"
|
||||
path = /obj/item/clothing/mask/fawkes
|
||||
|
||||
@@ -509,8 +509,8 @@
|
||||
chameleon_action.emp_randomise(INFINITY)
|
||||
|
||||
/obj/item/storage/belt/chameleon
|
||||
name = "toolbelt"
|
||||
desc = "Holds tools."
|
||||
name = "tool-belt"
|
||||
desc = "Can hold various tools."
|
||||
var/datum/action/item_action/chameleon/change/chameleon_action
|
||||
|
||||
/obj/item/storage/belt/chameleon/Initialize(mapload)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
suit_adjusted = 1
|
||||
blood_overlay_type = "coat"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser)
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser, /obj/item/robotanalyzer)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
species_exception = list(/datum/species/golem)
|
||||
sprite_sheets = list(
|
||||
|
||||
@@ -38,7 +38,11 @@
|
||||
R.stamped += /obj/item/stamp
|
||||
R.overlays += stampoverlay
|
||||
R.stamps += "<HR><i>This paper has been stamped by the EFTPOS device.</i>"
|
||||
var/obj/item/smallDelivery/D = new(R.loc)
|
||||
var/obj/item/smallDelivery/D = new(get_turf(loc))
|
||||
if(istype(loc, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
if(H.back)
|
||||
D.forceMove(H.back)
|
||||
R.forceMove(D)
|
||||
D.wrapped = R
|
||||
D.name = "small parcel - 'EFTPOS access code'"
|
||||
|
||||
@@ -89,3 +89,87 @@
|
||||
if(ishuman(L))
|
||||
shake_camera(L, 20, 1)
|
||||
addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor
|
||||
name = "emergency extraction flare"
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
desc = "A single-use extraction flare that will let you create a portal to any beacon on the station. You must choose the destination beforehand, else it will target a random beacon. The portal is generated 5 seconds after activation, and has 1 use."
|
||||
icon_state = "flare-contractor"
|
||||
item_state = "flare"
|
||||
var/destination
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor/verb/set_destination()
|
||||
set category = "Object"
|
||||
set name = "Change Portal Destination"
|
||||
set src in usr
|
||||
|
||||
var/list/L = list()
|
||||
var/list/areaindex = list()
|
||||
|
||||
for(var/obj/item/radio/beacon/R in GLOB.beacons)
|
||||
var/turf/T = get_turf(R)
|
||||
if(!T)
|
||||
continue
|
||||
if(!is_teleport_allowed(T.z))
|
||||
continue
|
||||
var/tmpname = T.loc.name
|
||||
if(areaindex[tmpname])
|
||||
tmpname = "[tmpname] ([++areaindex[tmpname]])"
|
||||
else
|
||||
areaindex[tmpname] = 1
|
||||
L[tmpname] = R
|
||||
|
||||
var/desc = input("Please select a location to target.", "Flare Target Interface") in L
|
||||
destination = L[desc]
|
||||
return
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor/attack_self(mob/user) // message is later down
|
||||
activate(user, TRUE)
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor/activate(mob/user)
|
||||
if(!turf_check(user))
|
||||
return
|
||||
if(!destination)
|
||||
var/list/L = get_destinations(user)
|
||||
if(!length(L))
|
||||
to_chat(user, "<span class='warning'>[src] found no beacons in the sector to target.</span>")
|
||||
return
|
||||
destination = pick(L)
|
||||
var/obj/effect/temp_visual/getaway_flare/F = new(get_turf(src))
|
||||
user.visible_message("<span class='notice'>[user] pulls out a black and gold flare and lights it.</span>",\
|
||||
"<span class='notice'>You light an emergency extraction flare, initiating the extraction process.</span>")
|
||||
user.drop_item()
|
||||
forceMove(F)
|
||||
addtimer(CALLBACK(src, .proc/create_portal, destination), 5 SECONDS)
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor/proc/create_portal(turf/destination)
|
||||
new /obj/effect/decal/cleanable/ash(get_turf(src))
|
||||
new /obj/effect/portal/redspace/getaway(get_turf(src), get_turf(destination), src, 100)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor/emag_act(mob/user)
|
||||
to_chat(user, "<span class='warning'>Emagging [src] has no effect.</span>")
|
||||
|
||||
/obj/item/wormhole_jaunter/contractor/chasm_react(mob/user)
|
||||
return //This is not an instant getaway portal like the jaunter
|
||||
|
||||
/obj/item/storage/box/syndie_kit/escape_flare
|
||||
name = "emergency extraction kit"
|
||||
|
||||
/obj/item/storage/box/syndie_kit/escape_flare/populate_contents()
|
||||
new /obj/item/wormhole_jaunter/contractor(src)
|
||||
new /obj/item/radio/beacon/emagged(src)
|
||||
|
||||
/obj/effect/portal/redspace/getaway
|
||||
one_use = TRUE
|
||||
|
||||
/obj/effect/temp_visual/getaway_flare // Because the original contractor flare is not a temp visual, for some reason.
|
||||
name = "contractor extraction flare"
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "flare-contractor-on"
|
||||
duration = 5.1 SECONDS // Needs to be slightly longer then the callback to make the portal
|
||||
|
||||
/obj/effect/temp_visual/getaway_flare/Initialize()
|
||||
. = ..()
|
||||
playsound(loc, 'sound/goonstation/misc/matchstick_light.ogg', 50, TRUE)
|
||||
set_light(8, l_color = "#FFD165")
|
||||
|
||||
@@ -332,9 +332,6 @@
|
||||
else if(!client)
|
||||
msg += "[p_they(TRUE)] [p_have()] suddenly fallen asleep, suffering from Space Sleep Disorder. [p_they(TRUE)] may wake up soon.\n"
|
||||
|
||||
if(digitalcamo)
|
||||
msg += "[p_they(TRUE)] [p_are()] moving [p_their()] body in an unnatural and blatantly inhuman manner.\n"
|
||||
|
||||
if(!(skipface || ( wear_mask && ( wear_mask.flags_inv & HIDEFACE || wear_mask.flags_cover & MASKCOVERSMOUTH) ) ) && is_thrall(src) && in_range(user,src))
|
||||
msg += "Their features seem unnaturally tight and drawn.\n"
|
||||
|
||||
|
||||
@@ -551,7 +551,7 @@
|
||||
/obj/item/robot_module/miner/handle_custom_removal(component_id, mob/living/user, obj/item/W)
|
||||
if(component_id == "KA modkits")
|
||||
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/D in src)
|
||||
D.attackby(W, user)
|
||||
D.crowbar_act(user, W)
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -189,7 +189,7 @@ Difficulty: Very Hard
|
||||
var/turf/target_turf = get_turf(target)
|
||||
playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 2)
|
||||
newtonian_move(get_dir(target_turf, src))
|
||||
var/angle_to_target = Get_Angle(src, target_turf)
|
||||
var/angle_to_target = get_angle(src, target_turf)
|
||||
if(isnum(set_angle))
|
||||
angle_to_target = set_angle
|
||||
var/static/list/colossus_shotgun_shot_angles = list(12.5, 7.5, 2.5, -2.5, -7.5, -12.5)
|
||||
|
||||
@@ -105,6 +105,8 @@
|
||||
var/global/list/status_overlays_environ
|
||||
var/indestructible = 0 // If set, prevents aliens from destroying it
|
||||
var/keep_preset_name = 0
|
||||
/// Was this APC built instead of already existing? Used for malfhack to keep borgs from building apcs in space
|
||||
var/constructed = FALSE
|
||||
|
||||
var/report_power_alarm = TRUE
|
||||
|
||||
@@ -171,14 +173,13 @@
|
||||
operating = 0
|
||||
name = "[area.name] APC"
|
||||
stat |= MAINT
|
||||
constructed = TRUE
|
||||
update_icon()
|
||||
addtimer(CALLBACK(src, .proc/update), 5)
|
||||
|
||||
/obj/machinery/power/apc/Destroy()
|
||||
SStgui.close_uis(wires)
|
||||
GLOB.apcs -= src
|
||||
if(malfai && operating)
|
||||
malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000)
|
||||
area.power_light = 0
|
||||
area.power_equip = 0
|
||||
area.power_environ = 0
|
||||
@@ -973,6 +974,9 @@
|
||||
if(malf.malfhacking)
|
||||
to_chat(malf, "You are already hacking an APC.")
|
||||
return
|
||||
if(constructed)
|
||||
to_chat(malf, "<span class='warning'>This APC was only recently constructed, and is not fully linked to station systems. Hacking it would be pointless.</span>")
|
||||
return
|
||||
to_chat(malf, "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process.")
|
||||
malf.malfhack = src
|
||||
malf.malfhacking = addtimer(CALLBACK(malf, /mob/living/silicon/ai/.proc/malfhacked, src), 600, TIMER_STOPPABLE)
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
overlays += image('icons/obj/power.dmi', icon_state = "solar_panel-b", layer = FLY_LAYER)
|
||||
else
|
||||
overlays += image('icons/obj/power.dmi', icon_state = "solar_panel", layer = FLY_LAYER)
|
||||
src.dir = angle2dir(adir)
|
||||
set_angle(adir)
|
||||
return
|
||||
|
||||
//calculates the fraction of the sunlight that the panel recieves
|
||||
@@ -298,7 +298,7 @@
|
||||
if(autostart)
|
||||
search_for_connected()
|
||||
if(connected_tracker && track == TRACKER_AUTO)
|
||||
connected_tracker.set_angle(SSsun.angle)
|
||||
connected_tracker.modify_angle(SSsun.angle)
|
||||
set_panels(cdir)
|
||||
|
||||
/obj/machinery/power/solar_control/Destroy()
|
||||
@@ -338,7 +338,7 @@
|
||||
return
|
||||
|
||||
if(track == TRACKER_AUTO && connected_tracker) // auto-tracking
|
||||
connected_tracker.set_angle(SSsun.angle)
|
||||
connected_tracker.modify_angle(SSsun.angle)
|
||||
set_panels(cdir)
|
||||
updateDialog()
|
||||
|
||||
@@ -410,7 +410,7 @@
|
||||
track = text2num(params["track"])
|
||||
if(track == TRACKER_AUTO)
|
||||
if(connected_tracker)
|
||||
connected_tracker.set_angle(SSsun.angle)
|
||||
connected_tracker.modify_angle(SSsun.angle)
|
||||
set_panels(cdir)
|
||||
else if(track == TRACKER_TIMED)
|
||||
targetdir = cdir
|
||||
@@ -420,7 +420,7 @@
|
||||
if("refresh")
|
||||
search_for_connected()
|
||||
if(connected_tracker && track == TRACKER_AUTO)
|
||||
connected_tracker.set_angle(SSsun.angle)
|
||||
connected_tracker.modify_angle(SSsun.angle)
|
||||
set_panels(cdir)
|
||||
|
||||
/obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params)
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
update_icon()
|
||||
|
||||
//updates the tracker icon and the facing angle for the control computer
|
||||
/obj/machinery/power/tracker/proc/set_angle(angle)
|
||||
/obj/machinery/power/tracker/proc/modify_angle(angle)
|
||||
sun_angle = angle
|
||||
|
||||
//set icon dir to show sun illumination
|
||||
|
||||
@@ -275,7 +275,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R)
|
||||
if(..())
|
||||
if(!..())
|
||||
return
|
||||
|
||||
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules)
|
||||
|
||||
@@ -239,7 +239,7 @@
|
||||
if((!current || loc == current))
|
||||
current = locate(clamp(x + xo, 1, world.maxx), clamp(y + yo, 1, world.maxy), z)
|
||||
if(isnull(Angle))
|
||||
Angle = round(Get_Angle(src, current))
|
||||
Angle = round(get_angle(src, current))
|
||||
if(spread)
|
||||
Angle += (rand() - 0.5) * spread
|
||||
var/matrix/M = new
|
||||
|
||||
@@ -246,7 +246,7 @@
|
||||
|
||||
if(!operating)
|
||||
for (var/obj/item/O in holdingitems)
|
||||
processing_chamber += "\A [O.name]<BR>"
|
||||
processing_chamber += "\A [html_encode(O.name)]<BR>"
|
||||
|
||||
if (!processing_chamber)
|
||||
is_chamber_empty = 1
|
||||
|
||||
@@ -688,6 +688,25 @@
|
||||
M.bodytemperature = min(330, M.bodytemperature + (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/adminfreeze
|
||||
name = "Admin Freeze"
|
||||
id = "adminfreeze"
|
||||
description = "Ultimate Punishment."
|
||||
reagent_state = LIQUID
|
||||
color = "#30F0FF" // rgb: 048, 240, 255
|
||||
dizzy_adj = 4
|
||||
alcohol_perc = 1.5 // oof
|
||||
drink_icon = "adminfreeze"
|
||||
drink_name = "Admin Freeze"
|
||||
drink_desc = "The ultimate punishment."
|
||||
taste_description = "a series of bad decisions"
|
||||
|
||||
/datum/reagent/consumable/ethanol/adminfreeze/reaction_mob(mob/living/M, method = REAGENT_INGEST, volume)
|
||||
..()
|
||||
if(method == REAGENT_INGEST)
|
||||
M.apply_status_effect(/datum/status_effect/freon/watcher)
|
||||
M.adjust_bodytemperature(-110)
|
||||
|
||||
/datum/reagent/consumable/ethanol/barefoot
|
||||
name = "Barefoot"
|
||||
id = "barefoot"
|
||||
|
||||
@@ -443,6 +443,15 @@
|
||||
result_amount = 4
|
||||
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
|
||||
|
||||
/datum/chemical_reaction/adminfreeze
|
||||
name = "Admin Freeze"
|
||||
id = "adminfreeze"
|
||||
result = "adminfreeze"
|
||||
required_reagents = list("neurotoxin" = 1, "toxinsspecial" = 1, "fernet" = 1, "moonshine" = 1, "morphine" = 1)
|
||||
min_temp = T0C + 100
|
||||
result_amount = 5
|
||||
mix_sound = 'sound/effects/adminhelp.ogg'
|
||||
|
||||
/datum/chemical_reaction/barefoot
|
||||
name = "Barefoot"
|
||||
id = "barefoot"
|
||||
|
||||
@@ -37,6 +37,7 @@ var/list/chatResources = list(
|
||||
. = ..()
|
||||
|
||||
owner = C
|
||||
SSchat_pings.chat_datums += src
|
||||
|
||||
/datum/chatOutput/proc/start()
|
||||
if(!owner)
|
||||
@@ -126,14 +127,14 @@ var/list/chatResources = list(
|
||||
if(owner.tos_consent)
|
||||
sendClientData()
|
||||
|
||||
pingLoop()
|
||||
updatePing()
|
||||
|
||||
/datum/chatOutput/proc/pingLoop()
|
||||
set waitfor = FALSE
|
||||
|
||||
while (owner)
|
||||
ehjax_send(data = owner.is_afk(29 SECONDS) ? "softPang" : "pang") // SoftPang isn't handled anywhere but it'll always reset the opts.lastPang.
|
||||
sleep(30 SECONDS)
|
||||
// PARADISE EDIT: This just updates the ping and is called from SSchat_pings
|
||||
/datum/chatOutput/proc/updatePing()
|
||||
if(!owner)
|
||||
qdel(src)
|
||||
return
|
||||
ehjax_send(data = owner.is_afk(29 SECONDS) ? "softPang" : "pang") // SoftPang isn't handled anywhere but it'll always reset the opts.lastPang.
|
||||
|
||||
/datum/chatOutput/proc/ehjax_send(client/C = owner, window = "browseroutput", data)
|
||||
if(islist(data))
|
||||
@@ -221,6 +222,11 @@ var/list/chatResources = list(
|
||||
/datum/chatOutput/proc/clear_syndicate_codes()
|
||||
owner << output(null, "browseroutput:codewordsClear")
|
||||
|
||||
/datum/chatOutput/Destroy(force)
|
||||
SSchat_pings.chat_datums -= src
|
||||
return ..()
|
||||
|
||||
|
||||
/client/verb/debug_chat()
|
||||
set hidden = 1
|
||||
chatOutput.ehjax_send(data = list("firebug" = 1))
|
||||
|
||||
|
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 175 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 14 KiB |
@@ -194,6 +194,7 @@
|
||||
#include "code\controllers\subsystem\atoms.dm"
|
||||
#include "code\controllers\subsystem\blackbox.dm"
|
||||
#include "code\controllers\subsystem\changelog.dm"
|
||||
#include "code\controllers\subsystem\chat_pings.dm"
|
||||
#include "code\controllers\subsystem\cleanup.dm"
|
||||
#include "code\controllers\subsystem\dbcore.dm"
|
||||
#include "code\controllers\subsystem\discord.dm"
|
||||
@@ -1224,6 +1225,7 @@
|
||||
#include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\balloon.dm"
|
||||
#include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\baton.dm"
|
||||
#include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\blackout.dm"
|
||||
#include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\flare.dm"
|
||||
#include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\fulton.dm"
|
||||
#include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\pinpointer.dm"
|
||||
#include "code\modules\antagonists\traitor\contractor\datums\rep_purchases\reroll.dm"
|
||||
|
||||