diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 0a0e4b7fe7..1cf473f126 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -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. diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 8701000ce2..f109553ebc 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -1,15 +1,16 @@ // Species flags. -#define NO_MINOR_CUT 0x1 // Can step on broken glass with no ill-effects. Either thick skin (diona), cut resistant (slimes) or incorporeal (shadows) -#define IS_PLANT 0x2 // Is a treeperson. -#define NO_SCAN 0x4 // Cannot be scanned in a DNA machine/genome-stolen. -#define NO_PAIN 0x8 // Cannot suffer halloss/recieves deceptive health indicator. -#define NO_SLIP 0x10 // Cannot fall over. -#define NO_POISON 0x20 // Cannot not suffer toxloss. -#define NO_EMBED 0x40 // Can step on broken glass with no ill-effects and cannot have shrapnel embedded in it. -#define NO_HALLUCINATION 0x80 // Don't hallucinate, ever -#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_MINOR_CUT 0x1 // Can step on broken glass with no ill-effects. Either thick skin (diona), cut resistant (slimes) or incorporeal (shadows) +#define IS_PLANT 0x2 // Is a treeperson. +#define NO_SCAN 0x4 // Cannot be scanned in a DNA machine/genome-stolen. +#define NO_PAIN 0x8 // Cannot suffer halloss/recieves deceptive health indicator. +#define NO_SLIP 0x10 // Cannot fall over. +#define NO_POISON 0x20 // Cannot not suffer toxloss. +#define NO_EMBED 0x40 // Can step on broken glass with no ill-effects and cannot have shrapnel embedded in it. +#define NO_HALLUCINATION 0x80 // Don't hallucinate, ever +#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 diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index c123790b51..160413135b 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -222,4 +222,8 @@ #undef AB_WEST_OFFSET #undef AB_NORTH_OFFSET -#undef AB_MAX_COLUMNS \ No newline at end of file +#undef AB_MAX_COLUMNS + + +/datum/action/innate/ + action_type = AB_INNATE \ No newline at end of file diff --git a/code/datums/supplypacks/voidsuits.dm b/code/datums/supplypacks/voidsuits.dm index b1bbc9a8b4..42da0a1753 100644 --- a/code/datums/supplypacks/voidsuits.dm +++ b/code/datums/supplypacks/voidsuits.dm @@ -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( diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm index d5202bafc2..568eb0f743 100644 --- a/code/defines/procs/announce.dm +++ b/code/defines/procs/announce.dm @@ -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) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index d303fce767..21d4657bd6 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -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/ diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index c324a6f092..07440ae5f5 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -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 diff --git a/code/game/jobs/job/civilian_vr.dm b/code/game/jobs/job/civilian_vr.dm index 433935e55b..dae1ffbfce 100644 --- a/code/game/jobs/job/civilian_vr.dm +++ b/code/game/jobs/job/civilian_vr.dm @@ -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 diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index fe0a9c8a62..e695173efd 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -43,10 +43,10 @@ data["current_camera"] = current_camera ? current_camera.nano_structure() : null 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) data["cameras"] = camera_repository.cameras_in_network(current_network, map_levels) if(current_camera) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 042263f8a3..7833a58d72 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -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 diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index bdd2b05fc6..631a998a42 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -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("\The [initial(name)] hums and hisses as it moves [to_despawn.real_name] into storage.", 3) visible_message("\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2].", 3) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 025087228c..1e21ee305c 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -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, "The suit cycler is locked.") @@ -751,6 +759,10 @@ to_chat(user, "The cycler already contains a helmet.") return + if(IH.no_cycle) + to_chat(user, "That item is not compatible with the cycler's protocols.") + 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, "The suit cycler is locked.") @@ -786,6 +799,10 @@ to_chat(user, "The cycler already contains a voidsuit.") return + if(IS.no_cycle) + to_chat(user, "That item is not compatible with the cycler's protocols.") + 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, "You run the sequencer across the interface, corrupting the operating protocols.") - 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,11 +1234,22 @@ 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) suit.icon_state = initial(parent_suit.icon_state) suit.item_state = initial(parent_suit.item_state) - suit.item_state_slots = S.item_state_slots + 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) diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index e89b9aa726..3799d06b07 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -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) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index b56a964626..5ff60979d0 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -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("\The [src] launches \a [throw_item] at \the [target]!") 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 diff --git a/code/game/machinery/vending_machines.dm b/code/game/machinery/vending_machines.dm new file mode 100644 index 0000000000..7cfb77d541 --- /dev/null +++ b/code/game/machinery/vending_machines.dm @@ -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) diff --git a/code/game/machinery/vending_vr.dm b/code/game/machinery/vending_machines_vr.dm similarity index 100% rename from code/game/machinery/vending_vr.dm rename to code/game/machinery/vending_machines_vr.dm diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index ab46a48fbc..5ab43a93ee 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -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("Unable to move while in defence mode") - 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("You enable [src] defence mode.") - else - deflect_chance = initial(deflect_chance) - src.occupant_message("You disable [src] defence mode.") - src.log_message("Toggled defence mode.") - return - - -/obj/mecha/combat/durand/get_stats_part() - var/output = ..() - output += "Defence mode: [defence?"on":"off"]" - return output - +//This is for the Mech stats / Menu system. To be moved later on. /obj/mecha/combat/durand/get_commands() var/output = {"
Special
@@ -76,8 +48,30 @@ output += ..() return output + +//Not needed anymore but left for reference. +/* +/obj/mecha/combat/durand/get_stats_part() + var/output = ..() + output += "Defence mode: [defence?"on":"off"]" + return output +*/ + +/* + /obj/mecha/combat/durand/Topic(href, href_list) ..() if (href_list["toggle_defence_mode"]) src.defence_mode() - return \ No newline at end of file + 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)) \ No newline at end of file diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm index 81a70b4b6d..550e2fb205 100644 --- a/code/game/mecha/combat/gorilla.dm +++ b/code/game/mecha/combat/gorilla.dm @@ -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 = "BLITZKRIEEEEEEEG!" @@ -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("Zoom mode [zoom?"en":"dis"]abled.") - 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 += {"Smoke: [smoke]"} + output += {"Smoke: [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 = "Precision German engineering!" // 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. diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index d70c8f9e85..d74b96cf99 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -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 = {"
+
Special
+ +
+ "} + 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("You disable leg actuators overload.") - else - overload = 1 - step_in = min(1, round(step_in/2)) - step_energy_drain = step_energy_drain*overload_coeff - src.occupant_message("You enable leg actuators overload.") - 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("Leg actuators damage threshold exceded. Disabling overload.") - return - - -/obj/mecha/combat/gygax/get_stats_part() - var/output = ..() - output += "Leg actuators overload: [overload?"on":"off"]" - return output - -/obj/mecha/combat/gygax/get_commands() - var/output = {"
-
Special
- -
- "} - 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" @@ -169,4 +126,14 @@ H.glasses = null H.recalculate_vis() ..() - return \ No newline at end of file + 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)) \ No newline at end of file diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 2b383379ad..a79dc3fda2 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -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("Thrusters [thrusters?"en":"dis"]abled.") - 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("Zoom mode [zoom?"en":"dis"]abled.") - 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 += {"Smoke: [smoke] -
- Thrusters: [thrusters?"on":"off"] - "} - return output - - +//To be kill ltr /obj/mecha/combat/marauder/get_commands() var/output = {"
Special
@@ -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() - return \ No newline at end of file + 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 \ No newline at end of file diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 48394f47f4..121bab34f9 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -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 = {"
@@ -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("En":"#f00\">Dis"]abled phasing.") - 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)) \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/speedboost.dm b/code/game/mecha/equipment/tools/speedboost.dm index 1cb0df9469..6e7ad06f69 100644 --- a/code/game/mecha/equipment/tools/speedboost.dm +++ b/code/game/mecha/equipment/tools/speedboost.dm @@ -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() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index d030979576..2f96fb75cc 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -16,38 +16,52 @@ name = "Mecha" desc = "Exosuit" icon = 'icons/mecha/mecha.dmi' - density = 1 //Dense. To raise the heat. - opacity = 1 ///opaque. Menacing. - anchored = 1 //no pulling around. - unacidable = 1 //and no deleting hoomans inside - layer = MOB_LAYER //icon draw layer - infra_luminosity = 15 //byond implementation is bugged. - var/initial_icon = null //Mech type for resetting icon. Only used for reskinning kits (see custom items) + density = 1 //Dense. To raise the heat. + opacity = 1 ///opaque. Menacing. + anchored = 1 //no pulling around. + unacidable = 1 //and no deleting hoomans inside + layer = MOB_LAYER //icon draw layer + infra_luminosity = 15 //byond implementation is bugged. + var/initial_icon = null //Mech type for resetting icon. Only used for reskinning kits (see custom items) 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/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/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. + 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 var/last_message = 0 var/add_req_access = 1 var/maint_access = 1 - var/dna //dna-locking the mech - var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference + var/dna //dna-locking the mech + var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference var/datum/effect/effect/system/spark_spread/spark_system = new var/lights = 0 var/lights_power = 6 var/force = 0 var/mech_faction = null - var/firstactivation = 0 //It's simple. If it's 0, no one entered it yet. Otherwise someone entered it at least once. + var/firstactivation = 0 //It's simple. If it's 0, no one entered it yet. Otherwise someone entered it at least once. var/stomp_sound = 'sound/mecha/mechstep.ogg' var/swivel_sound = 'sound/mecha/mechturn.ogg' @@ -62,24 +76,25 @@ var/obj/item/device/radio/radio = null var/max_temperature = 25000 - var/internal_damage_threshold = 50 //health percentage below which internal damage is possible - var/internal_damage = 0 //contains bitflags + var/internal_damage_threshold = 50 //health percentage below which internal damage is possible + var/internal_damage = 0 //contains bitflags var/list/operation_req_access = list()//required access level for mecha operation var/list/internals_req_access = list(access_engine,access_robotics)//required access level to open cell compartment - var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature - var/datum/global_iterator/pr_inertial_movement //controls intertial movement in spesss - var/datum/global_iterator/pr_give_air //moves air from tank to cabin - var/datum/global_iterator/pr_internal_damage //processes internal damage + var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature + var/datum/global_iterator/pr_inertial_movement //controls intertial movement in spesss + var/datum/global_iterator/pr_give_air //moves air from tank to cabin + var/datum/global_iterator/pr_internal_damage //processes internal damage 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." + . += "It's badly damaged." if(25 to 45) - . += "It's heavily damaged." + . += "It's heavily damaged." else - . += "It's falling apart." + . += " It's falling apart. " 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("Maintenance protocols in effect") 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("Maintenance protocols in effect") 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("Unable to move while in defence mode") + 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("Leg actuators damage threshold exceded. Disabling overload.") + + 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) - move_result = mechturn(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(istype(O, /obj/effect/portal)) //derpfix - src.anchored = 0 + + 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 //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 + 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("\The [A] bounces off the armor.") + 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("\The [A] struggles to bypass \the [src] armor.") + 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("\The [A] manages to pierces \the [src] armor.") + 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("The armor deflects incoming projectile.") + 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("\The [Proj] struggles to pierce \the [src] armor.") + 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("\The [Proj] manages to pierce \the [src] armor.") + 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("\The [W] bounces off [src.name].") to_chat(user, "\The [W] bounces off [src.name].") 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("\The [W] bounces off the armor.") + 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("\The [W] struggles to bypass \the [src] armor.") + 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("[user] hits [src] with [W].") user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") 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 @@ Lights: [lights?"on":"off"]
[src.dna?"DNA-locked:
[src.dna] \[Reset\]
":null] "} -//Cargo components. + + + if(defence_mode_possible) + output += "Defence mode: [defence_mode?"on":"off"]
" + if(overload_possible) + output += "Leg actuators overload: [overload?"on":"off"]
" + if(smoke_possible) + output += "Smoke: [smoke_reserve]
" + if(thrusters_possible) + output += "Thrusters: [thrusters?"on":"off"]
" + +//Cargo components. Keep this last otherwise it does weird alignment issues. output += "Cargo Compartment Contents:
" 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("[user] [attack_message] [src]!") - user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") - 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("\The [user]'s attack is stopped by the armor.") visible_message("\The [user] rebounds off [src.name]'s armor!") user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") + 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("\The [user]'s doesn't dent \the [src] paint.") + 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("\The [user] struggles to pierce \the [src] armor.") + 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("[user] [attack_message] [src]!") + user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") + return 1 @@ -2199,4 +2490,4 @@ if(-INFINITY to 15) occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 3) else - occupant.clear_alert("mech damage") \ No newline at end of file + occupant.clear_alert("mech damage") diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm new file mode 100644 index 0000000000..0d2034d790 --- /dev/null +++ b/code/game/mecha/mecha_actions.dm @@ -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("You enable [src] defence mode.") + else + deflect_chance = initial(deflect_chance) + src.occupant_message("You disable [src] defence mode.") + 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("Leg actuators damage critical, unable to engage overload.") + 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("You disable leg actuators overload.") + else + overload = 1 + step_in = min(1, round(step_in/2)) + step_energy_drain = step_energy_drain*overload_coeff + src.occupant_message("You enable leg actuators overload.") + 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("You don't have any smoke left in stock!") + return + + if(smoke_ready) + smoke_reserve-- //Remove ammo + src.occupant_message("Smoke fired. [smoke_reserve] usages left.") + + 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("Zoom mode [zoom?"en":"dis"]abled.") + 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("Thrusters [thrusters?"en":"dis"]abled.") + 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("En":"#f00\">Dis"]abled phasing.") + return + + diff --git a/code/game/mecha/mecha_vr.dm b/code/game/mecha/mecha_vr.dm new file mode 100644 index 0000000000..674c988784 --- /dev/null +++ b/code/game/mecha/mecha_vr.dm @@ -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. diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index ce72a16119..00be6d3c3f 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -130,4 +130,14 @@ ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun - ME.attach(src) \ No newline at end of file + 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)) \ No newline at end of file diff --git a/code/game/mecha/medical/odysseus_vr.dm b/code/game/mecha/medical/odysseus_vr.dm new file mode 100644 index 0000000000..3c87a14e90 --- /dev/null +++ b/code/game/mecha/medical/odysseus_vr.dm @@ -0,0 +1,2 @@ +/obj/mecha/medical/odysseus/ + minimum_penetration = 0 diff --git a/code/game/mecha/micro/security.dm b/code/game/mecha/micro/security.dm index 713c08d3d9..57bc57eed3 100644 --- a/code/game/mecha/micro/security.dm +++ b/code/game/mecha/micro/security.dm @@ -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 diff --git a/code/game/mecha/micro/utility.dm b/code/game/mecha/micro/utility.dm index 0d7290a1cf..9ceaa2bae9 100644 --- a/code/game/mecha/micro/utility.dm +++ b/code/game/mecha/micro/utility.dm @@ -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 diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 938a720c4f..5bfe3b4395 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -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) diff --git a/code/game/mecha/working/ripley_vr.dm b/code/game/mecha/working/ripley_vr.dm new file mode 100644 index 0000000000..102ae7c910 --- /dev/null +++ b/code/game/mecha/working/ripley_vr.dm @@ -0,0 +1,2 @@ +/obj/mecha/working/ripley + minimum_penetration = 0 diff --git a/code/game/objects/effects/decals/posters/voreposters_vr.dm b/code/game/objects/effects/decals/posters/voreposters_vr.dm index afcf0ab108..006bf32d27 100644 --- a/code/game/objects/effects/decals/posters/voreposters_vr.dm +++ b/code/game/objects/effects/decals/posters/voreposters_vr.dm @@ -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" diff --git a/code/game/objects/items/balls_vr.dm b/code/game/objects/items/balls_vr.dm new file mode 100644 index 0000000000..6c0b1c25a8 --- /dev/null +++ b/code/game/objects/items/balls_vr.dm @@ -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" \ No newline at end of file diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 80a015e7bf..680bebf6e9 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -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) diff --git a/code/game/objects/items/devices/translocator_vr.dm b/code/game/objects/items/devices/translocator_vr.dm index 6778bfae7a..02264246e7 100644 --- a/code/game/objects/items/devices/translocator_vr.dm +++ b/code/game/objects/items/devices/translocator_vr.dm @@ -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,"\The [src] narrowly avoids teleporting you right into \a [lowertext(real_dest.name)]!") real_dest = dT //Nevermind! else diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 854dee4662..cf0e777e5f 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -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" \ No newline at end of file diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 62fb76bffe..f665e15d09 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -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 = {" @@ -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 = {" @@ -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 = {" diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 639a1e9bc6..8119de19e0 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -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" diff --git a/code/game/objects/items/weapons/shields_vr.dm b/code/game/objects/items/weapons/shields_vr.dm index 5be1544d2e..acaa4a58fd 100644 --- a/code/game/objects/items/weapons/shields_vr.dm +++ b/code/game/objects/items/weapons/shields_vr.dm @@ -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 diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 75cbc2297e..62c70457c0 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -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 diff --git a/code/game/objects/random/maintenance.dm b/code/game/objects/random/maintenance.dm index 4ee11fb8cb..37dcca8319 100644 --- a/code/game/objects/random/maintenance.dm +++ b/code/game/objects/random/maintenance.dm @@ -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*/ diff --git a/code/game/objects/random/mechs.dm b/code/game/objects/random/mechs.dm new file mode 100644 index 0000000000..7dcd3db5cc --- /dev/null +++ b/code/game/objects/random/mechs.dm @@ -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) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index a0ade2c0ee..d7ebefccbf 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -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 diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm index bf43f36e5e..b0b6b30ca0 100644 --- a/code/game/objects/structures/trash_pile_vr.dm +++ b/code/game/objects/structures/trash_pile_vr.dm @@ -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, diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index b9ee2bc93c..1d989c7099 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -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" diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 4a892d893d..fc04317ef2 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -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") diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm index c102126f49..c8243c7dca 100644 --- a/code/modules/admin/create_object.dm +++ b/code/modules/admin/create_object.dm @@ -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") diff --git a/code/modules/admin/create_turf.dm b/code/modules/admin/create_turf.dm index fdaa103b5d..f3de693055 100644 --- a/code/modules/admin/create_turf.dm +++ b/code/modules/admin/create_turf.dm @@ -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") diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 40171f8c92..7978722750 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -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 . += "Change Color [color_square(pref.r_hair, pref.g_hair, pref.b_hair)] " . += " Style: < > [pref.h_style]
" //The < & > in this line is correct-- those extra characters are the arrows you click to switch between styles. + . += "Gradient
" + . += "Change Color [color_square(pref.r_grad, pref.g_grad, pref.b_grad)] " + . += " Style: < > [pref.grad_style]
" + . += "
Facial
" if(has_flag(mob_species, HAS_HAIR_COLOR)) . += "Change Color [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 += "
Does not have a respiratory system." if(current_species.flags & NO_SCAN) dat += "
Does not have DNA." + if(current_species.flags & NO_DEFIB) + dat += "
Cannot be defibrillated." if(current_species.flags & NO_PAIN) dat += "
Does not feel pain." if(current_species.flags & NO_SLIP) diff --git a/code/modules/client/preference_setup/loadout/loadout_general_vr.dm b/code/modules/client/preference_setup/loadout/loadout_general_vr.dm new file mode 100644 index 0000000000..09093b6567 --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_general_vr.dm @@ -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)) \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 47384f09fa..4d2157306f 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -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 diff --git a/code/modules/clothing/spacesuits/rig/suits/robotics.dm b/code/modules/clothing/spacesuits/rig/suits/robotics.dm index 4fb43d355d..2c8ba637af 100644 --- a/code/modules/clothing/spacesuits/rig/suits/robotics.dm +++ b/code/modules/clothing/spacesuits/rig/suits/robotics.dm @@ -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 \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index a51646945a..0dbce4a494 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -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 diff --git a/code/modules/clothing/spacesuits/void/station_vr.dm b/code/modules/clothing/spacesuits/void/station_vr.dm new file mode 100644 index 0000000000..0684095afb --- /dev/null +++ b/code/modules/clothing/spacesuits/void/station_vr.dm @@ -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' + ) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 1fddf1116b..d92b1351ee 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -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" @@ -66,6 +67,9 @@ var/obj/item/clothing/head/helmet/helmet = null // Deployable helmet, if any. 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) . = ..() diff --git a/code/modules/events/grubinfestation_vr.dm b/code/modules/events/grubinfestation_vr.dm index 116b1d3234..c67a5a72f5 100644 --- a/code/modules/events/grubinfestation_vr.dm +++ b/code/modules/events/grubinfestation_vr.dm @@ -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') \ No newline at end of file + command_announcement.Announce("Sensors have narrowed down remaining active solargrubs to the followng areas: [english_list]", "Lifesign Alert") diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 1cd3ddf51d..e30a6f049c 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -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()) ) diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index f4abcc9e0f..ad679ec891 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -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." diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 9273ece79e..879c7595a4 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -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 diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index ff549fc29d..99f0be8aa4 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -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"]) diff --git a/code/modules/lore_codex/codex.dm b/code/modules/lore_codex/codex.dm index ffed55365e..d6c1eafa61 100644 --- a/code/modules/lore_codex/codex.dm +++ b/code/modules/lore_codex/codex.dm @@ -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" diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index c9423aa3aa..ad92fcfbb0 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -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) @@ -397,4 +397,4 @@ return 0 src.set_dir(turn(src.dir, 270)) - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/mob/living/carbon/human/gradient.dm b/code/modules/mob/living/carbon/human/gradient.dm new file mode 100644 index 0000000000..7a0e1d37f1 --- /dev/null +++ b/code/modules/mob/living/carbon/human/gradient.dm @@ -0,0 +1,6 @@ +GLOBAL_LIST_INIT(hair_gradients, list( + "None" = "none", + "Fade (Up)" = "fadeup", + "Fade (Down)" = "fadedown", + "Vertical Split" = "vsplit" + )) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 9388240af6..b8343ad694 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -288,6 +288,20 @@ oxyloss = 0 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) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 18e0babf42..4bba6c7ceb 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species/outsider/event.dm b/code/modules/mob/living/carbon/human/species/outsider/event.dm index a156d2dc9f..3566010050 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/event.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/event.dm @@ -199,6 +199,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 diff --git a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm index d0f40f693d..dd03ab4bbc 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm @@ -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) diff --git a/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm b/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm index 0f8837460c..d8a5577e37 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm index 8100291e26..ad9fc8f0bc 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm @@ -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" diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox_vr.dm b/code/modules/mob/living/carbon/human/species/outsider/vox_vr.dm new file mode 100644 index 0000000000..422c95be92 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/outsider/vox_vr.dm @@ -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. \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index c9eb8216d1..619e011510 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm index 82645f8c59..be37e03c47 100644 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm @@ -17,13 +17,13 @@ var/new_ear_style = input(src, "Pick some ears!", "Character Preference", ear_style ? ear_style.name : null) as null|anything in pretty_ear_styles if(!new_ear_style) return - + //Set new style ear_style = ear_styles_list[pretty_ear_styles[new_ear_style]] - + //Allow color picks var/current_pri_color = rgb(r_ears,g_ears,b_ears) - + var/new_pri_color = input("Pick primary ear color:","Ear Color (Pri)", current_pri_color) as null|color if(new_pri_color) var/list/new_color_rgb_list = hex2rgb(new_pri_color) @@ -33,7 +33,7 @@ //Indented inside positive primary color choice, don't bother if they clicked cancel var/current_sec_color = rgb(r_ears2,g_ears2,b_ears2) - + var/new_sec_color = input("Pick secondary ear color (only applies to some ears):","Ear Color (sec)", current_sec_color) as null|color if(new_sec_color) new_color_rgb_list = hex2rgb(new_sec_color) @@ -62,13 +62,13 @@ var/new_tail_style = input(src, "Pick a tail!", "Character Preference", tail_style ? tail_style.name : null) as null|anything in pretty_tail_styles if(!new_tail_style) return - + //Set new style tail_style = tail_styles_list[pretty_tail_styles[new_tail_style]] - + //Allow color picks var/current_pri_color = rgb(r_tail,g_tail,b_tail) - + var/new_pri_color = input("Pick primary tail color:","Tail Color (Pri)", current_pri_color) as null|color if(new_pri_color) var/list/new_color_rgb_list = hex2rgb(new_pri_color) @@ -78,7 +78,7 @@ //Indented inside positive primary color choice, don't bother if they clicked cancel var/current_sec_color = rgb(r_tail2,g_tail2,b_tail2) - + var/new_sec_color = input("Pick secondary tail color (only applies to some tails):","Tail Color (sec)", current_sec_color) as null|color if(new_sec_color) new_color_rgb_list = hex2rgb(new_sec_color) @@ -107,13 +107,13 @@ var/new_wing_style = input(src, "Pick some wings!", "Character Preference", wing_style ? wing_style.name : null) as null|anything in pretty_wing_styles if(!new_wing_style) return - + //Set new style wing_style = wing_styles_list[pretty_wing_styles[new_wing_style]] - + //Allow color picks var/current_color = rgb(r_wing,g_wing,b_wing) - + var/new_color = input("Pick wing color:","Wing Color", current_color) as null|color if(new_color) var/list/new_color_rgb_list = hex2rgb(new_color) @@ -123,7 +123,7 @@ //Indented inside positive primary color choice, don't bother if they clicked cancel var/current_sec_color = rgb(r_wing2,g_wing2,b_wing2) - + var/new_sec_color = input("Pick secondary wing color (only applies to some wings):","Wing Color (sec)", current_sec_color) as null|color if(new_sec_color) new_color_rgb_list = hex2rgb(new_sec_color) @@ -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("\The [src]'s interal composition seems to change.") + update_icons_body() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm index 3b09166813..d2bc9dc1dd 100644 --- a/code/modules/mob/living/carbon/human/species/station/golem.dm +++ b/code/modules/mob/living/carbon/human/species/station/golem.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index c886b2bab3..9fe62e704b 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm index 91dc18ebac..4c4be10cbd 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm @@ -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, ) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 6d0cdde2c2..91a1aea8c5 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -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" diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm index 142634c4aa..4dca86ce5c 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm @@ -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. \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm index 4809853f00..425a72185c 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 05031e9855..5f1f361802 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -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) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index b98340baef..3be377b366 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -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] diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index 2a6d23194a..6b2d4bb6fe 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -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) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm index 26c15f9c17..9fc50395e1 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm @@ -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) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 0b516955ef..0413dbc766 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -224,4 +224,6 @@ var/registered_z - var/list/progressbars = null //for stacking do_after bars \ No newline at end of file + var/in_enclosed_vehicle = 0 //For mechs and fighters ambiance. Can be used in other cases. + + var/list/progressbars = null //VOREStation Edit diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 939856c7a2..e6fd555d8d 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -451,19 +451,19 @@ character.buckled.set_dir(character.dir) ticker.mode.latespawn(character) - + if(J.mob_type & JOB_SILICON) AnnounceCyborg(character, rank, join_message, announce_channel, character.z) else AnnounceArrival(character, rank, join_message, announce_channel, character.z) data_core.manifest_inject(character) ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn - + qdel(src) // Delete new_player mob /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. diff --git a/code/modules/modular_computers/file_system/programs/generic/camera.dm b/code/modules/modular_computers/file_system/programs/generic/camera.dm index e07d9ec293..52c275d3bb 100644 --- a/code/modules/modular_computers/file_system/programs/generic/camera.dm +++ b/code/modules/modular_computers/file_system/programs/generic/camera.dm @@ -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) diff --git a/code/modules/modular_computers/file_system/programs/generic/uav.dm b/code/modules/modular_computers/file_system/programs/generic/uav.dm index 8e4909ab04..0e98d0e0ea 100644 --- a/code/modules/modular_computers/file_system/programs/generic/uav.dm +++ b/code/modules/modular_computers/file_system/programs/generic/uav.dm @@ -41,13 +41,13 @@ set_current(null) else // Don't reset counter until we find a UAV that's actually in range we can stay connected to signal_test_counter = 20 - + data["current_uav"] = null if(current_uav) data["current_uav"] = list("status" = current_uav.get_status_string(), "power" = current_uav.state == 1 ? 1 : null) data["signal_strength"] = signal_strength ? signal_strength >= 2 ? "High" : "Low" : "None" data["in_use"] = LAZYLEN(viewers) - + var/list/paired_map = list() var/obj/item/modular_computer/mc_host = nano_host() if(istype(mc_host)) @@ -55,7 +55,7 @@ var/weakref/wr = puav var/obj/item/device/uav/U = wr.resolve() paired_map[++paired_map.len] = list("name" = "[U ? U.nickname : "!!Missing!!"]", "uavref" = "\ref[U]") - + data["paired_uavs"] = paired_map ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -102,7 +102,7 @@ else if(href_list["view_uav"]) if(!current_uav) return TOPIC_NOACTION - + if(current_uav.check_eye(user) < 0) to_chat(usr,"The screen freezes for a moment, before returning to the UAV selection menu. It's not able to connect to that UAV.") else @@ -139,7 +139,7 @@ signal_strength = 0 current_uav = U - + if(LAZYLEN(viewers)) for(var/weakref/W in viewers) var/M = W.resolve() @@ -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 @@ -209,7 +209,7 @@ if(!current_uav) return - + user.set_machine(nano_host()) user.reset_view(current_uav) current_uav.add_master(user) @@ -250,7 +250,7 @@ if(weakref(M) in viewers) M.overlay_fullscreen("fishbed",/obj/screen/fullscreen/fishbed) M.overlay_fullscreen("scanlines",/obj/screen/fullscreen/scanline) - + if(signal_strength <= 1) M.overlay_fullscreen("whitenoise",/obj/screen/fullscreen/noise) else diff --git a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm index 894173ec72..83e6584e8c 100644 --- a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm +++ b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm @@ -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() diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index 1447c5008e..86af5d9ba0 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -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 diff --git a/code/modules/organs/organ_external_vr.dm b/code/modules/organs/organ_external_vr.dm index 491cce9428..1742259864 100644 --- a/code/modules/organs/organ_external_vr.dm +++ b/code/modules/organs/organ_external_vr.dm @@ -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 diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 221767b15b..a5be7341fc 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -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 diff --git a/code/modules/organs/robolimbs_vr.dm b/code/modules/organs/robolimbs_vr.dm index 7f85cf642d..5182c70e55 100644 --- a/code/modules/organs/robolimbs_vr.dm +++ b/code/modules/organs/robolimbs_vr.dm @@ -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" diff --git a/code/modules/organs/subtypes/slime_vr.dm b/code/modules/organs/subtypes/slime_vr.dm new file mode 100644 index 0000000000..3186f08436 --- /dev/null +++ b/code/modules/organs/subtypes/slime_vr.dm @@ -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 \ No newline at end of file diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index b0894753b8..8ef1bfe2a6 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -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,7 +658,8 @@ 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. - impacted_mobs |= target_mob + if(islist(impacted_mobs)) + impacted_mobs |= target_mob if(result == PROJECTILE_FORCE_MISS) if(!silenced) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks_vr.dm index 45e05ef86c..c86801350a 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks_vr.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks_vr.dm @@ -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 diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index e0bd0da7e0..d5b6d1cbc8 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -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. diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 1c4079de15..78d18a2edf 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -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 diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index 489cab17f5..0f4f4d0a37 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -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) diff --git a/code/modules/xenoarcheaology/manuals.dm b/code/modules/xenoarcheaology/manuals.dm index 63bcce9218..da2a9fb0dc 100644 --- a/code/modules/xenoarcheaology/manuals.dm +++ b/code/modules/xenoarcheaology/manuals.dm @@ -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 = {" @@ -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 = {" @@ -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 = {" @@ -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 = {" @@ -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 = {" @@ -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 = {" diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index 5d0ad8b80c..d182272b99 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -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 diff --git a/html/changelog.html b/html/changelog.html index cc0d540a75..e3ea40755b 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,33 @@ -->
+

21 June 2020

+

Arokha updated:

+
    +
  • New sprites for janicart
  • +
  • Alt-click helpers for stowing mop, chemicals on janicart
  • +
+

Atermonera updated:

+
    +
  • Added verb to export vchat logs, found in OOC tab when vchat has successfully loaded.
  • +
  • Vchat only sends you enough messages to fill your buffer on reconnect, instead of all of them.
  • +
+

Billy Bangles updated:

+
    +
  • Light and dark marble floor tiles can now be crafted with marble sheets.
  • +
+

Greenjoe updated:

+
    +
  • 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!
  • +
+

KasparoVv updated:

+
    +
  • You can now quickly cycle hrough previous or next hair/facial styles at character creation.
  • +
  • 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.
  • +
  • Ports color_square() from Paradise for colour previews, cleaning up pref. code & correct alignment issue w/ nested tables.
  • +
  • Markings are now properly aligned within a table.
  • +
+

13 May 2020

Atermonera updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 2f698c2602..796fa0aa3b 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -5177,3 +5177,26 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. less laggy, and less directly destructive. Instead, it causes larger health hazard and secondary engineering problems such as power outage or partial damage of solar arrays. +2020-06-21: + Arokha: + - rscadd: New sprites for janicart + - tweak: Alt-click helpers for stowing mop, chemicals on janicart + Atermonera: + - rscadd: Added verb to export vchat logs, found in OOC tab when vchat has successfully + loaded. + - tweak: Vchat only sends you enough messages to fill your buffer on reconnect, + instead of all of them. + Billy Bangles: + - rscadd: Light and dark marble floor tiles can now be crafted with marble sheets. + Greenjoe: + - 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! + KasparoVv: + - rscadd: You can now quickly cycle hrough previous or next hair/facial styles at + character creation. + - 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. + - tweak: Ports color_square() from Paradise for colour previews, cleaning up pref. + code & correct alignment issue w/ nested tables. + - tweak: Markings are now properly aligned within a table. diff --git a/html/changelogs/KasparoVv - PR - 7215.yml b/html/changelogs/KasparoVv - PR - 7215.yml deleted file mode 100644 index efd745d1a9..0000000000 --- a/html/changelogs/KasparoVv - PR - 7215.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: KasparoVv -delete-after: True -changes: - - rscadd: "You can now quickly cycle hrough previous or next hair/facial styles at character creation." - - 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." - - tweak: "Ports color_square() from Paradise for colour previews, cleaning up pref. code & correct alignment issue w/ nested tables." - - tweak: "Markings are now properly aligned within a table." \ No newline at end of file diff --git a/html/changelogs/atermonera - vchat_exportlog.yml b/html/changelogs/atermonera - vchat_exportlog.yml deleted file mode 100644 index a2915951a2..0000000000 --- a/html/changelogs/atermonera - vchat_exportlog.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Atermonera -delete-after: True -changes: - - rscadd: "Added verb to export vchat logs, found in OOC tab when vchat has successfully loaded." - - tweak: "Vchat only sends you enough messages to fill your buffer on reconnect, instead of all of them." diff --git a/html/changelogs/billybangles-marbletile.yml b/html/changelogs/billybangles-chessboard.yml similarity index 53% rename from html/changelogs/billybangles-marbletile.yml rename to html/changelogs/billybangles-chessboard.yml index 2e7d4ff558..f51e69fc67 100644 --- a/html/changelogs/billybangles-marbletile.yml +++ b/html/changelogs/billybangles-chessboard.yml @@ -20,17 +20,8 @@ # spellcheck (typo fixes) # experiment ################################# - -# Your name. + author: Billy Bangles - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Light and dark marble floor tiles can now be crafted with marble sheets." + - rscadd: "Adds a chessboard holodeck program and a set of chess pieces" + - imageadd: "Adds a set of small floor decals numbered 1 to 8 and letters A to H" diff --git a/html/changelogs/arokha-janicart.yml b/html/changelogs/cerebulon - booksprites.yml similarity index 90% rename from html/changelogs/arokha-janicart.yml rename to html/changelogs/cerebulon - booksprites.yml index 9caf37fab8..95bd5fd49c 100644 --- a/html/changelogs/arokha-janicart.yml +++ b/html/changelogs/cerebulon - booksprites.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Arokha +author: Cerebulon # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,5 +33,5 @@ delete-after: True # Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. # Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - - rscadd: "New sprites for janicart" - - tweak: "Alt-click helpers for stowing mop, chemicals on janicart" + - rscadd: "Added inhand sprites for books." + -imageadd: "Added new book sprites, replaced old book sprites." diff --git a/html/changelogs/greenjoe - wrist PDAs.yml b/html/changelogs/greenjoe - wrist PDAs.yml deleted file mode 100644 index 006a6bc659..0000000000 --- a/html/changelogs/greenjoe - wrist PDAs.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Greenjoe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - 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!" \ No newline at end of file diff --git a/html/changelogs/kasparovy-pr-7314.yml b/html/changelogs/kasparovy-pr-7314.yml new file mode 100644 index 0000000000..ad72c999e2 --- /dev/null +++ b/html/changelogs/kasparovy-pr-7314.yml @@ -0,0 +1,8 @@ +# Your name. +author: KasparoVy + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +changes: + - tweak: Removes a pixel from the south-facing dir of the eyepatch's strap which unintentionally blocked your 'good' eye. diff --git a/icons/effects/actions_mecha.dmi b/icons/effects/actions_mecha.dmi new file mode 100644 index 0000000000..0a505767a3 Binary files /dev/null and b/icons/effects/actions_mecha.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index d2a5879eeb..63e7f120ce 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/hair_gradients.dmi b/icons/mob/hair_gradients.dmi new file mode 100644 index 0000000000..0f40b098e9 Binary files /dev/null and b/icons/mob/hair_gradients.dmi differ diff --git a/icons/mob/items/lefthand_balls_vr.dmi b/icons/mob/items/lefthand_balls_vr.dmi new file mode 100644 index 0000000000..2f65e0969a Binary files /dev/null and b/icons/mob/items/lefthand_balls_vr.dmi differ diff --git a/icons/mob/items/lefthand_books.dmi b/icons/mob/items/lefthand_books.dmi new file mode 100644 index 0000000000..4b9d9fe481 Binary files /dev/null and b/icons/mob/items/lefthand_books.dmi differ diff --git a/icons/mob/items/righthand_balls_vr.dmi b/icons/mob/items/righthand_balls_vr.dmi new file mode 100644 index 0000000000..ba2bccac38 Binary files /dev/null and b/icons/mob/items/righthand_balls_vr.dmi differ diff --git a/icons/mob/items/righthand_books.dmi b/icons/mob/items/righthand_books.dmi new file mode 100644 index 0000000000..666e304aad Binary files /dev/null and b/icons/mob/items/righthand_books.dmi differ diff --git a/icons/mob/mouthball_vr.dmi b/icons/mob/mouthball_vr.dmi new file mode 100644 index 0000000000..f3c605ab56 Binary files /dev/null and b/icons/mob/mouthball_vr.dmi differ diff --git a/icons/mob/species/akula/suit_vr.dmi b/icons/mob/species/akula/suit_vr.dmi index 3abd100eee..5298666e0a 100644 Binary files a/icons/mob/species/akula/suit_vr.dmi and b/icons/mob/species/akula/suit_vr.dmi differ diff --git a/icons/mob/species/sergal/suit_vr.dmi b/icons/mob/species/sergal/suit_vr.dmi index 2cfc989121..4dcd686873 100644 Binary files a/icons/mob/species/sergal/suit_vr.dmi and b/icons/mob/species/sergal/suit_vr.dmi differ diff --git a/icons/mob/species/seromi/head.dmi b/icons/mob/species/seromi/head.dmi index f5222773f7..bd105df155 100644 Binary files a/icons/mob/species/seromi/head.dmi and b/icons/mob/species/seromi/head.dmi differ diff --git a/icons/mob/species/seromi/suit.dmi b/icons/mob/species/seromi/suit.dmi index 5b6fb68f69..db3b58db74 100644 Binary files a/icons/mob/species/seromi/suit.dmi and b/icons/mob/species/seromi/suit.dmi differ diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi index b35e996d8a..8cda990085 100644 Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi index e72ef3e002..1185d99d7f 100644 Binary files a/icons/mob/species/skrell/suit.dmi and b/icons/mob/species/skrell/suit.dmi differ diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi index 54ef3ec436..4003c1b508 100644 Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi index f9677e5e89..2453efcbaf 100644 Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi index eb0165e3e5..dc98094bb5 100644 Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi index a05c73928e..08f1ed4938 100644 Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi index 6e33c45b5e..fe53df15ed 100644 Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ diff --git a/icons/mob/species/vulpkanin/helmet.dmi b/icons/mob/species/vulpkanin/helmet.dmi index 1d85465f77..ee1721cc37 100644 Binary files a/icons/mob/species/vulpkanin/helmet.dmi and b/icons/mob/species/vulpkanin/helmet.dmi differ diff --git a/icons/mob/species/vulpkanin/suit.dmi b/icons/mob/species/vulpkanin/suit.dmi index 6e54a4662b..d8e5ee5133 100644 Binary files a/icons/mob/species/vulpkanin/suit.dmi and b/icons/mob/species/vulpkanin/suit.dmi differ diff --git a/icons/mob/taursuits_spider_vr.dmi b/icons/mob/taursuits_spider_vr.dmi index e0da9b3cfb..b8090eceaa 100644 Binary files a/icons/mob/taursuits_spider_vr.dmi and b/icons/mob/taursuits_spider_vr.dmi differ diff --git a/icons/obj/balls_vr.dmi b/icons/obj/balls_vr.dmi new file mode 100644 index 0000000000..994be4ab97 Binary files /dev/null and b/icons/obj/balls_vr.dmi differ diff --git a/icons/obj/chess.dmi b/icons/obj/chess.dmi new file mode 100644 index 0000000000..bc2e6aca44 Binary files /dev/null and b/icons/obj/chess.dmi differ diff --git a/icons/obj/contraband_vr.dmi b/icons/obj/contraband_vr.dmi index 0e0406e824..8138327200 100644 Binary files a/icons/obj/contraband_vr.dmi and b/icons/obj/contraband_vr.dmi differ diff --git a/icons/obj/custom_books.dmi b/icons/obj/custom_books.dmi index 2be098e848..f60a15fc1a 100644 Binary files a/icons/obj/custom_books.dmi and b/icons/obj/custom_books.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 5bc1d782ab..40cde48d26 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/turf/flooring/decals.dmi b/icons/turf/flooring/decals.dmi index 7c5d6d149d..66e365251a 100644 Binary files a/icons/turf/flooring/decals.dmi and b/icons/turf/flooring/decals.dmi differ diff --git a/maps/southern_cross/overmap/sectors.dm b/maps/southern_cross/overmap/sectors.dm index 5d569cb05d..6bfc3edfa1 100644 --- a/maps/southern_cross/overmap/sectors.dm +++ b/maps/southern_cross/overmap/sectors.dm @@ -36,7 +36,8 @@ start_x = 10 start_y = 10 map_z = list(Z_LEVEL_STATION_ONE, Z_LEVEL_STATION_TWO, Z_LEVEL_STATION_THREE) + extra_z_levels = list(Z_LEVEL_TRANSIT) // Hopefully temporary, so arrivals announcements work. /obj/effect/overmap/visitable/planet/Sif/Initialize() . = ..() - docking_codes = null \ No newline at end of file + docking_codes = null diff --git a/maps/southern_cross/southern_cross-6.dmm b/maps/southern_cross/southern_cross-6.dmm index 7d0d531f40..8d40ebf032 100644 --- a/maps/southern_cross/southern_cross-6.dmm +++ b/maps/southern_cross/southern_cross-6.dmm @@ -2280,22 +2280,61 @@ "RR" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start) "RS" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 4},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_station/start) "RT" = (/turf/space,/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating/airless/carry,/area/skipjack_station/start) +"RU" = (/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"RV" = (/obj/item/toy/chess/rook_black,/turf/simulated/floor/holofloor/wmarble,/area/holodeck/source_chess) +"RW" = (/obj/effect/floor_decal/sign/small_8,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"RX" = (/obj/item/toy/chess/bishop_black,/turf/simulated/floor/holofloor/wmarble,/area/holodeck/source_chess) +"RY" = (/obj/item/toy/chess/knight_black,/turf/simulated/floor/holofloor/bmarble,/area/holodeck/source_chess) +"RZ" = (/obj/item/toy/chess/king_black,/turf/simulated/floor/holofloor/wmarble,/area/holodeck/source_chess) +"Sa" = (/obj/item/toy/chess/queen_black,/turf/simulated/floor/holofloor/bmarble,/area/holodeck/source_chess) +"Sb" = (/obj/item/toy/chess/knight_black,/turf/simulated/floor/holofloor/wmarble,/area/holodeck/source_chess) +"Sc" = (/obj/item/toy/chess/bishop_black,/turf/simulated/floor/holofloor/bmarble,/area/holodeck/source_chess) +"Sd" = (/obj/item/toy/chess/rook_black,/turf/simulated/floor/holofloor/bmarble,/area/holodeck/source_chess) +"Se" = (/obj/item/toy/chess/pawn_black,/turf/simulated/floor/holofloor/bmarble,/area/holodeck/source_chess) +"Sf" = (/obj/effect/floor_decal/sign/small_7,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"Sg" = (/obj/item/toy/chess/pawn_black,/turf/simulated/floor/holofloor/wmarble,/area/holodeck/source_chess) +"Sh" = (/turf/simulated/floor/holofloor/wmarble,/area/holodeck/source_chess) +"Si" = (/obj/effect/floor_decal/sign/small_6,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"Sj" = (/turf/simulated/floor/holofloor/bmarble,/area/holodeck/source_chess) +"Sk" = (/obj/effect/floor_decal/sign/small_5,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"Sl" = (/obj/effect/floor_decal/sign/small_4,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"Sm" = (/obj/effect/floor_decal/sign/small_3,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"Sn" = (/obj/item/toy/chess/pawn_white,/turf/simulated/floor/holofloor/wmarble,/area/holodeck/source_chess) +"So" = (/obj/effect/floor_decal/sign/small_2,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"Sp" = (/obj/item/toy/chess/pawn_white,/turf/simulated/floor/holofloor/bmarble,/area/holodeck/source_chess) +"Sq" = (/obj/item/toy/chess/rook_white,/turf/simulated/floor/holofloor/bmarble,/area/holodeck/source_chess) +"Sr" = (/obj/effect/floor_decal/sign/small_1,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"Ss" = (/obj/item/toy/chess/bishop_white,/turf/simulated/floor/holofloor/bmarble,/area/holodeck/source_chess) +"St" = (/obj/item/toy/chess/knight_white,/turf/simulated/floor/holofloor/wmarble,/area/holodeck/source_chess) +"Su" = (/obj/item/toy/chess/king_white,/turf/simulated/floor/holofloor/bmarble,/area/holodeck/source_chess) +"Sv" = (/obj/item/toy/chess/queen_white,/turf/simulated/floor/holofloor/wmarble,/area/holodeck/source_chess) +"Sw" = (/obj/item/toy/chess/knight_white,/turf/simulated/floor/holofloor/bmarble,/area/holodeck/source_chess) +"Sx" = (/obj/item/toy/chess/bishop_white,/turf/simulated/floor/holofloor/wmarble,/area/holodeck/source_chess) +"Sy" = (/obj/item/toy/chess/rook_white,/turf/simulated/floor/holofloor/wmarble,/area/holodeck/source_chess) +"Sz" = (/obj/effect/floor_decal/sign/small_a,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"SA" = (/obj/effect/floor_decal/sign/small_c,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"SB" = (/obj/effect/floor_decal/sign/small_b,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"SC" = (/obj/effect/floor_decal/sign/small_e,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"SD" = (/obj/effect/floor_decal/sign/small_d,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"SE" = (/obj/effect/floor_decal/sign/small_g,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"SF" = (/obj/effect/floor_decal/sign/small_f,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) +"SG" = (/obj/effect/floor_decal/sign/small_h,/turf/simulated/floor/holofloor/wood,/area/holodeck/source_chess) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeafaeaeaeaeaeaeagahaiahaiahahaiahaiahagbkbkbkbkbkbkaOaLaAajagananclalalalalalalalagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauambAbxbxbxbxbxbDawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeaeaeaeaxaeagaiazayazayazayazayahagbkbkbkbkbkbkaOaLaAakagananctaBaBaBaBaBaBaBagaoaDaoaoaoaoaoaoaDaoagapapapapapapapapapapagavauambBaFaFaFaFaFbCawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaxaeaeaeaeaeaeaeaeagatayaHaCaIaCaIaKazahagbkaVbmaWbmaXaOaLaAakagananaJalaPalaBaQaZaYagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavavaRbBaFaFaFaFaFbCawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeafaeaeaeaeagaUbabbaSaTaTaUaNazaiagbcbrbqbvbqbsaOaLaAakagaManbdbebfbHbgclbhbiagaoaoaoaDaoaoaDaoaoaoagapapapapapapapapapapagavauambBaFaFaFaFaFbCawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeafaeaeaeafaeaeaeagaUaUaUaUbjbjaUaNayahagblbrbqbvbqbsaOaLaAakagananbnbobobobpclbtbNagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauamcacbcbcbcbcbccawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeaeaeaeaeaeagaUaUaUaUbjbjaUbGazaiagblbrbqbvbqbsaOaLaAakagananbubybzbybwclbtbNagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauamaqarararararasawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeaxaeaeaeafagaUbEbFaSaTaTaUaNayaiagbIbrbqbvbqbsaOaLaAakagaManbObQbzbQbRclbtbNagaoaoaoaDaoaoaDaoaoaoagapapapapapapapapapapagavauamaEaFaFaFaFaFaGawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaxaeaeaeaeaeaeaeagbVaybJbKbLbKbLbMazahagbkbUbSbWbSbXaOaLaAakagananbYbzbzbzbNclbtbNagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavavbZaEaFaFaFaFaFaGawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaeaeaeaeaeaeaeaeaeaeagaiazayazayazayazazaiagbkbkbkbkbkbkaOaLaAakagananbObQbzbQbRclbtbNagaoaDaoaoaoaoaoaoaDaoagapapapapapapapapapapagavauamaEaFaFaFaFaFaGawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadafaeaeaeaxaeaeaeaeaxagahaiahaiahahaiahaiahagbTbkbkbkbkbkaOaLaAakaganancncrbPcrcsclcBcuagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauamcIcKcKcKcKcKcOawaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcdcdcdcdcdcdcdcdcdcdabcdcdcdcdcdcdcdcdcdcdabcdcdcdcdcdcdcdcdcdcdabcecececececececececeabcecececececececececeabcecececececececececeabcecececececececececeabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabacacacacacacacacacacabaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadRURURURURURURURURURUagaeaeaeafaeaeaeaeaeaeagahaiahaiahahaiahaiahagbkbkbkbkbkbkaOaLaAajagananclalalalalalalalagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauambAbxbxbxbxbxbDawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadRWRVRYRXSaRZScSbSdRUagaeaeaeaeaeaeaeaeaxaeagaiazayazayazayazayahagbkbkbkbkbkbkaOaLaAakagananctaBaBaBaBaBaBaBagaoaDaoaoaoaoaoaoaDaoagapapapapapapapapapapagavauambBaFaFaFaFaFbCawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadSfSeSgSeSgSeSgSeSgRUagaeaxaeaeaeaeaeaeaeaeagatayaHaCaIaCaIaKazahagbkaVbmaWbmaXaOaLaAakagananaJalaPalaBaQaZaYagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavavaRbBaFaFaFaFaFbCawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadSiShSjShSjShSjShSjRUagaeaeaeaeaeafaeaeaeaeagaUbabbaSaTaTaUaNazaiagbcbrbqbvbqbsaOaLaAakagaManbdbebfbHbgclbhbiagaoaoaoaDaoaoaDaoaoaoagapapapapapapapapapapagavauambBaFaFaFaFaFbCawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadSkSjShSjShSjShSjShRUagaeaeafaeaeaeafaeaeaeagaUaUaUaUbjbjaUaNayahagblbrbqbvbqbsaOaLaAakagananbnbobobobpclbtbNagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauamcacbcbcbcbcbccawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadSlShSjShSjShSjShSjRUagaeaeaeaeaeaeaeaeaeaeagaUaUaUaUbjbjaUbGazaiagblbrbqbvbqbsaOaLaAakagananbubybzbybwclbtbNagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauamaqarararararasawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadSmSjShSjShSjShSjShRUagaeaeaeaeaeaxaeaeaeafagaUbEbFaSaTaTaUaNayaiagbIbrbqbvbqbsaOaLaAakagaManbObQbzbQbRclbtbNagaoaoaoaDaoaoaDaoaoaoagapapapapapapapapapapagavauamaEaFaFaFaFaFaGawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadSoSnSpSnSpSnSpSnSpRUagaeaeaxaeaeaeaeaeaeaeagbVaybJbKbLbKbLbMazahagbkbUbSbWbSbXaOaLaAakagananbYbzbzbzbNclbtbNagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavavbZaEaFaFaFaFaFaGawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadSrSqStSsSvSuSxSwSyRUagaeaeaeaeaeaeaeaeaeaeagaiazayazayazayazazaiagbkbkbkbkbkbkaOaLaAakagananbObQbzbQbRclbtbNagaoaDaoaoaoaoaoaoaDaoagapapapapapapapapapapagavauamaEaFaFaFaFaFaGawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadRUSzSBSASDSCSFSESGRUagafaeaeaeaxaeaeaeaeaxagahaiahaiahahaiahaiahagbTbkbkbkbkbkaOaLaAakaganancncrbPcrcsclcBcuagaoaoaoaoaoaoaoaoaoaoagapapapapapapapapapapagavauamcIcKcKcKcKcKcOawaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeeeeeeeeeeeeeeeeeeeeabcdcdcdcdcdcdcdcdcdcdabcdcdcdcdcdcdcdcdcdcdabcdcdcdcdcdcdcdcdcdcdabcecececececececececeabcecececececececececeabcecececececececececeabcecececececececececeabaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagcgcgcgcgcgcgcgcgcgcgagchcicicicicicicicichagcpcocCdxdydxcDdzdydzagcqcqcqcqcqcqcqcqcqcqagcwcvcRdfdgdgdgdgdgeaagcxcxcycycycycycycycyawaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfczcfcfcfcfczcfagcgcAcgcgcgcgcAcgcgcgagdkdkdkdkdkdkdociciciagcpcocCdFcFdFcFdGcFdGagcqcqcHcqcqcqcqcqcqcqagcwcvcRdpcJcJcJcJcJduagcycycycycLcLcLcycycyawaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcfcfcfcfcfcfcfcfcfcfagcgcgcgcgcgcgcgcgcMcgagcWdwdAdBdAdhcVciciciagcpcpdCdFcFdydydycFdGagcqcqcqcqcqcqcPcQcqcqagcwcwdHdpcJcJcJcJcJduagcycycycScTcTcTcycycyawaaaa diff --git a/maps/southern_cross/southern_cross_defines.dm b/maps/southern_cross/southern_cross_defines.dm index bf916f2319..81fd5ecd2c 100644 --- a/maps/southern_cross/southern_cross_defines.dm +++ b/maps/southern_cross/southern_cross_defines.dm @@ -97,6 +97,8 @@ Z_LEVEL_SURFACE_WILD ) +// Commented out due to causing a lot of bugs. The base proc plus overmap achieves this functionality anyways. +/* // Short range computers see only the six main levels, others can see the surrounding surface levels. /datum/map/southern_cross/get_map_levels(var/srcz, var/long_range = TRUE) if (long_range && (srcz in map_levels)) @@ -117,7 +119,7 @@ ) else return list(srcz) //prevents runtimes when using CMC. any Z-level not defined above will be 'isolated' and only show to GPSes/CMCs on that same Z (e.g. CentCom). - +*/ /datum/map/southern_cross/perform_map_generation() // First, place a bunch of submaps. This comes before tunnel/forest generation as to not interfere with the submap. @@ -186,19 +188,19 @@ /datum/map_z_level/southern_cross/surface z = Z_LEVEL_SURFACE name = "Plains" - flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED + flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED|MAP_LEVEL_CONSOLES base_turf = /turf/simulated/floor/outdoors/rocks /datum/map_z_level/southern_cross/surface_mine z = Z_LEVEL_SURFACE_MINE name = "Mountains" - flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED + flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED|MAP_LEVEL_CONSOLES base_turf = /turf/simulated/floor/outdoors/rocks /datum/map_z_level/southern_cross/surface_wild z = Z_LEVEL_SURFACE_WILD name = "Wilderness" - flags = MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED + flags = MAP_LEVEL_PLAYER|MAP_LEVEL_SEALED|MAP_LEVEL_CONTACT|MAP_LEVEL_CONSOLES base_turf = /turf/simulated/floor/outdoors/rocks /datum/map_z_level/southern_cross/misc diff --git a/maps/southern_cross/structures/closets/research.dm b/maps/southern_cross/structures/closets/research.dm index 00331364ef..e118515b1f 100644 --- a/maps/southern_cross/structures/closets/research.dm +++ b/maps/southern_cross/structures/closets/research.dm @@ -6,7 +6,7 @@ /obj/structure/closet/secure_closet/RD_wardrobe name = "research director's locker" req_access = list(access_rd) - closet_appearance = /decl/closet_appearance/secure_closet/rd + closet_appearance = /decl/closet_appearance/secure_closet/science/rd starts_with = list( /obj/item/clothing/under/rank/research_director, diff --git a/maps/tether/submaps/offmap/talon1.dmm b/maps/tether/submaps/offmap/talon1.dmm index ae04130a3e..1a94cb2e9a 100644 --- a/maps/tether/submaps/offmap/talon1.dmm +++ b/maps/tether/submaps/offmap/talon1.dmm @@ -8,6 +8,35 @@ "ac" = ( /turf/simulated/wall, /area/talon/deckone/bridge) +"ad" = ( +/obj/effect/floor_decal/industrial/warning/dust{ + dir = 6 + }, +/obj/effect/floor_decal/industrial/warning/dust{ + dir = 9 + }, +/obj/structure/cable/green{ + icon_state = "0-4" + }, +/obj/machinery/power/pointdefense{ + id_tag = "talon_pd" + }, +/turf/simulated/floor/hull/airless, +/area/space) +"af" = ( +/obj/structure/lattice, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/turf/space, +/area/space) +"ag" = ( +/obj/structure/lattice, +/obj/structure/cable/green{ + icon_state = "2-8" + }, +/turf/space, +/area/space) "ah" = ( /obj/effect/floor_decal/industrial/outline/grey, /obj/machinery/atmospherics/portables_connector/aux{ @@ -17,6 +46,19 @@ /obj/machinery/portable_atmospherics/canister/air/airlock, /turf/simulated/floor/tiled/eris/steel/gray_perforated, /area/talon/deckone/port_eng) +"ai" = ( +/obj/machinery/door/blast/regular/open{ + dir = 4; + id = "talon_windows" + }, +/obj/structure/lattice, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/space, +/area/space) "aj" = ( /obj/machinery/light{ dir = 8; @@ -25,10 +67,61 @@ }, /turf/simulated/floor/tiled/eris/dark/brown_perforated, /area/talon/deckone/port_eng) +"ak" = ( +/obj/machinery/door/blast/regular/open{ + dir = 4; + id = "talon_windows" + }, +/obj/structure/lattice, +/turf/space, +/area/space) +"al" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/full, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/door/firedoor/glass/talon, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plating/eris/under, +/area/talon/deckone/bridge) "am" = ( /obj/structure/catwalk, /turf/simulated/floor/plating/eris/under, /area/talon/maintenance/deckone_port) +"an" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4; + icon_state = "intact-scrubbers" + }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/eris/white/golden, +/area/talon/deckone/bridge) +"ao" = ( +/obj/structure/cable/green{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/eris/white/golden, +/area/talon/deckone/bridge) +"ap" = ( +/obj/machinery/door/blast/regular/open{ + dir = 4; + id = "talon_sensor" + }, +/obj/structure/lattice, +/turf/space, +/area/talon/maintenance/deckone_port) "aq" = ( /obj/machinery/camera/network/talon{ dir = 9; @@ -46,7 +139,7 @@ }, /turf/simulated/floor/tiled/eris/white/orangecorner, /area/talon/deckone/armory) -"aA" = ( +"as" = ( /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -60,6 +153,11 @@ pixel_x = 8; pixel_y = -26 }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, /turf/simulated/floor/tiled/eris/white/golden, /area/talon/deckone/bridge) "aC" = ( @@ -1666,13 +1764,6 @@ }, /turf/simulated/floor/tiled/steel_grid, /area/talon/deckone/central_hallway) -"nv" = ( -/obj/machinery/door/blast/regular/open{ - dir = 4; - id = "talon_sensor" - }, -/turf/space, -/area/talon/maintenance/deckone_port) "nz" = ( /obj/effect/floor_decal/industrial/warning/dust/corner{ dir = 4 @@ -4772,13 +4863,6 @@ }, /turf/simulated/floor/tiled/eris/dark/brown_perforated, /area/talon/deckone/starboard_eng) -"Qi" = ( -/obj/machinery/door/blast/regular/open{ - dir = 4; - id = "talon_windows" - }, -/turf/space, -/area/talon/deckone/bridge) "Qx" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4; @@ -14461,7 +14545,7 @@ aa aa aa aa -nv +ap Mm ey am @@ -15165,7 +15249,7 @@ aa aa aa aa -aa +ad ab ac ac @@ -15307,7 +15391,7 @@ aa aa aa aa -aa +af ab ac lS @@ -15449,7 +15533,7 @@ aa aa aa aa -aa +af ab ac FR @@ -15591,15 +15675,15 @@ aa aa aa aa -aa -Qi -IM -zy -LH -LH -LH -LH -aA +ag +ai +al +an +ao +ao +ao +ao +as ac KP Vj @@ -15734,7 +15818,7 @@ aa aa aa aa -Qi +ak IM RS on @@ -15876,7 +15960,7 @@ aa aa aa aa -Qi +ak IM wm LH diff --git a/maps/tether/submaps/offmap/talon2.dmm b/maps/tether/submaps/offmap/talon2.dmm index cf9ce577fe..33e976059a 100644 --- a/maps/tether/submaps/offmap/talon2.dmm +++ b/maps/tether/submaps/offmap/talon2.dmm @@ -13948,7 +13948,7 @@ aa aa aa aa -aa +is ab ac ac diff --git a/maps/tether/submaps/space/_guttersite.dm b/maps/tether/submaps/space/_guttersite.dm index e77038a885..655c067f26 100644 --- a/maps/tether/submaps/space/_guttersite.dm +++ b/maps/tether/submaps/space/_guttersite.dm @@ -9,7 +9,7 @@ icon_state = "guttersite" known = FALSE color = "#ee3333" //Redish, so it stands out against the other debris-like icons - initial_generic_waypoints = list("guttersite_lshuttle", "guttersite_sshuttle") + initial_generic_waypoints = list("guttersite_lshuttle", "guttersite_sshuttle", "guttersite_mshuttle") // -- Objs -- // /obj/effect/shuttle_landmark/premade/guttersite/sshuttle @@ -20,6 +20,9 @@ name = "Gutter - Large Shuttle" landmark_tag = "guttersite_lshuttle" +/obj/effect/shuttle_landmark/premade/guttersite/mshuttle + name = "Gutter - Medi Shuttle" + landmark_tag = "guttersite_mshuttle" //This does nothing right now, but is framework if we do POIs for this place /obj/away_mission_init/guttersite diff --git a/maps/tether/submaps/space/guttersite.dmm b/maps/tether/submaps/space/guttersite.dmm index 5caf17bfde..e9e6bded61 100644 --- a/maps/tether/submaps/space/guttersite.dmm +++ b/maps/tether/submaps/space/guttersite.dmm @@ -3483,7 +3483,7 @@ /turf/simulated/floor/tiled/eris/dark/gray_perforated, /area/tether_away/guttersite/docking) "hI" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden, +/obj/machinery/atmospherics/pipe/manifold4w/hidden, /turf/simulated/floor/tiled/eris/dark/gray_perforated, /area/tether_away/guttersite/docking) "hJ" = ( @@ -5628,6 +5628,149 @@ /mob/living/simple_mob/mobs_monsters/clowns/big/tunnelclown, /turf/simulated/mineral/floor/vacuum, /area/tether_away/guttersite/unexplored) +"nA" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/simulated/floor/tiled/eris/dark/gray_perforated, +/area/tether_away/guttersite/docking) +"nB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4; + icon_state = "intact-scrubbers" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5; + icon_state = "intact" + }, +/turf/simulated/floor/tiled/eris/dark/gray_perforated, +/area/tether_away/guttersite/docking) +"nC" = ( +/obj/effect/map_helper/airlock/door/int_door, +/obj/machinery/door/airlock/glass_external{ + req_one_access = list(15) + }, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/tiled/eris/dark/gray_perforated, +/area/tether_away/guttersite/docking) +"nD" = ( +/obj/machinery/access_button{ + command = "cycle_interior"; + frequency = 1990; + master_tag = "guttersite_mshuttle"; + name = "interior access button"; + pixel_x = -28; + pixel_y = -26; + req_one_access = list() + }, +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/eris/dark/gray_perforated, +/area/tether_away/guttersite/docking) +"nE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4; + icon_state = "intact-scrubbers" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled/eris/dark/gray_perforated, +/area/tether_away/guttersite/docking) +"nF" = ( +/obj/machinery/embedded_controller/radio/airlock/docking_port{ + frequency = 1990; + id_tag = "guttersite_mshuttle"; + name = "Airlock controller"; + pixel_x = -25; + pixel_y = 0 + }, +/turf/simulated/floor/tiled/eris/dark/gray_perforated, +/area/tether_away/guttersite/docking) +"nG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4; + icon_state = "intact-scrubbers" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 10; + icon_state = "intact" + }, +/turf/simulated/floor/tiled/eris/dark/gray_perforated, +/area/tether_away/guttersite/docking) +"nH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/floor/tiled/eris/dark/gray_perforated, +/area/tether_away/guttersite/docking) +"nI" = ( +/obj/effect/map_helper/airlock/atmos/chamber_pump, +/obj/machinery/atmospherics/unary/vent_pump/high_volume{ + dir = 4; + frequency = 1990; + id_tag = "guttersite_mshuttle_pump" + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled/eris/dark/gray_perforated, +/area/tether_away/guttersite/docking) +"nJ" = ( +/obj/machinery/airlock_sensor{ + frequency = 1990; + id_tag = "guttersite_mshuttle_sensor"; + pixel_x = 0; + pixel_y = -25 + }, +/obj/effect/map_helper/airlock/sensor/chamber_sensor, +/turf/simulated/floor/tiled/eris/dark/gray_perforated, +/area/tether_away/guttersite/docking) +"nK" = ( +/obj/effect/map_helper/airlock/door/ext_door, +/obj/machinery/door/airlock/glass_external{ + req_one_access = list(15) + }, +/turf/simulated/floor/tiled/eris/dark/gray_perforated, +/area/tether_away/guttersite/docking) +"nL" = ( +/obj/structure/grille, +/obj/machinery/door/firedoor/glass, +/obj/structure/window/reinforced/full, +/obj/structure/window/reinforced{ + dir = 8; + icon_state = "rwindow" + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/simulated/floor/tiled/eris/dark/gray_perforated, +/area/tether_away/guttersite/docking) +"nM" = ( +/obj/machinery/access_button{ + command = "cycle_exterior"; + frequency = 1990; + master_tag = "guttersite_mshuttle"; + name = "exterior access button"; + pixel_x = 26; + pixel_y = 26; + req_one_access = list() + }, +/turf/simulated/floor/plating/eris/under/airless, +/area/tether_away/guttersite/docking) +"nN" = ( +/obj/effect/shuttle_landmark/premade/guttersite/mshuttle, +/turf/space, +/area/space) "Ob" = ( /obj/structure/cable/cyan{ d1 = 1; @@ -21259,14 +21402,14 @@ mC lz hx hI -hO +nB fr -mG -eE -eE -eE -eE -eE +gu +iP +iP +iP +iP +nL eE eE eE @@ -21401,16 +21544,16 @@ mC fr hy hJ -hO +nE fr -mG -eE -eE -eE -eE -eE -eE +mL +gu +nI +nF +nK +nM eE +nN eE eE eE @@ -21540,17 +21683,17 @@ eE eE eE mC -fr +nA hz hJ -hO -fr -mG -eE -eE -eE -eE -eE +nG +nH +nD +nC +hM +nJ +gu +QN eE eE eE @@ -21682,17 +21825,17 @@ eE eE eE mC -fr +nA hA hJ hO fr -mG -eE -eE -eE -eE -eE +gu +iO +iO +iO +iO +nL eE eE eE diff --git a/maps/tether/submaps/tether_misc.dmm b/maps/tether/submaps/tether_misc.dmm index a3b97d1337..4ec9ca9d3a 100644 --- a/maps/tether/submaps/tether_misc.dmm +++ b/maps/tether/submaps/tether_misc.dmm @@ -783,6 +783,10 @@ /turf/space, /turf/space/transit/north, /area/space) +"cm" = ( +/obj/item/toy/chess/pawn_white, +/turf/simulated/floor/holofloor/wmarble, +/area/holodeck/source_chess) "cs" = ( /obj/machinery/door/airlock/glass_external{ frequency = 1380; @@ -1301,6 +1305,10 @@ /obj/effect/overlay/coconut, /turf/simulated/floor/holofloor/beach/sand, /area/holodeck/source_beach) +"eD" = ( +/obj/effect/floor_decal/sign/small_4, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) "eJ" = ( /obj/structure/flora/tree/dead, /turf/simulated/floor/holofloor/snow, @@ -1892,6 +1900,10 @@ /obj/machinery/telecomms/server/presets/centcomm, /turf/unsimulated/floor/steel, /area/centcom/control) +"kw" = ( +/obj/effect/floor_decal/sign/small_5, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) "le" = ( /obj/effect/floor_decal/transit/orange{ dir = 4 @@ -1916,14 +1928,33 @@ icon_state = "techfloor_grid" }, /area/space) +"nj" = ( +/obj/item/toy/chess/rook_white, +/turf/simulated/floor/holofloor/wmarble, +/area/holodeck/source_chess) +"nV" = ( +/obj/item/toy/chess/rook_black, +/turf/simulated/floor/holofloor/wmarble, +/area/holodeck/source_chess) +"nW" = ( +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) "oI" = ( /obj/effect/step_trigger/teleporter/planetary_fall/virgo3b, /turf/space/transit/east, /area/space) +"oT" = ( +/obj/item/toy/chess/pawn_black, +/turf/simulated/floor/holofloor/wmarble, +/area/holodeck/source_chess) "pb" = ( /obj/machinery/telecomms/processor/preset_cent, /turf/unsimulated/floor/steel, /area/centcom/control) +"pf" = ( +/obj/effect/floor_decal/sign/small_8, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) "pu" = ( /obj/effect/floor_decal/transit/orange{ dir = 4 @@ -1946,9 +1977,16 @@ }, /turf/space/transit/east, /area/space) +"pT" = ( +/turf/simulated/floor/holofloor/bmarble, +/area/holodeck/source_chess) "qn" = ( /turf/space/transit/east, /area/space) +"qv" = ( +/obj/effect/floor_decal/sign/small_h, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) "qz" = ( /turf/space, /turf/space/internal_edge/bottomright, @@ -1963,10 +2001,22 @@ icon_state = "techfloor_grid" }, /area/space) +"qV" = ( +/obj/effect/floor_decal/sign/small_6, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) +"ru" = ( +/obj/item/toy/chess/pawn_black, +/turf/simulated/floor/holofloor/bmarble, +/area/holodeck/source_chess) "rE" = ( /obj/machinery/telecomms/bus/preset_cent, /turf/unsimulated/floor/steel, /area/centcom/control) +"sb" = ( +/obj/item/toy/chess/knight_white, +/turf/simulated/floor/holofloor/wmarble, +/area/holodeck/source_chess) "sl" = ( /turf/space/internal_edge/top, /area/space) @@ -2040,6 +2090,10 @@ icon_state = "dark" }, /area/centcom/suppy) +"uM" = ( +/obj/item/toy/chess/knight_black, +/turf/simulated/floor/holofloor/wmarble, +/area/holodeck/source_chess) "vi" = ( /obj/effect/step_trigger/thrower{ affect_ghosts = 1; @@ -2074,10 +2128,22 @@ icon_state = "techfloor_grid" }, /area/space) +"vW" = ( +/obj/effect/floor_decal/sign/small_a, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) +"wa" = ( +/obj/effect/floor_decal/sign/small_3, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) "wd" = ( /obj/structure/sign/warning/nosmoking_2, /turf/unsimulated/wall, /area/centcom/simulated/terminal) +"wh" = ( +/obj/item/toy/chess/knight_black, +/turf/simulated/floor/holofloor/bmarble, +/area/holodeck/source_chess) "wj" = ( /turf/space/internal_edge/left, /area/space) @@ -2215,6 +2281,10 @@ "Az" = ( /turf/unsimulated/beach/coastline, /area/beach) +"Bm" = ( +/obj/item/toy/chess/bishop_black, +/turf/simulated/floor/holofloor/bmarble, +/area/holodeck/source_chess) "Bw" = ( /turf/unsimulated/beach/water, /area/beach) @@ -2222,6 +2292,10 @@ /obj/effect/overlay/palmtree_r, /turf/unsimulated/beach/sand, /area/beach) +"BG" = ( +/obj/item/toy/chess/king_black, +/turf/simulated/floor/holofloor/wmarble, +/area/holodeck/source_chess) "BK" = ( /turf/space, /turf/space/internal_edge/bottomleft, @@ -2243,6 +2317,17 @@ }, /turf/simulated/floor/tiled/steel, /area/centcom/simulated/main_hall) +"CJ" = ( +/obj/item/toy/chess/pawn_white, +/turf/simulated/floor/holofloor/bmarble, +/area/holodeck/source_chess) +"CK" = ( +/turf/simulated/floor/holofloor/wmarble, +/area/holodeck/source_chess) +"Di" = ( +/obj/effect/floor_decal/sign/small_2, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) "Dk" = ( /obj/effect/floor_decal/industrial/warning{ dir = 8 @@ -2258,12 +2343,24 @@ /turf/space, /turf/space/internal_edge/topright, /area/space) +"DL" = ( +/obj/effect/floor_decal/sign/small_b, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) "El" = ( /turf/space/transit/west, /area/space) +"Eo" = ( +/obj/effect/floor_decal/sign/small_g, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) "ET" = ( /turf/simulated/floor/tiled/techfloor/grid, /area/centcom/simulated/terminal) +"EX" = ( +/obj/item/toy/chess/bishop_black, +/turf/simulated/floor/holofloor/wmarble, +/area/holodeck/source_chess) "Fa" = ( /obj/structure/table/standard, /turf/unsimulated/beach/sand, @@ -2328,6 +2425,10 @@ /obj/effect/overlay/palmtree_l, /turf/unsimulated/beach/sand, /area/beach) +"GW" = ( +/obj/item/toy/chess/king_white, +/turf/simulated/floor/holofloor/bmarble, +/area/holodeck/source_chess) "Hf" = ( /obj/effect/shuttle_landmark/transit{ base_area = /area/space; @@ -2337,12 +2438,24 @@ }, /turf/space/transit/north, /area/space) +"Hk" = ( +/obj/effect/floor_decal/sign/small_7, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) +"Hr" = ( +/obj/item/toy/chess/rook_black, +/turf/simulated/floor/holofloor/bmarble, +/area/holodeck/source_chess) "Hy" = ( /turf/unsimulated/mineral{ icon = 'icons/turf/transit_vr.dmi'; icon_state = "rock" }, /area/space) +"HL" = ( +/obj/effect/floor_decal/sign/small_1, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) "HQ" = ( /obj/machinery/telecomms/broadcaster/preset_cent, /turf/unsimulated/floor/steel, @@ -2398,6 +2511,10 @@ }, /turf/simulated/sky/virgo3b/south, /area/space) +"Jc" = ( +/obj/item/toy/chess/bishop_white, +/turf/simulated/floor/holofloor/bmarble, +/area/holodeck/source_chess) "Jx" = ( /obj/effect/floor_decal/corner_steel_grid/diagonal, /obj/effect/floor_decal/corner_steel_grid/diagonal{ @@ -2421,6 +2538,10 @@ }, /turf/space/transit/north, /area/space) +"JI" = ( +/obj/item/toy/chess/rook_white, +/turf/simulated/floor/holofloor/bmarble, +/area/holodeck/source_chess) "JL" = ( /obj/effect/step_trigger/thrower{ affect_ghosts = 1; @@ -2465,6 +2586,14 @@ }, /turf/simulated/sky/virgo3b/south, /area/space) +"Kn" = ( +/obj/effect/floor_decal/sign/small_d, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) +"KQ" = ( +/obj/effect/floor_decal/sign/small_f, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) "Lg" = ( /obj/effect/floor_decal/industrial/warning{ icon_state = "warning"; @@ -2485,6 +2614,10 @@ icon_state = "rock" }, /area/space) +"Mi" = ( +/obj/item/toy/chess/bishop_white, +/turf/simulated/floor/holofloor/wmarble, +/area/holodeck/source_chess) "ME" = ( /obj/machinery/computer/rdservercontrol{ name = "Master R&D Server Controller"; @@ -2543,6 +2676,10 @@ }, /turf/simulated/sky/virgo3b/south, /area/space) +"Or" = ( +/obj/item/toy/chess/knight_white, +/turf/simulated/floor/holofloor/bmarble, +/area/holodeck/source_chess) "OR" = ( /turf/simulated/shuttle/wall, /area/shuttle/escape) @@ -2599,6 +2736,10 @@ color = "#cccccc" }, /area/shuttle/escape) +"Qs" = ( +/obj/item/toy/chess/queen_black, +/turf/simulated/floor/holofloor/bmarble, +/area/holodeck/source_chess) "QW" = ( /turf/simulated/shuttle/floor/white{ color = "#cccccc" @@ -3835,6 +3976,10 @@ /obj/item/weapon/reagent_containers/food/snacks/fries, /turf/simulated/floor/wood, /area/centcom/simulated/restaurant) +"Wf" = ( +/obj/item/toy/chess/queen_white, +/turf/simulated/floor/holofloor/wmarble, +/area/holodeck/source_chess) "Wh" = ( /obj/effect/floor_decal/industrial/warning/dust{ dir = 1 @@ -4624,6 +4769,10 @@ }, /turf/simulated/floor/tiled/white, /area/centcom/simulated/medical) +"YX" = ( +/obj/effect/floor_decal/sign/small_e, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) "YY" = ( /obj/machinery/bodyscanner{ dir = 8 @@ -4831,6 +4980,10 @@ /obj/machinery/light, /turf/simulated/floor/wood, /area/centcom/simulated/restaurant) +"ZQ" = ( +/obj/effect/floor_decal/sign/small_c, +/turf/simulated/floor/holofloor/wood, +/area/holodeck/source_chess) (1,1,1) = {" ap @@ -12075,18 +12228,18 @@ ap ap "} (52,1,1) = {" -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap +ar +aI +aI +aI +aI +aI +aI +aI +aI +aI +aI +ar ap ap ap @@ -12217,18 +12370,18 @@ ap ap "} (53,1,1) = {" -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap +as +nW +pf +Hk +qV +kw +eD +wa +Di +HL +nW +fZ ap ap ap @@ -12359,18 +12512,18 @@ ap ap "} (54,1,1) = {" -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap +as +nW +nV +ru +CK +pT +CK +pT +cm +JI +vW +fZ ap ap ap @@ -12501,18 +12654,18 @@ iO iO "} (55,1,1) = {" -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap +as +nW +wh +oT +pT +CK +pT +CK +CJ +sb +DL +fZ ap ap ap @@ -12643,18 +12796,18 @@ El iO "} (56,1,1) = {" -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap +as +nW +EX +ru +CK +pT +CK +pT +cm +Jc +ZQ +fZ ap ap ap @@ -12785,18 +12938,18 @@ El iO "} (57,1,1) = {" -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap +as +nW +Qs +oT +pT +CK +pT +CK +CJ +Wf +Kn +fZ ap ap ap @@ -12927,18 +13080,18 @@ El iO "} (58,1,1) = {" -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap +as +nW +BG +ru +CK +pT +CK +pT +cm +GW +YX +fZ ap ap ap @@ -13069,18 +13222,18 @@ El iO "} (59,1,1) = {" -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap +as +nW +Bm +oT +pT +CK +pT +CK +CJ +Mi +KQ +fZ ap ap ap @@ -13211,18 +13364,18 @@ El iO "} (60,1,1) = {" -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap +as +nW +uM +ru +CK +pT +CK +pT +cm +Or +Eo +fZ ap ap ap @@ -13353,18 +13506,18 @@ El iO "} (61,1,1) = {" -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap +as +nW +Hr +oT +pT +CK +pT +CK +CJ +nj +qv +fZ ap ap ap @@ -13495,18 +13648,18 @@ El iO "} (62,1,1) = {" -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap -ap +as +nW +nW +nW +nW +nW +nW +nW +nW +nW +nW +fZ ap ap ap @@ -13638,16 +13791,16 @@ iO "} (63,1,1) = {" ar -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI +aL +aL +aL +aL +aL +aL +aL +aL +aL +aL ar aI aI diff --git a/vorestation.dme b/vorestation.dme index 5aff5877b3..098f6c4222 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -849,7 +849,8 @@ #include "code\game\machinery\transportpod.dm" #include "code\game\machinery\turret_control.dm" #include "code\game\machinery\vending.dm" -#include "code\game\machinery\vending_vr.dm" +#include "code\game\machinery\vending_machines.dm" +#include "code\game\machinery\vending_machines_vr.dm" #include "code\game\machinery\vending_yw.dm" #include "code\game\machinery\vitals_monitor.dm" #include "code\game\machinery\wall_frames.dm" @@ -950,10 +951,12 @@ #include "code\game\mecha\mech_prosthetics.dm" #include "code\game\mecha\mech_sensor.dm" #include "code\game\mecha\mecha.dm" +#include "code\game\mecha\mecha_actions.dm" #include "code\game\mecha\mecha_construction_paths.dm" #include "code\game\mecha\mecha_control_console.dm" #include "code\game\mecha\mecha_helpers.dm" #include "code\game\mecha\mecha_parts.dm" +#include "code\game\mecha\mecha_vr.dm" #include "code\game\mecha\mecha_wreckage.dm" #include "code\game\mecha\combat\combat.dm" #include "code\game\mecha\combat\durand.dm" @@ -1011,6 +1014,7 @@ #include "code\game\mecha\equipment\weapons\fire\incendiary.dm" #include "code\game\mecha\medical\medical.dm" #include "code\game\mecha\medical\odysseus.dm" +#include "code\game\mecha\medical\odysseus_vr.dm" #include "code\game\mecha\micro\mecha_construction_paths_vr.dm" #include "code\game\mecha\micro\mecha_parts_vr.dm" #include "code\game\mecha\micro\mecha_vr.dm" @@ -1022,6 +1026,7 @@ #include "code\game\mecha\space\hoverpod.dm" #include "code\game\mecha\space\shuttle.dm" #include "code\game\mecha\working\ripley.dm" +#include "code\game\mecha\working\ripley_vr.dm" #include "code\game\mecha\working\working.dm" #include "code\game\objects\banners.dm" #include "code\game\objects\banners_vr.dm" @@ -1092,6 +1097,7 @@ #include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" #include "code\game\objects\items\antag_spawners.dm" #include "code\game\objects\items\apc_frame.dm" +#include "code\game\objects\items\balls_vr.dm" #include "code\game\objects\items\bells.dm" #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\bodybag.dm" @@ -1374,6 +1380,7 @@ #include "code\game\objects\random\guns_and_ammo.dm" #include "code\game\objects\random\maintenance.dm" #include "code\game\objects\random\mapping.dm" +#include "code\game\objects\random\mechs.dm" #include "code\game\objects\random\misc.dm" #include "code\game\objects\random\misc_vr.dm" #include "code\game\objects\random\mob.dm" @@ -1817,6 +1824,7 @@ #include "code\modules\client\preference_setup\loadout\loadout_fluffitems_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout_fluffitems_yw.dm" #include "code\modules\client\preference_setup\loadout\loadout_general.dm" +#include "code\modules\client\preference_setup\loadout\loadout_general_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout_gloves.dm" #include "code\modules\client\preference_setup\loadout\loadout_gloves_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout_head.dm" @@ -1952,6 +1960,7 @@ #include "code\modules\clothing\spacesuits\void\merc.dm" #include "code\modules\clothing\spacesuits\void\military_vr.dm" #include "code\modules\clothing\spacesuits\void\station.dm" +#include "code\modules\clothing\spacesuits\void\station_vr.dm" #include "code\modules\clothing\spacesuits\void\void.dm" #include "code\modules\clothing\spacesuits\void\void_vr.dm" #include "code\modules\clothing\spacesuits\void\wizard.dm" @@ -2531,6 +2540,7 @@ #include "code\modules\mob\living\carbon\human\emote_vr.dm" #include "code\modules\mob\living\carbon\human\examine.dm" #include "code\modules\mob\living\carbon\human\examine_vr.dm" +#include "code\modules\mob\living\carbon\human\gradient.dm" #include "code\modules\mob\living\carbon\human\human.dm" #include "code\modules\mob\living\carbon\human\human_attackhand.dm" #include "code\modules\mob\living\carbon\human\human_attackhand_vr.dm" @@ -3045,6 +3055,7 @@ #include "code\modules\organs\subtypes\shadekin.dm" #include "code\modules\organs\subtypes\shadekin_vr.dm" #include "code\modules\organs\subtypes\slime.dm" +#include "code\modules\organs\subtypes\slime_vr.dm" #include "code\modules\organs\subtypes\standard.dm" #include "code\modules\organs\subtypes\standard_vr.dm" #include "code\modules\organs\subtypes\unathi.dm"