diff --git a/.github/workflows/autochangelog.yml b/.github/workflows/autochangelog.yml index 7732426718..7953929ce5 100644 --- a/.github/workflows/autochangelog.yml +++ b/.github/workflows/autochangelog.yml @@ -1,6 +1,6 @@ name: Autochangelog on: - pull_request: + pull_request_target: types: closed branches: - master @@ -15,6 +15,10 @@ jobs: if: github.event.pull_request.merged == true steps: - uses: /actions/checkout@v2 + with: + ref: master + - name: Update repository to master + run: git pull "origin" master - name: Ensure +x on CI directory run: | chmod -R +x ./tools/ci diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f6e206bc33..13022f96fd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,7 +41,7 @@ jobs: run: | sudo dpkg --add-architecture i386 sudo apt update || true - sudo apt install libc6:i386 libgcc1:i386 libstdc++6:i386 libssl1.0.0:i386 g++-7 g++-7-multilib gcc-multilib zlib1g:i386 + sudo apt install libc6:i386 libgcc1:i386 libstdc++6:i386 libssl1.0.0:i386 zlib1g:i386 ldd librust_g.so - name: Unit Tests run: | diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index be7f905a77..a3a368852f 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -96,15 +96,6 @@ "You hear a ratchet.") deconstruct() -/obj/machinery/atmospherics/omni/can_unwrench() - var/int_pressure = 0 - for(var/datum/omni_port/P in ports) - int_pressure += P.air.return_pressure() - var/datum/gas_mixture/env_air = loc.return_air() - if((int_pressure - env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - return 0 - return 1 - /obj/machinery/atmospherics/omni/attack_hand(user as mob) if(..()) return diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index c87b9942df..db1a71c77a 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -61,4 +61,8 @@ #define INFECTION_LEVEL_ONE 100 #define INFECTION_LEVEL_TWO 500 #define INFECTION_LEVEL_THREE 1000 -#define INFECTION_LEVEL_MAX 1500 \ No newline at end of file +#define INFECTION_LEVEL_MAX 1500 + +#define MODULAR_BODYPART_INVALID 0 // Cannot be detached or reattached. +#define MODULAR_BODYPART_PROSTHETIC 1 // Can be detached or reattached freely. +#define MODULAR_BODYPART_CYBERNETIC 2 // Can be detached or reattached to compatible parent organs. diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index a7b3bd86f8..f9ce5a1b7f 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -159,6 +159,14 @@ #define MAT_CHITIN "chitin" #define MAT_CLOTH "cloth" #define MAT_SYNCLOTH "syncloth" +#define MAT_COPPER "copper" +#define MAT_QUARTZ "quartz" +#define MAT_TIN "tin" +#define MAT_VOPAL "void opal" +#define MAT_ALUMINIUM "aluminium" +#define MAT_BRONZE "bronze" +#define MAT_PAINITE "painite" +#define MAT_BOROSILICATE "borosilicate glass" #define SHARD_SHARD "shard" #define SHARD_SHRAPNEL "shrapnel" diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index f6ca0ea565..3239e8fa1a 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -24,6 +24,30 @@ #define EMP_TOX_DMG 0x80 // EMPs inflict toxin damage #define EMP_OXY_DMG 0x100 // EMPs inflict oxy damage +// Species allergens +#define MEAT 0x1 // Skrell won't like this. +#define FISH 0x2 // Seperate for completion's sake. Still bad for skrell. +#define FRUIT 0x4 // An apple a day only keeps the doctor away if they're allergic. +#define VEGETABLE 0x8 // Taters 'n' carrots. Potato allergy is a thing, apparently. +#define GRAINS 0x10 // Wheat, oats, etc. +#define BEANS 0x20 // The musical fruit! Includes soy. +#define SEEDS 0x40 // Hope you don't have a nut allergy. +#define DAIRY 0x80 // Lactose intolerance, ho! Also bad for skrell. +#define FUNGI 0x100 // Delicious shrooms. +#define COFFEE 0x200 // Mostly here for tajara. +#define GENERIC 0x400 // Catchall for stuff that doesn't fall into the groups above. You shouldn't be allergic to this type, ever. +#define SUGARS 0x800 // For unathi-like reactions +#define EGGS 0x1000 // For Skrell eggs allergy + +// Allergen reactions +#define AG_TOX_DMG 0x1 // the classic +#define AG_OXY_DMG 0x2 // intense airway reactions +#define AG_EMOTE 0x4 // general emote reactions based on affect type +#define AG_PAIN 0x8 // short-lived hurt +#define AG_WEAKEN 0x10 // too weak to move, oof +#define AG_BLURRY 0x20 // blurred vision! +#define AG_SLEEPY 0x40 // fatigue/exhaustion + // Species spawn flags #define SPECIES_IS_WHITELISTED 0x1 // Must be whitelisted to play. #define SPECIES_IS_RESTRICTED 0x2 // Is not a core/normally playable species. (castes, mutantraces) diff --git a/code/_helpers/_global_objects.dm b/code/_helpers/_global_objects.dm index 4cbbcf3314..adbd2785e8 100644 --- a/code/_helpers/_global_objects.dm +++ b/code/_helpers/_global_objects.dm @@ -1 +1,2 @@ -var/datum/gear_tweak/color/gear_tweak_free_color_choice = new() \ No newline at end of file +var/datum/gear_tweak/color/gear_tweak_free_color_choice = new() +var/datum/gear_tweak/implant_location/gear_tweak_implant_location = new() \ No newline at end of file diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 855decff39..4f95bfcf7d 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -43,6 +43,11 @@ var/global/list/facial_hair_styles_male_list = list() var/global/list/facial_hair_styles_female_list = list() var/global/list/skin_styles_female_list = list() //unused var/global/list/body_marking_styles_list = list() //stores /datum/sprite_accessory/marking indexed by name +var/global/list/ear_styles_list = list() // Stores /datum/sprite_accessory/ears indexed by type +var/global/list/tail_styles_list = list() // Stores /datum/sprite_accessory/tail indexed by type +var/global/list/wing_styles_list = list() // Stores /datum/sprite_accessory/wing indexed by type + +GLOBAL_LIST(custom_species_bases) //Underwear var/datum/category_collection/underwear/global_underwear = new() @@ -94,13 +99,13 @@ var/global/list/string_slot_flags = list( "holster" = SLOT_HOLSTER ) -/proc/get_mannequin(var/ckey) - if(!mannequins_) - mannequins_ = new() - . = mannequins_[ckey] - if(!.) - . = new/mob/living/carbon/human/dummy/mannequin() - mannequins_[ckey] = . +GLOBAL_LIST_EMPTY(mannequins) +/proc/get_mannequin(var/ckey = "NULL") + var/mob/living/carbon/human/dummy/mannequin/M = GLOB.mannequins[ckey] + if(!istype(M)) + GLOB.mannequins[ckey] = new /mob/living/carbon/human/dummy/mannequin(null) + M = GLOB.mannequins[ckey] + return M ////////////////////////// /////Initial Building///// @@ -214,6 +219,23 @@ var/global/list/string_slot_flags = list( var/decl/closet_appearance/app = new T() GLOB.closet_appearances[T] = app + paths = typesof(/datum/sprite_accessory/ears) - /datum/sprite_accessory/ears + for(var/path in paths) + var/obj/item/clothing/head/instance = new path() + ear_styles_list[path] = instance + + // Custom Tails + paths = typesof(/datum/sprite_accessory/tail) - /datum/sprite_accessory/tail - /datum/sprite_accessory/tail/taur + for(var/path in paths) + var/datum/sprite_accessory/tail/instance = new path() + tail_styles_list[path] = instance + + // Custom Wings + paths = typesof(/datum/sprite_accessory/wing) - /datum/sprite_accessory/wing + for(var/path in paths) + var/datum/sprite_accessory/wing/instance = new path() + wing_styles_list[path] = instance + // VOREStation Add - Vore Modes! paths = typesof(/datum/digest_mode) for(var/T in paths) @@ -221,6 +243,41 @@ var/global/list/string_slot_flags = list( GLOB.digest_modes[DM.id] = DM // VOREStation Add End +/* + // Custom species traits + paths = typesof(/datum/trait) - /datum/trait + for(var/path in paths) + var/datum/trait/instance = new path() + if(!instance.name) + continue //A prototype or something + var/cost = instance.cost + traits_costs[path] = cost + all_traits[path] = instance + switch(cost) + if(-INFINITY to -0.1) + negative_traits[path] = instance + if(0) + neutral_traits[path] = instance + if(0.1 to INFINITY) + positive_traits[path] = instance +*/ + + // Custom species icon bases + var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //VOREStation Edit + var/list/whitelisted_icons = list(SPECIES_FENNEC,SPECIES_XENOHYBRID) //VOREStation Edit + for(var/species_name in GLOB.playable_species) + if(species_name in blacklisted_icons) + continue + var/datum/species/S = GLOB.all_species[species_name] + if(S.spawn_flags & SPECIES_IS_WHITELISTED) + continue + GLOB.custom_species_bases += species_name + for(var/species_name in whitelisted_icons) + GLOB.custom_species_bases += species_name + + return 1 // Hooks must return 1 + + return 1 /* // Uncomment to debug chemical reaction list. diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index f0787cec29..dd75d8a62e 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -2,10 +2,7 @@ * VOREStation global lists */ -var/global/list/ear_styles_list = list() // Stores /datum/sprite_accessory/ears indexed by type var/global/list/hair_accesories_list= list()// Stores /datum/sprite_accessory/hair_accessory indexed by type -var/global/list/tail_styles_list = list() // Stores /datum/sprite_accessory/tail indexed by type -var/global/list/wing_styles_list = list() // Stores /datum/sprite_accessory/wing indexed by type var/global/list/negative_traits = list() // Negative custom species traits, indexed by path var/global/list/neutral_traits = list() // Neutral custom species traits, indexed by path var/global/list/everyone_traits = list() // Neutral traits available to all species, indexed by path @@ -16,8 +13,6 @@ var/global/list/active_ghost_pods = list() var/global/list/sensorpreflist = list("Off", "Binary", "Vitals", "Tracking", "No Preference") //TFF 5/8/19 - Suit Sensors global list -var/global/list/custom_species_bases = list() // Species that can be used for a Custom Species icon base - //stores numeric player size options indexed by name var/global/list/player_sizes_list = list( "Macro" = RESIZE_HUGE, @@ -481,24 +476,6 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, /hook/startup/proc/init_vore_datum_ref_lists() var/paths - // Custom Ears - paths = typesof(/datum/sprite_accessory/ears) - /datum/sprite_accessory/ears - for(var/path in paths) - var/obj/item/clothing/head/instance = new path() - ear_styles_list[path] = instance - - // Custom Tails - paths = typesof(/datum/sprite_accessory/tail) - /datum/sprite_accessory/tail - /datum/sprite_accessory/tail/taur - for(var/path in paths) - var/datum/sprite_accessory/tail/instance = new path() - tail_styles_list[path] = instance - - // Custom Wings - paths = typesof(/datum/sprite_accessory/wing) - /datum/sprite_accessory/wing - for(var/path in paths) - var/datum/sprite_accessory/wing/instance = new path() - wing_styles_list[path] = instance - // Custom Hair Accessories paths = typesof(/datum/sprite_accessory/hair_accessory) - /datum/sprite_accessory/hair_accessory for(var/path in paths) @@ -524,17 +501,22 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, if(0.1 to INFINITY) positive_traits[path] = instance - // Custom species icon bases - var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //Just ones that won't work well. - var/list/whitelisted_icons = list(SPECIES_FENNEC,SPECIES_XENOHYBRID) //Include these anyway - for(var/species_name in GLOB.playable_species) - if(species_name in blacklisted_icons) - continue - var/datum/species/S = GLOB.all_species[species_name] - if(S.spawn_flags & SPECIES_IS_WHITELISTED) - continue - custom_species_bases += species_name - for(var/species_name in whitelisted_icons) - custom_species_bases += species_name + // Weaver recipe stuff + paths = typesof(/datum/weaver_recipe/structure) - /datum/weaver_recipe/structure + for(var/path in paths) + var/datum/weaver_recipe/instance = new path() + if(!instance.title) + continue //A prototype or something + weavable_structures[instance.title] = instance + + paths = typesof(/datum/weaver_recipe/item) - /datum/weaver_recipe/item + for(var/path in paths) + var/datum/weaver_recipe/instance = new path() + if(!instance.title) + continue //A prototype or something + weavable_items[instance.title] = instance return 1 // Hooks must return 1 + +var/global/list/weavable_structures = list() +var/global/list/weavable_items = list() \ No newline at end of file diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 10fcc662f1..6a8e6482ec 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1284,6 +1284,10 @@ var/list/WALLITEMS = list( colour += temp_col return colour +/proc/color_square(red, green, blue, hex) + var/color = hex ? hex : "#[num2hex(red, 2)][num2hex(green, 2)][num2hex(blue, 2)]" + return "___" + var/mob/dview/dview_mob = new //Version of view() which ignores darkness, because BYOND doesn't have it. diff --git a/code/_helpers/view.dm b/code/_helpers/view.dm index 13ee837caa..be60a56697 100644 --- a/code/_helpers/view.dm +++ b/code/_helpers/view.dm @@ -10,3 +10,7 @@ viewX = text2num(viewrangelist[1]) viewY = text2num(viewrangelist[2]) return list(viewX, viewY) + +// Used to get `atom/O as obj|mob|turf in view()` to match against strings containing apostrophes immediately after substrings that match to other objects. Somehow. - Ater +/proc/_validate_atom(atom/A) + return view() \ No newline at end of file diff --git a/code/_macros.dm b/code/_macros.dm index 4796f93b47..33bdf30ceb 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -37,4 +37,7 @@ #define random_id(key,min_id,max_id) uniqueness_repository.Generate(/datum/uniqueness_generator/id_random, key, min_id, max_id) -#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") } \ No newline at end of file +#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") } + +#define isitem(A) istype(A, /obj/item) +#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur) diff --git a/code/_macros_vr.dm b/code/_macros_vr.dm index 6a2134fb71..2eecbe69ed 100644 --- a/code/_macros_vr.dm +++ b/code/_macros_vr.dm @@ -1,3 +1 @@ #define isbelly(A) istype(A, /obj/belly) -#define isitem(A) istype(A, /obj/item) -#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index d63d49e8d7..213fe57b90 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -60,6 +60,8 @@ // Cyborgs have no range-checking unless there is item use if(!W) + if(bolt && !bolt.malfunction && A.loc != module) + return A.add_hiddenprint(src) A.attack_robot(src) return @@ -120,35 +122,56 @@ /atom/proc/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden CtrlShiftClick(user) -/obj/machinery/door/airlock/BorgCtrlShiftClick(mob/user) +/obj/machinery/door/airlock/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) + if(user.bolt && !user.bolt.malfunction) + return + AICtrlShiftClick(user) /atom/proc/BorgShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden ShiftClick(user) -/obj/machinery/door/airlock/BorgShiftClick(mob/user) // Opens and closes doors! Forwards to AI code. +/obj/machinery/door/airlock/BorgShiftClick(var/mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code. + if(user.bolt && !user.bolt.malfunction) + return + AIShiftClick(user) /atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden CtrlClick(user) -/obj/machinery/door/airlock/BorgCtrlClick(mob/user) // Bolts doors. Forwards to AI code. +/obj/machinery/door/airlock/BorgCtrlClick(var/mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code. + if(user.bolt && !user.bolt.malfunction) + return + AICtrlClick(user) -/obj/machinery/power/apc/BorgCtrlClick(mob/user) // turns off/on APCs. Forwards to AI code. +/obj/machinery/power/apc/BorgCtrlClick(var/mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code. + if(user.bolt && !user.bolt.malfunction) + return + AICtrlClick(user) -/obj/machinery/turretid/BorgCtrlClick(mob/user) //turret control on/off. Forwards to AI code. +/obj/machinery/turretid/BorgCtrlClick(var/mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code. + if(user.bolt && !user.bolt.malfunction) + return + AICtrlClick(user) /atom/proc/BorgAltClick(var/mob/living/silicon/robot/user) AltClick(user) return -/obj/machinery/door/airlock/BorgAltClick(mob/user) // Eletrifies doors. Forwards to AI code. +/obj/machinery/door/airlock/BorgAltClick(var/mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code. + if(user.bolt && !user.bolt.malfunction) + return + AIAltClick(user) -/obj/machinery/turretid/BorgAltClick(mob/user) //turret lethal on/off. Forwards to AI code. +/obj/machinery/turretid/BorgAltClick(var/mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code. + if(user.bolt && !user.bolt.malfunction) + return + AIAltClick(user) /* diff --git a/code/controllers/subsystems/overlays.dm b/code/controllers/subsystems/overlays.dm index 60b08c71d2..77c9d3ab94 100644 --- a/code/controllers/subsystems/overlays.dm +++ b/code/controllers/subsystems/overlays.dm @@ -5,7 +5,6 @@ SUBSYSTEM_DEF(overlays) priority = FIRE_PRIORITY_OVERLAYS init_order = INIT_ORDER_OVERLAY - var/initialized = FALSE var/list/queue // Queue of atoms needing overlay compiling (TODO-VERIFY!) var/list/stats var/list/overlay_icon_state_caches // Cache thing @@ -22,7 +21,6 @@ var/global/image/appearance_bro = new() // Temporarily super-global because of B stats = list() /datum/controller/subsystem/overlays/Initialize() - initialized = TRUE fire(mc_check = FALSE) ..() diff --git a/code/controllers/subsystems/processing/chemistry.dm b/code/controllers/subsystems/processing/chemistry.dm index 7f4fd9c42b..b4641ba7e0 100644 --- a/code/controllers/subsystems/processing/chemistry.dm +++ b/code/controllers/subsystems/processing/chemistry.dm @@ -22,6 +22,7 @@ PROCESSING_SUBSYSTEM_DEF(chemistry) /datum/controller/subsystem/processing/chemistry/Initialize() initialize_chemical_reactions() initialize_chemical_reagents() + ..() //Chemical Reactions - Initialises all /datum/chemical_reaction into a list // It is filtered into multiple lists within a list. diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 0c626ec041..750f6807cc 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -183,11 +183,6 @@ var/global/datum/controller/subsystem/ticker/ticker if(adm["total"] == 0) send2adminirc("A round has started with no admins online.") -/* supply_controller.process() //Start the supply shuttle regenerating points -- TLE // handled in scheduler - master_controller.process() //Start master_controller.process() - lighting_controller.process() //Start processing DynamicAreaLighting updates - */ - current_state = GAME_STATE_PLAYING Master.SetRunLevel(RUNLEVEL_GAME) diff --git a/code/datums/autolathe/arms.dm b/code/datums/autolathe/arms.dm index 169232d845..b2bb0c98b7 100644 --- a/code/datums/autolathe/arms.dm +++ b/code/datums/autolathe/arms.dm @@ -326,6 +326,15 @@ category = list("Arms and Ammunition") hidden = 1*/ +/* + * High Caliber + */ + +/datum/category_item/autolathe/arms/rifle_145 + name = "14.5mm round (sabot)" + path = /obj/item/ammo_casing/a145/highvel + hidden = 1 + /////////////////////////////// /*Ammo clips and Speedloaders*/ /////////////////////////////// diff --git a/code/datums/autolathe/autolathe.dm b/code/datums/autolathe/autolathe.dm index 4af1abfccd..03d1ca0fdd 100644 --- a/code/datums/autolathe/autolathe.dm +++ b/code/datums/autolathe/autolathe.dm @@ -1,6 +1,13 @@ /datum/category_item/autolathe/New() ..() - var/obj/item/I = new path() + var/obj/item/I + if(path) + I = new path() + + if(!I) // Something has gone horribly wrong, or right. + log_debug("[name] created an Autolathe design without an assigned path. This is expected for only the Material Sheet generation.") + return + if(I.matter && !resources) resources = list() for(var/material in I.matter) @@ -57,6 +64,42 @@ name = "Tools" category_item_type = /datum/category_item/autolathe/tools +/datum/category_group/autolathe/materials + name = "Materials" + category_item_type = /datum/category_item/autolathe/materials + +/datum/category_group/autolathe/materials/New() + ..() + + for(var/Name in name_to_material) + var/datum/material/M = name_to_material[Name] + + if(!M.stack_type) // Shouldn't happen, but might. Never know. + continue + + if(istype(M, /datum/material/alienalloy)) + continue + + var/obj/item/stack/material/Mat = new M.stack_type() + + if(Mat.name in items_by_name) + qdel(Mat) + continue + + var/datum/category_item/autolathe/materials/WorkDat = new(src) + + WorkDat.name = "[Mat.name]" + WorkDat.resources = Mat.matter.Copy() + WorkDat.is_stack = TRUE + WorkDat.no_scale = TRUE + WorkDat.max_stack = Mat.max_amount + WorkDat.path = M.stack_type + + qdel(Mat) + + items |= WorkDat + items_by_name[WorkDat.name] = WorkDat + /******************* * Category entries * *******************/ diff --git a/code/datums/autolathe/engineering_vr.dm b/code/datums/autolathe/engineering_vr.dm index 08e1cf986b..90970c6e48 100644 --- a/code/datums/autolathe/engineering_vr.dm +++ b/code/datums/autolathe/engineering_vr.dm @@ -4,4 +4,24 @@ /datum/category_item/autolathe/engineering/id_restorer name = "ID restoration console electronics" - path =/obj/item/weapon/circuitboard/id_restorer \ No newline at end of file + path =/obj/item/weapon/circuitboard/id_restorer + +/datum/category_item/autolathe/engineering/oven + name = "oven electronics" + path =/obj/item/weapon/circuitboard/oven + +/datum/category_item/autolathe/engineering/fryer + name = "fryer electronics" + path =/obj/item/weapon/circuitboard/fryer + +/datum/category_item/autolathe/engineering/grill + name = "grill electronics" + path =/obj/item/weapon/circuitboard/grill + +/datum/category_item/autolathe/engineering/cerealmaker + name = "cereal maker electronics" + path =/obj/item/weapon/circuitboard/cerealmaker + +/datum/category_item/autolathe/engineering/candymachine + name = "candy machine electronics" + path =/obj/item/weapon/circuitboard/candymachine \ No newline at end of file diff --git a/code/datums/autolathe/general.dm b/code/datums/autolathe/general.dm index 8ee77ce656..00151d6e75 100644 --- a/code/datums/autolathe/general.dm +++ b/code/datums/autolathe/general.dm @@ -85,44 +85,6 @@ name = "welding mask" path =/obj/item/clothing/head/welding -/datum/category_item/autolathe/general/metal - name = "steel sheets" - path =/obj/item/stack/material/steel - is_stack = TRUE - no_scale = TRUE //prevents material duplication exploits - -/datum/category_item/autolathe/general/glass - name = "glass sheets" - path =/obj/item/stack/material/glass - is_stack = TRUE - no_scale = TRUE //prevents material duplication exploits - -/datum/category_item/autolathe/general/rglass - name = "reinforced glass sheets" - path =/obj/item/stack/material/glass/reinforced - is_stack = TRUE - no_scale = TRUE //prevents material duplication exploits - -/datum/category_item/autolathe/general/rods - name = "metal rods" - path =/obj/item/stack/rods - is_stack = TRUE - no_scale = TRUE //prevents material duplication exploits - -/datum/category_item/autolathe/general/plasteel - name = "plasteel sheets" - path =/obj/item/stack/material/plasteel - is_stack = TRUE - no_scale = TRUE //prevents material duplication exploits - resources = list(MAT_PLASTEEL = 2000) - -/datum/category_item/autolathe/general/plastic - name = "plastic sheets" - path =/obj/item/stack/material/plastic - is_stack = TRUE - no_scale = TRUE //prevents material duplication exploits - resources = list(MAT_PLASTIC = 2000) - //TFF 24/12/19 - Let people print more spray bottles if needed. /datum/category_item/autolathe/general/spraybottle name = "spray bottle" diff --git a/code/datums/autolathe/materials.dm b/code/datums/autolathe/materials.dm new file mode 100644 index 0000000000..653fca8222 --- /dev/null +++ b/code/datums/autolathe/materials.dm @@ -0,0 +1,38 @@ + +/datum/category_item/autolathe/materials/metal + name = "steel sheets" + path =/obj/item/stack/material/steel + is_stack = TRUE + no_scale = TRUE //prevents material duplication exploits + +/datum/category_item/autolathe/materials/glass + name = "glass sheets" + path =/obj/item/stack/material/glass + is_stack = TRUE + no_scale = TRUE //prevents material duplication exploits + +/datum/category_item/autolathe/materials/rglass + name = "reinforced glass sheets" + path =/obj/item/stack/material/glass/reinforced + is_stack = TRUE + no_scale = TRUE //prevents material duplication exploits + +/datum/category_item/autolathe/materials/rods + name = "metal rods" + path =/obj/item/stack/rods + is_stack = TRUE + no_scale = TRUE //prevents material duplication exploits + +/datum/category_item/autolathe/materials/plasteel + name = "plasteel sheets" + path =/obj/item/stack/material/plasteel + is_stack = TRUE + no_scale = TRUE //prevents material duplication exploits + resources = list(MAT_PLASTEEL = 2000) + +/datum/category_item/autolathe/materials/plastic + name = "plastic sheets" + path =/obj/item/stack/material/plastic + is_stack = TRUE + no_scale = TRUE //prevents material duplication exploits + resources = list(MAT_PLASTIC = 2000) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 157a3f113f..82e5f1f78b 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -513,8 +513,9 @@ //HUMAN /mob/living/carbon/human/mind_initialize() - ..() - if(!mind.assigned_role) mind.assigned_role = USELESS_JOB //defualt //VOREStation Edit - Visitor not Assistant + . = ..() + if(!mind.assigned_role) + mind.assigned_role = USELESS_JOB //defualt //VOREStation Edit - Visitor not Assistant //slime /mob/living/simple_mob/slime/mind_initialize() diff --git a/code/datums/roundstats/departmentgoal.dm b/code/datums/roundstats/departmentgoal.dm index b0aa69784c..333e6c0396 100644 --- a/code/datums/roundstats/departmentgoal.dm +++ b/code/datums/roundstats/departmentgoal.dm @@ -35,6 +35,7 @@ GLOBAL_LIST(active_department_goals) cat_goals -= G GLOB.active_department_goals[category] |= G + return 1 /hook/roundend/proc/checkDepartmentGoals() for(var/category in GLOB.active_department_goals) @@ -50,6 +51,7 @@ GLOBAL_LIST(active_department_goals) var/success = G.check_completion() to_world("[success ? "[G.name]" : "[G.name]"]") to_world("[G.goal_text]") + return 1 /datum/goal var/name = "goal" diff --git a/code/datums/roundstats/roundstats.dm b/code/datums/roundstats/roundstats.dm index c5ceb686a7..c1453b18af 100644 --- a/code/datums/roundstats/roundstats.dm +++ b/code/datums/roundstats/roundstats.dm @@ -32,7 +32,7 @@ GLOBAL_VAR_INIT(mech_destroyed_roundstat, 0) else if(GLOB.mech_destroyed_roundstat > 1) valid_stats_list.Add("[GLOB.mech_destroyed_roundstat] mechs were destroyed this shift. What did you do?") else if(GLOB.seed_planted_shift_roundstat > 20) - valid_stats_list.Add("[GLOB.seed_planted_shift_roundstat] were planted according to our sensors this shift.") + valid_stats_list.Add("[GLOB.seed_planted_shift_roundstat] seeds were planted according to our sensors this shift.") if(GLOB.rocks_drilled_roundstat > 80) valid_stats_list.Add("Our strong miners pulverized a whole [GLOB.rocks_drilled_roundstat] piles of pathetic rubble.") diff --git a/code/datums/supplypacks/materials.dm b/code/datums/supplypacks/materials.dm index 95f15caa6d..87780766d9 100644 --- a/code/datums/supplypacks/materials.dm +++ b/code/datums/supplypacks/materials.dm @@ -35,6 +35,13 @@ containertype = /obj/structure/closet/crate/grayson containername = "Plastic sheets crate" +/datum/supply_pack/materials/copper50 + name = "50 copper ingots" + contains = list(/obj/fiftyspawner/copper) + cost = 60 + containertype = /obj/structure/closet/crate/grayson + containername = "Copper ingots crate" + /datum/supply_pack/materials/cardboard_sheets contains = list(/obj/fiftyspawner/cardboard) name = "50 cardboard sheets" diff --git a/code/datums/supplypacks/recreation_vr.dm b/code/datums/supplypacks/recreation_vr.dm index 5c2266523f..db81cd2061 100644 --- a/code/datums/supplypacks/recreation_vr.dm +++ b/code/datums/supplypacks/recreation_vr.dm @@ -20,7 +20,7 @@ /obj/item/clothing/suit/straight_jacket, /obj/item/weapon/handcuffs/legcuffs/fuzzy, /obj/item/weapon/melee/fluff/holochain/mass, - /obj/item/weapon/material/twohanded/fluff/riding_crop, + /obj/item/weapon/material/twohanded/riding_crop, /obj/item/clothing/under/fluff/latexmaid ) containertype = /obj/structure/closet/crate diff --git a/code/datums/supplypacks/robotics.dm b/code/datums/supplypacks/robotics.dm index 5f8cf6337c..1928ee7db6 100644 --- a/code/datums/supplypacks/robotics.dm +++ b/code/datums/supplypacks/robotics.dm @@ -189,6 +189,17 @@ containername = "Jumper kit crate" access = access_robotics +/datum/supply_pack/robotics/restrainingbolt + name = "Restraining bolt crate" + contains = list( + /obj/item/weapon/implanter = 1, + /obj/item/weapon/implantcase/restrainingbolt = 2 + ) + cost = 40 + containertype = /obj/structure/closet/crate/secure/cybersolutions + containername = "Restraining bolt crate" + access = access_robotics + /datum/supply_pack/robotics/bike name = "Spacebike Crate" contains = list() diff --git a/code/datums/supplypacks/security.dm b/code/datums/supplypacks/security.dm index 5fd24a473f..32c847ece2 100644 --- a/code/datums/supplypacks/security.dm +++ b/code/datums/supplypacks/security.dm @@ -281,10 +281,7 @@ name = "Armor - Riot plates" contains = list( /obj/item/clothing/head/helmet/riot, - /obj/item/clothing/suit/armor/pcarrier, - /obj/item/clothing/accessory/armor/armorplate/riot, - /obj/item/clothing/accessory/armor/armguards/riot, - /obj/item/clothing/accessory/armor/legguards/riot + /obj/item/clothing/suit/armor/pcarrier/riot/full ) cost = 40 containertype = /obj/structure/closet/crate/secure/lawson @@ -308,10 +305,7 @@ name = "Armor - Ablative plates" contains = list( /obj/item/clothing/head/helmet/laserproof, - /obj/item/clothing/suit/armor/pcarrier, - /obj/item/clothing/accessory/armor/armorplate/laserproof, - /obj/item/clothing/accessory/armor/armguards/laserproof, - /obj/item/clothing/accessory/armor/legguards/laserproof + /obj/item/clothing/suit/armor/pcarrier/laserproof/full ) cost = 50 containertype = /obj/structure/closet/crate/secure/lawson @@ -336,10 +330,7 @@ name = "Armor - Ballistic plates" contains = list( /obj/item/clothing/head/helmet/bulletproof, - /obj/item/clothing/suit/armor/pcarrier, - /obj/item/clothing/accessory/armor/armorplate/bulletproof, - /obj/item/clothing/accessory/armor/armguards/bulletproof, - /obj/item/clothing/accessory/armor/legguards/bulletproof + /obj/item/clothing/suit/armor/pcarrier/bulletproof/full ) cost = 50 containertype = /obj/structure/closet/crate/secure/heph diff --git a/code/datums/underwear/undershirts.dm b/code/datums/underwear/undershirts.dm index 7da82fa580..6b2cc3d10f 100644 --- a/code/datums/underwear/undershirts.dm +++ b/code/datums/underwear/undershirts.dm @@ -186,4 +186,14 @@ /datum/category_item/underwear/undershirt/pinkblack_tshirt name = "Pink and Black T-Shirt" - icon_state = "pinkblack_tshirt" \ No newline at end of file + icon_state = "pinkblack_tshirt" + +/datum/category_item/underwear/undershirt/turtle + name = "Turtleneck" + icon_state = "turtleneck" + has_color = TRUE + +/datum/category_item/underwear/undershirt/sleevelessturtle + name = "Turtleneck, Sleeveless" + icon_state = "sleevelessturtle" + has_color = TRUE \ No newline at end of file diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index b5f9ac3a2f..9c8bbccc79 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -54,10 +54,8 @@ /area/Initialize() . = ..() - luminosity = !(dynamic_lighting) icon_state = "" - return INITIALIZE_HINT_LATELOAD // Areas tradiationally are initialized AFTER other atoms. /area/LateInitialize() @@ -68,7 +66,6 @@ power_change() // all machines set to current power level, also updates lighting icon if(no_spoilers) set_spoiler_obfuscation(TRUE) - return INITIALIZE_HINT_LATELOAD // Changes the area of T to A. Do not do this manually. // Area is expected to be a non-null instance. diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 5ec5af0e6b..c20c29be7b 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -627,7 +627,7 @@ speech_bubble_hearers += M.client if(length(speech_bubble_hearers)) - var/image/I = image('icons/mob/talk.dmi', src, "[bubble_icon][say_test(message)]", FLY_LAYER) + var/image/I = generate_speech_bubble(src, "[bubble_icon][say_test(message)]", FLY_LAYER) I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_hearers, 30) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index bf5fc0ab18..4bc8892273 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -134,7 +134,7 @@ for(var/i in loc) var/atom/movable/thing = i // We don't call parent so we are calling this for byond - thing.Crossed(src) + thing.Crossed(src, oldloc) // We're a multi-tile object (multiple locs) else if(. && newloc) @@ -303,6 +303,8 @@ if(AM == src) continue AM.Uncrossed(src) + if(loc != destination) // Uncrossed() triggered a separate movement + return // Information about turf and z-levels for source and dest collected var/turf/oldturf = get_turf(oldloc) @@ -327,6 +329,8 @@ if(AM == src) continue AM.Crossed(src, oldloc) + if(loc != destination) // Crossed triggered a separate movement + return // Call our thingy to inform everyone we moved Moved(oldloc, NONE, TRUE) @@ -462,6 +466,8 @@ minor_dir = dx minor_dist = dist_x + range = min(dist_x + dist_y, range) + while(src && target && src.throwing && istype(src.loc, /turf) \ && ((abs(target.x - src.x)+abs(target.y - src.y) > 0 && dist_travelled < range) \ || (a && a.has_gravity == 0) \ diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index fccf178af9..ef0af0fab7 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -118,6 +118,10 @@ var/global/list/datum/dna/gene/dna_genes[0] var/base_species = "Human" var/list/species_traits = list() var/blood_color = "#A10808" + var/custom_say + var/custom_ask + var/custom_whisper + var/custom_exclaim // VOREStation // New stuff @@ -139,6 +143,10 @@ var/global/list/datum/dna/gene/dna_genes[0] new_dna.custom_species=custom_species //VOREStaton Edit new_dna.species_traits=species_traits.Copy() //VOREStation Edit new_dna.blood_color=blood_color //VOREStation Edit + new_dna.custom_say=custom_say //VOREStaton Edit + new_dna.custom_ask=custom_ask //VOREStaton Edit + new_dna.custom_whisper=custom_whisper //VOREStaton Edit + new_dna.custom_exclaim=custom_exclaim //VOREStaton Edit for(var/b=1;b<=DNA_SE_LENGTH;b++) new_dna.SE[b]=SE[b] if(b<=DNA_UI_LENGTH) @@ -205,6 +213,10 @@ var/global/list/datum/dna/gene/dna_genes[0] src.base_species = character.species.base_species src.blood_color = character.species.blood_color src.species_traits = character.species.traits.Copy() + src.custom_say = character.custom_say + src.custom_ask = character.custom_ask + src.custom_whisper = character.custom_whisper + src.custom_exclaim = character.custom_exclaim // +1 to account for the none-of-the-above possibility SetUIValueRange(DNA_UI_EAR_STYLE, ear_style + 1, ear_styles_list.len + 1, 1) diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 758f74d873..d250c441ad 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -237,6 +237,10 @@ // Technically custom_species is not part of the UI, but this place avoids merge problems. H.custom_species = dna.custom_species + H.custom_say = dna.custom_say + H.custom_ask = dna.custom_ask + H.custom_whisper = dna.custom_whisper + H.custom_exclaim = dna.custom_exclaim H.species.blood_color = dna.blood_color var/datum/species/S = H.species S.produceCopy(dna.base_species,dna.species_traits,src) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index bbf4bfb343..241d613275 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -34,7 +34,7 @@ var/last_activation = 0 /obj/structure/cult/pylon/Initialize() - ..() + . = ..() START_PROCESSING(SSobj, src) /obj/structure/cult/pylon/attack_hand(mob/M as mob) diff --git a/code/game/jobs/job/captain_vr.dm b/code/game/jobs/job/captain_vr.dm index 4062775846..dd057fff7b 100644 --- a/code/game/jobs/job/captain_vr.dm +++ b/code/game/jobs/job/captain_vr.dm @@ -26,13 +26,13 @@ access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth) + access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway) minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth) + access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway) /datum/alt_title/deputy_manager title = "Deputy Manager" diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm index 8799aa3905..39905f0bc8 100644 --- a/code/game/jobs/job/engineering_vr.dm +++ b/code/game/jobs/job/engineering_vr.dm @@ -6,12 +6,12 @@ access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, access_heads, access_construction, - access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload) + access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway) minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, access_heads, access_construction, - access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload) + access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway) alt_titles = list("Head Engineer" = /datum/alt_title/head_engineer, "Foreman" = /datum/alt_title/foreman, "Maintenance Manager" = /datum/alt_title/maintenance_manager) /datum/alt_title/head_engineer diff --git a/code/game/jobs/job/exploration_vr.dm b/code/game/jobs/job/exploration_vr.dm index 0e6e003f7d..5189ca39b0 100644 --- a/code/game/jobs/job/exploration_vr.dm +++ b/code/game/jobs/job/exploration_vr.dm @@ -1,8 +1,3 @@ -var/const/PATHFINDER =(1<<11) -var/const/EXPLORER =(1<<12) -var/const/PILOT =(1<<13) -var/const/SAR =(1<<14) - /obj/item/weapon/card/id/medical/sar assignment = "Field Medic" rank = "Field Medic" @@ -64,13 +59,13 @@ var/const/SAR =(1<<14) /datum/job/pilot title = "Pilot" flag = PILOT - departments = list(DEPARTMENT_PLANET) - department_flag = MEDSCI + departments = list(DEPARTMENT_CIVILIAN) + department_flag = CIVILIAN faction = "Station" - total_positions = 4 - spawn_positions = 4 - supervisors = "the Pathfinder and the Head of Personnel" - selection_color = "#999440" + total_positions = 5 + spawn_positions = 5 + supervisors = "the Head of Personnel" + selection_color = "#515151" economic_modifier = 5 minimal_player_age = 3 pto_type = PTO_EXPLORATION diff --git a/code/game/jobs/job/medical_vr.dm b/code/game/jobs/job/medical_vr.dm index 2679137cf0..6d5ee57c4e 100644 --- a/code/game/jobs/job/medical_vr.dm +++ b/code/game/jobs/job/medical_vr.dm @@ -5,11 +5,11 @@ access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, - access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels) + access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway) minimal_access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, - access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels) + access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway) alt_titles = list("Chief Physician" = /datum/alt_title/chief_physician, "Medical Director" = /datum/alt_title/medical_director, "Healthcare Manager" = /datum/alt_title/healthcare_manager) /datum/alt_title/chief_physician diff --git a/code/game/jobs/job/science_vr.dm b/code/game/jobs/job/science_vr.dm index 0356656446..52647422b4 100644 --- a/code/game/jobs/job/science_vr.dm +++ b/code/game/jobs/job/science_vr.dm @@ -10,7 +10,7 @@ minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_tox_storage, access_teleporter, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, - access_RC_announce, access_keycard_auth, access_tcomsat, access_xenoarch, access_eva, access_network, access_xenobotany) + access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_xenobotany) alt_titles = list("Research Supervisor" = /datum/alt_title/research_supervisor, "Research Manager" = /datum/alt_title/research_manager, "Head of Development" = /datum/alt_title/head_of_development,"Head Scientist" = /datum/alt_title/head_scientist) diff --git a/code/game/jobs/job/security_vr.dm b/code/game/jobs/job/security_vr.dm index e9b9017d9a..082531d944 100644 --- a/code/game/jobs/job/security_vr.dm +++ b/code/game/jobs/job/security_vr.dm @@ -6,11 +6,11 @@ access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_construction, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_external_airlocks) + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_construction, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_external_airlocks) + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) alt_titles = list("Security Commander" = /datum/alt_title/sec_commander, "Chief of Security" = /datum/alt_title/sec_chief, "Security Manager" = /datum/alt_title/security_manager) /datum/alt_title/security_manager diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 4e53589c2f..96dfbd3183 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -415,7 +415,7 @@ var/global/datum/controller/occupations/job_master // Implants get special treatment if(G.slot == "implant") - var/obj/item/weapon/implant/I = G.spawn_item(H) + var/obj/item/weapon/implant/I = G.spawn_item(H, H.client.prefs.gear[G.display_name]) I.invisibility = 100 I.implant_loadout(H) continue @@ -514,11 +514,12 @@ var/global/datum/controller/occupations/job_master var/obj/item/organ/external/l_foot = H.get_organ("l_foot") var/obj/item/organ/external/r_foot = H.get_organ("r_foot") var/obj/item/weapon/storage/S = locate() in H.contents - var/obj/item/wheelchair/R = null + var/obj/item/wheelchair/R if(S) R = locate() in S.contents if(!l_foot || !r_foot || R) - var/obj/structure/bed/chair/wheelchair/W = new /obj/structure/bed/chair/wheelchair(H.loc) + var/wheelchair_type = R?.unfolded_type || /obj/structure/bed/chair/wheelchair + var/obj/structure/bed/chair/wheelchair/W = new wheelchair_type(H.loc) W.buckle_mob(H) H.update_canmove() W.set_dir(H.dir) diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index 40f0fdb4a4..9312c84571 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -26,7 +26,10 @@ var/const/PSYCHIATRIST =(1<<7) var/const/ROBOTICIST =(1<<8) var/const/XENOBIOLOGIST =(1<<9) var/const/PARAMEDIC =(1<<10) -var/const/XENOBOTANIST =(1<<15) //VOREStation Add +var/const/PATHFINDER =(1<<11) //VOREStation Add +var/const/EXPLORER =(1<<12) //VOREStation Add +var/const/SAR =(1<<13) //VOREStation Add +var/const/XENOBOTANIST =(1<<14) //VOREStation Add var/const/CIVILIAN =(1<<2) @@ -43,9 +46,10 @@ var/const/LAWYER =(1<<9) var/const/CHAPLAIN =(1<<10) var/const/ASSISTANT =(1<<11) var/const/BRIDGE =(1<<12) -var/const/CLOWN =(1<<13) //VOREStation Add -var/const/MIME =(1<<14) //VOREStation Add -var/const/ENTERTAINER =(1<<15) //VOREStation Add +var/const/PILOT =(1<<13) //VOREStation Add +var/const/CLOWN =(1<<14) //VOREStation Add +var/const/MIME =(1<<15) //VOREStation Add +var/const/ENTERTAINER =(1<<16) //VOREStation Add //VOREStation Add var/const/TALON =(1<<3) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index a97fbf986f..e0ff3a6086 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -529,5 +529,5 @@ stasis_level = 100 //Just one setting /obj/machinery/sleeper/survival_pod/Initialize() - ..() + . = ..() RefreshParts(1) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 267524b979..08e22f96e0 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -14,7 +14,6 @@ active_power_usage = 10000 //10 kW. It's a big all-body scanner. light_color = "#00FF00" var/obj/machinery/body_scanconsole/console - var/known_implants = list(/obj/item/weapon/implant/health, /obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking, /obj/item/weapon/implant/language, /obj/item/weapon/implant/language/eal, /obj/item/weapon/implant/backup, /obj/item/device/nif) //VOREStation Add - Backup Implant, NIF var/printing_text = null /obj/machinery/bodyscanner/Initialize() @@ -255,12 +254,11 @@ organData["broken"] = E.min_broken_damage var/implantData[0] - for(var/obj/I in E.implants) + for(var/obj/thing in E.implants) var/implantSubData[0] - implantSubData["name"] = I.name - if(is_type_in_list(I, known_implants)) - implantSubData["known"] = 1 - + var/obj/item/weapon/implant/I = thing + implantSubData["name"] = I.name + implantSubData["known"] = istype(I) && I.known_implant implantData.Add(list(implantSubData)) organData["implants"] = implantData @@ -464,8 +462,9 @@ infected = "Gangrene Detected:" var/unknown_body = 0 - for(var/I in e.implants) - if(is_type_in_list(I,known_implants)) + for(var/thing in e.implants) + var/obj/item/weapon/implant/I = thing + if(istype(I) && I.known_implant) imp += "[I] implanted:" else unknown_body++ diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 3cde479238..80ff6aee29 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -36,6 +36,14 @@ if(!autolathe_recipes) autolathe_recipes = new() wires = new(src) + + for(var/Name in name_to_material) + if(Name in stored_material) + continue + + stored_material[Name] = 0 + storage_capacity[Name] = 0 + default_apply_parts() RefreshParts() @@ -270,6 +278,15 @@ //Create the desired item. var/obj/item/I = new making.path(src.loc) + + if(LAZYLEN(I.matter)) // Sadly we must obey the laws of equivalent exchange. + I.matter.Cut() + else + I.matter = list() + + for(var/material in making.resources) // Handle the datum's autoscaling for waste, so we're properly wasting material, but not so much if we have efficiency. + I.matter[material] = round(making.resources[material] / (making.no_scale ? 1 : 1.25)) * (making.no_scale ? 1 : mat_efficiency) + flick("[initial(icon_state)]_finish", src) if(multiplier > 1) if(istype(I, /obj/item/stack)) @@ -277,7 +294,16 @@ S.amount = multiplier else for(multiplier; multiplier > 1; --multiplier) // Create multiple items if it's not a stack. - new making.path(src.loc) + I = new making.path(src.loc) + // We've already deducted the cost of multiple items. Process the matter the same. + if(LAZYLEN(I.matter)) + I.matter.Cut() + + else + I.matter = list() + + for(var/material in making.resources) + I.matter[material] = round(making.resources[material] / (making.no_scale ? 1 : 1.25)) * (making.no_scale ? 1 : mat_efficiency) return TRUE return FALSE @@ -303,10 +329,9 @@ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) man_rating += M.rating - storage_capacity[DEFAULT_WALL_MATERIAL] = mb_rating * 25000 - storage_capacity[MAT_PLASTIC] = mb_rating * 20000 - storage_capacity[MAT_PLASTEEL] = mb_rating * 16250 - storage_capacity["glass"] = mb_rating * 12500 + for(var/mat_name in storage_capacity) + storage_capacity[mat_name] = mb_rating * 25000 + build_time = 50 / man_rating mat_efficiency = 1.1 - man_rating * 0.1// Normally, price is 1.25 the amount of material, so this shouldn't go higher than 0.6. Maximum rating of parts is 5 update_tgui_static_data(usr) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 8ddb76c68a..2c34326fa7 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -465,6 +465,7 @@ /obj/item/weapon/implant/health name = "health implant" + known_implant = TRUE var/healthstring = "" /obj/item/weapon/implant/health/proc/sensehealth() diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 7ff97c83e8..2c12343c88 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -1,9 +1,8 @@ -/obj/machinery/computer/arcade/ +/obj/machinery/computer/arcade name = "random arcade" desc = "random arcade machine" - icon_state = "arcade" + icon_state = "arcade1" icon_keyboard = null - icon_screen = "invaders" clicksound = null //Gets too spammy and makes no sense for arcade to have the console keyboard noise anyway var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2, /obj/item/toy/blink = 2, @@ -25,15 +24,15 @@ /obj/item/toy/stickhorse = 2 ) -/obj/machinery/computer/arcade/New() - ..() +/obj/machinery/computer/arcade/Initialize() + . = ..() // If it's a generic arcade machine, pick a random arcade // circuit board for it and make the new machine if(!circuit) var/choice = pick(subtypesof(/obj/item/weapon/circuitboard/arcade) - /obj/item/weapon/circuitboard/arcade/clawmachine) var/obj/item/weapon/circuitboard/CB = new choice() new CB.build_path(loc, CB) - qdel(src) + return INITIALIZE_HINT_QDEL /obj/machinery/computer/arcade/proc/prizevend() if(!(contents-circuit).len) @@ -77,9 +76,10 @@ /////////////////// /obj/machinery/computer/arcade/battle - name = "arcade machine" - desc = "Does not support Pinball." - icon_state = "arcade" + name = "Battler" + desc = "Fight through what space has to offer!" + icon_state = "arcade2" + icon_screen = "battler" circuit = /obj/item/weapon/circuitboard/arcade/battle var/enemy_name = "Space Villian" var/temp = "Winners don't use space drugs" //Temporary message, for attack messages, etc @@ -310,7 +310,8 @@ /obj/machinery/computer/arcade/orion_trail name = "The Orion Trail" desc = "Learn how our ancestors got to Orion, and have fun in the process!" - icon_state = "arcade" + icon_state = "arcade1" + icon_screen = "orion" circuit = /obj/item/weapon/circuitboard/arcade/orion_trail var/busy = 0 //prevent clickspam that allowed people to ~speedrun~ the game. var/engine = 0 diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index cc05d63217..8d4202d421 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -26,7 +26,7 @@ light_color = "#315ab4" /obj/machinery/computer/cloning/Initialize() - ..() + . = ..() pods = list() records = list() set_scan_temp("Scanner ready.", "good") diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index adf53c80a8..680ce44345 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -29,7 +29,7 @@ /obj/machinery/computer/med_data/Initialize() - ..() + . = ..() field_edit_questions = list( // General "sex" = "Please select new sex:", diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 1caa7b61a4..430b42591c 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -335,7 +335,7 @@ name = "Monitor Decryption Key" /obj/item/weapon/paper/monitorkey/Initialize() - ..() //Late init + ..() return INITIALIZE_HINT_LATELOAD /obj/item/weapon/paper/monitorkey/LateInitialize() diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index dbd5ba8383..5eae5e82d0 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -13,7 +13,7 @@ var/title = "Mass Driver Controls" /obj/machinery/computer/pod/Initialize() - ..() //Not returning parent because lateload + ..() return INITIALIZE_HINT_LATELOAD /obj/machinery/computer/pod/LateInitialize() diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 9932934a83..c26d2c5365 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -15,6 +15,9 @@ var/stop = 0.0 var/screen = 0 // 0 - No Access Denied, 1 - Access allowed +/obj/machinery/computer/prisoner/attack_ai(var/mob/user as mob) + return src.attack_hand(user) + /obj/machinery/computer/prisoner/attack_hand(mob/user) if(..()) return @@ -28,7 +31,7 @@ /obj/machinery/computer/prisoner/tgui_data(mob/user) var/list/data = list() - + data["locked"] = !screen data["chemImplants"] = list() data["trackImplants"] = list() @@ -65,24 +68,22 @@ return data + /obj/machinery/computer/prisoner/tgui_act(action, list/params) if(..()) return TRUE - switch(action) if("inject") var/obj/item/weapon/implant/I = locate(params["imp"]) if(I) I.activate(clamp(params["val"], 0, 10)) . = TRUE - if("lock") if(allowed(usr)) screen = !screen else to_chat(usr, "Unauthorized Access.") . = TRUE - if("warn") var/warning = sanitize(input(usr, "Message:", "Enter your message here!", "")) if(!warning) @@ -91,5 +92,4 @@ if(I && I.imp_in) to_chat(I.imp_in, "You hear a voice in your head saying: '[warning]'") . = TRUE - add_fingerprint(usr) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 1fbd897113..4222e1264c 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -25,7 +25,7 @@ var/static/list/field_edit_choices /obj/machinery/computer/secure_data/Initialize() - ..() + . = ..() field_edit_questions = list( // General "name" = "Please enter new name:", @@ -389,11 +389,11 @@ if(field == "age") answer = text2num(answer) - + if(field == "rank") if(answer in joblist) active1.fields["real_rank"] = answer - + if(field == "criminal") for(var/mob/living/carbon/human/H in player_list) BITSET(H.hud_updateflag, WANTED_HUD) diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 47b9e8ce25..e11f404b16 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -30,7 +30,7 @@ var/static/list/field_edit_choices /obj/machinery/computer/skills/Initialize() - ..() + . = ..() field_edit_questions = list( // General "name" = "Please input new name:", diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 014efcb581..39d54ef96d 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -862,14 +862,14 @@ About the new airlock wires panel: /obj/machinery/door/airlock/tgui_data(mob/user) var/list/data = list() - + var/list/power = list() power["main"] = main_power_lost_until > 0 ? 0 : 2 power["main_timeleft"] = round(main_power_lost_until > 0 ? max(main_power_lost_until - world.time, 0) / 10 : main_power_lost_until, 1) power["backup"] = backup_power_lost_until > 0 ? 0 : 2 power["backup_timeleft"] = round(backup_power_lost_until > 0 ? max(backup_power_lost_until - world.time, 0) / 10 : backup_power_lost_until, 1) data["power"] = power - + data["shock"] = (electrified_until == 0) ? 2 : 0 data["shock_timeleft"] = round(electrified_until > 0 ? max(electrified_until - world.time, 0) / 10 : electrified_until, 1) data["id_scanner"] = !aiDisabledIdScanner diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index f4d9c900ed..e3098507f2 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -8,8 +8,6 @@ #define PRESET_MEDIUM 5 MINUTES #define PRESET_LONG 10 MINUTES -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - /////////////////////////////////////////////////////////////////////////////////////////////// // Brig Door control displays. // Description: This is a controls the timer for the brig doors, displays the timer on itself and @@ -25,22 +23,21 @@ layer = ABOVE_WINDOW_LAYER desc = "A remote control for a door." req_access = list(access_brig) - anchored = 1.0 // can't pick it up - density = 0 // can walk through it. - var/id = null // id of door it controls. - + anchored = 1.0 // can't pick it up + density = 0 // can walk through it. + var/id = null // id of door it controls. var/activation_time = 0 var/timer_duration = 0 var/timing = FALSE // boolean, true/1 timer is on, false/0 means it's not timing var/list/obj/machinery/targets = list() + maptext_height = 26 maptext_width = 32 /obj/machinery/door_timer/Initialize() ..() - //Doors need to go first, and can't rely on init order, so come back to me. return INITIALIZE_HINT_LATELOAD /obj/machinery/door_timer/LateInitialize() @@ -72,12 +69,12 @@ /obj/machinery/door_timer/process() if(stat & (NOPOWER|BROKEN)) return - if(timing) if(world.time - activation_time >= timer_duration) timer_end() // open doors, reset timer, clear status screen update_icon() + // has the door power situation changed, if so update icon. /obj/machinery/door_timer/power_change() ..() @@ -108,7 +105,7 @@ C.icon_state = "closed_locked" return 1 -// Opens and unlocks doors, power check +/// Opens and unlocks doors, power check /obj/machinery/door_timer/proc/timer_end(forced = FALSE) if(stat & (NOPOWER|BROKEN)) return 0 @@ -145,6 +142,9 @@ if(timer_duration && activation_time && timing) // Setting it while active will reset the activation time activation_time = world.time +/obj/machinery/door_timer/attack_ai(mob/user) + return src.attack_hand(user) + /obj/machinery/door_timer/attack_hand(mob/user) if(..()) return TRUE diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index c23d02f4d0..af506f4fe9 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -4,6 +4,7 @@ /datum/feed_message var/author ="" + var/title var/body ="" var/message_type ="Story" var/datum/feed_channel/parent_channel @@ -58,9 +59,6 @@ var/list/datum/feed_channel/network_channels = list() var/datum/feed_message/wanted_issue -/datum/feed_network/New() - CreateFeedChannel("Station Announcements", "SS13", 1, 1, "New Station Announcement Available") - /datum/feed_network/proc/CreateFeedChannel(var/channel_name, var/author, var/locked, var/adminChannel = 0, var/announcement_message) var/datum/feed_channel/newChannel = new /datum/feed_channel newChannel.channel_name = channel_name @@ -73,12 +71,16 @@ newChannel.announcement = "Breaking news from [channel_name]!" network_channels += newChannel -/datum/feed_network/proc/SubmitArticle(var/msg, var/author, var/channel_name, var/obj/item/weapon/photo/photo, var/adminMessage = 0, var/message_type = "") +/datum/feed_network/proc/SubmitArticle(var/msg, var/author, var/channel_name, var/obj/item/weapon/photo/photo, var/adminMessage = 0, var/message_type = "", var/title) var/datum/feed_message/newMsg = new /datum/feed_message newMsg.author = author newMsg.body = msg newMsg.time_stamp = "[stationtime2text()]" newMsg.is_admin_message = adminMessage + if(title) + newMsg.title = title + else + newMsg.title = "News Update" newMsg.post_time = round_duration_in_ds // Should be almost universally unique if(message_type) newMsg.message_type = message_type @@ -147,6 +149,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) // 1 = there has var/scanned_user = "Unknown" //Will contain the name of the person who currently uses the newscaster var/msg = ""; //Feed message + var/title = ""; // Feed title var/datum/news_photo/photo_data = null var/channel_name = ""; //the feed channel which will be receiving the feed, or being created var/c_locked=0; //Will our new channel be locked to public submissions? @@ -164,7 +167,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) securityCaster = 1 /obj/machinery/newscaster/Initialize() - ..() //Not returning . because lateload below + ..() allCasters += src unit_no = ++unit_no_cur paper_remaining = 15 @@ -371,7 +374,6 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) /obj/machinery/newscaster/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) if(..()) return TRUE - switch(action) if("cleartemp") temp = null @@ -434,6 +436,10 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) msg = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "") as message|null) return TRUE + if("set_new_title") + title = sanitize(input(usr, "Enter your Feed title", "Network Channel Handler", "") as message|null) + return TRUE + if("set_attachment") AttachPhoto(usr) return TRUE @@ -449,10 +455,13 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) if(channel_name == "") set_temp("Error: Could not submit feed message to network: No feed channel selected.", "danger", FALSE) return TRUE + if(title == "") + set_temp("Error: Invalid Title.", "danger", FALSE) + return TRUE var/image = photo_data ? photo_data.photo : null feedback_inc("newscaster_stories",1) - news_network.SubmitArticle(msg, our_user, channel_name, image, 0) + news_network.SubmitArticle(msg, our_user, channel_name, image, 0, "", title) set_temp("Feed message created successfully.", "success", FALSE) return TRUE @@ -629,153 +638,6 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) photo_data = new(selection, 1) -//######################################################################################################################## -//###################################### NEWSPAPER! ###################################################################### -//######################################################################################################################## - -/obj/item/weapon/newspaper - name = "newspaper" - desc = "An issue of The Griffon, the newspaper circulating aboard most stations." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "newspaper" - w_class = ITEMSIZE_SMALL //Let's make it fit in trashbags! - attack_verb = list("bapped") - var/screen = 0 - var/pages = 0 - var/curr_page = 0 - var/list/datum/feed_channel/news_content = list() - var/datum/feed_message/important_message = null - var/scribble="" - var/scribble_page = null - drop_sound = 'sound/items/drop/wrapper.ogg' - pickup_sound = 'sound/items/pickup/wrapper.ogg' - -obj/item/weapon/newspaper/attack_self(mob/user) - if(ishuman(user)) - var/mob/living/carbon/human/human_user = user - var/dat - pages = 0 - switch(screen) - if(0) //Cover - dat+="

"
- else
- dat+="None"
- else
- dat+="Apart from some uninteresting Classified ads, there's nothing on this page..."
- if(scribble_page==curr_page)
- dat+="| \[Switch On]\] | |||||||||
| \[Switch Off]\] | |||||||||
| Current location | [gps_data["my_area_name"]] | ([gps_data["curr_x"]], [gps_data["curr_y"]], [gps_data["curr_z_name"]]) | |||||||
| [hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'. | " + dat += "\[Change Tag\]\[Toggle Scan Range\][can_hide_signal ? "\[Toggle Signal Visibility\]":""] | ||||||||
| Detected signals | |||||||||
| [gps["gps_tag"]] | [gps["area_name"]] | " + + if(istype(gps_data["ref"], /obj/item/device/gps/internal/poi)) + dat += "[gps["local"] ? "[gps["direction"]] Dist: [round(gps["distance"], 10)]m" : "in \the [gps["z_name"]]"] | " + else + dat += "([gps["x"]], [gps["y"]], [gps["z_name"]]) | " + + if(gps["local"]) + dat += "[gps["distance"]]m | " + dat += "[gps["degrees"]]° ([gps["direction"]]) | " + else + dat += "Non-local signal. | " + + if(LAZYACCESS(tracking_devices, gps_ref)) + dat += "\[Stop Tracking\] \[Colour [color_square(hex = LAZYACCESS(tracking_devices, gps_ref))]\] Show/Hide Label | " + else + dat += "\[Start Tracking\] | " + dat += "|
| No other signals detected. | |||||||||
| \[Switch On]\] | |||||||
| \[Switch Off]\] | |||||||
| Current location | [gps_data["my_area_name"]] | ([gps_data["curr_x"]], [gps_data["curr_y"]], [gps_data["curr_z_name"]]) | |||||
| [hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'. | " + dat += "\[Change Tag\]\[Toggle Scan Range\][can_hide_signal ? "\[Toggle Signal Visibility\]":""] | ||||||
| Detected signals | |||||||
| [gps["gps_tag"]] | [gps["area_name"]] ([gps["x"]], [gps["y"]], [gps["z_name"]]) | " + if(gps["local"]) + dat += "[gps["distance"]]m | " + dat += "[gps["degrees"]]° ([gps["direction"]]) | " + else + dat += "Non-local signal. | " + if(LAZYACCESS(tracking_devices, gps_ref)) + dat += "\[Stop Tracking\] \[Colour [color_square(hex = LAZYACCESS(tracking_devices, gps_ref))]\] Show/Hide Label | " + else + dat += "\[Start Tracking\] | " + dat += "|
| No other signals detected. | |||||||
Hello Newbie, congratz on deciding to make food! This guide assumes you know absolutely nothing, so fret not, the information here will help you prepare food for your hungry crewmates!
-Now that you know the fundamentals of how to make the base ingredients, here are some fairly easy recipes to put them together into something enjoyable for the crew.
-These recipes only scratch the surface, but it's all things that can be done with what is pre-provided. If you have a partner in Botany, feel free to request more meat or any other supplies to try new recipes!
+These recipes only scratch the surface, but it's all things that can be done with what is pre-provided. If you have a partner in Botany, feel free to request more meat or any other supplies to try new recipes!
The Fryer, CondiMaster3000, and other nearby devices have been deliberately left out of this guide; as you get more advanced feel free to experiment with them, though be careful with the Fryer especially as it's the #1 source of fires for learning chefs, myself included. The one other machine that is worth understanding is the Gibber in the freezer room. If you are delivered fish or such they can be gibbed for extra Meat, though you may need to butcher the parts with a Knife afterwards to get usable Meat! Though if the meat is purple or comes from Koi or Spacecarp do not directly serve it to crew! It contains toxins that are better taken care of by other departments.
Some wonderful websites share recipes and tips for learning chefs on the Extranet! Look on your PDA or preferred device at https://wiki.vore-station.net/Guide_to_Food_and_Drink and https://vore-station.net/infodump/recipes_food.html for further tips, though do note the latter is more accurate in regard to recipes. Happy cooking!