diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm index 9b8dd45a6938..eac5121f173e 100644 --- a/code/__DEFINES/job.dm +++ b/code/__DEFINES/job.dm @@ -347,11 +347,12 @@ var/global/list/job_command_roles = JOB_COMMAND_ROLES_LIST #define JOB_PLAYTIME_TIER_4 (175 HOURS) #define XENO_NO_AGE -1 -#define XENO_NORMAL 0 -#define XENO_MATURE 1 -#define XENO_ELDER 2 -#define XENO_ANCIENT 3 -#define XENO_PRIME 4 +#define XENO_YOUNG 0 +#define XENO_NORMAL 1 +#define XENO_MATURE 2 +#define XENO_ELDER 3 +#define XENO_ANCIENT 4 +#define XENO_PRIME 5 /// For monthly time tracking #define JOB_OBSERVER "Observer" diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm index 222222a09d54..0f822385ad13 100644 --- a/code/__DEFINES/xeno.dm +++ b/code/__DEFINES/xeno.dm @@ -168,6 +168,12 @@ /// The amount of time after round start before buried larva spawns are disallowed #define XENO_BURIED_LARVA_TIME_LIMIT (30 MINUTES) +/// The time when xenos can start taking over comm towers +#define XENO_COMM_ACQUISITION_TIME (90 MINUTES) + +/// The time it takes for a pylon to give one larva while activated +#define XENO_PYLON_ACTIVATION_COOLDOWN (5 MINUTES) + /// The time against away_timer when an AFK xeno larva can be replaced #define XENO_LEAVE_TIMER_LARVA 80 //80 seconds /// The time against away_timer when an AFK xeno (not larva) can be replaced diff --git a/code/datums/mob_hud.dm b/code/datums/mob_hud.dm index c1f67e93a53c..aa1bc9b40783 100644 --- a/code/datums/mob_hud.dm +++ b/code/datums/mob_hud.dm @@ -441,9 +441,9 @@ var/list/datum/mob_hud/huds = list( holder2_set = 1 return - holder.icon_state = "huddead" + holder.icon_state = HAS_TRAIT(src, TRAIT_HARDCORE) || MODE_HAS_TOGGLEABLE_FLAG(MODE_HARDCORE_PERMA) ? "hudhcdead" : "huddead" if(!holder2_set) - holder2.icon_state = "huddead" + holder2.icon_state = holder.icon_state holder3.icon_state = "huddead" holder2_set = 1 diff --git a/code/datums/supply_packs/attachments.dm b/code/datums/supply_packs/attachments.dm index 2a812e94cfc1..b685e5c3c37f 100644 --- a/code/datums/supply_packs/attachments.dm +++ b/code/datums/supply_packs/attachments.dm @@ -84,17 +84,6 @@ containername = "extended barrel attachment crate" group = "Attachments" -/datum/supply_packs/muzzle_heavy - name = "barrel charger attachment crate (x2)" - contains = list( - /obj/item/attachable/heavy_barrel, - /obj/item/attachable/heavy_barrel, - ) - cost = 30 - containertype = /obj/structure/closet/crate - containername = "heavy barrel attachment crate" - group = "Attachments" - /datum/supply_packs/muzzle_compensator name = "compensator attachment crate (x6)" contains = list( diff --git a/code/game/area/Sulaco.dm b/code/game/area/Sulaco.dm index ffc087ad9851..851025e1b63a 100644 --- a/code/game/area/Sulaco.dm +++ b/code/game/area/Sulaco.dm @@ -13,6 +13,7 @@ is_resin_allowed = FALSE flags_area = AREA_NOTUNNEL is_landing_zone = TRUE + ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/Enter(atom/movable/O, atom/oldloc) if(istype(O, /obj/structure/barricade)) @@ -23,36 +24,30 @@ name = "\improper Dropship Alamo" icon_state = "shuttlered" base_muffle = MUFFLE_HIGH - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/LV624 name = "\improper Dropship Alamo" ambience_exterior = AMBIENCE_LV624 icon_state = "shuttle" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/prison name = "\improper Dropship Alamo" ambience_exterior = AMBIENCE_PRISON icon_state = "shuttle" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/BigRed name = "\improper Dropship Alamo" ambience_exterior = AMBIENCE_BIGRED icon_state = "shuttle" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/ice_colony name = "\improper Dropship Alamo" icon_state = "shuttle" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/DesertDam name = "\improper Dropship Alamo" ambience_exterior = AMBIENCE_TRIJENT icon_state = "shuttle" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop1/transit ambience_exterior = 'sound/ambience/dropship_ambience_loop.ogg' @@ -75,41 +70,36 @@ is_resin_allowed = FALSE flags_area = AREA_NOTUNNEL is_landing_zone = TRUE + ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/sulaco name = "\improper Dropship Normandy" icon_state = "shuttle" base_muffle = MUFFLE_HIGH - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/LV624 name = "\improper Dropship Normandy" ambience_exterior = AMBIENCE_LV624 icon_state = "shuttle2" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/prison name = "\improper Dropship Normandy" ambience_exterior = AMBIENCE_PRISON icon_state = "shuttle2" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/BigRed name = "\improper Dropship Normandy" ambience_exterior = AMBIENCE_BIGRED icon_state = "shuttle2" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/ice_colony name = "\improper Dropship Normandy" icon_state = "shuttle2" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/DesertDam name = "\improper Dropship Normandy" ambience_exterior = AMBIENCE_TRIJENT icon_state = "shuttle2" - ceiling = CEILING_REINFORCED_METAL /area/shuttle/drop2/transit ambience_exterior = 'sound/ambience/dropship_ambience_loop.ogg' diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index c56360953650..47d4bb20849b 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -212,12 +212,27 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) freq_listening = list(COLONY_FREQ) var/toggle_cooldown = 0 + /// Tower has been taken over by xenos, is not usable + var/corrupted = FALSE + + /// Held image for the current overlay on the tower from xeno corruption + var/image/corruption_image + +/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/Initialize() + . = ..() + + RegisterSignal(src, COMSIG_ATOM_TURF_CHANGE, PROC_REF(register_with_turf)) + register_with_turf() + /obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/attack_hand(mob/user) if(user.action_busy) return if(toggle_cooldown > world.time) //cooldown only to prevent spam toggling to_chat(user, SPAN_WARNING("\The [src]'s processors are still cooling! Wait before trying to flip the switch again.")) return + if(corrupted) + to_chat(user, SPAN_WARNING("[src] is entangled in resin. Impossible to interact with.")) + return var/current_state = on if(!do_after(user, 20, INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, src)) return @@ -282,6 +297,84 @@ GLOBAL_LIST_EMPTY(all_static_telecomms_towers) else update_icon() +/// Handles xenos corrupting the tower when weeds touch the turf it is located on +/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/proc/handle_xeno_acquisition(turf/weeded_turf) + SIGNAL_HANDLER + + if(corrupted) + return + + if(!weeded_turf.weeds) + return + + if(weeded_turf.weeds.weed_strength < WEED_LEVEL_HIVE) + return + + if(!weeded_turf.weeds.parent) + return + + if(!istype(weeded_turf.weeds.parent, /obj/effect/alien/weeds/node/pylon/cluster)) + return + + if(SSticker.mode.is_in_endgame) + return + + if(ROUND_TIME < XENO_COMM_ACQUISITION_TIME) + addtimer(CALLBACK(src, PROC_REF(handle_xeno_acquisition), weeded_turf), (XENO_COMM_ACQUISITION_TIME - ROUND_TIME)) + return + + var/obj/effect/alien/weeds/node/pylon/cluster/parent_node = weeded_turf.weeds.parent + + var/obj/effect/alien/resin/special/cluster/cluster_parent = parent_node.resin_parent + + var/list/held_children_weeds = parent_node.children + var/cluster_loc = cluster_parent.loc + var/linked_hive = cluster_parent.linked_hive + + parent_node.children = list() + + qdel(cluster_parent) + + var/obj/effect/alien/resin/special/pylon/endgame/new_pylon = new(cluster_loc, linked_hive) + new_pylon.node.children = held_children_weeds + + for(var/obj/effect/alien/weeds/weed in new_pylon.node.children) + weed.parent = new_pylon.node + + RegisterSignal(new_pylon, COMSIG_PARENT_QDELETING, PROC_REF(uncorrupt)) + + corrupted = TRUE + + corruption_image = image(icon, icon_state = "resin_growing") + + flick_overlay(src, corruption_image, (2 SECONDS)) + addtimer(CALLBACK(src, PROC_REF(switch_to_idle_corruption)), (2 SECONDS)) + + new_pylon.comms_relay_connection() + +/// Handles removing corruption effects from the comms relay +/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/proc/uncorrupt(datum/deleting_datum) + SIGNAL_HANDLER + + corrupted = FALSE + + overlays -= corruption_image + +/// Handles moving the overlay from growing to idle +/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/proc/switch_to_idle_corruption() + if(!corrupted) + return + + corruption_image = image(icon, icon_state = "resin_idle") + + overlays += corruption_image + +/// Handles re-registering signals on new turfs if changed +/obj/structure/machinery/telecomms/relay/preset/tower/mapcomms/proc/register_with_turf() + SIGNAL_HANDLER + + RegisterSignal(get_turf(src), COMSIG_WEEDNODE_GROWTH, PROC_REF(handle_xeno_acquisition)) + /obj/structure/machinery/telecomms/relay/preset/telecomms id = "Telecomms Relay" autolinkers = list("relay") diff --git a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm index 3d6a48b45daa..fac4182ea5fe 100644 --- a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm @@ -42,7 +42,6 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( list("Underbarrel Flamethrower", 15, /obj/item/attachable/attached_gun/flamer, null, VENDOR_ITEM_REGULAR), list("BARREL ATTACHMENTS", 0, null, null, null), - list("Barrel Charger", 25, /obj/item/attachable/heavy_barrel, null, VENDOR_ITEM_RECOMMENDED), list("Suppressor", 15, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR), list("Extended Barrel", 15, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR), list("Recoil Compensator", 15, /obj/item/attachable/compensator, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm index 5dddff051b50..0496530be861 100644 --- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm +++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm @@ -21,6 +21,7 @@ list("Industrial Blowtorch", 2, /obj/item/tool/weldingtool/largetank, null, VENDOR_ITEM_REGULAR), list("High-Capacity Industrial Blowtorch", 4, /obj/item/tool/weldingtool/hugetank, null, VENDOR_ITEM_REGULAR), list("Plastic Explosive", 3, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR), + list("Toolkit", 1, /obj/item/storage/firstaid/toolkit/empty, null, VENDOR_ITEM_REGULAR), list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/engineering.dm b/code/game/machinery/vending/vendor_types/engineering.dm index 83f69ae09889..f0a81d990491 100644 --- a/code/game/machinery/vending/vendor_types/engineering.dm +++ b/code/game/machinery/vending/vendor_types/engineering.dm @@ -25,6 +25,7 @@ list("Utility Tool Belt", round(scale * 2), /obj/item/storage/belt/utility, VENDOR_ITEM_REGULAR), list("Welding Goggles", round(scale * 2), /obj/item/clothing/glasses/welding, VENDOR_ITEM_REGULAR), list("Welding Helmet", round(scale * 2), /obj/item/clothing/head/welding, VENDOR_ITEM_REGULAR), + list("Toolkit", round(scale * 4), /obj/item/storage/firstaid/toolkit/empty, VENDOR_ITEM_REGULAR), list("SCANNERS", -1, null, null), list("Atmos Scanner", round(scale * 2), /obj/item/device/analyzer, VENDOR_ITEM_REGULAR), @@ -54,6 +55,7 @@ list("EQUIPMENT", -1, null, null), list("Utility Tool Belt", round(scale * 4), /obj/item/storage/belt/utility, VENDOR_ITEM_REGULAR), list("Cable Coil", round(scale * 4), /obj/item/stack/cable_coil/random, VENDOR_ITEM_REGULAR), + list("Toolkit", round(scale * 12), /obj/item/storage/firstaid/toolkit/empty, VENDOR_ITEM_REGULAR), list("TOOLS", -1, null, null), list("Blowtorch", round(scale * 4), /obj/item/tool/weldingtool, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/requisitions.dm b/code/game/machinery/vending/vendor_types/requisitions.dm index f85657e887a8..cdf64368c8d4 100644 --- a/code/game/machinery/vending/vendor_types/requisitions.dm +++ b/code/game/machinery/vending/vendor_types/requisitions.dm @@ -342,7 +342,6 @@ /obj/structure/machinery/cm_vending/sorted/attachments/populate_product_list(scale) listed_products = list( list("BARREL", -1, null, null), - list("Barrel Charger", round(scale * 2.5), /obj/item/attachable/heavy_barrel, VENDOR_ITEM_REGULAR), list("Extended Barrel", round(scale * 6.5), /obj/item/attachable/extended_barrel, VENDOR_ITEM_REGULAR), list("M5 Bayonet", round(scale * 10.5), /obj/item/attachable/bayonet, VENDOR_ITEM_REGULAR), list("Recoil Compensator", round(scale * 6.5), /obj/item/attachable/compensator, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm index 4f10d956ee3c..28cc72a1708e 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_prep.dm @@ -281,7 +281,6 @@ /obj/structure/machinery/cm_vending/sorted/attachments/squad/populate_product_list(scale) listed_products = list( list("BARREL", -1, null, null), - list("Barrel Charger", round(scale * 0.9), /obj/item/attachable/heavy_barrel, VENDOR_ITEM_REGULAR), list("Extended Barrel", round(scale * 2.5), /obj/item/attachable/extended_barrel, VENDOR_ITEM_REGULAR), list("Recoil Compensator", round(scale * 2.5), /obj/item/attachable/compensator, VENDOR_ITEM_REGULAR), list("Suppressor", round(scale * 2.5), /obj/item/attachable/suppressor, VENDOR_ITEM_REGULAR), diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index ccab1bf3dfc7..0d976b4cdf57 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -212,6 +212,22 @@ /obj/item/storage/firstaid/surgical/empty/fill_preset_inventory() return +//---------TOOLKIT--------- + +/obj/item/storage/firstaid/toolkit + name = "toolkit" + desc = "An combat engineering toolkit intended to carry electrical and mechanical supplies into combat." + icon_state = "toolkit" + item_state = "fulton" + +/obj/item/storage/firstaid/toolkit/update_icon() + if(content_watchers || !length(contents)) + icon_state = "toolkit_empty" + else + icon_state = icon_full + +/obj/item/storage/firstaid/toolkit/empty/fill_preset_inventory() + return //---------SYRINGE CASE--------- @@ -265,7 +281,14 @@ /obj/item/storage/surgical_case name = "surgical case" - desc = "It's a medical case for storing basic surgical tools." + desc = "It's a medical case for storing basic surgical tools. It comes with a brief description for treating common internal bleeds.\ + \nBefore surgery: Verify correct location and patient is adequately numb to pain.\ + \nStep one: Open an incision at the site with the scalpel.\ + \nStep two: Clamp bleeders with the hemostat.\ + \nStep three: Draw back the skin with the retracter.\ + \nStep four: Patch the damaged vein with a surgical line.\ + \nStep five: Close the incision with a surgical line." + icon_state = "surgical_case" throw_speed = SPEED_FAST throw_range = 8 diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index f5f1122fa795..3f0775c0b65d 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -205,10 +205,10 @@ /datum/asset/spritesheet/playtime_rank/register() var/icon_file = 'icons/mob/hud/hud.dmi' - var/tier1_state = "hudxenoupgrade1" - var/tier2_state = "hudxenoupgrade2" - var/tier3_state = "hudxenoupgrade3" - var/tier4_state = "hudxenoupgrade4" + var/tier1_state = "hudxenoupgrade2" + var/tier2_state = "hudxenoupgrade3" + var/tier3_state = "hudxenoupgrade4" + var/tier4_state = "hudxenoupgrade5" var/icon/tier1_icon = icon(icon_file, tier1_state, SOUTH) var/icon/tier2_icon = icon(icon_file, tier2_state, SOUTH) diff --git a/code/modules/cm_aliens/structures/special/pylon_core.dm b/code/modules/cm_aliens/structures/special/pylon_core.dm index 993d4f833fa6..068ffeb659eb 100644 --- a/code/modules/cm_aliens/structures/special/pylon_core.dm +++ b/code/modules/cm_aliens/structures/special/pylon_core.dm @@ -12,6 +12,7 @@ block_range = 0 var/cover_range = WEED_RANGE_PYLON var/node_type = /obj/effect/alien/weeds/node/pylon + var/obj/effect/alien/weeds/node/node var/linked_turfs = list() var/damaged = FALSE @@ -25,7 +26,7 @@ /obj/effect/alien/resin/special/pylon/Initialize(mapload, hive_ref) . = ..() - place_node() + node = place_node() for(var/turf/A in range(round(cover_range*PYLON_COVERAGE_MULT), loc)) LAZYADD(A.linked_pylons, src) linked_turfs += A @@ -34,9 +35,8 @@ for(var/turf/A as anything in linked_turfs) LAZYREMOVE(A.linked_pylons, src) - var/obj/effect/alien/weeds/node/pylon/W = locate() in loc - if(W) - qdel(W) + if(node) + QDEL_NULL(node) . = ..() /obj/effect/alien/resin/special/pylon/attack_alien(mob/living/carbon/xenomorph/M) @@ -87,8 +87,78 @@ playsound(loc, "alien_resin_build", 25) /obj/effect/alien/resin/special/pylon/proc/place_node() - var/obj/effect/alien/weeds/node/pylon/W = new node_type(loc, null, null, linked_hive) - W.resin_parent = src + var/obj/effect/alien/weeds/node/pylon/pylon_node = new node_type(loc, null, null, linked_hive) + pylon_node.resin_parent = src + return pylon_node + +/obj/effect/alien/resin/special/pylon/endgame + cover_range = WEED_RANGE_CORE + var/activated = FALSE + +/obj/effect/alien/resin/special/pylon/endgame/Destroy() + if(activated) + activated = FALSE + + if(hijack_delete) + return ..() + + marine_announcement("ALERT.\n\nEnergy build up around communication relay at [get_area(src)] halted.", "[MAIN_AI_SYSTEM] Biological Scanner") + + for(var/hivenumber in GLOB.hive_datum) + var/datum/hive_status/checked_hive = GLOB.hive_datum[hivenumber] + if(!length(checked_hive.totalXenos)) + continue + + if(checked_hive == linked_hive) + xeno_announcement(SPAN_XENOANNOUNCE("We have lost our control of the tall's communication relay at [get_area(src)]."), hivenumber, XENO_GENERAL_ANNOUNCE) + else + xeno_announcement(SPAN_XENOANNOUNCE("Another hive has lost control of the tall's communication relay at [get_area(src)]."), hivenumber, XENO_GENERAL_ANNOUNCE) + + return ..() + +/// Checks if all comms towers are connected and then starts end game content on all pylons if they are +/obj/effect/alien/resin/special/pylon/endgame/proc/comms_relay_connection() + marine_announcement("ALERT.\n\nIrregular build up of energy around communication relays at [get_area(src)].", "[MAIN_AI_SYSTEM] Biological Scanner") + + for(var/hivenumber in GLOB.hive_datum) + var/datum/hive_status/checked_hive = GLOB.hive_datum[hivenumber] + if(!length(checked_hive.totalXenos)) + continue + + if(checked_hive == linked_hive) + xeno_announcement(SPAN_XENOANNOUNCE("We have harnessed the tall's communication relay at [get_area(src)]. Hold it!"), hivenumber, XENO_GENERAL_ANNOUNCE) + else + xeno_announcement(SPAN_XENOANNOUNCE("Another hive has harnessed the tall's communication relay at [get_area(src)].[linked_hive.faction_is_ally(checked_hive.name) ? "" : " Stop them!"]"), hivenumber, XENO_GENERAL_ANNOUNCE) + + activated = TRUE + addtimer(CALLBACK(src, PROC_REF(give_larva)), XENO_PYLON_ACTIVATION_COOLDOWN, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_LOOP|TIMER_DELETE_ME) + +#define ENDGAME_LARVA_CAP_MULTIPLIER 0.4 +#define LARVA_ADDITION_MULTIPLIER 0.10 + +/// Looped proc via timer to give larva after time +/obj/effect/alien/resin/special/pylon/endgame/proc/give_larva() + if(!activated) + return + + if(!linked_hive.hive_location || !linked_hive.living_xeno_queen) + return + + var/list/hive_xenos = linked_hive.totalXenos + + for(var/mob/living/carbon/xenomorph/xeno in hive_xenos) + if(!xeno.counts_for_slots) + hive_xenos -= xeno + + if(length(hive_xenos) > (length(GLOB.alive_human_list) * ENDGAME_LARVA_CAP_MULTIPLIER)) + return + + linked_hive.partial_larva += length(hive_xenos) * LARVA_ADDITION_MULTIPLIER + linked_hive.convert_partial_larva_to_full_larva() + linked_hive.hive_ui.update_burrowed_larva() + +#undef ENDGAME_LARVA_CAP_MULTIPLIER +#undef LARVA_ADDITION_MULTIPLIER //Hive Core - Generates strong weeds, supports other buildings /obj/effect/alien/resin/special/pylon/core diff --git a/code/modules/cm_aliens/structures/special_structure.dm b/code/modules/cm_aliens/structures/special_structure.dm index caa729f1df87..69bdcc2438ac 100644 --- a/code/modules/cm_aliens/structures/special_structure.dm +++ b/code/modules/cm_aliens/structures/special_structure.dm @@ -39,6 +39,9 @@ plane = FLOOR_PLANE + /// Tells the structure if they are being deleted because of hijack + var/hijack_delete = FALSE + /obj/effect/alien/resin/special/Initialize(mapload, hive_ref) . = ..() maxhealth = health diff --git a/code/modules/cm_aliens/weeds.dm b/code/modules/cm_aliens/weeds.dm index f20fa842e446..01140beae304 100644 --- a/code/modules/cm_aliens/weeds.dm +++ b/code/modules/cm_aliens/weeds.dm @@ -55,7 +55,7 @@ linked_hive = GLOB.hive_datum[hivenumber] set_hive_data(src, hivenumber) - if(spread_on_semiweedable) + if(spread_on_semiweedable && weed_strength < WEED_LEVEL_HIVE) if(color) var/list/RGB = ReadRGB(color) RGB[1] = Clamp(RGB[1] + 35, 0, 255) @@ -588,9 +588,13 @@ weed_strength = WEED_LEVEL_HIVE node_range = WEED_RANGE_PYLON overlay_node = FALSE + spread_on_semiweedable = TRUE var/obj/effect/alien/resin/special/resin_parent /obj/effect/alien/weeds/node/pylon/proc/set_parent_damaged() + if(!resin_parent) + return + var/obj/effect/alien/resin/special/pylon/parent_pylon = resin_parent parent_pylon.damaged = TRUE @@ -616,7 +620,13 @@ /obj/effect/alien/weeds/node/pylon/acid_spray_act() return +/obj/effect/alien/weeds/node/pylon/cluster + spread_on_semiweedable = FALSE + /obj/effect/alien/weeds/node/pylon/cluster/set_parent_damaged() + if(!resin_parent) + return + var/obj/effect/alien/resin/special/cluster/parent_cluster = resin_parent parent_cluster.damaged = TRUE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 9e8fa264af1d..ee36d25fc687 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -544,6 +544,27 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!istype(target)) return + if(check_client_rights(client, R_MOD, FALSE)) + view_health_scan(target) + return + + if(!mind.original) + view_health_scan(target) + return + + if(!ishuman(mind.original)) + view_health_scan(target) + return + + var/mob/living/carbon/human/original_human = mind.original + + if(!original_human.check_tod() || !original_human.is_revivable() || !can_reenter_corpse) + view_health_scan(target) + return + + to_chat(src, SPAN_NOTICE("You must be permanently unrevivable or unable to reenter your body to use the scan health verb.")) + +/mob/dead/observer/proc/view_health_scan(mob/living/target) if (!last_health_display) last_health_display = new(target) else diff --git a/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm b/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm index a89a3ad32e85..ae03d0646657 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm @@ -3,6 +3,7 @@ return age = XENO_NORMAL + var/hours_as_xeno = client.get_total_xeno_playtime() var/hours_as_caste = get_job_playtime(client, caste.caste_type) switch(hours_as_caste) @@ -15,11 +16,16 @@ if(JOB_PLAYTIME_TIER_4 to INFINITY) age = XENO_PRIME + if(hours_as_xeno < JOB_PLAYTIME_TIER_1) + age = XENO_YOUNG + // For people who wish to remain anonymous if(!client.prefs.playtime_perks) age = XENO_NORMAL switch(age) + if(XENO_YOUNG) + age_prefix = "Young " if(XENO_NORMAL) age_prefix = "" if(XENO_MATURE) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm index 53e30d374b2c..632c7a978261 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm @@ -413,17 +413,24 @@ if(queen_aged) age_xeno() switch(age) - if(XENO_NORMAL) name = "[name_prefix]Queen" //Young - if(XENO_MATURE) name = "[name_prefix]Elder Queen" //Mature - if(XENO_ELDER) name = "[name_prefix]Elder Empress" //Elite - if(XENO_ANCIENT) name = "[name_prefix]Ancient Empress" //Ancient - if(XENO_PRIME) name = "[name_prefix]Prime Empress" //Primordial + if(XENO_YOUNG) + name = "[name_prefix]Young Queen" //Young + if(XENO_NORMAL) + name = "[name_prefix]Queen" //Regular + if(XENO_MATURE) + name = "[name_prefix]Elder Queen" //Mature + if(XENO_ELDER) + name = "[name_prefix]Elder Empress" //Elite + if(XENO_ANCIENT) + name = "[name_prefix]Ancient Empress" //Ancient + if(XENO_PRIME) + name = "[name_prefix]Prime Empress" //Primordial else age = XENO_NORMAL if(client) hud_update() - name = "[name_prefix]Young Queen" + name = "[name_prefix]Growing Queen" var/name_client_prefix = "" var/name_client_postfix = "" diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm index cfca16f70a51..512c26f8c360 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_defines.dm @@ -317,6 +317,7 @@ XENO_STRUCTURE_EGGMORPH = 6, XENO_STRUCTURE_EVOPOD = 2, XENO_STRUCTURE_RECOVERY = 6, + XENO_STRUCTURE_PYLON = 2, ) var/global/list/hive_structure_types = list( @@ -370,17 +371,25 @@ if(hivenumber != XENO_HIVE_NORMAL) return - RegisterSignal(SSdcs, COMSIG_GLOB_POST_SETUP, PROC_REF(setup_evolution_announcements)) + RegisterSignal(SSdcs, COMSIG_GLOB_POST_SETUP, PROC_REF(post_setup)) -/datum/hive_status/proc/setup_evolution_announcements() +/datum/hive_status/proc/post_setup() SIGNAL_HANDLER + setup_evolution_announcements() + setup_pylon_limits() + +/datum/hive_status/proc/setup_evolution_announcements() for(var/time in GLOB.xeno_evolve_times) if(time == "0") continue addtimer(CALLBACK(src, PROC_REF(announce_evolve_available), GLOB.xeno_evolve_times[time]), text2num(time)) +/// Sets up limits on pylons in New() for potential futureproofing with more static comms +/datum/hive_status/proc/setup_pylon_limits() + hive_structures_limit[XENO_STRUCTURE_PYLON] = length(GLOB.all_static_telecomms_towers) || 2 + /datum/hive_status/proc/announce_evolve_available(list/datum/caste_datum/available_castes) var/list/castes_available = list() @@ -883,6 +892,7 @@ for(var/obj/effect/alien/resin/special/S in hive_structures[name_ref]) if(get_area(S) == hijacked_dropship) continue + S.hijack_delete = TRUE hive_structures[name_ref] -= S qdel(S) for(var/mob/living/carbon/xenomorph/xeno as anything in totalXenos) @@ -1122,6 +1132,10 @@ /datum/hive_status/proc/increase_larva_after_burst() var/extra_per_burst = CONFIG_GET(number/extra_larva_per_burst) partial_larva += extra_per_burst + convert_partial_larva_to_full_larva() + +///Called after times when partial larva are added to process them to stored larva +/datum/hive_status/proc/convert_partial_larva_to_full_larva() for(var/i = 1 to partial_larva) partial_larva-- stored_larva++ diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm index 2a77a6ba6a68..7f6e01045745 100644 --- a/code/modules/projectiles/gun_attachables.dm +++ b/code/modules/projectiles/gun_attachables.dm @@ -368,6 +368,7 @@ Defined in conflicts.dm of the #defines folder. icon_state = "ebarrel" attach_icon = "ebarrel_a" hud_offset_mod = -3 + wield_delay_mod = WIELD_DELAY_FAST /obj/item/attachable/extended_barrel/New() ..() @@ -2522,10 +2523,9 @@ Defined in conflicts.dm of the #defines folder. accuracy_unwielded_mod = -HIT_ACCURACY_MULT_TIER_3 scatter_unwielded_mod = SCATTER_AMOUNT_TIER_10 - /obj/item/attachable/angledgrip name = "angled grip" - desc = "An angled foregrip that improves weapon ergonomics and offers less recoil, and faster wielding time. \nHowever, it also increases weapon size." + desc = "An angled foregrip that improves weapon ergonomics resulting in faster wielding time. \nHowever, it also increases weapon size." icon = 'icons/obj/items/weapons/guns/attachments/under.dmi' icon_state = "angledgrip" attach_icon = "angledgrip_a" @@ -2534,16 +2534,6 @@ Defined in conflicts.dm of the #defines folder. slot = "under" pixel_shift_x = 20 -/obj/item/attachable/angledgrip/New() - ..() - recoil_mod = -RECOIL_AMOUNT_TIER_4 - accuracy_mod = HIT_ACCURACY_MULT_TIER_1 - accuracy_unwielded_mod = -HIT_ACCURACY_MULT_TIER_1 - scatter_mod = -SCATTER_AMOUNT_TIER_10 - scatter_unwielded_mod = SCATTER_AMOUNT_TIER_10 - - - /obj/item/attachable/gyro name = "gyroscopic stabilizer" desc = "A set of weights and balances to stabilize the weapon when fired with one hand. Slightly decreases firing speed." diff --git a/html/changelogs/AutoChangeLog-pr-3952.yml b/html/changelogs/AutoChangeLog-pr-3952.yml new file mode 100644 index 000000000000..c4363cdb5c04 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3952.yml @@ -0,0 +1,4 @@ +author: "thwomper, Steelpoint" +delete-after: True +changes: + - rscadd: "Toolkits have been added to the game. Holds engineering supplies akin to a medkit. Issued freely to ComTechs and Engineers, can be bought by the USCM Synthetic for cheap." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-3985.yml b/html/changelogs/AutoChangeLog-pr-3985.yml new file mode 100644 index 000000000000..9753f46415d8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3985.yml @@ -0,0 +1,4 @@ +author: "Morrow, Sleepynecrons (beautiful sprites)" +delete-after: True +changes: + - rscadd: "Xenos can now capture comms relays for bonuses after 90 minutes into the round." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4099.yml b/html/changelogs/AutoChangeLog-pr-4099.yml new file mode 100644 index 000000000000..df86b7105b7b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4099.yml @@ -0,0 +1,5 @@ +author: "blackdragonTOW" +delete-after: True +changes: + - ui: "Hardcore deaths are now marked with a unique red skull" + - imageadd: "Red skull added for hardcore deaths" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4121.yml b/html/changelogs/AutoChangeLog-pr-4121.yml new file mode 100644 index 000000000000..d9e78ede8551 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4121.yml @@ -0,0 +1,4 @@ +author: "morrowwolf" +delete-after: True +changes: + - rscadd: "Added basic IB surgery instructions to surgical case" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4122.yml b/html/changelogs/AutoChangeLog-pr-4122.yml new file mode 100644 index 000000000000..2f821c756627 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4122.yml @@ -0,0 +1,6 @@ +author: "Morrow" +delete-after: True +changes: + - balance: "Removed the barrel charger from vendors" + - balance: "Removed all benefits other than wield delay mod from the angled grip" + - balance: "Added wield delay to extended barrel" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4124.yml b/html/changelogs/AutoChangeLog-pr-4124.yml new file mode 100644 index 000000000000..c335ea69aae5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4124.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - rscadd: "Scan health now only works when non-revivable" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4125.yml b/html/changelogs/AutoChangeLog-pr-4125.yml new file mode 100644 index 000000000000..c678b8473a7a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4125.yml @@ -0,0 +1,5 @@ +author: "Morrow" +delete-after: True +changes: + - rscadd: "Xenos with less than 10 hours on xeno now have the \"Young\" prefix" + - rscadd: "Young Queen has been renamed to Growing Queen" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4133.yml b/html/changelogs/AutoChangeLog-pr-4133.yml new file mode 100644 index 000000000000..5e2b0c16c10d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4133.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fix new map dropship areas not getting changes to dropship ceilings that prevents OBs" \ No newline at end of file diff --git a/icons/mob/hud/hud.dmi b/icons/mob/hud/hud.dmi index f8ea98d01e53..c9e4c0c6c23d 100644 Binary files a/icons/mob/hud/hud.dmi and b/icons/mob/hud/hud.dmi differ diff --git a/icons/obj/items/storage.dmi b/icons/obj/items/storage.dmi index 2d0c1f5928df..310bee26b9e9 100644 Binary files a/icons/obj/items/storage.dmi and b/icons/obj/items/storage.dmi differ diff --git a/icons/obj/structures/machinery/comm_tower3.dmi b/icons/obj/structures/machinery/comm_tower3.dmi index 931d6f77514a..8a5aa1f68fe3 100644 Binary files a/icons/obj/structures/machinery/comm_tower3.dmi and b/icons/obj/structures/machinery/comm_tower3.dmi differ diff --git a/maps/map_files/New_Varadero/New_Varadero.dmm b/maps/map_files/New_Varadero/New_Varadero.dmm index 20558b48ac32..4488d13b9bc7 100644 --- a/maps/map_files/New_Varadero/New_Varadero.dmm +++ b/maps/map_files/New_Varadero/New_Varadero.dmm @@ -2832,7 +2832,6 @@ /obj/structure/surface/table/reinforced/prison{ color = "#6b675e" }, -/obj/item/attachable/heavy_barrel, /obj/structure/window/reinforced, /turf/open/floor/strata{ color = "#5e5d5d";