cleanup of game folder, other fixes

This commit is contained in:
Poojawa
2018-01-31 06:39:18 -06:00
parent 56232d5d60
commit fb5de29784
87 changed files with 1030 additions and 2390 deletions
+3 -2
View File
@@ -28,8 +28,9 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
#define SCRIPTURE_APPLICATION "Application"
//Various costs related to power.
#define SCRIPT_UNLOCK_THRESHOLD 50000 //Scripts will unlock if the total power reaches this amount
#define APPLICATION_UNLOCK_THRESHOLD 100000 //Applications will unlock if the total powre reaches this amount
#define MAX_CLOCKWORK_POWER 50000 //The max power in W that the cult can stockpile
#define SCRIPT_UNLOCK_THRESHOLD 25000 //Scripts will unlock if the total power reaches this amount
#define APPLICATION_UNLOCK_THRESHOLD 40000 //Applications will unlock if the total powre reaches this amount
#define ABSCOND_ABDUCTION_COST 95
+5
View File
@@ -4,6 +4,11 @@
#define RUNE_COLOR_OFFER "#FFFFFF"
#define RUNE_COLOR_DARKRED "#7D1717"
#define RUNE_COLOR_MEDIUMRED "#C80000"
#define RUNE_COLOR_BURNTORANGE "#CC5500"
#define RUNE_COLOR_RED "#FF0000"
#define RUNE_COLOR_EMP "#4D94FF"
#define RUNE_COLOR_SUMMON "#00FF00"
//blood magic
#define MAX_BLOODCHARGE 5
#define RUNELESS_MAX_BLOODCHARGE 2
+2 -1
View File
@@ -65,7 +65,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define UNUSED_TRANSIT_TURF_1 2
#define CAN_BE_DIRTY_1 4 // If a turf can be made dirty at roundstart. This is also used in areas.
#define NO_DEATHRATTLE_1 16 // Do not notify deadchat about any deaths that occur on this turf.
#define NO_RUINS_1 32 //Blocks ruins spawning in the area
#define NO_RUINS_1 32 //Blocks ruins spawning on the turf
#define NO_LAVA_GEN_1 64 //Blocks lava rivers being generated on the turf
//#define CHECK_RICOCHET_1 32 //Same thing as atom flag.
/*
+1 -1
View File
@@ -34,7 +34,7 @@
#define HIGH_SIGIL_LAYER 2.56
#define BELOW_OPEN_DOOR_LAYER 2.6
#define SHUTTER_LAYER 2.65 //Prevents shutters from being placed above doors. It's overridden by /obj/machinery/door/New() & poddoor/shutters/New()
#define SHUTTER_LAYER 2.65 //Prevents shutters from being placed above doors. It's overridden by /obj/machinery/door/Initialize() & poddoor/shutters/Initialize()
#define OPEN_DOOR_LAYER 2.7
#define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible
#define TABLE_LAYER 2.8
+4 -1
View File
@@ -17,7 +17,9 @@
#define TRAIT_DISFIGURED "disfigured"
#define TRAIT_XENO_HOST "xeno_host" //Tracks whether we're gonna be a baby alien's mummy.
#define TRAIT_STUNIMMUNE "stun_immunity"
#define TRAIT_SLEEPIMMUNE "sleep_immunity"
#define TRAIT_PUSHIMMUNE "push_immunity"
#define TRAIT_SHOCKIMMUNE "shock_immunity"
// common trait sources
#define TRAIT_GENERIC "generic"
@@ -32,6 +34,7 @@
// unique trait sources, still defines
#define STATUE_MUTE "statue"
#define CHANGELING_DRAIN "drain"
#define CHANGELING_HIVEMIND_MUTE "ling_mute"
#define ABYSSAL_GAZE_BLIND "abyssal_gaze"
#define HIGHLANDER "highlander"
#define TRAIT_HULK "hulk"
#define TRAIT_HULK "hulk"
+3 -2
View File
@@ -42,12 +42,13 @@
if(turfs.len > BP_MAX_ROOM_SIZE)
to_chat(creator, "<span class='warning'>The room you're in is too big. It is [((turfs.len / BP_MAX_ROOM_SIZE)-1)*100]% larger than allowed.</span>")
return
// This will fuck up shuttles that use the base area type but we need to fix those anyway
var/list/areas = list("New Area" = /area, "New Shuttle Area" = /area/shuttle/custom)
var/list/areas = list("New Area" = /area)
for(var/i in 1 to turfs.len)
var/area/place = get_area(turfs[i])
if(blacklisted_areas[place.type])
continue
if(!place.requires_power || place.noteleport || place.hidden)
continue // No expanding powerless rooms etc
areas[place.name] = place
var/area_choice = input(creator, "Choose an area to expand or make a new area.", "Area Expansion") as null|anything in areas
area_choice = areas[area_choice]
+4 -4
View File
@@ -330,20 +330,20 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
var/datum/objective/eldergod/summon_objective = locate() in antag.cult_team.objectives
if(!summon_objective)
return
desc = "The sacrifice is complete, summon Nar-Sie! The summoning can only take place in [english_list(summon_objective.summon_spots)]!"
if(icon_state == "runed_sense1")
return
animate(src, transform = null, time = 1, loop = 0)
angle = 0
cut_overlays()
icon_state = "runed_sense1"
desc = "The sacrifice is complete, summon Nar-Sie! The summoning can only take place in [english_list(summon_objective.summon_spots)]!"
add_overlay(narnar)
return
var/turf/P = get_turf(blood_target)
var/turf/Q = get_turf(mob_viewer)
if(P.z != Q.z) //The target is on a different Z level, we cannot sense that far.
if(!P || !Q || (P.z != Q.z)) //The target is on a different Z level, we cannot sense that far.
icon_state = "runed_sense2"
desc = "[blood_target] is no longer in your sector, you cannot sense its presence here."
desc = "You can no longer sense your target's presence."
return
desc = "You are currently tracking [blood_target] in [get_area_name(blood_target)]."
var/target_angle = Get_Angle(Q, P)
@@ -419,7 +419,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
time_name = "until the Ark finishes summoning"
if(time_info)
textlist += "<b>[time_info / 60] minutes</b> [time_name].<br>"
textlist += "<b>[DisplayPower(get_clockwork_power())]</b> power available for use."
textlist += "<b>[DisplayPower(get_clockwork_power())] / [DisplayPower(MAX_CLOCKWORK_POWER)]</b> power available for use."
desc = textlist.Join()
..()
+5 -3
View File
@@ -546,7 +546,11 @@
plane = SPLASHSCREEN_PLANE
var/client/holder
/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE
INITIALIZE_IMMEDIATE(/obj/screen/splash)
/obj/screen/splash/Initialize(client/C, visible, use_previous_title)
. = ..()
holder = C
if(!visible)
@@ -563,8 +567,6 @@
holder.screen += src
..()
/obj/screen/splash/proc/Fade(out, qdel_after = TRUE)
if(QDELETED(src))
return
+1 -1
View File
@@ -23,7 +23,7 @@ SUBSYSTEM_DEF(communications)
minor_announce(html_decode(input),"[user.name] Announces:")
silicon_message_cooldown = world.time + COMMUNICATION_COOLDOWN_AI
else
priority_announce(html_decode(input), null, 'sound/misc/announce.ogg', "Captain")
priority_announce(html_decode(user.treat_message(input)), null, 'sound/misc/announce.ogg', "Captain")
nonsilicon_message_cooldown = world.time + COMMUNICATION_COOLDOWN
log_talk(user,"[key_name(user)] has made a priority announcement: [input]",LOGSAY)
message_admins("[key_name_admin(user)] has made a priority announcement.")
+18 -6
View File
@@ -1,14 +1,26 @@
#define FAILED_DB_CONNECTION_CUTOFF 5
#define DM_DEFAULT_CURSOR 0
SUBSYSTEM_DEF(dbcore)
name = "Database"
flags = SS_NO_FIRE
init_order = INIT_ORDER_DBCORE
var/const/FAILED_DB_CONNECTION_CUTOFF = 5
var/const/Default_Cursor = 0
var/const/Client_Cursor = 1
var/const/Server_Cursor = 2
//conversions
var/const/TEXT_CONV = 1
var/const/RSC_FILE_CONV = 2
var/const/NUMBER_CONV = 3
//column flag values:
var/const/IS_NUMERIC = 1
var/const/IS_BINARY = 2
var/const/IS_NOT_NULL = 4
var/const/IS_PRIMARY_KEY = 8
var/const/IS_UNSIGNED = 16
var/schema_mismatch = 0
var/db_minor = 0
var/db_major = 0
// TODO: Investigate more recent type additions and see if I can handle them. - Nadrew
var/_db_con// This variable contains a reference to the actual database connection.
var/failed_connections = 0
@@ -34,7 +46,7 @@ SUBSYSTEM_DEF(dbcore)
//This is as close as we can get to the true round end before Disconnect() without changing where it's called, defeating the reason this is a subsystem
if(SSdbcore.Connect())
var/sql_station_name = sanitizeSQL(station_name())
var/datum/DBQuery/query_round_end = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET end_datetime = Now(), game_mode_result = '[SSticker.mode_result]', end_state = '[SSticker.end_state]', station_name = '[sql_station_name]' WHERE id = [GLOB.round_id]")
var/datum/DBQuery/query_round_end = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET end_datetime = Now(), game_mode_result = '[sanitizeSQL(SSticker.mode_result)]', end_state = '[sanitizeSQL(SSticker.end_state)]', station_name = '[sql_station_name]' WHERE id = [GLOB.round_id]")
query_round_end.Execute()
if(IsConnected())
Disconnect()
@@ -64,7 +76,7 @@ SUBSYSTEM_DEF(dbcore)
var/address = CONFIG_GET(string/address)
var/port = CONFIG_GET(number/port)
_dm_db_connect(_db_con, "dbi:mysql:[db]:[address]:[port]", user, pass, DM_DEFAULT_CURSOR, null)
_dm_db_connect(_db_con, "dbi:mysql:[db]:[address]:[port]", user, pass, Default_Cursor, null)
. = IsConnected()
if (!.)
log_sql("Connect() failed | [ErrorMsg()]")
@@ -117,7 +129,7 @@ SUBSYSTEM_DEF(dbcore)
return "Database disabled by configuration"
return _dm_db_error_msg(_db_con)
/datum/controller/subsystem/dbcore/proc/NewQuery(sql_query, cursor_handler = DM_DEFAULT_CURSOR)
/datum/controller/subsystem/dbcore/proc/NewQuery(sql_query, cursor_handler = Default_Cursor)
if(IsAdminAdvancedProcCall())
log_admin_private("ERROR: Advanced admin proc call led to sql query: [sql_query]. Query has been blocked")
message_admins("ERROR: Advanced admin proc call led to sql query. Query has been blocked")
+27
View File
@@ -454,7 +454,34 @@
name = "Use [target.name]"
button.name = name
/datum/action/item_action/cult_dagger
name = "Draw Blood Rune"
desc = "Use the ritual dagger to create a powerful blood rune"
icon_icon = 'icons/mob/actions/actions_cult.dmi'
button_icon_state = "draw"
buttontooltipstyle = "cult"
background_icon_state = "bg_demon"
/datum/action/item_action/cult_dagger/Grant(mob/M)
if(iscultist(M))
..()
button.screen_loc = "6:157,4:-2"
button.moved = "6:157,4:-2"
else
Remove(owner)
/datum/action/item_action/cult_dagger/Trigger()
for(var/obj/item/H in owner.held_items) //In case we were already holding another dagger
if(istype(H, /obj/item/melee/cultblade/dagger))
H.attack_self(owner)
return
var/obj/item/I = target
if(owner.can_equip(I, slot_hands))
owner.temporarilyRemoveItemFromInventory(I)
owner.put_in_hands(I)
I.attack_self(owner)
else
to_chat(owner, "<span class='cultitalic'>Your hands are full!</span>")
//Preset for spells
+3
View File
@@ -73,6 +73,9 @@
// Randomly pick a symptom to activate.
/datum/disease/advance/stage_act()
..()
if(carrier)
return
if(symptoms && symptoms.len)
if(!processing)
+11 -1
View File
@@ -34,4 +34,14 @@
#undef RAD_GEIGER_LOW
#undef RAD_GEIGER_MEDIUM
#undef RAD_GEIGER_HIGH
#undef RAD_GEIGER_HIGH
/datum/looping_sound/reverse_bear_trap
mid_sounds = list('sound/effects/clock_tick.ogg')
mid_length = 3.5
volume = 25
/datum/looping_sound/reverse_bear_trap_beep
mid_sounds = list('sound/machines/beep.ogg')
mid_length = 60
volume = 10
+1 -1
View File
@@ -5,7 +5,7 @@
get_chance = 15
lowest_value = 256 * 12
text_gain_indication = "<span class='notice'>Your muscles hurt!</span>"
species_allowed = list("fly") //no skeleton/lizard hulk
species_allowed = list("human") //no skeleton/lizard hulk
health_req = 25
/datum/mutation/human/hulk/on_acquiring(mob/living/carbon/human/owner)
+24 -8
View File
@@ -1,9 +1,14 @@
//Designed for things that need precision trajectories like projectiles.
//Don't use this for anything that you don't absolutely have to use this with (like projectiles!) because it isn't worth using a datum unless you need accuracy down to decimal places in pixels.
//You might see places where it does - 16 - 1. This is intentionally 17 instead of 16, because of how byond's tiles work and how not doing it will result in rounding errors like things getting put on the wrong turf.
#define RETURN_PRECISE_POSITION(A) new /datum/position(A)
#define RETURN_PRECISE_POINT(A) new /datum/point(A)
#define RETURN_POINT_VECTOR(ATOM, ANGLE, SPEED) {new /datum/point/vector(ATOM, null, null, null, null, ANGLE, SPEED)}
#define RETURN_POINT_VECTOR_INCREMENT(ATOM, ANGLE, SPEED, AMT) {new /datum/point/vector(ATOM, null, null, null, null, ANGLE, SPEED, AMT)}
/datum/position //For positions with map x/y/z and pixel x/y so you don't have to return lists. Could use addition/subtraction in the future I guess.
var/x = 0
var/y = 0
@@ -50,8 +55,8 @@
/proc/point_midpoint_points(datum/point/a, datum/point/b) //Obviously will not support multiZ calculations! Same for the two below.
var/datum/point/P = new
P.x = round(a.x + (b.x - a.x) / 2, 1)
P.y = round(a.y + (b.y - a.y) / 2, 1)
P.x = a.x + (b.x - a.x) / 2
P.y = a.y + (b.y - a.y) / 2
P.z = a.z
return P
@@ -94,12 +99,21 @@
/datum/point/proc/initialize_location(tile_x, tile_y, tile_z, p_x = 0, p_y = 0)
if(!isnull(tile_x))
x = ((tile_x - 1) * world.icon_size) + world.icon_size / 2 + p_x
x = ((tile_x - 1) * world.icon_size) + world.icon_size / 2 + p_x + 1
if(!isnull(tile_y))
y = ((tile_y - 1) * world.icon_size) + world.icon_size / 2+ p_y
y = ((tile_y - 1) * world.icon_size) + world.icon_size / 2 + p_y + 1
if(!isnull(tile_z))
z = tile_z
/datum/point/proc/debug_out()
var/turf/T = return_turf()
return "\ref[src] aX [x] aY [y] aZ [z] pX [return_px()] pY [return_py()] mX [T.x] mY [T.y] mZ [T.z]"
/datum/point/proc/move_atom_to_src(atom/movable/AM)
AM.forceMove(return_turf())
AM.pixel_x = return_px()
AM.pixel_y = return_py()
/datum/point/proc/return_turf()
return locate(CEILING(x / world.icon_size, 1), CEILING(y / world.icon_size, 1), z)
@@ -110,10 +124,10 @@
return new /datum/position(src)
/datum/point/proc/return_px()
return MODULUS(x, world.icon_size) - 16
return MODULUS(x, world.icon_size) - 16 - 1
/datum/point/proc/return_py()
return MODULUS(y, world.icon_size) - 16
return MODULUS(y, world.icon_size) - 16 - 1
/datum/point/proc/mapcheck()
. = FALSE
@@ -153,9 +167,11 @@
var/starting_y = 0
var/starting_z = 0
/datum/point/vector/New(_x, _y, _z, _pixel_x = 0, _pixel_y = 0, _angle, _speed)
/datum/point/vector/New(_x, _y, _z, _pixel_x = 0, _pixel_y = 0, _angle, _speed, initial_increment = 0)
..()
initialize_trajectory(_speed, _angle)
if(initial_increment)
increment(initial_increment)
/datum/point/vector/initialize_location(tile_x, tile_y, tile_z, p_x = 0, p_y = 0)
. = ..()
@@ -236,4 +252,4 @@
var/needed_time = world.time - last_move
last_process = world.time
last_move = world.time
increment(needed_time)
increment(needed_time / SSprojectiles.wait)
+7 -1
View File
@@ -261,4 +261,10 @@
suffix = "whiteshipruin_box.dmm"
name = "NT Medical Ship"
description = "An ancient ship, said to be among the first discovered derelicts near Space Station 13 that was still in working order. \
Aged and deprecated by time, this relic of a vessel is now broken beyond repair."
Aged and deprecated by time, this relic of a vessel is now broken beyond repair."
/datum/map_template/ruin/space/whiteshipdock
id = "whiteshipdock"
suffix = "whiteshipdock.dmm"
name = "Whiteship Dock"
description = "An abandoned but functional vessel parked in deep space, ripe for the taking."
+13 -4
View File
@@ -18,23 +18,30 @@
switch(user.lingcheck())
if(LINGHIVE_LINK)
var/msg = "<i><font color=#800040><b>[user.mind]:</b> [message]</font></i>"
for(var/_M in GLOB.mob_list)
for(var/_M in GLOB.player_list)
var/mob/M = _M
if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
to_chat(M, "[link] [msg]")
else
switch(M.lingcheck())
if(LINGHIVE_LINK, LINGHIVE_LING)
if (LINGHIVE_LING)
var/mob/living/L = M
if (!L.has_trait(CHANGELING_HIVEMIND_MUTE))
to_chat(M, msg)
if(LINGHIVE_LINK)
to_chat(M, msg)
if(LINGHIVE_OUTSIDER)
if(prob(40))
to_chat(M, "<i><font color=#800080>We can faintly sense an outsider trying to communicate through the hivemind...</font></i>")
if(LINGHIVE_LING)
if (user.has_trait(CHANGELING_HIVEMIND_MUTE))
to_chat(user, "<span class='warning'>The poison in the air hinders our ability to interact with the hivemind.</span>")
return FALSE
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/msg = "<i><font color=#800080><b>[changeling.changelingID]:</b> [message]</font></i>"
log_talk(user,"[changeling.changelingID]/[user.key] : [message]",LOGSAY)
for(var/_M in GLOB.mob_list)
for(var/_M in GLOB.player_list)
var/mob/M = _M
if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
@@ -44,7 +51,9 @@
if(LINGHIVE_LINK)
to_chat(M, msg)
if(LINGHIVE_LING)
to_chat(M, msg)
var/mob/living/L = M
if (!L.has_trait(CHANGELING_HIVEMIND_MUTE))
to_chat(M, msg)
if(LINGHIVE_OUTSIDER)
if(prob(40))
to_chat(M, "<i><font color=#800080>We can faintly sense another of our kind trying to communicate through the hivemind...</font></i>")
+4
View File
@@ -245,6 +245,10 @@
duration = -1
alert_type = null
/datum/status_effect/cultghost/on_apply()
owner.see_invisible = SEE_INVISIBLE_OBSERVER
owner.see_in_dark = 2
/datum/status_effect/cultghost/tick()
if(owner.reagents)
owner.reagents.del_reagent("holywater") //can't be deconverted
+21 -1
View File
@@ -109,6 +109,12 @@
if(cut_wires.len == wires.len)
return TRUE
/datum/wires/proc/is_dud(wire)
return dd_hasprefix(wire, WIRE_DUD_PREFIX)
/datum/wires/proc/is_dud_color(color)
return is_dud(get_wire(color))
/datum/wires/proc/cut(wire)
if(is_cut(wire))
cut_wires -= wire
@@ -208,10 +214,24 @@
/datum/wires/ui_data(mob/user)
var/list/data = list()
var/list/payload = list()
var/reveal_wires = FALSE
// Admin ghost can see a purpose of each wire.
if(IsAdminGhost(user))
reveal_wires = TRUE
// Same for anyone with an abductor multitool.
else if(user.is_holding_item_of_type(/obj/item/device/multitool/abductor))
reveal_wires = TRUE
// Station blueprints do that too, but only if the wires are not randomized.
else if(user.is_holding_item_of_type(/obj/item/areaeditor/blueprints) && !randomize)
reveal_wires = TRUE
for(var/color in colors)
payload.Add(list(list(
"color" = color,
"wire" = (IsAdminGhost(user) || (user.is_holding_item_of_type(/obj/item/device/multitool/abductor)) ? get_wire(color) : null),
"wire" = ((reveal_wires && !is_dud_color(color)) ? get_wire(color) : null),
"cut" = is_color_cut(color),
"attached" = is_attached(color)
)))
-128
View File
@@ -1,128 +0,0 @@
//DERELICT
/area/derelict
name = "Derelict Station"
icon_state = "storage"
blob_allowed = FALSE //Nope, no winning on the derelict as a blob. Gotta eat the station.
/area/derelict/hallway/primary
name = "Derelict Primary Hallway"
icon_state = "hallP"
/area/derelict/hallway/secondary
name = "Derelict Secondary Hallway"
icon_state = "hallS"
/area/derelict/hallway/primary/port
name = "Derelict Port Hallway"
icon_state = "hallFP"
/area/derelict/arrival
name = "Derelict Arrival Centre"
icon_state = "yellow"
/area/derelict/storage/equipment
name = "Derelict Equipment Storage"
/area/derelict/storage/storage_access
name = "Derelict Storage Access"
/area/derelict/storage/engine_storage
name = "Derelict Engine Storage"
icon_state = "green"
/area/derelict/bridge
name = "Derelict Control Room"
icon_state = "bridge"
/area/derelict/secret
name = "Derelict Secret Room"
icon_state = "library"
/area/derelict/bridge/access
name = "Derelict Control Room Access"
icon_state = "auxstorage"
/area/derelict/bridge/ai_upload
name = "Derelict Computer Core"
icon_state = "ai"
/area/derelict/solar_control
name = "Derelict Solar Control"
icon_state = "engine"
/area/derelict/se_solar
name = "South East Solars"
icon_state = "engine"
/area/derelict/crew_quarters
name = "Derelict Crew Quarters"
icon_state = "fitness"
/area/derelict/medical
name = "Derelict Medbay"
icon_state = "medbay"
/area/derelict/medical/morgue
name = "Derelict Morgue"
icon_state = "morgue"
/area/derelict/medical/chapel
name = "Derelict Chapel"
icon_state = "chapel"
/area/derelict/teleporter
name = "Derelict Teleporter"
icon_state = "teleporter"
/area/derelict/eva
name = "Derelict EVA Storage"
icon_state = "eva"
/area/derelict/ship
name = "Abandoned Ship"
icon_state = "yellow"
/area/solar/derelict_starboard
name = "Derelict Starboard Solar Array"
icon_state = "panelsS"
/area/solar/derelict_aft
name = "Derelict Aft Solar Array"
icon_state = "yellow"
/area/derelict/singularity_engine
name = "Derelict Singularity Engine"
icon_state = "engine"
/area/derelict/gravity_generator
name = "Derelict Gravity Generator Room"
icon_state = "red"
/area/derelict/atmospherics
name = "Derelict Atmospherics"
icon_state = "red"
//DJSTATION
/area/djstation
name = "Ruskie DJ Station"
icon_state = "DJ"
has_gravity = TRUE
blob_allowed = FALSE //Nope, no winning on the DJ station as a blob. Gotta eat the main station.
/area/djstation/solars
name = "DJ Station Solars"
icon_state = "DJ"
has_gravity = TRUE
//ABANDONED TELEPORTER
/area/AIsattele
name = "Abandoned Teleporter"
icon_state = "teleporter"
music = "signal"
ambientsounds = list('sound/ambience/ambimalf.ogg')
+2 -2
View File
@@ -17,8 +17,8 @@
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/machinery/button/New(loc, ndir = 0, built = 0)
..()
/obj/machinery/button/Initialize(mapload, ndir = 0, built = 0)
. = ..()
if(built)
setDir(ndir)
pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
+2 -2
View File
@@ -88,8 +88,8 @@
var/read_only = 0 //Well,it's still a floppy disk
//Disk stuff.
/obj/item/disk/data/New()
..()
/obj/item/disk/data/Initialize()
. = ..()
icon_state = "datadisk[rand(0,6)]"
add_overlay("datadisk_gene")
+2 -1
View File
@@ -44,7 +44,8 @@
/obj/item/grenade/chem_grenade/glitter/blue = 1,
/obj/item/grenade/chem_grenade/glitter/white = 1,
/obj/item/toy/eightball = 2,
/obj/item/toy/windupToolbox = 2)
/obj/item/toy/windupToolbox = 2,
/obj/item/extendohand/acme = 1)
light_color = LIGHT_COLOR_GREEN
@@ -41,7 +41,7 @@
state = 0
return
if(istype(P, /obj/item/circuitboard/computer) && !circuit)
if(!user.transferItemToLoc(P, null))
if(!user.transferItemToLoc(P, src))
return
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
to_chat(user, "<span class='notice'>You place [P] inside the frame.</span>")
-468
View File
@@ -1,468 +0,0 @@
// Allows you to monitor messages that passes the server.
/obj/machinery/computer/message_monitor
name = "message monitor console"
desc = "Used to Monitor the crew's messages, that are sent via PDA. Can also be used to view Request Console messages."
icon_screen = "comm_logs"
circuit = /obj/item/circuitboard/computer/message_monitor
//Server linked to.
var/obj/machinery/message_server/linkedServer = null
//Sparks effect - For emag
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread
//Messages - Saves me time if I want to change something.
var/noserver = "<span class='alert'>ALERT: No server detected.</span>"
var/incorrectkey = "<span class='warning'>ALERT: Incorrect decryption key!</span>"
var/defaultmsg = "<span class='notice'>Welcome. Please select an option.</span>"
var/rebootmsg = "<span class='warning'>%$&(: Critical %$$@ Error // !RestArting! <lOadiNg backUp iNput ouTput> - ?pLeaSe wAit!</span>"
//Computer properties
var/screen = 0 // 0 = Main menu, 1 = Message Logs, 2 = Hacked screen, 3 = Custom Message
var/hacking = 0 // Is it being hacked into by the AI/Cyborg
var/message = "<span class='notice'>System bootup complete. Please select an option.</span>" // The message that shows on the main menu.
var/auth = 0 // Are they authenticated?
var/optioncount = 7
// Custom Message Properties
var/customsender = "System Administrator"
var/obj/item/device/pda/customrecepient = null
var/customjob = "Admin"
var/custommessage = "This is a test, please ignore."
light_color = LIGHT_COLOR_GREEN
/obj/machinery/computer/message_monitor/attackby(obj/item/O, mob/living/user, params)
if(istype(O, /obj/item/screwdriver) && emagged)
//Stops people from just unscrewing the monitor and putting it back to get the console working again.
to_chat(user, "<span class='warning'>It is too hot to mess with!</span>")
else
return ..()
/obj/machinery/computer/message_monitor/emag_act(mob/user)
if(emagged)
return
if(!isnull(src.linkedServer))
emagged = TRUE
screen = 2
spark_system.set_up(5, 0, src)
src.spark_system.start()
var/obj/item/paper/monitorkey/MK = new(loc)
// Will help make emagging the console not so easy to get away with.
MK.info += "<br><br><font color='red'>%@%(*$%&(&?*(%&/{}</font>"
var/time = 100 * length(src.linkedServer.decryptkey)
addtimer(CALLBACK(src, .proc/UnmagConsole), time)
message = rebootmsg
else
to_chat(user, "<span class='notice'>A no server error appears on the screen.</span>")
/obj/machinery/computer/message_monitor/Initialize()
. = ..()
//Is the server isn't linked to a server, and there's a server available, default it to the first one in the list.
if(!linkedServer)
if(GLOB.message_servers && GLOB.message_servers.len > 0)
linkedServer = GLOB.message_servers[1]
/obj/machinery/computer/message_monitor/attack_hand(mob/living/user)
if(..())
return
//If the computer is being hacked or is emagged, display the reboot message.
if(hacking || emagged)
message = rebootmsg
var/dat = "<center><font color='blue'[message]</font>/</center>"
if(auth)
dat += "<h4><dd><A href='?src=[REF(src)];auth=1'>&#09;<font color='green'>\[Authenticated\]</font></a>&#09;/"
dat += " Server Power: <A href='?src=[REF(src)];active=1'>[src.linkedServer && src.linkedServer.active ? "<font color='green'>\[On\]</font>":"<font color='red'>\[Off\]</font>"]</a></h4>"
else
dat += "<h4><dd><A href='?src=[REF(src)];auth=1'>&#09;<font color='red'>\[Unauthenticated\]</font></a>&#09;/"
dat += " Server Power: <u>[src.linkedServer && src.linkedServer.active ? "<font color='green'>\[On\]</font>":"<font color='red'>\[Off\]</font>"]</u></h4>"
if(hacking || emagged)
screen = 2
else if(!auth || !linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
screen = 0
switch(screen)
//Main menu
if(0)
//&#09; = TAB
var/i = 0
dat += "<dd><A href='?src=[REF(src)];find=1'>&#09;[++i]. Link To A Server</a></dd>"
if(auth)
if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
dat += "<dd><A>&#09;ERROR: Server not found!</A><br></dd>"
else
dat += "<dd><A href='?src=[REF(src)];view=1'>&#09;[++i]. View Message Logs </a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];viewr=1'>&#09;[++i]. View Request Console Logs </a></br></dd>"
dat += "<dd><A href='?src=[REF(src)];clear=1'>&#09;[++i]. Clear Message Logs</a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];clearr=1'>&#09;[++i]. Clear Request Console Logs</a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];pass=1'>&#09;[++i]. Set Custom Key</a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];msg=1'>&#09;[++i]. Send Admin Message</a><br></dd>"
else
for(var/n = ++i; n <= optioncount; n++)
dat += "<dd><font color='blue'>&#09;[n]. ---------------</font><br></dd>"
if(issilicon(usr) && is_special_character(usr))
//Malf/Traitor AIs can bruteforce into the system to gain the Key.
dat += "<dd><A href='?src=[REF(src)];hack=1'><i><font color='Red'>*&@#. Bruteforce Key</font></i></font></a><br></dd>"
else
dat += "<br>"
//Bottom message
if(!auth)
dat += "<br><hr><dd><span class='notice'>Please authenticate with the server in order to show additional options.</span>"
else
dat += "<br><hr><dd><span class='warning'>Reg, #514 forbids sending messages to a Head of Staff containing Erotic Rendering Properties.</span>"
//Message Logs
if(1)
var/index = 0
dat += "<center><A href='?src=[REF(src)];back=1'>Back</a> - <A href='?src=[REF(src)];refresh=1'>Refresh</center><hr>"
dat += "<table border='1' width='100%'><tr><th width = '5%'>X</th><th width='15%'>Sender</th><th width='15%'>Recipient</th><th width='300px' word-wrap: break-word>Message</th></tr>"
for(var/datum/data_pda_msg/pda in src.linkedServer.pda_msgs)
index++
if(index > 3000)
break
// Del - Sender - Recepient - Message
// X - Al Green - Your Mom - WHAT UP!?
dat += "<tr><td width = '5%'><center><A href='?src=[REF(src)];delete=[REF(pda)]' style='color: rgb(255,0,0)'>X</a></center></td><td width='15%'>[pda.sender]</td><td width='15%'>[pda.recipient]</td><td width='300px'>[pda.message][pda.photo ? "<a href='byond://?src=[REF(pda)];photo=1'>(Photo)</a>":""]</td></tr>"
dat += "</table>"
//Hacking screen.
if(2)
if(isAI(user) || iscyborg(user))
dat += "Brute-forcing for server key.<br> It will take 20 seconds for every character that the password has."
dat += "In the meantime, this console can reveal your true intentions if you let someone access it. Make sure no humans enter the room during that time."
else
//It's the same message as the one above but in binary. Because robots understand binary and humans don't... well I thought it was clever.
dat += {"01000010011100100111010101110100011001010010110<br>
10110011001101111011100100110001101101001011011100110011<br>
10010000001100110011011110111001000100000011100110110010<br>
10111001001110110011001010111001000100000011010110110010<br>
10111100100101110001000000100100101110100001000000111011<br>
10110100101101100011011000010000001110100011000010110101<br>
10110010100100000001100100011000000100000011100110110010<br>
10110001101101111011011100110010001110011001000000110011<br>
00110111101110010001000000110010101110110011001010111001<br>
00111100100100000011000110110100001100001011100100110000<br>
10110001101110100011001010111001000100000011101000110100<br>
00110000101110100001000000111010001101000011001010010000<br>
00111000001100001011100110111001101110111011011110111001<br>
00110010000100000011010000110000101110011001011100010000<br>
00100100101101110001000000111010001101000011001010010000<br>
00110110101100101011000010110111001110100011010010110110<br>
10110010100101100001000000111010001101000011010010111001<br>
10010000001100011011011110110111001110011011011110110110<br>
00110010100100000011000110110000101101110001000000111001<br>
00110010101110110011001010110000101101100001000000111100<br>
10110111101110101011100100010000001110100011100100111010<br>
10110010100100000011010010110111001110100011001010110111<br>
00111010001101001011011110110111001110011001000000110100<br>
10110011000100000011110010110111101110101001000000110110<br>
00110010101110100001000000111001101101111011011010110010<br>
10110111101101110011001010010000001100001011000110110001<br>
10110010101110011011100110010000001101001011101000010111<br>
00010000001001101011000010110101101100101001000000111001<br>
10111010101110010011001010010000001101110011011110010000<br>
00110100001110101011011010110000101101110011100110010000<br>
00110010101101110011101000110010101110010001000000111010<br>
00110100001100101001000000111001001101111011011110110110<br>
10010000001100100011101010111001001101001011011100110011<br>
10010000001110100011010000110000101110100001000000111010<br>
001101001011011010110010100101110"}
//Fake messages
if(3)
dat += "<center><A href='?src=[REF(src)];back=1'>Back</a> - <A href='?src=[REF(src)];Reset=1'>Reset</a></center><hr>"
dat += {"<table border='1' width='100%'>
<tr><td width='20%'><A href='?src=[REF(src)];select=Sender'>Sender</a></td>
<td width='20%'><A href='?src=[REF(src)];select=RecJob'>Sender's Job</a></td>
<td width='20%'><A href='?src=[REF(src)];select=Recepient'>Recipient</a></td>
<td width='300px' word-wrap: break-word><A href='?src=[REF(src)];select=Message'>Message</a></td></tr>"}
//Sender - Sender's Job - Recepient - Message
//Al Green- Your Dad - Your Mom - WHAT UP!?
dat += {"<tr><td width='20%'>[customsender]</td>
<td width='20%'>[customjob]</td>
<td width='20%'>[customrecepient ? customrecepient.owner : "NONE"]</td>
<td width='300px'>[custommessage]</td></tr>"}
dat += "</table><br><center><A href='?src=[REF(src)];select=Send'>Send</a>"
//Request Console Logs
if(4)
var/index = 0
/* data_rc_msg
X - 5%
var/rec_dpt = "Unspecified" //name of the person - 15%
var/send_dpt = "Unspecified" //name of the sender- 15%
var/message = "Blank" //transferred message - 300px
var/stamp = "Unstamped" - 15%
var/id_auth = "Unauthenticated" - 15%
var/priority = "Normal" - 10%
*/
dat += "<center><A href='?src=[REF(src)];back=1'>Back</a> - <A href='?src=[REF(src)];refresh=1'>Refresh</center><hr>"
dat += {"<table border='1' width='100%'><tr><th width = '5%'>X</th><th width='15%'>Sending Dep.</th><th width='15%'>Receiving Dep.</th>
<th width='300px' word-wrap: break-word>Message</th><th width='15%'>Stamp</th><th width='15%'>ID Auth.</th><th width='15%'>Priority.</th></tr>"}
for(var/datum/data_rc_msg/rc in src.linkedServer.rc_msgs)
index++
if(index > 3000)
break
// Del - Sender - Recepient - Message
// X - Al Green - Your Mom - WHAT UP!?
dat += {"<tr><td width = '5%'><center><A href='?src=[REF(src)];deleter=[REF(rc)]' style='color: rgb(255,0,0)'>X</a></center></td><td width='15%'>[rc.send_dpt]</td>
<td width='15%'>[rc.rec_dpt]</td><td width='300px'>[rc.message]</td><td width='15%'>[rc.stamp]</td><td width='15%'>[rc.id_auth]</td><td width='15%'>[rc.priority]</td></tr>"}
dat += "</table>"
message = defaultmsg
var/datum/browser/popup = new(user, "hologram_console", name, 700, 700)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
return
/obj/machinery/computer/message_monitor/proc/BruteForce(mob/user)
if(isnull(linkedServer))
to_chat(user, "<span class='warning'>Could not complete brute-force: Linked Server Disconnected!</span>")
else
var/currentKey = src.linkedServer.decryptkey
to_chat(user, "<span class='warning'>Brute-force completed! The key is '[currentKey]'.</span>")
src.hacking = 0
src.screen = 0 // Return the screen back to normal
/obj/machinery/computer/message_monitor/proc/UnmagConsole()
emagged = FALSE
/obj/machinery/computer/message_monitor/proc/ResetMessage()
customsender = "System Administrator"
customrecepient = null
custommessage = "This is a test, please ignore."
customjob = "Admin"
/obj/machinery/computer/message_monitor/Topic(href, href_list)
if(..())
return
if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr))
//Authenticate
if (href_list["auth"])
if(!linkedServer || linkedServer.stat & (NOPOWER|BROKEN))
message = noserver
else
if(auth)
auth = 0
screen = 0
else
var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null)
if(dkey && dkey != "")
if(src.linkedServer.decryptkey == dkey)
auth = 1
else
message = incorrectkey
//Turn the server on/off.
if (href_list["active"])
if(auth)
linkedServer.active = !linkedServer.active
//Find a server
if (href_list["find"])
if(GLOB.message_servers && GLOB.message_servers.len > 1)
src.linkedServer = input(usr,"Please select a server.", "Select a server.", null) as null|anything in GLOB.message_servers
message = "<span class='alert'>NOTICE: Server selected.</span>"
else if(GLOB.message_servers && GLOB.message_servers.len > 0)
linkedServer = GLOB.message_servers[1]
message = "<span class='notice'>NOTICE: Only Single Server Detected - Server selected.</span>"
else
message = noserver
//View the logs - KEY REQUIRED
if (href_list["view"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
src.screen = 1
//Clears the logs - KEY REQUIRED
if (href_list["clear"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
src.linkedServer.pda_msgs = list()
message = "<span class='notice'>NOTICE: Logs cleared.</span>"
//Clears the request console logs - KEY REQUIRED
if (href_list["clearr"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
src.linkedServer.rc_msgs = list()
message = "<span class='notice'>NOTICE: Logs cleared.</span>"
//Change the password - KEY REQUIRED
if (href_list["pass"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
var/dkey = trim(stripped_input(usr, "Please enter the decryption key."))
if(dkey && dkey != "")
if(src.linkedServer.decryptkey == dkey)
var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):"))
if(length(newkey) <= 3)
message = "<span class='notice'>NOTICE: Decryption key too short!</span>"
else if(length(newkey) > 16)
message = "<span class='notice'>NOTICE: Decryption key too long!</span>"
else if(newkey && newkey != "")
src.linkedServer.decryptkey = newkey
message = "<span class='notice'>NOTICE: Decryption key set.</span>"
else
message = incorrectkey
//Hack the Console to get the password
if (href_list["hack"])
if(issilicon(usr) && is_special_character(usr))
src.hacking = 1
src.screen = 2
//Time it takes to bruteforce is dependant on the password length.
spawn(100*length(src.linkedServer.decryptkey))
if(src && src.linkedServer && usr)
BruteForce(usr)
//Delete the log.
if (href_list["delete"])
//Are they on the view logs screen?
if(screen == 1)
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else //if(istype(href_list["delete"], /datum/data_pda_msg))
src.linkedServer.pda_msgs -= locate(href_list["delete"])
message = "<span class='notice'>NOTICE: Log Deleted!</span>"
//Delete the request console log.
if (href_list["deleter"])
//Are they on the view logs screen?
if(screen == 4)
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else //if(istype(href_list["delete"], /datum/data_pda_msg))
src.linkedServer.rc_msgs -= locate(href_list["deleter"])
message = "<span class='notice'>NOTICE: Log Deleted!</span>"
//Create a custom message
if (href_list["msg"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
src.screen = 3
//Fake messaging selection - KEY REQUIRED
if (href_list["select"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
screen = 0
else
switch(href_list["select"])
//Reset
if("Reset")
ResetMessage()
//Select Your Name
if("Sender")
customsender = stripped_input(usr, "Please enter the sender's name.")
//Select Receiver
if("Recepient")
//Get out list of viable PDAs
var/list/obj/item/device/pda/sendPDAs = get_viewable_pdas()
if(GLOB.PDAs && GLOB.PDAs.len > 0)
customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortNames(sendPDAs)
else
customrecepient = null
//Enter custom job
if("RecJob")
customjob = stripped_input(usr, "Please enter the sender's job.")
//Enter message
if("Message")
custommessage = stripped_input(usr, "Please enter your message.")
//Send message
if("Send")
if(isnull(customsender) || customsender == "")
customsender = "UNKNOWN"
if(isnull(customrecepient))
message = "<span class='notice'>NOTICE: No recepient selected!</span>"
return src.attack_hand(usr)
if(isnull(custommessage) || custommessage == "")
message = "<span class='notice'>NOTICE: No message entered!</span>"
return src.attack_hand(usr)
var/obj/item/device/pda/PDARec = null
for (var/obj/item/device/pda/P in get_viewable_pdas())
if(P.owner == customsender)
PDARec = P
//Sender isn't faking as someone who exists
if(isnull(PDARec))
src.linkedServer.send_pda_message("[customrecepient.owner]", "[customsender]","[custommessage]")
customrecepient.tnote += "<i><b>&larr; From <a href='byond://?src=[REF(customrecepient)];choice=Message;target=[REF(src)]'>[customsender]</a> ([customjob]):</b></i><br>[custommessage]<br>"
if (!customrecepient.silent)
playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
customrecepient.audible_message("[icon2html(customrecepient, viewers(customrecepient))] *[customrecepient.ttone]*", null, 3)
if( customrecepient.loc && ishuman(customrecepient.loc) )
var/mob/living/carbon/human/H = customrecepient.loc
to_chat(H, "[icon2html(customrecepient, viewers(H))] <b>Message from [customsender] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=[REF(src)];choice=Message;skiprefresh=1;target=[REF(src)]'>Reply</a>)")
log_talk(usr,"[key_name(usr)] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]",LOGPDA)
customrecepient.cut_overlays()
customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r"))
//Sender is faking as someone who exists
else
src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]")
customrecepient.tnote += "<i><b>&larr; From <a href='byond://?src=[REF(customrecepient)];choice=Message;target=[REF(PDARec)]'>[PDARec.owner]</a> ([customjob]):</b></i><br>[custommessage]<br>"
if (!customrecepient.silent)
playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
customrecepient.audible_message("[icon2html(customrecepient, viewers(customrecepient))] *[customrecepient.ttone]*", null, 3)
if( customrecepient.loc && ishuman(customrecepient.loc) )
var/mob/living/carbon/human/H = customrecepient.loc
to_chat(H, "[icon2html(customrecepient, H)] <b>Message from [PDARec.owner] ([customjob]), </b>\"[custommessage]\" (<a href='byond://?src=[REF(customrecepient)];choice=Message;skiprefresh=1;target=[REF(PDARec)]'>Reply</a>)")
log_talk(usr,"[key_name(usr)] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]",LOGPDA)
customrecepient.cut_overlays()
customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r"))
//Finally..
ResetMessage()
//Request Console Logs - KEY REQUIRED
if(href_list["viewr"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
src.screen = 4
if (href_list["back"])
src.screen = 0
return src.attack_hand(usr)
/obj/item/paper/monitorkey
//..()
name = "monitor decryption key"
var/obj/machinery/message_server/server = null
/obj/item/paper/monitorkey/Initialize()
..()
return INITIALIZE_HINT_LATELOAD
/obj/item/paper/monitorkey/LateInitialize()
if(GLOB.message_servers)
for(var/obj/machinery/message_server/server in GLOB.message_servers)
if(!isnull(server))
if(!isnull(server.decryptkey))
info = "<center><h2>Daily Key Reset</h2></center><br>The new message monitor key is '[server.decryptkey]'.<br>Please keep this a secret and away from the clown.<br>If necessary, change the password to a more secure one."
info_links = info
add_overlay("paper_words")
break
+148
View File
@@ -0,0 +1,148 @@
//Holds defibs and recharges them from the powernet
//You can activate the mount with an empty hand to grab the paddles
//Not being adjacent will cause the paddles to snap back
/obj/machinery/defibrillator_mount
name = "defibrillator mount"
desc = "Holds and recharges defibrillators. You can grab the paddles if one is mounted."
icon = 'icons/obj/machines/defib_mount.dmi'
icon_state = "defibrillator_mount"
density = FALSE
anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 1
power_channel = EQUIP
speed_process = TRUE //GAS GAS GAS
req_one_access = list(ACCESS_MEDICAL, ACCESS_HEADS, ACCESS_SECURITY) //used to control clamps
var/obj/item/defibrillator/defib //this mount's defibrillator
var/clamps_locked = FALSE //if true, and a defib is loaded, it can't be removed without unlocking the clamps
/obj/machinery/defibrillator_mount/loaded/Initialize() //loaded subtype for mapping use
. = ..()
defib = new/obj/item/defibrillator/loaded(src)
/obj/machinery/defibrillator_mount/Destroy()
if(defib)
QDEL_NULL(defib)
. = ..()
/obj/machinery/defibrillator_mount/examine(mob/user)
..()
if(defib)
to_chat(user, "<span class='notice'>There is a defib unit hooked up. Alt-click to remove it.<span>")
if(GLOB.security_level >= SEC_LEVEL_RED)
to_chat(user, "<span class='notice'>Due to a security situation, its locking clamps can be toggled by swiping any ID.</span>")
else
to_chat(user, "<span class='notice'>Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access.</span>")
/obj/machinery/defibrillator_mount/process()
if(defib && defib.cell && defib.cell.charge < defib.cell.maxcharge)
use_power(20)
defib.cell.give(18) //90% efficiency, slightly better than the cell charger's 87.5%
if(isliving(defib.paddles.loc))
var/mob/living/L = defib.paddles.loc
if(!L.Adjacent(src))
to_chat(L, "<span class='warning'>[defib]'s paddles overextend and come out of your hands!</span>")
L.dropItemToGround(defib.paddles)
update_icon()
/obj/machinery/defibrillator_mount/update_icon()
cut_overlays()
if(defib)
add_overlay("defib")
if(defib.powered)
add_overlay(defib.safety ? "online" : "emagged")
var/ratio = defib.cell.charge / defib.cell.maxcharge
ratio = CEILING(ratio * 4, 1) * 25
add_overlay("charge[ratio]")
if(clamps_locked)
add_overlay("clamps")
/obj/machinery/defibrillator_mount/get_cell()
if(defib)
return defib.get_cell()
//defib interaction
/obj/machinery/defibrillator_mount/attack_hand(mob/living/user)
if(!defib)
to_chat(user, "<span class='warning'>There's no defibrillator unit loaded!</span>")
return
if(defib.on)
to_chat(user, "<span class='warning'>[defib.paddles.loc == user ? "You are already" : "Someone else is"] holding [defib]'s paddles!</span>")
return
defib.attack_hand(user)
/obj/machinery/defibrillator_mount/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/defibrillator))
if(defib)
to_chat(user, "<span class='warning'>There's already a defibrillator in [src]!</span>")
return
if(I.flags_1 & NODROP_1 || !user.transferItemToLoc(I, src))
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
return
user.visible_message("<span class='notice'>[user] hooks up [I] to [src]!</span>", \
"<span class='notice'>You press [I] into the mount, and it clicks into place.</span>")
playsound(src, 'sound/machines/click.ogg', 50, TRUE)
defib = I
update_icon()
return
var/obj/item/card/id = I.GetID()
if(id)
if(check_access(id) || GLOB.security_level >= SEC_LEVEL_RED) //anyone can toggle the clamps in red alert!
if(!defib)
to_chat(user, "<span class='warning'>You can't engage the clamps on a defibrillator that isn't there.</span>")
return
clamps_locked = !clamps_locked
to_chat(user, "<span class='notice'>Clamps [clamps_locked ? "" : "dis"]engaged.</span>")
update_icon()
else
to_chat(user, "<span class='warning'>Insufficient access.</span>")
return
..()
/obj/machinery/defibrillator_mount/multitool_act(mob/living/user, obj/item/multitool)
if(!defib)
to_chat(user, "<span class='warning'>There isn't any defibrillator to clamp in!</span>")
return TRUE
if(!clamps_locked)
to_chat(user, "<span class='warning'>[src]'s clamps are disengaged!</span>")
return TRUE
user.visible_message("<span class='notice'>[user] presses [multitool] into [src]'s ID slot...</span>", \
"<span class='notice'>You begin overriding the clamps on [src]...</span>")
playsound(src, 'sound/machines/click.ogg', 50, TRUE)
if(!do_after(user, 100, target = src) || !clamps_locked)
return
user.visible_message("<span class='notice'>[user] pulses [multitool], and [src]'s clamps slide up.</span>", \
"<span class='notice'>You override the locking clamps on [src]!</span>")
playsound(src, 'sound/machines/locktoggle.ogg', 50, TRUE)
clamps_locked = FALSE
update_icon()
return TRUE
/obj/machinery/defibrillator_mount/AltClick(mob/living/user)
if(!user.Adjacent(src) || !istype(user))
return
if(!defib)
to_chat(user, "<span class='warning'>It'd be hard to remove a defib unit from a mount that has none.</span>")
return
if(clamps_locked)
to_chat(user, "<span class='warning'>You try to tug out [defib], but the mount's clamps are locked tight!</span>")
return
if(!user.put_in_hands(defib))
to_chat(user, "<span class='warning'>You need a free hand!</span>")
return
user.visible_message("<span class='notice'>[user] unhooks [defib] from [src].</span>", \
"<span class='notice'>You slide out [defib] from [src] and unhook the charging cables.</span>")
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
defib = null
update_icon()
//wallframe, for attaching the mounts easily
/obj/item/wallframe/defib_mount
name = "unhooked defibrillator mount"
desc = "A frame for a defibrillator mount. It can't be removed once it's placed."
icon = 'icons/obj/machines/defib_mount.dmi'
icon_state = "defibrillator_mount"
materials = list(MAT_METAL = 300, MAT_GLASS = 100)
w_class = WEIGHT_CLASS_BULKY
result_path = /obj/machinery/defibrillator_mount
pixel_shift = -28
+2 -2
View File
@@ -96,8 +96,8 @@
var/deploy_message = TRUE
/obj/structure/barricade/security/New()
..()
/obj/structure/barricade/security/Initialize()
. = ..()
addtimer(CALLBACK(src, .proc/deploy), deploy_time)
/obj/structure/barricade/security/proc/deploy()
+13 -10
View File
@@ -208,19 +208,22 @@
/obj/machinery/door/airlock/narsie_act()
var/turf/T = get_turf(src)
var/runed = prob(20)
var/obj/machinery/door/airlock/cult/A
if(glass)
if(runed)
A = new/obj/machinery/door/airlock/cult/glass(T)
if(GLOB.cult_narsie)
var/runed = prob(20)
if(glass)
if(runed)
A = new/obj/machinery/door/airlock/cult/glass(T)
else
A = new/obj/machinery/door/airlock/cult/unruned/glass(T)
else
A = new/obj/machinery/door/airlock/cult/unruned/glass(T)
if(runed)
A = new/obj/machinery/door/airlock/cult(T)
else
A = new/obj/machinery/door/airlock/cult/unruned(T)
A.name = name
else
if(runed)
A = new/obj/machinery/door/airlock/cult(T)
else
A = new/obj/machinery/door/airlock/cult/unruned(T)
A.name = name
A = new /obj/machinery/door/airlock/cult/weak(T)
qdel(src)
/obj/machinery/door/airlock/ratvar_act() //Airlocks become pinion airlocks that only allow servants
@@ -406,6 +406,7 @@
hackProof = TRUE
aiControlDisabled = TRUE
req_access = list(ACCESS_BLOODCULT)
damage_deflection = 10
var/openingoverlaytype = /obj/effect/temp_visual/cult/door
var/friendly = FALSE
@@ -435,6 +436,9 @@
/obj/machinery/door/airlock/cult/narsie_act()
return
/obj/machinery/door/airlock/cult/emp_act(severity)
return
/obj/machinery/door/airlock/cult/friendly
friendly = TRUE
@@ -461,6 +465,13 @@
/obj/machinery/door/airlock/cult/unruned/glass/friendly
friendly = TRUE
/obj/machinery/door/airlock/cult/weak
name = "brittle cult airlock"
desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state."
normal_integrity = 180
damage_deflection = 5
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
//Pinion airlocks: Clockwork doors that only let servants of Ratvar through.
/obj/machinery/door/airlock/clockwork
name = "pinion airlock"
+2 -2
View File
@@ -10,8 +10,8 @@
var/air_frequency = FREQ_ATMOS_ALARMS
autoclose = FALSE
/obj/machinery/door/airlock/alarmlock/New()
..()
/obj/machinery/door/airlock/alarmlock/Initialize()
. = ..()
air_connection = new
/obj/machinery/door/airlock/alarmlock/Destroy()
+2 -2
View File
@@ -38,8 +38,8 @@
maptext_height = 26
maptext_width = 32
/obj/machinery/door_timer/New()
..()
/obj/machinery/door_timer/Initialize()
. = ..()
Radio = new/obj/item/device/radio(src)
Radio.listening = 0
+2 -2
View File
@@ -53,8 +53,8 @@
return TRUE
return ..()
/obj/machinery/door/New()
..()
/obj/machinery/door/Initialize()
. = ..()
if(density)
layer = CLOSED_DOOR_LAYER //Above most items if closed
else
+72
View File
@@ -0,0 +1,72 @@
/obj/machinery/door/password
name = "door"
desc = "This door only opens when provided a password."
icon = 'icons/obj/doors/blastdoor.dmi'
icon_state = "closed"
explosion_block = 3
heat_proof = TRUE
max_integrity = 600
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
damage_deflection = 70
var/password = "Swordfish"
var/interaction_activated = TRUE //use the door to enter the password
var/voice_activated = FALSE //Say the password nearby to open the door.
/obj/machinery/door/password/voice
voice_activated = TRUE
/obj/machinery/door/password/Initialize(mapload)
. = ..()
if(voice_activated)
flags_1 |= HEAR_1
/obj/machinery/door/password/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
if(!density || !voice_activated || radio_freq)
return
if(findtext(raw_message,password))
open()
/obj/machinery/door/password/CollidedWith(atom/movable/AM)
return !density && ..()
/obj/machinery/door/password/try_to_activate_door(mob/user)
add_fingerprint(user)
if(operating)
return
if(density)
if(ask_for_pass(user))
open()
else
do_animate("deny")
/obj/machinery/door/password/update_icon()
if(density)
icon_state = "closed"
else
icon_state = "open"
/obj/machinery/door/password/do_animate(animation)
switch(animation)
if("opening")
flick("opening", src)
playsound(src, 'sound/machines/blastdoor.ogg', 30, 1)
if("closing")
flick("closing", src)
playsound(src, 'sound/machines/blastdoor.ogg', 30, 1)
if("deny")
//Deny animation would be nice to have.
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
/obj/machinery/door/password/proc/ask_for_pass(mob/user)
var/guess = stripped_input(user,"Enter the password:", "Password", "")
if(guess == password)
return TRUE
return FALSE
/obj/machinery/door/password/emp_act(severity)
return
/obj/machinery/door/password/ex_act(severity, target)
return
+3 -3
View File
@@ -14,9 +14,9 @@
//shutters look like ass with things on top of them.
/obj/machinery/door/poddoor/shutters/New()
..()
layer = CLOSED_DOOR_LAYER //to handle /obj/machinery/door/New() resetting the layer.
/obj/machinery/door/poddoor/shutters/Initialize()
. = ..()
layer = CLOSED_DOOR_LAYER //to handle /obj/machinery/door/Initialize() resetting the layer.
/obj/machinery/door/poddoor/shutters/open(ignorepower = 0)
+4 -4
View File
@@ -21,8 +21,8 @@
var/cable = 2
var/list/debris = list()
/obj/machinery/door/window/New(loc, set_dir)
..()
/obj/machinery/door/window/Initialize(mapload, set_dir)
. = ..()
if(set_dir)
setDir(set_dir)
if(src.req_access && src.req_access.len)
@@ -329,8 +329,8 @@
resistance_flags = FIRE_PROOF | ACID_PROOF
var/made_glow = FALSE
/obj/machinery/door/window/clockwork/New(loc, set_dir)
..()
/obj/machinery/door/window/clockwork/Initialize(mapload, set_dir)
. = ..()
for(var/i in 1 to 2)
debris += new/obj/item/clockwork/alloy_shards/medium/gear_bit/large(src)
change_construction_value(2)
+2 -2
View File
@@ -30,8 +30,8 @@
var/last_alarm = 0
var/area/myarea = null
/obj/machinery/firealarm/New(loc, dir, building)
..()
/obj/machinery/firealarm/Initialize(mapload, dir, building)
. = ..()
if(dir)
src.setDir(dir)
if(building)
@@ -370,6 +370,17 @@
if(SA.stat || in_faction(SA)) //don't target if dead or in faction
continue
targets += SA
if(issilicon(A))
var/mob/living/silicon/sillycone = A
if(sillycone.stat || in_faction(sillycone))
continue
if(iscyborg(sillycone))
var/mob/living/silicon/robot/sillyconerobot = A
if(faction == "syndicate" && sillyconerobot.emagged == 1)
continue
targets += sillycone
if(iscarbon(A))
var/mob/living/carbon/C = A
+3
View File
@@ -302,6 +302,9 @@ GLOBAL_LIST_EMPTY(allConsoles)
if(href_list["sendAnnouncement"])
if(!announcementConsole)
return
if(isliving(usr))
var/mob/living/L = usr
message = L.treat_message(message)
minor_announce(message, "[department] Announcement:")
GLOB.news_network.SubmitArticle(message, department, "Station Announcements", null)
log_talk(usr,"[key_name(usr)] has made a station announcement: [message]",LOGSAY)
+2
View File
@@ -59,10 +59,12 @@
color = "#FF0000"
max_integrity = 20
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
layer = ABOVE_MOB_LAYER
/obj/structure/emergency_shield/invoker/emp_act(severity)
return
/obj/machinery/shieldgen
name = "anti-breach shielding projector"
desc = "Used to seal minor hull breaches."
+2 -2
View File
@@ -253,8 +253,8 @@
open_panel = TRUE
timer_set = 120
/obj/machinery/syndicatebomb/empty/New()
..()
/obj/machinery/syndicatebomb/empty/Initialize()
. = ..()
wires.cut_all()
/obj/machinery/syndicatebomb/self_destruct
@@ -3,6 +3,8 @@
Lets you read PDA and request console messages.
*/
#define LINKED_SERVER_NONRESPONSIVE (!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
// The monitor itself.
/obj/machinery/computer/message_monitor
name = "message monitor console"
@@ -20,9 +22,9 @@
var/rebootmsg = "<span class='warning'>%$&(: Critical %$$@ Error // !RestArting! <lOadiNg backUp iNput ouTput> - ?pLeaSe wAit!</span>"
//Computer properties
var/screen = 0 // 0 = Main menu, 1 = Message Logs, 2 = Hacked screen, 3 = Custom Message
var/hacking = 0 // Is it being hacked into by the AI/Cyborg
var/hacking = FALSE // Is it being hacked into by the AI/Cyborg
var/message = "<span class='notice'>System bootup complete. Please select an option.</span>" // The message that shows on the main menu.
var/auth = 0 // Are they authenticated?
var/auth = FALSE // Are they authenticated?
var/optioncount = 7
// Custom Message Properties
var/customsender = "System Administrator"
@@ -46,7 +48,7 @@
obj_flags |= EMAGGED
screen = 2
spark_system.set_up(5, 0, src)
src.spark_system.start()
spark_system.start()
var/obj/item/paper/monitorkey/MK = new(loc, linkedServer)
// Will help make emagging the console not so easy to get away with.
MK.info += "<br><br><font color='red'>%@%(*$%&(&?*(%&/{}</font>"
@@ -56,6 +58,10 @@
else
to_chat(user, "<span class='notice'>A no server error appears on the screen.</span>")
/obj/machinery/computer/message_monitor/New()
. = ..()
GLOB.telecomms_list += src
/obj/machinery/computer/message_monitor/Initialize()
..()
return INITIALIZE_HINT_LATELOAD
@@ -67,25 +73,29 @@
linkedServer = S
break
/obj/machinery/computer/message_monitor/Destroy()
GLOB.telecomms_list -= src
. = ..()
/obj/machinery/computer/message_monitor/attack_hand(mob/living/user)
if(..())
return
//If the computer is being hacked or is emagged, display the reboot message.
if(hacking || (obj_flags & EMAGGED))
message = rebootmsg
var/dat = "<center><font color='blue'[message]</font>/</center>"
var/dat = "<center><font color='blue'[message]</font></center>"
if(auth)
dat += "<h4><dd><A href='?src=[REF(src)];auth=1'>&#09;<font color='green'>\[Authenticated\]</font></a>&#09;/"
dat += " Server Power: <A href='?src=[REF(src)];active=1'>[src.linkedServer && src.linkedServer.toggled ? "<font color='green'>\[On\]</font>":"<font color='red'>\[Off\]</font>"]</a></h4>"
dat += " Server Power: <A href='?src=[REF(src)];active=1'>[linkedServer && linkedServer.toggled ? "<font color='green'>\[On\]</font>":"<font color='red'>\[Off\]</font>"]</a></h4>"
else
dat += "<h4><dd><A href='?src=[REF(src)];auth=1'>&#09;<font color='red'>\[Unauthenticated\]</font></a>&#09;/"
dat += " Server Power: <u>[src.linkedServer && src.linkedServer.toggled ? "<font color='green'>\[On\]</font>":"<font color='red'>\[Off\]</font>"]</u></h4>"
dat += " Server Power: <u>[linkedServer && linkedServer.toggled ? "<font color='green'>\[On\]</font>":"<font color='red'>\[Off\]</font>"]</u></h4>"
if(hacking || (obj_flags & EMAGGED))
screen = 2
else if(!auth || !linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
else if(!auth || LINKED_SERVER_NONRESPONSIVE)
if(LINKED_SERVER_NONRESPONSIVE)
message = noserver
screen = 0
@@ -96,13 +106,13 @@
var/i = 0
dat += "<dd><A href='?src=[REF(src)];find=1'>&#09;[++i]. Link To A Server</a></dd>"
if(auth)
if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
if(LINKED_SERVER_NONRESPONSIVE)
dat += "<dd><A>&#09;ERROR: Server not found!</A><br></dd>"
else
dat += "<dd><A href='?src=[REF(src)];view=1'>&#09;[++i]. View Message Logs </a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];viewr=1'>&#09;[++i]. View Request Console Logs </a></br></dd>"
dat += "<dd><A href='?src=[REF(src)];clear=1'>&#09;[++i]. Clear Message Logs</a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];clearr=1'>&#09;[++i]. Clear Request Console Logs</a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];view_logs=1'>&#09;[++i]. View Message Logs </a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];view_requests=1'>&#09;[++i]. View Request Console Logs </a></br></dd>"
dat += "<dd><A href='?src=[REF(src)];clear_logs=1'>&#09;[++i]. Clear Message Logs</a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];clear_requests=1'>&#09;[++i]. Clear Request Console Logs</a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];pass=1'>&#09;[++i]. Set Custom Key</a><br></dd>"
dat += "<dd><A href='?src=[REF(src)];msg=1'>&#09;[++i]. Send Admin Message</a><br></dd>"
else
@@ -125,13 +135,13 @@
var/index = 0
dat += "<center><A href='?src=[REF(src)];back=1'>Back</a> - <A href='?src=[REF(src)];refresh=1'>Refresh</a></center><hr>"
dat += "<table border='1' width='100%'><tr><th width = '5%'>X</th><th width='15%'>Sender</th><th width='15%'>Recipient</th><th width='300px' word-wrap: break-word>Message</th></tr>"
for(var/datum/data_pda_msg/pda in src.linkedServer.pda_msgs)
for(var/datum/data_pda_msg/pda in linkedServer.pda_msgs)
index++
if(index > 3000)
break
// Del - Sender - Recepient - Message
// X - Al Green - Your Mom - WHAT UP!?
dat += "<tr><td width = '5%'><center><A href='?src=[REF(src)];delete=[REF(pda)]' style='color: rgb(255,0,0)'>X</a></center></td><td width='15%'>[pda.sender]</td><td width='15%'>[pda.recipient]</td><td width='300px'>[pda.message][pda.photo ? " <a href='byond://?src=[REF(pda)];photo=1'>(Photo)</a>":""]</td></tr>"
dat += "<tr><td width = '5%'><center><A href='?src=[REF(src)];delete_logs=[REF(pda)]' style='color: rgb(255,0,0)'>X</a></center></td><td width='15%'>[pda.sender]</td><td width='15%'>[pda.recipient]</td><td width='300px'>[pda.message][pda.photo ? " <a href='byond://?src=[REF(pda)];photo=1'>(Photo)</a>":""]</td></tr>"
dat += "</table>"
//Hacking screen.
if(2)
@@ -210,20 +220,20 @@
dat += "<center><A href='?src=[REF(src)];back=1'>Back</a> - <A href='?src=[REF(src)];refresh=1'>Refresh</a></center><hr>"
dat += {"<table border='1' width='100%'><tr><th width = '5%'>X</th><th width='15%'>Sending Dep.</th><th width='15%'>Receiving Dep.</th>
<th width='300px' word-wrap: break-word>Message</th><th width='15%'>Stamp</th><th width='15%'>ID Auth.</th><th width='15%'>Priority.</th></tr>"}
for(var/datum/data_rc_msg/rc in src.linkedServer.rc_msgs)
for(var/datum/data_rc_msg/rc in linkedServer.rc_msgs)
index++
if(index > 3000)
break
// Del - Sender - Recepient - Message
// X - Al Green - Your Mom - WHAT UP!?
dat += {"<tr><td width = '5%'><center><A href='?src=[REF(src)];deleter=[REF(rc)]' style='color: rgb(255,0,0)'>X</a></center></td><td width='15%'>[rc.send_dpt]</td>
dat += {"<tr><td width = '5%'><center><A href='?src=[REF(src)];delete_requests=[REF(rc)]' style='color: rgb(255,0,0)'>X</a></center></td><td width='15%'>[rc.send_dpt]</td>
<td width='15%'>[rc.rec_dpt]</td><td width='300px'>[rc.message]</td><td width='15%'>[rc.stamp]</td><td width='15%'>[rc.id_auth]</td><td width='15%'>[rc.priority]</td></tr>"}
dat += "</table>"
message = defaultmsg
var/datum/browser/popup = new(user, "hologram_console", name, 700, 700)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
popup.open()
return
@@ -231,10 +241,10 @@
if(isnull(linkedServer))
to_chat(user, "<span class='warning'>Could not complete brute-force: Linked Server Disconnected!</span>")
else
var/currentKey = src.linkedServer.decryptkey
var/currentKey = linkedServer.decryptkey
to_chat(user, "<span class='warning'>Brute-force completed! The key is '[currentKey]'.</span>")
src.hacking = 0
src.screen = 0 // Return the screen back to normal
hacking = FALSE
screen = 0 // Return the screen back to normal
/obj/machinery/computer/message_monitor/proc/UnmagConsole()
obj_flags &= ~EMAGGED
@@ -252,23 +262,24 @@
if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr))
//Authenticate
if (href_list["auth"])
if(!linkedServer || linkedServer.stat & (NOPOWER|BROKEN))
if(LINKED_SERVER_NONRESPONSIVE)
message = noserver
else if(auth)
auth = FALSE
screen = 0
else
if(auth)
auth = 0
screen = 0
else
var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null)
if(dkey && dkey != "")
if(src.linkedServer.decryptkey == dkey)
auth = 1
else
message = incorrectkey
var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null)
if(dkey && dkey != "")
if(linkedServer.decryptkey == dkey)
auth = TRUE
else
message = incorrectkey
//Turn the server on/off.
if (href_list["active"])
if(auth)
if(LINKED_SERVER_NONRESPONSIVE)
message = noserver
else if(auth)
linkedServer.toggled = !linkedServer.toggled
//Find a server
if (href_list["find"])
@@ -286,86 +297,81 @@
message = noserver
//View the logs - KEY REQUIRED
if (href_list["view"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
if (href_list["view_logs"])
if(LINKED_SERVER_NONRESPONSIVE)
message = noserver
else
if(auth)
src.screen = 1
else if(auth)
screen = 1
//Clears the logs - KEY REQUIRED
if (href_list["clear"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
if (href_list["clear_logs"])
if(LINKED_SERVER_NONRESPONSIVE)
message = noserver
else
if(auth)
src.linkedServer.pda_msgs = list()
message = "<span class='notice'>NOTICE: Logs cleared.</span>"
else if(auth)
linkedServer.pda_msgs = list()
message = "<span class='notice'>NOTICE: Logs cleared.</span>"
//Clears the request console logs - KEY REQUIRED
if (href_list["clearr"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
if (href_list["clear_requests"])
if(LINKED_SERVER_NONRESPONSIVE)
message = noserver
else
if(auth)
src.linkedServer.rc_msgs = list()
message = "<span class='notice'>NOTICE: Logs cleared.</span>"
else if(auth)
linkedServer.rc_msgs = list()
message = "<span class='notice'>NOTICE: Logs cleared.</span>"
//Change the password - KEY REQUIRED
if (href_list["pass"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
if(LINKED_SERVER_NONRESPONSIVE)
message = noserver
else
if(auth)
var/dkey = stripped_input(usr, "Please enter the decryption key.")
if(dkey && dkey != "")
if(src.linkedServer.decryptkey == dkey)
var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):"))
if(length(newkey) <= 3)
message = "<span class='notice'>NOTICE: Decryption key too short!</span>"
else if(length(newkey) > 16)
message = "<span class='notice'>NOTICE: Decryption key too long!</span>"
else if(newkey && newkey != "")
src.linkedServer.decryptkey = newkey
message = "<span class='notice'>NOTICE: Decryption key set.</span>"
else
message = incorrectkey
else if(auth)
var/dkey = stripped_input(usr, "Please enter the decryption key.")
if(dkey && dkey != "")
if(linkedServer.decryptkey == dkey)
var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):"))
if(length(newkey) <= 3)
message = "<span class='notice'>NOTICE: Decryption key too short!</span>"
else if(length(newkey) > 16)
message = "<span class='notice'>NOTICE: Decryption key too long!</span>"
else if(newkey && newkey != "")
linkedServer.decryptkey = newkey
message = "<span class='notice'>NOTICE: Decryption key set.</span>"
else
message = incorrectkey
//Hack the Console to get the password
if (href_list["hack"])
if(issilicon(usr) && is_special_character(usr))
src.hacking = 1
src.screen = 2
hacking = TRUE
screen = 2
//Time it takes to bruteforce is dependant on the password length.
spawn(100*length(src.linkedServer.decryptkey))
if(src && src.linkedServer && usr)
spawn(100*length(linkedServer.decryptkey))
if(src && linkedServer && usr)
BruteForce(usr)
//Delete the log.
if (href_list["delete"])
if (href_list["delete_logs"])
//Are they on the view logs screen?
if(screen == 1)
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
if(LINKED_SERVER_NONRESPONSIVE)
message = noserver
else //if(istype(href_list["delete"], /datum/data_pda_msg))
src.linkedServer.pda_msgs -= locate(href_list["delete"])
else //if(istype(href_list["delete_logs"], /datum/data_pda_msg))
linkedServer.pda_msgs -= locate(href_list["delete_logs"])
message = "<span class='notice'>NOTICE: Log Deleted!</span>"
//Delete the request console log.
if (href_list["deleter"])
if (href_list["delete_requests"])
//Are they on the view logs screen?
if(screen == 4)
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
if(LINKED_SERVER_NONRESPONSIVE)
message = noserver
else //if(istype(href_list["delete"], /datum/data_pda_msg))
src.linkedServer.rc_msgs -= locate(href_list["deleter"])
else //if(istype(href_list["delete_logs"], /datum/data_pda_msg))
linkedServer.rc_msgs -= locate(href_list["delete_requests"])
message = "<span class='notice'>NOTICE: Log Deleted!</span>"
//Create a custom message
if (href_list["msg"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
if(LINKED_SERVER_NONRESPONSIVE)
message = noserver
else
if(auth)
src.screen = 3
else if(auth)
screen = 3
//Fake messaging selection - KEY REQUIRED
if (href_list["select"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
if(LINKED_SERVER_NONRESPONSIVE)
message = noserver
screen = 0
else
@@ -403,11 +409,11 @@
if(isnull(customrecepient))
message = "<span class='notice'>NOTICE: No recepient selected!</span>"
return src.attack_hand(usr)
return attack_hand(usr)
if(isnull(custommessage) || custommessage == "")
message = "<span class='notice'>NOTICE: No message entered!</span>"
return src.attack_hand(usr)
return attack_hand(usr)
var/datum/signal/subspace/pda/signal = new(src, list(
"name" = "[customsender]",
@@ -421,18 +427,18 @@
//Request Console Logs - KEY REQUIRED
if(href_list["viewr"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
if(href_list["view_requests"])
if(LINKED_SERVER_NONRESPONSIVE)
message = noserver
else
if(auth)
src.screen = 4
else if(auth)
screen = 4
if (href_list["back"])
src.screen = 0
screen = 0
return src.attack_hand(usr)
return attack_hand(usr)
#undef LINKED_SERVER_NONRESPONSIVE
/obj/item/paper/monitorkey
name = "monitor decryption key"
@@ -44,6 +44,12 @@
decryptkey = GenerateKey()
pda_msgs += new /datum/data_pda_msg("System Administrator", "system", "This is an automated message. The messaging system is functioning correctly.")
/obj/machinery/telecomms/message_server/Destroy()
for(var/obj/machinery/computer/message_monitor/monitor in GLOB.telecomms_list)
if(monitor.linkedServer && monitor.linkedServer == src)
monitor.linkedServer = null
. = ..()
/obj/machinery/telecomms/message_server/proc/GenerateKey()
var/newKey
newKey += pick("the", "if", "of", "as", "in", "a", "you", "from", "to", "an", "too", "little", "snow", "dead", "drunk", "rosebud", "duck", "al", "le")
@@ -79,11 +85,6 @@
icon_state = "server-on"
// Repath for maps
/obj/machinery/message_server
parent_type = /obj/machinery/telecomms/message_server
// PDA signal datum
/datum/signal/subspace/pda
frequency = FREQ_COMMON
@@ -80,7 +80,6 @@ GLOBAL_LIST_EMPTY(telecomms_list)
// return TRUE if found, FALSE if not found
return signal && (!freq_listening.len || (signal.frequency in freq_listening))
/obj/machinery/telecomms/New()
GLOB.telecomms_list += src
..()
+2 -3
View File
@@ -27,8 +27,8 @@
wreckage = /obj/structure/mecha_wreckage/gygax/dark
max_equip = 4
/obj/mecha/combat/gygax/dark/loaded/New()
..()
/obj/mecha/combat/gygax/dark/loaded/Initialize()
. = ..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang
@@ -37,7 +37,6 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
ME.attach(src)
return
/obj/mecha/combat/gygax/dark/add_cell(obj/item/stock_parts/cell/C=null)
if(C)
+6 -6
View File
@@ -29,8 +29,8 @@
thrusters_action.Remove(user)
zoom_action.Remove(user)
/obj/mecha/combat/marauder/loaded/New()
..()
/obj/mecha/combat/marauder/loaded/Initialize()
. = ..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
@@ -52,8 +52,8 @@
force = 55
max_equip = 5
/obj/mecha/combat/marauder/seraph/New()
..()
/obj/mecha/combat/marauder/seraph/Initialize()
. = ..()
var/obj/item/mecha_parts/mecha_equipment/ME
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
ME.attach(src)
@@ -74,8 +74,8 @@
wreckage = /obj/structure/mecha_wreckage/mauler
max_equip = 5
/obj/mecha/combat/marauder/mauler/loaded/New()
..()
/obj/mecha/combat/marauder/mauler/loaded/Initialize()
. = ..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
+2 -3
View File
@@ -19,10 +19,9 @@
turnsound = null
opacity = 0
/obj/mecha/combat/reticence/loaded/New()
..()
/obj/mecha/combat/reticence/loaded/Initialize()
. = ..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/rcd //HAHA IT MAKES WALLS GET IT
ME.attach(src)
return
@@ -2,11 +2,10 @@
/obj/item/mecha_parts/mecha_equipment/medical
/obj/item/mecha_parts/mecha_equipment/medical/New()
..()
/obj/item/mecha_parts/mecha_equipment/medical/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/mecha_parts/mecha_equipment/medical/can_attach(obj/mecha/medical/M)
if(..() && istype(M))
return 1
@@ -256,8 +255,8 @@
range = MELEE|RANGED
equip_cooldown = 10
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/New()
..()
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Initialize()
. = ..()
create_reagents(max_volume)
reagents.set_reacting(FALSE)
syringes = new
@@ -534,8 +533,8 @@
var/obj/item/gun/medbeam/mech/medigun
materials = list(MAT_METAL = 15000, MAT_GLASS = 8000, MAT_PLASMA = 3000, MAT_GOLD = 8000, MAT_DIAMOND = 2000)
/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/New()
..()
/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/Initialize()
. = ..()
medigun = new(src)
@@ -110,8 +110,8 @@
equip_cooldown = 15
var/scanning_time = 0
/obj/item/mecha_parts/mecha_equipment/mining_scanner/New()
..()
/obj/item/mecha_parts/mecha_equipment/mining_scanner/Initialize()
. = ..()
START_PROCESSING(SSfastprocess, src)
/obj/item/mecha_parts/mecha_equipment/mining_scanner/process()
@@ -358,8 +358,8 @@
var/fuel_per_cycle_active = 200
var/power_per_cycle = 20
/obj/item/mecha_parts/mecha_equipment/generator/New()
..()
/obj/item/mecha_parts/mecha_equipment/generator/Initialize()
. = ..()
generator_init()
/obj/item/mecha_parts/mecha_equipment/generator/Destroy()
@@ -127,11 +127,10 @@
energy_drain = 0
range = MELEE|RANGED
/obj/item/mecha_parts/mecha_equipment/extinguisher/New()
/obj/item/mecha_parts/mecha_equipment/extinguisher/Initialize()
. = ..()
create_reagents(1000)
reagents.add_reagent("water", 1000)
..()
return
/obj/item/mecha_parts/mecha_equipment/extinguisher/action(atom/target) //copypasted from extinguisher. TODO: Rewrite from scratch.
if(!action_checks(target) || get_dist(chassis, target)>3)
@@ -197,9 +196,9 @@
flags_2 = NO_MAT_REDEMPTION_2
var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock.
/obj/item/mecha_parts/mecha_equipment/rcd/New()
/obj/item/mecha_parts/mecha_equipment/rcd/Initialize()
. = ..()
GLOB.rcd_list += src
..()
/obj/item/mecha_parts/mecha_equipment/rcd/Destroy()
GLOB.rcd_list -= src
@@ -299,10 +298,10 @@
var/obj/item/stack/cable_coil/cable
var/max_cable = 1000
/obj/item/mecha_parts/mecha_equipment/cable_layer/New()
/obj/item/mecha_parts/mecha_equipment/cable_layer/Initialize()
. = ..()
cable = new(src)
cable.amount = 0
..()
/obj/item/mecha_parts/mecha_equipment/cable_layer/can_attach(obj/mecha/working/M)
if(..())
+1 -1
View File
@@ -124,7 +124,7 @@
/obj/item/storage/box/mechabeacons
name = "exosuit tracking beacons"
/obj/item/storage/box/mechabeacons/New()
/obj/item/storage/box/mechabeacons/PopulateContents()
..()
new /obj/item/mecha_parts/mecha_tracking(src)
new /obj/item/mecha_parts/mecha_tracking(src)
+14 -14
View File
@@ -26,8 +26,8 @@
/obj/item/mecha_parts/chassis/ripley
name = "\improper Ripley chassis"
/obj/item/mecha_parts/chassis/ripley/New()
..()
/obj/item/mecha_parts/chassis/ripley/Initialize()
. = ..()
construct = new /datum/construction/mecha/ripley_chassis(src)
/obj/item/mecha_parts/part/ripley_torso
@@ -60,8 +60,8 @@
/obj/item/mecha_parts/chassis/odysseus
name = "\improper Odysseus chassis"
/obj/item/mecha_parts/chassis/odysseus/New()
..()
/obj/item/mecha_parts/chassis/odysseus/Initialize()
. = ..()
construct = new /datum/construction/mecha/odysseus_chassis(src)
/obj/item/mecha_parts/part/odysseus_head
@@ -99,8 +99,8 @@
/obj/item/mecha_parts/chassis/gygax
name = "\improper Gygax chassis"
/obj/item/mecha_parts/chassis/gygax/New()
..()
/obj/item/mecha_parts/chassis/gygax/Initialize()
. = ..()
construct = new /datum/construction/mecha/gygax_chassis(src)
/obj/item/mecha_parts/part/gygax_torso
@@ -145,8 +145,8 @@
/obj/item/mecha_parts/chassis/durand
name = "\improper Durand chassis"
/obj/item/mecha_parts/chassis/durand/New()
..()
/obj/item/mecha_parts/chassis/durand/Initialize()
. = ..()
construct = new /datum/construction/mecha/durand_chassis(src)
/obj/item/mecha_parts/part/durand_torso
@@ -190,8 +190,8 @@
/obj/item/mecha_parts/chassis/firefighter
name = "Firefighter chassis"
/obj/item/mecha_parts/chassis/firefighter/New()
..()
/obj/item/mecha_parts/chassis/firefighter/Initialize()
. = ..()
construct = new /datum/construction/mecha/firefighter_chassis(src)
@@ -200,8 +200,8 @@
/obj/item/mecha_parts/chassis/honker
name = "\improper H.O.N.K chassis"
/obj/item/mecha_parts/chassis/honker/New()
..()
/obj/item/mecha_parts/chassis/honker/Initialize()
. = ..()
construct = new /datum/construction/mecha/honker_chassis(src)
/obj/item/mecha_parts/part/honker_torso
@@ -240,8 +240,8 @@
/obj/item/mecha_parts/chassis/phazon
name = "\improper Phazon chassis"
/obj/item/mecha_parts/chassis/phazon/New()
..()
/obj/item/mecha_parts/chassis/phazon/Initialize()
. = ..()
construct = new /datum/construction/mecha/phazon_chassis(src)
/obj/item/mecha_parts/part/phazon_torso
+24 -22
View File
@@ -16,16 +16,18 @@
var/salvage_num = 5
var/mob/living/silicon/ai/AI //AIs to be salvaged
/obj/structure/mecha_wreckage/New(loc, mob/living/silicon/ai/AI_pilot)
..()
if(AI_pilot) //Type-checking for this is already done in mecha/Destroy()
AI = AI_pilot
AI.apply_damage(150, BURN) //Give the AI a bit of damage from the "shock" of being suddenly shut down
AI.death() //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair.
AI.forceMove(src) //Put the dead AI inside the wreckage for recovery
add_overlay(mutable_appearance('icons/obj/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon
AI.controlled_mech = null
AI.remote_control = null
/obj/structure/mecha_wreckage/Initialize(mapload, mob/living/silicon/ai/AI_pilot)
. = ..()
if(!AI_pilot) //Type-checking for this is already done in mecha/Destroy()
return
AI = AI_pilot
AI.apply_damage(150, BURN) //Give the AI a bit of damage from the "shock" of being suddenly shut down
AI.death() //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair.
AI.forceMove(src) //Put the dead AI inside the wreckage for recovery
add_overlay(mutable_appearance('icons/obj/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon
AI.controlled_mech = null
AI.remote_control = null
/obj/structure/mecha_wreckage/examine(mob/user)
..()
@@ -102,8 +104,8 @@
name = "\improper Gygax wreckage"
icon_state = "gygax-broken"
/obj/structure/mecha_wreckage/gygax/New()
..()
/obj/structure/mecha_wreckage/gygax/Initialize()
. = ..()
var/list/parts = list(/obj/item/mecha_parts/part/gygax_torso,
/obj/item/mecha_parts/part/gygax_head,
/obj/item/mecha_parts/part/gygax_left_arm,
@@ -145,8 +147,8 @@
name = "\improper Ripley wreckage"
icon_state = "ripley-broken"
/obj/structure/mecha_wreckage/ripley/New()
..()
/obj/structure/mecha_wreckage/ripley/Initialize()
. = ..()
var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso,
/obj/item/mecha_parts/part/ripley_left_arm,
/obj/item/mecha_parts/part/ripley_right_arm,
@@ -163,8 +165,8 @@
name = "\improper Firefighter wreckage"
icon_state = "firefighter-broken"
/obj/structure/mecha_wreckage/ripley/firefighter/New()
..()
/obj/structure/mecha_wreckage/ripley/firefighter/Initialize()
. = ..()
var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso,
/obj/item/mecha_parts/part/ripley_left_arm,
/obj/item/mecha_parts/part/ripley_right_arm,
@@ -188,8 +190,8 @@
icon_state = "honker-broken"
desc = "All is right in the universe."
/obj/structure/mecha_wreckage/honker/New()
..()
/obj/structure/mecha_wreckage/honker/Initialize()
. = ..()
var/list/parts = list(
/obj/item/mecha_parts/chassis/honker,
/obj/item/mecha_parts/part/honker_torso,
@@ -209,8 +211,8 @@
name = "\improper Durand wreckage"
icon_state = "durand-broken"
/obj/structure/mecha_wreckage/durand/New()
..()
/obj/structure/mecha_wreckage/durand/Initialize()
. = ..()
var/list/parts = list(
/obj/item/mecha_parts/part/durand_torso,
/obj/item/mecha_parts/part/durand_head,
@@ -234,8 +236,8 @@
name = "\improper Odysseus wreckage"
icon_state = "odysseus-broken"
/obj/structure/mecha_wreckage/odysseus/New()
..()
/obj/structure/mecha_wreckage/odysseus/Initialize()
. = ..()
var/list/parts = list(
/obj/item/mecha_parts/part/odysseus_torso,
/obj/item/mecha_parts/part/odysseus_head,
+2 -2
View File
@@ -1,5 +1,5 @@
/obj/mecha/medical/New()
..()
/obj/mecha/medical/Initialize()
. = ..()
trackers += new /obj/item/mecha_parts/mecha_tracking(src)
+2 -3
View File
@@ -80,11 +80,10 @@
wreckage = /obj/structure/mecha_wreckage/ripley/deathripley
step_energy_drain = 0
/obj/mecha/working/ripley/deathripley/New()
..()
/obj/mecha/working/ripley/deathripley/Initialize()
. = ..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill
ME.attach(src)
return
/obj/mecha/working/ripley/mining
desc = "An old, dusty mining Ripley."
+2 -2
View File
@@ -1,6 +1,6 @@
/obj/mecha/working
internal_damage_threshold = 60
/obj/mecha/working/New()
..()
/obj/mecha/working/Initialize()
. = ..()
trackers += new /obj/item/mecha_parts/mecha_tracking(src)
@@ -21,7 +21,8 @@
diseases_to_add += D
if(LAZYLEN(diseases_to_add))
AddComponent(/datum/component/infective, diseases_to_add)
. = ..()
return//. = ..()//cleanable stuff sometimes needs to be in objs
/obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C)
if(mergeable_decal)
@@ -234,23 +234,19 @@
location = get_turf(loca)
amount = round(sqrt(amt / 2), 1)
carry.copy_to(chemholder, carry.total_volume, 4) //The foam holds 4 times the total reagents volume for balance purposes.
carry.copy_to(chemholder, 4*carry.total_volume) //The foam holds 4 times the total reagents volume for balance purposes.
/datum/effect_system/foam_spread/metal/set_up(amt=5, loca, datum/reagents/carry = null, metaltype)
..()
metal = metaltype
/datum/effect_system/foam_spread/start()
var/obj/effect/particle_effect/foam/foundfoam = locate() in location
if(foundfoam)//If there was already foam where we start, we add our foaminess to it.
foundfoam.amount += amount
else
var/obj/effect/particle_effect/foam/F = new effect_type(location)
var/foamcolor = mix_color_from_reagents(chemholder.reagents.reagent_list)
chemholder.reagents.copy_to(F, chemholder.reagents.total_volume/amount)
F.add_atom_colour(foamcolor, FIXED_COLOUR_PRIORITY)
F.amount = amount
F.metal = metal
var/obj/effect/particle_effect/foam/F = new effect_type(location)
var/foamcolor = mix_color_from_reagents(chemholder.reagents.reagent_list)
chemholder.reagents.copy_to(F, chemholder.reagents.total_volume/amount)
F.add_atom_colour(foamcolor, FIXED_COLOUR_PRIORITY)
F.amount = amount
F.metal = metal
//////////////////////////////////////////////////////////
@@ -271,7 +271,7 @@
else
location = get_turf(loca)
amount = radius
carry.copy_to(chemholder, carry.total_volume, 4) //The smoke holds 4 times the total reagents volume for balance purposes.
carry.copy_to(chemholder, 4*carry.total_volume) //The smoke holds 4 times the total reagents volume for balance purposes.
if(!silent)
var/contained = ""
+8 -5
View File
@@ -6,6 +6,12 @@
opacity = 0
density = TRUE
CanAtmosPass = ATMOS_PASS_DENSITY
var/timeleft = 300 //Set to 0 for permanent forcefields (ugh)
/obj/effect/forcefield/New()
..()
if(timeleft)
QDEL_IN(src, timeleft)
/obj/effect/forcefield/singularity_pull()
return
@@ -15,6 +21,8 @@
name = "glowing wall"
icon = 'icons/effects/cult_effects.dmi'
icon_state = "cultshield"
CanAtmosPass = ATMOS_PASS_NO
timeleft = 200
///////////Mimewalls///////////
@@ -22,11 +30,6 @@
icon_state = "empty"
name = "invisible wall"
desc = "You have a bad feeling about this."
var/timeleft = 300
/obj/effect/forcefield/mime/New()
..()
QDEL_IN(src, timeleft)
/obj/effect/forcefield/mime/advanced
name = "invisible blockade"
@@ -113,10 +113,10 @@
/obj/effect/spawner/lootdrop/organ_spawner
name = "organ spawner"
loot = list(
/obj/item/organ/heart/gland/bloody = 7,
/obj/item/organ/heart/gland/bodysnatch = 4,
/obj/item/organ/heart/gland/electric = 3,
/obj/item/organ/heart/gland/trauma = 4,
/obj/item/organ/heart/gland/egg = 7,
/obj/item/organ/heart/gland/emp = 3,
/obj/item/organ/heart/gland/chem = 5,
/obj/item/organ/heart/gland/mindshock = 5,
/obj/item/organ/heart/gland/plasma = 7,
/obj/item/organ/heart/gland/pop = 5,
@@ -48,6 +48,11 @@
icon_state = "floorglow"
duration = 5
/obj/effect/temp_visual/cult/portal
icon_state = "space"
duration = 600
layer = ABOVE_OBJ_LAYER
//visuals for runes being magically created
/obj/effect/temp_visual/cult/rune_spawn
icon_state = "runeouter"
@@ -1,70 +0,0 @@
/proc/generate_projectile_beam_between_points(datum/point/starting, datum/point/ending, beam_type, color, qdel_in = 5) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported!
if(!istype(starting) || !istype(ending) || !ispath(beam_type))
return
var/datum/point/midpoint = point_midpoint_points(starting, ending)
var/obj/effect/projectile_beam/PB = new beam_type
PB.apply_vars(angle_between_points(starting, ending), midpoint.return_px(), midpoint.return_py(), color, pixel_length_between_points(starting, ending) / world.icon_size, midpoint.return_turf(), 0)
. = PB
if(qdel_in)
QDEL_IN(PB, qdel_in)
/obj/effect/projectile_beam
icon = 'icons/obj/projectiles.dmi'
layer = ABOVE_MOB_LAYER
anchored = TRUE
light_power = 1
light_range = 2
light_color = "#00ffff"
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
flags_1 = ABSTRACT_1
appearance_flags = 0
/obj/effect/projectile_beam/singularity_pull()
return
/obj/effect/projectile_beam/singularity_act()
return
/obj/effect/projectile_beam/proc/scale_to(nx,ny,override=TRUE)
var/matrix/M
if(!override)
M = transform
else
M = new
M.Scale(nx,ny)
transform = M
/obj/effect/projectile_beam/proc/turn_to(angle,override=TRUE)
var/matrix/M
if(!override)
M = transform
else
M = new
M.Turn(angle)
transform = M
/obj/effect/projectile_beam/New(angle_override, p_x, p_y, color_override, scaling = 1)
if(angle_override && p_x && p_y && color_override && scaling)
apply_vars(angle_override, p_x, p_y, color_override, scaling)
return ..()
/obj/effect/projectile_beam/proc/apply_vars(angle_override, p_x = 0, p_y = 0, color_override, scaling = 1, new_loc, increment = 0)
var/mutable_appearance/look = new(src)
look.pixel_x = p_x
look.pixel_y = p_y
if(color_override)
look.color = color_override
appearance = look
scale_to(1,scaling, FALSE)
turn_to(angle_override, FALSE)
if(!isnull(new_loc)) //If you want to null it just delete it...
forceMove(new_loc)
for(var/i in 1 to increment)
pixel_x += round((sin(angle_override)+16*sin(angle_override)*2), 1)
pixel_y += round((cos(angle_override)+16*cos(angle_override)*2), 1)
/obj/effect/projectile_beam/tracer
icon_state = "tracer_beam"
/obj/effect/projectile_beam/tracer/aiming
icon_state = "gbeam"
@@ -0,0 +1,35 @@
/obj/effect/projectile/impact
name = "beam impact"
icon = 'icons/obj/projectiles_impact.dmi'
/obj/effect/projectile/impact/laser
name = "laser impact"
icon_state = "impact_laser"
/obj/effect/projectile/impact/laser/blue
name = "laser impact"
icon_state = "impact_blue"
/obj/effect/projectile/impact/disabler
name = "disabler impact"
icon_state = "impact_omni"
/obj/effect/projectile/impact/xray
name = "xray impact"
icon_state = "impact_xray"
/obj/effect/projectile/impact/pulse
name = "pulse impact"
icon_state = "impact_u_laser"
/obj/effect/projectile/impact/plasma_cutter
name = "plasma impact"
icon_state = "impact_plasmacutter"
/obj/effect/projectile/impact/stun
name = "stun impact"
icon_state = "impact_stun"
/obj/effect/projectile/impact/heavy_laser
name = "heavy laser impact"
icon_state = "impact_beam_heavy"
@@ -0,0 +1,27 @@
/obj/effect/projectile/muzzle
name = "muzzle flash"
icon = 'icons/obj/projectiles_muzzle.dmi'
/obj/effect/projectile/muzzle/laser
icon_state = "muzzle_laser"
/obj/effect/projectile/muzzle/laser/blue
icon_state = "muzzle_laser_blue"
/obj/effect/projectile/muzzle/disabler
icon_state = "muzzle_omni"
/obj/effect/projectile/muzzle/xray
icon_state = "muzzle_xray"
/obj/effect/projectile/muzzle/pulse
icon_state = "muzzle_u_laser"
/obj/effect/projectile/muzzle/plasma_cutter
icon_state = "muzzle_plasmacutter"
/obj/effect/projectile/muzzle/stun
icon_state = "muzzle_stun"
/obj/effect/projectile/muzzle/heavy_laser
icon_state = "muzzle_beam_heavy"
@@ -0,0 +1,56 @@
/obj/effect/projectile
name = "pew"
icon = 'icons/obj/projectiles.dmi'
icon_state = "nothing"
layer = ABOVE_MOB_LAYER
anchored = TRUE
light_power = 1
light_range = 2
light_color = "#00ffff"
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
flags_1 = ABSTRACT_1
appearance_flags = 0
/obj/effect/projectile/singularity_pull()
return
/obj/effect/projectile/singularity_act()
return
/obj/effect/projectile/proc/scale_to(nx,ny,override=TRUE)
var/matrix/M
if(!override)
M = transform
else
M = new
M.Scale(nx,ny)
transform = M
/obj/effect/projectile/proc/turn_to(angle,override=TRUE)
var/matrix/M
if(!override)
M = transform
else
M = new
M.Turn(angle)
transform = M
/obj/effect/projectile/New(angle_override, p_x, p_y, color_override, scaling = 1)
if(angle_override && p_x && p_y && color_override && scaling)
apply_vars(angle_override, p_x, p_y, color_override, scaling)
return ..()
/obj/effect/projectile/proc/apply_vars(angle_override, p_x = 0, p_y = 0, color_override, scaling = 1, new_loc, increment = 0)
var/mutable_appearance/look = new(src)
look.pixel_x = p_x
look.pixel_y = p_y
if(color_override)
look.color = color_override
appearance = look
scale_to(1,scaling, FALSE)
turn_to(angle_override, FALSE)
if(!isnull(new_loc)) //If you want to null it just delete it...
forceMove(new_loc)
for(var/i in 1 to increment)
pixel_x += round((sin(angle_override)+16*sin(angle_override)*2), 1)
pixel_y += round((cos(angle_override)+16*cos(angle_override)*2), 1)
@@ -0,0 +1,51 @@
/proc/generate_tracer_between_points(datum/point/starting, datum/point/ending, beam_type, color, qdel_in = 5) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported!
if(!istype(starting) || !istype(ending) || !ispath(beam_type))
return
var/datum/point/midpoint = point_midpoint_points(starting, ending)
var/obj/effect/projectile/tracer/PB = new beam_type
PB.apply_vars(angle_between_points(starting, ending), midpoint.return_px(), midpoint.return_py(), color, pixel_length_between_points(starting, ending) / world.icon_size, midpoint.return_turf(), 0)
. = PB
if(qdel_in)
QDEL_IN(PB, qdel_in)
/obj/effect/projectile/tracer
name = "beam"
icon = 'icons/obj/projectiles_tracer.dmi'
/obj/effect/projectile/tracer/laser
name = "laser"
icon_state = "beam"
/obj/effect/projectile/tracer/laser/blue
icon_state = "beam_blue"
/obj/effect/projectile/tracer/disabler
name = "disabler"
icon_state = "beam_omni"
/obj/effect/projectile/tracer/xray
name = "xray laser"
icon_state = "xray"
/obj/effect/projectile/tracer/pulse
name = "pulse laser"
icon_state = "u_laser"
/obj/effect/projectile/tracer/plasma_cutter
name = "plasma blast"
icon_state = "plasmacutter"
/obj/effect/projectile/tracer/stun
name = "stun beam"
icon_state = "stun"
/obj/effect/projectile/tracer/heavy_laser
name = "heavy laser"
icon_state = "beam_heavy"
//BEAM RIFLE
/obj/effect/projectile/tracer/tracer/beam_rifle
icon_state = "tracer_beam"
/obj/effect/projectile/tracer/tracer/aiming
icon_state = "pixelbeam_greyscale"
+3
View File
@@ -94,6 +94,8 @@
else
to_chat(user, "<span class='warning'>Strap the defibrillator's belt on first!</span>")
return
else if(istype(loc, /obj/machinery/defibrillator_mount))
ui_action_click() //checks for this are handled in defibrillator.mount.dm
..()
/obj/item/defibrillator/MouseDrop(obj/over_object)
@@ -200,6 +202,7 @@
if(on)
var/M = get(paddles, /mob)
remove_paddles(M)
QDEL_NULL(paddles)
. = ..()
update_icon()
@@ -1,6 +0,0 @@
/obj/item/device/machineprototype
name = "machine prototype"
desc = "A complicated machine prototype. You have no idea how it works."
icon = 'icons/obj/machineprototype.dmi'
icon_state = "machineprototype"
materials = list(MAT_METAL=1000, MAT_GLASS=500)
@@ -1,152 +0,0 @@
//Pinpointers are used to track atoms from a distance as long as they're on the same z-level. The captain and nuke ops have ones that track the nuclear authentication disk.
/obj/item/weapon/pinpointer
name = "pinpointer"
desc = "A handheld tracking device that locks onto certain signals."
icon = 'icons/obj/device.dmi'
icon_state = "pinpointer"
flags = CONDUCT
slot_flags = SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
item_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL = 500, MAT_GLASS = 250)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/active = FALSE
var/atom/movable/target = null //The thing we're searching for
var/minimum_range = 0 //at what range the pinpointer declares you to be at your destination
var/alert = FALSE // TRUE to display things more seriously
/obj/item/weapon/pinpointer/New()
..()
GLOB.pinpointer_list += src
/obj/item/weapon/pinpointer/Destroy()
STOP_PROCESSING(SSfastprocess, src)
GLOB.pinpointer_list -= src
return ..()
/obj/item/weapon/pinpointer/attack_self(mob/living/user)
active = !active
user.visible_message("<span class='notice'>[user] [active ? "" : "de"]activates their pinpointer.</span>", "<span class='notice'>You [active ? "" : "de"]activate your pinpointer.</span>")
playsound(user, 'sound/items/screwdriver2.ogg', 50, 1)
if(active)
START_PROCESSING(SSfastprocess, src)
else
target = null
STOP_PROCESSING(SSfastprocess, src)
update_pointer_overlay()
/obj/item/weapon/pinpointer/process()
if(!active)
STOP_PROCESSING(SSfastprocess, src)
return
scan_for_target()
update_pointer_overlay()
/obj/item/weapon/pinpointer/proc/scan_for_target()
return
/obj/item/weapon/pinpointer/proc/update_pointer_overlay()
cut_overlays()
if(!active)
return
if(!target)
add_overlay("pinon[alert ? "alert" : ""]null")
var/turf/here = get_turf(src)
var/turf/there = get_turf(target)
if(here.z != there.z)
add_overlay("pinon[alert ? "alert" : ""]null")
return
if(get_dist_euclidian(here,there) <= minimum_range)
add_overlay("pinon[alert ? "alert" : ""]direct")
else
setDir(get_dir(here, there))
switch(get_dist(here, there))
if(1 to 8)
add_overlay("pinon[alert ? "alert" : "close"]")
if(9 to 16)
add_overlay("pinon[alert ? "alert" : "medium"]")
if(16 to INFINITY)
add_overlay("pinon[alert ? "alert" : "far"]")
/obj/item/weapon/pinpointer/crew // A replacement for the old crew monitoring consoles
name = "crew pinpointer"
desc = "A handheld tracking device that points to crew suit sensors."
icon_state = "pinpointer_crew"
/obj/item/weapon/pinpointer/crew/proc/trackable(mob/living/carbon/human/H)
var/turf/here = get_turf(src)
if((H.z == 0 || H.z == here.z) && istype(H.w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = H.w_uniform
// Suit sensors must be on maximum.
if(!U.has_sensor || U.sensor_mode < SENSOR_COORDS)
return FALSE
var/turf/there = get_turf(H)
return (H.z != 0 || (there && there.z == H.z))
return FALSE
/obj/item/weapon/pinpointer/crew/attack_self(mob/living/user)
if(active)
active = FALSE
user.visible_message("<span class='notice'>[user] deactivates their pinpointer.</span>", "<span class='notice'>You deactivate your pinpointer.</span>")
playsound(user, 'sound/items/screwdriver2.ogg', 50, 1)
target = null //Restarting the pinpointer forces a target reset
STOP_PROCESSING(SSfastprocess, src)
update_pointer_overlay()
return
var/list/name_counts = list()
var/list/names = list()
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(!trackable(H))
continue
var/name = "Unknown"
if(H.wear_id)
var/obj/item/weapon/card/id/I = H.wear_id.GetID()
name = I.registered_name
while(name in name_counts)
name_counts[name]++
name = text("[] ([])", name, name_counts[name])
names[name] = H
name_counts[name] = 1
if(!names.len)
user.visible_message("<span class='notice'>[user]'s pinpointer fails to detect a signal.</span>", "<span class='notice'>Your pinpointer fails to detect a signal.</span>")
return
var/A = input(user, "Person to track", "Pinpoint") in names
if(!src || QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated() || !A)
return
target = names[A]
active = TRUE
user.visible_message("<span class='notice'>[user] activates their pinpointer.</span>", "<span class='notice'>You activate your pinpointer.</span>")
playsound(user, 'sound/items/screwdriver2.ogg', 50, 1)
START_PROCESSING(SSfastprocess, src)
update_pointer_overlay()
/obj/item/weapon/pinpointer/crew/scan_for_target()
if(target)
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(!trackable(H))
target = null
if(!target)
active = FALSE
/obj/item/weapon/pinpointer/process()
if(!active)
STOP_PROCESSING(SSfastprocess, src)
return
scan_for_target()
update_pointer_overlay()
@@ -0,0 +1,131 @@
/obj/item/device/reverse_bear_trap
name = "reverse bear trap"
desc = "A horrifying set of shut metal jaws, rigged to a kitchen timer and secured by padlock to a head-mounted clamp. To apply, hit someone with it."
icon_state = "reverse_bear_trap"
slot_flags = SLOT_HEAD
flags_1 = CONDUCT_1
resistance_flags = FIRE_PROOF | UNACIDABLE
w_class = WEIGHT_CLASS_NORMAL
obj_integrity = 300
max_integrity = 300
item_state = "rack_parts"
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
var/ticking = FALSE
var/time_left = 60 //seconds remaining until pop
var/escape_chance = 0 //chance per "fiddle" to get the trap off your head
var/struggling = FALSE
var/time_since_last_beep = 0
var/datum/looping_sound/reverse_bear_trap/soundloop
var/datum/looping_sound/reverse_bear_trap_beep/soundloop2
/obj/item/device/reverse_bear_trap/Initialize()
. = ..()
soundloop = new(list(src))
soundloop2 = new(list(src))
/obj/item/device/reverse_bear_trap/Destroy()
QDEL_NULL(soundloop)
QDEL_NULL(soundloop2)
STOP_PROCESSING(SSprocessing, src)
return ..()
/obj/item/device/reverse_bear_trap/process()
if(!ticking)
return
time_left--
soundloop2.mid_length = max(0.5, time_left - 5) //beepbeepbeepbeepbeep
if(!time_left || !isliving(loc))
playsound(src, 'sound/machines/microwave/microwave-end.ogg', 100, FALSE)
soundloop.stop()
soundloop2.stop()
to_chat(loc, "<span class='userdanger'>*ding*</span>")
addtimer(CALLBACK(src, .proc/snap), 2)
/obj/item/device/reverse_bear_trap/attack_hand(mob/user)
if(iscarbon(user))
var/mob/living/carbon/C = user
if(C.get_item_by_slot(slot_head) == src)
if(flags_1 & NODROP_1 && !struggling)
struggling = TRUE
var/fear_string
switch(time_left)
if(0 to 5)
fear_string = "agonizingly"
if(5 to 20)
fear_string = "desperately"
if(20 to 40)
fear_string = "panickedly"
if(40 to 50)
fear_string = "shakily"
if(50 to 60)
fear_string = ""
C.visible_message("<span class='danger'>[C] fiddles with and pulls at [src]...</span>", \
"<span class='danger'>You [fear_string] try to pull at [src]...</span>", "<i>You hear clicking and ticking.</i>")
if(!do_after(user, 20, target = src))
struggling = FALSE
return
if(!prob(escape_chance))
to_chat(user, "<span class='warning'>It doesn't budge!</span>")
escape_chance++
else
user.visible_message("<span class='warning'>The lock on [user]'s [name] pops open!</span>", \
"<span class='userdanger'>You force open the padlock!</span>", "<i>You hear a single, pronounced click!</i>")
flags_1 &= ~NODROP_1
struggling = FALSE
else
..()
return
..()
/obj/item/device/reverse_bear_trap/attack(mob/living/target, mob/living/user)
if(target.get_item_by_slot(slot_head))
to_chat(user, "<span class='warning'>Remove their headgear first!</span>")
return
target.visible_message("<span class='warning'>[user] starts forcing [src] onto [target]'s head!</span>", \
"<span class='userdanger'>[target] starts forcing [src] onto your head!</span>", "<i>You hear clanking.</i>")
to_chat(user, "<span class='danger'>You start forcing [src] onto [target]'s head...</span>")
if(!do_after(user, 30, target = target) || target.get_item_by_slot(slot_head))
return
target.visible_message("<span class='warning'>[user] forces and locks [src] onto [target]'s head!</span>", \
"<span class='userdanger'>[target] locks [src] onto your head!</span>", "<i>You hear a click, and then a timer ticking down.</i>")
to_chat(user, "<span class='danger'>You force [src] onto [target]'s head and click the padlock shut.</span>")
user.dropItemToGround(src)
target.equip_to_slot_if_possible(src, slot_head)
arm()
notify_ghosts("[user] put a reverse bear trap on [target]!", source = src, action = NOTIFY_ORBIT, ghost_sound = 'sound/machines/beep.ogg')
/obj/item/device/reverse_bear_trap/proc/snap()
reset()
var/mob/living/carbon/human/H = loc
if(!istype(H) || H.get_item_by_slot(slot_head) != src)
visible_message("<span class='warning'>[src]'s jaws snap open with an ear-piercing crack!</span>")
playsound(src, 'sound/effects/snap.ogg', 75, TRUE)
else
var/mob/living/carbon/human/jill = loc
jill.visible_message("<span class='boldwarning'>[src] goes off in [jill]'s mouth, ripping their head apart!</span>", "<span class='userdanger'>[src] goes off!</span>")
jill.emote("scream")
playsound(src, 'sound/effects/snap.ogg', 75, TRUE, frequency = 0.5)
playsound(src, 'sound/effects/splat.ogg', 50, TRUE, frequency = 0.5)
jill.apply_damage(9999, BRUTE, "head")
jill.death() //just in case, for some reason, they're still alive
flash_color(jill, flash_color = "#FF0000", flash_time = 100)
/obj/item/device/reverse_bear_trap/proc/reset()
ticking = FALSE
flags_1 &= ~NODROP_1
soundloop.stop()
soundloop2.stop()
STOP_PROCESSING(SSprocessing, src)
/obj/item/device/reverse_bear_trap/proc/arm() //hulen
ticking = TRUE
escape_chance = initial(escape_chance) //we keep these vars until re-arm, for tracking purposes
time_left = initial(time_left)
flags_1 |= NODROP_1
soundloop.start()
soundloop2.mid_length = initial(soundloop2.mid_length)
soundloop2.start()
START_PROCESSING(SSprocessing, src)
+4 -1
View File
@@ -425,6 +425,9 @@ GAS ANALYZER
to_chat(user, "<span class='warning'>This device can only scan slimes!</span>")
return
var/mob/living/simple_animal/slime/T = M
slime_scan(T, user)
/proc/slime_scan(mob/living/simple_animal/slime/T, mob/living/user)
to_chat(user, "Slime scan results:")
to_chat(user, "[T.colour] [T.is_adult ? "adult" : "baby"] slime")
to_chat(user, "Nutrition: [T.nutrition]/[T.get_max_nutrition()]")
@@ -449,4 +452,4 @@ GAS ANALYZER
to_chat(user, "Genetic destability: [T.mutation_chance] % chance of mutation on splitting")
if (T.cores > 1)
to_chat(user, "Anomalious slime core amount detected")
to_chat(user, "Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]")
to_chat(user, "Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]")
@@ -1,54 +0,0 @@
/obj/item/implant/gang
name = "gang implant"
desc = "Makes you a gangster or such."
activated = 0
var/datum/gang/gang
/obj/item/implant/gang/New(loc,var/setgang)
..()
gang = setgang
/obj/item/implant/gang/get_data()
var/dat = {"<b>Implant Specifications:</b><BR>
<b>Name:</b> Criminal brainwash implant<BR>
<b>Life:</b> A few seconds after injection.<BR>
<b>Important Notes:</b> Illegal<BR>
<HR>
<b>Implant Details:</b><BR>
<b>Function:</b> Contains a small pod of nanobots that change the host's brain to be loyal to a certain organization.<BR>
<b>Special Features:</b> This device will also emit a small EMP pulse, destroying any other implants within the host's brain.<BR>
<b>Integrity:</b> Implant's EMP function will destroy itself in the process."}
return dat
/obj/item/implant/gang/implant(mob/living/target, mob/user, silent = 0)
if(..())
for(var/obj/item/implant/I in target.implants)
if(I != src)
qdel(I)
if(!target.mind || target.stat == DEAD)
return 0
var/success
if(target.mind in SSticker.mode.get_gangsters())
if(SSticker.mode.remove_gangster(target.mind,0,1))
success = 1 //Was not a gang boss, convert as usual
else
success = 1
if(ishuman(target))
if(!success)
target.visible_message("<span class='warning'>[target] seems to resist the implant!</span>", "<span class='warning'>You feel the influence of your enemies try to invade your mind!</span>")
qdel(src)
return 0
/obj/item/implanter/gang
name = "implanter (gang)"
/obj/item/implanter/gang/New(loc, gang)
if(!gang)
qdel(src)
return
imp = new /obj/item/implant/gang(src,gang)
..()
@@ -19,8 +19,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("chair", /obj/structure/chair, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \
//CIT CHANGE - adds sofas to metal recipe list
//CIT CHANGE - adds sofas to metal recipe list
new/datum/stack_recipe_list("sofas", list( \
new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = TRUE, on_floor = TRUE), \
new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, one_per_turf = TRUE, on_floor = TRUE), \
@@ -135,7 +134,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
/obj/item/stack/sheet/metal/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins whacking themselves over the head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return BRUTELOSS
/*
* Plasteel
*/
@@ -353,6 +352,9 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
/obj/item/stack/sheet/runed_metal/fifty
amount = 50
/obj/item/stack/sheet/runed_metal/ten
amount = 10
/obj/item/stack/sheet/runed_metal/five
amount = 5
-789
View File
@@ -1,789 +0,0 @@
#define WELDER_FUEL_BURN_INTERVAL 13
/* Tools!
* Note: Multitools are /obj/item/device
*
* Contains:
* Wrench
* Screwdriver
* Wirecutters
* Welding Tool
* Crowbar
*/
/*
* Wrench
*/
/obj/item/wrench
name = "wrench"
desc = "A wrench with common uses. Can be found in your hand."
icon = 'icons/obj/tools.dmi'
icon_state = "wrench"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
flags_1 = CONDUCT_1
slot_flags = SLOT_BELT
force = 5
throwforce = 7
w_class = WEIGHT_CLASS_SMALL
usesound = 'sound/items/ratchet.ogg'
materials = list(MAT_METAL=150)
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
toolspeed = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
/obj/item/wrench/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
return (BRUTELOSS)
/obj/item/wrench/cyborg
name = "automatic wrench"
desc = "An advanced robotic wrench. Can be found in construction cyborgs."
toolspeed = 0.5
/obj/item/wrench/brass
name = "brass wrench"
desc = "A brass wrench. It's faintly warm to the touch."
resistance_flags = FIRE_PROOF | ACID_PROOF
icon_state = "wrench_brass"
toolspeed = 0.5
/obj/item/wrench/abductor
name = "alien wrench"
desc = "A polarized wrench. It causes anything placed between the jaws to turn."
icon = 'icons/obj/abductor.dmi'
icon_state = "wrench"
usesound = 'sound/effects/empulse.ogg'
toolspeed = 0.1
/obj/item/wrench/power
name = "hand drill"
desc = "A simple powered hand drill. It's fitted with a bolt bit."
icon_state = "drill_bolt"
item_state = "drill"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
usesound = 'sound/items/drill_use.ogg'
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
force = 8 //might or might not be too high, subject to change
w_class = WEIGHT_CLASS_SMALL
throwforce = 8
attack_verb = list("drilled", "screwed", "jabbed")
toolspeed = 0.25
/obj/item/wrench/power/attack_self(mob/user)
playsound(get_turf(user),'sound/items/change_drill.ogg',50,1)
var/obj/item/wirecutters/power/s_drill = new /obj/item/screwdriver/power
to_chat(user, "<span class='notice'>You attach the screw driver bit to [src].</span>")
qdel(src)
user.put_in_active_hand(s_drill)
/obj/item/wrench/power/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is pressing [src] against [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return (BRUTELOSS)
/obj/item/wrench/medical
name = "medical wrench"
desc = "A medical wrench with common(medical?) uses. Can be found in your hand."
icon_state = "wrench_medical"
force = 2 //MEDICAL
throwforce = 4
attack_verb = list("wrenched", "medicaled", "tapped", "jabbed", "whacked")
/obj/item/wrench/medical/suicide_act(mob/living/user)
user.visible_message("<span class='suicide'>[user] is praying to the medical wrench to take [user.p_their()] soul. It looks like [user.p_theyre()] trying to commit suicide!</span>")
// TODO Make them glow with the power of the M E D I C A L W R E N C H
// during their ascension
// Stun stops them from wandering off
user.Stun(100, ignore_canstun = TRUE)
playsound(loc, 'sound/effects/pray.ogg', 50, 1, -1)
// Let the sound effect finish playing
sleep(20)
if(!user)
return
for(var/obj/item/W in user)
user.dropItemToGround(W)
var/obj/item/wrench/medical/W = new /obj/item/wrench/medical(loc)
W.add_fingerprint(user)
W.desc += " For some reason, it reminds you of [user.name]."
if(!user)
return
user.dust()
return OXYLOSS
/*
* Screwdriver
*/
/obj/item/screwdriver
name = "screwdriver"
desc = "You can be totally screwy with this."
icon = 'icons/obj/tools.dmi'
icon_state = "screwdriver_map"
item_state = "screwdriver"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
flags_1 = CONDUCT_1
slot_flags = SLOT_BELT
force = 5
w_class = WEIGHT_CLASS_TINY
throwforce = 5
throw_speed = 3
throw_range = 5
materials = list(MAT_METAL=75)
attack_verb = list("stabbed")
hitsound = 'sound/weapons/bladeslice.ogg'
usesound = 'sound/items/screwdriver.ogg'
toolspeed = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
var/random_color = TRUE //if the screwdriver uses random coloring
var/static/list/screwdriver_colors = list(\
"blue" = rgb(24, 97, 213), \
"red" = rgb(149, 23, 16), \
"pink" = rgb(213, 24, 141), \
"brown" = rgb(160, 82, 18), \
"green" = rgb(14, 127, 27), \
"cyan" = rgb(24, 162, 213), \
"yellow" = rgb(213, 140, 24), \
)
/obj/item/screwdriver/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return(BRUTELOSS)
/obj/item/screwdriver/Initialize()
. = ..()
if(random_color) //random colors!
icon_state = "screwdriver"
var/our_color = pick(screwdriver_colors)
add_atom_colour(screwdriver_colors[our_color], FIXED_COLOUR_PRIORITY)
update_icon()
if(prob(75))
pixel_y = rand(0, 16)
/obj/item/screwdriver/update_icon()
if(!random_color) //icon override
return
cut_overlays()
var/mutable_appearance/base_overlay = mutable_appearance(icon, "screwdriver_screwybits")
base_overlay.appearance_flags = RESET_COLOR
add_overlay(base_overlay)
/obj/item/screwdriver/worn_overlays(isinhands = FALSE, icon_file)
. = list()
if(isinhands && random_color)
var/mutable_appearance/M = mutable_appearance(icon_file, "screwdriver_head")
M.appearance_flags = RESET_COLOR
. += M
/obj/item/screwdriver/get_belt_overlay()
if(random_color)
var/mutable_appearance/body = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver")
var/mutable_appearance/head = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver_head")
body.color = color
head.add_overlay(body)
return head
else
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', icon_state)
/obj/item/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!istype(M))
return ..()
if(user.zone_selected != "eyes" && user.zone_selected != "head")
return ..()
if(user.disabilities & CLUMSY && prob(50))
M = user
return eyestab(M,user)
/obj/item/screwdriver/brass
name = "brass screwdriver"
desc = "A screwdriver made of brass. The handle feels freezing cold."
resistance_flags = FIRE_PROOF | ACID_PROOF
icon_state = "screwdriver_brass"
item_state = "screwdriver_brass"
toolspeed = 0.5
random_color = FALSE
/obj/item/screwdriver/abductor
name = "alien screwdriver"
desc = "An ultrasonic screwdriver."
icon = 'icons/obj/abductor.dmi'
icon_state = "screwdriver_a"
item_state = "screwdriver_nuke"
usesound = 'sound/items/pshoom.ogg'
toolspeed = 0.1
random_color = FALSE
/obj/item/screwdriver/power
name = "hand drill"
desc = "A simple powered hand drill. It's fitted with a screw bit."
icon_state = "drill_screw"
item_state = "drill"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
force = 8 //might or might not be too high, subject to change
w_class = WEIGHT_CLASS_SMALL
throwforce = 8
throw_speed = 2
throw_range = 3//it's heavier than a screw driver/wrench, so it does more damage, but can't be thrown as far
attack_verb = list("drilled", "screwed", "jabbed","whacked")
hitsound = 'sound/items/drill_hit.ogg'
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.25
random_color = FALSE
/obj/item/screwdriver/power/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is putting [src] to [user.p_their()] temple. It looks like [user.p_theyre()] trying to commit suicide!</span>")
return(BRUTELOSS)
/obj/item/screwdriver/power/attack_self(mob/user)
playsound(get_turf(user),'sound/items/change_drill.ogg',50,1)
var/obj/item/wrench/power/b_drill = new /obj/item/wrench/power
to_chat(user, "<span class='notice'>You attach the bolt driver bit to [src].</span>")
qdel(src)
user.put_in_active_hand(b_drill)
/obj/item/screwdriver/cyborg
name = "powered screwdriver"
desc = "An electrical screwdriver, designed to be both precise and quick."
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.5
/*
* Wirecutters
*/
/obj/item/wirecutters
name = "wirecutters"
desc = "This cuts wires."
icon = 'icons/obj/tools.dmi'
icon_state = "cutters"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
flags_1 = CONDUCT_1
slot_flags = SLOT_BELT
force = 6
throw_speed = 3
throw_range = 7
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=80)
attack_verb = list("pinched", "nipped")
hitsound = 'sound/items/wirecutter.ogg'
usesound = 'sound/items/wirecutter.ogg'
toolspeed = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
var/random_color = TRUE
/obj/item/wirecutters/New(loc, var/param_color = null)
..()
if(random_color)
if(!param_color)
param_color = pick("yellow","red")
icon_state = "cutters_[param_color]"
/obj/item/wirecutters/attack(mob/living/carbon/C, mob/user)
if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/restraints/handcuffs/cable))
user.visible_message("<span class='notice'>[user] cuts [C]'s restraints with [src]!</span>")
qdel(C.handcuffed)
C.handcuffed = null
if(C.buckled && C.buckled.buckle_requires_restraints)
C.buckled.unbuckle_mob(C)
C.update_handcuffed()
return
else
..()
/obj/item/wirecutters/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is cutting at [user.p_their()] arteries with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
playsound(loc, usesound, 50, 1, -1)
return (BRUTELOSS)
/obj/item/wirecutters/brass
name = "brass wirecutters"
desc = "A pair of wirecutters made of brass. The handle feels freezing cold to the touch."
resistance_flags = FIRE_PROOF | ACID_PROOF
icon_state = "cutters_brass"
random_color = FALSE
toolspeed = 0.5
/obj/item/wirecutters/abductor
name = "alien wirecutters"
desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
icon = 'icons/obj/abductor.dmi'
icon_state = "cutters"
toolspeed = 0.1
random_color = FALSE
/obj/item/wirecutters/cyborg
name = "wirecutters"
desc = "This cuts wires."
toolspeed = 0.5
/obj/item/wirecutters/power
name = "jaws of life"
desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a cutting head."
icon_state = "jaws_cutter"
item_state = "jawsoflife"
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
usesound = 'sound/items/jaws_cut.ogg'
toolspeed = 0.25
random_color = FALSE
/obj/item/wirecutters/power/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is wrapping \the [src] around [user.p_their()] neck. It looks like [user.p_theyre()] trying to rip [user.p_their()] head off!</span>")
playsound(loc, 'sound/items/jaws_cut.ogg', 50, 1, -1)
if(iscarbon(user))
var/mob/living/carbon/C = user
var/obj/item/bodypart/BP = C.get_bodypart("head")
if(BP)
BP.drop_limb()
playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
return (BRUTELOSS)
/obj/item/wirecutters/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
var/obj/item/crowbar/power/pryjaws = new /obj/item/crowbar/power
to_chat(user, "<span class='notice'>You attach the pry jaws to [src].</span>")
qdel(src)
user.put_in_active_hand(pryjaws)
/*
* Welding Tool
*/
/obj/item/weldingtool
name = "welding tool"
desc = "A standard edition welder provided by Nanotrasen."
icon = 'icons/obj/tools.dmi'
icon_state = "welder"
item_state = "welder"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
flags_1 = CONDUCT_1
slot_flags = SLOT_BELT
force = 3
throwforce = 5
hitsound = "swing_hit"
usesound = 'sound/items/welder.ogg'
var/acti_sound = 'sound/items/welderactivate.ogg'
var/deac_sound = 'sound/items/welderdeactivate.ogg'
throw_speed = 3
throw_range = 5
w_class = WEIGHT_CLASS_SMALL
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 30)
resistance_flags = FIRE_PROOF
materials = list(MAT_METAL=70, MAT_GLASS=30)
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
var/status = TRUE //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
var/max_fuel = 20 //The max amount of fuel the welder can hold
var/change_icons = 1
var/can_off_process = 0
var/light_intensity = 2 //how powerful the emitted light is when used.
var/burned_fuel_for = 0 //when fuel was last removed
heat = 3800
toolspeed = 1
/obj/item/weldingtool/Initialize()
. = ..()
create_reagents(max_fuel)
reagents.add_reagent("welding_fuel", max_fuel)
update_icon()
/obj/item/weldingtool/proc/update_torch()
if(welding)
add_overlay("[initial(icon_state)]-on")
item_state = "[initial(item_state)]1"
else
item_state = "[initial(item_state)]"
/obj/item/weldingtool/update_icon()
cut_overlays()
if(change_icons)
var/ratio = get_fuel() / max_fuel
ratio = Ceiling(ratio*4) * 25
add_overlay("[initial(icon_state)][ratio]")
update_torch()
return
/obj/item/weldingtool/process()
switch(welding)
if(0)
force = 3
damtype = "brute"
update_icon()
if(!can_off_process)
STOP_PROCESSING(SSobj, src)
return
//Welders left on now use up fuel, but lets not have them run out quite that fast
if(1)
force = 15
damtype = "fire"
++burned_fuel_for
if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL)
remove_fuel(1)
update_icon()
//This is to start fires. process() is only called if the welder is on.
open_flame()
/obj/item/weldingtool/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return (FIRELOSS)
/obj/item/weldingtool/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/screwdriver))
flamethrower_screwdriver(I, user)
else if(istype(I, /obj/item/stack/rods))
flamethrower_rods(I, user)
else if(istype(I, /obj/item/reagent_containers) && I.is_open_container())
var/amountNeeded = max_fuel - get_fuel()
var/obj/item/reagent_containers/container = I
if(length(container.reagents.reagent_list) > 1)
to_chat(user, "<span class='warning'>[container] has too many chemicals mixed into it. You wouldn't want to put the wrong chemicals into [src].</span>")
return ..()
if(amountNeeded > 0 && container.reagents.has_reagent("welding_fuel"))
container.reagents.trans_id_to(src, "welding_fuel", amountNeeded)
to_chat(user, "<span class='notice'>You transfer some fuel from [container] to [src].</span>")
else
return ..()
/obj/item/weldingtool/attack(mob/living/carbon/human/H, mob/user)
if(!istype(H))
return ..()
var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected))
if(affecting && affecting.status == BODYPART_ROBOTIC && user.a_intent != INTENT_HARM)
if(src.remove_fuel(1))
playsound(loc, usesound, 50, 1)
if(user == H)
user.visible_message("<span class='notice'>[user] starts to fix some of the dents on [H]'s [affecting.name].</span>", "<span class='notice'>You start fixing some of the dents on [H]'s [affecting.name].</span>")
if(!do_mob(user, H, 50))
return
item_heal_robotic(H, user, 15, 0)
else
return ..()
/obj/item/weldingtool/afterattack(atom/O, mob/user, proximity)
if(!proximity)
return
if(welding)
remove_fuel(1)
var/turf/location = get_turf(user)
location.hotspot_expose(700, 50, 1)
if(get_fuel() <= 0)
set_light(0)
if(isliving(O))
var/mob/living/L = O
if(L.IgniteMob())
message_admins("[key_name_admin(user)] set [key_name_admin(L)] on fire")
log_game("[key_name(user)] set [key_name(L)] on fire")
/obj/item/weldingtool/attack_self(mob/user)
switched_on(user)
if(welding)
set_light(light_intensity)
update_icon()
//Returns the amount of fuel in the welder
/obj/item/weldingtool/proc/get_fuel()
return reagents.get_reagent_amount("welding_fuel")
//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use()
/obj/item/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null)
if(!welding || !check_fuel())
return 0
if(amount)
burned_fuel_for = 0
if(get_fuel() >= amount)
reagents.remove_reagent("welding_fuel", amount)
check_fuel()
if(M)
M.flash_act(light_intensity)
return TRUE
else
if(M)
to_chat(M, "<span class='warning'>You need more welding fuel to complete this task!</span>")
return FALSE
//Turns off the welder if there is no more fuel (does this really need to be its own proc?)
/obj/item/weldingtool/proc/check_fuel(mob/user)
if(get_fuel() <= 0 && welding)
switched_on(user)
update_icon()
//mob icon update
if(ismob(loc))
var/mob/M = loc
M.update_inv_hands(0)
return 0
return 1
//Switches the welder on
/obj/item/weldingtool/proc/switched_on(mob/user)
if(!status)
to_chat(user, "<span class='warning'>[src] can't be turned on while unsecured!</span>")
return
welding = !welding
if(welding)
if(get_fuel() >= 1)
to_chat(user, "<span class='notice'>You switch [src] on.</span>")
playsound(loc, acti_sound, 50, 1)
force = 15
damtype = "fire"
hitsound = 'sound/items/welder.ogg'
update_icon()
START_PROCESSING(SSobj, src)
else
to_chat(user, "<span class='warning'>You need more fuel!</span>")
switched_off(user)
else
to_chat(user, "<span class='notice'>You switch [src] off.</span>")
playsound(loc, deac_sound, 50, 1)
switched_off(user)
//Switches the welder off
/obj/item/weldingtool/proc/switched_off(mob/user)
welding = 0
set_light(0)
force = 3
damtype = "brute"
hitsound = "swing_hit"
update_icon()
/obj/item/weldingtool/examine(mob/user)
..()
to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].")
/obj/item/weldingtool/is_hot()
return welding * heat
//Returns whether or not the welding tool is currently on.
/obj/item/weldingtool/proc/isOn()
return welding
/obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user)
if(welding)
to_chat(user, "<span class='warning'>Turn it off first!</span>")
return
status = !status
if(status)
to_chat(user, "<span class='notice'>You resecure [src].</span>")
else
to_chat(user, "<span class='notice'>[src] can now be attached and modified.</span>")
add_fingerprint(user)
/obj/item/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user)
if(!status)
var/obj/item/stack/rods/R = I
if (R.use(1))
var/obj/item/flamethrower/F = new /obj/item/flamethrower(user.loc)
if(!remove_item_from_storage(F))
user.transferItemToLoc(src, F, TRUE)
F.weldtool = src
add_fingerprint(user)
to_chat(user, "<span class='notice'>You add a rod to a welder, starting to build a flamethrower.</span>")
user.put_in_hands(F)
else
to_chat(user, "<span class='warning'>You need one rod to start building a flamethrower!</span>")
/obj/item/weldingtool/ignition_effect(atom/A, mob/user)
if(welding && remove_fuel(1, user))
. = "<span class='notice'>[user] casually lights [A] with [src], what a badass.</span>"
else
. = ""
/obj/item/weldingtool/largetank
name = "industrial welding tool"
desc = "A slightly larger welder with a larger tank."
icon_state = "indwelder"
max_fuel = 40
materials = list(MAT_GLASS=60)
/obj/item/weldingtool/largetank/cyborg
name = "integrated welding tool"
desc = "An advanced welder designed to be used in robotic systems."
toolspeed = 0.5
/obj/item/weldingtool/largetank/flamethrower_screwdriver()
return
/obj/item/weldingtool/mini
name = "emergency welding tool"
desc = "A miniature welder used during emergencies."
icon_state = "miniwelder"
max_fuel = 10
w_class = WEIGHT_CLASS_TINY
materials = list(MAT_METAL=30, MAT_GLASS=10)
change_icons = 0
/obj/item/weldingtool/mini/flamethrower_screwdriver()
return
/obj/item/weldingtool/abductor
name = "alien welding tool"
desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
icon = 'icons/obj/abductor.dmi'
icon_state = "welder"
toolspeed = 0.1
light_intensity = 0
change_icons = 0
/obj/item/weldingtool/abductor/process()
if(get_fuel() <= max_fuel)
reagents.add_reagent("welding_fuel", 1)
..()
/obj/item/weldingtool/hugetank
name = "upgraded industrial welding tool"
desc = "An upgraded welder based of the industrial welder."
icon_state = "upindwelder"
item_state = "upindwelder"
max_fuel = 80
materials = list(MAT_METAL=70, MAT_GLASS=120)
/obj/item/weldingtool/experimental
name = "experimental welding tool"
desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes."
icon_state = "exwelder"
item_state = "exwelder"
max_fuel = 40
materials = list(MAT_METAL=70, MAT_GLASS=120)
var/last_gen = 0
change_icons = 0
can_off_process = 1
light_intensity = 1
toolspeed = 0.5
var/nextrefueltick = 0
/obj/item/weldingtool/experimental/brass
name = "brass welding tool"
desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch."
resistance_flags = FIRE_PROOF | ACID_PROOF
icon_state = "brasswelder"
item_state = "brasswelder"
/obj/item/weldingtool/experimental/process()
..()
if(get_fuel() < max_fuel && nextrefueltick < world.time)
nextrefueltick = world.time + 10
reagents.add_reagent("welding_fuel", 1)
/*
* Crowbar
*/
/obj/item/crowbar
name = "pocket crowbar"
desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors."
icon = 'icons/obj/tools.dmi'
icon_state = "crowbar"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
usesound = 'sound/items/crowbar.ogg'
flags_1 = CONDUCT_1
slot_flags = SLOT_BELT
force = 5
throwforce = 7
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50)
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
toolspeed = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
/obj/item/crowbar/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
return (BRUTELOSS)
/obj/item/crowbar/red
icon_state = "crowbar_red"
force = 8
/obj/item/crowbar/brass
name = "brass crowbar"
desc = "A brass crowbar. It feels faintly warm to the touch."
resistance_flags = FIRE_PROOF | ACID_PROOF
icon_state = "crowbar_brass"
toolspeed = 0.5
/obj/item/crowbar/abductor
name = "alien crowbar"
desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
icon = 'icons/obj/abductor.dmi'
usesound = 'sound/weapons/sonic_jackhammer.ogg'
icon_state = "crowbar"
toolspeed = 0.1
/obj/item/crowbar/large
name = "crowbar"
desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big."
force = 12
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 3
throw_range = 3
materials = list(MAT_METAL=70)
icon_state = "crowbar_large"
item_state = "crowbar"
toolspeed = 0.5
/obj/item/crowbar/cyborg
name = "hydraulic crowbar"
desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs."
usesound = 'sound/items/jaws_pry.ogg'
force = 10
toolspeed = 0.5
/obj/item/crowbar/power
name = "jaws of life"
desc = "A set of jaws of life, compressed through the magic of science. It's fitted with a prying head."
icon_state = "jaws_pry"
item_state = "jawsoflife"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
usesound = 'sound/items/jaws_pry.ogg'
force = 15
toolspeed = 0.25
/obj/item/crowbar/power/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is putting [user.p_their()] head in [src], it looks like [user.p_theyre()] trying to commit suicide!</span>")
playsound(loc, 'sound/items/jaws_pry.ogg', 50, 1, -1)
return (BRUTELOSS)
/obj/item/crowbar/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
var/obj/item/wirecutters/power/cutjaws = new /obj/item/wirecutters/power
to_chat(user, "<span class='notice'>You attach the cutting jaws to [src].</span>")
qdel(src)
user.put_in_active_hand(cutjaws)
#undef WELDER_FUEL_BURN_INTERVAL
+23
View File
@@ -613,3 +613,26 @@
if(!user.can_use_guns(src))
return FALSE
return TRUE
/obj/item/extendohand
name = "extendo-hand"
desc = "Futuristic tech has allowed these classic spring-boxing toys to essentially act as a fully functional hand-operated hand prosthetic."
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "extendohand"
item_state = "extendohand"
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
force = 0
throwforce = 5
reach = 2
/obj/item/extendohand/acme
name = "\improper ACME Extendo-Hand"
desc = "A novelty extendo-hand produced by the ACME corporation. Originally designed to knock out roadrunners."
/obj/item/extendohand/attack(atom/M, mob/living/carbon/human/user)
var/dist = get_dist(M, user)
if(dist < reach)
to_chat(user, "<span class='warning'>[M] is too close to use [src] on.</span>")
return
M.attack_hand(user)
-60
View File
@@ -1,60 +0,0 @@
/proc/radiation_pulse(turf/epicenter, heavy_range, light_range, severity, log=0)
if(!epicenter || !severity)
return
if(!isturf(epicenter))
epicenter = get_turf(epicenter.loc)
if(heavy_range > light_range)
light_range = heavy_range
var/light_severity = severity * 0.5
for(var/atom/T in range(light_range, epicenter))
var/distance = get_dist(epicenter, T)
if(distance < 0)
distance = 0
if(distance < heavy_range)
T.rad_act(severity)
else if(distance == heavy_range)
if(prob(50))
T.rad_act(severity)
else
T.rad_act(light_severity)
else if(distance <= light_range)
T.rad_act(light_severity)
if(log)
log_game("Radiation pulse with size ([heavy_range], [light_range]) and severity [severity] in area [epicenter.loc.name] ")
return 1
/atom/proc/rad_act(var/severity)
return 1
/mob/living/rad_act(amount, silent = 0)
if(amount)
var/blocked = getarmor(null, "rad")
if(!silent)
to_chat(src, "Your skin feels warm.")
apply_effect(amount, IRRADIATE, blocked)
for(var/obj/I in src) //Radiation is also applied to items held by the mob
I.rad_act(amount)
/mob/living/carbon/rad_act(amount, silent = 0)
if(dna && (RADIMMUNE in dna.species.species_traits))
silent = TRUE
..()
//Silicons will inherently not get irradiated due to having an empty handle_mutations_and_radiation, but they need to not hear this
/mob/living/silicon/rad_act(amount)
. = ..(amount, TRUE)
/mob/living/simple_animal/bot/rad_act(amount)
. = ..(amount, TRUE)
/mob/living/simple_animal/drone/rad_act(amount)
. = ..(amount, TRUE)
/mob/living/simple_animal/hostile/swarmer/rad_act(amount)
. = ..(amount, TRUE)
@@ -1,12 +0,0 @@
/obj/structure/chair/sofa
name = "old ratty sofa"
icon_state = "sofamiddle"
icon = 'icons/obj/sofa.dmi'
buildstackamount = 1
/obj/structure/chair/sofa/left
icon_state = "sofaend_left"
/obj/structure/chair/sofa/right
icon_state = "sofaend_right"
/obj/structure/chair/sofa/corner
icon_state = "sofacorner"
@@ -125,7 +125,6 @@
/obj/structure/closet/coffin
name = "coffin"
desc = "It's a burial receptacle for the dearly departed."
icon = 'goon/icons/obj/closet.dmi'
icon_state = "coffin"
resistance_flags = FLAMMABLE
max_integrity = 70
@@ -74,6 +74,7 @@
new /obj/item/door_remote/chief_medical_officer(src)
new /obj/item/clothing/neck/petcollar(src)
new /obj/item/pet_carrier(src)
new /obj/item/wallframe/defib_mount(src)
new /obj/item/circuitboard/machine/protolathe/department/medical(src)
/obj/structure/closet/secure_closet/animal
+1 -1
View File
@@ -346,7 +346,7 @@
/obj/structure/girder/cult/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
if(istype(W, /obj/item/tome) && iscultist(user)) //Cultists can demolish cult girders instantly with their tomes
if(istype(W, /obj/item/melee/cultblade/dagger) && iscultist(user)) //Cultists can demolish cult girders instantly with their tomes
user.visible_message("<span class='warning'>[user] strikes [src] with [W]!</span>", "<span class='notice'>You demolish [src].</span>")
var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
R.amount = 1
+21 -9
View File
@@ -24,7 +24,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
var/obj/structure/tray/connected = null
var/locked = FALSE
var/opendir = SOUTH
dir = SOUTH
var/message_cooldown
var/breakout_time = 600
@@ -115,12 +115,15 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
/obj/structure/bodycontainer/proc/open()
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
var/turf/T = get_step(src, opendir)
playsound(src, 'sound/effects/roll.ogg', 5, 1)
var/turf/T = get_step(src, dir)
connected.dir=dir
for(var/atom/movable/AM in src)
AM.forceMove(T)
update_icon()
/obj/structure/bodycontainer/proc/close()
playsound(src, 'sound/effects/roll.ogg', 5, 1)
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
for(var/atom/movable/AM in connected.loc)
if(!AM.anchored || AM == connected)
@@ -137,7 +140,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
name = "morgue"
desc = "Used to keep bodies in until someone fetches them."
icon_state = "morgue1"
opendir = EAST
dir = EAST
/obj/structure/bodycontainer/morgue/New()
connected = new/obj/structure/tray/m_tray(src)
@@ -156,11 +159,14 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
if(!length(compiled)) // No mobs?
icon_state = "morgue3"
return
for(var/mob/living/M in compiled)
if(M.client && !M.suiciding)
var/mob/living/mob_occupant = get_mob_or_brainmob(M)
if(!mob_occupant.suiciding && !(mob_occupant.has_trait(TRAIT_NOCLONE)) && !mob_occupant.hellbound)
icon_state = "morgue4" // Cloneable
break
/obj/item/paper/guides/jobs/medical/morgue
name = "morgue memo"
info = "<font size='2'>Since this station's medbay never seems to fail to be staffed by the mindless monkeys meant for genetics experiments, I'm leaving a reminder here for anyone handling the pile of cadavers the quacks are sure to leave.</font><BR><BR><font size='4'><font color=red>Red lights mean there's a plain ol' dead body inside.</font><BR><BR><font color=orange>Yellow lights mean there's non-body objects inside.</font><BR><font size='2'>Probably stuff pried off a corpse someone grabbed, or if you're lucky it's stashed booze.</font><BR><BR><font color=green>Green lights mean the morgue system detects the body may be able to be cloned.</font></font><BR><font size='2'>I don't know how that works, but keep it away from the kitchen and go yell at the geneticists.</font><BR><BR>- CentCom medical inspector"
@@ -173,7 +179,7 @@ GLOBAL_LIST_EMPTY(crematoriums)
name = "crematorium"
desc = "A human incinerator. Works well on barbeque nights."
icon_state = "crema1"
opendir = SOUTH
dir = SOUTH
var/id = 1
/obj/structure/bodycontainer/crematorium/attack_robot(mob/user) //Borgs can't use crematoriums without help
@@ -235,12 +241,18 @@ GLOBAL_LIST_EMPTY(crematoriums)
M.ghostize()
qdel(M)
for(var/obj/O in conts) //obj instead of obj/item so that bodybags and ashes get destroyed. We dont want tons and tons of ash piling up
if(O != connected) //Creamtorium does not burn hot enough to destroy the tray
qdel(O)
var/ash_check = FALSE
for(var/obj/O in conts) //conts defined above, ignores crematorium and tray
if(istype(O,/obj/effect/decal/cleanable/ash)) ash_check = TRUE//creates the illusion of ash piling up
qdel(O)
var/obj/effect/decal/cleanable/ash/a
if(ash_check) a=new/obj/effect/decal/cleanable/ash/large(src)//cont. illusion of more ash
else a=new/obj/effect/decal/cleanable/ash(src)
a.layer = connected.layer//Makes the ash the same layer as the tray.
new /obj/effect/decal/cleanable/ash(src)
sleep(30)
if(!QDELETED(src))
locked = FALSE
update_icon()
-352
View File
@@ -1,352 +0,0 @@
/obj/structure/sign
icon = 'icons/obj/decals.dmi'
anchored = TRUE
opacity = 0
density = FALSE
layer = SIGN_LAYER
max_integrity = 100
armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
var/buildable_sign = 1 //unwrenchable and modifiable
/obj/structure/sign/ComponentInitialize()
. = ..()
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION) // Since this is on a wall if it becomes irradiated it will smuggle the radiation past the wall
/obj/structure/sign/basic
name = "blank sign"
desc = "How can signs be real if our eyes aren't real?"
icon_state = "backing"
/obj/structure/sign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
if(damage_amount)
playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
else
playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
if(BURN)
playsound(loc, 'sound/items/welder.ogg', 80, 1)
/obj/structure/sign/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/wrench) && buildable_sign)
user.visible_message("<span class='notice'>[user] starts removing [src]...</span>", \
"<span class='notice'>You start unfastening [src].</span>")
playsound(src, O.usesound, 50, 1)
if(!do_after(user, 30*O.toolspeed, target = src))
return
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
user.visible_message("<span class='notice'>[user] unfastens [src].</span>", \
"<span class='notice'>You unfasten [src].</span>")
var/obj/item/sign_backing/SB = new (get_turf(user))
SB.icon_state = icon_state
SB.sign_path = type
qdel(src)
else if(istype(O, /obj/item/pen) && buildable_sign)
var/list/sign_types = list("Secure Area", "Biohazard", "High Voltage", "Radiation", "Hard Vacuum Ahead", "Disposal: Leads To Space", "Danger: Fire", "No Smoking", "Medbay", "Science", "Chemistry", \
"Hydroponics", "Xenobiology")
var/obj/structure/sign/sign_type
switch(input(user, "Select a sign type.", "Sign Customization") as null|anything in sign_types)
if("Blank")
sign_type = /obj/structure/sign/basic
if("Secure Area")
sign_type = /obj/structure/sign/securearea
if("Biohazard")
sign_type = /obj/structure/sign/biohazard
if("High Voltage")
sign_type = /obj/structure/sign/electricshock
if("Radiation")
sign_type = /obj/structure/sign/radiation
if("Hard Vacuum Ahead")
sign_type = /obj/structure/sign/vacuum
if("Disposal: Leads To Space")
sign_type = /obj/structure/sign/deathsposal
if("Danger: Fire")
sign_type = /obj/structure/sign/fire
if("No Smoking")
sign_type = /obj/structure/sign/nosmoking_1
if("Medbay")
sign_type = /obj/structure/sign/bluecross_2
if("Science")
sign_type = /obj/structure/sign/science
if("Chemistry")
sign_type = /obj/structure/sign/chemistry
if("Hydroponics")
sign_type = /obj/structure/sign/botany
if("Xenobiology")
sign_type = /obj/structure/sign/xenobio
//Make sure user is adjacent still
if(!Adjacent(user))
return
if(!sign_type)
return
//It's import to clone the pixel layout information
//Otherwise signs revert to being on the turf and
//move jarringly
var/obj/structure/sign/newsign = new sign_type(get_turf(src))
newsign.pixel_x = pixel_x
newsign.pixel_y = pixel_y
qdel(src)
else
return ..()
/obj/item/sign_backing
name = "sign backing"
desc = "A sign with adhesive backing."
icon = 'icons/obj/decals.dmi'
icon_state = "backing"
w_class = WEIGHT_CLASS_NORMAL
resistance_flags = FLAMMABLE
var/sign_path = /obj/structure/sign/basic //the type of sign that will be created when placed on a turf
/obj/item/sign_backing/afterattack(atom/target, mob/user, proximity)
if(isturf(target) && proximity)
var/turf/T = target
user.visible_message("<span class='notice'>[user] fastens [src] to [T].</span>", \
"<span class='notice'>You attach the sign to [T].</span>")
playsound(T, 'sound/items/deconstruct.ogg', 50, 1)
new sign_path(T)
qdel(src)
else
return ..()
/obj/structure/sign/map
name = "station map"
desc = "A framed picture of the station."
max_integrity = 500
/obj/structure/sign/map/left
icon_state = "map-left"
/obj/structure/sign/map/left/dream
icon_state = "map-left-DS"
desc = "A framed picture of the station.\nClockwise from the top, you see Engineering(<b>yellow</b>), Arrivals(<b>blue and white</b>), Atmospherics(<b>yellow</b>), Security(<b>red</b>), \
Cargo(<b>brown</b>), Science(<b>purple</b>), Escape(<b>red and white</b>), and Medbay(<b>blue</b>).\nIn the center of the station, you see the Bridge(<b>dark blue</b>).\n\
Around those, you see Hallways/Entrances(<b>light grey</b>), Public Areas(<b>grey</b>), and Maintenance(<b>dark grey</b>)."
/obj/structure/sign/map/right
icon_state = "map-right"
/obj/structure/sign/map/right/dream
icon_state = "map-right-DS"
desc = "A framed picture of the station.\nClockwise from the top, you see Engineering(<b>yellow</b>), Arrivals(<b>blue and white</b>), Atmospherics(<b>yellow</b>), Security(<b>red</b>), \
Cargo(<b>brown</b>), Science(<b>purple</b>), Escape(<b>red and white</b>), and Medbay(<b>blue</b>).\nIn the center of the station, you see the Bridge(<b>dark blue</b>).\n\
Around those, you see Hallways/Entrances(<b>light grey</b>), Public Areas(<b>grey</b>), and Maintenance(<b>dark grey</b>)."
/obj/structure/sign/securearea
name = "\improper SECURE AREA"
desc = "A warning sign which reads 'SECURE AREA'."
icon_state = "securearea"
/obj/structure/sign/biohazard
name = "\improper BIOHAZARD"
desc = "A warning sign which reads 'BIOHAZARD'."
icon_state = "bio"
/obj/structure/sign/electricshock
name = "\improper HIGH VOLTAGE"
desc = "A warning sign which reads 'HIGH VOLTAGE'."
icon_state = "shock"
/obj/structure/sign/examroom
name = "\improper EXAM ROOM"
desc = "A guidance sign which reads 'EXAM ROOM'."
icon_state = "examroom"
/obj/structure/sign/vacuum
name = "\improper HARD VACUUM AHEAD"
desc = "A warning sign which reads 'HARD VACUUM AHEAD'."
icon_state = "space"
/obj/structure/sign/deathsposal
name = "\improper DISPOSAL: LEADS TO SPACE"
desc = "A warning sign which reads 'DISPOSAL: LEADS TO SPACE'."
icon_state = "deathsposal"
/obj/structure/sign/pods
name = "\improper ESCAPE PODS"
desc = "A warning sign which reads 'ESCAPE PODS'."
icon_state = "pods"
/obj/structure/sign/fire
name = "\improper DANGER: FIRE"
desc = "A warning sign which reads 'DANGER: FIRE'."
icon_state = "fire"
/obj/structure/sign/nosmoking_1
name = "\improper NO SMOKING"
desc = "A warning sign which reads 'NO SMOKING'."
icon_state = "nosmoking"
/obj/structure/sign/nosmoking_2
name = "\improper NO SMOKING"
desc = "A warning sign which reads 'NO SMOKING'."
icon_state = "nosmoking2"
/obj/structure/sign/radiation
name = "HAZARDOUS RADIATION"
desc = "A warning sign alerting the user of potential radiation hazards."
icon_state = "radiation"
/obj/structure/sign/bluecross
name = "medbay"
desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
icon_state = "bluecross"
/obj/structure/sign/bluecross_2
name = "medbay"
desc = "The Intergalactic symbol of Medical institutions. You'll probably get help here."
icon_state = "bluecross2"
/obj/structure/sign/goldenplaque
name = "The Most Robust Men Award for Robustness"
desc = "To be Robust is not an action or a way of life, but a mental state. Only those with the force of Will strong enough to act during a crisis, saving friend from foe, are truly Robust. Stay Robust my friends."
icon_state = "goldenplaque"
/obj/structure/sign/goldenplaque/captain
name = "The Most Robust Captain Award for Robustness"
/obj/structure/sign/kiddieplaque
name = "AI developers plaque"
desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child appears to be retarded. Beneath the image, someone has scratched the word \"PACKETS\"."
icon_state = "kiddieplaque"
/obj/structure/sign/kiddieplaque/badger
name = "Remembrance Plaque"
desc = "A plaque commemorating the fallen, may they rest in peace, forever asleep amongst the stars. Someone has drawn a picture of a crying badger at the bottom."
/obj/structure/sign/kiddieplaque/library
name = "Library Rules Sign"
desc = "A long list of rules to be followed when in the library, extolling the virtues of being quiet at all times and threatening those who would dare eat hot food inside."
/obj/structure/sign/kiddieplaque/perfect_man
name = "\improper 'Perfect Man' sign"
desc = "A guide to the exhibit, explaining how recent developments in mindshield implant and cloning technologies by Nanotrasen Corporation have led to the development and the effective immortality of the 'perfect man', the loyal Nanotrasen Employee."
/obj/structure/sign/kiddieplaque/perfect_drone
name = "\improper 'Perfect Drone' sign"
desc = "A guide to the drone shell dispenser, detailing the constructive and destructive applications of modern repair drones, as well as the development of the incorruptible cyborg servants of tomorrow, available today."
/obj/structure/sign/atmosplaque
name = "\improper FEA Atmospherics Division plaque"
desc = "This plaque commemorates the fall of the Atmos FEA division. For all the charred, dizzy, and brittle men who have died in its hands."
icon_state = "atmosplaque"
/obj/structure/sign/atmosplaque/thunderdome
name = "Thunderdome Plaque"
desc = "This plaque commemorates those who have fallen in glorious combat. For all the charred, dizzy, and beaten men who have died in its hands."
/obj/structure/sign/nanotrasen
name = "\improper Nanotrasen Logo"
desc = "A sign with the Nanotrasen Logo on it. Glory to Nanotrasen!"
icon_state = "nanotrasen"
/obj/structure/sign/science //These 3 have multiple types, just var-edit the icon_state to whatever one you want on the map
name = "\improper SCIENCE"
desc = "A sign labelling an area where research and science is performed."
icon_state = "science1"
/obj/structure/sign/chemistry
name = "\improper CHEMISTRY"
desc = "A sign labelling an area containing chemical equipment."
icon_state = "chemistry1"
/obj/structure/sign/botany
name = "\improper HYDROPONICS"
desc = "A sign labelling an area as a place where plants are grown."
icon_state = "hydro1"
/obj/structure/sign/xenobio
name = "\improper XENOBIOLOGY"
desc = "A sign labelling an area as a place where xenobiological entities are researched."
icon_state = "xenobio"
/obj/structure/sign/evac
name = "\improper EVACUATION"
desc = "A sign labelling an area where evacuation procedures take place."
icon_state = "evac"
/obj/structure/sign/custodian
name = "\improper CUSTODIAN"
desc = "A sign labelling an area where the custodian works."
icon_state = "custodian"
/obj/structure/sign/engineering
name = "\improper ENGINEERING"
desc = "A sign labelling an area where engineers work."
icon_state = "engine"
/obj/structure/sign/cargo
name = "\improper CARGO"
desc = "A sign labelling an area where cargo ships dock."
icon_state = "cargo"
/obj/structure/sign/security
name = "\improper SECURITY"
desc = "A sign labelling an area where the law is law."
icon_state = "security"
/obj/structure/sign/holy
name = "\improper HOLY"
desc = "A sign labelling a religious area."
icon_state = "holy"
/obj/structure/sign/restroom
name = "\improper RESTROOM"
desc = "A sign labelling a restroom."
icon_state = "restroom"
/obj/structure/sign/xeno_warning_mining
name = "DANGEROUS ALIEN LIFE"
desc = "A sign that warns would-be travellers of hostile alien life in the vicinity."
icon = 'icons/obj/mining.dmi'
icon_state = "xeno_warning"
/obj/structure/sign/enginesafety
name = "\improper ENGINEERING SAFETY"
desc = "A sign detailing the various safety protocols when working on-site to ensure a safe shift."
icon_state = "safety"
/obj/structure/sign/directions/science
name = "science department"
desc = "A direction sign, pointing out which way the Science department is."
icon_state = "direction_sci"
/obj/structure/sign/directions/engineering
name = "engineering department"
desc = "A direction sign, pointing out which way the Engineering department is."
icon_state = "direction_eng"
/obj/structure/sign/directions/security
name = "security department"
desc = "A direction sign, pointing out which way the Security department is."
icon_state = "direction_sec"
/obj/structure/sign/directions/medical
name = "medical bay"
desc = "A direction sign, pointing out which way the Medical Bay is."
icon_state = "direction_med"
/obj/structure/sign/directions/evac
name = "escape arm"
desc = "A direction sign, pointing out which way the escape shuttle dock is."
icon_state = "direction_evac"
/obj/structure/sign/directions/supply
name = "cargo bay"
desc = "A direction sign, pointing out which way the Cargo Bay is."
icon_state = "direction_supply"
/obj/structure/sign/directions/command
name = "command department"
desc = "A direction sign, pointing out which way the Command department is."
icon_state = "direction_bridge"
/obj/structure/sign/logo
name = "nanotrasen logo"
desc = "The Nanotrasen corporate logo."
icon_state = "nanotrasen_sign1"
-11
View File
@@ -1,11 +0,0 @@
/obj/item/weapon
name = "weapon"
icon = 'icons/obj/items_and_weapons.dmi'
/obj/item/Initialize()
. = ..()
if(!hitsound)
if(damtype == "fire")
hitsound = 'sound/items/welder.ogg'
if(damtype == "brute")
hitsound = "swing_hit"
@@ -109,14 +109,17 @@
/turf/open/floor/engine/cult
name = "engraved floor"
desc = "The air hangs heavy over this sinister flooring."
icon_state = "plating"
var/obj/effect/clockwork/overlay/floor/bloodcult/realappearence
CanAtmosPass = ATMOS_PASS_NO
var/obj/effect/clockwork/overlay/floor/bloodcult/realappearance
/turf/open/floor/engine/cult/Initialize()
. = ..()
new /obj/effect/temp_visual/cult/turf/floor(src)
realappearence = new /obj/effect/clockwork/overlay/floor/bloodcult(src)
realappearence.linked = src
realappearance = new /obj/effect/clockwork/overlay/floor/bloodcult(src)
realappearance.linked = src
/turf/open/floor/engine/cult/Destroy()
be_removed()
@@ -128,8 +131,8 @@
return ..()
/turf/open/floor/engine/cult/proc/be_removed()
qdel(realappearence)
realappearence = null
qdel(realappearance)
realappearance = null
/turf/open/floor/engine/cult/ratvar_act()
. = ..()
+11 -7
View File
@@ -7,11 +7,15 @@
/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/open/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y)
var/list/river_nodes = list()
var/num_spawned = 0
while(num_spawned < nodes)
var/turf/F = locate(rand(min_x, max_x), rand(min_y, max_y), target_z)
river_nodes += new /obj/effect/landmark/river_waypoint(F)
num_spawned++
var/list/possible_locs = block(locate(min_x, min_y, target_z), locate(max_x, max_y, target_z))
while(num_spawned < nodes && possible_locs.len)
var/turf/T = pick(possible_locs)
var/area/A = get_area(T)
if(!istype(A, whitelist_area) || (T.flags_1 & NO_LAVA_GEN_1))
possible_locs -= T
else
river_nodes += new /obj/effect/landmark/river_waypoint(T)
num_spawned++
//make some randomly pathing rivers
for(var/A in river_nodes)
@@ -43,7 +47,7 @@
cur_turf = get_step(cur_turf, cur_dir)
var/area/new_area = get_area(cur_turf)
if(!istype(new_area, whitelist_area)) //Rivers will skip ruins
if(!istype(new_area, whitelist_area) || (cur_turf.flags_1 & NO_LAVA_GEN_1)) //Rivers will skip ruins
detouring = 0
cur_dir = get_dir(cur_turf, target_turf)
cur_turf = get_step(cur_turf, cur_dir)
@@ -71,7 +75,7 @@
for(var/F in RANGE_TURFS(1, src) - src)
var/turf/T = F
var/area/new_area = get_area(T)
if(!T || (T.density && !ismineralturf(T)) || istype(T, /turf/open/indestructible) || (whitelisted_area && !istype(new_area, whitelisted_area)))
if(!T || (T.density && !ismineralturf(T)) || istype(T, /turf/open/indestructible) || (whitelisted_area && !istype(new_area, whitelisted_area)) || (T.flags_1 & NO_LAVA_GEN_1) )
continue
if(!logged_turf_type && ismineralturf(T))
+9 -8
View File
@@ -57,23 +57,24 @@
girder_type = /obj/structure/destructible/clockwork/wall_gear
baseturfs = /turf/open/floor/clockwork/reebe
var/heated
var/obj/effect/clockwork/overlay/wall/realappearence
var/obj/effect/clockwork/overlay/wall/realappearance
/turf/closed/wall/clockwork/Initialize()
. = ..()
new /obj/effect/temp_visual/ratvar/wall(src)
new /obj/effect/temp_visual/ratvar/beam(src)
realappearence = new /obj/effect/clockwork/overlay/wall(src)
realappearence.linked = src
realappearance = new /obj/effect/clockwork/overlay/wall(src)
realappearance.linked = src
/turf/closed/wall/clockwork/Destroy()
if(realappearence)
qdel(realappearence)
realappearence = null
if(realappearance)
qdel(realappearance)
realappearance = null
if(heated)
var/mob/camera/eminence/E = get_eminence()
if(E)
E.superheated_walls--
return ..()
/turf/closed/wall/clockwork/ReplaceWithLattice()
@@ -136,14 +137,14 @@
heated = TRUE
hardness = -100 //Lower numbers are tougher, so this makes the wall essentially impervious to smashing
slicing_duration = 150
animate(realappearence, color = "#FFC3C3", time = 5)
animate(realappearance, color = "#FFC3C3", time = 5)
else
name = initial(name)
visible_message("<span class='notice'>[src] cools down.</span>")
heated = FALSE
hardness = initial(hardness)
slicing_duration = initial(slicing_duration)
animate(realappearence, color = initial(realappearence.color), time = 25)
animate(realappearance, color = initial(realappearance.color), time = 25)
/turf/closed/wall/vault