Online schizophrenia: The 1 throwforcening (#7941)

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
Reo Lozzot
2024-04-01 02:44:34 -05:00
committed by GitHub
parent 2e8b280dd7
commit c481f415fa
13 changed files with 289 additions and 33 deletions

View File

@@ -107,6 +107,10 @@
M.update_wing_showing() M.update_wing_showing()
M.real_name = generateCorpseName() M.real_name = generateCorpseName()
M.set_stat(DEAD) //Kills the new mob M.set_stat(DEAD) //Kills the new mob
//CHOMPAdd: Corpses drop bones when melted and are easier to eat
M.digest_leave_remains = TRUE
M.can_be_drop_prey = TRUE
//CHOMPAdd End
if(corpsesynthtype > 0) if(corpsesynthtype > 0)
if(!corpsesynthbrand) if(!corpsesynthbrand)
corpsesynthbrand = "Unbranded" corpsesynthbrand = "Unbranded"

View File

@@ -37,8 +37,8 @@
buckle_lying = FALSE buckle_lying = FALSE
vore_icons = SA_ICON_LIVING vore_icons = SA_ICON_LIVING
vore_bump_chance = 50 vore_bump_chance = 50
vore_digest_chance = 0 //vore_digest_chance = 0 // Im setting these two in the individual bellies, I dont know how they interact with multiple
vore_escape_chance = 50 //vore_escape_chance = 50 // bellies so im just commenting them out. -Reo
vore_pounce_chance = 100 vore_pounce_chance = 100
vore_active = 1 vore_active = 1
vore_icons = 5 vore_icons = 5
@@ -87,12 +87,14 @@
if(!voremob_loaded) if(!voremob_loaded)
return return
.=..() .=..()
var/obj/belly/B = vore_selected var/obj/belly/B = new /obj/belly(src)
B.affects_vore_sprites = TRUE
B.belly_sprite_to_affect = "stomach"
B.name = "stomach" B.name = "stomach"
B.desc = "The leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, dark gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you with unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~" B.desc = "The leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, dark gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you with unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~"
B.vore_sound = "Tauric Swallow" B.vore_sound = "Tauric Swallow"
B.release_sound = "Pred Escape" B.release_sound = "Pred Escape"
B.mode_flags = DM_FLAG_NUMBING B.mode_flags = DM_FLAG_NUMBING | DM_FLAG_THICKBELLY | DM_FLAG_TURBOMODE
B.fancy_vore = 1 B.fancy_vore = 1
B.vore_verb = "slurp" B.vore_verb = "slurp"
B.contamination_color = "grey" B.contamination_color = "grey"
@@ -115,6 +117,30 @@
"The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!", "The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!",
"The drake happily wanders around while digesting its meal, almost like it is trying to show off the hanging gut you've given it. Not like it made much of a difference on his already borderline obese form anyway~") "The drake happily wanders around while digesting its meal, almost like it is trying to show off the hanging gut you've given it. Not like it made much of a difference on his already borderline obese form anyway~")
B = new /obj/belly(src)
vore_selected = B
B.name = "maw"
B.desc = "Slrrrrrp... You get snatched up by the Exotic Leopardmander's large tongue, resulting in you getting dragged into the humid, dank interior of the large drake's cavernous mouth!"
//Not going to change the default sounds. Personally I think the non-fancy sounds work good as enterance nom sounds and the fancy ones are better for transfer sounds. -Reo
B.digest_mode = DM_HEAL
B.vore_verb = "slurp"
B.release_verb = "plehs"
B.contaminates = FALSE
B.belly_fullscreen_color = "#c47cb4"
B.belly_fullscreen_color2 = "#C2B4B4"
B.belly_fullscreen_color3 = "#FFCCFF"
B.belly_fullscreen = "VBO_maw5"
B.emote_time = 1 //Short emote time, since they wont spend long here!
B.emote_lists[DM_HOLD] = list(
"The drake's thick tongue presses against your form, smothering you with thick, gooey saliva as it pushes you around in it's maw.",
"The exotic drake lets out a deep rumble as it idly maws over you, shifting you in a warm, slimy embrace as it passively prepares to send you into a deeper embrace."
)
B.autotransferwait = 5
B.autotransferlocation = "stomach"
B.escapetime = 1 SECONDS
B.escapechance = 75
/datum/say_list/leopardmander /datum/say_list/leopardmander
speak = list("Prurr.", "Rrrhf.", "Rrrrrll.", "Mrrrrph.") speak = list("Prurr.", "Rrrhf.", "Rrrrrll.", "Mrrrrph.")
emote_hear = list("chuffs", "murrs", "churls", "hisses", "rrrrrls", "yawns that big ol' maw open.") emote_hear = list("chuffs", "murrs", "churls", "hisses", "rrrrrls", "yawns that big ol' maw open.")
@@ -159,18 +185,19 @@
/mob/living/simple_mob/vore/leopardmander/exotic/init_vore() /mob/living/simple_mob/vore/leopardmander/exotic/init_vore()
if(!voremob_loaded) if(!voremob_loaded)
return return
.=..() //.=..() //Dont need this, it just spawns the parent's guts
var/obj/belly/B = vore_selected var/obj/belly/B = new /obj/belly(src)
B.name = "stomach" B.name = "stomach"
B.desc = "The exotic leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, brightly glowing gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you, with their unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~ You can only really sort of see outside that thick-walled gut." B.desc = "The exotic leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, brightly glowing gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you, with their unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~ You can only really sort of see outside that thick-walled gut."
B.vore_sound = "Tauric Swallow" B.vore_sound = "Tauric Swallow"
B.release_sound = "Pred Escape" B.release_sound = "Pred Escape"
B.mode_flags = DM_FLAG_NUMBING B.mode_flags = DM_FLAG_NUMBING | DM_FLAG_THICKBELLY | DM_FLAG_TURBOMODE
B.fancy_vore = 1 B.fancy_vore = 1
B.vore_verb = "slurp" B.vore_verb = "slurp"
B.contamination_color = "pink" B.contamination_color = "pink"
B.contamination_flavor = "Wet" B.contamination_flavor = "Wet"
B.belly_fullscreen_color = "#c47cb4" // CHOMPedit - Belly Fullscreen B.belly_fullscreen_color = "#df3dbc" // CHOMPedit - Belly Fullscreen
B.belly_fullscreen_alpha = 240 // CHOMPedit - Belly transparency on the transparent bellied drake
B.belly_fullscreen = "anim_belly" // CHOMPedit - Belly Fullscreen B.belly_fullscreen = "anim_belly" // CHOMPedit - Belly Fullscreen
B.emote_lists[DM_HEAL] = list( B.emote_lists[DM_HEAL] = list(
"The drake's idle movement helps its stomach gently churn around you, slimily squelching against your figure.", "The drake's idle movement helps its stomach gently churn around you, slimily squelching against your figure.",
@@ -187,6 +214,32 @@
"As the thinning air begins to make you feel dizzy, menacing bworps and grumbles fill that dark, constantly shifting organ!", "As the thinning air begins to make you feel dizzy, menacing bworps and grumbles fill that dark, constantly shifting organ!",
"The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!", "The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!",
"The drake happily wanders around while digesting its meal, almost like it is trying to show off the hanging gut you've given it. Not like it made much of a difference on his already borderline obese form anyway~") "The drake happily wanders around while digesting its meal, almost like it is trying to show off the hanging gut you've given it. Not like it made much of a difference on his already borderline obese form anyway~")
B.transferchance = 50
B.transferlocation = "maw"
B = new /obj/belly(src)
vore_selected = B
B.name = "maw"
B.desc = "Slrrrrrp... You get snatched up by the Exotic Leopardmander's large tongue, resulting in you getting dragged into the humid, dank interior of the large drake's cavernous mouth!"
//Not going to change the default sounds. Personally I think the non-fancy sounds work good as enterance nom sounds and the fancy ones are better for transfer sounds. -Reo
B.vore_verb = "slurp"
B.release_verb = "plehs"
B.contaminates = FALSE
B.belly_fullscreen_color = "#c47cb4"
B.belly_fullscreen_color2 = "#C2B4B4"
B.belly_fullscreen_color3 = "#8D60CE"
B.belly_fullscreen_color4 = "#B593F9"
B.belly_fullscreen = "VBO_maw5"
B.emote_time = 1 //Short emote time, since they wont spend long here!
B.emote_lists[DM_HOLD] = list(
"The drake's thick tongue presses against your form, smothering you with thick, gooey saliva as it pushes you around in it's maw.",
"The exotic drake lets out a deep rumble as it idly maws over you, shifting you in a warm, slimy embrace as it passively prepares to send you into a deeper embrace."
)
B.autotransferwait = 5
B.autotransferlocation = "stomach"
B.escapetime = 1 SECONDS
B.escapechance = 75
/obj/random/mob/leopardmander/item_to_spawn() //Random map spawner /obj/random/mob/leopardmander/item_to_spawn() //Random map spawner
return pick(prob(89);/mob/living/simple_mob/vore/leopardmander, return pick(prob(89);/mob/living/simple_mob/vore/leopardmander,

View File

@@ -532,14 +532,23 @@
/obj/machinery/disposal/hitby(atom/movable/AM) /obj/machinery/disposal/hitby(atom/movable/AM)
. = ..() . = ..()
if(istype(AM, /obj/item) && !istype(AM, /obj/item/projectile)) //CHOMPEdit: fixes thrown disposal dunking with mobs~ - Reo
if((istype(AM, /obj/item) || istype(AM, /mob/living)) && !istype(AM, /obj/item/projectile))
if(prob(75)) if(prob(75))
if(istype(AM, /obj/item/weapon/holder/micro))
log_and_message_admins("[AM] was thrown into \the [src]")
AM.forceMove(src) AM.forceMove(src)
visible_message("\The [AM] lands in \the [src].") if(istype(AM, /obj/item/weapon/holder/micro) || istype(AM, /mob/living))
log_and_message_admins("[AM] was thrown into \the [src]")
visible_message("\The [AM] lands in \the [src]!")
//flush() //Away they go! //Uncomment this for proper autoflush. Compromising with autopull to avoid possible disposal dunking abuse
//flush = 1 //1984. No autoflush, no autopull. Leaving this here incase someone wants to revisit this in the future when the mood on this changes
else
visible_message("\The [AM] lands in \the [src].")
update_icon() //Yogs did this, so it probably doesnt hurt..
else else
visible_message("\The [AM] bounces off of \the [src]'s rim!") visible_message("\The [AM] bounces off of \the [src]'s rim!")
return ..() //...Yogs also did this! it's probably good to stop it from flying after clonking the thing. Also prevents trying to insert the mob repeatedly due to it the throw not ending.
return ..()
//CHOMPEdit End.
/obj/machinery/disposal/CanPass(atom/movable/mover, turf/target) /obj/machinery/disposal/CanPass(atom/movable/mover, turf/target)
if(istype(mover, /obj/item/projectile)) if(istype(mover, /obj/item/projectile))
@@ -737,12 +746,15 @@
return return
var/mob/living/U = user var/mob/living/U = user
/* CHOMPEdit: Clong, clong baby.
if (U.stat || U.last_special <= world.time) if (U.stat || U.last_special <= world.time)
return return
U.last_special = world.time+100 U.last_special = world.time+100
*/
if(U.stat)
return
//CHOMPEdit End.
if (src.loc) if (src.loc)
for (var/mob/M in hearers(src.loc.loc)) for (var/mob/M in hearers(src.loc.loc))
to_chat(M, "<FONT size=[max(0, 5 - get_dist(src, M))]>CLONG, clong!</FONT>") to_chat(M, "<FONT size=[max(0, 5 - get_dist(src, M))]>CLONG, clong!</FONT>")

View File

@@ -411,6 +411,22 @@
M.loc = src M.loc = src
src.flush() src.flush()
//Chompadd: Autocatch for stuff being thrown into disposal chutes..
/obj/machinery/disposal/deliveryChute/hitby(atom/movable/AM)
if((istype(AM, /obj/item) || istype(AM, /mob/living)) && !istype(AM, /obj/item/projectile))
switch(dir)
if(NORTH)
if(AM.loc.y != src.loc.y+1) return ..()
if(EAST)
if(AM.loc.x != src.loc.x+1) return ..()
if(SOUTH)
if(AM.loc.y != src.loc.y-1) return ..()
if(WEST)
if(AM.loc.x != src.loc.x-1) return ..()
AM.forceMove(src)
src.flush()
//Chompadd end
/obj/machinery/disposal/deliveryChute/flush() /obj/machinery/disposal/deliveryChute/flush()
flushing = 1 flushing = 1
flick("intake-closing", src) flick("intake-closing", src)

View File

@@ -140,6 +140,13 @@
reagents.trans_to_holder(H.ingested, (reagents.total_volume), B.nutrition_percent / 100, 0) reagents.trans_to_holder(H.ingested, (reagents.total_volume), B.nutrition_percent / 100, 0)
else if(isliving(B.owner)) else if(isliving(B.owner))
B.owner.nutrition += 15 * w_class * B.nutrition_percent / 100 B.owner.nutrition += 15 * w_class * B.nutrition_percent / 100
if(istype(src,/obj/item/weapon/reagent_containers/food/snacks))
var/obj/item/weapon/reagent_containers/food/snacks/goodmeal = src //What a typecast
//Drop the leftover garbage when the food melts
if(goodmeal.package_trash)
new goodmeal.package_trash(src)
if(goodmeal.trash)
new goodmeal.trash(src)
if(B.item_digest_logs) if(B.item_digest_logs)
to_chat(B.owner,"<span class='notice'>[src] was digested inside your [lowertext(B.name)].</span>") to_chat(B.owner,"<span class='notice'>[src] was digested inside your [lowertext(B.name)].</span>")
qdel(src)//CHOMPEdit End qdel(src)//CHOMPEdit End

View File

@@ -36,9 +36,12 @@
if(vac_owner && user != vac_owner) if(vac_owner && user != vac_owner)
to_chat(user, "<span class='warning'>Only designated owner can change this setting.</span>") to_chat(user, "<span class='warning'>Only designated owner can change this setting.</span>")
return return
var/set_output = tgui_input_list(user, "Set your vacuum attachment's connection port", "Vac Settings", list("Vore Belly", "Borg Belly", "Trash Bag")) var/vac_options = list("Vore Belly", "Trash Bag") //Dont show option for borg belly if the user isnt even a borg. QOL!
if(set_output) if(isrobot(user))
if(set_output == "Borg Belly") vac_options = list("Vore Belly", "Borg Belly", "Trash Bag")
var/set_output = tgui_input_list(user, "Set your vacuum attachment's connection port", "Vac Settings", vac_options)
switch(set_output)
if("Borg Belly")
if(isrobot(user)) if(isrobot(user))
var/mob/living/silicon/robot/R = user var/mob/living/silicon/robot/R = user
var/obj/item/weapon/robot_module/M = R.module var/obj/item/weapon/robot_module/M = R.module
@@ -47,7 +50,7 @@
output_dest = S output_dest = S
return return
to_chat(user, "<span class='warning'>Borg belly not found.</span>") to_chat(user, "<span class='warning'>Borg belly not found.</span>")
if(set_output == "Trash Bag") if("Trash Bag")
if(isrobot(user)) if(isrobot(user))
var/mob/living/silicon/robot/R = user var/mob/living/silicon/robot/R = user
var/obj/item/weapon/robot_module/M = R.module var/obj/item/weapon/robot_module/M = R.module
@@ -60,7 +63,7 @@
output_dest = T output_dest = T
return return
to_chat(user, "<span class='warning'>Trash bag not found.</span>") to_chat(user, "<span class='warning'>Trash bag not found.</span>")
if(set_output == "Vore Belly") if("Vore Belly")
if(user.vore_selected) if(user.vore_selected)
output_dest = user.vore_selected output_dest = user.vore_selected
return return
@@ -172,6 +175,8 @@
if(is_type_in_list(F,item_vore_blacklist) || F.loc != target) if(is_type_in_list(F,item_vore_blacklist) || F.loc != target)
continue continue
if(istype(F,/obj/effect/decal/cleanable)) if(istype(F,/obj/effect/decal/cleanable))
if(isbelly(output_dest))
user.adjust_nutrition(1)
qdel(F) qdel(F)
continue continue
if(istype(output_dest,/obj/item/weapon/storage/bag/trash)) if(istype(output_dest,/obj/item/weapon/storage/bag/trash))
@@ -195,6 +200,8 @@
F.forceMove(output_dest) F.forceMove(output_dest)
if(istype(target, /turf/simulated)) if(istype(target, /turf/simulated))
var/turf/simulated/T = target var/turf/simulated/T = target
if(isbelly(output_dest) && T.dirt > 50)
user.adjust_nutrition((T.dirt - 50) / 10) //Max tile dirt is 101. so about 5 nutrition from a disgusting floor, I think that's okay.
T.dirt = 0 T.dirt = 0
T.clean_blood() T.clean_blood()
return return

View File

@@ -0,0 +1,12 @@
//Synth emotes for the (broken) synth hounds.
/mob/living/simple_mob/vore/aggressive/corrupthound/get_available_emotes()
. = ..()
. += /decl/emote/audible/synth
. += /decl/emote/audible/synth/beep
. += /decl/emote/audible/synth/buzz
. += /decl/emote/audible/synth/confirm
. += /decl/emote/audible/synth/deny
. += /decl/emote/audible/synth/scary
. += /decl/emote/audible/synth/dwoop
. += /decl/emote/audible/synth/boop
. += /decl/emote/audible/synth/robochirp

View File

@@ -11,16 +11,17 @@
away even the most fiesty of pests once they make it past the synthbird's beak, and staring into that beak would allow \ away even the most fiesty of pests once they make it past the synthbird's beak, and staring into that beak would allow \
one to see far down into the drone, though the frequent curving of the SWOOPIE's neck often makes seeing down \ one to see far down into the drone, though the frequent curving of the SWOOPIE's neck often makes seeing down \
the entire length next to impossible even with a cooperative unit, let alone the passive suction that threatens to \ the entire length next to impossible even with a cooperative unit, let alone the passive suction that threatens to \
make anything that gets too close vanish into the drone's dangerous depths. SWOOPIE XLs are equipped with powerful \ make anything that gets too close to the bot's beak vanish down the drone's stretchy hose throat. \
CHURNO-VAC digestive chambers that are able to effectively melt down most anything that gets claimed by their vac-beaks, \ SWOOPIE XLs are equipped with powerful CHURNO-VAC digestive chambers that are able to effectively melt down most \
indescriminately melting anything that happens to end up in that chamber, it would be a terrible idea to allow yourself \ anything that gets claimed by their vac-beaks, indescriminately melting anything that happens to end up in that chamber, \
get swooped by one of these drones, unless you want to add to their biofuel reserves." it would be a terrible idea to allow yourself get swooped by one of these drones, unless you want to add to their biofuel reserves."
value = CATALOGUER_REWARD_MEDIUM value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie
name = "SWOOPIE XL" name = "SWOOPIE XL"
desc = "A large birdlike robot with thick assets, plump belly, and a long elastic vacuum hose of a neck. Somehow still a cleanbot, even if just for its duties." desc = "A large birdlike robot with thick assets, plump belly, and a long elastic vacuum hose of a neck. Somehow still a cleanbot, even if just for its duties."
description_info = "Use DISARM intent to access the integrated Vac-Pack settings.<br>Use GRAB intent while targeting the head damage zone to grab the SWOOPIE XL's neck and use it as a vaccum." description_info = "Use DISARM intent to access the integrated Vac-Pack settings.<br>Use GRAB intent while targeting the head damage zone to grab the SWOOPIE XL's neck and use it as a vaccum."
catalogue_data = list(/datum/category_item/catalogue/technology/drone/corrupt_hound/swoopie)
icon_state = "swoopie" icon_state = "swoopie"
icon_living = "swoopie" icon_living = "swoopie"
icon_dead = "swoopie_dead" icon_dead = "swoopie_dead"
@@ -40,32 +41,49 @@
adminbus_trash = TRUE //You know what, sure whatever. It's not like anyone's gonna be taking this bird on unga trips to be their gamer backpack, which kinda was the main reason for the trash eater restrictions in the first place anyway. adminbus_trash = TRUE //You know what, sure whatever. It's not like anyone's gonna be taking this bird on unga trips to be their gamer backpack, which kinda was the main reason for the trash eater restrictions in the first place anyway.
faction = "neutral" faction = "neutral"
say_list_type = /datum/say_list/swoopie say_list_type = /datum/say_list/swoopie
ai_holder_type = /datum/ai_holder/simple_mob/retaliate ai_holder_type = /datum/ai_holder/simple_mob/retaliate/swoopie
mob_bump_flag = 0 mob_bump_flag = 0
player_msg = "You are a SWOOPIE XL cleaning bot! Use DISARM intent to change your integrated Vac-Pack settings, or GRAB intent to swoop stuff up! Turning off the Vac-Pack will make your grab clicks function as normal grab intent clicks." player_msg = "You are a SWOOPIE XL cleaning bot! Use DISARM intent on yourself to change your integrated Vac-Pack settings, or GRAB intent to swoop stuff up! Turning off the Vac-Pack will make your grab clicks function as normal grab intent clicks."
var/static/list/crew_creatures = list( /mob/living/simple_mob/protean_blob, var/static/list/crew_creatures = list( /mob/living/simple_mob/protean_blob,
/mob/living/simple_mob/slime/promethean) /mob/living/simple_mob/slime/promethean)
var/obj/item/device/vac_attachment/Vac var/static/list/pest_creatures = list( /mob/living/simple_mob/animal/passive/mouse,
/mob/living/simple_mob/animal/passive/lizard,
/mob/living/simple_mob/animal/passive/cockroach)
var/obj/item/device/vac_attachment/swoopie/Vac
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/Initialize() /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/Initialize()
. = ..() . = ..()
if(!voremob_loaded) if(!voremob_loaded)
voremob_loaded = TRUE voremob_loaded = TRUE
init_vore() init_vore()
Vac = new /obj/item/device/vac_attachment(src) Vac = new /obj/item/device/vac_attachment/swoopie(src)
if(istype(Vac)) if(istype(Vac))
Vac.output_dest = vore_selected Vac.output_dest = vore_selected
Vac.vac_power = 3 Vac.vac_power = 3
Vac.item_state = null
Vac.vac_owner = src Vac.vac_owner = src
Vac.icon = 'modular_chomp/icons/mob/vacpack_swoop.dmi'
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/IIsAlly(mob/living/L) /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/IIsAlly(mob/living/L)
. = ..() . = ..()
if(L?.type in pest_creatures) // If they're a pest, swoop no matter what!
return FALSE
if(!.) // Outside the faction and not in friends, are they crew if(!.) // Outside the faction and not in friends, are they crew
return L?.type in crew_creatures return L?.type in crew_creatures
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/attack_target(atom/A)
if(!has_AI())
return ..()
if(istype(A, /mob/living)) //Swoopie gonn swoop
var/mob/living/M = A //typecast
if(!M.devourable || !M.can_be_drop_prey)
return ..()
Vac.afterattack(M, src, 1)
return
if(istype(A, /obj/item))
Vac.afterattack(A, src, 1)
return
. = ..() //if not vaccable, just do what it normally does
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/init_vore() /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/init_vore()
if(!voremob_loaded) if(!voremob_loaded)
return return
@@ -74,7 +92,7 @@
add_verb(src,/mob/living/proc/eat_trash) //CHOMPEdit TGPanel add_verb(src,/mob/living/proc/eat_trash) //CHOMPEdit TGPanel
add_verb(src,/mob/living/proc/toggle_trash_catching) //CHOMPEdit TGPanel add_verb(src,/mob/living/proc/toggle_trash_catching) //CHOMPEdit TGPanel
add_verb(src,/mob/living/proc/restrict_trasheater) //CHOMPEdit TGPanel add_verb(src,/mob/living/proc/restrict_trasheater) //CHOMPEdit TGPanel
var/obj/belly/B = new /obj/belly/(src) var/obj/belly/B = new /obj/belly(src)
B.affects_vore_sprites = TRUE B.affects_vore_sprites = TRUE
B.belly_sprite_to_affect = "stomach" B.belly_sprite_to_affect = "stomach"
B.name = "Churno-Vac" B.name = "Churno-Vac"
@@ -82,7 +100,8 @@
B.digest_messages_prey = list("Under the heat and internal pressure of the greedy machine's gutworks, you can feel the tides of the hot caustic sludge claiming the last bits of space around your body, a few more squeezes of the synthetic muscles squelching and glurking as your body finally loses its form, completely blending down and merging into the tingly sludge to fuel the mean machine.") B.digest_messages_prey = list("Under the heat and internal pressure of the greedy machine's gutworks, you can feel the tides of the hot caustic sludge claiming the last bits of space around your body, a few more squeezes of the synthetic muscles squelching and glurking as your body finally loses its form, completely blending down and merging into the tingly sludge to fuel the mean machine.")
B.digest_mode = DM_DIGEST B.digest_mode = DM_DIGEST
B.item_digest_mode = IM_DIGEST B.item_digest_mode = IM_DIGEST
B.mode_flags = DM_FLAG_TURBOMODE | DM_FLAG_THICKBELLY //Hard to be heard from inside the swoop! Also very active belly. B.recycling = TRUE
B.mode_flags = DM_FLAG_THICKBELLY //Hard to be heard from inside the swoop!
B.digest_burn = 3 B.digest_burn = 3
B.fancy_vore = 1 B.fancy_vore = 1
B.vore_sound = "Stomach Move" B.vore_sound = "Stomach Move"
@@ -216,14 +235,34 @@
return ..() return ..()
if(stat) //Cant suck if we're not able to... if(stat) //Cant suck if we're not able to...
return ..() return ..()
if(istype(A, /obj/item/weapon/storage)) //Dont put the nossle in bags
return ..()
if(istype(Vac) && A.Adjacent(src)) if(istype(Vac) && A.Adjacent(src))
face_atom(A) face_atom(A)
if(src.a_intent == I_DISARM && A == src) //Only if on disarm intent. if(src.a_intent == I_DISARM && A == src) //Only if on disarm intent.
Vac.attack_self(src) Vac.attack_self(src)
return return
if(istype(A, /obj/machinery/disposal)) //Dont put the nossle in the trash
return
if(src.a_intent == I_GRAB && Vac.vac_power != 0) //Only on grab intent. if someone needs to use grab intent they can just turn off the vac if(src.a_intent == I_GRAB && Vac.vac_power != 0) //Only on grab intent. if someone needs to use grab intent they can just turn off the vac
if(istype(A, /obj/machinery/disposal)) //You used that bin when the bird was right there? How inconsiderate!
var/obj/machinery/disposal/D
if(D.flushing)
to_chat(src, "\The [D] has already began flushing, you're too late to grab whatever was inside!")
return
var/foundstuff = 0 //Check if we actually found anything in the bin...
for(var/atom/movable/AM in D)
if(istype(AM, /mob/living))
var/mob/living/M = AM
if(!M.devourable || !M.can_be_drop_prey)
to_chat(M, "<span class='warning'>[src] plunges their head into \the [D], while you narrowly avoid being sucked up!</span>")
continue
to_chat(M, "<span class='warning'>[src] plunges their head into \the [D], sucking up everything inside- Including you!</span>")
foundstuff = 1
AM.forceMove(src)
if(foundstuff)
src.visible_message("<span class='warning'>[src] plunges their head into \the [D], greedily sucking up everything inside!</span>")
else //Oh, Nothing was inside...
to_chat(src, "You poke your head into \the [D], but there doesnt seem to be anything of interest...")
return
var/resolved = Vac.resolve_attackby(A, src, click_parameters = params) var/resolved = Vac.resolve_attackby(A, src, click_parameters = params)
if(!resolved && A && Vac) if(!resolved && A && Vac)
Vac.afterattack(A, src, 1, params) Vac.afterattack(A, src, 1, params)
@@ -257,3 +296,108 @@
if(!L || L == usr) if(!L || L == usr)
return return
L.put_in_active_hand(Vac) L.put_in_active_hand(Vac)
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/verb/change_settings()
set name = "Change Settings"
set desc = "Change \the [src]'s settings"
set category = "IC"
set src in oview(1)
if(!has_AI() || !IIsAlly(usr))
to_chat(usr, "<span class=danger></span>")
if(!ai_holder == /datum/ai_holder/simple_mob/retaliate/swoopie || !ai_holder)
to_chat(usr, "<span class=warning>This [src] doesnt seem to have changable settings!</span>")
return
var/datum/ai_holder/simple_mob/retaliate/swoopie/ai = ai_holder
var/list/swooping_options = list(
"Swoop Pests",
"Swoop Trash",
)
var/setting_selection = tgui_input_list(usr, "Toggle Swoopie Swooping Options", "Swoopie Options", swooping_options)
switch(setting_selection)
if("Swoop Pests")
ai.swoop_pests = !ai.swoop_pests // invert the option
to_chat(usr, "You press a button on \the [src], [ai.swoop_pests ? "" : "de"]activating it's pest seeking routines!")
if("Swoop Trash")
ai.swoop_trash = !ai.swoop_trash // invert the option
to_chat(usr, "you press a button on \the [src], [ai.swoop_trash ? "" : "de"]activating it's pest seeking routines!")
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/Login()
. = ..()
verbs -= /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/verb/change_settings //Controlled swoopies dont need their settings changed externally
//Special Swoopie vaccum so it can be handled better than a vareditted vacpack.
/obj/item/device/vac_attachment/swoopie
name = "Swoopie Vac-Beak"
desc = "Useful for slurping mess off the floors. Even dirt and pests depending on settings. This vaccum seems to be permanantly attached to the swoopie's rumbling rubber trashbag."
icon = 'modular_chomp/icons/mob/vacpack_swoop.dmi'
item_state = null
/obj/item/device/vac_attachment/swoopie/dropped(mob/user) //This should fix it sitting on the ground until the next life() tick
. = ..()
if(!vac_owner)
return
forceMove(vac_owner)
//Custom Swoopie AI to make it swoop up trash when asked to
/datum/ai_holder/simple_mob/retaliate/swoopie //TODO: make a general item-seeking AI type and use it for other stuff (Teppi seeking food automatically?)
hostile = TRUE // Hostile, but it wont actually attack stuff unless it's allowed to. Maybe also in retaliation.
var/swoop_pests = FALSE // Do we go after living pests?
var/swoop_trash = FALSE // Do we go after trash and junk?
var/original_power = 0 // What the swoopie's last vaccum strength was before we went to go vaccum stuff up actively.
cooperative = FALSE // Swoop works independantly
mauling = TRUE // Swoop doesnt care how hurt you are. If it's trying to attack you, it's just trying to eat you
handle_corpse = TRUE // See above.
/datum/ai_holder/simple_mob/retaliate/swoopie/list_targets() //Kinda stolen from nurse spiders. Mostly stolen.
. = ..()
var/static/alternative_targets = typecacheof(list(/obj/item/trash))
for(var/obj/O as anything in typecache_filter_list(range(vision_range, holder), alternative_targets))
if(can_see(holder, O, vision_range) && !O.anchored)
. += O
// Select an obj if no mobs are around.
/datum/ai_holder/simple_mob/retaliate/swoopie/pick_target(list/targets)
var/mobs_only = locate(/mob/living) in targets // If a mob is in the list of targets, then ignore objects.
if(mobs_only)
for(var/A in targets)
if(!isliving(A))
targets -= A
return ..(targets)
/datum/ai_holder/simple_mob/retaliate/swoopie/find_target(var/list/possible_targets, var/has_targets_list = FALSE)
ai_log("find_target() : Entered.", AI_LOG_TRACE)
if(!hostile) // So retaliating mobs only attack the thing that hit it.
return null
. = list()
if(!has_targets_list)
possible_targets = list_targets()
for(var/possible_target in possible_targets)
if(can_attack(possible_target)) // Can we attack it?
if(isliving(possible_target) && !swoop_pests) // Are we allowed to attack living things?
continue
if(!isliving(possible_target) && !swoop_trash) // Otherwise, are we allowed to swoop trash?
continue
. += possible_target
var/new_target = pick_target(.)
give_target(new_target)
return new_target
/datum/ai_holder/simple_mob/retaliate/swoopie/give_target(new_target, urgent = FALSE)
. = ..()
if(istype(holder, /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie))
var/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/bird = holder //Typecast
original_power = bird.Vac.vac_power
bird.Vac.vac_power = 7
/datum/ai_holder/simple_mob/retaliate/swoopie/remove_target()
. = ..()
if(istype(holder, /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie))
var/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/bird = holder //Typecast
bird.Vac.vac_power = original_power

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

View File

@@ -4911,6 +4911,7 @@
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\ashy.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\ashy.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\bigdragon.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\bigdragon.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\carp.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\carp.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\corrupt_hounds.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\demon.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\demon.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\desert_planet_mobs.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\desert_planet_mobs.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\event.dm" #include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\event.dm"