Fantasy redgate map

Added a new fantasy redgate map that consists of a fantasy town and a large dungeon beneath it.

Added a selection of fantasy props.

Added a variety of "magic" resprites of existing items. These are intended to be tech disguised as magic and have descriptions to hint at it, along with some papers on the map.

Added an alchemy system that creates potions in an alembic out of an ingredient and a base. If the ingredient and base match, an interesting potion is created, if they don't, a poor quality potion is created.

Added a new reagent that polymorphs the drinker into a random creature.

Added a chest version of crates.

Added wooden wall lockers.

Added random spawners for fantasy items, potions, ingredients and bases for mapping.

Added hedge and wooden fences.

Added an old fashioned resprite of the oven.

Added a cooking pot resprite of the microwave.

Added wall torches.

Added barrel version of water tanks, beer tanks, wine tanks, blood tanks and a kettle resprite of a coffee dispenser.

Added a wooden tub bath.

Added 19 new vore mobs: 2 Catslugs, 6 succubi, 1 cryptdrake, 4 vampires 5 peasants and a bat.
This commit is contained in:
SatinIsle
2023-09-22 21:44:22 +01:00
parent 202870bfd7
commit 0c39b8b7d8
70 changed files with 53276 additions and 68 deletions
@@ -954,6 +954,77 @@
/datum/say_list/catslug/custom/pilotslug
speak = list("In the pipe, five my five.","Kick the tires and light the fires!","Bogeys on my tail!","GOOSE!","I'm really good at the stick.","I'm not doing nothing.","Heh.","Can you keep up?","Can't keep the sky from me.")
//Royal slug
/mob/living/simple_mob/vore/alienanimals/catslug/custom/royalslug
name = "Ruler Purrton"
desc = "A golden-furred noodley bodied creature with thin arms and legs, and gloomy dark eyes. This one is adorned with a crown and red cloak, very fancy."
tt_desc = "Mollusca Felis Royallis"
icon_state = "catslugking"
icon_living = "catslugking"
icon_rest = "catslugking_rest"
icon_dead = "catslugking_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/royalslug)
say_list_type = /datum/say_list/catslug/custom/royalslug
/datum/category_item/catalogue/fauna/catslug/custom/royalslug
name = "Alien Wildlife - Catslug - Ruler Purrton"
desc = "Found in a castle beyond the redgate, Ruler Purrton\
is a catslug who spends their days presiding over this low \
technology town, living a life of luxury. Always seen with \
their trademark crown and cloak, this litter critter seems \
to just exude raw confidence and superiority. \
\
The Catslug is an omnivorous terrestrial creature.\
Exhibiting properties of both a cat and a slug (hence its name)\
it moves somewhat awkwardly. However, the unique qualities of\
its body make it exceedingly flexible and smooth, allowing it to\
wiggle into and move effectively in even extremely tight spaces.\
Additionally, it has surprisingly capable hands, and moves quite\
well on two legs or four. Caution is advised when interacting\
with these creatures, they are quite intelligent, and proficient\
tool users."
value = CATALOGUER_REWARD_TRIVIAL
/datum/say_list/catslug/custom/royalslug
speak = list("Let them eat cake. Lots and lots of cake.", "Fetch my good cloak.", "I myself prefer my ancient eggs for breakfast!", "Have you come to pay tribute?", "How dare you intrude?", "Bring me the finest of fine finery.", "HARK!", "With great power comes great dinner.")
//crypt slug
/mob/living/simple_mob/vore/alienanimals/catslug/custom/cryptslug
name = "Keeper Sluguloth"
desc = "A dark-furred noodley bodied creature with thin arms and legs, and gloomy dark eyes. This one is adorned with a dark cloak that obscures most of it's body."
tt_desc = "Mollusca Felis Necrosis"
icon_state = "cryptslug"
icon_living = "cryptslug"
icon_rest = "cryptslug_rest"
icon_dead = "cryptslug_dead"
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/cryptslug)
say_list_type = /datum/say_list/catslug/custom/cryptslug
/datum/category_item/catalogue/fauna/catslug/custom/cryptslug
name = "Alien Wildlife - Catslug - Keeper Sluguloth"
desc = "Found in a deep beneath a town beyond the redgate, Sluguloth\
is a catslug who spends their days lurking within dark dungeons \
alongside monstrous beings of all sorts. Always seen within \
their dark cloak, obscuring them, this litter critter seems \
to just exude pure menance and up-to-no-goodness. \
\
The Catslug is an omnivorous terrestrial creature.\
Exhibiting properties of both a cat and a slug (hence its name)\
it moves somewhat awkwardly. However, the unique qualities of\
its body make it exceedingly flexible and smooth, allowing it to\
wiggle into and move effectively in even extremely tight spaces.\
Additionally, it has surprisingly capable hands, and moves quite\
well on two legs or four. Caution is advised when interacting\
with these creatures, they are quite intelligent, and proficient\
tool users."
value = CATALOGUER_REWARD_TRIVIAL
/datum/say_list/catslug/custom/cryptslug
speak = list("I have a lot of nasty friends.", "Do not test me.", "I shall rise again!", "How dare you step foot in my domain?", "Dare you indluge in dark desires?", "I am become death, one day.", "Foul creature!", "I used to think my life was a tragedy, but now I realize it's kind of okay actually.")
//=============================
//Admin-spawn only catslugs end
//=============================
@@ -0,0 +1,55 @@
/mob/living/simple_mob/vore/bat
name = "giant bat"
desc = "Blimey, that's a big sky fox."
tt_desc = "Homo paramour"
icon_state = "bat"
icon = 'icons/mob/vore.dmi'
harm_intent_damage = 5
melee_damage_lower = 2
melee_damage_upper = 5
response_help = "nuzzles"
response_disarm = "flaps at"
response_harm = "bites"
attacktext = list("bites","scratches")
say_list_type = /datum/say_list/bat
ai_holder_type = /datum/ai_holder/simple_mob/retaliate
faction = "vampire"
// Activate Noms!
/mob/living/simple_mob/vore/bat
vore_active = 1
vore_bump_chance = 50
vore_pounce_chance = 50
vore_standing_too = 1
vore_ignores_undigestable = 0
vore_default_mode = DM_DRAIN // They just want to drain you!
vore_digest_chance = 25 // But don't you dare try to escape...
vore_icons = SA_ICON_LIVING | SA_ICON_REST
/datum/say_list/bat
speak = list("Chirp!")
emote_hear = list("chirps","pings","clicks")
emote_see = list("flaps","grooms itself")
/mob/living/simple_mob/vore/bat/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The giant bat has managed to swallow you alive, which is particularly impressive given that it's still a rather small creature. It's belly bulges out as you're squeezed into the oppressively tight stomach, and it lands to manage the weight, wings curling over your form beneath. The body groans under your strain, burbling and growling as it gets to work on it's feed. However, at least for now, it seems to do you no physical harm. Instead, the damp walls that squelch across your body try to leech out your energy through some less direct means."
B.mode_flags = DM_FLAG_THICKBELLY
B.belly_fullscreen = "yet_another_tumby"
B.digest_brute = 2
B.digest_burn = 2
B.digest_oxy = 1
B.digestchance = 25
B.absorbchance = 0
B.escapechance = 15
B.selective_preference = DM_DRAIN
B.escape_stun = 5
@@ -0,0 +1,132 @@
/mob/living/simple_mob/vore/cryptdrake
name = "crypt drake"
desc = "A massive drake-like creature with dark purple scales and a seemingly exposed skull."
catalogue_data = list(/datum/category_item/catalogue/fauna/greatwolf)
tt_desc = "Draconis necrotis"
icon = 'icons/mob/vore128x64.dmi'
icon_dead = "cryptdrake-dead"
icon_living = "cryptdrake"
icon_state = "cryptdrake"
icon_rest = "cryptdrake"
faction = "dragon"
old_x = -48
old_y = 0
vis_height = 92
melee_damage_lower = 20
melee_damage_upper = 15
friendly = list("nudges", "sniffs on", "rumbles softly at", "nuzzles")
default_pixel_x = -48
pixel_x = -48
pixel_y = 0
response_help = "bumps"
response_disarm = "shoves"
response_harm = "bites"
movement_cooldown = -1
harm_intent_damage = 10
melee_damage_lower = 10
melee_damage_upper = 20
maxHealth = 1000
attacktext = list("mauled")
see_in_dark = 8
minbodytemp = 0
ai_holder_type = /datum/ai_holder/simple_mob/vore
max_buckled_mobs = 1
mount_offset_y = 32
mount_offset_x = -16
can_buckle = TRUE
buckle_movable = TRUE
buckle_lying = FALSE
max_tox = 0 // immune to poison
special_attack_min_range = 2
special_attack_max_range = 4
special_attack_cooldown = 30 SECONDS
var/leap_warmup = 2 SECOND // How long the leap telegraphing is.
var/leap_sound = 'sound/weapons/spiderlunge.ogg'
/mob/living/simple_mob/vore/cryptdrake
vore_bump_chance = 25
vore_digest_chance = 50
vore_escape_chance = 5
vore_pounce_chance = 100
vore_active = 1
vore_icons = 2
vore_icons = SA_ICON_LIVING | SA_ICON_REST
vore_capacity = 2
swallowTime = 50
vore_ignores_undigestable = TRUE
vore_default_mode = DM_DIGEST
vore_pounce_maxhealth = 125
vore_bump_emote = "tries to devour"
/mob/living/simple_mob/vore/cryptdrake/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 = -1
/mob/living/simple_mob/vore/cryptdrake/init_vore()
. = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The enormous beast snaps it's boney jaws around your form, effortlessly lifting you from the ground. Throwing it's head backwards, your body is tossed up momentarily as the maw parts wider, only for you to descend rapidly moments later. You're caught in the creature's throat for a moment, contracting dark purple flesh holding tightly onto you, there's no going back at this point. The peristaltic motions squeeze you down this tunnel towards your final destination, where you're soon relieved of the intense squelching to be pushed into a move flexible, stretching chamber. Immediately coated in caustic oozes, the world around you seems more than eager to ensure that you're soaked over every inch, wrinkled walls twisting and grinding around your body. The drake's stomach clenches and compresses over you rhythmically, attempting to eagerly add you to the soup of fluids that fill this sloshing gut. Omnipresent sounds of groaning, gurgling and burbling bodily functions signify just how active this process already is."
B.vore_sound = "Tauric Swallow"
B.release_sound = "Pred Escape"
B.mode_flags = DM_FLAG_THICKBELLY
B.fancy_vore = 1
B.selective_preference = DM_DIGEST
B.vore_verb = "devour"
B.digest_brute = 3
B.digest_burn = 2
B.digest_oxy = 0
B.digestchance = 50
B.absorbchance = 0
B.escapechance = 3
B.escape_stun = 5
B.contamination_color = "grey"
B.contamination_flavor = "Wet"
B.emote_lists[DM_DIGEST] = list(
"The drake growls in annoyance before clenching those wrinkled walls tight against your form, grinding away at you!",
"As the beast wanders about, you're forced to slip and slide around amidst a pool of thick digestive goop, sinking briefly into the thick, heavy walls!",
"You can barely hear the drake let out a pleased rumble as its stomach eagerly gurgles around its newfound meal!",
"As the thinning air begins to make you feel dizzy, menacing bworps and grumbles fill that dark, constantly shifting organ!",
"The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!",
"The drake happily wanders around while digesting its meal, almost like it is trying to show off the hanging gut you've given it. Not like it made much of a difference on his already borderline obese form anyway~")
/mob/living/simple_mob/vore/cryptdrake/do_special_attack(atom/A) //Mostly copied from hunter.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]'s eyes flash ominously!"))
to_chat(L, span("danger","\The [src] focuses on 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
@@ -0,0 +1,72 @@
/mob/living/simple_mob/vore/peasant
name = "peasant"
desc = "They're just about getting by."
tt_desc = "Homo Sapiens"
icon_state = "peasantfa"
icon = 'icons/mob/vore.dmi'
harm_intent_damage = 2
melee_damage_lower = 1
melee_damage_upper = 2
response_help = "pats"
response_disarm = "pushes"
response_harm = "punches"
attacktext = list("punched","kicked")
say_list_type = /datum/say_list/peasant
ai_holder_type = /datum/ai_holder/simple_mob/retaliate
var/random_skin = 1
var/list/skins = list(
"peasantfa",
"peasantfb",
"peasantfc",
"peasantma",
"peasantmb"
)
faction = "peasant"
/mob/living/simple_mob/vore/peasant/New()
..()
if(random_skin)
icon_living = pick(skins)
icon_rest = "[icon_living]asleep"
icon_dead = "[icon_living]-dead"
update_icon()
// Activate Noms!
/mob/living/simple_mob/vore/peasant
vore_active = 1
vore_bump_chance = 10
vore_pounce_chance = 20
vore_standing_too = 1
vore_ignores_undigestable = 0
vore_default_mode = DM_HOLD
vore_digest_chance = 25 // But don't you dare try to escape...
vore_icons = SA_ICON_LIVING | SA_ICON_REST
/datum/say_list/peasant
speak = list("Fine day!","What was I doing again? Oh yeah, nothing.","How are ya?","I sure do love bread.","Where did I leave my scraps of cloth?","Sure is a good time to exist, I guess.")
emote_hear = list("yawns","'s stomach grumbles","shuffles")
emote_see = list("exists","just stands there","smiles","looks around")
/mob/living/simple_mob/vore/peasant/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "You've somehow managed to get yourself eaten by one of the local peasants. After jamming you down into their stomach, you find yourself cramped up tight in a space that clearly shouldn't be able to accept you. They let out a relieved sigh as they heft around their new found weight, giving it a hearty pat, clearly content to get a good meal for once. The world around you groans and grumbles, but the gut is far from harmful to you right now, even as the walls clench down on your body."
B.mode_flags = DM_FLAG_THICKBELLY
B.belly_fullscreen = "yet_another_tumby"
B.digest_brute = 1
B.digest_burn = 1
B.digest_oxy = 0
B.digestchance = 25
B.absorbchance = 0
B.escapechance = 15
B.selective_preference = DM_HOLD
B.escape_stun = 5
@@ -0,0 +1,73 @@
/mob/living/simple_mob/vore/succubus
name = "succubus"
desc = "She's giving you the 'come hither' look."
tt_desc = "Homo paramour"
icon_state = "succubus"
icon = 'icons/mob/vore.dmi'
harm_intent_damage = 5
melee_damage_lower = 2
melee_damage_upper = 5
response_help = "strokes"
response_disarm = "pushes"
response_harm = "bites"
attacktext = list("swatted","bapped")
say_list_type = /datum/say_list/succubus
ai_holder_type = /datum/ai_holder/simple_mob/retaliate
var/random_skin = 1
var/list/skins = list(
"succubus",
"succubusbob",
"succubusginger",
"succubusclothed",
"succubusbobclothed",
"succubusgingerclothed"
)
faction = "succubus"
/mob/living/simple_mob/vore/succubus/New()
..()
if(random_skin)
icon_living = pick(skins)
icon_rest = "[icon_living]asleep"
icon_dead = "[icon_living]-dead"
update_icon()
// Activate Noms!
/mob/living/simple_mob/vore/succubus
vore_active = 1
vore_bump_chance = 100
vore_pounce_chance = 50
vore_standing_too = 1
vore_ignores_undigestable = 0
vore_default_mode = DM_DRAIN // They just want to drain you!
vore_digest_chance = 25 // But don't you dare try to escape...
vore_icons = SA_ICON_LIVING | SA_ICON_REST
/datum/say_list/succubus
speak = list("Come here cutie!","Let me get a good look at you!","Want to spend a little quality time together?","I don't bite. Much.","Like what you see?","Feel free to sample the goods.")
emote_hear = list("makes a kissing sound","giggles","lets out a needy whine")
emote_see = list("gestures for you to come over","winks","smiles","stretches")
/mob/living/simple_mob/vore/succubus/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "You find yourself tightly compressed into the stomach of the succubus, with immense pressure squeezing down on you from every direction. The wrinkled walls of the gut knead over you, like a swelteringly hot, wet massage. You can feel movement from the outside, as though the demoness is running her hands over your form with delight. The world around you groans and gurgles, but the fluids that ooze into this place don't seem harmful, yet. Instead, you feel your very energy being steadily depleted, much to the joy of the woman who's claiming it all for herself."
B.mode_flags = DM_FLAG_THICKBELLY
B.belly_fullscreen = "yet_another_tumby"
B.digest_brute = 2
B.digest_burn = 2
B.digest_oxy = 1
B.digestchance = 25
B.absorbchance = 0
B.escapechance = 15
B.selective_preference = DM_DRAIN
B.escape_stun = 5
@@ -0,0 +1,85 @@
/mob/living/simple_mob/vore/vampire
name = "vampire"
desc = "A large creature with a humanoid upperbody and more feral formed lower body, with four legs and two arms."
icon_state = "count"
icon = 'icons/mob/vore.dmi'
harm_intent_damage = 8
melee_damage_lower = 3
melee_damage_upper = 7
response_help = "caresses"
response_disarm = "wafts"
response_harm = "bites"
attacktext = list("bites","sucks","drinks from")
say_list_type = /datum/say_list/count
ai_holder_type = /datum/ai_holder/simple_mob/vore
var/random_skin = 1
var/list/skins = list(
"count",
"countess",
"countnude",
"countessnude"
)
faction = "vampire"
/mob/living/simple_mob/vore/vampire/New()
..()
if(random_skin)
icon_living = pick(skins)
icon_rest = "[icon_living]asleep"
icon_dead = "[icon_living]-dead"
update_icon()
// Activate Noms!
/mob/living/simple_mob/vore/vampire
vore_active = 1
vore_bump_chance = 10
vore_pounce_chance = 50
vore_standing_too = 1
vore_ignores_undigestable = 0
vore_default_mode = DM_DRAIN
vore_digest_chance = 25
vore_icons = SA_ICON_LIVING | SA_ICON_REST
/datum/say_list/count
speak = list("I vant to suck your-","I'm going to get a bite to drink.","All I have is time.","Your presence here is crypt-ic.","I like my coffee decoffinated.","There is bad blood between us.")
emote_hear = list("laughs maniacally","croans","hisses")
emote_see = list("wafts about","licks their lips","flaps a bit")
/mob/living/simple_mob/vore/vampire/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "Having been rapidly gulped up by the vampire, you find yourself tightly contained with a set of groaning, wrinkled walls. It seems that the beast has decided against draining your lifeforce through you blood, and instead taking a more direct approach as it saps your strength from all around you. Your attacker seems content to just take that essence for now, but it is a gut afterall and struggling may set it off."
B.mode_flags = DM_FLAG_THICKBELLY
B.belly_fullscreen = "yet_another_tumby"
B.digest_brute = 3
B.digest_burn = 0
B.digest_oxy = 1
B.digestchance = 25
B.absorbchance = 0
B.escapechance = 10
B.selective_preference = DM_DRAIN
B.escape_stun = 5
/mob/living/simple_mob/vore/vampire/count
random_skin = 0
icon_state = "count"
/mob/living/simple_mob/vore/vampire/countess
random_skin = 0
icon_state = "countess"
/mob/living/simple_mob/vore/vampire/count_nude
random_skin = 0
icon_state = "countnude"
/mob/living/simple_mob/vore/vampire/countess_nude
random_skin = 0
icon_state = "countessnude"