diff --git a/code/__defines/materials.dm b/code/__defines/materials.dm index 75e0ec5bccd..6cfae3ed57d 100644 --- a/code/__defines/materials.dm +++ b/code/__defines/materials.dm @@ -49,6 +49,10 @@ #define MAT_BOROSILICATE "borosilicate glass" #define MAT_SANDSTONE "sandstone" #define MAT_FLINT "flint" +#define MAT_PLATINUM "platinum" +#define MAT_TRITIUM "tritium" +#define MAT_DEUTERIUM "deuterium" + #define DEFAULT_TABLE_MATERIAL MAT_PLASTIC #define DEFAULT_WALL_MATERIAL MAT_STEEL diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 268b5d32536..ca8d02f19c9 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -37,9 +37,10 @@ #define ALLERGEN_COFFEE 0x200 // Mostly here for tajara. #define ALLERGEN_SUGARS 0x400 // For unathi-like reactions #define ALLERGEN_EGGS 0x800 // For Skrell eggs allergy +#define ALLERGEN_STIMULANT 0x1000 // Stimulants are what makes the Tajaran heart go ruh roh - not just coffee! // Allergen reactions -#define AG_TOX_DMG 0x1 // the classic +#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 diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index f4a1fc2c3be..6e0a3bfdc59 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -62,55 +62,7 @@ del_reqs - takes recipe and a user, loops over the recipes reqs var and tries to find everything in the list make by get_environment and delete it/add to parts list, then returns the said list */ -/** - * Check that the contents of the recipe meet the requirements. - * - * user: The /mob that initated the crafting. - * R: The /datum/crafting_recipe being attempted. - * contents: List of items to search for R's reqs. - */ -/datum/component/personal_crafting/proc/check_contents(atom/a, datum/crafting_recipe/R, list/contents) - var/list/item_instances = contents["instances"] - var/list/machines = contents["machinery"] - contents = contents["other"] - - - var/list/requirements_list = list() - - // Process all requirements - for(var/requirement_path in R.reqs) - // Check we have the appropriate amount available in the contents list - var/needed_amount = R.reqs[requirement_path] - for(var/content_item_path in contents) - // Right path and not blacklisted - if(!ispath(content_item_path, requirement_path) || R.blacklist.Find(content_item_path)) - continue - - needed_amount -= contents[content_item_path] - if(needed_amount <= 0) - break - - if(needed_amount > 0) - return FALSE - - // Store the instances of what we will use for R.check_requirements() for requirement_path - var/list/instances_list = list() - for(var/instance_path in item_instances) - if(ispath(instance_path, requirement_path)) - instances_list += item_instances[instance_path] - - requirements_list[requirement_path] = instances_list - - for(var/requirement_path in R.chem_catalysts) - if(contents[requirement_path] < R.chem_catalysts[requirement_path]) - return FALSE - - for(var/machinery_path in R.machinery) - if(!machines[machinery_path])//We don't care for volume with machines, just if one is there or not - return FALSE - - return R.check_requirements(a, requirements_list) - +// Returns a list of objects available /datum/component/personal_crafting/proc/get_environment(atom/a, list/blacklist = null, radius_range = 1) . = list() @@ -122,13 +74,13 @@ continue . += AM - +// Returns an associative list containing the types of tools available, and the paths of objects available /datum/component/personal_crafting/proc/get_surroundings(atom/a, list/blacklist=null) . = list() - .["tool_qualities"] = list() - .["other"] = list() - .["instances"] = list() - .["machinery"] = list() + .["tool_qualities"] = list() // List of tool types available + .["other"] = list() // List of reagents/material stacks available + .["instances"] = list() // List of /obj/items available, maybe? + .["machinery"] = list() // List of /obj/machinery available for(var/obj/object in get_environment(a, blacklist)) if(isitem(object)) var/obj/item/item = object @@ -150,11 +102,55 @@ else if (istype(object, /obj/machinery)) LAZYADDASSOCLIST(.["machinery"], object.type, object) +/** + * Check that the contents of the recipe meet the requirements. + * + * user: The /mob that initated the crafting. + * R: The /datum/crafting_recipe being attempted. + * contents: List of items to search for R's reqs. + */ +/datum/component/personal_crafting/proc/check_contents(atom/a, datum/crafting_recipe/R, list/contents) + var/list/item_instances = contents["instances"] + contents = contents["other"] + var/list/requirements_list = list() + + // Process all requirements + for(var/list/requirement in R.reqs) + var/satisfied = FALSE + for(var/requirement_path in requirement) + // Check we have the appropriate amount available in the contents list + var/needed_amount = requirement[requirement_path] + for(var/content_item_path in contents) + // Right path and not blacklisted + if(!ispath(content_item_path, requirement_path) || R.blacklist.Find(content_item_path)) + continue + + needed_amount -= contents[content_item_path] + if(needed_amount <= 0) + break + + if(needed_amount > 0) + continue + + // Store the instances of what we will use for R.check_requirements() for requirement_path + var/list/instances_list = list() + for(var/instance_path in item_instances) + if(ispath(instance_path, requirement_path)) + instances_list += item_instances[instance_path] + + requirements_list[requirement_path] = instances_list + satisfied = TRUE + break + if(!satisfied) + return FALSE + + return R.check_requirements(a, requirements_list) + /// Returns a boolean on whether the tool requirements of the input recipe are satisfied by the input source and surroundings. -/datum/component/personal_crafting/proc/check_tools(atom/source, datum/crafting_recipe/recipe, list/surroundings) - if(!length(recipe.tool_behaviors) && !length(recipe.tool_paths)) +/datum/component/personal_crafting/proc/check_tools(atom/source, datum/crafting_recipe/R, list/surroundings) + if(!length(R.tool_behaviors) && !length(R.tool_paths)) return TRUE var/list/available_tools = list() var/list/present_qualities = list() @@ -176,50 +172,70 @@ for(var/path in surroundings["other"]) available_tools[path] = TRUE - for(var/required_quality in recipe.tool_behaviors) + for(var/required_quality in R.tool_behaviors) if(present_qualities[required_quality]) continue return FALSE - for(var/required_path in recipe.tool_paths) - var/found_this_tool = FALSE - for(var/tool_path in available_tools) - if(!ispath(required_path, tool_path)) - continue - found_this_tool = TRUE - break - if(found_this_tool) + for(var/required_path in R.tool_paths) + if(is_path_in_list(required_path, available_tools)) continue return FALSE return TRUE +/datum/component/personal_crafting/proc/check_reagents(atom/source, datum/crafting_recipe/R, list/surroundings) + var/list/reagents = surroundings["other"] + for(var/requirement_path in R.chem_catalysts) + if(reagents[requirement_path] < R.chem_catalysts[requirement_path]) + return FALSE + return TRUE + +/datum/component/personal_crafting/proc/check_machinery(atom/source, datum/crafting_recipe/R, list/surroundings) + var/list/machines = surroundings["machinery"] + for(var/machinery_path in R.machinery) + if(!machines[machinery_path])//We don't care for volume with machines, just if one is there or not + return FALSE + return TRUE + +/datum/component/personal_crafting/proc/check_requirements(atom/source, datum/crafting_recipe/R, list/surroundings) + if(!check_contents(source, R, surroundings)) + return ", missing component." + if(!check_tools(source, R, surroundings)) + return ", missing tool." + if(!check_reagents(source, R, surroundings)) + return ", missing reagents." + if(!check_machinery(source, R, surroundings)) + return ", missing machinery." + return /datum/component/personal_crafting/proc/construct_item(atom/a, datum/crafting_recipe/R) - var/list/contents = get_surroundings(a,R.blacklist) + var/list/surroundings = get_surroundings(a,R.blacklist) // var/send_feedback = 1 - if(check_contents(a, R, contents)) - if(check_tools(a, R, contents)) - if(R.one_per_turf) - for(var/content in get_turf(a)) - if(istype(content, R.result)) - return ", object already present." - //If we're a mob we'll try a do_after; non mobs will instead instantly construct the item - if(ismob(a) && !do_after(a, R.time, target = a)) - return "." - contents = get_surroundings(a,R.blacklist) - if(!check_contents(a, R, contents)) - return ", missing component." - if(!check_tools(a, R, contents)) - return ", missing tool." - var/list/parts = del_reqs(R, a) - var/atom/movable/I = new R.result (get_turf(a.loc)) - I.CheckParts(parts, R) - // if(send_feedback) - // SSblackbox.record_feedback("tally", "object_crafted", 1, I.type) - return I //Send the item back to whatever called this proc so it can handle whatever it wants to do with the new item - return ", missing tool." - return ", missing component." + . = check_requirements(a, R, surroundings) + if(.) + return + + if(R.one_per_turf) + for(var/content in get_turf(a)) + if(istype(content, R.result)) + return ", object already present." + + //If we're a mob we'll try a do_after; non mobs will instead instantly construct the item + if(ismob(a) && !do_after(a, R.time, target = a)) + return "." + + surroundings = get_surroundings(a, R.blacklist) + . = check_requirements(a, R, surroundings) + if(.) + return + + var/list/parts = del_reqs(R, a) + var/atom/movable/I = new R.result (get_turf(a.loc)) + I.CheckParts(parts, R) + // if(send_feedback) + // SSblackbox.record_feedback("tally", "object_crafted", 1, I.type) + return I //Send the item back to whatever called this proc so it can handle whatever it wants to do with the new item /*Del reqs works like this: @@ -246,119 +262,108 @@ */ /datum/component/personal_crafting/proc/del_reqs(datum/crafting_recipe/R, atom/a) - var/list/surroundings - var/list/Deletion = list() - . = list() - var/data - var/amt + var/list/surroundings = get_environment(a) + var/list/parts = list("items" = list()) + if(R.get_parts_reagents_volume()) + parts["reagents"] = new /datum/reagents(R.get_parts_reagents_volume()) // Datums don't have create_reagents() var/list/requirements = list() if(R.reqs) - requirements += R.reqs + for(var/list/L in R.reqs) + requirements += L if(R.machinery) requirements += R.machinery - main_loop: - for(var/path_key in requirements) - amt = R.reqs[path_key] || R.machinery[path_key] - if(!amt)//since machinery can have 0 aka CRAFTING_MACHINERY_USE - i.e. use it, don't consume it! - continue main_loop - surroundings = get_environment(a, R.blacklist) - surroundings -= Deletion - if(ispath(path_key, /datum/reagent)) - var/datum/reagent/RG = new path_key - var/datum/reagent/RGNT - while(amt > 0) - var/obj/item/weapon/reagent_containers/RC = locate() in surroundings - RG = RC.reagents.get_reagent(path_key) - if(RG) - if(!locate(RG.type) in Deletion) - Deletion += new RG.type() - if(RG.volume > amt) - RG.volume -= amt - data = RG.data - RC.reagents.conditional_update(RC) - RG = locate(RG.type) in Deletion - RG.volume = amt - RG.data += data - continue main_loop - else - surroundings -= RC - amt -= RG.volume - RC.reagents.reagent_list -= RG - RC.reagents.conditional_update(RC) - RGNT = locate(RG.type) in Deletion - RGNT.volume += RG.volume - RGNT.data += RG.data - qdel(RG) - SEND_SIGNAL(RC.reagents, COMSIG_REAGENTS_CRAFTING_PING) // - [] TODO: Make this entire thing less spaghetti - else - surroundings -= RC - else if(ispath(path_key, /obj/item/stack)) - var/obj/item/stack/S - var/obj/item/stack/SD - while(amt > 0) - S = locate(path_key) in surroundings - if(S.get_amount() >= amt) - if(!locate(S.type) in Deletion) - SD = new S.type() - Deletion += SD - S.use(amt) - SD = locate(S.type) in Deletion - SD.add(amt) - continue main_loop - else - amt -= S.get_amount() - if(!locate(S.type) in Deletion) - Deletion += S - else - data = S.get_amount() - S = locate(S.type) in Deletion - S.add(data) - surroundings -= S - else - var/atom/movable/I - while(amt > 0) - I = locate(path_key) in surroundings - Deletion += I - surroundings -= I - amt-- - var/list/partlist = list(R.parts.len) - for(var/M in R.parts) - partlist[M] = R.parts[M] - for(var/part in R.parts) - if(istype(part, /datum/reagent)) - var/datum/reagent/RG = locate(part) in Deletion - if(RG.volume > partlist[part]) - RG.volume = partlist[part] - . += RG - Deletion -= RG + + // Try to find everything that was actually used to craft + for(var/path_key in requirements) + var/amt = requirements[path_key] + if(amt <= 0)//since machinery can have 0 aka CRAFTING_MACHINERY_USE - i.e. use it, don't consume it! continue - else if(istype(part, /obj/item/stack)) - var/obj/item/stack/ST = locate(part) in Deletion - if(ST.get_amount() > partlist[part]) - ST.set_amount(partlist[part]) - . += ST - Deletion -= ST - continue - else - while(partlist[part] > 0) - var/atom/movable/AM = locate(part) in Deletion - . += AM - Deletion -= AM - partlist[part] -= 1 - while(Deletion.len) - var/DL = Deletion[Deletion.len] - Deletion.Cut(Deletion.len) - // Snowflake handling of reagent containers and storage atoms. - // If we consumed them in our crafting, we should dump their contents out before qdeling them. - if(istype(DL, /obj/item/weapon/reagent_containers)) - var/obj/item/weapon/reagent_containers/container = DL - container.reagents.clear_reagents() - // container.reagents.expose(container.loc, TOUCH) - else if(istype(DL, /obj/item/weapon/storage)) - var/obj/item/weapon/storage/container = DL - container.spill() - container.close_all() - qdel(DL) + + // If the path is in R.parts, we want to grab those to stuff into the product + var/amt_to_transfer = 0 + if(is_path_in_list(path_key, R.parts)) + amt_to_transfer = R.parts[path_key] + + + // Reagent: gotta go sniffing in all the beakers + if(ispath(path_key, /datum/reagent)) + var/datum/reagent/reagent = path_key + var/id = initial(reagent.id) + + for(var/obj/item/weapon/reagent_containers/RC in surroundings) + // Found everything we need + if(amt <= 0 && amt_to_transfer <= 0) + break + + // If we need to keep any to put in the new object, pull it out + if(amt_to_transfer > 0) + var/A = RC.reagents.trans_id_to(parts["reagents"], id, amt_to_transfer) + amt_to_transfer -= A + amt -= A + + // If we need to consume some amount of it + if(amt > 0) + var/datum/reagent/RG = RC.reagents.get_reagent(id) + var/A = min(RG.volume, amt) + RC.reagents.remove_reagent(id, A) + amt -= A + SEND_SIGNAL(RC.reagents, COMSIG_REAGENTS_CRAFTING_PING) + + // Material stacks may have to accumulate across multiple stacks + else if(ispath(path_key, /obj/item/stack)) + for(var/obj/item/stack/S in surroundings) + if(amt <= 0 && amt_to_transfer <= 0) + break + + // This could put 50 stacks in an object but frankly so long as the amount's right we don't care + if(amt_to_transfer > 0) + var/obj/item/stack/split = S.split(amt_to_transfer) + if(istype(split)) + parts["items"] += split + amt_to_transfer -= split.get_amount() + amt -= split.get_amount() + + if(amt > 0) + var/A = min(amt, S.get_amount()) + if(S.use(A)) + amt -= A + + + else // Just a regular item. Find them all and delete them + for(var/atom/movable/I in surroundings) + if(amt <= 0 && amt_to_transfer <= 0) + break + + if(!istype(I, path_key)) + continue + + // Special case: the reagents may be needed for other recipes + if(istype(I, /obj/item/weapon/reagent_containers)) + var/obj/item/weapon/reagent_containers/RC = I + if(RC.reagents.total_volume > 0) + continue + + // We're using it for something + amt-- + + // Prepare to stuff inside product, don't delete it + if(is_path_in_list(path_key, R.parts)) + parts["items"] += I + amt_to_transfer-- + continue + + // Snowflake handling of reagent containers and storage atoms. + // If we consumed them in our crafting, we should dump their contents out before qdeling them. + if(istype(I, /obj/item/weapon/reagent_containers)) + var/obj/item/weapon/reagent_containers/container = I + container.reagents.clear_reagents() + // container.reagents.expose(container.loc, TOUCH) + else if(istype(I, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/container = I + container.spill() + container.close_all() + qdel(I) + return parts /datum/component/personal_crafting/proc/component_ui_interact(source, location, control, params, user) // SIGNAL_HANDLER @@ -487,10 +492,14 @@ var/list/tool_list = list() var/list/catalyst_text = list() - for(var/atom/req_atom as anything in R.reqs) - //We just need the name, so cheat-typecast to /atom for speed (even tho Reagents are /datum they DO have a "name" var) - //Also these are typepaths so sadly we can't just do "[a]" - req_text += "[R.reqs[req_atom]] [initial(req_atom.name)]" + for(var/list/req in R.reqs) + var/list/L = list() + for(var/atom/req_atom as anything in req) + //We just need the name, so cheat-typecast to /atom for speed (even tho Reagents are /datum they DO have a "name" var) + //Also these are typepaths so sadly we can't just do "[a]" + L += "[req[req_atom]] [initial(req_atom.name)]" + req_text += L.Join(" OR ") + for(var/obj/machinery/content as anything in R.machinery) req_text += "[R.reqs[content]] [initial(content.name)]" if(R.additional_req_text) diff --git a/code/datums/components/crafting/crafting_external.dm b/code/datums/components/crafting/crafting_external.dm index e40d5011329..8346a0fa580 100644 --- a/code/datums/components/crafting/crafting_external.dm +++ b/code/datums/components/crafting/crafting_external.dm @@ -12,21 +12,30 @@ */ /atom/proc/CheckParts(list/parts_list, datum/crafting_recipe/R) SEND_SIGNAL(src, COMSIG_ATOM_CHECKPARTS, parts_list, R) - if(parts_list) - for(var/A in parts_list) - if(istype(A, /datum/reagent)) - if(!reagents) - reagents = new() - reagents.reagent_list.Add(A) - reagents.conditional_update() - else if(ismovable(A)) - var/atom/movable/M = A - if(isliving(M.loc)) - var/mob/living/L = M.loc - L.unEquip(M, target = src) - else - M.forceMove(src) - SEND_SIGNAL(M, COMSIG_ATOM_USED_IN_CRAFT, src) + if(LAZYLEN(parts_list)) + if(istype(parts_list["reagents"], /datum/reagents)) + var/datum/reagents/RG = parts_list["reagents"] + if(istype(reagents)) + RG.trans_to_holder(reagents, RG.total_volume) + else + reagents = RG + RG.my_atom = src + reagents.conditional_update() + + for(var/atom/movable/M as anything in parts_list["items"]) + if(isliving(M.loc)) + var/mob/living/L = M.loc + L.unEquip(M, target = src) + else + M.forceMove(src) + SEND_SIGNAL(M, COMSIG_ATOM_USED_IN_CRAFT, src) + + var/list/L = parts_list["reagents"] + if(LAZYLEN(L)) + L.Cut() + L = parts_list["items"] + if(LAZYLEN(L)) + L.Cut() parts_list.Cut() /obj/machinery/CheckParts(list/parts_list) diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index bd5aec33954..d39d012832f 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -47,3 +47,28 @@ /datum/crafting_recipe/proc/on_craft_completion(mob/user, atom/result) return + +// Computes the total reagents volume +/datum/crafting_recipe/proc/get_parts_reagents_volume() + . = 0 + for(var/list/L in parts) + for(var/path in L) + if(ispath(path, /datum/reagent)) + . += L[path] + +// Locate one of the things that set the material type, and update it from the default (glass) +/datum/crafting_recipe/spear/on_craft_completion(mob/user, atom/result) + var/obj/item/weapon/material/M + for(var/path in parts) + var/obj/item/weapon/material/N = locate(path) in result + if(istype(N, path)) + if(!istype(M)) + M = N + else + N.forceMove(get_turf(result)) + if(!istype(M)) + return + + var/obj/item/weapon/material/twohanded/spear/S = result + S.set_material(M.material.name) + qdel(M) diff --git a/code/datums/components/crafting/recipes/primitive.dm b/code/datums/components/crafting/recipes/primitive.dm index 3c3eb4e84b1..97f6be5e395 100644 --- a/code/datums/components/crafting/recipes/primitive.dm +++ b/code/datums/components/crafting/recipes/primitive.dm @@ -1,14 +1,14 @@ /datum/crafting_recipe/cloth name = "Cloth bolt" result = /obj/item/stack/material/cloth - reqs = list(/obj/item/stack/material/fiber = 3) + reqs = list(list(/obj/item/stack/material/fiber = 3)) time = 40 category = CAT_PRIMAL /datum/crafting_recipe/crude_bandage name = "Crude bandages (x10)" result = /obj/item/stack/medical/crude_pack - reqs = list(/obj/item/stack/material/cloth = 2) + reqs = list(list(/obj/item/stack/material/cloth = 2)) time = 40 category = CAT_PRIMAL @@ -20,8 +20,8 @@ name = "primitive clothes" result = /obj/item/clothing/under/primitive reqs = list( - /obj/item/stack/material/fiber = 4, - /obj/item/stack/material/cloth = 6 + list(/obj/item/stack/material/fiber = 4), + list(/obj/item/stack/material/cloth = 6) ) time = 90 category = CAT_CLOTHING @@ -30,8 +30,8 @@ name = "primitive shoes" result = /obj/item/clothing/shoes/primitive reqs = list( - /obj/item/stack/material/fiber = 2, - /obj/item/stack/material/cloth = 3 + list(/obj/item/stack/material/fiber = 2), + list(/obj/item/stack/material/cloth = 3) ) time = 60 category = CAT_CLOTHING \ No newline at end of file diff --git a/code/datums/components/crafting/recipes/survival.dm b/code/datums/components/crafting/recipes/survival.dm index 425f39500bd..a1100f6808c 100644 --- a/code/datums/components/crafting/recipes/survival.dm +++ b/code/datums/components/crafting/recipes/survival.dm @@ -2,10 +2,10 @@ name = "Wooden Shovel" result = /obj/item/weapon/shovel/wood reqs = list( - /obj/item/stack/material/stick = 5, - /obj/item/stack/material/wood = 1, - /obj/item/stack/material/fiber = 3, - /obj/item/stack/material/flint = 1 + list(/obj/item/stack/material/stick = 5), + list(/obj/item/stack/material/wood = 1), + list(/obj/item/stack/material/fiber = 3), + list(/obj/item/stack/material/flint = 1) ) time = 120 category = CAT_WEAPONRY @@ -15,7 +15,7 @@ name = "stone blade" result = /obj/item/weapon/material/knife/stone reqs = list( - /obj/item/stack/material/flint = 2 + list(/obj/item/stack/material/flint = 2) ) time = 60 category = CAT_WEAPONRY @@ -25,10 +25,10 @@ name = "stone knife" result = /obj/item/weapon/material/knife/stone/wood reqs = list( - /obj/item/weapon/material/knife/stone = 1, - /obj/item/stack/material/flint = 1, - /obj/item/stack/material/wood = 1, - /obj/item/stack/material/fiber = 3 + list(/obj/item/weapon/material/knife/stone = 1), + list(/obj/item/stack/material/flint = 1), + list(/obj/item/stack/material/wood = 1), + list(/obj/item/stack/material/fiber = 3) ) time = 120 category = CAT_WEAPONRY @@ -38,10 +38,10 @@ name = "stone knife" result = /obj/item/weapon/material/knife/stone/bone reqs = list( - /obj/item/weapon/material/knife/stone = 1, - /obj/item/stack/material/flint = 1, - /obj/item/weapon/bone = 1, - /obj/item/stack/material/fiber = 3 + list(/obj/item/weapon/material/knife/stone = 1), + list(/obj/item/stack/material/flint = 1), + list(/obj/item/weapon/bone = 1), + list(/obj/item/stack/material/fiber = 3) ) time = 120 category = CAT_WEAPONRY @@ -51,9 +51,9 @@ name = "wooden bucket" result = /obj/item/weapon/reagent_containers/glass/bucket/wood reqs = list( - /obj/item/stack/material/wood = 1, - /obj/item/stack/material/stick = 1, - /obj/item/stack/material/fiber = 2 + list(/obj/item/stack/material/wood = 1), + list(/obj/item/stack/material/stick = 1), + list(/obj/item/stack/material/fiber = 2) ) time = 60 category = CAT_TOOL @@ -61,7 +61,7 @@ /datum/crafting_recipe/sticks name = "sticks" result = /obj/item/stack/material/stick/fivestack - reqs = list(/obj/item/stack/material/wood = 1) + reqs = list(list(/obj/item/stack/material/wood = 1)) tool_paths = list(/obj/item/weapon/material/knife) time = 200 category = CAT_MISC @@ -70,10 +70,10 @@ name = "stone axe" result = /obj/item/weapon/material/knife/machete/hatchet/stone reqs = list( - /obj/item/weapon/material/knife/stone = 1, - /obj/item/stack/material/flint = 1, - /obj/item/stack/material/stick = 10, - /obj/item/stack/material/fiber = 3 + list(/obj/item/weapon/material/knife/stone = 1), + list(/obj/item/stack/material/flint = 1), + list(/obj/item/stack/material/stick = 1), + list(/obj/item/stack/material/fiber = 3) ) time = 120 category = CAT_WEAPONRY @@ -83,10 +83,10 @@ name = "stone axe" result = /obj/item/weapon/material/knife/machete/hatchet/stone/bone reqs = list( - /obj/item/weapon/material/knife/stone = 1, - /obj/item/stack/material/flint = 1, - /obj/item/weapon/bone = 1, - /obj/item/stack/material/fiber = 3 + list(/obj/item/weapon/material/knife/stone = 1), + list(/obj/item/stack/material/flint = 1), + list(/obj/item/weapon/bone = 1), + list(/obj/item/stack/material/fiber = 3) ) time = 120 category = CAT_WEAPONRY @@ -96,10 +96,10 @@ name = "stone spear" result = /obj/item/weapon/material/twohanded/spear/flint reqs = list( - /obj/item/weapon/material/knife/stone = 1, - /obj/item/stack/material/flint = 1, - /obj/item/stack/material/wood = 2, - /obj/item/stack/material/fiber = 3 + list(/obj/item/weapon/material/knife/stone = 1), + list(/obj/item/stack/material/flint = 1), + list(/obj/item/stack/material/wood = 2), + list(/obj/item/stack/material/fiber = 3) ) time = 120 category = CAT_WEAPONRY @@ -109,10 +109,10 @@ name = "stone spear" result = /obj/item/weapon/material/twohanded/spear/flint reqs = list( - /obj/item/weapon/material/knife/stone = 1, - /obj/item/stack/material/flint = 1, - /obj/item/weapon/bone = 2, - /obj/item/stack/material/fiber = 3 + list(/obj/item/weapon/material/knife/stone = 1), + list(/obj/item/stack/material/flint = 1), + list(/obj/item/weapon/bone = 2), + list(/obj/item/stack/material/fiber = 3) ) time = 120 category = CAT_WEAPONRY @@ -121,6 +121,6 @@ /datum/crafting_recipe/ropebindings name = "rope bindings" result = /obj/item/weapon/handcuffs/cable/plantfiber - reqs = list(/obj/item/stack/material/fiber = 3) + reqs = list(list(/obj/item/stack/material/fiber = 3)) time = 60 category = CAT_MISC \ No newline at end of file diff --git a/code/datums/components/crafting/recipes/weapons.dm b/code/datums/components/crafting/recipes/weapons.dm index 40222651378..6baa4b5e9bf 100644 --- a/code/datums/components/crafting/recipes/weapons.dm +++ b/code/datums/components/crafting/recipes/weapons.dm @@ -1,9 +1,23 @@ /datum/crafting_recipe/stunprod name = "Stunprod" result = /obj/item/weapon/melee/baton/cattleprod - reqs = list(/obj/item/weapon/handcuffs/cable = 1, - /obj/item/stack/rods = 1, - /obj/item/weapon/tool/wirecutters = 1) + reqs = list(list(/obj/item/weapon/handcuffs/cable = 1), + list(/obj/item/stack/rods = 1), + list(/obj/item/weapon/tool/wirecutters = 1)) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/spear + name = "Spear" + result = /obj/item/weapon/material/twohanded/spear + reqs = list(list(/obj/item/weapon/handcuffs/cable = 1), + list(/obj/item/stack/rods = 1), + list(/obj/item/weapon/material/shard = 1, + /obj/item/weapon/material/butterflyblade = 1) + ) + parts = list(/obj/item/weapon/material/shard = 1, + /obj/item/weapon/material/butterflyblade = 1) time = 40 category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -11,10 +25,8 @@ /datum/crafting_recipe/shortbow name = "Shortbow" result = /obj/item/weapon/gun/launcher/crossbow/bow - reqs = list( - /obj/item/stack/material/wood = 10, - /obj/item/stack/material/cloth = 5 - ) + reqs = list(list(/obj/item/stack/material/wood = 10), + list(/obj/item/stack/material/cloth = 5)) time = 120 category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -22,10 +34,8 @@ /datum/crafting_recipe/arrow_sandstone name = "Wood arrow (sandstone tip)" result = /obj/item/weapon/arrow/standard - reqs = list( - /obj/item/stack/material/wood = 2, - /obj/item/stack/material/sandstone = 2 - ) + reqs = list(list(/obj/item/stack/material/wood = 2), + list(/obj/item/stack/material/sandstone = 2)) time = 40 category = CAT_WEAPONRY subcategory = CAT_AMMO @@ -33,10 +43,8 @@ /datum/crafting_recipe/arrow_marble name = "Wood arrow (marble tip)" result = /obj/item/weapon/arrow/standard - reqs = list( - /obj/item/stack/material/wood = 2, - /obj/item/stack/material/marble = 2 - ) + reqs = list(list(/obj/item/stack/material/wood = 2), + list(/obj/item/stack/material/marble = 2)) time = 40 category = CAT_WEAPONRY subcategory = CAT_AMMO diff --git a/code/datums/outfits/jobs/engineering.dm b/code/datums/outfits/jobs/engineering.dm index a2aba61a969..86bf9fa8cfa 100644 --- a/code/datums/outfits/jobs/engineering.dm +++ b/code/datums/outfits/jobs/engineering.dm @@ -1,6 +1,6 @@ /decl/hierarchy/outfit/job/engineering hierarchy_type = /decl/hierarchy/outfit/job/engineering - belt = /obj/item/weapon/storage/belt/utility/full + belt = /obj/item/weapon/storage/belt/utility/full/multitool l_ear = /obj/item/device/radio/headset/headset_eng shoes = /obj/item/clothing/shoes/boots/workboots r_pocket = /obj/item/device/t_scanner diff --git a/code/datums/outfits/jobs/science.dm b/code/datums/outfits/jobs/science.dm index 307da0a8f99..fcccfb8f8c6 100644 --- a/code/datums/outfits/jobs/science.dm +++ b/code/datums/outfits/jobs/science.dm @@ -34,7 +34,7 @@ name = OUTFIT_JOB_NAME("Roboticist") uniform = /obj/item/clothing/under/rank/roboticist shoes = /obj/item/clothing/shoes/black - belt = /obj/item/weapon/storage/belt/utility/full + belt = /obj/item/weapon/storage/belt/utility/full/multitool id_type = /obj/item/weapon/card/id/science pda_slot = slot_r_store pda_type = /obj/item/device/pda/roboticist diff --git a/code/defines/obj.dm b/code/defines/obj.dm index f6a8ebfbe07..db64bd85465 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -100,5 +100,21 @@ user.drop_item() src.throw_at(target, throw_range, throw_speed, user) +/obj/item/weapon/beach_ball/dodgeball + icon = 'icons/obj/balls_vr.dmi' + icon_state = "dodgeball" + item_state = "dodgeball" + item_icons = list(slot_l_hand_str = 'icons/mob/items/lefthand_balls_vr.dmi', slot_r_hand_str = 'icons/mob/items/righthand_balls_vr.dmi') + name = "dodgeball" + desc = "Think fast, chucklenuts!" + w_class = ITEMSIZE_LARGE //Stops people from hiding it in their bags/pockets + force = 0.1 + throwforce = 0.1 + throw_speed = 5 + throw_range = 15 + drop_sound = 'sound/items/drop/rubber.ogg' + pickup_sound = 'sound/items/pickup/rubber.ogg' + hitsound = 'sound/weapons/dodgeball.ogg' + /obj/effect/spawner name = "object spawner" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 90d43a7c36c..e11bf6e2c20 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -43,7 +43,9 @@ var/no_air = null // var/list/lights // list of all lights on this area var/list/all_doors = null //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area + var/list/all_arfgs = null //Similar, but a list of all arfgs adjacent to this area var/firedoors_closed = 0 + var/arfgs_active = 0 var/list/ambience = list() var/list/forced_ambience = null var/sound_env = STANDARD_STATION @@ -128,10 +130,11 @@ return 1 return 0 -// Either close or open firedoors depending on current alert statuses +// Either close or open firedoors and arfgs depending on current alert statuses /area/proc/firedoors_update() if(fire || party || atmosalm) firedoors_close() + arfgs_activate() // VOREStation Edit - Make the lights colored! if(fire) for(var/obj/machinery/light/L in src) @@ -142,6 +145,7 @@ // VOREStation Edit End else firedoors_open() + arfgs_deactivate() // VOREStation Edit - Put the lights back! for(var/obj/machinery/light/L in src) L.reset_alert() @@ -175,6 +179,25 @@ spawn(0) E.open() +// Activate all retention fields! +/area/proc/arfgs_activate() + if(!arfgs_active) + arfgs_active = TRUE + if(!all_arfgs) + return + for(var/obj/machinery/atmospheric_field_generator/E in all_arfgs) + E.generate_field() //don't need to check powered state like doors, the arfgs handles it on its end + E.wasactive = TRUE + +// Deactivate retention fields! +/area/proc/arfgs_deactivate() + if(arfgs_active) + arfgs_active = FALSE + if(!all_arfgs) + return + for(var/obj/machinery/atmospheric_field_generator/E in all_arfgs) + E.disable_field() + E.wasactive = FALSE /area/proc/fire_alert() if(!fire) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 183cbf4ca8a..55b6938a7cc 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -477,7 +477,11 @@ src.germ_level = 0 if(istype(blood_DNA, /list)) blood_DNA = null - return 1 + return TRUE + +/atom/proc/on_rag_wipe(var/obj/item/weapon/reagent_containers/glass/rag/R) + clean_blood() + R.reagents.splash(src, 1) /atom/proc/get_global_map_pos() if(!islist(global_map) || isemptylist(global_map)) return diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 596f078eca9..2138298e6d6 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -23,7 +23,10 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) economic_modifier = 20 minimum_character_age = 25 + min_age_by_species = list(SPECIES_HUMAN_VATBORN = 14) ideal_character_age = 70 // Old geezer captains ftw + ideal_age_by_species = list(SPECIES_HUMAN_VATBORN = 55) /// Vatborn live shorter, no other race eligible for captain besides human/skrell + banned_job_species = list(SPECIES_UNATHI, SPECIES_TAJ, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "mechanical", "digital") outfit_type = /decl/hierarchy/outfit/job/captain job_description = "The Site Manager manages the other Command Staff, and through them the rest of the station. Though they have access to everything, \ @@ -31,6 +34,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) have an understanding of Standard Operating Procedure, and is subject to it, and legal action, in the same way as every other crew member." alt_titles = list("Overseer"= /datum/alt_title/overseer) + /* /datum/job/captain/equip(var/mob/living/carbon/human/H) . = ..() @@ -66,7 +70,10 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) economic_modifier = 10 minimum_character_age = 25 + min_age_by_species = list(SPECIES_UNATHI = 70, SPECIES_TESHARI = 20, "mechanical" = 10, SPECIES_HUMAN_VATBORN = 14) ideal_character_age = 50 + ideal_age_by_species = list(SPECIES_UNATHI = 140, SPECIES_TESHARI = 27, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20) + banned_job_species = list(SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital", SPECIES_DIONA) outfit_type = /decl/hierarchy/outfit/job/hop job_description = "The Head of Personnel manages the Service department, the Exploration team, and most other civilians. They also \ diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index febbd265b29..b80257fee53 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -99,6 +99,7 @@ economic_modifier = 5 access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) + banned_job_species = list("digital", SPECIES_PROMETHEAN) ideal_character_age = 40 @@ -231,6 +232,7 @@ access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads) minimal_access = list(access_lawyer, access_sec_doors, access_heads) minimal_player_age = 7 + banned_job_species = list(SPECIES_PROMETHEAN, SPECIES_UNATHI, SPECIES_DIONA, SPECIES_TESHARI, SPECIES_ZADDAT, "digital") outfit_type = /decl/hierarchy/outfit/job/internal_affairs_agent job_description = "An Internal Affairs Agent makes sure that the crew is following Standard Operating Procedure. They also \ diff --git a/code/game/jobs/job/civilian_vr.dm b/code/game/jobs/job/civilian_vr.dm index eb043069120..a8a8b90d5e4 100644 --- a/code/game/jobs/job/civilian_vr.dm +++ b/code/game/jobs/job/civilian_vr.dm @@ -219,7 +219,8 @@ job_description = "An entertainer does just that, entertains! Put on plays, play music, sing songs, tell stories, or read your favorite fanfic." alt_titles = list("Performer" = /datum/alt_title/performer, "Musician" = /datum/alt_title/musician, "Stagehand" = /datum/alt_title/stagehand, "Actor" = /datum/alt_title/actor, "Dancer" = /datum/alt_title/dancer, "Singer" = /datum/alt_title/singer, - "Magician" = /datum/alt_title/magician, "Comedian" = /datum/alt_title/comedian, "Tragedian" = /datum/alt_title/tragedian) + "Magician" = /datum/alt_title/magician, "Comedian" = /datum/alt_title/comedian, "Tragedian" = /datum/alt_title/tragedian, + "Artist" = /datum/alt_title/artist) // Entertainer Alt Titles /datum/alt_title/actor @@ -256,4 +257,8 @@ /datum/alt_title/tragedian title = "Tragedian" - title_blurb = "A Tragedian will focus on making people think about life and world around them! Life is a tragedy, and who's better to convey its emotions than you?" \ No newline at end of file + title_blurb = "A Tragedian will focus on making people think about life and world around them! Life is a tragedy, and who's better to convey its emotions than you?" + +/datum/alt_title/artist + title = "Artist" + title_blurb = "An Artist's calling is to create beautiful arts! Whatever form may they take, create and have people astonished with your creativity." \ No newline at end of file diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index ae937d106b3..95bfd63f7f2 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -17,7 +17,10 @@ economic_modifier = 10 minimum_character_age = 25 + min_age_by_species = list(SPECIES_UNATHI = 70, "mechanical" = 10, SPECIES_HUMAN_VATBORN = 14) ideal_character_age = 50 + ideal_age_by_species = list(SPECIES_UNATHI = 140, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20) + banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital") access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, @@ -55,6 +58,7 @@ "Engine Technician" = /datum/alt_title/engine_tech, "Electrician" = /datum/alt_title/electrician) minimal_player_age = 3 + min_age_by_species = list(SPECIES_PROMETHEAN = 2) outfit_type = /decl/hierarchy/outfit/job/engineering/engineer job_description = "An Engineer keeps the station running. They repair damages, keep the atmosphere stable, and ensure that power is being \ @@ -94,6 +98,7 @@ minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks) minimal_player_age = 3 + min_age_by_species = list(SPECIES_PROMETHEAN = 2) outfit_type = /decl/hierarchy/outfit/job/engineering/atmos job_description = "An Atmospheric Technician is primarily concerned with keeping the station's atmosphere breathable. They are expected to have a good \ diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index a1ca7564624..509572aa98d 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -22,7 +22,10 @@ var/department_accounts = null // Which department accounts should people with this position be given the pin for? var/assignable = TRUE // Should it show up on things like the ID computer? var/minimum_character_age = 0 + var/list/min_age_by_species = null var/ideal_character_age = 30 + var/list/ideal_age_by_species = null + var/list/banned_job_species = null var/has_headset = TRUE //Do people with this job need to be given headsets and told how to use them? E.g. Cyborgs don't. var/account_allowed = 1 // Does this job type come with a station account? @@ -158,4 +161,25 @@ if(mannequin.back) var/obj/O = mannequin.back mannequin.drop_from_inventory(O) - qdel(O) \ No newline at end of file + qdel(O) + +///Assigns minimum age by race & brain type. Code says Positronic = mechanical and Drone = digital because nothing can be simple. +///Will first check based on brain type, then based on species. +/datum/job/proc/get_min_age(species_name, brain_type) + return minimum_character_age // VOREStation Edit - Minimum character age by rules is 18, return default which is standard for all species + //return (brain_type && LAZYACCESS(min_age_by_species, brain_type)) || LAZYACCESS(min_age_by_species, species_name) || minimum_character_age //VOREStation Removal + +/datum/job/proc/get_ideal_age(species_name, brain_type) + return ideal_character_age // VOREStation Edit - Minimum character age by rules is 18, return default which is standard for all species + //return (brain_type && LAZYACCESS(ideal_age_by_species, brain_type)) || LAZYACCESS(ideal_age_by_species, brain_type) || ideal_character_age //VOREStation Removal + +/datum/job/proc/is_species_banned(species_name, brain_type) + return FALSE // VOREStation Edit - Any species can be any job. + /* VOREStation Removal + if(banned_job_species == null) + return + if(species_name in banned_job_species) + return TRUE + if(brain_type in banned_job_species) + return TRUE + */ \ No newline at end of file diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index e74b0798b6a..7594ade21fb 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -23,8 +23,11 @@ access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels) minimum_character_age = 25 + min_age_by_species = list(SPECIES_UNATHI = 70, "mechanical" = 10, SPECIES_HUMAN_VATBORN = 14) minimal_player_age = 10 ideal_character_age = 50 + ideal_age_by_species = list(SPECIES_UNATHI = 140, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20) + banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital") outfit_type = /decl/hierarchy/outfit/job/medical/cmo job_description = "The CMO manages the Medical department and is a position requiring experience and skill; their goal is to ensure that their \ @@ -58,6 +61,8 @@ "Nurse" = /datum/alt_title/nurse, "Virologist" = /datum/alt_title/virologist) + min_age_by_species = list(SPECIES_PROMETHEAN = 3) + //Medical Doctor Alt Titles /datum/alt_title/surgeon title = "Surgeon" @@ -103,6 +108,7 @@ access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics) minimal_access = list(access_medical, access_medical_equip, access_chemistry) minimal_player_age = 3 + min_age_by_species = list(SPECIES_PROMETHEAN = 3) outfit_type = /decl/hierarchy/outfit/job/medical/chemist job_description = "A Chemist produces and maintains a stock of basic to advanced chemicals for medical and occasionally research use. \ @@ -157,6 +163,7 @@ job_description = "A Psychiatrist provides mental health services to crew members in need. They may also be called upon to determine whatever \ ails the mentally unwell, frequently under Security supervision. They understand the effects of various psychoactive drugs." alt_titles = list("Psychologist" = /datum/alt_title/psychologist) + banned_job_species = list(SPECIES_PROMETHEAN, SPECIES_DIONA) //Psychiatrist Alt Titles /datum/alt_title/psychologist @@ -185,6 +192,9 @@ job_description = "A Paramedic is primarily concerned with the recovery of patients who are unable to make it to the Medical Department on their own. \ They may also be called upon to keep patients stable when Medical is busy or understaffed." alt_titles = list("Emergency Medical Technician" = /datum/alt_title/emt) + banned_job_species = list(SPECIES_DIONA) + + min_age_by_species = list(SPECIES_PROMETHEAN = 2) // Paramedic Alt Titles /datum/alt_title/emt diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 79d1be6c3bf..805cd683beb 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -26,7 +26,10 @@ minimum_character_age = 25 minimal_player_age = 14 + min_age_by_species = list(SPECIES_UNATHI = 70, "mechanical" = 10, SPECIES_HUMAN_VATBORN = 14) ideal_character_age = 50 + ideal_age_by_species = list(SPECIES_UNATHI = 140, "mechanical" = 20, SPECIES_HUMAN_VATBORN = 20) + banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital") outfit_type = /decl/hierarchy/outfit/job/science/rd job_description = "The Research Director manages and maintains the Research department. They are required to ensure the safety of the entire crew, \ @@ -35,6 +38,7 @@ are encouraged to allow their staff to perform their own duties." alt_titles = list("Research Supervisor" = /datum/alt_title/research_supervisor) + // Research Director Alt Titles /datum/alt_title/research_supervisor title = "Research Supervisor" @@ -55,6 +59,8 @@ economic_modifier = 7 access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch) minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch) + min_age_by_species = list(SPECIES_PROMETHEAN = 2) + banned_job_species = list("digital") minimal_player_age = 14 @@ -98,8 +104,10 @@ economic_modifier = 7 access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics) minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage) + banned_job_species = list("digital") minimal_player_age = 14 + min_age_by_species = list(SPECIES_PROMETHEAN = 2) outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist job_description = "A Xenobiologist studies esoteric lifeforms, usually in the relative safety of their lab. They attempt to find ways to benefit \ @@ -131,6 +139,8 @@ VR edit end*/ access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access. minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access. minimal_player_age = 7 + min_age_by_species = list(SPECIES_PROMETHEAN = 2) + banned_job_species = list("digital") outfit_type = /decl/hierarchy/outfit/job/science/roboticist job_description = "A Roboticist maintains and repairs the station's synthetics, including crew with prosthetic limbs. \ diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 631b81e16ea..07b363b67fc 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -24,7 +24,11 @@ access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) minimum_character_age = 25 + min_age_by_species = list(SPECIES_HUMAN_VATBORN = 14) minimal_player_age = 14 + ideal_character_age = 50 + ideal_age_by_species = list(SPECIES_HUMAN_VATBORN = 20) + banned_job_species = list(SPECIES_TESHARI, SPECIES_DIONA, SPECIES_PROMETHEAN, SPECIES_ZADDAT, "digital", SPECIES_UNATHI, "mechanical") outfit_type = /decl/hierarchy/outfit/job/security/hos job_description = " The Head of Security manages the Security Department, keeping the station safe and making sure the rules are followed. They are expected to \ @@ -32,6 +36,7 @@ perform the duties of absent Security roles, such as distributing gear from the Armory." alt_titles = list("Security Commander" = /datum/alt_title/sec_commander, "Chief of Security" = /datum/alt_title/sec_chief) + // Head of Security Alt Titles /datum/alt_title/sec_commander title = "Security Commander" @@ -57,6 +62,7 @@ access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks) minimal_player_age = 5 + banned_job_species = list(SPECIES_ZADDAT, SPECIES_PROMETHEAN, SPECIES_TESHARI, SPECIES_DIONA) outfit_type = /decl/hierarchy/outfit/job/security/warden job_description = "The Warden watches over the physical Security Department, making sure the Brig and Armoury are secure and in order at all times. They oversee \ @@ -81,6 +87,7 @@ minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks) economic_modifier = 5 minimal_player_age = 3 + banned_job_species = list(SPECIES_ZADDAT, SPECIES_PROMETHEAN, SPECIES_DIONA) outfit_type = /decl/hierarchy/outfit/job/security/detective job_description = "A Detective works to help Security find criminals who have not properly been identified, through interviews and forensic work. \ @@ -110,6 +117,7 @@ access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks) minimal_player_age = 3 + banned_job_species = list(SPECIES_ZADDAT, SPECIES_TESHARI, SPECIES_DIONA) outfit_type = /decl/hierarchy/outfit/job/security/officer job_description = "A Security Officer is concerned with maintaining the safety and security of the station as a whole, dealing with external threats and \ @@ -117,6 +125,8 @@ No one is above the Law, not Security or Command." alt_titles = list("Junior Officer" = /datum/alt_title/junior_officer) + min_age_by_species = list(SPECIES_PROMETHEAN = 3) + // Security Officer Alt Titles /datum/alt_title/junior_officer title = "Junior Officer" diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 2e45691570e..2c8f6dd8b8d 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -54,7 +54,7 @@ var/global/datum/controller/occupations/job_master var/datum/job/job = GetJob(rank) if(!job) return 0 - if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age)) + if((job.minimum_character_age || job.min_age_by_species) && (player.client.prefs.age < job.get_min_age(player.client.prefs.species, player.client.prefs.organ_data["brain"]))) return 0 if(jobban_isbanned(player, rank)) return 0 @@ -97,7 +97,7 @@ var/global/datum/controller/occupations/job_master if(!job.player_old_enough(player.client)) Debug("FOC player not old enough, Player: [player]") continue - if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age)) + if(job.minimum_character_age && (player.client.prefs.age < job.get_min_age(player.client.prefs.species, player.client.prefs.organ_data["brain"]))) Debug("FOC character not old enough, Player: [player]") continue //VOREStation Code Start @@ -108,6 +108,9 @@ var/global/datum/controller/occupations/job_master Debug("FOC is_job_whitelisted failed, Player: [player]") continue //VOREStation Code End + if(job.is_species_banned(player.client.prefs.species, player.client.prefs.organ_data["brain"]) == TRUE) + Debug("FOC character species invalid for job, Player: [player]") + continue if(flag && !(player.client.prefs.be_special & flag)) Debug("FOC flag failed, Player: [player], Flag: [flag], ") continue @@ -122,7 +125,10 @@ var/global/datum/controller/occupations/job_master if(!job) continue - if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age)) + if((job.minimum_character_age || job.min_age_by_species) && (player.client.prefs.age < job.get_min_age(player.client.prefs.species, player.client.prefs.organ_data["brain"]))) + continue + + if(job.is_species_banned(player.client.prefs.species, player.client.prefs.organ_data["brain"]) == TRUE) continue if(istype(job, GetJob(USELESS_JOB))) // We don't want to give him assistant, that's boring! //VOREStation Edit - Visitor not Assistant @@ -180,20 +186,18 @@ var/global/datum/controller/occupations/job_master if(!V.client) continue var/age = V.client.prefs.age - if(age < job.minimum_character_age) // Nope. + if(age < job.get_min_age(V.client.prefs.species, V.client.prefs.organ_data["brain"])) // Nope. continue - switch(age) - if(job.minimum_character_age to (job.minimum_character_age+10)) - weightedCandidates[V] = 3 // Still a bit young. - if((job.minimum_character_age+10) to (job.ideal_character_age-10)) - weightedCandidates[V] = 6 // Better. - if((job.ideal_character_age-10) to (job.ideal_character_age+10)) - weightedCandidates[V] = 10 // Great. - if((job.ideal_character_age+10) to (job.ideal_character_age+20)) - weightedCandidates[V] = 6 // Still good. - if((job.ideal_character_age+20) to INFINITY) - weightedCandidates[V] = 3 // Geezer. + var/idealage = job.get_ideal_age(V.client.prefs.species, V.client.prefs.organ_data["brain"]) + var/agediff = abs(idealage - age) // Compute the absolute difference in age from target + switch(agediff) /// If the math sucks, it's because I almost failed algebra in high school. + if(20 to INFINITY) + weightedCandidates[V] = 3 // Too far off + if(10 to 20) + weightedCandidates[V] = 6 // Nearer the mark, but not quite + if(0 to 10) + weightedCandidates[V] = 10 // On the mark else // If there's ABSOLUTELY NOBODY ELSE if(candidates.len == 1) weightedCandidates[V] = 1 diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index af25d2ed542..b47e3787a85 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -89,6 +89,27 @@ var/list/whitelist = list() return FALSE +/proc/is_borg_whitelisted(mob/M, var/module) + //They are admin or the whitelist isn't in use + if(whitelist_overrides(M)) + return 1 + + //You did something wrong + if(!M || !module) + return 0 + + //Module is not even whitelisted + if(!(module in whitelisted_module_types)) + return 1 + + //If we have a loaded file, search it + if(alien_whitelist) + for (var/s in alien_whitelist) + if(findtext(s,"[M.ckey] - [module]")) + return 1 + if(findtext(s,"[M.ckey] - All")) + return 1 + /proc/whitelist_overrides(mob/M) if(!config.usealienwhitelist) return TRUE diff --git a/code/game/machinery/atm_ret_field.dm b/code/game/machinery/atm_ret_field.dm new file mode 100644 index 00000000000..9e9a2af168e --- /dev/null +++ b/code/game/machinery/atm_ret_field.dm @@ -0,0 +1,233 @@ +/obj/machinery/atmospheric_field_generator + name = "atmospheric retention field generator" + desc = "A floor-mounted piece of equipment that generates an atmosphere-retaining energy field when powered and activated. Linked to environmental alarm systems and will automatically activate when hazardous conditions are detected.

Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences." + icon = 'icons/obj/atm_fieldgen.dmi' + icon_state = "arfg_off" + anchored = TRUE + opacity = FALSE + density = FALSE + power_channel = ENVIRON //so they shut off last + use_power = USE_POWER_IDLE + idle_power_usage = 10 + active_power_usage = 2500 + var/ispowered = TRUE + var/isactive = FALSE + var/wasactive = FALSE //controls automatic reboot after power-loss + var/alwaysactive = FALSE //for a special subtype + + //how long it takes us to reboot if we're shut down by an EMP + var/reboot_delay_min = 50 + var/reboot_delay_max = 75 + + var/hatch_open = FALSE + var/wires_intact = TRUE + var/list/areas_added + var/field_type = /obj/structure/atmospheric_retention_field + circuit = /obj/item/weapon/circuitboard/arf_generator + +/obj/machinery/atmospheric_field_generator/impassable + desc = "An older model of ARF-G that generates an impassable retention field. Works just as well as the modern variety, but is slightly more energy-efficient.

Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences." + active_power_usage = 2000 + field_type = /obj/structure/atmospheric_retention_field/impassable + +/obj/machinery/atmospheric_field_generator/perma + name = "static atmospheric retention field generator" + desc = "A floor-mounted piece of equipment that generates an atmosphere-retaining energy field when powered and activated. This model is designed to always be active, though the field will still drop from loss of power or electromagnetic interference.

Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences." + alwaysactive = TRUE + active_power_usage = 2000 + +/obj/machinery/atmospheric_field_generator/perma/impassable + active_power_usage = 1500 + field_type = /obj/structure/atmospheric_retention_field/impassable + +/obj/machinery/atmospheric_field_generator/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(W.is_crowbar() && isactive) + if(!src) return + to_chat(user, "You can't open the ARF-G whilst it's running!") + return + if(W.is_crowbar() && !isactive) + if(!src) return + to_chat(user, "You [hatch_open? "close" : "open"] \the [src]'s access hatch.") + hatch_open = !hatch_open + update_icon() + if(alwaysactive && wires_intact) + generate_field() + return + if(hatch_open && W.is_multitool()) + if(!src) return + to_chat(user, "You toggle \the [src]'s activation behavior to [alwaysactive? "emergency" : "always-on"].") + alwaysactive = !alwaysactive + update_icon() + return + if(hatch_open && W.is_wirecutter()) + if(!src) return + to_chat(user, "You [wires_intact? "cut" : "mend"] \the [src]'s wires!") + wires_intact = !wires_intact + update_icon() + return + if(hatch_open && istype(W,/obj/item/weapon/weldingtool)) + if(!src) return + var/obj/item/weapon/weldingtool/WT = W + if(!WT.isOn()) return + if(WT.get_fuel() < 5) // uses up 5 fuel. + to_chat(user, "You need more fuel to complete this task.") + return + user.visible_message("[user] starts to disassemble \the [src].", "You start to disassemble \the [src].") + playsound(src, WT.usesound, 50, 1) + if(do_after(user,15 * W.toolspeed)) + if(!src || !user || !WT.remove_fuel(5, user)) return + to_chat(user, "You fully disassemble \the [src]. There were no salvageable parts.") + qdel(src) + return + +/obj/machinery/atmospheric_field_generator/perma/Initialize() + generate_field() + +/obj/machinery/atmospheric_field_generator/update_icon() + if(stat & BROKEN) + icon_state = "arfg_broken" + else if(hatch_open && wires_intact) + icon_state = "arfg_open_wires" + else if(hatch_open && !wires_intact) + icon_state = "arfg_open_wirescut" + else if(isactive) + icon_state = "arfg_on" + else + icon_state = "arfg_off" + +/obj/machinery/atmospheric_field_generator/power_change() + var/oldstat + ..() + if(!(stat & NOPOWER)) + ispowered = 1 + update_icon() + if(alwaysactive || wasactive) //reboot our field if we were on or are supposed to be always-on + generate_field() + if(stat != oldstat && isactive && (stat & NOPOWER)) + ispowered = 0 + disable_field() + update_icon() + +/obj/machinery/atmospheric_field_generator/emp_act() + . = ..() + disable_field() //shutting dowwwwwwn + if(alwaysactive || wasactive) //reboot after a short delay if we were online before + spawn(rand(reboot_delay_min,reboot_delay_max)) + generate_field() + +/obj/machinery/atmospheric_field_generator/ex_act(severity) + switch(severity) + if(1) + disable_field() + qdel(src) + return + if(2) + stat |= BROKEN + update_icon() + src.visible_message("The ARF-G cracks and shatters!","You hear an uncomfortable metallic crunch.") + disable_field() + if(3) + emp_act() + return + +/obj/machinery/atmospheric_field_generator/proc/generate_field() + if(!ispowered || hatch_open || !wires_intact || isactive) //if it's not powered, the hatch is open, the wires are busted, or it's already on, don't do anything + return + else + isactive = 1 + icon_state = "arfg_on" + new field_type (src.loc) + src.visible_message("The ARF-G crackles to life!","You hear an ARF-G coming online!") + update_use_power(USE_POWER_ACTIVE) + return + +/obj/machinery/atmospheric_field_generator/proc/disable_field() + if(isactive) + icon_state = "arfg_off" + for(var/obj/structure/atmospheric_retention_field/F in loc) + qdel(F) + src.visible_message("The ARF-G shuts down with a low hum.","You hear an ARF-G powering down.") + update_use_power(USE_POWER_IDLE) + isactive = 0 + return + +/obj/machinery/atmospheric_field_generator/Initialize() + . = ..() + //Delete ourselves if we find extra mapped in arfgs + for(var/obj/machinery/atmospheric_field_generator/F in loc) + if(F != src) + log_debug("Duplicate ARFGS at [x],[y],[z]") + return INITIALIZE_HINT_QDEL + + var/area/A = get_area(src) + ASSERT(istype(A)) + + LAZYADD(A.all_arfgs, src) + areas_added = list(A) + + for(var/direction in cardinal) + A = get_area(get_step(src,direction)) + if(istype(A) && !(A in areas_added)) + LAZYADD(A.all_arfgs, src) + areas_added += A + +/obj/structure/atmospheric_retention_field + name = "atmospheric retention field" + desc = "A shimmering forcefield that keeps the good air inside and the bad air outside. This field has been modulated so that it doesn't impede movement or projectiles.

Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences." + icon = 'icons/obj/atm_fieldgen.dmi' + icon_state = "arfg_field" + anchored = TRUE + density = FALSE + opacity = 0 + plane = MOB_PLANE + layer = ABOVE_MOB_LAYER + //mouse_opacity = 0 + can_atmos_pass = ATMOS_PASS_NO + var/basestate = "arfg_field" + + light_range = 3 + light_power = 1 + light_color = "#FFFFFF" + light_on = TRUE + +/obj/structure/atmospheric_retention_field/update_icon() + cut_overlays() //overlays.Cut() + var/list/dirs = list() + for(var/obj/structure/atmospheric_retention_field/F in orange(src,1)) + dirs += get_dir(src, F) + + var/list/connections = dirs_to_corner_states(dirs) + + icon_state = "" + for(var/i = 1 to 4) + var/image/I = image(icon, "[basestate][connections[i]]", dir = 1<<(i-1)) + add_overlay(I) + + return + +/obj/structure/atmospheric_retention_field/Initialize() + . = ..() + update_nearby_tiles() //Force ZAS update + update_connections(1) + update_icon() + +/obj/structure/atmospheric_retention_field/Destroy() + for(var/obj/structure/atmospheric_retention_field/W in orange(1, src.loc)) + W.update_connections(1) + update_nearby_tiles() //Force ZAS update + . = ..() + +/obj/structure/atmospheric_retention_field/attack_hand(mob/user as mob) + if(density) + visible_message("You touch the retention field, and it crackles faintly. Tingly!") + else + visible_message("You try to touch the retention field, but pass through it like it isn't even there.") + +/obj/structure/atmospheric_retention_field/ex_act() + return + +/obj/structure/atmospheric_retention_field/impassable + desc = "A shimmering forcefield that keeps the good air inside and the bad air outside. It seems fairly solid, almost like it's made out of some kind of hardened light.

Note: prolonged immersion in active atmospheric retention fields may have negative long-term health consequences." + icon = 'icons/obj/atm_fieldgen.dmi' + icon_state = "arfg_field" + density = TRUE \ No newline at end of file diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 32fbaf3082f..869756f9874 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -22,9 +22,11 @@ name = "\improper Atmospherics PCU" desc = "A personal computer unit. It seems to have only the Atmosphereics Control program installed." icon_screen = "pcu_atmo" - icon_state = "pcu" + icon_state = "pcu_engi" icon_keyboard = "pcu_key" density = FALSE + light_color = "#00cc00" + density = 0 /obj/machinery/computer/atmoscontrol/attack_ai(var/mob/user as mob) tgui_interact(user) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index af7b04dc339..63b067d5425 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -497,9 +497,9 @@ name = "\improper Medical Laptop" desc = "A personal computer unit. It seems to have only the medical records program installed." icon_screen = "pcu_generic" - icon_state = "pcu" + icon_state = "pcu_med" icon_keyboard = "pcu_key" - light_color = "#59888e8" + light_color = "#5284e7" circuit = /obj/item/weapon/circuitboard/med_data/pcu density = FALSE diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 3c209280a69..7fe2e803648 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -12,7 +12,7 @@ icon_screen = "pcu_generic" icon_state = "pcu" icon_keyboard = "pcu_key" - light_color = "#59888e8" + light_color = "#5284e7" req_one_access = list(access_heads) circuit = /obj/item/weapon/circuitboard/skills/pcu density = FALSE diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 78f8569cb4f..be8639e4bcc 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -95,7 +95,7 @@ data["real_name"] = user.real_name data["allow_items"] = allow_items data["crew"] = frozen_crew - + var/list/items = list() if(allow_items) for(var/F in frozen_items) @@ -250,6 +250,10 @@ /obj/machinery/cryopod/robot/door/dorms name = "Residential District Elevator" desc = "A small elevator that goes down to the deeper section of the colony." + icon = 'icons/obj/Cryogenic2_vr.dmi' + icon_state = "lift_closed" + base_icon_state = "lift_open" + occupied_icon_state = "lift_closed" on_store_message = "has departed for the residential district." on_store_name = "Residential Oversight" on_enter_occupant_message = "The elevator door closes slowly, ready to bring you down to the residential district." @@ -259,6 +263,10 @@ /obj/machinery/cryopod/robot/door/travel name = "Passenger Elevator" desc = "A small elevator that goes down to the passenger section of the vessel." + icon = 'icons/obj/Cryogenic2_vr.dmi' + icon_state = "lift_closed" + base_icon_state = "lift_open" + occupied_icon_state = "lift_closed" on_store_message = "is slated to depart from the colony." on_store_name = "Travel Oversight" on_enter_occupant_message = "The elevator door closes slowly, ready to bring you down to the hell that is economy class travel." @@ -491,7 +499,7 @@ for(var/datum/data/record/G in data_core.general) if((G.fields["name"] == to_despawn.real_name)) qdel(G) - + // Also check the hidden version of each datacore, if they're an offmap role. var/datum/job/J = SSjob.get_job(job) if(J?.offmap_spawn) diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index ed4b086e73d..d651ad2025a 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -221,6 +221,11 @@ frame_style = FRAME_STYLE_WALL x_offset = 28 y_offset = 28 + +/datum/frame/frame_types/arfgs + name = "ARF Generator" + frame_class = FRAME_CLASS_MACHINE + frame_size = 3 ////////////////////////////// // Frame Object (Structure) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 82db351ed12..85af948f96e 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -228,6 +228,8 @@ return ..() /obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto=null) + if(!chassis) + return moveto = moveto || get_turf(chassis) forceMove(moveto) chassis.equipment -= src diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 46fa4491c6a..f84126ed998 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -4,7 +4,7 @@ w_class = ITEMSIZE_NORMAL blocks_emissive = EMISSIVE_BLOCK_GENERIC - matter = list(MAT_STEEL = 1) + //matter = list(MAT_STEEL = 1) var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/randpixel = 6 @@ -249,7 +249,7 @@ var/obj/item/weapon/storage/S = src.loc if(!S.remove_from_storage(src)) return - + src.pickup(user) src.throwing = 0 if (src.loc == user) @@ -258,7 +258,7 @@ else if(isliving(src.loc)) return - + if(user.put_in_active_hand(src)) if(isturf(old_loc)) var/obj/effect/temporary_effect/item_pickup_ghost/ghost = new(old_loc) @@ -832,7 +832,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(!inhands) apply_blood(standing) //Some items show blood when bloodied apply_accessories(standing) //Some items sport accessories like webbing - + //Apply overlays to our...overlay apply_overlays(standing) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 9595f1ba808..3b20ccbb5c2 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -1,3 +1,16 @@ +/* + * Contains: + * Flashlights + * Lamps + * Flares + * Chemlights + * Slime Extract + */ + +/* + * Flashlights + */ + /obj/item/device/flashlight name = "flashlight" desc = "A hand-held emergency light." @@ -7,15 +20,15 @@ slot_flags = SLOT_BELT matter = list(MAT_STEEL = 50,MAT_GLASS = 20) action_button_name = "Toggle Flashlight" - + light_system = MOVABLE_LIGHT_DIRECTIONAL light_range = 4 //luminosity when on light_power = 0.8 //lighting power when on light_color = "#FFFFFF" //LIGHT_COLOR_INCANDESCENT_FLASHLIGHT //lighting colour when on light_cone_y_offset = -7 - + var/on = 0 - + var/obj/item/weapon/cell/cell var/cell_type = /obj/item/weapon/cell/device var/power_usage = 1 @@ -26,7 +39,7 @@ if(power_use && cell_type) cell = new cell_type(src) - + update_brightness() /obj/item/device/flashlight/Destroy() @@ -232,24 +245,34 @@ w_class = ITEMSIZE_TINY power_use = 0 -/obj/item/device/flashlight/color //Default color is blue, just roll with it. +/obj/item/device/flashlight/color //Default color is blue name = "blue flashlight" - desc = "A hand-held emergency light. This one is blue." + desc = "A small flashlight. This one is blue." icon_state = "flashlight_blue" +/obj/item/device/flashlight/color/green + name = "green flashlight" + desc = "A small flashlight. This one is green." + icon_state = "flashlight_green" + +/obj/item/device/flashlight/color/purple + name = "purple flashlight" + desc = "A small flashlight. This one is purple." + icon_state = "flashlight_purple" + /obj/item/device/flashlight/color/red name = "red flashlight" - desc = "A hand-held emergency light. This one is red." + desc = "A small flashlight. This one is red." icon_state = "flashlight_red" /obj/item/device/flashlight/color/orange name = "orange flashlight" - desc = "A hand-held emergency light. This one is orange." + desc = "A small flashlight. This one is orange." icon_state = "flashlight_orange" /obj/item/device/flashlight/color/yellow name = "yellow flashlight" - desc = "A hand-held emergency light. This one is yellow." + desc = "A small flashlight. This one is yellow." icon_state = "flashlight_yellow" /obj/item/device/flashlight/maglight @@ -273,7 +296,11 @@ w_class = ITEMSIZE_TINY power_use = 0 -// the desk lamps are a bit special +/* + * Lamps + */ + +// pixar desk lamp /obj/item/device/flashlight/lamp name = "desk lamp" desc = "A desk lamp with an adjustable mount." @@ -286,14 +313,6 @@ on = 1 light_system = STATIC_LIGHT - -// green-shaded desk lamp -/obj/item/device/flashlight/lamp/green - desc = "A classic green-shaded desk lamp." - icon_state = "lampgreen" - center_of_mass = list("x" = 15,"y" = 11) - light_color = "#FFC58F" - /obj/item/device/flashlight/lamp/verb/toggle_light() set name = "Toggle light" set category = "Object" @@ -302,7 +321,23 @@ if(!usr.stat) attack_self(usr) -// FLARES +// green-shaded desk lamp +/obj/item/device/flashlight/lamp/green + desc = "A classic green-shaded desk lamp." + icon_state = "lampgreen" + center_of_mass = list("x" = 15,"y" = 11) + light_color = "#FFC58F" + +// clown lamp +/obj/item/device/flashlight/lamp/clown + desc = "A whacky banana peel shaped lamp." + icon_state = "bananalamp" + center_of_mass = list("x" = 15,"y" = 11) + + +/* + * Flares + */ /obj/item/device/flashlight/flare name = "flare" @@ -368,18 +403,20 @@ START_PROCESSING(SSobj, src) return 1 -//Glowsticks +/* + * Chemlights + */ /obj/item/device/flashlight/glowstick name = "green glowstick" - desc = "A green military-grade glowstick." + desc = "A green military-grade chemical light." w_class = ITEMSIZE_SMALL light_system = MOVABLE_LIGHT light_range = 4 light_power = 0.9 light_color = "#49F37C" - icon_state = "glowstick" - item_state = "glowstick" + icon_state = "glowstick_green" + item_state = "glowstick_green" var/fuel = 0 power_use = 0 @@ -414,32 +451,45 @@ /obj/item/device/flashlight/glowstick/red name = "red glowstick" - desc = "A red military-grade glowstick." + desc = "A red military-grade chemical light." light_color = "#FC0F29" icon_state = "glowstick_red" item_state = "glowstick_red" /obj/item/device/flashlight/glowstick/blue name = "blue glowstick" - desc = "A blue military-grade glowstick." + desc = "A blue military-grade chemical light." light_color = "#599DFF" icon_state = "glowstick_blue" item_state = "glowstick_blue" /obj/item/device/flashlight/glowstick/orange name = "orange glowstick" - desc = "A orange military-grade glowstick." + desc = "A orange military-grade chemical light." light_color = "#FA7C0B" icon_state = "glowstick_orange" item_state = "glowstick_orange" /obj/item/device/flashlight/glowstick/yellow name = "yellow glowstick" - desc = "A yellow military-grade glowstick." + desc = "A yellow military-grade chemical light." light_color = "#FEF923" icon_state = "glowstick_yellow" item_state = "glowstick_yellow" +/obj/item/device/flashlight/glowstick/radioisotope + name = "radioisotope glowstick" + desc = "A radioisotope powered chemical light. Escaping particles light up the area far brighter on similar levels to flares and for longer" + icon_state = "glowstick_isotope" + item_state = "glowstick_isotope" + + light_range = 8 + light_power = 0.1 + light_color = "#49F37C" + +/* + * Slime Extract + */ /obj/item/device/flashlight/slime gender = PLURAL diff --git a/code/game/objects/items/devices/flashlight_vr.dm b/code/game/objects/items/devices/flashlight_vr.dm deleted file mode 100644 index 876dddc76d8..00000000000 --- a/code/game/objects/items/devices/flashlight_vr.dm +++ /dev/null @@ -1,9 +0,0 @@ -/obj/item/device/flashlight/glowstick/radioisotope - name = "radioisotope glowstick" - desc = "A radioisotope powered glowstick. Escaping particles light up the area far brighter on similar levels to flares and for longer" - icon_state = "glowstick_blue" - item_state = "glowstick_blue" - - light_range = 8 - light_power = 0.1 - light_color = "#599DFF" diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 775b27cc080..c8c8d376c80 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -249,6 +249,12 @@ drop_sound = 'sound/items/drop/soda.ogg' pickup_sound = 'sound/items/pickup/soda.ogg' +/obj/item/trash/tomato + name = "empty tomato soup can" + icon_state = "tomato" + drop_sound = 'sound/items/drop/soda.ogg' + pickup_sound = 'sound/items/pickup/soda.ogg' + /obj/item/trash/spinach name = "empty spinach can" icon_state = "spinach" @@ -410,3 +416,14 @@ name = "burrito packaging" icon_state = "smolburrito" +/obj/item/trash/brainzsnax + name = "\improper BrainzSnax can" + icon_state = "brainzsnax" + drop_sound = 'sound/items/drop/soda.ogg' + pickup_sound = 'sound/items/pickup/soda.ogg' + +/obj/item/trash/brainzsnaxred + name = "\improper BrainzSnax RED can" + icon_state = "brainzsnaxred" + drop_sound = 'sound/items/drop/soda.ogg' + pickup_sound = 'sound/items/pickup/soda.ogg' \ No newline at end of file diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index ade55cbecaf..5a751e35277 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -207,8 +207,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM to_chat(M, "Your [name] goes out.") M.remove_from_mob(src) //un-equip it so the overlays can update M.update_inv_wear_mask(0) - M.update_inv_l_hand(0) - M.update_inv_r_hand(1) qdel(src) else new /obj/effect/decal/cleanable/ash(T) @@ -221,8 +219,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_state = initial(icon_state) item_state = initial(item_state) M.update_inv_wear_mask(0) - M.update_inv_l_hand(0) - M.update_inv_r_hand(1) smoketime = 0 reagents.clear_reagents() name = "empty [initial(name)]" diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm index ddc86fb4edc..7ef7c4bfefc 100644 --- a/code/game/objects/items/weapons/circuitboards/frame.dm +++ b/code/game/objects/items/weapons/circuitboards/frame.dm @@ -255,3 +255,13 @@ /obj/item/weapon/stock_parts/spring = 1, /obj/item/stack/cable_coil = 5) +/obj/item/weapon/circuitboard/arf_generator + name = T_BOARD("atmospheric field generator") + build_path = /obj/machinery/atmospheric_field_generator + board_type = new /datum/frame/frame_types/arfgs + origin_tech = list(TECH_MAGNET = 4, TECH_POWER = 4, TECH_BIO = 3) + req_components = list( + /obj/item/weapon/stock_parts/micro_laser/high = 2, //field emitters + /obj/item/weapon/stock_parts/scanning_module = 1, //atmosphere sensor + /obj/item/weapon/stock_parts/capacitor/adv = 1, //for the JUICE + /obj/item/stack/cable_coil = 10) \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm index c24b296412c..3f97fad2f78 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm @@ -17,4 +17,6 @@ build_path = /obj/machinery/mining/brace board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) - req_components = list() + req_components = list( + /obj/item/weapon/stock_parts/manipulator = 1 + ) diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index 1d32db48889..21fe2757859 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -84,6 +84,13 @@ to_chat(user, SPAN_WARNING("You don't have anything on \the [src].")) //if we have help intent and no food scooped up DON'T STAB OURSELVES WITH THE FORK return +/obj/item/weapon/material/kitchen/utensil/on_rag_wipe() + . = ..() + if(reagents.total_volume > 0) + reagents.clear_reagents() + cut_overlays() + return + /obj/item/weapon/material/kitchen/utensil/fork name = "fork" desc = "It's a fork. Sure is pointy." diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index f5e5d029074..1c92c3e94e8 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -85,13 +85,24 @@ /obj/item/stack/cable_coil/random_belt ) -/obj/item/weapon/storage/belt/utility/atmostech +/obj/item/weapon/storage/belt/utility/full/multitool starts_with = list( /obj/item/weapon/tool/screwdriver, /obj/item/weapon/tool/wrench, /obj/item/weapon/weldingtool, /obj/item/weapon/tool/crowbar, /obj/item/weapon/tool/wirecutters, + /obj/item/stack/cable_coil/random_belt, + /obj/item/device/multitool + ) + +/obj/item/weapon/storage/belt/utility/atmostech + starts_with = list( + /obj/item/weapon/tool/screwdriver, + /obj/item/weapon/tool/wrench, + /obj/item/weapon/weldingtool, + /obj/item/weapon/tool/crowbar, + /obj/item/weapon/tool/wirecutters ) /obj/item/weapon/storage/belt/utility/chief diff --git a/code/game/objects/items/weapons/storage/boxes_vr.dm b/code/game/objects/items/weapons/storage/boxes_vr.dm index 1f2bc914049..e234f22d4a8 100644 --- a/code/game/objects/items/weapons/storage/boxes_vr.dm +++ b/code/game/objects/items/weapons/storage/boxes_vr.dm @@ -25,3 +25,14 @@ /obj/item/weapon/storage/secure/briefcase/trashmoney starts_with = list(/obj/item/weapon/spacecash/c200 = 10) + +/obj/item/weapon/storage/box/brainzsnax + name = "\improper BrainzSnax box" + icon_state = "brainzsnax_box" + desc = "A box designed to hold canned food. This one has BrainzSnax branding printed on it." + can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/canned) + max_storage_space = ITEMSIZE_COST_NORMAL * 6 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax = 6) + +/obj/item/weapon/storage/box/brainzsnax/red + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red = 6) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 673f54340e0..78eb6d5d481 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -69,6 +69,7 @@ throwforce = 2 slot_flags = SLOT_BELT max_storage_space = ITEMSIZE_COST_SMALL * 5 + can_hold = list(/obj/item/weapon/flame/candle) starts_with = list(/obj/item/weapon/flame/candle = 5) /obj/item/weapon/storage/fancy/whitecandle_box @@ -81,6 +82,7 @@ throwforce = 2 slot_flags = SLOT_BELT max_storage_space = ITEMSIZE_COST_SMALL * 5 + can_hold = list(/obj/item/weapon/flame/candle) starts_with = list(/obj/item/weapon/flame/candle/white = 5) /obj/item/weapon/storage/fancy/blackcandle_box @@ -93,6 +95,7 @@ throwforce = 2 slot_flags = SLOT_BELT max_storage_space = ITEMSIZE_COST_SMALL * 5 + can_hold = list(/obj/item/weapon/flame/candle) starts_with = list(/obj/item/weapon/flame/candle/black = 5) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 73f8b7728e8..6dfabb3d867 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -679,6 +679,10 @@ if(!Adjacent(usr)) return + //VOREStation Add: No turf dumping if user is in a belly + if(isbelly(usr.loc)) + return + drop_contents() /obj/item/weapon/storage/proc/drop_contents() // why is this a proc? literally just for RPEDs diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index e62ac35ea84..bd80bf247e0 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -1,7 +1,10 @@ +/* + * Toolboxes + */ /obj/item/weapon/storage/toolbox name = "toolbox" desc = "Danger. Very robust." - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' icon_state = "red" item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red") center_of_mass = list("x" = 16,"y" = 11) @@ -18,8 +21,10 @@ drop_sound = 'sound/items/drop/toolbox.ogg' pickup_sound = 'sound/items/pickup/toolbox.ogg' +//Emergency /obj/item/weapon/storage/toolbox/emergency name = "emergency toolbox" + icon = 'icons/obj/storage_vr.dmi' icon_state = "red" item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red") starts_with = list( @@ -34,8 +39,10 @@ new /obj/item/device/flashlight/flare(src) . = ..() +//Mechanical /obj/item/weapon/storage/toolbox/mechanical name = "mechanical toolbox" + icon = 'icons/obj/storage_vr.dmi' icon_state = "blue" item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue") starts_with = list( @@ -47,8 +54,10 @@ /obj/item/weapon/tool/wirecutters ) +//Electrical /obj/item/weapon/storage/toolbox/electrical name = "electrical toolbox" + icon = 'icons/obj/storage_vr.dmi' icon_state = "yellow" item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow") starts_with = list( @@ -67,8 +76,10 @@ new /obj/item/stack/cable_coil/random(src,30) calibrate_size() +//Syndicate /obj/item/weapon/storage/toolbox/syndicate name = "black and red toolbox" + icon = 'icons/obj/storage_vr.dmi' icon_state = "syndicate" item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi") origin_tech = list(TECH_COMBAT = 1, TECH_ILLEGAL = 1) @@ -94,9 +105,43 @@ /obj/item/device/analyzer ) +//Brass +/obj/item/weapon/storage/toolbox/brass + name = "brass toolbox" + icon = 'icons/obj/storage_vr.dmi' + icon_state = "brass" + item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow") + starts_with = list( + /obj/item/weapon/tool/crowbar/brass, + /obj/item/weapon/tool/wirecutters/brass, + /obj/item/weapon/tool/screwdriver/brass, + /obj/item/weapon/tool/wrench/brass, + /obj/item/weapon/weldingtool/brass + ) + +//Hydro +/obj/item/weapon/storage/toolbox/hydro + name = "hydroponic toolbox" + icon = 'icons/obj/storage_vr.dmi' + icon_state = "green" + item_state_slots = list(slot_r_hand_str = "toolbox_green", slot_l_hand_str = "toolbox_green") + starts_with = list( + /obj/item/device/analyzer/plant_analyzer, + /obj/item/weapon/material/minihoe, + /obj/item/weapon/material/knife/machete/hatchet, + /obj/item/weapon/tool/wirecutters/clippers/trimmers, + /obj/item/weapon/reagent_containers/spray/plantbgone, + /obj/item/weapon/reagent_containers/glass/beaker + ) + +/* + * Lunchboxes + */ + /obj/item/weapon/storage/toolbox/lunchbox max_storage_space = ITEMSIZE_COST_SMALL * 4 //slightly smaller than a toolbox name = "rainbow lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_rainbow" item_state_slots = list(slot_r_hand_str = "toolbox_pink", slot_l_hand_str = "toolbox_pink") desc = "A little lunchbox. This one is the colors of the rainbow!" @@ -125,6 +170,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/heart name = "heart lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_lovelyhearts" item_state_slots = list(slot_r_hand_str = "toolbox_pink", slot_l_hand_str = "toolbox_pink") desc = "A little lunchbox. This one has cute little hearts on it!" @@ -134,6 +180,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/cat name = "cat lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_sciencecatshow" item_state_slots = list(slot_r_hand_str = "toolbox_green", slot_l_hand_str = "toolbox_green") desc = "A little lunchbox. This one has a cute little science cat from a popular show on it!" @@ -143,6 +190,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/nt name = "NanoTrasen brand lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_nanotrasen" item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue") desc = "A little lunchbox. This one is branded with the NanoTrasen logo!" @@ -152,6 +200,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/mars name = "\improper Mojave university lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_marsuniversity" item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red") desc = "A little lunchbox. This one is branded with the Mojave university logo!" @@ -161,6 +210,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/cti name = "\improper CTI lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_cti" item_state_slots = list(slot_r_hand_str = "toolbox_blue", slot_l_hand_str = "toolbox_blue") desc = "A little lunchbox. This one is branded with the CTI logo!" @@ -170,6 +220,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/nymph name = "\improper Diona nymph lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_dionanymph" item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow") desc = "A little lunchbox. This one is an adorable Diona nymph on the side!" @@ -179,6 +230,7 @@ /obj/item/weapon/storage/toolbox/lunchbox/syndicate name = "black and red lunchbox" + icon = 'icons/obj/storage.dmi' icon_state = "lunchbox_syndie" item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi") desc = "A little lunchbox. This one is a sleek black and red, made of a durable steel!" diff --git a/code/game/objects/items/weapons/tools/brass.dm b/code/game/objects/items/weapons/tools/brass.dm new file mode 100644 index 00000000000..eedebe3220d --- /dev/null +++ b/code/game/objects/items/weapons/tools/brass.dm @@ -0,0 +1,32 @@ +/* + * Brass Tools + */ + +//Crowbar +/obj/item/weapon/tool/crowbar/brass + icon_state = "crowbar_brass" + item_state = "crowbar" + +//Cutters +/obj/item/weapon/tool/wirecutters/brass + icon_state = "cutters_brass" + item_state = "cutters_yellow" + +//Screwdriver +/obj/item/weapon/tool/screwdriver/brass + icon_state = "screwdriver_brass" + item_state = "screwdriver_black" + +//Wrench +/obj/item/weapon/tool/wrench/brass + icon_state = "wrench_brass" + item_state = "wrench_brass" + +//Welder +/obj/item/weapon/weldingtool/brass + name = "brass welding tool" + desc = "A welder made from brass fittings." + icon_state = "brasswelder" + max_fuel = 20 + origin_tech = list(TECH_ENGINEERING = 2, TECH_PHORON = 2) + matter = list(MAT_STEEL = 70, MAT_GLASS = 60) \ No newline at end of file diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm index 0d349376565..9da82688c30 100644 --- a/code/game/objects/items/weapons/tools/crowbar.dm +++ b/code/game/objects/items/weapons/tools/crowbar.dm @@ -1,7 +1,6 @@ /* * Crowbar */ - /obj/item/weapon/tool/crowbar name = "crowbar" desc = "Used to remove floors and to pry open doors." @@ -27,6 +26,10 @@ icon_state = "red_crowbar" item_state = "crowbar_red" +/obj/item/weapon/tool/crowbar/old + icon = 'icons/obj/tools.dmi' + icon_state = "old_crowbar" + item_state = "crowbar" /datum/category_item/catalogue/anomalous/precursor_a/alien_crowbar name = "Precursor Alpha Object - Hard Light Pry Tool" diff --git a/code/game/objects/items/weapons/tools/crowbar_vr.dm b/code/game/objects/items/weapons/tools/crowbar_vr.dm index b376c15af85..b846a0e294d 100644 --- a/code/game/objects/items/weapons/tools/crowbar_vr.dm +++ b/code/game/objects/items/weapons/tools/crowbar_vr.dm @@ -7,11 +7,11 @@ desc = "A steel bar with a wedge, designed specifically for opening unpowered doors in an emergency. It comes in a variety of configurations - collect them all!" icon = 'icons/obj/tools_vr.dmi' icon_state = "prybar" + item_state = "crowbar" slot_flags = SLOT_BELT force = 4 throwforce = 5 pry = 1 - item_state = "crowbar" w_class = ITEMSIZE_SMALL origin_tech = list(TECH_ENGINEERING = 1) matter = list(MAT_STEEL = 30) diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 30056ed7a4b..d6181cf126f 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -21,7 +21,7 @@ //R&D tech level origin_tech = list(TECH_ENGINEERING = 1) - + tool_qualities = list(TOOL_WELDER) //Welding tool specific stuff @@ -375,7 +375,7 @@ /obj/item/weapon/weldingtool/hugetank name = "upgraded welding tool" desc = "A much larger welder with a huge tank." - icon_state = "indwelder" + icon_state = "upindwelder" max_fuel = 80 w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_ENGINEERING = 3) @@ -392,6 +392,9 @@ toolspeed = 2 eye_safety_modifier = 1 // Safer on eyes. +/obj/item/weapon/weldingtool/mini/two + icon_state = "miniwelder2" + /datum/category_item/catalogue/anomalous/precursor_a/alien_welder name = "Precursor Alpha Object - Self Refueling Exothermic Tool" desc = "An unwieldly tool which somewhat resembles a weapon, due to \ diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm index a8f64d4f101..6e5973f0c33 100644 --- a/code/game/objects/items/weapons/tools/wirecutters.dm +++ b/code/game/objects/items/weapons/tools/wirecutters.dm @@ -6,6 +6,7 @@ desc = "This cuts wires." icon = 'icons/obj/tools.dmi' icon_state = "cutters" + item_state = "cutters" center_of_mass = list("x" = 18,"y" = 10) slot_flags = SLOT_BELT force = 6 @@ -26,9 +27,20 @@ var/random_color = TRUE /obj/item/weapon/tool/wirecutters/New() - if(random_color && prob(50)) - icon_state = "cutters-y" - item_state = "cutters_yellow" + if(random_color) + switch(pick("red","blue","yellow")) + if ("red") + icon_state = "cutters" + item_state = "cutters" + if ("blue") + icon_state = "cutters-b" + item_state = "cutters_blue" + if ("yellow") + icon_state = "cutters-y" + item_state = "cutters_yellow" + + if (prob(75)) + src.pixel_y = rand(0, 16) ..() /obj/item/weapon/tool/wirecutters/attack(mob/living/carbon/C as mob, mob/user as mob) diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm index 052eae0d2cb..634382ff119 100644 --- a/code/game/objects/items/weapons/tools/wrench.dm +++ b/code/game/objects/items/weapons/tools/wrench.dm @@ -25,6 +25,14 @@ usesound = 'sound/items/drill_use.ogg' toolspeed = 0.5 +/obj/item/weapon/tool/wrench/pipe + name = "pipe wrench" + desc = "A wrench used for plumbing. Can make a good makeshift weapon." + icon_state = "pipe_wrench" + slot_flags = SLOT_BELT + force = 8 + throwforce = 10 + /obj/item/weapon/tool/wrench/hybrid // Slower and bulkier than normal power tools, but it has the power of reach. If reach even worked half the time. name = "strange wrench" desc = "A wrench with many common uses. Can be usually found in your hand." @@ -40,7 +48,6 @@ toolspeed = 0.5 reach = 2 - /datum/category_item/catalogue/anomalous/precursor_a/alien_wrench name = "Precursor Alpha Object - Fastener Torque Tool" desc = "This is an object that has a distinctive tool shape. \ diff --git a/code/game/objects/random/_random.dm b/code/game/objects/random/_random.dm index e9beda6de10..df32a567d76 100644 --- a/code/game/objects/random/_random.dm +++ b/code/game/objects/random/_random.dm @@ -1,8 +1,8 @@ /obj/random name = "random object" desc = "This item type is used to spawn random objects at round-start" - icon = 'icons/misc/mark.dmi' - icon_state = "rup" + icon = 'icons/misc/random_spawners.dmi' + icon_state = "generic" var/spawn_nothing_percentage = 0 // this variable determines the likelyhood that this random object will not spawn anything var/drop_get_turf = TRUE @@ -80,7 +80,7 @@ var/list/random_useful_ /obj/random/single name = "randomly spawned object" desc = "This item type is used to randomly spawn a given object at round-start" - icon_state = "x3" + icon_state = "generic" var/spawn_object = null /obj/random/single/item_to_spawn() @@ -104,8 +104,8 @@ var/list/multi_point_spawns /obj/random_multi name = "random object spawn point" desc = "This item type is used to spawn random objects at round-start. Only one spawn point for a given group id is selected." - icon = 'icons/misc/mark.dmi' - icon_state = "x3" + icon = 'icons/misc/random_spawners.dmi' + icon_state = "generic_3" invisibility = INVISIBILITY_MAXIMUM var/id // Group id var/weight // Probability weight for this spawn point diff --git a/code/game/objects/random/guns_and_ammo.dm b/code/game/objects/random/guns_and_ammo.dm index cb8362879de..c4766db55a5 100644 --- a/code/game/objects/random/guns_and_ammo.dm +++ b/code/game/objects/random/guns_and_ammo.dm @@ -1,8 +1,7 @@ /obj/random/gun/random name = "Random Weapon" desc = "This is a random energy or ballistic weapon." - icon = 'icons/obj/gun.dmi' - icon_state = "energystun100" + icon_state = "gun" /obj/random/gun/random/item_to_spawn() return pick(prob(5);/obj/random/energy, @@ -10,9 +9,8 @@ /obj/random/energy name = "Random Energy Weapon" - desc = "This is a random weapon." - icon = 'icons/obj/gun.dmi' - icon_state = "energykill100" + desc = "This is a random energy weapon." + icon_state = "gun_energy" /obj/random/energy/item_to_spawn() return pick(prob(3);/obj/item/weapon/gun/energy/laser, @@ -28,17 +26,34 @@ prob(2);/obj/item/weapon/gun/energy/ionrifle, prob(2);/obj/item/weapon/gun/energy/ionrifle/pistol, prob(3);/obj/item/weapon/gun/energy/toxgun, - prob(4);/obj/item/weapon/gun/energy/taser, + prob(3);/obj/item/weapon/gun/energy/taser, prob(2);/obj/item/weapon/gun/energy/crossbow/largecrossbow, - prob(4);/obj/item/weapon/gun/energy/stunrevolver, + prob(3);/obj/item/weapon/gun/energy/stunrevolver, prob(2);/obj/item/weapon/gun/energy/stunrevolver/vintage, prob(3);/obj/item/weapon/gun/energy/gun/compact) +/obj/random/energy/highend + name = "Random Energy Weapon" + desc = "This is a random, actually good energy weapon." + icon_state = "gun_energy_2" + +/obj/random/energy/item_to_spawn() + return pick(prob(3);/obj/item/weapon/gun/energy/laser, + prob(3);/obj/item/weapon/gun/energy/laser/sleek, + prob(4);/obj/item/weapon/gun/energy/gun, + prob(3);/obj/item/weapon/gun/energy/gun/burst, + prob(1);/obj/item/weapon/gun/energy/gun/nuclear, + prob(2);/obj/item/weapon/gun/energy/retro, + prob(2);/obj/item/weapon/gun/energy/lasercannon, + prob(3);/obj/item/weapon/gun/energy/xray, + prob(1);/obj/item/weapon/gun/energy/sniperrifle, + prob(2);/obj/item/weapon/gun/energy/crossbow/largecrossbow, + prob(3);/obj/item/weapon/gun/energy/gun/compact) + /obj/random/energy/sec name = "Random Security Energy Weapon" desc = "This is a random security weapon." - icon = 'icons/obj/gun.dmi' - icon_state = "energykill100" + icon_state = "gun_energy" /obj/random/energy/sec/item_to_spawn() return pick(prob(2);/obj/item/weapon/gun/energy/laser, @@ -47,8 +62,7 @@ /obj/random/projectile name = "Random Projectile Weapon" desc = "This is a random projectile weapon." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun" /obj/random/projectile/item_to_spawn() return pick(prob(3);/obj/item/weapon/gun/projectile/automatic/wt550, @@ -89,8 +103,7 @@ /obj/random/projectile/sec name = "Random Security Projectile Weapon" desc = "This is a random security weapon." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_shotgun" /obj/random/projectile/sec/item_to_spawn() return pick(prob(3);/obj/item/weapon/gun/projectile/shotgun/pump, @@ -98,10 +111,9 @@ prob(1);/obj/item/weapon/gun/projectile/shotgun/pump/combat) /obj/random/projectile/shotgun - name = "Random Projectile Weapon" - desc = "This is a random projectile weapon." - icon = 'icons/obj/gun.dmi' - icon_state = "shotgun" + name = "Random Shotgun" + desc = "This is a random shotgun-type weapon." + icon_state = "gun_shotgun" /obj/random/projectile/item_to_spawn() return pick(prob(4);/obj/item/weapon/gun/projectile/shotgun/doublebarrel, @@ -113,7 +125,7 @@ name = "Random Handgun" desc = "This is a random sidearm." icon = 'icons/obj/gun.dmi' - icon_state = "secgundark" + icon_state = "gun" /obj/random/handgun/item_to_spawn() return pick(prob(4);/obj/item/weapon/gun/projectile/sec, @@ -130,8 +142,7 @@ /obj/random/handgun/sec name = "Random Security Handgun" desc = "This is a random security sidearm." - icon = 'icons/obj/gun.dmi' - icon_state = "secgundark" + icon_state = "gun" /obj/random/handgun/sec/item_to_spawn() return pick(prob(3);/obj/item/weapon/gun/projectile/sec, @@ -140,8 +151,7 @@ /obj/random/ammo name = "Random Ammunition" desc = "This is random security ammunition." - icon = 'icons/obj/ammo.dmi' - icon_state = "45-10" + icon_state = "ammo" /obj/random/ammo/item_to_spawn() return pick(prob(6);/obj/item/weapon/storage/box/beanbags, @@ -157,11 +167,10 @@ /obj/random/grenade name = "Random Grenade" desc = "This is random thrown grenades (no C4/etc.)." - icon = 'icons/obj/grenade.dmi' - icon_state = "clusterbang_segment" + icon_state = "grenade_2" /obj/random/grenade/item_to_spawn() - return pick( prob(15);/obj/item/weapon/grenade/concussion, + return pick(prob(15);/obj/item/weapon/grenade/concussion, prob(5);/obj/item/weapon/grenade/empgrenade, prob(15);/obj/item/weapon/grenade/empgrenade/low_yield, prob(5);/obj/item/weapon/grenade/chem_grenade/metalfoam, @@ -179,14 +188,27 @@ prob(15);/obj/item/weapon/grenade/smokebomb ) +/obj/random/grenade/lethal + name = "Random Grenade" + desc = "This is random thrown grenade that hurts a lot." + icon_state = "grenade_3" + +/obj/random/grenade/lethal/item_to_spawn() + return pick( prob(15);/obj/item/weapon/grenade/concussion, + prob(5);/obj/item/weapon/grenade/empgrenade, + prob(2);/obj/item/weapon/grenade/chem_grenade/incendiary, + prob(5);/obj/item/weapon/grenade/explosive, + prob(10);/obj/item/weapon/grenade/explosive/mini, + prob(2);/obj/item/weapon/grenade/explosive/frag + ) + /obj/random/grenade/less_lethal name = "Random Security Grenade" desc = "This is a random thrown grenade that shouldn't kill anyone." - icon = 'icons/obj/grenade.dmi' - icon_state = "clusterbang_segment" + icon_state = "grenade" /obj/random/grenade/less_lethal/item_to_spawn() - return pick( prob(20);/obj/item/weapon/grenade/concussion, + return pick(prob(20);/obj/item/weapon/grenade/concussion, prob(15);/obj/item/weapon/grenade/empgrenade/low_yield, prob(15);/obj/item/weapon/grenade/chem_grenade/metalfoam, prob(20);/obj/item/weapon/grenade/chem_grenade/teargas, @@ -199,11 +221,10 @@ /obj/random/grenade/box name = "Random Grenade Box" desc = "This is a random box of grenades. Not to be mistaken for a box of random grenades. Or a grenade of random boxes - but that would just be silly." - icon = 'icons/obj/grenade.dmi' - icon_state = "clusterbang_segment" + icon_state = "grenade_box" /obj/random/grenade/box/item_to_spawn() - return pick( prob(20);/obj/item/weapon/storage/box/flashbangs, + return pick(prob(20);/obj/item/weapon/storage/box/flashbangs, prob(10);/obj/item/weapon/storage/box/emps, prob(20);/obj/item/weapon/storage/box/empslite, prob(15);/obj/item/weapon/storage/box/smokes, @@ -215,9 +236,9 @@ /obj/random/projectile/random name = "Random Projectile Weapon" - desc = "This is a random weapon." + desc = "This is a random projectile weapon." icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_2" /obj/random/projectile/random/item_to_spawn() return pick(prob(3);/obj/random/multiple/gun/projectile/handgun, @@ -228,8 +249,7 @@ /obj/random/multiple/gun/projectile/smg name = "random smg projectile gun" desc = "Loot for PoIs." - icon = 'icons/obj/gun.dmi' - icon_state = "saber" + icon_state = "gun_auto" /obj/random/multiple/gun/projectile/smg/item_to_spawn() return pick( @@ -267,8 +287,7 @@ /obj/random/multiple/gun/projectile/rifle name = "random rifle projectile gun" desc = "Loot for PoIs." - icon = 'icons/obj/gun.dmi' - icon_state = "carbine" + icon_state = "gun_rifle" //Concerns about the bullpup, but currently seems to be only a slightly stronger z8. But we shall see. @@ -319,8 +338,7 @@ /obj/random/multiple/gun/projectile/handgun name = "random handgun projectile gun" desc = "Loot for PoIs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun" /obj/random/multiple/gun/projectile/handgun/item_to_spawn() return pick( @@ -451,8 +469,7 @@ /obj/random/multiple/gun/projectile/shotgun name = "random shotgun projectile gun" desc = "Loot for PoIs." - icon = 'icons/obj/gun.dmi' - icon_state = "shotgun" + icon_state = "gun_shotgun" /obj/random/multiple/gun/projectile/shotgun/item_to_spawn() return pick( @@ -485,7 +502,7 @@ name = "broken gun spawner" desc = "Spawns a random broken gun, or rarely a fully functional one." icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_gun/item_to_spawn() return pickweight(list( @@ -503,8 +520,7 @@ /obj/random/projectile/scrapped_shotgun name = "broken shotgun spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "shotgun" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_shotgun/item_to_spawn() return pickweight(list( @@ -517,8 +533,7 @@ /obj/random/projectile/scrapped_smg name = "broken smg spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_smg/item_to_spawn() return pickweight(list( @@ -529,8 +544,7 @@ /obj/random/projectile/scrapped_pistol name = "broken pistol spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_pistol/item_to_spawn() return pickweight(list( @@ -541,8 +555,7 @@ /obj/random/projectile/scrapped_laser name = "broken laser spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_laser/item_to_spawn() return pickweight(list( @@ -555,8 +568,7 @@ /obj/random/projectile/scrapped_ionrifle name = "broken ionrifle spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_ionrifle/item_to_spawn() return pickweight(list( @@ -567,8 +579,7 @@ /obj/random/projectile/scrapped_bulldog name = "broken z8 spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_bulldog/item_to_spawn() return pickweight(list( @@ -579,8 +590,7 @@ /obj/random/projectile/scrapped_flechette name = "broken flechette spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_flechette/item_to_spawn() return pickweight(list( @@ -591,8 +601,7 @@ /obj/random/projectile/scrapped_grenadelauncher name = "broken grenadelauncher spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_grenadelauncher/item_to_spawn() return pickweight(list( @@ -603,8 +612,7 @@ /obj/random/projectile/scrapped_dartgun name = "broken dartgun spawner" desc = "Loot for PoIs, or their mobs." - icon = 'icons/obj/gun.dmi' - icon_state = "revolver" + icon_state = "gun_scrap" /obj/random/projectile/scrapped_dartgun/item_to_spawn() return pickweight(list( diff --git a/code/game/objects/random/maintenance.dm b/code/game/objects/random/maintenance.dm index 736318e6f15..acb7f93fc86 100644 --- a/code/game/objects/random/maintenance.dm +++ b/code/game/objects/random/maintenance.dm @@ -1,8 +1,6 @@ /obj/random/maintenance //Clutter and loot for maintenance and away missions name = "random maintenance item" desc = "This is a random maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" /obj/random/maintenance/item_to_spawn() return pick(prob(300);/obj/random/tech_supply, @@ -25,8 +23,6 @@ Individual items to add to the maintenance list should go here, if you add something, make sure it's not in one of the other lists.*/ name = "random clean maintenance item" desc = "This is a random clean maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" /obj/random/maintenance/clean/item_to_spawn() return pick(prob(10);/obj/random/contraband, @@ -123,8 +119,7 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around security areas*/ name = "random security maintenance item" desc = "This is a random security maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" + icon_state = "security" /obj/random/maintenance/security/item_to_spawn() return pick(prob(320);/obj/random/maintenance/clean, @@ -180,8 +175,7 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around medical areas*/ name = "random medical maintenance item" desc = "This is a random medical maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" + icon_state = "medical" /obj/random/maintenance/medical/item_to_spawn() return pick(prob(320);/obj/random/maintenance/clean, @@ -220,8 +214,7 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around medical areas*/ name = "random engineering maintenance item" desc = "This is a random engineering maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" + icon_state = "tool" /obj/random/maintenance/engineering/item_to_spawn() return pick(prob(320);/obj/random/maintenance/clean, @@ -258,8 +251,7 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around medical areas*/ name = "random research maintenance item" desc = "This is a random research maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" + icon_state = "science" /obj/random/maintenance/research/item_to_spawn() return pick(prob(320);/obj/random/maintenance/clean, @@ -290,8 +282,6 @@ something, make sure it's not in one of the other lists.*/ /*Maintenance loot list. This one is for around cargo areas*/ name = "random cargo maintenance item" desc = "This is a random cargo maintenance item." - icon = 'icons/obj/items.dmi' - icon_state = "gift1" /obj/random/maintenance/cargo/item_to_spawn() return pick(prob(320);/obj/random/maintenance/clean, diff --git a/code/game/objects/random/mapping_vr.dm b/code/game/objects/random/mapping_vr.dm index b9ebfd1dc06..3075c404154 100644 --- a/code/game/objects/random/mapping_vr.dm +++ b/code/game/objects/random/mapping_vr.dm @@ -8,14 +8,21 @@ /obj/random/empty_or_lootable_crate/item_to_spawn() return pick(/obj/random/crate, /obj/random/multiple/corp_crate) - + /obj/random/forgotten_tram name = "random forgotten tram item" desc = "Spawns a random item that someone might accidentally leave on a tram. Sometimes spawns nothing." spawn_nothing_percentage = 30 /obj/random/forgotten_tram/item_to_spawn() - return pick(prob(2);/obj/item/device/flashlight, + return pick( + prob(2);/obj/item/device/flashlight, + prob(2);/obj/item/device/flashlight/color, + prob(2);/obj/item/device/flashlight/color/green, + prob(2);/obj/item/device/flashlight/color/purple, + prob(2);/obj/item/device/flashlight/color/red, + prob(2);/obj/item/device/flashlight/color/orange, + prob(2);/obj/item/device/flashlight/color/yellow, prob(2);/obj/item/device/flashlight/glowstick, prob(2);/obj/item/device/flashlight/glowstick/blue, prob(1);/obj/item/device/flashlight/glowstick/orange, diff --git a/code/game/objects/random/mechs.dm b/code/game/objects/random/mechs.dm index 7dcd3db5cc5..6129e177da7 100644 --- a/code/game/objects/random/mechs.dm +++ b/code/game/objects/random/mechs.dm @@ -1,8 +1,7 @@ /obj/random/mech name = "random mech" desc = "This is a random single mech." - icon = 'icons/mecha/mecha.dmi' - icon_state = "old_durand" + icon_state = "mecha" drop_get_turf = FALSE //This list includes the phazon, gorilla and mauler. You might want to use something else if balance is a concern. @@ -25,8 +24,6 @@ /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() @@ -42,8 +39,6 @@ /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. diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index 41db4704fdb..40ab1280845 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -6,8 +6,7 @@ /obj/random/tool name = "random tool" desc = "This is a random tool" - icon = 'icons/obj/tools.dmi' - icon_state = "welder" + icon_state = "tool" /obj/random/tool/item_to_spawn() return pick(/obj/item/weapon/tool/screwdriver, @@ -22,7 +21,7 @@ /obj/random/tool/powermaint name = "random powertool" desc = "This is a random rare powertool for maintenance" - icon_state = "jaws_pry" + icon_state = "tool_2" /obj/random/tool/powermaint/item_to_spawn() return pick(prob(320);/obj/random/tool, @@ -34,7 +33,7 @@ /obj/random/tool/power name = "random powertool" desc = "This is a random powertool" - icon_state = "jaws_pry" + icon_state = "tool_2" /obj/random/tool/power/item_to_spawn() return pick(/obj/item/weapon/tool/screwdriver/power, @@ -45,8 +44,7 @@ /obj/random/tool/alien name = "random alien tool" desc = "This is a random tool" - icon = 'icons/obj/abductor.dmi' - icon_state = "welder" + icon_state = "tool_3" /obj/random/tool/alien/item_to_spawn() return pick(/obj/item/weapon/tool/screwdriver/alien, @@ -60,8 +58,7 @@ /obj/random/technology_scanner name = "random scanner" desc = "This is a random technology scanner." - icon = 'icons/obj/device.dmi' - icon_state = "atmos" + icon_state = "tech" /obj/random/technology_scanner/item_to_spawn() return pick(prob(5);/obj/item/device/t_scanner, @@ -85,8 +82,7 @@ /obj/random/bomb_supply name = "bomb supply" desc = "This is a random bomb supply." - icon = 'icons/obj/assemblies/new_assemblies.dmi' - icon_state = "signaller" + icon_state = "tech" /obj/random/bomb_supply/item_to_spawn() return pick(/obj/item/device/assembly/igniter, @@ -99,8 +95,7 @@ /obj/random/toolbox name = "random toolbox" desc = "This is a random toolbox." - icon = 'icons/obj/storage.dmi' - icon_state = "red" + icon_state = "toolbox" /obj/random/toolbox/item_to_spawn() return pick(prob(6);/obj/item/weapon/storage/toolbox/mechanical, @@ -111,8 +106,7 @@ /obj/random/smes_coil name = "random smes coil" desc = "This is a random smes coil." - icon = 'icons/obj/power.dmi' - icon_state = "smes" + icon_state = "cell_2" /obj/random/smes_coil/item_to_spawn() return pick(prob(4);/obj/item/weapon/smes_coil, @@ -122,8 +116,7 @@ /obj/random/pacman name = "random portable generator" desc = "This is a random portable generator." - icon = 'icons/obj/power.dmi' - icon_state = "portgen0" + icon_state = "cell_3" /obj/random/pacman/item_to_spawn() return pick(prob(6);/obj/machinery/power/port_gen/pacman, @@ -161,8 +154,7 @@ /obj/random/tech_supply/component name = "random tech component" desc = "This is a random machine component." - icon = 'icons/obj/items.dmi' - icon_state = "portable_analyzer" + icon_state = "tech" /obj/random/tech_supply/component/item_to_spawn() return pick(prob(3);/obj/item/weapon/stock_parts/gear, @@ -188,8 +180,7 @@ /obj/random/medical name = "Random Medicine" desc = "This is a random medical item." - icon = 'icons/obj/stacks.dmi' - icon_state = "traumakit" + icon_state = "medical" /obj/random/medical/item_to_spawn() return pick(prob(21);/obj/random/medical/lite, @@ -208,8 +199,7 @@ /obj/random/medical/pillbottle name = "Random Pill Bottle" desc = "This is a random pill bottle." - icon = 'icons/obj/chemical.dmi' - icon_state = "pill_canister" + icon_state = "pillbottle" /obj/random/medical/pillbottle/item_to_spawn() return pick(prob(1);/obj/item/weapon/storage/pill_bottle/spaceacillin, @@ -221,8 +211,7 @@ /obj/random/medical/lite name = "Random Medicine" desc = "This is a random simple medical item." - icon = 'icons/obj/items.dmi' - icon_state = "brutepack" + icon_state = "medical" spawn_nothing_percentage = 25 /obj/random/medical/lite/item_to_spawn() @@ -240,8 +229,7 @@ /obj/random/firstaid name = "Random First Aid Kit" desc = "This is a random first aid kit." - icon = 'icons/obj/storage.dmi' - icon_state = "firstaid" + icon_state = "medicalkit" /obj/random/firstaid/item_to_spawn() return pick(prob(10);/obj/item/weapon/storage/firstaid/regular, @@ -255,8 +243,7 @@ /obj/random/contraband name = "Random Illegal Item" desc = "Hot Stuff." - icon = 'icons/obj/items.dmi' - icon_state = "purplecomb" + icon_state = "sus" spawn_nothing_percentage = 50 /obj/random/contraband/item_to_spawn() return pick(prob(6);/obj/item/weapon/storage/pill_bottle/paracetamol, //VOREStation Edit, @@ -505,8 +492,7 @@ /obj/random/material //Random materials for building stuff name = "random material" desc = "This is a random material." - icon = 'icons/obj/stacks.dmi' - icon_state = "sheet-metal_2" + icon_state = "material" /obj/random/material/item_to_spawn() return pick(/obj/item/stack/material/steel{amount = 10}, @@ -524,8 +510,7 @@ /obj/random/material/refined //Random materials for building stuff name = "random refined material" desc = "This is a random refined metal." - icon = 'icons/obj/stacks.dmi' - icon_state = "sheet-adamantine_3" + icon_state = "material_2" /obj/random/material/refined/item_to_spawn() return pick(/obj/item/stack/material/steel{amount = 10}, @@ -555,8 +540,7 @@ /obj/random/material/precious //Precious metals, go figure name = "random precious metal" desc = "This is a small stack of a random precious metal." - icon = 'icons/obj/stacks.dmi' - icon_state = "sheet-gold_2" + icon_state = "material_3" /obj/random/material/precious/item_to_spawn() return pick(/obj/item/stack/material/gold{amount = 5}, @@ -779,8 +763,7 @@ /obj/random/janusmodule name = "random janus circuit" desc = "A random (possibly broken) Janus module." - icon = 'icons/obj/abductor.dmi' - icon_state = "circuit_damaged" + icon_state = "tech_2" /obj/random/janusmodule/item_to_spawn() return pick(subtypesof(/obj/item/weapon/circuitboard/mecha/imperion)) @@ -978,3 +961,21 @@ prob(5);/obj/item/weapon/storage/pouch/baton/full, prob(1);/obj/item/weapon/storage/pouch/holding ) + +/obj/random/flashlight + name = "Random Flashlight" + desc = "This is a random storage pouch." + icon = 'icons/obj/lighting.dmi' + icon_state = "random_flashlight" + +/obj/random/flashlight/item_to_spawn() + return pick( + prob(8);/obj/item/device/flashlight, + prob(6);/obj/item/device/flashlight/color, + prob(6);/obj/item/device/flashlight/color/green, + prob(6);/obj/item/device/flashlight/color/purple, + prob(6);/obj/item/device/flashlight/color/red, + prob(6);/obj/item/device/flashlight/color/orange, + prob(6);/obj/item/device/flashlight/color/yellow, + prob(2);/obj/item/device/flashlight/maglight + ) \ No newline at end of file diff --git a/code/game/objects/random/mob.dm b/code/game/objects/random/mob.dm index 0699dfb9a18..d0cee5dff00 100644 --- a/code/game/objects/random/mob.dm +++ b/code/game/objects/random/mob.dm @@ -5,8 +5,7 @@ /obj/random/mob name = "Random Animal" desc = "This is a random animal." - icon = 'icons/mob/animal.dmi' - icon_state = "chicken_white" + icon_state = "animal" var/overwrite_hostility = 0 @@ -68,7 +67,7 @@ /obj/random/mob/sif name = "Random Sif Animal" desc = "This is a random cold weather animal." - icon_state = "penguin" + icon_state = "animal" mob_returns_home = 1 mob_wander_distance = 10 @@ -89,7 +88,7 @@ /obj/random/mob/sif/peaceful name = "Random Peaceful Sif Animal" desc = "This is a random peaceful cold weather animal." - icon_state = "penguin" + icon_state = "animal_passive" mob_returns_home = 1 mob_wander_distance = 12 @@ -106,7 +105,7 @@ /obj/random/mob/sif/hostile name = "Random Hostile Sif Animal" desc = "This is a random hostile cold weather animal." - icon_state = "frost" + icon_state = "animal_hostile" /obj/random/mob/sif/hostile/item_to_spawn() return pick(prob(22);/mob/living/simple_mob/animal/sif/savik, @@ -169,7 +168,7 @@ /obj/random/mob/robotic name = "Random Robot Mob" desc = "This is a random robot." - icon_state = "drone_dead" + icon_state = "robot" overwrite_hostility = 1 @@ -217,7 +216,7 @@ /obj/random/mob/robotic/hivebot name = "Random Hivebot" desc = "This is a random hivebot." - icon_state = "drone3" + icon_state = "robot" mob_faction = "hivebot" @@ -237,18 +236,58 @@ name = "Random Mouse" desc = "This is a random boring maus." icon_state = "mouse_gray" + spawn_nothing_percentage = 15 /obj/random/mob/mouse/item_to_spawn() return pick(prob(15);/mob/living/simple_mob/animal/passive/mouse/white, prob(30);/mob/living/simple_mob/animal/passive/mouse/brown, prob(30);/mob/living/simple_mob/animal/passive/mouse/gray, - prob(25);/obj/random/mouseremains) //because figuring out how to come up with it picking nothing is beyond my coding ability. + prob(30);/mob/living/simple_mob/animal/passive/mouse/rat) + +/obj/random/mob/fish + name = "Random Fish" + desc = "This is a random fish found on Sif." + icon_state = "fish" + mob_faction = "fish" + overwrite_hostility = 1 + mob_hostile = 0 + mob_retaliate = 0 + +/obj/random/mob/fish/item_to_spawn() + return pick(prob(10);/mob/living/simple_mob/animal/passive/fish/bass, + prob(20);/mob/living/simple_mob/animal/passive/fish/icebass, + prob(20);/mob/living/simple_mob/animal/passive/fish/trout, + prob(20);/mob/living/simple_mob/animal/passive/fish/salmon, + prob(10);/mob/living/simple_mob/animal/passive/fish/pike, + prob(10);/mob/living/simple_mob/animal/passive/fish/perch, + prob(20);/mob/living/simple_mob/animal/passive/fish/murkin, + prob(15);/mob/living/simple_mob/animal/passive/fish/javelin, + prob(20);/mob/living/simple_mob/animal/passive/fish/rockfish, + prob(5);/mob/living/simple_mob/animal/passive/fish/solarfish, + prob(10);/mob/living/simple_mob/animal/passive/crab, + prob(1);/mob/living/simple_mob/animal/sif/hooligan_crab) + +/obj/random/mob/bird + name = "Random Bird" + desc = "This is a random wild/feral bird." + icon_state = "bird" + mob_faction = "bird" + +/obj/random/mob/bird/item_to_spawn() + return pick(prob(10);/mob/living/simple_mob/animal/passive/bird/black_bird, + prob(10);/mob/living/simple_mob/animal/passive/bird/azure_tit, + prob(20);/mob/living/simple_mob/animal/passive/bird/european_robin, + prob(10);/mob/living/simple_mob/animal/passive/bird/goldcrest, + prob(20);/mob/living/simple_mob/animal/passive/bird/ringneck_dove, + prob(10);/mob/living/simple_mob/animal/space/goose, + prob(5);/mob/living/simple_mob/animal/passive/chicken, + prob(1);/mob/living/simple_mob/animal/passive/penguin) // Mercs /obj/random/mob/merc name = "Random Mercenary" desc = "This is a random PoI mercenary." - icon_state = "syndicate" + icon_state = "humanoid" mob_faction = "syndicate" mob_returns_home = 1 @@ -270,7 +309,7 @@ /obj/random/mob/merc/armored name = "Random Armored Infantry Merc" desc = "This is a random PoI exo or robot for mercs." - icon_state = "drone3" + icon_state = "mecha" /obj/random/mob/merc/armored/item_to_spawn() return pick(prob(30);/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark, @@ -327,6 +366,7 @@ /obj/random/mob/multiple/sifmobs name = "Random Sifmob Pack" desc = "A pack of random neutral sif mobs." + icon_state = "animal_group" /obj/random/mob/multiple/sifmobs/item_to_spawn() return pick( diff --git a/code/game/objects/structures/barricades.dm b/code/game/objects/structures/barricades.dm index 098b126d003..f33c400023d 100644 --- a/code/game/objects/structures/barricades.dm +++ b/code/game/objects/structures/barricades.dm @@ -104,6 +104,12 @@ return TRUE return FALSE +/obj/structure/barricade/planks + name = "crude barricade" + icon_state = "barricade_planks" + health = 50 + maxhealth = 50 + /obj/structure/barricade/sandbag name = "sandbags" desc = "Bags. Bags of sand. It's rough and coarse and somehow stays in the bag." diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm index ca2f81e3073..9d01a4efbe7 100644 --- a/code/game/objects/structures/crates_lockers/closets/fitness.dm +++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm @@ -3,6 +3,35 @@ desc = "It's a storage unit for athletic wear." closet_appearance = /decl/closet_appearance/wardrobe/mixed + starts_with = list( + /obj/item/clothing/under/shorts/grey, + /obj/item/clothing/under/shorts/black, + /obj/item/clothing/under/shorts/red, + /obj/item/clothing/under/shorts/blue, + /obj/item/clothing/under/shorts/green, + /obj/item/clothing/under/shorts/white, + /obj/item/clothing/suit/storage/toggle/track, + /obj/item/clothing/suit/storage/toggle/track/blue, + /obj/item/clothing/suit/storage/toggle/track/green, + /obj/item/clothing/suit/storage/toggle/track/red, + /obj/item/clothing/suit/storage/toggle/track/white, + /obj/item/clothing/under/pants/track, + /obj/item/clothing/under/pants/track/blue, + /obj/item/clothing/under/pants/track/green, + /obj/item/clothing/under/pants/track/white, + /obj/item/clothing/under/pants/track/red, + /obj/item/clothing/shoes/athletic = 2, + /obj/item/clothing/shoes/hitops, + /obj/item/clothing/shoes/hitops/red, + /obj/item/clothing/shoes/hitops/black, + /obj/item/clothing/shoes/hitops/blue + ) + +/obj/structure/closet/athletic_swimwear + name = "athletic wardrobe" + desc = "It's a storage unit for swimwear." + closet_appearance = /decl/closet_appearance/wardrobe/mixed + starts_with = list( /obj/item/clothing/under/shorts/grey, /obj/item/clothing/under/shorts/black, @@ -17,6 +46,9 @@ /obj/item/clothing/under/swimsuit/striped, /obj/item/clothing/under/swimsuit/white, /obj/item/clothing/under/swimsuit/earth, + /obj/item/clothing/under/wetsuit, + /obj/item/clothing/under/wetsuit_rec, + /obj/item/clothing/under/wetsuit_skimpy, /obj/item/clothing/mask/snorkel = 2, /obj/item/clothing/shoes/swimmingfins = 2) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 825459b8f46..8e8568953b3 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -1,4 +1,5 @@ /obj/structure/girder + name = "girder" icon_state = "girder" anchored = TRUE density = TRUE diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index f226af1afe1..eba9ea33196 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -297,7 +297,7 @@ /obj/structure/bed/roller/Moved(atom/old_loc, direction, forced = FALSE) . = ..() - + playsound(src, 'sound/effects/roll.ogg', 100, 1) /obj/structure/bed/roller/post_buckle_mob(mob/living/M as mob) diff --git a/code/game/turfs/simulated/fancy_shuttles.dm b/code/game/turfs/simulated/fancy_shuttles.dm index 31f4681da90..2de10aeb386 100644 --- a/code/game/turfs/simulated/fancy_shuttles.dm +++ b/code/game/turfs/simulated/fancy_shuttles.dm @@ -301,6 +301,16 @@ GLOBAL_LIST_EMPTY(fancy_shuttles) /obj/effect/fancy_shuttle_floor_preview/delivery icon = 'icons/turf/fancy_shuttles/delivery_preview.dmi' +/** + * Tether Cargo shuttle + * North facing: W:8, H:12 + */ +/obj/effect/fancy_shuttle/tether_cargo + icon = 'icons/turf/fancy_shuttles/tether_cargo_preview.dmi' + split_file = 'icons/turf/fancy_shuttles/tether_cargo.dmi' +/obj/effect/fancy_shuttle_floor_preview/tether_cargo + icon = 'icons/turf/fancy_shuttles/tether_cargo_preview.dmi' + /** * Wagon * North facing: W:5, H:13 diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index bd4fdca8148..22af37dd531 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -9,4 +9,9 @@ icon_state = "rockvault" /turf/unsimulated/floor/shuttle_ceiling - icon_state = "reinforced" \ No newline at end of file + icon_state = "reinforced" + +/turf/unsimulated/elevator_shaft + name = "floor" + icon = 'icons/turf/floors.dmi' + icon_state = "elevatorshaft" \ No newline at end of file diff --git a/code/game/turfs/unsimulated/planetary_vr.dm b/code/game/turfs/unsimulated/planetary_vr.dm index 17c33b75254..b82342ea0a4 100644 --- a/code/game/turfs/unsimulated/planetary_vr.dm +++ b/code/game/turfs/unsimulated/planetary_vr.dm @@ -52,8 +52,16 @@ alpha = 0xFF VIRGO3B_SET_ATMOS +//other set - for map building +/turf/unsimulated/wall2/planetary/virgo3b_better + icon_state = "riveted2" + /turf/unsimulated/wall/planetary/virgo3b_better name = "facility wall" desc = "An eight-meter tall carbyne wall. For when the wildlife on your planet is mostly militant megacorps." alpha = 0xFF VIRGO3BB_SET_ATMOS + +//other set - for map building +/turf/unsimulated/wall2/planetary/virgo3b_better + icon_state = "riveted2" \ No newline at end of file diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm index 878a12404ae..dce3c345bb7 100644 --- a/code/game/turfs/unsimulated/walls.dm +++ b/code/game/turfs/unsimulated/walls.dm @@ -6,10 +6,22 @@ density = TRUE blocks_air = TRUE +//other set - for map building +/turf/unsimulated/wall/wall1 + icon_state = "riveted1" + +/turf/unsimulated/wall/wall2 + icon_state = "riveted2" + /turf/unsimulated/wall/fakeglass name = "window" icon_state = "fakewindows" opacity = 0 +//other set - for map building +/turf/unsimulated/wall/fakeglass2 + icon_state = "fakewindows2" + opacity = 0 + /turf/unsimulated/wall/other icon_state = "r_wall" \ No newline at end of file diff --git a/code/global.dm b/code/global.dm index 674c81f8eec..bba7c9df2f9 100644 --- a/code/global.dm +++ b/code/global.dm @@ -134,11 +134,24 @@ var/DBConnection/dbcon_old = new() // /tg/station database (Old database) -- see var/global/list/alphabet_uppercase = list("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") -// Used by robots and robot preferences. +// Used by robots and robot preferences for regular modules. var/list/robot_module_types = list( "Standard", "Engineering", "Surgeon", "Crisis", "Miner", "Janitor", "Service", "Clerical", "Security", - "Research" + "Research", "Medihound", "K9", "Janihound", "Sci-borg", "Pupdozer", + "Service-Hound", "BoozeHound", "KMine" +) +// List of modules added during code red +var/list/emergency_module_types = list( + "Combat", "ERT" +) +// List of modules available to AI shells +var/list/shell_module_types = list( + "Standard", "Service", "Clerical", "Service-Hound", "BoozeHound" +) +// List of whitelisted modules +var/list/whitelisted_module_types = list( + "Lost", "Stray" ) // Some scary sounds. diff --git a/code/global_vr.dm b/code/global_vr.dm index f7ab6951cf0..1187b4a5dcc 100644 --- a/code/global_vr.dm +++ b/code/global_vr.dm @@ -1,18 +1,3 @@ -/hook/startup/proc/modules_vr() - robot_module_types += "Medihound" - robot_module_types += "K9" - robot_module_types += "Janihound" - robot_module_types += "Sci-borg" - robot_module_types += "Pupdozer" - robot_module_types += "Service-Hound" - robot_module_types += "BoozeHound" - robot_module_types += "KMine" - return 1 - -var/list/shell_module_types = list( - "Standard", "Service", "Clerical", "Service-Hound" -) - var/list/awayabductors = list() // List of scatter landmarks for Abductors in Gateways var/list/eventdestinations = list() // List of scatter landmarks for VOREStation event portals var/list/eventabductors = list() // List of scatter landmarks for VOREStation abductor portals diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 6aa06ef4ec2..eecae831867 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -132,6 +132,8 @@ corpseshoes = /obj/item/clothing/shoes/black random_species = TRUE + + /obj/effect/landmark/corpse/chef name = "Chef" corpseuniform = /obj/item/clothing/under/rank/chef @@ -198,7 +200,7 @@ corpseid = 1 corpseidjob = "Scientist" corpseidaccess = "Scientist" - + /obj/effect/landmark/corpse/security name = "Security Officer" corpseradio = /obj/item/device/radio/headset/headset_sec @@ -212,18 +214,18 @@ corpseid = 1 corpseidjob = "Security Officer" corpseidaccess = "Security Officer" - + /obj/effect/landmark/corpse/security/rig corpsesuit = /obj/item/clothing/suit/space/void/security corpsemask = /obj/item/clothing/mask/breath corpsehelmet = /obj/item/clothing/head/helmet/space/void/security corpseback = /obj/item/weapon/tank/jetpack/oxygen - + /obj/effect/landmark/corpse/security/rig/eva corpsesuit = /obj/item/clothing/suit/space/void/security/alt corpsehelmet = /obj/item/clothing/head/helmet/space/void/security/alt corpseidjob = "Starship Security Officer" - + /obj/effect/landmark/corpse/prisoner name = "Unknown Prisoner" corpseuniform = /obj/item/clothing/under/color/prison @@ -247,7 +249,7 @@ corpsemask = /obj/item/clothing/mask/breath corpsehelmet = /obj/item/clothing/head/helmet/space/void/mining corpseback = /obj/item/weapon/tank/oxygen - + /////////////////Vintage////////////////////// //define the basic props at this level and only change specifics for variants, e.z. @@ -337,3 +339,41 @@ corpseid = 1 corpseidjob = "Commander" corpseidaccess = "Captain" + +/////////////////Lore Factions////////////////////// + +/obj/effect/landmark/corpse/sifguard + name = "Patrolman" + corpseuniform = /obj/item/clothing/under/solgov/utility/sifguard + corpsesuit = /obj/item/clothing/suit/storage/hooded/wintercoat/solgov + corpsebelt = /obj/item/weapon/storage/belt/security/tactical + corpseglasses = /obj/item/clothing/glasses/sunglasses/sechud + corpsemask = /obj/item/clothing/mask/balaclava + corpsehelmet = /obj/item/clothing/head/beret/solgov/sifguard + corpsegloves = /obj/item/clothing/gloves/duty + corpseshoes = /obj/item/clothing/shoes/boots/tactical + corpsepocket1 = /obj/item/clothing/accessory/armor/tag/sifguard + corpseid = 1 + corpseidjob = "Sif Defense Force Patrolman" + +/obj/effect/landmark/corpse/hedberg + name = "Hedberg-Hammarstrom Mercenary" + corpseuniform = /obj/item/clothing/under/solgov/utility/sifguard + corpsesuit = /obj/item/clothing/suit/storage/vest/solgov/hedberg + corpsebelt = /obj/item/weapon/storage/belt/security + corpseglasses = /obj/item/clothing/glasses/sunglasses/sechud + corpsehelmet = /obj/item/clothing/head/beret/corp/hedberg + corpseshoes = /obj/item/clothing/shoes/boots/jackboots + corpseid = 1 + corpseidjob = "Hedberg-Hammarstrom Officer" + +/obj/effect/landmark/corpse/hedberg/merc + name = "Hedberg-Hammarstrom Mercenary" + corpsebelt = /obj/item/weapon/storage/belt/security/tactical + corpseglasses = /obj/item/clothing/glasses/sunglasses/sechud + corpsehelmet = /obj/item/clothing/head/helmet/flexitac + corpsegloves = /obj/item/clothing/gloves/combat + corpseshoes = /obj/item/clothing/shoes/boots/tactical + corpseid = 1 + corpseidjob = "Hedberg-Hammarstrom Enforcer" + diff --git a/code/modules/awaymissions/loot_vr.dm b/code/modules/awaymissions/loot_vr.dm index f75dd08e833..d6364d3bd4a 100644 --- a/code/modules/awaymissions/loot_vr.dm +++ b/code/modules/awaymissions/loot_vr.dm @@ -282,7 +282,7 @@ for(var/i=0,i
\ NT's most well known products are its phoron based creations, especially those used in Cryotherapy. \ - It also boasts an prosthetic line, which is provided to its employees as needed, and is used as an incentive \ + It also boasts a prosthetic line, which is provided to its employees as needed, and is used as an incentive \ for newly tested posibrains to remain with the company. \

\ NT's ships are named for famous scientists." @@ -222,6 +322,12 @@ headquarters = "Luna, Sol" motto = "" + org_type = "corporate" + slogans = list( + "NanoTrasen - Phoron Makes The Galaxy Go 'Round.", + "NanoTrasen - Join for the Medical, stay for the Company.", + "NanoTrasen - Advancing Humanity." + ) ship_prefixes = list("NTV" = "a general operations", "NEV" = "an exploration", "NGV" = "a hauling", "NDV" = "a patrol", "NRV" = "an emergency response", "NDV" = "an asset protection") //Scientist naming scheme ship_names = list( @@ -247,13 +353,11 @@ "Nye", "Hawking", "Aristotle", - "Von Braun", "Kaku", "Oppenheimer", "Renwick", "Hubble", "Alcubierre", - "Robineau", "Glass" ) // Note that the current station being used will be pruned from this list upon being instantiated @@ -297,6 +401,12 @@ headquarters = "Luna, Sol" motto = "" + org_type = "corporate" + slogans = list( + "Hephaestus Arms - When it comes to personal protection, nobody does it better.", + "Hephaestus Arms - Peace through Superior Firepower.", + "Hephaestus Arms - Don't be caught firing blanks." + ) ship_prefixes = list("HCV" = "a general operations", "HTV" = "a freight", "HLV" = "a munitions resupply", "HDV" = "an asset protection", "HDV" = "a preemptive deployment") //War God Theme, updated ship_names = list( @@ -401,6 +511,12 @@ headquarters = "Toledo, New Ohio" motto = "" + org_type = "corporate" + slogans = list( + "Vey-Medical. Medical care you can trust.", + "Vey-Medical. Only the finest in surgical equipment.", + "Vey-Medical. Because your patients deserve the best." + ) ship_prefixes = list("VMV" = "a general operations", "VTV" = "a transportation", "VHV" = "a medical resupply", "VSV" = "a research", "VRV" = "an emergency medical support") // Diona names, mostly ship_names = list( @@ -415,6 +531,9 @@ "Fire Blown Out By Wind", "Star That Fades From View", "Eyes Which Turn Inwards", + "Still Water Upon An Endless Shore", + "Sunlight Glitters Upon Tranquil Sands", + "Growth Within The Darkest Abyss", "Joy Without Which The World Would Come Undone", "A Thousand Thousand Planets Dangling From Branches", "Light Streaming Through Interminable Branches", @@ -447,6 +566,13 @@ headquarters = "Earth, Sol" motto = "" + org_type = "corporate" + slogans = list( + "Zeng-Hu! WE make the medicines that YOU need!", + "Zeng-Hu! Having acid reflux problems? Consult your local physician to see if Dylovene is right for YOU!", + "Zeng-Hu! Tired of getting left in the dust? Try Hyperzine! You'll never fall behind again!", + "Zeng-Hu! Life's aches and pains getting to you? Try Tramadol - available at any good pharmacy!" + ) ship_prefixes = list("ZHV" = "a general operations", "ZTV" = "a transportation", "ZMV" = "a medical resupply", "ZRV" = "a medical research") //ship names: a selection of famous physicians who advanced the cause of medicine ship_names = list( @@ -527,6 +653,12 @@ headquarters = "" motto = "" + org_type = "corporate" + slogans = list( + "Takahashi Appliances - keeping your home running smoothly.", + "W-T Automotive - keeping you on time, all the time.", + "Ward-Takahashi Electronics - keeping you in touch with the galaxy." + ) ship_prefixes = list("WTV" = "a general operations", "WTFV" = "a freight", "WTGV" = "a transport", "WTDV" = "an asset protection") ship_names = list( "Comet", @@ -560,6 +692,8 @@ "Curtain", "Planetar", "Quasar", + "Blazar", + "Corona", "Binary" ) destination_names = list() @@ -581,6 +715,12 @@ headquarters = "" motto = "" + org_type = "corporate" + slogans = list( + "Bishop Cybernetics - only the best in personal augmentation.", + "Bishop Cybernetics - why settle for flesh when you can have metal?", + "Bishop Cybernetics - make a statement." + ) ship_prefixes = list("BCV" = "a general operations", "BCTV" = "a transportation", "BCSV" = "a research exchange") //famous mechanical engineers ship_names = list( @@ -660,6 +800,10 @@ headquarters = "Shelf flotilla" motto = "" + org_type = "neutral" //disables slogans for morpheus as they don't advertise, per the description above + /* + slogans = list() + */ ship_prefixes = list("MCV" = "a general operations", "MTV" = "a freight", "MDV" = "a market protection", "MSV" = "an outreach") //periodic elements; something 'unusual' for the posibrain TSC without being full on 'quirky' culture ship names (much as I love them, they're done to death) ship_names = list( @@ -749,6 +893,12 @@ headquarters = "" motto = "" + org_type = "corporate" + slogans = list( + "Xion Manufacturing - We have what you need.", + "Xion Manufacturing - The #1 choice of the SolCom Engineer's Union for 150 years.", + "Xion Manufacturing - Our products are as bulletproof as our contracts." + ) ship_prefixes = list("XMV" = "a general operations", "XTV" = "a hauling", "XFV" = "a bulk transport", "XIV" = "a resupply") //martian mountains ship_names = list( @@ -803,6 +953,12 @@ headquarters = "" motto = "" + org_type = "corporate" + slogans = list( + "The FTU. We look out for the little guy.", + "There's no Trade like Free Trade.", + "Join the Free Trade Union. Because anything worth doing, is worth doing for money." //rule of acquisition #13 + ) ship_prefixes = list("FTV" = "a general operations", "FTRP" = "a trade protection", "FTRR" = "a piracy suppression", "FTLV" = "a logistical support", "FTTV" = "a mercantile", "FTDV" = "a market establishment") //famous merchants and traders, taken from Civ6's Great Merchants, plus the TSC's founder ship_names = list( @@ -846,6 +1002,12 @@ headquarters = "Mars, Sol" motto = "With Major Bill's, you won't pay major bills!" + org_type = "corporate" + slogans = list( + "With Major Bill's, you won't pay major bills!", + "Major Bill's - Private Couriers - General Shipping!", + "Major Bill's got you covered, now get out there!" + ) ship_prefixes = list("TTV" = "a general operations", "TTV" = "a transport", "TTV" = "a luxury transit", "TTV" = "a priority transit", "TTV" = "a secure data courier") //ship names: big rivers ship_names = list ( @@ -916,6 +1078,12 @@ headquarters = "Mars, Sol" motto = "" + org_type = "corporate" + slogans = list( + "Grayson Mining - It's An Ore Effort, For The War Effort!", + "Grayson Mining - Winning The War On Ore!", + "Grayson Mining - Come On Down To Our Ore Chasm!" + ) ship_prefixes = list("GMV" = "a general operations", "GMT" = "a transport", "GMR" = "a resourcing", "GMS" = "a surveying", "GMH" = "a bulk transit") //rocks ship_names = list( @@ -976,6 +1144,12 @@ headquarters = "" motto = "Dum spiro spero" + org_type = "corporate" + slogans = list( + "Aether A&R - We're Absolutely Breathtaking.", + "Aether A&R - You Can Breathe Easy With Us!", + "Aether A&R - The SolCom's #1 Environmental Systems Provider." + ) ship_prefixes = list("AARV" = "a general operations", "AARE" = "a resource extraction", "AARG" = "a gas transport", "AART" = "a transport") //weather systems/patterns ship_names = list ( @@ -1025,6 +1199,12 @@ headquarters = "" motto = "" + org_type = "corporate" + slogans = list( + "Focal Point Energistics - Sustainable Power for a Sustainable Future.", + "Focal Point Energistics - Powering The Future Before It Even Happens.", + "Focal Point Energistics - Let There Be Light." + ) ship_prefixes = list("FPV" = "a general operations", "FPH" = "a transport", "FPC" = "an energy relay", "FPT" = "a fuel transport") //famous electrical engineers ship_names = list ( @@ -1085,6 +1265,12 @@ headquarters = "Spin Aerostat, Jupiter" motto = "Sic itur ad astra" + org_type = "corporate" + slogans = list( + "StarFlight - travel the stars.", + "StarFlight - bringing you to new horizons.", + "StarFlight - getting you where you need to be since 2137." + ) ship_prefixes = list("SFI-X" = "a VIP liner", "SFI-L" = "a luxury liner", "SFI-B" = "a business liner", "SFI-E" = "an economy liner", "SFI-M" = "a mixed class liner", "SFI-S" = "a sightseeing", "SFI-M" = "a wedding", "SFI-O" = "a marketing", "SFI-S" = "a safari", "SFI-A" = "an aquatic adventure") flight_types = list( //no military-sounding ones here "flight", @@ -1143,6 +1329,12 @@ headquarters = "" motto = "News from all across the spectrum" + org_type = "corporate" + slogans = list( + "Oculum - All News, All The Time.", + "Oculum - We Keep An Eye Out.", + "Oculum - Your Eye On The Galaxy." + ) ship_prefixes = list("OBV" = "an investigation", "OBV" = "a distribution", "OBV" = "a journalism", "OBV" = "a general operations") destination_names = list( "Oculus HQ" @@ -1158,6 +1350,12 @@ headquarters = "Alpha Centauri" motto = "The largest brands of food and drink - most of them are Centauri." + org_type = "corporate" + slogans = list( + "Centauri Provisions Bread Tubes - They're Not Just Edible, They're |Breadible!|", + "Centauri Provisions SkrellSnax - Not |Just| For Skrell!", + "Centauri Provisions Space Mountain Wind - It'll Take Your |Breath| Away!" + ) ship_prefixes = list("CPTV" = "a transport", "CPCV" = "a catering", "CPRV" = "a resupply", "CPV" = "a general operations") destination_names = list( "Centauri Provisions HQ", @@ -1175,6 +1373,12 @@ headquarters = "" motto = "Engine designs, emergency generators, and old memories" + org_type = "corporate" + slogans = list( + "Einstein Engines - you don't have to be Einstein to use |our| engines!", + "Einstein Engines - bringing power to the people.", + "Einstein Engines - because it's the smart thing to do." + ) ship_prefixes = list("EETV" = "a transport", "EERV" = "a research", "EEV" = "a general operations") destination_names = list( "Einstein HQ" @@ -1190,6 +1394,12 @@ headquarters = "" motto = "We build it - you fly it" + org_type = "corporate" + slogans = list( + "Wulf Aeronautics. We build it - you fly it.", + "Wulf Aeronautics, the Commonwealth's favorite shipwrights.", + "Wulf Aeronautics, building tomorrow's ships today." + ) ship_prefixes = list("WATV" = "a transport", "WARV" = "a repair", "WAV" = "a general operations") destination_names = list( "Wulf Aeronautics HQ", @@ -1207,6 +1417,12 @@ headquarters = "" motto = "" + org_type = "corporate" + slogans = list( + "Why choose |luxury| when you can choose |Gilthari|?", + "|Gilthari|. Because |you're| worth it.", + "|Gilthari|. Why settle for |anything| less?" + ) ship_prefixes = list("GETV" = "a transport", "GECV" = "a luxury catering", "GEV" = "a general operations") //precious stones ship_names = list( @@ -1283,6 +1499,12 @@ headquarters = "N/A" motto = "one man's trash is another man's treasure" + org_type = "corporate" + slogans = list( + "Coyote Salvage Corp. 'cause your trash ain't gonna clean itself.", + "Coyote Salvage Corp. 'cause one man's trash is another man's treasure.", + "Coyote Salvage Corp. We'll take your scrap - but not your crap." + ) ship_prefixes = list("CSV" = "a salvage", "CRV" = "a recovery", "CTV" = "a transport", "CSV" = "a shipbreaking", "CHV" = "a towing") //mostly-original, maybe some references, and more than a few puns ship_names = list( @@ -1351,6 +1573,12 @@ headquarters = "Titan, Sol" motto = "the whole is greater than the sum of its parts" + org_type = "corporate" + slogans = list( + "Chimera Genetics. Find your true self today!", + "Chimera Genetics. Bring us your genes and we'll clean them right up.", + "Chimera Genetics. Better bodies for a better tomorrow." + ) ship_prefixes = list("CGV" = "a general operations", "CGT" = "a transport", "CGT" = "a delivery", "CGH" = "a medical") //edgy mythological critters! ship_names = list( @@ -1506,6 +1734,7 @@ sysdef = TRUE //we're the space law, we don't impersonate people and stuff autogenerate_destination_names = FALSE //don't add extra destinations to our pool, or else we leave the system which makes no sense + org_type = "system defense" ship_prefixes = list ("SDB" = "a patrol", "SDF" = "a patrol", "SDV" = "a patrol", "SDB" = "an escort", "SDF" = "an escort", "SDV" = "an escort", "SAR" = "a search and rescue", "SDT" = "a logistics", "SDT" = "a resupply", "SDJ" = "a prisoner transport") //b = boat, f = fleet (generic), v = vessel, t = tender //ship names: weapons ship_names = list( @@ -1605,6 +1834,7 @@ sysdef = FALSE autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes. + org_type = "smuggler" ship_prefixes = list ("suspected smuggler" = "an illegal smuggling", "possible smuggler" = "an illegal smuggling") //as assigned by control, second part shouldn't even come up //blank out our shipnames for redesignation ship_names = list( @@ -1781,6 +2011,7 @@ hostile = TRUE autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes. + org_type = "pirate" ship_prefixes = list ("known pirate" = "a piracy", "suspected pirate" = "a piracy", "rogue privateer" = "a piracy", "Cartel enforcer" = "a piracy", "known outlaw" = "a piracy", "bandit" = "a piracy", "roving corsair" = "a piracy", "illegal salvager" = "an illegal salvage", "rogue mercenary" = "a mercenary") //as assigned by control, second part shouldn't even come up, but it exists to avoid hiccups/weirdness just in case ship_names = list( "Morally Bankrupt", @@ -1953,6 +2184,7 @@ hostile = TRUE autogenerate_destination_names = TRUE + org_type = "pirate" ship_prefixes = list("Ue-Katish pirate" = "a raiding", "Ue-Katish bandit" = "a raiding", "Ue-Katish raider" = "a raiding", "Ue-Katish enforcer" = "an enforcement") ship_names = list( "Keqxuer'xeu's Prize", @@ -1987,6 +2219,7 @@ hostile = TRUE autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need *some* entries to avoid runtimes. + org_type = "pirate" ship_prefixes = list("vox marauder" = "a marauding", "vox raider" = "a raiding", "vox ravager" = "a raiding", "vox corsair" = "a raiding") //as assigned by control, second part shouldn't even come up //blank out our shipnames for redesignation ship_names = list( @@ -2063,6 +2296,7 @@ motto = "Nil Mortalibus Ardui Est" // Latin, because latin. Says 'Nothing is too steep for mortals' autogenerate_destination_names = TRUE + org_type = "government" ship_prefixes = list("CWS-A" = "an administrative", "CWS-T" = "a transportation", "CWS-D" = "a diplomatic", "CWS-F" = "a freight", "CWS-J" = "a prisoner transfer") //earth's biggest impact craters ship_names = list( @@ -2158,6 +2392,7 @@ headquarters = "Paraiso a Àstrea" motto = "Liberty to the Stars!" + org_type = "government" ship_prefixes = list("UFHV" = "military", "FFHV" = "classified") ship_names = list( "Bulwark of the Free", @@ -2236,6 +2471,7 @@ headquarters = "" motto = "" + org_type = "government" ship_prefixes = list("ECS-M" = "a military", "ECS-T" = "a transport", "ECS-T" = "a special transport", "ECS-D" = "a diplomatic") //The Special Transport is SLAAAAVES. but let's not advertise that openly. ship_names = list( "Bring Me Wine!", @@ -2291,6 +2527,7 @@ headquarters = "The Pact, Myria" motto = "" + org_type = "government" ship_prefixes = list("SFM-M" = "a military", "SFM-M" = "a patrol") // The Salthans don't do anything else. flight_types = list( "mission", @@ -2394,6 +2631,7 @@ motto = "" autogenerate_destination_names = TRUE //big list of own holdings to come + org_type = "government" //the tesh expeditionary fleet's closest analogue in modern terms would be the US Army Corps of Engineers, just with added combat personnel as well ship_prefixes = list("TEF" = "a diplomatic", "TEF" = "a peacekeeping", "TEF" = "an escort", "TEF" = "an exploration", "TEF" = "a survey", "TEF" = "an expeditionary", "TEF" = "a pioneering") //TODO: better ship names? I just took a bunch of random teshnames from the Random Name button and added a word. @@ -2441,6 +2679,7 @@ motto = "Si Vis Pacem Para Bellum" //if you wish for peace, prepare for war autogenerate_destination_names = TRUE + org_type = "military" ship_prefixes = list ("USDF" = "a logistical", "USDF" = "a training", "USDF" = "a patrol", "USDF" = "a piracy suppression", "USDF" = "a peacekeeping", "USDF" = "a relief", "USDF" = "an escort", "USDF" = "a search and rescue", "USDF" = "a classified") flight_types = list( "mission", @@ -2539,6 +2778,7 @@ motto = "" autogenerate_destination_names = TRUE + org_type = "military" ship_prefixes = list("PCRC" = "a risk control", "PCRC" = "a private security") flight_types = list( "flight", @@ -2602,6 +2842,7 @@ motto = "Strength in Numbers" autogenerate_destination_names = TRUE + org_type = "military" ship_prefixes = list("HPF" = "a secure freight", "HPT" = "a training", "HPS" = "a logistics", "HPV" = "a patrol", "HPH" = "a bounty hunting", "HPX" = "an experimental", "HPC" = "a command", "HPI" = "a mercy") flight_types = list( "flight", @@ -2686,6 +2927,7 @@ motto = "Aut Neca Aut Necare" autogenerate_destination_names = TRUE + org_type = "military" ship_prefixes = list("SAARE" = "a secure freight", "SAARE" = "a training", "SAARE" = "a logistics", "SAARE" = "a patrol", "SAARE" = "a security", "SAARE" = "an experimental", "SAARE" = "a command", "SAARE" = "a classified") flight_types = list( "flight", diff --git a/code/modules/casino/casino_prize_vendor.dm b/code/modules/casino/casino_prize_vendor.dm index d82f8ef72ac..0355a73bb4f 100644 --- a/code/modules/casino/casino_prize_vendor.dm +++ b/code/modules/casino/casino_prize_vendor.dm @@ -88,8 +88,8 @@ CASINO_PRIZE("Dolphin mask", /obj/item/clothing/mask/dolphin, 1, 50, "clothing"), CASINO_PRIZE("Demon mask", /obj/item/clothing/mask/demon, 1, 50, "clothing"), CASINO_PRIZE("Chameleon mask", /obj/item/clothing/under/chameleon, 1, 250, "clothing"), - CASINO_PRIZE("Ian costume", /obj/item/clothing/suit/storage/hooded/ian_costume, 1, 50, "clothing"), - CASINO_PRIZE("Carp costume", /obj/item/clothing/suit/storage/hooded/carp_costume, 1, 50, "clothing"), + CASINO_PRIZE("Ian costume", /obj/item/clothing/suit/storage/hooded/costume/ian, 1, 50, "clothing"), + CASINO_PRIZE("Carp costume", /obj/item/clothing/suit/storage/hooded/costume/carp, 1, 50, "clothing"), ) item_list["Miscellaneous"] = list( CASINO_PRIZE("Toy sword", /obj/item/toy/sword, 1, 50, "misc"), diff --git a/code/modules/client/preference_setup/general/02_language.dm b/code/modules/client/preference_setup/general/02_language.dm index 6128eb2c64a..21214895355 100644 --- a/code/modules/client/preference_setup/general/02_language.dm +++ b/code/modules/client/preference_setup/general/02_language.dm @@ -30,7 +30,7 @@ // Sanitize illegal languages for(var/language in pref.alternate_languages) var/datum/language/L = GLOB.all_languages[language] - if(!istype(L) || (L.flags & RESTRICTED) || (!(language in S.secondary_langs) && !is_lang_whitelisted(pref.client, L))) + if(!istype(L) || (L.flags & RESTRICTED) || (!(language in S.secondary_langs) && pref.client && !is_lang_whitelisted(pref.client, L))) testing("LANGSANI: Removed [L?.name || "lang not found"] from [pref.client]'s character [pref.real_name || "-name not yet loaded-"] because it failed allowed checks") pref.alternate_languages -= language diff --git a/code/modules/client/preference_setup/loadout/loadout_gloves.dm b/code/modules/client/preference_setup/loadout/loadout_gloves.dm index 2564b8d98e5..fe56eea8684 100644 --- a/code/modules/client/preference_setup/loadout/loadout_gloves.dm +++ b/code/modules/client/preference_setup/loadout/loadout_gloves.dm @@ -92,14 +92,17 @@ ringtype["engagement ring"] = /obj/item/clothing/gloves/ring/engagement ringtype["signet ring"] = /obj/item/clothing/gloves/ring/seal/signet ringtype["masonic ring"] = /obj/item/clothing/gloves/ring/seal/mason - ringtype["ring, steel"] = /obj/item/clothing/gloves/ring/material/steel - ringtype["ring, iron"] = /obj/item/clothing/gloves/ring/material/iron - ringtype["ring, silver"] = /obj/item/clothing/gloves/ring/material/silver - ringtype["ring, gold"] = /obj/item/clothing/gloves/ring/material/gold - ringtype["ring, platinum"] = /obj/item/clothing/gloves/ring/material/platinum ringtype["ring, glass"] = /obj/item/clothing/gloves/ring/material/glass ringtype["ring, wood"] = /obj/item/clothing/gloves/ring/material/wood ringtype["ring, plastic"] = /obj/item/clothing/gloves/ring/material/plastic + ringtype["ring, iron"] = /obj/item/clothing/gloves/ring/material/iron + ringtype["ring, bronze"] = /obj/item/clothing/gloves/ring/material/bronze + ringtype["ring, steel"] = /obj/item/clothing/gloves/ring/material/steel + ringtype["ring, copper"] = /obj/item/clothing/gloves/ring/material/copper + ringtype["ring, silver"] = /obj/item/clothing/gloves/ring/material/silver + ringtype["ring, gold"] = /obj/item/clothing/gloves/ring/material/gold + ringtype["ring, platinum"] = /obj/item/clothing/gloves/ring/material/platinum + gear_tweaks += new/datum/gear_tweak/path(ringtype) /datum/gear/gloves/circuitry diff --git a/code/modules/client/preference_setup/loadout/loadout_mask.dm b/code/modules/client/preference_setup/loadout/loadout_mask.dm index 5de81409f3f..7336f5e4f75 100644 --- a/code/modules/client/preference_setup/loadout/loadout_mask.dm +++ b/code/modules/client/preference_setup/loadout/loadout_mask.dm @@ -29,4 +29,25 @@ /datum/gear/mask/plaguedoctor2 display_name = "golden plague doctor's mask" path = /obj/item/clothing/mask/gas/plaguedoctor/gold - cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage. \ No newline at end of file + cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage. + +/datum/gear/mask/papermask + display_name = "paper mask" + path = /obj/item/clothing/mask/paper + +/datum/gear/mask/emotionalmask + display_name = "emotional mask" + path = /obj/item/clothing/mask/emotions + +/datum/gear/mask/gaiter + display_name = "neck gaiter selection" + path = /obj/item/clothing/mask/gaiter + cost = 1 + +/datum/gear/mask/gaiter/New() + ..() + var/list/gaiters = list() + for(var/gaiter in typesof(/obj/item/clothing/mask/gaiter)) + var/obj/item/clothing/mask/gaiter_type = gaiter + gaiters[initial(gaiter_type.name)] = gaiter_type + gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, /proc/cmp_text_asc)) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index fb396762f5e..4a945f442c2 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -89,37 +89,37 @@ display_name = "flashlight" path = /obj/item/device/flashlight -/datum/gear/utility/flashlight_blue - display_name = "flashlight, blue" - path = /obj/item/device/flashlight/color - -/datum/gear/utility/flashlight_orange - display_name = "flashlight, orange" - path = /obj/item/device/flashlight/color/orange - -/datum/gear/utility/flashlight_red - display_name = "flashlight, red" - path = /obj/item/device/flashlight/color/red - -/datum/gear/utility/flashlight_yellow - display_name = "flashlight, yellow" - path = /obj/item/device/flashlight/color/yellow - /datum/gear/utility/maglight display_name = "flashlight, maglight" path = /obj/item/device/flashlight/maglight cost = 2 +/datum/gear/utility/flashlight/color + display_name = "flashlight, small (selection)" + path = /obj/item/device/flashlight/color + +/datum/gear/utility/flashlight/color/New() + ..() + var/list/flashlights = list( + "Blue Flashlight" = /obj/item/device/flashlight/color, + "Red Flashlight" = /obj/item/device/flashlight/color/red, + "Green Flashlight" = /obj/item/device/flashlight/color/green, + "Yellow Flashlight" = /obj/item/device/flashlight/color/yellow, + "Purple Flashlight" = /obj/item/device/flashlight/color/purple, + "Orange Flashlight" = /obj/item/device/flashlight/color/orange + ) + gear_tweaks += new/datum/gear_tweak/path(flashlights) + /datum/gear/utility/battery display_name = "cell, device" path = /obj/item/weapon/cell/device /datum/gear/utility/pen - display_name = "Fountain Pen" + display_name = "fountain pen" path = /obj/item/weapon/pen/fountain /datum/gear/utility/umbrella - display_name = "Umbrella" + display_name = "umbrella" path = /obj/item/weapon/melee/umbrella cost = 3 @@ -131,7 +131,7 @@ display_name = "wheelchair selection" path = /obj/item/wheelchair cost = 4 - + /datum/gear/utility/wheelchair/New() ..() gear_tweaks += gear_tweak_free_color_choice diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm index 116bd1a9ad8..9ce7f08026c 100644 --- a/code/modules/client/preference_setup/occupation/occupation.dm +++ b/code/modules/client/preference_setup/occupation/occupation.dm @@ -148,8 +148,11 @@ . += "[rank] \[WHITELIST ONLY]" continue //VOREStation Add End - if(job.minimum_character_age && user.client && (user.client.prefs.age < job.minimum_character_age)) - . += "[rank] \[MINIMUM CHARACTER AGE: [job.minimum_character_age]]" + if(job.is_species_banned(user.client.prefs.species, user.client.prefs.organ_data["brain"]) == TRUE) + . += "[rank] \[THIS RACE/BRAIN TYPE CANNOT TAKE THIS ROLE.\]" + continue + if((job.minimum_character_age || job.min_age_by_species) && user.client && (user.client.prefs.age < job.get_min_age(user.client.prefs.species, user.client.prefs.organ_data["brain"]))) + . += "[rank] \[MINIMUM CHARACTER AGE FOR SELECTED RACE/BRAIN TYPE: [job.get_min_age(user.client.prefs.species, user.client.prefs.organ_data["brain"])]\]" continue if((pref.job_civilian_low & ASSISTANT) && job.type != /datum/job/assistant) . += "[rank]" diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm index d953221b201..0e5b6a24205 100644 --- a/code/modules/client/preference_setup/vore/07_traits.dm +++ b/code/modules/client/preference_setup/vore/07_traits.dm @@ -112,12 +112,17 @@ else if(!pref.custom_base || !(pref.custom_base in GLOB.custom_species_bases)) pref.custom_base = SPECIES_HUMAN + pref.custom_say = lowertext(trim(pref.custom_say)) + pref.custom_whisper = lowertext(trim(pref.custom_whisper)) + pref.custom_ask = lowertext(trim(pref.custom_ask)) + pref.custom_exclaim = lowertext(trim(pref.custom_exclaim)) + /datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character) character.custom_species = pref.custom_species - character.custom_say = pref.custom_say - character.custom_ask = pref.custom_ask - character.custom_whisper = pref.custom_whisper - character.custom_exclaim = pref.custom_exclaim + character.custom_say = lowertext(trim(pref.custom_say)) + character.custom_ask = lowertext(trim(pref.custom_ask)) + character.custom_whisper = lowertext(trim(pref.custom_whisper)) + character.custom_exclaim = lowertext(trim(pref.custom_exclaim)) if(character.isSynthetic()) //Checking if we have a synth on our hands, boys. pref.dirty_synth = 1 diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 7c96267fafb..52841c84648 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -1,6 +1,6 @@ /mob/var/suiciding = 0 -/mob/living/carbon/human/verb/suicide() +/mob/living/carbon/human/verb/suicide() /// At best, useful for admins to see if it's being called. set hidden = 1 if (stat == DEAD) @@ -10,83 +10,9 @@ if (!ticker) to_chat(src, "You can't commit suicide before the game starts!") return - - if(!player_is_antag(mind)) - message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1) - to_chat(src, "No. Adminhelp if there is a legitimate reason.") - return - - if (suiciding) - to_chat(src, "You're already committing suicide! Be patient!") - return - - var/confirm = tgui_alert(usr, "Are you sure you want to commit suicide?", "Confirm Suicide", list("Yes", "No")) - - if(confirm == "Yes") - if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide - to_chat(src, "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))") - return - suiciding = 15 - does_not_breathe = 0 //Prevents ling-suicide zombies, or something - var/obj/item/held_item = get_active_hand() - if(held_item) - var/damagetype = held_item.suicide_act(src) - if(damagetype) - log_and_message_admins("[key_name(src)] commited suicide using \a [held_item]") - var/damage_mod = 1 - switch(damagetype) //Sorry about the magic numbers. - //brute = 1, burn = 2, tox = 4, oxy = 8 - if(15) //4 damage types - damage_mod = 4 - - if(6, 11, 13, 14) //3 damage types - damage_mod = 3 - - if(3, 5, 7, 9, 10, 12) //2 damage types - damage_mod = 2 - - if(1, 2, 4, 8) //1 damage type - damage_mod = 1 - - else //This should not happen, but if it does, everything should still work - damage_mod = 1 - - //Do 175 damage divided by the number of damage types applied. - if(damagetype & BRUTELOSS) - adjustBruteLoss(30/damage_mod) //hack to prevent gibbing - adjustOxyLoss(145/damage_mod) - - if(damagetype & FIRELOSS) - adjustFireLoss(175/damage_mod) - - if(damagetype & TOXLOSS) - adjustToxLoss(175/damage_mod) - - if(damagetype & OXYLOSS) - adjustOxyLoss(175/damage_mod) - - //If something went wrong, just do normal oxyloss - if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS)) - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - - updatehealth() - return - - log_and_message_admins("[key_name(src)] commited suicide") - - var/datum/gender/T = gender_datums[get_visible_gender()] - - var/suicidemsg - suicidemsg = pick("[src] is attempting to bite [T.his] tongue off! It looks like [T.he] [T.is] trying to commit suicide.", \ - "[src] is jamming [T.his] thumbs into [T.his] eye sockets! It looks like [T.he] [T.is] trying to commit suicide.", \ - "[src] is twisting [T.his] own neck! It looks like [T.he] [T.is] trying to commit suicide.", \ - "[src] is holding [T.his] breath! It looks like [T.he] [T.is] trying to commit suicide.") - if(isSynthetic()) - suicidemsg = "[src] is attempting to switch [T.his] power off! It looks like [T.he] [T.is] trying to commit suicide." - visible_message(suicidemsg) - - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - updatehealth() + + to_chat(src, "No. Adminhelp if there is a legitimate reason, and please review our server rules.") + message_admins("[ckey] has tried to trigger the suicide verb as human, but it is currently disabled.") /mob/living/carbon/brain/verb/suicide() set hidden = 1 @@ -165,4 +91,4 @@ M.show_message("[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "[src] bleeps electronically.", 2) death(0) else - to_chat(src, "Aborting suicide attempt.") + to_chat(src, "Aborting suicide attempt.") \ No newline at end of file diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 3db7ad58cf4..7f45fcfdb3f 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -292,6 +292,12 @@ BLIND // can't see anything item_state_slots = list(slot_r_hand_str = "glasses", slot_l_hand_str = "glasses") body_parts_covered = 0 +/obj/item/clothing/glasses/artist + name = "4-D Glasses" + desc = "You can see in every dimension, and get four times the amount of headache!" + icon_state = "artist" + item_state = "artist_glasses" + /obj/item/clothing/glasses/gglasses name = "green glasses" desc = "Forest green glasses, like the kind you'd wear when hatching a nasty scheme." @@ -590,3 +596,4 @@ BLIND // can't see anything to_chat(usr, "You push \the [src] up from in front of your eyes.") update_clothing_icon() usr.update_action_buttons() + diff --git a/code/modules/clothing/head/hood.dm b/code/modules/clothing/head/hood.dm index db51bcb8f99..a6bef8b838b 100644 --- a/code/modules/clothing/head/hood.dm +++ b/code/modules/clothing/head/hood.dm @@ -192,4 +192,10 @@ /obj/item/clothing/head/hood/techpriest name = "techpriest hood" desc = "A techpriest hood." - icon_state = "techpriesthood" \ No newline at end of file + icon_state = "techpriesthood" + +/obj/item/clothing/head/hood/siffet_hood + name = "siffet hood" + desc = "A hood that looks vaguely like a siffet's head. Guaranteed to traumatize your Promethean coworkers." + icon_state = "siffet" + item_state_slots = list(slot_r_hand_str = "siffet", slot_l_hand_str = "siffet") diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index d972cf82cc8..5b94f947411 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -294,4 +294,97 @@ desc = "A black veil, typically worn at funerals or by goths." w_class = ITEMSIZE_TINY body_parts_covered = FACE - icon_state = "veil" \ No newline at end of file + icon_state = "veil" + +/obj/item/clothing/mask/paper + name = "paper mask" + desc = "A neat, circular mask made out of paper. Perhaps you could try drawing on it with a pen!" + w_class = ITEMSIZE_SMALL + body_parts_covered = FACE + icon_state = "papermask" + +/obj/item/clothing/mask/paper/attackby(obj/item/I as obj, mob/living/user as mob, proximity) + if(!proximity) return + if(istype(I, /obj/item/weapon/pen)) + var/drawtype = tgui_alert(user, "Choose what you'd like to draw.", "Faces", list("blank","neutral","eyes","sleeping", "heart", "core", "plus", "square", "bullseye", "vertical", "horizontal", "X", "bug eyes", "double", "mark" )) + switch(drawtype) + if("blank") + src.icon_state = "papermask" + if("neutral") + src.icon_state = "neutralmask" + if("eyes") + src.icon_state = "eyemask" + if("sleeping") + src.icon_state = "sleepingmask" + if("heart") + src.icon_state = "heartmask" + if("core") + src.icon_state = "coremask" + if("plus") + src.icon_state = "plusmask" + if("square") + src.icon_state = "squaremask" + if("bullseye") + src.icon_state = "bullseyemask" + if("vertical") + src.icon_state = "verticalmask" + if("horizontal") + src.icon_state = "horizontalmask" + if("X") + src.icon_state = "xmask" + if("bug eyes") + src.icon_state = "bugmask" + if("double") + src.icon_state = "doublemask" + if("mark") + src.icon_state = "markmask" + return + +/obj/item/clothing/mask/emotions + name = "emotional mask" + desc = "Express your happiness or hide your sorrows with this modular cutout. Draw your current emotions onto it with a pen!" + w_class = ITEMSIZE_SMALL + body_parts_covered = FACE + icon_state = "joy" + +/obj/item/clothing/mask/emotions/attackby(obj/item/I as obj, mob/living/user as mob, proximity) + if(!proximity) return + if(istype(I, /obj/item/weapon/pen)) + var/drawtype = tgui_alert(user, "Choose what emotions you'd like to display.", "Emotions", list("joy","pensive","angry","flushed" )) + switch(drawtype) + if("joy") + src.icon_state = "joy" + if("pensive") + src.icon_state = "pensive" + if("angry") + src.icon_state = "angry" + if("flushed") + src.icon_state = "flushed" + return + +//Gaiter scarves +/obj/item/clothing/mask/gaiter + name = "red neck gaiter" + desc = "A slightly worn neck gaiter, it's loose enough to be worn comfortably like a scarf. Commonly used by outdoorsmen and mercenaries, both to keep warm and keep debris away from the face." + icon_state = "gaiter_red" + +/obj/item/clothing/mask/gaiter/attack_self(mob/user as mob) + if(src.icon_state == initial(icon_state)) + src.icon_state = "[icon_state]_up" + to_chat(user, "You pull the gaiter up over your nose.") + else + src.icon_state = initial(icon_state) + to_chat(user, "You tug the gaiter down around your neck.") + update_clothing_icon() //so our mob-overlays update + +/obj/item/clothing/mask/gaiter/tan + name = "tan neck gaiter" + icon_state = "gaiter_tan" + +/obj/item/clothing/mask/gaiter/gray + name = "gray neck gaiter" + icon_state = "gaiter_gray" + +/obj/item/clothing/mask/gaiter/green + name = "green neck gaiter" + icon_state = "gaiter_green" \ No newline at end of file diff --git a/code/modules/clothing/rings/material.dm b/code/modules/clothing/rings/material.dm index 218065b2533..8fdbda704e2 100644 --- a/code/modules/clothing/rings/material.dm +++ b/code/modules/clothing/rings/material.dm @@ -20,28 +20,52 @@ return material /obj/item/clothing/gloves/ring/material/wood/New(var/newloc) - ..(newloc, "wood") + ..(newloc, MAT_WOOD) /obj/item/clothing/gloves/ring/material/plastic/New(var/newloc) - ..(newloc, "plastic") + ..(newloc, MAT_PLASTIC) /obj/item/clothing/gloves/ring/material/iron/New(var/newloc) - ..(newloc, "iron") - -/obj/item/clothing/gloves/ring/material/steel/New(var/newloc) - ..(newloc, "steel") - -/obj/item/clothing/gloves/ring/material/silver/New(var/newloc) - ..(newloc, "silver") - -/obj/item/clothing/gloves/ring/material/gold/New(var/newloc) - ..(newloc, "gold") - -/obj/item/clothing/gloves/ring/material/platinum/New(var/newloc) - ..(newloc, "platinum") - -/obj/item/clothing/gloves/ring/material/phoron/New(var/newloc) - ..(newloc, "phoron") + ..(newloc, MAT_IRON) /obj/item/clothing/gloves/ring/material/glass/New(var/newloc) - ..(newloc, "glass") + ..(newloc, MAT_GLASS) + +/obj/item/clothing/gloves/ring/material/steel/New(var/newloc) + ..(newloc, MAT_STEEL) + +/obj/item/clothing/gloves/ring/material/silver/New(var/newloc) + ..(newloc, MAT_SILVER) + +/obj/item/clothing/gloves/ring/material/gold/New(var/newloc) + ..(newloc, MAT_GOLD) + +/obj/item/clothing/gloves/ring/material/platinum/New(var/newloc) + ..(newloc, MAT_PLATINUM) + +/obj/item/clothing/gloves/ring/material/phoron/New(var/newloc) + ..(newloc, MAT_PHORON) + +/obj/item/clothing/gloves/ring/material/titanium/New(var/newloc) + ..(newloc, MAT_TITANIUM) + +/obj/item/clothing/gloves/ring/material/copper/New(var/newloc) + ..(newloc, MAT_COPPER) + +/obj/item/clothing/gloves/ring/material/bronze/New(var/newloc) + ..(newloc, MAT_BRONZE) + +/obj/item/clothing/gloves/ring/material/uranium/New(var/newloc) + ..(newloc, MAT_URANIUM) + +/obj/item/clothing/gloves/ring/material/osmium/New(var/newloc) + ..(newloc, MAT_OSMIUM) + +/obj/item/clothing/gloves/ring/material/lead/New(var/newloc) + ..(newloc, MAT_LEAD) + +/obj/item/clothing/gloves/ring/material/diamond/New(var/newloc) + ..(newloc, MAT_DIAMOND) + +/obj/item/clothing/gloves/ring/material/tin/New(var/newloc) + ..(newloc, MAT_TIN) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 9cb77eaf2e5..52aabe2bb4f 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -166,7 +166,7 @@ /obj/item/clothing/shoes/athletic name = "athletic shoes" - desc = "A pair of sleek atheletic shoes. Made by and for the sporty types." + desc = "A pair of sleek athletic shoes. Made by and for the sporty types." icon_state = "sportshoe" addblends = "sportshoe_a" item_state_slots = list(slot_r_hand_str = "sportheld", slot_l_hand_str = "sportheld") diff --git a/code/modules/clothing/suits/hooded.dm b/code/modules/clothing/suits/hooded.dm index 1a250bc683f..cd5fb97d1fc 100644 --- a/code/modules/clothing/suits/hooded.dm +++ b/code/modules/clothing/suits/hooded.dm @@ -63,26 +63,32 @@ else RemoveHood() -/obj/item/clothing/suit/storage/hooded/carp_costume +/obj/item/clothing/suit/storage/hooded/costume + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER + cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS + action_button_name = "Toggle Hood" + +/obj/item/clothing/suit/storage/hooded/costume/siffet + name = "siffet costume" + desc = "A costume made from 'synthetic' siffet fur, it smells like a weasel nest." + icon_state = "siffet" + item_state_slots = list(slot_r_hand_str = "siffet", slot_l_hand_str = "siffet") + hoodtype = /obj/item/clothing/head/hood/siffet_hood + +/obj/item/clothing/suit/storage/hooded/costume/carp name = "carp costume" desc = "A costume made from 'synthetic' carp scales, it smells." icon_state = "carp_casual" item_state_slots = list(slot_r_hand_str = "carp_casual", slot_l_hand_str = "carp_casual") //Does not exist -S2- - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER - cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS - min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE //Space carp like space, so you should too - action_button_name = "Toggle Carp Hood" hoodtype = /obj/item/clothing/head/hood/carp_hood + min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE //Space carp like space, so you should too -/obj/item/clothing/suit/storage/hooded/ian_costume //It's Ian, rub his bell- oh god what happened to his inside parts? +/obj/item/clothing/suit/storage/hooded/costume/ian //It's Ian, rub his bell- oh god what happened to his inside parts? name = "corgi costume" desc = "A costume that looks like someone made a human-like corgi, it won't guarantee belly rubs." icon_state = "ian" item_state_slots = list(slot_r_hand_str = "ian", slot_l_hand_str = "ian") //Does not exist -S2- - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS - flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER - action_button_name = "Toggle Ian Hood" hoodtype = /obj/item/clothing/head/hood/ian_hood // winter coats go here diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index bfa91659c25..3d44c893fe1 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -518,7 +518,7 @@ /obj/item/clothing/suit/storage/toggle/bomber/retro name = "retro bomber jacket" desc = "A retro style, fur-lined leather bomber jacket that invokes the early days of space exploration when spacemen were spacemen, and laser guns had funny little antennae on them." - icon_state = "retro_bomber" + icon_state = "retrojacket" /obj/item/clothing/suit/storage/bomber/alt name = "bomber jacket" diff --git a/code/modules/clothing/under/accessories/holster_vr.dm b/code/modules/clothing/under/accessories/holster_vr.dm index 8cd7681dd9c..2506251a4f8 100644 --- a/code/modules/clothing/under/accessories/holster_vr.dm +++ b/code/modules/clothing/under/accessories/holster_vr.dm @@ -1,6 +1,6 @@ /obj/item/clothing/accessory/holster/waist/kinetic_accelerator name = "KA holster" - desc = "A specialized holster, made specifically for Kinetic Accelerator." + desc = "A specialized holster, made specifically for Kinetic Accelerators." can_hold = list(/obj/item/weapon/gun/energy/kinetic_accelerator) /obj/item/clothing/accessory/holster/machete/rapier diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index bc4d45685db..e358ed25748 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -1020,6 +1020,25 @@ desc = "A rather skimpy cow patterned swimsuit." icon_state = "swim_cow" +/obj/item/clothing/under/wetsuit + name = "wetsuit" + desc = "For when you need to scuba dive your way into an enemy base." + icon_state = "wetsuit" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + +/obj/item/clothing/under/wetsuit_skimpy + name = "tactical wetsuit" + desc = "For when you need to scuba dive your way into an enemy base but still want to show off a little skin." + icon_state = "wetsuit_skimpy" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + +/obj/item/clothing/under/wetsuit_rec + name = "recreational wetsuit" + desc = "For when you need to kayak your way into an enemy base." + icon_state = "wetsuit_rec" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + cold_protection = UPPER_TORSO|LOWER_TORSO /* * Pyjamas diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 301c99b7041..4d9c009e10d 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -98,16 +98,11 @@ if(!reagents.total_volume) to_chat(user, "The [initial(name)] is dry!") else - user.visible_message("\The [user] starts to wipe down [A] with [src]!") - //reagents.splash(A, 1) //get a small amount of liquid on the thing we're wiping. + user.visible_message("[user] starts to wipe [A] with [src].") update_name() if(do_after(user,30)) - user.visible_message("\The [user] finishes wiping off the [A]!") - A.clean_blood() - if(istype(A, /turf) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay) || istype(A, /obj/effect/rune)) //VOREStation Edit - "Allows rags to clean dirt from turfs" - var/turf/T = get_turf(A) - if(T) - T.clean(src, user) //VOREStation Edit End + user.visible_message("[user] finishes wiping [A]!") + A.on_rag_wipe(src) /obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag) if(isliving(target)) //Leaving this as isliving. @@ -121,7 +116,7 @@ var/mob/living/carbon/human/H = target if(H.head && (H.head.body_parts_covered & FACE)) //Check human head coverage. to_chat(user, "Remove their [H.head] first.") - return + return else if(reagents.total_volume) //Final check. If the rag is not on fire and their face is uncovered, smother target. user.do_attack_animation(src) user.visible_message( diff --git a/code/modules/economy/price_list.dm b/code/modules/economy/price_list.dm index 23ce932f06f..10199e9e466 100644 --- a/code/modules/economy/price_list.dm +++ b/code/modules/economy/price_list.dm @@ -216,6 +216,9 @@ /datum/reagent/ethanol/cuba_libre price_tag = 4 +/datum/reagent/ethanol/rum_and_cola + price_tag = 4 + /datum/reagent/ethanol/demonsblood price_tag = 4 diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm index 327dbb4590b..3a4b912f16f 100644 --- a/code/modules/economy/vending_machines.dm +++ b/code/modules/economy/vending_machines.dm @@ -91,6 +91,7 @@ /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/decaf_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/bottle/dr_gibb = 5, @@ -139,6 +140,7 @@ products = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25, /obj/item/weapon/reagent_containers/food/drinks/decaf = 15, /obj/item/weapon/reagent_containers/food/drinks/tea = 25, + /obj/item/weapon/reagent_containers/food/drinks/decaf_tea = 25, /obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25, /obj/item/weapon/reagent_containers/food/drinks/greentea = 15, /obj/item/weapon/reagent_containers/food/drinks/chaitea = 15) @@ -146,6 +148,7 @@ prices = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 2, /obj/item/weapon/reagent_containers/food/drinks/decaf = 3, /obj/item/weapon/reagent_containers/food/drinks/tea = 2, + /obj/item/weapon/reagent_containers/food/drinks/decaf_tea = 2, /obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 2, /obj/item/weapon/reagent_containers/food/drinks/greentea = 10, /obj/item/weapon/reagent_containers/food/drinks/chaitea = 5) // VOREStation Edit - Lowers Coffee/Hot Chocolate/Tea Prices from 3 -> 2. @@ -233,10 +236,12 @@ 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 the galaxy." products = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/decaf_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/dr_gibb_diet = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/starkist = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/starkistdecaf = 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, @@ -247,10 +252,12 @@ 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/decaf_cola = 2, /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/dr_gibb_diet = 1, /obj/item/weapon/reagent_containers/food/drinks/cans/starkist = 1, + /obj/item/weapon/reagent_containers/food/drinks/cans/starkistdecaf = 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, diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm index 1fce3780af9..774b2bc99ec 100644 --- a/code/modules/economy/vending_machines_vr.dm +++ b/code/modules/economy/vending_machines_vr.dm @@ -1325,8 +1325,8 @@ product_ads = "Don't let your art be stifled!;Remember, practice makes perfect!;Break a leg!;Don't make me get the cane!;Thespian's Delight entering stage right!;Costumes for your acting needs!" icon = 'icons/obj/vending.dmi' icon_state = "theater" - products = list(/obj/item/clothing/suit/storage/hooded/carp_costume = 3, - /obj/item/clothing/suit/storage/hooded/carp_costume = 3, + products = list(/obj/item/clothing/suit/storage/hooded/costume/carp = 3, + /obj/item/clothing/suit/storage/hooded/costume/carp = 3, /obj/item/clothing/suit/chickensuit = 3, /obj/item/clothing/head/chicken = 3, /obj/item/clothing/head/helmet/gladiator = 3, @@ -1390,8 +1390,8 @@ /obj/item/clothing/gloves/combat/knight_costume/brown = 3, /obj/item/clothing/shoes/knight_costume = 3, /obj/item/clothing/shoes/knight_costume/black = 3) - prices = list(/obj/item/clothing/suit/storage/hooded/carp_costume = 200, - /obj/item/clothing/suit/storage/hooded/carp_costume = 200, + prices = list(/obj/item/clothing/suit/storage/hooded/costume/carp = 200, + /obj/item/clothing/suit/storage/hooded/costume/carp = 200, /obj/item/clothing/suit/chickensuit = 200, /obj/item/clothing/head/chicken = 200, /obj/item/clothing/head/helmet/gladiator = 300, @@ -2505,8 +2505,8 @@ product_ads = "Don't let your art be stifled!;Remember, practice makes perfect!;Break a leg!;Don't make me get the cane!;Thespian's Delight entering stage right!;Costumes for your acting needs!" icon = 'icons/obj/vending.dmi' icon_state = "theater" - products = list(/obj/item/clothing/suit/storage/hooded/carp_costume = 3, - /obj/item/clothing/suit/storage/hooded/carp_costume = 3, + products = list(/obj/item/clothing/suit/storage/hooded/costume/carp = 3, + /obj/item/clothing/suit/storage/hooded/costume/carp = 3, /obj/item/clothing/suit/chickensuit = 3, /obj/item/clothing/head/chicken = 3, /obj/item/clothing/head/helmet/gladiator = 3, @@ -2570,8 +2570,8 @@ /obj/item/clothing/gloves/combat/knight_costume/brown = 3, /obj/item/clothing/shoes/knight_costume = 3, /obj/item/clothing/shoes/knight_costume/black = 3) - prices = list(/obj/item/clothing/suit/storage/hooded/carp_costume = 200, - /obj/item/clothing/suit/storage/hooded/carp_costume = 200, + prices = list(/obj/item/clothing/suit/storage/hooded/costume/carp = 200, + /obj/item/clothing/suit/storage/hooded/costume/carp = 200, /obj/item/clothing/suit/chickensuit = 200, /obj/item/clothing/head/chicken = 200, /obj/item/clothing/head/helmet/gladiator = 300, @@ -2668,8 +2668,8 @@ /obj/item/clothing/under/color/yellow = 5, /obj/item/clothing/shoes/black = 5, /obj/item/clothing/shoes/white = 5, - /obj/item/clothing/suit/storage/hooded/carp_costume = 3, - /obj/item/clothing/suit/storage/hooded/carp_costume = 3, + /obj/item/clothing/suit/storage/hooded/costume/carp = 3, + /obj/item/clothing/suit/storage/hooded/costume/carp = 3, /obj/item/clothing/suit/chickensuit = 3, /obj/item/clothing/head/chicken = 3, /obj/item/clothing/head/helmet/gladiator = 3, @@ -3411,8 +3411,8 @@ product_ads = "Don't let your art be stifled!;Remember, practice makes perfect!;Break a leg!;Don't make me get the cane!;Thespian's Delight entering stage right!;Costumes for your acting needs!" icon = 'icons/obj/vending.dmi' icon_state = "theater" - products = list(/obj/item/clothing/suit/storage/hooded/carp_costume = 3, - /obj/item/clothing/suit/storage/hooded/carp_costume = 3, + products = list(/obj/item/clothing/suit/storage/hooded/costume/carp = 3, + /obj/item/clothing/suit/storage/hooded/costume/carp = 3, /obj/item/clothing/suit/chickensuit = 3, /obj/item/clothing/head/chicken = 3, /obj/item/clothing/head/helmet/gladiator = 3, diff --git a/code/modules/food/drinkingglass/metaglass.dm b/code/modules/food/drinkingglass/metaglass.dm index bca61427f55..0842b878b0a 100644 --- a/code/modules/food/drinkingglass/metaglass.dm +++ b/code/modules/food/drinkingglass/metaglass.dm @@ -23,7 +23,7 @@ icon = R.glass_icon_file else icon = initial(icon) - + if(R.glass_icon_state) icon_state = R.glass_icon_state else @@ -373,6 +373,10 @@ Drinks Data glass_icon_state = "martiniglass" glass_center_of_mass = list("x"=17, "y"=8) +/datum/reagent/ethanol/rum_and_cola + glass_icon_state = "rumcolaglass" + glass_center_of_mass = list("x"=16, "y"=8) + /datum/reagent/ethanol/cuba_libre glass_icon_state = "cubalibreglass" glass_center_of_mass = list("x"=16, "y"=8) diff --git a/code/modules/food/food/cans.dm b/code/modules/food/food/cans.dm index 75018e8683c..31384df17b4 100644 --- a/code/modules/food/food/cans.dm +++ b/code/modules/food/food/cans.dm @@ -9,7 +9,7 @@ /obj/item/weapon/reagent_containers/food/drinks/cans/cola name = "\improper Space Cola" - desc = "Reassuringly artificial." + desc = "Reassuringly artificial. Contains caffeine." description_fluff = "The 'Space' branding was originally added to the 'Alpha Cola' product line in order to justify selling cans for 50% higher prices to 'off-world' retailers. Despite being chemically identical, Space Cola proved so popular that Centauri Provisions eventually applied the name to the entire product line - price hike and all." icon_state = "cola" center_of_mass = list("x"=16, "y"=10) @@ -18,6 +18,17 @@ . = ..() reagents.add_reagent("cola", 30) +/obj/item/weapon/reagent_containers/food/drinks/cans/decaf_cola + name = "\improper Space Cola Free" + desc = "More reassuringly artificial than ever before." + description_fluff = "The 'Space' branding was originally added to the 'Alpha Cola' product line in order to justify selling cans for 50% higher prices to 'off-world' retailers. Despite being chemically identical, Space Cola proved so popular that Centauri Provisions eventually applied the name to the entire product line - price hike and all." + icon_state = "decafcola" + center_of_mass = list("x"=16, "y"=10) + +/obj/item/weapon/reagent_containers/food/drinks/cans/decaf_cola/Initialize() + . = ..() + reagents.add_reagent("decafcola", 30) + /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle name = "bottled water" desc = "Ice cold and utterly tasteless, this 'all-natural' mineral water comes 'fresh' from one of NanoTrasen's heavy-duty bottling plants in the Sivian poles." @@ -32,7 +43,7 @@ /obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind name = "\improper Space Mountain Wind" - desc = "Blows right through you like a space wind." + desc = "Blows right through you like a space wind. Contains caffeine." description_fluff = "The 'Space' branding was originally added to the 'Alpha Cola' product line in order to justify selling cans for 50% higher prices to 'off-world' retailers. Despite being chemically identical, Space Cola proved so popular that Centauri Provisions eventually applied the name to the entire product line - price hike and all." icon_state = "space_mountain_wind" center_of_mass = list("x"=16, "y"=8) @@ -53,7 +64,7 @@ /obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb name = "\improper Dr. Gibb" - desc = "A delicious mixture of 42 different flavors." + desc = "A delicious mixture of 42 different flavors. Contains caffine." description_fluff = "Following a 2490 lawsuit and a spate of deaths, Gilthari Exports reminds customers that the 'Dr.' legally stands for 'Drink'." icon_state = "dr_gibb" center_of_mass = list("x"=16, "y"=8) @@ -64,7 +75,7 @@ /obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb_diet name = "\improper Diet Dr. Gibb" - desc = "A delicious mixture of 42 different flavors, one of which is water." + desc = "A delicious mixture of 42 different flavors, one of which is water. Contains caffeine." description_fluff = "Following a 2490 lawsuit and a spate of deaths, Gilthari Exports reminds customers that the 'Dr.' legally stands for 'Drink'." icon_state = "dr_gibb_diet" center_of_mass = list("x"=16, "y"=8) @@ -75,7 +86,7 @@ /obj/item/weapon/reagent_containers/food/drinks/cans/starkist name = "\improper Star-kist" - desc = "The taste of a star in liquid form. And, a bit of tuna...?" + desc = "The taste of a star in liquid form. And, a bit of tuna...? Contains caffeine." description_fluff = "Brought back by popular demand in 2515 after a limited-run release in 2510, the cult success of this bizarre tasting soda has never truly been accounted for by economists." icon_state = "starkist" center_of_mass = list("x"=16, "y"=8) @@ -84,6 +95,17 @@ . = ..() reagents.add_reagent("brownstar", 30) +/obj/item/weapon/reagent_containers/food/drinks/cans/starkistdecaf + name = "\improper Star-kist Classic" + desc = "The taste of a star in liquid form, in a special decaffineated blend. Still tastes faintly of tuna?" + description_fluff = "A special variant of the Starkist brand soda introduced after popular outcry following a reformulation of the basic drink decades ago. This decaffineated variant outsells 'New' Starkist in many markets." + icon_state = "decafstarkist" + center_of_mass = list("x"=16, "y"=8) + +/obj/item/weapon/reagent_containers/food/drinks/cans/starkistdecaf/Initialize() + . = ..() + reagents.add_reagent("brownstar_decaf", 30) + /obj/item/weapon/reagent_containers/food/drinks/cans/space_up name = "\improper Space-Up" desc = "Tastes like a hull breach in your mouth." @@ -108,7 +130,7 @@ /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea name = "\improper Vrisk Serket Iced Tea" - desc = "That sweet, refreshing southern earthy flavor. That's where it's from, right? South Earth?" + desc = "That sweet, refreshing southern earthy flavor. That's where it's from, right? South Earth? Contains caffeine." description_fluff = "Produced exclusively on the planet Oasis, Vrisk Serket Iced Tea is not sold outside of the Golden Crescent, let alone Earth." icon_state = "ice_tea_can" center_of_mass = list("x"=16, "y"=8) diff --git a/code/modules/food/food/drinks.dm b/code/modules/food/food/drinks.dm index 41217df94b3..ca9dc491152 100644 --- a/code/modules/food/food/drinks.dm +++ b/code/modules/food/food/drinks.dm @@ -38,6 +38,9 @@ qdel(src) return +/obj/item/weapon/reagent_containers/food/drinks/on_rag_wipe(var/obj/item/weapon/reagent_containers/glass/rag/R) + clean_blood() + /obj/item/weapon/reagent_containers/food/drinks/attack_self(mob/user as mob) if(!is_open_container()) open(user) @@ -218,6 +221,21 @@ . = ..() reagents.add_reagent("tea", 30) +/obj/item/weapon/reagent_containers/food/drinks/decaf_tea + name = "cup of Count Mauve decaffeinated tea" + desc = "Why should bedtime stop you from enjoying a nice cuppa?" + description_fluff = "Count Mauve is a milder strain of NanoPasture's proprietary black tea, noted for its strong but otherwise completely non-distinctive flavour and total lack of caffeination." + icon_state = "chai_vended" + item_state = "coffee" + trash = /obj/item/trash/coffee + center_of_mass = list("x"=16, "y"=14) + drop_sound = 'sound/items/drop/papercup.ogg' + pickup_sound = 'sound/items/pickup/papercup.ogg' + +/obj/item/weapon/reagent_containers/food/drinks/decaf_tea/Initialize() + . = ..() + reagents.add_reagent("teadecaf", 30) + /obj/item/weapon/reagent_containers/food/drinks/ice name = "cup of ice" desc = "Careful, cold ice, do not chew." diff --git a/code/modules/food/food/drinks/bottle.dm b/code/modules/food/food/drinks/bottle.dm index 26775c90dba..df16e4960ba 100644 --- a/code/modules/food/food/drinks/bottle.dm +++ b/code/modules/food/food/drinks/bottle.dm @@ -466,9 +466,9 @@ //////////////////////////JUICES AND STUFF/////////////////////// -/obj/item/weapon/reagent_containers/food/drinks/bottle/cola //MODIFIED ON 04/21/2021 +/obj/item/weapon/reagent_containers/food/drinks/bottle/cola name = "\improper two-liter Space Cola" - desc = "Cola. In space." + desc = "Cola. In space. Contains caffeine." icon_state = "colabottle" center_of_mass = list("x"=16, "y"=6) @@ -476,7 +476,17 @@ . = ..() reagents.add_reagent("cola", 100) -/obj/item/weapon/reagent_containers/food/drinks/bottle/space_up //MODIFIED ON 04/21/2021 +/obj/item/weapon/reagent_containers/food/drinks/bottle/decaf_cola + name = "\improper two-liter Space Cola Free" + desc = "Cola. In space. Caffeine free." + icon_state = "decafcolabottle" + center_of_mass = list("x"=16, "y"=6) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/decaf_cola/Initialize() + . = ..() + reagents.add_reagent("decafcola", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/space_up name = "\improper two-liter Space-Up" desc = "Tastes like a hull breach in your mouth." icon_state = "space-up_bottle" @@ -486,9 +496,9 @@ . = ..() reagents.add_reagent("space_up", 100) -/obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind //MODIFIED ON 04/21/2021 +/obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind name = "\improper two-liter Space Mountain Wind" - desc = "Blows right through you like a space wind." + desc = "Blows right through you like a space wind. Contains caffeine." icon_state = "space_mountain_wind_bottle" center_of_mass = list("x"=16, "y"=6) @@ -496,9 +506,9 @@ . = ..() reagents.add_reagent("spacemountainwind", 100) -/obj/item/weapon/reagent_containers/food/drinks/bottle/dr_gibb //ADDED ON 04/21/2021 +/obj/item/weapon/reagent_containers/food/drinks/bottle/dr_gibb name = "\improper two-liter Dr. Gibb" - desc = "A delicious mixture of 42 different flavors." + desc = "A delicious mixture of 42 different flavors. Contains caffeine." icon_state = "dr_gibb_bottle" center_of_mass = list("x"=16, "y"=6) diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 300b8d87f92..8e87f8d71d0 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -34,6 +34,11 @@ /// Packaged meals switch to this state when opened, if set var/package_open_state + /// If this is canned. If true, it will print a message and ask you to open it + var/canned = FALSE + /// Canned food switch to this state when opened, if set + var/canned_open_state + /obj/item/weapon/reagent_containers/food/snacks/Initialize() . = ..() if(nutriment_amt) @@ -63,6 +68,9 @@ if(package && !user.incapacitated()) unpackage(user) + if(canned && !user.incapacitated()) + uncan(user) + /obj/item/weapon/reagent_containers/food/snacks/attack(mob/living/M as mob, mob/user as mob, def_zone) if(reagents && !reagents.total_volume) to_chat(user, "None of [src] left!") @@ -74,6 +82,10 @@ to_chat(M, "How do you expect to eat this with the package still on?") return FALSE + if(canned) + to_chat(M, "How do you expect to eat this without opening it?") + return FALSE + if(istype(M, /mob/living/carbon)) //TODO: replace with standard_feed_mob() call. @@ -251,6 +263,13 @@ if(package_open_state) icon_state = package_open_state +/obj/item/weapon/reagent_containers/food/snacks/proc/uncan(mob/user) + canned = FALSE + to_chat(user, "You unseal \the [src] with a crack of metal.") + playsound(loc,'sound/effects/tincanopen.ogg', rand(10,50), 1) + if(canned_open_state) + icon_state = canned_open_state + //////////////////////////////////////////////////////////////////////////////// /// FOOD END //////////////////////////////////////////////////////////////////////////////// @@ -4218,10 +4237,12 @@ desc = "Musical fruit in a slightly less musical container." filling_color = "#FC6F28" icon_state = "bakedbeans" - nutriment_amt = 4 - nutriment_desc = list("beans" = 4) bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/berrymuffin/berry/Initialize() + . = ..() + reagents.add_reagent("bean_protein", 6) + /obj/item/weapon/reagent_containers/food/snacks/sugarcookie name = "sugar cookie" desc = "Just like your little sister used to make." @@ -6128,6 +6149,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cb06/Initialize() . = ..() reagents.add_reagent("sugar", 1) + reagents.add_reagent("coffee", 1) /obj/item/weapon/reagent_containers/food/snacks/cb07 name = "\improper TaroMilk Bar" @@ -6177,6 +6199,7 @@ . = ..() reagents.add_reagent("sugar", 1) reagents.add_reagent("milk", 1) + reagents.add_reagent("peanutoil", 1) /obj/item/weapon/reagent_containers/food/snacks/cb10 name = "\improper Shantak Bar" @@ -6194,6 +6217,7 @@ . = ..() reagents.add_reagent("sugar", 1) reagents.add_reagent("protein", 1) + reagents.add_reagent("peanutoil", 1) ////////////////////Misc Vend Items//////////////////////////////////////////////////////////////// @@ -6337,7 +6361,7 @@ desc = "Space squid tentacles, Carefully removed (from the squid) then dried into strips of delicious rubbery goodness!" trash = /obj/item/trash/squid filling_color = "#c0a9d7" - center_of_mass = list("x"=15, "y"=9) + center_of_mass = list ("x"=15, "y"=9) nutriment_desc = list("fish" = 1, "salt" = 1) nutriment_amt = 2 bitesize = 1 @@ -6353,7 +6377,7 @@ desc = "Fried bread cubes. Popular in Terran territories." trash = /obj/item/trash/croutons filling_color = "#c6b17f" - center_of_mass = list("x"=15, "y"=9) + center_of_mass = list ("x"=15, "y"=9) nutriment_desc = list("bread" = 1, "salt" = 1) nutriment_amt = 3 bitesize = 1 @@ -6365,7 +6389,7 @@ desc = "Pig fat. Salted. Just as good as it sounds." trash = /obj/item/trash/salo filling_color = "#e0bcbc" - center_of_mass = list("x"=15, "y"=9) + center_of_mass = list ("x"=15, "y"=9) nutriment_desc = list("fat" = 1, "salt" = 1) nutriment_amt = 2 bitesize = 2 @@ -6381,7 +6405,7 @@ desc = "Dried salted beer snack fish." trash = /obj/item/trash/driedfish filling_color = "#c8a5bb" - center_of_mass = list("x"=15, "y"=9) + center_of_mass = list ("x"=15, "y"=9) nutriment_desc = list("fish" = 1, "salt" = 1) nutriment_amt = 2 bitesize = 1 @@ -6688,7 +6712,7 @@ /obj/item/weapon/reagent_containers/food/snacks/old name = "master old-food" desc = "they're all inedible and potentially dangerous items" - center_of_mass = list("x"=15,"y"=12) + center_of_mass = list ("x"=15, "y"=9) nutriment_desc = list("rot" = 5, "mold" = 5) nutriment_amt = 10 bitesize = 3 @@ -6736,34 +6760,8 @@ //////////////////////Canned Foods - crack open and eat (ADDED 04/11/2021)////////////////////// /obj/item/weapon/reagent_containers/food/snacks/canned - name = "void can" icon = 'icons/obj/food_canned.dmi' - flags = 0 - var/sealed = TRUE - -/obj/item/weapon/reagent_containers/food/snacks/canned/Initialize() - . = ..() - if(!sealed) - unseal() - -/obj/item/weapon/reagent_containers/food/snacks/canned/examine(mob/user) - . = ..() - to_chat(user, "It is [sealed ? "" : "un"]sealed.") - -/obj/item/weapon/reagent_containers/food/snacks/canned/proc/unseal() - flags |= OPENCONTAINER - sealed = FALSE - update_icon() - -/obj/item/weapon/reagent_containers/food/snacks/canned/attack_self(var/mob/user) - if(sealed) - playsound(loc,'sound/effects/tincanopen.ogg', rand(10,50), 1) - to_chat(user, "You unseal \the [src] with a crack of metal.") - unseal() - -/obj/item/weapon/reagent_containers/food/snacks/canned/update_icon() - if(!sealed) - icon_state = "[initial(icon_state)]-open" + canned = TRUE //////////Just a short line of Canned Consumables, great for treasure in faraway abandoned outposts////////// @@ -6772,6 +6770,7 @@ icon_state = "beef" desc = "A can of premium preserved vat-grown holstein beef. Now 99.9% bone free!" trash = /obj/item/trash/beef + canned_open_state = "beef-open" filling_color = "#663300" center_of_mass = list("x"=15, "y"=9) nutriment_desc = list("beef" = 1) @@ -6780,54 +6779,54 @@ /obj/item/weapon/reagent_containers/food/snacks/canned/beef/Initialize() .=..() reagents.add_reagent("protein", 4) - reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("sodiumchloride", 2) /obj/item/weapon/reagent_containers/food/snacks/canned/beans name = "baked beans" icon_state = "beans" desc = "Luna Colony beans. Carefully synthethized from soy." trash = /obj/item/trash/beans + canned_open_state = "beans-open" filling_color = "#ff6633" center_of_mass = list("x"=15, "y"=9) nutriment_desc = list("beans" = 1, "tomato sauce" = 1) - nutriment_amt = 15 bitesize = 2 -///obj/item/weapon/reagent_containers/food/snacks/canned/tomato (NEED TO SEE HOW TO CHANGE EATING SOUND) -// name = "tomato soup" -// icon_state = "tomato" -// desc = "Plain old unseasoned tomato soup. This can has no use-by date." -// trash = "/obj/item/trash/tomato" -// filling_color = "#ae0000" -// center_of_mass = list("x"=15, "y"=9) -// nutriment_desc = list("tomato" = 1) -// bitesize = 3 -// eat_sound = 'sound/items/drink.ogg' -// -///obj/item/weapon/reagent_containers/food/snacks/canned/tomato/Initialize() -// .=..() -// reagents.add_reagent(/datum/reagent/drink/juice/tomato, 12) -// -// -///obj/item/weapon/reagent_containers/food/snacks/canned/tomato/feed_sound(var/mob/user) -// playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) +/obj/item/weapon/reagent_containers/food/snacks/canned/beans/Initialize() + .=..() + reagents.add_reagent("bean_protein", 5) + reagents.add_reagent("tomatojuice", 5) + +/obj/item/weapon/reagent_containers/food/snacks/canned/tomato + name = "tomato soup" + icon_state = "tomato" + desc = "Plain old unseasoned tomato soup. This can has no use-by date." + trash = /obj/item/trash/tomato + package_open_state = "tomato-open" + filling_color = "#ae0000" + center_of_mass = list("x"=15, "y"=9) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/canned/tomato/Initialize() + .=..() + reagents.add_reagent("tomatojuice", 12) /obj/item/weapon/reagent_containers/food/snacks/canned/spinach name = "spinach" icon_state = "spinach" desc = "Wup-Az! Brand canned spinach. Notably has less iron in it than a watermelon." trash = /obj/item/trash/spinach + canned_open_state = "spinach-open" filling_color = "#003300" center_of_mass = list("x"=15, "y"=9) - nutriment_amt = 5 nutriment_desc = list("soggy" = 1, "vegetable" = 1) - bitesize = 5 + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/canned/spinach/Initialize() .=..() - reagents.add_reagent("adrenaline", 5) - reagents.add_reagent("hyperzine", 5) - reagents.add_reagent("iron", 5) + reagents.add_reagent("adrenaline", 4) + reagents.add_reagent("hyperzine", 4) + reagents.add_reagent("iron", 4) //////////////////////////////Advanced Canned Food////////////////////////////// @@ -6836,30 +6835,30 @@ icon_state = "fisheggs" desc = "Terran caviar, or space carp eggs. Carefully faked using alginate, artificial flavoring and salt. Skrell approved!" trash = /obj/item/trash/fishegg + canned_open_state = "fisheggs-open" filling_color = "#000000" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("fish" = 1, "salt" = 1) - nutriment_amt = 6 + nutriment_desc = list("salt" = 1) bitesize = 1 -/obj/item/weapon/reagent_containers/food/snacks/caviar/Initialize() +/obj/item/weapon/reagent_containers/food/snacks/canned/caviar/Initialize() . = ..() - reagents.add_reagent("protein", 5) + reagents.add_reagent("seafood", 5) /obj/item/weapon/reagent_containers/food/snacks/canned/caviar/true name = "\improper Classic Terran Caviar" icon_state = "carpeggs" desc = "Terran caviar, or space carp eggs. Banned by the Vir Food Health Administration for exceeding the legally set amount of carpotoxins in food stuffs." trash = /obj/item/trash/carpegg + canned_open_state = "carpeggs-open" filling_color = "#330066" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("fish" = 1, "salt" = 1, "a numbing sensation" = 1) - nutriment_amt = 6 + nutriment_desc = list("salt" = 1, "a numbing sensation" = 1) bitesize = 1 -/obj/item/weapon/reagent_containers/food/snacks/caviar/true/Initialize() +/obj/item/weapon/reagent_containers/food/snacks/canned/caviar/true/Initialize() . = ..() - reagents.add_reagent("protein", 4) + reagents.add_reagent("seafood", 4) reagents.add_reagent("carpotoxin", 1) /obj/item/weapon/reagent_containers/food/snacks/canned/maps @@ -6867,13 +6866,12 @@ icon_state = "maps" desc = "A re-branding of a classic Terran snack! Contains mostly edible ingredients." trash = /obj/item/trash/maps + canned_open_state = "maps-open" filling_color = "#330066" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("meat" = 1, "salt" = 1) - nutriment_amt = 8 bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/maps/Initialize() +/obj/item/weapon/reagent_containers/food/snacks/canned/maps/Initialize() . = ..() reagents.add_reagent("protein", 6) reagents.add_reagent("sodiumchloride", 2) @@ -6883,10 +6881,10 @@ icon_state = "appleberry" desc = "A classic snack favored by Sol astronauts. Made from dried apple-hybidized berries grown on the lunar colonies." trash = /obj/item/trash/appleberry + canned_open_state = "appleberry-open" filling_color = "#FFFFFF" center_of_mass = list("x"=15, "y"=9) nutriment_desc = list("apple" = 1, "sweetness" = 1) - nutriment_amt = 8 bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/appleberry/Initialize() @@ -6898,16 +6896,50 @@ icon_state = "ntbeans" desc = "Musical fruit in a slightly less musical container. Now with bacon!" trash = /obj/item/trash/ntbeans + canned_open_state = "ntbeans-open" filling_color = "#FC6F28" center_of_mass = list("x"=15, "y"=9) - nutriment_desc = list("beans" = 4) - nutriment_amt = 6 bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/canned/ntbeans/Initialize() . = ..() + reagents.add_reagent("bean_protein", 6) reagents.add_reagent("protein", 2) +/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax + name = "\improper BrainzSnax" + icon_state = "brainzsnax" + desc = "A can of grey matter marketed for xenochimeras." + description_fluff = "As the cartoon brain with limbs proudly proclaims, \"It's meat. Eat it!\" On the can is printed \"Rich in limbic system\" and \ + under that in infinitely small letters, \"Warning, product must be eaten within two hours of opening. May contain prion disease. \ + GrubCo LTD is not liable for any brain damage occuring after consumption of product.\"" + trash = /obj/item/trash/brainzsnax + canned_open_state = "brainzsnax-open" + filling_color = "#caa3c9" + center_of_mass = list("x"=15, "y"=9) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/Initialize() + . = ..() + reagents.add_reagent("brain_protein", 10) + +/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red + name = "\improper BrainzSnax RED" + icon_state = "brainzsnaxred" + desc = "A can of grey matter marketed for xenochimeras. This one has added tomato sauce." + description_fluff = "As the cartoonish brain with limbs proudly proclaims, \"It's meat. Eat it!\" On the can is printed \"Yummy red stuff!\" and \ + under that in infinitely small letters, \"Warning, product must be eaten within two hours of opening. May contain prion disease. \ + GrubCo LTD is not liable for any brain damage occuring after consumption of product.\"" + trash = /obj/item/trash/brainzsnaxred + canned_open_state = "brainzsnaxred-open" + filling_color = "#a6898d" + center_of_mass = list("x"=15, "y"=9) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/canned/brainzsnax/red/Initialize() + . = ..() + reagents.add_reagent("red_brain_protein", 10) + //////////////Packaged Food - break open and eat////////////// /obj/item/weapon/reagent_containers/food/snacks/packaged @@ -6999,7 +7031,7 @@ /obj/item/weapon/reagent_containers/food/snacks/packaged/meatration/Initialize() . = ..() - reagents.add_reagent("protein", 3) + reagents.add_reagent("protein", 4) /obj/item/weapon/reagent_containers/food/snacks/packaged/vegration name = "veggie ration" diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm index e53749b22b0..bab265f004b 100644 --- a/code/modules/food/kitchen/microwave.dm +++ b/code/modules/food/kitchen/microwave.dm @@ -510,7 +510,7 @@ src.visible_message("The microwave gets covered in muck!") src.dirty = 100 // Make it dirty so it can't be used util cleaned src.flags = null //So you can't add condiments - src.icon_state = "mwbloody" // Make it look dirty too + src.icon_state = "mwbloody0" // Make it look dirty too src.operating = 0 // Turn it off again aferwards SStgui.update_uis(src) soundloop.stop() diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 99cca32d4c2..ee7060dfd89 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -358,7 +358,7 @@ //BASKETBALL OBJECTS /obj/item/weapon/beach_ball/holoball - icon = 'icons/obj/basketball.dmi' + icon = 'icons/obj/balls_vr.dmi' icon_state = "basketball" name = "basketball" desc = "Here's your chance, do your dance at the Space Jam." @@ -370,7 +370,7 @@ /obj/structure/holohoop name = "basketball hoop" desc = "Boom, Shakalaka!" - icon = 'icons/obj/basketball.dmi' + icon = 'icons/obj/32x64.dmi' icon_state = "hoop" anchored = TRUE density = TRUE @@ -406,7 +406,6 @@ return FALSE return ..() - /obj/machinery/readybutton name = "Ready Declaration Device" desc = "This device is used to declare ready. If all devices in an area are ready, the event will begin!" diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index b8618ccf867..e1874f1a933 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -11,11 +11,13 @@ icon_state = "mining_drill" circuit = /obj/item/weapon/circuitboard/miningdrill var/braces_needed = 2 - var/list/supports = list() + var/list/obj/machinery/mining/brace/supports = list() var/supported = 0 var/active = 0 var/list/resource_field = list() var/obj/item/device/radio/intercom/faultreporter + var/drill_range = 5 + var/offset = 2 var/list/ore_types = list( "hematite" = /obj/item/weapon/ore/iron, @@ -242,10 +244,14 @@ harvest_speed = 0 capacity = 0 charge_use = 50 + drill_range = 5 + offset = 2 for(var/obj/item/weapon/stock_parts/P in component_parts) if(istype(P, /obj/item/weapon/stock_parts/micro_laser)) harvest_speed = P.rating + if(P.rating >= 5) + harvest_speed *= 2 exotic_drilling = P.rating - 1 if(exotic_drilling >= 1) ore_types |= ore_types_uncommon @@ -254,6 +260,14 @@ else ore_types -= ore_types_uncommon ore_types -= ore_types_rare + if(P.rating > 3) // are we t4+? + // default drill range 5, offset 2 + if(P.rating >= 5) // t5 + drill_range = 9 + offset = 4 + else if(P.rating >= 4) // t4 + drill_range = 7 + offset = 3 if(istype(P, /obj/item/weapon/stock_parts/matter_bin)) capacity = 200 * P.rating if(istype(P, /obj/item/weapon/stock_parts/capacitor)) @@ -271,8 +285,12 @@ else anchored = TRUE - if(supports && supports.len >= braces_needed) - supported = 1 + if(supports) + if(supports.len >= braces_needed) + supported = 1 + else for(var/obj/machinery/mining/brace/check in supports) + if(check.brace_tier > 3) + supported = 1 update_icon() @@ -293,11 +311,11 @@ var/turf/T = get_turf(src) if(!istype(T)) return - var/tx = T.x - 2 - var/ty = T.y - 2 + var/tx = T.x - offset + var/ty = T.y - offset var/turf/simulated/mine_turf - for(var/iy = 0,iy < 5, iy++) - for(var/ix = 0, ix < 5, ix++) + for(var/iy = 0,iy < drill_range, iy++) + for(var/ix = 0, ix < drill_range, ix++) mine_turf = locate(tx + ix, ty + iy, T.z) if(!istype(mine_turf, /turf/space/)) if(mine_turf && mine_turf.has_resources) @@ -334,12 +352,23 @@ desc = "A machinery brace for an industrial drill. It looks easily two feet thick." icon_state = "mining_brace" circuit = /obj/item/weapon/circuitboard/miningdrillbrace + var/brace_tier = 1 var/obj/machinery/mining/drill/connected -/obj/machinery/mining/brace/New() - ..() +/obj/machinery/mining/brace/examine(mob/user) + . = ..() + if(brace_tier > 3) + . += SPAN_NOTICE("The internals of the brace look resilient enough to support a drill by itself.") - component_parts = list() +/obj/machinery/mining/brace/Initialize() + . = ..() + default_apply_parts() + +/obj/machinery/mining/brace/RefreshParts() + ..() + brace_tier = 0 + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + brace_tier += M.rating /obj/machinery/mining/brace/attackby(obj/item/weapon/W as obj, mob/user as mob) if(connected && connected.active) @@ -350,6 +379,8 @@ return if(default_deconstruction_crowbar(user, W)) return + if(default_part_replacement(user,W)) + return if(W.is_wrench()) diff --git a/code/modules/mining/kinetic_crusher.dm b/code/modules/mining/kinetic_crusher.dm index f4712d31b9a..7effaf60d98 100644 --- a/code/modules/mining/kinetic_crusher.dm +++ b/code/modules/mining/kinetic_crusher.dm @@ -246,7 +246,7 @@ slot_r_hand_str = 'icons/mob/items/righthand_melee_vr.dmi', ) item_state = "c-machete" - w_class = ITEMSIZE_SMALL + w_class = ITEMSIZE_NORMAL attack_verb = list("cleaved", "chopped", "pulped", "stabbed", "skewered") can_cleave = TRUE requires_wield = FALSE diff --git a/code/modules/mining/ore_box.dm b/code/modules/mining/ore_box.dm index bda08a903de..9fddd03e213 100644 --- a/code/modules/mining/ore_box.dm +++ b/code/modules/mining/ore_box.dm @@ -58,34 +58,33 @@ for(var/ore in stored_ore) . += "- [stored_ore[ore]] [ore]" -/obj/structure/ore_box/verb/empty_box() - set name = "Empty Ore Box" - set category = "Object" - set src in view(1) - - if(!ishuman(usr) && !isrobot(usr)) //Only living, intelligent creatures with gripping aparatti can empty ore boxes. - to_chat(usr, "You are physically incapable of emptying the ore box.") - return - - if(usr.stat || usr.restrained()) - return - - if(!Adjacent(usr)) //You can only empty the box if you can physically reach it - to_chat(usr, "You cannot reach the ore box.") - return - - add_fingerprint(usr) - - if(contents.len < 1) - to_chat(usr, "The ore box is empty.") - return - - for (var/obj/item/weapon/ore/O in contents) - contents -= O - O.loc = src.loc - to_chat(usr, "You empty the ore box.") - - return +// /obj/structure/ore_box/verb/empty_box() +// set name = "Empty Ore Box" +// set category = "Object" +// set src in view(1) +// +// if(!ishuman(usr) && !isrobot(usr)) //Only living, intelligent creatures with gripping aparatti can empty ore boxes. +// to_chat(usr, "You are physically incapable of emptying the ore box.") +// return +// if(usr.stat || usr.restrained()) +// return +// +// if(!Adjacent(usr)) //You can only empty the box if you can physically reach it +// to_chat(usr, "You cannot reach the ore box.") +// return +// +// add_fingerprint(usr) +// +// if(contents.len < 1) +// to_chat(usr, "The ore box is empty.") +// return +// +// for (var/obj/item/weapon/ore/O in contents) +// contents -= O +// O.loc = src.loc +// to_chat(usr, "You empty the ore box.") +// +// return /obj/structure/ore_box/ex_act(severity) if(severity == 1.0 || (severity < 3.0 && prob(50))) diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index ede586fba7c..38eacfc56fc 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -120,7 +120,7 @@ EQUIPMENT("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 900), EQUIPMENT("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), EQUIPMENT("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), - EQUIPMENT("KA Efficiency Increase", /obj/item/borg/upgrade/modkit/efficiency, 1200), + EQUIPMENT("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1200), EQUIPMENT("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), EQUIPMENT("KA Holster", /obj/item/clothing/accessory/holster/waist/kinetic_accelerator, 350), EQUIPMENT("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250), diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 32c579f82d0..85bd64c0fcc 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -7,7 +7,7 @@ colour = "soghun" key = "q" machine_understands = 0 - flags = RESTRICTED + flags = WHITELISTED // RESTRICTED would make this completely unavailable from character select syllables = list("hs","zt","kr","st","sh") /datum/language/diona_local/get_random_name() @@ -20,7 +20,7 @@ desc = "A complex language known instinctively by Dionaea, 'spoken' by emitting modulated radio waves. This version uses low frequency waves for slow communication at long ranges." key = "w" machine_understands = 0 - flags = RESTRICTED | HIVEMIND + flags = WHITELISTED | HIVEMIND // RESTRICTED would make this completely unavailable from character select /datum/language/unathi name = LANGUAGE_UNATHI diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index 42f3bff06ce..39b0b882bb1 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -451,7 +451,7 @@ return treatment_emag // If they're injured, we're using a beaker, and they don't have on of the chems in the beaker - if(reagent_glass && use_beaker && ((H.getBruteLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getOxyLoss() >= (heal_threshold + 15)))) + if(reagent_glass && use_beaker && ((H.getBruteLoss() >= heal_threshold) || (H.getToxLoss() >= heal_threshold) || (H.getFireLoss() >= heal_threshold) || (H.getOxyLoss() >= (heal_threshold + 15)))) for(var/datum/reagent/R in reagent_glass.reagents.reagent_list) if(!H.reagents.has_reagent(R)) return 1 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 119d349105f..d5311f79a53 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -173,7 +173,8 @@ This saves us from having to call add_fingerprint() any time something is put in if(I.flags_inv & (BLOCKHAIR|BLOCKHEADHAIR)) update_hair(0) //rebuild hair update_inv_ears(0) - if(internal) + // If this is how the internals are connected, disable them + if(internal && !(head?.item_flags & AIRTIGHT)) if(internals) internals.icon_state = "internal0" internal = null diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm index 8f22ca4907b..e336a461e31 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm @@ -108,6 +108,7 @@ sleep(5) //The duration of the TP animation canmove = original_canmove alpha = initial(alpha) + remove_modifiers_of_type(/datum/modifier/shadekin_phase_vision) //Potential phase-in vore if(can_be_drop_pred) //Toggleable in vore panel @@ -143,6 +144,7 @@ var/obj/effect/temp_visual/shadekin/phase_out/phaseanim = new /obj/effect/temp_visual/shadekin/phase_out(src.loc) phaseanim.dir = dir alpha = 0 + add_modifier(/datum/modifier/shadekin_phase_vision) sleep(5) invisibility = INVISIBILITY_LEVEL_TWO see_invisible = INVISIBILITY_LEVEL_TWO @@ -155,6 +157,10 @@ density = FALSE force_max_speed = TRUE +/datum/modifier/shadekin_phase_vision + name = "Shadekin Phase Vision" + vision_flags = SEE_THRU + ////////////////////////// /// REGENERATE OTHER /// ////////////////////////// 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 ef841a3baba..b1c468dac70 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -45,7 +45,7 @@ var/datum/species/shapeshifter/promethean/prometheans female_cough_sounds = list('sound/effects/slime_squish.ogg') min_age = 1 - max_age = 10 + max_age = 16 economic_modifier = 3 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 5d5112acf0d..870ac0e97d0 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -235,7 +235,7 @@ base_color = "#333333" reagent_tag = IS_TAJARA - allergens = ALLERGEN_COFFEE + allergens = ALLERGEN_STIMULANT move_trail = /obj/effect/decal/cleanable/blood/tracks/paw diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 483c0919e30..f5186fa56b6 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -484,7 +484,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() var/image/em_block_ears if(ears_s) if(ears_s.Height() > face_standing.Height()) // Tol ears - face_standing.Crop(face_standing.Width(), ears_s.Height()) + face_standing.Crop(1, 1, face_standing.Width(), ears_s.Height()) face_standing.Blend(ears_s, ICON_OVERLAY) if(ear_style?.em_block) em_block_ears = em_block_image_generic(image(ears_s)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4252615d04d..b8b0e70d57c 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1030,6 +1030,13 @@ if((N.health + N.halloss) < config.health_threshold_crit || N.stat == DEAD) N.adjustBruteLoss(rand(10,30)) src.drop_from_inventory(G) + + src.visible_message("[src] has thrown [item].") + + if((isspace(src.loc)) || (src.lastarea?.has_gravity == 0)) + src.inertia_dir = get_dir(target, src) + step(src, inertia_dir) + item.throw_at(target, throw_range, item.throw_speed, src) return TRUE else return FALSE @@ -1037,19 +1044,15 @@ if(!item) return FALSE //Grab processing has a chance of returning null - if(a_intent == I_HELP && Adjacent(target) && isitem(item)) + if(a_intent == I_HELP && Adjacent(target) && isitem(item) && ishuman(target)) var/obj/item/I = item - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(H.in_throw_mode && H.a_intent == I_HELP && unEquip(I)) - H.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea. - visible_message("[src] hands \the [H] \a [I].", SPAN_NOTICE("You give \the [target] \a [I].")) - else - to_chat(src, SPAN_NOTICE("You offer \the [I] to \the [target].")) - do_give(H) - return TRUE - make_item_drop_sound(I) - I.forceMove(get_turf(target)) + var/mob/living/carbon/human/H = target + if(H.in_throw_mode && H.a_intent == I_HELP && unEquip(I)) + H.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea. + visible_message("[src] hands \the [H] \a [I].", SPAN_NOTICE("You give \the [target] \a [I].")) + else + to_chat(src, SPAN_NOTICE("You offer \the [I] to \the [target].")) + do_give(H) return TRUE drop_from_inventory(item) diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm index 04523d514ea..a570ed60dbe 100644 --- a/code/modules/mob/living/living_vr.dm +++ b/code/modules/mob/living/living_vr.dm @@ -12,13 +12,13 @@ var/sayselect = tgui_alert(src, "Which say-verb do you wish to customize?", "Select Verb", list("Say","Whisper","Ask (?)","Exclaim/Shout/Yell (!)","Cancel")) if(sayselect == "Say") - custom_say = sanitize(input(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null) as text) + custom_say = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null) as text)) else if(sayselect == "Whisper") - custom_whisper = sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [src] whispers, \"Hi...\"", "Custom Whisper", null) as text) + custom_whisper = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [src] whispers, \"Hi...\"", "Custom Whisper", null) as text)) else if(sayselect == "Ask (?)") - custom_ask = sanitize(input(usr, "This word or phrase will appear instead of 'asks': [src] asks, \"Hi?\"", "Custom Ask", null) as text) + custom_ask = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'asks': [src] asks, \"Hi?\"", "Custom Ask", null) as text)) else if(sayselect == "Exclaim/Shout/Yell (!)") - custom_exclaim = sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [src] exclaims, \"Hi!\"", "Custom Exclaim", null) as text) + custom_exclaim = lowertext(sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [src] exclaims, \"Hi!\"", "Custom Exclaim", null) as text)) else return diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 72fb8263a3c..97af632c946 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -612,7 +612,6 @@ for(var/tech in tech_item.origin_tech) files.UpdateTech(tech, tech_item.origin_tech[tech]) synced = FALSE - drain(-50 * digested) if(volume) water.add_charge(volume) if(recycles && T.matter) @@ -630,8 +629,7 @@ plastic.add_charge(total_material) if(material == "wood") wood.add_charge(total_material) - else - drain(-50 * digested) + drain(-50 * digested) else if(istype(target,/obj/effect/decal/remains)) qdel(target) drain(-100) @@ -726,4 +724,4 @@ icon_state = "sleeperert" injection_chems = list("inaprovaline", "paracetamol") // short list -#undef SLEEPER_INJECT_COST \ No newline at end of file +#undef SLEEPER_INJECT_COST diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index b77a61104e2..0a27ff88990 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -271,8 +271,10 @@ modules.Add(robot_module_types) if(crisis || security_level == SEC_LEVEL_RED || crisis_override) to_chat(src, "Crisis mode active. Combat module available.") - modules+="Combat" - modules+="ERT" + modules += emergency_module_types + for(var/module_name in whitelisted_module_types) + if(is_borg_whitelisted(src, module_name)) + modules += module_name //VOREStatation Edit End: shell restrictions modtype = tgui_input_list(usr, "Please, select a module!", "Robot module", modules) @@ -280,6 +282,8 @@ return if(!(modtype in robot_modules)) return + if(!is_borg_whitelisted(src, modtype)) + return var/module_type = robot_modules[modtype] transform_with_anim() //VOREStation edit: sprite animation diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index 4a3f473e5f9..2087e733e21 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -9,7 +9,12 @@ var/global/list/robot_modules = list( "Security" = /obj/item/weapon/robot_module/robot/security/general, "Combat" = /obj/item/weapon/robot_module/robot/security/combat, "Engineering" = /obj/item/weapon/robot_module/robot/engineering/general, - "Janitor" = /obj/item/weapon/robot_module/robot/janitor + "Janitor" = /obj/item/weapon/robot_module/robot/janitor, + "Gravekeeper" = /obj/item/weapon/robot_module/robot/gravekeeper, + "Lost" = /obj/item/weapon/robot_module/robot/lost, + "Protector" = /obj/item/weapon/robot_module/robot/syndicate/protector, + "Mechanist" = /obj/item/weapon/robot_module/robot/syndicate/mechanist, + "Combat Medic" = /obj/item/weapon/robot_module/robot/syndicate/combat_medic ) /obj/item/weapon/robot_module diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm index bc2b188c6fe..b4167601971 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm @@ -49,6 +49,7 @@ robot_modules["Service-Hound"] = /obj/item/weapon/robot_module/robot/clerical/brodog robot_modules["BoozeHound"] = /obj/item/weapon/robot_module/robot/booze robot_modules["KMine"] = /obj/item/weapon/robot_module/robot/kmine + robot_modules["Stray"] = /obj/item/weapon/robot_module/robot/stray return 1 //Just add a new proc with the robot_module type if you wish to run some other vore code diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm index b024c95a143..5744f8cccbc 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm @@ -124,7 +124,7 @@ vore_icons = 0 /mob/living/simple_mob/animal/space/carp/large/huge vore_icons = 0 -/mob/living/simple_mob/animal/space/carp/holographic +/mob/living/simple_mob/animal/space/carp/holodeck vore_icons = 0 /* //VOREStation AI Temporary removal diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 3ca22757826..1322f5be98f 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -178,8 +178,9 @@ //VOREStation Edit if(BP_HEAD) if(force_down) - if(announce) - assailant.visible_message("[assailant] sits on [target]'s face!") + if(user.a_intent == I_HELP) + if(announce) + assailant.visible_message("[assailant] sits on [target]'s face!") //VOREStation Edit End /obj/item/weapon/grab/attack_self() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 0dcbf617e50..f3683f6ca4b 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -513,7 +513,7 @@ for(var/datum/job/job in job_master.occupations) if(job && IsJobAvailable(job.title)) // Checks for jobs with minimum age requirements - if(job.minimum_character_age && (client.prefs.age < job.minimum_character_age)) + if((job.minimum_character_age || job.min_age_by_species) && (client.prefs.age < job.get_min_age(client.prefs.species, client.prefs.organ_data["brain"]))) continue // Checks for jobs set to "Never" in preferences //TODO: Figure out a better way to check for this if(!(client.prefs.GetJobDepartment(job, 1) & job.flag)) diff --git a/code/modules/mob/new_player/sprite_accessories_taur.dm b/code/modules/mob/new_player/sprite_accessories_taur.dm index 5a96b1fd039..66233db64c4 100644 --- a/code/modules/mob/new_player/sprite_accessories_taur.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur.dm @@ -26,8 +26,8 @@ //Hoooo boy. /datum/riding/taur/get_offsets(pass_index) // list(dir = x, y, layer) var/mob/living/L = ridden - var/scale_x = L.icon_scale_x - var/scale_y = L.icon_scale_y + var/scale_x = L.icon_scale_x * L.size_multiplier //VOREStation Edit + var/scale_y = L.icon_scale_y * L.size_multiplier //VOREStation Edit var/list/values = list( "[NORTH]" = list(0, 8*scale_y, ABOVE_MOB_LAYER), diff --git a/code/modules/multiz/stairs.dm b/code/modules/multiz/stairs.dm index 52b275a92f0..99b015c6c27 100644 --- a/code/modules/multiz/stairs.dm +++ b/code/modules/multiz/stairs.dm @@ -18,13 +18,13 @@ // Returns TRUE if the stairs are a complete and connected unit, FALSE if a piece is missing or obstructed // Will attempt to reconnect broken pieces -// Parameters: +// Parameters: // - B1: Loc of bottom stair // - B2: Loc of middle stair // - T1: Openspace over bottom stair // - T2: Loc of top stair, over middle stair -/obj/structure/stairs/proc/check_integrity(var/obj/structure/stairs/bottom/B = null, - var/obj/structure/stairs/middle/M = null, +/obj/structure/stairs/proc/check_integrity(var/obj/structure/stairs/bottom/B = null, + var/obj/structure/stairs/middle/M = null, var/obj/structure/stairs/top/T = null, var/turf/simulated/open/O = null) @@ -91,14 +91,14 @@ var/obj/structure/stairs/middle/M = null, var/obj/structure/stairs/top/T = null, var/turf/simulated/open/O = null) - + // In the case where we're provided all the pieces, just try connecting them. // In order: all exist, they are appropriately adjacent, and they can connect if(istype(B) && istype(M) && istype(T) && istype(O) && \ B.Adjacent(M) && (GetBelow(O) == get_turf(B)) && T.Adjacent(O) && \ ..()) return TRUE - + // If we're already configured, just check those else if(istype(top) && istype(middle)) O = locate(/turf/simulated/open) in GetAbove(src) @@ -118,7 +118,7 @@ // If you set the dir, that's the dir it *wants* to connect in. It only chooses the others if that doesn't work // Everything is simply linked in our original direction - if(istype(M) && istype(T) && ..(src, M, T, O)) + if(istype(M) && istype(T) && ..(src, M, T, O)) return TRUE // Else, we have to look in other directions @@ -127,12 +127,12 @@ T2 = GetAbove(B2) if(!istype(B2) || !istype(T2)) continue - + T = locate(/obj/structure/stairs/top) in T2 M = locate(/obj/structure/stairs/middle) in B2 if(..(src, M, T, O)) return TRUE - + // Out of the dir check, we have no valid neighbors, and thus are not complete. return FALSE @@ -143,18 +143,18 @@ use_stairs(AM, oldloc) ..() -/obj/structure/stairs/bottom/use_stairs(var/atom/movable/AM, var/atom/oldloc) +/obj/structure/stairs/bottom/use_stairs(var/atom/movable/AM, var/atom/oldloc) // If we're coming from the top of the stairs, don't trap us in an infinite staircase // Or if we fell down the openspace if((top in oldloc) || oldloc == GetAbove(src)) return - + if(isobserver(AM)) // Ghosts have their own methods for going up and down return - + if(AM.pulledby) // Animating the movement of pulled things is handled when the puller goes up the stairs return - + if(AM.has_buckled_mobs()) // Similarly, the rider entering the turf will bring along whatever they're buckled to return @@ -173,7 +173,7 @@ pulling |= L.pulling for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) pulling |= G.affecting - + // If the stairs aren't broken, go up. if(check_integrity()) AM.dir = src.dir @@ -185,7 +185,7 @@ // Move to Top AM.forceMove(get_turf(top)) - + // If something is being pulled, bring it along directly to avoid the mob being torn away from it due to movement delays for(var/atom/movable/P in pulling) P.forceMove(get_turf(top)) // Just bring it along directly, no fussing with animation timing @@ -202,16 +202,18 @@ if(isliving(AM)) var/mob/living/L = AM - + if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs. return - + if(L.has_buckled_mobs()) return if(L.buckled) L.buckled.forceMove(get_turf(top)) - + + L.forceMove(get_turf(top)) + // If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so. if(L.pulling && !L.pulling.anchored) var/atom/movable/P = L.pulling @@ -220,8 +222,7 @@ for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) G.affecting.forceMove(get_turf(top)) - L.forceMove(get_turf(top)) - + if(L.client) L.client.Process_Grab() else @@ -255,10 +256,10 @@ // These are necessarily fairly similar, but because the positional relations are different, we have to copy-pasta a fair bit /obj/structure/stairs/middle/check_integrity(var/obj/structure/stairs/bottom/B = null, - var/obj/structure/stairs/middle/M = null, + var/obj/structure/stairs/middle/M = null, var/obj/structure/stairs/top/T = null, var/turf/simulated/open/O = null) - + // In the case where we're provided all the pieces, just try connecting them. // In order: all exist, they are appropriately adjacent, and they can connect if(istype(B) && istype(M) && istype(T) && istype(O) && \ @@ -281,7 +282,7 @@ // Top is static for Middle stair, if it's invalid we can't do much if(!istype(T)) return FALSE - + // If you set the dir, that's the dir it *wants* to connect in. It only chooses the others if that doesn't work // Everything is simply linked in our original direction if(istype(B1) && istype(T2) && istype(O) && ..(B, src, T, O)) @@ -293,11 +294,11 @@ O = GetAbove(B1) if(!istype(B1) || !istype(O)) continue - + B = locate(/obj/structure/stairs/bottom) in B1 if(..(B, src, T, O)) return TRUE - + // The middle stair has some further special logic, in that it can be climbed, and so is technically valid if only the top exists // T is enforced by a prior if T.middle = src @@ -341,7 +342,7 @@ var/obj/structure/stairs/middle/M = null, var/obj/structure/stairs/top/T = null, var/turf/simulated/open/O = null) - + // In the case where we're provided all the pieces, just try connecting them. // In order: all exist, they are appropriately adjacent, and they can connect if(istype(B) && istype(M) && istype(T) && istype(O) && \ @@ -377,11 +378,11 @@ B1 = GetBelow(O) if(!istype(B1) || !istype(O)) continue - + B = locate(/obj/structure/stairs/bottom) in B1 if((. = ..(B, M, src, O))) return - + // Out of the dir check, we have no valid neighbors, and thus are not complete. `.` was set by ..() return @@ -403,13 +404,13 @@ // Or if we climb up the middle if((bottom in oldloc) || oldloc == GetBelow(src)) return - + if(isobserver(AM)) // Ghosts have their own methods for going up and down return - + if(AM.pulledby) // Animating the movement of pulled things is handled when the puller goes up the stairs return - + if(AM.has_buckled_mobs()) // Similarly, the rider entering the turf will bring along whatever they're buckled to return @@ -428,7 +429,7 @@ pulling |= L.pulling for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) pulling |= G.affecting - + // If the stairs aren't broken, go up. if(check_integrity()) AM.dir = turn(src.dir, 180) @@ -438,7 +439,7 @@ // Move to Top AM.forceMove(get_turf(bottom)) - + // If something is being pulled, bring it along directly to avoid the mob being torn away from it due to movement delays for(var/atom/movable/P in pulling) P.forceMove(get_turf(bottom)) // Just bring it along directly, no fussing with animation timing @@ -455,16 +456,18 @@ if(isliving(AM)) var/mob/living/L = AM - + if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs. return - + if(L.has_buckled_mobs()) return if(L.buckled) L.buckled.forceMove(get_turf(bottom)) - + + L.forceMove(get_turf(bottom)) + // If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so. if(L.pulling && !L.pulling.anchored) var/atom/movable/P = L.pulling @@ -473,8 +476,6 @@ for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) G.affecting.forceMove(get_turf(bottom)) - - L.forceMove(get_turf(bottom)) if(L.client) L.client.Process_Grab() @@ -493,14 +494,14 @@ var/turf/B2 = get_turf(src) var/turf/T1 = GetAbove(B1) var/turf/T2 = GetAbove(B2) - + if(!istype(B1) || !istype(B2)) warning("Stair created at invalid loc: ([loc.x], [loc.y], [loc.z])") return INITIALIZE_HINT_QDEL if(!istype(T1) || !istype(T2)) warning("Stair created without level above: ([loc.x], [loc.y], [loc.z])") return INITIALIZE_HINT_QDEL - + // Spawn the stairs // Railings sold separately var/turf/simulated/open/O = T1 @@ -516,7 +517,7 @@ B.check_integrity(B, M, T, O) return INITIALIZE_HINT_QDEL - + // For ease of spawning. While you *can* spawn the base type and set its dir, this is useful for adminbus and a little bit quicker to map in /obj/structure/stairs/spawner/north dir = NORTH diff --git a/code/modules/overmap/spacetravel.dm b/code/modules/overmap/spacetravel.dm index 3dac19cf36f..ae1bca73352 100644 --- a/code/modules/overmap/spacetravel.dm +++ b/code/modules/overmap/spacetravel.dm @@ -5,15 +5,16 @@ known = FALSE in_space = TRUE -/obj/effect/overmap/visitable/sector/temporary/Initialize(var/nx, var/ny) +/obj/effect/overmap/visitable/sector/temporary/Initialize() + if(!istype(loc, /turf/unsimulated/map)) + CRASH("Attempt to create deepspace which is not on overmap: [log_info_line(loc)]") + // Tell sector initializer where are is where we want to be. + start_x = loc.x + start_y = loc.y + // But pick an empty z level to use + map_z += global.using_map.get_empty_zlevel() . = ..() - loc = locate(nx, ny, global.using_map.overmap_z) - x = nx - y = ny - var/emptyz = global.using_map.get_empty_zlevel() - map_z += emptyz - map_sectors["[emptyz]"] = src - testing("Temporary sector at [x],[y] was created, corresponding zlevel is [emptyz].") + testing("Temporary sector at [x],[y],[z] was created, corresponding zlevel is [english_list(map_z)].") /obj/effect/overmap/visitable/sector/temporary/Destroy() for(var/zlevel in map_z) @@ -43,7 +44,7 @@ var/obj/effect/overmap/visitable/sector/temporary/res = locate() in overmap_turf if(istype(res)) return res - return new /obj/effect/overmap/visitable/sector/temporary(x, y) + return new /obj/effect/overmap/visitable/sector/temporary(overmap_turf) /atom/movable/proc/lost_in_space() for(var/atom/movable/AM in contents) @@ -133,6 +134,8 @@ TM = get_deepspace(M.x,M.y) nz = pick(TM.get_space_zlevels()) + testing("spacetravel chose [nz],[ny],[nz] in sector [TM] @ ([TM.x],[TM.y],[TM.z])") + var/turf/dest = locate(nx,ny,nz) if(istype(dest)) A.forceMove(dest) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index aa370035203..2b0d100c108 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -14,6 +14,8 @@ throw_speed = 3 throw_range = 5 w_class = ITEMSIZE_NORMAL + /// Are we EMP immune? + var/emp_proof = FALSE var/static/cell_uid = 1 // Unique ID of this power cell. Used to reduce bunch of uglier code in nanoUI. var/c_uid var/charge = 0 // note %age conveted to actual charge in New @@ -189,6 +191,8 @@ rigged = 1 //broken batterys are dangerous /obj/item/weapon/cell/emp_act(severity) + if(emp_proof) + return //remove this once emp changes on dev are merged in if(isrobot(loc)) var/mob/living/silicon/robot/R = loc diff --git a/code/modules/power/cells/device_cells.dm b/code/modules/power/cells/device_cells.dm index 3b6e71e2ed5..b18b7b415c4 100644 --- a/code/modules/power/cells/device_cells.dm +++ b/code/modules/power/cells/device_cells.dm @@ -25,6 +25,9 @@ charge = 0 update_icon() +/obj/item/weapon/cell/device/weapon/empproof + emp_proof = TRUE + /obj/item/weapon/cell/device/weapon/recharge name = "self-charging weapon power cell" desc = "A small power cell designed to power handheld weaponry. This one recharges itself." diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index c1dae89a6e8..74dc34a72c2 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -21,6 +21,7 @@ var/recharge_time = 4 var/charge_tick = 0 var/charge_delay = 75 //delay between firing and charging + var/shot_counter = TRUE // does this gun tell you how many shots it has? var/battery_lock = 0 //If set, weapon cannot switch batteries @@ -175,14 +176,15 @@ /obj/item/weapon/gun/energy/examine(mob/user) . = ..() - if(power_supply) - if(charge_cost) - var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia - . += "Has [shots_remaining] shot\s remaining." + if(shot_counter) + if(power_supply) + if(charge_cost) + var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia + . += "Has [shots_remaining] shot\s remaining." + else + . += "Has infinite shots remaining." else - . += "Has infinite shots remaining." - else - . += "Does not have a power cell." + . += "Does not have a power cell." /obj/item/weapon/gun/energy/update_icon(var/ignore_inhands) if(power_supply == null) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm index 3d656b44669..fb581a4eb3d 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm @@ -1,51 +1,126 @@ +#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland +#define HEATMODE_ATMOSPHERE 312.1 //kPa. basically virgo 2's +#define HEATMODE_TEMP 612 //kelvin. basically virgo 2's +/** + * This is here for now + */ +/proc/lavaland_environment_check(turf/simulated/T) + . = TRUE + if(!istype(T)) + return + var/datum/gas_mixture/environment = T.return_air() + if(!istype(environment)) + return + var/pressure = environment.return_pressure() + if(pressure > LAVALAND_EQUIPMENT_EFFECT_PRESSURE) + . = FALSE + if(environment.temperature < (T20C - 30)) + . = TRUE + +/proc/virgotwo_environment_check(turf/simulated/T) + . = TRUE + if(!istype(T)) + return + var/datum/gas_mixture/environment = T.return_air() + if(!istype(environment)) + return + var/pressure = environment.return_pressure() + if(pressure < HEATMODE_ATMOSPHERE - 20) + . = FALSE + if(environment.temperature > HEATMODE_TEMP - 30) + . = TRUE + /obj/item/weapon/gun/energy/kinetic_accelerator name = "proto-kinetic accelerator" - desc = "A self recharging, ranged mining tool that does increased damage in low temperature. Capable of holding up to six slots worth of mod kits." + desc = "A self recharging, ranged mining tool that does increased damage in low pressure." icon = 'icons/obj/gun_vr.dmi' icon_state = "kineticgun" - item_state = "kineticgun" item_icons = list( slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi') + slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi', + ) + item_state = "kineticgun" + // ammo_type = list(/obj/item/ammo_casing/energy/kinetic) + cell_type = /obj/item/weapon/cell/device/weapon/empproof + item_flags = NONE + charge_meter = FALSE + // obj_flags = UNIQUE_RENAME + // weapon_weight = WEAPON_LIGHT + // can_flashlight = 1 + // flight_x_offset = 15 + // flight_y_offset = 9 + // automatic_charge_overlays = FALSE projectile_type = /obj/item/projectile/kinetic - origin_tech = list(TECH_COMBAT = 3, TECH_POWER = 3, TECH_ENGINEERING = 3) - can_flashlight = TRUE - flight_x_offset = 15 - flight_y_offset = 9 - charge_cost = 120 // 20 shots on weapon power cell - fire_delay = 16 - self_recharge = TRUE - recharge_time = 10 // every 20*2 seconds will get 20% power restored + charge_cost = 1200 + battery_lock = TRUE + fire_sound = 'sound/weapons/kenetic_accel.ogg' + var/overheat_time = 16 + var/holds_charge = FALSE + var/unique_frequency = FALSE // modified by KA modkits + var/overheat = FALSE + var/emptystate = "kineticgun_empty" + shot_counter = FALSE + // can_bayonet = TRUE + // knife_x_offset = 20 + // knife_y_offset = 12 var/max_mod_capacity = 100 var/list/modkits = list() - var/empty_state = "kineticgun_empty" + + var/recharge_timerid + +/obj/item/weapon/gun/energy/kinetic_accelerator/consume_next_projectile() + if(overheat) + return + . = ..() + if(.) + var/obj/item/projectile/P = . + modify_projectile(P) + +/obj/item/weapon/gun/energy/kinetic_accelerator/handle_post_fire(mob/user, atom/target, pointblank, reflex) + . = ..() + attempt_reload() + +/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka + name = "premium accelerator" + desc = "A premium kinetic accelerator fitted with an extended barrel and increased pressure tank." + icon_state = "premiumgun" + item_state = "premiumgun" + projectile_type = /obj/item/projectile/kinetic/premium /obj/item/weapon/gun/energy/kinetic_accelerator/examine(mob/user) . = ..() - if(Adjacent(user) && max_mod_capacity) + if(max_mod_capacity) . += "[get_remaining_mod_capacity()]% mod capacity remaining." - for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits()) - . += "There is a [M.name] mod installed, using [M.cost]% capacity." + for(var/A in get_modkits()) + var/obj/item/borg/upgrade/modkit/M = A + . += "There is \a [M] installed, using [M.cost]% capacity." -/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/A, mob/user) - if(istype(A, /obj/item/weapon/tool/crowbar)) +/obj/item/weapon/gun/energy/kinetic_accelerator/Exited(atom/movable/AM) + . = ..() + if((AM in modkits) && istype(AM, /obj/item/borg/upgrade/modkit)) + var/obj/item/borg/upgrade/modkit/M = AM + M.uninstall(src, FALSE) + +/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user) + if(I.has_tool_quality(TOOL_CROWBAR)) if(modkits.len) to_chat(user, "You pry the modifications out.") - playsound(src, A.usesound, 100, 1) + playsound(loc, I.usesound, 100, 1) for(var/obj/item/borg/upgrade/modkit/M in modkits) M.uninstall(src) else to_chat(user, "There are no modifications currently installed.") - else if(istype(A, /obj/item/borg/upgrade/modkit)) - var/obj/item/borg/upgrade/modkit/MK = A + if(istype(I, /obj/item/borg/upgrade/modkit)) + var/obj/item/borg/upgrade/modkit/MK = I MK.install(src, user) else ..() /obj/item/weapon/gun/energy/kinetic_accelerator/proc/get_remaining_mod_capacity() var/current_capacity_used = 0 - for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits()) + for(var/A in get_modkits()) + var/obj/item/borg/upgrade/modkit/M = A current_capacity_used += M.cost return max_mod_capacity - current_capacity_used @@ -55,134 +130,243 @@ . += A /obj/item/weapon/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K) - for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits()) + K.kinetic_gun = src //do something special on-hit, easy! + for(var/A in get_modkits()) + var/obj/item/borg/upgrade/modkit/M = A M.modify_projectile(K) -/obj/item/weapon/gun/energy/kinetic_accelerator/consume_next_projectile() - var/obj/item/projectile/kinetic/BB = ..() - if(!istype(BB)) - return - modify_projectile(BB) +/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg + holds_charge = TRUE + unique_frequency = TRUE - var/turf/proj_turf = get_turf(src) - if(!isturf(proj_turf)) - return - var/datum/gas_mixture/environment = proj_turf.return_air() - if(environment.temperature > 250) - BB.name = "weakened [BB.name]" - BB.damage *= BB.pressure_decrease - return BB +/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/Destroy() + for(var/obj/item/borg/upgrade/modkit/M in modkits) + M.uninstall(src) + return ..() -/obj/item/weapon/gun/energy/kinetic_accelerator/handle_post_fire(mob/user, atom/target, var/pointblank=0, var/reflex=0) +/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka/cyborg + holds_charge = TRUE + unique_frequency = TRUE + +/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka/cyborg/Destroy() + for(var/obj/item/borg/upgrade/modkit/M in modkits) + M.uninstall(src) + return ..() + +/obj/item/weapon/gun/energy/kinetic_accelerator/minebot + // trigger_guard = TRIGGER_GUARD_ALLOW_ALL + overheat_time = 20 + holds_charge = TRUE + unique_frequency = TRUE + +/obj/item/weapon/gun/energy/kinetic_accelerator/Initialize() . = ..() - spawn(fire_delay) - if(power_supply && power_supply.check_charge(charge_cost)) - playsound(src, 'sound/weapons/kenetic_reload.ogg', 60, 1) + if(!holds_charge) + empty() + AddElement(/datum/element/conflict_checking, CONFLICT_ELEMENT_KA) + +/obj/item/weapon/gun/energy/kinetic_accelerator/equipped(mob/user) + . = ..() + if(power_supply.charge < charge_cost) + attempt_reload() + +/obj/item/weapon/gun/energy/kinetic_accelerator/dropped(mob/user) + . = ..() + if(!QDELING(src) && !holds_charge) + // Put it on a delay because moving item from slot to hand + // calls dropped(). + addtimer(CALLBACK(src, .proc/empty_if_not_held), 2) + +/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty_if_not_held() + if(!ismob(loc) && !istype(loc, /obj/item/integrated_circuit)) + empty() + +/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty() + if(power_supply) + power_supply.use(power_supply.charge) + update_icon() + +/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time) + if(!power_supply) + return + if(overheat) + return + if(!recharge_time) + recharge_time = overheat_time + overheat = TRUE + update_icon() + + var/carried = max(1, loc.ConflictElementCount(CONFLICT_ELEMENT_KA)) + + deltimer(recharge_timerid) + recharge_timerid = addtimer(CALLBACK(src, .proc/reload), recharge_time * carried, TIMER_STOPPABLE) + +/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity) + return + +/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload() + power_supply.give(power_supply.maxcharge) + // process_chamber() + // if(!suppressed) + playsound(src, 'sound/weapons/kenetic_reload.ogg', 60, 1) + // else + // to_chat(loc, "[src] silently charges up.") + overheat = FALSE + update_icon() /obj/item/weapon/gun/energy/kinetic_accelerator/update_icon() cut_overlays() - if(!power_supply || !power_supply.check_charge(charge_cost)) - add_overlay(empty_state) - if(can_flashlight) - var/iconF = "flight" - if(gun_light) - iconF = "flight_on" - add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)) + if(overheat || (power_supply.charge == 0)) + add_overlay(emptystate) + +#define KA_ENVIRO_TYPE_COLD 0 +#define KA_ENVIRO_TYPE_HOT 1 //Projectiles /obj/item/projectile/kinetic name = "kinetic force" - icon = 'icons/obj/projectiles_vr.dmi' icon_state = null - damage = 32 + damage = 30 damage_type = BRUTE check_armour = "bomb" - range = 3 // Our "range" var is named "kill_count". Yes it is. + range = 4 + // log_override = TRUE - var/pressure_decrease = 0.25 - var/turf_aoe = FALSE - var/mob_aoe = FALSE - var/list/hit_overlays = list() + var/pressure_decrease_active = FALSE + var/pressure_decrease = 1/3 + var/environment = KA_ENVIRO_TYPE_COLD + var/obj/item/weapon/gun/energy/kinetic_accelerator/kinetic_gun -// /obj/item/projectile/kinetic/pod -// kill_count = 4 -// -// /obj/item/projectile/kinetic/pod/regular -// damage = 50 -// pressure_decrease = 0.5 -// -// /obj/item/projectile/kinetic/pod/enhanced -// turf_aoe = TRUE -// mob_aoe = TRUE +/obj/item/projectile/kinetic/premium + damage = 40 + damage_type = BRUTE + range = 5 -/obj/item/projectile/kinetic/on_impact(var/atom/A) - strike_thing(A) - . = ..() +/obj/item/projectile/kinetic/Destroy() + kinetic_gun = null + return ..() -/obj/item/projectile/kinetic/on_hit(var/atom/target) +/obj/item/projectile/kinetic/Bump(atom/target) + if(kinetic_gun) + var/list/mods = kinetic_gun.get_modkits() + for(var/obj/item/borg/upgrade/modkit/M in mods) + M.projectile_prehit(src, target, kinetic_gun) + if(!pressure_decrease_active) + if(environment == KA_ENVIRO_TYPE_COLD) + if(!lavaland_environment_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE + else if(environment == KA_ENVIRO_TYPE_HOT) + if(!virgotwo_environment_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE + return ..() + +/obj/item/projectile/kinetic/attack_mob(mob/living/target_mob, distance, miss_modifier) + if(!pressure_decrease_active) + if(environment == KA_ENVIRO_TYPE_COLD) + if(!lavaland_environment_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE + else if(environment == KA_ENVIRO_TYPE_HOT) + if(!virgotwo_environment_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE + return ..() + +/obj/item/projectile/kinetic/on_range() + strike_thing() + ..() + +/obj/item/projectile/kinetic/on_hit(atom/target) strike_thing(target) . = ..() +/obj/item/projectile/kinetic/on_impact(atom/A) + . = ..() + strike_thing(A) + /obj/item/projectile/kinetic/proc/strike_thing(atom/target) + if(!pressure_decrease_active) + if(environment == KA_ENVIRO_TYPE_COLD) + if(!lavaland_environment_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE + else if(environment == KA_ENVIRO_TYPE_HOT) + if(!virgotwo_environment_check(get_turf(src))) + name = "weakened [name]" + damage = damage * pressure_decrease + pressure_decrease_active = TRUE var/turf/target_turf = get_turf(target) if(!target_turf) target_turf = get_turf(src) - if(istype(target_turf, /turf/simulated/mineral)) + if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate. + var/list/mods = kinetic_gun.get_modkits() + for(var/obj/item/borg/upgrade/modkit/M in mods) + M.projectile_strike_predamage(src, target_turf, target, kinetic_gun) + for(var/obj/item/borg/upgrade/modkit/M in mods) + M.projectile_strike(src, target_turf, target, kinetic_gun) + if(ismineralturf(target_turf)) var/turf/simulated/mineral/M = target_turf - M.GetDrilled() + M.GetDrilled(TRUE) var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf) K.color = color - for(var/type in hit_overlays) - new type(target_turf) - if(turf_aoe) - for(var/T in RANGE_TURFS(1, target_turf) - target_turf) - if(istype(T, /turf/simulated/mineral)) - var/turf/simulated/mineral/M = T - M.GetDrilled() - if(mob_aoe) - for(var/mob/living/L in range(1, target_turf) - firer - target) - var/armor = L.run_armor_check(def_zone, check_armour) - L.apply_damage(damage*mob_aoe, damage_type, def_zone, armor) - to_chat(L, "You're struck by a [name]!") + //Modkits /obj/item/borg/upgrade/modkit - name = "modification kit" + name = "kinetic accelerator modification kit" desc = "An upgrade for kinetic accelerators." icon = 'icons/obj/objects_vr.dmi' icon_state = "modkit" - origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_MAGNET = 4) + w_class = ITEMSIZE_SMALL require_module = 1 - // var/module_type = /obj/item/robot_module/miner - usesound = 'sound/items/Screwdriver.ogg' + // module_type = list(/obj/item/robot_module/miner) var/denied_type = null var/maximum_of_type = 1 var/cost = 30 var/modifier = 1 //For use in any mod kit that has numerical modifiers + var/minebot_upgrade = TRUE + var/minebot_exclusive = FALSE /obj/item/borg/upgrade/modkit/examine(mob/user) . = ..() - if(Adjacent(user)) - . += "Occupies [cost]% of mod capacity." + . += "Occupies [cost]% of mod capacity." /obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user) - if(istype(A, /obj/item/weapon/gun/energy/kinetic_accelerator) && !issilicon(user)) + if(istype(A, /obj/item/weapon/gun/energy/kinetic_accelerator)) install(A, user) else ..() -/obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R) - if(..()) - return - +/* +/obj/item/borg/upgrade/modkit/afterInstall(mob/living/silicon/robot/R) for(var/obj/item/weapon/gun/energy/kinetic_accelerator/H in R.module.modules) - return install(H, usr) + if(install(H, R)) //It worked + return + to_chat(R, "Upgrade error - Aborting Kinetic Accelerator linking.") //No applicable KA found, insufficient capacity, or some other problem. +*/ /obj/item/borg/upgrade/modkit/proc/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user) . = TRUE + if(src in KA.modkits) // Sanity check to prevent installing the same modkit twice thanks to occasional click/lag delays. + return FALSE + // if(minebot_upgrade) + // if(minebot_exclusive && !istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone)) + // to_chat(user, "The modkit you're trying to install is only rated for minebot use.") + // return FALSE + // else if(istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone)) + // to_chat(user, "The modkit you're trying to install is not rated for minebot use.") + // return FALSE if(denied_type) var/number_of_denied = 0 - for(var/obj/item/borg/upgrade/modkit/M as anything in KA.get_modkits()) + for(var/A in KA.get_modkits()) + var/obj/item/borg/upgrade/modkit/M = A if(istype(M, denied_type)) number_of_denied++ if(number_of_denied >= maximum_of_type) @@ -190,10 +374,11 @@ break if(KA.get_remaining_mod_capacity() >= cost) if(.) + user.drop_from_inventory(src, KA) + // if(!user.transferItemToLoc(src, KA)) + // return FALSE to_chat(user, "You install the modkit.") - playsound(src, usesound, 100, 1) - user.unEquip(src) - forceMove(KA) + playsound(loc, 'sound/items/screwdriver.ogg', 100, 1) KA.modkits += src else to_chat(user, "The modkit you're trying to install would conflict with an already installed modkit. Use a crowbar to remove existing modkits.") @@ -201,19 +386,26 @@ to_chat(user, "You don't have room([KA.get_remaining_mod_capacity()]% remaining, [cost]% needed) to install this modkit. Use a crowbar to remove existing modkits.") . = FALSE -/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA) - forceMove(get_turf(KA)) +/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA, forcemove = TRUE) KA.modkits -= src + if(forcemove) + forceMove(get_turf(KA)) /obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K) - return + +//use this one for effects you want to trigger before any damage is done at all and before damage is decreased by pressure +/obj/item/borg/upgrade/modkit/proc/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) +//use this one for effects you want to trigger before mods that do damage +/obj/item/borg/upgrade/modkit/proc/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) +//and this one for things that don't need to trigger before other damage-dealing mods +/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) //Range /obj/item/borg/upgrade/modkit/range name = "range increase" desc = "Increases the range of a kinetic accelerator when installed." modifier = 1 - cost = 24 //so you can fit four plus a tracer cosmetic + cost = 25 /obj/item/borg/upgrade/modkit/range/modify_projectile(obj/item/projectile/kinetic/K) K.range += modifier @@ -229,54 +421,87 @@ K.damage += modifier -// //Cooldown -// /obj/item/borg/upgrade/modkit/cooldown -// name = "cooldown decrease" -// desc = "Decreases the cooldown of a kinetic accelerator." -// modifier = 2.5 - -// /obj/item/borg/upgrade/modkit/cooldown/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user) -// . = ..() -// if(.) -// KA.overheat_time -= modifier - -// /obj/item/borg/upgrade/modkit/cooldown/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA) -// KA.overheat_time += modifier -// ..() - //Cooldown -/obj/item/borg/upgrade/modkit/efficiency - name = "energy efficiency" - desc = "Decreases the energy use of a kinetic accelerator." - modifier = 20 +/obj/item/borg/upgrade/modkit/cooldown + name = "cooldown decrease" + desc = "Decreases the cooldown of a kinetic accelerator. Not rated for minebot use." + modifier = 2.5 + minebot_upgrade = FALSE + var/decreased -/obj/item/borg/upgrade/modkit/efficiency/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user) +/obj/item/borg/upgrade/modkit/cooldown/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user) . = ..() if(.) - KA.charge_cost -= modifier + var/old = KA.overheat_time + KA.overheat_time = max(0, KA.overheat_time - modifier) + decreased = old - KA.overheat_time -/obj/item/borg/upgrade/modkit/efficiency/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA) - KA.charge_cost += modifier + +/obj/item/borg/upgrade/modkit/cooldown/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA) + KA.overheat_time += decreased ..() +/obj/item/borg/upgrade/modkit/cooldown/minebot + name = "minebot cooldown decrease" + desc = "Decreases the cooldown of a kinetic accelerator. Only rated for minebot use." + icon_state = "door_electronics" + icon = 'icons/obj/module.dmi' + denied_type = /obj/item/borg/upgrade/modkit/cooldown/minebot + modifier = 10 + cost = 0 + minebot_upgrade = TRUE + minebot_exclusive = TRUE + + //AoE blasts /obj/item/borg/upgrade/modkit/aoe modifier = 0 + var/turf_aoe = FALSE + var/stats_stolen = FALSE + +/obj/item/borg/upgrade/modkit/aoe/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user) + . = ..() + if(.) + for(var/obj/item/borg/upgrade/modkit/aoe/AOE in KA.modkits) //make sure only one of the aoe modules has values if somebody has multiple + if(AOE.stats_stolen || AOE == src) + continue + modifier += AOE.modifier //take its modifiers + AOE.modifier = 0 + turf_aoe += AOE.turf_aoe + AOE.turf_aoe = FALSE + AOE.stats_stolen = TRUE + +/obj/item/borg/upgrade/modkit/aoe/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA) + ..() + modifier = initial(modifier) //get our modifiers back + turf_aoe = initial(turf_aoe) + stats_stolen = FALSE /obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/item/projectile/kinetic/K) K.name = "kinetic explosion" - if(!K.turf_aoe && !K.mob_aoe) - K.hit_overlays += /obj/effect/temp_visual/explosion/fast - K.mob_aoe += modifier + +/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + if(stats_stolen) + return + new /obj/effect/temp_visual/explosion/fast(target_turf) + if(turf_aoe) + for(var/T in RANGE_TURFS(1, target_turf) - target_turf) + if(ismineralturf(T)) + var/turf/simulated/mineral/M = T + M.GetDrilled(TRUE) + if(modifier) + for(var/mob/living/L in range(1, target_turf) - K.firer - target) + var/armor = L.run_armor_check(K.def_zone, K.check_armour) + // var/armor = L.run_armor_check(K.def_zone, K.flag, null, null, K.armour_penetration) + L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor) + // L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor) + to_chat(L, "You're struck by a [K.name]!") /obj/item/borg/upgrade/modkit/aoe/turfs name = "mining explosion" desc = "Causes the kinetic accelerator to destroy rock in an AoE." denied_type = /obj/item/borg/upgrade/modkit/aoe/turfs - -/obj/item/borg/upgrade/modkit/aoe/turfs/modify_projectile(obj/item/projectile/kinetic/K) - ..() - K.turf_aoe = TRUE + turf_aoe = TRUE /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs name = "offensive mining explosion" @@ -289,19 +514,150 @@ desc = "Causes the kinetic accelerator to damage mobs in an AoE." modifier = 0.2 +//Minebot passthrough +/obj/item/borg/upgrade/modkit/minebot_passthrough + name = "minebot passthrough" + desc = "Causes kinetic accelerator shots to pass through minebots." + cost = 0 + +//Tendril-unique modules +/obj/item/borg/upgrade/modkit/cooldown/repeater + name = "rapid repeater" + desc = "Quarters the kinetic accelerator's cooldown on striking a living target, but greatly increases the base cooldown." + denied_type = /obj/item/borg/upgrade/modkit/cooldown/repeater + modifier = -14 //Makes the cooldown 3 seconds(with no cooldown mods) if you miss. Don't miss. + cost = 50 + +/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + var/valid_repeat = FALSE + if(isliving(target)) + var/mob/living/L = target + if(L.stat != DEAD) + valid_repeat = TRUE + if(ismineralturf(target_turf)) + valid_repeat = TRUE + if(valid_repeat) + KA.overheat = FALSE + KA.attempt_reload(KA.overheat_time * 0.25) //If you hit, the cooldown drops to 0.75 seconds. + +/* +/obj/item/borg/upgrade/modkit/lifesteal + name = "lifesteal crystal" + desc = "Causes kinetic accelerator shots to slightly heal the firer on striking a living target." + icon_state = "modkit_crystal" + modifier = 2.5 //Not a very effective method of healing. + cost = 20 + var/static/list/damage_heal_order = list(BRUTE, BURN, OXY) + +/obj/item/borg/upgrade/modkit/lifesteal/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + if(isliving(target) && isliving(K.firer)) + var/mob/living/L = target + if(L.stat == DEAD) + return + L = K.firer + L.heal_ordered_damage(modifier, damage_heal_order) +*/ + +/obj/item/borg/upgrade/modkit/resonator_blasts + name = "resonator blast" + desc = "Causes kinetic accelerator shots to leave and detonate resonator blasts." + denied_type = /obj/item/borg/upgrade/modkit/resonator_blasts + cost = 30 + modifier = 0.25 //A bonus 15 damage if you burst the field on a target, 60 if you lure them into it. + +/obj/item/borg/upgrade/modkit/resonator_blasts/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + if(target_turf && !ismineralturf(target_turf)) //Don't make fields on mineral turfs. + var/obj/effect/resonance/R = locate(/obj/effect/resonance) in target_turf + if(R) + R.resonance_damage *= modifier + R.burst() + return + new /obj/effect/resonance(target_turf, K.firer, 30) + +/* +/obj/item/borg/upgrade/modkit/bounty + name = "death syphon" + desc = "Killing or assisting in killing a creature permanently increases your damage against that type of creature." + denied_type = /obj/item/borg/upgrade/modkit/bounty + modifier = 1.25 + cost = 30 + var/maximum_bounty = 25 + var/list/bounties_reaped = list() + +/obj/item/borg/upgrade/modkit/bounty/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + if(isliving(target)) + var/mob/living/L = target + var/list/existing_marks = L.has_status_effect_list(STATUS_EFFECT_SYPHONMARK) + for(var/i in existing_marks) + var/datum/status_effect/syphon_mark/SM = i + if(SM.reward_target == src) //we want to allow multiple people with bounty modkits to use them, but we need to replace our own marks so we don't multi-reward + SM.reward_target = null + qdel(SM) + L.apply_status_effect(STATUS_EFFECT_SYPHONMARK, src) + +/obj/item/borg/upgrade/modkit/bounty/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + if(isliving(target)) + var/mob/living/L = target + if(bounties_reaped[L.type]) + var/kill_modifier = 1 + if(K.pressure_decrease_active) + kill_modifier *= K.pressure_decrease + var/armor = L.run_armor_check(K.def_zone, K.flag, null, null, K.armour_penetration) + L.apply_damage(bounties_reaped[L.type]*kill_modifier, K.damage_type, K.def_zone, armor) + +/obj/item/borg/upgrade/modkit/bounty/proc/get_kill(mob/living/L) + var/bonus_mod = 1 + if(ismegafauna(L)) //megafauna reward + bonus_mod = 4 + if(!bounties_reaped[L.type]) + bounties_reaped[L.type] = min(modifier * bonus_mod, maximum_bounty) + else + bounties_reaped[L.type] = min(bounties_reaped[L.type] + (modifier * bonus_mod), maximum_bounty) +*/ //Indoors /obj/item/borg/upgrade/modkit/indoors name = "decrease pressure penalty" - desc = "Increases the damage a kinetic accelerator does in a high pressure environment." + desc = "A remarkably illegal modification kit that increases the damage a kinetic accelerator does in pressurized environments." modifier = 2 denied_type = /obj/item/borg/upgrade/modkit/indoors maximum_of_type = 2 - cost = 40 + cost = 35 /obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K) K.pressure_decrease *= modifier +// Atmospheric +/obj/item/borg/upgrade/modkit/heater + name = "temperature modulator" + desc = "A remarkably unusual modification kit that makes kinetic accelerators more usable in hot, overpressurized environments, \ + in exchange for making them weak elsewhere, like the cold or in space." + denied_type = /obj/item/borg/upgrade/modkit/indoors + maximum_of_type = 1 + cost = 30 + +/obj/item/borg/upgrade/modkit/heater/modify_projectile(obj/item/projectile/kinetic/K) + K.environment = KA_ENVIRO_TYPE_HOT + +//Trigger Guard + +/* +/obj/item/borg/upgrade/modkit/trigger_guard + name = "modified trigger guard" + desc = "Allows creatures normally incapable of firing guns to operate the weapon when installed." + cost = 20 + denied_type = /obj/item/borg/upgrade/modkit/trigger_guard + +/obj/item/borg/upgrade/modkit/trigger_guard/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user) + . = ..() + if(.) + KA.trigger_guard = TRIGGER_GUARD_ALLOW_ALL + +/obj/item/borg/upgrade/modkit/trigger_guard/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA) + KA.trigger_guard = TRIGGER_GUARD_NORMAL + ..() +*/ + //Cosmetic /obj/item/borg/upgrade/modkit/chassis_mod @@ -342,7 +698,7 @@ /obj/item/borg/upgrade/modkit/tracer/adjustable name = "adjustable tracer bolts" - desc = "Causes kinetic accelerator bolts to have a adjustably-colored tracer trail and explosion. Use in-hand to change color." + desc = "Causes kinetic accelerator bolts to have an adjustable-colored tracer trail and explosion. Use in-hand to change color." /obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user) - bolt_color = input(user,"Choose Color") as color + bolt_color = input(user,"","Choose Color",bolt_color) as color|null diff --git a/code/modules/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm index 4dce4ce835e..647864365bb 100644 --- a/code/modules/projectiles/guns/launcher/rocket.dm +++ b/code/modules/projectiles/guns/launcher/rocket.dm @@ -36,7 +36,7 @@ if(rockets.len) var/obj/item/ammo_casing/rocket/I = rockets[1] rockets -= I - return + return new I.projectile_type(src) return null /obj/item/weapon/gun/launcher/rocket/handle_post_fire(mob/user, atom/target) diff --git a/code/modules/reagents/reactions/instant/drinks.dm b/code/modules/reagents/reactions/instant/drinks.dm index bd56670ec5c..a9cfd888176 100644 --- a/code/modules/reagents/reactions/instant/drinks.dm +++ b/code/modules/reagents/reactions/instant/drinks.dm @@ -185,11 +185,18 @@ required_reagents = list("gin" = 2, "tonic" = 1) result_amount = 3 +/decl/chemical_reaction/instant/drinks/rum_and_cola + name = "Rum and Cola" + id = "rumandcola" + result = "rumandcola" + required_reagents = list("rum" = 2, "cola" = 1) + result_amount = 3 + /decl/chemical_reaction/instant/drinks/cuba_libre name = "Cuba Libre" id = "cubalibre" result = "cubalibre" - required_reagents = list("rum" = 2, "cola" = 1) + required_reagents = list("rumcola" = 3, "limejuice" = 1) result_amount = 3 /decl/chemical_reaction/instant/drinks/martini @@ -329,14 +336,14 @@ name = "Long Island Iced Tea" id = "longislandicedtea" result = "longislandicedtea" - required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 3) + required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "rumcoke" = 3) result_amount = 6 /decl/chemical_reaction/instant/drinks/icedtea name = "Long Island Iced Tea" id = "longislandicedtea" result = "longislandicedtea" - required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 3) + required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "rumcoke" = 3) result_amount = 6 /decl/chemical_reaction/instant/drinks/threemileisland @@ -693,6 +700,13 @@ required_reagents = list("orangejuice" = 2, "cola" = 1) result_amount = 3 +/decl/chemical_reaction/instant/drinks/brownstar_decaf + name = "Decaf Brown Star" + id = "brownstar_decaf" + result = "brownstar_decaf" + required_reagents = list("orangejuice" = 2, "decafcola" = 1) + result_amount = 3 + /decl/chemical_reaction/instant/drinks/milkshake name = "Milkshake" id = "milkshake" @@ -756,6 +770,13 @@ required_reagents = list("tea" = 5, "mint" = 1) result_amount = 6 +/decl/chemical_reaction/instant/drinks/minttea_decaf + name = "Decaf Mint Tea" + id = "decafminttea" + result = "decafminttea" + required_reagents = list("decaftea" = 5, "mint" = 1) + result_amount = 6 + /decl/chemical_reaction/instant/drinks/lemontea name = "Lemon Tea" id = "lemontea" @@ -763,6 +784,13 @@ required_reagents = list("tea" = 5, "lemonjuice" = 1) result_amount = 6 +/decl/chemical_reaction/instant/drinks/lemontea_decaf + name = "Decaf Lemon Tea" + id = "decaflemontea" + result = "decaflemontea" + required_reagents = list("decaftea" = 5, "lemonjuice" = 1) + result_amount = 6 + /decl/chemical_reaction/instant/drinks/limetea name = "Lime Tea" id = "limetea" @@ -770,6 +798,13 @@ required_reagents = list("tea" = 5, "limejuice" = 1) result_amount = 6 +/decl/chemical_reaction/instant/drinks/limetea_decaf + name = "Decaf Lime Tea" + id = "decaflimetea" + result = "decaflimetea" + required_reagents = list("decaftea" = 5, "limejuice" = 1) + result_amount = 6 + /decl/chemical_reaction/instant/drinks/orangetea name = "Orange Tea" id = "orangetea" @@ -777,6 +812,13 @@ required_reagents = list("tea" = 5, "orangejuice" = 1) result_amount = 6 +/decl/chemical_reaction/instant/drinks/orangetea_decaf + name = "Decaf Orange Tea" + id = "decaforangetea" + result = "decaforangetea" + required_reagents = list("decaftea" = 5, "orangejuice" = 1) + result_amount = 6 + /decl/chemical_reaction/instant/drinks/berrytea name = "Berry Tea" id = "berrytea" @@ -784,6 +826,13 @@ required_reagents = list("tea" = 5, "berryjuice" = 1) result_amount = 6 +/decl/chemical_reaction/instant/drinks/berrytea_decaf + name = "Decaf Berry Tea" + id = "decafberrytea" + result = "decafberrytea" + required_reagents = list("decaftea" = 5, "berryjuice" = 1) + result_amount = 6 + /decl/chemical_reaction/instant/drinks/sakebomb name = "Sake Bomb" id = "sakebomb" diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm index 457a73b01ec..1ddc24bfc93 100644 --- a/code/modules/reagents/reagents/food_drinks.dm +++ b/code/modules/reagents/reagents/food_drinks.dm @@ -316,6 +316,13 @@ color = "#664330" allergen_type = ALLERGEN_FISH //Murkfin is fish +/datum/reagent/nutriment/protein/bean + name = "beans" + id = "bean_protein" + taste_description = "beans" + color = "#562e0b" + allergen_type = ALLERGEN_BEANS //Made from soy beans + /datum/reagent/nutriment/honey name = "Honey" id = "honey" @@ -384,7 +391,7 @@ taste_mult = 1.3 nutriment_factor = 1 color = "#482000" - allergen_type = ALLERGEN_COFFEE //Again, coffee contains coffee + allergen_type = ALLERGEN_COFFEE | ALLERGEN_STIMULANT //Again, coffee contains coffee /datum/reagent/nutriment/tea name = "Tea Powder" @@ -394,6 +401,16 @@ taste_mult = 1.3 nutriment_factor = 1 color = "#101000" + allergen_type = ALLERGEN_STIMULANT //Strong enough to contain caffeine + +/datum/reagent/nutriment/decaf_tea + name = "Decaf Tea Powder" + id = "decafteapowder" + description = "A dark, tart powder made from black tea leaves, treated to remove caffeine content." + taste_description = "tartness" + taste_mult = 1.3 + nutriment_factor = 1 + color = "#101000" /datum/reagent/nutriment/coco name = "Coco Powder" @@ -636,8 +653,6 @@ color = "#365E30" overdose = REAGENTS_OVERDOSE -//SYNNONO MEME FOODS EXPANSION - Credit to Synnono - /datum/reagent/spacespice name = "Wurmwoad" id = "spacespice" @@ -1228,6 +1243,7 @@ cup_icon_state = "cup_tea" cup_name = "cup of tea" cup_desc = "Tasty black tea, it has antioxidants, it's good for you!" + allergen_type = ALLERGEN_STIMULANT //Black tea strong enough to have significant caffeine content /datum/reagent/drink/tea/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1235,6 +1251,23 @@ return M.adjustToxLoss(-0.5 * removed) +/datum/reagent/drink/tea/decaf + name = "Decaf Tea" + id = "teadecaf" + description = "Tasty black tea, it has antioxidants, it's good for you, and won't keep you up at night!" + color = "#832700" + adj_dizzy = 0 + adj_drowsy = 0 //Decaf won't help you here. + adj_sleepy = 0 + + glass_name = "cup of decaf tea" + glass_desc = "Tasty black tea, it has antioxidants, it's good for you, and won't keep you up at night!" + + cup_name = "cup of decaf tea" + cup_desc = "Tasty black tea, it has antioxidants, it's good for you, and won't keep you up at night!" + allergen_type = null //Certified cat-safe! + + /datum/reagent/drink/tea/icetea name = "Iced Tea" id = "icetea" @@ -1269,6 +1302,16 @@ M.bodytemperature += 0.5 //M.adjustToxLoss(5 * removed) //VOREStation Removal +/datum/reagent/drink/tea/icetea/decaf + name = "Decaf Iced Tea" + glass_name = "decaf iced tea" + cup_name = "cup of decaf iced tea" + id = "iceteadecaf" + adj_dizzy = 0 + adj_drowsy = 0 + adj_sleepy = 0 + allergen_type = null + /datum/reagent/drink/tea/minttea name = "Mint Tea" id = "minttea" @@ -1282,6 +1325,16 @@ cup_name = "cup of mint tea" cup_desc = "A tasty mixture of mint and tea. It's apparently good for you!" +/datum/reagent/drink/tea/minttea/decaf + name = "Decaf Mint Tea" + glass_name = "decaf mint tea" + cup_name = "cup of decaf mint tea" + id = "mintteadecaf" + adj_dizzy = 0 + adj_drowsy = 0 + adj_sleepy = 0 + allergen_type = null + /datum/reagent/drink/tea/lemontea name = "Lemon Tea" id = "lemontea" @@ -1294,7 +1347,17 @@ cup_name = "cup of lemon tea" cup_desc = "A tasty mixture of lemon and tea. It's apparently good for you!" - allergen_type = ALLERGEN_FRUIT //Made with lemon juice + allergen_type = ALLERGEN_FRUIT | ALLERGEN_STIMULANT //Made with lemon juice, still tea + +/datum/reagent/drink/tea/lemontea/decaf + name = "Decaf Lemon Tea" + glass_name = "decaf lemon tea" + cup_name = "cup of decaf lemon tea" + id = "lemonteadecaf" + adj_dizzy = 0 + adj_drowsy = 0 + adj_sleepy = 0 + allergen_type = ALLERGEN_FRUIT //No caffine, still lemon. /datum/reagent/drink/tea/limetea name = "Lime Tea" @@ -1308,7 +1371,17 @@ cup_name = "cup of lime tea" cup_desc = "A tasty mixture of lime and tea. It's apparently good for you!" - allergen_type = ALLERGEN_FRUIT //Made with lime juice + allergen_type = ALLERGEN_FRUIT | ALLERGEN_STIMULANT //Made with lime juice, still tea + +/datum/reagent/drink/tea/limetea/decaf + name = "Decaf Lime Tea" + glass_name = "decaf lime tea" + cup_name = "cup of decaf lime tea" + id = "limeteadecaf" + adj_dizzy = 0 + adj_drowsy = 0 + adj_sleepy = 0 + allergen_type = ALLERGEN_FRUIT //No caffine, still lime. /datum/reagent/drink/tea/orangetea name = "Orange Tea" @@ -1322,7 +1395,17 @@ cup_name = "cup of orange tea" cup_desc = "A tasty mixture of orange and tea. It's apparently good for you!" - allergen_type = ALLERGEN_FRUIT //Made with orange juice + allergen_type = ALLERGEN_FRUIT | ALLERGEN_STIMULANT //Made with orange juice, still tea + +/datum/reagent/drink/tea/orangetea/decaf + name = "Decaf orange Tea" + glass_name = "decaf orange tea" + cup_name = "cup of decaf orange tea" + id = "orangeteadecaf" + adj_dizzy = 0 + adj_drowsy = 0 + adj_sleepy = 0 + allergen_type = ALLERGEN_FRUIT //No caffine, still orange. /datum/reagent/drink/tea/berrytea name = "Berry Tea" @@ -1336,7 +1419,17 @@ cup_name = "cup of berry tea" cup_desc = "A tasty mixture of berries and tea. It's apparently good for you!" - allergen_type = ALLERGEN_FRUIT //Made with berry juice + allergen_type = ALLERGEN_FRUIT | ALLERGEN_STIMULANT //Made with berry juice, still tea + +/datum/reagent/drink/tea/berrytea/decaf + name = "Decaf Berry Tea" + glass_name = "decaf berry tea" + cup_name = "cup of decaf berry tea" + id = "berryteadecaf" + adj_dizzy = 0 + adj_drowsy = 0 + adj_sleepy = 0 + allergen_type = ALLERGEN_FRUIT //No caffine, still berries. /datum/reagent/drink/greentea name = "Green Tea" @@ -1351,18 +1444,29 @@ cup_name = "cup of green tea" cup_desc = "A subtle blend of green tea. It's apparently good for you!" -/datum/reagent/drink/chaitea +/datum/reagent/drink/tea/chaitea name = "Chai Tea" id = "chaitea" - description = "A tea spiced with cinnamon and cloves." + description = "A milky tea spiced with cinnamon and cloves." color = "#A8442C" taste_description = "creamy cinnamon and spice" glass_name = "chai tea" - glass_desc = "A tea spiced with cinnamon and cloves." + glass_desc = "A milky tea spiced with cinnamon and cloves." cup_name = "cup of chai tea" - cup_desc = "A tea spiced with cinnamon and cloves." + cup_desc = "A milky tea spiced with cinnamon and cloves." + allergen_type = ALLERGEN_STIMULANT|ALLERGEN_DAIRY //Made with milk and tea. + +/datum/reagent/drink/tea/chaitea/decaf + name = "Decaf Chai Tea" + glass_name = "decaf chai tea" + cup_name = "cup of decaf chai tea" + id = "chaiteadecaf" + adj_dizzy = 0 + adj_drowsy = 0 + adj_sleepy = 0 + allergen_type = ALLERGEN_DAIRY //No caffeine, still milk. /datum/reagent/drink/coffee name = "Coffee" @@ -1383,7 +1487,7 @@ glass_name = "coffee" glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." - allergen_type = ALLERGEN_COFFEE //Apparently coffee contains coffee + allergen_type = ALLERGEN_COFFEE | ALLERGEN_STIMULANT //Apparently coffee contains coffee /datum/reagent/drink/coffee/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -1496,7 +1600,7 @@ glass_name = "decaf coffee" glass_desc = "Basically just brown, bitter water." - allergen_type = ALLERGEN_COFFEE //Decaf coffee would still likely trigger allergy symptoms. + allergen_type = ALLERGEN_COFFEE //Decaf coffee is still coffee, just less stimulating. /datum/reagent/drink/hot_coco name = "Hot Chocolate" @@ -1632,7 +1736,18 @@ glass_name = "Brown Star" glass_desc = "It's not what it sounds like..." - allergen_type = ALLERGEN_FRUIT //Made with orangejuice and cola + allergen_type = ALLERGEN_FRUIT | ALLERGEN_STIMULANT //Made with orangejuice and cola + +/datum/reagent/drink/soda/brownstar_decaf //For decaf starkist + name = "Decaf Brown Star" + id = "brownstar_decaf" + description = "It's not what it sounds like..." + taste_description = "orange and cola soda" + color = "#9F3400" + adj_temp = -2 + + glass_name = "Brown Star" + glass_desc = "It's not what it sounds like..." /datum/reagent/drink/milkshake name = "Milkshake" @@ -1730,7 +1845,7 @@ glass_name = "Rewriter" glass_desc = "The secret of the sanctuary of the Libarian..." - allergen_type = ALLERGEN_FRUIT|ALLERGEN_COFFEE //Made with space mountain wind (Fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_COFFEE|ALLERGEN_STIMULANT //Made with space mountain wind (Fruit, caffeine) /datum/reagent/drink/rewriter/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1748,6 +1863,7 @@ glass_name = "Nuka-Cola" glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland" glass_special = list(DRINK_FIZZ) + allergen_type = ALLERGEN_STIMULANT /datum/reagent/drink/soda/nuka_cola/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1781,6 +1897,20 @@ glass_name = "Space Cola" glass_desc = "A glass of refreshing Space Cola" glass_special = list(DRINK_FIZZ) + allergen_type = ALLERGEN_STIMULANT //Cola is typically caffeinated. + +/datum/reagent/drink/soda/decaf_cola + name = "Space Cola Free" + id = "decafcola" + description = "A refreshing beverage with none of the jitters." + taste_description = "cola" + reagent_state = LIQUID + color = "#100800" + adj_temp = -5 + + glass_name = "Space Cola Free" + glass_desc = "A glass of refreshing Space Cola Free" + glass_special = list(DRINK_FIZZ) /datum/reagent/drink/soda/lemon_soda name = "Lemon Soda" @@ -1899,12 +2029,12 @@ glass_name = "Space Mountain Wind" glass_desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." glass_special = list(DRINK_FIZZ) - allergen_type = ALLERGEN_FRUIT //Fruit allergens because citrus is implied to come from limes/lemons + allergen_type = ALLERGEN_FRUIT|ALLERGEN_STIMULANT //Citrus, and caffeination /datum/reagent/drink/soda/dr_gibb name = "Dr. Gibb" id = "dr_gibb" - description = "A delicious blend of 42 different flavors" + description = "A delicious blend of 42 different flavors." taste_description = "cherry soda" color = "#102000" adj_drowsy = -6 @@ -1912,6 +2042,7 @@ glass_name = "Dr. Gibb" glass_desc = "Dr. Gibb. Not as dangerous as the name might imply." + allergen_type = ALLERGEN_STIMULANT /datum/reagent/drink/soda/space_up name = "Space-Up" @@ -1965,7 +2096,7 @@ name = "Diet Dr. Gibb" id = "diet_dr_gibb" color = "#102000" - taste_description = "watered down cherry soda" + taste_description = "chemically sweetened cherry soda" glass_name = "glass of Diet Dr. Gibb" glass_desc = "Regular Dr.Gibb is probably healthier than this cocktail of artificial flavors." @@ -1994,7 +2125,7 @@ glass_name = "roy rogers" glass_desc = "I'm a cowboy, on a steel horse I ride" glass_special = list(DRINK_FIZZ) - allergen_type = ALLERGEN_FRUIT //Made with lemon lime + allergen_type = ALLERGEN_FRUIT | ALLERGEN_STIMULANT //Made with lemon lime and cola /datum/reagent/drink/collins_mix name = "Collins Mix" @@ -2020,7 +2151,7 @@ glass_name = "arnold palmer" glass_desc = "Tastes just like the old man." glass_special = list(DRINK_FIZZ) - allergen_type = ALLERGEN_FRUIT //Made with lemonade + allergen_type = ALLERGEN_FRUIT | ALLERGEN_STIMULANT //Made with lemonade and tea /datum/reagent/drink/doctor_delight name = "The Doctor's Delight" @@ -2154,7 +2285,7 @@ glass_name = "Vile Lemon" glass_desc = "A sour, fizzy drink with lemonade and lemonlime." glass_special = list(DRINK_FIZZ) - allergen_type = ALLERGEN_FRUIT //Made from lemonade + allergen_type = ALLERGEN_FRUIT|ALLERGEN_STIMULANT //Made from lemonade and mtn wind(caffeine) /datum/reagent/drink/entdraught name = "Ent's Draught" @@ -2495,7 +2626,7 @@ //Base type for alchoholic drinks containing coffee /datum/reagent/ethanol/coffee overdose = 45 - allergen_type = ALLERGEN_COFFEE //Contains coffee or is made from coffee + allergen_type = ALLERGEN_COFFEE|ALLERGEN_STIMULANT //Contains coffee or is made from coffee /datum/reagent/ethanol/coffee/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -2623,6 +2754,7 @@ glass_name = "Thirteen Loko" glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." + allergen_type = ALLERGEN_STIMULANT //Holy shit dude. /datum/reagent/ethanol/thirteenloko/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -2865,7 +2997,7 @@ glass_name = "Atomic Bomb" glass_desc = "We cannot take legal responsibility for your actions after imbibing." - allergen_type = ALLERGEN_COFFEE|ALLERGEN_DAIRY|ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from b52 which contains kahlua(coffee), cognac(fruit), and irish cream(Whiskey(grains),cream(dairy)) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_DAIRY|ALLERGEN_FRUIT|ALLERGEN_GRAINS|ALLERGEN_STIMULANT //Made from b52 which contains kahlua(coffee/caffeine), cognac(fruit), and irish cream(Whiskey(grains),cream(dairy)) /datum/reagent/ethanol/coffee/b52 name = "B-52" @@ -2879,7 +3011,7 @@ glass_name = "B-52" glass_desc = "Kahlua, Irish cream, and cognac. You will get bombed." - allergen_type = ALLERGEN_COFFEE|ALLERGEN_DAIRY|ALLERGEN_FRUIT|ALLERGEN_GRAINS //Made from kahlua(coffee), cognac(fruit), and irish cream(Whiskey(grains),cream(dairy)) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_DAIRY|ALLERGEN_FRUIT|ALLERGEN_GRAINS|ALLERGEN_STIMULANT //Made from kahlua(coffee/caffeine), cognac(fruit), and irish cream(Whiskey(grains),cream(dairy)) /datum/reagent/ethanol/bahama_mama name = "Bahama mama" @@ -2965,7 +3097,7 @@ glass_name = "Black Russian" glass_desc = "For the lactose-intolerant. Still as classy as a White Russian." - allergen_type = ALLERGEN_COFFEE|ALLERGEN_GRAINS //Made from vodka(grains) and kahlua(coffee) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_GRAINS|ALLERGEN_STIMULANT //Made from vodka(grains) and kahlua(coffee/caffeine) /datum/reagent/ethanol/bloody_mary name = "Bloody Mary" @@ -2993,7 +3125,7 @@ allergen_type = ALLERGEN_DAIRY|ALLERGEN_FRUIT //Made from cream(dairy), banana juice(fruit), and watermelon juice(fruit) -/datum/reagent/ethanol/coffee/brave_bull //Since it's under the /coffee subtype, it already has coffee allergens. +/datum/reagent/ethanol/coffee/brave_bull //Since it's under the /coffee subtype, it already has coffee and caffeine allergens. name = "Brave Bull" id = "bravebull" description = "It's just as effective as Dutch-Courage!" @@ -3034,13 +3166,37 @@ /datum/reagent/ethanol/cuba_libre name = "Cuba Libre" id = "cubalibre" - description = "Rum, mixed with cola. Viva la revolucion." + description = "Rum, mixed with cola and a splash of lime. Viva la revolucion." + taste_description = "cola with lime" + color = "#3E1B00" + strength = 30 + + glass_name = "Cuba Libre" + glass_desc = "A classic mix of rum, cola, and lime." + allergen_type = ALLERGEN_STIMULANT //Cola + +/datum/reagent/ethanol/rum_and_cola + name = "Rum and Cola" + id = "rumandcola" + description = "A classic mix of sugar with more sugar." taste_description = "cola" color = "#3E1B00" strength = 30 glass_name = "Cuba Libre" + glass_desc = "A classic mix of rum, cola, and lime." + +/datum/reagent/ethanol/rum_and_cola + name = "Rum and Cola" + id = "rumandcola" + description = "A classic mix of sugar with more sugar." + taste_description = "cola" + color = "#3E1B00" + strength = 30 + + glass_name = "rum and cola" glass_desc = "A classic mix of rum and cola." + allergen_type = ALLERGEN_STIMULANT // Cola /datum/reagent/ethanol/demonsblood name = "Demons Blood" @@ -3053,7 +3209,7 @@ glass_name = "Demons' Blood" glass_desc = "Just looking at this thing makes the hair on the back of your neck stand up." - allergen_type = ALLERGEN_FRUIT //Made from space mountain wind(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_STIMULANT //Made from space mountain wind(fruit) and dr.gibb(caffeine) /datum/reagent/ethanol/devilskiss name = "Devils Kiss" @@ -3065,7 +3221,7 @@ glass_name = "Devil's Kiss" glass_desc = "Creepy time!" - allergen_type = ALLERGEN_COFFEE //Made from kahlua (Coffee) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_STIMULANT //Made from kahlua (Coffee) /datum/reagent/ethanol/driestmartini name = "Driest Martini" @@ -3228,7 +3384,7 @@ glass_name = "Irish coffee" glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." - allergen_type = ALLERGEN_COFFEE|ALLERGEN_DAIRY|ALLERGEN_GRAINS //Made from Coffee(coffee) and irish cream(whiskey(grains), cream(dairy)) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_DAIRY|ALLERGEN_GRAINS|ALLERGEN_STIMULANT //Made from Coffee(coffee/caffeine) and irish cream(whiskey(grains), cream(dairy)) /datum/reagent/ethanol/irish_cream name = "Irish Cream" @@ -3254,7 +3410,7 @@ glass_name = "Long Island iced tea" glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT //Made from vodka(grains) and gin(fruit) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_FRUIT|ALLERGEN_STIMULANT //Made from vodka(grains), cola(caffeine) and gin(fruit) /datum/reagent/ethanol/manhattan name = "Manhattan" @@ -3441,7 +3597,7 @@ glass_name = "Snow White" glass_desc = "A cold refreshment." - allergen_type = ALLERGEN_COFFEE|ALLERGEN_FRUIT //made from Pineapple juice(fruit), lemon_lime(fruit), and kahlua(coffee) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_FRUIT|ALLERGEN_STIMULANT //made from Pineapple juice(fruit), lemon_lime(fruit), and kahlua(coffee/caffine) /datum/reagent/ethanol/suidream name = "Sui Dream" @@ -3467,7 +3623,7 @@ glass_name = "Syndicate Bomb" glass_desc = "Tastes like terrorism!" - allergen_type = ALLERGEN_GRAINS //Made from beer(grain) and whiskeycola(whiskey(grain)) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_STIMULANT //Made from beer(grain) and whiskeycola(whiskey(grain) and cola(caffeine)) /datum/reagent/ethanol/tequilla_sunrise name = "Tequila Sunrise" @@ -3547,7 +3703,7 @@ glass_name = "White Russian" glass_desc = "A very nice looking drink. But that's just, like, your opinion, man." - allergen_type = ALLERGEN_COFFEE|ALLERGEN_GRAINS|ALLERGEN_DAIRY //Made from black russian(vodka(grains), kahlua(coffee)) and cream(dairy) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_GRAINS|ALLERGEN_DAIRY|ALLERGEN_STIMULANT //Made from black russian(vodka(grains), kahlua(coffee/caffeine)) and cream(dairy) /datum/reagent/ethanol/whiskey_cola name = "Whiskey Cola" @@ -3560,7 +3716,7 @@ glass_name = "whiskey cola" glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious." - allergen_type = ALLERGEN_GRAINS //Made from whiskey(grains) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_STIMULANT //Made from whiskey(grains) and cola(caffeine) /datum/reagent/ethanol/whiskeysoda name = "Whiskey Soda" @@ -3689,7 +3845,7 @@ glass_name = "Elysium Facepunch" glass_desc = "A loathesome cocktail favored by Heaven's skeleton shift workers." - allergen_type = ALLERGEN_COFFEE|ALLERGEN_FRUIT //Made from kahlua(Coffee) and lemonjuice(fruit) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_FRUIT|ALLERGEN_STIMULANT //Made from kahlua(Coffee/caffeine) and lemonjuice(fruit) /datum/reagent/ethanol/erebusmoonrise name = "Erebus Moonrise" @@ -3755,7 +3911,7 @@ glass_name = "Xanadu Cannon" glass_desc = "Common in the entertainment districts of Titan." - allergen_type = ALLERGEN_GRAINS //Made from ale(grain) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_STIMULANT //Made from ale(grain) and dr.gibb(caffeine) /datum/reagent/ethanol/debugger name = "Debugger" @@ -3780,7 +3936,7 @@ glass_name = "Spacer's Brew" glass_desc = "Ethanol and orange soda. A common emergency drink on frontier colonies." - allergen_type = ALLERGEN_FRUIT //Made from brownstar(orange juice(fruit)) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_STIMULANT //Made from brownstar(orange juice(fruit) + cola(caffeine) /datum/reagent/ethanol/binmanbliss name = "Binman Bliss" @@ -3860,7 +4016,7 @@ glass_name = "Morning After" glass_desc = "The finest hair of the dog, coming up!" - allergen_type = ALLERGEN_GRAINS|ALLERGEN_COFFEE //Made from sbiten(vodka(grain)) and coffee(coffee) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_COFFEE|ALLERGEN_STIMULANT //Made from sbiten(vodka(grain)) and coffee(coffee/caffine) /datum/reagent/ethanol/vesper name = "Vesper" @@ -3886,7 +4042,7 @@ glass_name = "Rotgut Fever Dream" glass_desc = "Why are you doing this to yourself?" - allergen_type = ALLERGEN_GRAINS //Made from whiskey(grains) and vodka(grains) + allergen_type = ALLERGEN_GRAINS|ALLERGEN_STIMULANT //Made from whiskey(grains), cola (caffeine) and vodka(grains) /datum/reagent/ethanol/voxdelight name = "Vox's Delight" @@ -4098,7 +4254,7 @@ glass_name = "Cold Front" glass_desc = "Minty, rich, and painfully cold. It's a blizzard in a cup." - allergen_type = ALLERGEN_COFFEE //Made from iced coffee(coffee) + allergen_type = ALLERGEN_COFFEE|ALLERGEN_STIMULANT //Made from iced coffee(coffee) /datum/reagent/ethanol/mintjulep name = "Mint Julep" @@ -4194,7 +4350,7 @@ glass_icon = DRINK_ICON_NOISY glass_special = list(DRINK_FIZZ) - allergen_type = ALLERGEN_FRUIT //Made from space mountain wind(fruit), and holy wine(fruit) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_STIMULANT //Made from space mountain wind(fruit), dr.gibb(caffine) and holy wine(fruit) /datum/reagent/ethanol/angelskiss name = "Angels Kiss" @@ -4207,7 +4363,7 @@ glass_name = "Angel's Kiss" glass_desc = "Miracle time!" - allergen_type = ALLERGEN_FRUIT|ALLERGEN_COFFEE //Made from holy wine(fruit), and kahlua(coffee) + allergen_type = ALLERGEN_FRUIT|ALLERGEN_COFFEE|ALLERGEN_STIMULANT //Made from holy wine(fruit), and kahlua(coffee) /datum/reagent/ethanol/ichor_mead name = "Ichor Mead" diff --git a/code/modules/reagents/reagents/food_drinks_vr.dm b/code/modules/reagents/reagents/food_drinks_vr.dm index e25595860ab..ef301925cb4 100644 --- a/code/modules/reagents/reagents/food_drinks_vr.dm +++ b/code/modules/reagents/reagents/food_drinks_vr.dm @@ -155,16 +155,12 @@ if(alien == IS_SLIME || alien == IS_CHIMERA) //slimes and chimera can get nutrition from injected nutriment and protein M.adjust_nutrition(alt_nutriment_factor * removed) - - /datum/reagent/nutriment/magicdust/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() playsound(M, 'sound/items/hooh.ogg', 50, 1, -1) if(prob(5)) to_chat(M, "You feel like you've been gnomed...") - - /datum/reagent/ethanol/galacticpanic name = "Galactic Panic Attack" id = "galacticpanic" @@ -516,4 +512,34 @@ glass_name = "Shambler's Juice" glass_desc = "A glass of something shambly" - glass_special = list(DRINK_FIZZ) \ No newline at end of file + glass_special = list(DRINK_FIZZ) + +////////////////START BrainzSnax Reagents//////////////// + +/datum/reagent/nutriment/protein/brainzsnax + name = "grey matter" + id = "brain_protein" + taste_description = "fatty, mushy meat and allspice" + color = "#caa3c9" + +/datum/reagent/nutriment/protein/brainzsnax/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + if(prob(5) && !(alien == IS_CHIMERA || alien == IS_SLIME || alien == IS_PLANT || alien == IS_DIONA || alien == IS_SHADEKIN && !M.isSynthetic())) + M.adjustBrainLoss(removed) //Any other species risks prion disease. + M.Confuse(5) + M.hallucination = max(M.hallucination, 25) + + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.feral > 0 && H.nutrition > 100 && H.traumatic_shock < min(60, H.nutrition/10) && H.jitteriness < 100) //Same check as feral triggers to stop them immediately re-feralling + H.feral -= removed * 3 //Should calm them down quick, provided they're actually in a state to STAY calm. + if(H.feral <=0) //Check if they're unferalled + H.feral = 0 + to_chat(H, "Your mind starts to clear, soothed into a state of clarity as your senses return.") + log_and_message_admins("is no longer feral.", H) + +/datum/reagent/nutriment/protein/brainzsnax/red + id = "red_brain_protein" + taste_description = "fatty, mushy meat and cheap tomato sauce" + color = "#a6898d" + +////////////////END BrainzSnax Reagents//////////////// \ No newline at end of file diff --git a/code/modules/research/designs/circuits/circuits.dm b/code/modules/research/designs/circuits/circuits.dm index c4c0825a2e0..fbf41ab8067 100644 --- a/code/modules/research/designs/circuits/circuits.dm +++ b/code/modules/research/designs/circuits/circuits.dm @@ -427,6 +427,13 @@ CIRCUITS BELOW build_path = /obj/item/weapon/circuitboard/skills sort_string = "LAAAC" +/datum/design/circuit/arf_generator + name = "atmospheric field generator" + id = "arf_generator" + req_tech = list(TECH_MAGNET = 4, TECH_POWER = 4, TECH_BIO = 3) + build_path = /obj/item/weapon/circuitboard/arf_generator + sort_string = "LAAAD" + /datum/design/circuit/mecha req_tech = list(TECH_DATA = 3) diff --git a/code/modules/vore/eating/bellymodes_datum_vr.dm b/code/modules/vore/eating/bellymodes_datum_vr.dm index 2aee027c95f..8f8dd46aebd 100644 --- a/code/modules/vore/eating/bellymodes_datum_vr.dm +++ b/code/modules/vore/eating/bellymodes_datum_vr.dm @@ -200,8 +200,8 @@ GLOBAL_LIST_INIT(digest_modes, list()) B.ownegg.calibrate_size() B.ownegg.orient2hud() B.ownegg.w_class = clamp(B.ownegg.w_class * 0.25, 1, 8) //A total w_class of 16 will result in a backpack sized egg. - B.ownegg.icon_scale_x = 0.25 * B.ownegg.w_class - B.ownegg.icon_scale_y = 0.25 * B.ownegg.w_class + B.ownegg.icon_scale_x = clamp(0.25 * B.ownegg.w_class, 0.25, 1) + B.ownegg.icon_scale_y = clamp(0.25 * B.ownegg.w_class, 0.25, 1) B.ownegg.update_transform() if(B.ownegg.w_class > 4) B.ownegg.slowdown = B.ownegg.w_class - 4 diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 95f3089dcb4..7338db7830c 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -235,7 +235,9 @@ /obj/belly/proc/handle_digestion_death(mob/living/M) var/digest_alert_owner = pick(digest_messages_owner) var/digest_alert_prey = pick(digest_messages_prey) - var/compensation = M.getOxyLoss() //How much of the prey's damage was caused by passive crit oxyloss to compensate the lost nutrition. + var/compensation = M.maxHealth / 5 //Dead body bonus. + if(ishuman(M)) + compensation += M.getOxyLoss() //How much of the prey's damage was caused by passive crit oxyloss to compensate the lost nutrition. var/living_count = 0 for(var/mob/living/L in contents) @@ -263,14 +265,11 @@ digestion_death(M) if(!ishuman(owner)) owner.update_icons() - if(compensation == 0) //Slightly sloppy way at making sure certain mobs don't give ZERO nutrition (fish and so on) - compensation = 21 //This reads as 20*4.5 due to the calculations afterward, making the backup nutrition value 94.5 per mob. Not op compared to regular prey. - if(compensation > 0) - if(isrobot(owner)) - var/mob/living/silicon/robot/R = owner - R.cell.charge += 25*compensation*(nutrition_percent / 100) - else - owner.adjust_nutrition((nutrition_percent / 100)*4.5*compensation) + if(isrobot(owner)) + var/mob/living/silicon/robot/R = owner + R.cell.charge += (nutrition_percent / 100) * compensation * 25 + else + owner.adjust_nutrition((nutrition_percent / 100) * compensation * 4.5) /obj/belly/proc/steal_nutrition(mob/living/L) if(L.nutrition >= 100) diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm index 2c905b9b522..f303be39987 100644 --- a/code/modules/vore/eating/digest_act_vr.dm +++ b/code/modules/vore/eating/digest_act_vr.dm @@ -115,7 +115,7 @@ if((. = ..())) if(isbelly(item_storage)) var/obj/belly/B = item_storage - . += 2 * (B.digest_brute + B.digest_burn + (B.digest_oxy)/2) + . *= 3 else . += 30 //Organs give a little more diff --git a/code/modules/xenoarcheaology/effects/vampire.dm b/code/modules/xenoarcheaology/effects/vampire.dm index cf0ae9a2466..e5a069b9351 100644 --- a/code/modules/xenoarcheaology/effects/vampire.dm +++ b/code/modules/xenoarcheaology/effects/vampire.dm @@ -30,7 +30,8 @@ DoEffectAura() /datum/artifact_effect/vampire/DoEffectAura() - nearby_mobs.Cut() + if (nearby_mobs.len) + nearby_mobs.Cut() var/turf/T = get_turf(holder) diff --git a/icons/inventory/eyes/item.dmi b/icons/inventory/eyes/item.dmi index b4ba37ad398..bcd48ade6be 100644 Binary files a/icons/inventory/eyes/item.dmi and b/icons/inventory/eyes/item.dmi differ diff --git a/icons/inventory/eyes/mob.dmi b/icons/inventory/eyes/mob.dmi index 70113e3d8c5..1d4e1fe2ca1 100644 Binary files a/icons/inventory/eyes/mob.dmi and b/icons/inventory/eyes/mob.dmi differ diff --git a/icons/inventory/face/item.dmi b/icons/inventory/face/item.dmi index 5bde3b32d46..60cb749378a 100644 Binary files a/icons/inventory/face/item.dmi and b/icons/inventory/face/item.dmi differ diff --git a/icons/inventory/face/item_vr.dmi b/icons/inventory/face/item_vr.dmi index 78230b3e597..c923555fe70 100644 Binary files a/icons/inventory/face/item_vr.dmi and b/icons/inventory/face/item_vr.dmi differ diff --git a/icons/inventory/face/mob.dmi b/icons/inventory/face/mob.dmi index fd1af6e950b..7c9363956cc 100644 Binary files a/icons/inventory/face/mob.dmi and b/icons/inventory/face/mob.dmi differ diff --git a/icons/inventory/face/mob_vr.dmi b/icons/inventory/face/mob_vr.dmi index ec49d3cdb72..fbac00cd0d1 100644 Binary files a/icons/inventory/face/mob_vr.dmi and b/icons/inventory/face/mob_vr.dmi differ diff --git a/icons/inventory/head/item.dmi b/icons/inventory/head/item.dmi index 35a07f74bf3..69c053540d8 100644 Binary files a/icons/inventory/head/item.dmi and b/icons/inventory/head/item.dmi differ diff --git a/icons/inventory/head/mob.dmi b/icons/inventory/head/mob.dmi index 1e8a6315bdd..c75e89c28aa 100644 Binary files a/icons/inventory/head/mob.dmi and b/icons/inventory/head/mob.dmi differ diff --git a/icons/inventory/suit/item.dmi b/icons/inventory/suit/item.dmi index 6390e024358..beb1f9c3a76 100644 Binary files a/icons/inventory/suit/item.dmi and b/icons/inventory/suit/item.dmi differ diff --git a/icons/inventory/suit/mob.dmi b/icons/inventory/suit/mob.dmi index 8736d3d420d..a313002203b 100644 Binary files a/icons/inventory/suit/mob.dmi and b/icons/inventory/suit/mob.dmi differ diff --git a/icons/misc/random_spawners.dmi b/icons/misc/random_spawners.dmi new file mode 100644 index 00000000000..27e55fc9ecb Binary files /dev/null and b/icons/misc/random_spawners.dmi differ diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi index 327eb3b9ced..17b80b78a5e 100644 Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ diff --git a/icons/mob/items/lefthand_balls_vr.dmi b/icons/mob/items/lefthand_balls_vr.dmi index 2f65e0969a5..70455d01c20 100644 Binary files a/icons/mob/items/lefthand_balls_vr.dmi and b/icons/mob/items/lefthand_balls_vr.dmi differ diff --git a/icons/mob/items/lefthand_guns_vr.dmi b/icons/mob/items/lefthand_guns_vr.dmi index 0d8acb4fbba..fcf529ee985 100644 Binary files a/icons/mob/items/lefthand_guns_vr.dmi and b/icons/mob/items/lefthand_guns_vr.dmi differ diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi index 75d2c9ac510..f8b95c18bce 100644 Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ diff --git a/icons/mob/items/righthand_balls_vr.dmi b/icons/mob/items/righthand_balls_vr.dmi index ba2bccac389..286540595d5 100644 Binary files a/icons/mob/items/righthand_balls_vr.dmi and b/icons/mob/items/righthand_balls_vr.dmi differ diff --git a/icons/mob/items/righthand_guns_vr.dmi b/icons/mob/items/righthand_guns_vr.dmi index 73ee95c0a3a..5554423acb8 100644 Binary files a/icons/mob/items/righthand_guns_vr.dmi and b/icons/mob/items/righthand_guns_vr.dmi differ diff --git a/icons/mob/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi index 0643fbd932e..922b153daf7 100644 Binary files a/icons/mob/vore/tails_vr.dmi and b/icons/mob/vore/tails_vr.dmi differ diff --git a/icons/obj/32x64.dmi b/icons/obj/32x64.dmi index 7b8c00eef88..493b337ad67 100644 Binary files a/icons/obj/32x64.dmi and b/icons/obj/32x64.dmi differ diff --git a/icons/obj/Cryogenic2_vr.dmi b/icons/obj/Cryogenic2_vr.dmi index 69d24bc15e8..e4b88cb6359 100644 Binary files a/icons/obj/Cryogenic2_vr.dmi and b/icons/obj/Cryogenic2_vr.dmi differ diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi index 20c744e0a0b..99362c782dc 100644 Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ diff --git a/icons/obj/atm_fieldgen.dmi b/icons/obj/atm_fieldgen.dmi new file mode 100644 index 00000000000..0c30371196a Binary files /dev/null and b/icons/obj/atm_fieldgen.dmi differ diff --git a/icons/obj/balls_vr.dmi b/icons/obj/balls_vr.dmi index 994be4ab974..e85f4cab05d 100644 Binary files a/icons/obj/balls_vr.dmi and b/icons/obj/balls_vr.dmi differ diff --git a/icons/obj/boxes.dmi b/icons/obj/boxes.dmi index 1f7e82c9600..dad29a40a2c 100644 Binary files a/icons/obj/boxes.dmi and b/icons/obj/boxes.dmi differ diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index 5b58a84313f..a52ac02d69b 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 24e8b94966f..c138e6093ee 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/food_canned.dmi b/icons/obj/food_canned.dmi index 606ca9f6e40..1a4be5b5066 100644 Binary files a/icons/obj/food_canned.dmi and b/icons/obj/food_canned.dmi differ diff --git a/icons/obj/furniture.dmi b/icons/obj/furniture.dmi index 098fc4461c8..64227b0b200 100644 Binary files a/icons/obj/furniture.dmi and b/icons/obj/furniture.dmi differ diff --git a/icons/obj/gun_vr.dmi b/icons/obj/gun_vr.dmi index 609e107845e..a623c02134b 100644 Binary files a/icons/obj/gun_vr.dmi and b/icons/obj/gun_vr.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 84fdd7be130..ededfc4b500 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/objects_vr.dmi b/icons/obj/objects_vr.dmi index 467297775f4..db7f71aef3c 100644 Binary files a/icons/obj/objects_vr.dmi and b/icons/obj/objects_vr.dmi differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index 64184432c7a..1f203a1e8f1 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 565190a6dd0..d1c5a38ff15 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index dbc403ce407..f81d8a42d6f 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/obj/tools_vr.dmi b/icons/obj/tools_vr.dmi index c49a991ff9e..05de9a423a4 100644 Binary files a/icons/obj/tools_vr.dmi and b/icons/obj/tools_vr.dmi differ diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi index 98b6c9b60f9..f9c1ce74001 100644 Binary files a/icons/obj/trash.dmi and b/icons/obj/trash.dmi differ diff --git a/icons/obj/wall_frame_bay.dmi b/icons/obj/wall_frame_bay.dmi index 628a002edb7..c3f14c5f487 100644 Binary files a/icons/obj/wall_frame_bay.dmi and b/icons/obj/wall_frame_bay.dmi differ diff --git a/icons/turf/fancy_shuttles/tether_cargo.dmi b/icons/turf/fancy_shuttles/tether_cargo.dmi new file mode 100644 index 00000000000..b65e9a0e6c7 Binary files /dev/null and b/icons/turf/fancy_shuttles/tether_cargo.dmi differ diff --git a/icons/turf/fancy_shuttles/tether_cargo_preview.dmi b/icons/turf/fancy_shuttles/tether_cargo_preview.dmi new file mode 100644 index 00000000000..48ef0cb78fa Binary files /dev/null and b/icons/turf/fancy_shuttles/tether_cargo_preview.dmi differ diff --git a/icons/turf/transit_vr.dmi b/icons/turf/transit_vr.dmi index 4b7339548ee..b4bdfc19530 100644 Binary files a/icons/turf/transit_vr.dmi and b/icons/turf/transit_vr.dmi differ diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi index e3fc2202e9b..86243a853ff 100644 Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ diff --git a/maps/gateway_archive_vr/zoo.dmm b/maps/gateway_archive_vr/zoo.dmm index 3ed7fe26f83..40a2d0ef1b4 100644 --- a/maps/gateway_archive_vr/zoo.dmm +++ b/maps/gateway_archive_vr/zoo.dmm @@ -528,8 +528,8 @@ "kh" = (/obj/machinery/vending/food,/turf/simulated/floor/tiled/white,/area/awaymission/zoo) "ki" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/holofloor/beach/sand{icon_state = "dgrass0"},/area/awaymission/zoo) "kj" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/holofloor/beach/sand{icon_state = "dgrass0"},/area/awaymission/zoo) -"kk" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/hooded/ian_costume,/turf/simulated/floor/holofloor/carpet,/area/awaymission/zoo) -"kl" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/hooded/carp_costume,/turf/simulated/floor/holofloor/carpet,/area/awaymission/zoo) +"kk" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/hooded/costume/ian,/turf/simulated/floor/holofloor/carpet,/area/awaymission/zoo) +"kl" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/hooded/costume/carp,/turf/simulated/floor/holofloor/carpet,/area/awaymission/zoo) "km" = (/obj/structure/table/rack,/obj/effect/landmark/costume,/turf/simulated/floor/holofloor/carpet,/area/awaymission/zoo) "kn" = (/obj/structure/table/rack,/obj/item/clothing/suit/chickensuit,/obj/item/clothing/head/chicken,/turf/simulated/floor/holofloor/carpet,/area/awaymission/zoo) "ko" = (/obj/structure/table/rack,/obj/item/clothing/head/sombrero,/turf/simulated/floor/holofloor/carpet,/area/awaymission/zoo) diff --git a/maps/gateway_vr/zoo.dmm b/maps/gateway_vr/zoo.dmm index 831eae8e7f3..19fa7fc4dad 100644 --- a/maps/gateway_vr/zoo.dmm +++ b/maps/gateway_vr/zoo.dmm @@ -3856,12 +3856,12 @@ /area/awaymission/zoo) "kk" = ( /obj/structure/table/rack, -/obj/item/clothing/suit/storage/hooded/ian_costume, +/obj/item/clothing/suit/storage/hooded/costume/ian, /turf/simulated/floor/holofloor/carpet, /area/awaymission/zoo) "kl" = ( /obj/structure/table/rack, -/obj/item/clothing/suit/storage/hooded/carp_costume, +/obj/item/clothing/suit/storage/hooded/costume/carp, /turf/simulated/floor/holofloor/carpet, /area/awaymission/zoo) "km" = ( diff --git a/maps/offmap_vr/talon/talon_v2.dmm b/maps/offmap_vr/talon/talon_v2.dmm index 59eb7888cad..38899fbe5ad 100644 --- a/maps/offmap_vr/talon/talon_v2.dmm +++ b/maps/offmap_vr/talon/talon_v2.dmm @@ -2562,7 +2562,7 @@ /obj/machinery/camera/network/talon{ dir = 1 }, -/obj/random/multiple/corp_crate/talon_cargo, +/obj/structure/vehiclecage/quadbike, /turf/simulated/floor/tiled/techfloor, /area/talon_v2/maintenance/wing_starboard) "hc" = ( @@ -9564,7 +9564,7 @@ /obj/machinery/camera/network/talon{ dir = 1 }, -/obj/random/multiple/corp_crate/talon_cargo, +/obj/structure/vehiclecage/quadbike, /turf/simulated/floor/tiled/techfloor, /area/talon_v2/maintenance/wing_port) "FO" = ( diff --git a/maps/southern_cross/southern_cross_jobs.dm b/maps/southern_cross/southern_cross_jobs.dm index 0903a3ac3dc..2f379dcb2e5 100644 --- a/maps/southern_cross/southern_cross_jobs.dm +++ b/maps/southern_cross/southern_cross_jobs.dm @@ -85,6 +85,7 @@ var/const/access_explorer = 43 economic_modifier = 4 access = list(access_explorer, access_research) minimal_access = list(access_explorer, access_research) + banned_job_species = list(SPECIES_ZADDAT) outfit_type = /decl/hierarchy/outfit/job/explorer2 job_description = "An Explorer searches for interesting things on the surface of Sif, and returns them to the station." @@ -108,6 +109,7 @@ var/const/access_explorer = 43 economic_modifier = 4 access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist, access_explorer) minimal_access = list(access_medical, access_medical_equip, access_morgue, access_explorer) + min_age_by_species = list(SPECIES_PROMETHEAN = 2) outfit_type = /decl/hierarchy/outfit/job/medical/sar job_description = "A Search and Rescue operative recovers individuals who are injured or dead on the surface of Sif." \ No newline at end of file diff --git a/maps/submaps/surface_submaps/wilderness/borglab.dmm b/maps/submaps/surface_submaps/wilderness/borglab.dmm index cb572dcfbed..b2865e495de 100644 --- a/maps/submaps/surface_submaps/wilderness/borglab.dmm +++ b/maps/submaps/surface_submaps/wilderness/borglab.dmm @@ -1,5 +1,15 @@ -"ac" = (/obj/machinery/light_construct{dir = 1},/mob/living/simple_mob/humanoid/merc/ranged{health = 15; maxHealth = 15},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/submap/BorgLab) +"aa" = (/obj/effect/floor_decal/techfloor/orange{dir = 1},/obj/random/maintenance,/turf/simulated/floor/reinforced,/area/submap/BorgLab) +"ab" = (/obj/effect/floor_decal/industrial/warning,/obj/effect/floor_decal/rust,/obj/random/energy,/turf/simulated/floor/plating,/area/submap/BorgLab) +"ac" = (/obj/machinery/light_construct{dir = 1},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/mob/living/simple_mob/humanoid/merc/ranged{health = 15; maxHealth = 15},/turf/simulated/floor/plating,/area/submap/BorgLab) "ad" = (/obj/effect/floor_decal/sign/c,/turf/simulated/wall/r_wall,/area/submap/BorgLab) +"ae" = (/obj/effect/floor_decal/rust/mono_rusted3,/obj/random/maintenance/research,/mob/living/simple_mob/humanoid/merc/ranged/ionrifle{health = 15; maxHealth = 15},/turf/simulated/floor/tiled,/area/submap/BorgLab) +"af" = (/obj/effect/floor_decal/rust,/obj/effect/floor_decal/rust/mono_rusted3,/obj/effect/decal/cleanable/generic,/mob/living/simple_mob/mechanical/combat_drone/lesser{faction = "corrupt"},/turf/simulated/floor/tiled,/area/submap/BorgLab) +"ag" = (/obj/effect/floor_decal/industrial/warning,/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/mob/living/simple_mob/humanoid/merc/melee/sword/poi{health = 15; maxHealth = 15},/turf/simulated/floor/tiled,/area/submap/BorgLab) +"ah" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/light/small/emergency/flicker,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/random/contraband,/turf/simulated/floor/tiled,/area/submap/BorgLab) +"ai" = (/obj/effect/floor_decal/industrial/warning,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/mob/living/simple_mob/humanoid/merc/ranged{health = 15; maxHealth = 15},/turf/simulated/floor/tiled,/area/submap/BorgLab) +"aj" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/random/energy/highend,/turf/simulated/floor/reinforced,/area/submap/BorgLab) +"ak" = (/obj/effect/floor_decal/techfloor/orange,/turf/simulated/floor/reinforced,/area/submap/BorgLab) +"al" = (/obj/effect/floor_decal/techfloor/orange,/obj/random/contraband,/turf/simulated/floor/reinforced,/area/submap/BorgLab) "bj" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/brown,/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/tiled,/area/submap/BorgLab) "bz" = (/obj/random/trash,/turf/simulated/floor/reinforced,/area/submap/BorgLab) "bE" = (/obj/structure/closet/secure_closet/chemical{locked = 0},/obj/item/weapon/storage/box/pillbottles,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/tool/screwdriver,/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/BorgLab) @@ -22,7 +32,6 @@ "gf" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/snacks/burrito_cheese,/obj/effect/floor_decal/rust,/obj/effect/floor_decal/rust,/obj/item/weapon/cell/super/empty,/turf/simulated/floor/tiled,/area/submap/BorgLab) "gh" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/light_construct{dir = 1},/turf/simulated/floor/tiled,/area/submap/BorgLab) "gN" = (/obj/structure/window/reinforced/tinted/frosted{dir = 4},/obj/random/junk,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating,/area/submap/BorgLab) -"gS" = (/obj/effect/floor_decal/rust/mono_rusted3,/mob/living/simple_mob/humanoid/merc/ranged/ionrifle{health = 15; maxHealth = 15},/obj/random/maintenance/research,/turf/simulated/floor/tiled,/area/submap/BorgLab) "he" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/item/weapon/material/shard{pixel_x = 6; pixel_y = -6},/obj/machinery/door/blast/regular{dir = 8; id = "borg"; layer = 3.3; name = "Containment Door"},/turf/simulated/floor/plating,/area/submap/BorgLab) "hW" = (/obj/machinery/door/airlock/maintenance/common,/turf/simulated/floor/tiled/techmaint,/area/submap/BorgLab) "ic" = (/obj/structure/window/reinforced/tinted/frosted{dir = 4},/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/BorgLab) @@ -39,7 +48,6 @@ "lz" = (/obj/machinery/light_switch,/turf/simulated/wall/r_wall,/area/submap/BorgLab) "lJ" = (/obj/effect/floor_decal/rust,/obj/structure/sink{dir = 4; pixel_x = 11},/obj/machinery/light/small/emergency/flicker{dir = 1},/turf/simulated/floor/plating,/area/submap/BorgLab) "lU" = (/obj/machinery/chem_master,/obj/effect/floor_decal/rust/mono_rusted3,/turf/simulated/floor/tiled,/area/submap/BorgLab) -"lZ" = (/obj/effect/floor_decal/industrial/warning,/obj/effect/floor_decal/rust,/mob/living/simple_mob/humanoid/merc/melee/sword/poi{health = 15; maxHealth = 15},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/BorgLab) "ma" = (/obj/effect/floor_decal/sign/b,/turf/simulated/wall/r_wall,/area/submap/BorgLab) "mf" = (/obj/machinery/door/airlock/maintenance/common,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techmaint,/area/submap/BorgLab) "mi" = (/obj/structure/closet/radiation,/obj/random/maintenance,/obj/random/maintenance,/obj/random/maintenance,/obj/effect/floor_decal/rust/color_rustedcee,/turf/simulated/floor/tiled,/area/submap/BorgLab) @@ -51,7 +59,6 @@ "ne" = (/obj/machinery/door/window/brigdoor/westright{dir = 1; name = "Containment Pen"; req_one_access = list(43,1)},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{dir = 8; id = "borg"; layer = 3.3; name = "Containment Door"},/turf/simulated/floor/plating,/area/submap/BorgLab) "nk" = (/obj/effect/floor_decal/rust,/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating,/area/submap/BorgLab) "ny" = (/obj/structure/curtain/open/shower,/obj/effect/floor_decal/borderfloor/cee{dir = 4},/obj/effect/floor_decal/rust,/obj/machinery/shower{dir = 4; pixel_x = 5},/turf/simulated/floor/tiled,/area/submap/BorgLab) -"nV" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/light/small/emergency/flicker,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/BorgLab) "nW" = (/obj/effect/floor_decal/rust,/obj/structure/table,/obj/effect/floor_decal/rust/mono_rusted3,/turf/simulated/floor/tiled,/area/submap/BorgLab) "oa" = (/obj/effect/floor_decal/industrial/warning,/obj/item/weapon/material/shard{pixel_x = 6; pixel_y = -6},/turf/simulated/floor/tiled,/area/submap/BorgLab) "op" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/effect/decal/cleanable/generic,/turf/simulated/floor/reinforced,/area/submap/BorgLab) @@ -113,7 +120,6 @@ "GA" = (/obj/machinery/door/airlock/maintenance/common,/turf/simulated/floor/plating,/area/submap/BorgLab) "GC" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/BorgLab) "GS" = (/obj/item/stack/material/gold{amount = 25},/turf/simulated/floor/reinforced,/area/submap/BorgLab) -"HA" = (/obj/effect/floor_decal/techfloor/orange,/obj/random/single,/turf/simulated/floor/reinforced,/area/submap/BorgLab) "Ic" = (/obj/random/trash,/mob/living/simple_mob/mechanical/mecha/ripley/deathripley,/turf/simulated/floor/reinforced,/area/submap/BorgLab) "Jd" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/reinforced,/area/submap/BorgLab) "Jh" = (/obj/effect/floor_decal/rust,/obj/item/weapon/material/shard,/obj/effect/floor_decal/rust/mono_rusted3,/obj/random/trash,/turf/simulated/floor/tiled,/area/submap/BorgLab) @@ -123,12 +129,10 @@ "Jr" = (/obj/effect/floor_decal/techfloor/orange{dir = 1},/mob/living/simple_mob/mechanical/viscerator/mercenary,/mob/living/simple_mob/mechanical/viscerator/mercenary,/turf/simulated/floor/reinforced,/area/submap/BorgLab) "JZ" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/railing{dir = 1},/turf/simulated/floor/tiled,/area/submap/BorgLab) "KH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/weapon/material/shard{pixel_y = 10},/obj/item/weapon/material/shard{pixel_x = 6; pixel_y = -6},/obj/effect/decal/cleanable/generic,/obj/machinery/door/blast/regular/open{dir = 4},/turf/simulated/floor/plating,/area/submap/BorgLab) -"KX" = (/obj/effect/floor_decal/techfloor/orange{dir = 1},/obj/random/single,/turf/simulated/floor/reinforced,/area/submap/BorgLab) "Lr" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille/broken,/obj/item/weapon/material/shard{pixel_x = -3; pixel_y = -6},/obj/item/weapon/material/shard{pixel_y = 10},/obj/machinery/door/blast/regular{dir = 8; id = "borg"; layer = 3.3; name = "Containment Door"},/turf/simulated/floor/plating,/area/submap/BorgLab) "Lz" = (/obj/structure/table/standard,/obj/effect/floor_decal/rust,/obj/effect/floor_decal/rust,/obj/random/trash,/obj/random/maintenance/research,/turf/simulated/floor/tiled,/area/submap/BorgLab) "LB" = (/obj/item/stack/material/phoron{amount = 10},/obj/random/toolbox,/obj/random/toolbox,/obj/item/weapon/storage/box/lights/mixed,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/item/stack/material/phoron{amount = 10},/obj/structure/table/rack,/turf/simulated/floor/plating,/area/submap/BorgLab) "LC" = (/obj/effect/gibspawner/human,/mob/living/simple_mob/mechanical/mecha/odysseus/murdysseus{faction = "corrupt"},/turf/simulated/floor/reinforced,/area/submap/BorgLab) -"LL" = (/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/random/single,/turf/simulated/floor/plating,/area/submap/BorgLab) "MT" = (/obj/machinery/space_heater,/obj/effect/floor_decal/rust,/obj/machinery/light/small/emergency/flicker{dir = 4},/turf/simulated/floor/tiled,/area/submap/BorgLab) "Nb" = (/obj/effect/floor_decal/industrial/warning,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/tiled,/area/submap/BorgLab) "Nj" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/submap/BorgLab) @@ -144,8 +148,6 @@ "OH" = (/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular/open{dir = 4},/turf/simulated/floor/plating,/area/submap/BorgLab) "OW" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/obj/effect/floor_decal/techfloor/orange{dir = 1},/obj/item/weapon/broken_gun/laserrifle,/turf/simulated/floor/reinforced,/area/submap/BorgLab) "Pf" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/effect/decal/cleanable/generic,/turf/simulated/floor/tiled,/area/submap/BorgLab) -"Pk" = (/obj/effect/floor_decal/industrial/warning,/obj/effect/floor_decal/rust,/obj/random/single,/turf/simulated/floor/plating,/area/submap/BorgLab) -"PW" = (/obj/effect/floor_decal/industrial/warning,/mob/living/simple_mob/humanoid/merc/ranged{health = 15; maxHealth = 15},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/BorgLab) "Qe" = (/obj/effect/map_effect/interval/sound_emitter/energy_gunfight,/turf/simulated/floor/plating,/area/submap/BorgLab) "Qg" = (/turf/simulated/mineral/ignore_mapgen,/area/template_noop) "Qn" = (/obj/structure/window/reinforced/tinted/frosted{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/BorgLab) @@ -162,7 +164,6 @@ "SZ" = (/obj/effect/floor_decal/techfloor/orange,/obj/structure/loot_pile/surface/bones,/turf/simulated/floor/reinforced,/area/submap/BorgLab) "Tj" = (/obj/structure/table/standard,/obj/machinery/chemical_dispenser/full,/turf/simulated/floor/tiled,/area/submap/BorgLab) "Tp" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating,/area/submap/BorgLab) -"Tt" = (/mob/living/simple_mob/mechanical/combat_drone/lesser{faction = "corrupt"},/obj/effect/floor_decal/rust,/obj/effect/floor_decal/rust/mono_rusted3,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/tiled,/area/submap/BorgLab) "Tv" = (/obj/effect/floor_decal/sign/a,/turf/simulated/wall/r_wall,/area/submap/BorgLab) "TD" = (/obj/effect/floor_decal/techfloor/orange{dir = 1},/turf/simulated/floor/reinforced,/area/submap/BorgLab) "TN" = (/obj/structure/closet/l3closet/virology,/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/submap/BorgLab) @@ -184,7 +185,6 @@ "WK" = (/obj/effect/floor_decal/rust,/obj/effect/floor_decal/rust,/obj/item/weapon/broken_gun/laser_retro,/mob/living/simple_mob/mechanical/viscerator/mercenary,/mob/living/simple_mob/mechanical/viscerator/mercenary,/turf/simulated/floor/plating,/area/submap/BorgLab) "WQ" = (/turf/simulated/wall/r_wall,/area/submap/BorgLab) "WR" = (/obj/effect/floor_decal/rust,/obj/effect/floor_decal/industrial/warning/cee{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/BorgLab) -"XD" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/random/single,/turf/simulated/floor/reinforced,/area/submap/BorgLab) "XG" = (/obj/effect/floor_decal/rust,/obj/effect/floor_decal/rust/mono_rusted3,/obj/effect/gibspawner/human,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/tiled,/area/submap/BorgLab) "Yk" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/submap/BorgLab) "Yy" = (/obj/structure/table/steel,/obj/item/weapon/coin/phoron,/obj/item/weapon/storage/toolbox/syndicate/powertools,/obj/effect/floor_decal/rust,/obj/effect/floor_decal/rust,/obj/random/maintenance/research,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/submap/BorgLab) @@ -206,17 +206,17 @@ DFDFsrQgWQWQWQWQWQWQQgQgQgQgQgDFQgQgQgDFQgQgQgiYbLbLbLRPDqsrDFDF DFDFsrQgWQpYtrYyLBWQQgQgQgQgQgQgQgQgQgQgQgQgQgRGRGRGDqDqDqDFDFDF DFsrQgQgWQVHTUOqCzWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQRGRGDqRPDFDFDF DFDFQgWQWQWQWQGAWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQRGRGDqDFDFDF -DFDFQgWQmiUjQWQnDvWQKXxzOWWQuXTDNjWQmwTDbYWQpeWKJrWQWQRGRGDFDFDF +DFDFQgWQmiUjQWQnDvWQaaxzOWWQuXTDNjWQmwTDbYWQpeWKJrWQWQRGRGDFDFDF DFQgQgWQrPZayISycCWQjfLCnkWQTWGzuQWQTUyBtxWQWhxOWqWQWQWQRGQgDFDF -srQgQgWQtagfbjicUzWQVcJpPkWQUVVcUMWQVcODVcWQyzububWQsKWQWQQgDFDF +srQgQgWQtagfbjicUzWQVcJpabWQUVVcUMWQVcODVcWQyzububWQsKWQWQQgDFDF DFQgQgWQNsZOCAgNWQWQbIugOHWQYDwtyqWQYDmBYDWQJomBYDlzWQWQWQWQWQDF srQgWQWQZtmfNCWQWQeVRLejPfghyRrarOiiAsAsifacGCVriSNtWQnylJWQZcsr -QgQgWQTjlUCANqOzhWzkNjXGnWLzFvgSJhTttyCSCXththBlYkNvkIYZWRmsQesr -QgQgWQDjkjktdTUyZtJZlZnbLLnVFtJmYkPWddoaNbQsFjqWVhSGWQTNDsWQgcDF +QgQgWQTjlUCANqOzhWzkNjXGnWLzFvaeJhaftyCSCXththBlYkNvkIYZWRmsQesr +QgQgWQDjkjktdTUyZtJZagnbYZahFtJmYkaiddoaNbQsFjqWVhSGWQTNDsWQgcDF QgWQxkCfYkfhGyMTWQWQYDneYDcALrneheadUWdKOHmaKHZqtXTvWQWQWQWQWQDF -QgWQjzRtFuZyDWxUqaWQJdXDVUWQJdRLopWQgaTpopWQNBopJdWQqWWQWQQgDFDF +QgWQjzRtFuZyDWxUqaWQJdajVUWQJdRLopWQgaTpopWQNBopJdWQqWWQWQQgDFDF QgWQxkxubNdebEZnwqWQtxIctxWQGSBqtxWQbzAItxWQNjxhtxWQWQWQQgDFDFDF -QgQgWQWQWQWQWQWQWQWQSuNjjRWQSZNjcZWQHANjmEWQQzSZHAWQWQRGQgDFDFDF +QgQgWQWQWQWQWQWQWQWQSuNjjRWQSZNjcZWQakNjmEWQQzSZalWQWQRGQgDFDFDF DFQgQgRGRGRGRGRGRGWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQRGRGDFsrDFDF DFsrQgRGRGRGRGRGRGRGWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQRGRGRGRPDFsrDF DFDFDFRGRGRGiYbLRGRGRGRGRGRGRGRGRGRGRGRGRGRGRGRGRGRGzebLRPDFDFDF diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index 540c229e9ab..951d8f01f22 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -2812,6 +2812,18 @@ dir = 10 }, /obj/effect/floor_decal/steeldecal/steel_decals4, +/obj/effect/floor_decal/borderfloor{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 4 + }, +/obj/effect/floor_decal/borderfloor/corner2{ + dir = 5 + }, +/obj/effect/floor_decal/corner/paleblue/bordercorner2{ + dir = 5 + }, /turf/simulated/floor/tiled, /area/tether/surfacebase/lowernorthhall) "aeE" = ( @@ -3324,9 +3336,6 @@ /obj/effect/floor_decal/corner/paleblue/border{ dir = 5 }, -/obj/effect/floor_decal/borderfloor/corner2{ - dir = 5 - }, /obj/effect/floor_decal/borderfloor/corner2{ dir = 4 }, @@ -3545,6 +3554,11 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, /turf/simulated/floor/tiled, /area/tether/surfacebase/lowernorthhall) "afN" = ( @@ -3557,6 +3571,11 @@ /obj/machinery/door/firedoor/glass/hidden/steel{ dir = 8 }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, /turf/simulated/floor/tiled, /area/tether/surfacebase/lowernorthhall) "afO" = ( @@ -17217,21 +17236,9 @@ /turf/simulated/floor/tiled, /area/rnd/hallway) "aCg" = ( -/obj/effect/floor_decal/borderfloor{ - dir = 4 - }, -/obj/effect/floor_decal/corner/paleblue/border{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/floor_decal/borderfloor/corner2{ - dir = 6 - }, -/obj/effect/floor_decal/corner/paleblue/bordercorner2{ - dir = 6 - }, /obj/effect/floor_decal/steeldecal/steel_decals7{ dir = 9 }, @@ -31826,6 +31833,16 @@ /obj/effect/floor_decal/corner/red/border, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/lowerhall) +"ctE" = ( +/obj/structure/table/rack, +/obj/item/weapon/tank/emergency, +/obj/item/weapon/tank/emergency, +/obj/item/weapon/tank/emergency, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "cwS" = ( /obj/effect/floor_decal/borderfloor{ dir = 1 @@ -32103,6 +32120,20 @@ }, /turf/simulated/floor/plating, /area/tether/surfacebase/funny/hideyhole) +"dvU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/tiled, +/area/tether/surfacebase/lowernorthhall) "dxY" = ( /obj/structure/table/rack, /obj/item/clothing/mask/gas, @@ -32210,6 +32241,12 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/lowerhall) +"dNE" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "dNP" = ( /obj/machinery/door/airlock/silver{ name = "Clown's Office"; @@ -32500,6 +32537,10 @@ }, /turf/simulated/floor/tiled/dark, /area/tether/surfacebase/security/weaponsrange) +"eJc" = ( +/obj/item/weapon/storage/toolbox/brass, +/turf/simulated/floor/plating, +/area/maintenance/lowmedbaymaint) "eJQ" = ( /obj/machinery/door/firedoor/glass, /obj/machinery/door/blast/regular{ @@ -32713,6 +32754,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pie, /obj/item/weapon/pen/crayon/marker/rainbow, /obj/item/weapon/pen/crayon/rainbow, +/obj/item/clothing/mask/emotions, /obj/structure/closet/secure_closet{ desc = "Where the Clown keeps their hooliganisms."; name = "funny locker"; @@ -34021,6 +34063,12 @@ }, /turf/simulated/floor/tiled, /area/rnd/hallway) +"jkI" = ( +/obj/structure/table/rack/shelf, +/obj/random/maintenance/cargo, +/obj/random/maintenance/cargo, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "jnj" = ( /obj/effect/floor_decal/borderfloor, /obj/effect/floor_decal/corner/lightgrey/border, @@ -34983,6 +35031,14 @@ "lEA" = ( /turf/simulated/wall, /area/maintenance/engineering/atmos/airlock/gas) +"lEB" = ( +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "lIj" = ( /obj/effect/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled/dark, @@ -35399,6 +35455,12 @@ /obj/effect/floor_decal/steeldecal/steel_decals7{ dir = 10 }, +/obj/effect/floor_decal/borderfloor/corner2{ + dir = 6 + }, +/obj/effect/floor_decal/corner/paleblue/bordercorner2{ + dir = 6 + }, /turf/simulated/floor/tiled, /area/tether/surfacebase/lowernorthhall) "mGP" = ( @@ -36680,6 +36742,24 @@ }, /turf/simulated/floor/tiled/dark, /area/tether/surfacebase/security/lowerhall) +"qtC" = ( +/obj/effect/floor_decal/borderfloor{ + dir = 1 + }, +/obj/effect/floor_decal/corner/lightgrey/border{ + dir = 1 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/tether/surfacebase/lowernorthhall) "qtU" = ( /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ dir = 5 @@ -36729,6 +36809,16 @@ }, /turf/simulated/floor/plating, /area/tether/surfacebase/funny/clownoffice) +"qJe" = ( +/obj/structure/table/rack/shelf, +/obj/random/maintenance/cargo, +/obj/random/maintenance/cargo, +/obj/random/maintenance/cargo, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "qJl" = ( /obj/machinery/door/airlock/maintenance/common, /obj/machinery/door/firedoor/glass, @@ -37019,6 +37109,13 @@ /obj/item/weapon/bedsheet/mimedouble, /turf/simulated/floor/carpet/bcarpet, /area/tether/surfacebase/funny/mimeoffice) +"rtV" = ( +/obj/random/maintenance/medical, +/obj/structure/table/rack, +/obj/random/maintenance/cargo, +/obj/effect/floor_decal/rust, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "ruj" = ( /obj/machinery/door/airlock/silver{ name = "Mime's Office"; @@ -37363,6 +37460,10 @@ }, /turf/simulated/floor/lino, /area/crew_quarters/visitor_dining) +"syt" = ( +/obj/effect/floor_decal/rust, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "szT" = ( /obj/effect/floor_decal/borderfloor/corner{ dir = 1 @@ -37421,6 +37522,13 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/surface_one_hall) +"sGh" = ( +/obj/structure/table/rack/shelf, +/obj/random/maintenance/medical, +/obj/random/maintenance/medical, +/obj/random/maintenance/cargo, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "sHK" = ( /obj/structure/cable/green{ d1 = 4; @@ -37531,6 +37639,10 @@ }, /turf/simulated/floor/tiled/dark, /area/tether/surfacebase/security/brig/storage) +"sYi" = ( +/obj/effect/decal/remains/human, +/turf/simulated/floor/plating, +/area/maintenance/lowmedbaymaint) "tak" = ( /obj/structure/table/steel, /obj/structure/cable/green{ @@ -37547,6 +37659,10 @@ /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/brig) +"tcK" = ( +/obj/item/clothing/suit/storage/hooded/wintercoat/ratvar, +/turf/simulated/floor/plating, +/area/maintenance/lowmedbaymaint) "tdg" = ( /turf/simulated/mineral, /area/maintenance/lowmedbaymaint) @@ -37648,6 +37764,20 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/lowerhall) +"tAo" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled, +/area/tether/surfacebase/lowernorthhall) "tAT" = ( /obj/effect/floor_decal/borderfloor{ dir = 9 @@ -37909,6 +38039,16 @@ }, /turf/simulated/floor, /area/tether/surfacebase/security/gasstorage) +"ucq" = ( +/obj/machinery/door/airlock/maintenance/common, +/obj/machinery/door/firedoor/glass, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/steel_dirty, +/area/tether/surfacebase/lowernorthhall) "ucv" = ( /obj/machinery/door/firedoor/glass, /obj/machinery/door/airlock/glass_security{ @@ -37926,6 +38066,10 @@ }, /turf/simulated/floor/tiled/dark, /area/tether/surfacebase/security/lowerhall) +"udU" = ( +/obj/effect/floor_decal/rust, +/turf/simulated/floor/plating, +/area/maintenance/lowmedbaymaint) "uge" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -38460,6 +38604,18 @@ }, /turf/simulated/wall, /area/maintenance/substation/surfaceservicesubstation) +"wjd" = ( +/obj/effect/floor_decal/rust, +/obj/machinery/power/apc{ + dir = 4; + name = "east bump"; + pixel_x = 28 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "wjo" = ( /obj/effect/map_helper/airlock/door/ext_door, /obj/machinery/door/blast/regular{ @@ -38767,6 +38923,9 @@ }, /turf/simulated/floor/tiled/freezer, /area/tether/surfacebase/security/brig/bathroom) +"xfm" = ( +/turf/simulated/floor/tiled/steel_dirty, +/area/maintenance/lowmedbaymaint) "xgQ" = ( /obj/effect/floor_decal/borderfloor{ dir = 1 @@ -50425,9 +50584,9 @@ aAD aAD aAD aAD -aAI -aAI -aAI +sGh +qJe +jkI aef aeZ afN @@ -50564,15 +50723,15 @@ aaf aaf aaf aAD -aAI -aAI -aAI -aAI -aAI -aAI +udU +sYi +aAD +xfm +syt +xfm aef aeS -afO +tAo aBB aCr aDa @@ -50706,15 +50865,15 @@ aaf aaf aaf aAD +tcK aAI -aAI -aAI -aAI -aAI -aAI -aef -aeS -afO +aAD +rtV +ctE +lEB +ucq +qtC +dvU aBC aCr aDb @@ -50848,12 +51007,12 @@ aag aaf aaf aAD -aAI -aAI -aAI -aAI -aAI -aAI +eJc +udU +aAD +syt +dNE +wjd aef afi afQ @@ -52706,7 +52865,7 @@ aeD aCg mGH aDH -mGH +adx aEX aFv aGw diff --git a/maps/tether/tether_things.dm b/maps/tether/tether_things.dm index 037ea6cb3bf..f187141ac1c 100644 --- a/maps/tether/tether_things.dm +++ b/maps/tether/tether_things.dm @@ -473,6 +473,5 @@ var/global/list/latejoin_tram = list() prob_fall = 50 mobs_to_pick_from = list( /mob/living/simple_mob/animal/passive/gaslamp = 300, - /mob/living/simple_mob/animal/space/goose/virgo3b = 100, - /mob/living/simple_mob/vore/alienanimals/teppi = 5 + /mob/living/simple_mob/vore/alienanimals/teppi = 4 ) diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index 7eb677df5ee..48a8963e367 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -216,14 +216,9 @@ var/list/all_maps = list() // Get a list of 'nearby' or 'connected' zlevels. // You should at least return a list with the given z if nothing else. /datum/map/proc/get_map_levels(var/srcz, var/long_range = FALSE, var/om_range = -1) - //Overmap behavior - if(use_overmap) - //Get what sector we're in - var/obj/effect/overmap/visitable/O = get_overmap_sector(srcz) - if(!istype(O)) - //Anything in multiz then (or just themselves) - return GetConnectedZlevels(srcz) - + //Get what sector we're in + var/obj/effect/overmap/visitable/O = get_overmap_sector(srcz) + if(istype(O)) //Just the sector we're in if(om_range == -1) return O.map_z.Copy() @@ -236,7 +231,7 @@ var/list/all_maps = list() connections += V.map_z // Adding list to list adds contents return connections - //Traditional behavior + //Traditional behavior, if not in an overmap sector else //If long range, and they're at least in contact levels, return contact levels. if (long_range && (srcz in contact_levels)) diff --git a/sound/weapons/dodgeball.ogg b/sound/weapons/dodgeball.ogg new file mode 100644 index 00000000000..3e76dcdfc8f Binary files /dev/null and b/sound/weapons/dodgeball.ogg differ diff --git a/tgui/packages/tgui/interfaces/VorePanel.js b/tgui/packages/tgui/interfaces/VorePanel.js index a59eb27941c..e3d5c3421f7 100644 --- a/tgui/packages/tgui/interfaces/VorePanel.js +++ b/tgui/packages/tgui/interfaces/VorePanel.js @@ -151,42 +151,32 @@ const VoreSelectedBelly = (props, context) => { const { act } = useBackend(context); const { belly } = props; - const { - belly_name, - is_wet, - wet_loop, - mode, - item_mode, - verb, - desc, - fancy, - sound, - release_sound, - can_taste, - nutrition_percent, - digest_brute, - digest_burn, - digest_oxy, - bulge_size, - display_absorbed_examine, - shrink_grow_size, - emote_time, - emote_active, - addons, - contaminates, - contaminate_flavor, - contaminate_color, - egg_type, - escapable, - interacts, - contents, - belly_fullscreen, - possible_fullscreens, - disable_hud, - } = belly; + const { contents } = belly; const [tabIndex, setTabIndex] = useLocalState(context, 'tabIndex', 0); + const tabs = []; + + tabs[0] = ( + + ); + + tabs[1] = ( + + ); + + tabs[2] = ( + + ); + + tabs[3] = ( + + ); + + tabs[4] = ( + + ); + return ( @@ -206,342 +196,301 @@ const VoreSelectedBelly = (props, context) => { Belly Styles - {tabIndex === 0 && ( + {tabs[tabIndex] || "Error"} + + ); +}; + +const VoreSelectedBellyControls = (props, context) => { + const { act } = useBackend(context); + + const { belly } = props; + const { + belly_name, + mode, + item_mode, + verb, + desc, + addons, + } = belly; + + return ( + + + - {Object.keys(possible_fullscreens).map(key => ( - - ))} - - - ) || "Error"} - + onClick={() => act("set_attribute", { attribute: "b_wetness" })} + icon={is_wet ? "toggle-on" : "toggle-off"} + selected={is_wet} + content={is_wet ? "Yes" : "No"} /> + + + + {Object.keys(possible_fullscreens).map(key => ( + + ))} + + + ); +}; + const VoreUserPreferences = (props, context) => { const { act, data } = useBackend(context); @@ -644,6 +702,216 @@ const VoreUserPreferences = (props, context) => { show_pictures, } = data; + const preferences = { + digestion: { + action: "toggle_digest", + test: digestable, + tooltip: { + main: "This button is for those who don't like being digested. It can make you undigestable.", + enable: "Click here to allow digestion.", + disable: "Click here to prevent digestion.", + }, + content: { + enabled: "Digestion Allowed", + disabled: "No Digestion", + }, + }, + absorbable: { + action: "toggle_absorbable", + test: absorbable, + tooltip: { + main: "This button allows preds to know whether you prefer or don't prefer to be absorbed.", + enable: "Click here to allow being absorbed.", + disable: "Click here to disallow being absorbed.", + }, + content: { + enabled: "Absorption Allowed", + disabled: "No Absorption", + }, + }, + devour: { + action: "toggle_devour", + test: devourable, + tooltip: { + main: "This button is to toggle your ability to be devoured by others.", + enable: "Click here to allow being devoured.", + disable: "Click here to prevent being devoured.", + }, + content: { + enabled: "Devouring Allowed", + disabled: "No Devouring", + }, + }, + mobvore: { + action: "toggle_mobvore", + test: allowmobvore, + tooltip: { + main: "This button is for those who don't like being eaten by mobs.", + enable: "Click here to allow being eaten by mobs.", + disable: "Click here to prevent being eaten by mobs.", + }, + content: { + enabled: "Mobs eating you allowed", + disabled: "No Mobs eating you", + }, + }, + feed: { + action: "toggle_feed", + test: feeding, + tooltip: { + main: "This button is to toggle your ability to be fed to or by others vorishly.", + enable: "Click here to allow being fed to/by other people.", + disable: "Click here to prevent being fed to/by other people.", + }, + content: { + enabled: "Feeding Allowed", + disabled: "No Feeding", + }, + }, + healbelly: { + action: "toggle_healbelly", + test: permit_healbelly, + tooltip: { + main: "This button is for those who don't like healbelly used on them as a mechanic." + + " It does not affect anything, but is displayed under mechanical prefs for ease of quick checks.", + enable: "Click here to allow being heal-bellied.", + disable: "Click here to prevent being heal-bellied.", + }, + content: { + enabled: "Heal-bellies Allowed", + disabled: "No Heal-bellies", + }, + }, + dropnom_prey: { + action: "toggle_dropnom_prey", + test: can_be_drop_prey, + tooltip: { + main: "This toggle is for spontaneous, environment related vore" + + " as prey, including drop-noms, teleporters, etc.", + enable: "Click here to allow being spontaneous prey.", + disable: "Click here to prevent being spontaneous prey.", + }, + content: { + enabled: "Spontaneous Prey Enabled", + disabled: "Spontaneous Prey Disabled", + }, + }, + dropnom_pred: { + action: "toggle_dropnom_pred", + test: can_be_drop_pred, + tooltip: { + main: "This toggle is for spontaneous, environment related vore" + + " as a predator, including drop-noms, teleporters, etc.", + enable: "Click here to allow being spontaneous pred.", + disable: "Click here to prevent being spontaneous pred.", + }, + content: { + enabled: "Spontaneous Pred Enabled", + disabled: "Spontaneous Pred Disabled", + }, + }, + noisy: { + action: "toggle_noisy", + test: noisy, + tooltip: { + main: "Toggle audible hunger noises.", + enable: "Click here to turn on hunger noises.", + disable: "Click here to turn off hunger noises.", + }, + content: { + enabled: "Hunger Noises Enabled", + disabled: "Hunger Noises Disabled", + }, + }, + resize: { + action: "toggle_resize", + test: resizable, + tooltip: { + main: "This button is to toggle your ability to be resized by others.", + enable: "Click here to allow being resized.", + disable: "Click here to prevent being resized.", + }, + content: { + enabled: "Resizing Allowed", + disabled: "No Resizing", + }, + }, + steppref: { + action: "toggle_steppref", + test: step_mechanics_active, + tooltip: { + main: "", + enable: "You will not participate in step mechanics." + + " Click to enable step mechanics.", + disable: "This setting controls whether or not you participate in size-based step mechanics." + + " Includes both stepping on others, as well as getting stepped on. Click to disable step mechanics.", + }, + content: { + enabled: "Step Mechanics Enabled", + disabled: "Step Mechanics Disabled", + }, + }, + vore_fx: { + action: "toggle_fx", + test: show_vore_fx, + tooltip: { + main: "", + enable: "Regardless of Predator Setting, you will not see their FX settings." + + " Click this to enable showing FX.", + disable: "This setting controls whether or not a pred is allowed to mess with your HUD and fullscreen overlays." + + " Click to disable all FX.", + }, + content: { + enabled: "Show Vore FX", + disabled: "Do Not Show Vore FX", + }, + }, + remains: { + action: "toggle_leaveremains", + test: digest_leave_remains, + tooltip: { + main: "", + enable: "Regardless of Predator Setting, you will not leave remains behind." + + " Click this to allow leaving remains.", + disable: "Your Predator must have this setting enabled in their belly modes to allow remains to show up," + + " if they do not, they will not leave your remains behind, even with this on. Click to disable remains.", + }, + content: { + enabled: "Allow Leaving Remains", + disabled: "Do Not Allow Leaving Remains", + }, + }, + pickuppref: { + action: "toggle_pickuppref", + test: pickup_mechanics_active, + tooltip: { + main: "", + enable: "You will not participate in pick-up mechanics." + + " Click this to allow picking up/being picked up.", + disable: "Allows macros to pick you up into their hands, and you to pick up micros." + + " Click to disable pick-up mechanics.", + }, + content: { + enabled: "Pick-up Mechanics Enabled", + disabled: "Pick-up Mechanics Disabled", + }, + }, + spontaneous_tf: { + action: "toggle_allow_spontaneous_tf", + test: allow_spontaneous_tf, + tooltip: { + main: "This toggle is for spontaneous or environment related transformation" + + " as a victim, such as via chemicals.", + enable: "Click here to allow being spontaneously transformed.", + disable: "Click here to disable being spontaneously transformed.", + }, + content: { + enabled: "Spontaneous TF Enabled", + disabled: "Spontaneous TF Disabled", + }, + }, + }; + return (
act("show_pictures")}> @@ -652,189 +920,49 @@ const VoreUserPreferences = (props, context) => { }> -
); }; + +const VoreUserPreferenceItem = (props, context) => { + const { act } = useBackend(context); + + const { spec, ...rest } = props; + const { + action, + test, + tooltip, + content, + } = spec; + + return ( +