diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 3806451a24c..3e645ba479e 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -63919,7 +63919,7 @@
/area/commons/vacant_room/commissary)
"fCk" = (
/obj/structure/cable,
-/mob/living/simple_animal/hostile/carp/cayenne/lia,
+/mob/living/simple_animal/hostile/carp/lia,
/turf/open/floor/iron/grimy,
/area/command/heads_quarters/hos)
"fCE" = (
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index a9bf01636c2..5a63fcde1e8 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -40214,7 +40214,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
dir = 5
},
-/mob/living/simple_animal/hostile/carp/cayenne/lia,
+/mob/living/simple_animal/hostile/carp/lia,
/turf/open/floor/carpet,
/area/command/heads_quarters/hos)
"mpi" = (
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 127359be72e..337fce22a66 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -76312,7 +76312,7 @@
/obj/structure/extinguisher_cabinet{
pixel_x = 24
},
-/mob/living/simple_animal/hostile/carp/cayenne/lia,
+/mob/living/simple_animal/hostile/carp/lia,
/turf/open/floor/iron/dark,
/area/command/heads_quarters/hos)
"ptQ" = (
diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm
index acac49dcef8..4a552e23943 100644
--- a/code/__DEFINES/achievements.dm
+++ b/code/__DEFINES/achievements.dm
@@ -33,6 +33,7 @@
#define MEDAL_TOOLBOX_SOUL "Toolsoul"
#define MEDAL_CHEM_TUT "Beginner Chemist"
#define MEDAL_HOT_DAMN "Hot Damn!"
+#define MEDAL_CAYENNE_DISK "Very Important Piscis"
//Skill medal hub IDs
#define MEDAL_LEGENDARY_MINER "Legendary Miner"
diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm
index 26e779129aa..3faaf9d8634 100644
--- a/code/datums/achievements/misc_achievements.dm
+++ b/code/datums/achievements/misc_achievements.dm
@@ -165,3 +165,9 @@
desc = "Sometimes you need to make some noise to make a point."
database_id = MEDAL_HOT_DAMN
icon = "hotdamn"
+
+/datum/award/achievement/misc/cayenne_disk
+ name = "Very Important Piscis"
+ desc = "You can rest well now."
+ database_id = MEDAL_CAYENNE_DISK
+ icon = "cayenne_disk"
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index ec8188b3ee9..4725ad47efb 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -44,7 +44,6 @@
is_flying_animal = TRUE
pressure_resistance = 200
gold_core_spawnable = HOSTILE_SPAWN
-
var/random_color = TRUE //if the carp uses random coloring
var/rarechance = 1 //chance for rare color variant
var/snack_distance = 0
@@ -72,9 +71,8 @@
/mob/living/simple_animal/hostile/carp/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
- carp_randomify(rarechance)
- update_icons()
add_cell_sample()
+ carp_randomify(rarechance)
/mob/living/simple_animal/hostile/carp/add_cell_sample()
AddElement(/datum/element/swabable, CELL_LINE_TABLE_CARP, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
@@ -88,23 +86,28 @@
else
our_color = pick(carp_colors)
add_atom_colour(carp_colors[our_color], FIXED_COLOUR_PRIORITY)
- add_carp_overlay()
+ regenerate_icons()
-/mob/living/simple_animal/hostile/carp/proc/add_carp_overlay()
+/mob/living/simple_animal/hostile/carp/death(gibbed)
+ . = ..()
+ cut_overlays()
+ if(!random_color || gibbed)
+ return
+ regenerate_icons()
+
+/mob/living/simple_animal/hostile/carp/revive(full_heal = FALSE, admin_revive = FALSE)
+ . = ..()
+ if(.)
+ regenerate_icons()
+
+/mob/living/simple_animal/hostile/carp/regenerate_icons()
+ cut_overlays()
if(!random_color)
return
- cut_overlays()
- var/mutable_appearance/base_overlay = mutable_appearance(icon, "base_mouth")
+ var/mutable_appearance/base_overlay = mutable_appearance(icon, stat == DEAD ? "base_dead_mouth" : "base_mouth")
base_overlay.appearance_flags = RESET_COLOR
add_overlay(base_overlay)
-
-/mob/living/simple_animal/hostile/carp/proc/add_dead_carp_overlay()
- if(!random_color)
- return
- cut_overlays()
- var/mutable_appearance/base_dead_overlay = mutable_appearance(icon, "base_dead_mouth")
- base_dead_overlay.appearance_flags = RESET_COLOR
- add_overlay(base_dead_overlay)
+ ..()
/mob/living/simple_animal/hostile/carp/proc/chomp_plastic()
var/obj/item/storage/cans/tasty_plastic = locate(/obj/item/storage/cans) in view(1, src)
@@ -121,28 +124,6 @@
if(stat == CONSCIOUS)
chomp_plastic()
-/mob/living/simple_animal/hostile/carp/death(gibbed)
- . = ..()
- cut_overlays()
- if(!random_color || gibbed)
- return
- add_dead_carp_overlay()
-
-/mob/living/simple_animal/hostile/carp/revive(full_heal = FALSE, admin_revive = FALSE)
- . = ..()
- if(.)
- regenerate_icons()
-
-/mob/living/simple_animal/hostile/carp/regenerate_icons()
- cut_overlays()
- if(!random_color)
- return
- if(stat != DEAD)
- add_carp_overlay()
- else
- add_dead_carp_overlay()
- ..()
-
/mob/living/simple_animal/hostile/carp/tamed()
. = ..()
can_buckle = TRUE
@@ -219,6 +200,27 @@
if(regen_cooldown < world.time)
heal_overall_damage(2 * delta_time)
+/mob/living/simple_animal/hostile/carp/lia
+ name = "Lia"
+ real_name = "Lia"
+ desc = "A failed experiment of Nanotrasen to create weaponised carp technology. This less than intimidating carp now serves as the Head of Security's pet."
+ gender = FEMALE
+ speak_emote = list("squeaks")
+ gold_core_spawnable = NO_SPAWN
+ faction = list("neutral")
+ health = 200
+ icon_dead = "magicarp_dead"
+ icon_gib = "magicarp_gib"
+ icon_living = "magicarp"
+ icon_state = "magicarp"
+ maxHealth = 200
+ random_color = FALSE
+ food_type = list()
+ tame_chance = 0
+ bonus_tame_chance = 0
+ pet_bonus = TRUE
+ pet_bonus_emote = "bloops happily!"
+
/mob/living/simple_animal/hostile/carp/cayenne
name = "Cayenne"
real_name = "Cayenne"
@@ -233,18 +235,65 @@
bonus_tame_chance = 0
pet_bonus = TRUE
pet_bonus_emote = "bloops happily!"
+ /// Keeping track of the nuke disk for the functionality of storing it.
+ var/obj/item/disk/nuclear/disky
-/mob/living/simple_animal/hostile/carp/cayenne/lia
- name = "Lia"
- real_name = "Lia"
- desc = "A failed experiment of Nanotrasen to create weaponised carp technology. This less than intimidating carp now serves as the Head of Security's pet."
- faction = list("neutral")
- health = 200
- icon_dead = "magicarp_dead"
- icon_gib = "magicarp_gib"
- icon_living = "magicarp"
- icon_state = "magicarp"
- maxHealth = 200
- random_color = FALSE
+/mob/living/simple_animal/hostile/carp/cayenne/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_DISK_VERIFIER, INNATE_TRAIT) //carp can verify disky
+ ADD_TRAIT(src, TRAIT_ADVANCEDTOOLUSER, INNATE_TRAIT) //carp SMART
+
+/mob/living/simple_animal/hostile/carp/cayenne/death(gibbed)
+ disky.forceMove(drop_location())
+ disky = null
+ return ..()
+
+/mob/living/simple_animal/hostile/carp/cayenne/Destroy(force)
+ . = ..()
+ QDEL_NULL(disky)
+
+/mob/living/simple_animal/hostile/carp/cayenne/examine(mob/user)
+ . = ..()
+ if(disky)
+ . += "Wait... is that [disky] in [p_their()] mouth?"
+
+/mob/living/simple_animal/hostile/carp/cayenne/AttackingTarget(atom/attacked_target)
+ if(istype(attacked_target, /obj/item/disk/nuclear))
+ var/obj/item/disk/nuclear/potential_disky = attacked_target
+ if(potential_disky.anchored)
+ return
+ potential_disky.forceMove(src)
+ disky = potential_disky
+ to_chat(src, "YES!! You manage to pick up [disky]. (Click anywhere to place it back down.)")
+ regenerate_icons()
+ if(!disky.fake)
+ client.give_award(/datum/award/achievement/misc/cayenne_disk, src)
+ return
+ if(disky)
+ if(isopenturf(attacked_target))
+ to_chat(src, "You place [disky] on [attacked_target]")
+ disky.forceMove(attacked_target.drop_location())
+ disky = null
+ regenerate_icons()
+ else
+ disky.melee_attack_chain(src, attacked_target)
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/carp/cayenne/Exited(atom/movable/AM, atom/newLoc)
+ . = ..()
+ if(AM == disky)
+ disky = null
+ regenerate_icons()
+
+/mob/living/simple_animal/hostile/carp/cayenne/regenerate_icons()
+ . = ..()
+ if(!disky || stat == DEAD)
+ return
+ cut_overlays()
+ add_overlay("disk_mouth")
+ var/mutable_appearance/disk_overlay = mutable_appearance(icon, "disk_overlay")
+ disk_overlay.appearance_flags = RESET_COLOR
+ add_overlay(disk_overlay)
#undef REGENERATION_DELAY
diff --git a/icons/UI_Icons/Achievements/Misc/cayenne_disk.png b/icons/UI_Icons/Achievements/Misc/cayenne_disk.png
new file mode 100644
index 00000000000..336ffec298c
Binary files /dev/null and b/icons/UI_Icons/Achievements/Misc/cayenne_disk.png differ
diff --git a/icons/mob/carp.dmi b/icons/mob/carp.dmi
index 5b6138ee99a..3dd2d2d6c6c 100644
Binary files a/icons/mob/carp.dmi and b/icons/mob/carp.dmi differ