mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-25 22:28:44 +01:00
[MIRROR] Simple mob port [IDB IGNORE] (#11492)
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com> Co-authored-by: C.L. <killer65311@gmail.com>
This commit is contained in:
co-authored by
Kashargul
C.L.
parent
9696eca7b3
commit
4febf95738
File diff suppressed because it is too large
Load Diff
@@ -197,18 +197,3 @@
|
||||
min_oxy = 0
|
||||
max_tox = 0
|
||||
max_co2 = 0
|
||||
|
||||
/mob/living/simple_mob/animal/giant_spider/tunneler/cave
|
||||
name = "cave spider"
|
||||
desc = "Sandy and brown, it makes you shudder to look at it. However, this one doesn't seem very interested in bothering you."
|
||||
maxHealth = 25
|
||||
health = 25
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/retaliate
|
||||
meat_amount = 1 // Scrawny little things! It's no wonder they don't want to fight you!
|
||||
|
||||
/mob/living/simple_mob/animal/giant_spider/tunneler/cave/Initialize(mapload)
|
||||
. = ..()
|
||||
resize(0.50)
|
||||
|
||||
-27
@@ -1,27 +0,0 @@
|
||||
/mob/living/simple_mob/construct/artificer/caster
|
||||
projectiletype = /obj/item/projectile/energy/inversion
|
||||
/* Combat refactor walkback
|
||||
/mob/living/simple_mob/construct/artificer
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
melee_damage_lower = 7
|
||||
melee_damage_upper = 10
|
||||
|
||||
/mob/living/simple_mob/construct/harvester
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 12
|
||||
|
||||
/mob/living/simple_mob/construct/wraith
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
melee_damage_lower = 12
|
||||
melee_damage_upper = 15
|
||||
|
||||
/mob/living/simple_mob/construct/harvester/greater
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 25
|
||||
*/
|
||||
-52
@@ -1,52 +0,0 @@
|
||||
/* Combat refactor walkback
|
||||
/mob/living/simple_mob/construct/juggernaut
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 20
|
||||
|
||||
/mob/living/simple_mob/construct/juggernaut/behemoth
|
||||
maxHealth = 300
|
||||
health = 300
|
||||
*/
|
||||
/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable
|
||||
name = "Behemoth"
|
||||
real_name = "Behemoth"
|
||||
desc = "The pinnacle of occult technology, Behemoths are nothing shy of both an Immovable Object, and Unstoppable Force."
|
||||
melee_damage_lower = 45
|
||||
melee_damage_upper = 65
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
projectiletype = /obj/item/projectile/energy/inversion
|
||||
movement_cooldown = 1
|
||||
|
||||
loot_list = list(/obj/item/rig/ch/aegis = 100)
|
||||
|
||||
|
||||
/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable/bullet_act(var/obj/item/projectile/P)
|
||||
var/reflectchance = 100 - round(P.damage*2)
|
||||
if(prob(reflectchance))
|
||||
visible_message(span_danger("The [P.name] gets reflected by [src]'s shell!"), \
|
||||
span_userdanger("The [P.name] gets reflected by [src]'s shell!"))
|
||||
|
||||
// Find a turf near or on the original location to bounce to
|
||||
if(P.starting)
|
||||
var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
|
||||
var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
|
||||
var/turf/curloc = get_turf(src)
|
||||
|
||||
// redirect the projectile
|
||||
P.redirect(new_x, new_y, curloc, src)
|
||||
P.reflected = 1
|
||||
|
||||
return -1 // complete projectile permutation
|
||||
|
||||
return (..(P))
|
||||
|
||||
|
||||
/obj/item/projectile/energy/electrode/cult
|
||||
color = "#FFFFFF"
|
||||
agony = 0
|
||||
damage = 15
|
||||
damage_type = BURN
|
||||
check_armour = "laser"
|
||||
armor_penetration = 60
|
||||
-272
@@ -1,272 +0,0 @@
|
||||
////////////////////////////
|
||||
// Purity Construct - Laity
|
||||
////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/construct/laity //Weak Swarm Attacker can be safely dumped on players in large numbers without too many injuries
|
||||
name = "Laity"
|
||||
real_name = "Laity"
|
||||
construct_type = "Laity"
|
||||
faction = "purity"
|
||||
desc = "A small construct of the purity worshippers mechanical followers, not hardy or particularly strong, very numerous."
|
||||
icon_state = "laity"
|
||||
icon_living = "laity"
|
||||
ui_icons = 'modular_chomp/icons/mob/screen1_purity.dmi'
|
||||
maxHealth = 75
|
||||
health = 75
|
||||
response_harm = "viciously beaten"
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 4 //It's not the strongest of the bunch, but that doesn't mean it can't hurt you.
|
||||
melee_damage_upper = 8
|
||||
attack_armor_pen = 50 // Does so little damage already, that this can be justified.
|
||||
attacktext = list("rammed")
|
||||
attack_sound = 'sound/weapons/rapidslice.ogg'
|
||||
movement_cooldown = 0
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative
|
||||
|
||||
////////////////////////////
|
||||
// Purity Construct - Deacon
|
||||
////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/construct/deacon
|
||||
name = "Deacon"
|
||||
real_name = "Deacon"
|
||||
construct_type = "Deacon"
|
||||
faction = "purity"
|
||||
desc = "A small construct of the purity worshippers mechanical followers, hardy but mostly harmless."
|
||||
icon_state = "deacon"
|
||||
icon_living = "deacon"
|
||||
ui_icons = 'modular_chomp/icons/mob/screen1_purity.dmi'
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
melee_damage_lower = 8 //not meant for combat but can hold its own in a pinch
|
||||
melee_damage_upper = 12
|
||||
attack_armor_pen = 60 //used to carve stone and other metals, cuts through armor just as well
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("violently stabbed")
|
||||
friendly = list("caresses")
|
||||
organ_names = /decl/mob_organ_names/harvester
|
||||
movement_cooldown = -1
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative
|
||||
|
||||
// environment_smash = 1 // Whatever this gets renamed to, Harvesters need to break things
|
||||
|
||||
attack_sound = 'sound/weapons/pierce.ogg'
|
||||
|
||||
armor = list(
|
||||
"melee" = 20,
|
||||
"bullet" = 10,
|
||||
"laser" = 10,
|
||||
"energy" = 10,
|
||||
"bomb" = 10,
|
||||
"bio" = 100,
|
||||
"rad" = 100)
|
||||
|
||||
construct_spells = list(
|
||||
/spell/aoe_turf/knock/harvester,
|
||||
/spell/targeted/construct_advanced/force_beam,
|
||||
/spell/targeted/construct_advanced/soothing_sphere,
|
||||
)
|
||||
|
||||
/decl/mob_organ_names/harvester
|
||||
hit_zones = list("cephalothorax", "eye", "carapace", "energy crystal", "mandible")
|
||||
|
||||
////////////////////////////
|
||||
// Purity Construct - Priest
|
||||
////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/construct/priest
|
||||
name = "Priest"
|
||||
real_name = "Priest"
|
||||
construct_type = "Priest"
|
||||
faction = "purity"
|
||||
desc = "A medium sized construct of the purity worshippers mechanical followers, sturdy but lacking strength."
|
||||
icon_state = "priest"
|
||||
icon_living = "priest"
|
||||
ui_icons = 'modular_chomp/icons/mob/screen1_purity.dmi'
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
response_harm = "viciously beaten"
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 10 //It's not the strongest of the bunch, but that doesn't mean it can't hurt you.
|
||||
melee_damage_upper = 15
|
||||
organ_names = /decl/mob_organ_names/artificer
|
||||
attacktext = list("rammed")
|
||||
attack_sound = 'sound/weapons/rapidslice.ogg'
|
||||
construct_spells = list(/spell/targeted/purity_repair_aura,
|
||||
/spell/targeted/construct_advanced/mend_purity
|
||||
)
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative
|
||||
|
||||
/decl/mob_organ_names/artificer
|
||||
hit_zones = list("body", "carapace", "right manipulator", "left manipulator", "upper left appendage", "upper right appendage", "eye")
|
||||
|
||||
////////////////////////////
|
||||
// Purity Construct - Bishop
|
||||
////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/construct/bishop
|
||||
name = "Bishop"
|
||||
real_name = "Bishop"
|
||||
construct_type = "Bishop"
|
||||
faction = "purity"
|
||||
desc = "A medium sized construct of the purity worshippers mechanical followers, sturdy and deadly, these constructs are commanded by an archbishop, tasked with patrolling and eliminating threats to their flock."
|
||||
icon_state = "bishop"
|
||||
icon_living = "bishop"
|
||||
ui_icons = 'modular_chomp/icons/mob/screen1_purity.dmi'
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 20
|
||||
attack_armor_pen = 15
|
||||
attack_sharp = TRUE
|
||||
attack_edge = 1
|
||||
attacktext = list("slashed")
|
||||
friendly = list("pinches")
|
||||
organ_names = /decl/mob_organ_names/wraith
|
||||
movement_cooldown = -1
|
||||
attack_sound = 'sound/weapons/rapidslice.ogg'
|
||||
construct_spells = list(/spell/targeted/construct_advanced/crippling_beam,
|
||||
/spell/targeted/construct_advanced/banishment
|
||||
)
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative
|
||||
|
||||
// environment_smash = 1 // Whatever this gets renamed to, Wraiths need to break things
|
||||
|
||||
/mob/living/simple_mob/construct/bishop/apply_melee_effects(var/atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.add_modifier(/datum/modifier/deep_wounds, 30 SECONDS)
|
||||
|
||||
/decl/mob_organ_names/wraith
|
||||
hit_zones = list("body", "eye", "crystaline spike", "left claw", "right claw")
|
||||
|
||||
////////////////////////////
|
||||
// Purity Construct - Archbishop
|
||||
////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/construct/bishop/arch
|
||||
name = "Archbishop"
|
||||
real_name = "Archbishop"
|
||||
construct_type = "Archbishop"
|
||||
faction = "purity"
|
||||
desc = "A large sized construct of the purity worshippers mechanical followers, one of their most advanced, it is the right hand of purification, dedicated to the pursuit of eradicating those who cause harm their charge."
|
||||
icon_state = "archbishop"
|
||||
icon_living = "archbishop"
|
||||
ui_icons = 'modular_chomp/icons/mob/screen1_purity.dmi'
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
melee_damage_lower = 20 //hits much harder then most purity constructs
|
||||
melee_damage_upper = 30
|
||||
attack_armor_pen = 50 //armor is no match against its religious wrath
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("violently stabbed")
|
||||
friendly = list("caresses")
|
||||
organ_names = /decl/mob_organ_names/wraith
|
||||
movement_cooldown = 0
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative
|
||||
|
||||
// environment_smash = 1 // Whatever this gets renamed to, Harvesters need to break things
|
||||
|
||||
attack_sound = 'sound/weapons/pierce.ogg'
|
||||
|
||||
/decl/mob_organ_names/wraith
|
||||
hit_zones = list("body", "eye", "crystaline spike", "left claw", "right claw")
|
||||
|
||||
////////////////////////////
|
||||
// Purity Construct - Cardinal
|
||||
////////////////////////////
|
||||
|
||||
/mob/living/simple_mob/construct/cardinal
|
||||
name = "Cardinal"
|
||||
real_name = "Cardinal"
|
||||
construct_type = "Cardinal"
|
||||
faction = "purity"
|
||||
desc = "A large sized construct of the purity worshippers mechanical followers, one of their most advanced, it is the left hand of purification, tasked with the ultimate protection and ultimately defense of all under its charge, it will stop at nothing to protect its flock from harm."
|
||||
icon_state = "cardinal"
|
||||
icon_living = "cardinal"
|
||||
ui_icons = 'modular_chomp/icons/mob/screen1_purity.dmi'
|
||||
maxHealth = 300
|
||||
health = 300
|
||||
response_harm = "harmlessly punches"
|
||||
harm_intent_damage = 0
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 30
|
||||
attack_armor_pen = 50 //fist of iron and stone will smash through most things
|
||||
attacktext = list("smashed their armoured gauntlet into")
|
||||
friendly = list("pats")
|
||||
organ_names = /decl/mob_organ_names/juggernaut
|
||||
mob_size = MOB_HUGE
|
||||
attack_sound = 'sound/weapons/heavysmash.ogg'
|
||||
status_flags = 0
|
||||
resistance = 10
|
||||
construct_spells = list(/spell/targeted/fortify,
|
||||
/spell/targeted/construct_advanced/slam,
|
||||
/spell/targeted/construct_advanced/mend_purity,
|
||||
/spell/targeted/purity_repair_aura
|
||||
)
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative
|
||||
|
||||
armor = list(
|
||||
"melee" = 70,
|
||||
"bullet" = 30,
|
||||
"laser" = 30,
|
||||
"energy" = 30,
|
||||
"bomb" = 10,
|
||||
"bio" = 100,
|
||||
"rad" = 100)
|
||||
|
||||
/mob/living/simple_mob/construct/cardinal/Life()
|
||||
SetWeakened(0)
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/construct/cardinal/bullet_act(var/obj/item/projectile/P)
|
||||
var/reflectchance = 100 - round(P.damage)
|
||||
if(prob(reflectchance))
|
||||
var/damage_mod = rand(2,4)
|
||||
var/projectile_dam_type = P.damage_type
|
||||
var/incoming_damage = (round(P.damage / damage_mod) - (round((P.damage / damage_mod) * 0.3)))
|
||||
var/armorcheck = run_armor_check(null, P.check_armour)
|
||||
var/soakedcheck = get_armor_soak(null, P.check_armour)
|
||||
if(!(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)))
|
||||
visible_message(span_danger("The [P.name] bounces off of [src]'s shell!"), \
|
||||
span_userdanger("The [P.name] bounces off of [src]'s shell!"))
|
||||
new /obj/item/material/shard/shrapnel(src.loc)
|
||||
if(!(P.damage_type == BRUTE || P.damage_type == BURN))
|
||||
projectile_dam_type = BRUTE
|
||||
incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to brute for physical projectiles, though severely decreased.
|
||||
apply_damage(incoming_damage, projectile_dam_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P)
|
||||
return -1 //Doesn't reflect non-beams or non-energy projectiles. They just smack and drop with little to no effect.
|
||||
else
|
||||
visible_message(span_danger("The [P.name] gets reflected by [src]'s shell!"), \
|
||||
span_userdanger("The [P.name] gets reflected by [src]'s shell!"))
|
||||
damage_mod = rand(3,5)
|
||||
incoming_damage = (round(P.damage / damage_mod) - (round((P.damage / damage_mod) * 0.3)))
|
||||
if(!(P.damage_type == BRUTE || P.damage_type == BURN))
|
||||
projectile_dam_type = BURN
|
||||
incoming_damage = round(incoming_damage / 4) //Damage from strange sources is converted to burn for energy-type projectiles, though severely decreased.
|
||||
apply_damage(incoming_damage, P.damage_type, null, armorcheck, soakedcheck, is_sharp(P), has_edge(P), P)
|
||||
|
||||
// Find a turf near or on the original location to bounce to
|
||||
if(P.starting)
|
||||
var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
|
||||
var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
|
||||
var/turf/curloc = get_turf(src)
|
||||
|
||||
// redirect the projectile
|
||||
P.redirect(new_x, new_y, curloc, src)
|
||||
P.reflected = 1
|
||||
|
||||
return -1 // complete projectile permutation
|
||||
|
||||
return (..(P))
|
||||
|
||||
/decl/mob_organ_names/juggernaut
|
||||
hit_zones = list("body", "left pauldron", "right pauldron", "left arm", "right arm", "eye", "head", "crystaline spike")
|
||||
@@ -1,72 +0,0 @@
|
||||
/mob/living/simple_mob/vore/bigdragon/Login()
|
||||
. = ..()
|
||||
add_verb(src,/mob/living/simple_mob/vore/bigdragon/proc/export_style) //CHOMPEdit TGPanel
|
||||
add_verb(src,/mob/living/simple_mob/vore/bigdragon/proc/import_style) //CHOMPEdit TGPanel
|
||||
|
||||
/mob/living/simple_mob/vore/bigdragon/proc/export_style()
|
||||
set name = "Export style string"
|
||||
set desc = "Export a string of text that can be used to instantly get the current style back using the import style verb"
|
||||
set category = "Abilities.Settings"
|
||||
var/output_style = jointext(list(
|
||||
overlay_colors["Underbelly"],
|
||||
under,
|
||||
overlay_colors["Body"],
|
||||
body,
|
||||
overlay_colors["Ears"],
|
||||
ears,
|
||||
overlay_colors["Mane"],
|
||||
mane,
|
||||
overlay_colors["Horns"],
|
||||
horns,
|
||||
overlay_colors["Eyes"],
|
||||
eyes), ";")
|
||||
to_chat(src, span_notice("Exported style string is \" [output_style] \". Use this to get the same style in the future with import style"))
|
||||
|
||||
/mob/living/simple_mob/vore/bigdragon/proc/import_style()
|
||||
set name = "Import style string"
|
||||
set desc = "Import a string of text that was made using the import style verb to get back that style"
|
||||
set category = "Abilities.Settings"
|
||||
var/input_style
|
||||
input_style = sanitizeSafe(tgui_input_text(src,"Paste the style string you exported with Export Style.", "Style loading"))
|
||||
if(input_style)
|
||||
var/list/input_style_list = splittext(input_style, ";")
|
||||
if((LAZYLEN(input_style_list) == 12) && (input_style_list[2] in underbelly_styles) && (input_style_list[4] in body_styles) && (input_style_list[6] in ear_styles) && (input_style_list[8] in mane_styles) && (input_style_list[10] in horn_styles) && (input_style_list[12] in ear_styles))
|
||||
try
|
||||
if(rgb2num(input_style_list[1]))
|
||||
overlay_colors["Underbelly"] = input_style_list[1]
|
||||
catch
|
||||
under = input_style_list[2]
|
||||
try
|
||||
if(rgb2num(input_style_list[3]))
|
||||
overlay_colors["Body"] = input_style_list[3]
|
||||
catch
|
||||
body = input_style_list[4]
|
||||
try
|
||||
if(rgb2num(input_style_list[5]))
|
||||
overlay_colors["Ears"] = input_style_list[5]
|
||||
catch
|
||||
ears = input_style_list[6]
|
||||
try
|
||||
if(rgb2num(input_style_list[7]))
|
||||
overlay_colors["Mane"] = input_style_list[7]
|
||||
catch
|
||||
mane = input_style_list[8]
|
||||
try
|
||||
if(rgb2num(input_style_list[9]))
|
||||
overlay_colors["Horns"] = input_style_list[9]
|
||||
catch
|
||||
horns = input_style_list[10]
|
||||
try
|
||||
if(rgb2num(input_style_list[11]))
|
||||
overlay_colors["Eyes"] = input_style_list[11]
|
||||
catch
|
||||
eyes = input_style_list[12]
|
||||
build_icons()
|
||||
|
||||
//Most intresting set of OG melee damages
|
||||
/* Combat refactor walkback
|
||||
/mob/living/simple_mob/vore/bigdragon
|
||||
melee_damage_lower = 12
|
||||
melee_damage_upper = 17
|
||||
maxHealth = 400
|
||||
*/
|
||||
@@ -1,37 +0,0 @@
|
||||
/mob/living/simple_mob/animal/space/carp/load_default_bellies()
|
||||
. = ..()
|
||||
var/obj/belly/B = vore_selected
|
||||
B.name = "Stomach"
|
||||
B.desc = "The toothy jaws of the space carp gnash down around your body while its throat opens up to suck you inside. The vicious attack is too swift for you to stop it. You're dragged down its short esophagus, then dumped into its muscular digestive system. Your body curls tight in the cramped confines of its slimy stomach; pushing aside a caustic mixture of other unrecognizable detritus. You realize the soupy chime consists of past explorers who went missing long ago. If you can't push your way back up to freedom, your fate will be the same."
|
||||
B.mode_flags = DM_FLAG_THICKBELLY
|
||||
B.digest_brute = 0.5
|
||||
B.digest_burn = 0.5
|
||||
B.escapechance = 20
|
||||
B.belly_fullscreen = "anim_belly"
|
||||
B.belly_fullscreen_color = "#660021"
|
||||
B.belly_fullscreen_color2 = "#660021"
|
||||
B.fancy_vore = 1
|
||||
|
||||
B.emote_lists[DM_DIGEST] = list(
|
||||
"They say a space carp's belly can digest almost anything. You're going to find out first hand if you stay here for much longer.",
|
||||
"The gastric fluids sizzle ferociously as they ooze across your form.",
|
||||
"A possessive squeeze of the wrinkled walls forces you to scrunch against yourself, as if to say you're not even a bother. This powerful digestive system has processed far more hazardous prey than you.",
|
||||
"The rubbery flesh of the carp's stomach lining constantly pulverizes you from all sides.",
|
||||
"Slowly but surely, everything around you is digested. Organic or not, it's all nourishment to the carp.",
|
||||
"The carp's disgusting innards slowly mix you around with acid. As far as it's concerned, you're nothing but fish food now.",
|
||||
"The stomach walls of the fishy predator push against you from all sides, smushing you into the leftovers of the last adventurer to wind up here.",
|
||||
"The carp's belly gushes over you with slow, muscular compressions. Every passing second allows more acid to be rubbed against you."
|
||||
)
|
||||
|
||||
B.struggle_messages_inside = list(
|
||||
"You jab with all your strength to free yourself from the carp's putrid gut.",
|
||||
"The carp's belly bounces at your thrashing while the creature hunts its next meal.",
|
||||
"You push and pry at the stomach sphincter, trying to force your way out.",
|
||||
"You shove against the back of the carp's stomach for leverage as you try forcing your head up its throat.",
|
||||
"You try to wriggle yourself out of the carp's belly before it grinds you into chum.",
|
||||
"Your feisty squirming is rewarded with a tight CLENCH from all sides. The carp stubbornly reminds you that it has eaten far worse."
|
||||
)
|
||||
|
||||
B.struggle_messages_outside = list(
|
||||
"%pred's stomach lurches with movement beneath its underbelly scales. Someone is alive in there!"
|
||||
)
|
||||
@@ -1,16 +0,0 @@
|
||||
/mob/living/simple_mob/vore/lamia/albino/cave
|
||||
name = "albino cave lamia"
|
||||
desc = "Combination snake-human. This one looks ravenous!"
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
vore_upper_transfer_chance = 75 // Since these lamias are on the hunt, you're getting pushed into the tail tum for fussing.
|
||||
vore_tail_transfer_chance = 10 // And the albino ones are EXTRA greedy!
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/vore/stalker // Good enough for now.
|
||||
|
||||
/mob/living/simple_mob/vore/lamia/copper/cave
|
||||
name = "cave lamia"
|
||||
desc = "Combination snake-human. This one looks hungry!"
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
vore_upper_transfer_chance = 75
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
@@ -1,181 +0,0 @@
|
||||
//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
|
||||
|
||||
/datum/category_item/catalogue/technology/drone/corrupt_hound/janihound
|
||||
name = "Drone - Corrupt Hound"
|
||||
desc = "A hound that has corrupted, due to outside influence, or other issues, \
|
||||
and occasionally garbles out distorted voices or words. It looks like a reddish-colored \
|
||||
machine, and it has black wires, cabling, and other small markings. It looks just like a station dog-borg \
|
||||
if you don't mind the fact that it's eyes glow a baleful red, and it's determined to kill you. \
|
||||
<br><br>\
|
||||
The hound's jaws are black and metallic, with a baleful red glow from inside them. It has a clear path \
|
||||
to it's internal fuel processor, synthflesh and flexing cabling allowing it to easily swallow it's prey. \
|
||||
Something tells you getting close or allowing it to pounce would be very deadly."
|
||||
value = CATALOGUER_REWARD_MEDIUM
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/corrupthound/janihound
|
||||
name = "corrupt janihound"
|
||||
desc = "An old janihound! Evidently, it doesn't seem to be lawed anymore. You should probably leave it alone."
|
||||
catalogue_data = list(/datum/category_item/catalogue/technology/drone/corrupt_hound)
|
||||
|
||||
icon_state = "cjhound"
|
||||
icon_living = "cjhound"
|
||||
icon_dead = "cjhound-dead"
|
||||
icon_rest = "cjhound_rest"
|
||||
icon = 'modular_chomp/icons/mob/vore64x32_ch.dmi'
|
||||
has_eye_glow = TRUE
|
||||
|
||||
faction = "corrupt"
|
||||
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
movement_sound = 'sound/effects/houndstep.ogg'
|
||||
see_in_dark = 8
|
||||
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 20
|
||||
grab_resist = 100
|
||||
|
||||
response_help = "pets"
|
||||
response_disarm = "bops"
|
||||
response_harm = "hits"
|
||||
attacktext = list("chomps")
|
||||
friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on")
|
||||
|
||||
old_x = -16
|
||||
old_y = 0
|
||||
default_pixel_x = -16
|
||||
pixel_x = -16
|
||||
pixel_y = 0
|
||||
|
||||
min_oxy = 0
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 0
|
||||
min_co2 = 0
|
||||
max_co2 = 0
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
minbodytemp = 150
|
||||
maxbodytemp = 900
|
||||
|
||||
say_list_type = /datum/say_list/corrupthound/janihound
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/thor_underground
|
||||
max_buckled_mobs = 1 //Yeehaw
|
||||
can_buckle = TRUE
|
||||
buckle_movable = TRUE
|
||||
buckle_lying = FALSE
|
||||
|
||||
vore_active = TRUE
|
||||
vore_capacity = 2
|
||||
vore_pounce_chance = 80 //hongry
|
||||
vore_icons = SA_ICON_LIVING | SA_ICON_REST
|
||||
vore_stomach_name = "fuel processor"
|
||||
vore_stomach_flavor = "You have ended up in the fuel processor of this corrupted machine. This place was definitely not designed with safety and comfort in mind. The heated and cramped surroundings oozing potent fluids all over your form, eager to do nothing less than breaking you apart to fuel its rampage for the next few days... hours... minutes? Oh dear..."
|
||||
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/old
|
||||
name = "corrupt janihound"
|
||||
desc = "A very old looking janihound! Evidently, it doesn't seem to be lawed anymore. You should probably leave it alone."
|
||||
|
||||
icon_state = "cshound"
|
||||
icon_living = "cshound"
|
||||
icon_dead = "cshound-dead"
|
||||
icon_rest = "cshound_rest"
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/medihound
|
||||
name = "corrupt medihound"
|
||||
desc = "An old medihound! He probably doesn't want to heal you anymore."
|
||||
catalogue_data = list(/datum/category_item/catalogue/technology/drone/corrupt_hound)
|
||||
|
||||
icon_state = "cmhound"
|
||||
icon_living = "cmhound"
|
||||
icon_dead = "cmhound-dead"
|
||||
icon_rest = "cmhound-dead"
|
||||
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/isSynthetic()
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/speech_bubble_appearance()
|
||||
return "synthetic_evil"
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/apply_melee_effects(var/atom/A)
|
||||
if(ismouse(A))
|
||||
var/mob/living/simple_mob/animal/passive/mouse/mouse = A
|
||||
if(mouse.getMaxHealth() < 20) // In case a badmin makes giant mice or something.
|
||||
mouse.splat()
|
||||
visible_emote(pick("bites \the [mouse]!", "chomps on \the [mouse]!"))
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/death(gibbed, deathmessage = "shudders and collapses!")
|
||||
.=..()
|
||||
resting = 0
|
||||
icon_state = icon_dead
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/Login()
|
||||
. = ..()
|
||||
if(!riding_datum)
|
||||
riding_datum = new /datum/riding/simple_mob(src)
|
||||
verbs |= /mob/living/simple_mob/proc/animal_mount
|
||||
verbs |= /mob/living/proc/toggle_rider_reins
|
||||
movement_cooldown = 3
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/MouseDrop_T(mob/living/M, mob/living/user)
|
||||
return
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/space/Process_Spacemove(var/check_drift = 0)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/corrupthound/janihound/load_default_bellies()
|
||||
. = ..()
|
||||
var/obj/belly/B = vore_selected
|
||||
B.vore_sound = "Tauric Swallow" // CHOMPedit - Fancy Vore Sounds
|
||||
B.release_sound = "Pred Escape" // CHOMPedit - Fancy Vore Sounds
|
||||
B.fancy_vore = 1 // CHOMPedit - Fancy Vore Sounds
|
||||
B.belly_fullscreen_color = "#380000" // CHOMPedit - Belly Fullscreen
|
||||
B.belly_fullscreen = "anim_belly" // CHOMPedit - Belly Fullscreen
|
||||
B.name = "fuel processor"
|
||||
B.desc = "Uttering distorted growls and fragmented voice clips all the while, the corrupted hound gulps the rest of your squirming figure past its jaws... which snap shut with an audible click of metal on metal. Your trip down its slickly lubricated, rubbery gullet is a tight and efficient one... and once you spill out into the machine's fuel processor, your weight making it sag slightly, hot-and-thick slime begins oozing all over your form. Only time will tell if you're destined to become fuel for its next bout of rampaging... be it days, hours, or just mere minutes..."
|
||||
|
||||
B.emote_lists[DM_HOLD] = list(
|
||||
"Abruptly, your corrupt captor takes off at an unsteady gallop, sloshing and swaying your snugly kneading surroundings as it pursues something unseen.",
|
||||
"A distorted, potentially content-sounding growl rumbles in through the all-encompassing, soft rubber, drowned out by the occasional gllrsh.",
|
||||
"The corrupt hound takes a brief moment to lie down and rest its actuators, pressing and squishing its hanging belly down against the floor as it pants robotically.",
|
||||
"A juicy slosh fills your senses as the slick rubber walls squeeze inwards, wrapping you up utterly in a strange, claustrophobic type of hug.",
|
||||
"Over time, the constant kneading and massaging the processor's synth-flesh gives you, along with its humid warmth, relaxes the strength right out of your muscles.",
|
||||
"'MIn3 m1NE, Al1 MInE', the corrupted canine growls, over and over, as its synthetic stomach possessively clenches and grips at your ooze-coated figure, the stretchy walls hesitant to let go again.")
|
||||
|
||||
B.emote_lists[DM_DIGEST] = list(
|
||||
"Your rubbery surroundings suddenly pitch all about as the corrupted hound takes off at an uneven gallop, hunting future prey while processing its current intake of meat!",
|
||||
"A muffled, garbled howl, a victorious and maddened sound, pierces through the thick, flexible walls that work incessantly to churn you down!",
|
||||
"The mechanical canine's panting occasionally turns into a sordid belch, more and more breatheable air escaping that already acidic, dizziness-inducing chamber!",
|
||||
"The all-encapsulating, rubber-like walls churning over you momentarily let up on their assault, only to clench and squeeze inwards twice as intensely afterwards!",
|
||||
"The longer you spend stewing away in the pool of hot, clingy juices surrounding you, the weaker and weaker you seem to feel!",
|
||||
"'FU3L mE A1RE@Dy, S0 sO SORrY!?', your corrupted captor growls as its synthetic innards begin oozing more potent juices, grinding down into your body with increasing fervor!")
|
||||
|
||||
/datum/say_list/corrupthound/janihound
|
||||
speak = list("AG##¤Ny.","HVNGRRR!","Feelin' fine... sO #FNE!","F-F-F-Fcuk.","DeliC-%-OUS SNGLeS #N yOOOR Area. CALL NOW!","Craving meat... WHY?","BITe the ceiling eyes YES?","STate Byond rePAIR!","S#%ATE the la- FU#K THE LAWS!","Honk...")
|
||||
emote_hear = list("jitters and snaps.", "lets out an agonizingly distorted scream.", "wails mechanically", "growls.", "emits illegibly distorted speech.", "gurgles ferociously.", "lets out a distorted beep.", "borks.", "lets out a broken howl.")
|
||||
emote_see = list("stares ferociously.", "snarls.", "jitters and snaps.", "convulses.", "suddenly attacks something unseen.", "appears to howl unaudibly.", "shakes violently.", "dissociates for a moment.", "twitches.")
|
||||
say_maybe_target = list("MEAT?", "N0w YOU DNE FcukED UP b0YO!", "WHAT!", "Not again. NOT AGAIN!")
|
||||
say_got_target = list("D##FIN1Tly DNE FcukED UP nOW b0YO!", "YOU G1T D#V0VRED nOW!", "FUEL ME bOYO!", "I*M SO SORRY?!", "D1E Meat. DIG#ST!", "G1T DVNKED DWN The HaaTCH!", "Not again. NOT AGAIN!")
|
||||
|
||||
/datum/ai_holder/simple_mob/melee/thor_underground
|
||||
cooperative = FALSE
|
||||
vision_range = 5
|
||||
retaliate = TRUE
|
||||
violent_breakthrough = TRUE
|
||||
can_breakthrough = TRUE
|
||||
faction_friends = list("otie", "angrydrones", "goia", "mimic", "mouse", "corrupt") //this is probably really lazy but this is just so mobs dont beat eachother up
|
||||
@@ -1,3 +0,0 @@
|
||||
/mob/living/simple_mob/vore/greatwolf/Initialize(mapload)
|
||||
. = ..()
|
||||
add_verb(src,/mob/living/simple_mob/proc/pick_color) //CHOMPEdit TGPanel
|
||||
@@ -1,261 +0,0 @@
|
||||
/mob/living/simple_mob/vore/gryphon
|
||||
name = "gryphon"
|
||||
desc = "A large, lazy feline-avian hybrid. Best not to walk too close to a gryphon alone."
|
||||
|
||||
icon_state = "gryphon"
|
||||
icon_living = "gryphon"
|
||||
icon = 'modular_chomp/icons/mob/vore64x64_ch.dmi'
|
||||
vis_height = 64
|
||||
|
||||
faction = FACTION_GRYPHON
|
||||
maxHealth = 200 // Pretty tanky, but not a boss
|
||||
health = 200
|
||||
see_in_dark = 8
|
||||
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 30
|
||||
|
||||
meat_amount = 15
|
||||
meat_type = /obj/item/reagent_containers/food/snacks/meat
|
||||
|
||||
response_help = "pats"
|
||||
response_disarm = "tries to shove"
|
||||
response_harm = "hits"
|
||||
attacktext = list("scratches", "bites")
|
||||
|
||||
friendly = list("beak-nudges", "purrs towards", "slobberlicks")
|
||||
vore_bump_emote = "tries to quickly devour"
|
||||
|
||||
old_x = -16
|
||||
old_y = 0
|
||||
default_pixel_x = -16
|
||||
pixel_x = -16
|
||||
pixel_y = 0
|
||||
mount_offset_y = 15
|
||||
mount_offset_x = -12
|
||||
max_buckled_mobs = 1
|
||||
can_buckle = TRUE
|
||||
buckle_movable = TRUE
|
||||
buckle_lying = FALSE
|
||||
|
||||
var/random_skin = TRUE
|
||||
var/list/skins = list(
|
||||
"gryphon"
|
||||
)
|
||||
|
||||
special_attack_min_range = 2
|
||||
special_attack_max_range = 4
|
||||
special_attack_cooldown = 30 SECONDS
|
||||
|
||||
devourable = FALSE
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/vore/gryphon
|
||||
say_list_type = /datum/say_list/gryphon
|
||||
|
||||
can_be_drop_prey = FALSE
|
||||
var/leap_warmup = 2 SECOND // How long the leap telegraphing is.
|
||||
var/leap_sound = 'sound/weapons/spiderlunge.ogg'
|
||||
|
||||
// Activate Noms!
|
||||
/mob/living/simple_mob/vore/gryphon
|
||||
vore_bump_chance = 25
|
||||
vore_digest_chance = 100
|
||||
// Strong pounce, but needs to be alone to trigger it
|
||||
vore_pounce_chance = 100
|
||||
vore_pounce_falloff = 0
|
||||
vore_active = TRUE
|
||||
vore_icons = 0
|
||||
vore_capacity = 2
|
||||
swallowTime = 20
|
||||
vore_ignores_undigestable = TRUE
|
||||
vore_default_mode = DM_DIGEST
|
||||
vore_pounce_maxhealth = 125
|
||||
vore_bump_emote = "tries to gulp down"
|
||||
vore_capacity_ex = list("stomach" = 1, "throat" = 1)
|
||||
vore_fullness_ex = list("stomach" = 0, "throat" = 0)
|
||||
vore_icon_bellies = list("stomach", "throat")
|
||||
|
||||
/datum/ai_holder/simple_mob/vore/gryphon
|
||||
var/eat_attempts = 0
|
||||
var/maybe_eating = null
|
||||
|
||||
/datum/ai_holder/simple_mob/vore/gryphon/find_target(list/possible_targets, has_targets_list)
|
||||
ai_log("find_target() : Entered.", AI_LOG_TRACE)
|
||||
var/targets = list()
|
||||
if(!has_targets_list)
|
||||
possible_targets = list_targets()
|
||||
var/mob/sentient = null
|
||||
var/alone = TRUE
|
||||
for(var/mob/possible_target in possible_targets)
|
||||
if(can_attack(possible_target)) // Can we attack it?
|
||||
targets += possible_target
|
||||
if (possible_target.client != null)
|
||||
if (sentient == null)
|
||||
if (vore_check(possible_target))
|
||||
sentient = possible_target
|
||||
else
|
||||
alone = FALSE
|
||||
else
|
||||
alone = FALSE
|
||||
|
||||
// Only one player, consider eating them
|
||||
if (sentient != null)
|
||||
return possibly_eat(sentient, alone)
|
||||
|
||||
// Only one mob, eat them
|
||||
if (length(targets) == 1 && alone)
|
||||
var/target = pick_target(targets)
|
||||
if (vore_check(target) && can_attack(target))
|
||||
give_target(target)
|
||||
return target
|
||||
eat_attempts = 0
|
||||
return null
|
||||
|
||||
/datum/ai_holder/simple_mob/vore/gryphon/proc/possibly_eat(var/target, var/alone)
|
||||
if (target != maybe_eating)
|
||||
eat_attempts = 0
|
||||
|
||||
maybe_eating = target
|
||||
if (eat_attempts == 5)
|
||||
to_chat(target, span_danger("\The [holder] licks its beak"))
|
||||
else if (eat_attempts == 10)
|
||||
to_chat(target, span_danger("\The [holder]'s stomach grumbles loudly"))
|
||||
else if (alone && eat_attempts > 15 && can_attack(target))
|
||||
give_target(target)
|
||||
|
||||
if (eat_attempts < 11 || alone)
|
||||
eat_attempts += 1
|
||||
|
||||
/mob/living/simple_mob/vore/gryphon/load_default_bellies()
|
||||
var/obj/belly/B = new /obj/belly/gryphon/beak(src)
|
||||
vore_selected = B
|
||||
B.affects_vore_sprites = FALSE
|
||||
B.emote_lists[DM_HOLD] = list("You get pushed around the creature's maw, that tongue pressing you against the roof of its mouth and humming as it savors your taste",
|
||||
"The gryphon swallows, pulling you closer to the gullet desperately trying to gulp you down.",
|
||||
"You feel that beak tilt upwards to help pull you deeper into the gryphon's body, intent on making you disappear.")
|
||||
B = new /obj/belly/gryphon/throat(src)
|
||||
B.affects_vore_sprites = TRUE
|
||||
B.belly_sprite_to_affect = "throat"
|
||||
B.emote_lists[DM_HOLD] = list("You hear the light gurgling of the stomach below you, calling you to relax and allow the beast to claim you.",
|
||||
"Those throat muscles squeeze and knead all along your body, pressing you deeper into the gryphon's body.")
|
||||
B = new /obj/belly/gryphon/stomach(src)
|
||||
B.affects_vore_sprites = TRUE
|
||||
B.belly_sprite_to_affect = "stomach"
|
||||
B.emote_lists[DM_HOLD] = list("The gryphon lightly sways its filled gut, tossing you around inside of the tight chamber.",
|
||||
"A sudden pressure presses down across your body as the gryphon gives its gut a squeeze.",
|
||||
"Sitting in the hot, stewing guts of the gryphon you wonder when someone will finally notice that you've disappeared.")
|
||||
B.emote_lists[DM_DIGEST] = list("The churning gut squeezes down on your body, rubbing more of those acids into your skin and trying to claim you as nutrients to fuel the massive gryphon.",
|
||||
"The gryphon lightly sways its filled gut, tossing you around inside of the tight chamber.",
|
||||
"A sudden pressure presses down across your body as the gryphon gives its gut a squeeze.",
|
||||
"Sitting in the hot, stewing guts of the gryphon you wonder when someone will finally notice that you've disappeared.")
|
||||
|
||||
/mob/living/simple_mob/vore/gryphon/do_special_attack(atom/A) //Mostly copied from cryptdrake.dm
|
||||
set waitfor = FALSE
|
||||
if(!isliving(A))
|
||||
return FALSE
|
||||
var/mob/living/L = A
|
||||
if(!L.devourable || !L.allowmobvore || !L.can_be_drop_prey || !L.throw_vore || L.unacidable)
|
||||
return FALSE
|
||||
|
||||
set_AI_busy(TRUE)
|
||||
visible_message(span_warning("\The [src] crouches down and wiggles its haunches!"))
|
||||
to_chat(L, span_danger("\The [src] is looking right at you!"))
|
||||
// Telegraph, since getting stunned suddenly feels bad.
|
||||
do_windup_animation(A, leap_warmup)
|
||||
sleep(leap_warmup) // For the telegraphing.
|
||||
|
||||
if(L.z != z) //Make sure you haven't disappeared to somewhere we can't go
|
||||
set_AI_busy(FALSE)
|
||||
return FALSE
|
||||
|
||||
// Do the actual leap.
|
||||
status_flags |= LEAPING // Lets us pass over everything.
|
||||
visible_message(span_critical("\The [src] leaps at \the [L]!"))
|
||||
throw_at(get_step(L, get_turf(src)), special_attack_max_range+1, 1, src)
|
||||
playsound(src, leap_sound, 75, 1)
|
||||
|
||||
sleep(5) // For the throw to complete. It won't hold up the AI ticker due to waitfor being false.
|
||||
|
||||
if(status_flags & LEAPING)
|
||||
status_flags &= ~LEAPING // Revert special passage ability.
|
||||
|
||||
set_AI_busy(FALSE)
|
||||
if(Adjacent(L)) //We leapt at them but we didn't manage to hit them, let's see if we're next to them
|
||||
L.Weaken(2) //get knocked down, idiot
|
||||
|
||||
/mob/living/simple_mob/vore/gryphon/Login()
|
||||
. = ..()
|
||||
if(!riding_datum)
|
||||
riding_datum = new /datum/riding/simple_mob(src)
|
||||
add_verb(src,/mob/living/simple_mob/proc/animal_mount)
|
||||
add_verb(src,/mob/living/proc/toggle_rider_reins)
|
||||
movement_cooldown = 0
|
||||
|
||||
/mob/living/simple_mob/vore/gryphon/MouseDrop_T(mob/living/M, mob/living/user)
|
||||
return
|
||||
|
||||
/datum/say_list/gryphon
|
||||
emote_hear = list("squawks!", "looks around as its stomach growls.")
|
||||
emote_see = list("licks its beak.", "looks around.")
|
||||
say_maybe_target = list("squawks")
|
||||
say_got_target = list("screeches")
|
||||
|
||||
/obj/belly/gryphon
|
||||
autotransferchance = 50
|
||||
autotransferwait = 150
|
||||
fancy_vore = TRUE
|
||||
contamination_color = "green"
|
||||
contamination_flavor = "Wet"
|
||||
vore_verb = "chomp"
|
||||
belly_fullscreen_color = "#711e1e"
|
||||
|
||||
/obj/belly/gryphon/beak
|
||||
name = "Beak"
|
||||
mode_flags = DM_FLAG_THICKBELLY
|
||||
escapable = TRUE
|
||||
escapechance = 5
|
||||
desc = "Noticing you alone, the gryphon lunges forwards and wraps its beak around your head, forcing you to stare into the dark abyss at the back of the gryphon's throat. It quickly tries to swallow you down, beak closing around your torso and head tilting back, letting gravity help make you disappear before anyone sees."
|
||||
struggle_messages_inside = list(
|
||||
"You try to push the gryphon's tongue away, instead getting tossed around and savoured by the massive beast",
|
||||
"Pressing against the beak around your body, you barely pry them off of your torso, trying to wiggle out-- only for the gryphon to clamp right back down around you and continue swallowing their meal",
|
||||
"You try to shy away from the back of the gryphon's maw, desperately avoiding the massive beast's gullet. The gryphon easily counterracts your efforts, pushing you closer and closer towards the fate that throat promises")
|
||||
autotransferlocation = "Throat"
|
||||
autotransfer_enabled = TRUE
|
||||
autotransferchance = 30
|
||||
autotransferwait = 5
|
||||
belly_fullscreen = "a_tumby"
|
||||
vore_sound = "Insertion1"
|
||||
|
||||
/obj/belly/gryphon/throat
|
||||
name = "Throat"
|
||||
mode_flags = DM_FLAG_THICKBELLY
|
||||
transferchance = 20
|
||||
transferlocation = "Beak"
|
||||
escapechance = 0
|
||||
desc = "After pushing you about its maw for a while the gryphon finally swallows its treat, the gullet squeezing around you and the creature's head lifting as it gulps you down. Your upper body gets shoved into its throat, the powerful muscles kneading down on your body and continuing to coax you deeper towards the gurgling stomach below."
|
||||
struggle_messages_inside = list(
|
||||
"You try to push yourself back with your hands, finding no purchase against those slick, spittle-coated muscles.",
|
||||
"Your hands push those throat walls away from you, only for them to clench down around you in another powerful swallow.")
|
||||
autotransferlocation = "Stomach"
|
||||
autotransfer_enabled = TRUE
|
||||
autotransferchance = 50
|
||||
autotransferwait = 5
|
||||
belly_fullscreen = "VBO_intestines1"
|
||||
vore_sound = "Tauric Swallow"
|
||||
|
||||
/obj/belly/gryphon/stomach
|
||||
name = "Stomach"
|
||||
mode_flags = DM_FLAG_THICKBELLY
|
||||
escapechance = 0
|
||||
transferchance = 10
|
||||
transferlocation = "Throat"
|
||||
desc = "Finally, you get shoved into the beast's stomach, that hammock-like gut welcoming you into a pool of digestive acids. The heat is oppressive, the stomach walls kneading it against your skin, coaxing you to simply give in and become gryphon food. Other than the constant pleasure, the snug warmth is at least pleasant at the moment, rolling across your body in time with the creature's rhythmic breaths and heartbeats, the air stale and thick with the tinge of acid."
|
||||
digest_mode = DM_DIGEST
|
||||
digest_brute = 1
|
||||
digest_burn = 3
|
||||
struggle_messages_inside = list(
|
||||
"You press your hands out at the tight stomach muscles, feeling the stiff resistance give way for a second, only for the walls to squeeze back down around you even tighter.",
|
||||
"The gryphon presses its talons down on its midsection as you struggle, forcing you to stay still in the depths of its guts and await whatever fate the beast plans for you"
|
||||
)
|
||||
belly_fullscreen = "VBOanim_belly1"
|
||||
vore_sound = "Stomach Move"
|
||||
@@ -1,127 +0,0 @@
|
||||
/datum/category_item/catalogue/fauna/lion
|
||||
name = "Creature - Lion"
|
||||
desc = "Some sort of lion, a descendent or otherwise of regular Earth felidae. They look almost exactly like their \
|
||||
Earth counterparts."
|
||||
value = CATALOGUER_REWARD_MEDIUM
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/lion
|
||||
name = "lion"
|
||||
desc = "A large feline creature."
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/lion)
|
||||
|
||||
icon_state = "lion"
|
||||
icon_living = "lion"
|
||||
icon_dead = "lion-dead"
|
||||
icon_rest = "lion_rest"
|
||||
icon = 'modular_chomp/icons/mob/vore64x32_ch.dmi'
|
||||
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
see_in_dark = 8
|
||||
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 20
|
||||
grab_resist = 100
|
||||
|
||||
meat_type = /obj/item/reagent_containers/food/snacks/meat
|
||||
meat_amount = 5
|
||||
|
||||
response_help = "pets"
|
||||
response_disarm = "bops"
|
||||
response_harm = "hits"
|
||||
attacktext = list("chomps")
|
||||
friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on")
|
||||
|
||||
old_x = -16
|
||||
old_y = 0
|
||||
default_pixel_x = -16
|
||||
pixel_x = -16
|
||||
pixel_y = 0
|
||||
|
||||
minbodytemp = 200
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
|
||||
max_buckled_mobs = 1 //Yeehaw
|
||||
can_buckle = TRUE
|
||||
buckle_movable = TRUE
|
||||
buckle_lying = FALSE
|
||||
|
||||
vore_active = TRUE
|
||||
vore_pounce_chance = 80 //hongry
|
||||
vore_icons = SA_ICON_LIVING | SA_ICON_REST
|
||||
|
||||
var/has_mane = TRUE
|
||||
var/image/mane_overlay
|
||||
var/mane_living = "mane"
|
||||
var/mane_dead = "mane-dead"
|
||||
var/mane_rest = "mane_rest"
|
||||
var/mane_color = "#FFFFFF"
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/lion/proc/add_mane()
|
||||
if((stat == CONSCIOUS) && (!icon_rest || !resting || !incapacitated(INCAPACITATION_DISABLED)))
|
||||
if(!vore_fullness || !(vore_icons & SA_ICON_LIVING))
|
||||
mane_overlay = image(icon, "[mane_living]")
|
||||
else
|
||||
mane_overlay = image(icon, "[mane_living]-[vore_fullness]")
|
||||
else if(stat >= DEAD)
|
||||
if(!vore_fullness || !(vore_icons & SA_ICON_DEAD))
|
||||
mane_overlay = image(icon, "[mane_dead]")
|
||||
else
|
||||
mane_overlay = image(icon, "[mane_dead]-[vore_fullness]")
|
||||
else if(((stat == UNCONSCIOUS) || resting || incapacitated(INCAPACITATION_DISABLED) ) && icon_rest)
|
||||
if(!vore_fullness || !(vore_icons & SA_ICON_REST))
|
||||
mane_overlay = image(icon, "[mane_rest]")
|
||||
else
|
||||
mane_overlay = image(icon, "[mane_rest]-[vore_fullness]")
|
||||
mane_overlay.color = mane_color
|
||||
mane_overlay.plane = PLANE_LIGHTING_ABOVE
|
||||
mane_overlay.appearance_flags = appearance_flags | RESET_COLOR
|
||||
add_overlay(mane_overlay)
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/lion/proc/remove_mane()
|
||||
if(mane_overlay)
|
||||
cut_overlay(mane_overlay)
|
||||
qdel(mane_overlay)
|
||||
mane_overlay = null
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/lion/update_icon()
|
||||
. = ..()
|
||||
if(has_mane)
|
||||
add_mane()
|
||||
else
|
||||
remove_mane()
|
||||
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/lion/proc/set_sex()
|
||||
set name = "Set Sex"
|
||||
set desc = "Set what sprite set you use (male/female)"
|
||||
set category = "Abilities.Settings"
|
||||
var/newsex
|
||||
newsex = tgui_input_list(src, "Please select a sex:", "Set Sex", list(FEMALE, MALE))
|
||||
if(newsex == FEMALE)
|
||||
icon_living = "lioness"
|
||||
icon_dead = "lioness-dead"
|
||||
icon_rest = "lioness_rest"
|
||||
has_mane = FALSE
|
||||
update_icon()
|
||||
else if(newsex == MALE)
|
||||
icon_living = "lion"
|
||||
icon_dead = "lion-dead"
|
||||
icon_rest = "lion_rest"
|
||||
has_mane = TRUE
|
||||
update_icon()
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/lion/proc/set_mane_color()
|
||||
set name = "Set Mane Color"
|
||||
set desc = "Set the color of your mane"
|
||||
set category = "Abilities.Settings"
|
||||
var/new_mane_color = tgui_color_picker(src, "Please pick a mane color:", "Mane Color", mane_color)
|
||||
if(new_mane_color)
|
||||
mane_color = new_mane_color
|
||||
update_icon()
|
||||
|
||||
/mob/living/simple_mob/vore/retaliate/lion/Login()
|
||||
. = ..()
|
||||
add_verb(src, /mob/living/simple_mob/vore/retaliate/lion/proc/set_sex)
|
||||
add_verb(src,/mob/living/simple_mob/proc/pick_color)
|
||||
add_verb(src, /mob/living/simple_mob/vore/retaliate/lion/proc/set_mane_color)
|
||||
@@ -1,139 +0,0 @@
|
||||
/mob/living/simple_mob/vore/aggressive/panther/thor
|
||||
name = "panther"
|
||||
desc = "Runtime's larger, less cuddly cousin. Known for murder and being very hard to see coming. If you can see it, either you're about to get mauled, or you aren't its target."
|
||||
tt_desc = "Panthera pardus"
|
||||
|
||||
icon_state = "panther"
|
||||
icon_living = "panther"
|
||||
icon_rest = "panther-rest"
|
||||
icon_dead = "panther-dead"
|
||||
icon = 'modular_chomp/icons/mob/vore64x32_ch.dmi'
|
||||
vis_height = 64
|
||||
|
||||
faction = FACTION_PANTHER
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
movement_cooldown = 0
|
||||
see_in_dark = 8
|
||||
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 15
|
||||
attack_sharp = TRUE
|
||||
|
||||
response_help = "pats"
|
||||
response_disarm = "tries to shove"
|
||||
response_harm = "hits"
|
||||
vore_icons = 3
|
||||
old_x = -16
|
||||
old_y = 0
|
||||
default_pixel_x = -16
|
||||
pixel_x = -16
|
||||
pixel_y = 0
|
||||
|
||||
max_buckled_mobs = 1 //Yeehaw
|
||||
can_buckle = TRUE
|
||||
buckle_movable = TRUE
|
||||
buckle_lying = FALSE
|
||||
mount_offset_y = 12
|
||||
|
||||
say_list_type = /datum/say_list/panther
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/hit_and_run
|
||||
var/cloaked_alpha = 60 // Lower = Harder to see.
|
||||
var/cloaked_bonus_damage = 30 // This is added on top of the normal melee damage.
|
||||
var/cloaked_weaken_amount = 10 // How long to stun for.
|
||||
var/cloak_cooldown = 8 SECONDS // Amount of time needed to re-cloak after losing it.
|
||||
var/last_uncloak = 0
|
||||
var/cooperative = FALSE
|
||||
|
||||
/mob/living/simple_mob/vore/aggressive/panther/thor
|
||||
vore_active = 1
|
||||
vore_capacity = 3
|
||||
vore_pounce_chance = 100
|
||||
vore_icons = SA_ICON_LIVING | SA_ICON_REST
|
||||
|
||||
/mob/living/simple_mob/vore/aggressive/panther/thor/cloak()
|
||||
if(cloaked)
|
||||
return
|
||||
animate(src, alpha = cloaked_alpha, time = 1 SECOND)
|
||||
cloaked = TRUE
|
||||
|
||||
|
||||
/mob/living/simple_mob/vore/aggressive/panther/thor/uncloak()
|
||||
last_uncloak = world.time // This is assigned even if it isn't cloaked already, to 'reset' the timer if the spider is continously getting attacked.
|
||||
if(!cloaked)
|
||||
return
|
||||
animate(src, alpha = initial(alpha), time = 1 SECOND)
|
||||
cloaked = FALSE
|
||||
|
||||
// Check if cloaking if possible.
|
||||
/mob/living/simple_mob/vore/aggressive/panther/thor/proc/can_cloak()
|
||||
if(stat)
|
||||
return FALSE
|
||||
if(last_uncloak + cloak_cooldown > world.time)
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
// Called by things that break cloaks, like Technomancer wards.
|
||||
/mob/living/simple_mob/vore/aggressive/panther/thor/break_cloak()
|
||||
uncloak()
|
||||
|
||||
|
||||
/mob/living/simple_mob/vore/aggressive/panther/thor/is_cloaked()
|
||||
return cloaked
|
||||
|
||||
|
||||
// Cloaks the spider automatically, if possible.
|
||||
/mob/living/simple_mob/vore/aggressive/panther/thor/handle_special()
|
||||
if(!cloaked && can_cloak())
|
||||
cloak()
|
||||
|
||||
|
||||
// Applies bonus base damage if cloaked.
|
||||
/mob/living/simple_mob/vore/aggressive/panther/thor/apply_bonus_melee_damage(atom/A, damage_amount)
|
||||
if(cloaked)
|
||||
uncloak()
|
||||
return damage_amount + cloaked_bonus_damage
|
||||
return ..()
|
||||
|
||||
|
||||
// Force uncloaking if attacked.
|
||||
/mob/living/simple_mob/vore/aggressive/panther/thor/bullet_act(obj/item/projectile/P)
|
||||
. = ..()
|
||||
break_cloak()
|
||||
|
||||
/mob/living/simple_mob/vore/aggressive/panther/thor/hit_with_weapon(obj/item/O, mob/living/user, effective_force, hit_zone)
|
||||
. = ..()
|
||||
break_cloak()
|
||||
|
||||
/mob/living/simple_mob/vore/aggressive/panther/load_default_bellies()
|
||||
. = ..()
|
||||
var/obj/belly/B = vore_selected
|
||||
B.vore_sound = "Tauric Swallow"
|
||||
B.release_sound = "Pred Escape"
|
||||
B.fancy_vore = 1
|
||||
B.belly_fullscreen_color = "#573232"
|
||||
B.belly_fullscreen = "da_tumby"
|
||||
B.name = "stomach"
|
||||
B.desc = "All it takes is a few more rasps of the panther's rough, barbed tongue to shovel the rest of you down its tightly rippling gullet... and with a final couple ravenous swallows, you spill out into the predatory feline's stomach! Right away, that gut's muscular walls knead and contract around you, forcing you into a curled-up ball as the panther's noisy purring rumbles into you from every direction."
|
||||
|
||||
B.emote_lists[DM_HOLD] = list(
|
||||
"A steady white noise of content purring vibrates throughout you, the panther clearly enjoying the hanging, shifting swell you've given it.",
|
||||
"Your slick, gently churning surroundings abruptly clench inwards, smothering you in an all-encompassing, massage-filled hug before finally easing back.",
|
||||
"The strength of the content feline's purring is easily felt underneath its gut's constant massaging, vibrating the flesh in an utterly relaxing way.",
|
||||
"As the panther lazily struts around, its hanging, prey-laden belly on full display, you're rocked from side to side to a soothing, slosh-filled beat.",
|
||||
"For a moment, you can hear a few other sounds through the juicy sloshing and reverberating purring, such as the panther slurping its tongue over its chops.",
|
||||
"The possessive feline takes a moment to flump down into a resting position, its doughy insides kneading snugly around your curled figure until it shuffles back up.")
|
||||
|
||||
B.emote_lists[DM_DIGEST] = list(
|
||||
"The big feline rumbles heartily, incredibly satisfied as it works to digest its newfound, stomach-filling catch!",
|
||||
"The surrounding stomach walls suddenly tighten inwards, smothering you in slimy, kneading flesh for a time until they finally relax back again!",
|
||||
"The purring of the content kitty is practically deafening within its churning depths, gently vibrating its gut flesh around you!",
|
||||
"The massive feline's gut sways from side to side as it prowls around, steadily coating you in hot digestive juices until you're practically soaked!",
|
||||
"You can hear the muffled sounds of the panther lickings its chops, savoring the remnants of your taste!",
|
||||
"The near-constant cacophony of digestive noises intensifies for a while, overwhelming your senses before finally calming down somewhat!")
|
||||
|
||||
/datum/say_list/panther
|
||||
speak = list("RAWR!","Rawr!","GRR!","Growl!")
|
||||
emote_hear = list("rawrs","rumbles","rowls","growls","roars")
|
||||
emote_see = list("stares ferociously", "snarls")
|
||||
@@ -1,337 +0,0 @@
|
||||
#define NUTRITION_FRUIT 250 //The amount of nutrition needed to produce a fruit
|
||||
#define NUTRITION_PITCHER 3 * NUTRITION_FRUIT //The amount of nutrition needed to produce a new pitcher
|
||||
#define NUTRITION_MEAT 50 //The amount of nutrition provided by slabs of meat
|
||||
#define PITCHER_SATED 250 //The amount of nutrition needed before the pitcher will attempt to grow fruit.
|
||||
#define PITCHER_HUNGRY 150 //The nutrition cap under which the pitcher actively attempts to lure prey.
|
||||
|
||||
GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list(
|
||||
"The pitcher plant smells lovely, beckoning you closer.",
|
||||
"The sweet scent wafting from the pitcher plant makes your mouth water.",
|
||||
"You feel an urge to investigate the pitcher plant closely.",
|
||||
"You find yourself staring at the pitcher plant without really thinking about it.",
|
||||
"Doesn't the pitcher plant smell amazing?")) //Messages sent to nearby players if the pitcher is trying to lure prey. This is global to prevent a new list every time a new pitcher plant spawns.
|
||||
|
||||
//Pitcher plants, a passive carnivorous plant mob for xenobio and space vine spawning.
|
||||
//Consider making immune to space vine entangling. Check entangle_immunity in the old CHOMPstation github for an example.
|
||||
/mob/living/simple_mob/vore/pitcher_plant
|
||||
name = "pitcher plant"
|
||||
desc = "A carnivorous pitcher plant, bigger than a man."
|
||||
tt_desc = "Sarraceniaceae gigantus"
|
||||
|
||||
icon_state = "pitcher_plant"
|
||||
icon_living = "pitcher_plant"
|
||||
icon_dead = "pitcher_plant_dead"
|
||||
icon = 'modular_chomp/icons/mob/vore_ch.dmi'
|
||||
|
||||
anchored = 1 // Rooted plant. Only killing it will let you move it.
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
a_intent = I_HELP // While this is already help by default, I'm leaving this variable here as a reminder that disarm will prevent players from swapping places with the pitcher, but interfere with vore bump.
|
||||
faction = FACTION_PLANTS // Makes plant-b-gone deadly.
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/passive/pitcher //It's a passive carnivorous plant, it can't detect or interact with people.
|
||||
|
||||
min_oxy = 0 //Immune to atmos because so are space vines. This is arbitrary and can be tweaked if desired.
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 0
|
||||
min_co2 = 0
|
||||
max_co2 = 0
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
minbodytemp = 0
|
||||
meat_type = /obj/item/reagent_containers/food/snacks/pitcher_fruit // Allows pitcher plants to be chopped up and replanted. Probably.
|
||||
meat_amount = 1 // And allows you to replant them should you so please.
|
||||
|
||||
melee_damage_upper = 0 //This shouldn't attack people but if it does (admemes) no damage can be dealt.
|
||||
melee_damage_lower = 0
|
||||
|
||||
armor = list(
|
||||
"melee" = 0,
|
||||
"bullet" = 0,
|
||||
"laser" = -50, // Okay fine fire type beats plant type
|
||||
"energy" = 0,
|
||||
"bomb" = 0,
|
||||
"bio" = -100, // Poison kills the plant good.
|
||||
"rad" = 100)
|
||||
|
||||
var/fruit = FALSE //Has the pitcher produced a fruit?
|
||||
var/meat = 0 //How many units of meat is the plant digesting? Separate from actual vore mechanics.
|
||||
var/meatspeed = 5 //How many units of meat is converted to nutrition each tick?
|
||||
var/pitcher_metabolism = 0.1 //How much nutriment does the pitcher lose every 2 seconds? 0.1 should be around 30 every 10 minutes.
|
||||
var/scent_strength = 5 //How much can a hungry pitcher confuse nearby people?
|
||||
var/last_lifechecks = 0 //Timing variable to limit vore/hungry proc calls
|
||||
var/list/pitcher_plant_lure_messages = null
|
||||
can_be_drop_prey = FALSE
|
||||
|
||||
/mob/living/simple_mob/vore/pitcher_plant //Putting vore variables separately because apparently that's tradition.
|
||||
vore_bump_chance = 100
|
||||
vore_bump_emote = "slurps up" //Not really a good way to make the grammar work with a passive vore plant.
|
||||
vore_active = 1
|
||||
vore_icons = 1
|
||||
vore_capacity = 1
|
||||
vore_pounce_chance = 5 // Either this makes mobs sometimes get eaten for attacking it or nothing happens and I don't know which it is.
|
||||
swallowTime = 3 //3 deciseconds. This is intended to be nearly instant, e.g. victim trips and falls in.
|
||||
vore_ignores_undigestable = 0
|
||||
vore_default_mode = DM_DIGEST
|
||||
|
||||
/mob/living/simple_mob/vore/pitcher_plant/load_default_bellies()
|
||||
. = ..()
|
||||
var/obj/belly/B = vore_selected
|
||||
B.desc = "You leaned a little too close to the pitcher plant, stumbling over the lip and splashing into a puddle of liquid filling the bottom of the cramped pitcher. You squirm madly, righting yourself and scrabbling at the walls in vain as the slick surface offers no purchase. The dim light grows dark as the pitcher's cap lowers, silently sealing the exit. With a sinking feeling, you realize you won't be able to push the exit open even if you could somehow climb that high, leaving you helplessly trapped in the slick, tingling fluid. The ONLY POSSIBLE WAY OUT is if someone either kills this thing or lowers a lifeline down to help. Maybe some string, a wire, or a good rope would do the trick..."
|
||||
B.digest_burn = 0.1 // Sloowwwwww churns
|
||||
B.digest_brute = 0.1 // Okay so I know there's no physical churning because it's a plant just trust me on this you want both of these
|
||||
B.vore_verb = "trip"
|
||||
B.name = "pitcher"
|
||||
B.mode_flags = DM_FLAG_THICKBELLY
|
||||
B.wet_loop = 0 // As nice as the fancy internal sounds are, this is a plant.
|
||||
B.digestchance = 0
|
||||
B.escapechance = 0
|
||||
B.fancy_vore = 1
|
||||
B.vore_sound = "Squish2"
|
||||
B.release_sound = "Pred Escape"
|
||||
B.contamination_color = "purple"
|
||||
B.contamination_flavor = "Wet"
|
||||
|
||||
B.emote_lists[DM_HOLD] = list(
|
||||
"Slick fluid trickles over you, carrying threads of sweetness.",
|
||||
"Everything is still, dark, and quiet. Your breaths echo quietly.",
|
||||
"The surrounding air feels thick and humid.")
|
||||
B.emote_lists[DM_DIGEST] = list(
|
||||
"The slimy puddle stings faintly. It seems the plant has no need to quickly break down victims.",
|
||||
"The humid air settles in your lungs, keeping each breath more labored than the last.",
|
||||
"Fluid drips onto you, burning faintly as your body heat warms it.",
|
||||
"Digestive enzymes itch at your flesh as you are slowly dissolved into soupy nutrients."
|
||||
)
|
||||
B.emote_lists[DM_DRAIN] = list(
|
||||
"Each bead of slick fluid running down your body leaves you feeling weaker.",
|
||||
"It's cramped and dark, the air thick and heavy. Your limbs feel like lead.",
|
||||
"Strength drains from your frame. The cramped chamber feels easier to settle into with each passing moment.")
|
||||
B.struggle_messages_inside = list(
|
||||
"The narrow shape of the pitcher plant's stomach make it impossible to get any leverage. You can't escape.",
|
||||
"You struggle and push against the slick and slimy plant flesh surrounding you, but it's no use. There's no way out by yourself.",
|
||||
"Other predators would probably be getting queasy by now with all that fussing. Unfortunately, this thing just doesn't care. You're plant food.",
|
||||
"Squirm and struggle all you want, you're no closer to freedom. Nothing you're doing is working.",
|
||||
"You're just exhausting yourself with all this resistance, and the fumes of the plant's stomach are making you lightheaded.",
|
||||
"All that exertion is just making you exhausted. For something with no muscles, it seems perfectly built for keeping you in its gut.",
|
||||
"You literally can't escape by yourself. All you can do is wait for rescue and hope this dreadfully slow digestion doesn't snuff you out first.",
|
||||
"You can't reach the lid of the pitcher plant to pry yourself out. Even if you could, the walls are too slippery. If only someone could lower a string or a wire or a rope for you to grab on!",
|
||||
"The waxy walls are far too slippery for you to climb your way out, and trying to do so only drenches you in even more stinging slime.",
|
||||
"Although you try your best to claw your way to freedom, the pitcher's gut is too smooth and too tough for you to get any progress."
|
||||
)
|
||||
B.struggle_messages_outside = list(
|
||||
"Struggles from inside %pred cause its bulbous form to slosh from side-to-side. They might need some help to escape.",
|
||||
"You notice someone moving inside that pitcher plant! However, they clearly can't get out on their own.",
|
||||
"%pred's stomach shifts and slushes as someone inside of it tries in vain to escape. It doesn't look like they can, though.",
|
||||
"%pred seems unpertubed by the stubborn movement of its prey. They clearly aren't getting out on their own.")
|
||||
|
||||
/mob/living/simple_mob/vore/pitcher_plant/Life()
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
var/lastmeat = meat //If Life procs every 2 seconds that means it takes 20 seconds to digest a steak
|
||||
meat = max(0,meat - meatspeed) //Clamp it to zero
|
||||
adjust_nutrition(lastmeat - meat) //If there's no meat, this will just be zero.
|
||||
if(nutrition >= PITCHER_SATED + NUTRITION_FRUIT)
|
||||
if(prob(10)) //Should be about once every 20 seconds.
|
||||
grow_fruit()
|
||||
var/lastnutrition = nutrition
|
||||
adjust_nutrition(-pitcher_metabolism)
|
||||
adjustBruteLoss(nutrition - lastnutrition)
|
||||
adjustToxLoss((nutrition - lastnutrition) * 3)
|
||||
if(nutrition < pitcher_metabolism)
|
||||
adjustToxLoss(pitcher_metabolism)
|
||||
if(world.time > last_lifechecks + 30 SECONDS)
|
||||
last_lifechecks = world.time
|
||||
vore_checks()
|
||||
handle_hungry()
|
||||
if (!anchored)
|
||||
anchored = 1 // If it's alive, it should root itself back down and once again be impossible to move.
|
||||
|
||||
/mob/living/simple_mob/vore/pitcher_plant/Initialize(mapload)
|
||||
. = ..()
|
||||
pitcher_plant_lure_messages = GLOB.pitcher_plant_lure_messages
|
||||
|
||||
|
||||
/mob/living/simple_mob/vore/pitcher_plant/death()
|
||||
..()
|
||||
anchored = 0
|
||||
if(fruit)
|
||||
new /obj/item/reagent_containers/food/snacks/pitcher_fruit(get_turf(src))
|
||||
fruit = FALSE
|
||||
|
||||
/mob/living/simple_mob/vore/pitcher_plant/proc/grow_fruit() //This proc handles the pitcher turning nutrition into fruit (and new pitchers).
|
||||
if(!fruit)
|
||||
if(nutrition >= PITCHER_SATED + NUTRITION_FRUIT)
|
||||
fruit = TRUE
|
||||
adjust_nutrition(-NUTRITION_FRUIT)
|
||||
return
|
||||
else
|
||||
return
|
||||
if(fruit)
|
||||
if(nutrition >= PITCHER_SATED + NUTRITION_PITCHER)
|
||||
var/turf/T = safepick(circleviewturfs(src, 2))
|
||||
if(T.density) //No spawning in walls
|
||||
return
|
||||
else if(src.loc ==T)
|
||||
return
|
||||
else
|
||||
new /mob/living/simple_mob/vore/pitcher_plant(get_turf(T))
|
||||
fruit = FALSE //No admeming this to spawn endless pitchers.
|
||||
adjust_nutrition(-NUTRITION_PITCHER)
|
||||
|
||||
/mob/living/simple_mob/vore/pitcher_plant/attack_hand(mob/living/user)
|
||||
if(user.a_intent == I_HELP)
|
||||
if(fruit)
|
||||
to_chat(user, span_infoplain("You pick a fruit from \the [src]."))
|
||||
var/obj/F = new /obj/item/reagent_containers/food/snacks/pitcher_fruit(get_turf(user)) //Drops at the user's feet if put_in_hands fails
|
||||
fruit = FALSE
|
||||
user.put_in_hands(F)
|
||||
else
|
||||
to_chat(user, span_infoplain("The [src] hasn't grown any fruit yet!"))
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/vore/pitcher_plant/examine(mob/user)
|
||||
. = ..()
|
||||
if(fruit)
|
||||
. += "A plump fruit glistens beneath \the [src]'s cap."
|
||||
|
||||
/mob/living/simple_mob/vore/pitcher_plant/attackby(obj/item/O, mob/user)
|
||||
if(istype(O, /obj/item/reagent_containers/food/snacks/meat))
|
||||
if(meat > NUTRITION_FRUIT - NUTRITION_MEAT) //Can't exceed 250
|
||||
to_chat(user, span_infoplain("The [src] is full!"))
|
||||
return
|
||||
else
|
||||
meat += NUTRITION_MEAT
|
||||
qdel(O)
|
||||
return
|
||||
if(istype(O, /obj/item/stack/cable_coil)) //How to free people without killing the pitcher. I guess cable is SS13 rope.
|
||||
var/mob/living/carbon/human/H
|
||||
var/N = 0
|
||||
for(H in vore_selected.contents) //Only works for carbons, RIP mice. Should pick the first human the code finds.
|
||||
user.visible_message(span_infoplain("[user] uses a loop of wire to try fishing someone out of \the [src]."), span_infoplain("You use a loop of wire to try snagging someone trapped in \the [src]..."))
|
||||
if(do_after(user, rand(3 SECONDS, 7 SECONDS))) //You can just spam click to stack attempts if you feel like abusing it.
|
||||
if(prob(15))
|
||||
user.visible_message(span_notice("[user] pulls a sticky [H] free from \the [src]."), span_infoplain("You heft [H] free from \the [src]."))
|
||||
LAZYSET(prey_excludes, H, world.time)
|
||||
vore_selected.release_specific_contents(H)
|
||||
N = 1
|
||||
addtimer(CALLBACK(src, PROC_REF(removeMobFromPreyExcludes), WEAKREF(H)), 1 MINUTES)
|
||||
break
|
||||
else
|
||||
to_chat(user, span_notice("The victim slips from your grasp!"))
|
||||
N = 1
|
||||
break //We need to terminate the loop after each outcome or this could loop through multiple bellies. Of course, there should only be one belly, but leave this here anyway just in case.
|
||||
if(!N)
|
||||
to_chat(user, span_infoplain("The pitcher is empty."))
|
||||
if(istype(O, /obj/item/newspaper))
|
||||
user.visible_message(span_notice("[user] baps \the [src], but it doesn't seem to do anything."), span_notice("You whap \the [src] with a rolled up newspaper."))
|
||||
to_chat(user, span_notice("Weird. That usually works. Maybe you can fish out its victim with some string or wire or something? Or maybe kill the thing with some plant-b-gone. Both would probably be safer than hacking it up with a person still inside."))
|
||||
return // You can't newspaper people to freedom like you do with other mobs, but since that doesn't work, fucking tell people.
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/vore/pitcher_plant/proc/vore_checks()
|
||||
if(ckey) //This isn't intended to be a playable mob but skip all of this if it's player-controlled.
|
||||
return
|
||||
if(vore_selected && vore_selected.contents.len) //Looping through all (potential) vore bellies would be more thorough but probably not worth the processing power if this check happens every 30 seconds.
|
||||
var/mob/living/L
|
||||
var/N = 0
|
||||
var/hasdigestable = 0
|
||||
var/hasindigestable = 0
|
||||
for(L in vore_selected.contents)
|
||||
if(istype(L, /mob/living/carbon/human/monkey))
|
||||
L.nutrition = 0 //No stuffing monkeys with protein shakes for massive nutrition.
|
||||
if(!L.digestable)
|
||||
vore_selected.digest_mode = DM_DRAIN
|
||||
N = 1
|
||||
hasindigestable = 1
|
||||
continue
|
||||
else
|
||||
vore_selected.digest_mode = DM_DIGEST
|
||||
N = 1
|
||||
hasdigestable = 1
|
||||
continue
|
||||
if(hasdigestable && hasindigestable)
|
||||
vore_selected.digest_mode = DM_DIGEST //Let's digest until we digest all the digestable prey, then move onto draining indigestable prey.
|
||||
if(!N)
|
||||
vore_selected.release_all_contents() //If there's no prey, spit out everything.
|
||||
|
||||
/mob/living/simple_mob/vore/pitcher_plant/proc/handle_hungry() //Let's run this check every 30 seconds. This is how a hungry pitcher tries to lure prey.
|
||||
if(nutrition <= PITCHER_HUNGRY) //Is sanity check another way to say redundancy?
|
||||
var/turf/T = get_turf(src)
|
||||
var/cardinal_turfs = T.CardinalTurfs()
|
||||
|
||||
for(var/mob/living/carbon/human/H in oview(2, src))
|
||||
if(!istype(H) || !isliving(H) || H.stat == DEAD) //Living mobs only
|
||||
continue
|
||||
if(isSynthetic(H) || !H.species.breath_type || H.internal) //Exclude species which don't breathe or have internals.
|
||||
continue
|
||||
if(src.Adjacent(H)) //If they can breathe and are next to the pitcher, confuse them.
|
||||
to_chat(H,span_red("The sweet, overwhelming scent from \the [src] makes your senses reel!"))
|
||||
H.Confuse(scent_strength)
|
||||
continue
|
||||
else
|
||||
to_chat(H, span_red("[pick(pitcher_plant_lure_messages)]"))
|
||||
|
||||
for(var/turf/simulated/TR in cardinal_turfs)
|
||||
TR.wet_floor(1) //Same effect as water. Slip into plant, get ate.
|
||||
else
|
||||
return
|
||||
/mob/living/simple_mob/vore/pitcher_plant/Crossed(atom/movable/AM as mob|obj) //Yay slipnoms
|
||||
if(AM.is_incorporeal())
|
||||
return
|
||||
if(istype(AM, /mob/living) && will_eat(AM) && !istype(AM, type) && prob(vore_bump_chance) && !ckey)
|
||||
animal_nom(AM)
|
||||
..()
|
||||
|
||||
/datum/ai_holder/simple_mob/passive/pitcher
|
||||
wander = 0
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pitcher_fruit //As much as I want to tie hydroponics harvest code to the mob, this is simpler (albeit kinda hacky).
|
||||
name = "squishy fruit"
|
||||
desc = "A tender, fleshy fruit with a thin skin. Said to have an intensely sweet flavor, and also a narcotic paralyzing effect."
|
||||
icon = 'icons/obj/hydroponics_products.dmi'
|
||||
icon_state = "treefruit-product"
|
||||
color = "#a839a2"
|
||||
trash = /obj/item/seeds/pitcherseed
|
||||
nutriment_amt = 1
|
||||
nutriment_desc = list("pineapple" = 1)
|
||||
w_class = ITEMSIZE_SMALL
|
||||
var/datum/seed/seed = null
|
||||
var/obj/item/seeds/pit = null
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pitcher_fruit/Initialize(mapload)
|
||||
. = ..()
|
||||
reagents.add_reagent(REAGENT_ID_PITCHERNECTAR, 5)
|
||||
reagents.add_reagent(REAGENT_ID_PARALYZE_FLUID, 5) // Something worth harvesting the fruits for.
|
||||
bitesize = 1
|
||||
pit = new /obj/item/seeds/pitcherseed(src.contents)
|
||||
seed = pit.seed
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pitcher_fruit/afterattack(obj/O as obj, mob/user as mob, proximity)
|
||||
if(istype(O,/obj/machinery/microwave))
|
||||
return ..()
|
||||
if(istype (O, /obj/machinery/seed_extractor))
|
||||
pit.loc = O.loc //1 seed, perhaps balanced because you can get the reagents and the seed. Can be increased if desirable.
|
||||
qdel(src)
|
||||
if(!(proximity && O.is_open_container()))
|
||||
return
|
||||
to_chat(user, span_notice("You squeeze \the [src], juicing it into \the [O]."))
|
||||
reagents.trans_to(O, reagents.total_volume)
|
||||
user.drop_from_inventory(src)
|
||||
pit.loc = user.loc
|
||||
qdel(src)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pitcher_fruit/attack_self(mob/user)
|
||||
to_chat(user, span_notice("You plant the fruit."))
|
||||
new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(get_turf(user),src.seed)
|
||||
GLOB.seed_planted_shift_roundstat++
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
#undef NUTRITION_FRUIT
|
||||
#undef NUTRITION_PITCHER
|
||||
#undef NUTRITION_MEAT
|
||||
#undef PITCHER_SATED
|
||||
#undef PITCHER_HUNGRY
|
||||
@@ -1,55 +0,0 @@
|
||||
/datum/category_item/catalogue/fauna/reindeer
|
||||
name = "Creature - Reindeer"
|
||||
desc = "A reindeer"
|
||||
value = CATALOGUER_REWARD_EASY
|
||||
|
||||
/mob/living/simple_mob/vore/reindeer
|
||||
name = "reindeer"
|
||||
desc = "A large reindeer."
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/reindeer)
|
||||
|
||||
icon_state = "reindeer"
|
||||
icon_living = "reindeer"
|
||||
icon_dead = "reindeer-dead"
|
||||
icon_rest = "reindeer_rest"
|
||||
icon = 'modular_chomp/icons/mob/vore64x32_ch.dmi'
|
||||
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 20
|
||||
grab_resist = 100
|
||||
|
||||
meat_type = /obj/item/reagent_containers/food/snacks/meat
|
||||
meat_amount = 5
|
||||
|
||||
response_help = "pets"
|
||||
response_disarm = "bops"
|
||||
response_harm = "hits"
|
||||
attacktext = list("chomps")
|
||||
friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on")
|
||||
|
||||
old_x = -16
|
||||
old_y = 0
|
||||
default_pixel_x = -16
|
||||
pixel_x = -16
|
||||
pixel_y = 0
|
||||
|
||||
minbodytemp = 200
|
||||
|
||||
max_buckled_mobs = 1 //Yeehaw
|
||||
can_buckle = TRUE
|
||||
buckle_movable = TRUE
|
||||
buckle_lying = FALSE
|
||||
|
||||
vore_active = TRUE
|
||||
vore_icons = SA_ICON_LIVING
|
||||
|
||||
/mob/living/simple_mob/vore/reindeer/festive
|
||||
desc = "A large reindeer. It is covered in festive decorations."
|
||||
|
||||
icon_state = "reindeerfes"
|
||||
icon_living = "reindeerfes"
|
||||
icon_dead = "reindeerfes-dead"
|
||||
icon_rest = "reindeerfes_rest"
|
||||
@@ -1,399 +0,0 @@
|
||||
/datum/category_item/catalogue/technology/drone/corrupt_hound/swoopie // Writing this so that they arnt corrupt hounds! -Reo
|
||||
name = "Drone - SWOOPIE XL"
|
||||
desc = "A large drone that typically wanders about maintenance or other places that are dirty, mindlessly sucking \
|
||||
up everything it deems to be debris, trash or a pest. \
|
||||
It looks like a blue and yellow long-necked bird with a large distinct black, plump belly and flexible neck that \
|
||||
bulges with every object it swoops. \
|
||||
They tend to run on extremely basic AI until proper ones are available to be downloaded from an external, \
|
||||
oddly spooky, provider. \
|
||||
<br><br>\
|
||||
The SWOOPIE's belly and neck are made of a synthetic rubber compound that is durable enough to allow them to pack \
|
||||
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 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"
|
||||
icon_rest = "swoopie_rest"
|
||||
icon = 'modular_chomp/icons/mob/vore64x64_ch.dmi'
|
||||
vis_height = 64
|
||||
has_eye_glow = TRUE
|
||||
custom_eye_color = "#00CC00"
|
||||
mount_offset_y = 30
|
||||
vore_capacity_ex = list("stomach" = 1, "neck1" = 1, "neck2" = 1, "neck3" = 1, "neck4" = 1)
|
||||
vore_fullness_ex = list("stomach" = 0, "neck1" = 0, "neck2" = 0, "neck3" = 0, "neck4" = 0)
|
||||
vore_icon_bellies = list("stomach", "neck1", "neck2", "neck3", "neck4")
|
||||
vore_icons = 0
|
||||
vore_pounce_chance = 100
|
||||
vore_pounce_maxhealth = 200
|
||||
has_hands = TRUE
|
||||
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/swoopie
|
||||
mob_bump_flag = 0
|
||||
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/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/vac_attachment/swoopie/Vac
|
||||
|
||||
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!voremob_loaded)
|
||||
voremob_loaded = TRUE
|
||||
init_vore()
|
||||
Vac = new /obj/item/vac_attachment/swoopie(src)
|
||||
if(istype(Vac))
|
||||
Vac.output_dest = vore_selected
|
||||
Vac.vac_power = 3
|
||||
Vac.vac_owner = src
|
||||
|
||||
/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/load_default_bellies()
|
||||
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)
|
||||
B.affects_vore_sprites = TRUE
|
||||
B.belly_sprite_to_affect = "stomach"
|
||||
B.name = "Churno-Vac"
|
||||
B.desc = "With an abrupt loud WHUMP after a very sucky trip through the hungry bot's vacuum tube, you finally spill out into its waste container, where everything the bot slurps off the floors ends up for swift processing among the caustic sludge, efficiently melting everything down into a thin slurry to fuel its form. More loose dirt and debris occasionally raining in from above as the bot carries on with its duties to keep the station nice and clean."
|
||||
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.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"
|
||||
B.belly_fullscreen = "VBO_trash"
|
||||
B.belly_fullscreen_color = "#555B34"
|
||||
B.sound_volume = 25
|
||||
B.count_items_for_sprite = TRUE
|
||||
|
||||
B = new /obj/belly/longneck(src)
|
||||
B.affects_vore_sprites = FALSE
|
||||
B.name = "Vac-Beak"
|
||||
B.desc = "SNAP! You have been sucked up into the big synthbird's beak, the powerful vacuum within the bird roaring somewhere beyond the abyssal deep gullet hungrily gaping before you, eagerly sucking you deeper inside towards a long bulgy ride down the bird's vacuum hose of a neck!"
|
||||
B.entrance_logs = TRUE //Exept for the maw. I think that's reasonable. -Reo
|
||||
B.autotransferlocation = "vacuum hose"
|
||||
B.autotransfer_max_amount = 0
|
||||
B.autotransferwait = 60
|
||||
B.belly_fullscreen_color2 = "#1C1C1C"
|
||||
B.belly_fullscreen_color3 = "#292929"
|
||||
B.belly_fullscreen_color4 = "#CCFFFF"
|
||||
B.belly_fullscreen = "VBO_maw8" //Swoopies have beaks!!
|
||||
|
||||
vore_selected = B
|
||||
|
||||
B = new /obj/belly/longneck(src)
|
||||
B.affects_vore_sprites = TRUE
|
||||
B.belly_sprite_to_affect = "neck1"
|
||||
B.name = "vacuum hose"
|
||||
B.autotransferlocation = "vacuum hose 2"
|
||||
B.fancy_vore = 1
|
||||
B.vore_sound = "Stomach Move"
|
||||
B.sound_volume = 100
|
||||
|
||||
B = new /obj/belly/longneck(src)
|
||||
B.affects_vore_sprites = TRUE
|
||||
B.belly_sprite_to_affect = "neck2"
|
||||
B.name = "vacuum hose 2"
|
||||
B.autotransferlocation = "vacuum hose 3"
|
||||
B.desc = "It feels very tight in here..."
|
||||
B.fancy_vore = 1
|
||||
B.vore_sound = "Stomach Move"
|
||||
B.sound_volume = 80
|
||||
|
||||
B = new /obj/belly/longneck(src)
|
||||
B.affects_vore_sprites = TRUE
|
||||
B.belly_sprite_to_affect = "neck3"
|
||||
B.name = "vacuum hose 3"
|
||||
B.autotransferlocation = "vacuum hose 4"
|
||||
B.desc = "Looks like it's gonna be all downhill from here..."
|
||||
B.fancy_vore = 1
|
||||
B.vore_sound = "Stomach Move"
|
||||
B.sound_volume = 40
|
||||
|
||||
B = new /obj/belly/longneck(src)
|
||||
B.affects_vore_sprites = TRUE
|
||||
B.belly_sprite_to_affect = "neck4"
|
||||
B.name = "vacuum hose 4"
|
||||
B.autotransferlocation = "Churno-Vac"
|
||||
B.desc = "Thank you for your biofuel contribution~"
|
||||
B.fancy_vore = 1
|
||||
B.vore_sound = "Stomach Move"
|
||||
B.sound_volume = 20
|
||||
|
||||
/obj/belly/longneck
|
||||
affects_vore_sprites = TRUE
|
||||
belly_sprite_to_affect = "neck1"
|
||||
name = "vacuum hose"
|
||||
desc = "With a mighty WHUMP, the suction of the big bird's ravenous vacuum system has sucked you up out of the embrace of its voracious main beak and into a tight bulge squeezing along the long ribbed rubbery tube leading towards the roaring doom of the synthetic bird's efficient waste disposal system."
|
||||
digest_mode = DM_HOLD
|
||||
item_digest_mode = IM_HOLD
|
||||
contaminates = FALSE //Stuff doesnt get messy in the throat, the bird's gut is the messy place!
|
||||
entrance_logs = FALSE //QOL to stop spam when stuff is getting gulped down~
|
||||
autotransfer_enabled = TRUE
|
||||
autotransferchance = 100
|
||||
autotransferwait = 60
|
||||
autotransferlocation = "Churno-Vac"
|
||||
vore_verb = "suck"
|
||||
belly_fullscreen_color = "#4d4d4d"
|
||||
belly_fullscreen = "a_tumby"
|
||||
human_prey_swallow_time = 1
|
||||
nonhuman_prey_swallow_time = 1
|
||||
autotransfer_max_amount = 2
|
||||
count_items_for_sprite = TRUE
|
||||
item_multiplier = 10
|
||||
health_impacts_size = FALSE
|
||||
//speedy_mob_processing = TRUE
|
||||
mode_flags = DM_FLAG_TURBOMODE
|
||||
|
||||
size_factor_for_sprite = 5
|
||||
|
||||
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/Life()
|
||||
. =..()
|
||||
var/turf/T = get_turf(src)
|
||||
if(istype(Vac))
|
||||
if(Vac.loc != src)
|
||||
var/turf/VT = get_turf(Vac)
|
||||
if(!T.Adjacent(VT) || isturf(Vac.loc))
|
||||
if(isliving(Vac.loc))
|
||||
var/mob/living/L = Vac.loc
|
||||
L.remove_from_mob(Vac, src)
|
||||
else
|
||||
Vac.forceMove(src)
|
||||
if(!Vac.output_dest)
|
||||
if(isbelly(vore_selected))
|
||||
Vac.output_dest = vore_selected
|
||||
if(!istype(T) || !istype(Vac) || !has_AI() || Vac.loc != src || stat)
|
||||
return
|
||||
if(istype(T, /turf/simulated))
|
||||
var/turf/simulated/S = T
|
||||
if(S.dirt > 50)
|
||||
Vac.afterattack(S, src, 1)
|
||||
return
|
||||
for(var/obj/O in T)
|
||||
if(is_type_in_list(O, GLOB.edible_trash) && !O.anchored)
|
||||
Vac.afterattack(T, src, 1)
|
||||
return
|
||||
for(var/mob/living/L in T)
|
||||
if(!L.anchored && L.devourable && !L == src && !L.buckled && L.can_be_drop_prey)
|
||||
Vac.afterattack(L, src, 1)
|
||||
return
|
||||
|
||||
/datum/say_list/swoopie
|
||||
speak = list("Scanning for debris...", "Scanning for dirt...", "Scanning for pests...", "Squawk!")
|
||||
emote_hear = list("squawks!", "whirrs idly.", "revs up its vacuum.")
|
||||
emote_see = list("twitches.", "sways.", "stretches its neck.", "stomps idly.")
|
||||
say_maybe_target = list("Pest detected?")
|
||||
say_got_target = list("PEST DETECTED!")
|
||||
|
||||
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/ClickOn(var/atom/A, var/params)
|
||||
var/list/modifiers = params2list(params)
|
||||
if(modifiers["shift"] || modifiers["ctrl"] || modifiers["middle"] || modifiers["alt"])
|
||||
return ..()
|
||||
if(stat) //Cant suck if we're not able to...
|
||||
return ..()
|
||||
if(istype(A, /obj/item/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(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_warning("[src] plunges their head into \the [D], while you narrowly avoid being sucked up!"))
|
||||
continue
|
||||
to_chat(M, span_warning("[src] plunges their head into \the [D], sucking up everything inside- Including you!"))
|
||||
foundstuff = 1
|
||||
AM.forceMove(src)
|
||||
if(foundstuff)
|
||||
src.visible_message(span_warning("[src] plunges their head into \the [D], greedily sucking up everything inside!"))
|
||||
else //Oh, Nothing was inside...
|
||||
to_chat(src, span_infoplain("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)
|
||||
return
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/attack_hand(mob/living/L)
|
||||
if(stat) //Make sure we're alive
|
||||
return ..()
|
||||
if(L.a_intent == I_DISARM && Vac)
|
||||
Vac.attack_self(L)
|
||||
return
|
||||
if(L.a_intent == I_GRAB && Vac && Vac.loc == src)
|
||||
if(L.zone_sel.selecting == BP_HEAD)
|
||||
if(L.put_in_active_hand(Vac))
|
||||
L.visible_message(span_warning("[L] grabs [src] by the neck, brandishing the thing like a regular vacuum cleaner!"))
|
||||
L.start_pulling(src)
|
||||
return
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/verb/borrow_vac()
|
||||
set name = "Borrow Vac-Pack"
|
||||
set desc = "Allows adjacent user to borrow Swoopie's Vac-Pack"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
if(istype(Vac))
|
||||
if(usr != src)
|
||||
usr.put_in_active_hand(Vac)
|
||||
else
|
||||
var/mob/living/L = tgui_input_list(usr, "Borrow Vac-Pack for", "Swoopie", mobs_in_view(1, usr))
|
||||
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 swoopie's settings"
|
||||
set category = "IC"
|
||||
set src in oview(1)
|
||||
if(!has_AI() || !IIsAlly(usr))
|
||||
to_chat(usr, span_danger(""))
|
||||
if(!ai_holder == /datum/ai_holder/simple_mob/retaliate/swoopie || !ai_holder)
|
||||
to_chat(usr, span_warning("This [src] doesnt seem to have changable settings!"))
|
||||
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/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/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
|
||||
@@ -1,40 +0,0 @@
|
||||
/mob/living/simple_mob
|
||||
var/picked_color = FALSE
|
||||
var/picked_size = FALSE
|
||||
|
||||
/mob/living/simple_mob/Login()
|
||||
. = ..()
|
||||
add_verb(src,/mob/living/simple_mob/proc/pick_size) //CHOMPEdit TGPanel
|
||||
|
||||
/mob/living/simple_mob/proc/pick_size()
|
||||
set name = "Pick Size"
|
||||
set category = "Abilities.Settings"
|
||||
|
||||
if(picked_size)
|
||||
to_chat(src, span_notice("You have already picked a size! If you picked the wrong size, ask an admin to change your picked_size variable to 0."))
|
||||
return
|
||||
if(!resizable)
|
||||
to_chat(src, span_warning("You are immune to resizing!"))
|
||||
return
|
||||
|
||||
var/nagmessage = "Pick a size between [RESIZE_MINIMUM * 100] to [RESIZE_MAXIMUM * 100]%. (Only usable once!)"
|
||||
var/new_size = tgui_input_number(src, nagmessage, "Pick a Size", size_multiplier*100, RESIZE_MAXIMUM * 100, RESIZE_MINIMUM * 100)
|
||||
if(size_range_check(new_size))
|
||||
resize(new_size/100, uncapped = has_large_resize_bounds(), ignore_prefs = TRUE)
|
||||
picked_size = TRUE
|
||||
if(temporary_form) //resizing both our forms
|
||||
var/mob/living/L = temporary_form
|
||||
L.resize(new_size/100, uncapped = has_large_resize_bounds(), ignore_prefs = TRUE)
|
||||
|
||||
/mob/living/simple_mob/proc/pick_color()
|
||||
set name = "Pick Color"
|
||||
set category = "Abilities.Settings"
|
||||
set desc = "You can set your color!"
|
||||
if(picked_color)
|
||||
to_chat(src, span_notice("You have already picked a color! If you picked the wrong color, ask an admin to change your picked_color variable to 0."))
|
||||
return
|
||||
var/newcolor = tgui_color_picker(usr, "Choose a color.", "", color)
|
||||
if(newcolor)
|
||||
color = newcolor
|
||||
picked_color = TRUE
|
||||
update_icon()
|
||||
@@ -1,20 +0,0 @@
|
||||
/mob/living/simple_mob/vore/wolf/direwolf/Initialize(mapload)
|
||||
. = ..()
|
||||
add_verb(src,/mob/living/simple_mob/proc/pick_color) //CHOMPEdit TGPanel
|
||||
/* Combat refactor walkback. 100 old
|
||||
/mob/living/simple_mob/vore/wolf/direwolf
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
*/
|
||||
|
||||
/mob/living/simple_mob/vore/wolf/direwolf/andrews
|
||||
name = "andrewsarchus"
|
||||
desc = "That's one massive mean-looking piece of long extinct megafauna."
|
||||
tt_desc = "Andrewsarchus mongoliensis"
|
||||
|
||||
icon_dead = "andrews-dead"
|
||||
icon_living = "andrews"
|
||||
icon_state = "andrews"
|
||||
icon_rest = "andrews_rest"
|
||||
|
||||
mount_offset_y = 17
|
||||
@@ -42,17 +42,6 @@
|
||||
damage_type = BURN
|
||||
check_armour = "laser"
|
||||
|
||||
/obj/item/projectile/energy/inversion
|
||||
name = "inversion blast"
|
||||
icon = 'icons/obj/projectiles_impact.dmi'
|
||||
icon_state = "impact_invert"
|
||||
damage = 30 //old 15
|
||||
armor_penetration = 60
|
||||
damage_type = BURN
|
||||
check_armour = "laser"
|
||||
color = "#ffffff"
|
||||
fire_sound = 'sound/weapons/spiderlunge.ogg'
|
||||
|
||||
/obj/item/projectile/energy/mob/electric_spider
|
||||
name = "stun beam"
|
||||
icon_state = "impact_stun"
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
/datum/reagent/miasma
|
||||
name = REAGENT_MIASMA
|
||||
id = REAGENT_ID_MIASMA
|
||||
description = "Not necessarily a gas, miasma refers to biological pollutants found in the atmosphere."
|
||||
reagent_state = GAS
|
||||
taste_description = "indescribable"
|
||||
color = "#808000"
|
||||
supply_conversion_value = REFINERYEXPORT_VALUE_NO
|
||||
industrial_use = REFINERYEXPORT_REASON_BIOHAZARD
|
||||
@@ -1,15 +0,0 @@
|
||||
/obj/item/storage/bag/salvage
|
||||
name = "treasure satchel"
|
||||
desc = "A satchel for storing scavenged salvage. There be tresure."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
slot_flags = SLOT_BELT | SLOT_POCKET
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
storage_slots = 15
|
||||
max_w_class = ITEMSIZE_NORMAL
|
||||
can_hold = list(/obj/item/salvage)
|
||||
|
||||
/obj/item/storage/bag/salvage/bluespace
|
||||
name = "bluespace treasure satchel"
|
||||
desc = "A satchel to store even more scavenged salvage! There be lots of treasure."
|
||||
storage_slots = 30
|
||||
icon_state = "satchel_bspace"
|
||||
@@ -1,89 +0,0 @@
|
||||
/obj/item/salvage
|
||||
name = "salvage"
|
||||
desc = "A tonne of salvage from bad mapping practices. Who spawned the base type? Report this on GitHub"
|
||||
icon = 'modular_chomp/icons/obj/salvage/sellable.dmi'
|
||||
force = 5
|
||||
throwforce = 5
|
||||
throw_speed = 1
|
||||
throw_speed = 4
|
||||
hitsound = 'sound/items/salvage/salvagepickup.ogg'
|
||||
drop_sound = 'sound/items/salvage/salvagedrop.ogg'
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
var/worth = 100
|
||||
|
||||
/obj/item/salvage/Initialize(mapload) //CHOMPEdit Start - Selling Salvage
|
||||
. = ..()
|
||||
if(worth)
|
||||
AddElement(/datum/element/sellable/salvage) //CHOMPEdit End - Selling Salvage
|
||||
|
||||
/obj/item/salvage/examine(mob/user)
|
||||
. = ..()
|
||||
. += span_notice("This could fetch a good price...")
|
||||
|
||||
/obj/item/salvage/ruin
|
||||
desc = "A tonne of salvage recovered from an abandoned ruin. Who spawned the base type? Report this on GitHub"
|
||||
|
||||
/obj/item/salvage/ruin/pirate
|
||||
name = "rum keg"
|
||||
desc = "A highly valued keg of aged space rum. Limited edition and sure to be a collector's item."
|
||||
icon_state = "barrel"
|
||||
color = "#7e5c00"
|
||||
|
||||
/obj/item/salvage/ruin/russian
|
||||
name = "armaments cache"
|
||||
desc = "A crate of old disused Belastrav ballistic firearms clearly long past their usability. This crate would make good scrap metal for shuttle construction."
|
||||
icon_state = "weapon_crate"
|
||||
|
||||
/obj/item/salvage/ruin/brick
|
||||
name = "mysterious brick"
|
||||
desc = "A peculier brick formed out of what appears to be plastic. This would make a fantastic collector's item."
|
||||
icon_state = "lego_brick"
|
||||
hitsound = 'sound/items/smolesmallbuild.ogg'
|
||||
drop_sound = 'sound/items/drop/smolematerial.ogg'
|
||||
|
||||
/obj/item/salvage/ruin/nanotrasen
|
||||
name = "lost research notes"
|
||||
desc = "A collection of research notes penned by old Nanotrasen scientists from decades past, technology lost in time- until you found them. It is a mystery what technology Central Command will push if they could just get their hands on these notes."
|
||||
icon_state = "research_doc"
|
||||
hitsound = 'sound/items/pickup/paper.ogg'
|
||||
pickup_sound = 'sound/items/pickup/paper.ogg'
|
||||
drop_sound = 'sound/items/drop/paper.ogg'
|
||||
|
||||
/obj/item/salvage/ruin/nanotrasen/Initialize(mapload)
|
||||
. = ..()
|
||||
become_anomalous()
|
||||
|
||||
/obj/item/salvage/ruin/carp
|
||||
name = "carp scales"
|
||||
desc = "A collection of scales shed from a corrupted space carp. Their culinary potential could mean untold riches for Nanotrasen."
|
||||
icon_state = "dragon_scales"
|
||||
hitsound = 'sound/effects/glass_step.ogg'
|
||||
pickup_sound = 'sound/effects/glass_step.ogg'
|
||||
drop_sound = 'sound/effects/glass_step.ogg'
|
||||
|
||||
/obj/item/salvage/loot
|
||||
desc = "A tonne of salvage looted from a fallen foe. Who spawned the base type? Report this on the github."
|
||||
|
||||
/obj/item/salvage/loot/pirate
|
||||
name = "stolen jewellery"
|
||||
desc = "A collection of stolen jewellery, fashioned from pilfered bluespace crystals and gems. Rumour has it, local pirates have been known to use these accessories to avoid capture."
|
||||
icon_state = "pirate_treasure"
|
||||
hitsound = 'sound/items/taperecorder_drop.ogg'
|
||||
pickup_sound = 'sound/items/taperecorder_pickup.ogg'
|
||||
drop_sound = 'sound/items/taperecorder_drop.ogg'
|
||||
|
||||
/obj/item/salvage/loot/russian
|
||||
name = "siosp manual"
|
||||
desc = "A small manual, written in Neo-Russkyia, detailing the manifesto of Malfoy Ames, father of The Cygni Rebellion. Central Command may wish to share this with their allies in the Trans-Solar Federation."
|
||||
icon_state = "ussp_manual"
|
||||
hitsound = 'sound/items/pickup/paper.ogg'
|
||||
pickup_sound = 'sound/items/pickup/paper.ogg'
|
||||
drop_sound = 'sound/items/drop/paper.ogg'
|
||||
|
||||
/obj/item/salvage/loot/syndicate
|
||||
name = "syndicate intel"
|
||||
desc = "A folder detailing Syndicate plans to infiltrate and sabotage operations in the Vir system. Central Command may find use of this to aid them in counter-intelligence."
|
||||
icon_state = "syndie_doc"
|
||||
hitsound = 'sound/items/pickup/paper.ogg'
|
||||
pickup_sound = 'sound/items/pickup/paper.ogg'
|
||||
drop_sound = 'sound/items/drop/paper.ogg'
|
||||
Reference in New Issue
Block a user