From fb5de2978452f0a1e860085ccd2706ca917ec6a2 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Wed, 31 Jan 2018 06:39:18 -0600 Subject: [PATCH] cleanup of game folder, other fixes --- code/__DEFINES/clockcult.dm | 5 +- code/__DEFINES/cult.dm | 5 + code/__DEFINES/flags.dm | 3 +- code/__DEFINES/layers.dm | 2 +- code/__DEFINES/traits.dm | 5 +- code/__HELPERS/areas.dm | 5 +- code/_onclick/hud/alert.dm | 8 +- code/_onclick/hud/screen_objects.dm | 8 +- code/controllers/subsystem/communications.dm | 2 +- code/controllers/subsystem/dbcore.dm | 24 +- code/datums/action.dm | 27 + code/datums/diseases/advance/advance.dm | 3 + code/datums/looping_sounds/item_sounds.dm | 12 +- code/datums/mutations/hulk.dm | 2 +- code/datums/position_point_vector.dm | 32 +- code/datums/ruins/space.dm | 8 +- code/datums/saymode.dm | 17 +- code/datums/status_effects/debuffs.dm | 4 + code/datums/wires/wires.dm | 22 +- code/game/area/areas/derelict.dm | 128 --- code/game/machinery/buttons.dm | 4 +- code/game/machinery/cloning.dm | 4 +- code/game/machinery/computer/arcade.dm | 3 +- .../game/machinery/computer/buildandrepair.dm | 2 +- code/game/machinery/computer/message.dm | 468 ----------- code/game/machinery/defibrillator_mount.dm | 148 ++++ code/game/machinery/deployable.dm | 4 +- code/game/machinery/doors/airlock.dm | 23 +- code/game/machinery/doors/airlock_types.dm | 11 + code/game/machinery/doors/alarmlock.dm | 4 +- code/game/machinery/doors/brigdoors.dm | 4 +- code/game/machinery/doors/door.dm | 4 +- code/game/machinery/doors/passworddoor.dm | 72 ++ code/game/machinery/doors/shutters.dm | 6 +- code/game/machinery/doors/windowdoor.dm | 8 +- code/game/machinery/firealarm.dm | 4 +- .../machinery/porta_turret/portable_turret.dm | 11 + code/game/machinery/requests_console.dm | 3 + code/game/machinery/shieldgen.dm | 2 + code/game/machinery/syndicatebomb.dm | 4 +- .../machinery/telecomms/computers/message.dm | 190 +++-- .../telecomms/machines/message_server.dm | 11 +- .../machinery/telecomms/telecomunications.dm | 1 - code/game/mecha/combat/gygax.dm | 5 +- code/game/mecha/combat/marauder.dm | 12 +- code/game/mecha/combat/reticence.dm | 5 +- .../mecha/equipment/tools/medical_tools.dm | 13 +- .../mecha/equipment/tools/mining_tools.dm | 4 +- .../game/mecha/equipment/tools/other_tools.dm | 4 +- code/game/mecha/equipment/tools/work_tools.dm | 13 +- code/game/mecha/mecha_control_console.dm | 2 +- code/game/mecha/mecha_parts.dm | 28 +- code/game/mecha/mecha_wreckage.dm | 46 +- code/game/mecha/medical/medical.dm | 4 +- code/game/mecha/working/ripley.dm | 5 +- code/game/mecha/working/working.dm | 4 +- code/game/objects/effects/decals/cleanable.dm | 3 +- .../effects/effect_system/effects_foam.dm | 18 +- .../effects/effect_system/effects_smoke.dm | 2 +- code/game/objects/effects/forcefields.dm | 13 +- .../game/objects/effects/spawners/lootdrop.dm | 6 +- .../objects/effects/temporary_visuals/cult.dm | 5 + .../temporary_visuals/projectile_beam.dm | 70 -- .../temporary_visuals/projectiles/impact.dm | 35 + .../temporary_visuals/projectiles/muzzle.dm | 27 + .../projectiles/projectile_effects.dm | 56 ++ .../temporary_visuals/projectiles/tracer.dm | 51 ++ code/game/objects/items/defib.dm | 3 + .../objects/items/devices/machineprototype.dm | 6 - code/game/objects/items/devices/pinpointer.dm | 152 ---- .../items/devices/reverse_bear_trap.dm | 131 +++ code/game/objects/items/devices/scanners.dm | 5 +- .../objects/items/implants/implant_gang.dm | 54 -- .../items/stacks/sheets/sheet_types.dm | 8 +- code/game/objects/items/tools.dm | 789 ------------------ code/game/objects/items/weaponry.dm | 23 + code/game/objects/radiation.dm | 60 -- .../crates_lockers/closets/job_closets.dm | 1 - .../crates_lockers/closets/secure/medical.dm | 1 + code/game/objects/structures/girders.dm | 2 +- code/game/objects/structures/morgue.dm | 30 +- code/game/objects/structures/signs.dm | 352 -------- code/game/objects/weapons.dm | 11 - .../game/turfs/simulated/floor/reinf_floor.dm | 13 +- code/game/turfs/simulated/river.dm | 18 +- code/game/turfs/simulated/wall/misc_walls.dm | 17 +- .../objects/structures/beds_chairs/sofa.dm | 0 87 files changed, 1030 insertions(+), 2390 deletions(-) delete mode 100644 code/game/area/areas/derelict.dm delete mode 100644 code/game/machinery/computer/message.dm create mode 100644 code/game/machinery/defibrillator_mount.dm create mode 100644 code/game/machinery/doors/passworddoor.dm delete mode 100644 code/game/objects/effects/temporary_visuals/projectile_beam.dm create mode 100644 code/game/objects/effects/temporary_visuals/projectiles/impact.dm create mode 100644 code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm create mode 100644 code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm create mode 100644 code/game/objects/effects/temporary_visuals/projectiles/tracer.dm delete mode 100644 code/game/objects/items/devices/machineprototype.dm delete mode 100644 code/game/objects/items/devices/pinpointer.dm create mode 100644 code/game/objects/items/devices/reverse_bear_trap.dm delete mode 100644 code/game/objects/items/implants/implant_gang.dm delete mode 100644 code/game/objects/items/tools.dm delete mode 100644 code/game/objects/radiation.dm delete mode 100644 code/game/objects/structures/signs.dm delete mode 100644 code/game/objects/weapons.dm rename {code => modular_citadel/code}/game/objects/structures/beds_chairs/sofa.dm (100%) diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index cc501b5289..9f23ba2d38 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -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 diff --git a/code/__DEFINES/cult.dm b/code/__DEFINES/cult.dm index 71d4ad3af9..73ec1bc8d7 100644 --- a/code/__DEFINES/cult.dm +++ b/code/__DEFINES/cult.dm @@ -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 \ No newline at end of file diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index cb8a2ad2ca..d2c88a0c1b 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -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. /* diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index a3e2222f2e..80d5730386 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -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 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 3f9416ab96..b180a32674 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -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" \ No newline at end of file +#define TRAIT_HULK "hulk" diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 3a35646321..3e097c46f3 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -42,12 +42,13 @@ if(turfs.len > BP_MAX_ROOM_SIZE) to_chat(creator, "The room you're in is too big. It is [((turfs.len / BP_MAX_ROOM_SIZE)-1)*100]% larger than allowed.") 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] diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 97d6549048..4379398a7d 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -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 += "[time_info / 60] minutes [time_name].
" - textlist += "[DisplayPower(get_clockwork_power())] power available for use." + textlist += "[DisplayPower(get_clockwork_power())] / [DisplayPower(MAX_CLOCKWORK_POWER)] power available for use." desc = textlist.Join() ..() diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 1bfb801730..b7b57b669b 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -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 diff --git a/code/controllers/subsystem/communications.dm b/code/controllers/subsystem/communications.dm index fcf7dba607..d4838a21c3 100644 --- a/code/controllers/subsystem/communications.dm +++ b/code/controllers/subsystem/communications.dm @@ -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.") diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 5949b4b650..5555525262 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -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") diff --git a/code/datums/action.dm b/code/datums/action.dm index 7c8feeed55..15f62b20b7 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -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, "Your hands are full!") //Preset for spells diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index c3970baee0..d2ded9f907 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -73,6 +73,9 @@ // Randomly pick a symptom to activate. /datum/disease/advance/stage_act() ..() + if(carrier) + return + if(symptoms && symptoms.len) if(!processing) diff --git a/code/datums/looping_sounds/item_sounds.dm b/code/datums/looping_sounds/item_sounds.dm index 2eb897bc13..b418d20985 100644 --- a/code/datums/looping_sounds/item_sounds.dm +++ b/code/datums/looping_sounds/item_sounds.dm @@ -34,4 +34,14 @@ #undef RAD_GEIGER_LOW #undef RAD_GEIGER_MEDIUM -#undef RAD_GEIGER_HIGH \ No newline at end of file +#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 diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index 0debfdb6a0..8397c3b064 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -5,7 +5,7 @@ get_chance = 15 lowest_value = 256 * 12 text_gain_indication = "Your muscles hurt!" - 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) diff --git a/code/datums/position_point_vector.dm b/code/datums/position_point_vector.dm index 6fae092c9d..20ec95a516 100644 --- a/code/datums/position_point_vector.dm +++ b/code/datums/position_point_vector.dm @@ -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) diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index 793bc188a3..bcfb67db0b 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -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." \ No newline at end of file + 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." diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index 176c762e9c..93f733439c 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -18,23 +18,30 @@ switch(user.lingcheck()) if(LINGHIVE_LINK) var/msg = "[user.mind]: [message]" - 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, "We can faintly sense an outsider trying to communicate through the hivemind...") if(LINGHIVE_LING) + if (user.has_trait(CHANGELING_HIVEMIND_MUTE)) + to_chat(user, "The poison in the air hinders our ability to interact with the hivemind.") + return FALSE var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) var/msg = "[changeling.changelingID]: [message]" 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, "We can faintly sense another of our kind trying to communicate through the hivemind...") diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 22868f855f..600b8d9679 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -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 diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 19f7157faa..fd9c60c013 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -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) ))) diff --git a/code/game/area/areas/derelict.dm b/code/game/area/areas/derelict.dm deleted file mode 100644 index 5882fa0a8c..0000000000 --- a/code/game/area/areas/derelict.dm +++ /dev/null @@ -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') \ No newline at end of file diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 997d16836d..b98976d83c 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -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) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index b216d1752f..c8106e154f 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -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") diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 27a5a8ebd5..674ecfd565 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -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 diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 41f093a6d2..1cf95877dd 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -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, "You place [P] inside the frame.") diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm deleted file mode 100644 index a3ec6ba6ec..0000000000 --- a/code/game/machinery/computer/message.dm +++ /dev/null @@ -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 = "ALERT: No server detected." - var/incorrectkey = "ALERT: Incorrect decryption key!" - var/defaultmsg = "Welcome. Please select an option." - var/rebootmsg = "%$&(�: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!" - //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 = "System bootup complete. Please select an option." // 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, "It is too hot to mess with!") - 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 += "

�%@%(*$%&(�&?*(%&�/{}" - var/time = 100 * length(src.linkedServer.decryptkey) - addtimer(CALLBACK(src, .proc/UnmagConsole), time) - message = rebootmsg - else - to_chat(user, "A no server error appears on the screen.") - -/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 = "
/
" - - if(auth) - dat += "

\[Authenticated\] /" - dat += " Server Power: [src.linkedServer && src.linkedServer.active ? "\[On\]":"\[Off\]"]

" - else - dat += "

\[Unauthenticated\] /" - dat += " Server Power: [src.linkedServer && src.linkedServer.active ? "\[On\]":"\[Off\]"]

" - - 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) - // = TAB - var/i = 0 - dat += "
[++i]. Link To A Server
" - if(auth) - if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN))) - dat += "
ERROR: Server not found!
" - else - dat += "
[++i]. View Message Logs
" - dat += "
[++i]. View Request Console Logs
" - dat += "
[++i]. Clear Message Logs
" - dat += "
[++i]. Clear Request Console Logs
" - dat += "
[++i]. Set Custom Key
" - dat += "
[++i]. Send Admin Message
" - else - for(var/n = ++i; n <= optioncount; n++) - dat += "
[n]. ---------------
" - if(issilicon(usr) && is_special_character(usr)) - //Malf/Traitor AIs can bruteforce into the system to gain the Key. - dat += "
*&@#. Bruteforce Key
" - else - dat += "
" - - //Bottom message - if(!auth) - dat += "

Please authenticate with the server in order to show additional options." - else - dat += "

Reg, #514 forbids sending messages to a Head of Staff containing Erotic Rendering Properties." - - //Message Logs - if(1) - var/index = 0 - dat += "
Back - Refresh

" - dat += "" - 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 += "" - dat += "
XSenderRecipientMessage
X
[pda.sender][pda.recipient][pda.message][pda.photo ? "(Photo)":""]
" - //Hacking screen. - if(2) - if(isAI(user) || iscyborg(user)) - dat += "Brute-forcing for server key.
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
- 10110011001101111011100100110001101101001011011100110011
- 10010000001100110011011110111001000100000011100110110010
- 10111001001110110011001010111001000100000011010110110010
- 10111100100101110001000000100100101110100001000000111011
- 10110100101101100011011000010000001110100011000010110101
- 10110010100100000001100100011000000100000011100110110010
- 10110001101101111011011100110010001110011001000000110011
- 00110111101110010001000000110010101110110011001010111001
- 00111100100100000011000110110100001100001011100100110000
- 10110001101110100011001010111001000100000011101000110100
- 00110000101110100001000000111010001101000011001010010000
- 00111000001100001011100110111001101110111011011110111001
- 00110010000100000011010000110000101110011001011100010000
- 00100100101101110001000000111010001101000011001010010000
- 00110110101100101011000010110111001110100011010010110110
- 10110010100101100001000000111010001101000011010010111001
- 10010000001100011011011110110111001110011011011110110110
- 00110010100100000011000110110000101101110001000000111001
- 00110010101110110011001010110000101101100001000000111100
- 10110111101110101011100100010000001110100011100100111010
- 10110010100100000011010010110111001110100011001010110111
- 00111010001101001011011110110111001110011001000000110100
- 10110011000100000011110010110111101110101001000000110110
- 00110010101110100001000000111001101101111011011010110010
- 10110111101101110011001010010000001100001011000110110001
- 10110010101110011011100110010000001101001011101000010111
- 00010000001001101011000010110101101100101001000000111001
- 10111010101110010011001010010000001101110011011110010000
- 00110100001110101011011010110000101101110011100110010000
- 00110010101101110011101000110010101110010001000000111010
- 00110100001100101001000000111001001101111011011110110110
- 10010000001100100011101010111001001101001011011100110011
- 10010000001110100011010000110000101110100001000000111010
- 001101001011011010110010100101110"} - - //Fake messages - if(3) - dat += "
Back - Reset

" - - dat += {" - - - - "} - //Sender - Sender's Job - Recepient - Message - //Al Green- Your Dad - Your Mom - WHAT UP!? - - dat += {" - - - "} - dat += "
SenderSender's JobRecipientMessage
[customsender][customjob][customrecepient ? customrecepient.owner : "NONE"][custommessage]

Send" - - //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 += "
Back - Refresh

" - dat += {" - "} - 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 += {" - "} - dat += "
XSending Dep.Receiving Dep.MessageStampID Auth.Priority.
X
[rc.send_dpt][rc.rec_dpt][rc.message][rc.stamp][rc.id_auth][rc.priority]
" - - 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, "Could not complete brute-force: Linked Server Disconnected!") - else - var/currentKey = src.linkedServer.decryptkey - to_chat(user, "Brute-force completed! The key is '[currentKey]'.") - 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 = "NOTICE: Server selected." - else if(GLOB.message_servers && GLOB.message_servers.len > 0) - linkedServer = GLOB.message_servers[1] - message = "NOTICE: Only Single Server Detected - Server selected." - 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 = "NOTICE: Logs cleared." - //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 = "NOTICE: Logs cleared." - //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 = "NOTICE: Decryption key too short!" - else if(length(newkey) > 16) - message = "NOTICE: Decryption key too long!" - else if(newkey && newkey != "") - src.linkedServer.decryptkey = newkey - message = "NOTICE: Decryption key set." - 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 = "NOTICE: Log Deleted!" - //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 = "NOTICE: Log Deleted!" - //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 = "NOTICE: No recepient selected!" - return src.attack_hand(usr) - - if(isnull(custommessage) || custommessage == "") - message = "NOTICE: No message entered!" - 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 += "← From
[customsender] ([customjob]):
[custommessage]
" - 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))] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)") - 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 += "← From [PDARec.owner] ([customjob]):
[custommessage]
" - 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)] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)") - 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 = "

Daily Key Reset


The new message monitor key is '[server.decryptkey]'.
Please keep this a secret and away from the clown.
If necessary, change the password to a more secure one." - info_links = info - add_overlay("paper_words") - break diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm new file mode 100644 index 0000000000..c0a993f8e5 --- /dev/null +++ b/code/game/machinery/defibrillator_mount.dm @@ -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, "There is a defib unit hooked up. Alt-click to remove it.") + if(GLOB.security_level >= SEC_LEVEL_RED) + to_chat(user, "Due to a security situation, its locking clamps can be toggled by swiping any ID.") + else + to_chat(user, "Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access.") + +/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, "[defib]'s paddles overextend and come out of your hands!") + 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, "There's no defibrillator unit loaded!") + return + if(defib.on) + to_chat(user, "[defib.paddles.loc == user ? "You are already" : "Someone else is"] holding [defib]'s paddles!") + 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, "There's already a defibrillator in [src]!") + return + if(I.flags_1 & NODROP_1 || !user.transferItemToLoc(I, src)) + to_chat(user, "[I] is stuck to your hand!") + return + user.visible_message("[user] hooks up [I] to [src]!", \ + "You press [I] into the mount, and it clicks into place.") + 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, "You can't engage the clamps on a defibrillator that isn't there.") + return + clamps_locked = !clamps_locked + to_chat(user, "Clamps [clamps_locked ? "" : "dis"]engaged.") + update_icon() + else + to_chat(user, "Insufficient access.") + return + ..() + +/obj/machinery/defibrillator_mount/multitool_act(mob/living/user, obj/item/multitool) + if(!defib) + to_chat(user, "There isn't any defibrillator to clamp in!") + return TRUE + if(!clamps_locked) + to_chat(user, "[src]'s clamps are disengaged!") + return TRUE + user.visible_message("[user] presses [multitool] into [src]'s ID slot...", \ + "You begin overriding the clamps on [src]...") + playsound(src, 'sound/machines/click.ogg', 50, TRUE) + if(!do_after(user, 100, target = src) || !clamps_locked) + return + user.visible_message("[user] pulses [multitool], and [src]'s clamps slide up.", \ + "You override the locking clamps on [src]!") + 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, "It'd be hard to remove a defib unit from a mount that has none.") + return + if(clamps_locked) + to_chat(user, "You try to tug out [defib], but the mount's clamps are locked tight!") + return + if(!user.put_in_hands(defib)) + to_chat(user, "You need a free hand!") + return + user.visible_message("[user] unhooks [defib] from [src].", \ + "You slide out [defib] from [src] and unhook the charging cables.") + 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 diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index b9a2a68b34..a25e1edb21 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -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() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 0d19fff8f4..325adb30b7 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -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 diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index c0ebce67b0..2874e6bf1b 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -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" diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm index a75d47b345..cf46e6b0fd 100644 --- a/code/game/machinery/doors/alarmlock.dm +++ b/code/game/machinery/doors/alarmlock.dm @@ -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() diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index bf3baf8b6f..3f0d28705a 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -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 diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 9182057d85..25ff6c0ce1 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -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 diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm new file mode 100644 index 0000000000..7f4137d165 --- /dev/null +++ b/code/game/machinery/doors/passworddoor.dm @@ -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 \ No newline at end of file diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 77267a49a4..5f9bb39dae 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -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) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 29f05acc2b..1969b1cb16 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -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) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 0af43df223..583a229937 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -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) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 008aa71365..26b156c8f4 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -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 diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index c65b9a321a..3e870bb46c 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -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) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index b98500a495..dde4bb180c 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -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." diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 8e5391010a..6b86c48071 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -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 diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index 6336222493..d40c38c49c 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -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 = "%$&(�: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!" //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 = "System bootup complete. Please select an option." // 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 += "

�%@%(*$%&(�&?*(%&�/{}" @@ -56,6 +58,10 @@ else to_chat(user, "A no server error appears on the screen.") +/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 = "
/
" + var/dat = "
" if(auth) dat += "

\[Authenticated\] /" - dat += " Server Power: [src.linkedServer && src.linkedServer.toggled ? "\[On\]":"\[Off\]"]

" + dat += " Server Power: [linkedServer && linkedServer.toggled ? "\[On\]":"\[Off\]"]" else dat += "

\[Unauthenticated\] /" - dat += " Server Power: [src.linkedServer && src.linkedServer.toggled ? "\[On\]":"\[Off\]"]

" + dat += " Server Power: [linkedServer && linkedServer.toggled ? "\[On\]":"\[Off\]"]" 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 += "
[++i]. Link To A Server
" if(auth) - if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN))) + if(LINKED_SERVER_NONRESPONSIVE) dat += "
ERROR: Server not found!
" else - dat += "
[++i]. View Message Logs
" - dat += "
[++i]. View Request Console Logs
" - dat += "
[++i]. Clear Message Logs
" - dat += "
[++i]. Clear Request Console Logs
" + dat += "
[++i]. View Message Logs
" + dat += "
[++i]. View Request Console Logs
" + dat += "
[++i]. Clear Message Logs
" + dat += "
[++i]. Clear Request Console Logs
" dat += "
[++i]. Set Custom Key
" dat += "
[++i]. Send Admin Message
" else @@ -125,13 +135,13 @@ var/index = 0 dat += "
Back - Refresh

" dat += "" - 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 += "" + dat += "" dat += "
XSenderRecipientMessage
X
[pda.sender][pda.recipient][pda.message][pda.photo ? " (Photo)":""]
X
[pda.sender][pda.recipient][pda.message][pda.photo ? " (Photo)":""]
" //Hacking screen. if(2) @@ -210,20 +220,20 @@ dat += "
Back - Refresh

" dat += {""} - 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 += {" + dat += {""} dat += "
XSending Dep.Receiving Dep. MessageStampID Auth.Priority.
X
[rc.send_dpt]
X
[rc.send_dpt] [rc.rec_dpt][rc.message][rc.stamp][rc.id_auth][rc.priority]
" 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, "Could not complete brute-force: Linked Server Disconnected!") else - var/currentKey = src.linkedServer.decryptkey + var/currentKey = linkedServer.decryptkey to_chat(user, "Brute-force completed! The key is '[currentKey]'.") - 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 = "NOTICE: Logs cleared." + else if(auth) + linkedServer.pda_msgs = list() + message = "NOTICE: Logs cleared." //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 = "NOTICE: Logs cleared." + else if(auth) + linkedServer.rc_msgs = list() + message = "NOTICE: Logs cleared." //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 = "NOTICE: Decryption key too short!" - else if(length(newkey) > 16) - message = "NOTICE: Decryption key too long!" - else if(newkey && newkey != "") - src.linkedServer.decryptkey = newkey - message = "NOTICE: Decryption key set." - 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 = "NOTICE: Decryption key too short!" + else if(length(newkey) > 16) + message = "NOTICE: Decryption key too long!" + else if(newkey && newkey != "") + linkedServer.decryptkey = newkey + message = "NOTICE: Decryption key set." + 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 = "NOTICE: Log Deleted!" //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 = "NOTICE: Log Deleted!" //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 = "NOTICE: No recepient selected!" - return src.attack_hand(usr) + return attack_hand(usr) if(isnull(custommessage) || custommessage == "") message = "NOTICE: No message entered!" - 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" diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 37c891e542..8f0e22b7d9 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -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 diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index b68d348539..a9eb5e3d46 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -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 ..() diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 56e3ccc6c3..b46bc2abf2 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -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) diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 7be8fb6246..b82af2632e 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -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) diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm index 14891835c5..18b50d3077 100644 --- a/code/game/mecha/combat/reticence.dm +++ b/code/game/mecha/combat/reticence.dm @@ -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 diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 97e743b30e..90c598cccc 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -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) diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 0984621dc3..6017515a63 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -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() diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index b82a46b7e0..980b7170c1 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -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() diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index a52c8d1438..ac8304be39 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -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(..()) diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index bb495675b1..c949a8e157 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -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) diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 3455d19877..d62926e3d0 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -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 diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index de8f8ecb3a..21323855eb 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -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, diff --git a/code/game/mecha/medical/medical.dm b/code/game/mecha/medical/medical.dm index ae9983f47b..e86b5174cc 100644 --- a/code/game/mecha/medical/medical.dm +++ b/code/game/mecha/medical/medical.dm @@ -1,5 +1,5 @@ -/obj/mecha/medical/New() - ..() +/obj/mecha/medical/Initialize() + . = ..() trackers += new /obj/item/mecha_parts/mecha_tracking(src) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index a7115abd1d..714e24696a 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -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." diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm index 89d54d50ce..498ccd94fa 100644 --- a/code/game/mecha/working/working.dm +++ b/code/game/mecha/working/working.dm @@ -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) diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index d6b70604af..e93ff91a70 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -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) diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 21f04e5cdc..f5ea89b72d 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -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 ////////////////////////////////////////////////////////// diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index b0991461ec..4dc985c9a1 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -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 = "" diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index edf7b4f519..add653238e 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -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" diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 11bf6e5b8f..c03f632343 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -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, diff --git a/code/game/objects/effects/temporary_visuals/cult.dm b/code/game/objects/effects/temporary_visuals/cult.dm index a649763435..3a17494871 100644 --- a/code/game/objects/effects/temporary_visuals/cult.dm +++ b/code/game/objects/effects/temporary_visuals/cult.dm @@ -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" diff --git a/code/game/objects/effects/temporary_visuals/projectile_beam.dm b/code/game/objects/effects/temporary_visuals/projectile_beam.dm deleted file mode 100644 index af621e29da..0000000000 --- a/code/game/objects/effects/temporary_visuals/projectile_beam.dm +++ /dev/null @@ -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" diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm new file mode 100644 index 0000000000..ca7d8ae0d7 --- /dev/null +++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm @@ -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" diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm new file mode 100644 index 0000000000..b3c72b293b --- /dev/null +++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm @@ -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" diff --git a/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm b/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm new file mode 100644 index 0000000000..f161667843 --- /dev/null +++ b/code/game/objects/effects/temporary_visuals/projectiles/projectile_effects.dm @@ -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) diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm new file mode 100644 index 0000000000..f89674e282 --- /dev/null +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -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" diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 98836fe870..23840ac217 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -94,6 +94,8 @@ else to_chat(user, "Strap the defibrillator's belt on first!") 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() diff --git a/code/game/objects/items/devices/machineprototype.dm b/code/game/objects/items/devices/machineprototype.dm deleted file mode 100644 index 88d7e8c573..0000000000 --- a/code/game/objects/items/devices/machineprototype.dm +++ /dev/null @@ -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) diff --git a/code/game/objects/items/devices/pinpointer.dm b/code/game/objects/items/devices/pinpointer.dm deleted file mode 100644 index 1d11f312a4..0000000000 --- a/code/game/objects/items/devices/pinpointer.dm +++ /dev/null @@ -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("[user] [active ? "" : "de"]activates their pinpointer.", "You [active ? "" : "de"]activate your pinpointer.") - 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("[user] deactivates their pinpointer.", "You deactivate your pinpointer.") - 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("[user]'s pinpointer fails to detect a signal.", "Your pinpointer fails to detect a signal.") - 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("[user] activates their pinpointer.", "You activate your pinpointer.") - 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() - diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm new file mode 100644 index 0000000000..dbdddb829b --- /dev/null +++ b/code/game/objects/items/devices/reverse_bear_trap.dm @@ -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, "*ding*") + 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("[C] fiddles with and pulls at [src]...", \ + "You [fear_string] try to pull at [src]...", "You hear clicking and ticking.") + if(!do_after(user, 20, target = src)) + struggling = FALSE + return + if(!prob(escape_chance)) + to_chat(user, "It doesn't budge!") + escape_chance++ + else + user.visible_message("The lock on [user]'s [name] pops open!", \ + "You force open the padlock!", "You hear a single, pronounced click!") + 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, "Remove their headgear first!") + return + target.visible_message("[user] starts forcing [src] onto [target]'s head!", \ + "[target] starts forcing [src] onto your head!", "You hear clanking.") + to_chat(user, "You start forcing [src] onto [target]'s head...") + if(!do_after(user, 30, target = target) || target.get_item_by_slot(slot_head)) + return + target.visible_message("[user] forces and locks [src] onto [target]'s head!", \ + "[target] locks [src] onto your head!", "You hear a click, and then a timer ticking down.") + to_chat(user, "You force [src] onto [target]'s head and click the padlock shut.") + 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("[src]'s jaws snap open with an ear-piercing crack!") + playsound(src, 'sound/effects/snap.ogg', 75, TRUE) + else + var/mob/living/carbon/human/jill = loc + jill.visible_message("[src] goes off in [jill]'s mouth, ripping their head apart!", "[src] goes off!") + 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) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index ca1feafe5e..0d54cac1b1 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -425,6 +425,9 @@ GAS ANALYZER to_chat(user, "This device can only scan slimes!") 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]") \ No newline at end of file diff --git a/code/game/objects/items/implants/implant_gang.dm b/code/game/objects/items/implants/implant_gang.dm deleted file mode 100644 index d229631ca0..0000000000 --- a/code/game/objects/items/implants/implant_gang.dm +++ /dev/null @@ -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 = {"Implant Specifications:
- Name: Criminal brainwash implant
- Life: A few seconds after injection.
- Important Notes: Illegal
-
- Implant Details:
- Function: Contains a small pod of nanobots that change the host's brain to be loyal to a certain organization.
- Special Features: This device will also emit a small EMP pulse, destroying any other implants within the host's brain.
- Integrity: 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("[target] seems to resist the implant!", "You feel the influence of your enemies try to invade your mind!") - - 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) - ..() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index ceec7ad469..04a0f1c738 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -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("[user] begins whacking themselves over the head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") 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 diff --git a/code/game/objects/items/tools.dm b/code/game/objects/items/tools.dm deleted file mode 100644 index 81701d8977..0000000000 --- a/code/game/objects/items/tools.dm +++ /dev/null @@ -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("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!") - 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, "You attach the screw driver bit to [src].") - qdel(src) - user.put_in_active_hand(s_drill) - -/obj/item/wrench/power/suicide_act(mob/user) - user.visible_message("[user] is pressing [src] against [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!") - 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("[user] is praying to the medical wrench to take [user.p_their()] soul. It looks like [user.p_theyre()] trying to commit suicide!") - // 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("[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!") - 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("[user] is putting [src] to [user.p_their()] temple. It looks like [user.p_theyre()] trying to commit suicide!") - 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, "You attach the bolt driver bit to [src].") - 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("[user] cuts [C]'s restraints with [src]!") - 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("[user] is cutting at [user.p_their()] arteries with [src]! It looks like [user.p_theyre()] trying to commit suicide!") - 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("[user] is wrapping \the [src] around [user.p_their()] neck. It looks like [user.p_theyre()] trying to rip [user.p_their()] head off!") - 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, "You attach the pry jaws to [src].") - 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("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!") - 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, "[container] has too many chemicals mixed into it. You wouldn't want to put the wrong chemicals into [src].") - return ..() - if(amountNeeded > 0 && container.reagents.has_reagent("welding_fuel")) - container.reagents.trans_id_to(src, "welding_fuel", amountNeeded) - to_chat(user, "You transfer some fuel from [container] to [src].") - 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("[user] starts to fix some of the dents on [H]'s [affecting.name].", "You start fixing some of the dents on [H]'s [affecting.name].") - 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, "You need more welding fuel to complete this task!") - 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, "[src] can't be turned on while unsecured!") - return - welding = !welding - if(welding) - if(get_fuel() >= 1) - to_chat(user, "You switch [src] on.") - 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, "You need more fuel!") - switched_off(user) - else - to_chat(user, "You switch [src] off.") - 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, "Turn it off first!") - return - status = !status - if(status) - to_chat(user, "You resecure [src].") - else - to_chat(user, "[src] can now be attached and modified.") - 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, "You add a rod to a welder, starting to build a flamethrower.") - user.put_in_hands(F) - else - to_chat(user, "You need one rod to start building a flamethrower!") - -/obj/item/weldingtool/ignition_effect(atom/A, mob/user) - if(welding && remove_fuel(1, user)) - . = "[user] casually lights [A] with [src], what a badass." - 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("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!") - 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("[user] is putting [user.p_their()] head in [src], it looks like [user.p_theyre()] trying to commit suicide!") - 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, "You attach the cutting jaws to [src].") - qdel(src) - user.put_in_active_hand(cutjaws) - -#undef WELDER_FUEL_BURN_INTERVAL diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 02bd801acc..e7a0adca85 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -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, "[M] is too close to use [src] on.") + return + M.attack_hand(user) diff --git a/code/game/objects/radiation.dm b/code/game/objects/radiation.dm deleted file mode 100644 index 81f5ef975f..0000000000 --- a/code/game/objects/radiation.dm +++ /dev/null @@ -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) diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 7e206e1c55..a41710ea7d 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -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 diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index dcee41585d..fa9d9e9fd2 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -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 diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 190dab7011..84a6cc1b9e 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -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("[user] strikes [src] with [W]!", "You demolish [src].") var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) R.amount = 1 diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 5bcc446cfa..d15138da1e 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -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 = "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.

Red lights mean there's a plain ol' dead body inside.

Yellow lights mean there's non-body objects inside.
Probably stuff pried off a corpse someone grabbed, or if you're lucky it's stashed booze.

Green lights mean the morgue system detects the body may be able to be cloned.

I don't know how that works, but keep it away from the kitchen and go yell at the geneticists.

- 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() diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm deleted file mode 100644 index ae853b4aed..0000000000 --- a/code/game/objects/structures/signs.dm +++ /dev/null @@ -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("[user] starts removing [src]...", \ - "You start unfastening [src].") - 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("[user] unfastens [src].", \ - "You unfasten [src].") - 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("[user] fastens [src] to [T].", \ - "You attach the sign to [T].") - 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(yellow), Arrivals(blue and white), Atmospherics(yellow), Security(red), \ - Cargo(brown), Science(purple), Escape(red and white), and Medbay(blue).\nIn the center of the station, you see the Bridge(dark blue).\n\ - Around those, you see Hallways/Entrances(light grey), Public Areas(grey), and Maintenance(dark grey)." - -/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(yellow), Arrivals(blue and white), Atmospherics(yellow), Security(red), \ - Cargo(brown), Science(purple), Escape(red and white), and Medbay(blue).\nIn the center of the station, you see the Bridge(dark blue).\n\ - Around those, you see Hallways/Entrances(light grey), Public Areas(grey), and Maintenance(dark grey)." - -/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" diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm deleted file mode 100644 index e4d0a73b5b..0000000000 --- a/code/game/objects/weapons.dm +++ /dev/null @@ -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" diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index f53e62dba7..60382b9052 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -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() . = ..() diff --git a/code/game/turfs/simulated/river.dm b/code/game/turfs/simulated/river.dm index 79846791d3..73640f99e0 100644 --- a/code/game/turfs/simulated/river.dm +++ b/code/game/turfs/simulated/river.dm @@ -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)) diff --git a/code/game/turfs/simulated/wall/misc_walls.dm b/code/game/turfs/simulated/wall/misc_walls.dm index a06f7c9458..73ec2515f4 100644 --- a/code/game/turfs/simulated/wall/misc_walls.dm +++ b/code/game/turfs/simulated/wall/misc_walls.dm @@ -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("[src] cools down.") 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 diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/modular_citadel/code/game/objects/structures/beds_chairs/sofa.dm similarity index 100% rename from code/game/objects/structures/beds_chairs/sofa.dm rename to modular_citadel/code/game/objects/structures/beds_chairs/sofa.dm