diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index 3000776d86..ad4fe2181d 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -72,7 +72,6 @@ What is the naming convention for planes or layers? //#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define #define LIGHTING_LAYER 11 //Layer that lighting used to be on (now it's on a plane) #define HUD_LAYER 20 //Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots) - #define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put #define SCREEN_LAYER 22 //Mob HUD/effects layer #define PLANE_LIGHTING 5 //Where the lighting (and darkness) lives @@ -96,7 +95,8 @@ What is the naming convention for planes or layers? #define PLANE_MESONS 30 //Stuff seen with mesons, like open ceilings. This is 30 for downstreams. //Fullscreen overlays under inventory -#define PLANE_FULLSCREEN 90 //Blindness, mesons, druggy, etc +#define PLANE_FULLSCREEN 90 //Blindness, mesons, druggy, etc + #define OBFUSCATION_LAYER 5 //Where images covering the view for eyes are put #define FULLSCREEN_LAYER 18 #define DAMAGE_LAYER 18.1 #define BLIND_LAYER 18.2 diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm index b577225e01..877982691e 100644 --- a/code/__defines/machinery.dm +++ b/code/__defines/machinery.dm @@ -53,7 +53,7 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called #define NETWORK_PRISON "Prison" #define NETWORK_SECURITY "Security" #define NETWORK_INTERROGATION "Interrogation" -#define NETWORK_TELECOM "Tcomsat" +#define NETWORK_TELECOM "Tcomms" #define NETWORK_THUNDER "Thunderdome" #define NETWORK_COMMUNICATORS "Communicators" diff --git a/code/_away_mission_tests.dm b/code/_away_mission_tests.dm index 29ff54f676..75286fb34e 100644 --- a/code/_away_mission_tests.dm +++ b/code/_away_mission_tests.dm @@ -7,4 +7,4 @@ * Should you wish to edit set AWAY_MISSION_TEST to 1 like so: * #define AWAY_MISSION_TEST 1 */ - #define AWAY_MISSION_TEST 0 \ No newline at end of file +#define AWAY_MISSION_TEST 0 diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index 4bd85ac182..e1215bb901 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -248,3 +248,19 @@ Proc for attack log creation, because really why not if (progbar) qdel(progbar) + +/atom/proc/living_mobs(var/range = world.view) + var/list/viewers = oviewers(src,range) + var/list/living = list() + for(var/mob/living/L in viewers) + living += L + + return living + +/atom/proc/human_mobs(var/range = world.view) + var/list/viewers = oviewers(src,range) + var/list/humans = list() + for(var/mob/living/carbon/human/H in viewers) + humans += H + + return humans diff --git a/code/_helpers/mobs_vr.dm b/code/_helpers/mobs_vr.dm deleted file mode 100644 index 602a2ed6ce..0000000000 --- a/code/_helpers/mobs_vr.dm +++ /dev/null @@ -1,7 +0,0 @@ -/atom/proc/living_mobs(var/range = world.view) - var/list/viewers = oviewers(src,range) - var/list/living = list() - for(var/mob/living/L in viewers) - living += L - - return living diff --git a/code/defines/obj.dm b/code/defines/obj.dm index fbd0a156a7..47a24f192f 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -137,6 +137,18 @@ var/global/list/PDA_Manifest = list() if(!department && !(name in heads)) misc[++misc.len] = list("name" = name, "rank" = rank, "active" = isactive) + // Synthetics don't have actual records, so we will pull them from here. + // Synths don't have records, which is the means by which isactive is retrieved, so I'm hardcoding it to active, don't really have any better means + for(var/mob/living/silicon/ai/ai in mob_list) + bot[++bot.len] = list("name" = ai.real_name, "rank" = "Artificial Intelligence", "active" = "Active") + + for(var/mob/living/silicon/robot/robot in mob_list) + // No combat/syndicate cyborgs, no drones. + if(robot.module && robot.module.hide_on_manifest) + continue + + bot[++bot.len] = list("name" = robot.real_name, "rank" = "[robot.modtype] [robot.braintype]", "active" = "Active") + PDA_Manifest = list( list("cat" = "Command", "elems" = heads), diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 7e210b513d..daefb23ef2 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -83,8 +83,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) minimal_player_age = 5 economic_modifier = 7 - access = list(access_heads) - minimal_access = list(access_heads) + access = list(access_heads, access_keycard_auth) + minimal_access = list(access_heads, access_keycard_auth) outfit_type = /decl/hierarchy/outfit/job/secretary - alt_titles = list("Command Liaison", "Bridge Secretary") \ No newline at end of file + alt_titles = list("Command Liaison", "Bridge Secretary") diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index dc67821301..8bf00b4ace 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -40,19 +40,19 @@ if(!usr || usr.stat || usr.lying) return if(scan) - usr << "You remove \the [scan] from \the [src]." + to_chat(usr, "You remove \the [scan] from \the [src].") scan.forceMove(get_turf(src)) if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human)) usr.put_in_hands(scan) scan = null else if(modify) - usr << "You remove \the [modify] from \the [src]." + to_chat(usr, "You remove \the [modify] from \the [src].") modify.forceMove(get_turf(src)) if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human)) usr.put_in_hands(modify) modify = null else - usr << "There is nothing to remove from the console." + to_chat(usr, "There is nothing to remove from the console.") return /obj/machinery/computer/card/attackby(obj/item/weapon/card/id/id_card, mob/user) @@ -82,12 +82,15 @@ /obj/machinery/computer/card/ui_interact(mob/user, ui_key="main", var/datum/nanoui/ui = null, var/force_open = 1) user.set_machine(src) + if(data_core) + data_core.get_manifest_list() + var/data[0] data["src"] = "\ref[src]" data["station_name"] = station_name() data["mode"] = mode data["printing"] = printing - data["manifest"] = data_core ? data_core.get_manifest(0) : null + data["manifest"] = PDA_Manifest data["target_name"] = modify ? modify.name : "-----" data["target_owner"] = modify && modify.registered_name ? modify.registered_name : "-----" data["target_rank"] = get_target_rank() @@ -99,13 +102,16 @@ data["all_centcom_access"] = null data["regions"] = null - data["engineering_jobs"] = format_jobs(engineering_positions) - data["medical_jobs"] = format_jobs(medical_positions) - data["science_jobs"] = format_jobs(science_positions) - data["security_jobs"] = format_jobs(security_positions) - data["cargo_jobs"] = format_jobs(cargo_positions) - data["civilian_jobs"] = format_jobs(civilian_positions) - data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) + data["jobs"] = list( + list("cat" = "Engineering", "jobs" = format_jobs(engineering_positions)), + list("cat" = "Medical", "jobs" = format_jobs(medical_positions)), + list("cat" = "Science", "jobs" = format_jobs(science_positions)), + list("cat" = "Security", "jobs" = format_jobs(security_positions)), + list("cat" = "Cargo", "jobs" = format_jobs(cargo_positions)), + list("cat" = "Planetside", "jobs" = format_jobs(planet_positions)), + list("cat" = "Civilian", "jobs" = format_jobs(civilian_positions)), + list("cat" = "CentCom", "jobs" = format_jobs(get_all_centcom_jobs())) + ) if (modify && is_centcom()) var/list/all_centcom_access = list() @@ -209,7 +215,7 @@ jobdatum = J break if(!jobdatum) - usr << "No log exists for this job: [t1]" + to_chat(usr, "No log exists for this job: [t1]") return access = jobdatum.get_access() diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index f438f7d003..215238a80b 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -12,6 +12,7 @@ var/lit = 0 var/id = null var/on_icon = "sign_on" + var/off_icon = "sign_off" /obj/machinery/holosign/proc/toggle() if(stat & (BROKEN|NOPOWER)) @@ -22,7 +23,7 @@ /obj/machinery/holosign/update_icon() if(!lit) - icon_state = "sign_off" + icon_state = off_icon else icon_state = on_icon @@ -40,7 +41,16 @@ /obj/machinery/holosign/exit name = "exit holosign" desc = "Small wall-mounted holographic projector. This one reads EXIT." - on_icon = "exit" + on_icon = "emergencyexit" + +/obj/machinery/holosign/bar + name = "bar holosign" + desc = "Small wall-mounted holographic projector. This one reads OPEN." + icon_state = "barclosed" + on_icon = "baropen" + off_icon = "barclosed" + + ////////////////////SWITCH/////////////////////////////////////// /obj/machinery/button/holosign diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 840cd5d24c..f6650301c7 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -62,6 +62,7 @@ var/wrenching = 0 var/last_target //last target fired at, prevents turrets from erratically firing at all valid targets in range var/timeout = 10 // When a turret pops up, then finds nothing to shoot at, this number decrements until 0, when it pops down. + var/can_salvage = TRUE // If false, salvaging doesn't give you anything. /obj/machinery/porta_turret/crescent enabled = 0 @@ -102,6 +103,7 @@ desc = "A very tough looking turret made by alien hands. This one looks destroyed, thankfully." icon_state = "destroyed_target_prism" stat = BROKEN + can_salvage = FALSE // So you need to actually kill a turret to get the alien gun. /obj/machinery/porta_turret/New() ..() @@ -325,7 +327,7 @@ var/list/turret_icons //try and salvage its components user << "You begin prying the metal coverings off." if(do_after(user, 20)) - if(prob(70)) + if(can_salvage && prob(70)) user << "You remove the turret and salvage some components." if(installation) var/obj/item/weapon/gun/energy/Gun = new installation(loc) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index ba5d338a0d..2b40faac66 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -180,6 +180,13 @@ item_state = "headset" ks2type = /obj/item/device/encryptionkey/heads/captain +/obj/item/device/radio/headset/heads/captain/sfr + name = "SFR headset" + desc = "A headset belonging to a Sif Free Radio DJ. SFR, best tunes in the wilderness." + icon_state = "com_headset_alt" + item_state = "headset" + ks2type = /obj/item/device/encryptionkey/heads/captain + /obj/item/device/radio/headset/heads/ai_integrated //No need to care about icons, it should be hidden inside the AI anyway. name = "\improper AI subspace transceiver" desc = "Integrated AI radio transceiver." diff --git a/code/game/objects/items/poi_items.dm b/code/game/objects/items/poi_items.dm index a9e4b876ca..8d11e747f6 100644 --- a/code/game/objects/items/poi_items.dm +++ b/code/game/objects/items/poi_items.dm @@ -18,3 +18,37 @@ /obj/item/poi/pascalb/Destroy() processing_objects -= src return ..() + +/obj/structure/closet/crate/oldreactor + name = "fission reactor rack" + desc = "Used in older models of nuclear reactors, essentially a cooling rack for high volumes of radioactive material." + icon = 'icons/obj/objects.dmi' + icon_state = "poireactor" + icon_opened = "poireactor_open" + icon_closed = "poireactor" + climbable = 0 + +/obj/structure/closet/crate/oldreactor/New() + ..() + new /obj/item/weapon/fuel_assembly/deuterium(src) + new /obj/item/weapon/fuel_assembly/deuterium(src) + new /obj/item/weapon/fuel_assembly/deuterium(src) + new /obj/item/weapon/fuel_assembly/deuterium(src) + new /obj/item/weapon/fuel_assembly/deuterium(src) + new /obj/item/weapon/fuel_assembly/deuterium(src) + +/obj/item/poi/brokenoldreactor + icon_state = "poireactor_broken" + name = "ruptured fission reactor rack" + desc = "This broken hunk of machinery looks extremely dangerous." + +/obj/item/poi/brokenoldreactor/New() + processing_objects += src + return ..() + +/obj/item/poi/brokenoldreactor/process() + radiation_repository.radiate(src, 25) + +/obj/item/poi/brokenoldreactor/Destroy() + processing_objects -= src + return ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index d34bb3565d..c564ebe466 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -399,28 +399,28 @@ return if(!parachute) //This packs the parachute - visible_message("\The [H] starts to pack \the [src]!", \ + H.visible_message("\The [H] starts to pack \the [src]!", \ "You start to pack \the [src]!", \ "You hear the shuffling of cloth.") if(do_after(H, 50)) - visible_message("\The [H] finishes packing \the [src]!", \ + H.visible_message("\The [H] finishes packing \the [src]!", \ "You finish packing \the [src]!", \ "You hear the shuffling of cloth.") parachute = TRUE else - visible_message("\The [src] gives up on packing \the [src]!", \ + H.visible_message("\The [src] gives up on packing \the [src]!", \ "You give up on packing \the [src]!") return else //This unpacks the parachute - visible_message("\The [src] starts to unpack \the [src]!", \ + H.visible_message("\The [src] starts to unpack \the [src]!", \ "You start to unpack \the [src]!", \ "You hear the shuffling of cloth.") if(do_after(H, 25)) - visible_message("\The [src] finishes unpacking \the [src]!", \ + H.visible_message("\The [src] finishes unpacking \the [src]!", \ "You finish unpacking \the [src]!", \ "You hear the shuffling of cloth.") parachute = FALSE else - visible_message("\The [src] decides not to unpack \the [src]!", \ + H.visible_message("\The [src] decides not to unpack \the [src]!", \ "You decide not to unpack \the [src]!") return \ No newline at end of file diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 25953417e5..1787a47bc8 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -902,6 +902,18 @@ something, make sure it's not in one of the other lists.*/ prob(1);/obj/item/weapon/beartrap, prob(2);/obj/item/weapon/handcuffs,) +/obj/random/sfr + name = "random SFR headset" + desc = "This is a headset spawn." + icon = 'icons/misc/mark.dmi' + icon_state = "rup" + +/obj/random/sfr/item_to_spawn() + return pick(prob(25);/obj/item/device/radio/headset/heads/captain/sfr, + prob(25);/obj/item/device/radio/headset/headset_cargo/alt, + prob(25);/obj/item/device/radio/headset/headset_com/alt, + prob(25);/obj/item/device/radio/headset) + /obj/random/rigsuit name = "Random rigsuit" desc = "This is a random rigsuit." @@ -1013,6 +1025,11 @@ var/list/multi_point_spawns id = "Captain's spare id" item_path = /obj/item/weapon/card/id/gold/captain/spare +/obj/random_multi/single_item/sfr_headset + name = "Multi Point - headset" + id = "SFR headset" + item_path = /obj/random/sfr + //Multiple Object Spawn /obj/random/multiple diff --git a/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm b/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm index f9f77fa684..f4f24e8d50 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm @@ -1,6 +1,6 @@ /obj/structure/closet/secure_closet/guncabinet name = "gun cabinet" - req_access = list(access_armory) + req_one_access = list(access_armory) icon = 'icons/obj/guncabinet.dmi' icon_state = "base" icon_off ="base" diff --git a/code/game/objects/structures/dogbed.dm b/code/game/objects/structures/dogbed.dm new file mode 100644 index 0000000000..bf9a65f8eb --- /dev/null +++ b/code/game/objects/structures/dogbed.dm @@ -0,0 +1,8 @@ +/obj/structure/dogbed + name = "dog bed" + desc = "A bed made especially for dogs, or other similarly sized pets." + icon = 'icons/obj/furniture.dmi' + icon_state = "dogbed" + can_buckle = 1 + buckle_dir = SOUTH + buckle_lying = 1 \ No newline at end of file diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm index b01c3ace96..872eea47d5 100644 --- a/code/game/objects/structures/flora/trees.dm +++ b/code/game/objects/structures/flora/trees.dm @@ -73,6 +73,7 @@ return is_stump = TRUE + density = FALSE icon_state = "[base_state]_stump" overlays.Cut() // For the Sif tree and other future glowy trees. set_light(0) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 29b7d89ab7..a3ff9ac9af 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -6,9 +6,65 @@ w_class = ITEMSIZE_HUGE var/state = 0 var/health = 200 + var/max_health = 200 + var/displaced_health = 50 + var/current_damage = 0 var/cover = 50 //how much cover the girder provides against projectiles. + var/default_material = DEFAULT_WALL_MATERIAL + var/material/girder_material var/material/reinf_material var/reinforcing = 0 + var/applies_material_colour = 1 + +/obj/structure/girder/New(var/newloc, var/material_key) + ..(newloc) + if(!material_key) + material_key = default_material + set_material(material_key) + update_icon() + +/obj/structure/girder/Destroy() + if(girder_material.products_need_process()) + processing_objects -= src + . = ..() + +/obj/structure/girder/process() + if(!radiate()) + processing_objects -= src + return + +/obj/structure/girder/proc/radiate() + var/total_radiation = girder_material.radioactivity + (reinf_material ? reinf_material.radioactivity / 2 : 0) + if(!total_radiation) + return + + radiation_repository.radiate(src, total_radiation) + return total_radiation + + +/obj/structure/girder/proc/set_material(var/new_material) + girder_material = get_material_by_name(new_material) + if(!girder_material) + qdel(src) + name = "[girder_material.display_name] [initial(name)]" + max_health = round(girder_material.integrity) //Should be 150 with default integrity (steel). Weaker than ye-olden Girders now. + health = max_health + displaced_health = round(max_health/4) + if(applies_material_colour) + color = girder_material.icon_colour + if(girder_material.products_need_process()) //Am I radioactive or some other? Process me! + processing_objects |= src + else if(src in processing_objects) //If I happened to be radioactive or s.o. previously, and am not now, stop processing. + processing_objects -= src + +/obj/structure/girder/get_material() + return girder_material + +/obj/structure/girder/update_icon() + if(anchored) + icon_state = "girder" + else + icon_state = "displaced" /obj/structure/girder/displaced icon_state = "displaced" @@ -16,6 +72,17 @@ health = 50 cover = 25 +/obj/structure/girder/displaced/New(var/newloc, var/material_key) + ..(newloc, material_key) + displace() + +/obj/structure/girder/proc/displace() + name = "displaced [girder_material.display_name] [initial(name)]" + icon_state = "displaced" + anchored = 0 + health = (displaced_health - round(current_damage / 4)) + cover = 25 + /obj/structure/girder/attack_generic(var/mob/user, var/damage, var/attack_message = "smashes apart", var/wallbreaker) if(!damage || !wallbreaker) return 0 @@ -36,6 +103,25 @@ if(!istype(Proj, /obj/item/projectile/beam)) damage *= 0.4 //non beams do reduced damage + else if(girder_material && girder_material.reflectivity >= 0.5) // Reflect lasers. + var/new_damage = damage * girder_material.reflectivity + var/outgoing_damage = damage - new_damage + damage = round(new_damage) + Proj.damage = outgoing_damage + + visible_message("\The [src] reflects \the [Proj]!") + + // Find a turf near or on the original location to bounce to + var/new_x = Proj.starting.x + pick(0, 0, 0, -1, 1, -2, 2) + var/new_y = Proj.starting.y + pick(0, 0, 0, -1, 1, -2, 2) + //var/turf/curloc = get_turf(src) + var/turf/curloc = get_step(src, get_dir(src, Proj.starting)) + + Proj.penetrating += 1 // Needed for the beam to get out of the girder. + + // redirect the projectile + Proj.redirect(new_x, new_y, curloc, null) + health -= damage ..() if(health <= 0) @@ -47,9 +133,10 @@ dismantle() /obj/structure/girder/proc/reset_girder() + name = "[girder_material.display_name] [initial(name)]" anchored = 1 cover = initial(cover) - health = min(health,initial(health)) + health = min(max_health - current_damage,max_health) state = 0 icon_state = initial(icon_state) reinforcing = 0 @@ -60,62 +147,59 @@ if(istype(W, /obj/item/weapon/wrench) && state == 0) if(anchored && !reinf_material) playsound(src, W.usesound, 100, 1) - user << "Now disassembling the girder..." - if(do_after(user,40 * W.toolspeed)) + to_chat(user, "Now disassembling the girder...") + if(do_after(user,(35 + round(max_health/50)) * W.toolspeed)) if(!src) return - user << "You dissasembled the girder!" + to_chat(user, "You dissasembled the girder!") dismantle() else if(!anchored) playsound(src, W.usesound, 100, 1) - user << "Now securing the girder..." + to_chat(user, "Now securing the girder...") if(do_after(user, 40 * W.toolspeed, src)) - user << "You secured the girder!" + to_chat(user, "You secured the girder!") reset_girder() else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) - user << "Now slicing apart the girder..." + to_chat(user, "Now slicing apart the girder...") if(do_after(user,30 * W.toolspeed)) if(!src) return - user << "You slice apart the girder!" + to_chat(user, "You slice apart the girder!") dismantle() else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) - user << "You drill through the girder!" + to_chat(user, "You drill through the girder!") dismantle() else if(istype(W, /obj/item/weapon/screwdriver)) if(state == 2) playsound(src, W.usesound, 100, 1) - user << "Now unsecuring support struts..." + to_chat(user, "Now unsecuring support struts...") if(do_after(user,40 * W.toolspeed)) if(!src) return - user << "You unsecured the support struts!" + to_chat(user, "You unsecured the support struts!") state = 1 else if(anchored && !reinf_material) playsound(src, W.usesound, 100, 1) reinforcing = !reinforcing - user << "\The [src] can now be [reinforcing? "reinforced" : "constructed"]!" + to_chat(user, "\The [src] can now be [reinforcing? "reinforced" : "constructed"]!") else if(istype(W, /obj/item/weapon/wirecutters) && state == 1) playsound(src, W.usesound, 100, 1) - user << "Now removing support struts..." + to_chat(user, "Now removing support struts...") if(do_after(user,40 * W.toolspeed)) if(!src) return - user << "You removed the support struts!" + to_chat(user, "You removed the support struts!") reinf_material.place_dismantled_product(get_turf(src)) reinf_material = null reset_girder() else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored) playsound(src, W.usesound, 100, 1) - user << "Now dislodging the girder..." + to_chat(user, "Now dislodging the girder...") if(do_after(user, 40 * W.toolspeed)) if(!src) return - user << "You dislodged the girder!" - icon_state = "displaced" - anchored = 0 - health = 50 - cover = 25 + to_chat(user, "You dislodged the girder!") + displace() else if(istype(W, /obj/item/stack/material)) if(reinforcing && !reinf_material) @@ -130,14 +214,16 @@ /obj/structure/girder/proc/take_damage(var/damage) health -= damage - if(health <= 0) dismantle() + else + current_damage = current_damage + damage //Rather than calculate this every time we need to use it, just calculate it here and save it. + /obj/structure/girder/proc/construct_wall(obj/item/stack/material/S, mob/user) var/amount_to_use = reinf_material ? 1 : 2 if(S.get_amount() < amount_to_use) - user << "There isn't enough material here to construct a wall." + to_chat(user, "There isn't enough material here to construct a wall.") return 0 var/material/M = name_to_material[S.default_type] @@ -148,24 +234,24 @@ add_hiddenprint(usr) if(M.integrity < 50) - user << "This material is too soft for use in wall construction." + to_chat(user, "This material is too soft for use in wall construction.") return 0 - user << "You begin adding the plating..." + to_chat(user, "You begin adding the plating...") if(!do_after(user,40) || !S.use(amount_to_use)) return 1 //once we've gotten this far don't call parent attackby() if(anchored) - user << "You added the plating!" + to_chat(user, "You added the plating!") else - user << "You create a false wall! Push on it to open or close the passage." + to_chat(user, "You create a false wall! Push on it to open or close the passage.") wall_fake = 1 var/turf/Tsrc = get_turf(src) Tsrc.ChangeTurf(/turf/simulated/wall) var/turf/simulated/wall/T = get_turf(src) - T.set_material(M, reinf_material) + T.set_material(M, reinf_material, girder_material) if(wall_fake) T.can_open = 1 T.add_hiddenprint(usr) @@ -174,22 +260,22 @@ /obj/structure/girder/proc/reinforce_with_material(obj/item/stack/material/S, mob/user) //if the verb is removed this can be renamed. if(reinf_material) - user << "\The [src] is already reinforced." + to_chat(user, "\The [src] is already reinforced.") return 0 if(S.get_amount() < 1) - user << "There isn't enough material here to reinforce the girder." + to_chat(user, "There isn't enough material here to reinforce the girder.") return 0 var/material/M = name_to_material[S.default_type] if(!istype(M) || M.integrity < 50) - user << "You cannot reinforce \the [src] with that; it is too soft." + to_chat(user, "You cannot reinforce \the [src] with that; it is too soft.") return 0 - user << "Now reinforcing..." + to_chat(user, "Now reinforcing...") if (!do_after(user,40) || !S.use(1)) return 1 //don't call parent attackby() past this point - user << "You added reinforcement!" + to_chat(user, "You added reinforcement!") reinf_material = M reinforce_girder() @@ -197,13 +283,13 @@ /obj/structure/girder/proc/reinforce_girder() cover = reinf_material.hardness - health = 500 + health = health + round(reinf_material.integrity/2) state = 2 icon_state = "reinforced" reinforcing = 0 /obj/structure/girder/proc/dismantle() - new /obj/item/stack/material/steel(get_turf(src)) + girder_material.place_dismantled_product(get_turf(src)) qdel(src) /obj/structure/girder/attack_hand(mob/user as mob) @@ -235,6 +321,8 @@ icon_state= "cultgirder" health = 250 cover = 70 + girder_material = DEFAULT_WALL_MATERIAL + applies_material_colour = 0 /obj/structure/girder/cult/dismantle() new /obj/effect/decal/remains/human(get_turf(src)) @@ -243,18 +331,18 @@ /obj/structure/girder/cult/attackby(obj/item/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) playsound(src, W.usesound, 100, 1) - user << "Now disassembling the girder..." + to_chat(user, "Now disassembling the girder...") if(do_after(user,40 * W.toolspeed)) - user << "You dissasembled the girder!" + to_chat(user, "You dissasembled the girder!") dismantle() else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) - user << "Now slicing apart the girder..." + to_chat(user, "Now slicing apart the girder...") if(do_after(user,30 * W.toolspeed)) - user << "You slice apart the girder!" + to_chat(user, "You slice apart the girder!") dismantle() else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill)) - user << "You drill through the girder!" + to_chat(user, "You drill through the girder!") new /obj/effect/decal/remains/human(get_turf(src)) dismantle() diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 14e8b894ba..2d26821bbe 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -156,6 +156,9 @@ /obj/structure/sign/warning/docking_area name = "\improper KEEP CLEAR: DOCKING AREA" + +/obj/structure/sign/warning/evac + name = "\improper KEEP CLEAR: EVAC DOCKING AREA" icon_state = "evac" /obj/structure/sign/warning/engineering_access @@ -777,3 +780,13 @@ /obj/structure/sign/atmos/air name = "\improper AIR" icon_state = "atmos_air" + +/obj/structure/sign/poi/engineleft + name = "I.C.V." + desc = "The charred name of a cargo ship of some description." + icon_state = "poi_engine1" + +/obj/structure/sign/poi/engineright + name = "I.C.V." + desc = "The charred name of a cargo ship of some description." + icon_state = "poi_engine2" \ No newline at end of file diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm index db260f1cca..940a170cdb 100644 --- a/code/game/turfs/simulated/floor_icon.dm +++ b/code/game/turfs/simulated/floor_icon.dm @@ -4,6 +4,7 @@ var/image/no_ceiling_image = null /hook/startup/proc/setup_no_ceiling_image() cache_no_ceiling_image() + return TRUE /proc/cache_no_ceiling_image() no_ceiling_image = image(icon = 'icons/turf/open_space.dmi', icon_state = "no_ceiling", layer = OVERTURF_LAYER) diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm index eab99bfba7..2dac063723 100644 --- a/code/game/turfs/simulated/wall_icon.dm +++ b/code/game/turfs/simulated/wall_icon.dm @@ -31,9 +31,13 @@ update_icon() -/turf/simulated/wall/proc/set_material(var/material/newmaterial, var/material/newrmaterial) +/turf/simulated/wall/proc/set_material(var/material/newmaterial, var/material/newrmaterial, var/material/newgmaterial) material = newmaterial reinf_material = newrmaterial + if(!newgmaterial) + girder_material = DEFAULT_WALL_MATERIAL + else + girder_material = newgmaterial update_material() /turf/simulated/wall/update_icon() diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index fcd0a31479..21fd9492f0 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -14,6 +14,7 @@ var/global/damage_overlays[16] var/active var/can_open = 0 + var/material/girder_material var/material/material var/material/reinf_material var/last_state @@ -26,12 +27,15 @@ for(var/obj/O in src) O.hide(1) -/turf/simulated/wall/New(var/newloc, var/materialtype, var/rmaterialtype) +/turf/simulated/wall/New(var/newloc, var/materialtype, var/rmaterialtype, var/girdertype) ..(newloc) icon_state = "blank" if(!materialtype) materialtype = DEFAULT_WALL_MATERIAL material = get_material_by_name(materialtype) + if(!girdertype) + girdertype = DEFAULT_WALL_MATERIAL + girder_material = get_material_by_name(girdertype) if(!isnull(rmaterialtype)) reinf_material = get_material_by_name(rmaterialtype) update_material() @@ -120,18 +124,18 @@ . = ..(user) if(!damage) - user << "It looks fully intact." + to_chat(user, "It looks fully intact.") else var/dam = damage / material.integrity if(dam <= 0.3) - user << "It looks slightly damaged." + to_chat(user, "It looks slightly damaged.") else if(dam <= 0.6) - user << "It looks moderately damaged." + to_chat(user, "It looks moderately damaged.") else - user << "It looks heavily damaged." + to_chat(user, "It looks heavily damaged.") if(locate(/obj/effect/overlay/wallrot) in src) - user << "There is fungus growing on [src]." + to_chat(user, "There is fungus growing on [src].") //Damage @@ -186,9 +190,9 @@ playsound(src, 'sound/items/Welder.ogg', 100, 1) if(!no_product) if(reinf_material) - reinf_material.place_dismantled_girder(src, reinf_material) + reinf_material.place_dismantled_girder(src, reinf_material, girder_material) else - material.place_dismantled_girder(src) + material.place_dismantled_girder(src, null, girder_material) if(!devastated) material.place_dismantled_product(src) if (!reinf_material) @@ -204,6 +208,7 @@ clear_plants() material = get_material_by_name("placeholder") reinf_material = null + girder_material = null update_connections(1) ChangeTurf(/turf/simulated/floor/plating) @@ -211,6 +216,8 @@ /turf/simulated/wall/ex_act(severity) switch(severity) if(1.0) + if(girder_material.explosion_resistance >= 25 && prob(girder_material.explosion_resistance)) + new /obj/structure/girder/displaced(src, girder_material.name) src.ChangeTurf(get_base_turf_by_area(src)) if(2.0) if(prob(75)) @@ -247,12 +254,15 @@ O.density = 1 O.layer = 5 - src.ChangeTurf(/turf/simulated/floor/plating) + if(girder_material.integrity >= 150 && !girder_material.is_brittle()) //Strong girders will remain in place when a wall is melted. + dismantle_wall(1,1) + else + src.ChangeTurf(/turf/simulated/floor/plating) var/turf/simulated/floor/F = src F.burn_tile() - F.icon_state = "wall_thermite" - user << "The thermite starts melting through the wall." + F.icon_state = "dmg[rand(1,4)]" + to_chat(user, "The thermite starts melting through the wall.") spawn(100) if(O) @@ -261,7 +271,7 @@ return /turf/simulated/wall/proc/radiate() - var/total_radiation = material.radioactivity + (reinf_material ? reinf_material.radioactivity / 2 : 0) + var/total_radiation = material.radioactivity + (reinf_material ? reinf_material.radioactivity / 2 : 0) + (girder_material ? girder_material.radioactivity / 2 : 0) if(!total_radiation) return @@ -271,7 +281,7 @@ /turf/simulated/wall/proc/burn(temperature) if(material.combustion_effect(src, temperature, 0.7)) spawn(2) - new /obj/structure/girder(src) + new /obj/structure/girder(src, girder_material.name) src.ChangeTurf(/turf/simulated/floor) for(var/turf/simulated/wall/W in range(3,src)) W.burn((temperature/4)) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index e6f0596d11..2f1fdda438 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -91,7 +91,7 @@ turf/attackby(obj/item/weapon/W as obj, mob/user as mob) return if(istype(O, /obj/screen)) return - if(user.restrained() || user.stat || user.stunned || user.paralysis) + if(user.restrained() || user.stat || user.stunned || user.paralysis || (!user.lying && !istype(user, /mob/living/silicon/robot))) return if((!(istype(O, /atom/movable)) || O.anchored || !Adjacent(user) || !Adjacent(O) || !user.Adjacent(O))) return diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 420378c9c4..132f89b52a 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -162,7 +162,7 @@ var/list/debug_verbs = list ( ,/datum/admins/proc/setup_supermatter ,/client/proc/atmos_toggle_debug ,/client/proc/spawn_tanktransferbomb - ,/client/proc/debug_process_scheduler + ,/client/proc/debug_process_scheduler // VOREStation Edit - Nice ,/client/proc/take_picture ) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 01dc830aaa..e386590ec7 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -87,7 +87,7 @@ /obj/effect/landmark/corpse/syndicatesoldier - name = "Syndicate Operative" + name = "Mercenary" corpseuniform = /obj/item/clothing/under/syndicate corpsesuit = /obj/item/clothing/suit/armor/vest corpseshoes = /obj/item/clothing/shoes/boots/swat diff --git a/code/modules/maps/tg/map_template.dm b/code/modules/maps/tg/map_template.dm index 12f0c1dbb2..096b5a7197 100644 --- a/code/modules/maps/tg/map_template.dm +++ b/code/modules/maps/tg/map_template.dm @@ -23,6 +23,7 @@ var/list/global/map_templates = list() it runs out. The cost of a submap should roughly corrispond with several factors such as size, loot, difficulty, desired scarcity, etc. \ Set to -1 to force the submap to always be made. var/allow_duplicates = FALSE // If false, only one map template will be spawned by the game. Doesn't affect admins spawning then manually. + var/discard_prob = 0 // If non-zero, there is a chance that the map seeding algorithm will skip this template when selecting potential templates to use. var/static/dmm_suite/maploader = new @@ -202,6 +203,8 @@ var/list/global/map_templates = list() continue if(!istype(MT, desired_map_template_type)) // Not the type wanted. continue + if(MT.discard_prob && prob(MT.discard_prob)) + continue if(MT.cost && MT.cost < 0) // Negative costs always get spawned. priority_submaps += MT else diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index a52d66a0fa..6a10383f76 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -22,6 +22,7 @@ recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") + recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") if(hardness>50) recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]") @@ -57,7 +58,6 @@ recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1) recipes += new/datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1) //recipes += new/datum/stack_recipe("fire axe cabinet frame", /obj/item/frame/fireaxe_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1) - recipes += new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 50, one_per_turf = 0, on_floor = 1) recipes += new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe_list("airlock assemblies", list( \ diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index 54a890074a..af5e1b7475 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -192,11 +192,16 @@ var/list/name_to_material name = "placeholder" // Places a girder object when a wall is dismantled, also applies reinforced material. -/material/proc/place_dismantled_girder(var/turf/target, var/material/reinf_material) +/material/proc/place_dismantled_girder(var/turf/target, var/material/reinf_material, var/material/girder_material) var/obj/structure/girder/G = new(target) if(reinf_material) G.reinf_material = reinf_material G.reinforce_girder() + if(girder_material) + if(istype(girder_material, /material)) + girder_material = girder_material.name + G.set_material(girder_material) + // General wall debris product placement. // Not particularly necessary aside from snowflakey cult girders. diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index bf931b972a..45b7bd5e37 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -1,6 +1,6 @@ //This is the proc for gibbing a mob. Cannot gib ghosts. //added different sort of gibs and animations. N -/mob/proc/gib(anim="gibbed-m",do_gibs) +/mob/proc/gib(anim="gibbed-m", do_gibs, gib_file = 'icons/mob/mob.dmi') death(1) transforming = 1 canmove = 0 @@ -12,7 +12,7 @@ var/atom/movable/overlay/animation = null animation = new(loc) animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' + animation.icon = gib_file animation.master = src flick(anim, animation) diff --git a/code/modules/mob/freelook/chunk.dm b/code/modules/mob/freelook/chunk.dm index 626a79e28f..7c50bd3135 100644 --- a/code/modules/mob/freelook/chunk.dm +++ b/code/modules/mob/freelook/chunk.dm @@ -101,7 +101,9 @@ var/turf/t = turf if(obscuredTurfs[t]) if(!t.obfuscations[obfuscation.type]) - t.obfuscations[obfuscation.type] = image(obfuscation.icon, t, obfuscation.icon_state, OBFUSCATION_LAYER) + var/image/ob_image = image(obfuscation.icon, t, obfuscation.icon_state, OBFUSCATION_LAYER) + ob_image.plane = PLANE_FULLSCREEN + t.obfuscations[obfuscation.type] = ob_image obscured += t.obfuscations[obfuscation.type] for(var/eye in seenby) @@ -140,7 +142,9 @@ for(var/turf in obscuredTurfs) var/turf/t = turf if(!t.obfuscations[obfuscation.type]) - t.obfuscations[obfuscation.type] = image(obfuscation.icon, t, obfuscation.icon_state, OBFUSCATION_LAYER) + var/image/ob_image = image(obfuscation.icon, t, obfuscation.icon_state, OBFUSCATION_LAYER) + ob_image.plane = PLANE_FULLSCREEN + t.obfuscations[obfuscation.type] = ob_image obscured += t.obfuscations[obfuscation.type] #undef UPDATE_BUFFER diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 58c26a56e2..5d4f17840a 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/verb/give(var/mob/living/carbon/target in view(1)-usr) +/mob/living/carbon/human/verb/give(var/mob/living/carbon/target in living_mobs(1)) set category = "IC" set name = "Give" diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index eaea5ec06e..24a5bac586 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -24,7 +24,7 @@ drop_from_inventory(I) I.throw_at(get_edge_target_turf(src,pick(alldirs)), rand(1,3), round(30/I.w_class)) - ..(species.gibbed_anim) + ..(species.gibbed_anim) // uses the default mob.dmi file for these, so we only need to specify the first argument gibs(loc, dna, null, species.get_flesh_colour(src), species.get_blood_colour(src)) /mob/living/carbon/human/dust() diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 1d3602a2ce..b6f57f2d43 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -13,7 +13,7 @@ secondary_langs = list(LANGUAGE_SOL_COMMON) name_language = null // Use the first-name last-name generator rather than a language scrambler min_age = 17 - max_age = 110 + max_age = 130 health_hud_intensity = 1.5 spawn_flags = SPECIES_CAN_JOIN diff --git a/code/modules/mob/living/simple_animal/aliens/drone.dm b/code/modules/mob/living/simple_animal/aliens/drone.dm index 2a41e81667..81532ef62d 100644 --- a/code/modules/mob/living/simple_animal/aliens/drone.dm +++ b/code/modules/mob/living/simple_animal/aliens/drone.dm @@ -61,6 +61,9 @@ /mob/living/simple_animal/hostile/malf_drone/Process_Spacemove(var/check_drift = 0) return 1 +/mob/living/simple_animal/hostile/malf_drone/isSynthetic() + return TRUE + //self repair systems have a chance to bring the drone back to life /mob/living/simple_animal/hostile/malf_drone/Life() @@ -150,6 +153,7 @@ disabled = rand(150, 600) hostile = 0 walk(src,0) + ..() /mob/living/simple_animal/hostile/malf_drone/death() ..(null,"suddenly breaks apart.") diff --git a/code/modules/mob/living/simple_animal/animals/goose.dm b/code/modules/mob/living/simple_animal/animals/goose.dm index 2def095975..f2f7c18277 100644 --- a/code/modules/mob/living/simple_animal/animals/goose.dm +++ b/code/modules/mob/living/simple_animal/animals/goose.dm @@ -4,7 +4,6 @@ icon_state = "goose" icon_living = "goose" icon_dead = "goose_dead" - icon_gib = "generic_gib" faction = "geese" intelligence_level = SA_ANIMAL diff --git a/code/modules/mob/living/simple_animal/animals/penguin.dm b/code/modules/mob/living/simple_animal/animals/penguin.dm index 09adf4ed41..13ecb0d0ca 100644 --- a/code/modules/mob/living/simple_animal/animals/penguin.dm +++ b/code/modules/mob/living/simple_animal/animals/penguin.dm @@ -4,7 +4,6 @@ icon_state = "penguin" icon_living = "penguin" icon_dead = "penguin_dead" - icon_gib = "generic_gib" intelligence_level = SA_ANIMAL maxHealth = 20 diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 1171d1f9ac..5f352705b8 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -86,7 +86,7 @@ //List of different corpse types /obj/effect/landmark/mobcorpse/syndicatesoldier - name = "Syndicate Operative" + name = "Mercenary" corpseuniform = /obj/item/clothing/under/syndicate corpsesuit = /obj/item/clothing/suit/armor/vest corpseshoes = /obj/item/clothing/shoes/boots/swat diff --git a/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm b/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm index 3cfafda91a..4d107d35fd 100644 --- a/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm +++ b/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm @@ -84,7 +84,7 @@ sparks.start() /mob/living/simple_animal/hostile/mecha/death() - ..(0,"is explodes!") + ..(0,"explodes!") sparks.start() explosion(get_turf(src), 0, 0, 1, 3) qdel(src) @@ -93,3 +93,26 @@ /mob/living/simple_animal/hostile/mecha/Move() ..() playsound(src,'sound/mecha/mechstep.ogg',40,1) + + +/mob/living/simple_animal/hostile/mecha/malf_drone + intelligence_level = SA_ROBOTIC + faction = "malf_drone" + speak_chance = 1 + speak = list( + "Resuming task: Protect area.", + "No threats found.", + "Error: No targets found." + ) + emote_hear = list("humms ominously", "whirrs softly", "grinds a gear") + emote_see = list("looks around the area", "turns from side to side") + say_understood = list("Affirmative.", "Positive.") + say_cannot = list("Denied.", "Negative.") + say_maybe_target = list("Possible threat detected. Investigating.", "Motion detected.", "Investigating.") + say_got_target = list("Threat detected.", "New task: Remove threat.", "Threat removal engaged.", "Engaging target.") + +/mob/living/simple_animal/hostile/mecha/malf_drone/isSynthetic() + return TRUE + +/mob/living/simple_animal/hostile/mecha/malf_drone/speech_bubble_appearance() + return "synthetic_evil" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/humanoids/syndicate.dm b/code/modules/mob/living/simple_animal/humanoids/syndicate.dm index edc46025a9..c63ec3125f 100644 --- a/code/modules/mob/living/simple_animal/humanoids/syndicate.dm +++ b/code/modules/mob/living/simple_animal/humanoids/syndicate.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/hostile/syndicate - name = "syndicate operative" + name = "mercenary" desc = "Death to the Company." icon_state = "syndicate" icon_living = "syndicate" diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index f69226a049..d37b2e33fa 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -20,7 +20,7 @@ //Mob icon/appearance settings var/icon_living = "" // The iconstate if we're alive, required var/icon_dead = "" // The iconstate if we're dead, required - var/icon_gib = null // The iconstate for being gibbed, optional + var/icon_gib = "generic_gib" // The iconstate for being gibbed, optional. Defaults to a generic gib animation. var/icon_rest = null // The iconstate for resting, optional var/image/modifier_overlay = null // Holds overlays from modifiers. @@ -490,7 +490,7 @@ purge -= 1 /mob/living/simple_animal/gib() - ..(icon_gib,1) + ..(icon_gib,1,icon) // we need to specify where the gib animation is stored /mob/living/simple_animal/emote(var/act, var/type, var/desc) if(act) diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm index 1e84126fe7..3d3a2a0073 100644 --- a/code/modules/planet/sif.dm +++ b/code/modules/planet/sif.dm @@ -251,7 +251,7 @@ datum/weather/sif WEATHER_OVERCAST = 5 ) -/datum/weather/sif/rain/process_effects() +/datum/weather/sif/storm/process_effects() for(var/mob/living/L in living_mob_list) if(L.z in holder.our_planet.expected_z_levels) var/turf/T = get_turf(L) diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm index 60af67cf92..760c46ea93 100644 --- a/code/modules/power/fusion/core/_core.dm +++ b/code/modules/power/fusion/core/_core.dm @@ -18,6 +18,8 @@ var/list/fusion_cores = list() active_power_usage = 500 //multiplied by field strength anchored = 0 + circuit = /obj/item/weapon/circuitboard/fusion_core + var/obj/effect/fusion_em_field/owned_field var/field_strength = 1//0.01 var/id_tag @@ -27,8 +29,12 @@ var/list/fusion_cores = list() /obj/machinery/power/fusion_core/initialize() . = ..() - connect_to_network() fusion_cores += src + default_apply_parts() + +/obj/machinery/power/fusion_core/mapped/initialize() + . = ..() + connect_to_network() /obj/machinery/power/fusion_core/Destroy() for(var/obj/machinery/computer/fusion_core_control/FCC in machines) @@ -47,6 +53,7 @@ var/list/fusion_cores = list() owned_field.radiation_scale() owned_field.temp_dump() owned_field.temp_color() + /obj/machinery/power/fusion_core/Topic(href, href_list) if(..()) return 1 @@ -106,23 +113,20 @@ var/list/fusion_cores = list() to_chat(user,"Shut \the [src] off first!") return + if(default_deconstruction_screwdriver(user, W)) + return + if(default_deconstruction_crowbar(user, W)) + return + if(default_part_replacement(user, W)) + return + if(ismultitool(W)) var/new_ident = input("Enter a new ident tag.", "Fusion Core", id_tag) as null|text if(new_ident && user.Adjacent(src)) id_tag = new_ident return - else if(iswrench(W)) - anchored = !anchored - playsound(src, W.usesound, 75, 1) - if(anchored) - user.visible_message("[user.name] secures [src.name] to the floor.", \ - "You secure the [src.name] to the floor.", \ - "You hear a ratchet") - else - user.visible_message("[user.name] unsecures [src.name] from the floor.", \ - "You unsecure the [src.name] from the floor.", \ - "You hear a ratchet") + if(default_unfasten_wrench(user, W)) return return ..() diff --git a/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm b/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm index 97afe227c4..6a0f1bc205 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm @@ -6,6 +6,12 @@ anchored = 1 layer = 4 + circuit = /obj/item/weapon/circuitboard/fusion_fuel_compressor + +/obj/machinery/fusion_fuel_compressor/initialize() + . = ..() + default_apply_parts() + /obj/machinery/fusion_fuel_compressor/MouseDrop_T(var/atom/movable/target, var/mob/user) if(user.incapacitated() || !user.Adjacent(src)) return @@ -34,6 +40,14 @@ return 0 /obj/machinery/fusion_fuel_compressor/attackby(var/obj/item/thing, var/mob/user) + + if(default_deconstruction_screwdriver(user, thing)) + return + if(default_deconstruction_crowbar(user, thing)) + return + if(default_part_replacement(user, thing)) + return + if(istype(thing, /obj/item/stack/material)) var/obj/item/stack/material/M = thing var/material/mat = M.get_material() diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm index 9f54c48188..545638c7d8 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm @@ -11,15 +11,17 @@ var/list/fuel_injectors = list() idle_power_usage = 10 active_power_usage = 500 + circuit = /obj/item/weapon/circuitboard/fusion_injector + var/fuel_usage = 0.0001 var/id_tag var/injecting = 0 var/obj/item/weapon/fuel_assembly/cur_assembly -/obj/machinery/fusion_fuel_injector/New() - ..() +/obj/machinery/fusion_fuel_injector/initialize() + . = ..() fuel_injectors += src - tag = null + default_apply_parts() /obj/machinery/fusion_fuel_injector/Destroy() if(cur_assembly) @@ -66,17 +68,18 @@ var/list/fuel_injectors = list() cur_assembly = W return - if(iswrench(W)) + if(iswrench(W) || isscrewdriver(W) || iscrowbar(W) || istype(W, /obj/item/weapon/storage/part_replacer)) if(injecting) to_chat(user, "Shut \the [src] off first!") return - anchored = !anchored - playsound(src, W.usesound, 75, 1) - if(anchored) - user.visible_message("\The [user] secures \the [src] to the floor.") - else - user.visible_message("\The [user] unsecures \the [src] from the floor.") - return + if(default_unfasten_wrench(user, W)) + return + if(default_deconstruction_screwdriver(user, W)) + return + if(default_deconstruction_crowbar(user, W)) + return + if(default_part_replacement(user, W)) + return return ..() @@ -122,7 +125,6 @@ var/list/fuel_injectors = list() var/obj/effect/accelerated_particle/A = new/obj/effect/accelerated_particle(get_turf(src), dir) A.particle_type = reagent A.additional_particles = numparticles - 1 - A.move(1) if(cur_assembly) cur_assembly.rod_quantities[reagent] -= amount amount_left += cur_assembly.rod_quantities[reagent] @@ -150,4 +152,4 @@ var/list/fuel_injectors = list() if (usr.incapacitated() || usr.restrained() || anchored) return - src.dir = turn(src.dir, 90) \ No newline at end of file + src.dir = turn(src.dir, 90) diff --git a/code/modules/power/fusion/fusion_particle_catcher.dm b/code/modules/power/fusion/fusion_particle_catcher.dm index 7dba3d8e23..3651285485 100644 --- a/code/modules/power/fusion/fusion_particle_catcher.dm +++ b/code/modules/power/fusion/fusion_particle_catcher.dm @@ -38,8 +38,6 @@ return 0 /obj/effect/fusion_particle_catcher/CanPass(var/atom/movable/mover, var/turf/target, var/height=0, var/air_group=0) - if(istype(mover, /obj/item/projectile/beam)) - return 0 - if(istype(mover, /obj/effect/accelerated_particle)) - return 0 + if(istype(mover, /obj/effect/accelerated_particle) || istype(mover, /obj/item/projectile/beam)) + return !density return 1 diff --git a/code/modules/power/fusion/gyrotron/gyrotron.dm b/code/modules/power/fusion/gyrotron/gyrotron.dm index edf905ab06..5309b0f5b2 100644 --- a/code/modules/power/fusion/gyrotron/gyrotron.dm +++ b/code/modules/power/fusion/gyrotron/gyrotron.dm @@ -9,6 +9,8 @@ var/list/gyrotrons = list() use_power = 1 active_power_usage = 50000 + circuit = /obj/item/weapon/circuitboard/gyrotron + var/id_tag var/rate = 3 var/mega_energy = 1 @@ -21,6 +23,7 @@ var/list/gyrotrons = list() /obj/machinery/power/emitter/gyrotron/initialize() gyrotrons += src active_power_usage = mega_energy * 50000 + default_apply_parts() . = ..() /obj/machinery/power/emitter/gyrotron/Destroy() @@ -54,4 +57,12 @@ var/list/gyrotrons = list() if(new_ident && user.Adjacent(src)) id_tag = new_ident return + + if(default_deconstruction_screwdriver(user, W)) + return + if(default_deconstruction_crowbar(user, W)) + return + if(default_part_replacement(user, W)) + return + return ..() \ No newline at end of file diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 6c5d77fd1d..3b5992e4e4 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -4,7 +4,7 @@ name = "Accelerated Particles" desc = "Small things moving very fast." icon = 'icons/obj/machines/particle_accelerator2.dmi' - icon_state = "particle"//Need a new icon for this + icon_state = "particle1"//Need a new icon for this anchored = 1 density = 1 var/movement_range = 10 @@ -19,22 +19,25 @@ var/movetotarget = 1 /obj/effect/accelerated_particle/weak + icon_state = "particle0" movement_range = 8 energy = 5 /obj/effect/accelerated_particle/strong + icon_state = "particle2" movement_range = 15 energy = 15 +/obj/effect/accelerated_particle/powerful + icon_state = "particle3" + movement_range = 25 + energy = 50 /obj/effect/accelerated_particle/New(loc, dir = 2) src.loc = loc src.set_dir(dir) - if(movement_range > 20) - movement_range = 20 spawn(0) move(1) - return /obj/effect/accelerated_particle/Bump(atom/A) @@ -58,18 +61,15 @@ PC.parent.plasma_temperature += mega_energy PC.parent.energy += energy loc = null - return /obj/effect/accelerated_particle/Bumped(atom/A) if(ismob(A)) Bump(A) - return /obj/effect/accelerated_particle/ex_act(severity) qdel(src) - return /obj/effect/accelerated_particle/singularity_act() return @@ -79,7 +79,6 @@ M.apply_effect((radiation*3),IRRADIATE,0) M.updatehealth() //M << "You feel odd." - return /obj/effect/accelerated_particle/proc/move(var/lag) diff --git a/code/modules/power/singularity/particle_accelerator/particle_chamber.dm b/code/modules/power/singularity/particle_accelerator/particle_chamber.dm index 4df3a92c46..4404c33671 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_chamber.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_chamber.dm @@ -3,8 +3,4 @@ desc_holder = "This is where the Alpha particles are accelerated to radical speeds." icon = 'icons/obj/machines/particle_accelerator2.dmi' icon_state = "fuel_chamber" - reference = "fuel_chamber" - -/obj/structure/particle_accelerator/fuel_chamber/update_icon() - ..() - return \ No newline at end of file + reference = "fuel_chamber" \ No newline at end of file diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 39f08f509b..0bc4adabcf 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -56,11 +56,10 @@ active = 0 connected_parts = list() - return /obj/machinery/particle_accelerator/control_box/update_icon() if(active) - icon_state = "[reference]p1" + icon_state = "[reference]p[strength]" else if(use_power) if(assembled) @@ -77,7 +76,6 @@ icon_state = "[reference]w" else icon_state = "[reference]c" - return /obj/machinery/particle_accelerator/control_box/Topic(href, href_list) ..() @@ -94,9 +92,9 @@ if(href_list["togglep"]) if(!wires.IsIndexCut(PARTICLE_TOGGLE_WIRE)) - src.toggle_power() + toggle_power() else if(href_list["scan"]) - src.part_scan() + part_scan() else if(href_list["strengthup"]) if(!wires.IsIndexCut(PARTICLE_STRENGTH_WIRE)) @@ -106,9 +104,8 @@ if(!wires.IsIndexCut(PARTICLE_STRENGTH_WIRE)) remove_strength() - src.updateDialog() - src.update_icon() - return + updateDialog() + update_icon() /obj/machinery/particle_accelerator/control_box/proc/strength_change() for(var/obj/structure/particle_accelerator/part in connected_parts) @@ -144,7 +141,6 @@ update_use_power(0) else if(!stat && construction_state == 3) update_use_power(1) - return /obj/machinery/particle_accelerator/control_box/process() @@ -152,13 +148,12 @@ //a part is missing! if( length(connected_parts) < 6 ) investigate_log("lost a connected part; It powered down.","singulo") - src.toggle_power() + toggle_power() return //emit some particles for(var/obj/structure/particle_accelerator/particle_emitter/PE in connected_parts) if(PE) PE.emit_particle(src.strength) - return /obj/machinery/particle_accelerator/control_box/proc/part_scan() @@ -211,11 +206,11 @@ /obj/machinery/particle_accelerator/control_box/proc/toggle_power() - src.active = !src.active + active = !active investigate_log("turned [active?"ON":"OFF"] by [usr ? usr.key : "outside forces"]","singulo") message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr.ckey]([usr]) in ([x],[y],[z])") - if(src.active) + if(active) update_use_power(2) for(var/obj/structure/particle_accelerator/part in connected_parts) part.strength = src.strength diff --git a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm index ff6a444a53..9d37c2e6b8 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm @@ -20,20 +20,16 @@ icon_state = "emitter_right" reference = "emitter_right" -/obj/structure/particle_accelerator/particle_emitter/update_icon() - ..() - return /obj/structure/particle_accelerator/particle_emitter/proc/set_delay(var/delay) if(delay && delay >= 0) - src.fire_delay = delay + fire_delay = delay return 1 return 0 - /obj/structure/particle_accelerator/particle_emitter/proc/emit_particle(var/strength = 0) - if((src.last_shot + src.fire_delay) <= world.time) - src.last_shot = world.time + if((last_shot + fire_delay) <= world.time) + last_shot = world.time var/obj/effect/accelerated_particle/A = null var/turf/T = get_step(src,dir) switch(strength) @@ -43,6 +39,8 @@ A = new/obj/effect/accelerated_particle(T, dir) if(2) A = new/obj/effect/accelerated_particle/strong(T, dir) + if(3) + A = new/obj/effect/accelerated_particle/powerful(T, dir) if(A) A.set_dir(src.dir) return 1 diff --git a/code/modules/power/singularity/particle_accelerator/particle_power.dm b/code/modules/power/singularity/particle_accelerator/particle_power.dm index a4dcb561e7..8badfab91e 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_power.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_power.dm @@ -3,8 +3,4 @@ desc_holder = "This uses electromagnetic waves to focus the Alpha-Particles." icon = 'icons/obj/machines/particle_accelerator2.dmi' icon_state = "power_box" - reference = "power_box" - -/obj/structure/particle_accelerator/power_box/update_icon() - ..() - return + reference = "power_box" \ No newline at end of file diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index bb1603b570..2e8102de81 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -1,6 +1,6 @@ // BUILDABLE SMES(Superconducting Magnetic Energy Storage) UNIT // -// Last Change 1.1.2015 by Atlantis - Happy New Year! +// Last Change 1.26.2018 by Neerti. Also signing this is dumb. // // This is subtype of SMES that should be normally used. It can be constructed, deconstructed and hacked. // It also supports RCON System which allows you to operate it remotely, if properly set. @@ -55,8 +55,10 @@ component_parts += new /obj/item/weapon/smes_coil(src) recalc_coils() - - +// Pre-installed and pre-charged SMES hidden from the station, for use in submaps. +/obj/machinery/power/smes/buildable/point_of_interest/New() + ..(1) + charge = 1e6 // Should be enough for an individual POI. diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index fbca78e07d..2acf9e57e5 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -562,6 +562,7 @@ name = "Rezadone" id = "rezadone" description = "A powder with almost magical properties, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects." + taste_description = "bitterness" reagent_state = SOLID color = "#669900" overdose = REAGENTS_OVERDOSE @@ -654,27 +655,6 @@ M << "Your mind breaks apart..." M.hallucination += 200 -/datum/reagent/rezadone - name = "Rezadone" - id = "rezadone" - description = "A powder with almost magical properties, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects." - taste_description = "bitterness" - reagent_state = SOLID - color = "#669900" - overdose = REAGENTS_OVERDOSE - scannable = 1 - -/datum/reagent/rezadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - M.adjustCloneLoss(-20 * removed) - M.adjustOxyLoss(-2 * removed) - M.heal_organ_damage(20 * removed, 20 * removed) - M.adjustToxLoss(-20 * removed) - if(dose > 3) - M.status_flags &= ~DISFIGURED - if(dose > 10) - M.make_dizzy(5) - M.make_jittery(5) - /datum/reagent/qerr_quem name = "Qerr-quem" id = "querr_quem" diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 0b853bed8c..fdc646168b 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -1988,7 +1988,7 @@ bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/onionrings - name = "Onion Soup" + name = "Onion Rings" desc = "Crispy rings." icon_state = "onionrings" trash = /obj/item/trash/plate @@ -3508,9 +3508,9 @@ ..() // potato + knife = raw sticks -/obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W,/obj/item/weapon/material/knife)) - new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(src) +/obj/item/weapon/reagent_containers/food/snacks/grown/attackby(obj/item/weapon/W, mob/user) + if(seed && seed.kitchen_tag && seed.kitchen_tag == "potato" && istype(W,/obj/item/weapon/material/knife)) + new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(get_turf(src)) user << "You cut the potato." qdel(src) else diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm index 92d17a2aba..c5bccc437d 100644 --- a/code/unit_tests/map_tests.dm +++ b/code/unit_tests/map_tests.dm @@ -39,8 +39,10 @@ exempt_from_atmos += using_map.unit_test_exempt_from_atmos.Copy() exempt_from_apc += using_map.unit_test_exempt_from_apc.Copy() + var/list/zs_to_test = using_map.unit_test_z_levels || list(1) //Either you set it, or you just get z1 + for(var/area/A in world) - if(A.z == 1 && !(A.type in exempt_areas)) + if((A.z in zs_to_test) && !(A.type in exempt_areas)) area_test_count++ var/area_good = 1 var/bad_msg = "--------------- [A.name]([A.type])" diff --git a/html/changelog.html b/html/changelog.html index 280b45a1bb..45d9cd6099 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,71 @@ -->
+

25 January 2018

+

Anewbe updated:

+ +

Arokha updated:

+ +

Atermonera updated:

+ +

Cerebulon updated:

+ +

Leshana updated:

+ +

Mechoid updated:

+ +

Neerti updated:

+ +

SunnyDaff updated:

+ +

ZeroBits updated:

+ +

battlefieldCommander updated:

+ +

12 January 2018

Atermonera updated: