diff --git a/_maps/map_files/stations/boxstation.dmm b/_maps/map_files/stations/boxstation.dmm index b3ad96fcf52..24b21c761e6 100644 --- a/_maps/map_files/stations/boxstation.dmm +++ b/_maps/map_files/stations/boxstation.dmm @@ -26548,9 +26548,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/mob/living/basic/gorilla/cargo_domestic{ - name = "Forklift" - }, +/mob/living/basic/gorilla/cargo_domestic/forklift, /turf/simulated/floor/plasteel, /area/station/supply/office) "bVK" = ( diff --git a/_maps/map_files/stations/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm index d3eeb43e902..8a38ef61780 100644 --- a/_maps/map_files/stations/cerestation.dmm +++ b/_maps/map_files/stations/cerestation.dmm @@ -52578,13 +52578,6 @@ /obj/machinery/microscope, /turf/simulated/floor/carpet/grimey, /area/station/security/detective) -"kmw" = ( -/obj/machinery/alarm/directional/north, -/obj/effect/turf_decal/tiles/department/command/side{ - dir = 1 - }, -/turf/simulated/floor/plasteel/dark, -/area/station/command/office/cmo) "kmy" = ( /obj/machinery/atmospherics/pipe/simple/visible{ dir = 6 @@ -53839,10 +53832,6 @@ icon_state = "asteroidplating" }, /area/station/maintenance/asmaint) -"kzP" = ( -/mob/living/basic/gorilla/cargo_domestic, -/turf/simulated/floor/plasteel/dark, -/area/station/supply/office) "kzU" = ( /obj/machinery/atmospherics/unary/portables_connector, /obj/machinery/atmospherics/portable/canister/air, @@ -65021,6 +65010,10 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel/white, /area/station/science/hallway) +"mZp" = ( +/mob/living/basic/gorilla/cargo_domestic/forklift, +/turf/simulated/floor/plasteel/dark, +/area/station/supply/office) "mZA" = ( /obj/machinery/atmospherics/binary/volume_pump/on{ dir = 1; @@ -69269,6 +69262,14 @@ /obj/effect/turf_decal/tiles/neutral, /turf/simulated/floor/plasteel, /area/station/hallway/primary/port/south) +"nZV" = ( +/obj/machinery/alarm/directional/north, +/mob/living/basic/kangaroo/darwin, +/obj/effect/turf_decal/tiles/department/command/side{ + dir = 1 + }, +/turf/simulated/floor/plasteel/dark, +/area/station/command/office/cmo) "nZX" = ( /obj/machinery/atmospherics/portable/canister/oxygen, /obj/machinery/atmospherics/unary/portables_connector{ @@ -79293,6 +79294,17 @@ /obj/effect/turf_decal/tiles/department/engineering/side, /turf/simulated/floor/plasteel, /area/station/engineering/hardsuitstorage) +"qmS" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/simulated/floor/plasteel/dark, +/area/station/command/office/cmo) "qmT" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -111038,20 +111050,6 @@ }, /turf/simulated/floor/plasteel/dark, /area/station/security/brig) -"xfB" = ( -/mob/living/basic/kangaroo{ - name = "Darwin" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/simulated/floor/plasteel/dark, -/area/station/command/office/cmo) "xfG" = ( /obj/structure/cable{ icon_state = "4-8" @@ -166436,7 +166434,7 @@ gFg gFg pTq idF -kmw +nZV duz noD rIh @@ -166695,7 +166693,7 @@ swf idF wWt gEG -xfB +qmS oKR hLn iNy @@ -168473,7 +168471,7 @@ uhG nyh dKv clE -kzP +mZp ntW ntW oFW diff --git a/_maps/map_files/stations/deltastation.dmm b/_maps/map_files/stations/deltastation.dmm index 6e3679a92cc..cbaa7f38ea6 100644 --- a/_maps/map_files/stations/deltastation.dmm +++ b/_maps/map_files/stations/deltastation.dmm @@ -12087,12 +12087,10 @@ /area/station/supply/office) "aWu" = ( /obj/effect/turf_decal/stripes/line, -/mob/living/basic/gorilla/cargo_domestic{ - name = "Forklift" - }, /obj/structure/cable{ icon_state = "4-8" }, +/mob/living/basic/gorilla/cargo_domestic/forklift, /turf/simulated/floor/plasteel, /area/station/supply/storage) "aWv" = ( @@ -96062,9 +96060,6 @@ /turf/simulated/floor/plasteel/dark, /area/station/security/main) "xIN" = ( -/mob/living/basic/kangaroo{ - name = "Darwin" - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -96074,6 +96069,7 @@ /obj/structure/disposalpipe/segment/corner{ dir = 8 }, +/mob/living/basic/kangaroo/darwin, /turf/simulated/floor/plasteel/dark, /area/station/command/office/cmo) "xJo" = ( diff --git a/_maps/map_files/stations/emeraldstation.dmm b/_maps/map_files/stations/emeraldstation.dmm index 1fa5b3467b0..4259a29a68e 100644 --- a/_maps/map_files/stations/emeraldstation.dmm +++ b/_maps/map_files/stations/emeraldstation.dmm @@ -115649,6 +115649,10 @@ }, /turf/simulated/floor/plasteel, /area/station/supply/miningdock) +"xmC" = ( +/mob/living/basic/gorilla/cargo_domestic/forklift, +/turf/simulated/floor/plasteel, +/area/station/supply/storage) "xmH" = ( /obj/structure/table/wood, /obj/item/storage/secure/briefcase, @@ -120479,18 +120483,6 @@ }, /turf/simulated/floor/plasteel, /area/station/supply/storage) -"ylD" = ( -/mob/living/basic/gorilla/cargo_domestic{ - name = "Forklift" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/disposalpipe/segment, -/turf/simulated/floor/plasteel, -/area/station/supply/storage) "ylG" = ( /obj/structure/chair/office/dark{ dir = 1 @@ -139447,7 +139439,7 @@ wdE wsR iws ave -ave +xmC ave giX nfe @@ -139960,7 +139952,7 @@ ifs mLY ave cTI -ylD +jON jON jON jON diff --git a/_maps/map_files/stations/metastation.dmm b/_maps/map_files/stations/metastation.dmm index fdd266bded5..d740d2ecd7c 100644 --- a/_maps/map_files/stations/metastation.dmm +++ b/_maps/map_files/stations/metastation.dmm @@ -12805,6 +12805,10 @@ }, /turf/simulated/floor/plasteel, /area/station/engineering/break_room) +"bvj" = ( +/mob/living/basic/gorilla/cargo_domestic/forklift, +/turf/simulated/floor/plasteel, +/area/station/supply/storage) "bvk" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -107036,7 +107040,7 @@ qpk oXH kdx aRo -aRo +bvj cKf aVk nxW diff --git a/code/_globalvars/lists/mob_lists.dm b/code/_globalvars/lists/mob_lists.dm index d55e3db5c14..11d6e7013b5 100644 --- a/code/_globalvars/lists/mob_lists.dm +++ b/code/_globalvars/lists/mob_lists.dm @@ -31,6 +31,7 @@ GLOBAL_LIST_EMPTY(bots_list) //List of all bots(beepsky, medibots,etc) GLOBAL_LIST_EMPTY(roundstart_observer_keys) //List of ckeys who ghosted before the game began. GLOBAL_LIST_EMPTY(antag_hud_users) // ckeys of users who have enabled ahud at some point during the game GLOBAL_LIST_EMPTY(crew_list) // list of all crew on manifest, contains name paired with their assignment +GLOBAL_LIST_EMPTY(station_pets) // List of all station pets. GLOBAL_LIST_EMPTY(surgeries_list) GLOBAL_LIST_EMPTY(hear_radio_list) //Mobs that hear the radio even if there's no client diff --git a/code/datums/mind.dm b/code/datums/mind.dm index ccd8acc0496..da6b507daeb 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -679,9 +679,8 @@ def_value = "custom" var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list( - "assassinate", "assassinateonce", "blood", "debrain", "protect", "prevent", "hijack", "escape", "survive", "steal", + "assassinate", "assassinateonce", "blood", "debrain", "protect", "prevent", "hijack", "escape", "survive", "steal", "kill pet", "nuke", "nuclear operations", "absorb", "destroy", "maroon", "identity theft", "download", "incriminate", "infiltrate security", "custom") - if(!new_obj_type) return @@ -758,6 +757,9 @@ if("nuclear operations") new_objective = /datum/objective/nuclear + if("kill pet") + new_objective = /datum/objective/kill_pet + if("steal") if(!istype(objective, /datum/objective/steal)) new_objective = new /datum/objective/steal diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 665c5154130..54cb48613ef 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -189,6 +189,47 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) update_explanation_text() return target +/datum/objective/proc/give_kit(obj/item/item_path) + var/list/datum/mind/objective_owners = get_owners() + if(!length(objective_owners)) + return + + var/obj/item/item_to_give = new item_path + var/static/list/slots = list( + "backpack" = ITEM_SLOT_IN_BACKPACK, + "left pocket" = ITEM_SLOT_LEFT_POCKET, + "right pocket" = ITEM_SLOT_RIGHT_POCKET, + "left hand" = ITEM_SLOT_LEFT_HAND, + "right hand" = ITEM_SLOT_RIGHT_HAND, + ) + + for(var/datum/mind/kit_receiver_mind as anything in shuffle(objective_owners)) + var/mob/living/carbon/human/kit_receiver = kit_receiver_mind.current + if(!kit_receiver) + continue + var/where = kit_receiver.equip_in_one_of_slots(item_to_give, slots) + if(!where) + continue + + to_chat(kit_receiver, "

In your [where] is a box containing items and instructions to help you with your objective.
") + for(var/datum/mind/objective_owner as anything in objective_owners) + if(kit_receiver_mind == objective_owner || !objective_owner.current) + continue + + to_chat(objective_owner.current, "

[kit_receiver] has received a box containing items and instructions to help you with your objective.
") + + return + + qdel(item_to_give) + + for(var/datum/mind/objective_owner as anything in objective_owners) + var/mob/living/carbon/human/failed_receiver = objective_owner.current + if(!failed_receiver) + continue + + to_chat(failed_receiver, "Unfortunately, you weren't able to get an objective kit. This is very bad and you should adminhelp immediately (press F1).") + message_admins("[ADMIN_LOOKUPFLW(failed_receiver)] Failed to spawn with their [item_path] objective kit.") + /** * Called when the objective's target goes to cryo. */ @@ -830,7 +871,7 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) return TRUE return FALSE -/datum/objective/steal/proc/give_kit(obj/item/item_path) +/datum/objective/steal/give_kit(obj/item/item_path) var/list/datum/mind/objective_owners = get_owners() if(!length(objective_owners)) return @@ -1003,6 +1044,33 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) stolen_count++ return stolen_count >= 5 +/datum/objective/kill_pet + name = "Kill Pet" + martyr_compatible = TRUE + delayed_objective_text = "Your objective is to kill a station pet and humiliate Nanotrasen. You will receive further information in a few minutes." + completed = TRUE + +/datum/objective/kill_pet/update_explanation_text() + if(target) + explanation_text = "Destroy Nanotrasen's morale by detonating [target] with C4, and optionally take a picture of [target] before the C4 detonates." + else + explanation_text = "Free Objective." + +/datum/objective/kill_pet/find_target(list/target_blacklist) + if(!needs_target) + return + var/list/possible_targets = GLOB.station_pets - target_blacklist + if(length(possible_targets) > 0) + target = pick(possible_targets) + + addtimer(CALLBACK(src, PROC_REF(hand_out_equipment)), 5 SECONDS, TIMER_DELETE_ME) + SEND_SIGNAL(src, COMSIG_OBJECTIVE_TARGET_FOUND, target) + update_explanation_text() + return target + +/datum/objective/kill_pet/proc/hand_out_equipment() + give_kit(/obj/item/storage/box/syndie_kit/pet_assassination_kit) + /datum/objective/blood name = "Drink blood" needs_target = FALSE diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 44308c1a80d..a84622ae580 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -296,6 +296,14 @@ for(var/obj/item/item as anything in items) new item(src) +/obj/item/storage/box/syndie_kit/pet_assassination_kit + desc = "It's just an ordinary box." + icon_state = "box" + +/obj/item/storage/box/syndie_kit/pet_assassination_kit/populate_contents() + new /obj/item/grenade/plastic/c4(src) + new /obj/item/grenade/plastic/c4(src) + /obj/item/storage/box/syndie_kit/space name = "Boxed Space Suit and Helmet" can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red, /obj/item/tank/internals/emergency_oxygen/engi/syndi, /obj/item/clothing/mask/gas/syndicate) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 1f6bc929c72..0e52e5b2b7b 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -442,6 +442,7 @@ GLOBAL_LIST_EMPTY(antagonists) #define MAROON_OBJECTIVE "MAROON" #define ASS_ONCE_OBJECTIVE "ASS_ONCE" #define ASS_OBJECTIVE "ASS" +#define ASS_PET "ASS_PET" #define INFIL_SEC_OBJECTIVE "INFILTRATE_SEC" @@ -454,8 +455,9 @@ GLOBAL_LIST_EMPTY(antagonists) */ /datum/antagonist/proc/roll_single_human_objective() var/datum/objective/objective_to_add + var/list/static/the_objective_list = list(KILL_OBJECTIVE = 47, THEFT_OBJECTIVE = 42, INCRIMINATE_OBJECTIVE = 5, PROTECT_OBJECTIVE = 6) - var/list/the_nonstatic_kill_list = list(DEBRAIN_OBJECTIVE = 45, MAROON_OBJECTIVE = 235, ASS_ONCE_OBJECTIVE = 160, ASS_OBJECTIVE = 340, INFIL_SEC_OBJECTIVE = 220) + var/list/the_nonstatic_kill_list = list(DEBRAIN_OBJECTIVE = 39, MAROON_OBJECTIVE = 202, ASS_ONCE_OBJECTIVE = 138, ASS_OBJECTIVE = 293, ASS_PET = 138, INFIL_SEC_OBJECTIVE = 190) // If our org has an objectives list, give one to us if we pass a roll on the org's focus if(organization && length(organization.objectives) && prob(organization.focus)) @@ -480,6 +482,9 @@ GLOBAL_LIST_EMPTY(antagonists) if(ASS_ONCE_OBJECTIVE) objective_to_add = /datum/objective/assassinateonce + if(ASS_PET) + objective_to_add = /datum/objective/kill_pet + if(ASS_OBJECTIVE) objective_to_add = /datum/objective/assassinate @@ -523,6 +528,7 @@ GLOBAL_LIST_EMPTY(antagonists) #undef MAROON_OBJECTIVE #undef ASS_ONCE_OBJECTIVE #undef ASS_OBJECTIVE +#undef ASS_PET #undef INFIL_SEC_OBJECTIVE diff --git a/code/modules/mob/living/basic/hostile/giant_spider/giant_spider.dm b/code/modules/mob/living/basic/hostile/giant_spider/giant_spider.dm index 64c0a471005..58c7122c79e 100644 --- a/code/modules/mob/living/basic/hostile/giant_spider/giant_spider.dm +++ b/code/modules/mob/living/basic/hostile/giant_spider/giant_spider.dm @@ -218,5 +218,6 @@ /mob/living/basic/giant_spider/araneus/Initialize(mapload) . = ..() + GLOB.station_pets += src AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/pet_bonus, "chitters!") diff --git a/code/modules/mob/living/basic/hostile/gorilla/gorilla.dm b/code/modules/mob/living/basic/hostile/gorilla/gorilla.dm index 88c86d2150b..4711075dc74 100644 --- a/code/modules/mob/living/basic/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/basic/hostile/gorilla/gorilla.dm @@ -232,6 +232,13 @@ . = ..() . |= access_card.GetAccess() +/mob/living/basic/gorilla/cargo_domestic/forklift + name = "Forklift" + +/mob/living/basic/gorilla/cargo_domestic/forklift/Initialize(mapload) + . = ..() + GLOB.station_pets += src + /obj/item/card/id/supply/cargo_gorilla name = "cargorilla ID" registered_name = "Cargorilla" diff --git a/code/modules/mob/living/basic/retaliate/kangaroo.dm b/code/modules/mob/living/basic/retaliate/kangaroo.dm index ed265ec5848..8687c0a4661 100644 --- a/code/modules/mob/living/basic/retaliate/kangaroo.dm +++ b/code/modules/mob/living/basic/retaliate/kangaroo.dm @@ -67,3 +67,10 @@ melee_damage_lower = initial(melee_damage_lower) melee_damage_upper = initial(melee_damage_upper) +/mob/living/basic/kangaroo/darwin + name = "Darwin" + real_name = "Darwin" + +/mob/living/basic/kangaroo/darwin/Initialize(mapload) + . = ..() + GLOB.station_pets += src diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 751b794ef94..7697e123015 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -228,3 +228,7 @@ desc = "The worst she might do is attempt to... couple with your head." //hope we don't get sued over a harmless reference, rite? sterile = 1 gender = FEMALE + +/obj/item/clothing/mask/facehugger/lamarr/Initialize(mapload) + . = ..() + GLOB.station_pets += src diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 1cd8a0658e6..3acb51a7d5e 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -48,6 +48,7 @@ /mob/living/simple_animal/pet/cat/runtime/Initialize(mapload) . = ..() SSpersistent_data.register(src) + GLOB.station_pets += src /mob/living/simple_animal/pet/cat/runtime/Destroy() SSpersistent_data.registered_atoms -= src diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 2e00076bdf8..b2c3e30e063 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -335,6 +335,7 @@ /mob/living/simple_animal/pet/dog/corgi/ian/Initialize(mapload) . = ..() SSpersistent_data.register(src) + GLOB.station_pets += src /mob/living/simple_animal/pet/dog/corgi/ian/Destroy() SSpersistent_data.registered_atoms -= src diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index 10305fed743..21702143bec 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -22,6 +22,10 @@ unique_pet = TRUE gold_core_spawnable = NO_SPAWN +/mob/living/simple_animal/pet/dog/fox/renault/Initialize(mapload) + . = ..() + GLOB.station_pets += src + //Syndi fox /mob/living/simple_animal/pet/dog/fox/syndifox name = "Syndifox" diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index a26ec5a2e05..aff1dc8887a 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -743,6 +743,7 @@ /mob/living/simple_animal/parrot/poly/Initialize(mapload) . = ..() + GLOB.station_pets += src ears = new /obj/item/radio/headset/headset_eng(src) clean_speak += "Danger! Crystal hyperstructure integrity faltering! Integrity: [rand(75, 99)]%" // Has to be here cause of the `rand()`.