diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 4e60163547..c59cc6e714 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -130,5 +130,21 @@ user.drop_item() src.throw_at(target, throw_range, throw_speed, user) +/obj/item/weapon/beach_ball/dodgeball + icon = 'icons/obj/balls_vr.dmi' + icon_state = "dodgeball" + item_state = "dodgeball" + item_icons = list(slot_l_hand_str = 'icons/mob/items/lefthand_balls_vr.dmi', slot_r_hand_str = 'icons/mob/items/righthand_balls_vr.dmi') + name = "dodgeball" + desc = "Think fast, chucklenuts!" + w_class = ITEMSIZE_LARGE //Stops people from hiding it in their bags/pockets + force = 0.1 + throwforce = 0.1 + throw_speed = 5 + throw_range = 15 + drop_sound = 'sound/items/drop/rubber.ogg' + pickup_sound = 'sound/items/pickup/rubber.ogg' + hitsound = 'sound/weapons/dodgeball.ogg' + /obj/effect/spawner name = "object spawner" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 9a72196f8d..a3430383ef 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -43,7 +43,9 @@ var/no_air = null // var/list/lights // list of all lights on this area var/list/all_doors = null //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area + var/list/all_arfgs = null //Similar, but a list of all arfgs adjacent to this area var/firedoors_closed = 0 + var/arfgs_active = 0 var/list/ambience = list() var/list/forced_ambience = null var/sound_env = STANDARD_STATION @@ -128,10 +130,11 @@ return 1 return 0 -// Either close or open firedoors depending on current alert statuses +// Either close or open firedoors and arfgs depending on current alert statuses /area/proc/firedoors_update() if(fire || party || atmosalm) firedoors_close() + arfgs_activate() // VOREStation Edit - Make the lights colored! if(fire) for(var/obj/machinery/light/L in src) @@ -142,6 +145,7 @@ // VOREStation Edit End else firedoors_open() + arfgs_deactivate() // VOREStation Edit - Put the lights back! for(var/obj/machinery/light/L in src) L.reset_alert() @@ -175,6 +179,25 @@ spawn(0) E.open() +// Activate all retention fields! +/area/proc/arfgs_activate() + if(!arfgs_active) + arfgs_active = TRUE + if(!all_arfgs) + return + for(var/obj/machinery/atmospheric_field_generator/E in all_arfgs) + E.generate_field() //don't need to check powered state like doors, the arfgs handles it on its end + E.wasactive = TRUE + +// Deactivate retention fields! +/area/proc/arfgs_deactivate() + if(arfgs_active) + arfgs_active = FALSE + if(!all_arfgs) + return + for(var/obj/machinery/atmospheric_field_generator/E in all_arfgs) + E.disable_field() + E.wasactive = FALSE /area/proc/fire_alert() if(!fire) diff --git a/code/game/jobs/job/civilian_vr.dm b/code/game/jobs/job/civilian_vr.dm index 3d7547debc..d4526e6346 100644 --- a/code/game/jobs/job/civilian_vr.dm +++ b/code/game/jobs/job/civilian_vr.dm @@ -221,7 +221,8 @@ "Actor" = /datum/alt_title/actor, "Dancer" = /datum/alt_title/dancer, "Singer" = /datum/alt_title/singer, "Magician" = /datum/alt_title/magician, "Comedian" = /datum/alt_title/comedian, "Tragedian" = /datum/alt_title/tragedian, "Clown" = /datum/alt_title/clown, "Jester" = /datum/alt_title/clown/jester,"Fool" = /datum/alt_title/clown/fool, - "Mime"= /datum/alt_title/mime,"Poseur"= /datum/alt_title/mime/poseur) //CHOMPEDIT: Adding clown + mime and their alts as alts of entertainer + "Mime"= /datum/alt_title/mime,"Poseur"= /datum/alt_title/mime/poseur, //CHOMPEDIT: Adding clown + mime and their alts as alts of entertainer + "Artist" = /datum/alt_title/artist) // Entertainer Alt Titles /datum/alt_title/actor @@ -259,3 +260,7 @@ /datum/alt_title/tragedian title = "Tragedian" title_blurb = "A Tragedian will focus on making people think about life and world around them! Life is a tragedy, and who's better to convey its emotions than you?" + +/datum/alt_title/artist + title = "Artist" + title_blurb = "An Artist's calling is to create beautiful arts! Whatever form may they take, create and have people astonished with your creativity." diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index c28268b09d..509572aa98 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -166,11 +166,12 @@ ///Assigns minimum age by race & brain type. Code says Positronic = mechanical and Drone = digital because nothing can be simple. ///Will first check based on brain type, then based on species. /datum/job/proc/get_min_age(species_name, brain_type) - return 18 // VOREStation Edit - Minimum character age by rules anyway, might as well return 18 instead of 0 or 1 or whatever. - //return (brain_type && LAZYACCESS(min_age_by_species, brain_type)) || LAZYACCESS(min_age_by_species, species_name) || minimum_character_age //VOREStation Edit + return minimum_character_age // VOREStation Edit - Minimum character age by rules is 18, return default which is standard for all species + //return (brain_type && LAZYACCESS(min_age_by_species, brain_type)) || LAZYACCESS(min_age_by_species, species_name) || minimum_character_age //VOREStation Removal /datum/job/proc/get_ideal_age(species_name, brain_type) - return (brain_type && LAZYACCESS(ideal_age_by_species, brain_type)) || LAZYACCESS(ideal_age_by_species, brain_type) || ideal_character_age + return ideal_character_age // VOREStation Edit - Minimum character age by rules is 18, return default which is standard for all species + //return (brain_type && LAZYACCESS(ideal_age_by_species, brain_type)) || LAZYACCESS(ideal_age_by_species, brain_type) || ideal_character_age //VOREStation Removal /datum/job/proc/is_species_banned(species_name, brain_type) return FALSE // VOREStation Edit - Any species can be any job. diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index 6ae91b66dd..23adcc1daf 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -100,6 +100,10 @@ var/list/whitelist = list() if(!M || !module) return 0 + //Module is not even whitelisted + if(!(module in whitelisted_module_types)) + return 1 + //If we have a loaded file, search it if(alien_whitelist) for (var/s in alien_whitelist) diff --git a/code/game/machinery/atm_ret_field.dm b/code/game/machinery/atm_ret_field.dm new file mode 100644 index 0000000000..9e9a2af168 --- /dev/null +++ b/code/game/machinery/atm_ret_field.dm @@ -0,0 +1,233 @@ +/obj/machinery/atmospheric_field_generator + name = "atmospheric retention field generator" + desc = "A floor-mounted piece of equipment that generates an atmosphere-retaining energy field when powered and activated. Linked to environmental alarm systems and will automatically activate when hazardous conditions are detected.

Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences." + icon = 'icons/obj/atm_fieldgen.dmi' + icon_state = "arfg_off" + anchored = TRUE + opacity = FALSE + density = FALSE + power_channel = ENVIRON //so they shut off last + use_power = USE_POWER_IDLE + idle_power_usage = 10 + active_power_usage = 2500 + var/ispowered = TRUE + var/isactive = FALSE + var/wasactive = FALSE //controls automatic reboot after power-loss + var/alwaysactive = FALSE //for a special subtype + + //how long it takes us to reboot if we're shut down by an EMP + var/reboot_delay_min = 50 + var/reboot_delay_max = 75 + + var/hatch_open = FALSE + var/wires_intact = TRUE + var/list/areas_added + var/field_type = /obj/structure/atmospheric_retention_field + circuit = /obj/item/weapon/circuitboard/arf_generator + +/obj/machinery/atmospheric_field_generator/impassable + desc = "An older model of ARF-G that generates an impassable retention field. Works just as well as the modern variety, but is slightly more energy-efficient.

Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences." + active_power_usage = 2000 + field_type = /obj/structure/atmospheric_retention_field/impassable + +/obj/machinery/atmospheric_field_generator/perma + name = "static atmospheric retention field generator" + desc = "A floor-mounted piece of equipment that generates an atmosphere-retaining energy field when powered and activated. This model is designed to always be active, though the field will still drop from loss of power or electromagnetic interference.

Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences." + alwaysactive = TRUE + active_power_usage = 2000 + +/obj/machinery/atmospheric_field_generator/perma/impassable + active_power_usage = 1500 + field_type = /obj/structure/atmospheric_retention_field/impassable + +/obj/machinery/atmospheric_field_generator/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(W.is_crowbar() && isactive) + if(!src) return + to_chat(user, "You can't open the ARF-G whilst it's running!") + return + if(W.is_crowbar() && !isactive) + if(!src) return + to_chat(user, "You [hatch_open? "close" : "open"] \the [src]'s access hatch.") + hatch_open = !hatch_open + update_icon() + if(alwaysactive && wires_intact) + generate_field() + return + if(hatch_open && W.is_multitool()) + if(!src) return + to_chat(user, "You toggle \the [src]'s activation behavior to [alwaysactive? "emergency" : "always-on"].") + alwaysactive = !alwaysactive + update_icon() + return + if(hatch_open && W.is_wirecutter()) + if(!src) return + to_chat(user, "You [wires_intact? "cut" : "mend"] \the [src]'s wires!") + wires_intact = !wires_intact + update_icon() + return + if(hatch_open && istype(W,/obj/item/weapon/weldingtool)) + if(!src) return + var/obj/item/weapon/weldingtool/WT = W + if(!WT.isOn()) return + if(WT.get_fuel() < 5) // uses up 5 fuel. + to_chat(user, "You need more fuel to complete this task.") + return + user.visible_message("[user] starts to disassemble \the [src].", "You start to disassemble \the [src].") + playsound(src, WT.usesound, 50, 1) + if(do_after(user,15 * W.toolspeed)) + if(!src || !user || !WT.remove_fuel(5, user)) return + to_chat(user, "You fully disassemble \the [src]. There were no salvageable parts.") + qdel(src) + return + +/obj/machinery/atmospheric_field_generator/perma/Initialize() + generate_field() + +/obj/machinery/atmospheric_field_generator/update_icon() + if(stat & BROKEN) + icon_state = "arfg_broken" + else if(hatch_open && wires_intact) + icon_state = "arfg_open_wires" + else if(hatch_open && !wires_intact) + icon_state = "arfg_open_wirescut" + else if(isactive) + icon_state = "arfg_on" + else + icon_state = "arfg_off" + +/obj/machinery/atmospheric_field_generator/power_change() + var/oldstat + ..() + if(!(stat & NOPOWER)) + ispowered = 1 + update_icon() + if(alwaysactive || wasactive) //reboot our field if we were on or are supposed to be always-on + generate_field() + if(stat != oldstat && isactive && (stat & NOPOWER)) + ispowered = 0 + disable_field() + update_icon() + +/obj/machinery/atmospheric_field_generator/emp_act() + . = ..() + disable_field() //shutting dowwwwwwn + if(alwaysactive || wasactive) //reboot after a short delay if we were online before + spawn(rand(reboot_delay_min,reboot_delay_max)) + generate_field() + +/obj/machinery/atmospheric_field_generator/ex_act(severity) + switch(severity) + if(1) + disable_field() + qdel(src) + return + if(2) + stat |= BROKEN + update_icon() + src.visible_message("The ARF-G cracks and shatters!","You hear an uncomfortable metallic crunch.") + disable_field() + if(3) + emp_act() + return + +/obj/machinery/atmospheric_field_generator/proc/generate_field() + if(!ispowered || hatch_open || !wires_intact || isactive) //if it's not powered, the hatch is open, the wires are busted, or it's already on, don't do anything + return + else + isactive = 1 + icon_state = "arfg_on" + new field_type (src.loc) + src.visible_message("The ARF-G crackles to life!","You hear an ARF-G coming online!") + update_use_power(USE_POWER_ACTIVE) + return + +/obj/machinery/atmospheric_field_generator/proc/disable_field() + if(isactive) + icon_state = "arfg_off" + for(var/obj/structure/atmospheric_retention_field/F in loc) + qdel(F) + src.visible_message("The ARF-G shuts down with a low hum.","You hear an ARF-G powering down.") + update_use_power(USE_POWER_IDLE) + isactive = 0 + return + +/obj/machinery/atmospheric_field_generator/Initialize() + . = ..() + //Delete ourselves if we find extra mapped in arfgs + for(var/obj/machinery/atmospheric_field_generator/F in loc) + if(F != src) + log_debug("Duplicate ARFGS at [x],[y],[z]") + return INITIALIZE_HINT_QDEL + + var/area/A = get_area(src) + ASSERT(istype(A)) + + LAZYADD(A.all_arfgs, src) + areas_added = list(A) + + for(var/direction in cardinal) + A = get_area(get_step(src,direction)) + if(istype(A) && !(A in areas_added)) + LAZYADD(A.all_arfgs, src) + areas_added += A + +/obj/structure/atmospheric_retention_field + name = "atmospheric retention field" + desc = "A shimmering forcefield that keeps the good air inside and the bad air outside. This field has been modulated so that it doesn't impede movement or projectiles.

Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences." + icon = 'icons/obj/atm_fieldgen.dmi' + icon_state = "arfg_field" + anchored = TRUE + density = FALSE + opacity = 0 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER + //mouse_opacity = 0 + can_atmos_pass = ATMOS_PASS_NO + var/basestate = "arfg_field" + + light_range = 3 + light_power = 1 + light_color = "#FFFFFF" + light_on = TRUE + +/obj/structure/atmospheric_retention_field/update_icon() + cut_overlays() //overlays.Cut() + var/list/dirs = list() + for(var/obj/structure/atmospheric_retention_field/F in orange(src,1)) + dirs += get_dir(src, F) + + var/list/connections = dirs_to_corner_states(dirs) + + icon_state = "" + for(var/i = 1 to 4) + var/image/I = image(icon, "[basestate][connections[i]]", dir = 1<<(i-1)) + add_overlay(I) + + return + +/obj/structure/atmospheric_retention_field/Initialize() + . = ..() + update_nearby_tiles() //Force ZAS update + update_connections(1) + update_icon() + +/obj/structure/atmospheric_retention_field/Destroy() + for(var/obj/structure/atmospheric_retention_field/W in orange(1, src.loc)) + W.update_connections(1) + update_nearby_tiles() //Force ZAS update + . = ..() + +/obj/structure/atmospheric_retention_field/attack_hand(mob/user as mob) + if(density) + visible_message("You touch the retention field, and it crackles faintly. Tingly!") + else + visible_message("You try to touch the retention field, but pass through it like it isn't even there.") + +/obj/structure/atmospheric_retention_field/ex_act() + return + +/obj/structure/atmospheric_retention_field/impassable + desc = "A shimmering forcefield that keeps the good air inside and the bad air outside. It seems fairly solid, almost like it's made out of some kind of hardened light.

Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences." + icon = 'icons/obj/atm_fieldgen.dmi' + icon_state = "arfg_field" + density = TRUE \ No newline at end of file diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 78f8569cb4..be8639e4bc 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -95,7 +95,7 @@ data["real_name"] = user.real_name data["allow_items"] = allow_items data["crew"] = frozen_crew - + var/list/items = list() if(allow_items) for(var/F in frozen_items) @@ -250,6 +250,10 @@ /obj/machinery/cryopod/robot/door/dorms name = "Residential District Elevator" desc = "A small elevator that goes down to the deeper section of the colony." + icon = 'icons/obj/Cryogenic2_vr.dmi' + icon_state = "lift_closed" + base_icon_state = "lift_open" + occupied_icon_state = "lift_closed" on_store_message = "has departed for the residential district." on_store_name = "Residential Oversight" on_enter_occupant_message = "The elevator door closes slowly, ready to bring you down to the residential district." @@ -259,6 +263,10 @@ /obj/machinery/cryopod/robot/door/travel name = "Passenger Elevator" desc = "A small elevator that goes down to the passenger section of the vessel." + icon = 'icons/obj/Cryogenic2_vr.dmi' + icon_state = "lift_closed" + base_icon_state = "lift_open" + occupied_icon_state = "lift_closed" on_store_message = "is slated to depart from the colony." on_store_name = "Travel Oversight" on_enter_occupant_message = "The elevator door closes slowly, ready to bring you down to the hell that is economy class travel." @@ -491,7 +499,7 @@ for(var/datum/data/record/G in data_core.general) if((G.fields["name"] == to_despawn.real_name)) qdel(G) - + // Also check the hidden version of each datacore, if they're an offmap role. var/datum/job/J = SSjob.get_job(job) if(J?.offmap_spawn) diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index ed4b086e73..d651ad2025 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -221,6 +221,11 @@ frame_style = FRAME_STYLE_WALL x_offset = 28 y_offset = 28 + +/datum/frame/frame_types/arfgs + name = "ARF Generator" + frame_class = FRAME_CLASS_MACHINE + frame_size = 3 ////////////////////////////// // Frame Object (Structure) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 351e6b8cf8..ac7658bc73 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -4,7 +4,7 @@ w_class = ITEMSIZE_NORMAL blocks_emissive = EMISSIVE_BLOCK_GENERIC - matter = list(MAT_STEEL = 1) + //matter = list(MAT_STEEL = 1) var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/randpixel = 6 @@ -251,7 +251,7 @@ var/obj/item/weapon/storage/S = src.loc if(!S.remove_from_storage(src)) return - + src.pickup(user) src.throwing = 0 if (src.loc == user) @@ -260,7 +260,7 @@ else if(isliving(src.loc)) return - + if(user.put_in_active_hand(src)) if(isturf(old_loc)) var/obj/effect/temporary_effect/item_pickup_ghost/ghost = new(old_loc) @@ -834,7 +834,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(!inhands) apply_blood(standing) //Some items show blood when bloodied apply_accessories(standing) //Some items sport accessories like webbing - + //Apply overlays to our...overlay apply_overlays(standing) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 9595f1ba80..3b20ccbb5c 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -1,3 +1,16 @@ +/* + * Contains: + * Flashlights + * Lamps + * Flares + * Chemlights + * Slime Extract + */ + +/* + * Flashlights + */ + /obj/item/device/flashlight name = "flashlight" desc = "A hand-held emergency light." @@ -7,15 +20,15 @@ slot_flags = SLOT_BELT matter = list(MAT_STEEL = 50,MAT_GLASS = 20) action_button_name = "Toggle Flashlight" - + light_system = MOVABLE_LIGHT_DIRECTIONAL light_range = 4 //luminosity when on light_power = 0.8 //lighting power when on light_color = "#FFFFFF" //LIGHT_COLOR_INCANDESCENT_FLASHLIGHT //lighting colour when on light_cone_y_offset = -7 - + var/on = 0 - + var/obj/item/weapon/cell/cell var/cell_type = /obj/item/weapon/cell/device var/power_usage = 1 @@ -26,7 +39,7 @@ if(power_use && cell_type) cell = new cell_type(src) - + update_brightness() /obj/item/device/flashlight/Destroy() @@ -232,24 +245,34 @@ w_class = ITEMSIZE_TINY power_use = 0 -/obj/item/device/flashlight/color //Default color is blue, just roll with it. +/obj/item/device/flashlight/color //Default color is blue name = "blue flashlight" - desc = "A hand-held emergency light. This one is blue." + desc = "A small flashlight. This one is blue." icon_state = "flashlight_blue" +/obj/item/device/flashlight/color/green + name = "green flashlight" + desc = "A small flashlight. This one is green." + icon_state = "flashlight_green" + +/obj/item/device/flashlight/color/purple + name = "purple flashlight" + desc = "A small flashlight. This one is purple." + icon_state = "flashlight_purple" + /obj/item/device/flashlight/color/red name = "red flashlight" - desc = "A hand-held emergency light. This one is red." + desc = "A small flashlight. This one is red." icon_state = "flashlight_red" /obj/item/device/flashlight/color/orange name = "orange flashlight" - desc = "A hand-held emergency light. This one is orange." + desc = "A small flashlight. This one is orange." icon_state = "flashlight_orange" /obj/item/device/flashlight/color/yellow name = "yellow flashlight" - desc = "A hand-held emergency light. This one is yellow." + desc = "A small flashlight. This one is yellow." icon_state = "flashlight_yellow" /obj/item/device/flashlight/maglight @@ -273,7 +296,11 @@ w_class = ITEMSIZE_TINY power_use = 0 -// the desk lamps are a bit special +/* + * Lamps + */ + +// pixar desk lamp /obj/item/device/flashlight/lamp name = "desk lamp" desc = "A desk lamp with an adjustable mount." @@ -286,14 +313,6 @@ on = 1 light_system = STATIC_LIGHT - -// green-shaded desk lamp -/obj/item/device/flashlight/lamp/green - desc = "A classic green-shaded desk lamp." - icon_state = "lampgreen" - center_of_mass = list("x" = 15,"y" = 11) - light_color = "#FFC58F" - /obj/item/device/flashlight/lamp/verb/toggle_light() set name = "Toggle light" set category = "Object" @@ -302,7 +321,23 @@ if(!usr.stat) attack_self(usr) -// FLARES +// green-shaded desk lamp +/obj/item/device/flashlight/lamp/green + desc = "A classic green-shaded desk lamp." + icon_state = "lampgreen" + center_of_mass = list("x" = 15,"y" = 11) + light_color = "#FFC58F" + +// clown lamp +/obj/item/device/flashlight/lamp/clown + desc = "A whacky banana peel shaped lamp." + icon_state = "bananalamp" + center_of_mass = list("x" = 15,"y" = 11) + + +/* + * Flares + */ /obj/item/device/flashlight/flare name = "flare" @@ -368,18 +403,20 @@ START_PROCESSING(SSobj, src) return 1 -//Glowsticks +/* + * Chemlights + */ /obj/item/device/flashlight/glowstick name = "green glowstick" - desc = "A green military-grade glowstick." + desc = "A green military-grade chemical light." w_class = ITEMSIZE_SMALL light_system = MOVABLE_LIGHT light_range = 4 light_power = 0.9 light_color = "#49F37C" - icon_state = "glowstick" - item_state = "glowstick" + icon_state = "glowstick_green" + item_state = "glowstick_green" var/fuel = 0 power_use = 0 @@ -414,32 +451,45 @@ /obj/item/device/flashlight/glowstick/red name = "red glowstick" - desc = "A red military-grade glowstick." + desc = "A red military-grade chemical light." light_color = "#FC0F29" icon_state = "glowstick_red" item_state = "glowstick_red" /obj/item/device/flashlight/glowstick/blue name = "blue glowstick" - desc = "A blue military-grade glowstick." + desc = "A blue military-grade chemical light." light_color = "#599DFF" icon_state = "glowstick_blue" item_state = "glowstick_blue" /obj/item/device/flashlight/glowstick/orange name = "orange glowstick" - desc = "A orange military-grade glowstick." + desc = "A orange military-grade chemical light." light_color = "#FA7C0B" icon_state = "glowstick_orange" item_state = "glowstick_orange" /obj/item/device/flashlight/glowstick/yellow name = "yellow glowstick" - desc = "A yellow military-grade glowstick." + desc = "A yellow military-grade chemical light." light_color = "#FEF923" icon_state = "glowstick_yellow" item_state = "glowstick_yellow" +/obj/item/device/flashlight/glowstick/radioisotope + name = "radioisotope glowstick" + desc = "A radioisotope powered chemical light. Escaping particles light up the area far brighter on similar levels to flares and for longer" + icon_state = "glowstick_isotope" + item_state = "glowstick_isotope" + + light_range = 8 + light_power = 0.1 + light_color = "#49F37C" + +/* + * Slime Extract + */ /obj/item/device/flashlight/slime gender = PLURAL diff --git a/code/game/objects/items/devices/flashlight_vr.dm b/code/game/objects/items/devices/flashlight_vr.dm deleted file mode 100644 index 876dddc76d..0000000000 --- a/code/game/objects/items/devices/flashlight_vr.dm +++ /dev/null @@ -1,9 +0,0 @@ -/obj/item/device/flashlight/glowstick/radioisotope - name = "radioisotope glowstick" - desc = "A radioisotope powered glowstick. Escaping particles light up the area far brighter on similar levels to flares and for longer" - icon_state = "glowstick_blue" - item_state = "glowstick_blue" - - light_range = 8 - light_power = 0.1 - light_color = "#599DFF" diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 775b27cc08..c8c8d376c8 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -249,6 +249,12 @@ drop_sound = 'sound/items/drop/soda.ogg' pickup_sound = 'sound/items/pickup/soda.ogg' +/obj/item/trash/tomato + name = "empty tomato soup can" + icon_state = "tomato" + drop_sound = 'sound/items/drop/soda.ogg' + pickup_sound = 'sound/items/pickup/soda.ogg' + /obj/item/trash/spinach name = "empty spinach can" icon_state = "spinach" @@ -410,3 +416,14 @@ name = "burrito packaging" icon_state = "smolburrito" +/obj/item/trash/brainzsnax + name = "\improper BrainzSnax can" + icon_state = "brainzsnax" + drop_sound = 'sound/items/drop/soda.ogg' + pickup_sound = 'sound/items/pickup/soda.ogg' + +/obj/item/trash/brainzsnaxred + name = "\improper BrainzSnax RED can" + icon_state = "brainzsnaxred" + drop_sound = 'sound/items/drop/soda.ogg' + pickup_sound = 'sound/items/pickup/soda.ogg' \ No newline at end of file diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index ade55cbeca..5a751e3527 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -207,8 +207,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM to_chat(M, "Your [name] goes out.") M.remove_from_mob(src) //un-equip it so the overlays can update M.update_inv_wear_mask(0) - M.update_inv_l_hand(0) - M.update_inv_r_hand(1) qdel(src) else new /obj/effect/decal/cleanable/ash(T) @@ -221,8 +219,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_state = initial(icon_state) item_state = initial(item_state) M.update_inv_wear_mask(0) - M.update_inv_l_hand(0) - M.update_inv_r_hand(1) smoketime = 0 reagents.clear_reagents() name = "empty [initial(name)]" diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm index a3c755a3ac..db3106e635 100644 --- a/code/game/objects/items/weapons/circuitboards/frame.dm +++ b/code/game/objects/items/weapons/circuitboards/frame.dm @@ -261,3 +261,13 @@ /obj/item/weapon/stock_parts/spring = 1, /obj/item/stack/cable_coil = 5) +/obj/item/weapon/circuitboard/arf_generator + name = T_BOARD("atmospheric field generator") + build_path = /obj/machinery/atmospheric_field_generator + board_type = new /datum/frame/frame_types/arfgs + origin_tech = list(TECH_MAGNET = 4, TECH_POWER = 4, TECH_BIO = 3) + req_components = list( + /obj/item/weapon/stock_parts/micro_laser/high = 2, //field emitters + /obj/item/weapon/stock_parts/scanning_module = 1, //atmosphere sensor + /obj/item/weapon/stock_parts/capacitor/adv = 1, //for the JUICE + /obj/item/stack/cable_coil = 10) \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm index c24b296412..3f97fad2f7 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm @@ -17,4 +17,6 @@ build_path = /obj/machinery/mining/brace board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) - req_components = list() + req_components = list( + /obj/item/weapon/stock_parts/manipulator = 1 + ) diff --git a/code/game/objects/items/weapons/storage/boxes_vr.dm b/code/game/objects/items/weapons/storage/boxes_vr.dm index 1f2bc91404..e234f22d4a 100644 --- a/code/game/objects/items/weapons/storage/boxes_vr.dm +++ b/code/game/objects/items/weapons/storage/boxes_vr.dm @@ -25,3 +25,14 @@ /obj/item/weapon/storage/secure/briefcase/trashmoney starts_with = list(/obj/item/weapon/spacecash/c200 = 10) + +/obj/item/weapon/storage/box/brainzsnax + name = "\improper BrainzSnax box" + icon_state = "brainzsnax_box" + desc = "A box designed to hold canned food. This one has BrainzSnax branding printed on it." + can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/canned) + max_storage_space = ITEMSIZE_COST_NORMAL * 6 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax = 6) + +/obj/item/weapon/storage/box/brainzsnax/red + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red = 6) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index dd2e2603f3..67ac33d136 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -69,6 +69,7 @@ throwforce = 2 slot_flags = SLOT_BELT max_storage_space = ITEMSIZE_COST_TINY * 5 //CHOMPEdit + can_hold = list(/obj/item/weapon/flame/candle) starts_with = list(/obj/item/weapon/flame/candle = 5) /obj/item/weapon/storage/fancy/whitecandle_box @@ -81,6 +82,7 @@ throwforce = 2 slot_flags = SLOT_BELT max_storage_space = ITEMSIZE_COST_TINY * 5 //CHOMPEdit + can_hold = list(/obj/item/weapon/flame/candle) starts_with = list(/obj/item/weapon/flame/candle/white = 5) /obj/item/weapon/storage/fancy/blackcandle_box @@ -93,6 +95,7 @@ throwforce = 2 slot_flags = SLOT_BELT max_storage_space = ITEMSIZE_COST_TINY * 5 //CHOMPEdit + can_hold = list(/obj/item/weapon/flame/candle) starts_with = list(/obj/item/weapon/flame/candle/black = 5) diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index e62ac35ea8..bd80bf247e 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -1,7 +1,10 @@ +/* + * Toolboxes + */ /obj/item/weapon/storage/toolbox name = "toolbox" desc = "Danger. Very robust." - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' icon_state = "red" item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red") center_of_mass = list("x" = 16,"y" = 11) @@ -18,8 +21,10 @@ drop_sound = 'sound/items/drop/toolbox.ogg' pickup_sound = 'sound/items/pickup/toolbox.ogg' +//Emergency /obj/item/weapon/storage/toolbox/emergency name = "emergency toolbox" + icon = 'icons/obj/storage_vr.dmi' icon_state = "red" item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red") starts_with = list( @@ -34,8 +39,10 @@ new /obj/item/device/flashlight/flare(src) . = ..() +//Mechanical /obj/item/weapon/storage/toolbox/mechanical name = "mechanical toolbox" + icon = 'icons/obj/storage_vr.dmi' icon_state = "blue" item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue") starts_with = list( @@ -47,8 +54,10 @@ /obj/item/weapon/tool/wirecutters ) +//Electrical /obj/item/weapon/storage/toolbox/electrical name = "electrical toolbox" + icon = 'icons/obj/storage_vr.dmi' icon_state = "yellow" item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow") starts_with = list( @@ -67,8 +76,10 @@ new /obj/item/stack/cable_coil/random(src,30) calibrate_size() +//Syndicate /obj/item/weapon/storage/toolbox/syndicate name = "black and red toolbox" + icon = 'icons/obj/storage_vr.dmi' icon_state = "syndicate" item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi") origin_tech = list(TECH_COMBAT = 1, TECH_ILLEGAL = 1) @@ -94,9 +105,43 @@ /obj/item/device/analyzer ) +//Brass +/obj/item/weapon/storage/toolbox/brass + name = "brass toolbox" + icon = 'icons/obj/storage_vr.dmi' + icon_state = "brass" + item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow") + starts_with = list( + /obj/item/weapon/tool/crowbar/brass, + /obj/item/weapon/tool/wirecutters/brass, + /obj/item/weapon/tool/screwdriver/brass, + /obj/item/weapon/tool/wrench/brass, + /obj/item/weapon/weldingtool/brass + ) + +//Hydro +/obj/item/weapon/storage/toolbox/hydro + name = "hydroponic toolbox" + icon = 'icons/obj/storage_vr.dmi' + icon_state = "green" + item_state_slots = list(slot_r_hand_str = "toolbox_green", slot_l_hand_str = "toolbox_green") + starts_with = list( + /obj/item/device/analyzer/plant_analyzer, + /obj/item/weapon/material/minihoe, + /obj/item/weapon/material/knife/machete/hatchet, + /obj/item/weapon/tool/wirecutters/clippers/trimmers, + /obj/item/weapon/reagent_containers/spray/plantbgone, + /obj/item/weapon/reagent_containers/glass/beaker + ) + +/* + * Lunchboxes + */ + /obj/item/weapon/storage/toolbox/lunchbox max_storage_space = ITEMSIZE_COST_SMALL * 4 //slightly smaller than a toolbox name = "rainbow lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_rainbow" item_state_slots = list(slot_r_hand_str = "toolbox_pink", slot_l_hand_str = "toolbox_pink") desc = "A little lunchbox. This one is the colors of the rainbow!" @@ -125,6 +170,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/heart name = "heart lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_lovelyhearts" item_state_slots = list(slot_r_hand_str = "toolbox_pink", slot_l_hand_str = "toolbox_pink") desc = "A little lunchbox. This one has cute little hearts on it!" @@ -134,6 +180,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/cat name = "cat lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_sciencecatshow" item_state_slots = list(slot_r_hand_str = "toolbox_green", slot_l_hand_str = "toolbox_green") desc = "A little lunchbox. This one has a cute little science cat from a popular show on it!" @@ -143,6 +190,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/nt name = "NanoTrasen brand lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_nanotrasen" item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue") desc = "A little lunchbox. This one is branded with the NanoTrasen logo!" @@ -152,6 +200,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/mars name = "\improper Mojave university lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_marsuniversity" item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red") desc = "A little lunchbox. This one is branded with the Mojave university logo!" @@ -161,6 +210,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/cti name = "\improper CTI lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_cti" item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue") desc = "A little lunchbox. This one is branded with the CTI logo!" @@ -170,6 +220,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/nymph name = "\improper Diona nymph lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_dionanymph" item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow") desc = "A little lunchbox. This one is an adorable Diona nymph on the side!" @@ -179,6 +230,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/syndicate name = "black and red lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_syndie" item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi") desc = "A little lunchbox. This one is a sleek black and red, made of a durable steel!" diff --git a/code/game/objects/items/weapons/tools/brass.dm b/code/game/objects/items/weapons/tools/brass.dm new file mode 100644 index 0000000000..eedebe3220 --- /dev/null +++ b/code/game/objects/items/weapons/tools/brass.dm @@ -0,0 +1,32 @@ +/* + * Brass Tools + */ + +//Crowbar +/obj/item/weapon/tool/crowbar/brass + icon_state = "crowbar_brass" + item_state = "crowbar" + +//Cutters +/obj/item/weapon/tool/wirecutters/brass + icon_state = "cutters_brass" + item_state = "cutters_yellow" + +//Screwdriver +/obj/item/weapon/tool/screwdriver/brass + icon_state = "screwdriver_brass" + item_state = "screwdriver_black" + +//Wrench +/obj/item/weapon/tool/wrench/brass + icon_state = "wrench_brass" + item_state = "wrench_brass" + +//Welder +/obj/item/weapon/weldingtool/brass + name = "brass welding tool" + desc = "A welder made from brass fittings." + icon_state = "brasswelder" + max_fuel = 20 + origin_tech = list(TECH_ENGINEERING = 2, TECH_PHORON = 2) + matter = list(MAT_STEEL = 70, MAT_GLASS = 60) \ No newline at end of file diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm index 0d34937656..9da82688c3 100644 --- a/code/game/objects/items/weapons/tools/crowbar.dm +++ b/code/game/objects/items/weapons/tools/crowbar.dm @@ -1,7 +1,6 @@ /* * Crowbar */ - /obj/item/weapon/tool/crowbar name = "crowbar" desc = "Used to remove floors and to pry open doors." @@ -27,6 +26,10 @@ icon_state = "red_crowbar" item_state = "crowbar_red" +/obj/item/weapon/tool/crowbar/old + icon = 'icons/obj/tools.dmi' + icon_state = "old_crowbar" + item_state = "crowbar" /datum/category_item/catalogue/anomalous/precursor_a/alien_crowbar name = "Precursor Alpha Object - Hard Light Pry Tool" diff --git a/code/game/objects/items/weapons/tools/crowbar_vr.dm b/code/game/objects/items/weapons/tools/crowbar_vr.dm index b376c15af8..b846a0e294 100644 --- a/code/game/objects/items/weapons/tools/crowbar_vr.dm +++ b/code/game/objects/items/weapons/tools/crowbar_vr.dm @@ -7,11 +7,11 @@ desc = "A steel bar with a wedge, designed specifically for opening unpowered doors in an emergency. It comes in a variety of configurations - collect them all!" icon = 'icons/obj/tools_vr.dmi' icon_state = "prybar" + item_state = "crowbar" slot_flags = SLOT_BELT force = 4 throwforce = 5 pry = 1 - item_state = "crowbar" w_class = ITEMSIZE_SMALL origin_tech = list(TECH_ENGINEERING = 1) matter = list(MAT_STEEL = 30) diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 34a824112c..ab673d3fc0 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -21,7 +21,7 @@ //R&D tech level origin_tech = list(TECH_ENGINEERING = 1) - + tool_qualities = list(TOOL_WELDER) //Welding tool specific stuff @@ -375,7 +375,7 @@ /obj/item/weapon/weldingtool/hugetank name = "upgraded welding tool" desc = "A much larger welder with a huge tank." - icon_state = "indwelder" + icon_state = "upindwelder" max_fuel = 80 w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_ENGINEERING = 3) @@ -392,6 +392,9 @@ toolspeed = 2 eye_safety_modifier = 1 // Safer on eyes. +/obj/item/weapon/weldingtool/mini/two + icon_state = "miniwelder2" + /datum/category_item/catalogue/anomalous/precursor_a/alien_welder name = "Precursor Alpha Object - Self Refueling Exothermic Tool" desc = "An unwieldly tool which somewhat resembles a weapon, due to \ diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm index a8f64d4f10..6e5973f0c3 100644 --- a/code/game/objects/items/weapons/tools/wirecutters.dm +++ b/code/game/objects/items/weapons/tools/wirecutters.dm @@ -6,6 +6,7 @@ desc = "This cuts wires." icon = 'icons/obj/tools.dmi' icon_state = "cutters" + item_state = "cutters" center_of_mass = list("x" = 18,"y" = 10) slot_flags = SLOT_BELT force = 6 @@ -26,9 +27,20 @@ var/random_color = TRUE /obj/item/weapon/tool/wirecutters/New() - if(random_color && prob(50)) - icon_state = "cutters-y" - item_state = "cutters_yellow" + if(random_color) + switch(pick("red","blue","yellow")) + if ("red") + icon_state = "cutters" + item_state = "cutters" + if ("blue") + icon_state = "cutters-b" + item_state = "cutters_blue" + if ("yellow") + icon_state = "cutters-y" + item_state = "cutters_yellow" + + if (prob(75)) + src.pixel_y = rand(0, 16) ..() /obj/item/weapon/tool/wirecutters/attack(mob/living/carbon/C as mob, mob/user as mob) diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm index 052eae0d2c..634382ff11 100644 --- a/code/game/objects/items/weapons/tools/wrench.dm +++ b/code/game/objects/items/weapons/tools/wrench.dm @@ -25,6 +25,14 @@ usesound = 'sound/items/drill_use.ogg' toolspeed = 0.5 +/obj/item/weapon/tool/wrench/pipe + name = "pipe wrench" + desc = "A wrench used for plumbing. Can make a good makeshift weapon." + icon_state = "pipe_wrench" + slot_flags = SLOT_BELT + force = 8 + throwforce = 10 + /obj/item/weapon/tool/wrench/hybrid // Slower and bulkier than normal power tools, but it has the power of reach. If reach even worked half the time. name = "strange wrench" desc = "A wrench with many common uses. Can be usually found in your hand." @@ -40,7 +48,6 @@ toolspeed = 0.5 reach = 2 - /datum/category_item/catalogue/anomalous/precursor_a/alien_wrench name = "Precursor Alpha Object - Fastener Torque Tool" desc = "This is an object that has a distinctive tool shape. \ diff --git a/code/game/objects/random/mapping_vr.dm b/code/game/objects/random/mapping_vr.dm index b9ebfd1dc0..3075c40415 100644 --- a/code/game/objects/random/mapping_vr.dm +++ b/code/game/objects/random/mapping_vr.dm @@ -8,14 +8,21 @@ /obj/random/empty_or_lootable_crate/item_to_spawn() return pick(/obj/random/crate, /obj/random/multiple/corp_crate) - + /obj/random/forgotten_tram name = "random forgotten tram item" desc = "Spawns a random item that someone might accidentally leave on a tram. Sometimes spawns nothing." spawn_nothing_percentage = 30 /obj/random/forgotten_tram/item_to_spawn() - return pick(prob(2);/obj/item/device/flashlight, + return pick( + prob(2);/obj/item/device/flashlight, + prob(2);/obj/item/device/flashlight/color, + prob(2);/obj/item/device/flashlight/color/green, + prob(2);/obj/item/device/flashlight/color/purple, + prob(2);/obj/item/device/flashlight/color/red, + prob(2);/obj/item/device/flashlight/color/orange, + prob(2);/obj/item/device/flashlight/color/yellow, prob(2);/obj/item/device/flashlight/glowstick, prob(2);/obj/item/device/flashlight/glowstick/blue, prob(1);/obj/item/device/flashlight/glowstick/orange, diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index 0d85609223..4726aa3a10 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -972,3 +972,21 @@ prob(5);/obj/item/weapon/storage/pouch/baton/full, prob(1);/obj/item/weapon/storage/pouch/holding ) + +/obj/random/flashlight + name = "Random Flashlight" + desc = "This is a random storage pouch." + icon = 'icons/obj/lighting.dmi' + icon_state = "random_flashlight" + +/obj/random/flashlight/item_to_spawn() + return pick( + prob(8);/obj/item/device/flashlight, + prob(6);/obj/item/device/flashlight/color, + prob(6);/obj/item/device/flashlight/color/green, + prob(6);/obj/item/device/flashlight/color/purple, + prob(6);/obj/item/device/flashlight/color/red, + prob(6);/obj/item/device/flashlight/color/orange, + prob(6);/obj/item/device/flashlight/color/yellow, + prob(2);/obj/item/device/flashlight/maglight + ) \ No newline at end of file diff --git a/code/game/turfs/simulated/fancy_shuttles.dm b/code/game/turfs/simulated/fancy_shuttles.dm index 31f4681da9..2de10aeb38 100644 --- a/code/game/turfs/simulated/fancy_shuttles.dm +++ b/code/game/turfs/simulated/fancy_shuttles.dm @@ -301,6 +301,16 @@ GLOBAL_LIST_EMPTY(fancy_shuttles) /obj/effect/fancy_shuttle_floor_preview/delivery icon = 'icons/turf/fancy_shuttles/delivery_preview.dmi' +/** + * Tether Cargo shuttle + * North facing: W:8, H:12 + */ +/obj/effect/fancy_shuttle/tether_cargo + icon = 'icons/turf/fancy_shuttles/tether_cargo_preview.dmi' + split_file = 'icons/turf/fancy_shuttles/tether_cargo.dmi' +/obj/effect/fancy_shuttle_floor_preview/tether_cargo + icon = 'icons/turf/fancy_shuttles/tether_cargo_preview.dmi' + /** * Wagon * North facing: W:5, H:13 diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index bd4fdca814..22af37dd53 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -9,4 +9,9 @@ icon_state = "rockvault" /turf/unsimulated/floor/shuttle_ceiling - icon_state = "reinforced" \ No newline at end of file + icon_state = "reinforced" + +/turf/unsimulated/elevator_shaft + name = "floor" + icon = 'icons/turf/floors.dmi' + icon_state = "elevatorshaft" \ No newline at end of file diff --git a/code/game/turfs/unsimulated/planetary_vr.dm b/code/game/turfs/unsimulated/planetary_vr.dm index 17c33b7525..b82342ea0a 100644 --- a/code/game/turfs/unsimulated/planetary_vr.dm +++ b/code/game/turfs/unsimulated/planetary_vr.dm @@ -52,8 +52,16 @@ alpha = 0xFF VIRGO3B_SET_ATMOS +//other set - for map building +/turf/unsimulated/wall2/planetary/virgo3b_better + icon_state = "riveted2" + /turf/unsimulated/wall/planetary/virgo3b_better name = "facility wall" desc = "An eight-meter tall carbyne wall. For when the wildlife on your planet is mostly militant megacorps." alpha = 0xFF VIRGO3BB_SET_ATMOS + +//other set - for map building +/turf/unsimulated/wall2/planetary/virgo3b_better + icon_state = "riveted2" \ No newline at end of file diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm index 878a12404a..dce3c345bb 100644 --- a/code/game/turfs/unsimulated/walls.dm +++ b/code/game/turfs/unsimulated/walls.dm @@ -6,10 +6,22 @@ density = TRUE blocks_air = TRUE +//other set - for map building +/turf/unsimulated/wall/wall1 + icon_state = "riveted1" + +/turf/unsimulated/wall/wall2 + icon_state = "riveted2" + /turf/unsimulated/wall/fakeglass name = "window" icon_state = "fakewindows" opacity = 0 +//other set - for map building +/turf/unsimulated/wall/fakeglass2 + icon_state = "fakewindows2" + opacity = 0 + /turf/unsimulated/wall/other icon_state = "r_wall" \ No newline at end of file diff --git a/code/modules/busy_space_vr/air_traffic.dm b/code/modules/busy_space_vr/air_traffic.dm index 7c06b964e4..a71fb888df 100644 --- a/code/modules/busy_space_vr/air_traffic.dm +++ b/code/modules/busy_space_vr/air_traffic.dm @@ -4,12 +4,12 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller /datum/lore/atc_controller - var/delay_min = 25 MINUTES //How long between ATC traffic - var/delay_max = 35 MINUTES //Adjusted to give approx 2 per hour, will work out to 10-14 over a full shift + var/delay_min = 20 MINUTES //How long between ATC traffic, minimum + var/delay_max = 30 MINUTES //Ditto, maximum //Shorter delays means more traffic, which gives the impression of a busier system, but also means a lot more radio noise var/backoff_delay = 5 MINUTES //How long to back off if we can't talk and want to. Default is 5 mins. var/initial_delay = 2 MINUTES //How long to wait before sending the first message of the shift. - var/next_message = 30 MINUTES //When the next message should happen in world.time - Making it default to min value + var/next_message = 20 MINUTES //When the next message should happen in world.time - Making it default to min value var/force_chatter_type //Force a specific type of messages var/squelched = 0 //If ATC is squelched currently @@ -77,18 +77,15 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller var/mission = source.ship_prefixes[prefix] //The value of the prefix is the mission type that prefix does var/shipname = pick(source.ship_names) //Pick a random ship name var/destname = pick(source.destination_names) //destination is where? - var/law_abiding = source.lawful //do we fully observe system law (or are we otherwise favored by the system owners, i.e. NT)? - var/law_breaker = source.hostile //or are we part of a pirate group - var/system_defense = source.sysdef //are we actually system law/SDF? unlocks the SDF-specific events + var/slogan = pick(source.slogans) //god help you all + var/org_type = source.org_type //which group do we belong to? //pick our second ship //var/secondname = secondary.name //not used atm, commented out to suppress errors var/secondowner = secondary.short_name var/secondprefix = pick(secondary.ship_prefixes) //Pick a random prefix var/secondshipname = pick(secondary.ship_names) //Pick a random ship name - var/law_abiding2 = secondary.lawful - var/law_breaker2 = secondary.hostile - var/system_defense2 = secondary.sysdef //mostly here as a secondary check to ensure SDF don't interrogate other SDF + var/org_type2 = secondary.org_type var/combined_first_name = "[owner][prefix] |[shipname]|" var/combined_second_name = "[secondowner][secondprefix] |[secondshipname]|" @@ -102,7 +99,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller var/requests = list( "special flight rules" = list("authorizing special flight rules", "denying special flight rules, not allowed for your traffic class"), "current solar weather info" = list("sending you the relevant information via tightbeam", "your request has been queued, stand by"), - "aerospace priority" = list("affirmative, aerospace priority is yours", "negative, another vessel has priority right now"), + "sector aerospace priority" = list("affirmative, sector aerospace priority is yours", "negative, another vessel in your sector has priority right now"), "system traffic info" = list("sending you current traffic info", "request queued, please hold"), "refueling information" = list("sending refueling information now", "depots currently experiencing fuel shortages, advise you move on"), "a current system time sync" = list("sending time sync ping to you now", "your ship isn't compatible with our time sync, set time manually"), @@ -113,30 +110,38 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller var/chatter_type = "normal" if(force_chatter_type) chatter_type = force_chatter_type - else if(law_abiding && !system_defense) //I have to offload this from the chatter_type switch below and do it here, otherwise BYOND throws a shitfit for no discernable reason + else if((org_type == "government" || org_type == "neutral" || org_type == "military" || org_type == "corporate" || org_type == "system defense") && org_type2 == "pirate") //this is ugly but when I tried to do it with !='s it fired for pirate-v-pirate, still not sure why. might as well stick it up here so it takes priority over other combos. + chatter_type = "distress" + else if(org_type == "corporate") //corporate-specific subset for the slogan event. despite the relatively high weight it was still quite rare in tests. + chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdenied",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest","normal",30;"undockingdenied",30;"undockingdelayed",300;"slogan") + else if((org_type == "government" || org_type == "neutral" || org_type == "military")) chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdenied",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest","normal",30;"undockingdenied",30;"undockingdelayed") //the following filters *always* fire their 'unique' event when they're tripped, simply because the conditions behind them are quite rare to begin with - else if(name == "Smugglers" && !system_defense2) //just straight up funnel smugglers into always being caught, otherwise we get them asking for traffic info and stuff + else if(org_type == "smuggler" && org_type2 != "system defense") //just straight up funnel smugglers into always being caught, otherwise we get them asking for traffic info and stuff chatter_type = "policeflee" - else if(name == "Smugglers" && system_defense2) //ditto, if an SDF ship catches them + else if(org_type == "smuggler" && org_type2 == "system defense") //ditto, if an SDF ship catches them chatter_type = "policeshipflee" - else if(law_abiding && law_breaker2) //on the offchance that we manage to roll a goodguy and a badguy, run a new distress event - it's like emerg but better - chatter_type = "distress" - else if(law_breaker && system_defense2) //if we roll this combo instead, time for the SDF to do their fucking job + else if((org_type == "smuggler" || org_type == "pirate") && org_type2 == "system defense") //if we roll this combo instead, time for the SDF to do their fucking job chatter_type = "policeshipcombat" - else if(law_breaker && !system_defense2) //but if we roll THIS combo, time to alert the SDF to get off their asses + else if((org_type == "smuggler" || org_type == "pirate") && org_type2 != "system defense") //but if we roll THIS combo, time to alert the SDF to get off their asses chatter_type = "hostiledetected" //SDF-specific events that need to filter based on the second party (basically just the following SDF-unique list with the soft-result ship scan thrown in) - else if(system_defense && law_abiding2 && !system_defense2) //let's see if we can narrow this down, I didn't see many ship-to-ship scans + else if(org_type == "system defense" && (org_type == "government" || org_type == "neutral" || org_type == "military" || org_type == "corporate")) //let's see if we can narrow this down, I didn't see many ship-to-ship scans chatter_type = pick(75;"policeshipscan","sdfpatrolupdate",75;"sdfendingpatrol",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",20;"undockingrequest",75;"sdfbeginpatrol",50;"normal") //SDF-specific events that don't require the secondary at all, in the event that we manage to roll SDF + hostile/smuggler or something - else if(system_defense) + else if(org_type == "system defense") chatter_type = pick("sdfpatrolupdate",60;"sdfendingpatrol",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",20;"undockingrequest",80;"sdfbeginpatrol","normal") //if we somehow don't match any of the other existing filters once we've run through all of them else chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestdenied",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest",30;"undockingdenied",30;"undockingdelayed","normal") //I probably should do some kind of pass here to work through all the possible combinations of major factors and see if the filtering list needs reordering or modifying, but I really can't be arsed + //DEBUG BLOCK + //to_world("DEBUG OUTPUT 1: [name], [owner], [prefix], [mission], [shipname], [org_type], [destname]") + //to_world("DEBUG OUTPUT 2: [secondowner], [secondprefix], [secondshipname], [org_type2]") + //to_world("DEBUG OUTPUT 3: Chose [chatter_type]") + //DEBUG BLOCK ENDS + var/yes = prob(90) //Chance for them to say yes vs no var/request = pick(requests) @@ -167,7 +172,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller switch(chatter_type) //mayday call if("emerg") - var/problem = pick("We have hull breaches on multiple decks","We have unknown hostile life forms on board","Our primary drive is failing","We have asteroids impacting the hull","We're experiencing a total loss of engine power","We have hostile ships closing fast","There's smoke in the cockpit","We have unidentified boarders","Our life support has failed") + var/problem = pick("We have hull breaches on multiple decks","We have unknown hostile life forms on board","Our primary drive is failing","We have [pick("asteroids","space debris")] impacting the hull","We're experiencing a total loss of engine power","We have hostile ships closing fast","There's smoke in the cockpit","We have unidentified boarders","Our RCS are malfunctioning and we're losing stability","Our life support [pick("is failing","has failed")]") msg("+Mayday, mayday, mayday!+ This is [combined_first_name] declaring an emergency! [problem]!","[prefix] [shipname]") sleep(5 SECONDS) msg("[combined_first_name], this is [using_map.dock_name] Control, copy. Switch to emergency responder channel [ertchannel].") @@ -175,7 +180,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller msg("Understood [using_map.dock_name] Control, switching now.","[prefix] [shipname]") //Control scan event: soft outcome if("policescan") - var/confirm = pick("Understood","Roger that","Affirmative") + var/confirm = pick("Understood","Roger that","Affirmative","Very well","Copy that") var/complain = pick("I hope this doesn't take too long.","Can we hurry this up?","Make it quick.","This better not take too long.","Is this really necessary?") var/completed = pick("You're free to proceed.","Everything looks fine, carry on.","You're clear, move along.","Apologies for the delay, you're clear.","Switch to channel [sdfchannel] and await further instruction.") msg("[combined_first_name], this is [using_map.dock_name] Control, your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.") @@ -190,7 +195,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller //Control scan event: hard outcome if("policeflee") var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, Control.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!") - msg("Unknown [pick("ship","vessel","starship")], this is [using_map.dock_name] Control, identify yourself and submit to a full inspection. Flying without an active transponder is a violation of system regulations.") + msg("Unknown [pick("ship","vessel","starship")], this is [using_map.dock_name] Control, identify yourself and submit to a full inspection. Flying without an active transponder is a violation of interstellar shipping regulations.") sleep(5 SECONDS) msg("[uhoh]","[shipname]") sleep(5 SECONDS) @@ -212,11 +217,11 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller //SDF scan event: hard outcome if("policeshipflee") var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, |[shipname]|.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!") - msg("Unknown [pick("ship","vessel","starship")], this is [combined_second_name], identify yourself and submit to a full inspection. Flying without an active transponder is a violation of system regulations.","[secondprefix] [secondshipname]") + msg("Unknown [pick("ship","vessel","starship")], this is [combined_second_name], identify yourself and submit to a full inspection. Flying without an active transponder is a violation of interstellar shipping regulations.","[secondprefix] [secondshipname]") sleep(5 SECONDS) msg("[uhoh]","[shipname]") sleep(5 SECONDS) - msg("[using_map.starsys_name] Defense Control, this is [combined_second_name], we have a situation here, please advise.","[secondprefix] [secondshipname]") + msg("[using_map.starsys_name] Defense Control, this is [combined_second_name]. We have a situation here, please advise.","[secondprefix] [secondshipname]") sleep(5 SECONDS) msg("Defense Control copies, [combined_second_name], reinforcements are en route. Switch further communications to encrypted band [sdfchannel].","[using_map.starsys_name] Defense Control") //SDF scan event: engage primary in combat! fairly rare since it needs a pirate/vox + SDF roll @@ -282,7 +287,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller if("dockingrequestdenied") var/reason = pick("we don't have any landing pads large enough for your vessel","we don't have the necessary facilities for your vessel type or class") var/disappointed = pick("That's unfortunate. [combined_first_name], out.","Damn shame. We'll just have to keep moving. [combined_first_name], out.","[combined_first_name], out.") - msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_move].","[prefix] [shipname]") + msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[prefix] [shipname]") sleep(5 SECONDS) msg("[combined_first_name], this is [using_map.dock_name] Control. Request denied, [reason].") sleep(5 SECONDS) @@ -388,6 +393,10 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller msg("[combined_first_name], this is [using_map.dock_name] Control. Everything appears to be in order now, permission granted. Docking clamps released. [safetravels].") sleep(5 SECONDS) msg("[thanks], [using_map.dock_name] Control. This is [combined_first_name] setting course for [destname], out.","[prefix] [shipname]") + if("slogan") + msg("The following is a sponsored message from [name].","Facility PA") + sleep (5 SECONDS) + msg("[slogan]","Facility PA") else //time for generic message msg("[callname], this is [combined_first_name] on [mission] [pick(mission_noun)] to [destname], requesting [request].","[prefix] [shipname]") sleep(5 SECONDS) diff --git a/code/modules/busy_space_vr/organizations.dm b/code/modules/busy_space_vr/organizations.dm index ec30b2a2a8..4c24cf6420 100644 --- a/code/modules/busy_space_vr/organizations.dm +++ b/code/modules/busy_space_vr/organizations.dm @@ -14,7 +14,7 @@ //how does it work? simple: if you have complex tasks enabled, it goes; PREFIX + TASK_TYPE + FLIGHT_TYPE //e.g. NDV = Asset Protection + Patrol + Flight - //this allows you to use the ship prefix for subfactions (warbands, religions, whatever) within a faction, and define task_types at the faction level + //this overrides the standard PREFIX = TASK logic and allows you to use the ship prefix for subfactions (warbands, religions, whatever) within a faction, and define task_types at the faction level //task_types are picked from completely at random in air_traffic.dm, much like flight_types, so be careful not to potentially create combos that make no sense! var/list/task_types = list( @@ -86,14 +86,114 @@ "Falcon", "Casper", "Orion", + "Columbia", + "Atlantis", + "Enterprise", + "Challenger", + "Pathfinder", + "Buran", + "Aldrin", + "Armstrong", + "Tranquility", + "Nostrodamus", + "Soyuz", + "Cosmos", + "Sputnik", + "Belka", + "Strelka", + "Gagarin", + "Shepard", + "Tereshkova", + "Leonov", + "Vostok", + "Apollo", + "Mir", + "Titan", + "Serenity", + "Andiamo", + "Aurora", + "Phoenix", + "Lucky", + "Raven", + "Valkyrie", + "Halcyon", + "Nakatomi", + "Cutlass", + "Unicorn", + "Sheepdog", + "Arcadia", + "Gigantic", + "Goliath", + "Pequod", + "Poseidon", + "Venture", + "Evergreen", + "Natal", + "Maru", + "Djinn", + "Witch", + "Wolf", + "Lone Star", + "Grey Fox", + "Dutchman", + "Sultana", + "Siren", + "Venus", + "Anastasia", + "Rasputin", + "Stride", + "Suzaku", + "Hathor", + "Dream", + "Gaia", + "Ibis", + "Progress", + "Olympic", + "Venture", + "Brazil", + "Tiger", + "Hedgehog", + "Potemkin", + "Fountainhead", + "Sinbad", + "Esteban", + "Mumbai", + "Shanghai", + "Madagascar", + "Kampala", + "Bangkok", + "Emerald", + "Guo Hong", + "Shun Kai", + "Fu Xing", + "Zhenyang", + "Da Qing", + "Rascal", + "Flamingo", + "Jackal", + "Andromeda", + "Ferryman", + "Panchatantra", + "Nunda", + "Fortune", + "New Dawn", + "Fionn MacCool", + "Red Bird", + "Star Rat", + "Cwn Annwn", + "Morning Swan", + "Black Cat", "Challenger" ) var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly. var/lawful = TRUE //Are we exempt from routine inspections? to avoid incidents where SysDef appears to go rogue -- defaults to TRUE now (regular ships always get the "soft" result) var/hostile = FALSE //Are we explicitly lawless, hostile, or otherwise bad? allows for a finer alignment system, since my last checks weren't working properly + var/org_type = "neutral" //Valid options are "neutral", "corporate", "government", "system defense", "military, "smuggler", & "pirate" var/sysdef = FALSE //Are we the space cops? var/autogenerate_destination_names = TRUE //Pad the destination lists with some extra random ones? see the proc below for info on that + + var/slogans = list("This is a placeholder slogan, ding dong!") //Advertising slogans. Who doesn't want more obnoxiousness on the radio? Picked at random each time the slogan event fires. This has a placeholder so it doesn't runtime on trying to draw from a 0-length list in the event that new corps are added without full support. /datum/lore/organization/New() ..() @@ -213,7 +313,7 @@ and therapy.\

\ NT's most well known products are its phoron based creations, especially those used in Cryotherapy. \ - It also boasts an prosthetic line, which is provided to its employees as needed, and is used as an incentive \ + It also boasts a prosthetic line, which is provided to its employees as needed, and is used as an incentive \ for newly tested posibrains to remain with the company. \

\ NT's ships are named for famous scientists." @@ -222,6 +322,12 @@ headquarters = "Luna, Sol" motto = "" + org_type = "corporate" + slogans = list( + "NanoTrasen - Phoron Makes The Galaxy Go 'Round.", + "NanoTrasen - Join for the Medical, stay for the Company.", + "NanoTrasen - Advancing Humanity." + ) ship_prefixes = list("NTV" = "a general operations", "NEV" = "an exploration", "NGV" = "a hauling", "NDV" = "a patrol", "NRV" = "an emergency response", "NDV" = "an asset protection") //Scientist naming scheme ship_names = list( @@ -247,13 +353,11 @@ "Nye", "Hawking", "Aristotle", - "Von Braun", "Kaku", "Oppenheimer", "Renwick", "Hubble", "Alcubierre", - "Robineau", "Glass" ) // Note that the current station being used will be pruned from this list upon being instantiated @@ -297,6 +401,12 @@ headquarters = "Luna, Sol" motto = "" + org_type = "corporate" + slogans = list( + "Hephaestus Arms - When it comes to personal protection, nobody does it better.", + "Hephaestus Arms - Peace through Superior Firepower.", + "Hephaestus Arms - Don't be caught firing blanks." + ) ship_prefixes = list("HCV" = "a general operations", "HTV" = "a freight", "HLV" = "a munitions resupply", "HDV" = "an asset protection", "HDV" = "a preemptive deployment") //War God Theme, updated ship_names = list( @@ -401,6 +511,12 @@ headquarters = "Toledo, New Ohio" motto = "" + org_type = "corporate" + slogans = list( + "Vey-Medical. Medical care you can trust.", + "Vey-Medical. Only the finest in surgical equipment.", + "Vey-Medical. Because your patients deserve the best." + ) ship_prefixes = list("VMV" = "a general operations", "VTV" = "a transportation", "VHV" = "a medical resupply", "VSV" = "a research", "VRV" = "an emergency medical support") // Diona names, mostly ship_names = list( @@ -415,6 +531,9 @@ "Fire Blown Out By Wind", "Star That Fades From View", "Eyes Which Turn Inwards", + "Still Water Upon An Endless Shore", + "Sunlight Glitters Upon Tranquil Sands", + "Growth Within The Darkest Abyss", "Joy Without Which The World Would Come Undone", "A Thousand Thousand Planets Dangling From Branches", "Light Streaming Through Interminable Branches", @@ -447,6 +566,13 @@ headquarters = "Earth, Sol" motto = "" + org_type = "corporate" + slogans = list( + "Zeng-Hu! WE make the medicines that YOU need!", + "Zeng-Hu! Having acid reflux problems? Consult your local physician to see if Dylovene is right for YOU!", + "Zeng-Hu! Tired of getting left in the dust? Try Hyperzine! You'll never fall behind again!", + "Zeng-Hu! Life's aches and pains getting to you? Try Tramadol - available at any good pharmacy!" + ) ship_prefixes = list("ZHV" = "a general operations", "ZTV" = "a transportation", "ZMV" = "a medical resupply", "ZRV" = "a medical research") //ship names: a selection of famous physicians who advanced the cause of medicine ship_names = list( @@ -527,6 +653,12 @@ headquarters = "" motto = "" + org_type = "corporate" + slogans = list( + "Takahashi Appliances - keeping your home running smoothly.", + "W-T Automotive - keeping you on time, all the time.", + "Ward-Takahashi Electronics - keeping you in touch with the galaxy." + ) ship_prefixes = list("WTV" = "a general operations", "WTFV" = "a freight", "WTGV" = "a transport", "WTDV" = "an asset protection") ship_names = list( "Comet", @@ -560,6 +692,8 @@ "Curtain", "Planetar", "Quasar", + "Blazar", + "Corona", "Binary" ) destination_names = list() @@ -581,6 +715,12 @@ headquarters = "" motto = "" + org_type = "corporate" + slogans = list( + "Bishop Cybernetics - only the best in personal augmentation.", + "Bishop Cybernetics - why settle for flesh when you can have metal?", + "Bishop Cybernetics - make a statement." + ) ship_prefixes = list("BCV" = "a general operations", "BCTV" = "a transportation", "BCSV" = "a research exchange") //famous mechanical engineers ship_names = list( @@ -660,6 +800,10 @@ headquarters = "Shelf flotilla" motto = "" + org_type = "neutral" //disables slogans for morpheus as they don't advertise, per the description above + /* + slogans = list() + */ ship_prefixes = list("MCV" = "a general operations", "MTV" = "a freight", "MDV" = "a market protection", "MSV" = "an outreach") //periodic elements; something 'unusual' for the posibrain TSC without being full on 'quirky' culture ship names (much as I love them, they're done to death) ship_names = list( @@ -749,6 +893,12 @@ headquarters = "" motto = "" + org_type = "corporate" + slogans = list( + "Xion Manufacturing - We have what you need.", + // "Xion Manufacturing - The #1 choice of the SolGov Engineer's Union for 150 years.", // CHOMPedit, year mismatch + "Xion Manufacturing - Our products are as bulletproof as our contracts." + ) ship_prefixes = list("XMV" = "a general operations", "XTV" = "a hauling", "XFV" = "a bulk transport", "XIV" = "a resupply") //martian mountains ship_names = list( @@ -803,6 +953,12 @@ headquarters = "" motto = "" + org_type = "corporate" + slogans = list( + "The FTU. We look out for the little guy.", + "There's no Trade like Free Trade.", + "Join the Free Trade Union. Because anything worth doing, is worth doing for money." //rule of acquisition #13 + ) ship_prefixes = list("FTV" = "a general operations", "FTRP" = "a trade protection", "FTRR" = "a piracy suppression", "FTLV" = "a logistical support", "FTTV" = "a mercantile", "FTDV" = "a market establishment") //famous merchants and traders, taken from Civ6's Great Merchants, plus the TSC's founder ship_names = list( @@ -846,6 +1002,12 @@ headquarters = "Mars, Sol" motto = "With Major Bill's, you won't pay major bills!" + org_type = "corporate" + slogans = list( + "With Major Bill's, you won't pay major bills!", + "Major Bill's - Private Couriers - General Shipping!", + "Major Bill's got you covered, now get out there!" + ) ship_prefixes = list("TTV" = "a general operations", "TTV" = "a transport", "TTV" = "a luxury transit", "TTV" = "a priority transit", "TTV" = "a secure data courier") //ship names: big rivers ship_names = list ( @@ -916,6 +1078,12 @@ headquarters = "Mars, Sol" motto = "" + org_type = "corporate" + slogans = list( + "Grayson Mining - It's An Ore Effort, For The War Effort!", + "Grayson Mining - Winning The War On Ore!", + "Grayson Mining - Come On Down To Our Ore Chasm!" + ) ship_prefixes = list("GMV" = "a general operations", "GMT" = "a transport", "GMR" = "a resourcing", "GMS" = "a surveying", "GMH" = "a bulk transit") //rocks ship_names = list( @@ -976,6 +1144,12 @@ headquarters = "" motto = "Dum spiro spero" + org_type = "corporate" + slogans = list( + "Aether A&R - We're Absolutely Breathtaking.", + "Aether A&R - You Can Breathe Easy With Us!", + "Aether A&R - The SolGov's #1 Environmental Systems Provider." // CHOMPedit + ) ship_prefixes = list("AARV" = "a general operations", "AARE" = "a resource extraction", "AARG" = "a gas transport", "AART" = "a transport") //weather systems/patterns ship_names = list ( @@ -1025,6 +1199,12 @@ headquarters = "" motto = "" + org_type = "corporate" + slogans = list( + "Focal Point Energistics - Sustainable Power for a Sustainable Future.", + "Focal Point Energistics - Powering The Future Before It Even Happens.", + "Focal Point Energistics - Let There Be Light." + ) ship_prefixes = list("FPV" = "a general operations", "FPH" = "a transport", "FPC" = "an energy relay", "FPT" = "a fuel transport") //famous electrical engineers ship_names = list ( @@ -1085,6 +1265,12 @@ headquarters = "Spin Aerostat, Jupiter" motto = "Sic itur ad astra" + org_type = "corporate" + slogans = list( + "StarFlight - travel the stars.", + "StarFlight - bringing you to new horizons.", + "StarFlight - getting you where you need to be since 2137." + ) ship_prefixes = list("SFI-X" = "a VIP liner", "SFI-L" = "a luxury liner", "SFI-B" = "a business liner", "SFI-E" = "an economy liner", "SFI-M" = "a mixed class liner", "SFI-S" = "a sightseeing", "SFI-M" = "a wedding", "SFI-O" = "a marketing", "SFI-S" = "a safari", "SFI-A" = "an aquatic adventure") flight_types = list( //no military-sounding ones here "flight", @@ -1143,6 +1329,12 @@ headquarters = "" motto = "News from all across the spectrum" + org_type = "corporate" + slogans = list( + "Oculum - All News, All The Time.", + "Oculum - We Keep An Eye Out.", + "Oculum - Your Eye On The Galaxy." + ) ship_prefixes = list("OBV" = "an investigation", "OBV" = "a distribution", "OBV" = "a journalism", "OBV" = "a general operations") destination_names = list( "Oculus HQ" @@ -1158,6 +1350,12 @@ headquarters = "Alpha Centauri" motto = "The largest brands of food and drink - most of them are Centauri." + org_type = "corporate" + slogans = list( + "Centauri Provisions Bread Tubes - They're Not Just Edible, They're |Breadible!|", + "Centauri Provisions SkrellSnax - Not |Just| For Skrell!", + "Centauri Provisions Space Mountain Wind - It'll Take Your |Breath| Away!" + ) ship_prefixes = list("CPTV" = "a transport", "CPCV" = "a catering", "CPRV" = "a resupply", "CPV" = "a general operations") destination_names = list( "Centauri Provisions HQ", @@ -1175,6 +1373,12 @@ headquarters = "" motto = "Engine designs, emergency generators, and old memories" + org_type = "corporate" + slogans = list( + "Einstein Engines - you don't have to be Einstein to use |our| engines!", + "Einstein Engines - bringing power to the people.", + "Einstein Engines - because it's the smart thing to do." + ) ship_prefixes = list("EETV" = "a transport", "EERV" = "a research", "EEV" = "a general operations") destination_names = list( "Einstein HQ" @@ -1190,6 +1394,12 @@ headquarters = "" motto = "We build it - you fly it" + org_type = "corporate" + slogans = list( + "Wulf Aeronautics. We build it - you fly it.", + // "Wulf Aeronautics, the Commonwealth's favorite shipwrights.", // CHOMPedit + "Wulf Aeronautics, building tomorrow's ships today." + ) ship_prefixes = list("WATV" = "a transport", "WARV" = "a repair", "WAV" = "a general operations") destination_names = list( "Wulf Aeronautics HQ", @@ -1207,6 +1417,12 @@ headquarters = "" motto = "" + org_type = "corporate" + slogans = list( + "Why choose |luxury| when you can choose |Gilthari|?", + "|Gilthari|. Because |you're| worth it.", + "|Gilthari|. Why settle for |anything| less?" + ) ship_prefixes = list("GETV" = "a transport", "GECV" = "a luxury catering", "GEV" = "a general operations") //precious stones ship_names = list( @@ -1283,6 +1499,12 @@ headquarters = "N/A" motto = "one man's trash is another man's treasure" + org_type = "corporate" + slogans = list( + "Coyote Salvage Corp. 'cause your trash ain't gonna clean itself.", + "Coyote Salvage Corp. 'cause one man's trash is another man's treasure.", + "Coyote Salvage Corp. We'll take your scrap - but not your crap." + ) ship_prefixes = list("CSV" = "a salvage", "CRV" = "a recovery", "CTV" = "a transport", "CSV" = "a shipbreaking", "CHV" = "a towing") //mostly-original, maybe some references, and more than a few puns ship_names = list( @@ -1351,6 +1573,12 @@ headquarters = "Titan, Sol" motto = "the whole is greater than the sum of its parts" + org_type = "corporate" + slogans = list( + "Chimera Genetics. Find your true self today!", + "Chimera Genetics. Bring us your genes and we'll clean them right up.", + "Chimera Genetics. Better bodies for a better tomorrow." + ) ship_prefixes = list("CGV" = "a general operations", "CGT" = "a transport", "CGT" = "a delivery", "CGH" = "a medical") //edgy mythological critters! ship_names = list( @@ -1506,6 +1734,7 @@ sysdef = TRUE //we're the space law, we don't impersonate people and stuff autogenerate_destination_names = FALSE //don't add extra destinations to our pool, or else we leave the system which makes no sense + org_type = "system defense" ship_prefixes = list ("SDB" = "a patrol", "SDF" = "a patrol", "SDV" = "a patrol", "SDB" = "an escort", "SDF" = "an escort", "SDV" = "an escort", "SAR" = "a search and rescue", "SDT" = "a logistics", "SDT" = "a resupply", "SDJ" = "a prisoner transport") //b = boat, f = fleet (generic), v = vessel, t = tender //ship names: weapons ship_names = list( @@ -1605,6 +1834,7 @@ sysdef = FALSE autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes. + org_type = "smuggler" ship_prefixes = list ("suspected smuggler" = "an illegal smuggling", "possible smuggler" = "an illegal smuggling") //as assigned by control, second part shouldn't even come up //blank out our shipnames for redesignation ship_names = list( @@ -1781,6 +2011,7 @@ hostile = TRUE autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes. + org_type = "pirate" ship_prefixes = list ("known pirate" = "a piracy", "suspected pirate" = "a piracy", "rogue privateer" = "a piracy", "Cartel enforcer" = "a piracy", "known outlaw" = "a piracy", "bandit" = "a piracy", "roving corsair" = "a piracy", "illegal salvager" = "an illegal salvage", "rogue mercenary" = "a mercenary") //as assigned by control, second part shouldn't even come up, but it exists to avoid hiccups/weirdness just in case ship_names = list( "Morally Bankrupt", @@ -1953,6 +2184,7 @@ hostile = TRUE autogenerate_destination_names = TRUE + org_type = "pirate" ship_prefixes = list("Ue-Katish pirate" = "a raiding", "Ue-Katish bandit" = "a raiding", "Ue-Katish raider" = "a raiding", "Ue-Katish enforcer" = "an enforcement") ship_names = list( "Keqxuer'xeu's Prize", @@ -1987,6 +2219,7 @@ hostile = TRUE autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need *some* entries to avoid runtimes. + org_type = "pirate" ship_prefixes = list("vox marauder" = "a marauding", "vox raider" = "a raiding", "vox ravager" = "a raiding", "vox corsair" = "a raiding") //as assigned by control, second part shouldn't even come up //blank out our shipnames for redesignation ship_names = list( @@ -2063,6 +2296,7 @@ motto = "Nil Mortalibus Ardui Est" // Latin, because latin. Says 'Nothing is too steep for mortals' autogenerate_destination_names = TRUE + org_type = "government" ship_prefixes = list("CWS-A" = "an administrative", "CWS-T" = "a transportation", "CWS-D" = "a diplomatic", "CWS-F" = "a freight", "CWS-J" = "a prisoner transfer") //earth's biggest impact craters ship_names = list( @@ -2158,6 +2392,7 @@ headquarters = "Paraiso a Àstrea" motto = "Liberty to the Stars!" + org_type = "government" ship_prefixes = list("UFHV" = "military", "FFHV" = "classified") ship_names = list( "Bulwark of the Free", @@ -2236,6 +2471,7 @@ headquarters = "" motto = "" + org_type = "government" ship_prefixes = list("ECS-M" = "a military", "ECS-T" = "a transport", "ECS-T" = "a special transport", "ECS-D" = "a diplomatic") //The Special Transport is SLAAAAVES. but let's not advertise that openly. ship_names = list( "Bring Me Wine!", @@ -2291,6 +2527,7 @@ headquarters = "The Pact, Myria" motto = "" + org_type = "government" ship_prefixes = list("SFM-M" = "a military", "SFM-M" = "a patrol") // The Salthans don't do anything else. flight_types = list( "mission", @@ -2394,6 +2631,7 @@ motto = "" autogenerate_destination_names = TRUE //big list of own holdings to come + org_type = "government" //the tesh expeditionary fleet's closest analogue in modern terms would be the US Army Corps of Engineers, just with added combat personnel as well ship_prefixes = list("TEF" = "a diplomatic", "TEF" = "a peacekeeping", "TEF" = "an escort", "TEF" = "an exploration", "TEF" = "a survey", "TEF" = "an expeditionary", "TEF" = "a pioneering") //TODO: better ship names? I just took a bunch of random teshnames from the Random Name button and added a word. @@ -2441,6 +2679,7 @@ motto = "Si Vis Pacem Para Bellum" //if you wish for peace, prepare for war autogenerate_destination_names = TRUE + org_type = "military" ship_prefixes = list ("USDF" = "a logistical", "USDF" = "a training", "USDF" = "a patrol", "USDF" = "a piracy suppression", "USDF" = "a peacekeeping", "USDF" = "a relief", "USDF" = "an escort", "USDF" = "a search and rescue", "USDF" = "a classified") flight_types = list( "mission", @@ -2539,6 +2778,7 @@ motto = "" autogenerate_destination_names = TRUE + org_type = "military" ship_prefixes = list("PCRC" = "a risk control", "PCRC" = "a private security") flight_types = list( "flight", @@ -2602,6 +2842,7 @@ motto = "Strength in Numbers" autogenerate_destination_names = TRUE + org_type = "military" ship_prefixes = list("HPF" = "a secure freight", "HPT" = "a training", "HPS" = "a logistics", "HPV" = "a patrol", "HPH" = "a bounty hunting", "HPX" = "an experimental", "HPC" = "a command", "HPI" = "a mercy") flight_types = list( "flight", @@ -2686,6 +2927,7 @@ motto = "Aut Neca Aut Necare" autogenerate_destination_names = TRUE + org_type = "military" ship_prefixes = list("SAARE" = "a secure freight", "SAARE" = "a training", "SAARE" = "a logistics", "SAARE" = "a patrol", "SAARE" = "a security", "SAARE" = "an experimental", "SAARE" = "a command", "SAARE" = "a classified") flight_types = list( "flight", diff --git a/code/modules/client/preference_setup/general/02_language.dm b/code/modules/client/preference_setup/general/02_language.dm index b216ec4dec..730c05649f 100644 --- a/code/modules/client/preference_setup/general/02_language.dm +++ b/code/modules/client/preference_setup/general/02_language.dm @@ -34,6 +34,7 @@ for(var/language in pref.alternate_languages) var/datum/language/L = GLOB.all_languages[language] if(!istype(L) || (L.flags & RESTRICTED) || (!(language in S.secondary_langs) && pref.client && !is_lang_whitelisted(pref.client, L))) + testing("LANGSANI: Removed [L?.name || "lang not found"] from [pref.client]'s character [pref.real_name || "-name not yet loaded-"] because it failed allowed checks") pref.alternate_languages -= language if(isnull(pref.language_prefixes) || !pref.language_prefixes.len) diff --git a/code/modules/client/preference_setup/loadout/loadout_mask.dm b/code/modules/client/preference_setup/loadout/loadout_mask.dm index 52e491fbe6..2c89ce66cb 100644 --- a/code/modules/client/preference_setup/loadout/loadout_mask.dm +++ b/code/modules/client/preference_setup/loadout/loadout_mask.dm @@ -30,32 +30,6 @@ /datum/gear/mask/plaguedoctor2 display_name = "golden plague doctor's mask" path = /obj/item/clothing/mask/gas/plaguedoctor/gold -<<<<<<< HEAD - cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage. -||||||| parent of 23daa38dfa... Merge pull request #11716 from GhostActual/straw_accessories - cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage. - -/datum/gear/mask/papermask - display_name = "paper mask" - path = /obj/item/clothing/mask/paper - -/datum/gear/mask/emotionalmask - display_name = "emotional mask" - path = /obj/item/clothing/mask/emotions - -/datum/gear/mask/gaiter - display_name = "neck gaiter selection" - path = /obj/item/clothing/mask/gaiter - cost = 1 - -/datum/gear/mask/gaiter/New() - ..() - var/list/gaiters = list() - for(var/gaiter in typesof(/obj/item/clothing/mask/gaiter)) - var/obj/item/clothing/mask/gaiter_type = gaiter - gaiters[initial(gaiter_type.name)] = gaiter_type - gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, /proc/cmp_text_asc)) -======= cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage. /datum/gear/mask/mouthwheat @@ -81,5 +55,4 @@ for(var/gaiter in typesof(/obj/item/clothing/mask/gaiter)) var/obj/item/clothing/mask/gaiter_type = gaiter gaiters[initial(gaiter_type.name)] = gaiter_type - gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, /proc/cmp_text_asc)) ->>>>>>> 23daa38dfa... Merge pull request #11716 from GhostActual/straw_accessories + gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, /proc/cmp_text_asc)) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index d185ca2608..ea12b86778 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -89,37 +89,37 @@ display_name = "flashlight" path = /obj/item/device/flashlight -/datum/gear/utility/flashlight_blue - display_name = "flashlight, blue" - path = /obj/item/device/flashlight/color - -/datum/gear/utility/flashlight_orange - display_name = "flashlight, orange" - path = /obj/item/device/flashlight/color/orange - -/datum/gear/utility/flashlight_red - display_name = "flashlight, red" - path = /obj/item/device/flashlight/color/red - -/datum/gear/utility/flashlight_yellow - display_name = "flashlight, yellow" - path = /obj/item/device/flashlight/color/yellow - /datum/gear/utility/maglight display_name = "flashlight, maglight" path = /obj/item/device/flashlight/maglight cost = 2 +/datum/gear/utility/flashlight/color + display_name = "flashlight, small (selection)" + path = /obj/item/device/flashlight/color + +/datum/gear/utility/flashlight/color/New() + ..() + var/list/flashlights = list( + "Blue Flashlight" = /obj/item/device/flashlight/color, + "Red Flashlight" = /obj/item/device/flashlight/color/red, + "Green Flashlight" = /obj/item/device/flashlight/color/green, + "Yellow Flashlight" = /obj/item/device/flashlight/color/yellow, + "Purple Flashlight" = /obj/item/device/flashlight/color/purple, + "Orange Flashlight" = /obj/item/device/flashlight/color/orange + ) + gear_tweaks += new/datum/gear_tweak/path(flashlights) + /datum/gear/utility/battery display_name = "cell, device" path = /obj/item/weapon/cell/device /datum/gear/utility/pen - display_name = "Fountain Pen" + display_name = "fountain pen" path = /obj/item/weapon/pen/fountain /datum/gear/utility/umbrella - display_name = "Umbrella" + display_name = "umbrella" path = /obj/item/weapon/melee/umbrella cost = 3 @@ -131,7 +131,7 @@ display_name = "wheelchair selection" path = /obj/item/wheelchair cost = 4 - + /datum/gear/utility/wheelchair/New() ..() gear_tweaks += gear_tweak_free_color_choice diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm index 6cc380d625..2090358a89 100644 --- a/code/modules/client/preference_setup/vore/07_traits.dm +++ b/code/modules/client/preference_setup/vore/07_traits.dm @@ -112,12 +112,17 @@ else if(!pref.custom_base || !(pref.custom_base in GLOB.custom_species_bases)) pref.custom_base = SPECIES_HUMAN + pref.custom_say = lowertext(trim(pref.custom_say)) + pref.custom_whisper = lowertext(trim(pref.custom_whisper)) + pref.custom_ask = lowertext(trim(pref.custom_ask)) + pref.custom_exclaim = lowertext(trim(pref.custom_exclaim)) + /datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character) character.custom_species = pref.custom_species - character.custom_say = pref.custom_say - character.custom_ask = pref.custom_ask - character.custom_whisper = pref.custom_whisper - character.custom_exclaim = pref.custom_exclaim + character.custom_say = lowertext(trim(pref.custom_say)) + character.custom_ask = lowertext(trim(pref.custom_ask)) + character.custom_whisper = lowertext(trim(pref.custom_whisper)) + character.custom_exclaim = lowertext(trim(pref.custom_exclaim)) if(character.isSynthetic()) //Checking if we have a synth on our hands, boys. pref.dirty_synth = 1 diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 2689df87a3..ad24f6e0d0 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -1,6 +1,6 @@ /mob/var/suiciding = 0 -/mob/living/carbon/human/verb/suicide() +/mob/living/carbon/human/verb/suicide() /// At best, useful for admins to see if it's being called. set hidden = 1 if (stat == DEAD) @@ -10,83 +10,9 @@ if (!ticker) to_chat(src, "You can't commit suicide before the game starts!") return - - if(!player_is_antag(mind)) - message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1) - to_chat(src, "No. Adminhelp if there is a legitimate reason.") - return - - if (suiciding) - to_chat(src, "You're already committing suicide! Be patient!") - return - - var/confirm = tgui_alert(usr, "Are you sure you want to commit suicide?", "Confirm Suicide", list("Yes", "No")) - - if(confirm == "Yes") - if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide - to_chat(src, "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))") - return - suiciding = 15 - does_not_breathe = 0 //Prevents ling-suicide zombies, or something - var/obj/item/held_item = get_active_hand() - if(held_item) - var/damagetype = held_item.suicide_act(src) - if(damagetype) - log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]") - var/damage_mod = 1 - switch(damagetype) //Sorry about the magic numbers. - //brute = 1, burn = 2, tox = 4, oxy = 8 - if(15) //4 damage types - damage_mod = 4 - - if(6, 11, 13, 14) //3 damage types - damage_mod = 3 - - if(3, 5, 7, 9, 10, 12) //2 damage types - damage_mod = 2 - - if(1, 2, 4, 8) //1 damage type - damage_mod = 1 - - else //This should not happen, but if it does, everything should still work - damage_mod = 1 - - //Do 175 damage divided by the number of damage types applied. - if(damagetype & BRUTELOSS) - adjustBruteLoss(30/damage_mod) //hack to prevent gibbing - adjustOxyLoss(145/damage_mod) - - if(damagetype & FIRELOSS) - adjustFireLoss(175/damage_mod) - - if(damagetype & TOXLOSS) - adjustToxLoss(175/damage_mod) - - if(damagetype & OXYLOSS) - adjustOxyLoss(175/damage_mod) - - //If something went wrong, just do normal oxyloss - if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS)) - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - - updatehealth() - return - - log_and_message_admins("[key_name(src)] commited suicide") - - var/datum/gender/T = gender_datums[get_visible_gender()] - - var/suicidemsg - suicidemsg = pick("[src] is attempting to bite [T.his] tongue off! It looks like [T.he] [T.is] trying to commit suicide.", \ - "[src] is jamming [T.his] thumbs into [T.his] eye sockets! It looks like [T.he] [T.is] trying to commit suicide.", \ - "[src] is twisting [T.his] own neck! It looks like [T.he] [T.is] trying to commit suicide.", \ - "[src] is holding [T.his] breath! It looks like [T.he] [T.is] trying to commit suicide.") - if(isSynthetic()) - suicidemsg = "[src] is attempting to switch [T.his] power off! It looks like [T.he] [T.is] trying to commit suicide." - visible_message(suicidemsg) - - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - updatehealth() + + to_chat(src, "No. Adminhelp if there is a legitimate reason, and please review our server rules.") + message_admins("[ckey] has tried to trigger the suicide verb as human, but it is currently disabled.") /mob/living/carbon/brain/verb/suicide() set hidden = 1 diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 3db7ad58cf..7f45fcfdb3 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -292,6 +292,12 @@ BLIND // can't see anything item_state_slots = list(slot_r_hand_str = "glasses", slot_l_hand_str = "glasses") body_parts_covered = 0 +/obj/item/clothing/glasses/artist + name = "4-D Glasses" + desc = "You can see in every dimension, and get four times the amount of headache!" + icon_state = "artist" + item_state = "artist_glasses" + /obj/item/clothing/glasses/gglasses name = "green glasses" desc = "Forest green glasses, like the kind you'd wear when hatching a nasty scheme." @@ -590,3 +596,4 @@ BLIND // can't see anything to_chat(usr, "You push \the [src] up from in front of your eyes.") update_clothing_icon() usr.update_action_buttons() + diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 7c9e323466..3a79b7177a 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -294,104 +294,6 @@ desc = "A black veil, typically worn at funerals or by goths." w_class = ITEMSIZE_TINY body_parts_covered = FACE -<<<<<<< HEAD - icon_state = "veil" -||||||| parent of 23daa38dfa... Merge pull request #11716 from GhostActual/straw_accessories - icon_state = "veil" - -/obj/item/clothing/mask/paper - name = "paper mask" - desc = "A neat, circular mask made out of paper. Perhaps you could try drawing on it with a pen!" - w_class = ITEMSIZE_SMALL - body_parts_covered = FACE - icon_state = "papermask" - -/obj/item/clothing/mask/paper/attackby(obj/item/I as obj, mob/living/user as mob, proximity) - if(!proximity) return - if(istype(I, /obj/item/weapon/pen)) - var/drawtype = tgui_alert(user, "Choose what you'd like to draw.", "Faces", list("blank","neutral","eyes","sleeping", "heart", "core", "plus", "square", "bullseye", "vertical", "horizontal", "X", "bug eyes", "double", "mark" )) - switch(drawtype) - if("blank") - src.icon_state = "papermask" - if("neutral") - src.icon_state = "neutralmask" - if("eyes") - src.icon_state = "eyemask" - if("sleeping") - src.icon_state = "sleepingmask" - if("heart") - src.icon_state = "heartmask" - if("core") - src.icon_state = "coremask" - if("plus") - src.icon_state = "plusmask" - if("square") - src.icon_state = "squaremask" - if("bullseye") - src.icon_state = "bullseyemask" - if("vertical") - src.icon_state = "verticalmask" - if("horizontal") - src.icon_state = "horizontalmask" - if("X") - src.icon_state = "xmask" - if("bug eyes") - src.icon_state = "bugmask" - if("double") - src.icon_state = "doublemask" - if("mark") - src.icon_state = "markmask" - return - -/obj/item/clothing/mask/emotions - name = "emotional mask" - desc = "Express your happiness or hide your sorrows with this modular cutout. Draw your current emotions onto it with a pen!" - w_class = ITEMSIZE_SMALL - body_parts_covered = FACE - icon_state = "joy" - -/obj/item/clothing/mask/emotions/attackby(obj/item/I as obj, mob/living/user as mob, proximity) - if(!proximity) return - if(istype(I, /obj/item/weapon/pen)) - var/drawtype = tgui_alert(user, "Choose what emotions you'd like to display.", "Emotions", list("joy","pensive","angry","flushed" )) - switch(drawtype) - if("joy") - src.icon_state = "joy" - if("pensive") - src.icon_state = "pensive" - if("angry") - src.icon_state = "angry" - if("flushed") - src.icon_state = "flushed" - return - -//Gaiter scarves -/obj/item/clothing/mask/gaiter - name = "red neck gaiter" - desc = "A slightly worn neck gaiter, it's loose enough to be worn comfortably like a scarf. Commonly used by outdoorsmen and mercenaries, both to keep warm and keep debris away from the face." - icon_state = "gaiter_red" - -/obj/item/clothing/mask/gaiter/attack_self(mob/user as mob) - if(src.icon_state == initial(icon_state)) - src.icon_state = "[icon_state]_up" - to_chat(user, "You pull the gaiter up over your nose.") - else - src.icon_state = initial(icon_state) - to_chat(user, "You tug the gaiter down around your neck.") - update_clothing_icon() //so our mob-overlays update - -/obj/item/clothing/mask/gaiter/tan - name = "tan neck gaiter" - icon_state = "gaiter_tan" - -/obj/item/clothing/mask/gaiter/gray - name = "gray neck gaiter" - icon_state = "gaiter_gray" - -/obj/item/clothing/mask/gaiter/green - name = "green neck gaiter" - icon_state = "gaiter_green" -======= icon_state = "veil" /obj/item/clothing/mask/paper @@ -492,5 +394,4 @@ desc = "100% synthetic \"Country Girls LLC.\" brand mouth wheat. Warning: not for actual consumption." icon_state = "mouthwheat" w_class = ITEMSIZE_SMALL - body_parts_covered = 0 ->>>>>>> 23daa38dfa... Merge pull request #11716 from GhostActual/straw_accessories + body_parts_covered = 0 \ No newline at end of file diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index a8f6bf57a1..e18b594233 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -524,7 +524,7 @@ /obj/item/clothing/suit/storage/toggle/bomber/retro name = "retro bomber jacket" desc = "A retro style, fur-lined leather bomber jacket that invokes the early days of space exploration when spacemen were spacemen, and laser guns had funny little antennae on them." - icon_state = "retro_bomber" + icon_state = "retrojacket" /obj/item/clothing/suit/storage/bomber/alt name = "bomber jacket" diff --git a/code/modules/clothing/under/accessories/holster_vr.dm b/code/modules/clothing/under/accessories/holster_vr.dm index 8cd7681dd9..2506251a4f 100644 --- a/code/modules/clothing/under/accessories/holster_vr.dm +++ b/code/modules/clothing/under/accessories/holster_vr.dm @@ -1,6 +1,6 @@ /obj/item/clothing/accessory/holster/waist/kinetic_accelerator name = "KA holster" - desc = "A specialized holster, made specifically for Kinetic Accelerator." + desc = "A specialized holster, made specifically for Kinetic Accelerators." can_hold = list(/obj/item/weapon/gun/energy/kinetic_accelerator) /obj/item/clothing/accessory/holster/machete/rapier diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index de1fa2dc85..61b5921157 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -34,6 +34,11 @@ /// Packaged meals switch to this state when opened, if set var/package_open_state + /// If this is canned. If true, it will print a message and ask you to open it + var/canned = FALSE + /// Canned food switch to this state when opened, if set + var/canned_open_state + /obj/item/weapon/reagent_containers/food/snacks/Initialize() . = ..() if(nutriment_amt) @@ -63,6 +68,9 @@ if(package && !user.incapacitated()) unpackage(user) + if(canned && !user.incapacitated()) + uncan(user) + /obj/item/weapon/reagent_containers/food/snacks/attack(mob/living/M as mob, mob/user as mob, def_zone) if(reagents && !reagents.total_volume) to_chat(user, "None of [src] left!") @@ -74,6 +82,10 @@ to_chat(M, "How do you expect to eat this with the package still on?") return FALSE + if(canned) + to_chat(M, "How do you expect to eat this without opening it?") + return FALSE + if(istype(M, /mob/living/carbon)) //TODO: replace with standard_feed_mob() call. @@ -257,6 +269,13 @@ if(package_open_state) icon_state = package_open_state +/obj/item/weapon/reagent_containers/food/snacks/proc/uncan(mob/user) + canned = FALSE + to_chat(user, "You unseal \the [src] with a crack of metal.") + playsound(loc,'sound/effects/tincanopen.ogg', rand(10,50), 1) + if(canned_open_state) + icon_state = canned_open_state + //////////////////////////////////////////////////////////////////////////////// /// FOOD END //////////////////////////////////////////////////////////////////////////////// @@ -4224,10 +4243,12 @@ desc = "Musical fruit in a slightly less musical container." filling_color = "#FC6F28" icon_state = "bakedbeans" - nutriment_amt = 4 - nutriment_desc = list("beans" = 4) bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/berrymuffin/berry/Initialize() + . = ..() + reagents.add_reagent("bean_protein", 6) + /obj/item/weapon/reagent_containers/food/snacks/sugarcookie name = "sugar cookie" desc = "Just like your little sister used to make." @@ -6745,34 +6766,8 @@ //////////////////////Canned Foods - crack open and eat (ADDED 04/11/2021)////////////////////// /obj/item/weapon/reagent_containers/food/snacks/canned - name = "void can" icon = 'icons/obj/food_canned.dmi' - flags = 0 - var/sealed = TRUE - -/obj/item/weapon/reagent_containers/food/snacks/canned/Initialize() - . = ..() - if(!sealed) - unseal() - -/obj/item/weapon/reagent_containers/food/snacks/canned/examine(mob/user) - . = ..() - to_chat(user, "It is [sealed ? "" : "un"]sealed.") - -/obj/item/weapon/reagent_containers/food/snacks/canned/proc/unseal() - flags |= OPENCONTAINER - sealed = FALSE - update_icon() - -/obj/item/weapon/reagent_containers/food/snacks/canned/attack_self(var/mob/user) - if(sealed) - playsound(loc,'sound/effects/tincanopen.ogg', rand(10,50), 1) - to_chat(user, "You unseal \the [src] with a crack of metal.") - unseal() - -/obj/item/weapon/reagent_containers/food/snacks/canned/update_icon() - if(!sealed) - icon_state = "[initial(icon_state)]-open" + canned = TRUE //////////Just a short line of Canned Consumables, great for treasure in faraway abandoned outposts////////// @@ -6781,6 +6776,7 @@ icon_state = "beef" desc = "A can of premium preserved vat-grown holstein beef. Now 99.9% bone free!" trash = /obj/item/trash/beef + canned_open_state = "beef-open" filling_color = "#663300" center_of_mass = list("x"=15, "y"=9) nutriment_desc = list("beef" = 1) @@ -6789,54 +6785,54 @@ /obj/item/weapon/reagent_containers/food/snacks/canned/beef/Initialize() .=..() reagents.add_reagent("protein", 4) - reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("sodiumchloride", 2) /obj/item/weapon/reagent_containers/food/snacks/canned/beans name = "baked beans" icon_state = "beans" desc = "Luna Colony beans. Carefully synthethized from soy." trash = /obj/item/trash/beans + canned_open_state = "beans-open" filling_color = "#ff6633" center_of_mass = list("x"=15, "y"=9) nutriment_desc = list("beans" = 1, "tomato sauce" = 1) - nutriment_amt = 15 bitesize = 2 -///obj/item/weapon/reagent_containers/food/snacks/canned/tomato (NEED TO SEE HOW TO CHANGE EATING SOUND) -// name = "tomato soup" -// icon_state = "tomato" -// desc = "Plain old unseasoned tomato soup. This can has no use-by date." -// trash = "/obj/item/trash/tomato" -// filling_color = "#ae0000" -// center_of_mass = list("x"=15, "y"=9) -// nutriment_desc = list("tomato" = 1) -// bitesize = 3 -// eat_sound = 'sound/items/drink.ogg' -// -///obj/item/weapon/reagent_containers/food/snacks/canned/tomato/Initialize() -// .=..() -// reagents.add_reagent(/datum/reagent/drink/juice/tomato, 12) -// -// -///obj/item/weapon/reagent_containers/food/snacks/canned/tomato/feed_sound(var/mob/user) -// playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) +/obj/item/weapon/reagent_containers/food/snacks/canned/beans/Initialize() + .=..() + reagents.add_reagent("bean_protein", 5) + reagents.add_reagent("tomatojuice", 5) + +/obj/item/weapon/reagent_containers/food/snacks/canned/tomato + name = "tomato soup" + icon_state = "tomato" + desc = "Plain old unseasoned tomato soup. This can has no use-by date." + trash = /obj/item/trash/tomato + package_open_state = "tomato-open" + filling_color = "#ae0000" + center_of_mass = list("x"=15, "y"=9) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/canned/tomato/Initialize() + .=..() + reagents.add_reagent("tomatojuice", 12) /obj/item/weapon/reagent_containers/food/snacks/canned/spinach name = "spinach" icon_state = "spinach" desc = "Wup-Az! Brand canned spinach. Notably has less iron in it than a watermelon." trash = /obj/item/trash/spinach + canned_open_state = "spinach-open" filling_color = "#003300" center_of_mass = list("x"=15, "y"=9) - nutriment_amt = 5 nutriment_desc = list("soggy" = 1, "vegetable" = 1) - bitesize = 5 + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/canned/spinach/Initialize() .=..() - reagents.add_reagent("adrenaline", 5) - reagents.add_reagent("hyperzine", 5) - reagents.add_reagent("iron", 5) + reagents.add_reagent("adrenaline", 4) + reagents.add_reagent("hyperzine", 4) + reagents.add_reagent("iron", 4) //////////////////////////////Advanced Canned Food////////////////////////////// @@ -6845,30 +6841,30 @@ icon_state = "fisheggs" desc = "Terran caviar, or space carp eggs. Carefully faked using alginate, artificial flavoring and salt. Skrell approved!" trash = /obj/item/trash/fishegg + canned_open_state = "fisheggs-open" filling_color = "#000000" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("fish" = 1, "salt" = 1) - nutriment_amt = 6 + nutriment_desc = list("salt" = 1) bitesize = 1 -/obj/item/weapon/reagent_containers/food/snacks/caviar/Initialize() +/obj/item/weapon/reagent_containers/food/snacks/canned/caviar/Initialize() . = ..() - reagents.add_reagent("protein", 5) + reagents.add_reagent("seafood", 5) /obj/item/weapon/reagent_containers/food/snacks/canned/caviar/true name = "\improper Classic Terran Caviar" icon_state = "carpeggs" desc = "Terran caviar, or space carp eggs. Banned by the Vir Food Health Administration for exceeding the legally set amount of carpotoxins in food stuffs." trash = /obj/item/trash/carpegg + canned_open_state = "carpeggs-open" filling_color = "#330066" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("fish" = 1, "salt" = 1, "a numbing sensation" = 1) - nutriment_amt = 6 + nutriment_desc = list("salt" = 1, "a numbing sensation" = 1) bitesize = 1 -/obj/item/weapon/reagent_containers/food/snacks/caviar/true/Initialize() +/obj/item/weapon/reagent_containers/food/snacks/canned/caviar/true/Initialize() . = ..() - reagents.add_reagent("protein", 4) + reagents.add_reagent("seafood", 4) reagents.add_reagent("carpotoxin", 1) /obj/item/weapon/reagent_containers/food/snacks/canned/maps @@ -6876,13 +6872,12 @@ icon_state = "maps" desc = "A re-branding of a classic Terran snack! Contains mostly edible ingredients." trash = /obj/item/trash/maps + canned_open_state = "maps-open" filling_color = "#330066" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("meat" = 1, "salt" = 1) - nutriment_amt = 8 bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/maps/Initialize() +/obj/item/weapon/reagent_containers/food/snacks/canned/maps/Initialize() . = ..() reagents.add_reagent("protein", 6) reagents.add_reagent("sodiumchloride", 2) @@ -6892,10 +6887,10 @@ icon_state = "appleberry" desc = "A classic snack favored by Sol astronauts. Made from dried apple-hybidized berries grown on the lunar colonies." trash = /obj/item/trash/appleberry + canned_open_state = "appleberry-open" filling_color = "#FFFFFF" center_of_mass = list("x"=15, "y"=9) nutriment_desc = list("apple" = 1, "sweetness" = 1) - nutriment_amt = 8 bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/appleberry/Initialize() @@ -6907,16 +6902,50 @@ icon_state = "ntbeans" desc = "Musical fruit in a slightly less musical container. Now with bacon!" trash = /obj/item/trash/ntbeans + canned_open_state = "ntbeans-open" filling_color = "#FC6F28" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("beans" = 4) - nutriment_amt = 6 bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/canned/ntbeans/Initialize() . = ..() + reagents.add_reagent("bean_protein", 6) reagents.add_reagent("protein", 2) +/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax + name = "\improper BrainzSnax" + icon_state = "brainzsnax" + desc = "A can of grey matter marketed for xenochimeras." + description_fluff = "As the cartoon brain with limbs proudly proclaims, \"It's meat. Eat it!\" On the can is printed \"Rich in limbic system\" and \ + under that in infinitely small letters, \"Warning, product must be eaten within two hours of opening. May contain prion disease. \ + GrubCo LTD is not liable for any brain damage occuring after consumption of product.\"" + trash = /obj/item/trash/brainzsnax + canned_open_state = "brainzsnax-open" + filling_color = "#caa3c9" + center_of_mass = list("x"=15, "y"=9) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/Initialize() + . = ..() + reagents.add_reagent("brain_protein", 10) + +/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red + name = "\improper BrainzSnax RED" + icon_state = "brainzsnaxred" + desc = "A can of grey matter marketed for xenochimeras. This one has added tomato sauce." + description_fluff = "As the cartoonish brain with limbs proudly proclaims, \"It's meat. Eat it!\" On the can is printed \"Yummy red stuff!\" and \ + under that in infinitely small letters, \"Warning, product must be eaten within two hours of opening. May contain prion disease. \ + GrubCo LTD is not liable for any brain damage occuring after consumption of product.\"" + trash = /obj/item/trash/brainzsnaxred + canned_open_state = "brainzsnaxred-open" + filling_color = "#a6898d" + center_of_mass = list("x"=15, "y"=9) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red/Initialize() + . = ..() + reagents.add_reagent("red_brain_protein", 10) + //////////////Packaged Food - break open and eat////////////// /obj/item/weapon/reagent_containers/food/snacks/packaged @@ -7008,7 +7037,7 @@ /obj/item/weapon/reagent_containers/food/snacks/packaged/meatration/Initialize() . = ..() - reagents.add_reagent("protein", 3) + reagents.add_reagent("protein", 4) /obj/item/weapon/reagent_containers/food/snacks/packaged/vegration name = "veggie ration" diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 99cca32d4c..ee7060dfd8 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -358,7 +358,7 @@ //BASKETBALL OBJECTS /obj/item/weapon/beach_ball/holoball - icon = 'icons/obj/basketball.dmi' + icon = 'icons/obj/balls_vr.dmi' icon_state = "basketball" name = "basketball" desc = "Here's your chance, do your dance at the Space Jam." @@ -370,7 +370,7 @@ /obj/structure/holohoop name = "basketball hoop" desc = "Boom, Shakalaka!" - icon = 'icons/obj/basketball.dmi' + icon = 'icons/obj/32x64.dmi' icon_state = "hoop" anchored = TRUE density = TRUE @@ -406,7 +406,6 @@ return FALSE return ..() - /obj/machinery/readybutton name = "Ready Declaration Device" desc = "This device is used to declare ready. If all devices in an area are ready, the event will begin!" diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index b8618ccf86..e1874f1a93 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -11,11 +11,13 @@ icon_state = "mining_drill" circuit = /obj/item/weapon/circuitboard/miningdrill var/braces_needed = 2 - var/list/supports = list() + var/list/obj/machinery/mining/brace/supports = list() var/supported = 0 var/active = 0 var/list/resource_field = list() var/obj/item/device/radio/intercom/faultreporter + var/drill_range = 5 + var/offset = 2 var/list/ore_types = list( "hematite" = /obj/item/weapon/ore/iron, @@ -242,10 +244,14 @@ harvest_speed = 0 capacity = 0 charge_use = 50 + drill_range = 5 + offset = 2 for(var/obj/item/weapon/stock_parts/P in component_parts) if(istype(P, /obj/item/weapon/stock_parts/micro_laser)) harvest_speed = P.rating + if(P.rating >= 5) + harvest_speed *= 2 exotic_drilling = P.rating - 1 if(exotic_drilling >= 1) ore_types |= ore_types_uncommon @@ -254,6 +260,14 @@ else ore_types -= ore_types_uncommon ore_types -= ore_types_rare + if(P.rating > 3) // are we t4+? + // default drill range 5, offset 2 + if(P.rating >= 5) // t5 + drill_range = 9 + offset = 4 + else if(P.rating >= 4) // t4 + drill_range = 7 + offset = 3 if(istype(P, /obj/item/weapon/stock_parts/matter_bin)) capacity = 200 * P.rating if(istype(P, /obj/item/weapon/stock_parts/capacitor)) @@ -271,8 +285,12 @@ else anchored = TRUE - if(supports && supports.len >= braces_needed) - supported = 1 + if(supports) + if(supports.len >= braces_needed) + supported = 1 + else for(var/obj/machinery/mining/brace/check in supports) + if(check.brace_tier > 3) + supported = 1 update_icon() @@ -293,11 +311,11 @@ var/turf/T = get_turf(src) if(!istype(T)) return - var/tx = T.x - 2 - var/ty = T.y - 2 + var/tx = T.x - offset + var/ty = T.y - offset var/turf/simulated/mine_turf - for(var/iy = 0,iy < 5, iy++) - for(var/ix = 0, ix < 5, ix++) + for(var/iy = 0,iy < drill_range, iy++) + for(var/ix = 0, ix < drill_range, ix++) mine_turf = locate(tx + ix, ty + iy, T.z) if(!istype(mine_turf, /turf/space/)) if(mine_turf && mine_turf.has_resources) @@ -334,12 +352,23 @@ desc = "A machinery brace for an industrial drill. It looks easily two feet thick." icon_state = "mining_brace" circuit = /obj/item/weapon/circuitboard/miningdrillbrace + var/brace_tier = 1 var/obj/machinery/mining/drill/connected -/obj/machinery/mining/brace/New() - ..() +/obj/machinery/mining/brace/examine(mob/user) + . = ..() + if(brace_tier > 3) + . += SPAN_NOTICE("The internals of the brace look resilient enough to support a drill by itself.") - component_parts = list() +/obj/machinery/mining/brace/Initialize() + . = ..() + default_apply_parts() + +/obj/machinery/mining/brace/RefreshParts() + ..() + brace_tier = 0 + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + brace_tier += M.rating /obj/machinery/mining/brace/attackby(obj/item/weapon/W as obj, mob/user as mob) if(connected && connected.active) @@ -350,6 +379,8 @@ return if(default_deconstruction_crowbar(user, W)) return + if(default_part_replacement(user,W)) + return if(W.is_wrench()) diff --git a/code/modules/mining/kinetic_crusher.dm b/code/modules/mining/kinetic_crusher.dm index f4712d31b9..7effaf60d9 100644 --- a/code/modules/mining/kinetic_crusher.dm +++ b/code/modules/mining/kinetic_crusher.dm @@ -246,7 +246,7 @@ slot_r_hand_str = 'icons/mob/items/righthand_melee_vr.dmi', ) item_state = "c-machete" - w_class = ITEMSIZE_SMALL + w_class = ITEMSIZE_NORMAL attack_verb = list("cleaved", "chopped", "pulped", "stabbed", "skewered") can_cleave = TRUE requires_wield = FALSE diff --git a/code/modules/mining/ore_box.dm b/code/modules/mining/ore_box.dm index 7ab96cda10..ff7d36e6dd 100644 --- a/code/modules/mining/ore_box.dm +++ b/code/modules/mining/ore_box.dm @@ -63,34 +63,33 @@ for(var/ore in stored_ore) . += "- [stored_ore[ore]] [ore]" -/obj/structure/ore_box/verb/empty_box() - set name = "Empty Ore Box" - set category = "Object" - set src in view(1) - - if(!ishuman(usr) && !isrobot(usr)) //Only living, intelligent creatures with gripping aparatti can empty ore boxes. - to_chat(usr, "You are physically incapable of emptying the ore box.") - return - - if(usr.stat || usr.restrained()) - return - - if(!Adjacent(usr)) //You can only empty the box if you can physically reach it - to_chat(usr, "You cannot reach the ore box.") - return - - add_fingerprint(usr) - - if(contents.len < 1) - to_chat(usr, "The ore box is empty.") - return - - for (var/obj/item/weapon/ore/O in contents) - contents -= O - O.loc = src.loc - to_chat(usr, "You empty the ore box.") - - return +// /obj/structure/ore_box/verb/empty_box() +// set name = "Empty Ore Box" +// set category = "Object" +// set src in view(1) +// +// if(!ishuman(usr) && !isrobot(usr)) //Only living, intelligent creatures with gripping aparatti can empty ore boxes. +// to_chat(usr, "You are physically incapable of emptying the ore box.") +// return +// if(usr.stat || usr.restrained()) +// return +// +// if(!Adjacent(usr)) //You can only empty the box if you can physically reach it +// to_chat(usr, "You cannot reach the ore box.") +// return +// +// add_fingerprint(usr) +// +// if(contents.len < 1) +// to_chat(usr, "The ore box is empty.") +// return +// +// for (var/obj/item/weapon/ore/O in contents) +// contents -= O +// O.loc = src.loc +// to_chat(usr, "You empty the ore box.") +// +// return /obj/structure/ore_box/ex_act(severity) if(severity == 1.0 || (severity < 3.0 && prob(50))) diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index 1f54311881..e1f33581e1 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -76,7 +76,7 @@ EQUIPMENT("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 900), EQUIPMENT("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), EQUIPMENT("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), - EQUIPMENT("KA Efficiency Increase", /obj/item/borg/upgrade/modkit/efficiency, 1200), + EQUIPMENT("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1200), EQUIPMENT("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), EQUIPMENT("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000), EQUIPMENT("KA Holster", /obj/item/clothing/accessory/holster/waist/kinetic_accelerator, 350), diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 08457ad628..f30898809e 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -7,7 +7,7 @@ colour = "soghun" key = "q" machine_understands = 0 - flags = RESTRICTED + flags = WHITELISTED // RESTRICTED would make this completely unavailable from character select syllables = list("hs","zt","kr","st","sh") /datum/language/diona_local/get_random_name() @@ -20,7 +20,7 @@ desc = "A complex language known instinctively by Dionaea, 'spoken' by emitting modulated radio waves. This version uses low frequency waves for slow communication at long ranges." key = "w" machine_understands = 0 - flags = RESTRICTED | HIVEMIND + flags = WHITELISTED | HIVEMIND // RESTRICTED would make this completely unavailable from character select /datum/language/unathi name = LANGUAGE_UNATHI diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index 6a651155f1..f4c0aeb64c 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -452,7 +452,7 @@ return treatment_emag // If they're injured, we're using a beaker, and they don't have on of the chems in the beaker - if(reagent_glass && use_beaker && ((H.getBruteLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getOxyLoss() >= (heal_threshold + 15)))) + if(reagent_glass && use_beaker && ((H.getBruteLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getFireLoss() >= heal_threshold) || (H.getOxyLoss() >= (heal_threshold + 15)))) for(var/datum/reagent/R in reagent_glass.reagents.reagent_list) if(!H.reagents.has_reagent(R)) return 1 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 6c2e0a8595..c017377297 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -173,7 +173,8 @@ This saves us from having to call add_fingerprint() any time something is put in if(I.flags_inv & (BLOCKHAIR|BLOCKHEADHAIR)) update_hair(0) //rebuild hair update_inv_ears(0) - if(internal) + // If this is how the internals are connected, disable them + if(internal && !(head?.item_flags & AIRTIGHT)) if(internals) internals.icon_state = "internal0" internal = null diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm index 6aba13840b..0ac13c062c 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm @@ -122,6 +122,7 @@ sleep(5) //The duration of the TP animation canmove = original_canmove alpha = initial(alpha) + remove_modifiers_of_type(/datum/modifier/shadekin_phase_vision) //Potential phase-in vore if(can_be_drop_pred) //Toggleable in vore panel @@ -170,6 +171,7 @@ var/obj/effect/temp_visual/shadekin/phase_out/phaseanim = new /obj/effect/temp_visual/shadekin/phase_out(src.loc) phaseanim.dir = dir alpha = 0 + add_modifier(/datum/modifier/shadekin_phase_vision) sleep(5) invisibility = INVISIBILITY_LEVEL_TWO see_invisible = INVISIBILITY_LEVEL_TWO @@ -182,6 +184,10 @@ density = FALSE force_max_speed = TRUE +/datum/modifier/shadekin_phase_vision + name = "Shadekin Phase Vision" + vision_flags = SEE_THRU + ////////////////////////// /// REGENERATE OTHER /// ////////////////////////// diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index dd7d27bdd8..62ef3c0a78 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -490,7 +490,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() var/image/em_block_ears if(ears_s) if(ears_s.Height() > face_standing.Height()) // Tol ears - face_standing.Crop(face_standing.Width(), ears_s.Height()) + face_standing.Crop(1, 1, face_standing.Width(), ears_s.Height()) face_standing.Blend(ears_s, ICON_OVERLAY) if(ear_style?.em_block) em_block_ears = em_block_image_generic(image(ears_s)) diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm index 04523d514e..a570ed60db 100644 --- a/code/modules/mob/living/living_vr.dm +++ b/code/modules/mob/living/living_vr.dm @@ -12,13 +12,13 @@ var/sayselect = tgui_alert(src, "Which say-verb do you wish to customize?", "Select Verb", list("Say","Whisper","Ask (?)","Exclaim/Shout/Yell (!)","Cancel")) if(sayselect == "Say") - custom_say = sanitize(input(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null) as text) + custom_say = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null) as text)) else if(sayselect == "Whisper") - custom_whisper = sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [src] whispers, \"Hi...\"", "Custom Whisper", null) as text) + custom_whisper = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [src] whispers, \"Hi...\"", "Custom Whisper", null) as text)) else if(sayselect == "Ask (?)") - custom_ask = sanitize(input(usr, "This word or phrase will appear instead of 'asks': [src] asks, \"Hi?\"", "Custom Ask", null) as text) + custom_ask = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'asks': [src] asks, \"Hi?\"", "Custom Ask", null) as text)) else if(sayselect == "Exclaim/Shout/Yell (!)") - custom_exclaim = sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [src] exclaims, \"Hi!\"", "Custom Exclaim", null) as text) + custom_exclaim = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [src] exclaims, \"Hi!\"", "Custom Exclaim", null) as text)) else return diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 1cda8274d3..91e5a9db43 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -612,7 +612,6 @@ for(var/tech in tech_item.origin_tech) files.UpdateTech(tech, tech_item.origin_tech[tech]) synced = FALSE - drain(-50 * digested) if(volume) water.add_charge(volume) if(recycles && T.matter) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm index 75a0ca508e..4eb5b16661 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm @@ -124,7 +124,7 @@ vore_icons = 0 /mob/living/simple_mob/animal/space/carp/large/huge vore_icons = 0 -/mob/living/simple_mob/animal/space/carp/holographic +/mob/living/simple_mob/animal/space/carp/holodeck vore_icons = 0 /* //VOREStation AI Temporary removal diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 83a2c06213..86b22c3da4 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -175,12 +175,13 @@ assailant.visible_message("[assailant] covers [affecting]'s eyes!") if(affecting.eye_blind < 3) affecting.Blind(3) - //TFF 8/1/20 CHOMPStation Addition Start - Re-add sitting on one's head. if(BP_HEAD) if(force_down) - if(announce) - assailant.visible_message("[assailant] sits on [target]'s head!") - //CHOMPStation Addition End + if(user.a_intent == I_HELP) + if(announce) + assailant.visible_message("[assailant] sits on [target]'s face!") + //VOREStation Edit End + /obj/item/weapon/grab/attack_self() return s_click(hud) diff --git a/code/modules/multiz/stairs.dm b/code/modules/multiz/stairs.dm index 52b275a92f..99b015c6c2 100644 --- a/code/modules/multiz/stairs.dm +++ b/code/modules/multiz/stairs.dm @@ -18,13 +18,13 @@ // Returns TRUE if the stairs are a complete and connected unit, FALSE if a piece is missing or obstructed // Will attempt to reconnect broken pieces -// Parameters: +// Parameters: // - B1: Loc of bottom stair // - B2: Loc of middle stair // - T1: Openspace over bottom stair // - T2: Loc of top stair, over middle stair -/obj/structure/stairs/proc/check_integrity(var/obj/structure/stairs/bottom/B = null, - var/obj/structure/stairs/middle/M = null, +/obj/structure/stairs/proc/check_integrity(var/obj/structure/stairs/bottom/B = null, + var/obj/structure/stairs/middle/M = null, var/obj/structure/stairs/top/T = null, var/turf/simulated/open/O = null) @@ -91,14 +91,14 @@ var/obj/structure/stairs/middle/M = null, var/obj/structure/stairs/top/T = null, var/turf/simulated/open/O = null) - + // In the case where we're provided all the pieces, just try connecting them. // In order: all exist, they are appropriately adjacent, and they can connect if(istype(B) && istype(M) && istype(T) && istype(O) && \ B.Adjacent(M) && (GetBelow(O) == get_turf(B)) && T.Adjacent(O) && \ ..()) return TRUE - + // If we're already configured, just check those else if(istype(top) && istype(middle)) O = locate(/turf/simulated/open) in GetAbove(src) @@ -118,7 +118,7 @@ // If you set the dir, that's the dir it *wants* to connect in. It only chooses the others if that doesn't work // Everything is simply linked in our original direction - if(istype(M) && istype(T) && ..(src, M, T, O)) + if(istype(M) && istype(T) && ..(src, M, T, O)) return TRUE // Else, we have to look in other directions @@ -127,12 +127,12 @@ T2 = GetAbove(B2) if(!istype(B2) || !istype(T2)) continue - + T = locate(/obj/structure/stairs/top) in T2 M = locate(/obj/structure/stairs/middle) in B2 if(..(src, M, T, O)) return TRUE - + // Out of the dir check, we have no valid neighbors, and thus are not complete. return FALSE @@ -143,18 +143,18 @@ use_stairs(AM, oldloc) ..() -/obj/structure/stairs/bottom/use_stairs(var/atom/movable/AM, var/atom/oldloc) +/obj/structure/stairs/bottom/use_stairs(var/atom/movable/AM, var/atom/oldloc) // If we're coming from the top of the stairs, don't trap us in an infinite staircase // Or if we fell down the openspace if((top in oldloc) || oldloc == GetAbove(src)) return - + if(isobserver(AM)) // Ghosts have their own methods for going up and down return - + if(AM.pulledby) // Animating the movement of pulled things is handled when the puller goes up the stairs return - + if(AM.has_buckled_mobs()) // Similarly, the rider entering the turf will bring along whatever they're buckled to return @@ -173,7 +173,7 @@ pulling |= L.pulling for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) pulling |= G.affecting - + // If the stairs aren't broken, go up. if(check_integrity()) AM.dir = src.dir @@ -185,7 +185,7 @@ // Move to Top AM.forceMove(get_turf(top)) - + // If something is being pulled, bring it along directly to avoid the mob being torn away from it due to movement delays for(var/atom/movable/P in pulling) P.forceMove(get_turf(top)) // Just bring it along directly, no fussing with animation timing @@ -202,16 +202,18 @@ if(isliving(AM)) var/mob/living/L = AM - + if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs. return - + if(L.has_buckled_mobs()) return if(L.buckled) L.buckled.forceMove(get_turf(top)) - + + L.forceMove(get_turf(top)) + // If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so. if(L.pulling && !L.pulling.anchored) var/atom/movable/P = L.pulling @@ -220,8 +222,7 @@ for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) G.affecting.forceMove(get_turf(top)) - L.forceMove(get_turf(top)) - + if(L.client) L.client.Process_Grab() else @@ -255,10 +256,10 @@ // These are necessarily fairly similar, but because the positional relations are different, we have to copy-pasta a fair bit /obj/structure/stairs/middle/check_integrity(var/obj/structure/stairs/bottom/B = null, - var/obj/structure/stairs/middle/M = null, + var/obj/structure/stairs/middle/M = null, var/obj/structure/stairs/top/T = null, var/turf/simulated/open/O = null) - + // In the case where we're provided all the pieces, just try connecting them. // In order: all exist, they are appropriately adjacent, and they can connect if(istype(B) && istype(M) && istype(T) && istype(O) && \ @@ -281,7 +282,7 @@ // Top is static for Middle stair, if it's invalid we can't do much if(!istype(T)) return FALSE - + // If you set the dir, that's the dir it *wants* to connect in. It only chooses the others if that doesn't work // Everything is simply linked in our original direction if(istype(B1) && istype(T2) && istype(O) && ..(B, src, T, O)) @@ -293,11 +294,11 @@ O = GetAbove(B1) if(!istype(B1) || !istype(O)) continue - + B = locate(/obj/structure/stairs/bottom) in B1 if(..(B, src, T, O)) return TRUE - + // The middle stair has some further special logic, in that it can be climbed, and so is technically valid if only the top exists // T is enforced by a prior if T.middle = src @@ -341,7 +342,7 @@ var/obj/structure/stairs/middle/M = null, var/obj/structure/stairs/top/T = null, var/turf/simulated/open/O = null) - + // In the case where we're provided all the pieces, just try connecting them. // In order: all exist, they are appropriately adjacent, and they can connect if(istype(B) && istype(M) && istype(T) && istype(O) && \ @@ -377,11 +378,11 @@ B1 = GetBelow(O) if(!istype(B1) || !istype(O)) continue - + B = locate(/obj/structure/stairs/bottom) in B1 if((. = ..(B, M, src, O))) return - + // Out of the dir check, we have no valid neighbors, and thus are not complete. `.` was set by ..() return @@ -403,13 +404,13 @@ // Or if we climb up the middle if((bottom in oldloc) || oldloc == GetBelow(src)) return - + if(isobserver(AM)) // Ghosts have their own methods for going up and down return - + if(AM.pulledby) // Animating the movement of pulled things is handled when the puller goes up the stairs return - + if(AM.has_buckled_mobs()) // Similarly, the rider entering the turf will bring along whatever they're buckled to return @@ -428,7 +429,7 @@ pulling |= L.pulling for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) pulling |= G.affecting - + // If the stairs aren't broken, go up. if(check_integrity()) AM.dir = turn(src.dir, 180) @@ -438,7 +439,7 @@ // Move to Top AM.forceMove(get_turf(bottom)) - + // If something is being pulled, bring it along directly to avoid the mob being torn away from it due to movement delays for(var/atom/movable/P in pulling) P.forceMove(get_turf(bottom)) // Just bring it along directly, no fussing with animation timing @@ -455,16 +456,18 @@ if(isliving(AM)) var/mob/living/L = AM - + if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs. return - + if(L.has_buckled_mobs()) return if(L.buckled) L.buckled.forceMove(get_turf(bottom)) - + + L.forceMove(get_turf(bottom)) + // If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so. if(L.pulling && !L.pulling.anchored) var/atom/movable/P = L.pulling @@ -473,8 +476,6 @@ for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) G.affecting.forceMove(get_turf(bottom)) - - L.forceMove(get_turf(bottom)) if(L.client) L.client.Process_Grab() @@ -493,14 +494,14 @@ var/turf/B2 = get_turf(src) var/turf/T1 = GetAbove(B1) var/turf/T2 = GetAbove(B2) - + if(!istype(B1) || !istype(B2)) warning("Stair created at invalid loc: ([loc.x], [loc.y], [loc.z])") return INITIALIZE_HINT_QDEL if(!istype(T1) || !istype(T2)) warning("Stair created without level above: ([loc.x], [loc.y], [loc.z])") return INITIALIZE_HINT_QDEL - + // Spawn the stairs // Railings sold separately var/turf/simulated/open/O = T1 @@ -516,7 +517,7 @@ B.check_integrity(B, M, T, O) return INITIALIZE_HINT_QDEL - + // For ease of spawning. While you *can* spawn the base type and set its dir, this is useful for adminbus and a little bit quicker to map in /obj/structure/stairs/spawner/north dir = NORTH diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index aa37003520..2b0d100c10 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -14,6 +14,8 @@ throw_speed = 3 throw_range = 5 w_class = ITEMSIZE_NORMAL + /// Are we EMP immune? + var/emp_proof = FALSE var/static/cell_uid = 1 // Unique ID of this power cell. Used to reduce bunch of uglier code in nanoUI. var/c_uid var/charge = 0 // note %age conveted to actual charge in New @@ -189,6 +191,8 @@ rigged = 1 //broken batterys are dangerous /obj/item/weapon/cell/emp_act(severity) + if(emp_proof) + return //remove this once emp changes on dev are merged in if(isrobot(loc)) var/mob/living/silicon/robot/R = loc diff --git a/code/modules/power/cells/device_cells.dm b/code/modules/power/cells/device_cells.dm index 643383067d..a5a0b66e0e 100644 --- a/code/modules/power/cells/device_cells.dm +++ b/code/modules/power/cells/device_cells.dm @@ -69,6 +69,9 @@ update_icon() //CHOMP Add end +/obj/item/weapon/cell/device/weapon/empproof + emp_proof = TRUE + /obj/item/weapon/cell/device/weapon/recharge name = "self-charging weapon power cell" desc = "A small power cell designed to power handheld weaponry. This one recharges itself." diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index c1dae89a6e..74dc34a72c 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -21,6 +21,7 @@ var/recharge_time = 4 var/charge_tick = 0 var/charge_delay = 75 //delay between firing and charging + var/shot_counter = TRUE // does this gun tell you how many shots it has? var/battery_lock = 0 //If set, weapon cannot switch batteries @@ -175,14 +176,15 @@ /obj/item/weapon/gun/energy/examine(mob/user) . = ..() - if(power_supply) - if(charge_cost) - var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia - . += "Has [shots_remaining] shot\s remaining." + if(shot_counter) + if(power_supply) + if(charge_cost) + var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia + . += "Has [shots_remaining] shot\s remaining." + else + . += "Has infinite shots remaining." else - . += "Has infinite shots remaining." - else - . += "Does not have a power cell." + . += "Does not have a power cell." /obj/item/weapon/gun/energy/update_icon(var/ignore_inhands) if(power_supply == null) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm index 581e05d74d..f486d897d2 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm @@ -1,51 +1,126 @@ +#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland +#define HEATMODE_ATMOSPHERE 312.1 //kPa. basically virgo 2's +#define HEATMODE_TEMP 612 //kelvin. basically virgo 2's +/** + * This is here for now + */ +/proc/lavaland_environment_check(turf/simulated/T) + . = TRUE + if(!istype(T)) + return + var/datum/gas_mixture/environment = T.return_air() + if(!istype(environment)) + return + var/pressure = environment.return_pressure() + if(pressure > LAVALAND_EQUIPMENT_EFFECT_PRESSURE) + . = FALSE + if(environment.temperature < (T20C - 30)) + . = TRUE + +/proc/virgotwo_environment_check(turf/simulated/T) + . = TRUE + if(!istype(T)) + return + var/datum/gas_mixture/environment = T.return_air() + if(!istype(environment)) + return + var/pressure = environment.return_pressure() + if(pressure < HEATMODE_ATMOSPHERE - 20) + . = FALSE + if(environment.temperature > HEATMODE_TEMP - 30) + . = TRUE + /obj/item/weapon/gun/energy/kinetic_accelerator name = "proto-kinetic accelerator" - desc = "A self recharging, ranged mining tool that does increased damage in low temperature. Capable of holding up to six slots worth of mod kits." + desc = "A self recharging, ranged mining tool that does increased damage in low pressure." icon = 'icons/obj/gun_vr.dmi' icon_state = "kineticgun" - item_state = "kineticgun" item_icons = list( slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi') + slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi', + ) + item_state = "kineticgun" + // ammo_type = list(/obj/item/ammo_casing/energy/kinetic) + cell_type = /obj/item/weapon/cell/device/weapon/empproof + item_flags = NONE + charge_meter = FALSE + // obj_flags = UNIQUE_RENAME + // weapon_weight = WEAPON_LIGHT + // can_flashlight = 1 + // flight_x_offset = 15 + // flight_y_offset = 9 + // automatic_charge_overlays = FALSE projectile_type = /obj/item/projectile/kinetic - origin_tech = list(TECH_COMBAT = 3, TECH_POWER = 3, TECH_ENGINEERING = 3) - can_flashlight = TRUE - flight_x_offset = 15 - flight_y_offset = 9 - charge_cost = 120 // 20 shots on weapon power cell - fire_delay = 16 - self_recharge = TRUE - recharge_time = 10 // every 20*2 seconds will get 20% power restored + charge_cost = 1200 + battery_lock = TRUE + fire_sound = 'sound/weapons/kenetic_accel.ogg' + var/overheat_time = 16 + var/holds_charge = FALSE + var/unique_frequency = FALSE // modified by KA modkits + var/overheat = FALSE + var/emptystate = "kineticgun_empty" + shot_counter = FALSE + // can_bayonet = TRUE + // knife_x_offset = 20 + // knife_y_offset = 12 var/max_mod_capacity = 100 var/list/modkits = list() - var/empty_state = "kineticgun_empty" + + var/recharge_timerid + +/obj/item/weapon/gun/energy/kinetic_accelerator/consume_next_projectile() + if(overheat) + return + . = ..() + if(.) + var/obj/item/projectile/P = . + modify_projectile(P) + +/obj/item/weapon/gun/energy/kinetic_accelerator/handle_post_fire(mob/user, atom/target, pointblank, reflex) + . = ..() + attempt_reload() + +/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka + name = "premium accelerator" + desc = "A premium kinetic accelerator fitted with an extended barrel and increased pressure tank." + icon_state = "premiumgun" + item_state = "premiumgun" + projectile_type = /obj/item/projectile/kinetic/premium /obj/item/weapon/gun/energy/kinetic_accelerator/examine(mob/user) . = ..() - if(Adjacent(user) && max_mod_capacity) + if(max_mod_capacity) . += "[get_remaining_mod_capacity()]% mod capacity remaining." - for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits()) - . += "There is a [M.name] mod installed, using [M.cost]% capacity." + for(var/A in get_modkits()) + var/obj/item/borg/upgrade/modkit/M = A + . += "There is \a [M] installed, using [M.cost]% capacity." -/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/A, mob/user) - if(istype(A, /obj/item/weapon/tool/crowbar)) +/obj/item/weapon/gun/energy/kinetic_accelerator/Exited(atom/movable/AM) + . = ..() + if((AM in modkits) && istype(AM, /obj/item/borg/upgrade/modkit)) + var/obj/item/borg/upgrade/modkit/M = AM + M.uninstall(src, FALSE) + +/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user) + if(I.has_tool_quality(TOOL_CROWBAR)) if(modkits.len) to_chat(user, "You pry the modifications out.") - playsound(src, A.usesound, 100, 1) + playsound(loc, I.usesound, 100, 1) for(var/obj/item/borg/upgrade/modkit/M in modkits) M.uninstall(src) else to_chat(user, "There are no modifications currently installed.") - else if(istype(A, /obj/item/borg/upgrade/modkit)) - var/obj/item/borg/upgrade/modkit/MK = A + if(istype(I, /obj/item/borg/upgrade/modkit)) + var/obj/item/borg/upgrade/modkit/MK = I MK.install(src, user) else ..() /obj/item/weapon/gun/energy/kinetic_accelerator/proc/get_remaining_mod_capacity() var/current_capacity_used = 0 - for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits()) + for(var/A in get_modkits()) + var/obj/item/borg/upgrade/modkit/M = A current_capacity_used += M.cost return max_mod_capacity - current_capacity_used @@ -55,134 +130,243 @@ . += A /obj/item/weapon/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K) - for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits()) + K.kinetic_gun = src //do something special on-hit, easy! + for(var/A in get_modkits()) + var/obj/item/borg/upgrade/modkit/M = A M.modify_projectile(K) -/obj/item/weapon/gun/energy/kinetic_accelerator/consume_next_projectile() - var/obj/item/projectile/kinetic/BB = ..() - if(!istype(BB)) - return - modify_projectile(BB) +/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg + holds_charge = TRUE + unique_frequency = TRUE - var/turf/proj_turf = get_turf(src) - if(!isturf(proj_turf)) - return - var/datum/gas_mixture/environment = proj_turf.return_air() - if(environment.temperature > 250) - BB.name = "weakened [BB.name]" - BB.damage *= BB.pressure_decrease - return BB +/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/Destroy() + for(var/obj/item/borg/upgrade/modkit/M in modkits) + M.uninstall(src) + return ..() -/obj/item/weapon/gun/energy/kinetic_accelerator/handle_post_fire(mob/user, atom/target, var/pointblank=0, var/reflex=0) +/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka/cyborg + holds_charge = TRUE + unique_frequency = TRUE + +/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka/cyborg/Destroy() + for(var/obj/item/borg/upgrade/modkit/M in modkits) + M.uninstall(src) + return ..() + +/obj/item/weapon/gun/energy/kinetic_accelerator/minebot + // trigger_guard = TRIGGER_GUARD_ALLOW_ALL + overheat_time = 20 + holds_charge = TRUE + unique_frequency = TRUE + +/obj/item/weapon/gun/energy/kinetic_accelerator/Initialize() . = ..() - spawn(fire_delay) - if(power_supply && power_supply.check_charge(charge_cost)) - playsound(src, 'sound/weapons/kenetic_reload.ogg', 60, 1) + if(!holds_charge) + empty() + AddElement(/datum/element/conflict_checking, CONFLICT_ELEMENT_KA) + +/obj/item/weapon/gun/energy/kinetic_accelerator/equipped(mob/user) + . = ..() + if(power_supply.charge < charge_cost) + attempt_reload() + +/obj/item/weapon/gun/energy/kinetic_accelerator/dropped(mob/user) + . = ..() + if(!QDELING(src) && !holds_charge) + // Put it on a delay because moving item from slot to hand + // calls dropped(). + addtimer(CALLBACK(src, .proc/empty_if_not_held), 2) + +/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty_if_not_held() + if(!ismob(loc) && !istype(loc, /obj/item/integrated_circuit)) + empty() + +/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty() + if(power_supply) + power_supply.use(power_supply.charge) + update_icon() + +/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time) + if(!power_supply) + return + if(overheat) + return + if(!recharge_time) + recharge_time = overheat_time + overheat = TRUE + update_icon() + + var/carried = max(1, loc.ConflictElementCount(CONFLICT_ELEMENT_KA)) + + deltimer(recharge_timerid) + recharge_timerid = addtimer(CALLBACK(src, .proc/reload), recharge_time * carried, TIMER_STOPPABLE) + +/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity) + return + +/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload() + power_supply.give(power_supply.maxcharge) + // process_chamber() + // if(!suppressed) + playsound(src, 'sound/weapons/kenetic_reload.ogg', 60, 1) + // else + // to_chat(loc, "[src] silently charges up.") + overheat = FALSE + update_icon() /obj/item/weapon/gun/energy/kinetic_accelerator/update_icon() cut_overlays() - if(!power_supply || !power_supply.check_charge(charge_cost)) - add_overlay(empty_state) - if(can_flashlight) - var/iconF = "flight" - if(gun_light) - iconF = "flight_on" - add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)) + if(overheat || (power_supply.charge == 0)) + add_overlay(emptystate) + +#define KA_ENVIRO_TYPE_COLD 0 +#define KA_ENVIRO_TYPE_HOT 1 //Projectiles /obj/item/projectile/kinetic name = "kinetic force" - icon = 'icons/obj/projectiles_vr.dmi' icon_state = null - damage = 32 + damage = 30 damage_type = BRUTE check_armour = "bomb" - range = 3 // Our "range" var is named "kill_count". Yes it is. + range = 4 + // log_override = TRUE - var/pressure_decrease = 0.25 - var/turf_aoe = FALSE - var/mob_aoe = FALSE - var/list/hit_overlays = list() + var/pressure_decrease_active = FALSE + var/pressure_decrease = 1/3 + var/environment = KA_ENVIRO_TYPE_COLD + var/obj/item/weapon/gun/energy/kinetic_accelerator/kinetic_gun -// /obj/item/projectile/kinetic/pod -// kill_count = 4 -// -// /obj/item/projectile/kinetic/pod/regular -// damage = 50 -// pressure_decrease = 0.5 -// -// /obj/item/projectile/kinetic/pod/enhanced -// turf_aoe = TRUE -// mob_aoe = TRUE +/obj/item/projectile/kinetic/premium + damage = 40 + damage_type = BRUTE + range = 5 -/obj/item/projectile/kinetic/on_impact(var/atom/A) - strike_thing(A) - . = ..() +/obj/item/projectile/kinetic/Destroy() + kinetic_gun = null + return ..() -/obj/item/projectile/kinetic/on_hit(var/atom/target) +/obj/item/projectile/kinetic/Bump(atom/target) + if(kinetic_gun) + var/list/mods = kinetic_gun.get_modkits() + for(var/obj/item/borg/upgrade/modkit/M in mods) + M.projectile_prehit(src, target, kinetic_gun) + if(!pressure_decrease_active) + if(environment == KA_ENVIRO_TYPE_COLD) + if(!lavaland_environment_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE + else if(environment == KA_ENVIRO_TYPE_HOT) + if(!virgotwo_environment_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE + return ..() + +/obj/item/projectile/kinetic/attack_mob(mob/living/target_mob, distance, miss_modifier) + if(!pressure_decrease_active) + if(environment == KA_ENVIRO_TYPE_COLD) + if(!lavaland_environment_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE + else if(environment == KA_ENVIRO_TYPE_HOT) + if(!virgotwo_environment_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE + return ..() + +/obj/item/projectile/kinetic/on_range() + strike_thing() + ..() + +/obj/item/projectile/kinetic/on_hit(atom/target) strike_thing(target) . = ..() +/obj/item/projectile/kinetic/on_impact(atom/A) + . = ..() + strike_thing(A) + /obj/item/projectile/kinetic/proc/strike_thing(atom/target) + if(!pressure_decrease_active) + if(environment == KA_ENVIRO_TYPE_COLD) + if(!lavaland_environment_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE + else if(environment == KA_ENVIRO_TYPE_HOT) + if(!virgotwo_environment_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE var/turf/target_turf = get_turf(target) if(!target_turf) target_turf = get_turf(src) - if(istype(target_turf, /turf/simulated/mineral)) + if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate. + var/list/mods = kinetic_gun.get_modkits() + for(var/obj/item/borg/upgrade/modkit/M in mods) + M.projectile_strike_predamage(src, target_turf, target, kinetic_gun) + for(var/obj/item/borg/upgrade/modkit/M in mods) + M.projectile_strike(src, target_turf, target, kinetic_gun) + if(ismineralturf(target_turf)) var/turf/simulated/mineral/M = target_turf - M.GetDrilled() + M.GetDrilled(TRUE) var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf) K.color = color - for(var/type in hit_overlays) - new type(target_turf) - if(turf_aoe) - for(var/T in RANGE_TURFS(1, target_turf) - target_turf) - if(istype(T, /turf/simulated/mineral)) - var/turf/simulated/mineral/M = T - M.GetDrilled() - if(mob_aoe) - for(var/mob/living/L in range(1, target_turf) - firer - target) - var/armor = L.run_armor_check(def_zone, check_armour) - L.apply_damage(damage*mob_aoe, damage_type, def_zone, armor) - to_chat(L, "You're struck by a [name]!") + //Modkits /obj/item/borg/upgrade/modkit - name = "modification kit" + name = "kinetic accelerator modification kit" desc = "An upgrade for kinetic accelerators." icon = 'icons/obj/objects_vr.dmi' icon_state = "modkit" - origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_MAGNET = 4) + w_class = ITEMSIZE_SMALL require_module = 1 - // var/module_type = /obj/item/robot_module/miner - usesound = 'sound/items/Screwdriver.ogg' + // module_type = list(/obj/item/robot_module/miner) var/denied_type = null var/maximum_of_type = 1 var/cost = 30 var/modifier = 1 //For use in any mod kit that has numerical modifiers + var/minebot_upgrade = TRUE + var/minebot_exclusive = FALSE /obj/item/borg/upgrade/modkit/examine(mob/user) . = ..() - if(Adjacent(user)) - . += "Occupies [cost]% of mod capacity." + . += "Occupies [cost]% of mod capacity." /obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user) - if(istype(A, /obj/item/weapon/gun/energy/kinetic_accelerator) && !issilicon(user)) + if(istype(A, /obj/item/weapon/gun/energy/kinetic_accelerator)) install(A, user) else ..() -/obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R) - if(..()) - return - +/* +/obj/item/borg/upgrade/modkit/afterInstall(mob/living/silicon/robot/R) for(var/obj/item/weapon/gun/energy/kinetic_accelerator/H in R.module.modules) - return install(H, usr) + if(install(H, R)) //It worked + return + to_chat(R, "Upgrade error - Aborting Kinetic Accelerator linking.") //No applicable KA found, insufficient capacity, or some other problem. +*/ /obj/item/borg/upgrade/modkit/proc/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user) . = TRUE + if(src in KA.modkits) // Sanity check to prevent installing the same modkit twice thanks to occasional click/lag delays. + return FALSE + // if(minebot_upgrade) + // if(minebot_exclusive && !istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone)) + // to_chat(user, "The modkit you're trying to install is only rated for minebot use.") + // return FALSE + // else if(istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone)) + // to_chat(user, "The modkit you're trying to install is not rated for minebot use.") + // return FALSE if(denied_type) var/number_of_denied = 0 - for(var/obj/item/borg/upgrade/modkit/M as anything in KA.get_modkits()) + for(var/A in KA.get_modkits()) + var/obj/item/borg/upgrade/modkit/M = A if(istype(M, denied_type)) number_of_denied++ if(number_of_denied >= maximum_of_type) @@ -190,10 +374,11 @@ break if(KA.get_remaining_mod_capacity() >= cost) if(.) + user.drop_from_inventory(src, KA) + // if(!user.transferItemToLoc(src, KA)) + // return FALSE to_chat(user, "You install the modkit.") - playsound(src, usesound, 100, 1) - user.unEquip(src) - forceMove(KA) + playsound(loc, 'sound/items/screwdriver.ogg', 100, 1) KA.modkits += src else to_chat(user, "The modkit you're trying to install would conflict with an already installed modkit. Use a crowbar to remove existing modkits.") @@ -201,19 +386,26 @@ to_chat(user, "You don't have room([KA.get_remaining_mod_capacity()]% remaining, [cost]% needed) to install this modkit. Use a crowbar to remove existing modkits.") . = FALSE -/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA) - forceMove(get_turf(KA)) +/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA, forcemove = TRUE) KA.modkits -= src + if(forcemove) + forceMove(get_turf(KA)) /obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K) - return + +//use this one for effects you want to trigger before any damage is done at all and before damage is decreased by pressure +/obj/item/borg/upgrade/modkit/proc/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) +//use this one for effects you want to trigger before mods that do damage +/obj/item/borg/upgrade/modkit/proc/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) +//and this one for things that don't need to trigger before other damage-dealing mods +/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) //Range /obj/item/borg/upgrade/modkit/range name = "range increase" desc = "Increases the range of a kinetic accelerator when installed." modifier = 1 - cost = 24 //so you can fit four plus a tracer cosmetic + cost = 25 /obj/item/borg/upgrade/modkit/range/modify_projectile(obj/item/projectile/kinetic/K) K.range += modifier @@ -228,55 +420,87 @@ /obj/item/borg/upgrade/modkit/damage/modify_projectile(obj/item/projectile/kinetic/K) K.damage += modifier - - //Cooldown - CHOMPstation re-addition start +//Cooldown /obj/item/borg/upgrade/modkit/cooldown name = "cooldown decrease" - desc = "Decreases the cooldown of a kinetic accelerator." + desc = "Decreases the cooldown of a kinetic accelerator. Not rated for minebot use." modifier = 2.5 + minebot_upgrade = FALSE + var/decreased /obj/item/borg/upgrade/modkit/cooldown/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user) . = ..() if(.) - KA.fire_delay -= modifier + var/old = KA.overheat_time + KA.overheat_time = max(0, KA.overheat_time - modifier) + decreased = old - KA.overheat_time + /obj/item/borg/upgrade/modkit/cooldown/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA) - KA.fire_delay += modifier + KA.overheat_time += decreased ..() -//Cooldown - CHOMPstation re-addition end -/obj/item/borg/upgrade/modkit/efficiency - name = "energy efficiency" - desc = "Decreases the energy use of a kinetic accelerator." - modifier = 20 +/obj/item/borg/upgrade/modkit/cooldown/minebot + name = "minebot cooldown decrease" + desc = "Decreases the cooldown of a kinetic accelerator. Only rated for minebot use." + icon_state = "door_electronics" + icon = 'icons/obj/module.dmi' + denied_type = /obj/item/borg/upgrade/modkit/cooldown/minebot + modifier = 10 + cost = 0 + minebot_upgrade = TRUE + minebot_exclusive = TRUE -/obj/item/borg/upgrade/modkit/efficiency/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user) - . = ..() - if(.) - KA.charge_cost -= modifier - -/obj/item/borg/upgrade/modkit/efficiency/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA) - KA.charge_cost += modifier - ..() //AoE blasts /obj/item/borg/upgrade/modkit/aoe modifier = 0 + var/turf_aoe = FALSE + var/stats_stolen = FALSE + +/obj/item/borg/upgrade/modkit/aoe/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user) + . = ..() + if(.) + for(var/obj/item/borg/upgrade/modkit/aoe/AOE in KA.modkits) //make sure only one of the aoe modules has values if somebody has multiple + if(AOE.stats_stolen || AOE == src) + continue + modifier += AOE.modifier //take its modifiers + AOE.modifier = 0 + turf_aoe += AOE.turf_aoe + AOE.turf_aoe = FALSE + AOE.stats_stolen = TRUE + +/obj/item/borg/upgrade/modkit/aoe/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA) + ..() + modifier = initial(modifier) //get our modifiers back + turf_aoe = initial(turf_aoe) + stats_stolen = FALSE /obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/item/projectile/kinetic/K) K.name = "kinetic explosion" - if(!K.turf_aoe && !K.mob_aoe) - K.hit_overlays += /obj/effect/temp_visual/explosion/fast - K.mob_aoe += modifier + +/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + if(stats_stolen) + return + new /obj/effect/temp_visual/explosion/fast(target_turf) + if(turf_aoe) + for(var/T in RANGE_TURFS(1, target_turf) - target_turf) + if(ismineralturf(T)) + var/turf/simulated/mineral/M = T + M.GetDrilled(TRUE) + if(modifier) + for(var/mob/living/L in range(1, target_turf) - K.firer - target) + var/armor = L.run_armor_check(K.def_zone, K.check_armour) + // var/armor = L.run_armor_check(K.def_zone, K.flag, null, null, K.armour_penetration) + L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor) + // L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor) + to_chat(L, "You're struck by a [K.name]!") /obj/item/borg/upgrade/modkit/aoe/turfs name = "mining explosion" desc = "Causes the kinetic accelerator to destroy rock in an AoE." denied_type = /obj/item/borg/upgrade/modkit/aoe/turfs - -/obj/item/borg/upgrade/modkit/aoe/turfs/modify_projectile(obj/item/projectile/kinetic/K) - ..() - K.turf_aoe = TRUE + turf_aoe = TRUE /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs name = "offensive mining explosion" @@ -289,19 +513,150 @@ desc = "Causes the kinetic accelerator to damage mobs in an AoE." modifier = 0.2 +//Minebot passthrough +/obj/item/borg/upgrade/modkit/minebot_passthrough + name = "minebot passthrough" + desc = "Causes kinetic accelerator shots to pass through minebots." + cost = 0 + +//Tendril-unique modules +/obj/item/borg/upgrade/modkit/cooldown/repeater + name = "rapid repeater" + desc = "Quarters the kinetic accelerator's cooldown on striking a living target, but greatly increases the base cooldown." + denied_type = /obj/item/borg/upgrade/modkit/cooldown/repeater + modifier = -14 //Makes the cooldown 3 seconds(with no cooldown mods) if you miss. Don't miss. + cost = 50 + +/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + var/valid_repeat = FALSE + if(isliving(target)) + var/mob/living/L = target + if(L.stat != DEAD) + valid_repeat = TRUE + if(ismineralturf(target_turf)) + valid_repeat = TRUE + if(valid_repeat) + KA.overheat = FALSE + KA.attempt_reload(KA.overheat_time * 0.25) //If you hit, the cooldown drops to 0.75 seconds. + +/* +/obj/item/borg/upgrade/modkit/lifesteal + name = "lifesteal crystal" + desc = "Causes kinetic accelerator shots to slightly heal the firer on striking a living target." + icon_state = "modkit_crystal" + modifier = 2.5 //Not a very effective method of healing. + cost = 20 + var/static/list/damage_heal_order = list(BRUTE, BURN, OXY) + +/obj/item/borg/upgrade/modkit/lifesteal/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + if(isliving(target) && isliving(K.firer)) + var/mob/living/L = target + if(L.stat == DEAD) + return + L = K.firer + L.heal_ordered_damage(modifier, damage_heal_order) +*/ + +/obj/item/borg/upgrade/modkit/resonator_blasts + name = "resonator blast" + desc = "Causes kinetic accelerator shots to leave and detonate resonator blasts." + denied_type = /obj/item/borg/upgrade/modkit/resonator_blasts + cost = 30 + modifier = 0.25 //A bonus 15 damage if you burst the field on a target, 60 if you lure them into it. + +/obj/item/borg/upgrade/modkit/resonator_blasts/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + if(target_turf && !ismineralturf(target_turf)) //Don't make fields on mineral turfs. + var/obj/effect/resonance/R = locate(/obj/effect/resonance) in target_turf + if(R) + R.resonance_damage *= modifier + R.burst() + return + new /obj/effect/resonance(target_turf, K.firer, 30) + +/* +/obj/item/borg/upgrade/modkit/bounty + name = "death syphon" + desc = "Killing or assisting in killing a creature permanently increases your damage against that type of creature." + denied_type = /obj/item/borg/upgrade/modkit/bounty + modifier = 1.25 + cost = 30 + var/maximum_bounty = 25 + var/list/bounties_reaped = list() + +/obj/item/borg/upgrade/modkit/bounty/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + if(isliving(target)) + var/mob/living/L = target + var/list/existing_marks = L.has_status_effect_list(STATUS_EFFECT_SYPHONMARK) + for(var/i in existing_marks) + var/datum/status_effect/syphon_mark/SM = i + if(SM.reward_target == src) //we want to allow multiple people with bounty modkits to use them, but we need to replace our own marks so we don't multi-reward + SM.reward_target = null + qdel(SM) + L.apply_status_effect(STATUS_EFFECT_SYPHONMARK, src) + +/obj/item/borg/upgrade/modkit/bounty/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + if(isliving(target)) + var/mob/living/L = target + if(bounties_reaped[L.type]) + var/kill_modifier = 1 + if(K.pressure_decrease_active) + kill_modifier *= K.pressure_decrease + var/armor = L.run_armor_check(K.def_zone, K.flag, null, null, K.armour_penetration) + L.apply_damage(bounties_reaped[L.type]*kill_modifier, K.damage_type, K.def_zone, armor) + +/obj/item/borg/upgrade/modkit/bounty/proc/get_kill(mob/living/L) + var/bonus_mod = 1 + if(ismegafauna(L)) //megafauna reward + bonus_mod = 4 + if(!bounties_reaped[L.type]) + bounties_reaped[L.type] = min(modifier * bonus_mod, maximum_bounty) + else + bounties_reaped[L.type] = min(bounties_reaped[L.type] + (modifier * bonus_mod), maximum_bounty) +*/ //Indoors /obj/item/borg/upgrade/modkit/indoors name = "decrease pressure penalty" - desc = "Increases the damage a kinetic accelerator does in a high pressure environment." + desc = "A remarkably illegal modification kit that increases the damage a kinetic accelerator does in pressurized environments." modifier = 2 denied_type = /obj/item/borg/upgrade/modkit/indoors maximum_of_type = 2 - cost = 40 + cost = 35 /obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K) K.pressure_decrease *= modifier +// Atmospheric +/obj/item/borg/upgrade/modkit/heater + name = "temperature modulator" + desc = "A remarkably unusual modification kit that makes kinetic accelerators more usable in hot, overpressurized environments, \ + in exchange for making them weak elsewhere, like the cold or in space." + denied_type = /obj/item/borg/upgrade/modkit/indoors + maximum_of_type = 1 + cost = 30 + +/obj/item/borg/upgrade/modkit/heater/modify_projectile(obj/item/projectile/kinetic/K) + K.environment = KA_ENVIRO_TYPE_HOT + +//Trigger Guard + +/* +/obj/item/borg/upgrade/modkit/trigger_guard + name = "modified trigger guard" + desc = "Allows creatures normally incapable of firing guns to operate the weapon when installed." + cost = 20 + denied_type = /obj/item/borg/upgrade/modkit/trigger_guard + +/obj/item/borg/upgrade/modkit/trigger_guard/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user) + . = ..() + if(.) + KA.trigger_guard = TRIGGER_GUARD_ALLOW_ALL + +/obj/item/borg/upgrade/modkit/trigger_guard/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA) + KA.trigger_guard = TRIGGER_GUARD_NORMAL + ..() +*/ + //Cosmetic /obj/item/borg/upgrade/modkit/chassis_mod @@ -342,7 +697,7 @@ /obj/item/borg/upgrade/modkit/tracer/adjustable name = "adjustable tracer bolts" - desc = "Causes kinetic accelerator bolts to have a adjustably-colored tracer trail and explosion. Use in-hand to change color." + desc = "Causes kinetic accelerator bolts to have an adjustable-colored tracer trail and explosion. Use in-hand to change color." /obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user) - bolt_color = input(user,"Choose Color") as color + bolt_color = input(user,"","Choose Color",bolt_color) as color|null diff --git a/code/modules/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm index aedd12f100..9545e923ac 100644 --- a/code/modules/projectiles/guns/launcher/rocket.dm +++ b/code/modules/projectiles/guns/launcher/rocket.dm @@ -36,7 +36,7 @@ if(rockets.len) var/obj/item/ammo_casing/rocket/I = rockets[1] rockets -= I - return + return new I.projectile_type(src) return null /obj/item/weapon/gun/launcher/rocket/handle_post_fire(mob/user, atom/target) diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm index 06e11c6800..100e4ea60a 100644 --- a/code/modules/reagents/reagents/food_drinks.dm +++ b/code/modules/reagents/reagents/food_drinks.dm @@ -316,6 +316,13 @@ color = "#664330" allergen_type = ALLERGEN_FISH //Murkfin is fish +/datum/reagent/nutriment/protein/bean + name = "beans" + id = "bean_protein" + taste_description = "beans" + color = "#562e0b" + allergen_type = ALLERGEN_BEANS //Made from soy beans + /datum/reagent/nutriment/honey name = "Honey" id = "honey" diff --git a/code/modules/reagents/reagents/food_drinks_vr.dm b/code/modules/reagents/reagents/food_drinks_vr.dm index 715e0fa735..46cece483e 100644 --- a/code/modules/reagents/reagents/food_drinks_vr.dm +++ b/code/modules/reagents/reagents/food_drinks_vr.dm @@ -155,15 +155,12 @@ if(alien == IS_SLIME || alien == IS_CHIMERA) //slimes and chimera can get nutrition from injected nutriment and protein M.adjust_nutrition(alt_nutriment_factor * removed) - /datum/reagent/nutriment/magicdust/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() playsound(M, 'sound/items/hooh.ogg', 50, 1, -1) if(prob(5)) to_chat(M, "You feel like you've been gnomed...") - - /datum/reagent/ethanol/galacticpanic name = "Galactic Panic Attack" id = "galacticpanic" @@ -515,4 +512,34 @@ glass_name = "Shambler's Juice" glass_desc = "A glass of something shambly" - glass_special = list(DRINK_FIZZ) \ No newline at end of file + glass_special = list(DRINK_FIZZ) + +////////////////START BrainzSnax Reagents//////////////// + +/datum/reagent/nutriment/protein/brainzsnax + name = "grey matter" + id = "brain_protein" + taste_description = "fatty, mushy meat and allspice" + color = "#caa3c9" + +/datum/reagent/nutriment/protein/brainzsnax/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + if(prob(5) && !(alien == IS_CHIMERA || alien == IS_SLIME || alien == IS_PLANT || alien == IS_DIONA || alien == IS_SHADEKIN && !M.isSynthetic())) + M.adjustBrainLoss(removed) //Any other species risks prion disease. + M.Confuse(5) + M.hallucination = max(M.hallucination, 25) + + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.feral > 0 && H.nutrition > 100 && H.traumatic_shock < min(60, H.nutrition/10) && H.jitteriness < 100) //Same check as feral triggers to stop them immediately re-feralling + H.feral -= removed * 3 //Should calm them down quick, provided they're actually in a state to STAY calm. + if(H.feral <=0) //Check if they're unferalled + H.feral = 0 + to_chat(H, "Your mind starts to clear, soothed into a state of clarity as your senses return.") + log_and_message_admins("is no longer feral.", H) + +/datum/reagent/nutriment/protein/brainzsnax/red + id = "red_brain_protein" + taste_description = "fatty, mushy meat and cheap tomato sauce" + color = "#a6898d" + +////////////////END BrainzSnax Reagents//////////////// diff --git a/code/modules/research/designs/circuits/circuits.dm b/code/modules/research/designs/circuits/circuits.dm index 5c77c19e60..9e21b9bc16 100644 --- a/code/modules/research/designs/circuits/circuits.dm +++ b/code/modules/research/designs/circuits/circuits.dm @@ -427,6 +427,13 @@ CIRCUITS BELOW build_path = /obj/item/weapon/circuitboard/skills sort_string = "LAAAC" +/datum/design/circuit/arf_generator + name = "atmospheric field generator" + id = "arf_generator" + req_tech = list(TECH_MAGNET = 4, TECH_POWER = 4, TECH_BIO = 3) + build_path = /obj/item/weapon/circuitboard/arf_generator + sort_string = "LAAAD" + /datum/design/circuit/mecha req_tech = list(TECH_DATA = 3) diff --git a/icons/_nanomaps/southern_cross_nanomap_z8.png b/icons/_nanomaps/southern_cross_nanomap_z8.png index b939884875..b102d77030 100644 Binary files a/icons/_nanomaps/southern_cross_nanomap_z8.png and b/icons/_nanomaps/southern_cross_nanomap_z8.png differ diff --git a/icons/inventory/eyes/item.dmi b/icons/inventory/eyes/item.dmi index b4ba37ad39..bcd48ade6b 100644 Binary files a/icons/inventory/eyes/item.dmi and b/icons/inventory/eyes/item.dmi differ diff --git a/icons/inventory/eyes/mob.dmi b/icons/inventory/eyes/mob.dmi index 70113e3d8c..1d4e1fe2ca 100644 Binary files a/icons/inventory/eyes/mob.dmi and b/icons/inventory/eyes/mob.dmi differ diff --git a/icons/inventory/face/item.dmi b/icons/inventory/face/item.dmi index 5bde3b32d4..60cb749378 100644 Binary files a/icons/inventory/face/item.dmi and b/icons/inventory/face/item.dmi differ diff --git a/icons/inventory/face/item_vr.dmi b/icons/inventory/face/item_vr.dmi index 78230b3e59..c923555fe7 100644 Binary files a/icons/inventory/face/item_vr.dmi and b/icons/inventory/face/item_vr.dmi differ diff --git a/icons/inventory/face/mob.dmi b/icons/inventory/face/mob.dmi index fd1af6e950..7c9363956c 100644 Binary files a/icons/inventory/face/mob.dmi and b/icons/inventory/face/mob.dmi differ diff --git a/icons/inventory/face/mob_vr.dmi b/icons/inventory/face/mob_vr.dmi index ec49d3cdb7..fbac00cd0d 100644 Binary files a/icons/inventory/face/mob_vr.dmi and b/icons/inventory/face/mob_vr.dmi differ diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi index 327eb3b9ce..17b80b78a5 100644 Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ diff --git a/icons/mob/items/lefthand_balls_vr.dmi b/icons/mob/items/lefthand_balls_vr.dmi index 2f65e0969a..70455d01c2 100644 Binary files a/icons/mob/items/lefthand_balls_vr.dmi and b/icons/mob/items/lefthand_balls_vr.dmi differ diff --git a/icons/mob/items/lefthand_guns_vr.dmi b/icons/mob/items/lefthand_guns_vr.dmi index 0d8acb4fbb..fcf529ee98 100644 Binary files a/icons/mob/items/lefthand_guns_vr.dmi and b/icons/mob/items/lefthand_guns_vr.dmi differ diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi index 75d2c9ac51..f8b95c18bc 100644 Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ diff --git a/icons/mob/items/righthand_balls_vr.dmi b/icons/mob/items/righthand_balls_vr.dmi index ba2bccac38..286540595d 100644 Binary files a/icons/mob/items/righthand_balls_vr.dmi and b/icons/mob/items/righthand_balls_vr.dmi differ diff --git a/icons/mob/items/righthand_guns_vr.dmi b/icons/mob/items/righthand_guns_vr.dmi index 73ee95c0a3..5554423acb 100644 Binary files a/icons/mob/items/righthand_guns_vr.dmi and b/icons/mob/items/righthand_guns_vr.dmi differ diff --git a/icons/obj/32x64.dmi b/icons/obj/32x64.dmi index 7b8c00eef8..493b337ad6 100644 Binary files a/icons/obj/32x64.dmi and b/icons/obj/32x64.dmi differ diff --git a/icons/obj/Cryogenic2_vr.dmi b/icons/obj/Cryogenic2_vr.dmi index 69d24bc15e..e4b88cb635 100644 Binary files a/icons/obj/Cryogenic2_vr.dmi and b/icons/obj/Cryogenic2_vr.dmi differ diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi index 20c744e0a0..99362c782d 100644 Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ diff --git a/icons/obj/atm_fieldgen.dmi b/icons/obj/atm_fieldgen.dmi new file mode 100644 index 0000000000..0c30371196 Binary files /dev/null and b/icons/obj/atm_fieldgen.dmi differ diff --git a/icons/obj/balls_vr.dmi b/icons/obj/balls_vr.dmi index 994be4ab97..e85f4cab05 100644 Binary files a/icons/obj/balls_vr.dmi and b/icons/obj/balls_vr.dmi differ diff --git a/icons/obj/boxes.dmi b/icons/obj/boxes.dmi index 1f7e82c960..dad29a40a2 100644 Binary files a/icons/obj/boxes.dmi and b/icons/obj/boxes.dmi differ diff --git a/icons/obj/food_canned.dmi b/icons/obj/food_canned.dmi index 606ca9f6e4..1a4be5b506 100644 Binary files a/icons/obj/food_canned.dmi and b/icons/obj/food_canned.dmi differ diff --git a/icons/obj/gun_vr.dmi b/icons/obj/gun_vr.dmi index 609e107845..a623c02134 100644 Binary files a/icons/obj/gun_vr.dmi and b/icons/obj/gun_vr.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 84fdd7be13..ededfc4b50 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index 64184432c7..1f203a1e8f 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/icons/obj/storage_vr.dmi b/icons/obj/storage_vr.dmi index 2975e65409..31181de6c7 100644 Binary files a/icons/obj/storage_vr.dmi and b/icons/obj/storage_vr.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index dbc403ce40..f81d8a42d6 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/obj/tools_vr.dmi b/icons/obj/tools_vr.dmi index c49a991ff9..05de9a423a 100644 Binary files a/icons/obj/tools_vr.dmi and b/icons/obj/tools_vr.dmi differ diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi index 98b6c9b60f..f9c1ce7400 100644 Binary files a/icons/obj/trash.dmi and b/icons/obj/trash.dmi differ diff --git a/icons/obj/wall_frame_bay.dmi b/icons/obj/wall_frame_bay.dmi index 628a002edb..c3f14c5f48 100644 Binary files a/icons/obj/wall_frame_bay.dmi and b/icons/obj/wall_frame_bay.dmi differ diff --git a/icons/turf/fancy_shuttles/tether_cargo.dmi b/icons/turf/fancy_shuttles/tether_cargo.dmi new file mode 100644 index 0000000000..b65e9a0e6c Binary files /dev/null and b/icons/turf/fancy_shuttles/tether_cargo.dmi differ diff --git a/icons/turf/fancy_shuttles/tether_cargo_preview.dmi b/icons/turf/fancy_shuttles/tether_cargo_preview.dmi new file mode 100644 index 0000000000..48ef0cb78f Binary files /dev/null and b/icons/turf/fancy_shuttles/tether_cargo_preview.dmi differ diff --git a/icons/turf/transit_vr.dmi b/icons/turf/transit_vr.dmi index 4b7339548e..b4bdfc1953 100644 Binary files a/icons/turf/transit_vr.dmi and b/icons/turf/transit_vr.dmi differ diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi index e3fc2202e9..86243a853f 100644 Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index c1b018e525..1ea3e6f625 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -2850,6 +2850,18 @@ dir = 10 }, /obj/effect/floor_decal/steeldecal/steel_decals4, +/obj/effect/floor_decal/borderfloor{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 4 + }, +/obj/effect/floor_decal/borderfloor/corner2{ + dir = 5 + }, +/obj/effect/floor_decal/corner/paleblue/bordercorner2{ + dir = 5 + }, /turf/simulated/floor/tiled, /area/tether/surfacebase/lowernorthhall) "aeE" = ( @@ -3359,9 +3371,6 @@ /obj/effect/floor_decal/corner/paleblue/border{ dir = 5 }, -/obj/effect/floor_decal/borderfloor/corner2{ - dir = 5 - }, /obj/effect/floor_decal/borderfloor/corner2{ dir = 4 }, @@ -3577,6 +3586,11 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, /turf/simulated/floor/tiled, /area/tether/surfacebase/lowernorthhall) "afN" = ( @@ -3589,6 +3603,11 @@ /obj/machinery/door/firedoor/glass/hidden/steel{ dir = 8 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, /turf/simulated/floor/tiled, /area/tether/surfacebase/lowernorthhall) "afO" = ( @@ -17402,21 +17421,9 @@ /turf/simulated/floor/tiled, /area/rnd/hallway) "aCg" = ( -/obj/effect/floor_decal/borderfloor{ - dir = 4 - }, -/obj/effect/floor_decal/corner/paleblue/border{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/floor_decal/borderfloor/corner2{ - dir = 6 - }, -/obj/effect/floor_decal/corner/paleblue/bordercorner2{ - dir = 6 - }, /obj/effect/floor_decal/steeldecal/steel_decals7{ dir = 9 }, @@ -32164,6 +32171,38 @@ /obj/effect/floor_decal/corner/red/border, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/lowerhall) +<<<<<<< HEAD +||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz +"cwS" = ( +/obj/effect/floor_decal/borderfloor{ + dir = 1 + }, +/obj/effect/floor_decal/corner/grey/border{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/crew_quarters/visitor_laundry) +======= +"ctE" = ( +/obj/structure/table/rack, +/obj/item/weapon/tank/emergency, +/obj/item/weapon/tank/emergency, +/obj/item/weapon/tank/emergency, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) +"cwS" = ( +/obj/effect/floor_decal/borderfloor{ + dir = 1 + }, +/obj/effect/floor_decal/corner/grey/border{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/crew_quarters/visitor_laundry) +>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz "cAR" = ( /turf/simulated/floor/looking_glass/center, /area/looking_glass/lg_1) @@ -32421,6 +32460,20 @@ }, /turf/simulated/floor/plating, /area/tether/surfacebase/funny/hideyhole) +"dvU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/tiled, +/area/tether/surfacebase/lowernorthhall) "dxY" = ( /obj/structure/table/rack, /obj/item/clothing/mask/gas, @@ -32528,6 +32581,12 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/lowerhall) +"dNE" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "dNP" = ( /obj/machinery/door/airlock/silver{ name = "Clown's Office"; @@ -32785,6 +32844,10 @@ }, /turf/simulated/floor/tiled/dark, /area/tether/surfacebase/security/weaponsrange) +"eJc" = ( +/obj/item/weapon/storage/toolbox/brass, +/turf/simulated/floor/plating, +/area/maintenance/lowmedbaymaint) "eJQ" = ( /obj/machinery/door/firedoor/glass, /obj/machinery/door/blast/regular{ @@ -32984,6 +33047,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pie, /obj/item/weapon/pen/crayon/marker/rainbow, /obj/item/weapon/pen/crayon/rainbow, +/obj/item/clothing/mask/emotions, /obj/structure/closet/secure_closet{ desc = "Where the Clown keeps their hooliganisms."; name = "funny locker"; @@ -34065,6 +34129,12 @@ }, /turf/simulated/floor/tiled, /area/rnd/hallway) +"jkI" = ( +/obj/structure/table/rack/shelf, +/obj/random/maintenance/cargo, +/obj/random/maintenance/cargo, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "jnj" = ( /obj/effect/floor_decal/borderfloor, /obj/effect/floor_decal/corner/lightgrey/border, @@ -34969,6 +35039,24 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/brig) +<<<<<<< HEAD +||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz +"lEA" = ( +/turf/simulated/wall, +/area/maintenance/engineering/atmos/airlock/gas) +======= +"lEA" = ( +/turf/simulated/wall, +/area/maintenance/engineering/atmos/airlock/gas) +"lEB" = ( +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) +>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz "lIj" = ( /obj/effect/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled/dark, @@ -35361,6 +35449,12 @@ /obj/effect/floor_decal/steeldecal/steel_decals7{ dir = 10 }, +/obj/effect/floor_decal/borderfloor/corner2{ + dir = 6 + }, +/obj/effect/floor_decal/corner/paleblue/bordercorner2{ + dir = 6 + }, /turf/simulated/floor/tiled, /area/tether/surfacebase/lowernorthhall) "mGP" = ( @@ -36586,6 +36680,40 @@ }, /turf/simulated/floor/tiled/dark, /area/tether/surfacebase/security/lowerhall) +<<<<<<< HEAD +||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz +"qtU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/cyan{ + dir = 5 + }, +/turf/simulated/floor/plating, +/area/maintenance/engineering/atmos/airlock/gas) +======= +"qtC" = ( +/obj/effect/floor_decal/borderfloor{ + dir = 1 + }, +/obj/effect/floor_decal/corner/lightgrey/border{ + dir = 1 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/tether/surfacebase/lowernorthhall) +"qtU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/cyan{ + dir = 5 + }, +/turf/simulated/floor/plating, +/area/maintenance/engineering/atmos/airlock/gas) +>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz "qwm" = ( /obj/effect/floor_decal/borderfloor/corner{ dir = 4 @@ -36620,7 +36748,39 @@ pixel_x = -24 }, /turf/simulated/wall, +<<<<<<< HEAD /area/maintenance/substation/cargostoresubstation) +||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz +/area/maintenance/substation/surfaceservicesubstation) +"qEW" = ( +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/tether/surfacebase/funny/clownoffice) +======= +/area/maintenance/substation/surfaceservicesubstation) +"qEW" = ( +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plating, +/area/tether/surfacebase/funny/clownoffice) +"qJe" = ( +/obj/structure/table/rack/shelf, +/obj/random/maintenance/cargo, +/obj/random/maintenance/cargo, +/obj/random/maintenance/cargo, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) +>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz "qJl" = ( /obj/machinery/door/airlock/maintenance/common, /turf/simulated/floor/plating, @@ -36887,6 +37047,13 @@ /obj/item/weapon/bedsheet/mimedouble, /turf/simulated/floor/carpet/bcarpet, /area/tether/surfacebase/funny/mimeoffice) +"rtV" = ( +/obj/random/maintenance/medical, +/obj/structure/table/rack, +/obj/random/maintenance/cargo, +/obj/effect/floor_decal/rust, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "ruj" = ( /obj/machinery/door/airlock/silver{ name = "Mime's Office"; @@ -37212,6 +37379,10 @@ }, /turf/simulated/floor/lino, /area/crew_quarters/visitor_dining) +"syt" = ( +/obj/effect/floor_decal/rust, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "szT" = ( /obj/effect/floor_decal/borderfloor/corner{ dir = 1 @@ -37258,6 +37429,33 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/surface_one_hall) +<<<<<<< HEAD +||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz +"sHK" = ( +/obj/structure/cable/green{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/carpet/bcarpet, +/area/tether/surfacebase/funny/mimeoffice) +======= +"sGh" = ( +/obj/structure/table/rack/shelf, +/obj/random/maintenance/medical, +/obj/random/maintenance/medical, +/obj/random/maintenance/cargo, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) +"sHK" = ( +/obj/structure/cable/green{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/carpet/bcarpet, +/area/tether/surfacebase/funny/mimeoffice) +>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz "sHO" = ( /obj/effect/floor_decal/steeldecal/steel_decals6{ dir = 1 @@ -37324,6 +37522,10 @@ }, /turf/simulated/floor/tiled/dark, /area/tether/surfacebase/security/brig/storage) +"sYi" = ( +/obj/effect/decal/remains/human, +/turf/simulated/floor/plating, +/area/maintenance/lowmedbaymaint) "tak" = ( /obj/structure/table/steel, /obj/structure/cable/green{ @@ -37340,6 +37542,10 @@ /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/brig) +"tcK" = ( +/obj/item/clothing/suit/storage/hooded/wintercoat/ratvar, +/turf/simulated/floor/plating, +/area/maintenance/lowmedbaymaint) "tdg" = ( /turf/simulated/mineral, /area/maintenance/lowmedbaymaint) @@ -37414,6 +37620,20 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/lowerhall) +"tAo" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/tether/surfacebase/lowernorthhall) "tAT" = ( /obj/effect/floor_decal/borderfloor{ dir = 9 @@ -37644,6 +37864,16 @@ }, /turf/simulated/floor, /area/tether/surfacebase/security/gasstorage) +"ucq" = ( +/obj/machinery/door/airlock/maintenance/common, +/obj/machinery/door/firedoor/glass, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/steel_dirty, +/area/tether/surfacebase/lowernorthhall) "ucv" = ( /obj/machinery/door/firedoor/glass, /obj/machinery/door/airlock/glass_security{ @@ -37661,6 +37891,10 @@ }, /turf/simulated/floor/tiled/dark, /area/tether/surfacebase/security/lowerhall) +"udU" = ( +/obj/effect/floor_decal/rust, +/turf/simulated/floor/plating, +/area/maintenance/lowmedbaymaint) "uge" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -38180,7 +38414,73 @@ }, /turf/simulated/wall, /area/maintenance/substation/surfaceservicesubstation) +<<<<<<< HEAD >>>>>>> 660b7d0a0e... Merge pull request #10831 from Very-Soft/MESSESWITHTHEMAPMOAR +||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz +"wjo" = ( +/obj/effect/map_helper/airlock/door/ext_door, +/obj/machinery/door/blast/regular{ + density = 0; + icon_state = "pdoor0"; + id = "atmoslockdown"; + layer = 1; + name = "Atmospherics Lockdown"; + opacity = 0; + open_layer = 1 + }, +/obj/machinery/door/airlock/glass_external{ + frequency = 1379; + icon_state = "door_locked"; + id_tag = "atmos_airlock_outer"; + locked = 1 + }, +/obj/machinery/access_button/airlock_exterior{ + dir = 8; + master_tag = "atmos_airlock"; + pixel_x = -8; + pixel_y = -25 + }, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/engineering/atmos/airlock) +======= +"wjd" = ( +/obj/effect/floor_decal/rust, +/obj/machinery/power/apc{ + dir = 4; + name = "east bump"; + pixel_x = 28 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) +"wjo" = ( +/obj/effect/map_helper/airlock/door/ext_door, +/obj/machinery/door/blast/regular{ + density = 0; + icon_state = "pdoor0"; + id = "atmoslockdown"; + layer = 1; + name = "Atmospherics Lockdown"; + opacity = 0; + open_layer = 1 + }, +/obj/machinery/door/airlock/glass_external{ + frequency = 1379; + icon_state = "door_locked"; + id_tag = "atmos_airlock_outer"; + locked = 1 + }, +/obj/machinery/access_button/airlock_exterior{ + dir = 8; + master_tag = "atmos_airlock"; + pixel_x = -8; + pixel_y = -25 + }, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/engineering/atmos/airlock) +>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz "wjq" = ( /obj/structure/bed/chair{ dir = 4 @@ -38450,6 +38750,9 @@ }, /turf/simulated/floor/tiled/freezer, /area/tether/surfacebase/security/brig/bathroom) +"xfm" = ( +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "xgQ" = ( /obj/effect/floor_decal/borderfloor{ dir = 1 @@ -46699,6 +47002,7 @@ aad aad aad aad +<<<<<<< HEAD aad aah gCa @@ -46761,6 +47065,163 @@ aDg aGo aGX awn +||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz +aaa +"} +(80,1,1) = {" +aqR +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aAD +aAD +aAD +aAD +aAI +aAI +aAI +aef +aeZ +afN +aBA +aCr +aCr +aCr +aCr +aCr +aGa +aGa +aGa +aHV +aGa +aGa +aGa +agM +aja +afh +agM +agM +agM +aqI +agM +agM +agM +asa +agM +asM +agM +aqI +agM +agM +agM +agM +agM +agM +abc +sQB +byP +agM +aBO +aBO +aBO +aBO +aEz +aFl +======= +aaa +"} +(80,1,1) = {" +aqR +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aAD +aAD +aAD +aAD +sGh +qJe +jkI +aef +aeZ +afN +aBA +aCr +aCr +aCr +aCr +aCr +aGa +aGa +aGa +aHV +aGa +aGa +aGa +agM +aja +afh +agM +agM +agM +aqI +agM +agM +agM +asa +agM +asM +agM +aqI +agM +agM +agM +agM +agM +agM +abc +sQB +byP +agM +aBO +aBO +aBO +aBO +aEz +aFl +>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz aBO aBO aBO @@ -46817,6 +47278,250 @@ aad aad aad aad +<<<<<<< HEAD +||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz +aaa +"} +(81,1,1) = {" +aqR +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aAD +aAI +aAI +aAI +aAI +aAI +aAI +aef +aeS +afO +aBB +aCr +aDa +aDU +aEj +aCr +aGb +aGK +aHr +aIq +aJU +aLt +aGa +anD +anU +afp +aoP +apz +aqd +aqJ +arf +arx +arN +aqd +asr +asN +atk +atM +aus +auN +avm +avV +jDg +wUW +abh +abk +osh +agM +aah +aah +aah +aBO +aEw +aFl +aBO +aah +aBO +aHC +aIh +aIV +aJN +aJI +aJI +aJI +aMs +aNa +aJI +aJI +aJI +aJI +aJI +aNZ +aQy +aNa +aJI +aMm +aSM +aTo +aTS +aTS +aIh +aTZ +aEx +aVn +aWc +aWc +aWc +aWA +aHd +aYb +aYb +aHZ +aHZ +aYb +aYb +aZY +aYd +======= +aaa +"} +(81,1,1) = {" +aqR +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aAD +udU +sYi +aAD +xfm +syt +xfm +aef +aeS +tAo +aBB +aCr +aDa +aDU +aEj +aCr +aGb +aGK +aHr +aIq +aJU +aLt +aGa +anD +anU +afp +aoP +apz +aqd +aqJ +arf +arx +arN +aqd +asr +asN +atk +atM +aus +auN +avm +avV +jDg +wUW +abh +abk +osh +agM +aah +aah +aah +aBO +aEw +aFl +aBO +aah +aBO +aHC +aIh +aIV +aJN +aJI +aJI +aJI +aMs +aNa +aJI +aJI +aJI +aJI +aJI +aNZ +aQy +aNa +aJI +aMm +aSM +aTo +aTS +aTS +aIh +aTZ +aEx +aVn +aWc +aWc +aWc +aWA +aHd +aYb +aYb +aHZ +aHZ +aYb +aYb +aZY +aYd +>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz aad aad aad @@ -46843,6 +47548,7 @@ aad aad aad aad +<<<<<<< HEAD gCa gCa ucv @@ -46906,6 +47612,151 @@ aHt aBN aIa aBO +||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz +aaa +"} +(82,1,1) = {" +aqR +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aAD +aAI +aAI +aAI +aAI +aAI +aAI +aef +aeS +afO +aBC +aCr +aDb +aDV +aEk +aCr +aGc +aGL +aHs +aIs +aKb +aLu +aGa +aic +anV +aoh +aoQ +aoQ +aoQ +aoQ +aoQ +aoQ +aoQ +asb +aoQ +aoQ +aoQ +aoQ +aoQ +aoQ +aoQ +aoQ +xAT +aoQ +tvk +abl +ghr +agM +======= +aaa +"} +(82,1,1) = {" +aqR +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aAD +tcK +aAI +aAD +rtV +ctE +lEB +ucq +qtC +dvU +aBC +aCr +aDb +aDV +aEk +aCr +aGc +aGL +aHs +aIs +aKb +aLu +aGa +aic +anV +aoh +aoQ +aoQ +aoQ +aoQ +aoQ +aoQ +aoQ +asb +aoQ +aoQ +aoQ +aoQ +aoQ +aoQ +aoQ +aoQ +xAT +aoQ +tvk +abl +ghr +agM +>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz aah aah aah @@ -46966,8 +47817,258 @@ aad aad aaa "} +<<<<<<< HEAD (58,1,1) = {" aaa +||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz +(83,1,1) = {" +aqR +aaf +aaf +aae +aae +aae +aae +aae +aae +aae +aae +aae +aae +aae +aae +aae +aaf +aag +aaf +aaf +aAD +aAI +aAI +aAI +aAI +aAI +aAI +aef +afi +afQ +bca +aCr +aDs +aDW +aEl +aFc +aGe +aGM +aHz +aIA +aKc +aLZ +baX +aid +goJ +aoi +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoi +awH +oQm +gVe +lNt +mon +agM +aah +aah +aah +aBO +aAY +aFl +aBO +aah +aBO +aHC +aIh +aIX +aJO +aKw +aLd +aLJ +aMr +aNc +aNK +aOf +aOf +aOf +aOf +aNZ +aQB +aRe +aRJ +aSe +aSO +aTr +aer +aTZ +aTZ +aTZ +aTZ +aVn +aWe +aWd +aWc +aWA +aXG +aXk +aWA +aWA +aWA +aWA +aXk +aWc +aWc +aWc +bas +baU +baU +aad +======= +(83,1,1) = {" +aqR +aaf +aaf +aae +aae +aae +aae +aae +aae +aae +aae +aae +aae +aae +aae +aae +aaf +aag +aaf +aaf +aAD +eJc +udU +aAD +syt +dNE +wjd +aef +afi +afQ +bca +aCr +aDs +aDW +aEl +aFc +aGe +aGM +aHz +aIA +aKc +aLZ +baX +aid +goJ +aoi +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoj +aoi +awH +oQm +gVe +lNt +mon +agM +aah +aah +aah +aBO +aAY +aFl +aBO +aah +aBO +aHC +aIh +aIX +aJO +aKw +aLd +aLJ +aMr +aNc +aNK +aOf +aOf +aOf +aOf +aNZ +aQB +aRe +aRJ +aSe +aSO +aTr +aer +aTZ +aTZ +aTZ +aTZ +aVn +aWe +aWd +aWc +aWA +aXG +aXk +aWA +aWA +aWA +aWA +aXk +aWc +aWc +aWc +bas +baU +baU +aad +>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz aad aad aad @@ -48532,6 +49633,222 @@ asS aaa aad aad +<<<<<<< HEAD +||||||| parent of 18fa28a431... Merge pull request #11698 from GhostActual/toolz +aan +abj +acm +acU +adA +aan +aBn +lbu +axL +adc +adS +aeU +afs +aeD +aCg +mGH +aDH +mGH +aEX +aFv +aGw +aGV +aHU +aJT +tRA +igw +bbf +ago +anY +aok +aok +aok +aok +aok +aok +aok +aok +ase +aok +aok +aok +sEz +aut +aut +avn +avW +awJ +avW +kgk +mSz +qhq +oib +agM +aCJ +aCJ +aCJ +aCJ +aCJ +aCJ +agM +agM +agM +aIm +aJf +aJQ +aKC +aLg +aLM +aLM +aLM +aLg +aOk +aOk +aOk +aOj +aQc +aQc +aQc +aQb +aSj +aSj +aSj +aSi +aUc +aUc +aUc +aVr +aUc +aUc +aUc +aUb +aXt +aXO +aYh +aHE +aIj +aZo +aZC +aZC +aVp +aWu +aZQ +baS +baU +baU +aah +======= +aan +abj +acm +acU +adA +aan +aBn +lbu +axL +adc +adS +aeU +afs +aeD +aCg +mGH +aDH +adx +aEX +aFv +aGw +aGV +aHU +aJT +tRA +igw +bbf +ago +anY +aok +aok +aok +aok +aok +aok +aok +aok +ase +aok +aok +aok +sEz +aut +aut +avn +avW +awJ +avW +kgk +mSz +qhq +oib +agM +aCJ +aCJ +aCJ +aCJ +aCJ +aCJ +agM +agM +agM +aIm +aJf +aJQ +aKC +aLg +aLM +aLM +aLM +aLg +aOk +aOk +aOk +aOj +aQc +aQc +aQc +aQb +aSj +aSj +aSj +aSi +aUc +aUc +aUc +aVr +aUc +aUc +aUc +aUb +aXt +aXO +aYh +aHE +aIj +aZo +aZC +aZC +aVp +aWu +aZQ +baS +baU +baU +aah +>>>>>>> 18fa28a431... Merge pull request #11698 from GhostActual/toolz aad aad aad diff --git a/maps/tether/tether_things.dm b/maps/tether/tether_things.dm index 92b9b10b9a..8eeecd2d37 100644 --- a/maps/tether/tether_things.dm +++ b/maps/tether/tether_things.dm @@ -473,6 +473,5 @@ var/global/list/latejoin_tram = list() prob_fall = 50 mobs_to_pick_from = list( /mob/living/simple_mob/animal/passive/gaslamp = 300, - /mob/living/simple_mob/animal/space/goose/virgo3b = 100, - /mob/living/simple_mob/vore/alienanimals/teppi = 5 + /mob/living/simple_mob/vore/alienanimals/teppi = 4 ) diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index 9c3839f46c..977ad2ffc8 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -219,14 +219,9 @@ var/list/all_maps = list() // Get a list of 'nearby' or 'connected' zlevels. // You should at least return a list with the given z if nothing else. /datum/map/proc/get_map_levels(var/srcz, var/long_range = FALSE, var/om_range = -1) - //Overmap behavior - if(use_overmap) - //Get what sector we're in - var/obj/effect/overmap/visitable/O = get_overmap_sector(srcz) - if(!istype(O)) - //Not in a sector, just the passed zlevel - return list(srcz) - + //Get what sector we're in + var/obj/effect/overmap/visitable/O = get_overmap_sector(srcz) + if(istype(O)) //Just the sector we're in if(om_range == -1) return O.map_z.Copy() @@ -239,7 +234,7 @@ var/list/all_maps = list() connections += V.map_z // Adding list to list adds contents return connections - //Traditional behavior + //Traditional behavior, if not in an overmap sector else //If long range, and they're at least in contact levels, return contact levels. if (long_range && (srcz in contact_levels)) diff --git a/sound/weapons/dodgeball.ogg b/sound/weapons/dodgeball.ogg new file mode 100644 index 0000000000..3e76dcdfc8 Binary files /dev/null and b/sound/weapons/dodgeball.ogg differ diff --git a/vorestation.dme b/vorestation.dme index bea44f2300..8f6608b956 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -832,6 +832,7 @@ #include "code\game\machinery\air_alarm.dm" #include "code\game\machinery\airconditioner_vr.dm" #include "code\game\machinery\airconditioner_yw.dm" +#include "code\game\machinery\atm_ret_field.dm" #include "code\game\machinery\atmo_control.dm" #include "code\game\machinery\autolathe.dm" #include "code\game\machinery\Beacon.dm" @@ -1230,7 +1231,6 @@ #include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\flash_vr.dm" #include "code\game\objects\items\devices\flashlight.dm" -#include "code\game\objects\items\devices\flashlight_vr.dm" #include "code\game\objects\items\devices\floor_painter.dm" #include "code\game\objects\items\devices\geiger.dm" #include "code\game\objects\items\devices\gps.dm" @@ -1497,6 +1497,7 @@ #include "code\game\objects\items\weapons\tanks\tank_types.dm" #include "code\game\objects\items\weapons\tanks\tank_types_vr.dm" #include "code\game\objects\items\weapons\tanks\tanks.dm" +#include "code\game\objects\items\weapons\tools\brass.dm" #include "code\game\objects\items\weapons\tools\crowbar.dm" #include "code\game\objects\items\weapons\tools\crowbar_vr.dm" #include "code\game\objects\items\weapons\tools\screwdriver.dm"