This commit is contained in:
izac112
2020-07-14 00:21:02 +02:00
145 changed files with 3059 additions and 1391 deletions

View File

@@ -349,3 +349,5 @@ var/global/list/##LIST_NAME = list();\
#define JOB_SILICON_ROBOT 0x2
#define JOB_SILICON_AI 0x4
#define JOB_SILICON 0x6 // 2|4, probably don't set jobs to this, but good for checking
#define DEFAULT_OVERMAP_RANGE 0 // Makes general computers and devices be able to connect to other overmap z-levels on the same tile.

View File

@@ -10,6 +10,7 @@
#define NO_BLOOD 0x100 // Never bleed, never show blood amount
#define UNDEAD 0x200 // Various things that living things don't do, mostly for skeletons
#define NO_INFECT 0x400 // Don't allow infections in limbs or organs, similar to IS_PLANT, without other strings.
#define NO_DEFIB 0x800 // Don't allow them to be defibbed
// unused: 0x8000 - higher than this will overflow
// Species EMP vuln for carbons

View File

@@ -223,3 +223,7 @@
#undef AB_WEST_OFFSET
#undef AB_NORTH_OFFSET
#undef AB_MAX_COLUMNS
/datum/action/innate/
action_type = AB_INNATE

View File

@@ -134,7 +134,7 @@
access = access_medical_equip
/datum/supply_pack/voidsuits/medical/alt
name = "Vey-Med Medical voidsuits"
name = "Vey-Med Autoadaptive voidsuits (humanoid)"
contains = list(
/obj/item/clothing/suit/space/void/medical/alt = 2,
/obj/item/clothing/head/helmet/space/void/medical/alt = 2,
@@ -144,9 +144,20 @@
)
cost = 60
containertype = /obj/structure/closet/crate/secure
containername = "Vey-Med Medical voidsuit crate"
containername = "Vey-Med Autoadaptive voidsuit (humanoid) crate"
access = access_medical_equip
/datum/supply_pack/voidsuits/medical/alt/tesh
name = "Vey-Med Autoadaptive voidsuits (teshari)"
contains = list(
/obj/item/clothing/suit/space/void/medical/alt/tesh = 2,
/obj/item/clothing/head/helmet/space/void/medical/alt/tesh = 2,
/obj/item/clothing/mask/breath = 2,
/obj/item/clothing/shoes/magboots = 2,
/obj/item/weapon/tank/oxygen = 2
)
containername = "Vey-Med Autoadaptive voidsuit (teshari) crate"
/datum/supply_pack/voidsuits/security
name = "Security voidsuits"
contains = list(

View File

@@ -143,7 +143,7 @@
/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message, var/channel = "Common", var/zlevel)
if (ticker.current_state == GAME_STATE_PLAYING)
var/list/zlevels = zlevel ? using_map.get_map_levels(zlevel, TRUE) : null
var/list/zlevels = zlevel ? using_map.get_map_levels(zlevel, TRUE, om_range = DEFAULT_OVERMAP_RANGE) : null
if(character.mind.role_alt_title)
rank = character.mind.role_alt_title
AnnounceArrivalSimple(character.real_name, rank, join_message, channel, zlevels)

View File

@@ -1360,6 +1360,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
has_gravity = 0
sound_env = SPACE
/area/holodeck/source_chess
name = "\improper Holodeck - Chessboard"
//Engineering
/area/engineering/

View File

@@ -180,7 +180,12 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
/obj/item/weapon/book/tome
name = "arcane tome"
icon = 'icons/obj/weapons.dmi'
item_icons = list(
icon_l_hand = 'icons/mob/items/lefthand_books.dmi',
icon_r_hand = 'icons/mob/items/righthand_books.dmi',
)
icon_state ="tome"
item_state = "tome"
throw_speed = 1
throw_range = 5
w_class = ITEMSIZE_SMALL

View File

@@ -39,13 +39,17 @@
/datum/job/librarian
total_positions = 2
spawn_positions = 2
alt_titles = list("Journalist" = /datum/alt_title/journalist, "Writer" = /datum/alt_title/writer, "Historian" = /datum/alt_title/historian)
alt_titles = list("Journalist" = /datum/alt_title/journalist, "Writer" = /datum/alt_title/writer, "Historian" = /datum/alt_title/historian, "Professor" = /datum/alt_title/professor)
pto_type = PTO_CIVILIAN
/datum/alt_title/historian
title = "Historian"
title_blurb = "The Historian uses the Library as a base of operation to record any important events occuring on station."
/datum/alt_title/professor
title = "Professor"
title_blurb = "The Professor uses the Library as a base of operations to share their vast knowledge with the crew."
/datum/job/lawyer
disallow_jobhop = TRUE
pto_type = PTO_CIVILIAN

View File

@@ -44,7 +44,7 @@
data["current_network"] = current_network
data["networks"] = network ? network : list()
var/map_levels = using_map.get_map_levels(src.z, TRUE)
var/map_levels = using_map.get_map_levels(src.z, TRUE, om_range = DEFAULT_OVERMAP_RANGE)
data["map_levels"] = map_levels
if(current_network)

View File

@@ -195,6 +195,7 @@
modify.access -= access_type
if(!access_allowed)
modify.access += access_type
modify.lost_access = list() //VOREStation addition: reset the lost access upon any modifications
if ("assign")
if (is_authenticated() && modify)
@@ -218,6 +219,7 @@
modify.access = access
modify.assignment = t1
modify.rank = t1
modify.lost_access = list() //VOREStation addition: reset the lost access upon any modifications
callHook("reassign_employee", list(modify))
@@ -276,12 +278,12 @@
if (is_authenticated())
modify.assignment = "Dismissed" //VOREStation Edit: setting adjustment
modify.access = list()
modify.lost_access = list() //VOREStation addition: reset the lost access upon any modifications
callHook("terminate_employee", list(modify))
if (modify)
modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])")
modify.lost_access = list() //VOREStation addition: reset the lost access upon any modifications
return 1

View File

@@ -520,7 +520,7 @@
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.")
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))
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)] hums and hisses as it moves [to_despawn.real_name] into storage.</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

@@ -612,6 +612,13 @@
wires = null
return ..()
/obj/machinery/suit_cycler/refit_only
name = "Suit cycler"
desc = "A dedicated industrial machine that can refit voidsuits for different species, but not change the suit's overall appearance or departmental scheme."
model_text = "General Access"
req_access = null
departments = list("No Change")
/obj/machinery/suit_cycler/engineering
name = "Engineering suit cycler"
model_text = "Engineering"
@@ -741,7 +748,8 @@
updateUsrDialog()
return
else if(istype(I,/obj/item/clothing/head/helmet/space) && !istype(I, /obj/item/clothing/head/helmet/space/rig))
else if(istype(I,/obj/item/clothing/head/helmet/space/void) && !istype(I, /obj/item/clothing/head/helmet/space/rig))
var/obj/item/clothing/head/helmet/space/void/IH = I
if(locked)
to_chat(user, "<span class='danger'>The suit cycler is locked.</span>")
@@ -751,6 +759,10 @@
to_chat(user, "<span class='danger'>The cycler already contains a helmet.</span>")
return
if(IH.no_cycle)
to_chat(user, "<span class='danger'>That item is not compatible with the cycler's protocols.</span>")
return
if(I.icon_override == CUSTOM_ITEM_MOB)
to_chat(user, "You cannot refit a customised voidsuit.")
return
@@ -777,6 +789,7 @@
return
else if(istype(I,/obj/item/clothing/suit/space/void))
var/obj/item/clothing/suit/space/void/IS = I
if(locked)
to_chat(user, "<span class='danger'>The suit cycler is locked.</span>")
@@ -786,6 +799,10 @@
to_chat(user, "<span class='danger'>The cycler already contains a voidsuit.</span>")
return
if(IS.no_cycle)
to_chat(user, "<span class='danger'>That item is not compatible with the cycler's protocols.</span>")
return
if(I.icon_override == CUSTOM_ITEM_MOB)
to_chat(user, "You cannot refit a customised voidsuit.")
return
@@ -820,7 +837,7 @@
//Clear the access reqs, disable the safeties, and open up all paintjobs.
to_chat(user, "<span class='danger'>You run the sequencer across the interface, corrupting the operating protocols.</span>")
departments = list("Engineering","Mining","Medical","Security","Atmospherics","HAZMAT","Construction","Biohazard","Crowd Control","Security EVA","Emergency Medical Response","^%###^%$", "Charring")
departments = list("Engineering","Mining","Medical","Security","Atmospherics","HAZMAT","Construction","Biohazard","Crowd Control","Security EVA","Emergency Medical Response","^%###^%$", "Charring","No Change")
species = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_VULPKANIN) //VORESTATION EDIT
emagged = 1
@@ -1043,10 +1060,16 @@
if(target_species)
if(helmet) helmet.refit_for_species(target_species)
if(suit) suit.refit_for_species(target_species)
if(suit)
suit.refit_for_species(target_species)
if(suit.helmet)
suit.helmet.refit_for_species(target_species)
//Now "Complete" with most departmental and variant suits, and sorted by department. These aren't available in the standard or emagged cycler lists because they're incomplete for most species.
switch(target_department)
if("No Change")
parent_helmet = helmet
parent_suit = suit
//Engineering and Engineering Variants
if("Engineering")
parent_helmet = /obj/item/clothing/head/helmet/space/void/engineering
@@ -1201,7 +1224,7 @@
//END: downstream variant space
//look at this! isn't it beautiful? -KK (well ok not beautiful but it's a lot cleaner)
if(helmet)
if(helmet && target_department != "No Change")
var/obj/item/clothing/H = new parent_helmet
helmet.name = "refitted [initial(parent_helmet.name)]"
helmet.desc = initial(parent_helmet.desc)
@@ -1211,7 +1234,7 @@
helmet.item_state_slots = H.item_state_slots
qdel(H)
if(suit)
if(suit && target_department != "No Change")
var/obj/item/clothing/S = new parent_suit
suit.name = "refitted [initial(parent_suit.name)]"
suit.desc = initial(parent_suit.desc)
@@ -1219,3 +1242,14 @@
suit.item_state = initial(parent_suit.item_state)
suit.item_state_slots = S.item_state_slots
qdel(S)
//can't believe I forgot to fix this- now helmets will properly cycle if they're attached to a suit -KK
if(suit.helmet && target_department != "No Change")
var/obj/item/clothing/AH = new parent_helmet
suit.helmet.name = "refitted [initial(parent_helmet.name)]"
suit.helmet.desc = initial(parent_helmet.desc)
suit.helmet.icon_state = initial(parent_helmet.icon_state)
suit.helmet.item_state = initial(parent_helmet.item_state)
suit.helmet.light_overlay = initial(parent_helmet.light_overlay)
suit.helmet.item_state_slots = AH.item_state_slots
qdel(AH)

View File

@@ -708,4 +708,4 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
if(ad_hoc && src_z == dst_z)
return TRUE
return src_z in using_map.get_map_levels(dst_z)
return src_z in using_map.get_map_levels(dst_z, TRUE, om_range = DEFAULT_OVERMAP_RANGE)

View File

@@ -1,6 +1,11 @@
/**
* A vending machine
*/
///
/// A vending machine
///
//
// ALL THE VENDING MACHINES ARE IN vending_machines.dm now!
//
/obj/machinery/vending
name = "Vendomat"
desc = "A generic vending machine."
@@ -659,559 +664,4 @@
visible_message("<span class='warning'>\The [src] launches \a [throw_item] at \the [target]!</span>")
return 1
/*
* Vending machine types
*/
/*
/obj/machinery/vending/[vendors name here] // --vending machine template :)
name = ""
desc = ""
icon = ''
icon_state = ""
vend_delay = 15
products = list()
contraband = list()
premium = list()
*/
/*
/obj/machinery/vending/atmospherics //Commenting this out until someone ponies up some actual working, broken, and unpowered sprites - Quarxink
name = "Tank Vendor"
desc = "A vendor with a wide variety of masks and gas tanks."
icon = 'icons/obj/objects.dmi'
icon_state = "dispenser"
product_paths = "/obj/item/weapon/tank/oxygen;/obj/item/weapon/tank/phoron;/obj/item/weapon/tank/emergency_oxygen;/obj/item/weapon/tank/emergency_oxygen/engi;/obj/item/clothing/mask/breath"
productamounts = "10;10;10;5;25"
vend_delay = 0
*/
/obj/machinery/vending/boozeomat
name = "Booze-O-Mat"
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
icon_state = "fridge_dark"
products = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/square = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/rocks = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/shake = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/shot = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/pint = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/mug = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/wine = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/carafe = 2,
/obj/item/weapon/reagent_containers/food/drinks/glass2/pitcher = 2,
/obj/item/weapon/reagent_containers/food/drinks/metaglass = 10,
/obj/item/weapon/reagent_containers/food/drinks/metaglass/metapint = 10,
/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/grenadine = 5,
/obj/item/weapon/reagent_containers/food/condiment/cornoil = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/peppermintschnapps = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/peachschnapps = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/lemonadeschnapps = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/sake = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/cider = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/lemonjuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/applejuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/milk = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cola = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/space_up = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind = 5,
/obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 15,
/obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 15,
/obj/item/weapon/reagent_containers/food/drinks/cans/gingerale = 15,
/obj/item/weapon/reagent_containers/food/drinks/flask/barflask = 5,
/obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask = 5,
/obj/item/weapon/reagent_containers/food/drinks/ice = 10,
/obj/item/weapon/reagent_containers/food/drinks/tea = 15,
/obj/item/weapon/glass_extra/stick = 30,
/obj/item/weapon/glass_extra/straw = 30) //VOREStation Add - Carafes and Pitchers
contraband = list()
vend_delay = 15
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?"
product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!"
req_access = list(access_bar)
req_log_access = access_bar
has_logs = 1
vending_sound = "machines/vending/vending_cans.ogg"
/obj/machinery/vending/assist
products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4,
/obj/item/weapon/tool/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4)
contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2)
product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
/obj/machinery/vending/coffee
name = "Hot Drinks machine"
desc = "A vending machine which dispenses hot drinks."
product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies"
icon_state = "coffee"
vend_delay = 34
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
vend_power_usage = 85000 //85 kJ to heat a 250 mL cup of coffee
products = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25,/obj/item/weapon/reagent_containers/food/drinks/tea = 25,/obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/ice = 10)
prices = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 2, /obj/item/weapon/reagent_containers/food/drinks/tea = 2, /obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 2) //VOREStation Edit
vending_sound = "machines/vending/vending_coffee.ogg"
/obj/machinery/vending/snack
name = "Getmore Chocolate Corp"
desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars."
product_slogans = "Try our new nougat bar!;Twice the calories for half the price!"
product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!"
icon_state = "snack"
products = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 12,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 12,/obj/item/weapon/reagent_containers/food/snacks/chips =12,
/obj/item/weapon/reagent_containers/food/snacks/sosjerky = 12,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 12,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 12,
/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 12, /obj/item/weapon/reagent_containers/food/snacks/tastybread = 12, /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks = 6)
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6,/obj/item/weapon/reagent_containers/food/snacks/unajerky = 12,)
prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 1,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 5,/obj/item/weapon/reagent_containers/food/snacks/chips = 1,
/obj/item/weapon/reagent_containers/food/snacks/sosjerky = 2,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 1,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 1,
/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 1, /obj/item/weapon/reagent_containers/food/snacks/tastybread = 2, /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks = 2)
/obj/machinery/vending/cola
name = "Robust Softdrinks"
desc = "A softdrink vendor provided by Robust Industries, LLC."
icon_state = "Cola_Machine"
product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!"
product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space."
products = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 10,
/obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/starkist = 10,
/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_up = 10,
/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 10,
/obj/item/weapon/reagent_containers/food/drinks/cans/gingerale = 10)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko = 5, /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 6)
prices = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 1,
/obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/starkist = 1,
/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 2,/obj/item/weapon/reagent_containers/food/drinks/cans/space_up = 1,
/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 1,
/obj/item/weapon/reagent_containers/food/drinks/cans/gingerale = 1)
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
vending_sound = "machines/vending/vending_cans.ogg"
/obj/machinery/vending/fitness
name = "SweatMAX"
desc = "Fueled by your inner inadequacy!"
icon_state = "fitness"
products = list(/obj/item/weapon/reagent_containers/food/drinks/smallmilk = 16,
/obj/item/weapon/reagent_containers/food/drinks/smallchocmilk = 16,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake = 8,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask = 8,
/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar = 16,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 8,
/obj/item/weapon/reagent_containers/pill/diet = 8,
/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 5, //VOREStation Removal, YW Readdition,
/obj/item/weapon/towel/random = 8)
//VOREStation Edit Start
prices = list(/obj/item/weapon/reagent_containers/food/drinks/smallmilk = 3,
/obj/item/weapon/reagent_containers/food/drinks/smallchocmilk = 3,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake = 15,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask = 1,
/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar = 5,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 5,
/obj/item/weapon/reagent_containers/pill/diet = 25,
///obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 5,
/obj/item/weapon/towel/random = 20)
//VOREStation Edit End
contraband = list(/obj/item/weapon/reagent_containers/syringe/steroid = 4, /obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteanshake = 2) // VOREStation Add - Slurpable blobs.
/obj/machinery/vending/cart
name = "PTech"
desc = "Cartridges for PDAs."
product_slogans = "Carts to go!"
icon_state = "cart"
req_access = list(access_hop)
products = list(/obj/item/weapon/cartridge/medical = 10,/obj/item/weapon/cartridge/engineering = 10,/obj/item/weapon/cartridge/security = 10,
/obj/item/weapon/cartridge/janitor = 10,/obj/item/weapon/cartridge/signal/science = 10,/obj/item/device/pda/heads = 10,
/obj/item/weapon/cartridge/captain = 3,/obj/item/weapon/cartridge/quartermaster = 10)
req_log_access = access_hop
has_logs = 1
/obj/machinery/vending/cigarette
name = "cigarette machine"
desc = "If you want to get cancer, might as well do it in style!"
product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!"
product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs.;Feeling temperamental? Try a Temperamento!;Carcinoma Angels - go fuck yerself!;Don't be so hard on yourself, kid. Smoke a Lucky Star!"
vend_delay = 34
icon_state = "cigs"
products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 10,
/obj/item/weapon/storage/fancy/cigarettes/killthroat = 10,
/obj/item/weapon/storage/fancy/cigarettes/luckystars = 10,
/obj/item/weapon/storage/fancy/cigarettes/jerichos = 10,
/obj/item/weapon/storage/fancy/cigarettes/menthols = 10,
/obj/item/weapon/storage/rollingpapers = 10,
/obj/item/weapon/storage/box/matches = 10,
/obj/item/weapon/flame/lighter/random = 4)
contraband = list(/obj/item/weapon/flame/lighter/zippo = 4)
premium = list(/obj/item/weapon/storage/fancy/cigar = 5,
/obj/item/weapon/storage/fancy/cigarettes/carcinomas = 5,
/obj/item/weapon/storage/fancy/cigarettes/professionals = 5)
prices = list(/obj/item/weapon/storage/fancy/cigarettes = 12,
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 15,
/obj/item/weapon/storage/fancy/cigarettes/killthroat = 17,
/obj/item/weapon/storage/fancy/cigarettes/luckystars = 17,
/obj/item/weapon/storage/fancy/cigarettes/jerichos = 22,
/obj/item/weapon/storage/fancy/cigarettes/menthols = 18,
/obj/item/weapon/storage/rollingpapers = 10,
/obj/item/weapon/storage/box/matches = 1,
/obj/item/weapon/flame/lighter/random = 2)
/obj/machinery/vending/medical
name = "NanoMed Plus"
desc = "Medical drug dispenser."
icon_state = "med"
product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!"
req_access = list(access_medical)
products = list(/obj/item/weapon/reagent_containers/glass/bottle/antitoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline = 4,
/obj/item/weapon/reagent_containers/glass/bottle/stoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/toxin = 4,
/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/syringe = 12,
/obj/item/device/healthanalyzer = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2,
/obj/item/stack/medical/advanced/bruise_pack = 6, /obj/item/stack/medical/advanced/ointment = 6, /obj/item/stack/medical/splint = 4,
/obj/item/weapon/storage/pill_bottle/carbon = 2)
contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/stox = 4,/obj/item/weapon/reagent_containers/pill/antitox = 6)
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
req_log_access = access_cmo
has_logs = 1
/obj/machinery/vending/phoronresearch
name = "Toximate 3000"
desc = "All the fine parts you need in one vending machine!"
products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6,
/obj/item/device/transfer_valve = 6,/obj/item/device/assembly/timer = 6,/obj/item/device/assembly/signaler = 6,
/obj/item/device/assembly/prox_sensor = 6,/obj/item/device/assembly/igniter = 6)
req_log_access = access_rd
has_logs = 1
/obj/machinery/vending/wallmed1
name = "NanoMed"
desc = "A wall-mounted version of the NanoMed."
product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?"
icon_state = "wallmed"
density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/weapon/reagent_containers/hypospray/autoinjector = 4,/obj/item/device/healthanalyzer = 1)
contraband = list(/obj/item/weapon/reagent_containers/syringe/antitoxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/pill/tox = 1)
req_log_access = access_cmo
has_logs = 1
can_rotate = 0
/obj/machinery/vending/wallmed2
name = "NanoMed"
desc = "A wall-mounted version of the NanoMed, containing only vital first aid equipment."
icon_state = "wallmed"
density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
products = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector = 5,/obj/item/weapon/reagent_containers/syringe/antitoxin = 3,/obj/item/stack/medical/bruise_pack = 3,
/obj/item/stack/medical/ointment =3,/obj/item/device/healthanalyzer = 3)
contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3)
req_log_access = access_cmo
has_logs = 1
can_rotate = 0
/obj/machinery/vending/security
name = "SecTech"
desc = "A security equipment vendor."
product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?"
icon_state = "sec"
req_access = list(access_security)
products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5,
/obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6)
contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/box/donut = 2)
req_log_access = access_armory
has_logs = 1
/obj/machinery/vending/hydronutrients
name = "NutriMax"
desc = "A plant nutrients vendor."
product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!"
product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
icon_state = "nutri_generic"
products = list(/obj/item/weapon/reagent_containers/glass/bottle/eznutrient = 6,/obj/item/weapon/reagent_containers/glass/bottle/left4zed = 4,/obj/item/weapon/reagent_containers/glass/bottle/robustharvest = 3,/obj/item/weapon/plantspray/pests = 20,
/obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4,/obj/item/weapon/storage/bag/plants = 5)
premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
/obj/machinery/vending/hydroseeds
name = "MegaSeed Servitor"
desc = "When you need seeds fast!"
product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!"
icon_state = "seeds_generic"
products = list(/obj/item/seeds/bananaseed = 3,/obj/item/seeds/berryseed = 3,/obj/item/seeds/carrotseed = 3,/obj/item/seeds/chantermycelium = 3,/obj/item/seeds/chiliseed = 3,
/obj/item/seeds/cornseed = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/replicapod = 3,/obj/item/seeds/soyaseed = 3,
/obj/item/seeds/sunflowerseed = 3,/obj/item/seeds/tomatoseed = 3,/obj/item/seeds/towermycelium = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/appleseed = 3,
/obj/item/seeds/poppyseed = 3,/obj/item/seeds/sugarcaneseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/peanutseed = 3,/obj/item/seeds/whitebeetseed = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/lavenderseed = 3,/obj/item/seeds/limeseed = 3,
/obj/item/seeds/lemonseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/cocoapodseed = 3,/obj/item/seeds/plumpmycelium = 2,
/obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3)
contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/mtearseed = 2,
/obj/item/seeds/nettleseed = 2,/obj/item/seeds/reishimycelium = 2,/obj/item/seeds/reishimycelium = 2,/obj/item/seeds/shandseed = 2,)
premium = list(/obj/item/weapon/reagent_containers/spray/waterflower = 1)
/**
* Populate hydroseeds product_records
*
* This needs to be customized to fetch the actual names of the seeds, otherwise
* the machine would simply list "packet of seeds" times 20
*/
/obj/machinery/vending/hydroseeds/build_inventory()
var/list/all_products = list(
list(products, CAT_NORMAL),
list(contraband, CAT_HIDDEN),
list(premium, CAT_COIN))
for(var/current_list in all_products)
var/category = current_list[2]
for(var/entry in current_list[1])
var/obj/item/seeds/S = new entry(src)
var/name = S.name
var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry, name)
product.price = (entry in prices) ? prices[entry] : 0
product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1
product.category = category
product_records.Add(product)
/obj/machinery/vending/magivend
name = "MagiVend"
desc = "A magic vending machine."
icon_state = "MagiVend"
product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!"
vend_delay = 15
vend_reply = "Have an enchanted evening!"
product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!"
products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/staff = 2)
/obj/machinery/vending/dinnerware
name = "Dinnerware"
desc = "A kitchen and restaurant equipment vendor."
product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
icon_state = "dinnerware"
products = list(
/obj/item/weapon/reagent_containers/food/condiment/yeast = 5,
/obj/item/weapon/reagent_containers/food/condiment/cornoil = 5,
/obj/item/weapon/tray = 8,
/obj/item/weapon/material/kitchen/utensil/fork = 6,
/obj/item/weapon/material/knife = 6,
/obj/item/weapon/material/kitchen/utensil/spoon = 6,
/obj/item/weapon/material/knife = 3,
/obj/item/weapon/material/kitchen/rollingpin = 2,
/obj/item/weapon/reagent_containers/food/drinks/glass2/square = 8,
/obj/item/weapon/reagent_containers/food/drinks/glass2/shake = 8,
/obj/item/weapon/glass_extra/stick = 15,
/obj/item/weapon/glass_extra/straw = 15,
/obj/item/clothing/suit/chef/classic = 2,
/obj/item/weapon/storage/bag/food = 2,
/obj/item/weapon/storage/toolbox/lunchbox = 3,
/obj/item/weapon/storage/toolbox/lunchbox/heart = 3,
/obj/item/weapon/storage/toolbox/lunchbox/cat = 3,
/obj/item/weapon/storage/toolbox/lunchbox/nt = 3,
/obj/item/weapon/storage/toolbox/lunchbox/mars = 3,
/obj/item/weapon/storage/toolbox/lunchbox/cti = 3,
/obj/item/weapon/storage/toolbox/lunchbox/nymph = 3,
/obj/item/weapon/storage/toolbox/lunchbox/syndicate = 3,
/obj/item/trash/bowl = 10) //VOREStation Add
contraband = list(/obj/item/weapon/material/knife/butch = 2)
/obj/machinery/vending/sovietsoda
name = "BODA"
desc = "An old sweet water vending machine,how did this end up here?"
icon_state = "sovietsoda"
product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem."
products = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/space_up = 30) // TODO Russian soda can
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/cola = 20) // TODO Russian cola can
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
vending_sound = "machines/vending/vending_cans.ogg"
/obj/machinery/vending/tool
name = "YouTool"
desc = "Tools for tools."
icon_state = "tool"
//req_access = list(access_maint_tunnels) //Maintenance access
products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/weapon/tool/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/tool/wirecutters = 5,
/obj/item/weapon/tool/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/tool/screwdriver = 5,
/obj/item/device/flashlight/glowstick = 3, /obj/item/device/flashlight/glowstick/red = 3, /obj/item/device/flashlight/glowstick/blue = 3,
/obj/item/device/flashlight/glowstick/orange =3, /obj/item/device/flashlight/glowstick/yellow = 3)
contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2,)
premium = list(/obj/item/clothing/gloves/yellow = 1)
req_log_access = access_ce
has_logs = 1
/obj/machinery/vending/engivend
name = "Engi-Vend"
desc = "Spare tool vending. What? Did you expect some witty description?"
icon_state = "engivend"
req_access = list(access_engine_equip)
products = list(/obj/item/device/geiger = 4,/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/cell/high = 10,
/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,
/obj/item/weapon/circuitboard/airalarm = 10,/obj/item/weapon/circuitboard/firealarm = 10,/obj/item/weapon/circuitboard/status_display = 2,
/obj/item/weapon/circuitboard/ai_status_display = 2,/obj/item/weapon/circuitboard/newscaster = 2,/obj/item/weapon/circuitboard/holopad = 2,
/obj/item/weapon/circuitboard/intercom = 4,/obj/item/weapon/circuitboard/security/telescreen/entertainment = 4,
/obj/item/weapon/stock_parts/motor = 2,/obj/item/weapon/stock_parts/spring = 2,/obj/item/weapon/stock_parts/gear = 2,
/obj/item/weapon/circuitboard/atm,/obj/item/weapon/circuitboard/guestpass,/obj/item/weapon/circuitboard/keycard_auth,
/obj/item/weapon/circuitboard/photocopier,/obj/item/weapon/circuitboard/fax,/obj/item/weapon/circuitboard/request,
/obj/item/weapon/circuitboard/microwave,/obj/item/weapon/circuitboard/washing,/obj/item/weapon/circuitboard/scanner_console,
/obj/item/weapon/circuitboard/sleeper_console,/obj/item/weapon/circuitboard/body_scanner,/obj/item/weapon/circuitboard/sleeper,
/obj/item/weapon/circuitboard/dna_analyzer)
contraband = list(/obj/item/weapon/cell/potato = 3)
premium = list(/obj/item/weapon/storage/belt/utility = 3)
product_records = list()
req_log_access = access_ce
has_logs = 1
/obj/machinery/vending/engineering
name = "Robco Tool Maker"
desc = "Everything you need for do-it-yourself station repair."
icon_state = "engi"
req_access = list(access_engine_equip)
products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/orange = 4,/obj/item/clothing/head/hardhat = 4,
/obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/yellow = 4, /obj/item/weapon/tool/screwdriver = 12,
/obj/item/weapon/tool/crowbar = 12,/obj/item/weapon/tool/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/tool/wrench = 12,/obj/item/device/t_scanner = 12,
/obj/item/stack/cable_coil/heavyduty = 8, /obj/item/weapon/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8,
/obj/item/weapon/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5,/obj/item/weapon/stock_parts/micro_laser = 5,
/obj/item/weapon/stock_parts/matter_bin = 5,/obj/item/weapon/stock_parts/manipulator = 5,/obj/item/weapon/stock_parts/console_screen = 5)
// There was an incorrect entry (cablecoil/power). I improvised to cablecoil/heavyduty.
// Another invalid entry, /obj/item/weapon/circuitry. I don't even know what that would translate to, removed it.
// The original products list wasn't finished. The ones without given quantities became quantity 5. -Sayu
req_log_access = access_ce
has_logs = 1
/obj/machinery/vending/robotics
name = "Robotech Deluxe"
desc = "All the tools you need to create your own robot army."
icon_state = "robotics"
req_access = list(access_robotics)
products = list(/obj/item/clothing/suit/storage/toggle/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/stack/cable_coil = 4,/obj/item/device/flash = 4,
/obj/item/weapon/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3,
/obj/item/weapon/surgical/scalpel = 2,/obj/item/weapon/surgical/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
/obj/item/weapon/tool/screwdriver = 5,/obj/item/weapon/tool/crowbar = 5)
//everything after the power cell had no amounts, I improvised. -Sayu
req_log_access = access_rd
has_logs = 1
/obj/machinery/vending/giftvendor
name = "AlliCo Baubles and Confectionaries"
desc = "For that special someone!"
icon_state = "giftvendor"
vend_delay = 15
products = list(/obj/item/weapon/storage/fancy/heartbox = 5,
/obj/item/toy/bouquet = 5,
/obj/item/toy/bouquet/fake = 4,
/obj/item/weapon/paper/card/smile = 3,
/obj/item/weapon/paper/card/heart = 3,
/obj/item/weapon/paper/card/cat = 3,
/obj/item/weapon/paper/card/flower = 3,
/obj/item/clothing/accessory/bracelet/friendship = 5,
/obj/item/toy/plushie/therapy/red = 2,
/obj/item/toy/plushie/therapy/purple = 2,
/obj/item/toy/plushie/therapy/blue = 2,
/obj/item/toy/plushie/therapy/yellow = 2,
/obj/item/toy/plushie/therapy/orange = 2,
/obj/item/toy/plushie/therapy/green = 2,
/obj/item/toy/plushie/nymph = 2,
/obj/item/toy/plushie/mouse = 2,
/obj/item/toy/plushie/kitten = 2,
/obj/item/toy/plushie/lizard = 2,
/obj/item/toy/plushie/spider = 2,
/obj/item/toy/plushie/farwa = 2,
/obj/item/toy/plushie/corgi = 1,
/obj/item/toy/plushie/octopus = 1,
/obj/item/toy/plushie/face_hugger = 1,
/obj/item/toy/plushie/carp = 1,
/obj/item/toy/plushie/deer = 1,
/obj/item/toy/plushie/tabby_cat = 1,
/obj/item/device/threadneedle = 3,
//VOREStation Add Start
/obj/item/toy/plushie/lizardplushie/kobold = 1,
/obj/item/toy/plushie/slimeplushie = 1,
/obj/item/toy/plushie/box = 1,
/obj/item/toy/plushie/borgplushie = 1,
/obj/item/toy/plushie/borgplushie/medihound = 1,
/obj/item/toy/plushie/borgplushie/scrubpuppy = 1,
/obj/item/toy/plushie/foxbear = 1,
/obj/item/toy/plushie/nukeplushie = 1,
/obj/item/toy/plushie/otter = 1)
//VOREStation Add End
premium = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/champagne = 1,
/obj/item/weapon/storage/trinketbox = 2)
prices = list(/obj/item/weapon/storage/fancy/heartbox = 15,
/obj/item/toy/bouquet = 10,
/obj/item/toy/bouquet/fake = 3,
/obj/item/weapon/paper/card/smile = 1,
/obj/item/weapon/paper/card/heart = 1,
/obj/item/weapon/paper/card/cat = 1,
/obj/item/weapon/paper/card/flower = 1,
/obj/item/clothing/accessory/bracelet/friendship = 5,
/obj/item/toy/plushie/therapy/red = 20,
/obj/item/toy/plushie/therapy/purple = 20,
/obj/item/toy/plushie/therapy/blue = 20,
/obj/item/toy/plushie/therapy/yellow = 20,
/obj/item/toy/plushie/therapy/orange = 20,
/obj/item/toy/plushie/therapy/green = 20,
/obj/item/toy/plushie/nymph = 35,
/obj/item/toy/plushie/mouse = 35,
/obj/item/toy/plushie/kitten = 35,
/obj/item/toy/plushie/lizard = 35,
/obj/item/toy/plushie/spider = 35,
/obj/item/toy/plushie/farwa = 35,
/obj/item/toy/plushie/corgi = 50,
/obj/item/toy/plushie/octopus = 50,
/obj/item/toy/plushie/face_hugger = 50,
/obj/item/toy/plushie/carp = 50,
/obj/item/toy/plushie/deer = 50,
/obj/item/toy/plushie/tabby_cat = 50,
/obj/item/device/threadneedle = 2,
//VOREStation Add Start
/obj/item/toy/plushie/lizardplushie/kobold = 50,
/obj/item/toy/plushie/slimeplushie = 50,
/obj/item/toy/plushie/box = 50,
/obj/item/toy/plushie/borgplushie = 50,
/obj/item/toy/plushie/borgplushie/medihound = 50,
/obj/item/toy/plushie/borgplushie/scrubpuppy = 50,
/obj/item/toy/plushie/foxbear = 50,
/obj/item/toy/plushie/nukeplushie = 50,
/obj/item/toy/plushie/otter = 50)
//VOREStation Add End
/obj/machinery/vending/fishing
name = "Loot Trawler"
desc = "A special vendor for fishing equipment."
product_ads = "Tired of trawling across the ocean floor? Get our loot!;Chum and rods.;Don't get baited into fishing without us!;Baby is your star-sign pisces? We'd make a perfect match.;Do not fear, plenty to catch around here.;Don't get reeled in helplessly, get your own rod today!"
icon_state = "fishvendor"
products = list(/obj/item/weapon/material/fishing_rod/modern/cheap = 6,
/obj/item/weapon/storage/box/wormcan = 4,
/obj/item/weapon/storage/box/wormcan/sickly = 10,
/obj/item/weapon/material/fishing_net = 2,
/obj/item/stack/cable_coil/random = 6)
prices = list(/obj/item/weapon/material/fishing_rod/modern/cheap = 50,
/obj/item/weapon/storage/box/wormcan = 12,
/obj/item/weapon/storage/box/wormcan/sickly = 6,
/obj/item/weapon/material/fishing_net = 40,
/obj/item/stack/cable_coil/random = 4)
premium = list(/obj/item/weapon/storage/box/wormcan/deluxe = 1)
contraband = list(/obj/item/weapon/storage/box/wormcan/deluxe = 1)
//Actual machines are in vending_machines.dm

View File

@@ -0,0 +1,566 @@
//
//The code for machines are in vending.dm
//Only put machines here.
//
//
/*
* Vending machine types
*/
/*
/obj/machinery/vending/[vendors name here] // --vending machine template :)
name = ""
desc = ""
icon = ''
icon_state = ""
vend_delay = 15
products = list()
contraband = list()
premium = list()
*/
/*
/obj/machinery/vending/atmospherics //Commenting this out until someone ponies up some actual working, broken, and unpowered sprites - Quarxink
name = "Tank Vendor"
desc = "A vendor with a wide variety of masks and gas tanks."
icon = 'icons/obj/objects.dmi'
icon_state = "dispenser"
product_paths = "/obj/item/weapon/tank/oxygen;/obj/item/weapon/tank/phoron;/obj/item/weapon/tank/emergency_oxygen;/obj/item/weapon/tank/emergency_oxygen/engi;/obj/item/clothing/mask/breath"
productamounts = "10;10;10;5;25"
vend_delay = 0
*/
/obj/machinery/vending/boozeomat
name = "Booze-O-Mat"
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
icon_state = "fridge_dark"
products = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/square = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/rocks = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/shake = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/shot = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/pint = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/mug = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/wine = 10,
/obj/item/weapon/reagent_containers/food/drinks/glass2/carafe = 2, //VOREStation Add - Carafes and Pitchers
/obj/item/weapon/reagent_containers/food/drinks/glass2/pitcher = 2, //VOREStation Add - Carafes and Pitchers
/obj/item/weapon/reagent_containers/food/drinks/metaglass = 10,
/obj/item/weapon/reagent_containers/food/drinks/metaglass/metapint = 10,
/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/grenadine = 5,
/obj/item/weapon/reagent_containers/food/condiment/cornoil = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/peppermintschnapps = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/peachschnapps = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/lemonadeschnapps = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/sake = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/small/cider = 15,
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/lemonjuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/applejuice = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/milk = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cola = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/space_up = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind = 5,
/obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 15,
/obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 15,
/obj/item/weapon/reagent_containers/food/drinks/cans/gingerale = 15,
/obj/item/weapon/reagent_containers/food/drinks/flask/barflask = 5,
/obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask = 5,
/obj/item/weapon/reagent_containers/food/drinks/ice = 10,
/obj/item/weapon/reagent_containers/food/drinks/tea = 15,
/obj/item/weapon/glass_extra/stick = 30,
/obj/item/weapon/glass_extra/straw = 30)
contraband = list()
vend_delay = 15
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
product_slogans = "I hope nobody asks me for a bloody cup o' tea...;Alcohol is humanity's friend. Would you abandon a friend?;Quite delighted to serve you!;Is nobody thirsty on this station?"
product_ads = "Drink up!;Booze is good for you!;Alcohol is humanity's best friend.;Quite delighted to serve you!;Care for a nice, cold beer?;Nothing cures you like booze!;Have a sip!;Have a drink!;Have a beer!;Beer is good for you!;Only the finest alcohol!;Best quality booze since 2053!;Award-winning wine!;Maximum alcohol!;Man loves beer.;A toast for progress!"
req_access = list(access_bar)
req_log_access = access_bar
has_logs = 1
vending_sound = "machines/vending/vending_cans.ogg"
/obj/machinery/vending/assist
products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4,
/obj/item/weapon/tool/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4)
contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2)
product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
/obj/machinery/vending/coffee
name = "Hot Drinks machine"
desc = "A vending machine which dispenses hot drinks."
product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies"
icon_state = "coffee"
vend_delay = 34
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
vend_power_usage = 85000 //85 kJ to heat a 250 mL cup of coffee
products = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25,/obj/item/weapon/reagent_containers/food/drinks/tea = 25,/obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/ice = 10)
prices = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 2, /obj/item/weapon/reagent_containers/food/drinks/tea = 2, /obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 2) //VOREStation Edit
vending_sound = "machines/vending/vending_coffee.ogg"
/obj/machinery/vending/snack
name = "Getmore Chocolate Corp"
desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars."
product_slogans = "Try our new nougat bar!;Twice the calories for half the price!"
product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!"
icon_state = "snack"
products = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 12,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 12,/obj/item/weapon/reagent_containers/food/snacks/chips =12,
/obj/item/weapon/reagent_containers/food/snacks/sosjerky = 12,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 12,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 12,
/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 12, /obj/item/weapon/reagent_containers/food/snacks/tastybread = 12, /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks = 6)
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6,/obj/item/weapon/reagent_containers/food/snacks/unajerky = 12,)
prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 1,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 5,/obj/item/weapon/reagent_containers/food/snacks/chips = 1,
/obj/item/weapon/reagent_containers/food/snacks/sosjerky = 2,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 1,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 1,
/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 1, /obj/item/weapon/reagent_containers/food/snacks/tastybread = 2, /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks = 2)
/obj/machinery/vending/cola
name = "Robust Softdrinks"
desc = "A softdrink vendor provided by Robust Industries, LLC."
icon_state = "Cola_Machine"
product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!"
product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space."
products = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 10,
/obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/starkist = 10,
/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_up = 10,
/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 10,
/obj/item/weapon/reagent_containers/food/drinks/cans/gingerale = 10)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko = 5, /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 6)
prices = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 1,
/obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/starkist = 1,
/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 2,/obj/item/weapon/reagent_containers/food/drinks/cans/space_up = 1,
/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 1,
/obj/item/weapon/reagent_containers/food/drinks/cans/gingerale = 1)
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
vending_sound = "machines/vending/vending_cans.ogg"
/obj/machinery/vending/fitness
name = "SweatMAX"
desc = "Fueled by your inner inadequacy!"
icon_state = "fitness"
//VOREStation Edit Start
products = list(/obj/item/weapon/reagent_containers/food/drinks/smallmilk = 16,
/obj/item/weapon/reagent_containers/food/drinks/smallchocmilk = 16,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake = 8,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask = 8,
/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar = 16,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 8,
/obj/item/weapon/reagent_containers/pill/diet = 8,
///obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 5, //VOREStation Removal,
/obj/item/weapon/towel/random = 8,
/obj/item/toy/tennis = 4)
prices = list(/obj/item/weapon/reagent_containers/food/drinks/smallmilk = 3,
/obj/item/weapon/reagent_containers/food/drinks/smallchocmilk = 3,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake = 15,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask = 1,
/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar = 5,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood = 5,
/obj/item/weapon/reagent_containers/pill/diet = 25,
///obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose = 5,
/obj/item/weapon/towel/random = 20,
/obj/item/toy/tennis = 15)
//VOREStation Edit End
contraband = list(/obj/item/weapon/reagent_containers/syringe/steroid = 4, /obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteanshake = 2) // VOREStation Add - Slurpable blobs.
/obj/machinery/vending/cart
name = "PTech"
desc = "Cartridges for PDAs."
product_slogans = "Carts to go!"
icon_state = "cart"
req_access = list(access_hop)
products = list(/obj/item/weapon/cartridge/medical = 10,/obj/item/weapon/cartridge/engineering = 10,/obj/item/weapon/cartridge/security = 10,
/obj/item/weapon/cartridge/janitor = 10,/obj/item/weapon/cartridge/signal/science = 10,/obj/item/device/pda/heads = 10,
/obj/item/weapon/cartridge/captain = 3,/obj/item/weapon/cartridge/quartermaster = 10)
req_log_access = access_hop
has_logs = 1
/obj/machinery/vending/cigarette
name = "cigarette machine"
desc = "If you want to get cancer, might as well do it in style!"
product_slogans = "Space cigs taste good like a cigarette should.;I'd rather toolbox than switch.;Smoke!;Don't believe the reports - smoke today!"
product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs.;Feeling temperamental? Try a Temperamento!;Carcinoma Angels - go fuck yerself!;Don't be so hard on yourself, kid. Smoke a Lucky Star!"
vend_delay = 34
icon_state = "cigs"
products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 10,
/obj/item/weapon/storage/fancy/cigarettes/killthroat = 10,
/obj/item/weapon/storage/fancy/cigarettes/luckystars = 10,
/obj/item/weapon/storage/fancy/cigarettes/jerichos = 10,
/obj/item/weapon/storage/fancy/cigarettes/menthols = 10,
/obj/item/weapon/storage/rollingpapers = 10,
/obj/item/weapon/storage/box/matches = 10,
/obj/item/weapon/flame/lighter/random = 4)
contraband = list(/obj/item/weapon/flame/lighter/zippo = 4)
premium = list(/obj/item/weapon/storage/fancy/cigar = 5,
/obj/item/weapon/storage/fancy/cigarettes/carcinomas = 5,
/obj/item/weapon/storage/fancy/cigarettes/professionals = 5)
prices = list(/obj/item/weapon/storage/fancy/cigarettes = 12,
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 15,
/obj/item/weapon/storage/fancy/cigarettes/killthroat = 17,
/obj/item/weapon/storage/fancy/cigarettes/luckystars = 17,
/obj/item/weapon/storage/fancy/cigarettes/jerichos = 22,
/obj/item/weapon/storage/fancy/cigarettes/menthols = 18,
/obj/item/weapon/storage/rollingpapers = 10,
/obj/item/weapon/storage/box/matches = 1,
/obj/item/weapon/flame/lighter/random = 2)
/obj/machinery/vending/medical
name = "NanoMed Plus"
desc = "Medical drug dispenser."
icon_state = "med"
product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!"
req_access = list(access_medical)
products = list(/obj/item/weapon/reagent_containers/glass/bottle/antitoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline = 4,
/obj/item/weapon/reagent_containers/glass/bottle/stoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/toxin = 4,
/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/syringe = 12,
/obj/item/device/healthanalyzer = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2,
/obj/item/stack/medical/advanced/bruise_pack = 6, /obj/item/stack/medical/advanced/ointment = 6, /obj/item/stack/medical/splint = 4,
/obj/item/weapon/storage/pill_bottle/carbon = 2)
contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/stox = 4,/obj/item/weapon/reagent_containers/pill/antitox = 6)
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
req_log_access = access_cmo
has_logs = 1
/obj/machinery/vending/phoronresearch
name = "Toximate 3000"
desc = "All the fine parts you need in one vending machine!"
products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6,
/obj/item/device/transfer_valve = 6,/obj/item/device/assembly/timer = 6,/obj/item/device/assembly/signaler = 6,
/obj/item/device/assembly/prox_sensor = 6,/obj/item/device/assembly/igniter = 6)
req_log_access = access_rd
has_logs = 1
/obj/machinery/vending/wallmed1
name = "NanoMed"
desc = "A wall-mounted version of the NanoMed."
product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?"
icon_state = "wallmed"
density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/weapon/reagent_containers/hypospray/autoinjector = 4,/obj/item/device/healthanalyzer = 1)
contraband = list(/obj/item/weapon/reagent_containers/syringe/antitoxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/pill/tox = 1)
req_log_access = access_cmo
has_logs = 1
can_rotate = 0
/obj/machinery/vending/wallmed2
name = "NanoMed"
desc = "A wall-mounted version of the NanoMed, containing only vital first aid equipment."
icon_state = "wallmed"
density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
products = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector = 5,/obj/item/weapon/reagent_containers/syringe/antitoxin = 3,/obj/item/stack/medical/bruise_pack = 3,
/obj/item/stack/medical/ointment =3,/obj/item/device/healthanalyzer = 3)
contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3)
req_log_access = access_cmo
has_logs = 1
can_rotate = 0
/obj/machinery/vending/security
name = "SecTech"
desc = "A security equipment vendor."
product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?"
icon_state = "sec"
req_access = list(access_security)
products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5,
/obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6)
contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/box/donut = 2)
req_log_access = access_armory
has_logs = 1
/obj/machinery/vending/hydronutrients
name = "NutriMax"
desc = "A plant nutrients vendor."
product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!"
product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..."
icon_state = "nutri_generic"
products = list(/obj/item/weapon/reagent_containers/glass/bottle/eznutrient = 6,/obj/item/weapon/reagent_containers/glass/bottle/left4zed = 4,/obj/item/weapon/reagent_containers/glass/bottle/robustharvest = 3,/obj/item/weapon/plantspray/pests = 20,
/obj/item/weapon/reagent_containers/syringe = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4,/obj/item/weapon/storage/bag/plants = 5)
premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5)
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
/obj/machinery/vending/hydroseeds
name = "MegaSeed Servitor"
desc = "When you need seeds fast!"
product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection on the station!;Also certain mushroom varieties available, more for experts! Get certified today!"
product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!"
icon_state = "seeds_generic"
products = list(/obj/item/seeds/bananaseed = 3,/obj/item/seeds/berryseed = 3,/obj/item/seeds/carrotseed = 3,/obj/item/seeds/chantermycelium = 3,/obj/item/seeds/chiliseed = 3,
/obj/item/seeds/cornseed = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/replicapod = 3,/obj/item/seeds/soyaseed = 3,
/obj/item/seeds/sunflowerseed = 3,/obj/item/seeds/tomatoseed = 3,/obj/item/seeds/towermycelium = 3,/obj/item/seeds/wheatseed = 3,/obj/item/seeds/appleseed = 3,
/obj/item/seeds/poppyseed = 3,/obj/item/seeds/sugarcaneseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/peanutseed = 3,/obj/item/seeds/whitebeetseed = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/lavenderseed = 3,/obj/item/seeds/limeseed = 3,
/obj/item/seeds/lemonseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/cocoapodseed = 3,/obj/item/seeds/plumpmycelium = 2,
/obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3)
contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/mtearseed = 2,
/obj/item/seeds/nettleseed = 2,/obj/item/seeds/reishimycelium = 2,/obj/item/seeds/reishimycelium = 2,/obj/item/seeds/shandseed = 2,)
premium = list(/obj/item/weapon/reagent_containers/spray/waterflower = 1)
/**
* Populate hydroseeds product_records
*
* This needs to be customized to fetch the actual names of the seeds, otherwise
* the machine would simply list "packet of seeds" times 20
*/
/obj/machinery/vending/hydroseeds/build_inventory()
var/list/all_products = list(
list(products, CAT_NORMAL),
list(contraband, CAT_HIDDEN),
list(premium, CAT_COIN))
for(var/current_list in all_products)
var/category = current_list[2]
for(var/entry in current_list[1])
var/obj/item/seeds/S = new entry(src)
var/name = S.name
var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry, name)
product.price = (entry in prices) ? prices[entry] : 0
product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1
product.category = category
product_records.Add(product)
/obj/machinery/vending/magivend
name = "MagiVend"
desc = "A magic vending machine."
icon_state = "MagiVend"
product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!"
vend_delay = 15
vend_reply = "Have an enchanted evening!"
product_ads = "FJKLFJSD;AJKFLBJAKL;1234 LOONIES LOL!;>MFW;Kill them fuckers!;GET DAT FUKKEN DISK;HONK!;EI NATH;Destroy the station!;Admin conspiracies since forever!;Space-time bending hardware!"
products = list(/obj/item/clothing/head/wizard = 1,/obj/item/clothing/suit/wizrobe = 1,/obj/item/clothing/head/wizard/red = 1,/obj/item/clothing/suit/wizrobe/red = 1,/obj/item/clothing/shoes/sandal = 1,/obj/item/weapon/staff = 2)
/obj/machinery/vending/dinnerware
name = "Dinnerware"
desc = "A kitchen and restaurant equipment vendor."
product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
icon_state = "dinnerware"
products = list(
/obj/item/weapon/reagent_containers/food/condiment/yeast = 5,
/obj/item/weapon/reagent_containers/food/condiment/cornoil = 5,
/obj/item/weapon/tray = 8,
/obj/item/weapon/material/kitchen/utensil/fork = 6,
/obj/item/weapon/material/knife = 6,
/obj/item/weapon/material/kitchen/utensil/spoon = 6,
/obj/item/weapon/material/knife = 3,
/obj/item/weapon/material/kitchen/rollingpin = 2,
/obj/item/weapon/reagent_containers/food/drinks/glass2/square = 8,
/obj/item/weapon/reagent_containers/food/drinks/glass2/shake = 8,
/obj/item/weapon/glass_extra/stick = 15,
/obj/item/weapon/glass_extra/straw = 15,
/obj/item/clothing/suit/chef/classic = 2,
/obj/item/weapon/storage/bag/food = 2,
/obj/item/weapon/storage/toolbox/lunchbox = 3,
/obj/item/weapon/storage/toolbox/lunchbox/heart = 3,
/obj/item/weapon/storage/toolbox/lunchbox/cat = 3,
/obj/item/weapon/storage/toolbox/lunchbox/nt = 3,
/obj/item/weapon/storage/toolbox/lunchbox/mars = 3,
/obj/item/weapon/storage/toolbox/lunchbox/cti = 3,
/obj/item/weapon/storage/toolbox/lunchbox/nymph = 3,
/obj/item/weapon/storage/toolbox/lunchbox/syndicate = 3,
/obj/item/trash/bowl = 10) //VOREStation Add
contraband = list(/obj/item/weapon/material/knife/butch = 2)
/obj/machinery/vending/sovietsoda
name = "BODA"
desc = "An old sweet water vending machine,how did this end up here?"
icon_state = "sovietsoda"
product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem."
products = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/space_up = 30) // TODO Russian soda can
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/cola = 20) // TODO Russian cola can
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
vending_sound = "machines/vending/vending_cans.ogg"
/obj/machinery/vending/tool
name = "YouTool"
desc = "Tools for tools."
icon_state = "tool"
//req_access = list(access_maint_tunnels) //Maintenance access
products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/weapon/tool/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/tool/wirecutters = 5,
/obj/item/weapon/tool/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/tool/screwdriver = 5,
/obj/item/device/flashlight/glowstick = 3, /obj/item/device/flashlight/glowstick/red = 3, /obj/item/device/flashlight/glowstick/blue = 3,
/obj/item/device/flashlight/glowstick/orange =3, /obj/item/device/flashlight/glowstick/yellow = 3)
contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2,)
premium = list(/obj/item/clothing/gloves/yellow = 1)
req_log_access = access_ce
has_logs = 1
/obj/machinery/vending/engivend
name = "Engi-Vend"
desc = "Spare tool vending. What? Did you expect some witty description?"
icon_state = "engivend"
req_access = list(access_engine_equip)
products = list(/obj/item/device/geiger = 4,/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/cell/high = 10,
/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,
/obj/item/weapon/circuitboard/airalarm = 10,/obj/item/weapon/circuitboard/firealarm = 10,/obj/item/weapon/circuitboard/status_display = 2,
/obj/item/weapon/circuitboard/ai_status_display = 2,/obj/item/weapon/circuitboard/newscaster = 2,/obj/item/weapon/circuitboard/holopad = 2,
/obj/item/weapon/circuitboard/intercom = 4,/obj/item/weapon/circuitboard/security/telescreen/entertainment = 4,
/obj/item/weapon/stock_parts/motor = 2,/obj/item/weapon/stock_parts/spring = 2,/obj/item/weapon/stock_parts/gear = 2,
/obj/item/weapon/circuitboard/atm,/obj/item/weapon/circuitboard/guestpass,/obj/item/weapon/circuitboard/keycard_auth,
/obj/item/weapon/circuitboard/photocopier,/obj/item/weapon/circuitboard/fax,/obj/item/weapon/circuitboard/request,
/obj/item/weapon/circuitboard/microwave,/obj/item/weapon/circuitboard/washing,/obj/item/weapon/circuitboard/scanner_console,
/obj/item/weapon/circuitboard/sleeper_console,/obj/item/weapon/circuitboard/body_scanner,/obj/item/weapon/circuitboard/sleeper,
/obj/item/weapon/circuitboard/dna_analyzer)
contraband = list(/obj/item/weapon/cell/potato = 3)
premium = list(/obj/item/weapon/storage/belt/utility = 3)
product_records = list()
req_log_access = access_ce
has_logs = 1
/obj/machinery/vending/engineering
name = "Robco Tool Maker"
desc = "Everything you need for do-it-yourself station repair."
icon_state = "engi"
req_access = list(access_engine_equip)
products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/orange = 4,/obj/item/clothing/head/hardhat = 4,
/obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/yellow = 4, /obj/item/weapon/tool/screwdriver = 12,
/obj/item/weapon/tool/crowbar = 12,/obj/item/weapon/tool/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/tool/wrench = 12,/obj/item/device/t_scanner = 12,
/obj/item/stack/cable_coil/heavyduty = 8, /obj/item/weapon/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8,
/obj/item/weapon/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5,/obj/item/weapon/stock_parts/micro_laser = 5,
/obj/item/weapon/stock_parts/matter_bin = 5,/obj/item/weapon/stock_parts/manipulator = 5,/obj/item/weapon/stock_parts/console_screen = 5)
// There was an incorrect entry (cablecoil/power). I improvised to cablecoil/heavyduty.
// Another invalid entry, /obj/item/weapon/circuitry. I don't even know what that would translate to, removed it.
// The original products list wasn't finished. The ones without given quantities became quantity 5. -Sayu
req_log_access = access_ce
has_logs = 1
/obj/machinery/vending/robotics
name = "Robotech Deluxe"
desc = "All the tools you need to create your own robot army."
icon_state = "robotics"
req_access = list(access_robotics)
products = list(/obj/item/clothing/suit/storage/toggle/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/stack/cable_coil = 4,/obj/item/device/flash = 4,
/obj/item/weapon/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3,
/obj/item/weapon/surgical/scalpel = 2,/obj/item/weapon/surgical/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
/obj/item/weapon/tool/screwdriver = 5,/obj/item/weapon/tool/crowbar = 5)
//everything after the power cell had no amounts, I improvised. -Sayu
req_log_access = access_rd
has_logs = 1
/obj/machinery/vending/giftvendor
name = "AlliCo Baubles and Confectionaries"
desc = "For that special someone!"
icon_state = "giftvendor"
vend_delay = 15
products = list(/obj/item/weapon/storage/fancy/heartbox = 5,
/obj/item/toy/bouquet = 5,
/obj/item/toy/bouquet/fake = 4,
/obj/item/weapon/paper/card/smile = 3,
/obj/item/weapon/paper/card/heart = 3,
/obj/item/weapon/paper/card/cat = 3,
/obj/item/weapon/paper/card/flower = 3,
/obj/item/clothing/accessory/bracelet/friendship = 5,
/obj/item/toy/plushie/therapy/red = 2,
/obj/item/toy/plushie/therapy/purple = 2,
/obj/item/toy/plushie/therapy/blue = 2,
/obj/item/toy/plushie/therapy/yellow = 2,
/obj/item/toy/plushie/therapy/orange = 2,
/obj/item/toy/plushie/therapy/green = 2,
/obj/item/toy/plushie/nymph = 2,
/obj/item/toy/plushie/mouse = 2,
/obj/item/toy/plushie/kitten = 2,
/obj/item/toy/plushie/lizard = 2,
/obj/item/toy/plushie/spider = 2,
/obj/item/toy/plushie/farwa = 2,
/obj/item/toy/plushie/corgi = 1,
/obj/item/toy/plushie/octopus = 1,
/obj/item/toy/plushie/face_hugger = 1,
/obj/item/toy/plushie/carp = 1,
/obj/item/toy/plushie/deer = 1,
/obj/item/toy/plushie/tabby_cat = 1,
/obj/item/device/threadneedle = 3,
//VOREStation Add Start
/obj/item/toy/plushie/lizardplushie/kobold = 1,
/obj/item/toy/plushie/slimeplushie = 1,
/obj/item/toy/plushie/box = 1,
/obj/item/toy/plushie/borgplushie = 1,
/obj/item/toy/plushie/borgplushie/medihound = 1,
/obj/item/toy/plushie/borgplushie/scrubpuppy = 1,
/obj/item/toy/plushie/foxbear = 1,
/obj/item/toy/plushie/nukeplushie = 1,
/obj/item/toy/plushie/otter = 1)
//VOREStation Add End
premium = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/champagne = 1,
/obj/item/weapon/storage/trinketbox = 2)
prices = list(/obj/item/weapon/storage/fancy/heartbox = 15,
/obj/item/toy/bouquet = 10,
/obj/item/toy/bouquet/fake = 3,
/obj/item/weapon/paper/card/smile = 1,
/obj/item/weapon/paper/card/heart = 1,
/obj/item/weapon/paper/card/cat = 1,
/obj/item/weapon/paper/card/flower = 1,
/obj/item/clothing/accessory/bracelet/friendship = 5,
/obj/item/toy/plushie/therapy/red = 20,
/obj/item/toy/plushie/therapy/purple = 20,
/obj/item/toy/plushie/therapy/blue = 20,
/obj/item/toy/plushie/therapy/yellow = 20,
/obj/item/toy/plushie/therapy/orange = 20,
/obj/item/toy/plushie/therapy/green = 20,
/obj/item/toy/plushie/nymph = 35,
/obj/item/toy/plushie/mouse = 35,
/obj/item/toy/plushie/kitten = 35,
/obj/item/toy/plushie/lizard = 35,
/obj/item/toy/plushie/spider = 35,
/obj/item/toy/plushie/farwa = 35,
/obj/item/toy/plushie/corgi = 50,
/obj/item/toy/plushie/octopus = 50,
/obj/item/toy/plushie/face_hugger = 50,
/obj/item/toy/plushie/carp = 50,
/obj/item/toy/plushie/deer = 50,
/obj/item/toy/plushie/tabby_cat = 50,
/obj/item/device/threadneedle = 2,
//VOREStation Add Start
/obj/item/toy/plushie/lizardplushie/kobold = 50,
/obj/item/toy/plushie/slimeplushie = 50,
/obj/item/toy/plushie/box = 50,
/obj/item/toy/plushie/borgplushie = 50,
/obj/item/toy/plushie/borgplushie/medihound = 50,
/obj/item/toy/plushie/borgplushie/scrubpuppy = 50,
/obj/item/toy/plushie/foxbear = 50,
/obj/item/toy/plushie/nukeplushie = 50,
/obj/item/toy/plushie/otter = 50)
//VOREStation Add End
/obj/machinery/vending/fishing
name = "Loot Trawler"
desc = "A special vendor for fishing equipment."
product_ads = "Tired of trawling across the ocean floor? Get our loot!;Chum and rods.;Don't get baited into fishing without us!;Baby is your star-sign pisces? We'd make a perfect match.;Do not fear, plenty to catch around here.;Don't get reeled in helplessly, get your own rod today!"
icon_state = "fishvendor"
products = list(/obj/item/weapon/material/fishing_rod/modern/cheap = 6,
/obj/item/weapon/storage/box/wormcan = 4,
/obj/item/weapon/storage/box/wormcan/sickly = 10,
/obj/item/weapon/material/fishing_net = 2,
/obj/item/stack/cable_coil/random = 6)
prices = list(/obj/item/weapon/material/fishing_rod/modern/cheap = 50,
/obj/item/weapon/storage/box/wormcan = 12,
/obj/item/weapon/storage/box/wormcan/sickly = 6,
/obj/item/weapon/material/fishing_net = 40,
/obj/item/stack/cable_coil/random = 4)
premium = list(/obj/item/weapon/storage/box/wormcan/deluxe = 1)
contraband = list(/obj/item/weapon/storage/box/wormcan/deluxe = 1)

View File

@@ -6,22 +6,25 @@
step_in = 4
dir_in = 1 //Facing North.
health = 400
maxhealth = 400
maxhealth = 400 //Don't forget to update the /old variant if you change this number.
deflect_chance = 20
damage_absorption = list("brute"=0.5,"fire"=1.1,"bullet"=0.65,"laser"=0.85,"energy"=0.9,"bomb"=0.8)
max_temperature = 30000
infra_luminosity = 8
force = 40
var/defence = 0
var/defence_deflect = 35
wreckage = /obj/effect/decal/mecha_wreckage/durand
damage_minimum = 15 //Big stompy
minimum_penetration = 25
max_hull_equip = 2
max_weapon_equip = 1
max_utility_equip = 2
max_universal_equip = 1
max_special_equip = 1
defence_mode_possible = 1
/*
/obj/mecha/combat/durand/New()
..()
@@ -31,40 +34,9 @@
return
*/
/obj/mecha/combat/durand/relaymove(mob/user,direction)
if(defence)
if(world.time - last_message > 20)
src.occupant_message("<font color='red'>Unable to move while in defence mode</font>")
last_message = world.time
return 0
. = ..()
return
/obj/mecha/combat/durand/verb/defence_mode()
set category = "Exosuit Interface"
set name = "Toggle defence mode"
set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
playsound(src, 'sound/mecha/duranddefencemode.ogg', 50, 1)
defence = !defence
if(defence)
deflect_chance = defence_deflect
src.occupant_message("<font color='blue'>You enable [src] defence mode.</font>")
else
deflect_chance = initial(deflect_chance)
src.occupant_message("<font color='red'>You disable [src] defence mode.</font>")
src.log_message("Toggled defence mode.")
return
/obj/mecha/combat/durand/get_stats_part()
var/output = ..()
output += "<b>Defence mode: [defence?"on":"off"]</b>"
return output
//This is for the Mech stats / Menu system. To be moved later on.
/obj/mecha/combat/durand/get_commands()
var/output = {"<div class='wr'>
<div class='header'>Special</div>
@@ -76,8 +48,30 @@
output += ..()
return output
//Not needed anymore but left for reference.
/*
/obj/mecha/combat/durand/get_stats_part()
var/output = ..()
output += "<b>Defence mode: [defence?"on":"off"]</b>"
return output
*/
/*
/obj/mecha/combat/durand/Topic(href, href_list)
..()
if (href_list["toggle_defence_mode"])
src.defence_mode()
return
*/
//Meant for random spawns.
/obj/mecha/combat/durand/old
desc = "An aging combat exosuit utilized by many corporations. Originally developed to combat hostile alien lifeforms. This one is particularly worn looking and likely isn't as sturdy."
/obj/mecha/combat/durand/old/New()
..()
health = 25
maxhealth = 350 //Just slightly worse.
cell.charge = rand(0, (cell.charge/2))

View File

@@ -1,52 +1,3 @@
/*
All of the weapons and projectiles that go with this mech are deliberately kept here in gorilla.dm because
they are never intended for use by any other mech. Ever. This shit is more overpowered than a clown with a
HONK Blaster and a pulse cannon protected by projectile armor and powered by a bananium infinite power cell.
*/
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon
name = "8.8cm KwK 47"
desc = "Do to enemy mechs what the King Tiger did to Allied tanks with 88 milimeters of armor-piercing German steel!"
icon_state = "mecha_grenadelnchr"
equip_cooldown = 55 // 5.5 seconds
projectile = /obj/item/projectile/bullet/cannon
fire_sound = 'sound/weapons/Gunshot_cannon.ogg'
projectiles = 1
projectile_energy_cost = 1000
salvageable = 0 // We don't want players ripping this off a dead mech.
/obj/item/projectile/bullet/cannon
name ="armor-piercing shell"
icon = 'icons/obj/grenade_yw.dmi'
icon_state = "shell"
damage = 1000 // In order to 1-hit any other mech and royally fuck anyone unfortunate enough to get in the way.
on_hit(var/atom/target, var/blocked = 0)
explosion(target, 0, 0, 2, 4)
return 1
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/mg42
name = "Maschinengewehr 60"
icon_state = "mecha_scatter" // placeholder
equip_cooldown = 10
projectile = /obj/item/projectile/bullet/rifle/a762
fire_sound = 'sound/weapons/mg42.ogg'
projectiles = 1000
projectiles_per_shot = 3
deviation = 0.3
projectile_energy_cost = 20
fire_cooldown = 1
salvageable = 0 // We don't want players ripping this off a dead mech.
/obj/effect/decal/mecha_wreckage/gorilla
name = "Gorilla wreckage"
desc = "... Blitzkrieg?"
icon = 'icons/mecha/AxisMech.dmi'
icon_state = "pzrwreck"
plane = MOB_PLANE
pixel_x = -16
anchored = 1 // It's fucking huge. You aren't moving it.
/obj/mecha/combat/gorilla
desc = "<b><font color='red'>BLITZKRIEEEEEEEG!</font></b>"
@@ -63,12 +14,6 @@ HONK Blaster and a pulse cannon protected by projectile armor and powered by a b
damage_absorption = list("brute"=0.1,"fire"=0.7,"bullet"=0.1,"laser"=0.6,"energy"=0.7,"bomb"=0.7) //values show how much damage will pass through, not how much will be absorbed.
max_temperature = 25000
infra_luminosity = 3
add_req_access = 0
var/zoom = 0
var/smoke = 5
var/smoke_ready = 1
var/smoke_cooldown = 100
var/datum/effect/effect/system/smoke_spread/smoke_system = new
wreckage = /obj/effect/decal/mecha_wreckage/gorilla
add_req_access = 0
internal_damage_threshold = 25
@@ -81,6 +26,10 @@ HONK Blaster and a pulse cannon protected by projectile armor and powered by a b
max_universal_equip = 5
max_special_equip = 2
smoke_possible = 1
zoom_possible = 1
thrusters_possible = 1
/obj/mecha/combat/gorilla/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) // This thing basically cannot function without an external power supply.
@@ -91,8 +40,6 @@ HONK Blaster and a pulse cannon protected by projectile armor and powered by a b
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
ME.attach(src)
src.smoke_system.set_up(3, 0, src)
src.smoke_system.attach(src)
return
/obj/mecha/combat/gorilla/mechstep(direction)
@@ -164,51 +111,10 @@ HONK Blaster and a pulse cannon protected by projectile armor and powered by a b
return 1
return 0
/obj/mecha/combat/gorilla/verb/smoke()
set category = "Exosuit Interface"
set name = "Smoke"
set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
if(smoke_ready && smoke>0)
src.smoke_system.start()
smoke--
smoke_ready = 0
spawn(smoke_cooldown)
smoke_ready = 1
return
/obj/mecha/combat/gorilla/verb/zoom()
set category = "Exosuit Interface"
set name = "Zoom"
set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
if(src.occupant.client)
src.zoom = !src.zoom
src.log_message("Toggled zoom mode.")
src.occupant_message("<font color='[src.zoom?"blue":"red"]'>Zoom mode [zoom?"en":"dis"]abled.</font>")
if(zoom)
src.occupant.set_viewsize(12)
playsound(src, 'sound/mecha/imag_enh.ogg',50)
else
src.occupant.set_viewsize() // Reset to default
return
/obj/mecha/combat/gorilla/go_out()
if(src.occupant && src.occupant.client)
src.occupant.client.view = world.view
src.zoom = 0
..()
return
/obj/mecha/combat/gorilla/get_stats_part()
var/output = ..()
output += {"<b>Smoke:</b> [smoke]"}
output += {"<b>Smoke:</b> [smoke_reserve]"}
return output
@@ -224,10 +130,58 @@ HONK Blaster and a pulse cannon protected by projectile armor and powered by a b
output += ..()
return output
/obj/mecha/combat/gorilla/Topic(href, href_list)
..()
if (href_list["smoke"])
src.smoke()
if (href_list["toggle_zoom"])
src.zoom()
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon
name = "8.8cm KwK 47"
desc = "<i>Precision German engineering!</i>" // Why would you ever take this off the mech, anyway?
icon_state = "mecha_uac2"
equip_cooldown = 60 // 6 seconds
projectile = /obj/item/projectile/bullet/cannon
fire_sound = 'sound/weapons/Gunshot_cannon.ogg'
projectiles = 1
projectile_energy_cost = 1000
salvageable = 0 // We don't want players ripping this off a dead mech. Could potentially be a prize for beating it if Devs bless me and someone offers a nerf idea.
/obj/item/projectile/bullet/cannon
name ="armor-piercing shell"
icon = 'icons/obj/projectiles.dmi'
icon_state = "shell"
damage = 1000 // In order to 1-hit any other mech and royally fuck anyone unfortunate enough to get in the way.
/obj/item/projectile/bullet/cannon/on_hit(var/atom/target, var/blocked = 0)
explosion(target, 0, 0, 2, 4)
return 1
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon/weak
name = "8.8 cm KwK 36"
equip_cooldown = 120 // 12 seconds.
projectile = /obj/item/projectile/bullet/cannon/weak
projectile_energy_cost = 400
salvageable = 1
/obj/item/projectile/bullet/cannon/weak
name ="canister shell"
icon_state = "canister"
damage = 120 //Do not get fucking shot.
// GLITCHY UND LAGGY. Will later look into fixing.
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/mg42
name = "Maschinengewehr 60"
icon_state = "mecha_uac2"
equip_cooldown = 10
projectile = /obj/item/projectile/bullet/midbullet2
fire_sound = 'sound/weapons/mg42.ogg'
projectiles = 1000
projectiles_per_shot = 5
deviation = 0.3
projectile_energy_cost = 20
fire_cooldown = 1
salvageable = 0 // We don't want players ripping this off a dead mech.
/obj/effect/decal/mecha_wreckage/gorilla
name = "Gorilla wreckage"
desc = "... Blitzkrieg?"
icon = 'icons/mecha/mecha64x64.dmi'
icon_state = "pzrwreck"
plane = MOB_PLANE
pixel_x = -16
anchored = 1 // It's fucking huge. You aren't moving it.

View File

@@ -6,13 +6,11 @@
step_in = 3
dir_in = 1 //Facing North.
health = 300
maxhealth = 300
maxhealth = 300 //Don't forget to update the /old variant if you change this number.
deflect_chance = 15
damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
max_temperature = 25000
infra_luminosity = 6
var/overload = 0
var/overload_coeff = 2
wreckage = /obj/effect/decal/mecha_wreckage/gygax
internal_damage_threshold = 35
max_equip = 3
@@ -23,6 +21,21 @@
max_universal_equip = 1
max_special_equip = 1
overload_possible = 1
//Not quite sure how to move those yet.
/obj/mecha/combat/gygax/get_commands()
var/output = {"<div class='wr'>
<div class='header'>Special</div>
<div class='links'>
<a href='?src=\ref[src];toggle_leg_overload=1'>Toggle leg actuators overload</a>
</div>
</div>
"}
output += ..()
return output
/obj/mecha/combat/gygax/dark
desc = "A lightweight exosuit used by Heavy Asset Protection. A significantly upgraded Gygax security mech."
name = "Dark Gygax"
@@ -66,62 +79,6 @@
cell.charge = 30000
cell.maxcharge = 30000
/obj/mecha/combat/gygax/verb/overload()
set category = "Exosuit Interface"
set name = "Toggle leg actuators overload"
set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
if(overload)
overload = 0
step_in = initial(step_in)
step_energy_drain = initial(step_energy_drain)
src.occupant_message("<font color='blue'>You disable leg actuators overload.</font>")
else
overload = 1
step_in = min(1, round(step_in/2))
step_energy_drain = step_energy_drain*overload_coeff
src.occupant_message("<font color='red'>You enable leg actuators overload.</font>")
src.log_message("Toggled leg actuators overload.")
playsound(src, 'sound/mecha/mechanical_toggle.ogg', 50, 1)
return
/obj/mecha/combat/gygax/dyndomove(direction)
if(!..()) return
if(overload)
health--
if(health < initial(health) - initial(health)/3)
overload = 0
step_in = initial(step_in)
step_energy_drain = initial(step_energy_drain)
src.occupant_message("<font color='red'>Leg actuators damage threshold exceded. Disabling overload.</font>")
return
/obj/mecha/combat/gygax/get_stats_part()
var/output = ..()
output += "<b>Leg actuators overload: [overload?"on":"off"]</b>"
return output
/obj/mecha/combat/gygax/get_commands()
var/output = {"<div class='wr'>
<div class='header'>Special</div>
<div class='links'>
<a href='?src=\ref[src];toggle_leg_overload=1'>Toggle leg actuators overload</a>
</div>
</div>
"}
output += ..()
return output
/obj/mecha/combat/gygax/Topic(href, href_list)
..()
if (href_list["toggle_leg_overload"])
src.overload()
return
/obj/mecha/combat/gygax/serenity
desc = "A lightweight exosuit made from a modified Gygax chassis combined with proprietary VeyMed medical tech. It's faster and sturdier than most medical mechs, but much of the armor plating has been stripped out, leaving it more vulnerable than a regular Gygax."
name = "Serenity"
@@ -170,3 +127,13 @@
H.recalculate_vis()
..()
return
//Meant for random spawns.
/obj/mecha/combat/gygax/old
desc = "A lightweight, security exosuit. Popular among private and corporate security. This one is particularly worn looking and likely isn't as sturdy."
/obj/mecha/combat/gygax/old/New()
..()
health = 25
maxhealth = 250 //Just slightly worse.
cell.charge = rand(0, (cell.charge/2))

View File

@@ -6,17 +6,11 @@
initial_icon = "marauder"
step_in = 5
health = 500
maxhealth = 500
maxhealth = 500 //Don't forget to update the /old variant if you change this number.
deflect_chance = 25
damage_absorption = list("brute"=0.5,"fire"=0.7,"bullet"=0.45,"laser"=0.6,"energy"=0.7,"bomb"=0.7)
max_temperature = 60000
infra_luminosity = 3
var/zoom = 0
var/thrusters = 0
var/smoke = 5
var/smoke_ready = 1
var/smoke_cooldown = 100
var/datum/effect/effect/system/smoke_spread/smoke_system = new
operation_req_access = list(access_cent_specops)
wreckage = /obj/effect/decal/mecha_wreckage/marauder
add_req_access = 0
@@ -31,6 +25,10 @@
max_universal_equip = 1
max_special_equip = 1
smoke_possible = 1
zoom_possible = 1
thrusters_possible = 1
/obj/mecha/combat/marauder/seraph
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
name = "Seraph"
@@ -45,7 +43,7 @@
force = 55
max_equip = 5
//Note that is the Mauler
/obj/mecha/combat/marauder/mauler
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
name = "Mauler"
@@ -55,6 +53,7 @@
wreckage = /obj/effect/decal/mecha_wreckage/mauler
mech_faction = MECH_FACTION_SYNDI
//Note that is the default Marauder
/obj/mecha/combat/marauder/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
@@ -65,10 +64,9 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
src.smoke_system.set_up(3, 0, src)
src.smoke_system.attach(src)
return
//Note that this is the seraph.
/obj/mecha/combat/marauder/seraph/Initialize()
..()//Let it equip whatever is needed.
var/obj/item/mecha_parts/mecha_equipment/ME
@@ -88,10 +86,8 @@
ME.attach(src)
return
/obj/mecha/combat/marauder/Destroy()
qdel(smoke_system)
..()
//I'll break this down later
/obj/mecha/combat/marauder/relaymove(mob/user,direction)
if(user != src.occupant) //While not "realistic", this piece is player friendly.
user.loc = get_turf(src)
@@ -136,74 +132,7 @@
return 1
return 0
/obj/mecha/combat/marauder/verb/toggle_thrusters()
set category = "Exosuit Interface"
set name = "Toggle thrusters"
set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
if(src.occupant)
if(get_charge() > 0)
thrusters = !thrusters
src.log_message("Toggled thrusters.")
src.occupant_message("<font color='[src.thrusters?"blue":"red"]'>Thrusters [thrusters?"en":"dis"]abled.</font>")
return
/obj/mecha/combat/marauder/verb/smoke()
set category = "Exosuit Interface"
set name = "Smoke"
set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
if(smoke_ready && smoke>0)
src.smoke_system.start()
smoke--
smoke_ready = 0
spawn(smoke_cooldown)
smoke_ready = 1
return
//TODO replace this with zoom code that doesn't increase peripherial vision
/obj/mecha/combat/marauder/verb/zoom()
set category = "Exosuit Interface"
set name = "Zoom"
set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
if(src.occupant.client)
src.zoom = !src.zoom
src.log_message("Toggled zoom mode.")
src.occupant_message("<font color='[src.zoom?"blue":"red"]'>Zoom mode [zoom?"en":"dis"]abled.</font>")
if(zoom)
src.occupant.set_viewsize(12)
src.occupant << sound('sound/mecha/imag_enh.ogg',volume=50)
else
src.occupant.set_viewsize() // Reset to default
return
/obj/mecha/combat/marauder/go_out()
if(src.occupant && src.occupant.client)
src.occupant.client.view = world.view
src.zoom = 0
..()
return
/obj/mecha/combat/marauder/get_stats_part()
var/output = ..()
output += {"<b>Smoke:</b> [smoke]
<br>
<b>Thrusters:</b> [thrusters?"on":"off"]
"}
return output
//To be kill ltr
/obj/mecha/combat/marauder/get_commands()
var/output = {"<div class='wr'>
<div class='header'>Special</div>
@@ -217,12 +146,21 @@
output += ..()
return output
/obj/mecha/combat/marauder/Topic(href, href_list)
//Meant for random spawns.
/obj/mecha/combat/marauder/old
desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations. This one is particularly worn looking and likely isn't as sturdy."
/obj/mecha/combat/marauder/old/New()
..()
if (href_list["toggle_thrusters"])
src.toggle_thrusters()
if (href_list["smoke"])
src.smoke()
if (href_list["toggle_zoom"])
src.zoom()
health = 25
maxhealth = 400 //Just slightly worse.
cell.charge = rand(0, (cell.charge/2))
/obj/mecha/combat/marauder/old/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME
if(equipment.len)
for(ME in equipment)
ME.detach()
qdel(ME)
return

View File

@@ -6,8 +6,8 @@
step_in = 1
dir_in = 1 //Facing North.
step_energy_drain = 3
health = 200
maxhealth = 200
health = 200 //God this is low
maxhealth = 200 //Don't forget to update the /old variant if you change this number.
deflect_chance = 30
damage_absorption = list("brute"=0.7,"fire"=0.7,"bullet"=0.7,"laser"=0.7,"energy"=0.7,"bomb"=0.7)
max_temperature = 25000
@@ -17,9 +17,6 @@
//operation_req_access = list()
internal_damage_threshold = 25
force = 15
var/phasing = 0
var/can_phase = TRUE
var/phasing_energy_drain = 200
max_equip = 4
max_hull_equip = 3
@@ -28,6 +25,9 @@
max_universal_equip = 3
max_special_equip = 4
phasing_possible = 1
switch_dmg_type_possible = 1
/obj/mecha/combat/phazon/equipped/Initialize()
..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/rcd
@@ -36,6 +36,7 @@
ME.attach(src)
return
/* Leaving this until we are really sure we don't need it for reference.
/obj/mecha/combat/phazon/Bump(var/atom/obstacle)
if(phasing && get_charge()>=phasing_energy_drain)
spawn()
@@ -49,35 +50,8 @@
else
. = ..()
return
*/
/obj/mecha/combat/phazon/click_action(atom/target,mob/user)
if(phasing)
src.occupant_message("Unable to interact with objects while phasing")
return
else
return ..()
/obj/mecha/combat/phazon/verb/switch_damtype()
set category = "Exosuit Interface"
set name = "Change melee damage type"
set src = usr.loc
set popup_menu = 0
if(usr!=src.occupant)
return
query_damtype()
/obj/mecha/combat/phazon/proc/query_damtype()
var/new_damtype = alert(src.occupant,"Melee Damage Type",null,"Brute","Fire","Toxic")
switch(new_damtype)
if("Brute")
damtype = "brute"
if("Fire")
damtype = "fire"
if("Toxic")
damtype = "tox"
src.occupant_message("Melee damage type switched to [new_damtype ]")
return
/obj/mecha/combat/phazon/get_commands()
var/output = {"<div class='wr'>
@@ -91,15 +65,7 @@
output += ..()
return output
/obj/mecha/combat/phazon/Topic(href, href_list)
..()
if (href_list["switch_damtype"])
src.switch_damtype()
if (href_list["phasing"])
phasing = !phasing
send_byjax(src.occupant,"exosuit.browser","phasing_command","[phasing?"Dis":"En"]able phasing")
src.occupant_message("<font color=\"[phasing?"#00f\">En":"#f00\">Dis"]abled phasing.</font>")
return
/obj/mecha/combat/phazon/janus
name = "Phazon Prototype Janus Class"
@@ -121,7 +87,6 @@
wreckage = /obj/effect/decal/mecha_wreckage/janus
internal_damage_threshold = 25
force = 20
phasing = FALSE
phasing_energy_drain = 300
max_hull_equip = 2
@@ -130,6 +95,9 @@
max_universal_equip = 2
max_special_equip = 2
phasing_possible = 1
switch_dmg_type_possible = 1
/obj/mecha/combat/phazon/janus/take_damage(amount, type="brute")
..()
if(phasing)
@@ -173,3 +141,13 @@
damtype = "halloss"
src.occupant_message("Melee damage type switched to [new_damtype]")
return
//Meant for random spawns.
/obj/mecha/combat/phazon/old
desc = "An exosuit which can only be described as 'WTF?'. This one is particularly worn looking and likely isn't as sturdy."
/obj/mecha/combat/phazon/old/New()
..()
health = 25
maxhealth = 150 //Just slightly worse.
cell.charge = rand(0, (cell.charge/2))

View File

@@ -10,9 +10,9 @@
/obj/item/mecha_parts/mecha_equipment/speedboost/attach(obj/mecha/M as obj)
..()
if(enable_special)
chassis.step_in = (chassis.step_in-2) // Make the ripley as fast as a durand
chassis.step_in = 3 // As fast as a gygax without overload. Slower than Ody.
else
chassis.step_in = (chassis.step_in+1) // Improper parts slow the mech down
chassis.step_in = 6 // Improper parts slow the mech down
return
/obj/item/mecha_parts/mecha_equipment/speedboost/detach()

View File

@@ -26,13 +26,27 @@
var/can_move = 1
var/mob/living/carbon/occupant = null
var/step_in = 10 //make a step in step_in/10 sec.
var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South.
var/dir_in = 2 //What direction will the mech face when entered/powered on? Defaults to South.
var/step_energy_drain = 10
var/health = 300 //health is health
var/maxhealth = 300 //maxhealth is maxhealth.
var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act.
//the values in this list show how much damage will pass through, not how much will be absorbed.
var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1)
var/list/damage_absorption = list(
"brute"=0.8,
"fire"=1.2,
"bullet"=0.9,
"laser"=1,
"energy"=1,
"bomb"=1,
"bio"=1,
"rad"=1
)
var/damage_minimum = 10 //Incoming damage lower than this won't actually deal damage. Scrapes shouldn't be a real thing.
var/minimum_penetration = 20 //Incoming damage won't be fully applied if you don't have at least 20. Almost all AP clears this.
var/fail_penetration_value = 0.66 //By how much failing to penetrate reduces your shit. 66% by default.
var/obj/item/weapon/cell/cell
var/state = 0
var/list/log = new
@@ -76,10 +90,11 @@
var/wreckage
var/list/equipment = new
var/list/equipment = new //This lists holds what stuff you bolted onto your baby ride
var/obj/item/mecha_parts/mecha_equipment/selected
var/max_equip = 2
var/datum/events/events
//mechaequipt2 stuffs
var/list/hull_equipment = new
var/list/weapon_equipment = new
@@ -91,6 +106,7 @@
var/max_utility_equip = 2
var/max_universal_equip = 2
var/max_special_equip = 1
//Working exosuit vars
var/list/cargo = list()
var/cargo_capacity = 3
@@ -100,7 +116,54 @@
var/static/image/radial_image_lighttoggle = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_light")
var/static/image/radial_image_statpanel = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine2")
var/datum/mini_hud/mech/minihud
//Mech actions
var/datum/mini_hud/mech/minihud //VOREStation Edit
var/strafing = 0 //Are we strafing or not?
var/defence_mode_possible = 0 //Can we even use defence mode? This is used to assign it to mechs and check for verbs.
var/defence_mode = 0 //Are we in defence mode
var/defence_deflect = 35 //How much it deflect
var/overload_possible = 0 //Same as above. Don't forget to GRANT the verb&actions if you want everything to work proper.
var/overload = 0 //Are our legs overloaded
var/overload_coeff = 1 //How much extra energy you use when use the L E G
var/zoom = 0
var/zoom_possible = 0
var/thrusters = 0
var/thrusters_possible = 0
var/phasing = 0 //Are we currently phasing
var/phasing_possible = 0 //This is to allow phasing.
var/can_phase = TRUE //This is an internal check during the relevant procs.
var/phasing_energy_drain = 200
var/switch_dmg_type_possible = 0 //Can you switch damage type? It is mostly for the Phazon and its children.
var/smoke_possible = 0
var/smoke_reserve = 5 //How many shots you have. Might make a reload later on. MIGHT.
var/smoke_ready = 1 //This is a check for the whether or not the cooldown is ongoing.
var/smoke_cooldown = 100 //How long you have between uses.
var/datum/effect/effect/system/smoke_spread/smoke_system = new
////All of those are for the HUD buttons in the top left. See Grant and Remove procs in mecha_actions.
var/datum/action/innate/mecha/mech_eject/eject_action = new
var/datum/action/innate/mecha/mech_toggle_internals/internals_action = new
var/datum/action/innate/mecha/mech_toggle_lights/lights_action = new
var/datum/action/innate/mecha/mech_view_stats/stats_action = new
var/datum/action/innate/mecha/strafe/strafing_action = new
var/datum/action/innate/mecha/mech_defence_mode/defence_action = new
var/datum/action/innate/mecha/mech_overload_mode/overload_action = new
var/datum/action/innate/mecha/mech_smoke/smoke_action = new
var/datum/action/innate/mecha/mech_zoom/zoom_action = new
var/datum/action/innate/mecha/mech_toggle_thrusters/thrusters_action = new
var/datum/action/innate/mecha/mech_cycle_equip/cycle_action = new
var/datum/action/innate/mecha/mech_switch_damtype/switch_damtype_action = new
var/datum/action/innate/mecha/mech_toggle_phasing/phasing_action = new
/obj/mecha/drain_power(var/drain_check)
@@ -123,8 +186,14 @@
if(!add_airtank()) //we check this here in case mecha does not have an internal tank available by default - WIP
removeVerb(/obj/mecha/verb/connect_to_port)
removeVerb(/obj/mecha/verb/toggle_internal_tank)
spark_system.set_up(2, 0, src)
spark_system.attach(src)
if(smoke_possible)//I am pretty sure that's needed here.
src.smoke_system.set_up(3, 0, src)
src.smoke_system.attach(src)
add_cell()
add_iterators()
removeVerb(/obj/mecha/verb/disconnect_from_port)
@@ -192,6 +261,9 @@
cell = null
internal_tank = null
if(smoke_possible) //Just making sure nothing is running.
qdel(smoke_system)
QDEL_NULL(pr_int_temp_processor)
QDEL_NULL(pr_inertial_movement)
QDEL_NULL(pr_give_air)
@@ -283,11 +355,11 @@
if(65 to 85)
. += "It's slightly damaged."
if(45 to 65)
. += "It's badly damaged."
. += "<span class='notice'>It's badly damaged.</span>"
if(25 to 45)
. += "It's heavily damaged."
. += "<span class='warning'>It's heavily damaged.</span>"
else
. += "It's falling apart."
. += "<span class='warning'><b> It's falling apart.</b> </span>"
if(equipment?.len)
. += "It's equipped with:"
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
@@ -319,6 +391,7 @@
"Toggle Light" = radial_image_lighttoggle,
"View Stats" = radial_image_statpanel
)
var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_occupant_radial, user), require_near = TRUE, tooltips = TRUE)
if(!check_occupant_radial(user))
return
@@ -380,6 +453,11 @@
if(state)
occupant_message("<font color='red'>Maintenance protocols in effect</font>")
return
if(phasing)//Phazon and other mechs with phasing.
src.occupant_message("Unable to interact with objects while phasing")//Haha dumbass.
return
if(!get_charge()) return
if(src == target) return
var/dir_to_target = get_dir(src,target)
@@ -463,6 +541,13 @@
if(state)
occupant_message("<span class='warning'>Maintenance protocols in effect</span>")
return
/*
if(zoom)
if(world.time - last_message > 20)
src.occupant_message("Unable to move while in zoom mode.")
last_message = world.time
return 0
*/
return domove(direction)
/obj/mecha/proc/can_ztravel()
@@ -482,6 +567,32 @@
if(!has_charge(step_energy_drain))
return 0
//Can we even move, below is if yes.
if(defence_mode)//Check if we are currently locked down
if(world.time - last_message > 20)
src.occupant_message("<font color='red'>Unable to move while in defence mode</font>")
last_message = world.time
return 0
if(zoom)//:eyes:
if(world.time - last_message > 20)
src.occupant_message("Unable to move while in zoom mode.")
last_message = world.time
return 0
if(!thrusters && src.pr_inertial_movement.active()) //I think this mean 'if you try to move in space without thruster, u no move'
return 0
if(overload)//Check if you have leg overload
health--
if(health < initial(health) - initial(health)/3)
overload = 0
step_in = initial(step_in)
step_energy_drain = initial(step_energy_drain)
src.occupant_message("<font color='red'>Leg actuators damage threshold exceded. Disabling overload.</font>")
var/move_result = 0
if(hasInternalDamage(MECHA_INT_CONTROL_LOST))
@@ -511,9 +622,16 @@
break
if(result)
move_result = mechstep(direction)
//Turning
else if(src.dir != direction)
if(strafing)
move_result = mechstep(direction)
else
move_result = mechturn(direction)
//Stepping
else
move_result = mechstep(direction)
@@ -544,11 +662,14 @@
return 1
/obj/mecha/proc/mechstep(direction)
var/current_dir = dir //For strafing
var/result = get_step(src,direction)
if(result && Move(result))
if(stomp_sound)
playsound(src,stomp_sound,40,1)
handle_equipment_movement()
if(strafing) //Also for strafing
set_dir(current_dir)
return result
@@ -562,21 +683,35 @@
/obj/mecha/Bump(var/atom/obstacle)
// src.inertia_dir = null
if(istype(obstacle, /obj))
if(istype(obstacle, /mob))//First we check if it is a mob. Mechs mostly shouln't go through them, even while phasing.
var/mob/M = obstacle
M.Move(get_step(obstacle,src.dir))
else if(istype(obstacle, /obj))//Then we check for regular obstacles.
var/obj/O = obstacle
if(phasing && get_charge()>=phasing_energy_drain)//Phazon check. This could use an improvement elsewhere.
spawn()
if(can_phase)
can_phase = FALSE
flick("[initial_icon]-phase", src)
src.loc = get_step(src,src.dir)
src.use_power(phasing_energy_drain)
sleep(step_in*3)
can_phase = TRUE
occupant_message("Phazed.")
. = ..(obstacle)
return
if(istype(O, /obj/effect/portal)) //derpfix
src.anchored = 0
src.anchored = 0 //I have no idea what this really fix.
O.Crossed(src)
spawn(0)//countering portal teleport spawn(0), hurr
src.anchored = 1
else if(!O.anchored)
step(obstacle,src.dir)
else //I have no idea why I disabled this
else if(O.anchored)
obstacle.Bumped(src)
else if(istype(obstacle, /mob))
var/mob/M = obstacle
M.Move(get_step(obstacle,src.dir))
else
step(obstacle,src.dir)
else//No idea when this triggers, so i won't touch it.
. = ..(obstacle)
return
@@ -701,6 +836,7 @@
call((proc_res["dynhitby"]||src), "dynhitby")(A)
return
//I think this is relative to throws.
/obj/mecha/proc/dynhitby(atom/movable/A)
if(istype(A, /obj/item/mecha_parts/mecha_tracking))
A.forceMove(src)
@@ -718,9 +854,27 @@
if(O.throwforce)
var/pass_damage = O.throwforce
var/pass_damage_reduc_mod
if(pass_damage <= damage_minimum)//Too little to go through.
src.occupant_message("<span class='notice'>\The [A] bounces off the armor.</span>")
src.visible_message("\The [A] bounces off \the [src] armor")
return
else if(O.armor_penetration < minimum_penetration) //If you don't have enough pen, you won't do full damage
src.occupant_message("<span class='notice'>\The [A] struggles to bypass \the [src] armor.</span>")
src.visible_message("\The [A] struggles to bypass \the [src] armor")
pass_damage_reduc_mod = fail_penetration_value //This will apply to reduce damage to 2/3 or 66% by default
else
src.occupant_message("<span class='notice'>\The [A] manages to pierces \the [src] armor.</span>")
src.visible_message("\The [A] manages to pierces \the [src] armor")
pass_damage_reduc_mod = 1
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
pass_damage = ME.handle_ranged_contact(A, pass_damage)
pass_damage = (pass_damage*pass_damage_reduc_mod)//Applying damage reduction
src.take_damage(pass_damage)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
return
@@ -753,9 +907,25 @@
ignore_threshold = 1
var/pass_damage = Proj.damage
var/pass_damage_reduc_mod
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
pass_damage = ME.handle_projectile_contact(Proj, pass_damage)
if(pass_damage < damage_minimum)//too pathetic to really damage you.
src.occupant_message("<span class='notice'>The armor deflects incoming projectile.</span>")
src.visible_message("The [src.name] armor deflects\the [Proj]")
return
else if(Proj.armor_penetration < minimum_penetration) //If you don't have enough pen, you won't do full damage
src.occupant_message("<span class='notice'>\The [Proj] struggles to pierce \the [src] armor.</span>")
src.visible_message("\The [Proj] struggles to pierce \the [src] armor")
pass_damage_reduc_mod = fail_penetration_value //This will apply to reduce damage to 2/3 or 66% by default
else
src.occupant_message("<span class='notice'>\The [Proj] manages to pierce \the [src] armor.</span>")
src.visible_message("\The [Proj] manages to pierce \the [src] armor")
pass_damage_reduc_mod = 1
pass_damage = (pass_damage_reduc_mod*pass_damage)//Apply damage reduction before usage.
src.take_damage(pass_damage, Proj.check_armour)
if(prob(25)) spark_system.start()
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold)
@@ -779,6 +949,7 @@
Proj.on_hit(src) //on_hit just returns if it's argument is not a living mob so does this actually do anything?
return
//This refer to whenever you are caught in an explosion.
/obj/mecha/ex_act(severity)
src.log_message("Affected by explosion of severity: [severity].",1)
if(prob(src.deflect_chance))
@@ -841,19 +1012,30 @@
/obj/mecha/proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob)
user.setClickCooldown(user.get_attack_speed(W))
src.log_message("Attacked by [W]. Attacker - [user]")
if(prob(src.deflect_chance))
var/pass_damage_reduc_mod //Modifer for failing to bring AP.
if(prob(src.deflect_chance)) //Does your attack get deflected outright.
src.occupant_message("<span class='notice'>\The [W] bounces off [src.name].</span>")
to_chat(user, "<span class='danger'>\The [W] bounces off [src.name].</span>")
src.log_append_to_last("Armor saved.")
/*
for (var/mob/V in viewers(src))
if(V.client && !(V.blinded))
V.show_message("The [W] bounces off [src.name] armor.", 1)
*/
else if(W.force < damage_minimum) //Is your attack too PATHETIC to do anything. 3 damage to a person shouldn't do anything to a mech.
src.occupant_message("<span class='notice'>\The [W] bounces off the armor.</span>")
src.visible_message("\The [W] bounces off \the [src] armor")
return
else if(W.armor_penetration < minimum_penetration) //If you don't have enough pen, you won't do full damage
src.occupant_message("<span class='notice'>\The [W] struggles to bypass \the [src] armor.</span>")
src.visible_message("\The [W] struggles to bypass \the [src] armor")
pass_damage_reduc_mod = fail_penetration_value //This will apply to reduce damage to 2/3 or 66% by default
else
pass_damage_reduc_mod = 1 //Just making sure.
src.occupant_message("<font color='red'><b>[user] hits [src] with [W].</b></font>")
user.visible_message("<font color='red'><b>[user] hits [src] with [W].</b></font>", "<font color='red'><b>You hit [src] with [W].</b></font>")
var/pass_damage = W.force
pass_damage = (pass_damage*pass_damage_reduc_mod) //Apply the reduction of damage from not having enough armor penetration.
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
pass_damage = ME.handle_projectile_contact(W, pass_damage)
src.take_damage(pass_damage,W.damtype)
@@ -1219,6 +1401,9 @@
set category = "Exosuit Interface"
set src = usr.loc
set popup_menu = 0
lights()
/obj/mecha/verb/lights()
if(usr!=occupant) return
lights = !lights
if(lights) set_light(light_range + lights_power)
@@ -1230,18 +1415,37 @@
/obj/mecha/verb/toggle_internal_tank()
set name = "Toggle internal airtank usage."
set name = "Toggle internal airtank usage"
set category = "Exosuit Interface"
set src = usr.loc
set popup_menu = 0
internal_tank()
/obj/mecha/proc/internal_tank()
if(usr!=src.occupant)
return
use_internal_tank = !use_internal_tank
src.occupant_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].")
src.log_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].")
playsound(src, 'sound/mecha/gasdisconnected.ogg', 30, 1)
return
/obj/mecha/verb/toggle_strafing()
set name = "Toggle strafing"
set category = "Exosuit Interface"
set src = usr.loc
set popup_menu = 0
strafing()
/obj/mecha/proc/strafing()
if(usr!=src.occupant)
return
strafing = !strafing
src.occupant_message("Toggled strafing mode [strafing?"on":"off"].")
src.log_message("Toggled strafing mode [strafing?"on":"off"].")
return
/obj/mecha/MouseDrop_T(mob/O, mob/user as mob)
//Humans can pilot mechs.
if(!ishuman(O))
@@ -1253,11 +1457,13 @@
move_inside()
/obj/mecha/verb/move_inside()
/obj/mecha/verb/enter()
set category = "Object"
set name = "Enter Exosuit"
set src in oview(1)
move_inside()
/obj/mecha/proc/move_inside()
if (usr.stat || !ishuman(usr))
return
@@ -1303,6 +1509,8 @@
if(enter_after(40,usr))
if(!src.occupant)
moved_inside(usr)
if(ishuman(occupant)) //Aeiou
GrantActions(occupant, 1)
else if(src.occupant!=usr)
to_chat(usr, "[src.occupant] was faster. Try better next time, loser.")
else
@@ -1324,8 +1532,30 @@
src.verbs += /obj/mecha/verb/eject
src.log_append_to_last("[H] moved in as pilot.")
src.icon_state = src.reset_icon()
//VOREStation Edit Add
if(occupant.hud_used)
minihud = new (occupant.hud_used, src)
//VOREStation Edit Add End
//This part removes all the verbs if you don't have them the _possible on your mech. This is a little clunky, but it lets you just add that to any mech.
//And it's not like this 10yo code wasn't clunky before.
if(!smoke_possible) //Can't use smoke? No verb for you.
verbs -= /obj/mecha/verb/toggle_smoke
if(!thrusters_possible) //Can't use thrusters? No verb for you.
verbs -= /obj/mecha/verb/toggle_thrusters
if(!defence_mode_possible) //Do i need to explain everything?
verbs -= /obj/mecha/verb/toggle_defence_mode
if(!overload_possible)
verbs -= /obj/mecha/verb/toggle_overload
if(!zoom_possible)
verbs -= /obj/mecha/verb/toggle_zoom
if(!phasing_possible)
verbs -= /obj/mecha/verb/toggle_phasing
if(!switch_dmg_type_possible)
verbs -= /obj/mecha/verb/switch_damtype
occupant.in_enclosed_vehicle = 1 //Useful for when you need to know if someone is in a mecho.
update_cell_alerts()
update_damage_alerts()
set_dir(dir_in)
@@ -1388,12 +1618,13 @@
return
/obj/mecha/proc/go_out()
/obj/mecha/proc/go_out() //Eject/Exit the mech. Yes this is for easier searching.
if(!src.occupant) return
var/atom/movable/mob_container
QDEL_NULL(minihud)
if(ishuman(occupant))
mob_container = src.occupant
RemoveActions(occupant, human_occupant=1)//AEIOU
else if(istype(occupant, /mob/living/carbon/brain))
var/mob/living/carbon/brain/brain = occupant
mob_container = brain.container
@@ -1413,10 +1644,20 @@
occupant.canmove = 0
occupant.clear_alert("charge")
occupant.clear_alert("mech damage")
occupant.in_enclosed_vehicle = 0
occupant = null
icon_state = src.reset_icon()+"-open"
set_dir(dir_in)
verbs -= /obj/mecha/verb/eject
//src.zoom = 0
// Doesn't seem needed.
if(src.occupant && src.occupant.client)
src.occupant.client.view = world.view
src.zoom = 0
strafing = 0
return
/////////////////////////
@@ -1545,7 +1786,18 @@
<b>Lights: </b>[lights?"on":"off"]<br>
[src.dna?"<b>DNA-locked:</b><br> <span style='font-size:10px;letter-spacing:-1px;'>[src.dna]</span> \[<a href='?src=\ref[src];reset_dna=1'>Reset</a>\]<br>":null]
"}
//Cargo components.
if(defence_mode_possible)
output += "<b>Defence mode: [defence_mode?"on":"off"]</b><br>"
if(overload_possible)
output += "<b>Leg actuators overload: [overload?"on":"off"]</b><br>"
if(smoke_possible)
output += "<b>Smoke:</b> [smoke_reserve]<br>"
if(thrusters_possible)
output += "<b>Thrusters:</b> [thrusters?"on":"off"]<br>"
//Cargo components. Keep this last otherwise it does weird alignment issues.
output += "<b>Cargo Compartment Contents:</b><div style=\"margin-left: 15px;\">"
if(src.cargo.len)
for(var/obj/O in src.cargo)
@@ -1747,12 +1999,31 @@
return
if(href_list["toggle_lights"])
if(usr != src.occupant) return
src.toggle_lights()
src.lights()
return
/*
if(href_list["toggle_strafing"])
if(usr != src.occupant) return
src.strafing()
return*/
if(href_list["toggle_airtank"])
if(usr != src.occupant) return
src.toggle_internal_tank()
src.internal_tank()
return
if (href_list["toggle_thrusters"])
src.toggle_thrusters()
if (href_list["smoke"])
src.smoke()
if (href_list["toggle_zoom"])
src.zoom()
if(href_list["toggle_defence_mode"])
src.defence_mode()
if(href_list["switch_damtype"])
src.switch_damtype()
if(href_list["phasing"])
src.phasing()
if(href_list["rmictoggle"])
if(usr != src.occupant) return
radio.broadcasting = !radio.broadcasting
@@ -2007,6 +2278,7 @@
icon_state = initial(icon_state)
return icon_state
//This is for mobs mostly.
/obj/mecha/attack_generic(var/mob/user, var/damage, var/attack_message)
user.setClickCooldown(user.get_attack_speed())
@@ -2014,19 +2286,38 @@
return 0
src.log_message("Attacked. Attacker - [user].",1)
user.do_attack_animation(src)
if(!prob(src.deflect_chance))
src.take_damage(damage)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
visible_message("<span class='danger'>[user] [attack_message] [src]!</span>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name]</font>")
else
//var/pass_damage //See the comment in the larger greyed out block below.
//var/pass_damage_reduc_mod
if(prob(src.deflect_chance))//Deflected
src.log_append_to_last("Armor saved.")
playsound(src, 'sound/weapons/slash.ogg', 50, 1, -1)
src.occupant_message("<span class='notice'>\The [user]'s attack is stopped by the armor.</span>")
visible_message("<span class='notice'>\The [user] rebounds off [src.name]'s armor!</span>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name]</font>")
playsound(src, 'sound/weapons/slash.ogg', 50, 1, -1)
else if(damage < damage_minimum)//Pathetic damage levels just don't harm MECH.
src.occupant_message("<span class='notice'>\The [user]'s doesn't dent \the [src] paint.</span>")
src.visible_message("\The [user]'s attack doesn't dent \the [src] armor")
src.log_append_to_last("Armor saved.")
playsound(src, 'sound/effects/Glasshit.ogg', 50, 1)
return
/*//Commented out for not playing well with penetration questions.
else if(user.mob.attack_armor_pen < minimum_penetration)//Not enough armor penetration
src.occupant_message("<span class='notice'>\The [user] struggles to pierce \the [src] armor.</span>")
src.visible_message("\The [user] struggles to pierce \the [src] armor")
pass_damage_reduc_mod = fail_penetration_value //This will apply to reduce damage to 2/3 or 66% by default.
*/
else
//pass_damage = (pass_damage_reduc_mod*damage)
src.take_damage(damage)//apply damage
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
visible_message("<span class='danger'>[user] [attack_message] [src]!</span>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name]</font>")
return 1

View File

@@ -0,0 +1,421 @@
//AEIOU
//
//THIS FILE CONTAINS THE CODE TO ADD THE HUD BUTTONS AND THE MECH ACTIONS THEMSELVES.
//
//
// I better get some free food for this..
//
/// Adding the buttons things to the player. The interactive, top left things, at least at time of writing.
/// If you want it to be only for a special mech, you have to go and make an override like in the durand mech.
//
/obj/mecha/proc/GrantActions(mob/living/user, human_occupant = 0)
if(human_occupant)
eject_action.Grant(user, src)
internals_action.Grant(user, src)
cycle_action.Grant(user, src)
lights_action.Grant(user, src)
stats_action.Grant(user, src)
strafing_action.Grant(user, src)//The defaults.
if(defence_mode_possible)
defence_action.Grant(user, src)
if(overload_possible)
overload_action.Grant(user, src)
if(smoke_possible)
smoke_action.Grant(user, src)
if(zoom_possible)
zoom_action.Grant(user, src)
if(thrusters_possible)
thrusters_action.Grant(user, src)
if(phasing_possible)
phasing_action.Grant(user, src)
if(switch_dmg_type_possible)
switch_damtype_action.Grant(user, src)
/obj/mecha/proc/RemoveActions(mob/living/user, human_occupant = 0)
if(human_occupant)
eject_action.Remove(user, src)
internals_action.Remove(user, src)
cycle_action.Remove(user, src)
lights_action.Remove(user, src)
stats_action.Remove(user, src)
strafing_action.Remove(user, src)
defence_action.Remove(user, src)
smoke_action.Remove(user, src)
zoom_action.Remove(user, src)
thrusters_action.Remove(user, src)
phasing_action.Remove(user, src)
switch_damtype_action.Remove(user, src)
overload_action.Remove(user, src)
//
////BUTTONS STUFF
//
/datum/action/innate/mecha
check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_ALIVE
button_icon = 'icons/effects/actions_mecha.dmi'
var/obj/mecha/chassis
/datum/action/innate/mecha/Grant(mob/living/L, obj/mecha/M)
if(M)
chassis = M
..()
/datum/action/innate/mecha/mech_toggle_lights
name = "Toggle Lights"
button_icon_state = "mech_lights_off"
/datum/action/innate/mecha/mech_toggle_lights/Activate()
button_icon_state = "mech_lights_[chassis.lights ? "off" : "on"]"
button.UpdateIcon()
chassis.lights()
/datum/action/innate/mecha/mech_toggle_internals
name = "Toggle Internal Airtank Usage"
button_icon_state = "mech_internals_off"
/datum/action/innate/mecha/mech_toggle_internals/Activate()
button_icon_state = "mech_internals_[chassis.use_internal_tank ? "off" : "on"]"
button.UpdateIcon()
chassis.internal_tank()
/datum/action/innate/mecha/mech_view_stats
name = "View stats"
button_icon_state = "mech_view_stats"
/datum/action/innate/mecha/mech_view_stats/Activate()
chassis.view_stats()
/datum/action/innate/mecha/mech_eject
name = "Eject From Mech"
button_icon_state = "mech_eject"
/datum/action/innate/mecha/mech_eject/Activate()
chassis.go_out()
/datum/action/innate/mecha/strafe
name = "Toggle Mech Strafing"
button_icon_state = "mech_strafe_off"
/datum/action/innate/mecha/strafe/Activate()
button_icon_state = "mech_strafe_[chassis.strafing ? "off" : "on"]"
button.UpdateIcon()
chassis.strafing()
/datum/action/innate/mecha/mech_defence_mode
name = "Toggle Mech defence mode"
button_icon_state = "mech_defense_mode_off"
/datum/action/innate/mecha/mech_defence_mode/Activate()
button_icon_state = "mech_defense_mode_[chassis.defence_mode ? "off" : "on"]"
button.UpdateIcon()
chassis.defence_mode()
/datum/action/innate/mecha/mech_overload_mode
name = "Toggle Mech Leg Overload"
button_icon_state = "mech_overload_off"
/datum/action/innate/mecha/mech_overload_mode/Activate()
button_icon_state = "mech_overload_[chassis.overload ? "off" : "on"]"
button.UpdateIcon()
chassis.overload()
/datum/action/innate/mecha/mech_smoke
name = "Toggle Mech Smoke"
button_icon_state = "mech_smoke_off"
/datum/action/innate/mecha/mech_smoke/Activate()
//button_icon_state = "mech_smoke_[chassis.smoke ? "off" : "on"]"
//button.UpdateIcon() //Dual colors notneeded ATM
chassis.smoke()
/datum/action/innate/mecha/mech_zoom
name = "Toggle Mech Zoom"
button_icon_state = "mech_zoom_off"
/datum/action/innate/mecha/mech_zoom/Activate()
button_icon_state = "mech_zoom_[chassis.zoom ? "off" : "on"]"
button.UpdateIcon()
chassis.zoom()
/datum/action/innate/mecha/mech_toggle_thrusters
name = "Toggle Mech thrusters"
button_icon_state = "mech_thrusters_off"
/datum/action/innate/mecha/mech_toggle_thrusters/Activate()
button_icon_state = "mech_thrusters_[chassis.thrusters ? "off" : "on"]"
button.UpdateIcon()
chassis.thrusters()
/datum/action/innate/mecha/mech_cycle_equip //I'll be honest, i don't understand this part, buuuuuut it works!
name = "Cycle Equipment"
button_icon_state = "mech_cycle_equip_off"
/datum/action/innate/mecha/mech_cycle_equip/Activate()
var/list/available_equipment = list()
available_equipment = chassis.equipment
if(available_equipment.len == 0)
chassis.occupant_message("No equipment available.")
return
if(!chassis.selected)
chassis.selected = available_equipment[1]
chassis.occupant_message("You select [chassis.selected]")
send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list())
button_icon_state = "mech_cycle_equip_on"
button.UpdateIcon()
return
var/number = 0
for(var/A in available_equipment)
number++
if(A == chassis.selected)
if(available_equipment.len == number)
chassis.selected = null
chassis.occupant_message("You switch to no equipment")
button_icon_state = "mech_cycle_equip_off"
else
chassis.selected = available_equipment[number+1]
chassis.occupant_message("You switch to [chassis.selected]")
button_icon_state = "mech_cycle_equip_on"
send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list())
button.UpdateIcon()
return
/datum/action/innate/mecha/mech_switch_damtype
name = "Reconfigure arm microtool arrays"
button_icon_state = "mech_damtype_brute"
/datum/action/innate/mecha/mech_switch_damtype/Activate()
button_icon_state = "mech_damtype_[chassis.damtype]"
playsound(src, 'sound/mecha/mechmove01.ogg', 50, 1)
button.UpdateIcon()
chassis.query_damtype()
/datum/action/innate/mecha/mech_toggle_phasing
name = "Toggle Mech phasing"
button_icon_state = "mech_phasing_off"
/datum/action/innate/mecha/mech_toggle_phasing/Activate()
button_icon_state = "mech_phasing_[chassis.phasing ? "off" : "on"]"
button.UpdateIcon()
chassis.phasing()
/////
/////
///// ACTUAL MECANICS FOR THE ACTIONS
///// OVERLOAD, DEFENCE, SMOKE
/////
/////
/obj/mecha/verb/toggle_defence_mode()
set category = "Exosuit Interface"
set name = "Toggle defence mode"
set src = usr.loc
set popup_menu = 0
defence_mode()
/obj/mecha/proc/defence_mode()
if(usr!=src.occupant)
return
playsound(src, 'sound/mecha/duranddefencemode.ogg', 50, 1)
defence_mode = !defence_mode
if(defence_mode)
deflect_chance = defence_deflect
src.occupant_message("<font color='blue'>You enable [src] defence mode.</font>")
else
deflect_chance = initial(deflect_chance)
src.occupant_message("<font color='red'>You disable [src] defence mode.</font>")
src.log_message("Toggled defence mode.")
return
/obj/mecha/verb/toggle_overload()
set category = "Exosuit Interface"
set name = "Toggle leg actuators overload"
set src = usr.loc
set popup_menu = 0
overload()
/obj/mecha/proc/overload()
if(usr.stat == 1)//No manipulating things while unconcious.
return
if(usr!=src.occupant)
return
if(health < initial(health) - initial(health)/3)//Same formula as in movement, just beforehand.
src.occupant_message("<font color='red'>Leg actuators damage critical, unable to engage overload.</font>")
overload = 0 //Just to be sure
return
if(overload)
overload = 0
step_in = initial(step_in)
step_energy_drain = initial(step_energy_drain)
src.occupant_message("<font color='blue'>You disable leg actuators overload.</font>")
else
overload = 1
step_in = min(1, round(step_in/2))
step_energy_drain = step_energy_drain*overload_coeff
src.occupant_message("<font color='red'>You enable leg actuators overload.</font>")
src.log_message("Toggled leg actuators overload.")
playsound(src, 'sound/mecha/mechanical_toggle.ogg', 50, 1)
return
/obj/mecha/verb/toggle_smoke()
set category = "Exosuit Interface"
set name = "Activate Smoke"
set src = usr.loc
set popup_menu = 0
smoke()
/obj/mecha/proc/smoke()
if(usr!=src.occupant)
return
if(smoke_reserve < 1)
src.occupant_message("<font color='red'>You don't have any smoke left in stock!</font>")
return
if(smoke_ready)
smoke_reserve-- //Remove ammo
src.occupant_message("<font color='red'>Smoke fired. [smoke_reserve] usages left.</font>")
var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread()
smoke.attach(src)
smoke.set_up(10, 0, usr.loc)
smoke.start()
playsound(src, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke_ready = 0
spawn(smoke_cooldown)
smoke_ready = 1
return
/obj/mecha/verb/toggle_zoom()
set category = "Exosuit Interface"
set name = "Zoom"
set src = usr.loc
set popup_menu = 0
zoom()
/obj/mecha/proc/zoom()//This could use improvements but maybe later.
if(usr!=src.occupant)
return
if(src.occupant.client)
src.zoom = !src.zoom
src.log_message("Toggled zoom mode.")
src.occupant_message("<font color='[src.zoom?"blue":"red"]'>Zoom mode [zoom?"en":"dis"]abled.</font>")
if(zoom)
src.occupant.set_viewsize(12)
src.occupant << sound('sound/mecha/imag_enh.ogg',volume=50)
else
src.occupant.set_viewsize() // Reset to default
return
/obj/mecha/verb/toggle_thrusters()
set category = "Exosuit Interface"
set name = "Toggle thrusters"
set src = usr.loc
set popup_menu = 0
thrusters()
/obj/mecha/proc/thrusters()
if(usr!=src.occupant)
return
if(src.occupant)
if(get_charge() > 0)
thrusters = !thrusters
src.log_message("Toggled thrusters.")
src.occupant_message("<font color='[src.thrusters?"blue":"red"]'>Thrusters [thrusters?"en":"dis"]abled.</font>")
return
/obj/mecha/verb/switch_damtype()
set category = "Exosuit Interface"
set name = "Change melee damage type"
set src = usr.loc
set popup_menu = 0
query_damtype()
/obj/mecha/proc/query_damtype()
if(usr!=src.occupant)
return
var/new_damtype = alert(src.occupant,"Melee Damage Type",null,"Brute","Fire","Toxic")
switch(new_damtype)
if("Brute")
damtype = "brute"
src.occupant_message("Your exosuit's hands form into fists.")
if("Fire")
damtype = "fire"
src.occupant_message("A torch tip extends from your exosuit's hand, glowing red.")
if("Toxic")
damtype = "tox"
src.occupant_message("A bone-chillingly thick plasteel needle protracts from the exosuit's palm.")
src.occupant_message("Melee damage type switched to [new_damtype]")
return
/obj/mecha/verb/toggle_phasing()
set category = "Exosuit Interface"
set name = "Toggle phasing"
set src = usr.loc
set popup_menu = 0
phasing()
/obj/mecha/proc/phasing()
if(usr!=src.occupant)
return
phasing = !phasing
send_byjax(src.occupant,"exosuit.browser","phasing_command","[phasing?"Dis":"En"]able phasing")
src.occupant_message("<font color=\"[phasing?"#00f\">En":"#f00\">Dis"]abled phasing.</font>")
return

View File

@@ -0,0 +1,3 @@
/obj/mecha
damage_minimum = 5 //Incoming damage lower than this won't actually deal damage. Scrapes shouldn't be a real thing.
minimum_penetration = 10 //Incoming damage won't be fully applied if you don't have at least 20. Almost all AP clears this.

View File

@@ -131,3 +131,13 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
ME.attach(src)
//Meant for random spawns.
/obj/mecha/medical/odysseus/old
desc = "An aging combat exosuit utilized by many corporations. Originally developed to combat hostile alien lifeforms. This one is particularly worn looking and likely isn't as sturdy."
/obj/mecha/medical/odysseus/old/New()
..()
health = 25
maxhealth = 100 //Just slightly worse.
cell.charge = rand(0, (cell.charge/2))

View File

@@ -0,0 +1,2 @@
/obj/mecha/medical/odysseus/
minimum_penetration = 0

View File

@@ -25,8 +25,6 @@
damage_absorption = list("brute"=0.75,"fire"=1,"bullet"=0.8,"laser"=0.7,"energy"=0.85,"bomb"=1)
max_temperature = 15000
infra_luminosity = 6
var/overload = 0
var/overload_coeff = 2
wreckage = /obj/effect/decal/mecha_wreckage/micro/sec/polecat
internal_damage_threshold = 35
max_equip = 3
@@ -48,9 +46,6 @@
deflect_chance = 5
damage_absorption = list("brute"=1,"fire"=1,"bullet"=0.9,"laser"=0.8,"energy"=0.85,"bomb"=1)
max_temperature = 5000
infra_luminosity = 6
var/overload = 0
var/overload_coeff = 2
wreckage = /obj/effect/decal/mecha_wreckage/micro/sec/weasel
internal_damage_threshold = 20
max_equip = 2

View File

@@ -12,8 +12,6 @@
damage_absorption = list("brute"=0.9,"fire"=1,"bullet"=1,"laser"=1,"energy"=1,"bomb"=1)
max_temperature = 15000
infra_luminosity = 6
var/overload = 0
var/overload_coeff = 2
wreckage = /obj/effect/decal/mecha_wreckage/micro/utility/gopher
internal_damage_threshold = 35
max_micro_utility_equip = 2

View File

@@ -7,11 +7,13 @@
step_energy_drain = 5 // vorestation edit because 10 drained a significant chunk of its cell before you even got out the airlock
max_temperature = 20000
health = 200
maxhealth = 200
maxhealth = 200 //Don't forget to update the /old variant if you change this number.
wreckage = /obj/effect/decal/mecha_wreckage/ripley
cargo_capacity = 10
var/obj/item/weapon/mining_scanner/orescanner // vorestation addition
minimum_penetration = 10
/obj/mecha/working/ripley/Destroy()
for(var/atom/movable/A in src.cargo)
A.loc = loc
@@ -81,7 +83,7 @@
qdel (B)
// VORESTATION EDIT BEGIN
//Vorestation Edit Start
/obj/mecha/working/ripley/New()
..()
@@ -95,5 +97,14 @@
orescanner.attack_self(usr)
// VORESTATION EDIT END
//Vorestation Edit End
//Meant for random spawns.
/obj/mecha/working/ripley/mining/old
desc = "An old, dusty mining ripley."
/obj/mecha/working/ripley/mining/old/New()
..()
health = 25
maxhealth = 190 //Just slightly worse.
cell.charge = rand(0, cell.charge)

View File

@@ -0,0 +1,2 @@
/obj/mecha/working/ripley
minimum_penetration = 0

View File

@@ -22,10 +22,6 @@
icon_state = "sbsposter6"
name = "Mawletta"
desc = "The best view in the system."
/datum/poster/vore_7
icon_state = "sbsposter7"
name = "Sam FEAR"
desc = "A poster of the most dangerous cat working for NT."
/datum/poster/vore_8
icon_state = "sbsposter8"
name = "Shitty Timbs"
@@ -34,10 +30,6 @@
icon_state = "sbsposter9"
name = "Shitty Tim"
desc = "A Shitty Tim concert poster."
/datum/poster/vore_10
icon_state = "sbsposter10"
name = "Kitty Kisuke"
desc = "A poster of famous redspace researcher, Kisuke Gema."
/datum/poster/vore_11
icon_state = "sbsposter11"
name = "Fear"

View File

@@ -0,0 +1,51 @@
/obj/item/toy/tennis
name = "tennis ball"
desc = "A classic tennis ball; a hollow rubber sphere covered in felt. This one has seen better days, and seems to have lost most of its bounce."
icon = 'icons/obj/balls_vr.dmi'
icon_state = "tennis_classic"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/righthand_balls_vr.dmi',
slot_r_hand_str = 'icons/mob/items/lefthand_balls_vr.dmi',
slot_wear_mask_str = 'icons/mob/mouthball_vr.dmi',
)
item_state = "tennis_classic"
slot_flags = SLOT_MASK
throw_range = 14
w_class = ITEMSIZE_SMALL
/obj/item/toy/tennis/red
name = "red tennis ball"
desc = "A red tennis ball. It goes twice as fast!"
icon_state = "tennis_red"
item_state = "tennis_red"
throw_speed = 8 //base throw_speed is 4, and that's already super fast
/obj/item/toy/tennis/yellow
name = "yellow tennis ball"
desc = "A yellow tennis ball. Or is it orange? Orangey-yellow?"
icon_state = "tennis_yellow"
item_state = "tennis_yellow"
/obj/item/toy/tennis/green
name = "green tennis ball"
desc = "A bright green tennis ball. Tastes faintly of lime... or maybe soap."
icon_state = "tennis_green"
item_state = "tennis_green"
/obj/item/toy/tennis/cyan
name = "cyan tennis ball"
desc = "A cyan tennis ball. What a curious color choice."
icon_state = "tennis_cyan"
item_state = "tennis_cyan"
/obj/item/toy/tennis/blue
name = "blue tennis ball"
desc = "A blue tennis ball. Who makes blue tennis balls anyway?"
icon_state = "tennis_blue"
item_state = "tennis_blue"
/obj/item/toy/tennis/purple
name = "purple tennis ball"
desc = "A purple tennis ball. Now you've seen everything. Purple, seriously?"
icon_state = "tennis_purple"
item_state = "tennis_purple"

View File

@@ -271,8 +271,8 @@
//Checks for various conditions to see if the mob is revivable
/obj/item/weapon/shockpaddles/proc/can_defib(mob/living/carbon/human/H) //This is checked before doing the defib operation
if((H.species.flags & NO_SCAN))
return "buzzes, \"Unrecogized physiology. Operation aborted.\""
if((H.species.flags & NO_DEFIB))
return "buzzes, \"Incompatible physiology. Operation aborted.\""
else if(H.isSynthetic() && !use_on_synthetic)
return "buzzes, \"Synthetic Body. Operation aborted.\""
else if(!H.isSynthetic() && use_on_synthetic)

View File

@@ -326,7 +326,7 @@
var/televored = FALSE
if(isbelly(real_dest))
var/obj/belly/B = real_dest
if(!target.can_be_drop_prey && B.owner != user)
if(!(target.can_be_drop_prey) && B.owner != user)
to_chat(target,"<span class='warning'>\The [src] narrowly avoids teleporting you right into \a [lowertext(real_dest.name)]!</span>")
real_dest = dT //Nevermind!
else

View File

@@ -1445,3 +1445,77 @@
force = 1
throwforce = 1
drop_sound = 'sound/items/drop/box.ogg'
//////////////////////////////////////////////////////
// Chess Pieces //
//////////////////////////////////////////////////////
/obj/item/toy/chess
name = "chess piece"
desc = "This should never display."
icon = 'icons/obj/chess.dmi'
w_class = ITEMSIZE_SMALL
force = 1
throwforce = 1
drop_sound = 'sound/items/drop/glass.ogg'
/obj/item/toy/chess/pawn_white
name = "blue pawn"
desc = "A large pawn piece for playing chess. It's made of a blue-colored glass."
description_info = "Pawns can move forward one square, if that square is unoccupied. If the pawn has not yet moved, it has the option of moving two squares forward provided both squares in front of the pawn are unoccupied. A pawn cannot move backward. They can only capture an enemy piece on either of the two tiles diagonally in front of them, but not the tile directly in front of them."
icon_state = "w-pawn"
/obj/item/toy/chess/pawn_black
name = "purple pawn"
desc = "A large pawn piece for playing chess. It's made of a purple-colored glass."
description_info = "Pawns can move forward one square, if that square is unoccupied. If the pawn has not yet moved, it has the option of moving two squares forward provided both squares in front of the pawn are unoccupied. A pawn cannot move backward. They can only capture an enemy piece on either of the two tiles diagonally in front of them, but not the tile directly in front of them."
icon_state = "b-pawn"
/obj/item/toy/chess/rook_white
name = "blue rook"
desc = "A large rook piece for playing chess. It's made of a blue-colored glass."
description_info = "The Rook can move any number of vacant squares vertically or horizontally."
icon_state = "w-rook"
/obj/item/toy/chess/rook_black
name = "purple rook"
desc = "A large rook piece for playing chess. It's made of a purple-colored glass."
description_info = "The Rook can move any number of vacant squares vertically or horizontally."
icon_state = "b-rook"
/obj/item/toy/chess/knight_white
name = "blue knight"
desc = "A large knight piece for playing chess. It's made of a blue-colored glass. Sadly, you can't ride it."
description_info = "The Knight can either move two squares horizontally and one square vertically or two squares vertically and one square horizontally. The knight's movement can also be viewed as an 'L' laid out at any horizontal or vertical angle."
icon_state = "w-knight"
/obj/item/toy/chess/knight_black
name = "purple knight"
desc = "A large knight piece for playing chess. It's made of a purple-colored glass. 'Just a flesh wound.'"
description_info = "The Knight can either move two squares horizontally and one square vertically or two squares vertically and one square horizontally. The knight's movement can also be viewed as an 'L' laid out at any horizontal or vertical angle."
icon_state = "b-knight"
/obj/item/toy/chess/bishop_white
name = "blue bishop"
desc = "A large bishop piece for playing chess. It's made of a blue-colored glass."
description_info = "The Bishop can move any number of vacant squares in any diagonal direction."
icon_state = "w-bishop"
/obj/item/toy/chess/bishop_black
name = "purple bishop"
desc = "A large bishop piece for playing chess. It's made of a purple-colored glass."
description_info = "The Bishop can move any number of vacant squares in any diagonal direction."
icon_state = "b-bishop"
/obj/item/toy/chess/queen_white
name = "blue queen"
desc = "A large queen piece for playing chess. It's made of a blue-colored glass."
description_info = "The Queen can move any number of vacant squares diagonally, horizontally, or vertically."
icon_state = "w-queen"
/obj/item/toy/chess/queen_black
name = "purple queen"
desc = "A large queen piece for playing chess. It's made of a purple-colored glass."
description_info = "The Queen can move any number of vacant squares diagonally, horizontally, or vertically."
icon_state = "b-queen"
/obj/item/toy/chess/king_white
name = "blue king"
desc = "A large king piece for playing chess. It's made of a blue-colored glass."
description_info = "The King can move exactly one square horizontally, vertically, or diagonally. If your opponent captures this piece, you lose."
icon_state = "w-king"
/obj/item/toy/chess/king_black
name = "purple king"
desc = "A large king piece for playing chess. It's made of a purple-colored glass."
description_info = "The King can move exactly one square horizontally, vertically, or diagonally. If your opponent captures this piece, you lose."
icon_state = "b-king"

View File

@@ -9,6 +9,7 @@
/obj/item/weapon/book/manual/engineering_construction
name = "Station Repairs and Construction"
icon_state ="bookEngineering"
item_state = "book3"
author = "Engineering Encyclopedia" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
title = "Station Repairs and Construction"
@@ -30,6 +31,7 @@
/obj/item/weapon/book/manual/engineering_particle_accelerator
name = "Particle Accelerator User's Guide"
icon_state ="bookParticleAccelerator"
item_state = "book15"
author = "Engineering Encyclopedia" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
title = "Particle Accelerator User's Guide"
@@ -77,6 +79,7 @@
/obj/item/weapon/book/manual/supermatter_engine
name = "Supermatter Engine Operating Manual"
icon_state = "bookSupermatter"
item_state = "book15"
author = "Central Engineering Division"
title = "Supermatter Engine Operating Manual"
@@ -160,6 +163,7 @@
/obj/item/weapon/book/manual/tesla_engine
name = "Tesla Operating Manual"
icon_state ="bookTesla"
item_state = "book15"
author = "Engineering Encyclopedia"
title = "Tesla Engine User's Guide"
dat = {"<html>
@@ -229,7 +233,8 @@
/obj/item/weapon/book/manual/rust_engine
name = "R-UST Operating Manual"
icon_state = "bookSupermatter"
author = "Yumi Kruik"
item_state = "book15"
author = "Cindy Crawfish"
title = "R-UST Operating Manual"
//R-UST guide Re-Writen by Gozulio to reflect how the R-UST actually operates.
@@ -280,6 +285,7 @@
/obj/item/weapon/book/manual/engineering_hacking
name = "Hacking"
icon_state ="bookHacking"
item_state = "book2"
author = "Engineering Encyclopedia" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
title = "Hacking"
@@ -302,6 +308,7 @@
/obj/item/weapon/book/manual/engineering_singularity_safety
name = "Singularity Safety in Special Circumstances"
icon_state ="bookEngineeringSingularitySafety"
item_state = "book15"
author = "Engineering Encyclopedia" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
title = "Singularity Safety in Special Circumstances"
@@ -354,6 +361,7 @@
/obj/item/weapon/book/manual/hydroponics_pod_people
name = "The Diona Harvest - From Seed to Market"
icon_state ="bookHydroponicsPodPeople"
item_state = "book5"
author = "Farmer John"
title = "The Diona Harvest - From Seed to Market"
@@ -392,6 +400,7 @@
/obj/item/weapon/book/manual/medical_cloning
name = "Cloning Techniques of the 26th Century"
icon_state ="bookCloning"
item_state = "book9"
author = "Medical Journal, volume 3" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
title = "Cloning Techniques of the 26th Century"
@@ -485,6 +494,7 @@
/obj/item/weapon/book/manual/ripley_build_and_repair
name = "APLU \"Ripley\" Construction and Operation Manual"
icon_state ="book"
item_state = "book"
author = "Randall Varn, Einstein Engines Senior Mechanic" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
title = "APLU \"Ripley\" Construction and Operation Manual"
@@ -562,6 +572,7 @@
/obj/item/weapon/book/manual/research_and_development
name = "Research and Development 101"
icon_state = "rdbook"
item_state = "book7"
author = "Dr. L. Ight"
title = "Research and Development 101"
@@ -631,6 +642,7 @@
/obj/item/weapon/book/manual/robotics_cyborgs
name = "Cyborgs for Dummies"
icon_state = "borgbook"
item_state = "book1"
author = "XISC"
title = "Cyborgs for Dummies"
@@ -837,6 +849,7 @@
name = "Corporate Regulations"
desc = "A set of corporate guidelines for keeping law and order on privately-owned space stations."
icon_state = "bookSpaceLaw"
item_state = "book13"
author = "The Company"
title = "Corporate Regulations"
@@ -861,6 +874,7 @@
name = "Medical Diagnostics Manual"
desc = "First, do no harm. A detailed medical practitioner's guide."
icon_state = "bookMedical"
item_state = "book12"
author = "Medical Department"
title = "Medical Diagnostics Manual"
@@ -908,6 +922,7 @@
/obj/item/weapon/book/manual/engineering_guide
name = "Engineering Textbook"
icon_state ="bookEngineering2"
item_state = "book3"
author = "Engineering Encyclopedia"
title = "Engineering Textbook"
@@ -929,6 +944,7 @@
/obj/item/weapon/book/manual/chef_recipes
name = "Chef Recipes"
icon_state = "cooked_book"
item_state = "book16"
author = "Victoria Ponsonby"
title = "Chef Recipes"
@@ -989,6 +1005,7 @@
name = "Barman Recipes"
desc = "For the enterprising drink server."
icon_state = "barbook"
item_state = "book14"
author = "Sir John Rose"
title = "Barman Recipes"
@@ -1044,6 +1061,7 @@
/obj/item/weapon/book/manual/detective
name = "The Film Noir: Proper Procedures for Investigations"
icon_state ="bookDetective"
item_state = "book8"
author = "The Company"
title = "The Film Noir: Proper Procedures for Investigations"
@@ -1087,6 +1105,7 @@
/obj/item/weapon/book/manual/nuclear
name = "Fission Mailed: Nuclear Sabotage 101"
icon_state ="bookNuclear"
item_state = "book8"
author = "Syndicate"
title = "Fission Mailed: Nuclear Sabotage 101"
@@ -1138,6 +1157,7 @@
/obj/item/weapon/book/manual/atmospipes
name = "Pipes and You: Getting To Know Your Scary Tools"
icon_state = "pipingbook"
item_state = "book3"
author = "Maria Crash, Senior Atmospherics Technician"
title = "Pipes and You: Getting To Know Your Scary Tools"
dat = {"<html>
@@ -1246,6 +1266,7 @@
/obj/item/weapon/book/manual/evaguide
name = "EVA Gear and You: Not Spending All Day Inside, 2nd Edition"
icon_state = "evabook"
item_state = "book14"
author = "Maria Crash, Senior Atmospherics Technician"
title = "EVA Gear and You: Not Spending All Day Inside, 2nd Edition"
dat = {"<html>

View File

@@ -3,6 +3,10 @@
desc = "A scroll for moving around."
icon = 'icons/obj/wizard.dmi'
icon_state = "scroll"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_books.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_books.dmi'
)
var/uses = 4.0
w_class = ITEMSIZE_TINY
item_state = "paper"

View File

@@ -33,7 +33,7 @@
base_block_chance = 40
slot_flags = SLOT_BACK
var/brightness_on
brightness_on = 4
brightness_on = 6
var/on = 0
var/light_applied
//var/light_overlay

View File

@@ -2,6 +2,11 @@
name = "bible"
desc = "Apply to head repeatedly."
icon_state ="bible"
item_state = "bible"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_books.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_books.dmi'
)
throw_speed = 1
throw_range = 5
w_class = ITEMSIZE_NORMAL

View File

@@ -107,7 +107,17 @@ something, make sure it's not in one of the other lists.*/
prob(2);/obj/item/device/camera,
prob(3);/obj/item/device/pda,
prob(3);/obj/item/device/radio/headset,
prob(1);/obj/item/pizzavoucher)
/* VOREStation Edit Start */
prob(2);/obj/item/toy/tennis,
prob(2);/obj/item/toy/tennis/red,
prob(2);/obj/item/toy/tennis/yellow,
prob(2);/obj/item/toy/tennis/green,
prob(2);/obj/item/toy/tennis/cyan,
prob(2);/obj/item/toy/tennis/blue,
prob(2);/obj/item/toy/tennis/purple,
prob(1);/obj/item/pizzavoucher
/* VOREStation Edit End */
)
/obj/random/maintenance/security
/*Maintenance loot list. This one is for around security areas*/

View File

@@ -0,0 +1,56 @@
/obj/random/mech
name = "random mech"
desc = "This is a random single mech."
icon = 'icons/mecha/mecha.dmi'
icon_state = "old_durand"
drop_get_turf = FALSE
//This list includes the phazon, gorilla and mauler. You might want to use something else if balance is a concern.
/obj/random/mech/item_to_spawn()
return pick(/obj/mecha/combat/gygax,
/obj/mecha/combat/gygax/serenity,
/obj/mecha/combat/gygax/dark,
/obj/mecha/combat/marauder,
/obj/mecha/combat/marauder/seraph,
/obj/mecha/combat/marauder/mauler,
/obj/mecha/medical/odysseus,
/obj/mecha/combat/phazon,
/obj/mecha/combat/phazon/janus,
/obj/mecha/combat/durand,
/obj/mecha/working/ripley,
/obj/mecha/working/ripley/firefighter,
/obj/mecha/working/ripley/deathripley,
/obj/mecha/working/ripley/mining)
/obj/random/mech/weaker
name = "random mech"
desc = "This is a random single mech. Those are less potent and more common."
icon = 'icons/mecha/mecha.dmi'
icon_state = "old_durand"
drop_get_turf = FALSE
/obj/random/mech/weaker/item_to_spawn()
return pick(/obj/mecha/combat/gygax,
/obj/mecha/combat/gygax/serenity,
/obj/mecha/medical/odysseus,
/obj/mecha/combat/durand,
/obj/mecha/working/ripley,
/obj/mecha/working/ripley/firefighter,
/obj/mecha/working/ripley/deathripley,
/obj/mecha/working/ripley/mining)
/obj/random/mech/old
name = "random mech"
desc = "This is a random single old mech."
icon = 'icons/mecha/mecha.dmi'
icon_state = "old_durand"
drop_get_turf = FALSE
//Note that all of those are worn out and have slightly less maximal health than the standard.
/obj/random/mech/old/item_to_spawn()
return pick(prob(10);/obj/mecha/combat/gygax/old,
prob(1);/obj/mecha/combat/marauder/old,
prob(1);/obj/mecha/combat/phazon/old,
prob(10);/obj/mecha/combat/durand/old,
prob(15);/obj/mecha/medical/odysseus/old,
prob(20);/obj/mecha/working/ripley/mining/old)

View File

@@ -65,7 +65,6 @@
/obj/structure/closet/secure_closet/hos
name = "head of security's locker"
req_access = list(access_hos)
req_access = list(access_hos)
storage_capacity = 2.5 * MOB_MEDIUM
closet_appearance = /decl/closet_appearance/secure_closet/security/hos

View File

@@ -192,6 +192,13 @@
prob(2);/obj/item/weapon/storage/box/sinpockets,
prob(2);/obj/item/weapon/storage/secure/briefcase,
prob(2);/obj/item/clothing/under/fluff/latexmaid,
prob(2);/obj/item/toy/tennis,
prob(2);/obj/item/toy/tennis/red,
prob(2);/obj/item/toy/tennis/yellow,
prob(2);/obj/item/toy/tennis/green,
prob(2);/obj/item/toy/tennis/cyan,
prob(2);/obj/item/toy/tennis/blue,
prob(2);/obj/item/toy/tennis/purple,
prob(1);/obj/item/clothing/glasses/sunglasses,
prob(1);/obj/item/clothing/glasses/welding,
prob(1);/obj/item/clothing/gloves/yellow,

View File

@@ -721,6 +721,54 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/sign/p
icon_state = "white_p"
/obj/effect/floor_decal/sign/small_a
icon_state = "small_a"
/obj/effect/floor_decal/sign/small_b
icon_state = "small_b"
/obj/effect/floor_decal/sign/small_c
icon_state = "small_c"
/obj/effect/floor_decal/sign/small_d
icon_state = "small_d"
/obj/effect/floor_decal/sign/small_e
icon_state = "small_e"
/obj/effect/floor_decal/sign/small_f
icon_state = "small_f"
/obj/effect/floor_decal/sign/small_g
icon_state = "small_g"
/obj/effect/floor_decal/sign/small_h
icon_state = "small_h"
/obj/effect/floor_decal/sign/small_1
icon_state = "small_1"
/obj/effect/floor_decal/sign/small_2
icon_state = "small_2"
/obj/effect/floor_decal/sign/small_3
icon_state = "small_3"
/obj/effect/floor_decal/sign/small_4
icon_state = "small_4"
/obj/effect/floor_decal/sign/small_5
icon_state = "small_5"
/obj/effect/floor_decal/sign/small_6
icon_state = "small_6"
/obj/effect/floor_decal/sign/small_7
icon_state = "small_7"
/obj/effect/floor_decal/sign/small_8
icon_state = "small_8"
/obj/effect/floor_decal/sign/dock
icon_state = "white_d"

View File

@@ -6,4 +6,4 @@
create_mob_html = file2text('html/create_object.html')
create_mob_html = replacetext(create_mob_html, "null /* object types */", "\"[mobjs]\"")
user << browse(replacetext(create_mob_html, "/* ref src */", "\ref[src]"), "window=create_mob;size=425x475")
user << browse(replacetext(create_mob_html, "/* ref src */", "\ref[src]"), "window=create_mob;size=680x600")

View File

@@ -7,7 +7,7 @@
create_object_html = file2text('html/create_object.html')
create_object_html = replacetext(create_object_html, "null /* object types */", "\"[objectjs]\"")
user << browse(replacetext(create_object_html, "/* ref src */", "\ref[src]"), "window=create_object;size=425x475")
user << browse(replacetext(create_object_html, "/* ref src */", "\ref[src]"), "window=create_object;size=680x600")
/datum/admins/proc/quick_create_object(var/mob/user)
@@ -26,4 +26,4 @@
quick_create_object_html = file2text('html/create_object.html')
quick_create_object_html = replacetext(quick_create_object_html, "null /* object types */", "\"[objectjs]\"")
user << browse(replacetext(quick_create_object_html, "/* ref src */", "\ref[src]"), "window=quick_create_object;size=425x475")
user << browse(replacetext(quick_create_object_html, "/* ref src */", "\ref[src]"), "window=quick_create_object;size=680x600")

View File

@@ -6,4 +6,4 @@
create_turf_html = file2text('html/create_object.html')
create_turf_html = replacetext(create_turf_html, "null /* object types */", "\"[turfjs]\"")
user << browse(replacetext(create_turf_html, "/* ref src */", "\ref[src]"), "window=create_turf;size=425x475")
user << browse(replacetext(create_turf_html, "/* ref src */", "\ref[src]"), "window=create_turf;size=680x600")

View File

@@ -16,6 +16,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["hair_green"] >> pref.g_hair
S["hair_blue"] >> pref.b_hair
S["facial_red"] >> pref.r_facial
S["grad_red"] >> pref.r_grad
S["grad_green"] >> pref.g_grad
S["grad_blue"] >> pref.b_grad
S["facial_green"] >> pref.g_facial
S["facial_blue"] >> pref.b_facial
S["skin_tone"] >> pref.s_tone
@@ -24,6 +27,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["skin_blue"] >> pref.b_skin
S["hair_style_name"] >> pref.h_style
S["facial_style_name"] >> pref.f_style
S["grad_style_name"] >> pref.grad_style
S["eyes_red"] >> pref.r_eyes
S["eyes_green"] >> pref.g_eyes
S["eyes_blue"] >> pref.b_eyes
@@ -50,6 +54,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["hair_red"] << pref.r_hair
S["hair_green"] << pref.g_hair
S["hair_blue"] << pref.b_hair
S["grad_red"] << pref.r_grad
S["grad_green"] << pref.g_grad
S["grad_blue"] << pref.b_grad
S["facial_red"] << pref.r_facial
S["facial_green"] << pref.g_facial
S["facial_blue"] << pref.b_facial
@@ -59,6 +66,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["skin_blue"] << pref.b_skin
S["hair_style_name"] << pref.h_style
S["facial_style_name"] << pref.f_style
S["grad_style_name"] << pref.grad_style
S["eyes_red"] << pref.r_eyes
S["eyes_green"] << pref.g_eyes
S["eyes_blue"] << pref.b_eyes
@@ -86,6 +94,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.r_hair = sanitize_integer(pref.r_hair, 0, 255, initial(pref.r_hair))
pref.g_hair = sanitize_integer(pref.g_hair, 0, 255, initial(pref.g_hair))
pref.b_hair = sanitize_integer(pref.b_hair, 0, 255, initial(pref.b_hair))
pref.r_grad = sanitize_integer(pref.r_grad, 0, 255, initial(pref.r_grad))
pref.g_grad = sanitize_integer(pref.g_grad, 0, 255, initial(pref.g_grad))
pref.b_grad = sanitize_integer(pref.b_grad, 0, 255, initial(pref.b_grad))
pref.r_facial = sanitize_integer(pref.r_facial, 0, 255, initial(pref.r_facial))
pref.g_facial = sanitize_integer(pref.g_facial, 0, 255, initial(pref.g_facial))
pref.b_facial = sanitize_integer(pref.b_facial, 0, 255, initial(pref.b_facial))
@@ -95,6 +106,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.b_skin = sanitize_integer(pref.b_skin, 0, 255, initial(pref.b_skin))
pref.h_style = sanitize_inlist(pref.h_style, hair_styles_list, initial(pref.h_style))
pref.f_style = sanitize_inlist(pref.f_style, facial_hair_styles_list, initial(pref.f_style))
pref.grad_style = sanitize_inlist(pref.grad_style, GLOB.hair_gradients, initial(pref.grad_style))
pref.r_eyes = sanitize_integer(pref.r_eyes, 0, 255, initial(pref.r_eyes))
pref.g_eyes = sanitize_integer(pref.g_eyes, 0, 255, initial(pref.g_eyes))
pref.b_eyes = sanitize_integer(pref.b_eyes, 0, 255, initial(pref.b_eyes))
@@ -118,6 +130,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
character.r_hair = pref.r_hair
character.g_hair = pref.g_hair
character.b_hair = pref.b_hair
character.r_grad = pref.r_grad
character.g_grad = pref.g_grad
character.b_grad = pref.b_grad
character.f_style = pref.f_style
character.r_facial = pref.r_facial
character.g_facial = pref.g_facial
@@ -128,6 +143,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
character.s_tone = pref.s_tone
character.h_style = pref.h_style
character.f_style = pref.f_style
character.grad_style= pref.grad_style
character.b_type = pref.b_type
character.synth_color = pref.synth_color
character.r_synth = pref.r_synth
@@ -344,6 +360,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += "<a href='?src=\ref[src];hair_color=1'>Change Color</a> [color_square(pref.r_hair, pref.g_hair, pref.b_hair)] "
. += " Style: <a href='?src=\ref[src];hair_style_left=[pref.h_style]'><</a> <a href='?src=\ref[src];hair_style_right=[pref.h_style]''>></a> <a href='?src=\ref[src];hair_style=1'>[pref.h_style]</a><br>" //The <</a> & ></a> in this line is correct-- those extra characters are the arrows you click to switch between styles.
. += "<b>Gradient</b><br>"
. += "<a href='?src=\ref[src];grad_color=1'>Change Color</a> [color_square(pref.r_grad, pref.g_grad, pref.b_grad)] "
. += " Style: <a href='?src=\ref[src];grad_style_left=[pref.grad_style]'><</a> <a href='?src=\ref[src];grad_style_right=[pref.grad_style]''>></a> <a href='?src=\ref[src];grad_style=1'>[pref.grad_style]</a><br>"
. += "<br><b>Facial</b><br>"
if(has_flag(mob_species, HAS_HAIR_COLOR))
. += "<a href='?src=\ref[src];facial_color=1'>Change Color</a> [color_square(pref.r_facial, pref.g_facial, pref.b_facial)] "
@@ -473,6 +493,16 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.b_hair = hex2num(copytext(new_hair, 6, 8))
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["grad_color"])
if(!has_flag(mob_species, HAS_HAIR_COLOR))
return TOPIC_NOACTION
var/new_grad = input(user, "Choose your character's secondary hair color:", "Character Preference", rgb(pref.r_grad, pref.g_grad, pref.b_grad)) as color|null
if(new_grad && has_flag(mob_species, HAS_HAIR_COLOR) && CanUseTopic(user))
pref.r_grad = hex2num(copytext(new_grad, 2, 4))
pref.g_grad = hex2num(copytext(new_grad, 4, 6))
pref.b_grad = hex2num(copytext(new_grad, 6, 8))
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["hair_style"])
var/list/valid_hairstyles = pref.get_valid_hairstyles()
@@ -481,6 +511,14 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.h_style = new_h_style
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["grad_style"])
var/list/valid_gradients = GLOB.hair_gradients
var/new_grad_style = input(user, "Choose a color pattern for your hair:", "Character Preference", pref.grad_style) as null|anything in valid_gradients
if(new_grad_style && CanUseTopic(user))
pref.grad_style = new_grad_style
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["hair_style_left"])
var/H = href_list["hair_style_left"]
var/list/valid_hairstyles = pref.get_valid_hairstyles()
@@ -939,6 +977,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
dat += "</br><b>Does not have a respiratory system.</b>"
if(current_species.flags & NO_SCAN)
dat += "</br><b>Does not have DNA.</b>"
if(current_species.flags & NO_DEFIB)
dat += "</br><b>Cannot be defibrillated.</b>"
if(current_species.flags & NO_PAIN)
dat += "</br><b>Does not feel pain.</b>"
if(current_species.flags & NO_SLIP)

View File

@@ -0,0 +1,12 @@
/datum/gear/ball
display_name = "tennis ball selection"
description = "Choose from a num- BALL!"
path = /obj/item/toy/tennis
/datum/gear/ball/New()
..()
var/list/balls = list()
for(var/ball in typesof(/obj/item/toy/tennis/))
var/obj/item/toy/tennis/ball_type = ball
balls[initial(ball_type.name)] = ball_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(balls))

View File

@@ -37,6 +37,10 @@ datum/preferences
var/r_hair = 0 //Hair color
var/g_hair = 0 //Hair color
var/b_hair = 0 //Hair color
var/grad_style = "none" //Gradient style
var/r_grad = 0 //Gradient color
var/g_grad = 0 //Gradient color
var/b_grad = 0 //Gradient color
var/f_style = "Shaved" //Face hair type
var/r_facial = 0 //Face hair color
var/g_facial = 0 //Face hair color

View File

@@ -1,7 +1,7 @@
//Mining suit
//Advanced Exploration Suit
/obj/item/weapon/rig/robotics
name = "advanced suit control belt"
suit_type = "advanced suit"
suit_type = "advanced"
desc = "A lightweight suit combining the utility of a RIG with the wearability of a voidsuit."
icon_state = "void_explorer2"
slot_flags = SLOT_BELT
@@ -14,8 +14,8 @@
rigsuit_max_pressure = 8 * ONE_ATMOSPHERE
rigsuit_min_pressure = 0
chest_type = /obj/item/clothing/suit/space/rig
helm_type = /obj/item/clothing/head/helmet/space/rig
chest_type = /obj/item/clothing/suit/space/rig/advsuit
helm_type = /obj/item/clothing/head/helmet/space/rig/advsuit
boot_type = null
glove_type = null
cell_type = null
@@ -27,3 +27,12 @@
req_access = list()
req_one_access = list()
/obj/item/clothing/head/helmet/space/rig/advsuit
name = "suit helmet"
/obj/item/clothing/suit/space/rig/advsuit
name = "voidsuit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS|FEET
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS|FEET
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS|FEET

View File

@@ -158,17 +158,75 @@
//Medical Streamlined Voidsuit
/obj/item/clothing/head/helmet/space/void/medical/alt
name = "streamlined medical voidsuit helmet"
desc = "A trendy, lightly radiation-shielded voidsuit helmet trimmed in a sleek blue."
desc = "A trendy, lightly radiation-shielded voidsuit helmet trimmed in a sleek blue. It possesses advanced autoadaptive systems and doesn't need to be cycled to change species fit for most large humanoids."
icon_state = "rig0-medicalalt"
armor = list(melee = 20, bullet = 5, laser = 20,energy = 5, bomb = 15, bio = 100, rad = 30)
light_overlay = "helmet_light_dual_blue"
species_restricted = list("exclude",SPECIES_DIONA,SPECIES_VOX,SPECIES_TESHARI) //this thing can autoadapt to most species, but diona/vox are too weird, and tesh are too small
no_cycle = TRUE
/obj/item/clothing/head/helmet/space/void/medical/alt
sprite_sheets = list(
SPECIES_HUMAN = 'icons/mob/head.dmi',
SPECIES_TAJ = 'icons/mob/species/tajaran/helmet.dmi',
SPECIES_SKRELL = 'icons/mob/species/skrell/helmet.dmi',
SPECIES_UNATHI = 'icons/mob/species/unathi/helmet.dmi'
)
sprite_sheets_obj = list(
SPECIES_TAJ = 'icons/obj/clothing/hats.dmi',
SPECIES_SKRELL = 'icons/obj/clothing/hats.dmi',
SPECIES_UNATHI = 'icons/obj/clothing/hats.dmi'
)
/obj/item/clothing/head/helmet/space/void/medical/alt/tesh
name = "streamlined teshari medical voidsuit helmet"
desc = "A trendy, lightly radiation-shielded voidsuit helmet trimmed in a sleek blue. This teshari-specific model lacks the autoadaption feature due to the reduced amount of materials."
species_restricted = list(SPECIES_TESHARI)
no_cycle = FALSE //no autoadaption means it can be refitted
/obj/item/clothing/head/helmet/space/void/medical/alt/tesh
sprite_sheets = list(
SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi'
)
sprite_sheets_obj = list(
SPECIES_TESHARI = 'icons/obj/clothing/hats.dmi'
)
/obj/item/clothing/suit/space/void/medical/alt
icon_state = "rig-medicalalt"
name = "streamlined medical voidsuit"
desc = "A more recent model of Vey-Med voidsuit, exchanging physical protection for fully unencumbered movement and a complete range of motion."
desc = "A more recent model of Vey-Med voidsuit, exchanging physical protection for fully unencumbered movement and a complete range of motion. It possesses advanced autoadaptive systems and doesn't need to be cycled to change species fit for most large humanoids."
icon_state = "rig-medicalalt"
slowdown = 0
armor = list(melee = 20, bullet = 5, laser = 20,energy = 5, bomb = 15, bio = 100, rad = 30)
species_restricted = list("exclude",SPECIES_DIONA,SPECIES_VOX,SPECIES_TESHARI) //this thing can autoadapt, but diona/vox are too weird, and tesh are too small
no_cycle = TRUE
/obj/item/clothing/suit/space/void/medical/alt
sprite_sheets = list(
SPECIES_HUMAN = 'icons/mob/spacesuit.dmi',
SPECIES_TAJ = 'icons/mob/species/tajaran/suit.dmi',
SPECIES_SKRELL = 'icons/mob/species/skrell/suit.dmi',
SPECIES_UNATHI = 'icons/mob/species/unathi/suit.dmi'
)
sprite_sheets_obj = list(
SPECIES_TAJ = 'icons/obj/clothing/spacesuits.dmi',
SPECIES_SKRELL = 'icons/obj/clothing/spacesuits.dmi',
SPECIES_UNATHI = 'icons/obj/clothing/spacesuits.dmi'
)
/obj/item/clothing/suit/space/void/medical/alt/tesh
name = "streamlined teshari medical voidsuit"
desc = "A more recent model of Vey-Med voidsuit, exchanging physical protection for fully unencumbered movement and a complete range of motion. This teshari-specific model lacks the autoadaption feature due to the reduced amount of materials."
species_restricted = list(SPECIES_TESHARI)
no_cycle = FALSE //no autoadaption means it can be refitted
/obj/item/clothing/suit/space/void/medical/alt/tesh
sprite_sheets = list(
SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi'
)
sprite_sheets_obj = list(
SPECIES_TESHARI = 'icons/obj/clothing/spacesuits.dmi'
)
//Security
/obj/item/clothing/head/helmet/space/void/security

View File

@@ -0,0 +1,49 @@
/obj/item/clothing/head/helmet/space/void/medical/alt
sprite_sheets = list(
SPECIES_HUMAN = 'icons/mob/head.dmi',
SPECIES_TAJ = 'icons/mob/species/tajaran/helmet.dmi',
SPECIES_SKRELL = 'icons/mob/species/skrell/helmet.dmi',
SPECIES_UNATHI = 'icons/mob/species/unathi/helmet.dmi',
SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet.dmi',
SPECIES_AKULA = 'icons/mob/species/unathi/helmet.dmi',
SPECIES_SERGAL = 'icons/mob/species/unathi/helmet.dmi',
SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet.dmi',
SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/helmet.dmi',
SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet.dmi'
)
sprite_sheets_obj = list(
SPECIES_TAJ = 'icons/obj/clothing/hats.dmi',
SPECIES_SKRELL = 'icons/obj/clothing/hats.dmi',
SPECIES_UNATHI = 'icons/obj/clothing/hats.dmi',
SPECIES_XENOHYBRID = 'icons/obj/clothing/hats.dmi',
SPECIES_AKULA = 'icons/obj/clothing/hats.dmi',
SPECIES_SERGAL = 'icons/obj/clothing/hats.dmi',
SPECIES_VULPKANIN = 'icons/obj/clothing/hats.dmi',
SPECIES_ZORREN_HIGH = 'icons/obj/clothing/hats.dmi',
SPECIES_FENNEC = 'icons/obj/clothing/hats.dmi'
)
/obj/item/clothing/suit/space/void/medical/alt
sprite_sheets = list(
SPECIES_HUMAN = 'icons/mob/spacesuit.dmi',
SPECIES_TAJ = 'icons/mob/species/tajaran/suit.dmi',
SPECIES_SKRELL = 'icons/mob/species/skrell/suit.dmi',
SPECIES_UNATHI = 'icons/mob/species/unathi/suit.dmi',
SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit.dmi',
SPECIES_AKULA = 'icons/mob/species/akula/suit_vr.dmi',
SPECIES_SERGAL = 'icons/mob/species/sergal/suit_vr.dmi',
SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit.dmi',
SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/suit.dmi',
SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit.dmi'
)
sprite_sheets_obj = list(
SPECIES_TAJ = 'icons/obj/clothing/spacesuits.dmi',
SPECIES_SKRELL = 'icons/obj/clothing/spacesuits.dmi',
SPECIES_UNATHI = 'icons/obj/clothing/spacesuits.dmi',
SPECIES_XENOHYBRID = 'icons/obj/clothing/spacesuits.dmi',
SPECIES_AKULA = 'icons/obj/clothing/spacesuits.dmi',
SPECIES_SERGAL = 'icons/obj/clothing/spacesuits.dmi',
SPECIES_VULPKANIN = 'icons/obj/clothing/spacesuits.dmi',
SPECIES_ZORREN_HIGH = 'icons/obj/clothing/spacesuits.dmi',
SPECIES_FENNEC = 'icons/obj/clothing/spacesuits.dmi'
)

View File

@@ -28,6 +28,7 @@
)
light_overlay = "helmet_light"
var/no_cycle = FALSE //stop this item from being put in a cycler
/obj/item/clothing/suit/space/void
name = "voidsuit"
@@ -67,6 +68,9 @@
var/obj/item/weapon/tank/tank = null // Deployable tank, if any.
var/obj/item/device/suit_cooling_unit/cooler = null// Cooling unit, for FBPs. Cannot be installed alongside a tank.
//Cycler settings
var/no_cycle = FALSE //stop this item from being put in a cycler
/obj/item/clothing/suit/space/void/examine(user)
. = ..()
for(var/obj/item/I in list(helmet,boots,tank,cooler))

View File

@@ -42,4 +42,4 @@
area_names |= grub_area.name
if(area_names.len)
var/english_list = english_list(area_names)
command_announcement.Announce("Sensors have narrowed down remaining active solargrubs to the followng areas: [english_list]", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
command_announcement.Announce("Sensors have narrowed down remaining active solargrubs to the followng areas: [english_list]", "Lifesign Alert")

View File

@@ -62,6 +62,7 @@
"Theatre" = new/datum/holodeck_program(/area/holodeck/source_theatre),
"Meetinghall" = new/datum/holodeck_program(/area/holodeck/source_meetinghall),
"Courtroom" = new/datum/holodeck_program(/area/holodeck/source_courtroom, list('sound/music/traitor.ogg')),
"Chessboard" = new/datum/holodeck_program(/area/holodeck/source_chess),
"Turn Off" = new/datum/holodeck_program(/area/holodeck/source_plating, list())
)

View File

@@ -111,6 +111,18 @@
if(prob(10))
add_overlay("asteroid[rand(0,9)]")
/turf/simulated/floor/holofloor/bmarble
name = "marble"
icon = 'icons/turf/flooring/misc.dmi'
icon_state = "darkmarble"
initial_flooring = /decl/flooring/bmarble
/turf/simulated/floor/holofloor/wmarble
name = "marble"
icon = 'icons/turf/flooring/misc.dmi'
icon_state = "lightmarble"
initial_flooring = /decl/flooring/wmarble
/obj/structure/holostool
name = "stool"
desc = "Apply butt."

View File

@@ -167,6 +167,11 @@ Book Cart End
name = "book"
icon = 'icons/obj/library.dmi'
icon_state ="book"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_books.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_books.dmi'
)
item_state = "book"
throw_speed = 1
throw_range = 5
flags = NOCONDUCT

View File

@@ -447,7 +447,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
B.title = title
B.author = author
B.dat = content
B.icon_state = "book[rand(1,7)]"
B.icon_state = "book[rand(1,16)]"
B.item_state = B.icon_state
src.visible_message("[src]'s printer hums as it produces a completely bound book. How did it do that?")
break
if(href_list["orderbyid"])

View File

@@ -4,6 +4,7 @@
desc = "Contains useful information about the world around you. It seems to have been written for travelers to the Borealis system, human or not. It also \
has the words 'Don't Panic' in small, friendly letters on the cover." //YW Edit
icon_state = "codex"
item_state = "book4"
unique = TRUE
var/datum/codex_tree/tree = null
var/root_type = /datum/lore/codex/category/main_borealis_lore //YW EDIT
@@ -30,6 +31,7 @@
name = "A Buyer's Guide to Artificial Bodies"
desc = "Recommended reading for the newly cyborgified, new positronics, and the upwardly-mobile FBP."
icon_state = "codex_robutt"
item_state = "book6"
root_type = /datum/lore/codex/category/main_robutts
libcategory = "Reference"
@@ -37,6 +39,7 @@
name = "Daedalus Pocket Newscaster"
desc = "A regularly-updating compendium of articles on current events. Essential for new arrivals in the Borealis system and anyone interested in politics." //YW Edit
icon_state = "newscodex"
item_state = "book1"
w_class = ITEMSIZE_SMALL
root_type = /datum/lore/codex/category/main_news
libcategory = "Reference"
@@ -49,6 +52,7 @@
desc = "Contains large amounts of information on Standard Operating Procedure, Corporate Regulations, and important regional laws. The best friend of \
Internal Affairs."
icon_state = "corp_regs"
item_state = "book10"
root_type = /datum/lore/codex/category/main_corp_regs
throwforce = 5 // Throw the book at 'em.
libcategory = "Reference"

View File

@@ -59,12 +59,12 @@
default_apply_parts()
cell = default_use_hicell()
/obj/machinery/mining/drill/loaded
cell = /obj/item/weapon/cell/high
/obj/machinery/mining/drill/get_cell()
return cell
/obj/machinery/mining/drill/loaded
cell = /obj/item/weapon/cell/high
/obj/machinery/mining/drill/process()
if(need_player_check)

View File

@@ -0,0 +1,6 @@
GLOBAL_LIST_INIT(hair_gradients, list(
"None" = "none",
"Fade (Up)" = "fadeup",
"Fade (Down)" = "fadedown",
"Vertical Split" = "vsplit"
))

View File

@@ -289,6 +289,20 @@
else
..()
/mob/living/carbon/human/adjustHalLoss(var/amount)
if(species.flags & NO_PAIN)
halloss = 0
else
if(amount > 0) //only multiply it by the mod if it's positive, or else it takes longer to fade too!
amount = amount*species.pain_mod
..(amount)
/mob/living/carbon/human/setHalLoss(var/amount)
if(species.flags & NO_PAIN)
halloss = 0
else
..()
/mob/living/carbon/human/getToxLoss()
if(species.flags & NO_POISON)
toxloss = 0

View File

@@ -5,6 +5,10 @@
var/b_hair = 0
var/h_style = "Bald"
var/r_grad = 0
var/g_grad = 0
var/b_grad = 0
var/grad_style = "none"
//Facial hair colour and style
var/r_facial = 0
var/g_facial = 0

View File

@@ -200,6 +200,9 @@ Variables you may want to make use of are:
/datum/species/event1/proc/toggle_cloning()
flags ^= NO_SCAN
/datum/species/event1/proc/toggle_defibbing()
flags ^= NO_DEFIB
/datum/species/event1/proc/toggle_pain()
flags ^= NO_PAIN

View File

@@ -20,7 +20,7 @@
remains_type = /obj/effect/decal/cleanable/ash
death_message = "dissolves into ash..."
flags = NO_SCAN | NO_SLIP | NO_POISON | NO_MINOR_CUT
flags = NO_SCAN | NO_SLIP | NO_POISON | NO_MINOR_CUT | NO_DEFIB
spawn_flags = SPECIES_IS_RESTRICTED
genders = list(NEUTER)

View File

@@ -11,7 +11,7 @@
max_age = 110
health_hud_intensity = 1.5
flags = NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT | NO_BLOOD | UNDEAD
flags = NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT | NO_BLOOD | UNDEAD | NO_DEFIB
spawn_flags = SPECIES_IS_RESTRICTED
appearance_flags = null

View File

@@ -46,7 +46,7 @@
poison_type = "oxygen"
siemens_coefficient = 0.2
flags = NO_SCAN
flags = NO_SCAN | NO_DEFIB
appearance_flags = HAS_EYE_COLOR | HAS_HAIR_COLOR
blood_color = "#9066BD"

View File

@@ -0,0 +1,3 @@
/datum/species/vox
default_language = LANGUAGE_GALCOM
speech_sounds = list() // Remove obnoxious noises on every single 'say'. Should really only be a thing for event-exclusive species like benos.

View File

@@ -95,6 +95,7 @@
var/chemOD_threshold = 1 // Multiplier to overdose threshold; lower = easier overdosing
var/chemOD_mod = 1 // Damage modifier for overdose; higher = more damage from ODs
var/alcohol_mod = 1 // Multiplier to alcohol strength; 0.5 = half, 0 = no effect at all, 2 = double, etc.
var/pain_mod = 1 // Multiplier to pain effects; 0.5 = half, 0 = no effect (equal to NO_PAIN, really), 2 = double, etc.
// set below is EMP interactivity for nonsynth carbons
var/emp_sensitivity = 0 // bitflag. valid flags are: EMP_PAIN, EMP_BLIND, EMP_DEAFEN, EMP_CONFUSE, EMP_STUN, and EMP_(BRUTE/BURN/TOX/OXY)_DMG
var/emp_dmg_mod = 1 // Multiplier to all EMP damage sustained by the mob, if it's EMP-sensitive

View File

@@ -132,3 +132,19 @@
b_wing2 = new_color_rgb_list[3]
update_wing_showing()
/mob/living/carbon/human/proc/promethean_select_opaqueness()
set name = "Toggle Transparency"
set category = "Abilities"
if(stat || world.time < last_special)
return
last_special = world.time + 50
for(var/limb in src.organs)
var/obj/item/organ/external/L = limb
L.transparent = !L.transparent
visible_message("<span class='notice'>\The [src]'s interal composition seems to change.</span>")
update_icons_body()

View File

@@ -7,7 +7,7 @@
language = "Sol Common" //todo?
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch)
flags = NO_PAIN | NO_SCAN | NO_POISON | NO_MINOR_CUT
flags = NO_PAIN | NO_SCAN | NO_POISON | NO_MINOR_CUT | NO_DEFIB
spawn_flags = SPECIES_IS_RESTRICTED
siemens_coefficient = 0

View File

@@ -25,7 +25,7 @@ var/datum/species/shapeshifter/promethean/prometheans
bump_flag = SLIME
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL
flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT
flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_DEFIB
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR
spawn_flags = SPECIES_CAN_JOIN
health_hud_intensity = 2

View File

@@ -34,5 +34,6 @@
/mob/living/carbon/human/proc/succubus_drain_finalize,
/mob/living/carbon/human/proc/succubus_drain_lethal,
/mob/living/carbon/human/proc/slime_feed,
/mob/living/proc/eat_trash
/mob/living/proc/eat_trash,
/mob/living/carbon/human/proc/promethean_select_opaqueness,
)

View File

@@ -521,7 +521,7 @@
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
flags = NO_SCAN | IS_PLANT | NO_PAIN | NO_SLIP | NO_MINOR_CUT
flags = NO_SCAN | IS_PLANT | NO_PAIN | NO_SLIP | NO_MINOR_CUT | NO_DEFIB
spawn_flags = SPECIES_CAN_JOIN
blood_color = "#004400"

View File

@@ -174,3 +174,41 @@
..(S,H)
H.verbs |= /mob/living/proc/glow_toggle
H.verbs |= /mob/living/proc/glow_color
// Alcohol Traits Start Here, from negative to positive.
/datum/trait/alcohol_intolerance_advanced
name = "Liver of Air"
desc = "The only way you can hold a drink is if it's in your own two hands, and even then you'd best not inhale too deeply near it. Drinks are three times as strong."
cost = 0
var_changes = list("alcohol_mod" = 3) // 300% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/alcohol_intolerance_basic
name = "Liver of Lilies"
desc = "You have a hard time with alcohol. Maybe you just never took to it, or maybe it doesn't agree with you... either way, drinks are twice as strong."
cost = 0
var_changes = list("alcohol_mod" = 2) // 200% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/alcohol_intolerance_slight
name = "Liver of Tulips"
desc = "You have a slight struggle with alcohol. Drinks are one and a half times stronger."
cost = 0
var_changes = list("alcohol_mod" = 1.5) // 150% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/alcohol_tolerance_basic
name = "Liver of Iron"
desc = "You can hold drinks much better than those lily-livered land-lubbers! Arr! Drinks are only three-quarters as strong."
cost = 0
var_changes = list("alcohol_mod" = 0.75) // 75% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/alcohol_tolerance_advanced
name = "Liver of Steel"
desc = "Drinks tremble before your might! You can hold your alcohol twice as well as those blue-bellied barnacle boilers! Drinks are only half as strong."
cost = 0
var_changes = list("alcohol_mod" = 0.5) // 50% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
/datum/trait/alcohol_immunity
name = "Liver of Durasteel"
desc = "You've drunk so much that most booze doesn't even faze you. It takes something like a Pan-Galactic or a pint of Deathbell for you to even get slightly buzzed."
cost = 0
var_changes = list("alcohol_mod" = 0.25) // 25% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this!
// Alcohol Traits End Here.

View File

@@ -24,7 +24,7 @@
cold_level_2 = -1
cold_level_3 = -1
flags = NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT | NO_INFECT
flags = NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT | NO_INFECT | NO_DEFIB
spawn_flags = SPECIES_IS_RESTRICTED
reagent_tag = IS_XENOS

View File

@@ -278,6 +278,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
icon_key += "3"
else
icon_key += "1"
if(part.transparent) //VOREStation Edit. For better slime limbs. Avoids using solid var due to limb dropping.
icon_key += "_t" //VOREStation Edit.
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
@@ -431,11 +433,18 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
hair_style = hair_styles_list["Short Hair"]
if(hair_style && (src.species.get_bodytype(src) in hair_style.species_allowed))
var/icon/grad_s = null
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s")
if(hair_style.do_colouration)
if(grad_style)
grad_s = new/icon("icon" = 'icons/mob/hair_gradients.dmi', "icon_state" = GLOB.hair_gradients[grad_style])
grad_s.Blend(hair_s, ICON_AND)
grad_s.Blend(rgb(r_grad, g_grad, b_grad), ICON_MULTIPLY)
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_MULTIPLY)
hair_s.Blend(hair_s_add, ICON_ADD)
if(!isnull(grad_s))
hair_s.Blend(grad_s, ICON_OVERLAY)
face_standing.Blend(hair_s, ICON_OVERLAY)
@@ -450,7 +459,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
return
// VOREStation Edit - END
if(head_organ.nonsolid)
if(head_organ.transparent) //VOREStation Edit. For better slime limbs.
face_standing += rgb(,,,120)
overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER)

View File

@@ -336,7 +336,7 @@
next_alarm_notice = world.time + SecondsToTicks(10)
if(alarm.hidden)
return
if(alarm.origin && !(get_z(alarm.origin) in using_map.get_map_levels(get_z(src), TRUE)))
if(alarm.origin && !(get_z(alarm.origin) in using_map.get_map_levels(get_z(src), TRUE, om_range = DEFAULT_OVERMAP_RANGE)))
return
var/list/alarms = queued_alarms[alarm_handler]

View File

@@ -21,7 +21,7 @@
var/vore_pounce_falloff = 1 // Success rate falloff per %health of target mob.
var/vore_pounce_maxhealth = 80 // Mob will not attempt to pounce targets above this %health
var/vore_standing_too = 0 // Can also eat non-stunned mobs
var/vore_ignores_undigestable = 1 // Refuse to eat mobs who are undigestable by the prefs toggle.
var/vore_ignores_undigestable = FALSE // If set to true, will refuse to eat mobs who are undigestable by the prefs toggle.
var/swallowsound = null // What noise plays when you succeed in eating the mob.
var/vore_default_mode = DM_DIGEST // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB)

View File

@@ -9,7 +9,7 @@
desc = "A small rodent, often seen hiding in maintenance areas and making a nuisance of itself. And stealing cheese, or annoying the chef. SQUEAK! <3"
movement_cooldown = 1.5 //roughly half the speed of a person
movement_cooldown = 5
universal_understand = 1
/mob/living/simple_mob/animal/passive/mouse/attack_hand(mob/living/L)

View File

@@ -224,4 +224,6 @@
var/registered_z
var/list/progressbars = null //for stacking do_after bars
var/in_enclosed_vehicle = 0 //For mechs and fighters ambiance. Can be used in other cases.
var/list/progressbars = null //VOREStation Edit

View File

@@ -463,7 +463,7 @@
/mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message, var/channel, var/zlevel)
if (ticker.current_state == GAME_STATE_PLAYING)
var/list/zlevels = zlevel ? using_map.get_map_levels(zlevel, TRUE) : null
var/list/zlevels = zlevel ? using_map.get_map_levels(zlevel, TRUE, om_range = DEFAULT_OVERMAP_RANGE) : null
if(character.mind.role_alt_title)
rank = character.mind.role_alt_title
// can't use their name here, since cyborg namepicking is done post-spawn, so we'll just say "A new Cyborg has arrived"/"A new Android has arrived"/etc.

View File

@@ -68,7 +68,7 @@
data["networks"] = all_networks
var/list/map_levels = using_map.get_map_levels(get_z(nano_host()), TRUE)
var/list/map_levels = using_map.get_map_levels(get_z(nano_host()), TRUE, om_range = DEFAULT_OVERMAP_RANGE)
if(current_network)
data["cameras"] = camera_repository.cameras_in_network(current_network, map_levels)

View File

@@ -172,7 +172,7 @@
return 0
var/list/zlevels_in_range = using_map.get_map_levels(their_z, FALSE)
var/list/zlevels_in_long_range = using_map.get_map_levels(their_z, TRUE) - zlevels_in_range
var/list/zlevels_in_long_range = using_map.get_map_levels(their_z, TRUE, om_range = DEFAULT_OVERMAP_RANGE) - zlevels_in_range
var/their_signal = 0
for(var/relay in ntnet_global.relays)
var/obj/machinery/ntnet_relay/R = relay

View File

@@ -35,7 +35,7 @@
data["isAI"] = isAI(user)
var/z = get_z(nano_host())
var/list/map_levels = using_map.get_map_levels(z, TRUE)
var/list/map_levels = using_map.get_map_levels(z, TRUE, om_range = DEFAULT_OVERMAP_RANGE)
data["map_levels"] = map_levels
data["crewmembers"] = list()

View File

@@ -104,7 +104,7 @@ var/global/ntnet_card_uid = 1
if(!holderz) //no reception in nullspace
return 0
var/list/zlevels_in_range = using_map.get_map_levels(holderz, FALSE)
var/list/zlevels_in_long_range = using_map.get_map_levels(holderz, TRUE) - zlevels_in_range
var/list/zlevels_in_long_range = using_map.get_map_levels(holderz, TRUE, om_range = DEFAULT_OVERMAP_RANGE) - zlevels_in_range
var/best = 0
for(var/relay in ntnet_global.relays)
var/obj/machinery/ntnet_relay/R = relay

View File

@@ -1,3 +1,6 @@
/obj/item/organ/external
var/transparent = 0 //For better slime limbs
//Sideways override for nanoform limbs (ugh)
/obj/item/organ/external/robotize(var/company, var/skip_prosthetics = FALSE, var/keep_organs = FALSE)
var/original_robotic = robotic

View File

@@ -206,7 +206,7 @@ var/global/list/limb_icon_cache = list()
/obj/item/organ/external/proc/apply_colouration(var/icon/applying)
if(nonsolid)
if(transparent) //VOREStation edit
applying.MapColors("#4D4D4D","#969696","#1C1C1C", "#000000")
if(species && species.get_bodytype(owner) != SPECIES_HUMAN)
applying.SetIntensity(1) // Unathi, Taj and Skrell have -very- dark base icons. VOREStation edit fixes this and brings the number back to 1
@@ -235,7 +235,7 @@ var/global/list/limb_icon_cache = list()
//VOREStation Edit End
// Translucency.
if(nonsolid) applying += rgb(,,,180) // SO INTUITIVE TY BYOND
if(transparent) applying += rgb(,,,180) // SO INTUITIVE TY BYOND //VOREStation Edit
return applying

View File

@@ -49,7 +49,7 @@
// tucker0666 : Frost
/datum/robolimb/zenghu_frost
company = "Zeng-Hu"
company = "Zeng-Hu (Custom)"
desc = "This limb has realistic synthetic flesh covering with 'blue accents'."
icon = 'icons/mob/human_races/cyberlimbs/_fluff_vr/Frosty.dmi'
blood_color = "#45ccff"

View File

@@ -0,0 +1,32 @@
/obj/item/organ/external/chest/unbreakable/slime
transparent = 1
/obj/item/organ/external/groin/unbreakable/slime
transparent = 1
/obj/item/organ/external/arm/unbreakable/slime
transparent = 1
/obj/item/organ/external/arm/right/unbreakable/slime
transparent = 1
/obj/item/organ/external/leg/unbreakable/slime
transparent = 1
/obj/item/organ/external/leg/right/unbreakable/slime
transparent = 1
/obj/item/organ/external/foot/unbreakable/slime
transparent = 1
/obj/item/organ/external/foot/right/unbreakable/slime
transparent = 1
/obj/item/organ/external/hand/unbreakable/slime
transparent = 1
/obj/item/organ/external/hand/right/unbreakable/slime
transparent = 1
/obj/item/organ/external/head/unbreakable/slime
transparent = 1

View File

@@ -134,7 +134,7 @@
// This is distinct from the hitscan's "impact_type" var.
var/impact_effect_type = null
var/list/impacted_mobs
var/list/impacted_mobs = list()
/obj/item/projectile/proc/Range()
range--
@@ -441,15 +441,15 @@
setAngle(Get_Angle(source, target))
/obj/item/projectile/Destroy()
if(hitscan)
finalize_hitscan_and_generate_tracers()
STOP_PROCESSING(SSprojectiles, src)
if(impacted_mobs)
if(LAZYLEN(impacted_mobs))
impacted_mobs.Cut()
impacted_mobs = null
if(hitscan)
finalize_hitscan_and_generate_tracers()
STOP_PROCESSING(SSprojectiles, src)
qdel(trajectory)
return ..()
@@ -642,9 +642,6 @@
if(!istype(target_mob))
return
if(!LAZYLEN(impacted_mobs))
impacted_mobs = list()
if(target_mob in impacted_mobs)
return
@@ -661,6 +658,7 @@
return FALSE // Mob deleted itself or something.
// Safe to add the target to the list that is soon to be poofed. No double jeopardy, pixel projectiles.
if(islist(impacted_mobs))
impacted_mobs |= target_mob
if(result == PROJECTILE_FORCE_MISS)

View File

@@ -282,7 +282,7 @@
id = "scsatw"
description = "The screwdriver's bigger cousin."
taste_description = "smooth, savory booze and tangy orange juice."
strength = 0
strength = 30
druggy = 0
halluci = 0
var/adj_dizzy = 0

View File

@@ -24,7 +24,7 @@
var/digest_burn = 0.5 // Burn damage per tick in digestion mode
var/immutable = FALSE // Prevents this belly from being deleted
var/escapable = FALSE // Belly can be resisted out of at any time
var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly
var/escapetime = 20 SECONDS // Deciseconds, how long to escape this belly
var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles
var/absorbchance = 0 // % Chance of stomach beginning to absorb if prey struggles
var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles.

View File

@@ -926,7 +926,7 @@
user.can_be_drop_prey = FALSE
if(href_list["toggledg"])
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable. Messages admins when changed, so don't try to use it for mechanical benefit. Set it once and save it. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
switch(choice)
if("Cancel")
return FALSE
@@ -935,8 +935,6 @@
if("Prevent Digestion")
user.digestable = FALSE
message_admins("[key_name(user)] toggled their digestability to [user.digestable] [ADMIN_COORDJMP(user)]")
if(user.client.prefs_vr)
user.client.prefs_vr.digestable = user.digestable
@@ -993,7 +991,7 @@
user.client.prefs_vr.digest_leave_remains = user.digest_leave_remains
if(href_list["togglemv"])
var/choice = alert(user, "This button is for those who don't like being eaten by mobs. Messages admins when changed, so don't try to use it for mechanical benefit. Set it once and save it. Mobs are currently: [user.allowmobvore ? "Allowed to eat" : "Prevented from eating"] you.", "", "Allow Mob Predation", "Cancel", "Prevent Mob Predation")
var/choice = alert(user, "This button is for those who don't like being eaten by mobs. Mobs are currently: [user.allowmobvore ? "Allowed to eat" : "Prevented from eating"] you.", "", "Allow Mob Predation", "Cancel", "Prevent Mob Predation")
switch(choice)
if("Cancel")
return FALSE
@@ -1002,8 +1000,6 @@
if("Prevent Mob Predation")
user.allowmobvore = FALSE
message_admins("[key_name(user)] toggled their mob vore preference to [user.allowmobvore] [ADMIN_COORDJMP(user)]")
if(user.client.prefs_vr)
user.client.prefs_vr.allowmobvore = user.allowmobvore

View File

@@ -281,35 +281,19 @@ Swimsuits, for general use, to avoid arriving to work with your swimsuit.
/obj/item/weapon/storage/box/monkeycubes/sobakacubes
name = "sobaka cube box"
desc = "Drymate brand sobaka cubes. Just add water!"
/obj/item/weapon/storage/box/monkeycubes/sobakacubes/New()
..()
for(var/i = 1 to 4)
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/sobakacube(src)
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/sobakacube = 4)
/obj/item/weapon/storage/box/monkeycubes/sarucubes
name = "saru cube box"
desc = "Drymate brand saru cubes. Just add water!"
/obj/item/weapon/storage/box/monkeycubes/sarucubes/New()
..()
for(var/i = 1 to 4)
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/sarucube(src)
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/sarucube = 4)
/obj/item/weapon/storage/box/monkeycubes/sparracubes
name = "sparra cube box"
desc = "Drymate brand sparra cubes. Just add water!"
/obj/item/weapon/storage/box/monkeycubes/sparracubes/New()
..()
for(var/i = 1 to 4)
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/sparracube(src)
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/sparracube = 4)
/obj/item/weapon/storage/box/monkeycubes/wolpincubes
name = "wolpin cube box"
desc = "Drymate brand wolpin cubes. Just add water!"
/obj/item/weapon/storage/box/monkeycubes/wolpincubes/New()
..()
for(var/i = 1 to 4)
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube(src)
starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube = 4)

View File

@@ -2,6 +2,7 @@
/obj/item/weapon/book/manual/excavation
name = "Out on the Dig"
icon_state = "excavation"
item_state = "book6"
author = "Professor Patrick Mason, Curator of the Antiquities Museum on Ichar VII"
title = "Out on the Dig"
dat = {"<html>
@@ -115,6 +116,7 @@
/obj/item/weapon/book/manual/mass_spectrometry
name = "High Power Mass Spectrometry: A Comprehensive Guide"
icon_state = "analysis"
item_state = "book6"
author = "Winton Rice, Chief Mass Spectrometry Technician at the Institute of Applied Sciences on Arcadia"
title = "High powered mass spectrometry, a comprehensive guide"
dat = {"<html>
@@ -186,6 +188,7 @@
/obj/item/weapon/book/manual/anomaly_spectroscopy
name = "Spectroscopy: Analysing the Anomalies of the Cosmos"
icon_state = "anomaly"
item_state = "book6"
author = "Doctor Martin Boyle, Director Research at the Lower Hydrolian Sector Listening Array"
title = "Spectroscopy: Analysing the Anomalies of the Cosmos"
dat = {"<html>
@@ -211,6 +214,7 @@
/obj/item/weapon/book/manual/materials_chemistry_analysis
name = "Materials Analysis and the Chemical Implications"
icon_state = "chemistry"
item_state = "book6"
author = "Jasper Pascal, Senior Lecturer in Materials Analysis at the University of Jol'Nar"
title = "Materials Analysis and the Chemical Implications"
dat = {"<html>
@@ -238,6 +242,7 @@
/obj/item/weapon/book/manual/anomaly_testing
name = "Anomalous Materials and Energies"
icon_state = "triangulate"
item_state = "book6"
author = "Norman York, formerly of the Tyrolion Institute on Titan"
title = "Anomalous Materials and Energies"
dat = {"<html>
@@ -316,6 +321,7 @@
/obj/item/weapon/book/manual/stasis
name = "Cellular Suspension, the New Cryogenics?"
icon_state = "stasis"
item_state = "book6"
author = "Elvin Schmidt"
title = "Cellular Suspension, the New Cryogenics?"
dat = {"<html>

View File

@@ -50,6 +50,7 @@ zalvine - Shadekin Empathy
zammyman215 - Vox
bricker98 - Protean
cgr - Protean
khanivore - Protean
storesund97 - Protean
tastypred - Protean
vitoras - Protean
@@ -58,3 +59,4 @@ nerdass - Protean
xonkon - Protean
phoenixx0 - Vox
rubyflamewing - Protean
radiantaurora - Protean

View File

@@ -53,6 +53,33 @@
-->
<div class="commit sansserif">
<h2 class="date">21 June 2020</h2>
<h3 class="author">Arokha updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">New sprites for janicart</li>
<li class="tweak">Alt-click helpers for stowing mop, chemicals on janicart</li>
</ul>
<h3 class="author">Atermonera updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added verb to export vchat logs, found in OOC tab when vchat has successfully loaded.</li>
<li class="tweak">Vchat only sends you enough messages to fill your buffer on reconnect, instead of all of them.</li>
</ul>
<h3 class="author">Billy Bangles updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Light and dark marble floor tiles can now be crafted with marble sheets.</li>
</ul>
<h3 class="author">Greenjoe updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added a wrist-bound PDA, selectable from the PDA selection menu in char setup. it can go in the glove slot along with the ID and belt slots, and shows on your character's wrist no matter which of those 3 slots you put it in!</li>
</ul>
<h3 class="author">KasparoVv updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">You can now quickly cycle hrough previous or next hair/facial styles at character creation.</li>
<li class="rscadd">Use the -mv- button to pick a marking and place it above of another on your character. Saves you from pressing up or down a bunch.</li>
<li class="tweak">Ports color_square() from Paradise for colour previews, cleaning up pref. code & correct alignment issue w/ nested tables.</li>
<li class="tweak">Markings are now properly aligned within a table.</li>
</ul>
<h2 class="date">13 May 2020</h2>
<h3 class="author">Atermonera updated:</h3>
<ul class="changes bgimages16">

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