Merge branch 'master' into upstream-merge-12635

This commit is contained in:
Nadyr
2022-04-04 19:36:48 -04:00
committed by GitHub
159 changed files with 65896 additions and 2151 deletions

View File

@@ -62,6 +62,7 @@
#define HOLOMAP_AREACOLOR_ARRIVALS "#0000FFCC" #define HOLOMAP_AREACOLOR_ARRIVALS "#0000FFCC"
#define HOLOMAP_AREACOLOR_ESCAPE "#FF0000CC" #define HOLOMAP_AREACOLOR_ESCAPE "#FF0000CC"
#define HOLOMAP_AREACOLOR_DORMS "#CCCC0099" #define HOLOMAP_AREACOLOR_DORMS "#CCCC0099"
#define HOLOMAP_AREACOLOR_CIV "#3ea800" //VOREStation Addition
#define LIST_NUMERIC_SET(L, I, V) if(!L) { L = list(); } if (L.len < I) { L.len = I; } L[I] = V #define LIST_NUMERIC_SET(L, I, V) if(!L) { L = list(); } if (L.len < I) { L.len = I; } L[I] = V

View File

@@ -13,7 +13,7 @@
#define isitem(D) istype(D, /obj/item) #define isitem(D) istype(D, /obj/item)
#define isradio(A) istype(A, /obj/item/device/radio) #define isradio(A) istype(A, /obj/item/device/radio)
#define isairlock(A) istype(A, /obj/machinery/door/airlock) #define isairlock(A) istype(A, /obj/machinery/door/airlock)
@@ -23,6 +23,8 @@
#define ismecha(A) istype(A, /obj/mecha) #define ismecha(A) istype(A, /obj/mecha)
#define isstructure(A) istype(A, /obj/structure)
//--------------- //---------------
//#define isarea(D) istype(D, /area) //Built in //#define isarea(D) istype(D, /area) //Built in

View File

@@ -1,3 +1,6 @@
/*
* Misc
*/
/datum/crafting_recipe/cloth /datum/crafting_recipe/cloth
name = "Cloth bolt" name = "Cloth bolt"
result = /obj/item/stack/material/cloth result = /obj/item/stack/material/cloth
@@ -13,9 +16,8 @@
category = CAT_PRIMAL category = CAT_PRIMAL
/* /*
* Clothing * Primitive Clothing
*/ */
/datum/crafting_recipe/primitive_clothes /datum/crafting_recipe/primitive_clothes
name = "primitive clothes" name = "primitive clothes"
result = /obj/item/clothing/under/primitive result = /obj/item/clothing/under/primitive

View File

@@ -106,3 +106,16 @@
cost = 35 cost = 35
containertype = /obj/structure/closet/crate/aether containertype = /obj/structure/closet/crate/aether
containername = "Emergency crate" containername = "Emergency crate"
/datum/supply_pack/atmos/firefighting
name = "Firefighting equipment"
contains = list(
/obj/item/clothing/suit/fire/heavy = 2,
/obj/item/weapon/tank/oxygen/red = 2,
/obj/item/weapon/watertank/atmos = 2,
/obj/item/device/flashlight = 2,
/obj/item/clothing/head/hardhat/firefighter/atmos = 2
)
cost = 35
containertype = /obj/structure/closet/crate/aether
containername = "Firefighting crate"

View File

@@ -288,6 +288,16 @@
containername = "Riot armor crate" containername = "Riot armor crate"
access = access_armory access = access_armory
/datum/supply_pack/security/riot_sprayer
name = "Gear - Riot sprayer"
contains = list(
/obj/item/weapon/watertank/pepperspray
)
cost = 40
containertype = /obj/structure/closet/crate/secure/lawson
containername = "Riot sprayer crate"
access = access_armory
/datum/supply_pack/security/ablative_armor /datum/supply_pack/security/ablative_armor
name = "Armor - Ablative" name = "Armor - Ablative"
contains = list( contains = list(

View File

@@ -703,7 +703,7 @@
desc = "Spooky!" desc = "Spooky!"
gender = PLURAL gender = PLURAL
icon = 'icons/obj/wizard.dmi' icon = 'icons/obj/wizard.dmi'
icon_state = "ectoplasm" icon_state = "ectoplasm2"
/obj/item/weapon/research /obj/item/weapon/research
name = "research debugging device" name = "research debugging device"

View File

@@ -188,3 +188,6 @@
/area/holodeck/source_patient_ward /area/holodeck/source_patient_ward
name = "\improper Holodeck - Patient Ward" name = "\improper Holodeck - Patient Ward"
/area/holodeck/the_uwu_zone
name = "\improper Holodeck - Inside"

View File

@@ -185,6 +185,7 @@
icon_state = "cryo_rear" icon_state = "cryo_rear"
anchored = TRUE anchored = TRUE
dir = WEST dir = WEST
density = TRUE
//Cryopods themselves. //Cryopods themselves.
/obj/machinery/cryopod /obj/machinery/cryopod
@@ -522,13 +523,13 @@
control_computer.frozen_crew += "[to_despawn.real_name], [to_despawn.mind.role_alt_title] - [stationtime2text()]" control_computer.frozen_crew += "[to_despawn.real_name], [to_despawn.mind.role_alt_title] - [stationtime2text()]"
control_computer._admin_logs += "[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) at [stationtime2text()]" control_computer._admin_logs += "[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) at [stationtime2text()]"
log_and_message_admins("[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) entered cryostorage.") log_and_message_admins("[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) entered cryostorage.")
//VOREStation Edit Start //VOREStation Edit Start
var/depart_announce = TRUE var/depart_announce = TRUE
if(istype(to_despawn, /mob/living/dominated_brain)) if(istype(to_despawn, /mob/living/dominated_brain))
depart_announce = FALSE depart_announce = FALSE
if(depart_announce) if(depart_announce)
announce.autosay("[to_despawn.real_name], [to_despawn.mind.role_alt_title], [on_store_message]", "[on_store_name]", announce_channel, using_map.get_map_levels(z, TRUE, om_range = DEFAULT_OVERMAP_RANGE)) announce.autosay("[to_despawn.real_name], [to_despawn.mind.role_alt_title], [on_store_message]", "[on_store_name]", announce_channel, using_map.get_map_levels(z, TRUE, om_range = DEFAULT_OVERMAP_RANGE))
visible_message("<span class='notice'>\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2]</span>", 3) visible_message("<span class='notice'>\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2]</span>", 3)

View File

@@ -167,10 +167,43 @@
storage_slots = 6 storage_slots = 6
drop_sound = 'sound/items/drop/box.ogg' drop_sound = 'sound/items/drop/box.ogg'
use_sound = 'sound/items/storage/box.ogg' use_sound = 'sound/items/storage/box.ogg'
var/open = 0
var/open_state
var/closed_state
/obj/item/weapon/storage/box/fancy/chewables/tobacco/update_icon() /obj/item/weapon/storage/box/fancy/chewables/tobacco/nico/New()
icon_state = "[initial(icon_state)][contents.len]" if(!open_state)
open_state = "[initial(icon_state)]0"
if(!closed_state)
closed_state = "[initial(icon_state)]"
..()
/obj/item/weapon/storage/box/fancy/chewables/tobacco/nico/update_icon()
cut_overlays()
if(open)
icon_state = open_state
if(contents.len >= 1)
add_overlay("chew_nico[contents.len]")
else
icon_state = closed_state
/obj/item/weapon/storage/box/fancy/chewables/tobacco/nico/open(mob/user as mob)
if(open)
return
open = TRUE
if(contents.len == 0)
icon_state = "[initial(icon_state)]_empty"
else
update_icon()
..()
/obj/item/weapon/storage/box/fancy/chewables/tobacco/nico/close(mob/user as mob)
open = FALSE
if(contents.len == 0)
icon_state = "[initial(icon_state)]_empty"
else
update_icon()
..()
/obj/item/clothing/mask/chewable/candy /obj/item/clothing/mask/chewable/candy
name = "wad" name = "wad"

View File

@@ -1,5 +1,3 @@
//cleansed 9/15/2012 17:48
/* /*
CONTAINS: CONTAINS:
MATCHES MATCHES
@@ -473,6 +471,17 @@ CIGARETTE PACKETS ARE IN FANCY.DM
item_state = "cobpipe" item_state = "cobpipe"
chem_volume = 35 chem_volume = 35
/obj/item/clothing/mask/smokable/pipe/bonepipe
name = "Europan bone pipe"
desc = "A smoking pipe made out of the bones of the Europan bone whale."
description_fluff = "While most commonly associated with bone charms, bones from various sea creatures on Europa are used in a \
variety of goods, such as this smoking pipe. While smoking in submarines is often an uncommon occurrence, due to a lack of \
available air or space, these pipes are a common sight in the many stations of Europa. Higher-quality pipes typically have \
scenes etched into their bones, and can tell the story of their owner's time on Europa."
icon_state = "bonepipe"
item_state = "bonepipe"
chem_volume = 30
/////////////// ///////////////
//CUSTOM CIGS// //CUSTOM CIGS//
/////////////// ///////////////

View File

@@ -9,16 +9,12 @@
/obj/item/weapon/book/manual/standard_operating_procedure/New() /obj/item/weapon/book/manual/standard_operating_procedure/New()
..() ..()
dat = {" dat = {"
<html><head> <html><head>
</head> </head>
<body> <body>
<iframe width='100%' height='97%' src="[config.wikiurl]Standard_Operating_Procedure&printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe> <iframe width='100%' height='97%' src="[config.wikiurl]Standard_Operating_Procedure&printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe>
</body> </body>
</html> </html>
"} "}
/obj/item/weapon/book/manual/command_guide /obj/item/weapon/book/manual/command_guide
@@ -32,16 +28,12 @@
/obj/item/weapon/book/manual/command_guide/New() /obj/item/weapon/book/manual/command_guide/New()
..() ..()
dat = {" dat = {"
<html><head> <html><head>
</head> </head>
<body> <body>
<iframe width='100%' height='97%' src="[config.wikiurl]Chain_of_Command&printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe> <iframe width='100%' height='97%' src="[config.wikiurl]Chain_of_Command&printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe>
</body> </body>
</html> </html>
"} "}
//accurate as of 2/17/21 Extra credit to document editting and proofreading editing to Luna //accurate as of 2/17/21 Extra credit to document editting and proofreading editing to Luna
@@ -56,19 +48,19 @@
/obj/item/weapon/book/manual/cook_guide/New() /obj/item/weapon/book/manual/cook_guide/New()
..() ..()
dat = {" dat = {"
<html> <html>
<html>
<head> <head>
<style> <style>
h1 {font-size: 23px; margin: 15px 0px 5px; text-align: center;} h1 {font-size: 23px; margin: 15px 0px 5px; text-align: center;}
h2 {font-size: 20px; margin: 15px 0px 5px;} h2 {font-size: 20px; margin: 15px 0px 5px;}
h3 {font-size: 18px; margin: 15px 0px 5px;} h3 {font-size: 18px; margin: 15px 0px 5px;}
h4 {font-size: 14px; margin: 15px 0px 5px;} h4 {font-size: 14px; margin: 15px 0px 5px;}
h5 {font-size: 10px; margin: 15px 0px 5px; text-align: center;} h5 {font-size: 10px; margin: 15px 0px 5px; text-align: center;}
li {margin: 2px 0px 2px 15px;} li {margin: 2px 0px 2px 15px;}
ul {margin: 5px; padding: 0px;} ul {margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;} ol {margin: 5px; padding: 0px 15px;}
body {font-size: 13px; font-family: arial;} body {font-size: 13px; font-family: Garamond;}
</style> </style>
</head> </head>
<body> <body>
@@ -215,7 +207,6 @@
2 parts Whiskey, 1 part Space Cola 2 parts Whiskey, 1 part Space Cola
<h3>Binman Bliss:</h3> <h3>Binman Bliss:</h3>
1 part Sake, 1 part Tequila 1 part Sake, 1 part Tequila
<h1>High Alcohol</h1> <h1>High Alcohol</h1>
<h3>Elysium Facepunch:</h3> <h3>Elysium Facepunch:</h3>
1 part Kahlua, 1 part Lemon Juice 1 part Kahlua, 1 part Lemon Juice
@@ -255,7 +246,6 @@
3 Margarita, 2 Mountain Wind, 1 Emeraldine Melon Liquor 3 Margarita, 2 Mountain Wind, 1 Emeraldine Melon Liquor
<h3>Mudslide:</h3> <h3>Mudslide:</h3>
1 Black Russian, 1 Irish Cream 1 Black Russian, 1 Irish Cream
<h1>Very High Alcohol (Serve sparingly unless a patron proves they can handle a lot)</h1> <h1>Very High Alcohol (Serve sparingly unless a patron proves they can handle a lot)</h1>
<h3>Anti-Freeze:</h3> <h3>Anti-Freeze:</h3>
1 part Cream, 1 part Ice, 1 parts Vodka <b>(Feels cold but actually warms. Allergy Warning: Do not serve to Teshari or Promethians, or other heat vulnerable species, they will die if you do, if unsure do not serve)</b> 1 part Cream, 1 part Ice, 1 parts Vodka <b>(Feels cold but actually warms. Allergy Warning: Do not serve to Teshari or Promethians, or other heat vulnerable species, they will die if you do, if unsure do not serve)</b>
@@ -282,7 +272,6 @@
<h6>Good Luck figuring out the order and ratio :)</h6> <h6>Good Luck figuring out the order and ratio :)</h6>
<h3>Fire Punch:</h3> <h3>Fire Punch:</h3>
1 part Sugar, 2 part Rum <b>(Technically the strongest thing you can make, but it metabolizes slowish so it's slightly less dangerous than some others)</b> 1 part Sugar, 2 part Rum <b>(Technically the strongest thing you can make, but it metabolizes slowish so it's slightly less dangerous than some others)</b>
<h1>Non Alcoholic Drinks</h1> <h1>Non Alcoholic Drinks</h1>
<h3>Appleade:</h3> <h3>Appleade:</h3>
1 part Apple Juice, 1 part Sugar, 1 part Soda Water 1 part Apple Juice, 1 part Sugar, 1 part Soda Water
@@ -317,7 +306,6 @@
<h3>Sweet Tea:</h3> <h3>Sweet Tea:</h3>
2 parts Ice Tea, 1 part Sugar 2 parts Ice Tea, 1 part Sugar
<p><b>Note:</b> There are many more drinks you can mix, these are just ones using resources you will almost always have available, the Extranet has good websites to check found here: https://wiki.vore-station.net/Guide_to_Food_and_Drink ass well as here: https://vore-station.net/infodump/recipes_drinks.html <p><b>Note:</b> There are many more drinks you can mix, these are just ones using resources you will almost always have available, the Extranet has good websites to check found here: https://wiki.vore-station.net/Guide_to_Food_and_Drink ass well as here: https://vore-station.net/infodump/recipes_drinks.html
<h1>Part 1: The Basics</h1> <h1>Part 1: The Basics</h1>
<p>First and foremost, making drinks is about understanding measurements. Drinks are measured in units a pint is 60 units, a half pint 30, and ratios of those units can create certain drinks.</p> <p>First and foremost, making drinks is about understanding measurements. Drinks are measured in units a pint is 60 units, a half pint 30, and ratios of those units can create certain drinks.</p>
<p>The ratios of these drinks are denoted in "Parts". For example, Grog is 1 part rum and 1 part water mixed in a container that holds liquid. This means 1 unit of Rum and 1 unit of Water can make Grog, as can 30 units of Rum and 30 units of Water. Ratios aren't picky, if you have 5 units of Rum and 10 of Water in a glass, it will turn as much as possible into Grog, and the rest will remain as water (In this case, 10 units of Grog and 5 units of Water will be in the glass). When mixing drinks, you may accidentally have extra of an ingredient such as in the previous example, but this can easily be rectified by placing the drink in one of the Dispensers, and using the interface at the bottom to remove however many units you put extra, so don't worry about sloppiness as long as you clean up your mistakes!</p> <p>The ratios of these drinks are denoted in "Parts". For example, Grog is 1 part rum and 1 part water mixed in a container that holds liquid. This means 1 unit of Rum and 1 unit of Water can make Grog, as can 30 units of Rum and 30 units of Water. Ratios aren't picky, if you have 5 units of Rum and 10 of Water in a glass, it will turn as much as possible into Grog, and the rest will remain as water (In this case, 10 units of Grog and 5 units of Water will be in the glass). When mixing drinks, you may accidentally have extra of an ingredient such as in the previous example, but this can easily be rectified by placing the drink in one of the Dispensers, and using the interface at the bottom to remove however many units you put extra, so don't worry about sloppiness as long as you clean up your mistakes!</p>
@@ -341,9 +329,6 @@
<h2>Part 3: Closing Remarks</h2> <h2>Part 3: Closing Remarks</h2>
<p>This all may seem daunting at a glance; so many recipes to learn, and a "lot" to keep in mind. But really it's not - tending the Bar is mostly about going with the flow of things and providing a good times, and drinks just provide liquid courage to make a good time easier. Take a deep breath if you ever feel overwhelmed, and handle one order at a time. You can do it! Don't feel the need to know every recipe, just learn your favorites and go from there; the rest is here or online if someone asks for it! If somebody asks you to give them anything without a specific request, don't panic: evalulate their likes and tolerance level, and try your best to give them something nice!</p> <p>This all may seem daunting at a glance; so many recipes to learn, and a "lot" to keep in mind. But really it's not - tending the Bar is mostly about going with the flow of things and providing a good times, and drinks just provide liquid courage to make a good time easier. Take a deep breath if you ever feel overwhelmed, and handle one order at a time. You can do it! Don't feel the need to know every recipe, just learn your favorites and go from there; the rest is here or online if someone asks for it! If somebody asks you to give them anything without a specific request, don't panic: evalulate their likes and tolerance level, and try your best to give them something nice!</p>
</body> </body>
<<<<<<< HEAD
</html> "}
=======
</html> "} </html> "}
/obj/item/weapon/book/manual/rotary_electric_generator /obj/item/weapon/book/manual/rotary_electric_generator
@@ -368,33 +353,24 @@
</style> </style>
</head> </head>
<body> <body>
Technical Order (TO) 1-33-34-2 <br> Technical Order (TO) 1-33-34-2 <br>
<h1>Operator's Manual - Rotary Electric Generator, D-Type</h1><br><br> <h1>Operator's Manual - Rotary Electric Generator, D-Type</h1><br><br>
Supporting Data: <br> Supporting Data: <br>
- TO 1-33-34-4-1 Illustrated Parts Breakdown - Rotary Electric Generator, D-Type <br> - TO 1-33-34-4-1 Illustrated Parts Breakdown - Rotary Electric Generator, D-Type <br>
- TO 1-33-34-6 Inspection Work Cards - Rotary Electric Generator, D-Type <br><br> - TO 1-33-34-6 Inspection Work Cards - Rotary Electric Generator, D-Type <br><br>
Support Equipment: <br> Support Equipment: <br>
- Torque Wrench, 100-80,000 inch-pounds <br> - Torque Wrench, 100-80,000 inch-pounds <br>
- Composite Tool Kit, Standard <br> - Composite Tool Kit, Standard <br>
- Multitool with Lead Kit, Wire Kit <br> <br> - Multitool with Lead Kit, Wire Kit <br> <br>
Required Supplies: <br> Required Supplies: <br>
- stainless steel, 10,000cm3 <br> - stainless steel, 10,000cm3 <br>
- lubrication, petrolatum, 6000ml <br> - lubrication, petrolatum, 6000ml <br>
- electrical wiring, 5m <br> - electrical wiring, 5m <br>
- component set, capacitors (any grade) <br> - component set, capacitors (any grade) <br>
- circuitry board, REG <br> <br> - circuitry board, REG <br> <br>
<h1>SETUP AND OPERATING PROCEDURES</h1> <br> <br> <h1>SETUP AND OPERATING PROCEDURES</h1> <br> <br>
Setup: <br> <br> Setup: <br> <br>
CAUTION: Do not remove too much air from the work space or personnel may be exposed to hypoxia or similar effects. <br> <br> CAUTION: Do not remove too much air from the work space or personnel may be exposed to hypoxia or similar effects. <br> <br>
1. Prepare setup area. Remove machinery, debris, foreign objects, people, and extra air. <br> <br> 1. Prepare setup area. Remove machinery, debris, foreign objects, people, and extra air. <br> <br>
2. Lay out preliminary electrical wiring. <br> 2. Lay out preliminary electrical wiring. <br>
@@ -418,9 +394,7 @@
9. Wait for assembly to finish inflating, and the unit is ready for service. <br> <br> 9. Wait for assembly to finish inflating, and the unit is ready for service. <br> <br>
Operating Procedures: <br> <br> Operating Procedures: <br> <br>
NOTE: Operation of REG-D type generators requires significant physical effort. Ensure users are provided adequare nutrition and hydration throughout the working period. <br> <br> NOTE: Operation of REG-D type generators requires significant physical effort. Ensure users are provided adequare nutrition and hydration throughout the working period. <br> <br>
1. Designate the individual who will be operating the REG-D. <br> <br> 1. Designate the individual who will be operating the REG-D. <br> <br>
@@ -428,7 +402,6 @@
2. Provide a safety briefing regarding nutritional preparedness and physical ability. <br> <br> 2. Provide a safety briefing regarding nutritional preparedness and physical ability. <br> <br>
NOTE: Stretching is highly recommended before and after any operation session. <br> <br> NOTE: Stretching is highly recommended before and after any operation session. <br> <br>
3. Operator shall board the REG-D track body and ensure there are no unsecured objects on the path. <br> <br> 3. Operator shall board the REG-D track body and ensure there are no unsecured objects on the path. <br> <br>
4. Once ready, Operator may begin running at own pace. Do not sprint. Maintain an even pace and proper running form for optimal energy generation. <br> <br> 4. Once ready, Operator may begin running at own pace. Do not sprint. Maintain an even pace and proper running form for optimal energy generation. <br> <br>
@@ -436,10 +409,7 @@
5. Continue to run on the REG-D track body until sufficient energy is stored in systems or Operator is no longer able or willing to continue. <br> <br> 5. Continue to run on the REG-D track body until sufficient energy is stored in systems or Operator is no longer able or willing to continue. <br> <br>
6. To end a session, carefully lower forward running speed until the track body comes to a complete stop, then disembark the REG-D. <br> <br> 6. To end a session, carefully lower forward running speed until the track body comes to a complete stop, then disembark the REG-D. <br> <br>
REFER TO TO 1-33-34-6 FOR MAINTENANCE AND INSPECTION PROCEDURES REFER TO TO 1-33-34-6 FOR MAINTENANCE AND INSPECTION PROCEDURES
</body> </body>
</html> </html>
"} "}
>>>>>>> c10812a251... Merge pull request #12635 from Very-Soft/gbtweaks

View File

@@ -1,8 +1,11 @@
GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/weapon/mop) GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/weapon/mop)
/*
* Mop
*/
/obj/item/weapon/mop /obj/item/weapon/mop
desc = "The world of janitalia wouldn't be complete without a mop."
name = "mop" name = "mop"
desc = "The world of janitalia wouldn't be complete without a mop."
icon = 'icons/obj/janitor.dmi' icon = 'icons/obj/janitor.dmi'
icon_state = "mop" icon_state = "mop"
force = 3.0 force = 3.0
@@ -39,3 +42,38 @@ GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/weapon/mop)
if(istype(I, /obj/item/weapon/mop) || istype(I, /obj/item/weapon/soap)) if(istype(I, /obj/item/weapon/mop) || istype(I, /obj/item/weapon/soap))
return return
..() ..()
/*
* Advanced Mop
*/
/obj/item/weapon/mop/advanced
name = "advanced mop"
desc = "No stain will go unclean."
icon = 'icons/obj/janitor.dmi'
icon_state = "adv_mop"
force = 3.5
throwforce = 10.5
throw_speed = 4
throw_range = 10
w_class = ITEMSIZE_NORMAL
flags = NOCONDUCT
attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
/obj/item/weapon/mop/advanced/New()
create_reagents(30)
..()
/obj/item/weapon/mop/advanced/afterattack(atom/A, mob/user, proximity)
if(!proximity) return
if(istype(A, /turf) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay) || istype(A, /obj/effect/rune))
if(reagents.total_volume < 1)
to_chat(user, "<span class='notice'>Your mop is dry!</span>")
return
user.visible_message("<span class='warning'>[user] begins to clean \the [get_turf(A)].</span>")
if(do_after(user, 20))
var/turf/T = get_turf(A)
if(T)
T.clean(src, user)
to_chat(user, "<span class='notice'>You have finished mopping!</span>")

View File

@@ -2,7 +2,7 @@
sprite_sheets = list( sprite_sheets = list(
SPECIES_TESHARI = 'icons/inventory/belt/mob_teshari.dmi', SPECIES_TESHARI = 'icons/inventory/belt/mob_teshari.dmi',
SPECIES_WEREBEAST = 'icons/inventory/belt/mob_vr_werebeast.dmi') SPECIES_WEREBEAST = 'icons/inventory/belt/mob_vr_werebeast.dmi')
/obj/item/weapon/storage/belt/explorer /obj/item/weapon/storage/belt/explorer
name = "explorer's belt" name = "explorer's belt"
desc = "A versatile belt with several pouches. It can hold a very wide variety of items, but less items overall than a dedicated belt. Still, it's useful for any explorer who wants to be prepared for anything they might find." desc = "A versatile belt with several pouches. It can hold a very wide variety of items, but less items overall than a dedicated belt. Still, it's useful for any explorer who wants to be prepared for anything they might find."
@@ -51,7 +51,7 @@
/obj/item/device/mapping_unit, /obj/item/device/mapping_unit,
/obj/item/weapon/kinetic_crusher /obj/item/weapon/kinetic_crusher
) )
/obj/item/weapon/storage/belt/explorer/pathfinder /obj/item/weapon/storage/belt/explorer/pathfinder
name = "pathfinder's belt" name = "pathfinder's belt"
desc = "A deluxe belt with many pouches. It can hold a very wide variety of items, but less items overall than a dedicated belt. Still, it's useful for any explorer who wants to be prepared for anything they might find." desc = "A deluxe belt with many pouches. It can hold a very wide variety of items, but less items overall than a dedicated belt. Still, it's useful for any explorer who wants to be prepared for anything they might find."
@@ -60,3 +60,46 @@
item_state = "explorer_belt" item_state = "explorer_belt"
storage_slots = 7 //two more, bringing it on par with normal belts storage_slots = 7 //two more, bringing it on par with normal belts
max_storage_space = ITEMSIZE_COST_NORMAL * 7 max_storage_space = ITEMSIZE_COST_NORMAL * 7
/obj/item/weapon/storage/belt/miner
name = "mining belt"
desc = "A versatile and durable looking belt with several pouches and straps. It can hold a very wide variety of items that any typical miner might need out in the deep."
icon = 'icons/inventory/belt/item_vr.dmi'
icon_state = "mining"
item_state = "mining"
storage_slots = 6
max_w_class = ITEMSIZE_LARGE
max_storage_space = ITEMSIZE_COST_NORMAL * 6
can_hold = list(
/obj/item/weapon/storage/box/samplebags,
/obj/item/device/core_sampler,
/obj/item/device/beacon_locator,
/obj/item/device/radio/beacon,
/obj/item/device/measuring_tape,
/obj/item/device/flashlight,
/obj/item/weapon/cell/device,
/obj/item/weapon/pickaxe,
/obj/item/weapon/shovel,
/obj/item/device/depth_scanner,
/obj/item/device/camera,
/obj/item/weapon/paper,
/obj/item/weapon/photo,
/obj/item/weapon/folder,
/obj/item/weapon/pen,
/obj/item/weapon/folder,
/obj/item/weapon/clipboard,
/obj/item/weapon/anodevice,
/obj/item/clothing/glasses,
/obj/item/weapon/tool/wrench,
/obj/item/weapon/storage/excavation,
/obj/item/weapon/anobattery,
/obj/item/device/ano_scanner,
/obj/item/weapon/pickaxe/hand,
/obj/item/device/xenoarch_multi_tool,
/obj/item/weapon/pickaxe/excavationdrill,
/obj/item/device/geiger,
/obj/item/device/gps,
/obj/item/stack/marker_beacon,
/obj/item/stack/flag,
/obj/item/weapon/melee
)

View File

@@ -115,6 +115,18 @@
icon_state = "sterile" icon_state = "sterile"
starts_with = list(/obj/item/clothing/mask/surgical = 7) starts_with = list(/obj/item/clothing/mask/surgical = 7)
/obj/item/weapon/storage/box/masks/white
name = "box of sterile masks"
desc = "This box contains masks of sterility."
icon_state = "sterile"
starts_with = list(/obj/item/clothing/mask/surgical/white = 7)
/obj/item/weapon/storage/box/masks/dust
name = "box of dust masks"
desc = "This box contains dust masks. Breathe easy."
icon_state = "sterile"
starts_with = list(/obj/item/clothing/mask/surgical/dust = 7)
/obj/item/weapon/storage/box/syringes /obj/item/weapon/storage/box/syringes
name = "box of syringes" name = "box of syringes"
desc = "A box full of syringes." desc = "A box full of syringes."

View File

@@ -9,7 +9,10 @@
* Egg Box * Egg Box
* Candle Box * Candle Box
* Crayon Box * Crayon Box
* Cigarette Box * Cracker Pack
* Cigarette Pack
* Cigar Box
* Extra Tobacco Bits
* Vial Box * Vial Box
* Box of Chocolates * Box of Chocolates
*/ */
@@ -21,6 +24,9 @@
var/icon_type = "donut" var/icon_type = "donut"
drop_sound = 'sound/items/drop/cardboardbox.ogg' drop_sound = 'sound/items/drop/cardboardbox.ogg'
pickup_sound = 'sound/items/pickup/cardboardbox.ogg' pickup_sound = 'sound/items/pickup/cardboardbox.ogg'
var/open = 0
var/open_state
var/closed_state
/obj/item/weapon/storage/fancy/update_icon(var/itemremoved = 0) /obj/item/weapon/storage/fancy/update_icon(var/itemremoved = 0)
var/total_contents = contents.len - itemremoved var/total_contents = contents.len - itemremoved
@@ -41,7 +47,6 @@
/* /*
* Egg Box * Egg Box
*/ */
/obj/item/weapon/storage/fancy/egg_box /obj/item/weapon/storage/fancy/egg_box
icon = 'icons/obj/food.dmi' icon = 'icons/obj/food.dmi'
icon_state = "eggbox" icon_state = "eggbox"
@@ -55,10 +60,37 @@
) )
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/egg = 12) starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/egg = 12)
/obj/item/weapon/storage/fancy/egg_box/New()
if(!open_state)
open_state = "[initial(icon_state)]0"
if(!closed_state)
closed_state = "[initial(icon_state)]"
..()
/obj/item/weapon/storage/fancy/egg_box/update_icon()
cut_overlays()
if(open)
icon_state = open_state
if(contents.len >= 1)
add_overlay("eggbox[contents.len]")
else
icon_state = closed_state
/obj/item/weapon/storage/fancy/egg_box/open(mob/user as mob)
if(open)
return
open = TRUE
update_icon()
..()
/obj/item/weapon/storage/fancy/egg_box/close(mob/user as mob)
open = FALSE
update_icon()
..()
/* /*
* Candle Boxes * Candle Boxes
*/ */
/obj/item/weapon/storage/fancy/candle_box /obj/item/weapon/storage/fancy/candle_box
name = "red candle pack" name = "red candle pack"
desc = "A pack of red candles." desc = "A pack of red candles."
@@ -102,7 +134,6 @@
/* /*
* Crayon Box * Crayon Box
*/ */
/obj/item/weapon/storage/fancy/crayons /obj/item/weapon/storage/fancy/crayons
name = "box of crayons" name = "box of crayons"
desc = "A box of crayons for all your rune drawing needs." desc = "A box of crayons for all your rune drawing needs."
@@ -187,9 +218,8 @@
..() ..()
/* /*
* Cracker Packet * Cracker Pack
*/ */
/obj/item/weapon/storage/fancy/crackers /obj/item/weapon/storage/fancy/crackers
name = "\improper Getmore Crackers" name = "\improper Getmore Crackers"
icon = 'icons/obj/food.dmi' icon = 'icons/obj/food.dmi'
@@ -201,9 +231,9 @@
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/cracker) can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/cracker)
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/cracker = 6) starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/cracker = 6)
//////////// /*
//CIG PACK// * Cigarette Pack
//////////// */
/obj/item/weapon/storage/fancy/cigarettes /obj/item/weapon/storage/fancy/cigarettes
name = "\improper pack of Trans-Stellar Duty-frees" name = "\improper pack of Trans-Stellar Duty-frees"
desc = "A ubiquitous brand of cigarettes, found in every major spacefaring corporation in the universe. As mild and flavorless as it gets." desc = "A ubiquitous brand of cigarettes, found in every major spacefaring corporation in the universe. As mild and flavorless as it gets."
@@ -230,9 +260,39 @@
C.brand = brand C.brand = brand
C.desc += " This one is \a [brand]." C.desc += " This one is \a [brand]."
/obj/item/weapon/storage/fancy/cigarettes/New()
if(!open_state)
open_state = "[initial(icon_state)]_open"
if(!closed_state)
closed_state = "[initial(icon_state)]"
..()
/obj/item/weapon/storage/fancy/cigarettes/update_icon() /obj/item/weapon/storage/fancy/cigarettes/update_icon()
icon_state = "[initial(icon_state)][contents.len]" cut_overlays()
return if(open)
icon_state = open_state
if(contents.len >= 1)
add_overlay("cig[contents.len]")
else
icon_state = closed_state
/obj/item/weapon/storage/fancy/cigarettes/open(mob/user as mob)
if(open)
return
open = TRUE
if(contents.len == 0)
icon_state = "[initial(icon_state)]_empty"
else
update_icon()
..()
/obj/item/weapon/storage/fancy/cigarettes/close(mob/user as mob)
open = FALSE
if(contents.len == 0)
icon_state = "[initial(icon_state)]_empty"
else
update_icon()
..()
/obj/item/weapon/storage/fancy/cigarettes/remove_from_storage(obj/item/W as obj, atom/new_location) /obj/item/weapon/storage/fancy/cigarettes/remove_from_storage(obj/item/W as obj, atom/new_location)
// Don't try to transfer reagents to lighters // Don't try to transfer reagents to lighters
@@ -283,8 +343,6 @@
icon_state = "Apacket" icon_state = "Apacket"
brand = "\improper Acme Co. cigarette" brand = "\improper Acme Co. cigarette"
// New exciting ways to kill your lungs! - Earthcrusher //
/obj/item/weapon/storage/fancy/cigarettes/luckystars /obj/item/weapon/storage/fancy/cigarettes/luckystars
name = "\improper pack of Lucky Stars" name = "\improper pack of Lucky Stars"
desc = "A mellow blend made from synthetic, pod-grown tobacco. The commercial jingle is guaranteed to get stuck in your head." desc = "A mellow blend made from synthetic, pod-grown tobacco. The commercial jingle is guaranteed to get stuck in your head."
@@ -319,6 +377,9 @@
icon_state = "P100packet" icon_state = "P100packet"
brand = "\improper Professional 120" brand = "\improper Professional 120"
/*
* Cigar Box
*/
/obj/item/weapon/storage/fancy/cigar /obj/item/weapon/storage/fancy/cigar
name = "cigar case" name = "cigar case"
desc = "A case for holding your cigars when you are not smoking them." desc = "A case for holding your cigars when you are not smoking them."
@@ -331,23 +392,50 @@
storage_slots = 7 storage_slots = 7
can_hold = list(/obj/item/clothing/mask/smokable/cigarette/cigar, /obj/item/trash/cigbutt/cigarbutt) can_hold = list(/obj/item/clothing/mask/smokable/cigarette/cigar, /obj/item/trash/cigbutt/cigarbutt)
icon_type = "cigar" icon_type = "cigar"
starts_with = list(/obj/item/clothing/mask/smokable/cigarette/cigar = 7) starts_with = list(/obj/item/clothing/mask/smokable/cigarette/cigar = 8)
/obj/item/weapon/storage/fancy/cigar/Initialize() /obj/item/weapon/storage/fancy/cigar/Initialize()
. = ..() . = ..()
flags |= NOREACT flags |= NOREACT
create_reagents(15 * storage_slots) create_reagents(15 * storage_slots)
/obj/item/weapon/storage/fancy/cigar/update_icon()
icon_state = "[initial(icon_state)][contents.len]"
return
/obj/item/weapon/storage/fancy/cigar/remove_from_storage(obj/item/W as obj, atom/new_location) /obj/item/weapon/storage/fancy/cigar/remove_from_storage(obj/item/W as obj, atom/new_location)
var/obj/item/clothing/mask/smokable/cigarette/cigar/C = W var/obj/item/clothing/mask/smokable/cigarette/cigar/C = W
if(!istype(C)) return if(!istype(C)) return
reagents.trans_to_obj(C, (reagents.total_volume/contents.len)) reagents.trans_to_obj(C, (reagents.total_volume/contents.len))
return ..() return ..()
/obj/item/weapon/storage/fancy/cigar/New()
if(!open_state)
open_state = "[initial(icon_state)]0"
if(!closed_state)
closed_state = "[initial(icon_state)]"
..()
/obj/item/weapon/storage/fancy/cigar/update_icon()
cut_overlays()
if(open)
icon_state = open_state
if(contents.len >= 1)
add_overlay("cigarcase[contents.len]")
else
icon_state = closed_state
/obj/item/weapon/storage/fancy/cigar/open(mob/user as mob)
if(open)
return
open = TRUE
update_icon()
..()
/obj/item/weapon/storage/fancy/cigar/close(mob/user as mob)
open = FALSE
update_icon()
..()
/*
* Tobacco Bits
*/
/obj/item/weapon/storage/rollingpapers /obj/item/weapon/storage/rollingpapers
name = "rolling paper pack" name = "rolling paper pack"
desc = "A small cardboard pack containing several folded rolling papers." desc = "A small cardboard pack containing several folded rolling papers."
@@ -371,7 +459,6 @@
/* /*
* Vial Box * Vial Box
*/ */
/obj/item/weapon/storage/fancy/vials /obj/item/weapon/storage/fancy/vials
icon = 'icons/obj/vialbox.dmi' icon = 'icons/obj/vialbox.dmi'
icon_state = "vialbox6" icon_state = "vialbox6"
@@ -414,9 +501,8 @@
update_icon() update_icon()
/* /*
* Box of Chocolates/Heart Box * Box of Chocolates
*/ */
/obj/item/weapon/storage/fancy/heartbox /obj/item/weapon/storage/fancy/heartbox
icon_state = "heartbox" icon_state = "heartbox"
name = "box of chocolates" name = "box of chocolates"

View File

@@ -59,7 +59,7 @@ var/list/random_useful_
if(prob(70)) // Misc. junk if(prob(70)) // Misc. junk
if(!random_junk_) if(!random_junk_)
random_junk_ = subtypesof(/obj/item/trash) random_junk_ = subtypesof(/obj/item/trash)
random_junk_ += /obj/effect/decal/cleanable/spiderling_remains random_junk_ += /obj/effect/decal/cleanable/bug_remains
random_junk_ += /obj/effect/decal/remains/mouse random_junk_ += /obj/effect/decal/remains/mouse
random_junk_ += /obj/effect/decal/remains/robot random_junk_ += /obj/effect/decal/remains/robot
random_junk_ += /obj/item/weapon/paper/crumpled random_junk_ += /obj/item/weapon/paper/crumpled

View File

@@ -287,6 +287,7 @@ something, make sure it's not in one of the other lists.*/
return pick(prob(320);/obj/random/maintenance/clean, return pick(prob(320);/obj/random/maintenance/clean,
prob(3);/obj/item/device/flashlight/lantern, prob(3);/obj/item/device/flashlight/lantern,
prob(4);/obj/item/weapon/pickaxe, prob(4);/obj/item/weapon/pickaxe,
prob(3);/obj/item/weapon/pickaxe/drill,
prob(5);/obj/item/weapon/storage/backpack/industrial, prob(5);/obj/item/weapon/storage/backpack/industrial,
prob(5);/obj/item/weapon/storage/backpack/satchel/norm, prob(5);/obj/item/weapon/storage/backpack/satchel/norm,
prob(3);/obj/item/weapon/storage/backpack/dufflebag, prob(3);/obj/item/weapon/storage/backpack/dufflebag,

View File

@@ -24,7 +24,7 @@
/obj/effect/decal/cleanable/blood/gibs/robot, /obj/effect/decal/cleanable/blood/gibs/robot,
/obj/effect/decal/cleanable/blood/oil, /obj/effect/decal/cleanable/blood/oil,
/obj/effect/decal/cleanable/blood/oil/streak, /obj/effect/decal/cleanable/blood/oil/streak,
/obj/effect/decal/cleanable/spiderling_remains, /obj/effect/decal/cleanable/bug_remains,
/obj/effect/decal/remains/mouse, /obj/effect/decal/remains/mouse,
/obj/effect/decal/cleanable/vomit, /obj/effect/decal/cleanable/vomit,
/obj/effect/decal/cleanable/blood/splatter, /obj/effect/decal/cleanable/blood/splatter,
@@ -207,6 +207,12 @@
/obj/item/weapon/flame/lighter/zippo, /obj/item/weapon/flame/lighter/zippo,
/obj/structure/closet/crate/hydroponics /obj/structure/closet/crate/hydroponics
), ),
prob(5);list(
/obj/item/weapon/pickaxe,
/obj/item/clothing/under/rank/miner,
/obj/item/clothing/head/hardhat,
/obj/structure/closet/crate/engineering
),
prob(5);list( prob(5);list(
/obj/item/weapon/pickaxe/drill, /obj/item/weapon/pickaxe/drill,
/obj/item/clothing/suit/space/void/mining, /obj/item/clothing/suit/space/void/mining,
@@ -214,7 +220,7 @@
/obj/structure/closet/crate/engineering /obj/structure/closet/crate/engineering
), ),
prob(5);list( prob(5);list(
/obj/item/weapon/pickaxe/drill, /obj/item/weapon/pickaxe/advdrill,
/obj/item/clothing/suit/space/void/mining/alt, /obj/item/clothing/suit/space/void/mining/alt,
/obj/item/clothing/head/helmet/space/void/mining/alt, /obj/item/clothing/head/helmet/space/void/mining/alt,
/obj/structure/closet/crate/engineering /obj/structure/closet/crate/engineering
@@ -249,7 +255,7 @@
/obj/structure/closet/crate/engineering /obj/structure/closet/crate/engineering
), ),
prob(5);list( prob(5);list(
/obj/item/weapon/pickaxe/drill, /obj/item/weapon/pickaxe,
/obj/item/clothing/glasses/material, /obj/item/clothing/glasses/material,
/obj/structure/ore_box, /obj/structure/ore_box,
/obj/structure/closet/crate /obj/structure/closet/crate
@@ -368,7 +374,7 @@
/obj/structure/closet/crate/engineering /obj/structure/closet/crate/engineering
), ),
prob(2);list( prob(2);list(
/obj/item/weapon/pickaxe/drill, /obj/item/weapon/pickaxe/advdrill,
/obj/item/weapon/storage/bag/ore, /obj/item/weapon/storage/bag/ore,
/obj/item/clothing/glasses/material, /obj/item/clothing/glasses/material,
/obj/structure/closet/crate/engineering /obj/structure/closet/crate/engineering
@@ -1485,6 +1491,7 @@
return pick( return pick(
prob(10);list(/obj/item/weapon/pickaxe/silver), prob(10);list(/obj/item/weapon/pickaxe/silver),
prob(8);list(/obj/item/weapon/pickaxe/drill), prob(8);list(/obj/item/weapon/pickaxe/drill),
prob(6);list(/obj/item/weapon/pickaxe/advdrill),
prob(6);list(/obj/item/weapon/pickaxe/jackhammer), prob(6);list(/obj/item/weapon/pickaxe/jackhammer),
prob(5);list(/obj/item/weapon/pickaxe/gold), prob(5);list(/obj/item/weapon/pickaxe/gold),
prob(4);list(/obj/item/weapon/pickaxe/plasmacutter), prob(4);list(/obj/item/weapon/pickaxe/plasmacutter),

View File

@@ -771,7 +771,7 @@
/obj/random/mouseremains/item_to_spawn() /obj/random/mouseremains/item_to_spawn()
return pick(/obj/item/device/assembly/mousetrap, return pick(/obj/item/device/assembly/mousetrap,
/obj/item/device/assembly/mousetrap/armed, /obj/item/device/assembly/mousetrap/armed,
/obj/effect/decal/cleanable/spiderling_remains, /obj/effect/decal/cleanable/bug_remains,
/obj/effect/decal/cleanable/ash, /obj/effect/decal/cleanable/ash,
/obj/item/trash/cigbutt, /obj/item/trash/cigbutt,
/obj/item/trash/cigbutt/cigarbutt, /obj/item/trash/cigbutt/cigarbutt,

View File

@@ -8,10 +8,10 @@
w_class = ITEMSIZE_HUGE w_class = ITEMSIZE_HUGE
layer = UNDER_JUNK_LAYER layer = UNDER_JUNK_LAYER
blocks_emissive = EMISSIVE_BLOCK_GENERIC blocks_emissive = EMISSIVE_BLOCK_GENERIC
var/opened = 0 var/opened = 0
var/sealed = 0 var/sealed = 0
var/seal_tool = /obj/item/weapon/weldingtool //Tool used to seal the closet, defaults to welder var/seal_tool = /obj/item/weapon/weldingtool //Tool used to seal the closet, defaults to welder
var/wall_mounted = 0 //never solid (You can always pass over it) var/wall_mounted = 0 //never solid (You can always pass over it)
var/health = 100 var/health = 100
@@ -24,8 +24,8 @@
//then open it in a populated area to crash clients. //then open it in a populated area to crash clients.
var/storage_cost = 40 //How much space this closet takes up if it's stuffed in another closet var/storage_cost = 40 //How much space this closet takes up if it's stuffed in another closet
var/open_sound = 'sound/machines/click.ogg' var/open_sound = 'sound/effects/closet_open.ogg'
var/close_sound = 'sound/machines/click.ogg' var/close_sound = 'sound/effects/closet_close.ogg'
var/store_misc = 1 //Chameleon item check var/store_misc = 1 //Chameleon item check
var/store_items = 1 //Will the closet store items? var/store_items = 1 //Will the closet store items?
@@ -141,7 +141,7 @@
dump_contents() dump_contents()
opened = 1 opened = 1
playsound(src, open_sound, 15, 1, -3) playsound(src, open_sound, 50, 1, -3)
if(initial(density)) if(initial(density))
density = !density density = !density
animate_door() animate_door()
@@ -166,7 +166,7 @@
opened = 0 opened = 0
playsound(src, close_sound, 15, 1, -3) playsound(src, close_sound, 50, 1, -3)
if(initial(density)) if(initial(density))
density = !density density = !density
animate_door(TRUE) animate_door(TRUE)

View File

@@ -2,7 +2,7 @@
name = "coffin" name = "coffin"
desc = "It's a burial receptacle for the dearly departed." desc = "It's a burial receptacle for the dearly departed."
icon = 'icons/obj/closets/coffin.dmi' icon = 'icons/obj/closets/coffin.dmi'
icon_state = "closed_unlocked" icon_state = "closed_unlocked"
seal_tool = /obj/item/weapon/tool/screwdriver seal_tool = /obj/item/weapon/tool/screwdriver
breakout_sound = 'sound/weapons/tablehit1.ogg' breakout_sound = 'sound/weapons/tablehit1.ogg'
@@ -20,6 +20,8 @@
max_closets = 1 max_closets = 1
opened = 1 opened = 1
closet_appearance = null // Special icon for us closet_appearance = null // Special icon for us
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
/obj/structure/closet/grave/attack_hand(mob/user as mob) /obj/structure/closet/grave/attack_hand(mob/user as mob)
if(opened) if(opened)

View File

@@ -4,11 +4,17 @@
icon = 'icons/obj/closets/bases/cabinet.dmi' icon = 'icons/obj/closets/bases/cabinet.dmi'
closet_appearance = /decl/closet_appearance/cabinet closet_appearance = /decl/closet_appearance/cabinet
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
/obj/structure/closet/acloset /obj/structure/closet/acloset
name = "strange closet" name = "strange closet"
desc = "It looks alien!" desc = "It looks alien!"
closet_appearance = /decl/closet_appearance/alien closet_appearance = /decl/closet_appearance/alien
open_sound = 'sound/machines/click.ogg'
close_sound = 'sound/machines/click.ogg'
/obj/structure/closet/gimmick /obj/structure/closet/gimmick
name = "administrative supply closet" name = "administrative supply closet"
desc = "It's a storage unit for things that have no right being here." desc = "It's a storage unit for things that have no right being here."

View File

@@ -243,6 +243,8 @@
desc = "It's wall-mounted storage unit for an AutoLok suit." desc = "It's wall-mounted storage unit for an AutoLok suit."
icon = 'icons/obj/closets/bases/wall_double.dmi' icon = 'icons/obj/closets/bases/wall_double.dmi'
closet_appearance = /decl/closet_appearance/wall_double/autolok closet_appearance = /decl/closet_appearance/wall_double/autolok
open_sound = 'sound/machines/click.ogg'
close_sound = 'sound/machines/click.ogg'
anchored = TRUE anchored = TRUE
density = FALSE density = FALSE
wall_mounted = 1 wall_mounted = 1
@@ -262,6 +264,8 @@
desc = "It's wall-mounted storage unit for an emergency suit." desc = "It's wall-mounted storage unit for an emergency suit."
icon = 'icons/obj/closets/bases/wall.dmi' icon = 'icons/obj/closets/bases/wall.dmi'
closet_appearance = /decl/closet_appearance/wall/emergency closet_appearance = /decl/closet_appearance/wall/emergency
open_sound = 'sound/machines/click.ogg'
close_sound = 'sound/machines/click.ogg'
anchored = TRUE anchored = TRUE
density = FALSE density = FALSE
wall_mounted = 1 wall_mounted = 1

View File

@@ -71,9 +71,10 @@
/obj/item/clothing/shoes/black, /obj/item/clothing/shoes/black,
/obj/item/device/analyzer, /obj/item/device/analyzer,
/obj/item/weapon/storage/bag/ore, /obj/item/weapon/storage/bag/ore,
/obj/item/weapon/storage/belt/miner,
/obj/item/device/flashlight/lantern, /obj/item/device/flashlight/lantern,
/obj/item/weapon/shovel, /obj/item/weapon/shovel,
/obj/item/weapon/pickaxe, /obj/item/weapon/pickaxe/drill,
/obj/item/clothing/glasses/material, /obj/item/clothing/glasses/material,
/obj/item/clothing/suit/storage/hooded/wintercoat/miner, /obj/item/clothing/suit/storage/hooded/wintercoat/miner,
/obj/item/clothing/shoes/boots/winter/mining, /obj/item/clothing/shoes/boots/winter/mining,

View File

@@ -8,6 +8,9 @@
/obj/item/weapon/reagent_containers/food/condiment/spacespice = 2 /obj/item/weapon/reagent_containers/food/condiment/spacespice = 2
) )
open_sound = 'sound/machines/click.ogg'
close_sound = 'sound/machines/click.ogg'
/obj/structure/closet/secure_closet/freezer/kitchen/mining /obj/structure/closet/secure_closet/freezer/kitchen/mining
req_access = list() req_access = list()

View File

@@ -210,6 +210,9 @@
req_access = list(access_psychiatrist) req_access = list(access_psychiatrist)
closet_appearance = /decl/closet_appearance/cabinet/secure closet_appearance = /decl/closet_appearance/cabinet/secure
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
starts_with = list( starts_with = list(
/obj/item/clothing/under/rank/psych, /obj/item/clothing/under/rank/psych,
/obj/item/clothing/under/rank/psych/turtleneck, /obj/item/clothing/under/rank/psych/turtleneck,

View File

@@ -31,6 +31,9 @@
/obj/structure/closet/secure_closet/personal/cabinet /obj/structure/closet/secure_closet/personal/cabinet
closet_appearance = /decl/closet_appearance/cabinet/secure closet_appearance = /decl/closet_appearance/cabinet/secure
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
starts_with = list( starts_with = list(
/obj/item/weapon/storage/backpack/satchel/withwallet, /obj/item/weapon/storage/backpack/satchel/withwallet,
/obj/item/device/radio/headset /obj/item/device/radio/headset

View File

@@ -238,6 +238,9 @@
req_access = list(access_forensics_lockers) req_access = list(access_forensics_lockers)
closet_appearance = /decl/closet_appearance/cabinet/secure closet_appearance = /decl/closet_appearance/cabinet/secure
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
starts_with = list( starts_with = list(
/obj/item/clothing/accessory/badge/holo/detective, /obj/item/clothing/accessory/badge/holo/detective,
/obj/item/clothing/gloves/forensic, //CHOMP Edit replaces black gloves /obj/item/clothing/gloves/forensic, //CHOMP Edit replaces black gloves

View File

@@ -97,7 +97,8 @@
starts_with = list( starts_with = list(
/obj/item/clothing/suit/fire/heavy, /obj/item/clothing/suit/fire/heavy,
/obj/item/weapon/tank/oxygen/red, /obj/item/weapon/tank/oxygen/red,
/obj/item/weapon/extinguisher/atmo, /obj/item/weapon/watertank/atmos,
/obj/item/device/flashlight,
/obj/item/clothing/head/hardhat/firefighter/atmos) /obj/item/clothing/head/hardhat/firefighter/atmos)
/* /*

View File

@@ -11,6 +11,9 @@
store_mobs = 0 store_mobs = 0
wall_mounted = 1 wall_mounted = 1
open_sound = 'sound/machines/click.ogg'
close_sound = 'sound/machines/click.ogg'
//spawns 2 sets of breathmask, emergency oxy tank and crowbar //spawns 2 sets of breathmask, emergency oxy tank and crowbar
/obj/structure/closet/walllocker/emerglocker /obj/structure/closet/walllocker/emerglocker
@@ -92,6 +95,9 @@
plane = TURF_PLANE plane = TURF_PLANE
layer = ABOVE_TURF_LAYER layer = ABOVE_TURF_LAYER
open_sound = 'sound/machines/click.ogg'
close_sound = 'sound/machines/click.ogg'
/obj/structure/closet/walllocker_double/north /obj/structure/closet/walllocker_double/north
pixel_y = 32 pixel_y = 32
dir = SOUTH dir = SOUTH

View File

@@ -41,6 +41,9 @@
name = "detective wardrobe" name = "detective wardrobe"
closet_appearance = /decl/closet_appearance/cabinet closet_appearance = /decl/closet_appearance/cabinet
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
starts_with = list( starts_with = list(
/obj/item/clothing/head/det = 2, /obj/item/clothing/head/det = 2,
/obj/item/clothing/head/det/grey = 2, /obj/item/clothing/head/det/grey = 2,
@@ -460,6 +463,9 @@
name = "site manager's wardrobe" name = "site manager's wardrobe"
closet_appearance = /decl/closet_appearance/cabinet closet_appearance = /decl/closet_appearance/cabinet
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'
starts_with = list( starts_with = list(
/obj/item/weapon/storage/backpack/captain, /obj/item/weapon/storage/backpack/captain,
/obj/item/clothing/suit/captunic, /obj/item/clothing/suit/captunic,

View File

@@ -10,6 +10,9 @@
var/points_per_crate = 5 var/points_per_crate = 5
var/rigged = 0 var/rigged = 0
open_sound = 'sound/effects/crate_open.ogg'
close_sound = 'sound/effects/crate_close.ogg'
/obj/structure/closet/crate/can_open() /obj/structure/closet/crate/can_open()
return 1 return 1
@@ -32,7 +35,7 @@
if(usr.stunned) if(usr.stunned)
return 2 return 2
playsound(src, 'sound/machines/click.ogg', 15, 1, -3) playsound(src, open_sound, 50, 1, -3)
for(var/obj/O in src) for(var/obj/O in src)
O.forceMove(get_turf(src)) O.forceMove(get_turf(src))
src.opened = 1 src.opened = 1
@@ -48,7 +51,7 @@
if(!src.can_close()) if(!src.can_close())
return 0 return 0
playsound(src, 'sound/machines/click.ogg', 15, 1, -3) playsound(src, close_sound, 50, 1, -3)
var/itemcount = 0 var/itemcount = 0
for(var/obj/O in get_turf(src)) for(var/obj/O in get_turf(src))
if(itemcount >= storage_capacity) if(itemcount >= storage_capacity)
@@ -698,3 +701,30 @@
starts_with = list( starts_with = list(
/obj/item/weapon/reagent_containers/spray/plantbgone = 2, /obj/item/weapon/reagent_containers/spray/plantbgone = 2,
/obj/item/weapon/material/minihoe) /obj/item/weapon/material/minihoe)
//Laundry Cart
/obj/structure/closet/crate/laundry
name = "Laundry Cart"
desc = "A cart with a large fabric bin on it used for transporting large amounts of clothes."
icon = 'icons/obj/closets/laundry.dmi'
closet_appearance = null
open_sound = 'sound/effects/rustle1.ogg'
close_sound = 'sound/effects/rustle2.ogg'
//Wooden Crate
/obj/structure/closet/crate/wooden
name = "wooden crate"
desc = "A crate made from wood and lined with straw. Cheapest form of storage."
icon = 'icons/obj/closets/wooden.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"
desc = "A mining car. This one doesn't work on rails, but has to be dragged."
icon = 'icons/obj/closets/miningcar.dmi'
closet_appearance = null
open_sound = 'sound/effects/wooden_closet_open.ogg'
close_sound = 'sound/effects/wooden_closet_close.ogg'

View File

@@ -357,3 +357,35 @@
/obj/structure/bed/alien/attackby(obj/item/weapon/W, mob/user) /obj/structure/bed/alien/attackby(obj/item/weapon/W, mob/user)
return // No deconning. return // No deconning.
/*
* Dirty Mattress
*/
/obj/structure/dirtybed
name = "dirty mattress"
desc = "A stained matress. Guess it's better than sleeping on the floor."
icon = 'icons/obj/furniture.dmi'
icon_state = "dirtybed"
pressure_resistance = 15
anchored = TRUE
can_buckle = TRUE
buckle_dir = SOUTH
buckle_lying = 1
/obj/structure/dirtybed/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(W.is_wrench())
playsound(src, W.usesound, 100, 1)
if(anchored)
user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
else
user.visible_message("[user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
if(do_after(user, 20 * W.toolspeed))
if(!src) return
to_chat(user, "<span class='notice'>You [anchored? "un" : ""]secured \the [src]!</span>")
anchored = !anchored
return
if(!anchored)
to_chat(user,"<span class='notice'> The bed isn't secured.</span>")
return

View File

@@ -291,10 +291,12 @@
/obj/structure/mob_spawner/mouse_nest /obj/structure/mob_spawner/mouse_nest
name = "trash" name = "trash"
desc = "A small heap of trash, perfect for mice to nest in." desc = "A small heap of trash, perfect for mice and other pests to nest in."
icon = 'icons/obj/trash_piles.dmi' icon = 'icons/obj/trash_piles.dmi'
icon_state = "randompile" icon_state = "randompile"
spawn_types = list(/mob/living/simple_mob/animal/passive/mouse) spawn_types = list(
/mob/living/simple_mob/animal/passive/mouse= 100,
/mob/living/simple_mob/animal/passive/cockroach = 25)
simultaneous_spawns = 1 simultaneous_spawns = 1
destructible = 1 destructible = 1
spawn_delay = 1 HOUR spawn_delay = 1 HOUR

View File

@@ -1,5 +1,5 @@
/obj/structure/undies_wardrobe /obj/structure/undies_wardrobe
name = "underwear wardrobe" name = "underwear dresser"
desc = "Holds item of clothing you shouldn't be showing off in the hallways." desc = "Holds item of clothing you shouldn't be showing off in the hallways."
icon = 'icons/obj/closets/undies_wardrobe.dmi' icon = 'icons/obj/closets/undies_wardrobe.dmi'
icon_state = "wardrobe" icon_state = "wardrobe"

View File

@@ -56,10 +56,10 @@
/turf/simulated/floor/outdoors/newdirt_nograss/Initialize(mapload) /turf/simulated/floor/outdoors/newdirt_nograss/Initialize(mapload)
var/possibledirts = list( var/possibledirts = list(
"dirt0" = 200, "dirt0" = 200,
"dirt3" = 20, "dirt6" = 20,
"dirt4" = 3, "dirt7" = 3,
"dirt5" = 3, "dirt8" = 3,
"dirt6" = 1 "dirt9" = 1
) )
flooring_override = pickweight(possibledirts) flooring_override = pickweight(possibledirts)
return ..() return ..()
@@ -69,7 +69,7 @@
desc = "Concrete shaped into a path!" desc = "Concrete shaped into a path!"
icon = 'icons/turf/outdoors_vr.dmi' icon = 'icons/turf/outdoors_vr.dmi'
icon_state = "sidewalk" icon_state = "sidewalk"
edge_blending_priority = 1 edge_blending_priority = -1
movement_cost = -0.5 movement_cost = -0.5
initial_flooring = /decl/flooring/outdoors/sidewalk initial_flooring = /decl/flooring/outdoors/sidewalk
can_dirty = TRUE can_dirty = TRUE
@@ -79,12 +79,31 @@
desc = "Concrete shaped into a path!" desc = "Concrete shaped into a path!"
icon = 'icons/turf/outdoors_vr.dmi' icon = 'icons/turf/outdoors_vr.dmi'
icon_base = "sidewalk" icon_base = "sidewalk"
has_damage_range = 2
damage_temperature = T0C+1400
flags = TURF_REMOVE_CROWBAR | TURF_CAN_BREAK | TURF_CAN_BURN
build_type = /obj/item/stack/tile/floor/sidewalk
can_paint = 1
can_engrave = FALSE
footstep_sounds = list("human" = list( footstep_sounds = list("human" = list(
'sound/effects/footstep/LightStone1.ogg', 'sound/effects/footstep/LightStone1.ogg',
'sound/effects/footstep/LightStone2.ogg', 'sound/effects/footstep/LightStone2.ogg',
'sound/effects/footstep/LightStone3.ogg', 'sound/effects/footstep/LightStone3.ogg',
'sound/effects/footstep/LightStone4.ogg',)) 'sound/effects/footstep/LightStone4.ogg',))
/obj/item/stack/tile/floor/sidewalk
name = "sidewalk tile"
singular_name = "floor tile"
desc = "A stone tile fit for covering a section of floor."
icon_state = "tile"
force = 6.0
matter = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT / 4)
throwforce = 15.0
throw_speed = 5
throw_range = 20
no_variants = FALSE
/turf/simulated/floor/outdoors/sidewalk/Initialize(mapload) /turf/simulated/floor/outdoors/sidewalk/Initialize(mapload)
var/possibledirts = list( var/possibledirts = list(
"[initial(icon_state)]" = 150, "[initial(icon_state)]" = 150,
@@ -104,6 +123,21 @@
/turf/simulated/floor/outdoors/sidewalk/side /turf/simulated/floor/outdoors/sidewalk/side
icon_state = "side-walk" icon_state = "side-walk"
initial_flooring = /decl/flooring/outdoors/sidewalk/side
/decl/flooring/outdoors/sidewalk/side
icon_base = "sidewalk"
build_type = /obj/item/stack/tile/floor/sidewalk/side
/obj/item/stack/tile/floor/sidewalk/side
/turf/simulated/floor/outdoors/sidewalk/slab /turf/simulated/floor/outdoors/sidewalk/slab
icon_state = "slab" icon_state = "slab"
initial_flooring = /decl/flooring/outdoors/sidewalk/slab
/decl/flooring/outdoors/sidewalk/slab
icon_base = "slab"
build_type = /obj/item/stack/tile/floor/sidewalk/slab
/obj/item/stack/tile/floor/sidewalk/slab

View File

@@ -98,6 +98,18 @@
ties[initial(tie_type.name)] = tie_type ties[initial(tie_type.name)] = tie_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(ties)) gear_tweaks += new/datum/gear_tweak/path(sortAssoc(ties))
/datum/gear/accessory/bowtie
display_name = "bowtie selection"
path = /obj/item/clothing/accessory/bowtie
cost = 1
/datum/gear/accessory/bowtie/New()
..()
var/list/bowties = list()
for(var/obj/item/clothing/accessory/bowtie_type as anything in typesof(/obj/item/clothing/accessory/bowtie))
bowties[initial(bowtie_type.name)] = bowtie_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(bowties))
/datum/gear/accessory/scarf /datum/gear/accessory/scarf
display_name = "scarf selection" display_name = "scarf selection"
path = /obj/item/clothing/accessory/scarf path = /obj/item/clothing/accessory/scarf
@@ -319,3 +331,21 @@
var/obj/item/clothing/accessory/pridepin_type = pridepin var/obj/item/clothing/accessory/pridepin_type = pridepin
pridepins[initial(pridepin_type.name)] = pridepin_type pridepins[initial(pridepin_type.name)] = pridepin_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(pridepins)) gear_tweaks += new/datum/gear_tweak/path(sortAssoc(pridepins))
/datum/gear/accessory/badge
display_name = "sheriff badge (Security)"
path = /obj/item/clothing/accessory/badge/holo/sheriff
allowed_roles = list("Security Officer","Detective","Head of Security","Warden")
/datum/gear/accessory/corpbadge
display_name = "investigator holobadge (IAA)"
path = /obj/item/clothing/accessory/badge/holo/investigator
allowed_roles = list("Internal affairs agent")
/datum/gear/accessory/pressbadge
display_name = "corporate press pass"
path = /obj/item/clothing/accessory/badge/press
/datum/gear/accessory/pressbadge
display_name = "freelance press pass"
path = /obj/item/clothing/accessory/badge/press/independent

View File

@@ -22,6 +22,19 @@
path = /obj/item/clothing/mask/surgical path = /obj/item/clothing/mask/surgical
cost = 2 cost = 2
/datum/gear/mask/sterile/white
display_name = "white sterile mask"
path = /obj/item/clothing/mask/surgical/white
cost = 2
/datum/gear/mask/sterile/white/dust
display_name = "dust mask"
path = /obj/item/clothing/mask/surgical/dust
/datum/gear/mask/sterile/white/cloth
display_name = "cloth face mask"
path = /obj/item/clothing/mask/surgical/cloth
/datum/gear/mask/plaguedoctor /datum/gear/mask/plaguedoctor
display_name = "plague doctor's mask" display_name = "plague doctor's mask"
path = /obj/item/clothing/mask/gas/plaguedoctor path = /obj/item/clothing/mask/gas/plaguedoctor

View File

@@ -2,6 +2,10 @@
display_name = "nudity permit" display_name = "nudity permit"
path = /obj/item/clothing/under/permit path = /obj/item/clothing/under/permit
/datum/gear/uniform/suit/natureist_talisman
display_name = "naturist talisman"
path = /obj/item/clothing/under/permit/natureist_talisman
//Polaris overrides //Polaris overrides
/datum/gear/uniform/solgov/pt/sifguard /datum/gear/uniform/solgov/pt/sifguard
display_name = "pt uniform, planetside sec" display_name = "pt uniform, planetside sec"

View File

@@ -22,7 +22,7 @@ var/list/preferences_datums = list()
var/UI_style_color = "#ffffff" var/UI_style_color = "#ffffff"
var/UI_style_alpha = 255 var/UI_style_alpha = 255
var/tooltipstyle = "Midnight" //Style for popup tooltips var/tooltipstyle = "Midnight" //Style for popup tooltips
var/client_fps = 0 var/client_fps = 40
var/ambience_freq = 5 // How often we're playing repeating ambience to a client. var/ambience_freq = 5 // How often we're playing repeating ambience to a client.
var/ambience_chance = 35 // What's the % chance we'll play ambience (in conjunction with the above frequency) var/ambience_chance = 35 // What's the % chance we'll play ambience (in conjunction with the above frequency)

View File

@@ -5,6 +5,13 @@
desc = "It's a hat used by chefs to keep hair out of your food. Judging by the food in the mess, they don't work." desc = "It's a hat used by chefs to keep hair out of your food. Judging by the food in the mess, they don't work."
icon_state = "chefhat" icon_state = "chefhat"
/obj/item/clothing/head/hairnet
name = "hairnet"
desc = "A hairnet used to keep the hair out of the way and out of the food."
sprite_sheets = list(
SPECIES_TAJARAN = 'icons/inventory/head/mob_tajaran.dmi'
)
//Captain //Captain
/obj/item/clothing/head/caphat /obj/item/clothing/head/caphat
name = "site manager's hat" name = "site manager's hat"

View File

@@ -63,6 +63,24 @@
adjust_mask(usr) adjust_mask(usr)
/obj/item/clothing/mask/surgical/white
icon_state = "sterilew"
item_state_slots = list(slot_r_hand_str = "sterilew", slot_l_hand_str = "sterilew")
/obj/item/clothing/mask/surgical/dust
name = "dust mask"
desc = "A dust mask designed to protect the wearer against construction and/or custodial particulate."
icon_state = "dust"
item_state_slots = list(slot_r_hand_str = "dust", slot_l_hand_str = "dust")
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 30, rad = 0)
/obj/item/clothing/mask/surgical/cloth
name = "cloth mask"
desc = "A cloth mask designed to protect the wearer against allergens, illnesses, and social interaction."
icon_state = "cloth"
item_state_slots = list(slot_r_hand_str = "cloth", slot_l_hand_str = "cloth")
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 20, rad = 0)
/obj/item/clothing/mask/fakemoustache /obj/item/clothing/mask/fakemoustache
name = "fake moustache" name = "fake moustache"
desc = "Warning: moustache is fake." desc = "Warning: moustache is fake."

View File

@@ -227,14 +227,6 @@
/obj/item/clothing/shoes/boots/ranger/yellow /obj/item/clothing/shoes/boots/ranger/yellow
bootcolor = "yellow" bootcolor = "yellow"
/obj/item/clothing/shoes/primitive
name = "primitive shoes"
desc = "Some patched together rags. Better than being barefoot."
icon_state = "rag"
force = 0
drop_sound = 'sound/items/drop/clothing.ogg'
pickup_sound = 'sound/items/pickup/clothing.ogg'
/* /*
* 80s * 80s
*/ */

View File

@@ -157,6 +157,20 @@
desc = "A neosilk clip-on tie. This one is disgusting." desc = "A neosilk clip-on tie. This one is disgusting."
icon_state = "horribletie" icon_state = "horribletie"
/obj/item/clothing/accessory/bowtie
name = "red bow tie"
desc = "Snazzy!"
icon_state = "redbowtie"
slot = ACCESSORY_SLOT_TIE
/obj/item/clothing/accessory/bowtie/black
name = "black bow tie"
icon_state = "blackbowtie"
/obj/item/clothing/accessory/bowtie/white
name = "white bow tie"
icon_state = "whitebowtie"
/obj/item/clothing/accessory/stethoscope /obj/item/clothing/accessory/stethoscope
name = "stethoscope" name = "stethoscope"
desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing." desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing."

View File

@@ -6,19 +6,14 @@
/obj/item/clothing/accessory/badge /obj/item/clothing/accessory/badge
name = "detective's badge" name = "detective's badge"
desc = "Security Department detective's badge, made from gold." desc = "A corporate security badge, made from gold and set on false leather."
icon_state = "badge" icon_state = "marshalbadge"
slot_flags = SLOT_BELT | SLOT_TIE slot_flags = SLOT_BELT | SLOT_TIE
slot = ACCESSORY_SLOT_MEDAL slot = ACCESSORY_SLOT_MEDAL
var/stored_name var/stored_name
var/badge_string = "Corporate Security" var/badge_string = "Corporate Security"
/obj/item/clothing/accessory/badge/old
name = "faded badge"
desc = "A faded badge, backed with leather. It bears the emblem of the Forensic division."
icon_state = "badge_round"
/obj/item/clothing/accessory/badge/proc/set_name(var/new_name) /obj/item/clothing/accessory/badge/proc/set_name(var/new_name)
stored_name = new_name stored_name = new_name
name = "[initial(name)] ([stored_name])" name = "[initial(name)] ([stored_name])"
@@ -26,7 +21,6 @@
/obj/item/clothing/accessory/badge/proc/set_desc(var/mob/living/carbon/human/H) /obj/item/clothing/accessory/badge/proc/set_desc(var/mob/living/carbon/human/H)
/obj/item/clothing/accessory/badge/attack_self(mob/user as mob) /obj/item/clothing/accessory/badge/attack_self(mob/user as mob)
if(!stored_name) if(!stored_name)
to_chat(user, "You polish your old badge fondly, shining up the surface.") to_chat(user, "You polish your old badge fondly, shining up the surface.")
set_name(user.real_name) set_name(user.real_name)
@@ -42,26 +36,45 @@
if(isliving(user)) if(isliving(user))
user.visible_message("<span class='danger'>[user] invades [M]'s personal space, thrusting [src] into their face insistently.</span>","<span class='danger'>You invade [M]'s personal space, thrusting [src] into their face insistently.</span>") user.visible_message("<span class='danger'>[user] invades [M]'s personal space, thrusting [src] into their face insistently.</span>","<span class='danger'>You invade [M]'s personal space, thrusting [src] into their face insistently.</span>")
user.do_attack_animation(M) user.do_attack_animation(M)
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //NO SPAM
// Sheriff Badge (toy) // General Badges
/obj/item/clothing/accessory/badge/sheriff /obj/item/clothing/accessory/badge/old
name = "sheriff badge" name = "faded badge"
desc = "This town ain't big enough for the two of us, pardner." desc = "A faded badge, backed with leather."
icon_state = "sheriff" icon_state = "badge_round"
item_state = "goldbadge"
/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user as mob) /obj/item/clothing/accessory/badge/idbadge/nt
user.visible_message("[user] shows their sheriff badge. There's a new sheriff in town!",\ name = "\improper NT ID badge"
"You flash the sheriff badge to everyone around you!") desc = "A descriptive identification badge with the holder's credentials. This one has red marks with the NanoTrasen logo on it."
icon_state = "ntbadge"
badge_string = null
/obj/item/clothing/accessory/badge/sheriff/attack(mob/living/carbon/human/M, mob/living/user) /obj/item/clothing/accessory/badge/press
if(isliving(user)) name = "corporate press pass"
user.visible_message("<span class='danger'>[user] invades [M]'s personal space, the sheriff badge into their face!.</span>","<span class='danger'>You invade [M]'s personal space, thrusting the sheriff badge into their face insistently.</span>") desc = "A corporate reporter's pass, emblazoned with the NanoTrasen logo."
user.do_attack_animation(M) icon_state = "pressbadge"
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam item_state = "pbadge"
badge_string = "Corporate Reporter"
w_class = ITEMSIZE_TINY
//.Holobadges. drop_sound = 'sound/items/drop/rubber.ogg'
pickup_sound = 'sound/items/pickup/rubber.ogg'
/obj/item/clothing/accessory/badge/press/independent
name = "press pass"
desc = "A freelance journalist's pass."
icon_state = "pressbadge-i"
badge_string = "Freelance Journalist"
/obj/item/clothing/accessory/badge/press/plastic
name = "plastic press pass"
desc = "A journalist's 'pass' shaped, for whatever reason, like a security badge. It is made of plastic."
icon_state = "pbadge"
badge_string = "Sicurity Journelist"
w_class = ITEMSIZE_SMALL
// Holobadges
/obj/item/clothing/accessory/badge/holo /obj/item/clothing/accessory/badge/holo
name = "holobadge" name = "holobadge"
desc = "This glowing blue badge marks the holder as THE LAW." desc = "This glowing blue badge marks the holder as THE LAW."
@@ -110,10 +123,17 @@
name = "holobadge box" name = "holobadge box"
desc = "A box claiming to contain holobadges." desc = "A box claiming to contain holobadges."
starts_with = list( starts_with = list(
/obj/item/clothing/accessory/badge/holo = 4, /obj/item/clothing/accessory/badge/holo/officer = 2,
/obj/item/clothing/accessory/badge/holo = 2,
/obj/item/clothing/accessory/badge/holo/cord = 2 /obj/item/clothing/accessory/badge/holo/cord = 2
) )
/obj/item/clothing/accessory/badge/holo/officer
name = "officer's badge"
desc = "A bronze corporate security badge. Stamped with the words 'Security Officer.'"
icon_state = "bronzebadge"
slot_flags = SLOT_TIE | SLOT_BELT
/obj/item/clothing/accessory/badge/holo/warden /obj/item/clothing/accessory/badge/holo/warden
name = "warden's holobadge" name = "warden's holobadge"
desc = "A silver corporate security badge. Stamped with the words 'Warden.'" desc = "A silver corporate security badge. Stamped with the words 'Warden.'"
@@ -122,7 +142,7 @@
/obj/item/clothing/accessory/badge/holo/hos /obj/item/clothing/accessory/badge/holo/hos
name = "head of security's holobadge" name = "head of security's holobadge"
desc = "An immaculately polished gold security badge. Labeled 'Head of Security.'" desc = "An immaculately polished gold security badge. Stamped with the words 'Head of Security.'"
icon_state = "goldbadge" icon_state = "goldbadge"
slot_flags = SLOT_TIE | SLOT_BELT slot_flags = SLOT_TIE | SLOT_BELT
@@ -132,20 +152,48 @@
icon_state = "marshalbadge" icon_state = "marshalbadge"
slot_flags = SLOT_TIE | SLOT_BELT slot_flags = SLOT_TIE | SLOT_BELT
/obj/item/clothing/accessory/badge/holo/investigator
name = "\improper investigator holobadge"
desc = "This badge marks the holder as an investigative agent."
icon_state = "invbadge"
badge_string = "Corporate Investigator"
slot_flags = SLOT_TIE | SLOT_BELT
/obj/item/clothing/accessory/badge/holo/sheriff
name = "sheriff badge"
desc = "A star-shaped brass badge denoting who the law is around these parts."
icon_state = "sheriff"
slot_flags = SLOT_TIE | SLOT_BELT
/obj/item/weapon/storage/box/holobadge/hos /obj/item/weapon/storage/box/holobadge/hos
name = "holobadge box" name = "holobadge box"
desc = "A box claiming to contain holobadges." desc = "A box claiming to contain holobadges."
starts_with = list( starts_with = list(
/obj/item/clothing/accessory/badge/holo = 2, /obj/item/clothing/accessory/badge/holo/officer = 2,
/obj/item/clothing/accessory/badge/holo/warden = 1, /obj/item/clothing/accessory/badge/holo/warden = 1,
/obj/item/clothing/accessory/badge/holo/detective = 2, /obj/item/clothing/accessory/badge/holo/detective = 2,
/obj/item/clothing/accessory/badge/holo/hos = 1, /obj/item/clothing/accessory/badge/holo/hos = 1,
/obj/item/clothing/accessory/badge/holo/cord = 1 /obj/item/clothing/accessory/badge/holo/cord = 1
) )
// Synthmorph bag / Corporation badges. Primarily used on the robobag, but can be worn. Default is NT. // Sheriff Badge (toy)
/obj/item/clothing/accessory/badge/sheriff
name = "sheriff badge"
desc = "This town ain't big enough for the two of us, pardner."
icon_state = "sheriff_toy"
item_state = "sheriff_toy"
/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user as mob)
user.visible_message("[user] shows their sheriff badge. There's a new sheriff in town!",\
"You flash the sheriff badge to everyone around you!")
/obj/item/clothing/accessory/badge/sheriff/attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
user.visible_message("<span class='danger'>[user] invades [M]'s personal space, the sheriff badge into their face!.</span>","<span class='danger'>You invade [M]'s personal space, thrusting the sheriff badge into their face insistently.</span>")
user.do_attack_animation(M)
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //NO SPAM
// Synthmorph bag / Corporation badges. Primarily used on the robobag, but can be worn. Default is NT.
/obj/item/clothing/accessory/badge/corporate_tag /obj/item/clothing/accessory/badge/corporate_tag
name = "NanoTrasen Badge" name = "NanoTrasen Badge"
desc = "A plain metallic plate that might denote the wearer as a member of NanoTrasen." desc = "A plain metallic plate that might denote the wearer as a member of NanoTrasen."

View File

@@ -151,6 +151,9 @@
desc = "A worn-out handgun holster. Perfect for concealed carry" desc = "A worn-out handgun holster. Perfect for concealed carry"
icon_state = "holster" icon_state = "holster"
/obj/item/clothing/accessory/holster/armpit/black
icon_state = "holster_b"
/obj/item/clothing/accessory/holster/waist /obj/item/clothing/accessory/holster/waist
name = "waist holster" name = "waist holster"
desc = "A handgun holster. Made of expensive leather." desc = "A handgun holster. Made of expensive leather."
@@ -158,15 +161,26 @@
overlay_state = "holster_low" overlay_state = "holster_low"
concealed_holster = 0 concealed_holster = 0
/obj/item/clothing/accessory/holster/waist/black
icon_state = "holster_b_low"
/obj/item/clothing/accessory/holster/hip /obj/item/clothing/accessory/holster/hip
name = "hip holster" name = "hip holster"
desc = "A handgun holster slung low on the hip, draw pardner!" desc = "<i>No one dared to ask his business, no one dared to make a slip. The stranger there among them had a big iron on his hip.</i>"
icon_state = "holster_hip" icon_state = "holster_hip"
concealed_holster = 0 concealed_holster = 0
/obj/item/clothing/accessory/holster/hip/black
desc = "A handgun holster slung low on the hip, draw pardner!"
icon_state = "holster_b_hip"
/obj/item/clothing/accessory/holster/leg /obj/item/clothing/accessory/holster/leg
name = "leg holster" name = "leg holster"
desc = "A tacticool handgun holster. Worn on the upper leg." desc = "A drop leg holster made of a durable synthetic leather."
icon_state = "holster_leg" icon_state = "holster_leg"
overlay_state = "holster_leg" overlay_state = "holster_leg"
concealed_holster = 0 concealed_holster = 0
/obj/item/clothing/accessory/holster/leg/black
desc = "A tacticool handgun holster. Worn on the upper leg."
icon_state = "holster_b_leg"

View File

@@ -1257,13 +1257,6 @@
icon_state = "cowboy_grey" icon_state = "cowboy_grey"
worn_state = "cowboy_grey" worn_state = "cowboy_grey"
/obj/item/clothing/under/primitive
name = "primitive clothes"
desc = "Some patched together rags. Better than being naked."
force = 0
icon_state = "rag"
worn_state = "rag"
/obj/item/clothing/under/curator /obj/item/clothing/under/curator
name = "curator uniform" name = "curator uniform"
desc = "A rugged uniform suitable for treasure hunting." desc = "A rugged uniform suitable for treasure hunting."

View File

@@ -6,8 +6,8 @@
/obj/item/clothing/under/permit /obj/item/clothing/under/permit
name = "public nudity permit" name = "public nudity permit"
desc = "This permit entitles the bearer to conduct their duties without a uniform. Normally issued to furred crewmembers or those with nothing to hide." desc = "This permit entitles the bearer to conduct their duties without a uniform. Normally issued to furred crewmembers or those with nothing to hide."
icon = 'icons/obj/card.dmi' icon = 'icons/obj/card_new.dmi'
icon_state = "guest" icon_state = "permit-nude"
body_parts_covered = 0 body_parts_covered = 0
equip_sound = null equip_sound = null
@@ -299,7 +299,7 @@
/obj/item/clothing/under/summerdress/blue /obj/item/clothing/under/summerdress/blue
icon_state = "summerdress2" icon_state = "summerdress2"
/obj/item/clothing/under/dress/dress_cap/femformal // formal in the loosest sense. because it's going to be taken off. or something. funnier in my head i swear /obj/item/clothing/under/dress/dress_cap/femformal // formal in the loosest sense. because it's going to be taken off. or something. funnier in my head i swear
name = "site manager's feminine formalwear" name = "site manager's feminine formalwear"
desc = "Essentially a skimpy...dress? Leotard? Whatever it is, it has the coloration and markings suitable for a site manager or rough equivalent." desc = "Essentially a skimpy...dress? Leotard? Whatever it is, it has the coloration and markings suitable for a site manager or rough equivalent."
icon = 'icons/inventory/uniform/item_vr.dmi' icon = 'icons/inventory/uniform/item_vr.dmi'

View File

@@ -0,0 +1,70 @@
/* Tribal Clothing
* Contains:
* Primitive Clothing
* Tribal Clothing
*/
/*
* Primitive Clothing
*/
/obj/item/clothing/under/primitive
name = "primitive clothes"
desc = "Some patched together rags. Better than being naked."
force = 0
icon_state = "rag"
worn_state = "rag"
/obj/item/clothing/shoes/primitive
name = "primitive shoes"
desc = "Some patched together rags. Better than being barefoot."
icon_state = "rag"
force = 0
drop_sound = 'sound/items/drop/clothing.ogg'
pickup_sound = 'sound/items/pickup/clothing.ogg'
/*
* Tribal Clothing
*/
/obj/item/clothing/under/permit/natureist_talisman //Tribal version of the Nudity Permit
name = "naturist talisman"
desc = "This ancient talisman gives rights to those that wish to be closer to nature by casting their constricting clothes aside."
icon = 'icons/inventory/accessory/item.dmi'
icon_override = 'icons/inventory/accessory/mob.dmi'
icon_state = "talisman"
item_state = "talisman"
worn_state = "talisman"
/obj/item/clothing/under/tribalwear
item_state_slots = list(slot_r_hand_str = "tribalwear", slot_l_hand_str = "tribalwear")
/obj/item/clothing/under/tribalwear/common1
name = "tribalwear"
desc = "A traditionally woven robe made with locally sourced material."
icon_state = "tribal_common1"
/obj/item/clothing/under/tribalwear/common2
name = "tribalwear"
desc = "A traditionally woven outfit made with locally sourced material."
icon_state = "tribal_common2"
/obj/item/clothing/under/tribalwear/hunter
name = "hunting tribalwear"
desc = "Dusty rags decorated with strips of leather and small pieces of cyan colored stones."
icon_state = "tribal_hunter"
/obj/item/clothing/under/tribalwear/chief
name = "chief's tribalwear"
desc = "Well maintained robe adorned with fine leather and polished cyan stones."
icon_state = "tribal_chief"
/obj/item/clothing/under/tribalwear/shaman
name = "shaman robes"
desc = "Carefully hand wozen cloth robes with heavy colored stones jewelry drapped over top."
icon_state = "tribal_shaman"
/obj/item/clothing/shoes/tribalwear
name = "tribal sandals"
desc = "Traditionally made sandals made with local materials."
icon_state = "tribal_sandals"
species_restricted = null
body_parts_covered = 0

View File

@@ -487,6 +487,7 @@
/obj/item/weapon/plantspray/pests = 20, /obj/item/weapon/plantspray/pests = 20,
/obj/item/weapon/reagent_containers/syringe = 5, /obj/item/weapon/reagent_containers/syringe = 5,
/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/glass/beaker = 4,
/obj/item/weapon/watertank = 1,
/obj/item/weapon/storage/bag/plants = 5) /obj/item/weapon/storage/bag/plants = 5)
premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10, premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,
/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5) /obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
@@ -1253,6 +1254,7 @@
/obj/item/clothing/suit/chef = 5, /obj/item/clothing/suit/chef = 5,
/obj/item/clothing/suit/chef/classic = 5, /obj/item/clothing/suit/chef/classic = 5,
/obj/item/clothing/head/chefhat = 5, /obj/item/clothing/head/chefhat = 5,
/obj/item/clothing/head/hairnet = 5,
/obj/item/clothing/under/waiter = 5, /obj/item/clothing/under/waiter = 5,
/obj/item/clothing/under/sundress = 1 /obj/item/clothing/under/sundress = 1
) )
@@ -1533,7 +1535,8 @@
/obj/item/clothing/gloves/black = 5, /obj/item/clothing/gloves/black = 5,
/obj/item/weapon/storage/belt/janitor = 5, /obj/item/weapon/storage/belt/janitor = 5,
/obj/item/clothing/shoes/galoshes = 5, /obj/item/clothing/shoes/galoshes = 5,
/obj/item/weapon/cartridge/janitor = 5 /obj/item/weapon/cartridge/janitor = 5,
/obj/item/weapon/watertank/janitor = 1
) )
req_log_access = access_hop req_log_access = access_hop
has_logs = 1 has_logs = 1

View File

@@ -2250,7 +2250,9 @@
/obj/item/weapon/storage/belt/utility/chief/full = 5, /obj/item/weapon/storage/belt/utility/chief/full = 5,
/obj/item/weapon/storage/belt/utility/alien/full = 5, /obj/item/weapon/storage/belt/utility/alien/full = 5,
/obj/item/weapon/storage/bible = 5, /obj/item/weapon/storage/bible = 5,
/obj/item/weapon/pickaxe = 5,
/obj/item/weapon/pickaxe/drill = 5, /obj/item/weapon/pickaxe/drill = 5,
/obj/item/weapon/pickaxe/advdrill = 5,
/obj/item/weapon/pickaxe/diamonddrill = 5, /obj/item/weapon/pickaxe/diamonddrill = 5,
/obj/item/weapon/pickaxe/gold = 5, /obj/item/weapon/pickaxe/gold = 5,
/obj/item/weapon/pickaxe/diamond = 5, /obj/item/weapon/pickaxe/diamond = 5,

View File

@@ -17,6 +17,10 @@
name = "infestation - spiders" name = "infestation - spiders"
event_type = /datum/event2/event/infestation/spiderlings event_type = /datum/event2/event/infestation/spiderlings
/datum/event2/event/infestation/cockroaches
vermin_string = "cockroaches"
max_vermin = 6
things_to_spawn = list(/mob/living/simple_mob/animal/passive/cockroach)
/datum/event2/event/infestation /datum/event2/event/infestation
var/vermin_string = null var/vermin_string = null

View File

@@ -72,7 +72,8 @@
var/list/restricted_programs = list( var/list/restricted_programs = list(
"Burnoff Test Simulation" = new/datum/holodeck_program(/area/holodeck/source_burntest, list()), "Burnoff Test Simulation" = new/datum/holodeck_program(/area/holodeck/source_burntest, list()),
"Wildlife Simulation" = new/datum/holodeck_program(/area/holodeck/source_wildlife, list()) "Wildlife Simulation" = new/datum/holodeck_program(/area/holodeck/source_wildlife, list()),
"Inside" = new/datum/holodeck_program(/area/holodeck/the_uwu_zone, list('sound/vore/sunesound/prey/loop.ogg')), //VOREStation add
) )
/obj/machinery/computer/HolodeckControl/attack_ai(var/mob/user as mob) /obj/machinery/computer/HolodeckControl/attack_ai(var/mob/user as mob)

View File

@@ -0,0 +1,295 @@
/*
* Hydroponics tank and base code
*/
/obj/item/weapon/watertank
name = "backpack water tank"
desc = "A S.U.N.S.H.I.N.E. brand watertank backpack with nozzle to water plants."
icon = 'icons/inventory/back/item.dmi'
icon_state = "waterbackpack"
item_state = "waterbackpack"
w_class = ITEMSIZE_LARGE
slot_flags = SLOT_BACK
slowdown = 0.5
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30)
var/obj/item/noz
var/volume = 500
/obj/item/weapon/watertank/Initialize()
. = ..()
create_reagents(volume, OPENCONTAINER)
noz = make_noz()
/obj/item/weapon/watertank/MouseDrop()
if(ismob(loc))
if(!CanMouseDrop(src))
return
var/mob/M = loc
if(!M.unEquip(src))
return
add_fingerprint(usr)
M.put_in_any_hand_if_possible(src)
/obj/item/weapon/watertank/Destroy()
QDEL_NULL(noz)
return ..()
/obj/item/weapon/watertank/ui_action_click(mob/user)
toggle_mister(user)
/obj/item/weapon/watertank/attack_hand(var/mob/user)
if(loc == user)
toggle_mister()
else
..()
/obj/item/weapon/watertank/item_action_slot_check(slot, mob/user)
if(slot == user.getBackSlot())
return 1
//checks that the base unit is in the correct slot to be used
/obj/item/weapon/watertank/proc/slot_check()
var/mob/M = loc
if(!istype(M))
return 0 //not equipped
if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_back) == src)
return 1
if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_s_store) == src)
return 1
return 0
/obj/item/weapon/watertank/verb/toggle_mister()
set name = "Toggle Mister"
set category = "Object"
var/mob/living/carbon/human/user = usr
if(!noz)
to_chat(user, "<span class='warning'>The mister is missing!</span>")
return
if(noz.loc != src)
remove_noz(user) //Remove from their hands and back onto the defib unit
return
if(!slot_check())
to_chat(user, "<span class='warning'>You need to equip [src] before taking out [noz].</span>")
else
if(!usr.put_in_hands(noz)) //Detach the handset into the user's hands
to_chat(user, "<span class='warning'>You need a free hand to hold the handset!</span>")
update_icon() //success
/obj/item/weapon/watertank/proc/make_noz()
return new /obj/item/weapon/reagent_containers/spray/mister(src)
/obj/item/weapon/watertank/equipped(mob/user, slot)
..()
if(slot != slot_back)
remove_noz()
/obj/item/weapon/watertank/proc/remove_noz(var/mob/user)
if(!noz) return
if(ismob(noz.loc))
var/mob/M = noz.loc
if(M.drop_from_inventory(noz, src))
to_chat(user, "<span class='notice'>\The [noz] snaps back into the main unit.</span>")
else
noz.forceMove(src)
/obj/item/weapon/watertank/attackby(obj/item/W, mob/user, params)
if(W == noz)
remove_noz()
return 1
else
return ..()
/obj/item/weapon/watertank/dropped(var/mob/user)
..()
remove_noz(user)
/*
* This mister item is intended as an extension of the watertank and always attached to it.
* Therefore, it's designed to be "locked" to the player's hands or extended back onto
* the watertank backpack. Allowing it to be placed elsewhere or created without a parent
* watertank object will likely lead to weird behaviour or runtimes.
*/
/*
* Hydroponics mister
*/
/obj/item/weapon/reagent_containers/spray/mister
name = "water mister"
desc = "A mister nozzle attached to a water tank."
icon_state = "mister"
item_state = "mister"
w_class = ITEMSIZE_LARGE
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(50)
volume = 500
item_flags = NOBLUDGEON
slot_flags = NONE
var/obj/item/weapon/watertank/tank
/obj/item/weapon/reagent_containers/spray/mister/Initialize()
. = ..()
tank = loc
if(!istype(tank))
return INITIALIZE_HINT_QDEL
reagents = tank.reagents //This mister is really just a proxy for the tank's reagents
/obj/item/weapon/reagent_containers/spray/mister/doMove(atom/destination)
if(destination && (destination != tank.loc || !ismob(destination)))
if (loc != tank)
to_chat(tank.loc, "<span class = 'notice'>The mister snaps back onto the watertank.</span>")
destination = tank
..()
/obj/item/weapon/reagent_containers/spray/mister/afterattack(obj/target, mob/user, proximity)
if(target.loc == loc) //Safety check so you don't fill your mister with mutagen or something and then blast yourself in the face with it
return
..()
/*
* Janitor tank
*/
/obj/item/weapon/watertank/janitor
name = "backpack cleaner tank"
desc = "A janitorial cleaner backpack with nozzle to clean blood and graffiti."
icon_state = "waterbackpackjani"
item_state = "waterbackpackjani"
/obj/item/weapon/watertank/janitor/Initialize()
. = ..()
reagents.add_reagent("cleaner", 500)
/obj/item/weapon/watertank/janitor/make_noz()
return new /obj/item/weapon/reagent_containers/spray/mister/janitor(src)
/*
* Janitor mister
*/
/obj/item/weapon/reagent_containers/spray/mister/janitor
name = "janitor spray nozzle"
desc = "A janitorial spray nozzle attached to a watertank, designed to clean up large messes."
icon_state = "misterjani"
item_state = "misterjani"
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5,10)
spray_size = 4
/*
* Security tank
*/
/obj/item/weapon/watertank/pepperspray
name = "ANTI-TIDER-2500 suppression backpack"
desc = "The ultimate crowd-control device; this tool allows the user to quickly and efficiently pacify groups of hostile targets."
icon_state = "pepperbackpacksec"
item_state = "pepperbackpacksec"
volume = 1000
/obj/item/weapon/watertank/pepperspray/Initialize()
. = ..()
reagents.add_reagent("condensedcapsaicin", 1000)
/obj/item/weapon/watertank/pepperspray/make_noz()
return new /obj/item/weapon/reagent_containers/spray/mister/pepperspray(src)
/*
* Security mister
*/
/obj/item/weapon/reagent_containers/spray/mister/pepperspray
name = "security spray nozzle"
desc = "A pacifying spray nozzle attached to a pepperspray tank, designed to silence perps."
icon_state = "mistersec"
item_state = "mistersec"
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5,10)
spray_size = 6
/*
* Operative tank
*/
/obj/item/weapon/watertank/op
name = "uborka tank"
desc = "A Russian backpack spray for systematic cleansing of carbon lifeforms."
icon_state = "waterbackpackop"
item_state = "waterbackpackop"
w_class = ITEMSIZE_NORMAL
volume = 2000
slowdown = 0
/obj/item/weapon/watertank/op/Initialize()
. = ..()
reagents.add_reagent("fuel", 500)
reagents.add_reagent("cryptobiolin", 500)
reagents.add_reagent("phoron", 500)
reagents.add_reagent("condensedcapsaicin", 500)
/obj/item/weapon/watertank/op/make_noz()
return new /obj/item/weapon/reagent_containers/spray/mister/op(src)
/*
* Operative mister
*/
/obj/item/weapon/reagent_containers/spray/mister/op
name = "uborka spray nozzle"
desc = "A mister nozzle attached to several extended water tanks. It suspiciously has a compressor in the system and is labelled entirely in Cyrillic."
icon_state = "misterop"
item_state = "misterop"
w_class = ITEMSIZE_HUGE
volume = 2000
amount_per_transfer_from_this = 100
possible_transfer_amounts = list(75,100,150)
/*
* Atmos tank
*/
/obj/item/weapon/watertank/atmos
name = "backpack firefighter tank"
desc = "A pressurized backpack tank with extinguisher nozzle, intended to fight fires."
icon_state = "waterbackpackatmos"
item_state = "waterbackpackatmos"
volume = 200
/obj/item/weapon/watertank/atmos/Initialize()
. = ..()
reagents.add_reagent("water", 200)
/obj/item/weapon/watertank/atmos/make_noz()
return new /obj/item/weapon/reagent_containers/spray/mister/atmos(src)
/*
* Atmos hose
*/
/obj/item/weapon/reagent_containers/spray/mister/atmos
name = "extinguisher nozzle"
desc = "A heavy duty nozzle attached to a firefighter's backpack tank."
icon_state = "atmos_nozzle"
item_state = "nozzleatmos"
w_class = ITEMSIZE_HUGE
volume = 200
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5,10)
spray_size = null
/obj/item/weapon/reagent_containers/spray/mister/atmos/Spray_at(atom/A as mob|obj)
playsound(src, 'sound/effects/spray3.ogg', rand(50,1), -6)
var/direction = get_dir(src, A)
var/turf/T = get_turf(A)
var/turf/T1 = get_step(T,turn(direction, 90))
var/turf/T2 = get_step(T,turn(direction, -90))
var/list/the_targets = list(T, T1, T2)
for(var/a = 1 to 3)
spawn(0)
if(reagents.total_volume < 1) break
var/obj/effect/effect/water/chempuff/D = new/obj/effect/effect/water/chempuff(get_turf(src))
var/turf/my_target = the_targets[a]
D.create_reagents(amount_per_transfer_from_this)
if(!src)
return
reagents.trans_to_obj(D, amount_per_transfer_from_this)
D.set_color()
D.set_up(my_target, rand(6, 8), 2)
return

View File

@@ -6,6 +6,7 @@
var/tmp/lighting_corners_initialised = FALSE var/tmp/lighting_corners_initialised = FALSE
var/tmp/outdoors_adjacent = FALSE
///Our lighting object. ///Our lighting object.
var/tmp/datum/lighting_object/lighting_object var/tmp/datum/lighting_object/lighting_object
///Lighting Corner datums. ///Lighting Corner datums.
@@ -96,9 +97,9 @@
///Setter for the byond luminosity var ///Setter for the byond luminosity var
/turf/proc/set_luminosity(new_luminosity, force) /turf/proc/set_luminosity(new_luminosity, force)
// SSplanets handles outdoor turfs // SSplanets handles outdoor turfs
if(is_outdoors() && !force) if((is_outdoors() && !force) || outdoors_adjacent)
return return
luminosity = new_luminosity luminosity = new_luminosity
///Calculate on which directions this turfs block view. ///Calculate on which directions this turfs block view.

View File

@@ -27,7 +27,7 @@
new/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus(src) new/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus(src)
new/obj/item/weapon/flame/lighter/zippo(src) new/obj/item/weapon/flame/lighter/zippo(src)
if(6 to 10) if(6 to 10)
new/obj/item/weapon/pickaxe/drill(src) new/obj/item/weapon/pickaxe/advdrill(src)
new/obj/item/device/taperecorder(src) new/obj/item/device/taperecorder(src)
new/obj/item/clothing/suit/space(src) new/obj/item/clothing/suit/space(src)
new/obj/item/clothing/head/helmet/space(src) new/obj/item/clothing/head/helmet/space(src)

View File

@@ -10,22 +10,22 @@
/*****************************Pickaxe********************************/ /*****************************Pickaxe********************************/
/obj/item/weapon/pickaxe /obj/item/weapon/pickaxe
name = "mining drill" name = "pickaxe"
desc = "The most basic of mining drills, for short excavations and small mineral extractions." desc = "A miner's best friend."
icon = 'icons/obj/items.dmi' icon = 'icons/obj/items.dmi'
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
force = 15.0 force = 15.0
throwforce = 4.0 throwforce = 4.0
icon_state = "pickaxe" icon_state = "pickaxe"
item_state = "jackhammer" item_state = "pickaxe"
w_class = ITEMSIZE_LARGE w_class = ITEMSIZE_LARGE
matter = list(MAT_STEEL = 3750) matter = list(MAT_STEEL = 2500)
var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO
var/sand_dig = FALSE // does this thing dig sand? var/sand_dig = FALSE // does this thing dig sand?
origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) origin_tech = list(TECH_MATERIAL = 1)
attack_verb = list("hit", "pierced", "sliced", "attacked") attack_verb = list("hit", "pierced", "sliced", "attacked")
var/drill_sound = "pickaxe" var/drill_sound = "pickaxe"
var/drill_verb = "drilling" var/drill_verb = "picking"
sharp = TRUE sharp = TRUE
var/excavation_amount = 200 var/excavation_amount = 200
@@ -39,16 +39,59 @@
origin_tech = list(TECH_MATERIAL = 3) origin_tech = list(TECH_MATERIAL = 3)
desc = "This makes no metallurgic sense." desc = "This makes no metallurgic sense."
/obj/item/weapon/pickaxe/gold
name = "golden pickaxe"
icon_state = "gpickaxe"
item_state = "gpickaxe"
digspeed = 20
origin_tech = list(TECH_MATERIAL = 4)
desc = "This makes no metallurgic sense."
drill_verb = "picking"
/obj/item/weapon/pickaxe/diamond
name = "diamond pickaxe"
icon_state = "dpickaxe"
item_state = "dpickaxe"
digspeed = 10
origin_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 4)
desc = "A pickaxe with a diamond pick head."
drill_verb = "picking"
/*****************************Drill********************************/
/obj/item/weapon/pickaxe/drill /obj/item/weapon/pickaxe/drill
name = "mining drill" // Can dig sand as well!
icon_state = "drill"
item_state = "jackhammer"
digspeed = 35 //Only slighty better than a pickaxe
sand_dig = TRUE
origin_tech = list(TECH_MATERIAL = 1, TECH_POWER = 2, TECH_ENGINEERING = 1)
matter = list(MAT_STEEL = 3750)
desc = "The most basic of mining drills, for short excavations and small mineral extractions."
drill_verb = "drilling"
/obj/item/weapon/pickaxe/advdrill
name = "advanced mining drill" // Can dig sand as well! name = "advanced mining drill" // Can dig sand as well!
icon_state = "handdrill" icon_state = "advdrill"
item_state = "jackhammer" item_state = "jackhammer"
digspeed = 30 digspeed = 30
sand_dig = TRUE sand_dig = TRUE
origin_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) origin_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2)
matter = list(MAT_STEEL = 4000, MAT_PLASTEEL = 2500)
desc = "Yours is the drill that will pierce through the rock walls." desc = "Yours is the drill that will pierce through the rock walls."
drill_verb = "drilling" drill_verb = "drilling"
/obj/item/weapon/pickaxe/diamonddrill //When people ask about the badass leader of the mining tools, they are talking about ME!
name = "diamond mining drill"
icon_state = "diamonddrill"
item_state = "jackhammer"
digspeed = 5 //Digs through walls, girders, and can dig up sand
sand_dig = TRUE
origin_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 5)
matter = list(MAT_STEEL = 4500, MAT_PLASTEEL = 3000, MAT_DIAMONDS = 1000)
desc = "Yours is the drill that will pierce the heavens!"
drill_verb = "drilling"
/obj/item/weapon/pickaxe/jackhammer /obj/item/weapon/pickaxe/jackhammer
name = "sonic jackhammer" name = "sonic jackhammer"
icon_state = "jackhammer" icon_state = "jackhammer"
@@ -58,56 +101,33 @@
desc = "Cracks rocks with sonic blasts, perfect for killing cave lizards." desc = "Cracks rocks with sonic blasts, perfect for killing cave lizards."
drill_verb = "hammering" drill_verb = "hammering"
/obj/item/weapon/pickaxe/gold /obj/item/weapon/pickaxe/borgdrill
name = "golden pickaxe" name = "jackhammer"
icon_state = "gpickaxe" icon_state = "borg_pick"
item_state = "gpickaxe" item_state = "jackhammer"
digspeed = 20 digspeed = 15
origin_tech = list(TECH_MATERIAL = 4) sand_dig = TRUE
desc = "This makes no metallurgic sense." desc = "Cracks rocks with a hardened pneumatic bit."
drill_verb = "picking" drill_verb = "hammering"
/obj/item/weapon/pickaxe/plasmacutter /obj/item/weapon/pickaxe/plasmacutter
name = "plasma cutter" name = "plasma cutter"
desc = "A rock cutter that uses bursts of hot plasma. You could use it to cut limbs off of xenos! Or, you know, mine stuff."
icon_state = "plasmacutter" icon_state = "plasmacutter"
item_state = "gun" item_state = "plasmacutter"
w_class = ITEMSIZE_NORMAL //it is smaller than the pickaxe w_class = ITEMSIZE_NORMAL //it is smaller than the pickaxe
damtype = "fire" damtype = "fire"
digspeed = 20 //Can slice though normal walls, all girders, or be used in reinforced wall deconstruction/ light thermite on fire digspeed = 20 //Can slice though normal walls, all girders, or be used in reinforced wall deconstruction/light thermite on fire
origin_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3) origin_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3)
desc = "A rock cutter that uses bursts of hot plasma. You could use it to cut limbs off of xenos! Or, you know, mine stuff." matter = list(MAT_STEEL = 3000, MAT_PLASTEEL = 1500, MAT_DIAMONDS = 500, MAT_PHORON = 500)
drill_verb = "cutting" drill_verb = "cutting"
drill_sound = 'sound/items/Welder.ogg' drill_sound = 'sound/items/Welder.ogg'
sharp = TRUE sharp = TRUE
edge = TRUE edge = TRUE
/obj/item/weapon/pickaxe/diamond /obj/item/weapon/pickaxe/plasmacutter/borg
name = "diamond pickaxe" name = "mounted plasma cutter"
icon_state = "dpickaxe" icon_state = "pcutter_borg"
item_state = "dpickaxe"
digspeed = 10
origin_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 4)
desc = "A pickaxe with a diamond pick head."
drill_verb = "picking"
/obj/item/weapon/pickaxe/diamonddrill //When people ask about the badass leader of the mining tools, they are talking about ME!
name = "diamond mining drill"
icon_state = "diamonddrill"
item_state = "jackhammer"
digspeed = 5 //Digs through walls, girders, and can dig up sand
sand_dig = TRUE
origin_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 5)
desc = "Yours is the drill that will pierce the heavens!"
drill_verb = "drilling"
/obj/item/weapon/pickaxe/borgdrill
name = "enhanced sonic jackhammer"
icon_state = "jackhammer"
item_state = "jackhammer"
digspeed = 15
sand_dig = TRUE
desc = "Cracks rocks with sonic blasts. This one seems like an improved design."
drill_verb = "hammering"
/*****************************Shovel********************************/ /*****************************Shovel********************************/
@@ -116,10 +136,10 @@
desc = "A large tool for digging and moving dirt." desc = "A large tool for digging and moving dirt."
icon = 'icons/obj/items.dmi' icon = 'icons/obj/items.dmi'
icon_state = "shovel" icon_state = "shovel"
item_state = "shovel"
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
force = 8.0 force = 8.0
throwforce = 4.0 throwforce = 4.0
item_state = "shovel"
w_class = ITEMSIZE_NORMAL w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
matter = list(MAT_STEEL = 50) matter = list(MAT_STEEL = 50)
@@ -169,16 +189,6 @@
sharp = 0 sharp = 0
edge = 1 edge = 1
/**********************Mining car (Crate like thing, not the rail car)**************************/
/obj/structure/closet/crate/miningcar
desc = "A mining car. This one doesn't work on rails, but has to be dragged."
name = "Mining car (not for rails)"
icon = 'icons/obj/closets/miningcar.dmi'
density = TRUE
// Flags. // Flags.
/obj/item/stack/flag /obj/item/stack/flag

View File

@@ -1,30 +1,35 @@
//upgrades the speed of all drills and pickaxes. //upgrades the speed of all drills and pickaxes.
//Pickaxes
/obj/item/weapon/pickaxe /obj/item/weapon/pickaxe
digspeed = 36 digspeed = 36
/obj/item/weapon/pickaxe/silver /obj/item/weapon/pickaxe/silver
digspeed = 27 digspeed = 27
/obj/item/weapon/pickaxe/diamond
digspeed = 9
/obj/item/weapon/pickaxe/gold
digspeed = 18
//Drills
/obj/item/weapon/pickaxe/drill /obj/item/weapon/pickaxe/drill
digspeed = 30
/obj/item/weapon/pickaxe/advdrill
digspeed = 27 digspeed = 27
/obj/item/weapon/pickaxe/jackhammer /obj/item/weapon/pickaxe/jackhammer
digspeed = 18 digspeed = 18
destroy_artefacts = TRUE destroy_artefacts = TRUE
/obj/item/weapon/pickaxe/gold
digspeed = 18
/obj/item/weapon/pickaxe/plasmacutter
digspeed = 18
/obj/item/weapon/pickaxe/diamond
digspeed = 9
/obj/item/weapon/pickaxe/diamonddrill /obj/item/weapon/pickaxe/diamonddrill
digspeed = 4 digspeed = 4
/obj/item/weapon/pickaxe/borgdrill /obj/item/weapon/pickaxe/borgdrill
digspeed = 13 digspeed = 13
destroy_artefacts = TRUE destroy_artefacts = TRUE
/obj/item/weapon/pickaxe/plasmacutter
digspeed = 18

View File

@@ -2,7 +2,7 @@ var/global/list/prevent_respawns = list()
/hook/death/proc/quit_notify(mob/dead) /hook/death/proc/quit_notify(mob/dead)
if(ishuman(dead)) if(ishuman(dead))
to_chat(dead,"<span class='notice'>You're dead! If you died as a result of vore, and no longer have a body (due to digestion), use the Auto Resleever! One can be found by using the verb in the Ghost tab. If you died to other means, wait for rescue or use the 'Notify Transcore' verb in the Ghost tab if you have a valid backup implant. If it's been 30 minutes and you're still dead, use the Auto Resleever! If you don't intend to continue playing this round as this character, please use the <b>Quit This Round</b> verb in the OOC tab to free your job slot.</span>") to_chat(dead,"<span class='notice'>You're dead! If you don't intend to continue playing this round as this character, please use the <b>Quit This Round</b> verb in the OOC tab to free your job slot. Otherwise, you can use the <b>Notify Transcore</b> verb to let medical know you need resleeving, or <b>Find Auto Resleever</b> verb to be taken to an auto resleever, which you can click on to be resleeved automatically after a time.</span>")
return TRUE return TRUE

View File

@@ -202,6 +202,23 @@ var/list/slot_equipment_priority = list( \
drop_from_inventory(I, target) drop_from_inventory(I, target)
return TRUE return TRUE
//visibly unequips I but it is NOT MOVED AND REMAINS IN SRC
//item MUST BE FORCEMOVE'D OR QDEL'D
/mob/proc/temporarilyRemoveItemFromInventory(obj/item/I, force = FALSE, idrop = TRUE)
return u_equip(I, force, null, TRUE, idrop)
///sometimes we only want to grant the item's action if it's equipped in a specific slot.
/obj/item/proc/item_action_slot_check(slot, mob/user)
if(slot == SLOT_BACK || slot == LEGS) //these aren't true slots, so avoid granting actions there
return FALSE
return TRUE
///Get the item on the mob in the storage slot identified by the id passed in
/mob/proc/get_item_by_slot(slot_id)
return null
/mob/proc/getBackSlot()
return SLOT_BACK
//Attemps to remove an object on a mob. //Attemps to remove an object on a mob.
/mob/proc/remove_from_mob(var/obj/O, var/atom/target) /mob/proc/remove_from_mob(var/obj/O, var/atom/target)

View File

@@ -127,7 +127,7 @@
. += shoes.slowdown . += shoes.slowdown
//VOREStation Addition Start //VOREStation Addition Start
if(buckled && istype(buckled, /obj/machinery/power/rtg/d_type_reg)) if(buckled && istype(buckled, /obj/machinery/power/rtg/reg))
. += shoes.slowdown . += shoes.slowdown
//VOREStation Addition End //VOREStation Addition End

View File

@@ -144,14 +144,14 @@
) )
heat_discomfort_level = 295 heat_discomfort_level = 320 //VOREStation Edit - 46c (higher than normal humans) Don't spam red text if you're slightly warm.
heat_discomfort_strings = list( heat_discomfort_strings = list(
"You feel soothingly warm.", "You feel soothingly warm.",
"You feel the heat sink into your bones.", "You feel the heat sink into your bones.",
"You feel warm enough to take a nap." "You feel warm enough to take a nap."
) )
cold_discomfort_level = 292 cold_discomfort_level = 288.15 //VOREStation Edit - 15c Give a little bit of wiggle room here come on.
cold_discomfort_strings = list( cold_discomfort_strings = list(
"You feel chilly.", "You feel chilly.",
"You feel sluggish and cold.", "You feel sluggish and cold.",

View File

@@ -62,7 +62,7 @@
category = 0 category = 0
custom_only = FALSE custom_only = FALSE
// CHOMPEdits Start - Adding Xenochimera traits. TODO - Port these to VORE. /* // Commented out in lieu of finding a better solution.
/datum/trait/neutral/coldadapt/xenochimera /datum/trait/neutral/coldadapt/xenochimera
sort = TRAIT_SORT_SPECIES sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA) allowed_species = list(SPECIES_XENOCHIMERA)
@@ -73,7 +73,7 @@
can_take = ORGANICS // (Not sure if this is needed for Xenochimera-specific sub-version.) can_take = ORGANICS // (Not sure if this is needed for Xenochimera-specific sub-version.)
custom_only = FALSE custom_only = FALSE
excludes = list(/datum/trait/neutral/hotadapt, /datum/trait/neutral/hotadapt/xenochimera) excludes = list(/datum/trait/neutral/hotadapt, /datum/trait/neutral/hotadapt/xenochimera)
/datum/trait/neutral/hotadapt/xenochimera /datum/trait/neutral/hotadapt/xenochimera
sort = TRAIT_SORT_SPECIES sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA) allowed_species = list(SPECIES_XENOCHIMERA)
@@ -84,7 +84,8 @@
can_take = ORGANICS // negates the need for suit coolers entirely for synths, so no. (Not sure if this is needed for Xenochimera-specific sub-version.) can_take = ORGANICS // negates the need for suit coolers entirely for synths, so no. (Not sure if this is needed for Xenochimera-specific sub-version.)
custom_only = FALSE custom_only = FALSE
excludes = list(/datum/trait/neutral/coldadapt, /datum/trait/neutral/coldadapt/xenochimera) excludes = list(/datum/trait/neutral/coldadapt, /datum/trait/neutral/coldadapt/xenochimera)
*/
/datum/trait/neutral/autohiss_unathi/xenochimera /datum/trait/neutral/autohiss_unathi/xenochimera
sort = TRAIT_SORT_SPECIES sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA) allowed_species = list(SPECIES_XENOCHIMERA)
@@ -133,4 +134,4 @@
"r" = list("rk") "r" = list("rk")
), ),
autohiss_exempt = list("Vespinae")) autohiss_exempt = list("Vespinae"))
excludes = list(/datum/trait/neutral/autohiss_tajaran, /datum/trait/neutral/autohiss_unathi) excludes = list(/datum/trait/neutral/autohiss_tajaran, /datum/trait/neutral/autohiss_unathi)

View File

@@ -430,7 +430,7 @@ var/global/list/robot_modules = list(
src.emag = new /obj/item/weapon/melee/baton/robot/arm(src) src.emag = new /obj/item/weapon/melee/baton/robot/arm(src)
src.modules += new /obj/item/device/geiger(src) src.modules += new /obj/item/device/geiger(src)
src.modules += new /obj/item/weapon/rcd/electric/mounted/borg(src) src.modules += new /obj/item/weapon/rcd/electric/mounted/borg(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) src.modules += new /obj/item/weapon/pickaxe/plasmacutter/borg(src)
src.modules += new /obj/item/weapon/gripper/no_use/loader(src) src.modules += new /obj/item/weapon/gripper/no_use/loader(src)
var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000) var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000)
@@ -757,7 +757,7 @@ var/global/list/robot_modules = list(
src.emag = new /obj/item/weapon/kinetic_crusher/machete/dagger(src) src.emag = new /obj/item/weapon/kinetic_crusher/machete/dagger(src)
// No reason for these, upgrade modules replace them. // No reason for these, upgrade modules replace them.
//src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) //src.emag = new /obj/item/weapon/pickaxe/plasmacutter/borg(src)
//src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src) //src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src)
/obj/item/weapon/robot_module/robot/research /obj/item/weapon/robot_module/robot/research
@@ -852,7 +852,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/device/flash(src)
//src.modules += new /obj/item/borg/sight/thermal(src) // VOREStation Edit //src.modules += new /obj/item/borg/sight/thermal(src) // VOREStation Edit
src.modules += new /obj/item/weapon/gun/energy/laser/mounted(src) src.modules += new /obj/item/weapon/gun/energy/laser/mounted(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) src.modules += new /obj/item/weapon/pickaxe/plasmacutter/borg(src)
src.modules += new /obj/item/borg/combat/shield(src) src.modules += new /obj/item/borg/combat/shield(src)
src.modules += new /obj/item/borg/combat/mobility(src) src.modules += new /obj/item/borg/combat/mobility(src)
src.emag = new /obj/item/weapon/gun/energy/lasercannon/mounted(src) src.emag = new /obj/item/weapon/gun/energy/lasercannon/mounted(src)
@@ -887,7 +887,7 @@ var/global/list/robot_modules = list(
robot.internals = new/obj/item/weapon/tank/jetpack/carbondioxide(src) robot.internals = new/obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += robot.internals src.modules += robot.internals
src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) src.emag = new /obj/item/weapon/pickaxe/plasmacutter/borg(src)
src.emag.name = "Plasma Cutter" src.emag.name = "Plasma Cutter"
var/datum/matter_synth/metal = new /datum/matter_synth/metal(25000) var/datum/matter_synth/metal = new /datum/matter_synth/metal(25000)

View File

@@ -2,7 +2,7 @@
/datum/category_item/catalogue/fauna/catslug /datum/category_item/catalogue/fauna/catslug
name = "Alien Wildlife - Catslug" name = "Alien Wildlife - Catslug"
desc = "The catslug is an omnivorous terrestrial creature.\ desc = "The Catslug is an omnivorous terrestrial creature.\
Exhibiting properties of both a cat and a slug (hence its name)\ Exhibiting properties of both a cat and a slug (hence its name)\
it moves somewhat awkwardly. However, the unique qualities of\ it moves somewhat awkwardly. However, the unique qualities of\
its body make it exceedingly flexible and smooth, allowing it to\ its body make it exceedingly flexible and smooth, allowing it to\
@@ -16,7 +16,7 @@
/mob/living/simple_mob/vore/alienanimals/catslug /mob/living/simple_mob/vore/alienanimals/catslug
name = "catslug" name = "catslug"
desc = "A noodley bodied creature with thin arms and legs, and gloomy dark eyes." desc = "A noodley bodied creature with thin arms and legs, and gloomy dark eyes."
tt_desc = "Mollusca Feline" tt_desc = "Mollusca Feline"
icon_state = "catslug" icon_state = "catslug"
icon_living = "catslug" icon_living = "catslug"
icon_dead = "catslug_dead" icon_dead = "catslug_dead"
@@ -48,7 +48,7 @@
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/catslug ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/catslug
say_list_type = /datum/say_list/catslug say_list_type = /datum/say_list/catslug
player_msg = "You have escaped the foul weather, into this much more pleasant place. You are an intelligent creature capable of more than most think. You can pick up and use many things, and even carry some of them with you into the vents, which you can use to move around quickly. You're quiet and capable, you speak with your hands and your deeds! <br>- - - - -<br> <span class='notice'>Keep in mind, your goal should generally be to survive. You're expected to follow the same rules as everyone else, so don't go self antagging without permission from the staff team, but you are able and capable of defending yourself from those who would attack you for no reason.</span>" player_msg = "You have escaped the foul weather, into this much more pleasant place. You are an intelligent creature capable of more than most think. You can pick up and use many things, and even carry some of them with you into the vents, which you can use to move around quickly. You're quiet and capable, you speak with your hands and your deeds! <br>- - - - -<br> <span class='notice'>Keep in mind, your goal should generally be to survive. You're expected to follow the same rules as everyone else, so don't go self antagging without permission from the staff team, but you are able and capable of defending yourself from those who would attack you for no reason.</span>"
has_langs = list("Sign Language") has_langs = list("Sign Language")
var/picked_color = FALSE var/picked_color = FALSE
@@ -160,9 +160,9 @@
if(user != src) if(user != src)
to_chat(user, "<span class='notice'>\The [user] feeds \the [O] to you.</span>") to_chat(user, "<span class='notice'>\The [user] feeds \the [O] to you.</span>")
playsound(src, 'sound/items/eatfood.ogg', 75, 1) playsound(src, 'sound/items/eatfood.ogg', 75, 1)
/mob/living/simple_mob/vore/alienanimals/catslug/attack_hand(mob/living/carbon/human/M as mob) /mob/living/simple_mob/vore/alienanimals/catslug/attack_hand(mob/living/carbon/human/M as mob)
if(stat == DEAD) if(stat == DEAD)
return ..() return ..()
if(M.a_intent != I_HELP) if(M.a_intent != I_HELP)
@@ -211,7 +211,7 @@
else else
return ..() return ..()
/mob/living/simple_mob/vore/alienanimals/catslug/Login() //If someone plays as us let's just be a passive mob in case accidents happen if the player D/Cs /mob/living/simple_mob/vore/alienanimals/catslug/Login() //If someone plays as us let's just be a passive mob in case accidents happen if the player D/Cs
. = ..() . = ..()
ai_holder.hostile = FALSE ai_holder.hostile = FALSE
ai_holder.wander = FALSE ai_holder.wander = FALSE
@@ -227,6 +227,7 @@
if(newcolor) if(newcolor)
color = newcolor color = newcolor
picked_color = TRUE picked_color = TRUE
update_icon()
/datum/ai_holder/simple_mob/melee/evasive/catslug/proc/consider_awakening() /datum/ai_holder/simple_mob/melee/evasive/catslug/proc/consider_awakening()
if(holder.resting) if(holder.resting)
@@ -240,7 +241,7 @@
holder.lay_down() holder.lay_down()
go_sleep() go_sleep()
addtimer(CALLBACK(src, .proc/consider_awakening), rand(1 MINUTE, 5 MINUTES), TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) addtimer(CALLBACK(src, .proc/consider_awakening), rand(1 MINUTE, 5 MINUTES), TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
else else
return ..() return ..()
@@ -307,12 +308,12 @@
holder_type = /obj/item/weapon/holder/catslug/spaceslug holder_type = /obj/item/weapon/holder/catslug/spaceslug
makes_dirt = 0 makes_dirt = 0
say_list_type = /datum/say_list/catslug/spaceslug say_list_type = /datum/say_list/catslug/spaceslug
minbodytemp = 0 // Shamelessly stolen temp & atmos tolerances from the space cat. minbodytemp = 0 // Shamelessly stolen temp & atmos tolerances from the space cat.
maxbodytemp = 900 maxbodytemp = 900
heat_damage_per_tick = 3 heat_damage_per_tick = 3
cold_damage_per_tick = 2 cold_damage_per_tick = 2
min_oxy = 0 min_oxy = 0
max_oxy = 0 max_oxy = 0
min_tox = 0 min_tox = 0
@@ -321,9 +322,9 @@
max_co2 = 0 max_co2 = 0
min_n2 = 0 min_n2 = 0
max_n2 = 0 max_n2 = 0
player_msg = "You are an intelligent creature capable of more than most think, clad in a spacesuit that protects you from the ravages of vacuum and hostile atmospheres alike. You can pick up and use many things, and even carry some of them with you into the vents, which you can use to move around quickly. You're quiet and capable, you speak with your hands and your deeds! <br>- - - - -<br> <span class='notice'>Keep in mind, your goal should generally be to survive. You're expected to follow the same rules as everyone else, so don't go self antagging without permission from the staff team, but you are able and capable of defending yourself from those who would attack you for no reason.</span>" player_msg = "You are an intelligent creature capable of more than most think, clad in a spacesuit that protects you from the ravages of vacuum and hostile atmospheres alike. You can pick up and use many things, and even carry some of them with you into the vents, which you can use to move around quickly. You're quiet and capable, you speak with your hands and your deeds! <br>- - - - -<br> <span class='notice'>Keep in mind, your goal should generally be to survive. You're expected to follow the same rules as everyone else, so don't go self antagging without permission from the staff team, but you are able and capable of defending yourself from those who would attack you for no reason.</span>"
has_langs = list("Sign Language") has_langs = list("Sign Language")
/datum/say_list/catslug/spaceslug /datum/say_list/catslug/spaceslug
@@ -332,11 +333,11 @@
/mob/living/simple_mob/vore/alienanimals/catslug/spaceslug/Initialize() /mob/living/simple_mob/vore/alienanimals/catslug/spaceslug/Initialize()
. = ..() . = ..()
verbs += /mob/living/proc/ventcrawl verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide verbs += /mob/living/proc/hide
verbs -= /mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color //I don't even want to imagine what the colour change proc would do to their sprite, not to mention ghosts would need to be forced into the catslug so this is more just a safety net than anything verbs -= /mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color //I don't even want to imagine what the colour change proc would do to their sprite, not to mention ghosts would need to be forced into the catslug so this is more just a safety net than anything
/mob/living/simple_mob/vore/alienanimals/catslug/spaceslug/attack_hand(mob/living/carbon/human/M as mob) /mob/living/simple_mob/vore/alienanimals/catslug/spaceslug/attack_hand(mob/living/carbon/human/M as mob)
if(stat == DEAD) if(stat == DEAD)
return ..() return ..()
if(M.a_intent != I_HELP) if(M.a_intent != I_HELP)
@@ -387,4 +388,444 @@
/obj/item/weapon/holder/catslug/spaceslug /obj/item/weapon/holder/catslug/spaceslug
item_state = "spaceslug" item_state = "spaceslug"
//Engineer catslug
/datum/category_item/catalogue/fauna/catslug/engislug
name = "Alien Wildlife - Catslug - Engineer O'Brimn"
desc = "A resident worker at the NSB Rascal's Pass, Engineer O'Brimn \
keeps the facilities pipework and machinery maintained between shifts. - \
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 //Local catslugs worth less than rarer ones
/mob/living/simple_mob/vore/alienanimals/catslug/engislug
name = "Engineer O'Brimn"
desc = "A yellow-furred noodley bodied creature with thin arms and legs, and gloomy dark eyes. This one seems to be wearing a too-big high visibility vest and a full-face hardhat."
tt_desc = "Mollusca Felis Munitor"
icon_state = "engislug"
icon_living = "engislug"
icon_rest = "engislug_rest"
icon_dead = "engislug_dead"
digestable = 0
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/engislug)
holder_type = /obj/item/weapon/holder/catslug/engislug
makes_dirt = 0
say_list_type = /datum/say_list/catslug/engislug
minbodytemp = 200
maxbodytemp = 600 //engislug can survive a little heat, as a treat
heat_damage_per_tick = 1
cold_damage_per_tick = 2
min_oxy = 16 //Require atleast 16kPA oxygen
max_oxy = 0
min_tox = 0 //should still suffer hypoxia, but the mask ought to filter out not-nice gases for them
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
has_langs = list("Sign Language")
/datum/say_list/catslug/engislug
speak = list("Have any porl?", "What is that?", "Phoroncheck!", "Thump is mean work fine!", "What are you doing?", "How did you get here?", "Don't breathe in the spicy purple.", "Zap-zap ball bad.", "WAOW!", "The pipes make sense.")
/mob/living/simple_mob/vore/alienanimals/catslug/engislug/Initialize()
. = ..()
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
verbs -= /mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color //I don't even want to imagine what the colour change proc would do to their sprite, not to mention ghosts would need to be forced into the catslug so this is more just a safety net than anything
/mob/living/simple_mob/vore/alienanimals/catslug/engislug/attack_hand(mob/living/carbon/human/M as mob)
if(stat == DEAD)
return ..()
if(M.a_intent != I_HELP)
return ..()
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
if(resting)
M.visible_message("<span class='notice'>\The [M.name] shakes \the [src] awake from their nap.</span>","<span class='notice'>You shake \the [src] awake!</span>")
lay_down()
ai_holder.go_wake()
return
if(M.zone_sel.selecting == BP_HEAD)
M.visible_message( \
"<span class='notice'>[M] pats \the [src] on their helmet.</span>", \
"<span class='notice'>You pat \the [src] on their helmet.</span>", )
if(client)
return
if(prob(10))
visible_message("<span class='notice'>\The [src] purrs and leans into [M]'s hand.</span>")
else if(M.zone_sel.selecting == BP_R_HAND || M.zone_sel.selecting == BP_L_HAND)
M.visible_message( \
"<span class='notice'>[M] shakes \the [src]'s hand.</span>", \
"<span class='notice'>You shake \the [src]'s hand.</span>", )
if(client)
return
if(prob(10))
visible_message("<span class='notice'>\The [src]'s looks a little confused and bonks their helmet's faceplate against [M]'s hand experimentally, attempting to nibble at it.</span>")
else if(M.zone_sel.selecting == "mouth")
M.visible_message( \
"<span class='notice'>[M] attempts to boop \the [src]'s nose, defeated only by the helmet they wear.</span>", \
"<span class='notice'>You attempt to boop \the [src] on the nose, stopped only by that helmet they wear.</span>", )
if(client)
return
if(prob(10))
visible_message("<span class='notice'>\The [src]'s eyes widen as they stare at [M]. After a moment they rub at the faint mark [M]'s digit left upon the surface of their helmet's faceplate.</span>")
else if(M.zone_sel.selecting == BP_GROIN)
M.visible_message( \
"<span class='notice'>[M] rubs \the [src]'s tummy...</span>", \
"<span class='notice'>You rub \the [src]'s tummy... You feel the danger.</span>", )
if(client)
return
visible_message("<span class='notice'>\The [src] pushes [M]'s hand away from their tummy and furrows their brow!</span>")
if(prob(5))
ai_holder.target = M
ai_holder.track_target_position()
ai_holder.set_stance(STANCE_FIGHT)
else
return ..()
/obj/item/weapon/holder/catslug/engislug
item_state = "engislug"
//Security catslug
/datum/category_item/catalogue/fauna/catslug/gatslug
name = "Alien Wildlife - Catslug - Officer Gatslug"
desc = "A resident worker at the NSB Rascal's Pass, Officer Gatslug \
served with distinction during upheaval at the NSB Adephagia in 2321. \
After their recovery from the wreckage afterwards, they were awarded \
several commendations and an offer to serve aboard the latest NT venture \
in the Virgo-Erigone system. - \
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 //Local catslugs worth less than rarer ones
/mob/living/simple_mob/vore/alienanimals/catslug/gatslug
name = "Officer Gatslug"
desc = "A light red-furred noodley bodied creature with thin arms and legs, and gloomy dark eyes. This one seems to be wearing a security cap, bandolier and holobadge."
tt_desc = "Mollusca Felis Magistratus"
icon_state = "gatslug"
icon_living = "gatslug"
icon_rest = "gatslug_rest"
icon_dead = "gatslug_dead"
digestable = 0
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/gatslug)
holder_type = /obj/item/weapon/holder/catslug/gatslug
maxHealth = 75
health = 75
makes_dirt = 0
say_list_type = /datum/say_list/catslug/gatslug
melee_damage_upper = 10 //"Trained" security member, so they can hit that little bit harder
armor = list(
"melee" = 15,
"bullet" = 0,
"laser" = 0,
"energy" = 0,
"bomb" = 0,
"bio" = 0,
"rad" = 0
) //Similarly, \some\ armour values for a smidge more survivability compared to other catslugs.
has_langs = list("Sign Language")
/datum/say_list/catslug/gatslug
speak = list("Have any flashbangs?", "Valids!", "Heard spiders?", "What is that?", "Freeze!", "What are you doing?", "How did you get here?", "Red alert means big bangsticks.", "No being naughty now.", "WAOW!", "Who ate all the donuts?")
/mob/living/simple_mob/vore/alienanimals/catslug/gatslug/Initialize()
. = ..()
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
verbs -= /mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color //I don't even want to imagine what the colour change proc would do to their sprite, not to mention ghosts would need to be forced into the catslug so this is more just a safety net than anything
/obj/item/weapon/holder/catslug/gatslug
item_state = "gatslug"
//Medical catslug
/datum/category_item/catalogue/fauna/catslug/medislug
name = "Alien Wildlife - Catslug - Doctor Mlemulon"
desc = "A resident worker at the NSB Rascal's Pass, Doctor Mlemulon \
works hard to drink and eat all the remaining medicine stocks in \
the smartfridge after the end of a shift. Rumour has it they have \
a side business of trading advanced surgical tools for \"tasty yummers\" too. - \
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 //Local catslugs worth less than rarer ones
/mob/living/simple_mob/vore/alienanimals/catslug/medislug
name = "Doctor Mlemulon"
desc = "A pale blue-furred noodley bodied creature with thin arms and legs, and gloomy dark eyes. This one appears to have a nurses hat perched upon it's head and a medi-hud."
tt_desc = "Mollusca Felis Medicus"
icon_state = "medislug"
icon_living = "medislug"
icon_rest = "medislug_rest"
icon_dead = "medislug_dead"
digestable = 0
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/medislug)
holder_type = /obj/item/weapon/holder/catslug/medislug
makes_dirt = 0
say_list_type = /datum/say_list/catslug/medislug
has_langs = list("Sign Language")
/datum/say_list/catslug/medislug
speak = list("Have any osteodaxon?", "What is that?", "Suit sensors!", "What are you doing?", "How did you get here?", "Put a mask on!", "No smoking!", "WAOW!", "Stop getting blood everywhere!", "WHERE IN MAINT?")
/mob/living/simple_mob/vore/alienanimals/catslug/medislug/Initialize()
. = ..()
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
verbs -= /mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color //I don't even want to imagine what the colour change proc would do to their sprite, not to mention ghosts would need to be forced into the catslug so this is more just a safety net than anything
/obj/item/weapon/holder/catslug/medislug
item_state = "medislug"
//Science catslug
/datum/category_item/catalogue/fauna/catslug/scienceslug
name = "Alien Wildlife - Catslug - Professor Nubbins"
desc = "A resident worker at the NSB Rascal's Pass, Professor Nubbins \
is tasked with the periodic maintenance of the R&D servers. \
Unfortunately, they take this to mean \"wipe all stored research\". - \
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 //Local catslugs worth less than rarer ones
/mob/living/simple_mob/vore/alienanimals/catslug/scienceslug
name = "Professor Nubbins"
desc = "A purple-furred noodley bodied creature with thin arms and legs, and gloomy dark eyes. This one looks to be wearing a swanky white science beret, as well as a pair of goggles."
tt_desc = "Mollusca Felis Inquisitorem"
icon_state = "scienceslug"
icon_living = "scienceslug"
icon_rest = "scienceslug_rest"
icon_dead = "scienceslug_dead"
digestable = 0
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/scienceslug)
holder_type = /obj/item/weapon/holder/catslug/scienceslug
makes_dirt = 0
say_list_type = /datum/say_list/catslug/scienceslug
has_langs = list("Sign Language")
/datum/say_list/catslug/scienceslug
speak = list("Slimes, squish!", "What is that?", "Smoking in Toxins is not advised.", "What are you doing?", "How did you get here?", "Do not deconstruct the cube!", "WAOW!", "Where are our materials?", "The acid dispenser is not full of juice. Must remember that.")
/mob/living/simple_mob/vore/alienanimals/catslug/scienceslug/Initialize()
. = ..()
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
verbs -= /mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color //I don't even want to imagine what the colour change proc would do to their sprite, not to mention ghosts would need to be forced into the catslug so this is more just a safety net than anything
/obj/item/weapon/holder/catslug/scienceslug
item_state = "scienceslug"
//Cargo catslug
/datum/category_item/catalogue/fauna/catslug/cargoslug
name = "Alien Wildlife - Catslug - Technician Nermley"
desc = "A resident worker at the NSB Rascal's Pass, Technician Nermley \
is something of a mystery. No one is sure where they came from, \
local scuttlebutt is that they just turned up one day and started \
moving crates around. - \
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 //Local catslugs worth less than rarer ones
/mob/living/simple_mob/vore/alienanimals/catslug/cargoslug
name = "Technician Nermley"
desc = "A brown-furred noodley bodied creature with thin arms and legs, and gloomy dark eyes. This one has a flipped-round baseball cap on their head and a pair of black mittens."
tt_desc = "Mollusca Felis Quisquiliae"
icon_state = "cargoslug"
icon_living = "cargoslug"
icon_rest = "cargoslug_rest"
icon_dead = "cargoslug_dead"
digestable = 0
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/cargoslug)
holder_type = /obj/item/weapon/holder/catslug/cargoslug
makes_dirt = 0
say_list_type = /datum/say_list/catslug/cargoslug
has_langs = list("Sign Language")
/datum/say_list/catslug/cargoslug
speak = list("Disposals is not for slip and slide.", "What is that?", "Stamp those manifests!", "What are you doing?", "How did you get here?", "Can order pizza crate?", "WAOW!", "Where are all of our materials?", "Got glubbs?")
/mob/living/simple_mob/vore/alienanimals/catslug/cargoslug/Initialize()
. = ..()
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
verbs -= /mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color //I don't even want to imagine what the colour change proc would do to their sprite, not to mention ghosts would need to be forced into the catslug so this is more just a safety net than anything
/obj/item/weapon/holder/catslug/cargoslug
item_state = "cargoslug"
/mob/living/simple_mob/vore/alienanimals/catslug/suslug
name = "suslug"
desc = "A noodley bodied creature wearing a colorful space suit. Suspicious..."
tt_desc = "Mollusca Felis Amogus"
icon_state = "suslug"
icon_living = "suslug"
icon_rest = "suslug_rest"
icon_dead = "suslug_dead"
var/image/eye_image
var/is_impostor = FALSE
var/kill_cooldown
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/impostor
is_impostor = TRUE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/Initialize()
. = ..()
verbs += /mob/living/simple_mob/vore/alienanimals/catslug/suslug/proc/assussinate
update_icon()
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/update_icon()
..()
update_suslug_eyes()
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/proc/update_suslug_eyes()
cut_overlay(eye_image)
eye_image = image(icon,null,"[icon_state]-eyes")
eye_image.appearance_flags = RESET_COLOR|KEEP_APART|PIXEL_SCALE
add_overlay(eye_image)
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/can_ventcrawl()
if(!is_impostor)
to_chat(src, "<span class='notice'>You are not an impostor! You can't vent!</span>")
return FALSE
.=..()
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/examine(mob/user)
. = ..()
if(istype(user, /mob/living/simple_mob/vore/alienanimals/catslug/suslug))
var/mob/living/simple_mob/vore/alienanimals/catslug/suslug/us = user
if(us.is_impostor)
if(src.is_impostor)
. += "<span class='notice'>They appear to be a fellow impostor!</span>"
else
. += "<span class='notice'>They appear to be a filthy innocent!</span>"
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/proc/assussinate()
set name = "Kill Innocent"
set category = "Abilities"
set desc = "Kill an innocent suslug!"
if(!is_impostor)
to_chat(src, "<span class='notice'>You are not an impostor! You can't kill like that!</span>")
return
if((world.time - kill_cooldown) < 1 MINUTE)
to_chat(src, "<span class='notice'>You cannot kill so soon after previous kill!</span>")
return
var/mob/living/simple_mob/vore/alienanimals/catslug/suslug/target
var/list/victims = list()
for(var/mob/living/simple_mob/vore/alienanimals/catslug/suslug/S in range(1))
if(!S.is_impostor)
victims += S
if(!victims || !victims.len)
to_chat(src, "<span class='warning'>There are no innocent suslugs nearby!</span>")
return
if(victims.len == 1)
target = victims[1]
else
target = tgui_input_list(usr, "Kill", "Pick a victim", victims)
if(target && istype(target))
target.adjustBruteLoss(3000)
visible_message("<span class='warning'>\The [src] kills \the [target]!</span>")
kill_cooldown = world.time
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color
picked_color = TRUE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/white
color = COLOR_WHITE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/red
color = COLOR_RED
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/blue
color = COLOR_BLUE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/lime
color = COLOR_LIME
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/cyan
color = COLOR_CYAN
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/pink
color = COLOR_PINK
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/yellow
color = COLOR_YELLOW
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/orange
color = COLOR_ORANGE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/green
color = COLOR_GREEN
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/violet
color = COLOR_VIOLET
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/orange
color = COLOR_ORANGE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/brown
color = COLOR_DARK_BROWN
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/grey
color = COLOR_GRAY
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/black
color = COLOR_DARK_GRAY
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/beige
color = COLOR_BEIGE
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/maroon
color = COLOR_MAROON
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/navy
color = COLOR_NAVY
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/light_pink
color = COLOR_LIGHT_PINK
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/color/light_yellow
color = COLOR_WHEAT

View File

@@ -1,7 +1,16 @@
/datum/category_item/catalogue/fauna/skeleton /datum/category_item/catalogue/fauna/skeleton
name = "Alien Wildlife - Space Skeleton" name = "Alien Wildlife - Space Skeleton"
desc = "A creature consisting primarily of what appears to be bones with no apparent connective tissue, muscle, or organs.\ desc = "Classification: Sentientis osseous\
It is not clear at all how this creature even operates." <br><br>\
No one, not scientist or wildlife expert can properly explain these spacial skeletons with any solid \
certanty. They are not human, despite the clear simularites to a human's skeleton, nor are they made of \
calcium like normal bones. Samples taken from the corpses of these strange creatures have yieled little \
in the form of answers and have only raised more questions with regards to their general existence. \
Scientist are still studying these beings, a difficult task as they are difficult to come by in the \
vaccum of space. The only information that scientist are able to gather about these so-called 'Space \
Skeletons' as people have come to call them is that their structure is comprised of a strange cell \
structure that is similar to plants - likely because these creatures are known to feed of the UV \
rays of nearby stars."
value = CATALOGUER_REWARD_MEDIUM value = CATALOGUER_REWARD_MEDIUM
/mob/living/simple_mob/vore/alienanimals/skeleton /mob/living/simple_mob/vore/alienanimals/skeleton
@@ -67,6 +76,11 @@
vore_default_contamination_color = "grey" vore_default_contamination_color = "grey"
vore_default_item_mode = IM_DIGEST vore_default_item_mode = IM_DIGEST
/mob/living/simple_mob/vore/alienanimals/skeleton/alt
icon_state = "altskeleton"
icon_living = "altskeleton"
icon_dead = "altskeleton_dead"
/datum/say_list/skeleton /datum/say_list/skeleton
speak = list("Nyeh heh heeeh","NYAAAAHHHH", "Books are the real treasures of the world!", "Why are skeletons so calm? Because nothing gets under their skin.","When does a skeleton laugh? When someone tickels their funny bone!","What is a skeletons favorite mode of transport? A scare-plane.", "What did the skeleton say to the vampire? 'You suck.'","What is a skeletons favorite thing to do with their cell phone? Take skelfies.", "How did the skeleton know the other skeleton was lying? He could see right through him.","Whats a skeletons least favorite room in the house? The living room.", "How much does an elephant skeleton weigh? Skele-tons.", "Why do skeletons drink so much milk? Its good for the bones!", "Where do bad jokes about skeletons belong? In the skelebin.","What does a skeleton use to cut through objects? A shoulder blade.", "What kind of jokes do skeletons tell? Humerus ones.") speak = list("Nyeh heh heeeh","NYAAAAHHHH", "Books are the real treasures of the world!", "Why are skeletons so calm? Because nothing gets under their skin.","When does a skeleton laugh? When someone tickels their funny bone!","What is a skeletons favorite mode of transport? A scare-plane.", "What did the skeleton say to the vampire? 'You suck.'","What is a skeletons favorite thing to do with their cell phone? Take skelfies.", "How did the skeleton know the other skeleton was lying? He could see right through him.","Whats a skeletons least favorite room in the house? The living room.", "How much does an elephant skeleton weigh? Skele-tons.", "Why do skeletons drink so much milk? Its good for the bones!", "Where do bad jokes about skeletons belong? In the skelebin.","What does a skeleton use to cut through objects? A shoulder blade.", "What kind of jokes do skeletons tell? Humerus ones.")
emote_see = list("spins its head around", "shuffles","shambles","practices on the xylophone","drinks some milk","looks at you. Its hollow, bottomless sockets gaze into you greedily.") emote_see = list("spins its head around", "shuffles","shambles","practices on the xylophone","drinks some milk","looks at you. Its hollow, bottomless sockets gaze into you greedily.")

View File

@@ -71,7 +71,7 @@
"rad" = 100 "rad" = 100
) )
loot_list = list(/obj/item/weapon/ore/diamond = 100) loot_list = list(/obj/item/weapon/ore/diamond = 100, /obj/item/weapon/ectoplasm = 3)
speak_emote = list("rumbles") speak_emote = list("rumbles")
@@ -101,14 +101,14 @@
/mob/living/simple_mob/vore/alienanimals/space_ghost/shoot(atom/A) //We're shooting ghosts at people and need them to have the same faction as their parent, okay? /mob/living/simple_mob/vore/alienanimals/space_ghost/shoot(atom/A) //We're shooting ghosts at people and need them to have the same faction as their parent, okay?
if(!projectiletype) if(!projectiletype)
return return
if(A == get_turf(src)) if(A == get_turf(src))
return return
face_atom(A) face_atom(A)
if(reload_count >= reload_max) if(reload_count >= reload_max)
return return
var/mob/living/simple_mob/P = new projectiletype(loc, src) var/mob/living/simple_mob/P = new projectiletype(loc, src)
if(!P) if(!P)
return return
if(needs_reload) if(needs_reload)

View File

@@ -0,0 +1,76 @@
//Base cockroach
/mob/living/simple_mob/animal/passive/cockroach
name = "cockroach"
real_name = "cockroach"
desc = "This station is just crawling with bugs."
tt_desc = "E Blattella germanica"
icon_state = "cockroach"
item_state = "cockroach"
icon_living = "cockroach"
icon_dead = "cockroach_rest" //No real 'dead' sprite
icon_rest = "cockroach_rest"
maxHealth = 1
health = 1
movement_cooldown = 2.5
mob_size = MOB_MINISCULE
pass_flags = PASSTABLE
can_pull_mobs = MOB_PULL_NONE
layer = MOB_LAYER
density = FALSE
response_help = "pokes"
response_disarm = "shoos"
response_harm = "splats"
speak_emote = list("chitters")
//Cockroaches are enviromentally superior
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = 999999
var/squish_chance = 25
//Deletes the body upon death
/mob/living/simple_mob/animal/passive/cockroach/death()
new /obj/effect/decal/cleanable/bug_remains(src.loc)
qdel(src)
//Squish code
/mob/living/simple_mob/animal/passive/cockroach/Crossed(var/atom/movable/AM)
if(ismob(AM))
if(isliving(AM))
var/mob/living/A = AM
if(A.mob_size > MOB_SMALL)
if(prob(squish_chance))
A.visible_message("<span class='notice'>[A] squashed [src].</span>", "<span class='notice'>You squashed [src].</span>")
adjustBruteLoss(1) //kills a normal cockroach
else
visible_message("<span class='notice'>[src] avoids getting crushed.</span>")
else
if(isstructure(AM))
if(prob(squish_chance))
AM.visible_message("<span class='notice'>[src] was crushed under [AM].</span>")
adjustBruteLoss(1)
else
visible_message("<span class='notice'>[src] avoids getting crushed.</span>")
/mob/living/simple_mob/animal/passive/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach.
return
//Custom stain so it's not "spiderling remains"
/obj/effect/decal/cleanable/bug_remains
name = "bug remains"
desc = "Green squishy mess."
icon = 'icons/effects/effects.dmi'
icon_state = "greenshatter"

View File

@@ -47,6 +47,16 @@
icon_dead = "wah_fae_dead" icon_dead = "wah_fae_dead"
icon_rest = "wah_fae_rest" icon_rest = "wah_fae_rest"
/mob/living/simple_mob/vore/redpanda/blue
name = "blue wah"
desc = "Blue, but still cute!"
tt_desc = "Ailurus tribotum"
icon_state = "wah_bloo"
icon_living = "wah_bloo"
icon_dead = "wah_bloo_dead"
icon_rest = "wah_bloo_rest"
vore_ignores_undigestable = 0 // wah don't care you're edible or not, you still go in vore_ignores_undigestable = 0 // wah don't care you're edible or not, you still go in
vore_digest_chance = 0 // instead of digesting if you struggle... vore_digest_chance = 0 // instead of digesting if you struggle...
vore_absorb_chance = 20 // you get to become adorable purple wahpudge. vore_absorb_chance = 20 // you get to become adorable purple wahpudge.

View File

@@ -13,7 +13,7 @@
// Doesn't save much work, but might save a smidge of client work // Doesn't save much work, but might save a smidge of client work
if(our_color == new_color) if(our_color == new_color)
return return
// Visible change // Visible change
our_color = new_color our_color = new_color
sun.set_color(new_color) sun.set_color(new_color)
@@ -22,19 +22,19 @@
// Doesn't save much work, but might save a smidge of client work // Doesn't save much work, but might save a smidge of client work
if(our_brightness == new_brightness) if(our_brightness == new_brightness)
return return
// Store the old for math // Store the old for math
. = our_brightness . = our_brightness
our_brightness = new_brightness our_brightness = new_brightness
// Visible change // Visible change
sun.set_alpha(round(CLAMP01(our_brightness)*255,1)) sun.set_alpha(round(CLAMP01(our_brightness)*255,1))
// Update dynamic lumcount so darksight and stuff works // Update dynamic lumcount so darksight and stuff works
var/difference = . - our_brightness var/difference = . - our_brightness
for(var/turf/T as anything in turfs) for(var/turf/T as anything in turfs)
T.dynamic_lumcount -= difference T.dynamic_lumcount -= difference
/datum/sun_holder/proc/apply_to_turf(turf/T) /datum/sun_holder/proc/apply_to_turf(turf/T)
if(sun in T.vis_contents) if(sun in T.vis_contents)
warning("Was asked to add fake sun to [T.x], [T.y], [T.z] despite already having us in it's vis contents") warning("Was asked to add fake sun to [T.x], [T.y], [T.z] despite already having us in it's vis contents")
@@ -49,21 +49,21 @@
/datum/sun_holder/proc/rainbow() /datum/sun_holder/proc/rainbow()
var/end = world.time + 30 SECONDS var/end = world.time + 30 SECONDS
var/col_index = 1 var/col_index = 1
var/list/colors = list("#ff5d5d","#ffd17b","#ffff5e","#7eff7e","#6868ff","#b753ff","#d08fff","#ffffff") var/list/colors = list("#ff5d5d","#ffd17b","#ffff5e","#7eff7e","#6868ff","#b753ff","#d08fff","#ffffff")
var/original_brightness = sun.alpha/255 var/original_brightness = sun.alpha/255
var/original_color = sun.color var/original_color = sun.color
update_brightness(0.8) update_brightness(0.8)
while(world.time < end) while(world.time < end)
update_color(colors[col_index]) update_color(colors[col_index])
if(++col_index > colors.len) if(++col_index > colors.len)
col_index = 1 col_index = 1
sleep(3) sleep(3)
update_brightness(original_brightness) update_brightness(original_brightness)
update_color(original_color) update_color(original_color)
@@ -75,7 +75,7 @@
mouse_opacity = 0 mouse_opacity = 0
alpha = 0 alpha = 0
color = "#FFFFFF" color = "#FFFFFF"
var/turfs_providing_spreads = list() var/turfs_providing_spreads = list()
var/spreads = list() var/spreads = list()
@@ -112,7 +112,7 @@
T.vis_contents += src T.vis_contents += src
T.dynamic_lumcount += 0.5 T.dynamic_lumcount += 0.5
T.set_luminosity(1, TRUE) T.set_luminosity(1, TRUE)
var/list/localspreads var/list/localspreads
// Test for corners // Test for corners
for(var/direction in cornerdirs) for(var/direction in cornerdirs)
@@ -120,7 +120,7 @@
if(dirturf && !dirturf.is_outdoors()) if(dirturf && !dirturf.is_outdoors())
var/turf/TL = get_step(T, turn(direction, -45)) var/turf/TL = get_step(T, turn(direction, -45))
var/turf/TR = get_step(T, turn(direction, 45)) var/turf/TR = get_step(T, turn(direction, 45))
// If outdoors at 45 degrees are the same, then this is a corner // If outdoors at 45 degrees are the same, then this is a corner
if(TL && TR && TL.is_outdoors() == TR.is_outdoors()) if(TL && TR && TL.is_outdoors() == TR.is_outdoors())
var/atom/movable/sun_visuals_overlap/OL var/atom/movable/sun_visuals_overlap/OL
@@ -132,10 +132,11 @@
OL = spreads["i[direction]"] OL = spreads["i[direction]"]
dirturf.vis_contents += OL dirturf.vis_contents += OL
dirturf.set_luminosity(1) dirturf.set_luminosity(1)
dirturf.outdoors_adjacent = TRUE
LAZYINITLIST(localspreads) LAZYINITLIST(localspreads)
LAZYINITLIST(localspreads[dirturf]) LAZYINITLIST(localspreads[dirturf])
LAZYADD(localspreads[dirturf], OL) LAZYADD(localspreads[dirturf], OL)
// Take all orthagonals // Take all orthagonals
for(var/direction in cardinal) for(var/direction in cardinal)
var/turf/dirturf = get_step(T, direction) var/turf/dirturf = get_step(T, direction)
@@ -148,6 +149,7 @@
var/atom/movable/sun_visuals_overlap/OL = spreads["[direction]"] var/atom/movable/sun_visuals_overlap/OL = spreads["[direction]"]
dirturf.vis_contents += OL dirturf.vis_contents += OL
dirturf.set_luminosity(1) dirturf.set_luminosity(1)
dirturf.outdoors_adjacent = TRUE
LAZYINITLIST(localspreads) LAZYINITLIST(localspreads)
LAZYINITLIST(localspreads[dirturf]) LAZYINITLIST(localspreads[dirturf])
LAZYADD(localspreads[dirturf], OL) LAZYADD(localspreads[dirturf], OL)
@@ -163,6 +165,14 @@
if(LAZYLEN(applied)) if(LAZYLEN(applied))
for(var/turf/old as anything in applied) for(var/turf/old as anything in applied)
old.vis_contents -= applied[old] old.vis_contents -= applied[old]
var/old_lit = FALSE
for(var/direction in alldirs)
var/turf/CT = get_step(old, direction)
if(CT && CT.is_outdoors())
old_lit = TRUE
if(!old_lit)
old.outdoors_adjacent = TRUE
old.set_luminosity(0)
applied -= old applied -= old
turfs_providing_spreads -= T turfs_providing_spreads -= T
applied.Cut() applied.Cut()

View File

@@ -0,0 +1,590 @@
#define VIRGO3C_ONE_ATMOSPHERE 92.5 //kPa
#define VIRGO3C_AVG_TEMP 288.15 //kelvin
#define VIRGO3C_PER_N2 0.78 //percent
#define VIRGO3C_PER_O2 0.21
#define VIRGO3C_PER_N2O 0.00 //Currently no capacity to 'start' a turf with this. See turf.dm
#define VIRGO3C_PER_CO2 0.01
#define VIRGO3C_PER_PHORON 0.00
//Math only beyond this point
#define VIRGO3C_MOL_PER_TURF (VIRGO3C_ONE_ATMOSPHERE*CELL_VOLUME/(VIRGO3C_AVG_TEMP*R_IDEAL_GAS_EQUATION))
#define VIRGO3C_MOL_N2 (VIRGO3C_MOL_PER_TURF * VIRGO3C_PER_N2)
#define VIRGO3C_MOL_O2 (VIRGO3C_MOL_PER_TURF * VIRGO3C_PER_O2)
#define VIRGO3C_MOL_N2O (VIRGO3C_MOL_PER_TURF * VIRGO3C_PER_N2O)
#define VIRGO3C_MOL_CO2 (VIRGO3C_MOL_PER_TURF * VIRGO3C_PER_CO2)
#define VIRGO3C_MOL_PHORON (VIRGO3C_MOL_PER_TURF * VIRGO3C_PER_PHORON)
//Turfmakers
#define VIRGO3C_SET_ATMOS nitrogen=VIRGO3C_MOL_N2;oxygen=VIRGO3C_MOL_O2;carbon_dioxide=VIRGO3C_MOL_CO2;phoron=VIRGO3C_MOL_PHORON;temperature=VIRGO3C_AVG_TEMP
#define VIRGO3C_TURF_CREATE(x) x/virgo3c/nitrogen=VIRGO3C_MOL_N2;x/virgo3c/oxygen=VIRGO3C_MOL_O2;x/virgo3c/carbon_dioxide=VIRGO3C_MOL_CO2;x/virgo3c/phoron=VIRGO3C_MOL_PHORON;x/virgo3c/temperature=VIRGO3C_AVG_TEMP;x/virgo3c/outdoors=TRUE;x/virgo3c/update_graphic(list/graphic_add = null, list/graphic_remove = null) return 0
#define VIRGO3C_TURF_CREATE_UN(x) x/virgo3c/nitrogen=VIRGO3C_MOL_N2;x/virgo3c/oxygen=VIRGO3C_MOL_O2;x/virgo3c/carbon_dioxide=VIRGO3C_MOL_CO2;x/virgo3c/phoron=VIRGO3C_MOL_PHORON;x/virgo3c/temperature=VIRGO3C_AVG_TEMP
var/datum/planet/virgo3c/planet_virgo3c = null
/datum/time/virgo3c
seconds_in_day = 6 HOURS
/datum/planet/virgo3c
name = "Virgo-3c"
desc = "A habitable moon of the gas giant Virgo 3. The volcanic activity of this moon keeps its atmosphere warm enough for life to flourish."
current_time = new /datum/time/virgo3c()
planetary_wall_type = /turf/unsimulated/wall/planetary/virgo3c
/datum/planet/virgo3c/New()
..()
planet_virgo3c = src
weather_holder = new /datum/weather_holder/virgo3c(src)
/datum/planet/virgo3c/update_sun()
..()
var/datum/time/time = current_time
var/length_of_day = time.seconds_in_day / 10 / 60 / 60
var/noon = length_of_day / 2
var/distance_from_noon = abs(text2num(time.show_time("hh")) - noon)
sun_position = distance_from_noon / noon
sun_position = abs(sun_position - 1)
var/low_brightness = null
var/high_brightness = null
var/low_color = null
var/high_color = null
var/min = 0
switch(sun_position)
if(0 to 0.45) // Night
low_brightness = 0.1
low_color = "#000066"
high_brightness = 0.2
high_color = "#66004D"
min = 0
if(0.45 to 0.50) // Twilight
low_brightness = 0.5
low_color = "#66004D"
high_brightness = 0.9
high_color = "#CC3300"
min = 0.40
if(0.50 to 0.55) // Sunrise/set
low_brightness = 0.9
low_color = "#CC3300"
high_brightness = 3.0
high_color = "#FF9933"
min = 0.50
if(0.55 to 1.00) // Noon
low_brightness = 3.0
low_color = "#DDDDDD"
high_brightness = 10.0
high_color = "#FFFFFF"
min = 0.70
var/interpolate_weight = (abs(min - sun_position)) * 4
var/weather_light_modifier = 1
if(weather_holder && weather_holder.current_weather)
weather_light_modifier = weather_holder.current_weather.light_modifier
var/new_brightness = (LERP(low_brightness, high_brightness, interpolate_weight) ) * weather_light_modifier
var/new_color = null
if(weather_holder && weather_holder.current_weather && weather_holder.current_weather.light_color)
new_color = weather_holder.current_weather.light_color
else
var/list/low_color_list = hex2rgb(low_color)
var/low_r = low_color_list[1]
var/low_g = low_color_list[2]
var/low_b = low_color_list[3]
var/list/high_color_list = hex2rgb(high_color)
var/high_r = high_color_list[1]
var/high_g = high_color_list[2]
var/high_b = high_color_list[3]
var/new_r = LERP(low_r, high_r, interpolate_weight)
var/new_g = LERP(low_g, high_g, interpolate_weight)
var/new_b = LERP(low_b, high_b, interpolate_weight)
new_color = rgb(new_r, new_g, new_b)
spawn(1)
update_sun_deferred(new_brightness, new_color)
/datum/weather_holder/virgo3c
temperature = T0C
allowed_weather_types = list(
WEATHER_CLEAR = new /datum/weather/virgo3c/clear(),
WEATHER_OVERCAST = new /datum/weather/virgo3c/overcast(),
WEATHER_LIGHT_SNOW = new /datum/weather/virgo3c/light_snow(),
WEATHER_SNOW = new /datum/weather/virgo3c/snow(),
WEATHER_BLIZZARD = new /datum/weather/virgo3c/blizzard(),
WEATHER_RAIN = new /datum/weather/virgo3c/rain(),
WEATHER_STORM = new /datum/weather/virgo3c/storm(),
WEATHER_HAIL = new /datum/weather/virgo3c/hail(),
WEATHER_BLOOD_MOON = new /datum/weather/virgo3c/blood_moon(),
WEATHER_EMBERFALL = new /datum/weather/virgo3c/emberfall(),
WEATHER_ASH_STORM = new /datum/weather/virgo3c/ash_storm(),
WEATHER_FALLOUT = new /datum/weather/virgo3c/fallout()
)
roundstart_weather_chances = list(
WEATHER_CLEAR = 50,
WEATHER_OVERCAST = 10,
WEATHER_RAIN = 1,
WEATHER_LIGHT_SNOW = 1
)
/datum/weather/virgo3c
name = "virgo3c"
temp_high = 283.15 // 10c
temp_low = 273.15 // 0c
/datum/weather/virgo3c/clear
name = "clear"
transition_chances = list(
WEATHER_CLEAR = 60,
WEATHER_OVERCAST = 20,
WEATHER_LIGHT_SNOW = 1,
WEATHER_BLOODMOON = 1,
WEATHER_EMBERFALL = 0.5)
transition_messages = list(
"The sky clears up.",
"The sky is visible.",
"The weather is calm."
)
sky_visible = TRUE
observed_message = "The sky is clear."
/datum/weather/virgo3c/overcast
name = "overcast"
temp_high = 283.15 // 10c
temp_low = 273.15 // 0c
light_modifier = 0.8
transition_chances = list(
WEATHER_CLEAR = 25,
WEATHER_OVERCAST = 50,
WEATHER_RAIN = 5,
WEATHER_LIGHT_SNOW = 5
)
observed_message = "It is overcast, all you can see are clouds."
transition_messages = list(
"All you can see above are clouds.",
"Clouds cut off your view of the sky.",
"It's very cloudy."
)
/datum/weather/virgo3c/light_snow
name = "light snow"
icon_state = "snowfall_light"
temp_high = 268.15 // -5c
temp_low = 263.15 // -10c
light_modifier = 0.7
transition_chances = list(
WEATHER_LIGHT_SNOW = 75,
WEATHER_OVERCAST = 25,
WEATHER_SNOW = 10,
WEATHER_RAIN = 5
)
observed_message = "It is snowing lightly."
transition_messages = list(
"Small snowflakes begin to fall from above.",
"It begins to snow lightly.",
)
/datum/weather/virgo3c/snow
name = "moderate snow"
icon_state = "snowfall_med"
temp_high = 268.15 // -5c
temp_low = 263.15 // -10c
wind_high = 2
wind_low = 0
light_modifier = 0.5
flight_failure_modifier = 5
transition_chances = list(
WEATHER_SNOW = 75,
WEATHER_LIGHT_SNOW = 25,
WEATHER_BLIZZARD = 5
)
observed_message = "It is snowing."
transition_messages = list(
"It's starting to snow.",
"The air feels much colder as snowflakes fall from above."
)
outdoor_sounds_type = /datum/looping_sound/weather/outside_snow
indoor_sounds_type = /datum/looping_sound/weather/inside_snow
/datum/weather/virgo3c/blizzard
name = "blizzard"
icon_state = "snowfall_heavy"
temp_high = 268.15 // -5c
temp_low = 263.15 // -10c
wind_high = 4
wind_low = 2
light_modifier = 0.3
flight_failure_modifier = 10
transition_chances = list(
WEATHER_BLIZZARD = 50,
WEATHER_SNOW = 50
)
observed_message = "A blizzard blows snow everywhere."
transition_messages = list(
"Strong winds howl around you as a blizzard appears.",
"It starts snowing heavily, and it feels extremly cold now."
)
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
/datum/weather/virgo3c/rain
name = "rain"
icon_state = "rain"
temp_high = 283.15 // 10c
temp_low = 273.15 // 0c
wind_high = 2
wind_low = 1
light_modifier = 0.5
effect_message = "<span class='warning'>Rain falls on you.</span>"
transition_chances = list(
WEATHER_OVERCAST = 25,
WEATHER_RAIN = 50,
WEATHER_STORM = 10,
WEATHER_LIGHT_SNOW = 5
)
observed_message = "It is raining."
transition_messages = list(
"The sky is dark, and rain falls down upon you."
)
/datum/weather/virgo3c/rain/process_effects()
..()
for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.is_outdoors())
continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll guard from rain
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(!istype(U) || !U.open)
U = L.get_inactive_hand()
if(istype(U) && U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
continue
L.water_act(1)
if(show_message)
to_chat(L, effect_message)
/datum/weather/virgo3c/storm
name = "storm"
icon_state = "storm"
temp_high = 283.15 // 10c
temp_low = 273.15 // 0c
wind_high = 4
wind_low = 2
light_modifier = 0.3
flight_failure_modifier = 10
effect_message = "<span class='warning'>Rain falls on you, drenching you in water.</span>"
var/next_lightning_strike = 0 // world.time when lightning will strike.
var/min_lightning_cooldown = 5 SECONDS
var/max_lightning_cooldown = 1 MINUTE
observed_message = "An intense storm pours down over the region."
transition_messages = list(
"You feel intense winds hit you as the weather takes a turn for the worst.",
"Loud thunder is heard in the distance.",
"A bright flash heralds the approach of a storm."
)
transition_chances = list(
WEATHER_STORM = 50,
WEATHER_RAIN = 50,
WEATHER_BLIZZARD = 5,
WEATHER_HAIL = 5
)
/datum/weather/virgo3c/storm/process_effects()
..()
for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.is_outdoors())
continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll guard from rain
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
if(!istype(U) || !U.open)
U = L.get_inactive_hand()
if(istype(U) && U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
continue
L.water_act(2)
if(show_message)
to_chat(L, effect_message)
handle_lightning()
// This gets called to do lightning periodically.
// There is a seperate function to do the actual lightning strike, so that badmins can play with it.
/datum/weather/virgo3c/storm/proc/handle_lightning()
if(world.time < next_lightning_strike)
return // It's too soon to strike again.
next_lightning_strike = world.time + rand(min_lightning_cooldown, max_lightning_cooldown)
var/turf/T = pick(holder.our_planet.planet_floors) // This has the chance to 'strike' the sky, but that might be a good thing, to scare reckless pilots.
lightning_strike(T)
/datum/weather/virgo3c/hail
name = "hail"
icon_state = "hail"
temp_high = 268.15 // -5c
temp_low = 263.15 // -10c
light_modifier = 0.3
flight_failure_modifier = 15
timer_low_bound = 2
timer_high_bound = 5
effect_message = "<span class='warning'>The hail smacks into you!</span>"
transition_chances = list(
WEATHER_HAIL = 25,
WEATHER_RAIN = 75
)
observed_message = "Ice is falling from the sky."
transition_messages = list(
"Ice begins to fall from the sky.",
"It begins to hail.",
"An intense chill is felt, and chunks of ice start to fall from the sky, towards you."
)
/datum/weather/virgo3c/hail/process_effects()
..()
for(var/mob/living/carbon/H as anything in human_mob_list)
if(H.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(H)
if(!T.is_outdoors())
continue // They're indoors, so no need to pelt them with ice.
// If they have an open umbrella, it'll guard from hail
var/obj/item/weapon/melee/umbrella/U = H.get_active_hand()
if(!istype(U) || !U.open)
U = H.get_inactive_hand()
if(istype(U) && U.open)
if(show_message)
to_chat(H, "<span class='notice'>Hail patters onto your umbrella.</span>")
continue
var/target_zone = pick(BP_ALL)
var/amount_blocked = H.run_armor_check(target_zone, "melee")
var/amount_soaked = H.get_armor_soak(target_zone, "melee")
var/damage = rand(1,3)
if(amount_blocked >= 30)
continue // No need to apply damage. Hardhats are 30. They should probably protect you from hail on your head.
//Voidsuits are likewise 40, and riot, 80. Clothes are all less than 30.
if(amount_soaked >= damage)
continue // No need to apply damage.
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
if(show_message)
to_chat(H, effect_message)
/datum/weather/virgo3c/blood_moon
name = "blood moon"
light_modifier = 0.5
light_color = "#FF0000"
temp_high = 283.15 // 10c
temp_low = 273.15 // 0c
flight_failure_modifier = 25
transition_chances = list(
WEATHER_BLOODMOON = 75,
WEATHER_CLEAR = 25
)
observed_message = "Everything is red. Something really ominous is going on."
transition_messages = list(
"The sky turns blood red!"
)
outdoor_sounds_type = /datum/looping_sound/weather/wind
indoor_sounds_type = /datum/looping_sound/weather/wind/indoors
// Ash and embers fall forever, such as from a volcano or something.
/datum/weather/virgo3c/emberfall
name = "emberfall"
icon_state = "ashfall_light"
light_modifier = 0.7
light_color = "#880000"
temp_high = 293.15 // 20c
temp_low = 283.15 // 10c
flight_failure_modifier = 20
transition_chances = list(
WEATHER_ASH_STORM = 100
)
observed_message = "Soot, ash, and embers float down from above."
transition_messages = list(
"Gentle embers waft down around you like black snow. A wall of dark, glowing ash approaches in the distance..."
)
outdoor_sounds_type = /datum/looping_sound/weather/wind
indoor_sounds_type = /datum/looping_sound/weather/wind/indoors
// Like the above but a lot more harmful.
/datum/weather/virgo3c/ash_storm
name = "ash storm"
icon_state = "ashfall_heavy"
light_modifier = 0.1
light_color = "#FF0000"
temp_high = 313.15 // 40c
temp_low = 303.15 // 30c
wind_high = 6
wind_low = 3
flight_failure_modifier = 50
transition_chances = list(
WEATHER_ASH_STORM = 5,
WEATHER_CLEAR = 95
)
observed_message = "All that can be seen is black smoldering ash."
transition_messages = list(
"Smoldering clouds of scorching ash billow down around you!"
)
// Lets recycle.
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
/datum/weather/virgo3c/ash_storm/process_effects()
..()
for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.is_outdoors())
continue // They're indoors, so no need to burn them with ash.
else if (isanimal(L))
continue //Don't murder the wildlife, they live here it's fine
L.inflict_heat_damage(1)
to_chat(L, "<span class='warning'>Smoldering ash singes you!</span>")
// Totally radical.
/datum/weather/virgo3c/fallout
name = "fallout"
icon_state = "fallout"
light_modifier = 0.7
light_color = "#CCFFCC"
flight_failure_modifier = 30
transition_chances = list(
WEATHER_FALLOUT = 100
)
observed_message = "Radioactive soot and ash rains down from the heavens."
transition_messages = list(
"Radioactive soot and ash start to float down around you, contaminating whatever they touch."
)
outdoor_sounds_type = /datum/looping_sound/weather/wind
indoor_sounds_type = /datum/looping_sound/weather/wind/indoors
// How much radiation a mob gets while on an outside tile.
var/direct_rad_low = RAD_LEVEL_LOW
var/direct_rad_high = RAD_LEVEL_MODERATE
// How much radiation is bursted onto a random tile near a mob.
var/fallout_rad_low = RAD_LEVEL_HIGH
var/fallout_rad_high = RAD_LEVEL_VERY_HIGH
/datum/weather/virgo3c/fallout/process_effects()
..()
for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
irradiate_nearby_turf(L)
var/turf/T = get_turf(L)
if(!T.is_outdoors())
continue // They're indoors, so no need to irradiate them with fallout.
L.rad_act(rand(direct_rad_low, direct_rad_high))
// This makes random tiles near people radioactive for awhile.
// Tiles far away from people are left alone, for performance.
/datum/weather/virgo3c/fallout/proc/irradiate_nearby_turf(mob/living/L)
if(!istype(L))
return
var/list/turfs = RANGE_TURFS(world.view, L)
var/turf/T = pick(turfs) // We get one try per tick.
if(!istype(T))
return
if(T.is_outdoors())
SSradiation.radiate(T, rand(fallout_rad_low, fallout_rad_high))
/turf/unsimulated/wall/planetary/virgo3c
name = "impassable rock"
desc = "It's quite impassable"
icon = 'icons/turf/walls.dmi'
icon_state = "rock-dark"
alpha = 0xFF
VIRGO3C_SET_ATMOS
VIRGO3C_TURF_CREATE(/turf/simulated/mineral/cave)
VIRGO3C_TURF_CREATE(/turf/simulated/floor/outdoors/newdirt)
VIRGO3C_TURF_CREATE(/turf/simulated/floor/outdoors/newdirt_nograss)
VIRGO3C_TURF_CREATE(/turf/simulated/floor/outdoors/sidewalk)
VIRGO3C_TURF_CREATE(/turf/simulated/floor/outdoors/sidewalk/side)
VIRGO3C_TURF_CREATE(/turf/simulated/floor/outdoors/sidewalk/slab)
VIRGO3C_TURF_CREATE(/turf/simulated/floor/water)
VIRGO3C_TURF_CREATE(/turf/simulated/floor/tiled)
VIRGO3C_TURF_CREATE(/turf/simulated/floor/reinforced)
VIRGO3C_TURF_CREATE(/turf/simulated/floor/glass/reinforced)
VIRGO3C_TURF_CREATE(/turf/simulated/open)
VIRGO3C_TURF_CREATE(/turf/simulated/floor/tiled/dark)
VIRGO3C_TURF_CREATE(/turf/simulated/mineral)
VIRGO3C_TURF_CREATE(/turf/simulated/floor)
/turf/simulated/floor/outdoors/grass/virgo3c
VIRGO3C_SET_ATMOS
grass_types = list(
/obj/structure/flora/ausbushes/sparsegrass = 50,
/obj/structure/flora/ausbushes/fullgrass = 50,
/obj/structure/flora/ausbushes/brflowers = 1,
/obj/structure/flora/ausbushes/ppflowers = 1,
/obj/structure/flora/ausbushes/ywflowers = 1
)
/turf/simulated/floor/outdoors/grass/forest/virgo3c
VIRGO3C_SET_ATMOS
var/tree_chance = 5
var/animal_chance = 0.5
var/animal_types = list(
/mob/living/simple_mob/vore/alienanimals/teppi = 5,
/mob/living/simple_mob/vore/redpanda = 20,
/mob/living/simple_mob/vore/redpanda/fae = 1,
/mob/living/simple_mob/vore/sheep = 10,
/mob/living/simple_mob/vore/rabbit/black = 10,
/mob/living/simple_mob/vore/rabbit/white = 10,
/mob/living/simple_mob/vore/rabbit/brown = 10,
/mob/living/simple_mob/vore/leopardmander = 1,
/mob/living/simple_mob/vore/horse/big = 5,
/mob/living/simple_mob/vore/bigdragon/friendly = 0.5,
/mob/living/simple_mob/vore/alienanimals/dustjumper = 10
)
/turf/simulated/floor/outdoors/grass/forest/virgo3c/Initialize()
if(tree_chance && prob(tree_chance) && !check_density())
new /obj/structure/flora/tree/bigtree(src)
if(animal_chance && prob(animal_chance) && !check_density())
var/animal_type = pickweight(animal_types)
new animal_type(src)
. = ..()
//VIRGO3C_SET_ATMOS()

View File

@@ -32,35 +32,35 @@ var/datum/planet/virgo4/planet_virgo4 = null
var/min = 0 var/min = 0
switch(sun_position) switch(sun_position)
if(0 to 0.30) // Night if(0 to 0.20) // Night
low_brightness = 0.1 low_brightness = 0.3
low_color = "#000066" low_color = "#000066"
high_brightness = 0.2 high_brightness = 0.5
high_color = "#66004D" high_color = "#66004D"
min = 0 min = 0
if(0.30 to 0.40) // Twilight if(0.20 to 0.30) // Twilight
low_brightness = 0.4 low_brightness = 0.5
low_color = "#66004D" low_color = "#66004D"
high_brightness = 0.6 high_brightness = 0.9
high_color = "#CC3300" high_color = "#CC3300"
min = 0.40 min = 0.40
if(0.40 to 0.50) // Sunrise/set if(0.30 to 0.40) // Sunrise/set
low_brightness = 0.7 low_brightness = 0.9
low_color = "#CC3300" low_color = "#CC3300"
high_brightness = 0.9 high_brightness = 3.0
high_color = "#FF9933" high_color = "#FF9933"
min = 0.50 min = 0.50
if(0.50 to 1.00) // Noon if(0.40 to 1.00) // Noon
low_brightness = 1 low_brightness = 3.0
low_color = "#DDDDDD" low_color = "#DDDDDD"
high_brightness = 2 high_brightness = 10.0
high_color = "#FFFFFF" high_color = "#FFFFFF"
min = 0.70 min = 0.70
@@ -92,7 +92,7 @@ var/datum/planet/virgo4/planet_virgo4 = null
new_color = rgb(new_r, new_g, new_b) new_color = rgb(new_r, new_g, new_b)
spawn(1) spawn(1)
update_sun_deferred(2, new_brightness, new_color) update_sun_deferred(new_brightness, new_color)
/datum/weather_holder/virgo4 /datum/weather_holder/virgo4
@@ -187,15 +187,17 @@ var/datum/planet/virgo4/planet_virgo4 = null
outdoor_sounds_type = /datum/looping_sound/weather/outside_snow outdoor_sounds_type = /datum/looping_sound/weather/outside_snow
indoor_sounds_type = /datum/looping_sound/weather/inside_snow indoor_sounds_type = /datum/looping_sound/weather/inside_snow
/*
/datum/weather/virgo4/snow/process_effects() /datum/weather/virgo4/snow/process_effects()
..() ..()
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels) if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal) for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked) var/turf/simulated/floor/T = get_step(S, dir_checked)
if(istype(T)) if(istype(T))
if(istype(T, /turf/simulated/floor/outdoors) && prob(33)) if(istype(T, /turf/simulated/floor/outdoors) && prob(33))
T.chill() T.chill()
*/
/datum/weather/virgo4/blizzard /datum/weather/virgo4/blizzard
name = "blizzard" name = "blizzard"
@@ -217,15 +219,17 @@ var/datum/planet/virgo4/planet_virgo4 = null
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
/*
/datum/weather/virgo4/blizzard/process_effects() /datum/weather/virgo4/blizzard/process_effects()
..() ..()
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
if(S.z in holder.our_planet.expected_z_levels) if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal) for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked) var/turf/simulated/floor/T = get_step(S, dir_checked)
if(istype(T)) if(istype(T))
if(istype(T, /turf/simulated/floor/outdoors) && prob(50)) if(istype(T, /turf/simulated/floor/outdoors) && prob(50))
T.chill() T.chill()
*/
/datum/weather/virgo4/rain /datum/weather/virgo4/rain
name = "rain" name = "rain"
@@ -248,25 +252,21 @@ var/datum/planet/virgo4/planet_virgo4 = null
/datum/weather/virgo4/rain/process_effects() /datum/weather/virgo4/rain/process_effects()
..() ..()
for(var/mob/living/L in living_mob_list) for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels) if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L) var/turf/T = get_turf(L)
if(!T.outdoors) if(!T.is_outdoors())
continue // They're indoors, so no need to rain on them. continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll guard from rain // If they have an open umbrella, it'll guard from rain
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella)) var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand() if(!istype(U) || !U.open)
if(U.open) U = L.get_inactive_hand()
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>") if(istype(U) && U.open)
continue if(show_message)
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella)) to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand() continue
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
continue
L.water_act(1) L.water_act(1)
if(show_message) if(show_message)
@@ -298,25 +298,21 @@ var/datum/planet/virgo4/planet_virgo4 = null
/datum/weather/virgo4/storm/process_effects() /datum/weather/virgo4/storm/process_effects()
..() ..()
for(var/mob/living/L in living_mob_list) for(var/mob/living/L as anything in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels) if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L) var/turf/T = get_turf(L)
if(!T.outdoors) if(!T.is_outdoors())
continue // They're indoors, so no need to rain on them. continue // They're indoors, so no need to rain on them.
// If they have an open umbrella, it'll guard from rain // If they have an open umbrella, it'll guard from rain
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella)) var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand() if(!istype(U) || !U.open)
if(U.open) U = L.get_inactive_hand()
if(show_message)
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>") if(istype(U) && U.open)
continue if(show_message)
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella)) to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand() continue
if(U.open)
if(show_message)
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
continue
L.water_act(2) L.water_act(2)
@@ -355,20 +351,18 @@ var/datum/planet/virgo4/planet_virgo4 = null
/datum/weather/virgo4/hail/process_effects() /datum/weather/virgo4/hail/process_effects()
..() ..()
for(var/humie in human_mob_list) for(var/mob/living/carbon/H as anything in human_mob_list)
var/mob/living/carbon/human/H = humie
if(H.z in holder.our_planet.expected_z_levels) if(H.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(H) var/turf/T = get_turf(H)
if(!T.outdoors) if(!T.is_outdoors())
continue // They're indoors, so no need to pelt them with ice. continue // They're indoors, so no need to pelt them with ice.
// If they have an open umbrella, it'll guard from hail // If they have an open umbrella, it'll guard from hail
var/obj/item/weapon/melee/umbrella/U var/obj/item/weapon/melee/umbrella/U = H.get_active_hand()
if(istype(H.get_active_hand(), /obj/item/weapon/melee/umbrella)) if(!istype(U) || !U.open)
U = H.get_active_hand()
else if(istype(H.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
U = H.get_inactive_hand() U = H.get_inactive_hand()
if(U && U.open)
if(istype(U) && U.open)
if(show_message) if(show_message)
to_chat(H, "<span class='notice'>Hail patters onto your umbrella.</span>") to_chat(H, "<span class='notice'>Hail patters onto your umbrella.</span>")
continue continue
@@ -450,11 +444,10 @@ var/datum/planet/virgo4/planet_virgo4 = null
/datum/weather/virgo4/ash_storm/process_effects() /datum/weather/virgo4/ash_storm/process_effects()
..() ..()
for(var/thing in living_mob_list) for(var/mob/living/L as anything in living_mob_list)
var/mob/living/L = thing
if(L.z in holder.our_planet.expected_z_levels) if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L) var/turf/T = get_turf(L)
if(!T.outdoors) if(!T.is_outdoors())
continue // They're indoors, so no need to burn them with ash. continue // They're indoors, so no need to burn them with ash.
L.inflict_heat_damage(rand(1, 3)) L.inflict_heat_damage(rand(1, 3))
@@ -487,12 +480,11 @@ var/datum/planet/virgo4/planet_virgo4 = null
/datum/weather/virgo4/fallout/process_effects() /datum/weather/virgo4/fallout/process_effects()
..() ..()
for(var/thing in living_mob_list) for(var/mob/living/L as anything in living_mob_list)
var/mob/living/L = thing
if(L.z in holder.our_planet.expected_z_levels) if(L.z in holder.our_planet.expected_z_levels)
irradiate_nearby_turf(L) irradiate_nearby_turf(L)
var/turf/T = get_turf(L) var/turf/T = get_turf(L)
if(!T.outdoors) if(!T.is_outdoors())
continue // They're indoors, so no need to irradiate them with fallout. continue // They're indoors, so no need to irradiate them with fallout.
L.rad_act(rand(direct_rad_low, direct_rad_high)) L.rad_act(rand(direct_rad_low, direct_rad_high))
@@ -506,7 +498,7 @@ var/datum/planet/virgo4/planet_virgo4 = null
var/turf/T = pick(turfs) // We get one try per tick. var/turf/T = pick(turfs) // We get one try per tick.
if(!istype(T)) if(!istype(T))
return return
if(T.outdoors) if(T.is_outdoors())
SSradiation.radiate(T, rand(fallout_rad_low, fallout_rad_high)) SSradiation.radiate(T, rand(fallout_rad_low, fallout_rad_high))
/turf/unsimulated/wall/planetary/normal/virgo4 /turf/unsimulated/wall/planetary/normal/virgo4
@@ -519,4 +511,4 @@ var/datum/planet/virgo4/planet_virgo4 = null
RCon = TRUE RCon = TRUE
input_level = input_level_max input_level = input_level_max
output_level = output_level_max output_level = output_level_max
input_attempt = TRUE input_attempt = TRUE

View File

@@ -282,16 +282,17 @@
log_and_message_admins("[ADMIN_LOOKUPFLW(Proj.firer)] triggered a kugelblitz core explosion at [x],[y],[z] via projectile.") log_and_message_admins("[ADMIN_LOOKUPFLW(Proj.firer)] triggered a kugelblitz core explosion at [x],[y],[z] via projectile.")
asplod() asplod()
/obj/machinery/power/rtg/d_type_reg /obj/machinery/power/rtg/reg
name = "d-type rotary electric generator" name = "d-type rotary electric generator"
desc = "It looks kind of like a large hamster wheel." desc = "It looks kind of like a large hamster wheel."
icon = 'icons/obj/power_vrx96.dmi' icon = 'icons/obj/power_vrx96.dmi'
icon_state = "reg" icon_state = "reg"
circuit = /obj/item/weapon/circuitboard/machine/reg circuit = /obj/item/weapon/circuitboard/machine/reg_d
irradiate = FALSE irradiate = FALSE
power_gen = 0 //It's big but it gets adjusted based on what you put into it!!! power_gen = 0
var/default_power_gen = 1000000 var/default_power_gen = 1000000 //It's big but it gets adjusted based on what you put into it!!!
var/part_mult = 0 var/part_mult = 0
var/nutrition_drain = 1
pixel_x = -32 pixel_x = -32
plane = ABOVE_MOB_PLANE plane = ABOVE_MOB_PLANE
layer = ABOVE_MOB_LAYER layer = ABOVE_MOB_LAYER
@@ -299,36 +300,38 @@
interact_offline = TRUE interact_offline = TRUE
density = FALSE density = FALSE
/obj/machinery/power/rtg/d_type_reg/Initialize() /obj/machinery/power/rtg/reg/Initialize()
. = ..()
pixel_x = -32 pixel_x = -32
. = ..()
/obj/machinery/power/rtg/d_type_reg/Destroy() /obj/machinery/power/rtg/reg/Destroy()
. = ..() . = ..()
/obj/machinery/power/rtg/d_type_reg/user_buckle_mob(mob/living/M, mob/user, var/forced = FALSE, var/silent = TRUE) /obj/machinery/power/rtg/reg/user_buckle_mob(mob/living/M, mob/user, var/forced = FALSE, var/silent = TRUE)
. = ..() . = ..()
M.pixel_y = 8 M.pixel_y = 8
M.visible_message("<span class='notice'>\The [M], hops up onto \the [src] and begins running!</span>") M.visible_message("<span class='notice'>\The [M], hops up onto \the [src] and begins running!</span>")
/obj/machinery/power/rtg/d_type_reg/unbuckle_mob(mob/living/buckled_mob, force = FALSE) /obj/machinery/power/rtg/reg/unbuckle_mob(mob/living/buckled_mob, force = FALSE)
. = ..() . = ..()
buckled_mob.pixel_y = initial(buckled_mob.pixel_y) buckled_mob.pixel_y = initial(buckled_mob.pixel_y)
/obj/machinery/power/rtg/d_type_reg/RefreshParts() /obj/machinery/power/rtg/reg/RefreshParts()
var/n = 0 var/n = 0
for(var/obj/item/weapon/stock_parts/SP in component_parts) for(var/obj/item/weapon/stock_parts/SP in component_parts)
n += SP.rating n += SP.rating
part_mult = n part_mult = n
/obj/machinery/power/rtg/d_type_reg/attackby(obj/item/I, mob/user, params) /obj/machinery/power/rtg/reg/attackby(obj/item/I, mob/user, params)
pixel_x = -32
if(default_deconstruction_screwdriver(user, I)) if(default_deconstruction_screwdriver(user, I))
return return
else if(default_deconstruction_crowbar(user, I)) else if(default_deconstruction_crowbar(user, I))
return return
return ..() return ..()
/obj/machinery/power/rtg/d_type_reg/update_icon() /obj/machinery/power/rtg/reg/update_icon()
pixel_x = -32
if(panel_open) if(panel_open)
icon_state = "reg-o" icon_state = "reg-o"
else if(buckled_mobs && buckled_mobs.len > 0) else if(buckled_mobs && buckled_mobs.len > 0)
@@ -336,7 +339,7 @@
else else
icon_state = "reg" icon_state = "reg"
/obj/machinery/power/rtg/d_type_reg/process() /obj/machinery/power/rtg/reg/process()
..() ..()
if(buckled_mobs && buckled_mobs.len > 0) if(buckled_mobs && buckled_mobs.len > 0)
for(var/mob/living/L in buckled_mobs) for(var/mob/living/L in buckled_mobs)
@@ -345,7 +348,7 @@
power_gen = 0 power_gen = 0
update_icon() update_icon()
/obj/machinery/power/rtg/d_type_reg/proc/runner_process(var/mob/living/runner) /obj/machinery/power/rtg/reg/proc/runner_process(var/mob/living/runner)
if(runner.stat != CONSCIOUS) if(runner.stat != CONSCIOUS)
unbuckle_mob(runner) unbuckle_mob(runner)
runner.visible_message("<span class='warning'>\The [runner], topples off of \the [src]!</span>") runner.visible_message("<span class='warning'>\The [runner], topples off of \the [src]!</span>")
@@ -379,16 +382,31 @@
if(part_mult > 1) if(part_mult > 1)
cool_rotations += (cool_rotations * (part_mult - 1)) / 4 cool_rotations += (cool_rotations * (part_mult - 1)) / 4
power_gen = cool_rotations power_gen = cool_rotations
runner.nutrition -- runner.nutrition -= nutrition_drain
/obj/machinery/power/rtg/d_type_reg/emp_act(severity) /obj/machinery/power/rtg/reg/emp_act(severity)
return return
/obj/item/weapon/circuitboard/machine/reg /obj/item/weapon/circuitboard/machine/reg_d
name = T_BOARD("REG") name = T_BOARD("D-Type-REG")
build_path = /obj/machinery/power/rtg/d_type_reg build_path = /obj/machinery/power/rtg/reg
board_type = new /datum/frame/frame_types/machine board_type = new /datum/frame/frame_types/machine
origin_tech = list(TECH_DATA = 2, TECH_POWER = 4, TECH_ENGINEERING = 4) origin_tech = list(TECH_DATA = 2, TECH_POWER = 4, TECH_ENGINEERING = 4)
req_components = list( req_components = list(
/obj/item/stack/cable_coil = 5, /obj/item/stack/cable_coil = 5,
/obj/item/weapon/stock_parts/capacitor = 1) /obj/item/weapon/stock_parts/capacitor = 1)
/obj/item/weapon/circuitboard/machine/reg_c
name = T_BOARD("C-Type-REG")
build_path = /obj/machinery/power/rtg/reg/c
board_type = new /datum/frame/frame_types/machine
origin_tech = list(TECH_DATA = 2, TECH_POWER = 4, TECH_ENGINEERING = 4)
req_components = list(
/obj/item/stack/cable_coil = 5,
/obj/item/weapon/stock_parts/capacitor = 1)
/obj/machinery/power/rtg/reg/c
name = "c-type rotary electric generator"
circuit = /obj/item/weapon/circuitboard/machine/reg_c
default_power_gen = 500000 //Half power
nutrition_drain = 0.5 //for half cost - EQUIVALENT EXCHANGE >:O

View File

@@ -6,8 +6,8 @@
name = "hypospray" name = "hypospray"
desc = "The DeForest Medical Corporation hypospray is a sterile, air-needle autoinjector for rapid administration of drugs to patients." desc = "The DeForest Medical Corporation hypospray is a sterile, air-needle autoinjector for rapid administration of drugs to patients."
icon = 'icons/obj/syringe.dmi' icon = 'icons/obj/syringe.dmi'
item_state = "hypo"
icon_state = "hypo" icon_state = "hypo"
item_state = "hypo"
amount_per_transfer_from_this = 5 amount_per_transfer_from_this = 5
unacidable = TRUE unacidable = TRUE
volume = 30 volume = 30
@@ -88,13 +88,15 @@
//A vial-loaded hypospray. Cartridge-based! //A vial-loaded hypospray. Cartridge-based!
/obj/item/weapon/reagent_containers/hypospray/vial /obj/item/weapon/reagent_containers/hypospray/vial
name = "hypospray mkII" name = "advanced hypospray"
icon_state = "advhypo"
desc = "A new development from DeForest Medical, this new hypospray takes 30-unit vials as the drug supply for easy swapping." desc = "A new development from DeForest Medical, this new hypospray takes 30-unit vials as the drug supply for easy swapping."
var/obj/item/weapon/reagent_containers/glass/beaker/vial/loaded_vial //Wow, what a name. var/obj/item/weapon/reagent_containers/glass/beaker/vial/loaded_vial //Wow, what a name.
volume = 0 volume = 0
/obj/item/weapon/reagent_containers/hypospray/vial/Initialize() /obj/item/weapon/reagent_containers/hypospray/vial/Initialize()
. = ..() . = ..()
icon_state = "[initial(icon_state)]"
loaded_vial = new /obj/item/weapon/reagent_containers/glass/beaker/vial(src) //Comes with an empty vial loaded_vial = new /obj/item/weapon/reagent_containers/glass/beaker/vial(src) //Comes with an empty vial
volume = loaded_vial.volume volume = loaded_vial.volume
reagents.maximum_volume = loaded_vial.reagents.maximum_volume reagents.maximum_volume = loaded_vial.reagents.maximum_volume
@@ -115,6 +117,13 @@
else else
return ..() return ..()
/obj/item/weapon/reagent_containers/hypospray/vial/update_icon()
..()
if(loaded_vial)
icon_state = "[initial(icon_state)]"
else
icon_state = "[initial(icon_state)]_empty"
/obj/item/weapon/reagent_containers/hypospray/vial/attackby(obj/item/weapon/W, mob/user as mob) /obj/item/weapon/reagent_containers/hypospray/vial/attackby(obj/item/weapon/W, mob/user as mob)
if(istype(W, /obj/item/weapon/reagent_containers/glass/beaker/vial)) if(istype(W, /obj/item/weapon/reagent_containers/glass/beaker/vial))
if(!loaded_vial) if(!loaded_vial)

View File

@@ -5,7 +5,8 @@
anchored = TRUE anchored = TRUE
var/working = FALSE var/working = FALSE
var/negative_dir = null //VOREStation Addition
/obj/machinery/recycling/process() /obj/machinery/recycling/process()
return PROCESS_KILL // these are all stateful return PROCESS_KILL // these are all stateful
@@ -85,7 +86,12 @@
/obj/machinery/recycling/crusher/can_accept_item(obj/item/O) /obj/machinery/recycling/crusher/can_accept_item(obj/item/O)
if(LAZYLEN(O.matter)) if(LAZYLEN(O.matter))
return ..() return ..()
return FALSE //VOREStation Addition Start - Let's the machine decide to put things it can't accept somewhere else.
else if(negative_dir && isitem(O) && !ishuman(O.loc))
O.forceMove(get_step(src, negative_dir))
else
return FALSE
//VOREStation Addition End
/obj/machinery/recycling/crusher/take_item(obj/item/O) /obj/machinery/recycling/crusher/take_item(obj/item/O)
. = ..() . = ..()

View File

@@ -6,38 +6,45 @@
/datum/design/item/weapon/mining/drill /datum/design/item/weapon/mining/drill
id = "drill" id = "drill"
req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) req_tech = list(TECH_MATERIAL = 1, TECH_POWER = 2, TECH_ENGINEERING = 1)
materials = list(MAT_STEEL = 6000, MAT_GLASS = 1000) //expensive, but no need for miners. materials = list(MAT_STEEL = 4000, MAT_GLASS = 500) //expensive, but no need for miners.
build_path = /obj/item/weapon/pickaxe/drill build_path = /obj/item/weapon/pickaxe/drill
sort_string = "FAAAA" sort_string = "FAAAA"
/datum/design/item/weapon/mining/advdrill
id = "advanced_drill"
req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2)
materials = list(MAT_STEEL = 6000, MAT_GLASS = 1000) //expensive, but no need for miners.
build_path = /obj/item/weapon/pickaxe/advdrill
sort_string = "FAAAB"
/datum/design/item/weapon/mining/jackhammer /datum/design/item/weapon/mining/jackhammer
id = "jackhammer" id = "jackhammer"
req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2) req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2)
materials = list(MAT_STEEL = 2000, MAT_GLASS = 500, MAT_SILVER = 500) materials = list(MAT_STEEL = 2000, MAT_GLASS = 500, MAT_SILVER = 500)
build_path = /obj/item/weapon/pickaxe/jackhammer build_path = /obj/item/weapon/pickaxe/jackhammer
sort_string = "FAAAB" sort_string = "FAAAC"
/datum/design/item/weapon/mining/plasmacutter /datum/design/item/weapon/mining/plasmacutter
id = "plasmacutter" id = "plasmacutter"
req_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3) req_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3)
materials = list(MAT_STEEL = 1500, MAT_GLASS = 500, MAT_GOLD = 500, MAT_PHORON = 500) materials = list(MAT_STEEL = 1500, MAT_GLASS = 500, MAT_GOLD = 500, MAT_PHORON = 500)
build_path = /obj/item/weapon/pickaxe/plasmacutter build_path = /obj/item/weapon/pickaxe/plasmacutter
sort_string = "FAAAC" sort_string = "FAAAD"
/datum/design/item/weapon/mining/pick_diamond /datum/design/item/weapon/mining/pick_diamond
id = "pick_diamond" id = "pick_diamond"
req_tech = list(TECH_MATERIAL = 6) req_tech = list(TECH_MATERIAL = 6)
materials = list(MAT_DIAMOND = 3000) materials = list(MAT_DIAMOND = 3000)
build_path = /obj/item/weapon/pickaxe/diamond build_path = /obj/item/weapon/pickaxe/diamond
sort_string = "FAAAD" sort_string = "FAAAE"
/datum/design/item/weapon/mining/drill_diamond /datum/design/item/weapon/mining/drill_diamond
id = "drill_diamond" id = "drill_diamond"
req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 4) req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 4)
materials = list(MAT_STEEL = 3000, MAT_GLASS = 1000, MAT_DIAMOND = 2000) materials = list(MAT_STEEL = 3000, MAT_GLASS = 1000, MAT_DIAMOND = 2000)
build_path = /obj/item/weapon/pickaxe/diamonddrill build_path = /obj/item/weapon/pickaxe/diamonddrill
sort_string = "FAAAE" sort_string = "FAAAF"
// Mining other equipment // Mining other equipment

View File

@@ -80,4 +80,13 @@
req_tech = list(TECH_ILLEGAL = 2, TECH_MATERIAL = 2) req_tech = list(TECH_ILLEGAL = 2, TECH_MATERIAL = 2)
materials = list(MAT_STEEL = 4000, MAT_GLASS = 4000) materials = list(MAT_STEEL = 4000, MAT_GLASS = 4000)
build_path = /obj/item/device/binoculars/scope build_path = /obj/item/device/binoculars/scope
sort_string = "TBAAD" sort_string = "TBAAD"
/datum/design/item/general/advmop
name = "advanced mop"
desc = "An advanced mop with pressured water jets that break away the toughest stains."
id = "advmop"
req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 5, TECH_BIO = 1)
materials = list(MAT_STEEL = 5000, MAT_GLASS = 2000, MAT_GOLD = 1000)
build_path = /obj/item/weapon/mop/advanced
sort_string = "TBAAE"

View File

@@ -1367,6 +1367,34 @@ End CHOMP Removal*/
w_class = ITEMSIZE_TINY w_class = ITEMSIZE_TINY
starts_with = list(/obj/item/clothing/mask/smokable/cigarette = 7) starts_with = list(/obj/item/clothing/mask/smokable/cigarette = 7)
/obj/item/weapon/storage/fancy/fluff/charlotte/New()
if(!open_state)
open_state = "[initial(icon_state)]0"
if(!closed_state)
closed_state = "[initial(icon_state)]"
..()
/obj/item/weapon/storage/fancy/fluff/charlotte/update_icon()
cut_overlays()
if(open)
icon_state = open_state
if(contents.len >= 1)
add_overlay("charlottebox[contents.len]")
else
icon_state = closed_state
/obj/item/weapon/storage/fancy/fluff/charlotte/open(mob/user as mob)
if(open)
return
open = TRUE
update_icon()
..()
/obj/item/weapon/storage/fancy/fluff/charlotte/close(mob/user as mob)
open = FALSE
update_icon()
..()
//Ashling - Antoinette deKaultieste //Ashling - Antoinette deKaultieste
/obj/item/weapon/material/knife/machete/hatchet/unathiknife/fluff/antoinette /obj/item/weapon/material/knife/machete/hatchet/unathiknife/fluff/antoinette
name = "sawtooth ritual knife" name = "sawtooth ritual knife"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 613 B

After

Width:  |  Height:  |  Size: 814 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 KiB

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

After

Width:  |  Height:  |  Size: 504 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Some files were not shown because too many files have changed in this diff Show More