diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 128a1b8ca85..8a5920a45a9 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -66,6 +66,9 @@ GLOBAL_VAR(command_name) new_station_name = name + " " name = "" + if(prob(1)) + random = 999999999 //ridiculously long name in written numbers + // Prefix var/holiday_name = pick(SSevents.holidays) if(holiday_name) @@ -94,9 +97,11 @@ GLOBAL_VAR(command_name) if(4) new_station_name += pick(GLOB.phonetic_alphabet) if(5) - new_station_name += pick(GLOB.numbers_as_words) + new_station_name += convert_integer_to_words(rand(-1,99), capitalise = TRUE) if(13) new_station_name += pick("13","XIII","Thirteen") + if(999999999) + new_station_name = "Space Station " + convert_integer_to_words(rand(111111111,999999999), capitalise = TRUE) return new_station_name /proc/syndicate_name() diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 22fbc40bf86..6d7283f23f0 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -810,6 +810,113 @@ GLOBAL_LIST_INIT(binary, list("0","1")) else return "[number]\th" +/** + * Takes a 1, 2 or 3 digit number and returns it in words. Don't call this directly, use convert_integer_to_words() instead. + * + * Arguments: + * * number - 1, 2 or 3 digit number to convert. + * * carried_string - Text to append after number is converted to words, e.g. "million", as in "eighty million". + * * capitalise - Whether the number it returns should be capitalised or not, e.g. "Eighty-Eight" vs. "eighty-eight". + */ +/proc/int_to_words(number, carried_string, capitalise = FALSE) + var/static/list/tens = list("", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety") + var/static/list/ones = list("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen") + number = round(number) + + if(number > 999) + return + + if(number <= 0) + return + + var/list/string = list() + + if(number >= 100) + string += int_to_words(number / 100, "hundred") + number = round(number % 100) + if(!number) + return string + carried_string + string += "and" + + //if number is more than 19, divide it + if(number > 19) + var/temp_num = tens[number / 10] + if(number % 10) + temp_num += "-" + if(capitalise) + temp_num += capitalize(ones[number % 10]) + else + temp_num += ones[number % 10] + string += temp_num + else + string += ones[number] + + if(carried_string) + string += carried_string + + return string + +/** + * Takes an integer up to 999,999,999 and returns it in words. Works with negative numbers and 0. + * + * Arguments: + * * number - Integer up to 999,999,999 to convert. + * * capitalise - Whether the number it returns should be capitalised or not, e.g. "Eighty Million" vs. "eighty million". + */ +/proc/convert_integer_to_words(number, capitalise = FALSE) + + if(!isnum(number)) + return + + var/negative = FALSE + if(number < 0) + number = abs(number) + negative = TRUE + + number = round(number) + + if(number > 999999999) + return negative ? -number : number + + if(number == 0) + return capitalise ? "Zero" : "zero" + + //stores word representation of given number + var/list/output = list() + + //handles millions + var/millions = int_to_words(((number / 1000000) % 1000), "million", capitalise) + if(length(millions)) + output += millions + + ///handles thousands + var/thousands = int_to_words(((number / 1000) % 1000), "thousand", capitalise) + if(length(thousands)) + output += thousands + + if(length(output) && number % 1000 && (number % 1000) < 100) //e.g. One Thousand And Ninety-Nine, instead of One Thousand Ninety-Nine + output += "and" + + //handles digits at ones, tens and hundreds places (if any) + output += int_to_words((number % 1000), "", capitalise) + + for(var/index in 1 to length(output)) + if(isnull(output[index])) + output -= output[index] + continue + if(capitalise) + output[index] = capitalize(output[index]) + + if(!length(output)) + return negative ? -number : number + + var/number_in_words + if(negative) + number_in_words += capitalise ? "Negative " : "negative " + + number_in_words += output.Join(" ") + + return number_in_words /proc/random_capital_letter() return uppertext(pick(GLOB.alphabet)) diff --git a/code/datums/action.dm b/code/datums/action.dm index 9dede2540a2..7e152b1131e 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -861,7 +861,7 @@ //Small sprites /datum/action/small_sprite name = "Toggle Giant Sprite" - desc = "Others will always see you as giant" + desc = "Others will always see you as giant." icon_icon = 'icons/mob/actions/actions_xeno.dmi' button_icon_state = "smallqueen" background_icon_state = "bg_alien" @@ -875,8 +875,6 @@ /datum/action/small_sprite/megafauna icon_icon = 'icons/mob/actions/actions_xeno.dmi' - button_icon_state = "smallqueen" - background_icon_state = "bg_alien" small_icon = 'icons/mob/lavaland/lavaland_monsters.dmi' /datum/action/small_sprite/megafauna/drake @@ -896,6 +894,12 @@ small_icon_state = "arachnid_mini" background_icon_state = "bg_demon" +/datum/action/small_sprite/space_dragon + small_icon = 'icons/mob/carp.dmi' + small_icon_state = "carp" + icon_icon = 'icons/mob/carp.dmi' + button_icon_state = "carp" + /datum/action/small_sprite/Trigger(trigger_flags) ..() if(!small) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 3d5146bc595..2d4abb2dafa 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -30,40 +30,50 @@ /obj/structure/frame/machine/examine(user) . = ..() - if(state == 3 && req_components && req_component_names) - var/hasContent = FALSE - var/requires = "It requires" + if(state != 3) + return - for(var/i = 1 to req_components.len) - var/tname = req_components[i] - var/amt = req_components[tname] - if(amt == 0) - continue - var/use_and = i == req_components.len - requires += "[(hasContent ? (use_and ? ", and" : ",") : "")] [amt] [amt == 1 ? req_component_names[tname] : "[req_component_names[tname]]\s"]" - hasContent = TRUE + if(!length(req_components)) + . += span_info("It requires no components.") + return . + + if(!req_component_names) + stack_trace("[src]'s req_components list has items but its req_component_names list is null!") + return + + var/list/nice_list = list() + for(var/atom/component as anything in req_components) + if(!ispath(component)) + stack_trace("An item in [src]'s req_components list is not a path!") + continue + if(!req_components[component]) + continue + + nice_list += list("[req_components[component]] [req_component_names[component]]\s") + . += span_info("It requires [english_list(nice_list, "no more components")].") - if(hasContent) - . += "[requires]." - else - . += "It does not require any more components." /obj/structure/frame/machine/proc/update_namelist() if(!req_components) return - req_component_names = new() - for(var/tname in req_components) - if(ispath(tname, /obj/item/stack)) - var/obj/item/stack/S = tname - var/singular_name = initial(S.singular_name) - if(singular_name) - req_component_names[tname] = singular_name - else - req_component_names[tname] = initial(S.name) - else - var/obj/O = tname - req_component_names[tname] = initial(O.name) + req_component_names = list() + for(var/atom/component_path as anything in req_components) + if(!ispath(component_path)) + continue + + req_component_names[component_path] = initial(component_path.name) + + if(ispath(component_path, /obj/item/stack)) + var/obj/item/stack/stack_path = component_path + if(initial(stack_path.singular_name)) + req_component_names[component_path] = initial(stack_path.singular_name) + continue + + if(ispath(component_path, /obj/item/stock_parts)) + var/obj/item/stock_parts/stock_part = component_path + if(initial(stock_part.base_name)) + req_component_names[component_path] = initial(stock_part.base_name) /obj/structure/frame/machine/proc/get_req_components_amt() var/amt = 0 diff --git a/code/game/machinery/ecto_sniffer.dm b/code/game/machinery/ecto_sniffer.dm index b40fab15caa..b081e05b8c6 100644 --- a/code/game/machinery/ecto_sniffer.dm +++ b/code/game/machinery/ecto_sniffer.dm @@ -32,6 +32,7 @@ flick("ecto_sniffer_flick", src) playsound(loc, 'sound/machines/ectoscope_beep.ogg', 75) use_power(10) + say("Reporting [pick(world.file2list("strings/spook_levels.txt"))] levels of paranormal activity!") if(activator?.ckey) ectoplasmic_residues += activator.ckey addtimer(CALLBACK(src, .proc/clear_residue, activator.ckey), 15 SECONDS) diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm index 3c60a67c00e..fcc0b920a4d 100644 --- a/code/game/objects/items/circuitboards/circuitboard.dm +++ b/code/game/objects/items/circuitboards/circuitboard.dm @@ -94,10 +94,28 @@ micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells. /obj/item/circuitboard/machine/examine(mob/user) . = ..() - if(LAZYLEN(req_components)) - var/list/nice_list = list() - for(var/atom/component as anything in req_components) - if(!ispath(component)) - continue - nice_list += list("[req_components[component]] [initial(component.name)]") - . += span_notice("Required components: [english_list(nice_list)].") + if(!LAZYLEN(req_components)) + . += span_info("It requires no components.") + return . + + var/list/nice_list = list() + for(var/atom/component_path as anything in req_components) + if(!ispath(component_path)) + continue + + var/component_name = initial(component_path.name) + var/component_amount = req_components[component_path] + + if(ispath(component_path, /obj/item/stack)) + var/obj/item/stack/stack_path = component_path + if(initial(stack_path.singular_name)) + component_name = initial(stack_path.singular_name) //e.g. "glass sheet" vs. "glass" + + else if(ispath(component_path, /obj/item/stock_parts)) + var/obj/item/stock_parts/stock_part = component_path + if(initial(stock_part.base_name)) + component_name = initial(stock_part.base_name) + + nice_list += list("[component_amount] [component_name]\s") + + . += span_info("It requires [english_list(nice_list)].") diff --git a/code/game/objects/items/food/bread.dm b/code/game/objects/items/food/bread.dm index 8827e32d546..ee2c2fd0c8f 100644 --- a/code/game/objects/items/food/bread.dm +++ b/code/game/objects/items/food/bread.dm @@ -270,84 +270,6 @@ foodtypes = GRAIN venue_value = FOOD_PRICE_NORMAL -/obj/item/food/deepfryholder - name = "Deep Fried Foods Holder Obj" - desc = "If you can see this description the code for the deep fryer fucked up." - icon = 'icons/obj/food/food.dmi' - icon_state = "" - bite_consumption = 2 - -/obj/item/food/deepfryholder/MakeEdible() - AddComponent(/datum/component/edible,\ - initial_reagents = food_reagents,\ - food_flags = food_flags,\ - foodtypes = foodtypes,\ - volume = max_volume,\ - eat_time = eat_time,\ - tastes = tastes,\ - eatverbs = eatverbs,\ - bite_consumption = bite_consumption,\ - on_consume = CALLBACK(src, .proc/On_Consume)) - - -/obj/item/food/deepfryholder/Initialize(mapload, obj/item/fried) - if(!fried) - stack_trace("A deepfried object was created with no fried target") - return INITIALIZE_HINT_QDEL - . = ..() - name = fried.name //We'll determine the other stuff when it's actually removed - appearance = fried.appearance - layer = initial(layer) - plane = initial(plane) - lefthand_file = fried.lefthand_file - righthand_file = fried.righthand_file - inhand_icon_state = fried.inhand_icon_state - desc = fried.desc - w_class = fried.w_class - slowdown = fried.slowdown - equip_delay_self = fried.equip_delay_self - equip_delay_other = fried.equip_delay_other - strip_delay = fried.strip_delay - species_exception = fried.species_exception - item_flags = fried.item_flags - obj_flags = fried.obj_flags - inhand_x_dimension = fried.inhand_x_dimension - inhand_y_dimension = fried.inhand_y_dimension - - if(!(SEND_SIGNAL(fried, COMSIG_ITEM_FRIED, src) & COMSIG_FRYING_HANDLED)) //If frying is handled by signal don't do the defaault behavior. - fried.forceMove(src) - - -/obj/item/food/deepfryholder/Destroy() - if(contents) - QDEL_LIST(contents) - return ..() - -/obj/item/food/deepfryholder/proc/On_Consume(eater, feeder) - if(contents) - QDEL_LIST(contents) - - -/obj/item/food/deepfryholder/proc/fry(cook_time = 30) - switch(cook_time) - if(0 to 15) - add_atom_colour(rgb(166, 103, 54), FIXED_COLOUR_PRIORITY) - name = "lightly-fried [name]" - desc = "[desc] It's been lightly fried in a deep fryer." - if(16 to 49) - add_atom_colour(rgb(103, 63, 24), FIXED_COLOUR_PRIORITY) - name = "fried [name]" - desc = "[desc] It's been fried, increasing its tastiness value by [rand(1, 75)]%." - if(50 to 59) - add_atom_colour(rgb(63, 23, 4), FIXED_COLOUR_PRIORITY) - name = "deep-fried [name]" - desc = "[desc] Deep-fried to perfection." - if(60 to INFINITY) - add_atom_colour(rgb(33, 19, 9), FIXED_COLOUR_PRIORITY) - name = "\proper the physical manifestation of the very concept of fried foods" - desc = "A heavily-fried... something. Who can tell anymore?" - foodtypes |= FRIED - /obj/item/food/butterbiscuit name = "butter biscuit" desc = "Well butter my biscuit!" diff --git a/code/game/objects/items/food/deepfried.dm b/code/game/objects/items/food/deepfried.dm new file mode 100644 index 00000000000..0195bc41242 --- /dev/null +++ b/code/game/objects/items/food/deepfried.dm @@ -0,0 +1,77 @@ +/obj/item/food/deepfryholder + name = "Deep Fried Foods Holder Obj" + desc = "If you can see this description the code for the deep fryer fucked up." + icon = 'icons/obj/food/food.dmi' + icon_state = "" + bite_consumption = 2 + +/obj/item/food/deepfryholder/MakeEdible() + AddComponent(/datum/component/edible,\ + initial_reagents = food_reagents,\ + food_flags = food_flags,\ + foodtypes = foodtypes,\ + volume = max_volume,\ + eat_time = eat_time,\ + tastes = tastes,\ + eatverbs = eatverbs,\ + bite_consumption = bite_consumption,\ + on_consume = CALLBACK(src, .proc/On_Consume)) + + +/obj/item/food/deepfryholder/Initialize(mapload, obj/item/fried) + if(!fried) + stack_trace("A deepfried object was created with no fried target") + return INITIALIZE_HINT_QDEL + . = ..() + name = fried.name //We'll determine the other stuff when it's actually removed + appearance = fried.appearance + layer = initial(layer) + plane = initial(plane) + lefthand_file = fried.lefthand_file + righthand_file = fried.righthand_file + inhand_icon_state = fried.inhand_icon_state + desc = fried.desc + w_class = fried.w_class + slowdown = fried.slowdown + equip_delay_self = fried.equip_delay_self + equip_delay_other = fried.equip_delay_other + strip_delay = fried.strip_delay + species_exception = fried.species_exception + item_flags = fried.item_flags + obj_flags = fried.obj_flags + inhand_x_dimension = fried.inhand_x_dimension + inhand_y_dimension = fried.inhand_y_dimension + + if(!(SEND_SIGNAL(fried, COMSIG_ITEM_FRIED, src) & COMSIG_FRYING_HANDLED)) //If frying is handled by signal don't do the defaault behavior. + fried.forceMove(src) + + +/obj/item/food/deepfryholder/Destroy() + if(contents) + QDEL_LIST(contents) + return ..() + +/obj/item/food/deepfryholder/proc/On_Consume(eater, feeder) + if(contents) + QDEL_LIST(contents) + + +/obj/item/food/deepfryholder/proc/fry(cook_time = 30) + switch(cook_time) + if(0 to 15) + add_atom_colour(rgb(166, 103, 54), FIXED_COLOUR_PRIORITY) + name = "lightly-fried [name]" + desc = "[desc] It's been lightly fried in a deep fryer." + if(16 to 49) + add_atom_colour(rgb(103, 63, 24), FIXED_COLOUR_PRIORITY) + name = "fried [name]" + desc = "[desc] It's been fried, increasing its tastiness value by [rand(1, 75)]%." + if(50 to 59) + add_atom_colour(rgb(63, 23, 4), FIXED_COLOUR_PRIORITY) + name = "deep-fried [name]" + desc = "[desc] Deep-fried to perfection." + if(60 to INFINITY) + add_atom_colour(rgb(33, 19, 9), FIXED_COLOUR_PRIORITY) + name = "\proper the physical manifestation of the very concept of fried foods" + desc = "A heavily-fried... something. Who can tell anymore?" + foodtypes |= FRIED diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 5cfce4afc8f..a46e3100835 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -111,8 +111,8 @@ /obj/item/storage/toolbox/mechanical/old/clean/proc/calc_damage() var/power = 0 - for (var/obj/item/stack/telecrystal/TC in get_all_contents()) - power += TC.amount + for (var/obj/item/stack/telecrystal/stored_crystals in get_all_contents()) + power += (stored_crystals.amount / 2) force = 19 + power throwforce = 22 + power diff --git a/code/modules/cargo/department_order.dm b/code/modules/cargo/department_order.dm index a5b65ca7583..55ede94f8ca 100644 --- a/code/modules/cargo/department_order.dm +++ b/code/modules/cargo/department_order.dm @@ -118,6 +118,8 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( if(!pack) say("Something went wrong!") CRASH("requested supply pack id \"[id]\" not found!") + if(pack.hidden || pack.DropPodOnly || pack.special) + return var/name = "*None Provided*" var/rank = "*None Provided*" var/ckey = usr.ckey diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index bafe5055c14..1c7364fa906 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -171,6 +171,7 @@ if(scanned_tray.myseed) returned_message += "*** [span_bold("[scanned_tray.myseed.plantname]")] ***\n" returned_message += "- Plant Age: [span_notice("[scanned_tray.age]")]\n" + returned_message += "- Plant Health: [span_notice("[scanned_tray.plant_health]")]\n" returned_message += scan_plant_stats(scanned_tray.myseed) else returned_message += span_bold("No plant found.\n") diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 1aaffbdafca..2dd22bd7571 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -15,7 +15,7 @@ icon_state = "mulebot0" density = TRUE move_resist = MOVE_FORCE_STRONG - animate_movement = FORWARD_STEPS + animate_movement = SLIDE_STEPS health = 50 maxHealth = 50 speed = 3 diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index 0997df14537..51882876fa0 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -91,6 +91,8 @@ var/objective_complete = FALSE /// The innate ability to summon rifts var/datum/action/innate/summon_rift/rift + /// The ability to make your sprite smaller + var/datum/action/small_sprite/space_dragon/small_sprite /// The color of the space dragon. var/chosen_color /// Minimum devastation damage dealt coefficient based on max health @@ -106,6 +108,9 @@ ADD_TRAIT(src, TRAIT_HEALS_FROM_CARP_RIFTS, INNATE_TRAIT) rift = new rift.Grant(src) + small_sprite = new + small_sprite.Grant(src) + RegisterSignal(small_sprite, COMSIG_ACTION_TRIGGER, .proc/add_dragon_overlay) /mob/living/simple_animal/hostile/space_dragon/Login() . = ..() @@ -201,10 +206,12 @@ destroy_rifts() ..() add_dragon_overlay() + UnregisterSignal(small_sprite, COMSIG_ACTION_TRIGGER) /mob/living/simple_animal/hostile/space_dragon/revive(full_heal, admin_revive) . = ..() add_dragon_overlay() + RegisterSignal(small_sprite, COMSIG_ACTION_TRIGGER, .proc/add_dragon_overlay) /mob/living/simple_animal/hostile/space_dragon/wabbajack_act(mob/living/new_mob) empty_contents() @@ -252,6 +259,8 @@ */ /mob/living/simple_animal/hostile/space_dragon/proc/add_dragon_overlay() cut_overlays() + if(!small_sprite.small) + return if(stat == DEAD) var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_dead") overlay.appearance_flags = RESET_COLOR diff --git a/code/modules/reagents/chemistry/items.dm b/code/modules/reagents/chemistry/items.dm index 17900d6903d..2ef48dbe7e8 100644 --- a/code/modules/reagents/chemistry/items.dm +++ b/code/modules/reagents/chemistry/items.dm @@ -96,7 +96,7 @@ * pH meter that will give a detailed or truncated analysis of all the reagents in of an object with a reagents datum attached to it. Only way of detecting purity for now. */ /obj/item/ph_meter - name = "Chemistry Analyser" + name = "Chemical Analyzer" desc = "An electrode attached to a small circuit box that will display details of a solution. Can be toggled to provide a description of each of the reagents. The screen currently displays nothing." icon_state = "pHmeter" icon = 'icons/obj/chemical.dmi' diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 4f74728df06..dfa5ac4b08c 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1194,6 +1194,7 @@ metabolization_rate = 0.4 * REAGENTS_METABOLISM ph = 4.3 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + harmful = TRUE /datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/M, delta_time, times_fired) for(var/datum/reagent/drug/R in M.reagents.reagent_list) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 288fe12bf9c..76eb1cfb3c8 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -738,9 +738,9 @@ build_path = /obj/item/assembly/timer category = list("initial", "Misc") -/datum/design/voice_analyser - name = "Voice Analyser" - id = "voice_analyser" +/datum/design/voice_analyzer + name = "Voice Analyzer" + id = "voice_analyzer" build_type = AUTOLATHE materials = list(/datum/material/iron = 500, /datum/material/glass = 50) build_path = /obj/item/assembly/voice diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index a6d158c3aa1..0a3d301e493 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -72,7 +72,7 @@ category = list("Medical Designs") /datum/design/ph_meter - name = "Chemical analyser" + name = "Chemical Analyzer" id = "ph_meter" build_type = PROTOLATHE | AWAY_LATHE departmental_flags = DEPARTMENTAL_FLAG_MEDICAL diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index eeee1578651..e313216546b 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -220,6 +220,8 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good icon = 'icons/obj/stock_parts.dmi' w_class = WEIGHT_CLASS_SMALL var/rating = 1 + ///Used when a base part has a different name to higher tiers of part. For example, machine frames want any manipulator and not just a micro-manipulator. + var/base_name /obj/item/stock_parts/Initialize(mapload) . = ..() @@ -248,6 +250,7 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good desc = "A tiny little manipulator used in the construction of certain devices." icon_state = "micro_mani" custom_materials = list(/datum/material/iron=30) + base_name = "manipulator" /obj/item/stock_parts/micro_laser name = "micro-laser" diff --git a/code/modules/ruins/spaceruin_code/oldstation.dm b/code/modules/ruins/spaceruin_code/oldstation.dm index 3efca0798de..c704b60ff15 100644 --- a/code/modules/ruins/spaceruin_code/oldstation.dm +++ b/code/modules/ruins/spaceruin_code/oldstation.dm @@ -20,10 +20,10 @@ monochromatic cyan, leaving the user unable to see long distances. However, the way the helmet retracts is pretty cool." /obj/item/paper/fluff/ruins/oldstation/protohealth - name = "Health Analyser Report" - info = "*Health Analyser*

The portable Health Analyser is essentially a handheld variant of a health analyser. Years of research have concluded with this device which is \ + name = "Health Analyzer Report" + info = "*Health Analyzer*

The portable Health Analyzer is essentially a handheld variant of a health analyzer. Years of research have concluded with this device which is \ capable of diagnosing even the most critical, obscure or technical injuries any humanoid entity is suffering in an easy to understand format that even a non-trained health professional \ - can understand.

The health analyser is expected to go into full production as standard issue medical kit." + can understand.

The health analyzer is expected to go into full production as standard issue medical kit." /obj/item/paper/fluff/ruins/oldstation/protogun name = "K14 Energy Gun Report" diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index c2fc91e6305..45df56e2379 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -43,6 +43,14 @@ restricted_roles = list(JOB_ASSISTANT) surplus = 0 +/datum/uplink_item/role_restricted/oldtoolboxclean + name = "Ancient Toolbox" + desc = "An iconic toolbox design notorious with Assistants everywhere, this design was especially made to become more robust the more telecrystals it has inside it! Tools and insulated gloves included." + item = /obj/item/storage/toolbox/mechanical/old/clean + cost = 2 + restricted_roles = list(JOB_ASSISTANT) + surplus = 0 + // Low progression cost /datum/uplink_item/role_restricted/clownpin diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index 4b92997913d..c0c32b3c5d4 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -375,8 +375,4 @@ cell.forceMove(WR) cell.charge = rand(0, cell.charge) cell = null - if(internal_tank) - WR.crowbar_salvage += internal_tank - internal_tank.forceMove(WR) - cell = null . = ..() diff --git a/html/changelogs/AutoChangeLog-pr-12419.yml b/html/changelogs/AutoChangeLog-pr-12419.yml new file mode 100644 index 00000000000..010621051a7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12419.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Nanotrasen realized how much they were spending on newscasters that got buried under posters and the like, so the corporation decided to stock the crew with juuuuust enough. They have saved a lot of money from this venture, and the economy will promptly begin to skyrocket to new heights." diff --git a/html/changelogs/AutoChangeLog-pr-12421.yml b/html/changelogs/AutoChangeLog-pr-12421.yml new file mode 100644 index 00000000000..c250c18f4e8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12421.yml @@ -0,0 +1,4 @@ +author: "TheBonded, timothymtorres" +delete-after: True +changes: + - bugfix: "Fixed mulebot movement animation to be smoother" diff --git a/html/changelogs/AutoChangeLog-pr-12422.yml b/html/changelogs/AutoChangeLog-pr-12422.yml new file mode 100644 index 00000000000..63136575f64 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12422.yml @@ -0,0 +1,5 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Machine frames and circuit boards no longer call manipulators micro-manipulators when examined" + - code_imp: "Improves code in constructable_frame.dm and circuitboard.dm" diff --git a/html/changelogs/AutoChangeLog-pr-12426.yml b/html/changelogs/AutoChangeLog-pr-12426.yml new file mode 100644 index 00000000000..dcb60e033be --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12426.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "fixed mech air tanks being removable" diff --git a/html/changelogs/AutoChangeLog-pr-12431.yml b/html/changelogs/AutoChangeLog-pr-12431.yml new file mode 100644 index 00000000000..a0ccf76bc02 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12431.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Assistant Traitors can now purchase the Ancient Toolbox again." diff --git a/html/changelogs/AutoChangeLog-pr-12432.yml b/html/changelogs/AutoChangeLog-pr-12432.yml new file mode 100644 index 00000000000..f15651c9f5f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12432.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Adds checks for packs on the departmental order console." diff --git a/html/changelogs/AutoChangeLog-pr-12436.yml b/html/changelogs/AutoChangeLog-pr-12436.yml new file mode 100644 index 00000000000..f81e8cd47cf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12436.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Haloperidol has been properly labelled in medical cyborg hyposprays after several instances of mediborg induced brain damage were found in human patients." diff --git a/html/changelogs/AutoChangeLog-pr-12437.yml b/html/changelogs/AutoChangeLog-pr-12437.yml new file mode 100644 index 00000000000..2e5f1ba4c17 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12437.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - spellcheck: "Voice and chemical analyzers now have more consistent names and spelling." diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index 852ed9831d1..f39c5915c65 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/strings/chemistrytips.txt b/strings/chemistrytips.txt index 1ba86b79096..0a74df5db9e 100644 --- a/strings/chemistrytips.txt +++ b/strings/chemistrytips.txt @@ -1,5 +1,5 @@ A reaction can be slowed down by cooling the beaker it's in! -Chemical analysers scan more than just pH. They can tell you the purity of each reagent. +Chemical analyzers scan more than just pH. They can tell you the purity of each reagent. The infomation depth of pH meter readouts can be reduced by using it in hand! ChemMaster 3000s can tell you the optimal pH of a reagent's reaction with their analyze function. Oculine slightly improves your eyesight while it's in your system, to a degree based on its purity. @@ -10,7 +10,7 @@ Inverse Neurine will not delete an imaginary friend. Once a friend, always a fri Overdosing on Mannitol will give you pro tips from your newfound enlightenment. Perhaps you know that already, though! Eigenstasium's wild ride can be halted by taking more eigenstasium, bluespace dust, or stabilising agent. The longer synthtissue has been growing, the more stuff it can do! -Exact organ health values can be determined by using a health analyser while Technetium 99 is in their system. +Exact organ health values can be determined by using a health analyzer while Technetium 99 is in their system. 100% pure inacusiate will let you hear whispers from a distance while it's in your system. Turning sugar into caramel before attempting to make Eigenstasium makes it much easier to create. Thermometers crafted in the chemistry section will let you detect the temperature of anything that has a reagent temperature. This includes people too! diff --git a/strings/spook_levels.txt b/strings/spook_levels.txt new file mode 100644 index 00000000000..b43e4ee8adc --- /dev/null +++ b/strings/spook_levels.txt @@ -0,0 +1,30 @@ +moderate +regular +okay +somewhat irregular +weird +offputting +ungodly +off the charts +earth-shattering +station-shaking +REDACTED +annoying +nuisance heavy +intern +clown +Poly +low +medium +high +medium rare +golem +cheesy horror flick +SKELLY TONE +chair-moving +hair-raising +RUNTIME ERROR +help +IT COMES +NAR +hi diff --git a/tgstation.dme b/tgstation.dme index 2788d921b24..7b9bbf99436 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1587,6 +1587,7 @@ #include "code\game\objects\items\food\bread.dm" #include "code\game\objects\items\food\burgers.dm" #include "code\game\objects\items\food\cake.dm" +#include "code\game\objects\items\food\deepfried.dm" #include "code\game\objects\items\food\dough.dm" #include "code\game\objects\items\food\egg.dm" #include "code\game\objects\items\food\frozen.dm"