diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm index 391ee51e91c..767b04ad36e 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm @@ -182,9 +182,9 @@ /area/ruin/powered) "rC" = ( /obj/structure/closet/secure_closet/freezer, -/obj/item/food/carpmeat, -/obj/item/food/carpmeat, -/obj/item/food/carpmeat, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, /obj/item/reagent_containers/food/condiment/pack/ketchup, /obj/item/reagent_containers/food/condiment/pack/ketchup, /obj/item/reagent_containers/food/condiment/pack/ketchup, diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index 94889101026..652c9220f70 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -1282,8 +1282,8 @@ /turf/open/floor/plating/snowed/temperatre, /area/awaymission/cabin/snowforest/sovietsurface) "ea" = ( -/obj/item/food/carpmeat, -/obj/item/food/carpmeat, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, /turf/open/floor/plating/ice/smooth, /area/awaymission/cabin/snowforest) "eb" = ( diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index d93d258cab0..43d5335ace9 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -9308,11 +9308,11 @@ /area/wizard_station) "zV" = ( /obj/structure/closet/secure_closet/freezer/meat/open, -/obj/item/food/carpmeat, -/obj/item/food/carpmeat, -/obj/item/food/carpmeat, -/obj/item/food/carpmeat, -/obj/item/food/carpmeat, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, /turf/open/floor/plasteel/cafeteria, /area/centcom/holding) "zX" = ( @@ -12219,10 +12219,10 @@ /obj/item/food/meat/rawcutlet, /obj/item/food/meat/rawcutlet, /obj/item/food/meat/rawcutlet, -/obj/item/food/carpmeat, -/obj/item/food/carpmeat, -/obj/item/food/carpmeat, -/obj/item/food/carpmeat, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, diff --git a/code/__DEFINES/aquarium.dm b/code/__DEFINES/aquarium.dm index 735c9a90a82..47813eb23c1 100644 --- a/code/__DEFINES/aquarium.dm +++ b/code/__DEFINES/aquarium.dm @@ -15,6 +15,7 @@ #define MIN_AQUARIUM_TEMP T0C #define MAX_AQUARIUM_TEMP T0C + 100 +#define DEFAULT_AQUARIUM_TEMP 300 #define FISH_RARITY_BASIC 1000 #define FISH_RARITY_RARE 400 diff --git a/code/datums/components/aquarium.dm b/code/datums/components/aquarium.dm index f3b64aea165..49ebfab48d6 100644 --- a/code/datums/components/aquarium.dm +++ b/code/datums/components/aquarium.dm @@ -16,6 +16,9 @@ //Current layer for the visual object var/base_layer + //If flopping animation was applied to parent, tracked to stop it on removal/destroy + var/flopping = FALSE + /datum/component/aquarium_content/Initialize(property_type) if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE @@ -28,6 +31,11 @@ ADD_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, src) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/enter_aquarium) + //If component is added to something already in aquarium at the time initialize it properly. + var/atom/movable/movable_parent = parent + if(istype(movable_parent.loc, /obj/structure/aquarium)) + on_inserted(movable_parent.loc) + /datum/component/aquarium_content/PreTransfer() . = ..() REMOVE_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, src) @@ -35,6 +43,7 @@ /datum/component/aquarium_content/Destroy(force, silent) if(current_aquarium) remove_from_aquarium() + stop_flopping() QDEL_NULL(vc_obj) QDEL_NULL(properties) return ..() @@ -77,7 +86,6 @@ //Finally add it to to objects vis_contents current_aquarium.vis_contents |= vc_obj - /// Aquarium surface changed in some way, we need to recalculate base position and aninmation /datum/component/aquarium_content/proc/on_surface_changed() SIGNAL_HANDLER @@ -103,7 +111,6 @@ if(base_layer) current_aquarium.free_layer(base_layer) - /// Generates common visual object, propeties that don't depend on aquarium surface /datum/component/aquarium_content/proc/generate_base_vc() if(!properties) @@ -167,11 +174,57 @@ base_py = py_min animate(vc_obj, pixel_y = py_min, time = 1) //flop to bottom and end current animation. +#define PAUSE_BETWEEN_PHASES 15 +#define PAUSE_BETWEEN_FLOPS 2 +#define FLOP_COUNT 2 +#define FLOP_DEGREE 20 +#define FLOP_SINGLE_MOVE_TIME 1.5 +#define JUMP_X_DISTANCE 5 +#define JUMP_Y_DISTANCE 6 +/// This animation should be applied to actual parent atom instead of vc_object. +/proc/flop_animation(atom/movable/animation_target) + var/pause_between = PAUSE_BETWEEN_PHASES + rand(1, 5) //randomized a bit so fish are not in sync + animate(animation_target, time = pause_between, loop = -1) + //move nose down and up + for(var/_ in 1 to FLOP_COUNT) + var/matrix/up_matrix = matrix() + up_matrix.Turn(FLOP_DEGREE) + var/matrix/down_matrix = matrix() + down_matrix.Turn(-FLOP_DEGREE) + animate(transform = down_matrix, time = FLOP_SINGLE_MOVE_TIME, loop = -1) + animate(transform = up_matrix, time = FLOP_SINGLE_MOVE_TIME, loop = -1) + animate(transform = matrix(), time = FLOP_SINGLE_MOVE_TIME, loop = -1, easing = BOUNCE_EASING | EASE_IN) + animate(time = PAUSE_BETWEEN_FLOPS, loop = -1) + //bounce up and down + animate(time = pause_between, loop = -1, flags = ANIMATION_PARALLEL) + var/jumping_right = FALSE + var/up_time = 3 * FLOP_SINGLE_MOVE_TIME / 2 + for(var/_ in 1 to FLOP_COUNT) + jumping_right = !jumping_right + var/x_step = jumping_right ? JUMP_X_DISTANCE/2 : -JUMP_X_DISTANCE/2 + animate(time = up_time, pixel_y = JUMP_Y_DISTANCE , pixel_x=x_step, loop = -1, flags= ANIMATION_RELATIVE, easing = BOUNCE_EASING | EASE_IN) + animate(time = up_time, pixel_y = -JUMP_Y_DISTANCE, pixel_x=x_step, loop = -1, flags= ANIMATION_RELATIVE, easing = BOUNCE_EASING | EASE_OUT) + animate(time = PAUSE_BETWEEN_FLOPS, loop = -1) +#undef PAUSE_BETWEEN_PHASES +#undef PAUSE_BETWEEN_FLOPS +#undef FLOP_COUNT +#undef FLOP_DEGREE +#undef FLOP_SINGLE_MOVE_TIME +#undef JUMP_X_DISTANCE +#undef JUMP_Y_DISTANCE -/// Floating to top animation. -/datum/component/aquarium_content/proc/float_animation() - return +/// Starts flopping animation +/datum/component/aquarium_content/proc/start_flopping() + if(!flopping && istype(parent,/obj/item/fish)) //Requires update_transform/animate_wrappers to be less restrictive. + flopping = TRUE + flop_animation(parent) + +/// Stops flopping animation +/datum/component/aquarium_content/proc/stop_flopping() + if(flopping) + flopping = FALSE + animate(parent, transform = matrix()) //stop animation /datum/component/aquarium_content/proc/set_vc_base_position() var/list/aq_properties = current_aquarium.get_surface_properties() @@ -205,8 +258,8 @@ UnregisterSignal(current_aquarium, list(COMSIG_AQUARIUM_SURFACE_CHANGED, COMSIG_AQUARIUM_FLUID_CHANGED, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_EXITED)) remove_visual_from_aquarium() current_aquarium = null - //We do not stop processing properties here. We want fish to die outside of aquariums after first insert. We only stop processing in properties.death or destroy /datum/component/aquarium_content/proc/on_tank_stasis() // Stop processing until inserted into aquarium again. + stop_flopping() STOP_PROCESSING(SSobj, properties) diff --git a/code/datums/elements/deferred_aquarium_content.dm b/code/datums/elements/deferred_aquarium_content.dm index 007dae515a3..5569e0359a6 100644 --- a/code/datums/elements/deferred_aquarium_content.dm +++ b/code/datums/elements/deferred_aquarium_content.dm @@ -14,7 +14,13 @@ if(!aquarium_content_type) CRASH("Deferred aquarium content missing behaviour type.") src.aquarium_content_type = aquarium_content_type - RegisterSignal(target, COMSIG_AQUARIUM_BEFORE_INSERT_CHECK, .proc/create_aquarium_component) + + //If element is added to something already in aquarium, just create the component. + var/atom/movable/movable_target = target + if(istype(movable_target.loc, /obj/structure/aquarium)) + create_aquarium_component(movable_target) + else //otherwise the component will be created when trying to insert the thing. + RegisterSignal(target, COMSIG_AQUARIUM_BEFORE_INSERT_CHECK, .proc/create_aquarium_component) /datum/element/deferred_aquarium_content/Detach(datum/target) . = ..() diff --git a/code/game/objects/items/food/meat.dm b/code/game/objects/items/food/meat.dm index d4cff5baf7c..2bce1d3d662 100644 --- a/code/game/objects/items/food/meat.dm +++ b/code/game/objects/items/food/meat.dm @@ -14,30 +14,34 @@ foodtypes = MEAT w_class = WEIGHT_CLASS_SMALL -/obj/item/food/carpmeat - name = "carp fillet" - desc = "A fillet of spess carp meat." + +/obj/item/food/fishmeat + name = "fish fillet" + desc = "A fillet of some fish meat." icon_state = "fishfillet" - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/toxin/carpotoxin = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 2) bite_consumption = 6 tastes = list("fish" = 1) foodtypes = MEAT eatverbs = list("bite","chew","gnaw","swallow","chomp") w_class = WEIGHT_CLASS_SMALL -/obj/item/food/carpmeat/Initialize() - . = ..() - if(!istype(src, /obj/item/food/carpmeat/imitation)) - AddElement(/datum/element/swabable, CELL_LINE_TABLE_CARP, CELL_VIRUS_TABLE_GENERIC_MOB) +/obj/item/food/fishmeat/carp + name = "carp fillet" + desc = "A fillet of spess carp meat." + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/toxin/carpotoxin = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + /// Cytology category you can swab the meat for. + var/cell_line = CELL_LINE_TABLE_CARP -/obj/item/food/carpmeat/imitation +/obj/item/food/fishmeat/carp/Initialize() + . = ..() + if(cell_line) + AddElement(/datum/element/swabable, cell_line, CELL_VIRUS_TABLE_GENERIC_MOB) + +/obj/item/food/fishmeat/carp/imitation name = "imitation carp fillet" desc = "Almost just like the real thing, kinda." - -/obj/item/food/carpmeat/icantbeliveitsnotcarp - name = "fish fillet" - desc = "A fillet of unspecified fish meat." - food_reagents = list(/datum/reagent/consumable/nutriment/protein = 4, /datum/reagent/consumable/nutriment/vitamin = 2) //No carpotoxin + cell_line = null /obj/item/food/fishfingers name = "fish fingers" diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index 753c712feea..1eb96b31527 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -204,7 +204,7 @@ new /obj/item/food/meat/slab/bear(src) new /obj/item/food/meat/slab/spider(src) new /obj/item/food/spidereggs(src) - new /obj/item/food/carpmeat(src) + new /obj/item/food/fishmeat/carp(src) new /obj/item/food/meat/slab/xeno(src) new /obj/item/food/meat/slab/corgi(src) new /obj/item/food/meatball(src) @@ -214,7 +214,7 @@ /obj/item/storage/box/ingredients/exotic/PopulateContents() for(var/i in 1 to 2) - new /obj/item/food/carpmeat(src) + new /obj/item/food/fishmeat/carp(src) new /obj/item/food/grown/soybeans(src) new /obj/item/food/grown/cabbage(src) new /obj/item/food/grown/chili(src) diff --git a/code/modules/aquarium/aquarium.dm b/code/modules/aquarium/aquarium.dm index 6a4e48b64c1..28b65bcf8eb 100644 --- a/code/modules/aquarium/aquarium.dm +++ b/code/modules/aquarium/aquarium.dm @@ -14,10 +14,12 @@ integrity_failure = 0.3 var/fluid_type = AQUARIUM_FLUID_FRESHWATER - var/fluid_temp = MIN_AQUARIUM_TEMP + var/fluid_temp = DEFAULT_AQUARIUM_TEMP var/min_fluid_temp = MIN_AQUARIUM_TEMP var/max_fluid_temp = MAX_AQUARIUM_TEMP - var/lamp = FALSE + + /// Can fish reproduce in this quarium. + var/allow_breeding = FALSE var/glass_icon_state = "aquarium_glass" var/broken_glass_icon_state = "aquarium_glass_broken" @@ -180,6 +182,7 @@ . = ..() .["fluid_type"] = fluid_type .["temperature"] = fluid_temp + .["allow_breeding"] = allow_breeding var/list/content_data = list() for(var/atom/movable/fish in contents) content_data += list(list("name"=fish.name,"ref"=ref(fish))) @@ -208,6 +211,9 @@ fluid_type = params["fluid"] SEND_SIGNAL(src, COMSIG_AQUARIUM_FLUID_CHANGED, fluid_type) . = TRUE + if("allow_breeding") + allow_breeding = !allow_breeding + . = TRUE if("remove") var/atom/movable/inside = locate(params["ref"]) in contents if(inside) diff --git a/code/modules/aquarium/aquarium_behaviour.dm b/code/modules/aquarium/aquarium_behaviour.dm index eadf21d07f2..560976f961b 100644 --- a/code/modules/aquarium/aquarium_behaviour.dm +++ b/code/modules/aquarium/aquarium_behaviour.dm @@ -1,3 +1,6 @@ +//Fish breeding stops if fish count exceeds this. +#define AQUARIUM_MAX_BREEDING_POPULATION 20 + // Configuration objects defining prop/fish behaviour in the aquarium // These are used as a base for autogenerating the actual instances /datum/aquarium_behaviour @@ -167,8 +170,14 @@ var/random_case_rarity = FISH_RARITY_BASIC /// Fish autogenerated from this behaviour will be processable into this - var/fillet_type = /obj/item/food/carpmeat/icantbeliveitsnotcarp + var/fillet_type = /obj/item/food/fishmeat + /// Won't breed more than this amount in single aquarium. + var/stable_population = 1 + /// Last time new fish was created + var/last_breeding + /// How long it takes to produce new fish + var/breeding_timeout = 2 MINUTES /datum/aquarium_behaviour/fish/on_inserted() . = ..() @@ -178,6 +187,7 @@ parent.current_aquarium.dead_fish += 1 else parent.current_aquarium.alive_fish += 1 + parent.stop_flopping() /datum/aquarium_behaviour/fish/before_removal() . = ..() @@ -185,6 +195,9 @@ parent.current_aquarium.dead_fish -= 1 else parent.current_aquarium.alive_fish -= 1 + //We do not stop processing properties here. We want fish to die outside of aquariums after first insert. We only stop processing in properties.death or destroy + if(!QDELETED(parent) && status != FISH_DEAD) + parent.start_flopping() /datum/aquarium_behaviour/fish/on_fluid_changed() //In case we'll flop to bottom from this or go back to swimming. @@ -229,6 +242,8 @@ health = clamp(health + health_change_per_second * delta_time, 0, initial(health)) if(health <= 0) death() + else if(ready_to_reproduce()) + try_to_reproduce() /datum/aquarium_behaviour/fish/proc/death() STOP_PROCESSING(SSobj, src) @@ -241,8 +256,35 @@ else var/atom/movable/AM = parent.parent AM.visible_message(message) + parent.stop_flopping() update_animation() +/datum/aquarium_behaviour/fish/proc/ready_to_reproduce() + return parent.current_aquarium && parent.current_aquarium.allow_breeding && health == initial(health) && stable_population > 1 && world.time - last_breeding >= breeding_timeout + +/datum/aquarium_behaviour/fish/proc/try_to_reproduce() + if(!parent.current_aquarium) + return + if(parent.current_aquarium.alive_fish + parent.current_aquarium.dead_fish >= AQUARIUM_MAX_BREEDING_POPULATION) //so aquariums full of fish don't need to do these expensive checks + return + var/list/other_fish_of_same_type = list() + for(var/atom/movable/fish_or_prop in parent.current_aquarium) + if(fish_or_prop == parent.parent) + continue + var/datum/component/aquarium_content/other_content = fish_or_prop.GetComponent(/datum/component/aquarium_content) + if(other_content && other_content.properties.type == type) + other_fish_of_same_type += other_content.properties + if(length(other_fish_of_same_type) >= stable_population) + return + var/datum/aquarium_behaviour/fish/second_fish + for(var/datum/aquarium_behaviour/fish/other_fish in other_fish_of_same_type) + if(other_fish.ready_to_reproduce()) + second_fish = other_fish + break + if(second_fish) + generate_fish(parent.current_aquarium,type) + last_breeding = world.time + second_fish.last_breeding = world.time /// This path exists mostly for admin abuse. /datum/aquarium_behaviour/fish/auto @@ -257,3 +299,6 @@ holder.appearance = parent.parent holder.transform = base_transform() holder.dir = WEST + + +#undef AQUARIUM_MAX_BREEDING_POPULATION diff --git a/code/modules/aquarium/fish.dm b/code/modules/aquarium/fish.dm index b37e7ff30e7..fd0774009d8 100644 --- a/code/modules/aquarium/fish.dm +++ b/code/modules/aquarium/fish.dm @@ -7,7 +7,7 @@ /// Automatically generates object of given base path from the behaviour type in loc /proc/generate_fish(loc,behaviour_type,base_path=/obj/item/fish) var/datum/aquarium_behaviour/behaviour = behaviour_type - var/obj/item/fish = new /obj/item/fish(loc) + var/obj/item/fish = new base_path(loc) fish.name = initial(behaviour.name) fish.icon = initial(behaviour.icon) fish.icon_state = initial(behaviour.icon_state) @@ -50,6 +50,8 @@ sprite_width = 8 sprite_height = 8 + stable_population = 3 + /datum/aquarium_behaviour/fish/angelfish name = "angelfish" desc = "Young Angelfish often live in groups, while adults prefer solitary life. They become territorial and aggressive toward other fish when they reach adulthood." @@ -58,6 +60,8 @@ sprite_height = 7 source_height = 7 + stable_population = 3 + /datum/aquarium_behaviour/fish/guppy name = "guppy" desc = "Guppy is also known as rainbow fish because of the brightly colored body and fins." @@ -67,6 +71,8 @@ sprite_width = 8 sprite_height = 5 + stable_population = 6 + /datum/aquarium_behaviour/fish/plasmatetra name = "plasma tetra" desc = "Due to their small size, tetras are prey to many predators in their watery world, including eels, crustaceans, and invertebrates." @@ -74,6 +80,8 @@ dedicated_in_aquarium_icon_state = "fish_greyscale" aquarium_vc_color = "#D30EB0" + stable_population = 3 + /datum/aquarium_behaviour/fish/catfish name = "cory catfish" desc = "A catfish has about 100,000 taste buds, and their bodies are covered with them to help detect chemicals present in the water and also to respond to touch." @@ -81,6 +89,8 @@ dedicated_in_aquarium_icon_state = "fish_greyscale" aquarium_vc_color = "#907420" + stable_population = 3 + /datum/aquarium_behaviour/fish/spacecarp name = "space carp" desc = "This space predator fish is known to cause yearly damage to space stations during their migrations." @@ -100,6 +110,8 @@ sprite_width = 8 sprite_height = 5 + stable_population = 4 + /datum/aquarium_behaviour/fish/cardinal name = "cardinalfish" desc = "Cardinalfish are often found near sea urchins, where the fish hide when threatened." @@ -107,6 +119,8 @@ dedicated_in_aquarium_icon_state = "fish_greyscale" required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 4 + /datum/aquarium_behaviour/fish/greenchromis name = "green chromis" desc = "The Chromis can vary in color from blue to green depending on the lighting and distance from the lights." @@ -115,6 +129,8 @@ aquarium_vc_color = "#00ff00" required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 5 + /datum/aquarium_behaviour/fish/firefish name = "firefish goby" desc = "To communicate in the wild, the firefish uses its dorsal fin to alert others of potential danger." @@ -123,6 +139,8 @@ sprite_height = 5 required_fluid_type = AQUARIUM_FLUID_SALTWATER + stable_population = 3 + /datum/aquarium_behaviour/fish/pufferfish name = "pufferfish" desc = "One Pufferfish contains enough toxins in its liver to kill 30 people." @@ -131,6 +149,8 @@ sprite_width = 8 sprite_height = 8 + stable_population = 3 + /datum/aquarium_behaviour/fish/lanternfish name = "lanternfish" desc = "Typically found in areas below 6600 feet below the surface of the ocean, they live in complete darkness." @@ -141,3 +161,5 @@ source_height = 21 sprite_width = 8 sprite_height = 8 + + stable_population = 3 diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 9f3933983ae..d7cd2483879 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1691,7 +1691,7 @@ /obj/item/food/meat/rawbacon, /obj/item/food/meat/slab/penguin, /obj/item/food/spiderleg, - /obj/item/food/carpmeat, + /obj/item/food/fishmeat/carp, /obj/item/food/meat/slab/human) crate_name = "food crate" diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index 92f80a38443..de0b313a3fb 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -101,7 +101,7 @@ /datum/chemical_reaction/imitationcarpmeat/on_reaction(datum/reagents/holder) var/location = get_turf(holder.my_atom) - new /obj/item/food/carpmeat/imitation(location) + new /obj/item/food/fishmeat/carp/imitation(location) if(holder?.my_atom) qdel(holder.my_atom) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm index 1f44145e14e..d938013b713 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm @@ -75,7 +75,7 @@ /datum/crafting_recipe/food/fishburger name = "Fish burger" reqs = list( - /obj/item/food/carpmeat = 1, + /obj/item/food/fishmeat = 1, /obj/item/food/bun = 1, /obj/item/food/cheesewedge = 1 ) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm index 5d6796c51a4..46301087907 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -57,7 +57,7 @@ reqs = list( /datum/reagent/consumable/flour = 5, /obj/item/food/grown/chili = 1, - /obj/item/food/carpmeat = 1 + /obj/item/food/fishmeat/carp = 1 ) result = /obj/item/food/cubancarp subcategory = CAT_MEAT @@ -66,7 +66,7 @@ name = "Fish and chips" reqs = list( /obj/item/food/fries = 1, - /obj/item/food/carpmeat = 1 + /obj/item/food/fishmeat = 1 ) result = /obj/item/food/fishandchips subcategory = CAT_MEAT @@ -76,7 +76,7 @@ reqs = list( /datum/reagent/consumable/flour = 5, /obj/item/food/bun = 1, - /obj/item/food/carpmeat = 1 + /obj/item/food/fishmeat = 1 ) result = /obj/item/food/fishfingers subcategory = CAT_MEAT @@ -86,7 +86,7 @@ reqs = list( /obj/item/food/grown/corn = 1, /obj/item/food/grown/peas = 1, - /obj/item/food/carpmeat = 1 + /obj/item/food/fishmeat = 1 ) result = /obj/item/food/fishfry subcategory = CAT_MEAT @@ -96,7 +96,7 @@ reqs = list( /datum/reagent/consumable/soysauce = 5, /obj/item/food/spidereggs = 1, - /obj/item/food/carpmeat = 1 + /obj/item/food/fishmeat = 1 ) result = /obj/item/food/sashimi subcategory = CAT_MEAT diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index adf79b52680..6cfff98ab3c 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -11,7 +11,7 @@ mob_biotypes = MOB_ORGANIC|MOB_BEAST speak_chance = 0 turns_per_move = 5 - butcher_results = list(/obj/item/food/carpmeat = 2) + butcher_results = list(/obj/item/food/fishmeat/carp = 2) response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" diff --git a/modular_skyrat/modules/cargo/code/packs.dm b/modular_skyrat/modules/cargo/code/packs.dm index e2e80afe017..b2ca8f072e2 100644 --- a/modular_skyrat/modules/cargo/code/packs.dm +++ b/modular_skyrat/modules/cargo/code/packs.dm @@ -276,10 +276,10 @@ /obj/item/food/meat/slab/meatproduct, /obj/item/food/meat/slab/meatproduct, /obj/item/food/meat/slab/meatproduct, - /obj/item/food/carpmeat/imitation, - /obj/item/food/carpmeat/imitation, - /obj/item/food/carpmeat/imitation, - /obj/item/food/carpmeat/imitation) + /obj/item/food/fishmeat/carp/imitation, + /obj/item/food/fishmeat/carp/imitation, + /obj/item/food/fishmeat/carp/imitation, + /obj/item/food/fishmeat/carp/imitation) crate_name = "meaty crate" crate_type = /obj/structure/closet/crate/freezer diff --git a/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm b/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm index 277ac9a574d..c131d8313e7 100644 --- a/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm +++ b/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm @@ -132,7 +132,7 @@ new /obj/item/food/meat/rawbacon(src) new /obj/item/food/meat/slab/penguin(src) new /obj/item/food/spiderleg(src) - new /obj/item/food/carpmeat(src) + new /obj/item/food/fishmeat/carp(src) new /obj/item/food/meat/slab/human(src) /obj/structure/closet/crate/secure/tradership_cargo_valuable diff --git a/tgui/packages/tgui/interfaces/Aquarium.js b/tgui/packages/tgui/interfaces/Aquarium.js index 87b8ca68dce..9b1680a145f 100644 --- a/tgui/packages/tgui/interfaces/Aquarium.js +++ b/tgui/packages/tgui/interfaces/Aquarium.js @@ -1,5 +1,5 @@ import { useBackend } from '../backend'; -import { Button, Dropdown, Knob, LabeledControls, Section } from '../components'; +import { Button, Dropdown, Flex, Knob, LabeledControls, Section } from '../components'; import { Window } from '../layouts'; export const Aquarium = (props, context) => { @@ -11,10 +11,11 @@ export const Aquarium = (props, context) => { maxTemperature, fluidTypes, contents, + allow_breeding, } = data; return ( @@ -35,13 +36,23 @@ export const Aquarium = (props, context) => { })} /> - {fluidTypes.map(f => ( -