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.real_name = generateCorpseName()
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(!corpsesynthbrand)
corpsesynthbrand = "Unbranded"

View File

@@ -37,8 +37,8 @@
buckle_lying = FALSE
vore_icons = SA_ICON_LIVING
vore_bump_chance = 50
vore_digest_chance = 0
vore_escape_chance = 50
//vore_digest_chance = 0 // Im setting these two in the individual bellies, I dont know how they interact with multiple
//vore_escape_chance = 50 // bellies so im just commenting them out. -Reo
vore_pounce_chance = 100
vore_active = 1
vore_icons = 5
@@ -87,12 +87,14 @@
if(!voremob_loaded)
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.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.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.vore_verb = "slurp"
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 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
speak = list("Prurr.", "Rrrhf.", "Rrrrrll.", "Mrrrrph.")
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()
if(!voremob_loaded)
return
.=..()
var/obj/belly/B = vore_selected
//.=..() //Dont need this, it just spawns the parent's guts
var/obj/belly/B = new /obj/belly(src)
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.vore_sound = "Tauric Swallow"
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.vore_verb = "slurp"
B.contamination_color = "pink"
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.emote_lists[DM_HEAL] = list(
"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!",
"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~")
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
return pick(prob(89);/mob/living/simple_mob/vore/leopardmander,

View File

@@ -532,14 +532,23 @@
/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(istype(AM, /obj/item/weapon/holder/micro))
log_and_message_admins("[AM] was thrown into \the [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
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)
if(istype(mover, /obj/item/projectile))
@@ -737,12 +746,15 @@
return
var/mob/living/U = user
/* CHOMPEdit: Clong, clong baby.
if (U.stat || U.last_special <= world.time)
return
U.last_special = world.time+100
*/
if(U.stat)
return
//CHOMPEdit End.
if (src.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>")

View File

@@ -411,6 +411,22 @@
M.loc = src
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()
flushing = 1
flick("intake-closing", src)

View File

@@ -140,6 +140,13 @@
reagents.trans_to_holder(H.ingested, (reagents.total_volume), B.nutrition_percent / 100, 0)
else if(isliving(B.owner))
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)
to_chat(B.owner,"<span class='notice'>[src] was digested inside your [lowertext(B.name)].</span>")
qdel(src)//CHOMPEdit End

View File

@@ -36,9 +36,12 @@
if(vac_owner && user != vac_owner)
to_chat(user, "<span class='warning'>Only designated owner can change this setting.</span>")
return
var/set_output = tgui_input_list(user, "Set your vacuum attachment's connection port", "Vac Settings", list("Vore Belly", "Borg Belly", "Trash Bag"))
if(set_output)
if(set_output == "Borg Belly")
var/vac_options = list("Vore Belly", "Trash Bag") //Dont show option for borg belly if the user isnt even a borg. QOL!
if(isrobot(user))
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))
var/mob/living/silicon/robot/R = user
var/obj/item/weapon/robot_module/M = R.module
@@ -47,7 +50,7 @@
output_dest = S
return
to_chat(user, "<span class='warning'>Borg belly not found.</span>")
if(set_output == "Trash Bag")
if("Trash Bag")
if(isrobot(user))
var/mob/living/silicon/robot/R = user
var/obj/item/weapon/robot_module/M = R.module
@@ -60,7 +63,7 @@
output_dest = T
return
to_chat(user, "<span class='warning'>Trash bag not found.</span>")
if(set_output == "Vore Belly")
if("Vore Belly")
if(user.vore_selected)
output_dest = user.vore_selected
return
@@ -172,6 +175,8 @@
if(is_type_in_list(F,item_vore_blacklist) || F.loc != target)
continue
if(istype(F,/obj/effect/decal/cleanable))
if(isbelly(output_dest))
user.adjust_nutrition(1)
qdel(F)
continue
if(istype(output_dest,/obj/item/weapon/storage/bag/trash))
@@ -195,6 +200,8 @@
F.forceMove(output_dest)
if(istype(target, /turf/simulated))
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.clean_blood()
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 \
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 \
make anything that gets too close vanish into the drone's dangerous depths. SWOOPIE XLs are equipped with powerful \
CHURNO-VAC digestive chambers that are able to effectively melt down most anything that gets claimed by their vac-beaks, \
indescriminately melting anything that happens to end up in that chamber, 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."
make anything that gets too close to the bot's beak vanish down the drone's stretchy hose throat. \
SWOOPIE XLs are equipped with powerful CHURNO-VAC digestive chambers that are able to effectively melt down most \
anything that gets claimed by their vac-beaks, indescriminately melting anything that happens to end up in that chamber, \
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
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie
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."
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_living = "swoopie"
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.
faction = "neutral"
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
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,
/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()
. = ..()
if(!voremob_loaded)
voremob_loaded = TRUE
init_vore()
Vac = new /obj/item/device/vac_attachment(src)
Vac = new /obj/item/device/vac_attachment/swoopie(src)
if(istype(Vac))
Vac.output_dest = vore_selected
Vac.vac_power = 3
Vac.item_state = null
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)
. = ..()
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
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()
if(!voremob_loaded)
return
@@ -74,7 +92,7 @@
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/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.belly_sprite_to_affect = "stomach"
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_mode = DM_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.fancy_vore = 1
B.vore_sound = "Stomach Move"
@@ -216,14 +235,34 @@
return ..()
if(stat) //Cant suck if we're not able to...
return ..()
if(istype(A, /obj/item/weapon/storage)) //Dont put the nossle in bags
return ..()
if(istype(Vac) && A.Adjacent(src))
face_atom(A)
if(src.a_intent == I_DISARM && A == src) //Only if on disarm intent.
Vac.attack_self(src)
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(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)
if(!resolved && A && Vac)
Vac.afterattack(A, src, 1, params)
@@ -257,3 +296,108 @@
if(!L || L == usr)
return
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\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\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\desert_planet_mobs.dm"
#include "modular_chomp\code\modules\mob\living\simple_mob\subtypes\vore\event.dm"