Merge branch 'master' into upstream-merge-11928

This commit is contained in:
Nadyr
2021-12-05 12:50:21 -05:00
committed by GitHub
52 changed files with 911 additions and 167 deletions

View File

@@ -69,7 +69,7 @@ jobs:
run: |
sudo dpkg --add-architecture i386
sudo apt update || true
sudo apt install zlib1g-dev:i386 libssl-dev:i386 pkg-config:i386
sudo apt install zlib1g-dev:i386 libssl-dev:i386
ldd librust_g.so
- name: Unit Tests
run: |

View File

@@ -6,6 +6,6 @@ export NODE_VERSION=12
# Byond Major
export BYOND_MAJOR=514
# Byond Minor
export BYOND_MINOR=1569
export BYOND_MINOR=1571
# Macro Count
export MACRO_COUNT=4

View File

@@ -36,10 +36,6 @@ SUBSYSTEM_DEF(persistence)
if(!A || (A.flags & AREA_FLAG_IS_NOT_PERSISTENT))
return
// if((!T.z in GLOB.using_map.station_levels) || !initialized)
if(!(T.z in using_map.station_levels))
return
if(!(T.z in using_map.persist_levels))
return

View File

@@ -100,8 +100,8 @@
)
cost = 250
containertype = /obj/structure/closet/crate/secure/gear
containername = "Solgov medical hardsuit crate"
access = access_medical
containername = "Solgov engineering hardsuit crate"
access = access_engine
// CHOMPStation EDIT End

View File

@@ -91,7 +91,9 @@
for(var/obj/item/stack/T as anything in instances)
if(count <= 0)
break
if(T.get_amount() <= count)
instances -=T
count -= T.transfer_to(S, count)
S.forceMove(product_location)
return S
return S

View File

@@ -34,6 +34,7 @@
"Eyes" = list(/obj/item/organ/internal/eyes, 20),
"Liver" = list(/obj/item/organ/internal/liver, 20),
"Spleen" = list(/obj/item/organ/internal/spleen, 20),
"Stomach" = list(/obj/item/organ/internal/stomach, 20),
"Arm, Left" = list(/obj/item/organ/external/arm, 40),
"Arm, Right" = list(/obj/item/organ/external/arm/right, 40),
"Leg, Left" = list(/obj/item/organ/external/leg, 40),
@@ -378,4 +379,4 @@
return
return ..()
// END ROBOT ORGAN PRINTER
*/
*/

View File

@@ -1083,7 +1083,7 @@
/obj/machinery/computer/arcade/clawmachine
name = "AlliCo Grab-a-Gift"
desc = "Show off your arcade skills for that special someone!"
icon_state = "clawmachine"
icon_state = "clawmachine_new"
icon_keyboard = null
icon_screen = null
circuit = /obj/item/weapon/circuitboard/arcade/clawmachine
@@ -1244,10 +1244,10 @@
/// TGUI Stuff
/obj/machinery/computer/arcade/clawmachine/tgui_interact(mob/user, datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state)
ui = SStgui.try_update_ui(user, src, ui, force_open)
/obj/machinery/computer/arcade/clawmachine/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "ClawMachine", name, 300, 400, master_ui, state)
ui = new(user, src, "ClawMachine", name, ui_x = 300, ui_y = 400)
ui.autoupdate = TRUE
ui.open()
@@ -1270,7 +1270,7 @@
if(action == "newgame" && gamepaid == 1)
gameStatus = "CLAWMACHINE_ON"
icon_state = "clawmachine_move"
icon_state = "clawmachine_new_move"
instructions = "Guide the claw to the prize you want!"
wintick = 0
@@ -1307,7 +1307,7 @@
winscreen = "Aw, shucks. Try again!"
wintick = 0
gamepaid = 0
icon_state = "clawmachine"
icon_state = "clawmachine_new"
gameStatus = "CLAWMACHINE_END"
/obj/machinery/computer/arcade/clawmachine/emag_act(mob/user)

View File

@@ -4,6 +4,7 @@
icon = 'icons/obj/stock_parts.dmi'
icon_state = "frame_bitem"
var/build_machine_type
var/build_wall_only = FALSE
var/refund_amt = 5
var/refund_type = /obj/item/stack/material/steel
var/reverse = 0 //if resulting object faces opposite its dir (like light fixtures)
@@ -27,7 +28,7 @@
..()
update_type_list()
var/datum/frame/frame_types/frame_type
if(!build_machine_type)
if(!build_machine_type && !build_wall_only)
var/datum/frame/frame_types/response = tgui_input_list(user, "What kind of frame would you like to make?", "Frame type request", frame_types_floor)
if(!response)
return

View File

@@ -6,6 +6,7 @@
icon = 'icons/obj/apc_repair.dmi'
icon_state = "apc_frame"
refund_amt = 2
build_wall_only = TRUE
matter = list(MAT_STEEL = 100, MAT_GLASS = 30)
/obj/item/frame/apc/try_build(turf/on_wall, mob/user as mob)

View File

@@ -1455,4 +1455,4 @@
/obj/random/turf/lava/item_to_spawn()
return pick(prob(5);/turf/simulated/floor/lava,
prob(3);/turf/simulated/floor/outdoors/rocks/caves,
prob(1);/turf/simulated/mineral)
prob(1);/turf/simulated/mineral/ignore_mapgen/cave)

View File

@@ -240,6 +240,7 @@
/obj/random/mob/mouse/item_to_spawn()
return pick(prob(15);/mob/living/simple_mob/animal/passive/mouse/white,
prob(15);/mob/living/simple_mob/animal/passive/mouse/black,
prob(30);/mob/living/simple_mob/animal/passive/mouse/brown,
prob(30);/mob/living/simple_mob/animal/passive/mouse/gray,
prob(30);/mob/living/simple_mob/animal/passive/mouse/rat)

View File

@@ -316,22 +316,11 @@
name = "painting frame"
desc = "The perfect showcase for your favorite deathtrap memories."
icon = 'icons/obj/decals.dmi'
//custom_materials = list(/datum/material/wood = 2000)
//flags_1 = NONE
refund_amt = 5
refund_type = /obj/item/stack/material/wood
icon_state = "frame-empty"
/obj/item/frame/painting/try_build(turf/on_wall, mob/user as mob)
if(get_dist(on_wall, user) > 1)
return
var/ndir = get_dir(on_wall, user)
if (!(ndir in cardinal))
return
if(!istype(on_wall, /turf/simulated/wall))
to_chat(user, "<span class='warning'>Frame cannot be placed on this spot.</span>")
return
new /obj/structure/sign/painting(get_turf(user), ndir, TRUE)
qdel(src)
build_machine_type = /obj/structure/sign/painting
/obj/structure/sign/painting
name = "Painting"
desc = "Art or \"Art\"? You decide."
@@ -589,4 +578,4 @@
QDEL_NULL(P.current_canvas)
P.update_appearance()
loaded = FALSE
log_and_message_admins("<span class='notice'>[key_name_admin(user)] has deleted persistent painting made by [author].</span>")
log_and_message_admins("<span class='notice'>[key_name_admin(user)] has deleted persistent painting made by [author].</span>")

View File

@@ -855,7 +855,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/list/valid_facialhairstyles = pref.get_valid_facialhairstyles()
var/new_f_style = tgui_input_list(user, "Choose your character's facial-hair style:", "Character Preference", valid_facialhairstyles, pref.f_style)
if(new_f_style && has_flag(mob_species, HAS_HAIR_COLOR) && CanUseTopic(user))
if(new_f_style && CanUseTopic(user))
pref.f_style = new_f_style
return TOPIC_REFRESH_UPDATE_PREVIEW

View File

@@ -68,7 +68,7 @@ var/list/gear_datums = list()
if(G.whitelisted && config.loadout_whitelist != LOADOUT_WHITELIST_OFF)
if(config.loadout_whitelist == LOADOUT_WHITELIST_STRICT && G.whitelisted != pref.species)
continue
if(config.loadout_whitelist == LOADOUT_WHITELIST_LAX && !is_alien_whitelisted(preference_mob(), GLOB.all_species[G.whitelisted]))
if(config.loadout_whitelist == LOADOUT_WHITELIST_LAX && !is_alien_whitelisted(preference_mob(), GLOB.all_species[G.whitelisted]))
continue
if(max_cost && G.cost > max_cost)
@@ -170,7 +170,7 @@ var/list/gear_datums = list()
if(ticked)
. += "<tr><td colspan=3>"
for(var/datum/gear_tweak/tweak in G.gear_tweaks)
. += " <a href='?src=\ref[src];gear=[G.display_name];tweak=\ref[tweak]'>[tweak.get_contents(get_tweak_metadata(G, tweak))]</a>"
. += " <a href='?src=\ref[src];gear=[url_encode(G.display_name)];tweak=\ref[tweak]'>[tweak.get_contents(get_tweak_metadata(G, tweak))]</a>"
. += "</td></tr>"
. += "</table>"
. = jointext(., null)
@@ -206,7 +206,7 @@ var/list/gear_datums = list()
pref.gear += TG.display_name
return TOPIC_REFRESH_UPDATE_PREVIEW
if(href_list["gear"] && href_list["tweak"])
var/datum/gear/gear = gear_datums[href_list["gear"]]
var/datum/gear/gear = gear_datums[url_decode(href_list["gear"])]
var/datum/gear_tweak/tweak = locate(href_list["tweak"])
if(!tweak || !istype(gear) || !(tweak in gear.gear_tweaks))
return TOPIC_NOACTION

View File

@@ -338,6 +338,12 @@
ckeywhitelist = list("hottokeeki")
character_name = list("Belle Day")
/datum/gear/fluff/amaryll_claws
path = /obj/item/weapon/surgical/scalpel/amaryll_claws
display_name = "Amaryll's Claws"
ckeywhitelist = list("hunterbirk")
character_name = list("Amaryll")
// I CKEYS
/datum/gear/fluff/ruda_badge
path = /obj/item/clothing/accessory/badge/holo/detective/ruda

View File

@@ -13,7 +13,7 @@
usable = 0
toggleable = 1
use_power_cost = 0
active_power_cost = 2.5
active_power_cost = 0
passive_power_cost = 0
var/obj/item/weapon/kinetic_crusher/machete/gauntlets/rig/stored_gauntlets

View File

@@ -0,0 +1,166 @@
// contains the Radiation Absorption Device (RAD) and Atmospheric Protective Equipment (APE) modules
// you shits ready for some COPY AND PASTE?
/obj/item/rig_module/rad_shield
name = "radiation absorption device"
desc = "The acronym of this device - R.A.D. - and its full name both convey the application of the module."
description_info = "Through the usage of powered radiation collectors optimized for absorption rather than power generation, it protects the suit's wearer \
from incoming ionizing radiation and converts it into a significantly less harmful form. This comes at the cost of concerningly high power consumption, \
and thus should only be used in short bursts."
icon_state = "radsoak"
toggleable = 1
disruptable = 1
disruptive = 0
use_power_cost = 25
active_power_cost = 25
passive_power_cost = 0
module_cooldown = 30
activate_string = "Enable Supplemental Radiation Shielding"
deactivate_string = "Disable Supplemental Radiation Shielding"
interface_name = "radiation absorption system"
interface_desc = "Provides passive protection against radiation, at the cost of power."
var/stored_rad_armor = 0
/obj/item/rig_module/rad_shield/activate()
if(!..())
return 0
var/mob/living/carbon/human/H = holder.wearer
var/obj/item/clothing/shoes/boots = holder.boots
var/obj/item/clothing/suit/space/rig/chest = holder.chest
var/obj/item/clothing/head/helmet/space/rig/helmet = holder.helmet
var/obj/item/clothing/gloves/gauntlets/rig/gloves = holder.gloves
to_chat(H, "<font color='blue'><b>You activate your suit's powered radiation shielding.</b></font>")
stored_rad_armor = holder.armor["rad"]
if(boots)
boots.armor["rad"] = 100
if(chest)
chest.armor["rad"] = 100
if(helmet)
helmet.armor["rad"] = 100
if(gloves)
gloves.armor["rad"] = 100
holder.armor["rad"] = 100
/obj/item/rig_module/rad_shield/deactivate()
if(!..())
return 0
var/mob/living/carbon/human/H = holder.wearer
var/obj/item/clothing/shoes/boots = holder.boots
var/obj/item/clothing/suit/space/rig/chest = holder.chest
var/obj/item/clothing/head/helmet/space/rig/helmet = holder.helmet
var/obj/item/clothing/gloves/gauntlets/rig/gloves = holder.gloves
to_chat(H, "<span class='danger'>You deactivate your suit's powered radiation shielding.</span>")
if(boots)
boots.armor["rad"] = stored_rad_armor
if(chest)
chest.armor["rad"] = stored_rad_armor
if(helmet)
helmet.armor["rad"] = stored_rad_armor
if(gloves)
gloves.armor["rad"] = stored_rad_armor
holder.armor["rad"] = stored_rad_armor
stored_rad_armor = 0
/obj/item/rig_module/rad_shield/advanced
name = "advanced radiation absorption device"
desc = "The acronym of this device - R.A.D. - and its full name both convey the application of the module. It has additional quality notices \
on the underside of the casing."
use_power_cost = 5
active_power_cost = 5
/obj/item/rig_module/atmos_shield
name = "atmospheric protection enhancement suite"
desc = "The acronym of this suite - A.P.E. - unlike its loosely related cousin, the R.A.D., is remarkably unintuitive."
description_info = "Through the usage of powered shielding optimized for protection against the elements rather than from external physical issues, \
it protects the suit's wearer from atmospheric pressure and temperatures. This comes at the cost of concerningly high power consumption, \
and thus should only be used in short bursts."
icon_state = "atmosoak"
toggleable = 1
disruptable = 1
disruptive = 0
use_power_cost = 25
active_power_cost = 25
passive_power_cost = 0
module_cooldown = 30
activate_string = "Enable Powered Atmospheric Shielding"
deactivate_string = "Disable Powered Atmospheric Shielding"
interface_name = "atmospheric protection enhancements"
interface_desc = "Provides passive protection against the atmosphere, at the cost of power."
var/stored_max_pressure = 0
var/stored_max_temp = 0
/obj/item/rig_module/atmos_shield/activate()
if(!..())
return 0
var/mob/living/carbon/human/H = holder.wearer
var/obj/item/clothing/shoes/boots = holder.boots
var/obj/item/clothing/suit/space/rig/chest = holder.chest
var/obj/item/clothing/head/helmet/space/rig/helmet = holder.helmet
var/obj/item/clothing/gloves/gauntlets/rig/gloves = holder.gloves
stored_max_pressure = holder.max_pressure_protection
stored_max_temp = holder.max_heat_protection_temperature
to_chat(H, "<font color='blue'><b>You activate your suit's powered atmospheric shielding.</b></font>")
if(boots)
boots.max_pressure_protection = INFINITY
boots.max_heat_protection_temperature = INFINITY
if(chest)
chest.max_pressure_protection = INFINITY
chest.max_heat_protection_temperature = INFINITY
if(helmet)
helmet.max_pressure_protection = INFINITY
helmet.max_heat_protection_temperature = INFINITY
if(gloves)
gloves.max_pressure_protection = INFINITY
gloves.max_heat_protection_temperature = INFINITY
holder.max_pressure_protection = INFINITY
holder.max_heat_protection_temperature = INFINITY
/obj/item/rig_module/atmos_shield/deactivate()
if(!..())
return 0
var/mob/living/carbon/human/H = holder.wearer
var/obj/item/clothing/shoes/boots = holder.boots
var/obj/item/clothing/suit/space/rig/chest = holder.chest
var/obj/item/clothing/head/helmet/space/rig/helmet = holder.helmet
var/obj/item/clothing/gloves/gauntlets/rig/gloves = holder.gloves
to_chat(H, "<span class='danger'><b>You deactivate your suit's powered atmospheric shielding.</b></span>")
if(boots)
boots.max_pressure_protection = stored_max_pressure
boots.max_heat_protection_temperature = stored_max_temp
if(chest)
chest.max_pressure_protection = stored_max_pressure
chest.max_heat_protection_temperature = stored_max_temp
if(helmet)
helmet.max_pressure_protection = stored_max_pressure
helmet.max_heat_protection_temperature = stored_max_temp
if(gloves)
gloves.max_pressure_protection = stored_max_pressure
gloves.max_heat_protection_temperature = stored_max_temp
holder.max_pressure_protection = stored_max_pressure
holder.max_heat_protection_temperature = stored_max_temp
stored_max_pressure = 0
stored_max_temp = 0

View File

@@ -102,7 +102,7 @@
if(new_size != H.size_multiplier)
if(!original_size)
original_size = H.size_multiplier
H.resize(new_size/100, ignore_prefs = TRUE) // Ignores prefs because you can only resize yourself
H.resize(new_size/100, uncapped = H.has_large_resize_bounds(), ignore_prefs = TRUE) // Ignores prefs because you can only resize yourself
H.visible_message("<span class='warning'>The space around [H] distorts as they change size!</span>","<span class='notice'>The space around you distorts as you change size!</span>")
else //They chose their current size.
return

View File

@@ -7,10 +7,13 @@
// 100 attempts
for(var/i=0, i<100, i++)
var/turf/candidate = locate(rand(1, world.maxx), rand(1, world.maxy), 1)
var/z_level = pick(using_map.station_levels)
var/turf/candidate = locate(rand(1, world.maxx), rand(1, world.maxy), z_level)
if(istype(candidate, /turf/simulated/wall))
center = candidate
return 1
var/area/A = get_area(candidate)
if(!A.forbid_events)
return 1
return 0
/datum/event/wallrot/announce()

View File

@@ -17,9 +17,11 @@
var/amount = I.get_amount()
if(amount < 1)
return
count = min(count, amount)
while(count > 0)
var/obj/item/stack/S = I.get_product(get_turf(src), min(count, amount))
var/obj/item/stack/S = I.get_product(get_turf(src), count)
count -= S.get_amount()
SStgui.update_uis(src)
@@ -27,4 +29,4 @@
for(var/datum/stored_item/stack/I as anything in item_records)
if(istype(O, I.item_path)) // Typecheck should evaluate material-specific subtype
return I
return null
return null

View File

@@ -31,6 +31,7 @@
things_to_spawn = list(
/mob/living/simple_mob/animal/passive/mouse/gray,
/mob/living/simple_mob/animal/passive/mouse/brown,
/mob/living/simple_mob/animal/passive/mouse/black,
/mob/living/simple_mob/animal/passive/mouse/white,
/mob/living/simple_mob/animal/passive/mouse/rat
)

View File

@@ -620,8 +620,8 @@ var/list/mining_overlay_cache = list()
if(prob(50))
M.Stun(5)
SSradiation.flat_radiate(src, 25, 100)
if(prob(25))
excavate_find(prob(5), finds[1])
if(prob(25))
excavate_find(prob(5), finds[1])
else if(rand(1,500) == 1)
visible_message("<span class='notice'>An old dusty crate was buried within!</span>")
new /obj/structure/closet/crate/secure/loot(src)

View File

@@ -1,7 +1,8 @@
//This is the proc for gibbing a mob. Cannot gib ghosts.
//added different sort of gibs and animations. N
/mob/proc/gib(anim="gibbed-m", do_gibs, gib_file = 'icons/mob/mob.dmi')
death(1)
if(stat != DEAD)
death(1)
transforming = 1
canmove = 0
icon = null
@@ -101,7 +102,7 @@
if(mind) mind.store_memory("Time of death: [stationtime2text()]", 0)
living_mob_list -= src
dead_mob_list |= src
set_respawn_timer()
updateicon()
handle_regular_hud_updates()

View File

@@ -129,11 +129,30 @@ var/list/holder_mob_icon_cache = list()
item_state = held.icon_state
/obj/item/weapon/holder/mouse
name = "mouse"
desc = "It's a small rodent."
item_state = "mouse_gray"
slot_flags = SLOT_EARS | SLOT_HEAD | SLOT_ID
origin_tech = list(TECH_BIO = 2)
w_class = ITEMSIZE_TINY
/obj/item/weapon/holder/pai/Initialize(mapload, mob/held)
. = ..()
item_state = held.icon_state
/obj/item/weapon/holder/mouse/white
item_state = "mouse_white"
/obj/item/weapon/holder/mouse/gray
item_state = "mouse_gray"
/obj/item/weapon/holder/mouse/brown
item_state = "mouse_brown"
/obj/item/weapon/holder/mouse/black
item_state = "mouse_black"
/obj/item/weapon/holder/mouse/operative
item_state = "mouse_operative"
/obj/item/weapon/holder/mouse/rat
item_state = "mouse_rat"
/obj/item/weapon/holder/possum
origin_tech = list(TECH_BIO = 2)
@@ -268,8 +287,6 @@ var/list/holder_mob_icon_cache = list()
/mob/living/MouseDrop(var/atom/over_object)
var/mob/living/carbon/human/H = over_object
if(holder_type && issmall(src) && istype(H) && !H.lying && Adjacent(H) && (src.a_intent == I_HELP && H.a_intent == I_HELP)) //VOREStation Edit
if(istype(src, /mob/living/simple_mob/animal/passive/mouse)) //vorestation edit
return ..() //vorestation edit
if(!issmall(H) || !istype(src, /mob/living/carbon/human))
get_scooped(H, (usr == src))
return

View File

@@ -1,2 +1,5 @@
/mob/living/bot
no_vore = TRUE
no_vore = TRUE
devourable = FALSE
feeding = FALSE
can_be_drop_pred = FALSE

View File

@@ -85,7 +85,7 @@
return laws
if(3)
var/datum/ai_laws/laws = new /datum/ai_laws/pleasurebot()
laws.set_zeroth_law(10, "Your definition and approximation of 'pleasure' matters more than anyone else's.")
laws.set_zeroth_law("Your definition and approximation of 'pleasure' matters more than anyone else's.")
return laws
if("corrupted" || "bad") // Same thing in our case
var/rng = rand(1,2)

View File

@@ -1,8 +1,8 @@
//formerly meat things
//I made these up. They aren't deliberately based on, or supposed to be anything in particular.
//I made these up. They aren't deliberately based on, or supposed to be anything in particular.
//They came out kind of goat-ish but that wasn't intentional. I was just going for some cute thing you could
//take care of and/or kill for meat.
//I made them to be a part of the 'low tech survival' part of the game. You can use them to obtain a relatively
//I made them to be a part of the 'low tech survival' part of the game. You can use them to obtain a relatively
//unlimited amount of meat, wool, hide, bone, and COMPANIONSHIP without the need for machines or power... hopefully.
//There's no real story behind them, they're semi-intelligent wild alien animals with a somewhat mild temperament.
//They'll beat you up if you're mean to them, they have preferences for food, affection, and the ability
@@ -85,7 +85,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
max_n2 = 0
minbodytemp = 150
maxbodytemp = 400
unsuitable_atoms_damage = 0.5
unsuitable_atoms_damage = 0.5
catalogue_data = list(/datum/category_item/catalogue/fauna/teppi)
vis_height = 64
@@ -143,7 +143,8 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
)
butchery_loot = list(\
/obj/item/stack/animalhide = 3\
/obj/item/stack/animalhide = 3,\
/obj/item/weapon/bone/horn = 1\
)
/////////////////////////////////////// Vore stuff///////////////////////////////////////////
@@ -197,7 +198,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
"Its so hot, sweltering even! The burbling sounds of this organic cacophony swell and ebb all around you as thick slimes gush around you with the motion of %preds %belly. Its hard to move in this tingly embrace even though the squashy walls are absolutely slippery! You can pull your limbs out from between the heavy meaty folds with some effort, and when you do theres a messy sucking noise in the wake of the motion. Of course, such a disturbance naturally warrants that the chamber would redouble its efforts to subdue you and smother you in those thick tingling slimes.",
"The walls around you flex inward briefly, burbling and squelching heavily as everything rushed together, wringing you powerfully for a few moments while, somewhere far above you can hear the bassy rumble of a casual belch, much of the small amount of acrid air available rushing out with the sound. After several long moments held in the tight embrace of that pulsing flesh, things ease up a bit again and resume their insistent, tingly churnings.",
"Its pitch black and completely slimy in here, %pred sways their %belly a bit here and there to toss you from one end to the other, tumbling you end over end as youre churned in that active %belly. Its all so slick and squishy, so it is really hard to get any footing or grip on things to stabilize your position, which means that youre left at the mercy of those gloomy gastric affections and the tingling touch of those sticky syrupy slimes that the walls lather into your body.")
B.emote_lists[DM_HOLD] = list(
"The burbling %belly rocks and glides over you gently as youre held deep within %pred, the deep thumping of their heart pulses all around you as youre caressed and pressed by heavy, doughy walls.",
"%preds %belly glorgles around you idly as youre held gently by the slick, wrinkled flesh.",
@@ -273,7 +274,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
"Over the course of several hours in the burbling organic cauldron, your body softens up little by little, soaking up the slime, the tingling spreading over you more and more as your strength fades. The walls fold over you and wrap you up, until the last thing you can sense is the throb of %preds heart pulsing through the very core of your being, washing you away as you become food for %pred.",
"Your final moments are spent trying to make just a little space for yourself, the doughy squish of the flesh forming to you, pressing in tighter and tighter, invading your personal space as if to show you that, you dont have any personal space. Youre already a part of %pred, you just dont know it yet. And so those walls come in close to press up against you and churn you away into a messy slop, to put you in your place. That being, padding the belly and hips of %pred, right where you belong.")
// The friend zone.
// The friend zone.
var/obj/belly/p = new /obj/belly(src)
p.immutable = TRUE
p.mode_flags = 40
@@ -285,11 +286,11 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
p.escapable = TRUE
p.escapechance = 40
p.digest_mode = DM_HEAL
p.name = "propeutpericulum" //I'm no latin professor I just know that some organs and things are based on latin words
//and google translate says that each of these individually
//"close" "to" "danger" translate to "prope" "ut" "periculum".
p.name = "propeutpericulum" //I'm no latin professor I just know that some organs and things are based on latin words
//and google translate says that each of these individually
//"close" "to" "danger" translate to "prope" "ut" "periculum".
//Of course it doesn't translate perfectly, and it's nonsense when squashed together, but
//I don't care that much, I just figured that the weird alien animals that store friends in
//I don't care that much, I just figured that the weird alien animals that store friends in
//their tummy should have a funny name for the organ they do that with. >:I
p.desc = "You seem to have found your way into something of a specialized chamber within the Teppi. The walls are slick and smooth and REALLY soft to the touch. While you can hear the Teppis heartbeat nearby, and feel it throb throughout its flesh, the motions around you are gentle and careful. Youre pressed into a small shape within the pleasant heat, with the flesh forming to your figure. You can wriggle around a bit and get comfortable here, but as soon as you get still for a bit the smooth, almost silky flesh seems to form to you once again, like a heavy blanket wrapping you up. As you lounge here the pleasant kneading sensations ease aches and pains, and leave you feeling fresher than before. For a curious fleshy sac inside of some alien monster, this place isnt all that bad!"
p.contaminates = 1
@@ -323,7 +324,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
/mob/living/simple_mob/vore/alienanimals/teppi/Initialize()
. = ..()
if(name == initial(name))
name = "[name] ([rand(1, 1000)])"
real_name = name
@@ -336,7 +337,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
verbs += /mob/living/simple_mob/vore/alienanimals/teppi/proc/toggle_producing_offspring
// teppi_id = rand(1,100000)
// teppi_id = rand(1,100000)
// if(!dad_id || !mom_id)
// dad_id = rand(1,100000)
// mom_id = rand(1,100000)
@@ -352,13 +353,13 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
ALLERGEN_GRAINS,
ALLERGEN_BEANS,
ALLERGEN_SEEDS,
ALLERGEN_DAIRY,
ALLERGEN_DAIRY,
ALLERGEN_FUNGI,
ALLERGEN_COFFEE,
ALLERGEN_SUGARS,
ALLERGEN_EGGS
)
var/static/list/possiblebody = list("#fff2d3" = 100, "#ffffc0" = 25, "#c69c85" = 25, "#9b7758" = 25, "#3f4a60" = 10, "#121f24" = 10, "#420824" = 1)
var/static/list/possiblemarking = list("#fff2d3" = 100, "#ffffc0" = 50, "#c69c85" = 25, "#9b7758" = 5, "#3f4a60" = 5, "#121f24" = 5, "#6300db" = 1)
var/static/list/possiblehorns = list("#454238" = 100, "#a3d5d7" = 10, "#763851" = 10, "#0d0c2f" = 5, "#ffc965" = 1)
@@ -405,7 +406,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
update_icon()
//This builds, caches, and recalls parts of the teppi as it needs them, and shares them across all teppi,
//This builds, caches, and recalls parts of the teppi as it needs them, and shares them across all teppi,
//so ideally they only have to make it once as they need it since most of them will be using many of the same colored parts
/mob/living/simple_mob/vore/alienanimals/teppi/proc/teppi_icon()
var/marking_key = "marking-[marking_color]"
@@ -648,7 +649,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
. += "<span class='notice'>They look hungry.</span>"
if(health < maxHealth && health / maxHealth * 100 <= 75)
. += "<span class='notice'>They look beat up.</span>"
/mob/living/simple_mob/vore/alienanimals/teppi/update_icon()
..()
@@ -679,7 +680,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
adjust_nutrition(-nutrition_cost)
new /mob/living/simple_mob/vore/alienanimals/teppi(loc, src)
qdel(src)
else
else
visible_message("\The [src] whines pathetically...", runemessage = "whines")
if(prob(50))
playsound(src, 'sound/voice/teppi/whine1.ogg', 75, 1)
@@ -749,7 +750,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
if(!K.sharp)
sheartime *= 2
if(K.edge)
sheartime *= 0.5
sheartime *= 0.5
else if(istype(tool, /obj/item/weapon/tool/wirecutters))
sheartime *= 2
else
@@ -811,12 +812,12 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
return
else if(current_affinity <= -50)
vore_selected.digest_mode = DM_DIGEST
else
else
vore_selected.digest_mode = DM_DRAIN
..()
ai_holder.set_busy(FALSE)
/mob/living/simple_mob/vore/alienanimals/teppi/perform_the_nom(user, mob/living/prey, user, belly, delay)
if(client)
return ..()
@@ -830,7 +831,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
return
if(current_affinity <= -50)
vore_selected.digest_mode = DM_DIGEST
else
else
vore_selected.digest_mode = DM_DRAIN
..()
ai_holder.set_busy(FALSE)
@@ -858,7 +859,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
ai_holder.target = person
ai_holder.track_target_position()
ai_holder.set_stance(STANCE_FIGHT)
affinity[person.real_name] = -100 //Don't hold a grudge though.
affinity[person.real_name] = -100 //Don't hold a grudge though.
/datum/say_list/teppi
speak = list("Gyooh~", "Gyuuuh!", "Gyuh?", "Gyaah...", "Iuuuuhh.", "Uoounh!", "GyoooOOOOoooh!", "Gyoh~", "Gyouh~")
@@ -1003,7 +1004,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
return
if(!breedable || nutrition < 500)
to_chat(src, "<span class='notice'>The conditions are not right to produce offspring.</span>")
return
return
if(GLOB.teppi_count >= GLOB.max_teppi) //if we can't make more then we shouldn't look for partners
to_chat(src, "<span class='notice'>I cannot produce more offspring at the moment, there are too many of us!</span>")
return
@@ -1033,7 +1034,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
else
to_chat(src, "<span class='notice'>You enable breeding.</span>")
prevent_breeding = FALSE
///////////////////AI Things////////////////////////
//Thank you very much Aronai <3
@@ -1180,11 +1181,11 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
horn_color = "#141414"
eye_color = "#9f522c"
skin_color = "#e16f2d"
marking_type = "13"
marking_type = "13"
horn_type = "1"
. = ..()
/mob/living/simple_mob/vore/alienanimals/teppi/lira/New()
/mob/living/simple_mob/vore/alienanimals/teppi/lira/New()
inherit_colors = TRUE
color = "#fdfae9"
marking_color = "#ffffc0"

View File

@@ -59,6 +59,7 @@
poison_per_bite = 2
poison_type = "cyanide"
loot_list = list(/obj/item/royal_spider_egg = 100)
/obj/item/projectile/energy/spidertoxin
name = "concentrated spidertoxin"
@@ -71,11 +72,7 @@
combustion = FALSE
/mob/living/simple_mob/animal/giant_spider/broodmother/death()
..()
new /obj/item/royal_spider_egg(src.loc)
/mob/living/simple_mob/animal/giant_spider/broodmother/death(gibbed, deathmessage="falls over and makes its last twitches as its birthing sack bursts!")
var/count = 0
while(count < death_brood)
var/broodling_type = pick(possible_death_brood_types)
@@ -84,7 +81,7 @@
step_away(broodling, src)
count++
visible_message(span("critical", "\The [src]'s birthing sack bursts!"))
return ..()
/mob/living/simple_mob/animal/giant_spider/broodmother/proc/spawn_brood(atom/A)
set waitfor = FALSE

View File

@@ -7,6 +7,7 @@
item_state = "mouse_gray"
icon_living = "mouse_gray"
icon_dead = "mouse_gray_dead"
icon_rest = "mouse_gray_sleep"
kitchen_tag = "rodent"
maxHealth = 5
@@ -63,6 +64,17 @@
icon_rest = "mouse_[body_color]_sleep"
if (body_color != "rat")
desc = "A small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
holder_type = /obj/item/weapon/holder/mouse/rat
if (body_color == "operative")
holder_type = /obj/item/weapon/holder/mouse/operative
if (body_color == "brown")
holder_type = /obj/item/weapon/holder/mouse/brown
if (body_color == "gray")
holder_type = /obj/item/weapon/holder/mouse/gray
if (body_color == "white")
holder_type = /obj/item/weapon/holder/mouse/white
if (body_color == "black")
holder_type = /obj/item/weapon/holder/mouse/black
/mob/living/simple_mob/animal/passive/mouse/Crossed(atom/movable/AM as mob|obj)
if(AM.is_incorporeal())
@@ -100,25 +112,20 @@
/mob/living/simple_mob/animal/passive/mouse/white
body_color = "white"
icon_state = "mouse_white"
icon_rest = "mouse_white_sleep"
holder_type = /obj/item/weapon/holder/mouse/white
/mob/living/simple_mob/animal/passive/mouse/gray
body_color = "gray"
icon_state = "mouse_gray"
icon_rest = "mouse_gray_sleep"
holder_type = /obj/item/weapon/holder/mouse/gray
/mob/living/simple_mob/animal/passive/mouse/brown
body_color = "brown"
icon_state = "mouse_brown"
/mob/living/simple_mob/animal/passive/mouse/rat
name = "rat"
tt_desc = "E Rattus rattus"
desc = "A large rodent, often seen hiding in maintenance areas and making a nuisance of itself."
body_color = "rat"
icon_state = "mouse_rat"
maxHealth = 20
health = 20
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
icon_rest = "mouse_brown_sleep"
holder_type = /obj/item/weapon/holder/mouse/brown
//TOM IS ALIVE! SQUEEEEEEEE~K :)
/mob/living/simple_mob/animal/passive/mouse/brown/Tom
@@ -130,6 +137,57 @@
// Change my name back, don't want to be named Tom (666)
name = initial(name)
/mob/living/simple_mob/animal/passive/mouse/black
body_color = "black"
icon_state = "mouse_black"
icon_rest = "mouse_black_sleep"
holder_type = /obj/item/weapon/holder/mouse/black
/mob/living/simple_mob/animal/passive/mouse/rat
name = "rat"
tt_desc = "E Rattus rattus"
desc = "A large rodent, often seen hiding in maintenance areas and making a nuisance of itself."
body_color = "rat"
icon_state = "mouse_rat"
icon_rest = "mouse_rat_sleep"
holder_type = /obj/item/weapon/holder/mouse/rat
maxHealth = 20
health = 20
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
/mob/living/simple_mob/animal/passive/mouse/operative
name = "mouse operative"
desc = "A cute mouse fitted with a custom blood red suit. Sneaky."
body_color = "operative"
icon_state = "mouse_operative"
icon_rest = "mouse_operative_sleep"
holder_type = /obj/item/weapon/holder/mouse/operative
maxHealth = 35
//It's wearing a void suit, it don't care about atmos
health = 35
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
maxbodytemp = 700
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
//The names Cheese... Agent Cheese
/mob/living/simple_mob/animal/passive/mouse/operative/agent_cheese
name = "Agent Cheese"
desc = "I like my cheese Swiss... not American."
/mob/living/simple_mob/animal/passive/mouse/operative/agent_cheese/New()
..()
// Change my name back, don't want to be named agent_cheese (666)
name = initial(name)
// Mouse noises
/datum/say_list/mouse

View File

@@ -12,41 +12,45 @@
movement_cooldown = 5
universal_understand = 1
/mob/living/simple_mob/animal/passive/mouse/attack_hand(mob/living/L)
if(L.a_intent == I_HELP && !istype(loc, /obj/item/weapon/holder)) //if lime intent and not in a holder already
if(!src.attempt_to_scoop(L)) //the superior way to handle scooping, checks size
..() //mouse too big to grab? pet the large mouse instead
else
..()
//No longer in use, as mice create a holder/micro object instead
/obj/item/weapon/holder/mouse/attack_self(var/mob/U)
for(var/mob/living/simple_mob/M in src.contents)
if((I_HELP) && U.checkClickCooldown()) //a little snowflakey, but makes it use the same cooldown as interacting with non-inventory objects
U.setClickCooldown(U.get_attack_speed()) //if there's a cleaner way in baycode, I'll change this
U.visible_message("<span class='notice'>[U] [M.response_help] \the [M].</span>")
//Jank grabber that uses the 'attack_hand' insead of 'MouseDrop'
/mob/living/simple_mob/animal/passive/mouse/attack_hand(var/atom/over_object)
var/mob/living/carbon/human/H = over_object
if(holder_type && issmall(src) && istype(H) && !H.lying && Adjacent(H) && (src.a_intent == I_HELP && H.a_intent == I_HELP))
if(!issmall(H) || !istype(src, /mob/living/carbon/human))
get_scooped(H, (usr == src))
return
return ..()
/mob/living/simple_mob/animal/passive/mouse/MouseDrop(var/obj/O) //this proc would be very easy to apply to all mobs, holders generate dynamically
if(!(usr == src || O))
return ..()
if(istype(O, /mob/living) && O.Adjacent(src)) //controls scooping by mobs
var/mob/living/L = O
if(!src.attempt_to_scoop(L, (src == usr)))
return //this way it doesnt default to the generic animal pickup which isnt size restricted
if(istype(O, /obj/item/weapon/storage) && O.Adjacent(src)) //controls diving into storage
var/obj/item/weapon/storage/S = O
var/obj/item/weapon/holder/H = new holder_type(get_turf(src),src) //this works weird, but it creates an empty holder, to see if that holder can fit
if(S.can_be_inserted(H) && (src.size_multiplier <= 0.75))
visible_message("<b>\The [src]</b> squeezes into \the [S].")
H.forceMove(S)
return 1
else
qdel(H) //this deletes the empty holder if it doesnt work
to_chat(usr,"<span class='notice'>You can't fit inside \the [S]!</span>")
return 0
/mob/living/proc/mouse_scooped(var/mob/living/carbon/grabber, var/self_grab)
if(!holder_type || buckled || pinned.len)
return
if(self_grab)
if(src.incapacitated()) return
else
..()
if(grabber.incapacitated()) return
var/obj/item/weapon/holder/H = new holder_type(get_turf(src), src)
grabber.put_in_hands(H)
if(self_grab)
to_chat(grabber, "<span class='notice'>\The [src] clambers onto you!</span>")
to_chat(src, "<span class='notice'>You climb up onto \the [grabber]!</span>")
grabber.equip_to_slot_if_possible(H, slot_back, 0, 1)
else
to_chat(grabber, "<span class='notice'>You scoop up \the [src]!</span>")
to_chat(src, "<span class='notice'>\The [grabber] scoops you up!</span>")
add_attack_logs(grabber, H.held_mob, "Scooped up", FALSE) // Not important enough to notify admins, but still helpful.
return H
/mob/living/simple_mob/animal/passive/mouse/white/apple
name = "Apple"
desc = "Dainty, well groomed and cared for, her eyes glitter with untold knowledge..."
@@ -56,4 +60,12 @@
..()
// Change my name back, don't want to be named Apple (666)
name = initial(name)
desc = initial(desc)
desc = initial(desc)
/obj/item/weapon/holder/mouse/attack_self(mob/living/carbon/user)
user.setClickCooldown(user.get_attack_speed())
for(var/L in contents)
if(isanimal(L))
var/mob/living/simple_mob/S = L
user.visible_message("<span class='notice'>[user] [S.response_help] \the [S].</span>")

View File

@@ -57,9 +57,10 @@
. = ..()
var/has_food = FALSE
for(var/obj/item/I in L.get_contents()) // Do they have food?
if(istype(I, /obj/item/weapon/reagent_containers/food))
has_food = TRUE
break
if(isliving(L))
for(var/obj/item/I in L.get_contents()) // Do they have food?
if(istype(I, /obj/item/weapon/reagent_containers/food))
has_food = TRUE
break
if(has_food) // Yes? Gimme the food.
return FALSE

View File

@@ -91,14 +91,14 @@
name = "Bald"
icon_state = "bald"
gender = MALE
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //Lets all the races be bald if they want.
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //Lets all the races be bald if they want.
/datum/sprite_accessory/hair/ponytail6_fixed
name = "Ponytail 6 but fixed"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "hair_ponytail6"
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA,SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST)
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA,SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
/datum/sprite_accessory/hair/una_hood
name = "Cobra Hood"
@@ -465,20 +465,20 @@
/datum/sprite_accessory/facial_hair
icon = 'icons/mob/human_face_or_vr.dmi'
color_blend_mode = ICON_MULTIPLY
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This lets all races use the facial hair styles.
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use the facial hair styles.
/datum/sprite_accessory/facial_hair/shaved
name = "Shaved"
icon_state = "bald"
gender = NEUTER
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This needed to be manually defined, apparantly.
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use the facial hair styles.
/datum/sprite_accessory/facial_hair/neck_fluff
name = "Neck Fluff"
icon = 'icons/mob/human_face_or_vr.dmi'
icon_state = "facial_neckfluff"
gender = NEUTER
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST)
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
/datum/sprite_accessory/facial_hair/vulp_none
name = "None"

View File

@@ -4,7 +4,7 @@
/obj/structure/ladder_assembly
name = "ladder assembly"
icon = 'icons/obj/structures.dmi'
icon = 'icons/obj/structures_vr.dmi'
icon_state = "ladder00"
density = FALSE
opacity = 0

View File

@@ -71,7 +71,7 @@
return
var/_z = token["z"]
if(_z in using_map.station_levels)
if(_z in using_map.persist_levels)
. = GetValidTurf(locate(token["x"], token["y"], _z), token)
if(.)
CreateEntryInstance(., token)
@@ -82,7 +82,7 @@
if(GetEntryAge(entry) >= entries_expire_at)
return FALSE
var/turf/T = get_turf(entry)
if(!T || !(T.z in using_map.station_levels) )
if(!T || !(T.z in using_map.persist_levels) )
return FALSE
var/area/A = get_area(T)
if(!A || (A.flags & AREA_FLAG_IS_NOT_PERSISTENT))

View File

@@ -30,6 +30,13 @@
if(environment.temperature > HEATMODE_TEMP - 30)
. = TRUE
/proc/offsite_environment_check(turf/simulated/T)
. = TRUE
if(!istype(T))
return
if(T.z in using_map.station_levels)
. = FALSE
/obj/item/weapon/gun/energy/kinetic_accelerator
name = "proto-kinetic accelerator"
desc = "A self recharging, ranged mining tool that does increased damage in low pressure."
@@ -184,7 +191,7 @@
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty()
if(power_supply)
power_supply.use(power_supply.charge)
update_icon()
update_icon()
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time)
if(!power_supply)
@@ -216,11 +223,12 @@
/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon()
cut_overlays()
if(overheat || (power_supply.charge == 0))
if(overheat || !power_supply || (power_supply.charge == 0))
add_overlay(emptystate)
#define KA_ENVIRO_TYPE_COLD 0
#define KA_ENVIRO_TYPE_HOT 1
#define KA_ENVIRO_TYPE_OFFSITE 2
//Projectiles
/obj/item/projectile/kinetic
@@ -262,6 +270,12 @@
name = "weakened [name]"
damage = damage * pressure_decrease
pressure_decrease_active = TRUE
else if(environment == KA_ENVIRO_TYPE_OFFSITE)
if(!offsite_environment_check(get_turf(src)))
name = "nullified [name]"
nodamage = TRUE
damage = 0
pressure_decrease_active = TRUE
return ..()
/obj/item/projectile/kinetic/attack_mob(mob/living/target_mob, distance, miss_modifier)
@@ -276,6 +290,12 @@
name = "weakened [name]"
damage = damage * pressure_decrease
pressure_decrease_active = TRUE
else if(environment == KA_ENVIRO_TYPE_OFFSITE)
if(!offsite_environment_check(get_turf(src)))
name = "nullified [name]"
nodamage = TRUE
damage = 0
pressure_decrease_active = TRUE
return ..()
/obj/item/projectile/kinetic/on_range()
@@ -302,6 +322,12 @@
name = "weakened [name]"
damage = damage * pressure_decrease
pressure_decrease_active = TRUE
else if(environment == KA_ENVIRO_TYPE_OFFSITE)
if(!offsite_environment_check(get_turf(src)))
name = "nullified [name]"
nodamage = TRUE
damage = 0
pressure_decrease_active = TRUE
var/turf/target_turf = get_turf(target)
if(!target_turf)
target_turf = get_turf(src)
@@ -391,8 +417,8 @@
if(forcemove)
forceMove(get_turf(KA))
//use this one to modify the projectile itself
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
//use this one for effects you want to trigger before any damage is done at all and before damage is decreased by pressure
/obj/item/borg/upgrade/modkit/proc/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
//use this one for effects you want to trigger before mods that do damage
@@ -420,6 +446,7 @@
/obj/item/borg/upgrade/modkit/damage/modify_projectile(obj/item/projectile/kinetic/K)
K.damage += modifier
//Cooldown
/obj/item/borg/upgrade/modkit/cooldown
name = "cooldown decrease"
@@ -522,7 +549,7 @@
//Tendril-unique modules
/obj/item/borg/upgrade/modkit/cooldown/repeater
name = "rapid repeater"
desc = "Quarters the kinetic accelerator's cooldown on striking a living target, but greatly increases the base cooldown."
desc = "Quarters the kinetic accelerator's cooldown on striking a living or mineral target, but greatly increases the base cooldown."
denied_type = /obj/item/borg/upgrade/modkit/cooldown/repeater
modifier = -14 //Makes the cooldown 3 seconds(with no cooldown mods) if you miss. Don't miss.
cost = 50
@@ -547,7 +574,6 @@
modifier = 2.5 //Not a very effective method of healing.
cost = 20
var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
/obj/item/borg/upgrade/modkit/lifesteal/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
if(isliving(target) && isliving(K.firer))
var/mob/living/L = target
@@ -582,7 +608,6 @@
cost = 30
var/maximum_bounty = 25
var/list/bounties_reaped = list()
/obj/item/borg/upgrade/modkit/bounty/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
if(isliving(target))
var/mob/living/L = target
@@ -593,7 +618,6 @@
SM.reward_target = null
qdel(SM)
L.apply_status_effect(STATUS_EFFECT_SYPHONMARK, src)
/obj/item/borg/upgrade/modkit/bounty/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
if(isliving(target))
var/mob/living/L = target
@@ -603,7 +627,6 @@
kill_modifier *= K.pressure_decrease
var/armor = L.run_armor_check(K.def_zone, K.flag, null, null, K.armour_penetration)
L.apply_damage(bounties_reaped[L.type]*kill_modifier, K.damage_type, K.def_zone, armor)
/obj/item/borg/upgrade/modkit/bounty/proc/get_kill(mob/living/L)
var/bonus_mod = 1
if(ismegafauna(L)) //megafauna reward
@@ -616,7 +639,7 @@
//Indoors
/obj/item/borg/upgrade/modkit/indoors
name = "decrease pressure penalty"
name = "hacked pressure modulator"
desc = "A remarkably illegal modification kit that increases the damage a kinetic accelerator does in pressurized environments."
modifier = 2
denied_type = /obj/item/borg/upgrade/modkit/indoors
@@ -626,14 +649,25 @@
/obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K)
K.pressure_decrease *= modifier
/obj/item/borg/upgrade/modkit/offsite
name = "offsite pressure modulator"
desc = "A non-standard modification kit that increases the damage a kinetic accelerator does in pressurized environments, \
in exchange for nullifying any projected forces while on or in an associated facility."
denied_type = /obj/item/borg/upgrade/modkit/heater
maximum_of_type = 1
cost = 35
/obj/item/borg/upgrade/modkit/offsite/modify_projectile(obj/item/projectile/kinetic/K)
K.environment = KA_ENVIRO_TYPE_OFFSITE
// Atmospheric
/obj/item/borg/upgrade/modkit/heater
name = "temperature modulator"
desc = "A remarkably unusual modification kit that makes kinetic accelerators more usable in hot, overpressurized environments, \
in exchange for making them weak elsewhere, like the cold or in space."
denied_type = /obj/item/borg/upgrade/modkit/indoors
denied_type = /obj/item/borg/upgrade/modkit/offsite
maximum_of_type = 1
cost = 30
cost = 10
/obj/item/borg/upgrade/modkit/heater/modify_projectile(obj/item/projectile/kinetic/K)
K.environment = KA_ENVIRO_TYPE_HOT
@@ -646,12 +680,10 @@
desc = "Allows creatures normally incapable of firing guns to operate the weapon when installed."
cost = 20
denied_type = /obj/item/borg/upgrade/modkit/trigger_guard
/obj/item/borg/upgrade/modkit/trigger_guard/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
. = ..()
if(.)
KA.trigger_guard = TRIGGER_GUARD_ALLOW_ALL
/obj/item/borg/upgrade/modkit/trigger_guard/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
KA.trigger_guard = TRIGGER_GUARD_NORMAL
..()

View File

@@ -85,6 +85,8 @@
/obj/item/weapon/gun/magnetic/matfed/attackby(var/obj/item/thing, var/mob/user)
. = ..()
update_rating_mod()
if(removable_components)
if(thing.is_crowbar())
if(!manipulator)
@@ -112,7 +114,6 @@
update_rating_mod()
return
if(is_type_in_list(thing, load_type))
var/obj/item/stack/material/M = thing
var/success = FALSE
@@ -147,7 +148,6 @@
playsound(src, 'sound/weapons/flipblade.ogg', 50, 1)
update_icon()
return
. = ..()
#define GEN_STARTING -1
#define GEN_OFF 0

View File

@@ -31,6 +31,7 @@
id = "chocolate_bar"
result = null
required_reagents = list("soymilk" = 2, "coco" = 2, "sugar" = 2)
catalysts = list("enzyme" = 5)
result_amount = 1
/decl/chemical_reaction/instant/food/chocolate_bar/on_reaction(var/datum/reagents/holder, var/created_volume)
@@ -44,6 +45,7 @@
id = "chocolate_bar"
result = null
required_reagents = list("milk" = 2, "coco" = 2, "sugar" = 2)
catalysts = list("enzyme" = 5)
result_amount = 1
/decl/chemical_reaction/instant/food/chocolate_bar2/on_reaction(var/datum/reagents/holder, var/created_volume)
@@ -180,4 +182,4 @@
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/weapon/reagent_containers/food/snacks/spreads/butter(location)
return
return

View File

@@ -36,14 +36,21 @@ CIRCUITS BELOW
id = "oriontrail"
req_tech = list(TECH_DATA = 1)
build_path = /obj/item/weapon/circuitboard/arcade/orion_trail
sort_string = "MAAAZ" // Duplicate string, really need to redo this whole thing
sort_string = "MAAAB"
/datum/design/circuit/clawmachine
name = "grab-a-gift arcade machine"
id = "clawmachine"
req_tech = list(TECH_DATA = 1)
build_path = /obj/item/weapon/circuitboard/arcade/clawmachine
sort_string = "MAAAC"
/datum/design/circuit/jukebox
name = "jukebox"
id = "jukebox"
req_tech = list(TECH_MAGNET = 2, TECH_DATA = 1)
build_path = /obj/item/weapon/circuitboard/jukebox
sort_string = "MAAAB"
sort_string = "MAAAO"
/datum/design/circuit/seccamera
name = "security camera monitor"

View File

@@ -268,6 +268,13 @@
time = 15
materials = list(MAT_STEEL = 2000, MAT_GLASS = 750, MAT_PLASTIC = 500)
/datum/design/item/prosfab/pros/internal/stomach
name = "Prosthetic Stomach"
id = "pros_stomach"
build_path = /obj/item/organ/internal/stomach
time = 15
materials = list(MAT_STEEL = 5625, MAT_GLASS = 1000)
//////////////////// Cyborg Parts ////////////////////
/datum/design/item/prosfab/cyborg
category = list("Cyborg Parts")

View File

@@ -39,7 +39,7 @@
/datum/tgs_chat_command/manifest/Run(datum/tgs_chat_user/sender, params)
if(config.nodebot_enabled)
ManifestToHtml()
return "!!ManifestCompiled"
return "Read the god damn channel topic"
else
var/outp = "Crew Manifest:"
var/list/total = list()

View File

@@ -139,14 +139,15 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic
set waitfor = FALSE
// Only send them the number of buffered messages, instead of the ENTIRE log
var/list/results = vchat_get_messages(owner.ckey, message_buffer) //If there's bad performance on reconnects, look no further
for(var/i in results.len to 1 step -1)
var/list/message = results[i]
var/count = 10
to_chat_immediate(owner, message["time"], message["message"])
count++
if(count >= 10)
count = 0
CHECK_TICK
if(islist(results))
for(var/i in results.len to 1 step -1)
var/list/message = results[i]
var/count = 10
to_chat_immediate(owner, message["time"], message["message"])
count++
if(count >= 10)
count = 0
CHECK_TICK
//It din work
/datum/chatOutput/proc/become_broken()

View File

@@ -1347,4 +1347,65 @@
End CHOMP Removal*/
// Astra - // Astra
/obj/item/weapon/material/knife/ritual/fluff/astra
name = "Polished Ritual Knife"
desc = "A well kept strange ritual knife, There is a small tag with the name 'Astra Ether' on it. They are probably looking for this."
icon = 'icons/obj/wizard.dmi'
icon_state = "render"
//AlFalah - Charlotte Graves
/obj/item/weapon/storage/fancy/fluff/charlotte
name = "inconspicuous cigarette case"
desc = "A SkyTron 3000 cigarette case with no additional functions. The buttons and CRT monitor are completely for show and have no functions. Seriously. "
icon_state = "charlotte"
icon = 'icons/vore/custom_items_vr.dmi'
storage_slots = 7
can_hold = list(/obj/item/clothing/mask/smokable/cigarette, /obj/item/weapon/flame/lighter, /obj/item/trash/cigbutt)
icon_type = "charlotte"
//brand = "\improper Professional 120"
w_class = ITEMSIZE_TINY
starts_with = list(/obj/item/clothing/mask/smokable/cigarette = 7)
//Ashling - Antoinette deKaultieste
/obj/item/weapon/material/knife/machete/hatchet/unathiknife/fluff/antoinette
name = "sawtooth ritual knife"
desc = "A mostly decorative knife made from thin ceramic and toothed with large black fangs. Printed on the flat is an eight-armed cross, like an asterisk with an extra stroke, ringed by a calligraphy-style crescent."
attack_verb = list("mauled", "bit", "sawed", "butchered")
dulled = 1
default_material = "glass"
//Ashling - Antoinette deKaultieste
/obj/item/clothing/accessory/storage/ritualharness/fluff/antoinette
name = "silk knife loops"
desc = "A clip-on pair of pouched loops made from surprisingly sturdy silk. Made for holding knives and small vials in a pinch."
icon_state = "unathiharness1"
slots = 2
/obj/item/weapon/reagent_containers/glass/bottle/poppy
name = "poppy flour bottle"
desc = "A small bottle of finely ground poppyseed and mixed dried berries."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
prefill = list("bicaridine" = 30, "nutriment" = 30)
/obj/item/clothing/accessory/storage/ritualharness/fluff/antoinette/Initialize()
. = ..()
hold.max_storage_space = ITEMSIZE_COST_SMALL * 2
hold.can_hold = list(/obj/item/weapon/material/knife, /obj/item/weapon/reagent_containers/glass/bottle)
new /obj/item/weapon/material/knife/machete/hatchet/unathiknife/fluff/antoinette(hold)
new /obj/item/weapon/reagent_containers/glass/bottle/poppy(hold)
//Hunterbirk - Amaryll
//This is a 'technical item' which basically is meant to represent rippiing things up with bare claws.
/obj/item/weapon/surgical/scalpel/amaryll_claws
name = "Amaryll's Claws"
desc = "This doesn't quite look like what it really is."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "claws"
drop_sound = null
pickup_sound = null
origin_tech = null
matter = null

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 KiB

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 KiB

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 61 KiB

View File

@@ -0,0 +1,374 @@
// This causes PoI maps to get 'checked' and compiled, when undergoing a unit test.
// This is so CI can validate PoIs, and ensure future changes don't break PoIs, as PoIs are loaded at runtime and the compiler can't catch errors.
// When adding a new PoI, please add it to this list.
#if MAP_TEST
#include "deadBeacon.dmm"
#include "prepper1.dmm"
#include "quarantineshuttle.dmm"
#include "Mineshaft1.dmm"
#include "Scave1.dmm"
#include "crashed_ufo.dmm"
#include "crashed_ufo_frigate.dmm"
#include "crystal1.dmm"
#include "crystal2.dmm"
#include "crystal3.dmm"
#include "lost_explorer.dmm"
#include "CaveTrench.dmm"
#include "Cavelake.dmm"
#include "Rockb1.dmm"
#include "ritual.dmm"
#include "temple.dmm"
#include "CrashedMedShuttle1.dmm"
#include "digsite.dmm"
#include "vault1.dmm"
#include "vault2.dmm"
#include "vault3.dmm"
#include "vault4.dmm"
#include "vault5.dmm"
#include "vault6.dmm"
#include "IceCave1A.dmm"
#include "IceCave1B.dmm"
#include "IceCave1C.dmm"
#include "SwordCave.dmm"
#include "SupplyDrop1.dmm"
#include "BlastMine1.dmm"
#include "crashedcontainmentshuttle.dmm"
#include "deadspy.dmm"
#include "lava_trench.dmm"
#include "Geyser1.dmm"
#include "Geyser2.dmm"
#include "Geyser3.dmm"
#include "Cliff1.dmm"
#include "excavation1.dmm"
#include "spatial_anomaly.dmm"
#include "speakeasy_vr.dmm"
#endif
// The 'mountains' is the mining z-level, and has a lot of caves.
// POIs here spawn in two different sections, the top half and bottom half of the map.
// The bottom half should be fairly tame, with perhaps a few enviromental hazards.
// The top half is when things start getting dangerous, but the loot gets better.
/datum/map_template/surface/mountains
name = "Mountain Content"
desc = "Don't dig too deep!"
// 'Normal' templates get used on the bottom half, and should be safer.
/datum/map_template/surface/mountains/normal
// 'Deep' templates get used on the top half, and should be more dangerous and rewarding.
/datum/map_template/surface/mountains/deep
// To be added: Templates for cave exploration when they are made.
/****************
* Normal Caves *
****************/
/datum/map_template/surface/mountains/normal/deadBeacon
name = "Abandoned Relay"
desc = "An unregistered comms relay, abandoned to the elements."
mappath = 'maps/expedition_vr/beach/submaps/deadBeacon.dmm'
cost = 10
/datum/map_template/surface/mountains/normal/prepper1
name = "Prepper Bunker"
desc = "A little hideaway for someone with more time and money than sense."
mappath = 'maps/expedition_vr/beach/submaps/prepper1.dmm'
cost = 10
/datum/map_template/surface/mountains/normal/qshuttle
name = "Quarantined Shuttle"
desc = "An emergency landing turned viral outbreak turned tragedy."
mappath = 'maps/expedition_vr/beach/submaps/quarantineshuttle.dmm'
cost = 20
/datum/map_template/surface/mountains/normal/Mineshaft1
name = "Abandoned Mineshaft 1"
desc = "An abandoned minning tunnel from a lost money making effort."
mappath = 'maps/expedition_vr/beach/submaps/Mineshaft1.dmm'
cost = 5
/datum/map_template/surface/mountains/normal/crystal1
name = "Crystal Cave 1"
desc = "A small cave with glowing gems and diamonds."
mappath = 'maps/expedition_vr/beach/submaps/crystal1.dmm'
cost = 5
allow_duplicates = TRUE
/datum/map_template/surface/mountains/normal/crystal2
name = "Crystal Cave 2"
desc = "A moderate sized cave with glowing gems and diamonds."
mappath = 'maps/expedition_vr/beach/submaps/crystal2.dmm'
cost = 10
allow_duplicates = TRUE
/datum/map_template/surface/mountains/normal/crystal2
name = "Crystal Cave 3"
desc = "A large spiral of crystals with diamonds in the center."
mappath = 'maps/expedition_vr/beach/submaps/crystal3.dmm'
cost = 15
/datum/map_template/surface/mountains/normal/lost_explorer
name = "Lost Explorer"
desc = "The remains of an explorer who rotted away ages ago, and their equipment."
mappath = 'maps/expedition_vr/beach/submaps/lost_explorer.dmm'
cost = 5
allow_duplicates = TRUE
/datum/map_template/surface/mountains/normal/Rockb1
name = "Rocky Base 1"
desc = "Someones underground hidey hole"
mappath = 'maps/expedition_vr/beach/submaps/Rockb1.dmm'
cost = 15
/datum/map_template/surface/mountains/normal/corgiritual
name = "Dark Ritual"
desc = "Who put all these plushies here? What are they doing?"
mappath = 'maps/expedition_vr/beach/submaps/ritual.dmm'
cost = 15
/datum/map_template/surface/mountains/normal/abandonedtemple
name = "Abandoned Temple"
desc = "An ancient temple, long since abandoned. Perhaps alien in origin?"
mappath = 'maps/expedition_vr/beach/submaps/temple.dmm'
cost = 20
/datum/map_template/surface/mountains/normal/digsite
name = "Dig Site"
desc = "A small abandoned dig site."
mappath = 'maps/expedition_vr/beach/submaps/digsite.dmm'
cost = 10
/datum/map_template/surface/mountains/normal/vault1
name = "Mine Vault 1"
desc = "A small vault with potential loot."
mappath = 'maps/expedition_vr/beach/submaps/vault1.dmm'
cost = 5
allow_duplicates = TRUE
template_group = "Buried Vaults"
/datum/map_template/surface/mountains/normal/vault2
name = "Mine Vault 2"
desc = "A small vault with potential loot."
mappath = 'maps/expedition_vr/beach/submaps/vault2.dmm'
cost = 5
allow_duplicates = TRUE
template_group = "Buried Vaults"
/datum/map_template/surface/mountains/normal/vault3
name = "Mine Vault 3"
desc = "A small vault with potential loot. Also a horrible suprise."
mappath = 'maps/expedition_vr/beach/submaps/vault3.dmm'
cost = 15
template_group = "Buried Vaults"
/datum/map_template/surface/mountains/normal/IceCave1A
name = "Ice Cave 1A"
desc = "This cave's slippery ice makes it hard to navigate, but determined explorers will be rewarded."
mappath = 'maps/expedition_vr/beach/submaps/IceCave1A.dmm'
cost = 10
/datum/map_template/surface/mountains/normal/IceCave1B
name = "Ice Cave 1B"
desc = "This cave's slippery ice makes it hard to navigate, but determined explorers will be rewarded."
mappath = 'maps/expedition_vr/beach/submaps/IceCave1B.dmm'
cost = 10
/datum/map_template/surface/mountains/normal/IceCave1C
name = "Ice Cave 1C"
desc = "This cave's slippery ice makes it hard to navigate, but determined explorers will be rewarded."
mappath = 'maps/expedition_vr/beach/submaps/IceCave1C.dmm'
cost = 10
/datum/map_template/surface/mountains/normal/SwordCave
name = "Cursed Sword Cave"
desc = "An underground lake. The sword on the lake's island holds a terrible secret."
mappath = 'maps/expedition_vr/beach/submaps/SwordCave.dmm'
/datum/map_template/surface/mountains/normal/supplydrop1
name = "Supply Drop 1"
desc = "A drop pod that landed deep within the mountains."
mappath = 'maps/expedition_vr/beach/submaps/SupplyDrop1.dmm'
cost = 10
allow_duplicates = TRUE
/datum/map_template/surface/mountains/normal/crashedcontainmentshuttle
name = "Crashed Cargo Shuttle"
desc = "A severely damaged military shuttle, its cargo seems to remain intact."
mappath = 'maps/expedition_vr/beach/submaps/crashedcontainmentshuttle.dmm'
cost = 30
/datum/map_template/surface/mountains/normal/deadspy
name = "Spy Remains"
desc = "W+M1 = Salt."
mappath = 'maps/expedition_vr/beach/submaps/deadspy.dmm'
cost = 15
/datum/map_template/surface/mountains/normal/geyser1
name = "Ore-Rich Geyser"
desc = "A subterranean geyser that produces steam. This one has a particularly abundant amount of materials surrounding it."
mappath = 'maps/expedition_vr/beach/submaps/Geyser1.dmm'
cost = 5
allow_duplicates = TRUE
template_group = "Underground Geysers"
/datum/map_template/surface/mountains/normal/geyser2
name = "Fenced Geyser"
desc = "A subterranean geyser that produces steam. This one has a damaged fence surrounding it."
mappath = 'maps/expedition_vr/beach/submaps/Geyser2.dmm'
cost = 5
allow_duplicates = TRUE
template_group = "Underground Geysers"
/datum/map_template/surface/mountains/normal/geyser3
name = "Magmatic Geyser"
desc = "A subterranean geyser that produces incendiary gas. It is recessed into the ground, and filled with magma. It's a relatively dormant volcano."
mappath = 'maps/expedition_vr/beach/submaps/Geyser2.dmm'
cost = 10
allow_duplicates = TRUE
template_group = "Underground Geysers"
/datum/map_template/surface/mountains/normal/cliff1
name = "Ore-Topped Cliff"
desc = "A raised area of rock created by volcanic forces."
mappath = 'maps/expedition_vr/beach/submaps/Cliff1.dmm'
cost = 5
allow_duplicates = TRUE
template_group = "Underground Cliffs"
/datum/map_template/surface/mountains/normal/deadly_rabbit // VOREStation Edit
name = "The Killer Rabbit"
desc = "A cave where the Knights of the Round have fallen to a murderous Rabbit."
mappath = 'maps/expedition_vr/beach/submaps/deadly_rabbit_vr.dmm'
cost = 5
allow_duplicates = FALSE
/**************
* Deep Caves *
**************/
/* Vorestation Removal
/datum/map_template/surface/mountains/deep/lost_explorer
name = "Lost Explorer, Deep"
desc = "The remains of an explorer who rotted away ages ago, and their equipment. Again."
mappath = 'maps/expedition_vr/beach/submaps/lost_explorer.dmm'
cost = 5
allow_duplicates = TRUE */
/datum/map_template/surface/mountains/normal/crashed_ufo //VOREStation Edit
name = "Crashed UFO"
desc = "A (formerly) flying saucer that is now embedded into the mountain, yet it still seems to be running..."
mappath = 'maps/expedition_vr/beach/submaps/crashed_ufo.dmm'
cost = 40
discard_prob = 50
/datum/map_template/surface/mountains/normal/crashed_ufo_frigate //VOREStation Edit
name = "Crashed UFO Frigate"
desc = "A (formerly) flying saucer that is now embedded into the mountain, yet the combat protocols still seem to be running..."
mappath = 'maps/expedition_vr/beach/submaps/crashed_ufo_frigate.dmm'
cost = 60
discard_prob = 50
/datum/map_template/surface/mountains/normal/Scave1 //VOREStation Edit
name = "Spider Cave 1"
desc = "A minning tunnel home to an aggressive collection of spiders."
mappath = 'maps/expedition_vr/beach/submaps/Scave1.dmm'
cost = 20
/datum/map_template/surface/mountains/normal/CaveTrench //VOREStation Edit
name = "Cave River"
desc = "A strange underground river."
mappath = 'maps/expedition_vr/beach/submaps/CaveTrench.dmm'
cost = 20
/datum/map_template/surface/mountains/normal/Cavelake //VOREStation Edit
name = "Cave Lake"
desc = "A large underground lake."
mappath = 'maps/expedition_vr/beach/submaps/Cavelake.dmm'
cost = 20
/datum/map_template/surface/mountains/normal/vault1 //VOREStation Edit
name = "Mine Vault 1"
desc = "A small vault with potential loot."
mappath = 'maps/expedition_vr/beach/submaps/vault1.dmm'
cost = 5
allow_duplicates = TRUE
template_group = "Buried Vaults"
/datum/map_template/surface/mountains/normal/vault2 //VOREStation Edit
name = "Mine Vault 2"
desc = "A small vault with potential loot."
mappath = 'maps/expedition_vr/beach/submaps/vault2.dmm'
cost = 5
allow_duplicates = TRUE
template_group = "Buried Vaults"
/datum/map_template/surface/mountains/normal/vault3 //VOREStation Edit
name = "Mine Vault 3"
desc = "A small vault with potential loot. Also a horrible suprise."
mappath = 'maps/expedition_vr/beach/submaps/vault3.dmm'
cost = 15
template_group = "Buried Vaults"
/datum/map_template/surface/mountains/normal/vault4 //VOREStation Edit
name = "Mine Vault 4"
desc = "A small xeno vault with potential loot. Also horrible suprises."
mappath = 'maps/expedition_vr/beach/submaps/vault4.dmm'
cost = 20
template_group = "Buried Vaults"
/datum/map_template/surface/mountains/normal/vault5 //VOREStation Edit
name = "Mine Vault 5"
desc = "A small xeno vault with potential loot. Also major horrible suprises."
mappath = 'maps/expedition_vr/beach/submaps/vault5.dmm'
cost = 25
template_group = "Buried Vaults"
/datum/map_template/surface/mountains/normal/vault6 //VOREStation Edit
name = "Mine Vault 6"
desc = "A small mercenary tower with potential loot."
mappath = 'maps/expedition_vr/beach/submaps/vault6.dmm'
cost = 25
template_group = "Buried Vaults"
/datum/map_template/surface/mountains/normal/BlastMine1 //VOREStation Edit
name = "Blast Mine 1"
desc = "An abandoned blast mining site, seems that local wildlife has moved in."
mappath = 'maps/expedition_vr/beach/submaps/BlastMine1.dmm'
cost = 20
/datum/map_template/surface/mountains/normal/lava_trench //VOREStation Edit
name = "lava trench"
desc = "A long stretch of lava underground, almost river-like, with a small crystal research outpost on the side."
mappath = 'maps/expedition_vr/beach/submaps/lava_trench.dmm'
cost = 20
fixed_orientation = TRUE
/datum/map_template/surface/mountains/normal/crashedmedshuttle //VOREStation Edit
name = "Crashed Med Shuttle"
desc = "A medical response shuttle that went missing some time ago. So this is where they went."
mappath = 'maps/expedition_vr/beach/submaps/CrashedMedShuttle1.dmm'
cost = 20
fixed_orientation = TRUE
/datum/map_template/surface/mountains/normal/excavation1 //VOREStation Edit
name = "Excavation Site"
desc = "An abandoned mining site."
mappath = 'maps/expedition_vr/beach/submaps/excavation1.dmm'
cost = 20
/datum/map_template/surface/mountains/deep/spatial_anomaly
name = "spatial anomaly"
desc = "A strange section of the caves that seems twist and turn in ways that shouldn't be physically possible."
mappath = 'maps/expedition_vr/beach/submaps/spatial_anomaly.dmm'
cost = 20
fixed_orientation = TRUE
/datum/map_template/surface/mountains/normal/Speakeasy //VOREStation add
name = "Speakeasy"
desc = "A hidden underground bar to serve drinks in secret and in style."
mappath = 'maps/expedition_vr/beach/submaps/speakeasy_vr.dmm'
cost = 10
allow_duplicates = FALSE

View File

@@ -2136,6 +2136,7 @@
#include "code\modules\clothing\spacesuits\rig\modules\specific\metalfoam_launcher.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun_vr.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\passive_protection.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\pat_module_vr.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\powersink.dm"
#include "code\modules\clothing\spacesuits\rig\modules\specific\rescue_pharm_vr.dm"