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