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
@@ -373,4 +373,11 @@
origin_tech = list(TECH_MAGNET = 7, TECH_BIO = 8)
icon_state = "health3"
/obj/item/device/healthanalyzer/scroll //reports all of the above, as well as name and quantity of nonmed reagents in stomach
name = "scroll of divination"
desc = "An unusual scroll that appears to report all of the details of a person's health when waved near them. Oddly, it seems to have a little metal chip up near the handles..."
advscan = 3
origin_tech = list(TECH_MAGNET = 7, TECH_BIO = 8)
icon_state = "health_scroll"
#undef DEFIB_TIME_LIMIT //VOREStation addition
@@ -263,6 +263,12 @@
affecting.salve()
playsound(src, pick(apply_sounds), 25)
/obj/item/stack/medical/ointment/simple
name = "ointment paste"
desc = "A simple thick paste used to salve burns."
singular_name = "old-ointment"
icon_state = "old-ointment"
/obj/item/stack/medical/advanced/bruise_pack
name = "advanced trauma kit"
singular_name = "advanced trauma kit"
@@ -295,3 +295,10 @@
/obj/item/weapon/surgical/bone_clamp/alien
icon = 'icons/obj/abductor.dmi'
toolspeed = 0.75
/obj/item/weapon/surgical/bone_clamp/alien/magic
icon = 'icons/obj/abductor.dmi'
toolspeed = 0.75
icon_state = "bone_boneclamp"
name = "bone bone clamp"
desc = "A bone clamp made of bones for fixing bones using bones, it feels strangely adept. In fact, it doesn't really feel like actual bone at all..."
@@ -54,6 +54,12 @@
toolspeed = 0.1
origin_tech = list(TECH_COMBAT = 4, TECH_ENGINEERING = 4)
/obj/item/weapon/tool/crowbar/alien/magic
name = "sentient crowbar"
desc = "A crowbar with a green gem set in it and a green ribbon tied to it, it floats lightly by itself and appears to be able to pry on its own. It almost feels like there is some sort of anti gravity generator running in it..."
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_crowbar)
icon_state = "crowbar_sentient"
/obj/item/weapon/tool/crowbar/hybrid
name = "strange crowbar"
desc = "A crowbar whose head seems to phase in and out of view."
@@ -87,6 +87,13 @@
toolspeed = 0.1
random_color = FALSE
/obj/item/weapon/tool/screwdriver/alien/magic
name = "vintage screwdriver of revolving"
desc = "A vintage screwdriver that spins as fast as a drill with little aid, it has a red gem on the handle. It oddly sounds like a drill too..."
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_screwdriver)
icon = 'icons/obj/abductor.dmi'
icon_state = "screwdriver_old"
/obj/item/weapon/tool/screwdriver/hybrid
name = "strange screwdriver"
desc = "A strange conglomerate of a screwdriver."
@@ -434,6 +434,13 @@
origin_tech = list(TECH_PHORON = 5 ,TECH_ENGINEERING = 5)
always_process = TRUE
/obj/item/weapon/weldingtool/alien/magic
name = "bellows of flame"
desc = "A set of bellows that have a yellow gem on the spout, they emit flames when pressed. Oddly seems to have a faint phoron smell to it..."
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_welder)
icon = 'icons/obj/abductor.dmi'
icon_state = "bellows"
/obj/item/weapon/weldingtool/alien/process()
if(get_fuel() <= get_max_fuel())
reagents.add_reagent("fuel", 1)
@@ -80,6 +80,12 @@
origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4)
random_color = FALSE
/obj/item/weapon/tool/wirecutters/alien/magic
name = "secateurs of organisation"
desc = "Extremely sharp secateurs, fitted with a glowing blue gem, said to be magically enhanced for speed. There seems to be a little whirring sound coming from beneath that gem..."
icon = 'icons/obj/abductor.dmi'
icon_state = "cutters_magic"
/obj/item/weapon/tool/wirecutters/cyborg
name = "wirecutters"
desc = "This cuts wires. With science."
@@ -73,6 +73,13 @@
toolspeed = 0.1
origin_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5)
/obj/item/weapon/tool/wrench/alien/magic
name = "pliers of molding"
desc = "A set of pliers that seems to mold to the shape of their target, housing a pink gem. Oddly seems to have a slightly slimey texture at the metal..."
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_wrench)
icon = 'icons/obj/abductor.dmi'
icon_state = "pliers"
/obj/item/weapon/tool/wrench/power
name = "hand drill"
desc = "A simple powered hand drill. It's fitted with a bolt bit."
+106
View File
@@ -235,3 +235,109 @@
prob(5);/obj/item/organ/internal/stomach,
prob(5);/obj/item/organ/internal/voicebox,
)
/obj/random/potion
name = "random potion"
desc = "A random potion."
icon_state = "potion"
spawn_nothing_percentage = 0
/obj/random/potion/item_to_spawn()
return pick(prob(20);/obj/item/weapon/reagent_containers/glass/bottle/potion/healing,
prob(4);/obj/item/weapon/reagent_containers/glass/bottle/potion/greater_healing,
prob(20);/obj/item/weapon/reagent_containers/glass/bottle/potion/fire_resist,
prob(20);/obj/item/weapon/reagent_containers/glass/bottle/potion/antidote,
prob(20);/obj/item/weapon/reagent_containers/glass/bottle/potion/water,
prob(8);/obj/item/weapon/reagent_containers/glass/bottle/potion/regeneration,
prob(10);/obj/item/weapon/reagent_containers/glass/bottle/potion/panacea,
prob(10);/obj/item/weapon/reagent_containers/glass/bottle/potion/magic,
prob(10);/obj/item/weapon/reagent_containers/glass/bottle/potion/lightness,
prob(4);/obj/item/weapon/reagent_containers/glass/bottle/potion/SOP,
prob(4);/obj/item/weapon/reagent_containers/glass/bottle/potion/shrink,
prob(4);/obj/item/weapon/reagent_containers/glass/bottle/potion/growth,
prob(20);/obj/item/weapon/reagent_containers/glass/bottle/potion/pain,
prob(10);/obj/item/weapon/reagent_containers/glass/bottle/potion/faerie,
prob(10);/obj/item/weapon/reagent_containers/glass/bottle/potion/relaxation,
prob(10);/obj/item/weapon/reagent_containers/glass/bottle/potion/speed,
prob(10);/obj/item/weapon/reagent_containers/glass/bottle/potion/attractiveness,
prob(4);/obj/item/weapon/reagent_containers/glass/bottle/potion/girljuice,
prob(4);/obj/item/weapon/reagent_containers/glass/bottle/potion/boyjuice,
prob(4);/obj/item/weapon/reagent_containers/glass/bottle/potion/badpolymorph,
prob(2);/obj/item/weapon/reagent_containers/glass/bottle/potion/bonerepair,
prob(1);/obj/item/weapon/reagent_containers/glass/bottle/potion/truepolymorph
)
/obj/random/potion_ingredient
name = "random potion ingredient"
desc = "A random potion."
icon_state = "ingredient"
spawn_nothing_percentage = 0
/obj/random/potion_ingredient/item_to_spawn()
return pick(prob(10);/obj/item/weapon/potion_material/blood_ruby,
prob(2);/obj/item/weapon/potion_material/ruby_eye,
prob(10);/obj/item/weapon/potion_material/golden_scale,
prob(10);/obj/item/weapon/potion_material/frozen_dew,
prob(10);/obj/item/weapon/potion_material/living_coral,
prob(4);/obj/item/weapon/potion_material/rare_horn,
prob(5);/obj/item/weapon/potion_material/moldy_bread,
prob(5);/obj/item/weapon/potion_material/glowing_gem,
prob(5);/obj/item/weapon/potion_material/giant_toe,
prob(2);/obj/item/weapon/potion_material/flesh_of_the_stars,
prob(2);/obj/item/weapon/potion_material/spinning_poppy,
prob(2);/obj/item/weapon/potion_material/salt_mage,
prob(10);/obj/item/weapon/potion_material/golden_grapes,
prob(5);/obj/item/weapon/potion_material/fairy_house,
prob(5);/obj/item/weapon/potion_material/thorny_bulb,
prob(5);/obj/item/weapon/potion_material/ancient_egg,
prob(5);/obj/item/weapon/potion_material/crown_stem,
prob(2);/obj/item/weapon/potion_material/red_ingot,
prob(2);/obj/item/weapon/potion_material/soft_diamond,
prob(2);/obj/item/weapon/potion_material/solid_mist,
prob(1);/obj/item/weapon/potion_material/spider_leg,
prob(1);/obj/item/weapon/potion_material/folded_dark
)
/obj/random/potion_base
name = "random potion base"
desc = "A random potion base."
icon_state = "base"
spawn_nothing_percentage = 0
/obj/random/potion_base/item_to_spawn()
return pick(prob(10);/obj/item/weapon/potion_base/aqua_regia,
prob(10);/obj/item/weapon/potion_base/ichor,
prob(10);/obj/item/weapon/potion_base/alkahest
)
/obj/random/fantasy_item
name = "random fantasy item"
desc = "A random fantasy item."
icon_state = "fantasy"
spawn_nothing_percentage = 0
/obj/random/fantasy_item/item_to_spawn()
return pick(prob(3);/obj/item/device/healthanalyzer/scroll,
prob(10);/obj/item/weapon/gun/energy/taser/magic,
prob(5);/obj/item/weapon/bluespace_harpoon/wand,
prob(10);/obj/item/device/slow_sizegun/magic,
prob(10);/obj/item/clothing/gloves/bluespace/magic,
prob(30);/obj/item/weapon/coin/gold,
prob(30);/obj/item/weapon/coin/silver,
prob(30);/obj/item/weapon/coin/platinum,
prob(20);/obj/item/weapon/material/sword/rapier,
prob(20);/obj/item/weapon/material/sword/longsword,
prob(20);/obj/item/clothing/head/helmet/bucket/wood,
prob(3);/obj/item/weapon/tool/wirecutters/alien/magic,
prob(3);/obj/item/weapon/tool/crowbar/alien/magic,
prob(3);/obj/item/weapon/tool/screwdriver/alien/magic,
prob(3);/obj/item/weapon/weldingtool/alien/magic,
prob(3);/obj/item/weapon/tool/wrench/alien/magic,
prob(3);/obj/item/weapon/surgical/bone_clamp/alien/magic,
prob(10);/obj/item/stack/material/gold,
prob(10);/obj/item/stack/material/silver,
prob(3);/obj/item/weapon/bone/skull,
prob(20);/obj/item/weapon/material/twohanded/staff,
prob(3);/obj/item/weapon/gun/energy/hooklauncher/ring,
prob(3);/obj/item/toy/eight_ball
)
@@ -1441,6 +1441,10 @@
decals = null
color = COLOR_OFF_WHITE
/decl/closet_appearance/wall_double/wooden
decals = null
color = WOOD_COLOR_RICH
/decl/closet_appearance/wall_double/medical
decals = null
color = COLOR_OFF_WHITE
@@ -80,6 +80,27 @@
/obj/structure/closet/walllocker/medical/east
pixel_x = 32
dir = EAST
/obj/structure/closet/walllocker/wooden
name = "wooden cabinet"
desc = "A wall mounted storage cabinet."
closet_appearance = /decl/closet_appearance/wall_double/wooden
/obj/structure/closet/walllocker/wooden/north
pixel_y = 32
dir = SOUTH
/obj/structure/closet/walllocker/wooden/south
pixel_y = -32
dir = NORTH
/obj/structure/closet/walllocker/wooden/west
pixel_x = -32
dir = WEST
/obj/structure/closet/walllocker/wooden/east
pixel_x = 32
dir = EAST
//VOREStation Add End
//double-size "cabinet" lockers, from Killian
@@ -724,6 +724,15 @@
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
//Chest
/obj/structure/closet/crate/chest
name = "chest"
desc = "A fancy chest made from wood and lined with red velvet."
icon = 'icons/obj/closets/chest.dmi'
closet_appearance = null
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
//Mining Cart
/obj/structure/closet/crate/miningcar
name = "mining cart"
+35
View File
@@ -170,6 +170,41 @@
return FALSE
return TRUE
/obj/structure/fence/wood
cuttable = FALSE
name = "fence"
desc = "A wooden fence. Not as effective as a wall, but generally it keeps people out."
description_info = "Projectiles can freely pass fences."
density = TRUE
anchored = TRUE
icon = 'icons/obj/fence.dmi'
icon_state = "wood_straight"
/obj/structure/fence/wood/end
icon_state = "wood_end"
/obj/structure/fence/wood/corner
icon_state = "wood_corner"
/obj/structure/fence/hedge
cuttable = FALSE
name = "hedge"
desc = "A large hedge. Not as effective as a wall, but generally it keeps people out."
description_info = "Projectiles can freely pass fences."
density = TRUE
anchored = TRUE
opacity = 1
icon = 'icons/obj/fence.dmi'
icon_state = "hedge_straight"
/obj/structure/fence/hedge/end
icon_state = "hedge_end"
/obj/structure/fence/hedge/corner
icon_state = "hedge_corner"
#undef CUT_TIME
#undef CLIMB_TIME
@@ -0,0 +1,52 @@
//props for more fantasy type settings
/obj/structure/prop/fantasy
name = "some fantasy thing"
desc = "My description is broken, bug a developer."
icon = 'icons/obj/props/fantasy.dmi'
density = TRUE
anchored = TRUE
/obj/structure/prop/fantasy/throne
name = "throne"
desc = "An ornate golden throne for the truly pompous."
icon_state = "throne"
/obj/structure/prop/fantasy/anvil
name = "anvil"
desc = "A big solid chunk of cast steel used for smithing."
icon_state = "anvil"
/obj/structure/prop/fantasy/grindstone
name = "grindstone"
desc = "A pedal powered, rough wheel that is used to sharpen and refine metal."
icon_state = "grindstone"
/obj/structure/prop/fantasy/kiln
name = "kiln"
desc = "A large stone furnace."
icon_state = "kiln"
/obj/structure/prop/fantasy/redbanner
name = "tapestry"
desc = "A red tapestry hanging from the wall."
icon_state = "redbanner"
density = FALSE
/obj/structure/prop/fantasy/pinkbanner
name = "tapestry"
desc = "A red tapestry hanging from the wall."
icon_state = "pinkbanner"
density = FALSE
/obj/structure/prop/fantasy/redbanner_standing
name = "banner"
desc = "A red banner hanging from a stand."
icon_state = "redbanner_stand"
density = FALSE
/obj/structure/prop/fantasy/pinkbanner_standing
name = "banner"
desc = "A red banner hanging from a stand."
icon_state = "pinkbanner_stand"
density = FALSE
@@ -384,4 +384,58 @@
if(!anchored)
to_chat(user,"<span class='notice'> The bed isn't secured.</span>")
return
return
// Bath
/obj/structure/bed/bath
name = "wash tub"
desc = "A wooden tub that can be filled with water for washing yourself."
icon_state = "bath"
base_icon = "bath"
flags = OPENCONTAINER
var/amount_per_transfer_from_this = 5
/obj/structure/bed/bath/update_icon()
if(reagents.total_volume < 1)
icon_state = "bath"
else if(reagents.total_volume < 50)
icon_state = "bath1"
else if(reagents.total_volume < 150)
icon_state = "bath2"
else if(reagents.total_volume < 301)
icon_state = "bath3"
return // Doesn't care about material or anything else.
/obj/structure/bed/bath/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/mop) || istype(I, /obj/item/weapon/soap)) //VOREStation Edit - "Allows soap and rags to be used on mopbuckets"
if(reagents.total_volume < 1)
to_chat(user, "<span class='warning'>\The [src] is out of water!</span>")
else
reagents.trans_to_obj(I, 5)
to_chat(user, "<span class='notice'>You wet \the [I] in \the [src].</span>")
playsound(src, 'sound/effects/slosh.ogg', 25, 1)
if(istype(I, /obj/item/weapon/reagent_containers/glass))
update_icon()
return
else if(istype(I, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = I
var/mob/living/affecting = G.affecting
if(has_buckled_mobs()) //Handles trying to buckle someone else to a chair when someone else is on it
to_chat(user, "<span class='notice'>\The [src] already has someone buckled to it.</span>")
return
user.visible_message("<span class='notice'>[user] attempts to buckle [affecting] into \the [src]!</span>")
if(do_after(user, 20, G.affecting))
affecting.loc = loc
spawn(0)
if(buckle_mob(affecting))
affecting.visible_message(\
"<span class='danger'>[affecting.name] is buckled to [src] by [user.name]!</span>",\
"<span class='danger'>You are buckled to [src] by [user.name]!</span>",\
"<span class='notice'>You hear metal clanking.</span>")
qdel(I)
/obj/structure/bed/bath/New()
create_reagents(300)
..()
@@ -124,6 +124,61 @@
else
to_chat(user, "<span class='notice'>You need a tighter grip.</span>")
/obj/structure/toilet/wooden
name = "wooden toilet"
desc = "It's basically a hole in a box with a bucket inside. This one seems remarkably clean."
icon_state = "toilet3"
open = 1
/obj/structure/toilet/wooden/attack_hand(mob/living/user as mob)
return //No lid
/obj/structure/toilet/wooden/attackby(obj/item/I as obj, mob/living/user as mob) //simpler interactions
if(istype(I, /obj/item/weapon/grab))
user.setClickCooldown(user.get_attack_speed(I))
var/obj/item/weapon/grab/G = I
if(isliving(G.affecting))
var/mob/living/GM = G.affecting
if(G.state>1)
if(!GM.loc == get_turf(src))
to_chat(user, "<span class='notice'>[GM.name] needs to be on the toilet.</span>")
return
if(open && !swirlie)
user.visible_message("<span class='danger'>[user] starts to give [GM.name] a swirlie!</span>", "<span class='notice'>You start to give [GM.name] a swirlie!</span>")
swirlie = GM
if(do_after(user, 30, GM))
user.visible_message("<span class='danger'>[user] gives [GM.name] a swirlie!</span>", "<span class='notice'>You give [GM.name] a swirlie!</span>", "You hear a toilet flushing.")
if(!GM.internal)
GM.adjustOxyLoss(5)
swirlie = null
else
user.visible_message("<span class='danger'>[user] slams [GM.name] into the [src]!</span>", "<span class='notice'>You slam [GM.name] into the [src]!</span>")
GM.adjustBruteLoss(5)
else
to_chat(user, "<span class='notice'>You need a tighter grip.</span>")
if(cistern && !istype(user,/mob/living/silicon/robot)) //STOP PUTTING YOUR MODULES IN THE TOILET.
if(I.w_class > 3)
to_chat(user, "<span class='notice'>\The [I] does not fit.</span>")
return
if(w_items + I.w_class > 5)
to_chat(user, "<span class='notice'>The cistern is full.</span>")
return
user.drop_item()
I.loc = src
w_items += I.w_class
to_chat(user, "You carefully place \the [I] into the cistern.")
return
/obj/structure/toilet/wooden/New()
open = 1 //just to make sure it works
icon_state = "toilet3"
return
/obj/structure/toilet/wooden/update_icon()
return
/obj/structure/urinal
name = "urinal"