diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index a492acf92af..f7e3bcbaf47 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -105,6 +105,7 @@ #define CELL_LINE_TABLE_SNAKE "cell_line_snake_table" #define CELL_LINE_TABLE_VATBEAST "cell_line_vatbeast_table" #define CELL_LINE_TABLE_NETHER "cell_line_nether_table" +#define CELL_LINE_TABLE_GLUTTON "cell_line_glutton_table" //! All cell virus types #define CELL_VIRUS_TABLE_GENERIC "cell_virus_generic_table" diff --git a/code/_globalvars/lists/xenobiology.dm b/code/_globalvars/lists/xenobiology.dm index 49fd7be9405..656837e1b1e 100644 --- a/code/_globalvars/lists/xenobiology.dm +++ b/code/_globalvars/lists/xenobiology.dm @@ -25,8 +25,10 @@ GLOBAL_LIST_INIT_TYPED(cell_line_tables, /list, list( CELL_LINE_TABLE_SNAKE = list(/datum/micro_organism/cell_line/snake = 1), CELL_LINE_TABLE_VATBEAST = list(/datum/micro_organism/cell_line/vat_beast = 1), CELL_LINE_TABLE_NETHER = list(/datum/micro_organism/cell_line/netherworld = 1)/*, - CELL_LINE_TABLE_CLOWN = list(/datum/micro_organism/cell_line/clown/bananaclown = 1, /datum/micro_organism/cell_line/clown/fleshclown = 1, /datum/micro_organism/cell_line/clown/longclown = 1)*/ - )) //SKYRAT EDIT CHANGE - removed clown stuff + CELL_LINE_TABLE_CLOWN = list(/datum/micro_organism/cell_line/clown/bananaclown = 1, /datum/micro_organism/cell_line/clown/glutton = 1, /datum/micro_organism/cell_line/clown/longclown = 1), + CELL_LINE_TABLE_GLUTTON = list(/datum/micro_organism/cell_line/clown/glutton = 1) + */ + )) //SKYRAT EDIT REMOVAL - removed clown stuff - Skyrat-SS13/Skyrat-tg#2405 ///Assoc list of cell virus define | assoc list of datum | cell_virus GLOBAL_LIST_INIT(cell_virus_tables, list( diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm index 6c9ca46ef59..02528ee8158 100644 --- a/code/game/objects/items/grenades/spawnergrenade.dm +++ b/code/game/objects/items/grenades/spawnergrenade.dm @@ -52,7 +52,7 @@ desc = "A sleek device often given to clowns on their 10th birthdays for protection. You can hear faint scratching coming from within." icon_state = "clown_ball" inhand_icon_state = "clown_ball" - spawner_type = list(/mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube) + spawner_type = list(/mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube) deliveryamt = 1 /obj/item/grenade/spawnergrenade/clown_broken diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index 06b19db1bf5..370f765167c 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -53,7 +53,7 @@ max_integrity = 200 max_mobs = 15 spawn_time = 150 - mob_types = list(/mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube) + mob_types = list(/mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube) spawn_text = "climbs out of" faction = list("clown") diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index f653821d4a1..12cdda9cf32 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -299,21 +299,158 @@ speed = 20 move_to_delay = 60 -/mob/living/simple_animal/hostile/retaliate/clown/mutant/blob - name = "Something that was once a clown" - desc = "A grotesque bulging figure far mutated from it's original state." - icon_state = "blob" - icon_living = "blob" +/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton + name = "banana glutton" + desc = "Something that was once a clown" + icon_state = "glutton" + icon_living = "glutton" speak = list("hey, buddy", "HONK!!!", "H-h-h-H-HOOOOONK!!!!", "HONKHONKHONK!!!", "HEY, BUCKO, GET BACK HERE!!!", "HOOOOOOOONK!!!") emote_see = list("jiggles", "wobbles") - health = 130 + health = 200 mob_size = MOB_SIZE_LARGE - speed = 20 - attack_verb_continuous = "bounces off of" - attack_verb_simple = "bounce off of" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) - attack_reagent = /datum/reagent/toxin/mindbreaker + speed = 1 + melee_damage_lower = 10 + melee_damage_upper = 15 + force_threshold = 10 //lots of fat to cushion blows. + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 2, STAMINA = 0, OXY = 1) + attack_verb_continuous = "slams" + attack_verb_simple = "slam" + loot = list(/obj/effect/gibspawner/xeno/bodypartless, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless) + deathsound = 'sound/misc/sadtrombone.ogg' + food_type = list(/obj/item/food/cheesiehonkers, /obj/item/food/cornchips) + tame_chance = 30 + ///This is the list of items we are ready to regurgitate, + var/list/prank_pouch = list() + ///This ability lets you fire a single random item from your pouch. + var/obj/effect/proc_holder/regurgitate/my_regurgitate + +/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/Initialize() + . = ..() + my_regurgitate = new + AddAbility(my_regurgitate) + add_cell_sample() + +/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/attacked_by(obj/item/I, mob/living/user) + if(!check_edible(I)) + return ..() + eat_atom(I) + +/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/AttackingTarget(atom/attacked_target) + if(!check_edible(attacked_target)) + return ..() + eat_atom(attacked_target) + +/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/UnarmedAttack(atom/A) + if(!check_edible(A)) + return ..() + eat_atom(A) + +///Returns whether or not the supplied movable atom is edible. +/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/proc/check_edible(atom/movable/potential_food) + if(isliving(potential_food)) + var/mob/living/living_morsel = potential_food + if(living_morsel.mob_size > MOB_SIZE_SMALL) + return FALSE + else + return TRUE + + if(IS_EDIBLE(potential_food)) + if(prank_pouch.len >= 8) + to_chat(src, "Your prank pouch is filled to the brim! You don't think you can swallow any more morsels right now.") + return FALSE + return TRUE + +///This proc eats the atom, certain funny items are stored directly in the prank pouch while bananas grant a heal based on their potency and the peels are retained in the pouch. +/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/proc/eat_atom(atom/movable/eaten_atom) + + var/static/funny_items = list(/obj/item/food/pie/cream, + /obj/item/food/grown/tomato, + /obj/item/food/meatclown) + + visible_message("You eat [eaten_atom].") + if(is_type_in_list(eaten_atom, funny_items)) + eaten_atom.forceMove(src) + prank_pouch += eaten_atom + + else if(istype(eaten_atom, /obj/item/food/grown/banana)) + var/obj/item/food/grown/banana/banana_morsel = eaten_atom + adjustBruteLoss(-banana_morsel.seed.potency * 0.25) + prank_pouch += banana_morsel.generate_trash(src) + qdel(eaten_atom) + else + qdel(eaten_atom) + playsound(loc,'sound/items/eatfood.ogg', rand(30,50), TRUE) + flick("glutton_mouth", src) + +/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/tamed() + . = ..() + can_buckle = TRUE + buckle_lying = 0 + var/datum/component/riding/riding = LoadComponent(/datum/component/riding) + riding.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 24), TEXT_SOUTH = list(0, 24), TEXT_EAST = list(-16, 24), TEXT_WEST = list(16, 24))) + riding.set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER) + riding.set_vehicle_dir_layer(NORTH, OBJ_LAYER) + riding.set_vehicle_dir_layer(EAST, ABOVE_MOB_LAYER) + riding.set_vehicle_dir_layer(WEST, ABOVE_MOB_LAYER) + + //these 0 offsets are needed for the riding component to work properly with base pixel offset mobs for some cursed reason. + riding.set_vehicle_dir_offsets(SOUTH, 0, 0) + riding.set_vehicle_dir_offsets(NORTH, 0, 0) + riding.set_vehicle_dir_offsets(EAST, 0, 0) + riding.set_vehicle_dir_offsets(WEST, 0, 0) + +/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/add_cell_sample() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_GLUTTON, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + +/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/Exited(atom/movable/AM, atom/newLoc) + . = ..() + prank_pouch -= AM + +///This ability will let you fire one random item from your pouch, +/obj/effect/proc_holder/regurgitate + name = "Regurgitate" + desc = "Regurgitates a single item from the depths of your pouch." + action_background_icon_state = "bg_changeling" + action_icon = 'icons/mob/actions/actions_animal.dmi' + action_icon_state = "regurgitate" + active = FALSE + +/obj/effect/proc_holder/regurgitate/Click(location, control, params) + . = ..() + if(!isliving(usr)) + return TRUE + var/mob/living/user = usr + fire(user) + +/obj/effect/proc_holder/regurgitate/fire(mob/living/carbon/user) + if(active) + user.icon_state = initial(user.icon_state) + remove_ranged_ability("Your throat muscles relax.") + else + user.icon_state = "glutton_tongue" + add_ranged_ability(user, "Your throat muscles tense up. Left-click to regurgitate a funny morsel!", TRUE) + +/obj/effect/proc_holder/regurgitate/InterceptClickOn(mob/living/caller, params, atom/target) + . = ..() + + if(.) + return + + if(!istype(ranged_ability_user, /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton) || ranged_ability_user.stat) + remove_ranged_ability() + return + + var/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/pouch_owner = ranged_ability_user + if(!pouch_owner.prank_pouch.len) + //active = FALSE + pouch_owner.icon_state = "glutton" + remove_ranged_ability("Your prank pouch is empty,.") + return + + var/obj/item/projected_morsel = pick(pouch_owner.prank_pouch) + projected_morsel.forceMove(pouch_owner.loc) + projected_morsel.throw_at(target, 8, 2, pouch_owner) + flick("glutton_mouth", pouch_owner) + playsound(pouch_owner, 'sound/misc/soggy.ogg', 75) + -/mob/living/simple_animal/hostile/retaliate/clown/mutant/blob/slow - speed = 50 - move_to_delay = 120 diff --git a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm index 920239161b5..cdd2dfdb48f 100644 --- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm +++ b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm @@ -418,31 +418,82 @@ vat.visible_message("The biological sample in [vat] seems to have created something horrific!") QDEL_NULL(vat.biological_sample) //Kill off the sample, we're done - var/mob/selected_mob = pick(list(/mob/living/simple_animal/hostile/retaliate/clown/mutant/slow, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob/slow)) + var/mob/selected_mob = pick(list(/mob/living/simple_animal/hostile/retaliate/clown/mutant/slow, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown)) new selected_mob(get_turf(vat)) /datum/micro_organism/cell_line/clown/bananaclown desc = "Clown bits with banana chunks" - required_reagents = list(/datum/reagent/consumable/banana) - supplementary_reagents = list(/datum/reagent/medicine/coagulant/banana_peel = 4) + required_reagents = list( + /datum/reagent/consumable/nutriment/protein, + /datum/reagent/consumable/banana) + + supplementary_reagents = list( + /datum/reagent/saltpetre = 4, + /datum/reagent/ammonia = 3, + /datum/reagent/carbondioxide = 3, + /datum/reagent/medicine/coagulant/banana_peel = 2, + /datum/reagent/plantnutriment/robustharvestnutriment = 1) + + suppressive_reagents = list( + /datum/reagent/consumable/clownstears = -8, + /datum/reagent/toxin/plantbgone = -4, + /datum/reagent/consumable/ethanol/silencer = -3, + /datum/reagent/consumable/nothing = -2, + /datum/reagent/fuel/oil = -1) + resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/banana = 1) -/datum/micro_organism/cell_line/clown/fleshclown - desc = "Overly fleshy clown bits" +/datum/micro_organism/cell_line/clown/glutton + desc = "hyperadipogenic clown stem cells" - required_reagents = list(/datum/reagent/consumable/banana) - supplementary_reagents = list(/datum/reagent/consumable/nutriment/protein = 4) + required_reagents = list( + /datum/reagent/consumable/nutriment/protein, + /datum/reagent/consumable/banana, + /datum/reagent/medicine/c2/synthflesh) + //r/chonkers + supplementary_reagents = list( + /datum/reagent/consumable/vanillapudding = 8, + /datum/reagent/growthserum = 6, + /datum/reagent/consumable/nutriment/peptides = 4, + /datum/reagent/consumable/cornoil = 3, + /datum/reagent/consumable/cooking_oil = 1, + /datum/reagent/consumable/space_cola = 1) - resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/fleshclown = 1) + suppressive_reagents = list( + /datum/reagent/consumable/clownstears = -8, + /datum/reagent/toxin/minttoxin = -6, + /datum/reagent/consumable/ethanol/silencer = -3, + /datum/reagent/consumable/ethanol/fernet = -3, + /datum/reagent/toxin/lipolicide = -3, + /datum/reagent/consumable/nothing = -2, + /datum/reagent/toxin/bad_food = -1) + + + resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton = 1) /datum/micro_organism/cell_line/clown/longclown desc = "long clown bits" - required_reagents = list(/datum/reagent/consumable/banana) - supplementary_reagents = list(/datum/reagent/consumable/laughter = 4) + required_reagents = list( + /datum/reagent/consumable/nutriment/protein, + /datum/reagent/consumable/banana) + + supplementary_reagents = list( + /datum/reagent/drug/happiness = 5, + /datum/reagent/toxin/mimesbane = 4, + /datum/reagent/consumable/laughter = 3, + /datum/reagent/nitrous_oxide = 2) + + suppressive_reagents = list( + /datum/reagent/consumable/clownstears = -8, + /datum/reagent/consumable/ethanol/beepsky_smash = -3, + /datum/reagent/consumable/ethanol/silencer = -3, + /datum/reagent/toxin/mutetoxin = -3, + /datum/reagent/consumable/nothing = -2, + /datum/reagent/sulfur = -1) resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/longface = 1) */ diff --git a/icons/mob/actions/actions_animal.dmi b/icons/mob/actions/actions_animal.dmi index cc8fe36c05a..0b139f2ae62 100644 Binary files a/icons/mob/actions/actions_animal.dmi and b/icons/mob/actions/actions_animal.dmi differ diff --git a/icons/mob/clown_mobs.dmi b/icons/mob/clown_mobs.dmi index 803a99cd7ae..d40519980d0 100644 Binary files a/icons/mob/clown_mobs.dmi and b/icons/mob/clown_mobs.dmi differ