diff --git a/code/__DEFINES/equipment.dm b/code/__DEFINES/equipment.dm index 5f8f27a65711..6628a5c925c2 100644 --- a/code/__DEFINES/equipment.dm +++ b/code/__DEFINES/equipment.dm @@ -80,10 +80,8 @@ #define CAN_DIG_SHRAPNEL (1<<11) /// whether it has an animated icon state of "[icon_state]_on" to be used during surgeries. #define ANIMATED_SURGICAL_TOOL (1<<12) -/// The item goes on top of tables, instead of into them with the overlay system -#define NOTABLEMERGE (1<<13) /// Has heat source but isn't 'on fire' and thus can be stored -#define IGNITING_ITEM (1<<14) +#define IGNITING_ITEM (1<<13) //========================================================================================== diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index b2704fc66862..bbf8fda99f61 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -10,6 +10,9 @@ _L = target._status_traits; \ _L[trait] = list(source); \ SEND_SIGNAL(target, SIGNAL_ADDTRAIT(trait), trait); \ + if(trait in GLOB.traits_with_elements){ \ + target.AddElement(GLOB.traits_with_elements[trait]); \ + } \ } else { \ _L = target._status_traits; \ if (_L[trait]) { \ @@ -17,6 +20,9 @@ } else { \ _L[trait] = list(source); \ SEND_SIGNAL(target, SIGNAL_ADDTRAIT(trait), trait); \ + if(trait in GLOB.traits_with_elements){ \ + target.AddElement(GLOB.traits_with_elements[trait]); \ + } \ } \ } \ } while (0) @@ -38,6 +44,9 @@ if (!length(_L[trait])) { \ _L -= trait; \ SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \ + if(trait in GLOB.traits_with_elements) { \ + target.RemoveElement(GLOB.traits_with_elements[trait]); \ + } \ }; \ if (!length(_L)) { \ target._status_traits = null \ @@ -62,6 +71,9 @@ if (!length(_traits_list[trait])) { \ _traits_list -= trait; \ SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \ + if(trait in GLOB.traits_with_elements) { \ + target.RemoveElement(GLOB.traits_with_elements[trait]); \ + } \ }; \ if (!length(_traits_list)) { \ target._status_traits = null \ @@ -78,8 +90,11 @@ if (!length(_L[_T])) { \ _L -= _T; \ SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T), _T); \ + if(trait in GLOB.traits_with_elements) { \ + target.RemoveElement(GLOB.traits_with_elements[trait]); \ }; \ };\ + };\ if (!length(_L)) { \ target._status_traits = null\ };\ @@ -101,8 +116,11 @@ if (!length(_L[_T])) { \ _L -= _T; \ SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T)); \ + if(_T in GLOB.traits_with_elements) { \ + target.RemoveElement(GLOB.traits_with_elements[_T]); \ }; \ };\ + };\ if (!length(_L)) { \ target._status_traits = null\ };\ @@ -124,9 +142,6 @@ /// Example trait // #define TRAIT_X "t_x" -/// cannot be removed without admin intervention -#define ROUNDSTART_TRAIT "roundstart" - //-- mob traits -- /// Apply this to make a mob not dense, and remove it when you want it to no longer make them undense, other sorces of undesity will still apply. Always define a unique source when adding a new instance of this! #define TRAIT_UNDENSE "undense" @@ -355,6 +370,8 @@ GLOBAL_LIST(trait_name_map) /// Example trait source // #define TRAIT_SOURCE_Y "t_s_y" #define TRAIT_SOURCE_INHERENT "t_s_inherent" +/// cannot be removed without admin intervention +#define ROUNDSTART_TRAIT "roundstart" //-- mob traits -- ///Status trait coming from lying down through update_canmove() #define LYING_TRAIT "lying" @@ -364,8 +381,6 @@ GLOBAL_LIST(trait_name_map) #define TRAIT_SOURCE_HIVE "t_s_hive" ///Status trait coming from being buckled. #define TRAIT_SOURCE_BUCKLE "t_s_buckle" -///Status trait coming from roundstart quirks (that don't exist yet). Unremovable by REMOVE_TRAIT -#define TRAIT_SOURCE_QUIRK "t_s_quirk" ///Status trait coming from being assigned as [acting] squad leader. #define TRAIT_SOURCE_SQUAD_LEADER "t_s_squad_leader" ///Status trait coming from their job diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 53dd40ff6035..540c8f085601 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -166,7 +166,6 @@ DEFINE_BITFIELD(flags_item, list( "ITEM_OVERRIDE_NORTHFACE" = ITEM_OVERRIDE_NORTHFACE, "CAN_DIG_SHRAPNEL" = CAN_DIG_SHRAPNEL, "ANIMATED_SURGICAL_TOOL" = ANIMATED_SURGICAL_TOOL, - "NOTABLEMERGE" = NOTABLEMERGE, "IGNITING_ITEM" = IGNITING_ITEM, )) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index b49bce4111f0..d114aff6b7cb 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -535,7 +535,7 @@ if(!user.hive.living_xeno_queen) to_chat(user, SPAN_WARNING("Without a queen your psychic link is broken!")) return FALSE - if(user.burrow || user.is_mob_incapacitated() || user.buckled) + if(HAS_TRAIT(user, TRAIT_ABILITY_BURROWED) || user.is_mob_incapacitated() || user.buckled) return FALSE user.hive.mark_ui.update_all_data() user.hive.mark_ui.open_mark_menu(user) @@ -583,7 +583,7 @@ if(!user.hive.living_xeno_queen) to_chat(user, SPAN_WARNING("Your hive doesn't have a living queen!")) return FALSE - if(user.burrow || user.is_mob_incapacitated() || user.buckled) + if(HAS_TRAIT(user, TRAIT_ABILITY_BURROWED) || user.is_mob_incapacitated() || user.buckled) return FALSE user.overwatch(user.hive.living_xeno_queen) diff --git a/code/_onclick/xeno.dm b/code/_onclick/xeno.dm index 62d612790930..adb637dfe8fa 100644 --- a/code/_onclick/xeno.dm +++ b/code/_onclick/xeno.dm @@ -3,7 +3,7 @@ */ /mob/living/carbon/xenomorph/UnarmedAttack(atom/target, proximity, click_parameters, tile_attack = FALSE, ignores_resin = FALSE) - if(lying || burrow) //No attacks while laying down + if(lying || HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) //No attacks while laying down return FALSE var/mob/alt diff --git a/code/datums/components/autofire/autofire.dm b/code/datums/components/autofire/autofire.dm index d052127effc3..455fb70a9fa1 100644 --- a/code/datums/components/autofire/autofire.dm +++ b/code/datums/components/autofire/autofire.dm @@ -82,6 +82,8 @@ /datum/component/automatedfire/autofire/proc/initiate_shot() SIGNAL_HANDLER if(shooting)//if we are already shooting, it means the shooter is still on cooldown + if(bursting && (world.time > (next_fire + (burstfire_shot_delay * burst_shots_to_fire)))) + hard_reset() return shooting = TRUE process_shot() diff --git a/code/game/machinery/vending/vending_types.dm b/code/game/machinery/vending/vending_types.dm index c109db25b3a9..a57bbfe7d29f 100644 --- a/code/game/machinery/vending/vending_types.dm +++ b/code/game/machinery/vending/vending_types.dm @@ -412,6 +412,12 @@ /obj/item/device/camera_film = 10, /obj/item/notepad = 5, /obj/item/device/toner = 5, + /obj/item/paper/colonial_grunts = 15, + /obj/item/toy/dice/d20 = 10, + /obj/item/tool/pen = 10, + /obj/item/tool/pen/blue = 10, + /obj/item/tool/pen/red = 10, + /obj/item/tool/pen/fountain = 3, ) contraband = list(/obj/item/toy/sword = 2) @@ -433,5 +439,11 @@ /obj/item/toy/deck/uno = 15, /obj/item/device/camera = 30, /obj/item/device/toner = 15, + /obj/item/paper/colonial_grunts = 5, + /obj/item/toy/dice/d20 = 1, + /obj/item/tool/pen = 2, + /obj/item/tool/pen/blue = 2, + /obj/item/tool/pen/red = 2, + /obj/item/tool/pen/fountain = 30, ) product_type = VENDOR_PRODUCT_TYPE_RECREATIONAL diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 4b4252bac4b9..8bc717a0a6aa 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -72,9 +72,9 @@ return FALSE // Create their vis object if needed - if(!xeno.backpack_icon_carrier) - xeno.backpack_icon_carrier = new(null, xeno) - xeno.vis_contents += xeno.backpack_icon_carrier + if(!xeno.backpack_icon_holder) + xeno.backpack_icon_holder = new(null, xeno) + xeno.vis_contents += xeno.backpack_icon_holder target_mob.put_in_back(src) return FALSE diff --git a/code/game/objects/items/toys/cards.dm b/code/game/objects/items/toys/cards.dm index b6e3bb558ec4..2debd83f9bab 100644 --- a/code/game/objects/items/toys/cards.dm +++ b/code/game/objects/items/toys/cards.dm @@ -21,7 +21,6 @@ icon = 'icons/obj/items/playing_cards.dmi' icon_state = "deck" w_class = SIZE_TINY - flags_item = NOTABLEMERGE var/base_icon = "deck" var/max_cards = 52 @@ -262,7 +261,6 @@ icon = 'icons/obj/items/playing_cards.dmi' icon_state = "empty" w_class = SIZE_TINY - flags_item = NOTABLEMERGE var/concealed = FALSE var/pile_state = FALSE diff --git a/code/game/objects/structures/surface.dm b/code/game/objects/structures/surface.dm index efc69002424f..13a81af2dc3d 100644 --- a/code/game/objects/structures/surface.dm +++ b/code/game/objects/structures/surface.dm @@ -1,159 +1,20 @@ //Surface structures are structures that can have items placed on them /obj/structure/surface health = 100 - var/list/update_types = list( - /obj/item/reagent_container/glass, - /obj/item/storage, - /obj/item/reagent_container/food/snacks - ) - //add items there that behave like structures for whatever dumb reason - var/list/blacklisted_item_types = list( - /obj/item/device/radio/intercom, - /obj/item/device/sentry_computer - ) -/obj/structure/surface/Initialize() - . = ..() - return INITIALIZE_HINT_LATELOAD - -/obj/structure/surface/LateInitialize() - attach_all() - update_icon() - -/obj/structure/surface/Destroy() - detach_all() - . = ..() - -/obj/structure/surface/ex_act(severity, direction, datum/cause_data/cause_data) - health -= severity - if(health <= 0) - var/location = get_turf(src) - handle_debris(severity, direction) - detach_all() - for(var/obj/item/O in loc) - O.explosion_throw(severity, direction) - qdel(src) - if(prob(66)) - create_shrapnel(location, rand(1,4), direction, , /datum/ammo/bullet/shrapnel/light, cause_data) - return TRUE - -/obj/structure/surface/proc/attach_all() - for(var/obj/item/O in loc) - if(in_blacklist(O)) - continue - attach_item(O, FALSE) - draw_item_overlays() - -/obj/structure/surface/proc/in_blacklist(obj/item/O) - for(var/allowed_type in blacklisted_item_types) - if(istype(O, allowed_type)) - return TRUE - return FALSE - -/obj/structure/surface/proc/attach_item(obj/item/O, update = TRUE) - if(!O) +/obj/structure/surface/attackby(obj/item/attacking_item, mob/user, click_data) + if(!user.drop_inv_item_to_loc(attacking_item, loc)) return - if(O.luminosity) //it can't make light as an overlay - return - O.forceMove(src) - RegisterSignal(O, COMSIG_ATOM_DECORATED, PROC_REF(decorate_update)) - if(update) - draw_item_overlays() - -/obj/structure/surface/proc/detach_item(obj/item/O) - O.scatter_item() - UnregisterSignal(O, COMSIG_ATOM_DECORATED) - draw_item_overlays() - return - -/obj/structure/surface/proc/decorate_update(obj/item/O) - SIGNAL_HANDLER - draw_item_overlays() -/obj/structure/surface/proc/detach_all() - overlays.Cut() - for(var/obj/item/O in contents) - UnregisterSignal(O, COMSIG_ATOM_DECORATED) - O.forceMove(loc) + auto_align(attacking_item, click_data) + user.next_move = world.time + 2 + return TRUE -/obj/structure/surface/proc/get_item(list/click_data) - var/i = LAZYLEN(contents) - if(!click_data) - return - if(i < 1) - return FALSE - for(i, i >= 1, i--)//starting from the end because that's where the topmost is - var/obj/item/O = contents[i] - var/bounds_x = text2num(click_data["icon-x"])-1 - O.pixel_x - var/bounds_y = text2num(click_data["icon-y"])-1 - O.pixel_y - if(bounds_x < 0 || bounds_y < 0) - continue - var/icon/I = icon(O.icon, O.icon_state) - var/p = I.GetPixel(bounds_x, bounds_y) - if(p) - return O - return FALSE - -/obj/structure/surface/proc/draw_item_overlays() - overlays.Cut() - for(var/obj/item/O in contents) - var/image/I = image(O.icon) - I.appearance = O.appearance - I.appearance_flags |= RESET_COLOR - I.overlays = O.overlays - LAZYADD(overlays, I) - -/obj/structure/surface/clicked(mob/user, list/mods) - if(mods["shift"] && !mods["middle"]) - var/obj/item/O = get_item(mods) - if(!O) - return ..() - if(O.can_examine(user)) - O.examine(user) - return TRUE - ..() - -/obj/structure/surface/proc/try_to_open_container(mob/user, mods) - if(!Adjacent(user)) - return - - if(ishuman(user) || isrobot(user)) - var/obj/item/O = get_item(mods) - if(O && isstorage(O)) - var/obj/item/storage/S = O - S.open(usr) - return TRUE - -/obj/structure/surface/attack_hand(mob/user, click_data) - . = ..() - if(click_data && click_data["alt"]) - return - var/obj/item/O = get_item(click_data) - if(!O) - return - O.attack_hand(user) - if(!LAZYISIN(contents, O))//in case attack_hand did not pick up the item - detach_item(O) - -/obj/structure/surface/attackby(obj/item/W, mob/user, click_data) - var/obj/item/O = get_item(click_data) - if(!O || click_data["ctrl"])//holding the ctrl key will force it to place the object - // Placing stuff on tables - if(user.drop_inv_item_to_loc(W, loc)) - auto_align(W, click_data) - user.next_move = world.time + 2 - return TRUE - else if(!O.attackby(W, user)) - W.afterattack(O, user, TRUE) - for(var/type in update_types) - if(istype(O, type)) - draw_item_overlays() - -/obj/structure/surface/proc/auto_align(obj/item/W, click_data) - if(!W.center_of_mass) // Clothing, material stacks, generally items with large sprites where exact placement would be unhandy. - W.pixel_x = rand(-W.randpixel, W.randpixel) - W.pixel_y = rand(-W.randpixel, W.randpixel) - W.pixel_z = 0 +/obj/structure/surface/proc/auto_align(obj/item/new_item, click_data) + if(!new_item.center_of_mass) // Clothing, material stacks, generally items with large sprites where exact placement would be unhandy. + new_item.pixel_x = rand(-new_item.randpixel, new_item.randpixel) + new_item.pixel_y = rand(-new_item.randpixel, new_item.randpixel) + new_item.pixel_z = 0 return if(!click_data) @@ -169,16 +30,8 @@ var/cell_x = Clamp(round(mouse_x/CELLSIZE), 0, CELLS-1) // Ranging from 0 to CELLS-1 var/cell_y = Clamp(round(mouse_y/CELLSIZE), 0, CELLS-1) - var/list/center = cached_key_number_decode(W.center_of_mass) - - W.pixel_x = (CELLSIZE * (cell_x + 0.5)) - center["x"] - W.pixel_y = (CELLSIZE * (cell_y + 0.5)) - center["y"] - W.pixel_z = 0 - - if(!(W.flags_item & NOTABLEMERGE)) - attach_item(W) + var/list/center = cached_key_number_decode(new_item.center_of_mass) -/obj/structure/surface/MouseDrop(atom/over) - . = ..() - if(over == usr && usr && usr.client && usr.client.lmb_last_mousedown_mods) - return try_to_open_container(usr, usr.client.lmb_last_mousedown_mods) + new_item.pixel_x = (CELLSIZE * (cell_x + 0.5)) - center["x"] + new_item.pixel_y = (CELLSIZE * (cell_y + 0.5)) - center["y"] + new_item.pixel_z = 0 diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index db3ce98339a3..8d6441293f86 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -434,8 +434,6 @@ verbs -= /obj/structure/surface/table/verb/do_flip verbs += /obj/structure/surface/table/proc/do_put - detach_all() - var/list/targets = list(get_step(src, dir), get_step(src, turn(dir, 45)), get_step(src, turn(dir, -45))) for(var/atom/movable/movable_on_table in get_turf(src)) if(!movable_on_table.anchored) @@ -479,7 +477,6 @@ var/obj/structure/surface/table/T = locate() in get_step(src.loc,D) if(T && T.flipped && T.dir == src.dir) T.unflip() - attach_all() update_icon() update_adjacent() diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index d1e7f83dacb1..fbb9e5d06ac1 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -147,6 +147,7 @@ "cmblogo.png" = 'html/images/cmblogo.png', "faxwylogo.png" = 'html/images/faxwylogo.png', "faxbackground.jpg" = 'html/images/faxbackground.jpg', + "colonialspacegruntsEZ.png" = 'html/images/colonialspacegruntsEZ.png', ) /datum/asset/spritesheet/chat diff --git a/code/modules/character_traits/biology_traits.dm b/code/modules/character_traits/biology_traits.dm index a269aabede9f..c90ea7b8751e 100644 --- a/code/modules/character_traits/biology_traits.dm +++ b/code/modules/character_traits/biology_traits.dm @@ -58,13 +58,13 @@ to_chat(target, SPAN_WARNING("Your species is too sophisticated for you be able to recieve the lisping trait.")) return - ADD_TRAIT(target, TRAIT_LISPING, TRAIT_SOURCE_QUIRK) + ADD_TRAIT(target, TRAIT_LISPING, ROUNDSTART_TRAIT) target.speech_problem_flag = TRUE ..() /datum/character_trait/biology/lisp/unapply_trait(mob/living/carbon/human/target) - REMOVE_TRAIT(target, TRAIT_LISPING, TRAIT_SOURCE_QUIRK) + REMOVE_TRAIT(target, TRAIT_LISPING, ROUNDSTART_TRAIT) target.speech_problem_flag = FALSE ..() @@ -127,9 +127,9 @@ to_chat(target, SPAN_WARNING("Only riflemen can have the Hardcore trait.")) return - ADD_TRAIT(target, TRAIT_HARDCORE, TRAIT_SOURCE_QUIRK) + ADD_TRAIT(target, TRAIT_HARDCORE, ROUNDSTART_TRAIT) ..() /datum/character_trait/biology/hardcore/unapply_trait(mob/living/carbon/human/target) - REMOVE_TRAIT(target, TRAIT_HARDCORE, TRAIT_SOURCE_QUIRK) + REMOVE_TRAIT(target, TRAIT_HARDCORE, ROUNDSTART_TRAIT) ..() diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 6e99ca1e5a15..26c8fd867f72 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -5,6 +5,10 @@ if(user.sdisabilities & DISABILITY_BLIND || user.blinded || user.stat==UNCONSCIOUS) return list(SPAN_NOTICE("Something is there but you can't see it.")) + var/mob/dead/observer/observer + if(isobserver(user)) + observer = user + if(isxeno(user)) var/msg = "This is " @@ -435,7 +439,7 @@ for(var/implant in get_visible_implants()) msg += SPAN_WARNING("[t_He] has \a [implant] sticking out of [t_his] flesh!\n") - if(hasHUD(user,"security")) + if(hasHUD(user,"security") || (observer && observer.HUD_toggled["Security HUD"])) var/perpref @@ -450,8 +454,15 @@ if(R.fields["id"] == E.fields["id"]) criminal = R.fields["criminal"] - msg += "Criminal status: \[[criminal]\]\n" - msg += "Security records: \[View\] \[Add comment\]\n" + msg += "Criminal status:" + if(!observer) + msg += "\[[criminal]\]\n" + else + msg += "\[[criminal]\]\n" + + msg += "Security records: \[View\]" + if(!observer) + msg += " \[Add comment\]\n" if(hasHUD(user,"medical")) var/cardcolor = holo_card_color diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6bceb994a2a1..2ec8ccf2531d 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -612,7 +612,7 @@ to_chat(usr, SPAN_DANGER("Unable to locate a data core entry for this person.")) if(href_list["secrecord"]) - if(hasHUD(usr,"security")) + if(hasHUD(usr,"security") || isobserver(usr)) var/perpref = null var/read = 0 @@ -624,7 +624,7 @@ if(E.fields["ref"] == perpref) for(var/datum/data/record/R in GLOB.data_core.security) if(R.fields["id"] == E.fields["id"]) - if(hasHUD(usr,"security")) + if(hasHUD(usr,"security") || isobserver(usr)) to_chat(usr, "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]") to_chat(usr, "Incidents: [R.fields["incident"]]") to_chat(usr, "\[View Comment Log\]") @@ -633,7 +633,7 @@ if(!read) to_chat(usr, SPAN_DANGER("Unable to locate a data core entry for this person.")) - if(href_list["secrecordComment"] && hasHUD(usr,"security")) + if(href_list["secrecordComment"] && (hasHUD(usr,"security") || isobserver(usr))) var/perpref = null if(wear_id) var/obj/item/card/id/ID = wear_id.GetID() @@ -662,7 +662,8 @@ continue comment_markup += text("Comment deleted by [] at []
", comment["deleted_by"], comment["deleted_at"]) to_chat(usr, comment_markup) - to_chat(usr, "\[Add comment\]
") + if(!isobserver(usr)) + to_chat(usr, "\[Add comment\]
") if(!read) to_chat(usr, SPAN_DANGER("Unable to locate a data core entry for this person.")) diff --git a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm index 65ae240e201d..26003affa2df 100644 --- a/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm +++ b/code/modules/mob/living/carbon/xenomorph/Facehuggers.dm @@ -14,7 +14,7 @@ flags_inventory = COVEREYES|ALLOWINTERNALS|COVERMOUTH|ALLOWREBREATH|CANTSTRIP flags_armor_protection = BODY_FLAG_FACE|BODY_FLAG_EYES flags_atom = NO_FLAGS - flags_item = NOBLUDGEON|NOTABLEMERGE + flags_item = NOBLUDGEON throw_range = 1 layer = FACEHUGGER_LAYER black_market_value = 20 diff --git a/code/modules/mob/living/carbon/xenomorph/XenoAttacks.dm b/code/modules/mob/living/carbon/xenomorph/XenoAttacks.dm index 6361ff595b10..317c7999e586 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoAttacks.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoAttacks.dm @@ -90,7 +90,7 @@ //Hot hot Aliens on Aliens action. //Actually just used for eating people. /mob/living/carbon/xenomorph/attack_alien(mob/living/carbon/xenomorph/M) - if (M.fortify || M.burrow) + if (M.fortify || HAS_TRAIT(M, TRAIT_ABILITY_BURROWED)) return XENO_NO_DELAY_ACTION if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm b/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm index 46e144a1b1f5..68c422619d32 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm @@ -12,7 +12,7 @@ var/mob/living/carbon/xenomorph/X = owner if(!istype(X)) return FALSE - if(X.is_mob_incapacitated() || X.buckled || X.burrow) + if(X.is_mob_incapacitated() || X.buckled || HAS_TRAIT(X, TRAIT_ABILITY_BURROWED)) return FALSE else return TRUE diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index 3fd8e53024d5..27895555a9f1 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -656,7 +656,7 @@ /mob/living/carbon/xenomorph/burn_skin(burn_amount) - if(burrow) + if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) return FALSE if(caste.fire_immunity & FIRE_IMMUNITY_NO_DAMAGE) diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index 76403bf89f52..51cab73e80e6 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -21,7 +21,8 @@ if(mind in SSticker.mode.xenomorphs) to_chat(src, SPAN_DEBUG("[src] mind is in the xenomorph list. Mind key is [mind.key].")) to_chat(src, SPAN_DEBUG("Current mob is: [mind.current]. Original mob is: [mind.original].")) - else to_chat(src, SPAN_DEBUG("This xenomorph is not in the xenomorph list.")) + else + to_chat(src, SPAN_DEBUG("This xenomorph is not in the xenomorph list.")) #endif #undef DEBUG_XENO @@ -274,13 +275,11 @@ var/tunnel = FALSE /// for check on lurker invisibility var/stealth = FALSE - var/burrow = FALSE var/fortify = FALSE var/crest_defense = FALSE /// 0/FALSE - upright, 1/TRUE - all fours var/agility = FALSE var/ripping_limb = FALSE - var/steelcrest = FALSE /// The world.time at which we will regurgitate our currently-vored victim var/devour_timer = 0 /// For drones/hivelords. Extends the maximum build range they have @@ -338,34 +337,23 @@ //Burrower Vars var/used_tremor = 0 - // Defender vars - var/used_headbutt = 0 - var/used_fortify = 0 // Burrowers var/used_burrow = 0 var/used_tunnel = 0 - //Carrier vars - var/threw_a_hugger = 0 - var/huggers_cur = 0 - var/eggs_cur = 0 - var/huggers_max = 0 - var/eggs_max = 0 - var/laid_egg = 0 - //Taken from update_icon for all xeno's var/list/overlays_standing[X_TOTAL_LAYERS] - var/atom/movable/vis_obj/xeno_wounds/wound_icon_carrier - var/atom/movable/vis_obj/xeno_pack/backpack_icon_carrier + var/atom/movable/vis_obj/xeno_wounds/wound_icon_holder + var/atom/movable/vis_obj/xeno_pack/backpack_icon_holder /mob/living/carbon/xenomorph/Initialize(mapload, mob/living/carbon/xenomorph/oldXeno, h_number) var/area/A = get_area(src) if(A && A.statistic_exempt) statistic_exempt = TRUE - wound_icon_carrier = new(null, src) - vis_contents += wound_icon_carrier + wound_icon_holder = new(null, src) + vis_contents += wound_icon_holder if(oldXeno) set_movement_intent(oldXeno.m_intent) @@ -541,7 +529,7 @@ /mob/living/carbon/xenomorph/proc/fire_immune(mob/living/L) SIGNAL_HANDLER - if(L.fire_reagent?.fire_penetrating && !burrow) + if(L.fire_reagent?.fire_penetrating && !HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) return return COMPONENT_CANCEL_IGNITION @@ -554,7 +542,7 @@ . = COMPONENT_NO_BURN // Burrowed xenos also cannot be ignited - if((caste.fire_immunity & FIRE_IMMUNITY_NO_IGNITE) || burrow) + if((caste.fire_immunity & FIRE_IMMUNITY_NO_IGNITE) || HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) . |= COMPONENT_NO_IGNITE if(caste.fire_immunity & FIRE_IMMUNITY_XENO_FRENZY) . |= COMPONENT_XENO_FRENZY @@ -719,11 +707,11 @@ built_structures = null - vis_contents -= wound_icon_carrier - QDEL_NULL(wound_icon_carrier) - if(backpack_icon_carrier) - vis_contents -= backpack_icon_carrier - QDEL_NULL(backpack_icon_carrier) + vis_contents -= wound_icon_holder + QDEL_NULL(wound_icon_holder) + if(backpack_icon_holder) + vis_contents -= backpack_icon_holder + QDEL_NULL(backpack_icon_holder) QDEL_NULL(iff_tag) @@ -746,7 +734,7 @@ if(SEND_SIGNAL(AM, COMSIG_MOVABLE_XENO_START_PULLING, src) & COMPONENT_ALLOW_PULL) return do_pull(AM, lunge, no_msg) - if(burrow) + if(HAS_TRAIT(src,TRAIT_ABILITY_BURROWED)) return if(!isliving(AM)) return FALSE @@ -946,8 +934,9 @@ if(is_zoomed) zoom_out() if(iscarrier(src)) - huggers_max = caste.huggers_max - eggs_max = caste.eggs_max + var/mob/living/carbon/xenomorph/carrier/carrier = src + carrier.huggers_max = caste.huggers_max + carrier.eggs_max = caste.eggs_max need_weeds = mutators.need_weeds diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm index 705837699275..6b1c7d14b262 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm @@ -11,7 +11,7 @@ to_chat(src, SPAN_WARNING("[O] is too far away.")) return - if(!isturf(loc) || burrow) + if(!isturf(loc) || HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) to_chat(src, SPAN_WARNING("You can't melt [O] from here!")) return diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_abilities.dm index 9472008d6449..4430a1619e03 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_abilities.dm @@ -68,7 +68,7 @@ ability_name = "Acid Shroud" action_icon_state = "acid_shroud" action_type = XENO_ACTION_ACTIVATE - ability_primacy = XENO_PRIMARY_ACTION_4 + ability_primacy = XENO_PRIMARY_ACTION_5 plasma_cost = 10 macro_path = /datum/action/xeno_action/verb/verb_acid_shroud /// Allows the sound to play. Flipped to false when sound is triggered and true after a timer. This prevents soundspam @@ -86,30 +86,6 @@ /// Duration for the cooldown of abilities affected by acid shroud var/cooldown_duration = 30 SECONDS -/datum/action/xeno_action/onclick/dump_acid - name = "Dump Acid" - ability_name = "dump acid" - action_icon_state = "dump_acid" - plasma_cost = 10 - macro_path = /datum/action/xeno_action/verb/verb_dump_acid - action_type = XENO_ACTION_ACTIVATE - ability_primacy = XENO_PRIMARY_ACTION_4 - xeno_cooldown = 34 SECONDS - - var/buffs_duration = 6 SECONDS - var/cooldown_duration = 30 SECONDS - - var/speed_buff_amount = 0.5 - var/movespeed_buff_applied = FALSE - - /// List of types of actions to place on 20-second CD,if you ever want to subtype this for a strain or whatever, just change this var on the subtype - var/action_types_to_cd = list( - /datum/action/xeno_action/activable/xeno_spit/bombard, - /datum/action/xeno_action/onclick/dump_acid, - /datum/action/xeno_action/onclick/toggle_long_range/boiler, - /datum/action/xeno_action/activable/spray_acid/boiler, - ) - //////////////////////////// Trapper boiler abilities /datum/action/xeno_action/activable/boiler_trap diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_powers.dm index 6748b662b118..0fcdbf47a695 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_powers.dm @@ -1,13 +1,13 @@ -/datum/action/xeno_action/activable/acid_lance/use_ability(atom/A) - var/mob/living/carbon/xenomorph/X = owner +/datum/action/xeno_action/activable/acid_lance/use_ability(atom/affected_atom) + var/mob/living/carbon/xenomorph/xeno = owner - if (!istype(X) || !X.check_state()) + if (!istype(xeno) || !xeno.check_state()) return if (!activated_once && !action_cooldown_check()) return - if(!A || A.layer >= FLY_LAYER || !isturf(X.loc)) + if(!affected_atom || affected_atom.layer >= FLY_LAYER || !isturf(xeno.loc)) return if (!activated_once) @@ -16,8 +16,8 @@ if (!check_and_use_plasma_owner()) return - X.create_empower() - X.visible_message(SPAN_XENODANGER("[X] starts to gather its acid for a massive blast!"), SPAN_XENODANGER("You start to gather your acid for a massive blast!")) + xeno.create_empower() + xeno.visible_message(SPAN_XENODANGER("[xeno] starts to gather its acid for a massive blast!"), SPAN_XENODANGER("You start to gather your acid for a massive blast!")) activated_once = TRUE stack() addtimer(CALLBACK(src, PROC_REF(timeout)), max_stacks*stack_time + time_after_max_before_end) @@ -29,18 +29,18 @@ var/range = base_range + stacks*range_per_stack var/damage = base_damage + stacks*damage_per_stack var/turfs_visited = 0 - for (var/turf/T in getline2(get_turf(X), A)) - if(T.density || T.opacity) + for (var/turf/turf in getline2(get_turf(xeno), affected_atom)) + if(turf.density || turf.opacity) break var/should_stop = FALSE - for(var/obj/structure/S in T) - if(istype(S, /obj/structure/window/framed)) - var/obj/structure/window/framed/W = S - if(!W.unslashable) - W.deconstruct(disassembled = FALSE) + for(var/obj/structure/structure in turf) + if(istype(structure, /obj/structure/window/framed)) + var/obj/structure/window/framed/window_frame = structure + if(!window_frame.unslashable) + window_frame.deconstruct(disassembled = FALSE) - if(S.opacity) + if(structure.opacity) should_stop = TRUE break @@ -52,15 +52,15 @@ turfs_visited++ - new /obj/effect/xenomorph/acid_damage_delay(T, damage, 7, FALSE, "You are blasted with a stream of high-velocity acid!", X) + new /obj/effect/xenomorph/acid_damage_delay(turf, damage, 7, FALSE, "You are blasted with a stream of high-velocity acid!", xeno) - X.visible_message(SPAN_XENODANGER("[X] fires a massive blast of acid at [A]!"), SPAN_XENODANGER("You fire a massive blast of acid at [A]!")) + xeno.visible_message(SPAN_XENODANGER("[xeno] fires a massive blast of acid at [affected_atom]!"), SPAN_XENODANGER("You fire a massive blast of acid at [affected_atom]!")) remove_stack_effects("You feel your speed return to normal!") return TRUE /datum/action/xeno_action/activable/acid_lance/proc/stack() - var/mob/living/carbon/xenomorph/X = owner - if (!istype(X)) + var/mob/living/carbon/xenomorph/xeno = owner + if (!istype(xeno)) return if (!activated_once) @@ -68,31 +68,31 @@ stacks = min(max_stacks, stacks + 1) if (stacks != max_stacks) - X.speed_modifier += movespeed_per_stack + xeno.speed_modifier += movespeed_per_stack movespeed_nerf_applied += movespeed_per_stack - X.recalculate_speed() + xeno.recalculate_speed() addtimer(CALLBACK(src, PROC_REF(stack)), stack_time) return else - to_chat(X, SPAN_XENOHIGHDANGER("You have charged your acid lance to maximum!")) + to_chat(xeno, SPAN_XENOHIGHDANGER("You have charged your acid lance to maximum!")) return /datum/action/xeno_action/activable/acid_lance/proc/remove_stack_effects(message = null) - var/mob/living/carbon/xenomorph/X = owner + var/mob/living/carbon/xenomorph/xeno = owner - if (!istype(X)) + if (!istype(xeno)) return if (stacks <= 0) return if (message) - to_chat(X, SPAN_XENODANGER(message)) + to_chat(xeno, SPAN_XENODANGER(message)) stacks = 0 - X.speed_modifier -= movespeed_nerf_applied + xeno.speed_modifier -= movespeed_nerf_applied movespeed_nerf_applied = 0 - X.recalculate_speed() + xeno.recalculate_speed() /datum/action/xeno_action/activable/acid_lance/proc/timeout() if (activated_once) @@ -103,7 +103,7 @@ /datum/action/xeno_action/activable/acid_lance/action_cooldown_check() return (activated_once || ..()) -/datum/action/xeno_action/activable/xeno_spit/bombard/use_ability(atom/A) +/datum/action/xeno_action/activable/xeno_spit/bombard/use_ability(atom/affected_atom) . = ..() var/mob/living/carbon/xenomorph/xeno = owner if(!action_cooldown_check()) // activate c/d only if we already spit @@ -114,7 +114,7 @@ xeno_action.apply_cooldown_override(cooldown_duration) -/datum/action/xeno_action/onclick/acid_shroud/use_ability(atom/atom) +/datum/action/xeno_action/onclick/acid_shroud/use_ability(atom/affected_atom) var/datum/effect_system/smoke_spread/xeno_acid/spicy_gas var/mob/living/carbon/xenomorph/xeno = owner if (!isxeno(owner)) @@ -125,14 +125,18 @@ if (!xeno.check_state()) return + if(sound_play) playsound(xeno,"acid_strike", 35, 1) sound_play = FALSE addtimer(VARSET_CALLBACK(src, sound_play, TRUE), 2 SECONDS) + if (!do_after(xeno, xeno.ammo.spit_windup/6.5, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_HOSTILE, numticks = 2)) /// 0.7 seconds to_chat(xeno, SPAN_XENODANGER("You decide to cancel your gas shroud.")) return + playsound(xeno,"acid_sizzle", 50, 1) + if(xeno.ammo == GLOB.ammo_list[/datum/ammo/xeno/boiler_gas/acid]) spicy_gas = new /datum/effect_system/smoke_spread/xeno_acid else if(xeno.ammo == GLOB.ammo_list[/datum/ammo/xeno/boiler_gas]) @@ -143,6 +147,7 @@ spicy_gas.set_up(1, 0, get_turf(xeno), null, 6, new_cause_data = cause_data) spicy_gas.start() to_chat(xeno, SPAN_XENOHIGHDANGER("You dump your acid through your pores, creating a shroud of gas!")) + for (var/action_type in action_types_to_cd) var/datum/action/xeno_action/xeno_action = get_xeno_action_by_type(xeno, action_type) if (!istype(xeno_action)) @@ -153,57 +158,35 @@ apply_cooldown() return ..() -/datum/action/xeno_action/onclick/dump_acid/proc/remove_speed_buff() - if (movespeed_buff_applied && isxeno(owner)) - var/mob/living/carbon/xenomorph/xeno = owner - xeno.speed_modifier += speed_buff_amount - xeno.recalculate_speed() - movespeed_buff_applied = FALSE - UnregisterSignal(owner, COMSIG_MOB_MOVE_OR_LOOK) - -/datum/action/xeno_action/onclick/dump_acid/proc/handle_mob_move_or_look(mob/living/carbon/xenomorph/mover, actually_moving, direction, specific_direction) - SIGNAL_HANDLER - - if(!actually_moving) - return - - var/obj/effect/particle_effect/smoke/xeno_burn/smoke_effect = new(get_turf(mover), 1, create_cause_data("dumped acid gas", mover)) - smoke_effect.time_to_live = 3 - smoke_effect.spread_speed = 1000000 - -/datum/action/xeno_action/onclick/dump_acid/remove_from() - remove_speed_buff() - ..() - -/datum/action/xeno_action/onclick/shift_spits/boiler/use_ability(atom/A) +/datum/action/xeno_action/onclick/shift_spits/boiler/use_ability(atom/affected_atom) . = ..() apply_cooldown() /////////////////////////////// Trapper boiler powers -/datum/action/xeno_action/activable/boiler_trap/use_ability(atom/A) - var/mob/living/carbon/xenomorph/X = owner +/datum/action/xeno_action/activable/boiler_trap/use_ability(atom/affected_atom) + var/mob/living/carbon/xenomorph/xeno = owner - if (!istype(X)) + if (!istype(xeno)) return if (!action_cooldown_check()) return - if (!X.check_state()) + if (!xeno.check_state()) return - if (!can_see(X, A, TRAPPER_VIEWRANGE)) - to_chat(X, SPAN_XENODANGER("You cannot see that location!")) + if (!can_see(xeno, affected_atom, TRAPPER_VIEWRANGE)) + to_chat(xeno, SPAN_XENODANGER("You cannot see that location!")) return if (!check_and_use_plasma_owner()) return // 5-long line of turfs orthogonal to the line between us and our target as precisely as we can figure it - var/dir_between = Get_Compass_Dir(X, A) + var/dir_between = Get_Compass_Dir(xeno, affected_atom) var/list/target_turfs = list() - var/target_turf = get_turf(A) + var/target_turf = get_turf(affected_atom) var/left_turf = get_step(target_turf, turn(dir_between, -90)) var/right_turf = get_step(target_turf, turn(dir_between, 90)) target_turfs += target_turf @@ -212,70 +195,70 @@ target_turfs += get_step(left_turf, turn(dir_between, -90)) target_turfs += get_step(right_turf, turn(dir_between, 90)) - for (var/turf/T in target_turfs) - if (!istype(T) || T.density) + for (var/turf/turf in target_turfs) + if (!istype(turf) || turf.density) continue var/trap_found = FALSE - for (var/obj/effect/alien/resin/boilertrap/BT in T) + for (var/obj/effect/alien/resin/boilertrap/boiler_trap in turf) trap_found = TRUE break if (trap_found) continue - var/obj/effect/alien/resin/boilertrap/BT + var/obj/effect/alien/resin/boilertrap/boiler_trap if(empowered) - BT = new /obj/effect/alien/resin/boilertrap/empowered(T, X) + boiler_trap = new /obj/effect/alien/resin/boilertrap/empowered(turf, xeno) else - BT = new /obj/effect/alien/resin/boilertrap/(T, X) - QDEL_IN(BT, trap_ttl) + boiler_trap = new /obj/effect/alien/resin/boilertrap(turf, xeno) + QDEL_IN(boiler_trap, trap_ttl) if(empowered) empowered = FALSE empowering_charge_counter = 0 button.overlays -= "+empowered" - var/datum/action/xeno_action/activable/acid_mine/mine = get_xeno_action_by_type(X, /datum/action/xeno_action/activable/acid_mine) + var/datum/action/xeno_action/activable/acid_mine/mine = get_xeno_action_by_type(xeno, /datum/action/xeno_action/activable/acid_mine) if(!mine.empowered) mine.empowered = TRUE mine.button.overlays += "+empowered" - to_chat(X, SPAN_XENODANGER("You tap in your reserves to prepare a stronger [mine.name]!")) + to_chat(xeno, SPAN_XENODANGER("You tap in your reserves to prepare a stronger [mine.name]!")) apply_cooldown() return ..() -/datum/action/xeno_action/activable/acid_mine/use_ability(atom/A) - var/mob/living/carbon/xenomorph/X = owner +/datum/action/xeno_action/activable/acid_mine/use_ability(atom/affected_atom) + var/mob/living/carbon/xenomorph/xeno = owner - if (!istype(X)) + if (!istype(xeno)) return - if (!X.check_state()) + if (!xeno.check_state()) return if (!action_cooldown_check()) return - if(!A || A.layer >= FLY_LAYER || !isturf(X.loc)) + if(!affected_atom || affected_atom.layer >= FLY_LAYER || !isturf(xeno.loc)) return - if(!check_clear_path_to_target(X, A, TRUE, TRAPPER_VIEWRANGE)) - to_chat(X, SPAN_XENOWARNING("Something is in the way!")) + if(!check_clear_path_to_target(xeno, affected_atom, TRUE, TRAPPER_VIEWRANGE)) + to_chat(xeno, SPAN_XENOWARNING("Something is in the way!")) return if (!check_and_use_plasma_owner()) return - var/turf/T = get_turf(A) + var/turf/turf = get_turf(affected_atom) var/acid_bolt_message = "a bolt of acid" if(empowered) acid_bolt_message = "a powerful bolt of acid" - X.visible_message(SPAN_XENODANGER("[X] fires " + acid_bolt_message + " at [A]!"), SPAN_XENODANGER("You fire " + acid_bolt_message + " at [A]!")) - new /obj/effect/xenomorph/acid_damage_delay/boiler_landmine(T, damage, delay, empowered, "You are blasted with " + acid_bolt_message + "!", X, ) + xeno.visible_message(SPAN_XENODANGER("[xeno] fires " + acid_bolt_message + " at [affected_atom]!"), SPAN_XENODANGER("You fire " + acid_bolt_message + " at [affected_atom]!")) + new /obj/effect/xenomorph/acid_damage_delay/boiler_landmine(turf, damage, delay, empowered, "You are blasted with " + acid_bolt_message + "!", xeno) - for (var/turf/targetTurf in orange(1, T)) - new /obj/effect/xenomorph/acid_damage_delay/boiler_landmine(targetTurf, damage, delay, empowered, "You are blasted with a " + acid_bolt_message + "!", X) + for (var/turf/target_turf in orange(1, turf)) + new /obj/effect/xenomorph/acid_damage_delay/boiler_landmine(target_turf, damage, delay, empowered, "You are blasted with a " + acid_bolt_message + "!", xeno) if(empowered) empowered = FALSE @@ -284,7 +267,7 @@ apply_cooldown() return ..() -/datum/action/xeno_action/activable/acid_shotgun/use_ability(atom/target) +/datum/action/xeno_action/activable/acid_shotgun/use_ability(atom/affected_atom) var/mob/living/carbon/xenomorph/xeno = owner if (!istype(xeno)) return @@ -292,12 +275,12 @@ if (!action_cooldown_check()) return - if(!target || target.layer >= FLY_LAYER || !isturf(xeno.loc) || !xeno.check_state()) + if(!affected_atom || affected_atom.layer >= FLY_LAYER || !isturf(xeno.loc) || !xeno.check_state()) return - xeno.visible_message(SPAN_XENOWARNING("The [xeno] fires a blast of acid at [target]!"), SPAN_XENOWARNING("You fire a blast of acid at [target]!")) + xeno.visible_message(SPAN_XENOWARNING("The [xeno] fires a blast of acid at [affected_atom]!"), SPAN_XENOWARNING("You fire a blast of acid at [affected_atom]!")) - var/turf/target_turf = locate(target.x, target.y, target.z) + var/turf/target_turf = locate(affected_atom.x, affected_atom.y, affected_atom.z) var/obj/projectile/proj = new(xeno.loc, create_cause_data("acid shotgun", xeno)) var/datum/ammo/ammoDatum = new ammo_type() @@ -335,7 +318,7 @@ bonus_projectiles_amount = 0 max_range = 4 -/datum/action/xeno_action/activable/tail_stab/boiler/use_ability(atom/A) +/datum/action/xeno_action/activable/tail_stab/boiler/use_ability(atom/affected_atom) var/mob/living/carbon/xenomorph/stabbing_xeno = owner var/target = ..() if(iscarbon(target)) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_abilities.dm index 84b6c5ff5fef..747a3f90a691 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_abilities.dm @@ -11,7 +11,7 @@ /datum/action/xeno_action/activable/burrow/use_ability(atom/A) var/mob/living/carbon/xenomorph/X = owner - if(X.burrow) + if(HAS_TRAIT(X, TRAIT_ABILITY_BURROWED)) X.tunnel(get_turf(A)) else X.burrow() diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm index 0501d0fc372e..4ce83f37592c 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm @@ -35,7 +35,6 @@ return // TODO Make immune to all damage here. to_chat(src, SPAN_XENOWARNING("You burrow yourself into the ground.")) - burrow = TRUE frozen = TRUE invisibility = 101 anchored = TRUE @@ -56,20 +55,19 @@ process_burrow() /mob/living/carbon/xenomorph/proc/process_burrow() - if(!burrow) + if(!HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) return if(world.time > burrow_timer && !tunnel) burrow_off() if(observed_xeno) overwatch(observed_xeno, TRUE) - if(burrow) + if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) addtimer(CALLBACK(src, PROC_REF(process_burrow)), 1 SECONDS) /mob/living/carbon/xenomorph/proc/burrow_off() if(caste_type && GLOB.xeno_datum_list[caste_type]) caste = GLOB.xeno_datum_list[caste_type] to_chat(src, SPAN_NOTICE("You resurface.")) - burrow = FALSE if(caste.fire_immunity == FIRE_IMMUNITY_NONE) UnregisterSignal(src, list( COMSIG_LIVING_PREIGNITION, @@ -93,7 +91,7 @@ /mob/living/carbon/xenomorph/proc/do_burrow_cooldown() used_burrow = FALSE - if(burrow) + if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) to_chat(src, SPAN_NOTICE("You can now surface.")) for(var/X in actions) var/datum/action/act = X @@ -104,7 +102,7 @@ if(!check_state()) return - if(!burrow) + if(!HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) to_chat(src, SPAN_NOTICE("You must be burrowed to do this.")) return @@ -201,7 +199,7 @@ return !xeno.used_tremor /mob/living/carbon/xenomorph/proc/tremor() //More support focused version of crusher earthquakes. - if(burrow || is_ventcrawling) + if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED) || is_ventcrawling) to_chat(src, SPAN_XENOWARNING("You must be above ground to do this.")) return diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm index 67e16d4b70de..bf773645e491 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm @@ -51,7 +51,7 @@ if(!check_and_use_plasma_owner()) return - if(fendy.fortify && !fendy.steelcrest) + if(fendy.fortify && !fendy.mutation_type == DEFENDER_STEELCREST) to_chat(fendy, SPAN_XENOWARNING("You cannot use headbutt while fortified.")) return @@ -78,7 +78,9 @@ SPAN_XENOWARNING("You ram [carbone] with your armored crest!")) if(carbone.stat != DEAD && (!(carbone.status_flags & XENO_HOST) || !HAS_TRAIT(carbone, TRAIT_NESTED)) ) - var/h_damage = 30 - (fendy.crest_defense * 10) + (fendy.steelcrest * 7.5) //30 if crest up, 20 if down, plus 7.5 + var/h_damage = 30 - (fendy.crest_defense * 10) + if(fendy.mutation_type == DEFENDER_STEELCREST) + h_damage += 7.5 carbone.apply_armoured_damage(get_xeno_damage_slash(carbone, h_damage), ARMOR_MELEE, BRUTE, "chest", 5) var/facing = get_dir(fendy, carbone) @@ -159,7 +161,7 @@ if (!istype(xeno)) return - if(xeno.crest_defense && xeno.steelcrest) + if(xeno.crest_defense && xeno.mutation_type == DEFENDER_STEELCREST) to_chat(src, SPAN_XENOWARNING("You cannot fortify while your crest is already down!")) return @@ -207,7 +209,7 @@ if(fortify_state) to_chat(X, SPAN_XENOWARNING("You tuck yourself into a defensive stance.")) - if(X.steelcrest) + if(X.mutation_type == DEFENDER_STEELCREST) X.armor_deflection_buff += 10 X.armor_explosive_buff += 60 X.ability_speed_modifier += 3 @@ -228,7 +230,7 @@ to_chat(X, SPAN_XENOWARNING("You resume your normal stance.")) X.frozen = FALSE X.anchored = FALSE - if(X.steelcrest) + if(X.mutation_type == DEFENDER_STEELCREST) X.armor_deflection_buff -= 10 X.armor_explosive_buff -= 60 X.ability_speed_modifier -= 3 diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm index 7a8151d8aa02..1882f2b69157 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm @@ -9,7 +9,7 @@ return if(!xeno.check_state()) return - if(xeno.burrow) + if(HAS_TRAIT(xeno, TRAIT_ABILITY_BURROWED)) return var/turf/turf = xeno.loc @@ -89,7 +89,7 @@ to_chat(src, SPAN_WARNING("You cannot rest while fortified!")) return - if(burrow) + if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) to_chat(src, SPAN_WARNING("You cannot rest while burrowed!")) return @@ -529,7 +529,7 @@ if (istype(X, /mob/living/carbon/xenomorph/burrower)) var/mob/living/carbon/xenomorph/burrower/B = X - if (B.burrow) + if (HAS_TRAIT(B, TRAIT_ABILITY_BURROWED)) return var/turf/T = get_turf(X) @@ -908,7 +908,7 @@ /datum/action/xeno_action/activable/tail_stab/use_ability(atom/targetted_atom) var/mob/living/carbon/xenomorph/stabbing_xeno = owner - if(stabbing_xeno.burrow || stabbing_xeno.is_ventcrawling) + if(HAS_TRAIT(stabbing_xeno, TRAIT_ABILITY_BURROWED) || stabbing_xeno.is_ventcrawling) to_chat(stabbing_xeno, SPAN_XENOWARNING("You must be above ground to do this.")) return diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm index 25f6108c14f6..649a1c98ce6c 100644 --- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm +++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm @@ -9,7 +9,7 @@ /mob/living/carbon/human/attack_alien(mob/living/carbon/xenomorph/M, dam_bonus) - if(M.fortify || M.burrow) + if(M.fortify || HAS_TRAIT(M, TRAIT_ABILITY_BURROWED)) return XENO_NO_DELAY_ACTION var/intent = M.a_intent @@ -220,7 +220,7 @@ //Every other type of nonhuman mob /mob/living/attack_alien(mob/living/carbon/xenomorph/M) - if(M.fortify || M.burrow) + if(M.fortify || HAS_TRAIT(M, TRAIT_ABILITY_BURROWED)) return XENO_NO_DELAY_ACTION switch(M.a_intent) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Boiler.dm b/code/modules/mob/living/carbon/xenomorph/castes/Boiler.dm index 092dae00d603..37dc3048408a 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Boiler.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Boiler.dm @@ -69,8 +69,8 @@ /datum/action/xeno_action/activable/xeno_spit/bombard, //1st macro /datum/action/xeno_action/onclick/shift_spits/boiler, //2nd macro /datum/action/xeno_action/activable/spray_acid/boiler, //3rd macro - /datum/action/xeno_action/onclick/toggle_long_range/boiler, //4rd macro - /datum/action/xeno_action/onclick/acid_shroud, //4th macro + /datum/action/xeno_action/onclick/toggle_long_range/boiler, //4th macro + /datum/action/xeno_action/onclick/acid_shroud, //5th macro /datum/action/xeno_action/onclick/tacmap, ) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm b/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm index ead254344e0a..e7118164cf07 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Burrower.dm @@ -86,29 +86,29 @@ /mob/living/carbon/xenomorph/burrower/update_canmove() . = ..() - if(burrow) + if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) density = FALSE canmove = FALSE return canmove /mob/living/carbon/xenomorph/burrower/ex_act(severity) - if(burrow) + if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) return ..() /mob/living/carbon/xenomorph/burrower/attack_hand() - if(burrow) + if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) return ..() /mob/living/carbon/xenomorph/burrower/attackby() - if(burrow) + if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) return ..() /mob/living/carbon/xenomorph/burrower/get_projectile_hit_chance() . = ..() - if(burrow) + if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) return 0 /datum/behavior_delegate/burrower_base @@ -118,6 +118,6 @@ if(bound_xeno.stat == DEAD) return - if(bound_xeno.burrow) + if(HAS_TRAIT(bound_xeno, TRAIT_ABILITY_BURROWED)) bound_xeno.icon_state = "[bound_xeno.mutation_icon_state] Burrower Burrowed" return TRUE diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm b/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm index 6b847a6a4fec..c13555cba12c 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Carrier.dm @@ -84,6 +84,14 @@ var/mutable_appearance/hugger_overlays_icon var/mutable_appearance/eggsac_overlays_icon + //Carrier specific vars + var/threw_a_hugger = 0 + var/huggers_cur = 0 + var/eggs_cur = 0 + var/huggers_max = 0 + var/eggs_max = 0 + var/laid_egg = 0 + /mob/living/carbon/xenomorph/carrier/update_icons() . = ..() if (mutation_type == CARRIER_NORMAL) diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/boiler/trapper.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/boiler/trapper.dm index cb43960a8e2c..c14d2c6773cf 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/boiler/trapper.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/boiler/trapper.dm @@ -10,7 +10,6 @@ /datum/action/xeno_action/activable/xeno_spit/bombard, /datum/action/xeno_action/onclick/shift_spits/boiler, /datum/action/xeno_action/activable/spray_acid/boiler, - /datum/action/xeno_action/onclick/dump_acid, /datum/action/xeno_action/onclick/toggle_long_range/boiler, /datum/action/xeno_action/onclick/acid_shroud, ) diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm index 18d28675557e..524571fc0dfd 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/carrier/eggsac.dm @@ -58,7 +58,7 @@ /datum/action/xeno_action/active_toggle/generate_egg/should_use_plasma() . = FALSE - var/mob/living/carbon/xenomorph/xeno = owner + var/mob/living/carbon/xenomorph/carrier/xeno = owner if(!xeno) return if(xeno.eggs_cur < xeno.eggs_max) @@ -67,7 +67,7 @@ /datum/action/xeno_action/active_toggle/generate_egg/life_tick() . = ..() if(.) - var/mob/living/carbon/xenomorph/xeno = owner + var/mob/living/carbon/xenomorph/carrier/xeno = owner if(!xeno) return if(xeno.eggs_cur < xeno.eggs_max) diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/defender/steel_crest.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/defender/steel_crest.dm index 630477bd053e..957e7f1b8926 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/defender/steel_crest.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/defender/steel_crest.dm @@ -23,7 +23,6 @@ defender.mutation_type = DEFENDER_STEELCREST defender.mutation_icon_state = DEFENDER_STEELCREST defender.damage_modifier -= XENO_DAMAGE_MOD_VERY_SMALL - defender.steelcrest = TRUE if(defender.fortify) defender.ability_speed_modifier += 2.5 mutator_update_actions(defender) diff --git a/code/modules/mob/living/carbon/xenomorph/update_icons.dm b/code/modules/mob/living/carbon/xenomorph/update_icons.dm index 30e78a5fed94..2eb86ac0470e 100644 --- a/code/modules/mob/living/carbon/xenomorph/update_icons.dm +++ b/code/modules/mob/living/carbon/xenomorph/update_icons.dm @@ -131,12 +131,12 @@ apply_overlay(X_L_HAND_LAYER) /mob/living/carbon/xenomorph/update_inv_back() - if(!backpack_icon_carrier) + if(!backpack_icon_holder) return // Xenos will only have a vis_obj if they've been equipped with a pack before var/obj/item/storage/backpack/backpack = back if(!backpack?.xeno_icon_state) - backpack_icon_carrier.icon_state = "none" + backpack_icon_holder.icon_state = "none" return var/state_modifier = "" @@ -150,11 +150,11 @@ else if(handle_special_state()) state_modifier = handle_special_backpack_states() - backpack_icon_carrier.icon_state = backpack.xeno_icon_state + state_modifier + backpack_icon_holder.icon_state = backpack.xeno_icon_state + state_modifier - backpack_icon_carrier.layer = -X_BACK_LAYER + backpack_icon_holder.layer = -X_BACK_LAYER if(dir == NORTH && (back.flags_item & ITEM_OVERRIDE_NORTHFACE)) - backpack_icon_carrier.layer = -X_BACK_FRONT_LAYER + backpack_icon_holder.layer = -X_BACK_FRONT_LAYER /mob/living/carbon/xenomorph/proc/update_inv_resource() remove_overlay(X_RESOURCE_LAYER) @@ -269,24 +269,24 @@ // Shamelessly inspired from the equivalent proc on TGCM /mob/living/carbon/xenomorph/proc/update_wounds() - if(!wound_icon_carrier) + if(!wound_icon_holder) return var/health_threshold - wound_icon_carrier.layer = layer + 0.01 + wound_icon_holder.layer = layer + 0.01 health_threshold = max(CEILING((health * 4) / (maxHealth), 1), 0) //From 0 to 4, in 25% chunks if(health > HEALTH_THRESHOLD_DEAD) if(health_threshold > 3) - wound_icon_carrier.icon_state = "none" + wound_icon_holder.icon_state = "none" else if(lying) if((resting || sleeping) && (!knocked_down && !knocked_out && health > 0)) - wound_icon_carrier.icon_state = "[caste.caste_type]_rest_[health_threshold]" + wound_icon_holder.icon_state = "[caste.caste_type]_rest_[health_threshold]" else - wound_icon_carrier.icon_state = "[caste.caste_type]_downed_[health_threshold]" + wound_icon_holder.icon_state = "[caste.caste_type]_downed_[health_threshold]" else if(!handle_special_state()) - wound_icon_carrier.icon_state = "[caste.caste_type]_walk_[health_threshold]" + wound_icon_holder.icon_state = "[caste.caste_type]_walk_[health_threshold]" else - wound_icon_carrier.icon_state = handle_special_wound_states(health_threshold) + wound_icon_holder.icon_state = handle_special_wound_states(health_threshold) ///Used to display the xeno wounds/backpacks without rapidly switching overlays diff --git a/code/modules/mob/living/living_healthscan.dm b/code/modules/mob/living/living_healthscan.dm index 6875aa934fd2..f3355157a40f 100644 --- a/code/modules/mob/living/living_healthscan.dm +++ b/code/modules/mob/living/living_healthscan.dm @@ -441,7 +441,7 @@ GLOBAL_LIST_INIT(known_implants, subtypesof(/obj/item/implant)) data["ssd"] = null //clear the data in case we have an old input from a previous scan if(target_mob.getBrainLoss() >= 100 || !target_mob.has_brain()) - data["ssd"] = "Subject is brain-dead." + data["ssd"] = "Subject has taken extreme amounts of brain damage." else if(target_mob.has_brain() && target_mob.stat != DEAD && ishuman(target_mob)) if(!target_mob.key) data["ssd"] = "No soul detected." // they ghosted @@ -586,7 +586,7 @@ GLOBAL_LIST_INIT(known_implants, subtypesof(/obj/item/implant)) if(!D.hidden[SCANNER]) dat += "\t *Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]\n" if (src.getBrainLoss() >= 100 || !src.has_brain()) - dat += "\t *Subject is brain dead.\n" + dat += "\t *Subject has taken extreme amounts of brain damage.\n" if(src.has_brain() && src.stat != DEAD && ishuman(src)) if(!src.key) diff --git a/code/modules/mob/living/living_verbs.dm b/code/modules/mob/living/living_verbs.dm index fe95f14182ea..77b996ff6bb0 100644 --- a/code/modules/mob/living/living_verbs.dm +++ b/code/modules/mob/living/living_verbs.dm @@ -13,7 +13,7 @@ if(isxeno(src)) var/mob/living/carbon/xenomorph/xeno = src - if(xeno.burrow) + if(HAS_TRAIT(xeno, TRAIT_ABILITY_BURROWED)) to_chat(src, SPAN_WARNING("You can't resist in your current state.")) return diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index ffe85017bb28..5e56b0204777 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -40,7 +40,7 @@ pixel_x = -12 old_x = -12 - var/atom/movable/vis_obj/xeno_wounds/wound_icon_carrier + var/atom/movable/vis_obj/xeno_wounds/wound_icon_holder /mob/living/simple_animal/hostile/alien/Initialize() maxHealth = health @@ -52,8 +52,8 @@ var/datum/hive_status/hive = GLOB.hive_datum[hivenumber] color = hive.color - wound_icon_carrier = new(null, src) - vis_contents += wound_icon_carrier + wound_icon_holder = new(null, src) + vis_contents += wound_icon_holder /mob/living/simple_animal/hostile/alien/proc/generate_name() change_real_name(src, "[caste_name] (BD-[rand(1, 999)])") @@ -105,22 +105,22 @@ update_wounds() /mob/living/simple_animal/hostile/alien/proc/update_wounds() - if(!wound_icon_carrier) + if(!wound_icon_holder) return - wound_icon_carrier.layer = layer + 0.01 - wound_icon_carrier.dir = dir + wound_icon_holder.layer = layer + 0.01 + wound_icon_holder.dir = dir var/health_threshold = max(CEILING((health * 4) / (maxHealth), 1), 0) //From 0 to 4, in 25% chunks if(health > HEALTH_THRESHOLD_DEAD) if(health_threshold > 3) - wound_icon_carrier.icon_state = "none" + wound_icon_holder.icon_state = "none" else if(lying) if((resting || sleeping) && (!knocked_down && !knocked_out && health > 0)) - wound_icon_carrier.icon_state = "[caste_name]_rest_[health_threshold]" + wound_icon_holder.icon_state = "[caste_name]_rest_[health_threshold]" else - wound_icon_carrier.icon_state = "[caste_name]_downed_[health_threshold]" + wound_icon_holder.icon_state = "[caste_name]_downed_[health_threshold]" else - wound_icon_carrier.icon_state = "[caste_name]_walk_[health_threshold]" + wound_icon_holder.icon_state = "[caste_name]_walk_[health_threshold]" /mob/living/simple_animal/hostile/alien/bullet_act(obj/projectile/P) . = ..() @@ -148,8 +148,8 @@ animate(src, 5 SECONDS, alpha = 0, easing = CUBIC_EASING) /mob/living/simple_animal/hostile/alien/Destroy() - vis_contents -= wound_icon_carrier - QDEL_NULL(wound_icon_carrier) + vis_contents -= wound_icon_holder + QDEL_NULL(wound_icon_holder) return ..() /mob/living/simple_animal/hostile/alien/ravager diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index e18c1ce3c2e7..751dbe5bf7cd 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -906,3 +906,14 @@ info = parsepencode(template, null, null, FALSE) #undef MAX_FIELDS + +/obj/item/paper/colonial_grunts + icon = 'icons/obj/items/paper.dmi' + icon_state = "paper_stack_words" + name = "Colonial Space Grunts" + desc = "A tabletop game based around the USCM, easy to get into, simple to play, and most inportantly fun for the whole squad." + +/obj/item/paper/colonial_grunts/Initialize(mapload, ...) + . = ..() + info = "
" + update_icon() diff --git a/code/modules/vehicles/multitile/multitile_bump.dm b/code/modules/vehicles/multitile/multitile_bump.dm index d9b480866f99..1f9e7897b0d3 100644 --- a/code/modules/vehicles/multitile/multitile_bump.dm +++ b/code/modules/vehicles/multitile/multitile_bump.dm @@ -106,14 +106,12 @@ return TRUE /obj/structure/surface/handle_vehicle_bump(obj/vehicle/multitile/V) - detach_all() playsound(V, 'sound/effects/metal_crash.ogg', 20) visible_message(SPAN_DANGER("\The [V] crushes \the [src]!")) qdel(src) return TRUE /obj/structure/surface/table/handle_vehicle_bump(obj/vehicle/multitile/V) - detach_all() playsound(V, 'sound/effects/metal_crash.ogg', 20) visible_message(SPAN_DANGER("\The [V] crushes \the [src]!")) if(prob(50)) @@ -122,7 +120,6 @@ return TRUE /obj/structure/surface/rack/handle_vehicle_bump(obj/vehicle/multitile/V) - detach_all() playsound(V, 'sound/effects/metal_crash.ogg', 20) visible_message(SPAN_DANGER("\The [V] crushes \the [src]!")) deconstruct() @@ -740,7 +737,7 @@ //BURROWER /mob/living/carbon/xenomorph/burrower/handle_vehicle_bump(obj/vehicle/multitile/V) - if(burrow) + if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED)) return TRUE else return . = ..() diff --git a/html/changelogs/AutoChangeLog-pr-4879.yml b/html/changelogs/AutoChangeLog-pr-4879.yml new file mode 100644 index 000000000000..cede9d3da3ff --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4879.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed an issue in traits backend update causing among others leadership action buttons to be missing." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4882.yml b/html/changelogs/AutoChangeLog-pr-4882.yml new file mode 100644 index 000000000000..c7fb30820171 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4882.yml @@ -0,0 +1,4 @@ +author: "BraveMole, Zonespace" +delete-after: True +changes: + - bugfix: "Guns should no longer very rarely jam mid-burst." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4884.yml b/html/changelogs/AutoChangeLog-pr-4884.yml new file mode 100644 index 000000000000..78950c4b43e9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4884.yml @@ -0,0 +1,4 @@ +author: "Releasethesea" +delete-after: True +changes: + - rscadd: "Adds Colonial Space Grunts to rec vend aswell as several pens and Dice for playing the game." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4888.yml b/html/changelogs/AutoChangeLog-pr-4888.yml deleted file mode 100644 index 72f497abefdd..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4888.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SpartanBobby Tophatpenguin" -delete-after: True -changes: - - maptweak: "redetails a room on the upper deck of the USS Almayer, places a few L42As in this room" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4890.yml b/html/changelogs/AutoChangeLog-pr-4890.yml new file mode 100644 index 000000000000..a97e5129371c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4890.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - rscadd: "Observer with Security HUD enabled can examine and read security records." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4893.yml b/html/changelogs/AutoChangeLog-pr-4893.yml new file mode 100644 index 000000000000..b07b3b6f66d3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4893.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - code_imp: "Replaces burrow var from Xenomorph with burrowed trait" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4894.yml b/html/changelogs/AutoChangeLog-pr-4894.yml new file mode 100644 index 000000000000..c55c2cdc4086 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4894.yml @@ -0,0 +1,4 @@ +author: "BeagleGaming1" +delete-after: True +changes: + - rscdel: "Removes icon baking on surfaces (primarily seen on tables)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4897.yml b/html/changelogs/AutoChangeLog-pr-4897.yml new file mode 100644 index 000000000000..2afee7c29f7f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4897.yml @@ -0,0 +1,5 @@ +author: "Birdtalon" +delete-after: True +changes: + - bugfix: "Boiler acid shroud now works on hotkey 5" + - code_imp: "Replaces single letter vars and removes unused code for boiler." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4899.yml b/html/changelogs/AutoChangeLog-pr-4899.yml new file mode 100644 index 000000000000..3fbcc6ec0be8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4899.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - code_imp: "Starts refactoring some vars on xenomorph class" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4906.yml b/html/changelogs/AutoChangeLog-pr-4906.yml new file mode 100644 index 000000000000..4b058bcd6a76 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4906.yml @@ -0,0 +1,4 @@ +author: "SpartanBobby" +delete-after: True +changes: + - maptweak: "fixes broken sidewalk on bigred" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4910.yml b/html/changelogs/AutoChangeLog-pr-4910.yml new file mode 100644 index 000000000000..dbc366c56510 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4910.yml @@ -0,0 +1,4 @@ +author: "Ediblebomb" +delete-after: True +changes: + - qol: "Changed \"Subject is brain-dead.\" to \"Subject has taken extreme amounts of brain damage.\" when scanning somebody with 100 brain damage." \ No newline at end of file diff --git a/html/changelogs/archive/2023-11.yml b/html/changelogs/archive/2023-11.yml index 89563f82965e..f72503ae13eb 100644 --- a/html/changelogs/archive/2023-11.yml +++ b/html/changelogs/archive/2023-11.yml @@ -172,3 +172,7 @@ - balance: M4 Synthetic Armor slows by 10% to justify having 1 extra storage slot. - spellcheck: Clarifies M4 Synthetic Armor description that it does not have any armor whatsoever. +2023-11-12: + SpartanBobby Tophatpenguin: + - maptweak: redetails a room on the upper deck of the USS Almayer, places a few + L42As in this room diff --git a/html/images/ColonialSpaceGruntsEZ.png b/html/images/ColonialSpaceGruntsEZ.png new file mode 100644 index 000000000000..7db4ca5ba768 Binary files /dev/null and b/html/images/ColonialSpaceGruntsEZ.png differ diff --git a/maps/map_files/BigRed/standalone/crashlanding-offices.dmm b/maps/map_files/BigRed/standalone/crashlanding-offices.dmm index 652b4df3bdd3..e0c625805375 100644 --- a/maps/map_files/BigRed/standalone/crashlanding-offices.dmm +++ b/maps/map_files/BigRed/standalone/crashlanding-offices.dmm @@ -23,8 +23,9 @@ }, /area/bigredv2/outside/c) "ag" = ( -/turf/open/mars_cave{ - icon_state = "mars_dirt_4" +/turf/open/floor{ + dir = 8; + icon_state = "asteroidwarning" }, /area/bigredv2/outside/e) "ah" = ( @@ -38,13 +39,12 @@ /area/bigredv2/outside/e) "aj" = ( /turf/open/mars{ - icon_state = "mars_dirt_11" + icon_state = "mars_dirt_12" }, /area/bigredv2/outside/e) "ak" = ( -/turf/open/floor{ - dir = 8; - icon_state = "asteroidwarning" +/turf/open/mars{ + icon_state = "mars_dirt_11" }, /area/bigredv2/outside/e) "al" = ( @@ -54,8 +54,8 @@ }, /area/bigredv2/outside/e) "am" = ( -/turf/open/mars{ - icon_state = "mars_dirt_12" +/turf/open/mars_cave{ + icon_state = "mars_dirt_4" }, /area/bigredv2/outside/e) "an" = ( @@ -2147,8 +2147,8 @@ Ha dq "} (20,1,1) = {" -aj -ag +ai +at aA dX dX @@ -2175,7 +2175,7 @@ PR "} (21,1,1) = {" ak -ak +am aA aG dX @@ -2201,9 +2201,9 @@ Ha PR "} (22,1,1) = {" -al -al -aA +ag +ag +aG aG dX ap @@ -2228,9 +2228,9 @@ Ha PR "} (23,1,1) = {" -am -ag -aA +al +al +aG aG aG ap @@ -2255,8 +2255,8 @@ Ha dq "} (24,1,1) = {" -ai -at +aj +am aA aG aG