diff --git a/aurorastation.dme b/aurorastation.dme index c1433a57a15..d4ffabf8571 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -1418,6 +1418,7 @@ #include "code\modules\clothing\rings\rings.dm" #include "code\modules\clothing\sets\acting_captain.dm" #include "code\modules\clothing\sets\captain.dm" +#include "code\modules\clothing\sets\laser_tag.dm" #include "code\modules\clothing\shoes\colour.dm" #include "code\modules\clothing\shoes\jobs.dm" #include "code\modules\clothing\shoes\magboots.dm" diff --git a/code/__defines/armor.dm b/code/__defines/armor.dm index df211842e9d..ddba38187b1 100644 --- a/code/__defines/armor.dm +++ b/code/__defines/armor.dm @@ -2,6 +2,7 @@ // Some levels are marked with what they intend to block in such way. #define ARMOR_TYPE_STANDARD 1 #define ARMOR_TYPE_EXOSUIT 2 +#define ARMOR_TYPE_RIG 4 #define ARMOR_BALLISTIC_MINOR 10 #define ARMOR_BALLISTIC_SMALL 25 diff --git a/code/controllers/subsystems/chemistry.dm b/code/controllers/subsystems/chemistry.dm index bc23c0106b0..4c6085b223c 100644 --- a/code/controllers/subsystems/chemistry.dm +++ b/code/controllers/subsystems/chemistry.dm @@ -87,8 +87,7 @@ var/datum/controller/subsystem/chemistry/SSchemistry initialize_codex_data() var/pre_secret_len = chemical_reactions.len log_ss("chemistry", "Found [pre_secret_len] reactions.") - load_secret_chemicals() - log_ss("chemistry", "Loaded [chemical_reactions.len - pre_secret_len] secret reactions.") + log_ss("chemistry", "Loaded [load_secret_chemicals()] secret reactions.") initialize_specific_heats() // must be after reactions ..() @@ -125,6 +124,7 @@ var/datum/controller/subsystem/chemistry/SSchemistry src.chemical_reactions = SSchemistry.chemical_reactions /datum/controller/subsystem/chemistry/proc/load_secret_chemicals() + . = 0 var/list/chemconfig = list() try chemconfig = json_decode(return_file_text("config/secretchem.json")) @@ -140,24 +140,24 @@ var/datum/controller/subsystem/chemistry/SSchemistry cc.id = chemconfig[chemical]["id"] cc.result = text2path(chemconfig[chemical]["result"]) cc.result_amount = chemconfig[chemical]["resultamount"] - cc.required_reagents = chemconfig[chemical]["required_reagents"] - if(!istype(cc.result, /decl/reagent)) + if(!ispath(cc.result, /decl/reagent)) log_debug("SSchemistry: Warning: Invalid result [cc.result] in [cc.name] reactions list.") qdel(cc) break - for(var/i in 1 to cc.required_reagents.len) - var/A = text2path(cc.required_reagents[i]) - cc.required_reagents[i] = text2path(cc.required_reagents[i]) - if(!ispath(A, /decl/reagent)) - log_debug("SSchemistry: Warning: Invalid chemical [A] in [cc.name] required reagents list.") + for(var/key in chemconfig[chemical]["required_reagents"]) + var/result_chem = text2path(key) + LAZYSET(cc.required_reagents, result_chem, chemconfig[chemical]["required_reagents"][key]) + if(!ispath(result_chem, /decl/reagent)) + log_debug("SSchemistry: Warning: Invalid chemical [key] in [cc.name] required reagents list.") qdel(cc) break - if(LAZYLEN(cc.required_reagents)) + if(LAZYLEN(cc?.required_reagents)) var/rtype = cc.required_reagents[1] LAZYINITLIST(chemical_reactions[rtype]) chemical_reactions[rtype] += cc + .++ //Chemical Reactions - Initialises all /datum/chemical_reaction into a list // It is filtered into multiple lists within a list. diff --git a/code/datums/components/armor/armor.dm b/code/datums/components/armor/armor.dm index d9ac8dafa7b..1c5b7ed24f7 100644 --- a/code/datums/components/armor/armor.dm +++ b/code/datums/components/armor/armor.dm @@ -16,10 +16,14 @@ // E.g. setting it to more than 1 will make mitigation drop off faster, effectively reducing the range of damage mitigation var/over_armor_mult = 1 -/datum/component/armor/Initialize(list/armor) + var/sealed = FALSE // Used with ARMOR_TYPE_RIG. + +/datum/component/armor/Initialize(list/armor, armor_type) ..() if(armor) armor_values = armor.Copy() + if(armor_type) + armor_flags = armor_type // Takes in incoming damage value // Applies state changes to self, holder, and whatever else caused by damage mitigation @@ -71,6 +75,9 @@ /datum/component/armor/proc/get_value(key) if(isnull(armor_values[key])) return 0 + if(armor_flags & ARMOR_TYPE_RIG) + if(key == "bio" && sealed) + return 100 return min(armor_values[key], 100) /datum/component/armor/proc/set_value(key, newval) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 2a295520fdf..24c90b72af7 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -6,9 +6,9 @@ var/list/doppler_arrays = list() icon = 'icons/obj/computer.dmi' icon_state = "computer" - anchored = 1 - density = 1 - + anchored = TRUE + density = TRUE + var/active = TRUE /obj/machinery/doppler_array/Initialize() . = ..() @@ -19,6 +19,14 @@ var/list/doppler_arrays = list() doppler_arrays -= src return ..() +/obj/machinery/doppler_array/examine(mob/user) + . = ..() + to_chat(user, SPAN_NOTICE("\The [src] is [active ? "listening for explosions" : "[SPAN_WARNING("inactive")]"].")) + +/obj/machinery/doppler_array/attack_hand(mob/user) + active = !active + to_chat(user, SPAN_NOTICE("\The [src] is now [active ? "listening for explosions" : "[SPAN_WARNING("inactive")]"].")) + /obj/machinery/doppler_array/update_icon() icon_state = initial(icon_state) set_light(0) @@ -31,8 +39,8 @@ var/list/doppler_arrays = list() add_overlay(image(icon, src, "teleport")) /obj/machinery/doppler_array/proc/sense_explosion(var/x0,var/y0,var/z0,var/devastation_range,var/heavy_impact_range,var/light_impact_range) - if(stat & NOPOWER) return - if(z != z0) return + if(!active || (stat & NOPOWER) || z != z0) + return var/dx = abs(x0-x) var/dy = abs(y0-y) @@ -55,8 +63,8 @@ var/list/doppler_arrays = list() return var/message = "Explosive disturbance detected - Epicenter at: grid ([x0],[y0],[z0]). Epicenter radius: [devastation_range]. Outer radius: [heavy_impact_range]. Shockwave radius: [light_impact_range]." - global_announcer.autosay(message, src.name) + global_announcer.autosay(message, "Tachyon-Doppler Array", "Science") /obj/machinery/doppler_array/power_change() ..() - update_icon() \ No newline at end of file + update_icon() diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 70f9dc7566d..4940afc7e20 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -218,9 +218,10 @@ if(!hascell(M)) return + if(!M.Move(src)) + return add_fingerprint(M) M.reset_view(src) - M.forceMove(src) occupant = M update_icon() return 1 diff --git a/code/game/machinery/vending_types.dm b/code/game/machinery/vending_types.dm index 2d9f5eb7c56..ffbc64a38e6 100644 --- a/code/game/machinery/vending_types.dm +++ b/code/game/machinery/vending_types.dm @@ -88,6 +88,7 @@ /obj/item/reagent_containers/food/drinks/bottle/cola = 5, /obj/item/reagent_containers/food/drinks/bottle/space_mountain_wind = 5, /obj/item/reagent_containers/food/drinks/bottle/space_up = 5, + /obj/item/reagent_containers/food/drinks/bottle/hrozamal_soda = 2, /obj/item/reagent_containers/food/drinks/cans/adhomai_milk = 2, /obj/item/reagent_containers/food/drinks/cans/grape_juice = 6, /obj/item/reagent_containers/food/drinks/cans/beetle_milk = 2, @@ -272,7 +273,6 @@ /obj/item/reagent_containers/food/snacks/koisbar_clean = 4, /obj/item/reagent_containers/food/snacks/candy/koko = 5, /obj/item/reagent_containers/food/snacks/tuna = 2, - /obj/item/reagent_containers/food/snacks/diona_bites = 3, /obj/item/reagent_containers/food/snacks/ricetub = 2, /obj/item/reagent_containers/food/snacks/riceball = 4, /obj/item/reagent_containers/food/snacks/seaweed = 5 @@ -304,7 +304,6 @@ /obj/item/reagent_containers/food/snacks/koisbar_clean = 60, /obj/item/reagent_containers/food/snacks/candy/koko = 40, /obj/item/reagent_containers/food/snacks/tuna = 23, - /obj/item/reagent_containers/food/snacks/diona_bites = 40, /obj/item/reagent_containers/food/snacks/ricetub = 40, /obj/item/reagent_containers/food/snacks/riceball = 15, /obj/item/reagent_containers/food/snacks/seaweed = 20 @@ -331,7 +330,8 @@ /obj/item/reagent_containers/food/drinks/cans/iced_tea = 10, /obj/item/reagent_containers/food/drinks/cans/grape_juice = 10, /obj/item/reagent_containers/food/drinks/cans/koispunch = 5, - /obj/item/reagent_containers/food/drinks/cans/beetle_milk = 10 + /obj/item/reagent_containers/food/drinks/cans/beetle_milk = 10, + /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda = 10 ) contraband = list( /obj/item/reagent_containers/food/drinks/cans/thirteenloko = 5, @@ -354,7 +354,8 @@ /obj/item/reagent_containers/food/drinks/cans/iced_tea = 13, /obj/item/reagent_containers/food/drinks/cans/grape_juice = 16, /obj/item/reagent_containers/food/drinks/cans/koispunch = 50, - /obj/item/reagent_containers/food/drinks/cans/beetle_milk = 5 + /obj/item/reagent_containers/food/drinks/cans/beetle_milk = 5, + /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda = 35 ) idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. vending_sound = 'sound/machines/vending/vending_cans.ogg' diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 46704e8d9c7..18a4ec3b383 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -103,7 +103,7 @@ if(islist(armor)) for(var/type in armor) if(armor[type]) - AddComponent(/datum/component/armor, armor, armor_degradation_speed) + AddComponent(/datum/component/armor, armor) break /obj/item/Destroy() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 7a00cb34994..c1d1e20d0f9 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -925,6 +925,13 @@ icon_state = "kittenplushie" slot_flags = SLOT_HEAD +/obj/item/toy/plushie/pennyplush + name = "Penny plush" + desc = "It's a plush of the beloved company mascot cat, Penny! For the price Nanotrasen sells these things at, you probably could have bought an actual cat." + icon_state = "pennyplushie" + slot_flags = SLOT_HEAD + + /obj/item/toy/plushie/lizard name = "lizard plush" desc = "A plushie of a scaly lizard! Very controversial, after being accused as \"racist\" by some Unathi." diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 228fedda602..2b994554431 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -205,10 +205,6 @@ drop_sound = 'sound/items/drop/bottle.ogg' pickup_sound = 'sound/items/pickup/bottle.ogg' -/obj/item/trash/diona_bites - name = "dionae bites" - icon_state = "dionaebitesempty" - /obj/item/trash/ricetub name = "empty rice tub" icon_state = "ricetub" diff --git a/code/game/objects/items/weapons/storage/field_ration.dm b/code/game/objects/items/weapons/storage/field_ration.dm index ef747a60675..5efd16acfca 100644 --- a/code/game/objects/items/weapons/storage/field_ration.dm +++ b/code/game/objects/items/weapons/storage/field_ration.dm @@ -30,7 +30,7 @@ if("NanoTrasen Sponsored") new /obj/item/reagent_containers/food/snacks/liquidfood(src) new /obj/item/reagent_containers/food/snacks/liquidfood(src) - new /obj/item/reagent_containers/food/drinks/cans/sodawater(src) + new /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda(src) desc += " This one has the NanoTrasen logo." /obj/item/storage/field_ration/army diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm index 74174128e33..e96f1fdd64b 100644 --- a/code/game/objects/structures/crates_lockers/closets/fitness.dm +++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm @@ -43,33 +43,3 @@ new /obj/item/clothing/mask/luchador(src) new /obj/item/clothing/mask/luchador/rudos(src) new /obj/item/clothing/mask/luchador/tecnicos(src) - - -/obj/structure/closet/lasertag/red - name = "red laser tag equipment" - desc = "It's a storage unit for laser tag equipment." - icon_state = "red" - icon_closed = "red" - -/obj/structure/closet/lasertag/red/fill() - new /obj/item/clothing/ears/earmuffs(src) - new /obj/item/clothing/ears/earmuffs(src) - new /obj/item/gun/energy/lasertag/red(src) - new /obj/item/gun/energy/lasertag/red(src) - new /obj/item/clothing/suit/redtag(src) - new /obj/item/clothing/suit/redtag(src) - - -/obj/structure/closet/lasertag/blue - name = "blue laser tag equipment" - desc = "It's a storage unit for laser tag equipment." - icon_state = "blue" - icon_closed = "blue" - -/obj/structure/closet/lasertag/blue/fill() - new /obj/item/clothing/ears/earmuffs(src) - new /obj/item/clothing/ears/earmuffs(src) - new /obj/item/gun/energy/lasertag/blue(src) - new /obj/item/gun/energy/lasertag/blue(src) - new /obj/item/clothing/suit/bluetag(src) - new /obj/item/clothing/suit/bluetag(src) \ No newline at end of file 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 ee9e1c63cd4..71bd14f20c6 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -261,7 +261,7 @@ /obj/structure/bed/roller/attackby(obj/item/I, mob/user) if(iswrench(I) || istype(I, /obj/item/stack) || iswirecutter(I)) return 1 - if(iv_stand && !beaker && istype(I, /obj/item/reagent_containers)) + if(iv_stand && !beaker && (istype(I, /obj/item/reagent_containers/glass/beaker) || istype(I, /obj/item/reagent_containers/blood))) if(!user.unEquip(I, target = src)) return to_chat(user, SPAN_NOTICE("You attach \the [I] to \the [src].")) @@ -318,7 +318,7 @@ ..() if(use_check(usr) || !Adjacent(usr)) return - if(!(ishuman(usr) || isrobot(usr))) + if(!ishuman(usr)) return if(over_object == buckled && beaker) if(iv_attached) diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 26cc663ea21..1f90ba6b795 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -210,11 +210,12 @@ /obj/structure/bed/chair/wheelchair/MouseDrop(over_object, src_location, over_location) ..() - if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src)))) - if(!ishuman(usr)) - return FALSE - if(buckled) - return FALSE + if(!ishuman(usr)) + return FALSE + if(buckled) + return FALSE + if(!usr.Adjacent(src)) + return FALSE visible_message(SPAN_NOTICE("[usr] collapses [src].")) var/obj/item/wheelchair/R = new(get_turf(src)) R.name = src.name diff --git a/code/game/sound.dm b/code/game/sound.dm index ffd6cd7139b..14c7ef8b139 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -502,6 +502,11 @@ 'sound/effects/bodyfall4.ogg' ) +/decl/sound_category/bodyfall_skrell_sound + sounds = list( + 'sound/effects/bodyfall_skrell1.ogg' + ) + /decl/sound_category/bodyfall_machine_sound sounds = list( 'sound/effects/bodyfall_machine1.ogg', diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 8eb94ee3f8e..c8664995f7d 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -15,6 +15,8 @@ roof_type = /turf/simulated/floor/airless/ceiling + baseturf = /turf/space + /turf/simulated/proc/wet_floor(var/apply_type = WET_TYPE_WATER, var/amount = 1) //Wet type: diff --git a/code/modules/cargo/random_stock/t2_uncommon.dm b/code/modules/cargo/random_stock/t2_uncommon.dm index 34ada832c7e..32d5b81355c 100644 --- a/code/modules/cargo/random_stock/t2_uncommon.dm +++ b/code/modules/cargo/random_stock/t2_uncommon.dm @@ -93,13 +93,11 @@ STOCK_ITEM_UNCOMMON(chempack, 5) for (var/i in 1 to rand(2, 4)) var/obj/item/reagent_containers/chem_disp_cartridge/C = new /obj/item/reagent_containers/chem_disp_cartridge(L) var/rname = pick(chems) - var/decl/reagent/R = decls_repository.get_decl(rname) - //If we get a drink, reroll it once. //Should result in a higher chance of getting medicines and chemicals - if (istype(R, /decl/reagent/drink) || istype(R, /decl/reagent/alcohol)) + if (ispath(rname, /decl/reagent/drink) || ispath(rname, /decl/reagent/alcohol)) rname = pick(chems) - R = decls_repository.get_decl(rname) + var/decl/reagent/R = decls_repository.get_decl(rname) C.reagents.add_reagent(rname, C.volume) C.setLabel(R.name) diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm index d1e63fb721f..d1d64d172cd 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm @@ -231,7 +231,7 @@ /datum/gear/shoes/tajara/footwraps display_name = "native tajaran foot-wear" - path = /obj/item/clothing/shoes/tajara + path = /obj/item/clothing/shoes/tajara/footwraps sort_category = "Xenowear - Tajara" whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index b2bef7eba92..dbe0c5c4059 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -642,7 +642,7 @@ datum/preferences job_engsec_med = 0 job_engsec_low = 0 - alternate_option = 0 + alternate_option = 1 metadata = "" organ_data = list() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index a6ba99a0fb5..4b76e1a205e 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -251,11 +251,17 @@ for(var/number in list(melee_armor, bullet_armor, laser_armor, energy_armor, bomb_armor)) number = between(0, number, 100) - armor["melee"] = melee_armor - armor["bullet"] = bullet_armor - armor["laser"] = laser_armor - armor["energy"] = energy_armor - armor["bomb"] = bomb_armor + var/datum/component/armor/armor_component = GetComponent(/datum/component/armor) + if(istype(armor_component)) + armor_component.RemoveComponent() + var/list/armor_list = list( + melee = melee_armor, + bullet = bullet_armor, + laser = laser_armor, + energy = energy_armor, + bomb = bomb_armor + ) + AddComponent(/datum/component/armor, armor_list) if(!isnull(material.conductivity)) siemens_coefficient = between(0, material.conductivity / 10, 10) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 2612fe5fa31..b603d7b1805 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -108,17 +108,20 @@ if (use_check_and_message(user)) return + do_flip(user) + update_clothing_icon() + +/obj/item/clothing/head/helmet/riot/proc/do_flip(var/mob/user) if(icon_state == initial(icon_state)) - icon_state = "helm_riot_down" - item_state = "helm_riot_down" - to_chat(user, SPAN_NOTICE("You lower the visor on \the [src].")) - body_parts_covered = HEAD|FACE|EYES - else - icon_state = initial(icon_state) - item_state = initial(item_state) + icon_state = "[icon_state]-up" + item_state = icon_state to_chat(user, SPAN_NOTICE("You raise the visor on \the [src].")) body_parts_covered = HEAD - update_clothing_icon() + else + icon_state = initial(icon_state) + item_state = icon_state + to_chat(user, SPAN_NOTICE("You lower the visor on \the [src].")) + body_parts_covered = HEAD|FACE|EYES /obj/item/clothing/head/helmet/ablative diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index efb4fb0b8ba..bc1d9ffeee8 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -272,4 +272,4 @@ w_class = ITEMSIZE_SMALL body_parts_covered = HEAD attack_verb = list("warned", "cautioned", "smashed") - armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) diff --git a/code/modules/clothing/sets/laser_tag.dm b/code/modules/clothing/sets/laser_tag.dm new file mode 100644 index 00000000000..61069d2be82 --- /dev/null +++ b/code/modules/clothing/sets/laser_tag.dm @@ -0,0 +1,143 @@ +/* + Armor +*/ +/obj/item/clothing/suit/armor/riot/laser_tag + name = "laser tag armor" + desc = "A set of laser tag armor. Very swanky." + desc_info = "You can alt-click this while holding or wearing it to set how many laser tag shots you want to be able to take before going down." + icon = 'icons/clothing/kit/laser_tag.dmi' + icon_state = "vest" + item_state = "vest" + contained_sprite = TRUE + blood_overlay_type = "armor" + body_parts_covered = UPPER_TORSO + slowdown = 0 + armor = list( // still somewhat sturdy, but ultimately not very + melee = ARMOR_MELEE_MINOR, + laser = ARMOR_LASER_MINOR, + energy = ARMOR_ENERGY_MINOR + ) + siemens_coefficient = 1.0 + var/laser_tag_color = "red" + + var/set_health = 3 + var/current_health + +/obj/item/clothing/suit/armor/riot/laser_tag/Initialize(mapload, material_key) + . = ..() + get_tag_color(laser_tag_color) + current_health = set_health + +/obj/item/clothing/suit/armor/riot/laser_tag/AltClick(mob/user) + if(loc == user) + set_health = input(user, "Set the amount of shots you want your armour to take.", "Laser Armor", 3) as null|anything in list(1, 2, 3, 4, 5) + if(!set_health) + return + current_health = set_health + var/user_name = "Unknown User" + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/card/id/ID = H.GetIdCard() + user_name = ID.registered_name + var/list/num_to_word = list("one", "two", "three", "four", "five") + visible_message("[capitalize_first_letters(name)] says, \"[SPAN_NOTICE("[user_name] armor health set to [num_to_word[set_health]].")]\".") + return + return ..() + +/obj/item/clothing/suit/armor/riot/laser_tag/attackby(obj/item/I, mob/user) + if(I.ismultitool()) + var/chosen_color = input(user, "Which color do you wish your vest to be?", "Color Selection") as null|anything in list("blue", "red") + if(!chosen_color) + return + laser_tag_color = chosen_color + get_tag_color(chosen_color) + to_chat(user, SPAN_NOTICE("\The [src] is now a [chosen_color] laser tag vest.")) + return + return ..() + +/obj/item/clothing/suit/armor/riot/laser_tag/proc/laser_hit() + current_health-- + if(current_health <= 0 && ismob(loc)) + var/mob/M = loc + M.Weaken(5) + current_health = set_health + +/obj/item/clothing/suit/armor/riot/laser_tag/blue + laser_tag_color = "blue" + +/obj/item/clothing/head/helmet/riot/laser_tag + name = "laser tag helmet" + desc = "A helmet in the form of a riot helm, made for high-impact laser tag gameplay." + icon = 'icons/clothing/kit/laser_tag.dmi' + icon_state = "helmet" + item_state = "helmet" + contained_sprite = TRUE + armor = list( // still somewhat sturdy, but ultimately not very + melee = ARMOR_MELEE_MINOR, + laser = ARMOR_LASER_MINOR, + energy = ARMOR_ENERGY_MINOR + ) + siemens_coefficient = 1.0 + var/laser_tag_color = "red" + +/obj/item/clothing/head/helmet/riot/laser_tag/Initialize(mapload, material_key) + . = ..() + get_tag_color(laser_tag_color) + +/obj/item/clothing/head/helmet/riot/laser_tag/attackby(obj/item/I, mob/user) + if(I.ismultitool()) + var/chosen_color = input(user, "Which color do you wish your helmet to be?", "Color Selection") as null|anything in list("blue", "red") + if(!chosen_color) + return + laser_tag_color = chosen_color + get_tag_color(chosen_color) + to_chat(user, SPAN_NOTICE("\The [src] is now a [chosen_color] laser tag helmet.")) + return + return ..() + +/obj/item/clothing/head/helmet/riot/laser_tag/do_flip(mob/user) + if(item_state == initial(item_state)) + item_state = "[item_state]-up" + else + item_state = initial(item_state) + ..() + +/obj/item/clothing/head/helmet/riot/laser_tag/blue + laser_tag_color = "blue" + +/* + Helpers +*/ +/obj/item/clothing/proc/get_tag_color(var/set_color) + var/list/color_to_color = list("red" = COLOR_RED, "blue" = COLOR_BLUE) + color = color_to_color[set_color] + update_clothing_icon() + + +/* + Closets +*/ +/obj/structure/closet/lasertag + name = "red laser tag equipment" + desc = "It's a storage unit for laser tag equipment." + icon_state = "red" + icon_closed = "red" + var/helmet_path = /obj/item/clothing/head/helmet/riot/laser_tag + var/armor_path = /obj/item/clothing/suit/armor/riot/laser_tag + var/gun_path = /obj/item/gun/energy/lasertag/red + +/obj/structure/closet/lasertag/fill() + new /obj/item/device/multitool(src) + for(var/i = 1 to 3) + new helmet_path(src) + new armor_path(src) + new gun_path(src) + new /obj/item/clothing/ears/earmuffs(src) + +/obj/structure/closet/lasertag/blue + name = "blue laser tag equipment" + icon_state = "blue" + icon_closed = "blue" + helmet_path = /obj/item/clothing/head/helmet/riot/laser_tag/blue + armor_path = /obj/item/clothing/suit/armor/riot/laser_tag/blue + gun_path = /obj/item/gun/energy/lasertag/blue \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index a828d31ae32..22b4ae74261 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -166,7 +166,11 @@ piece.permeability_coefficient = permeability_coefficient piece.unacidable = unacidable piece.species_restricted = species_restricted - if(islist(armor)) piece.armor = armor.Copy() + if(islist(armor)) + var/datum/component/armor/armor_component = piece.GetComponent(/datum/component/armor) + if(istype(armor_component)) + armor_component.RemoveComponent() + piece.AddComponent(/datum/component/armor, armor, ARMOR_TYPE_STANDARD|ARMOR_TYPE_RIG) set_vision(!offline) update_icon(1) @@ -288,12 +292,9 @@ helmet.update_light(wearer) //sealed pieces become airtight, protecting against diseases - if (!seal_target) - LAZYINITLIST(piece.armor) - piece.armor["bio"] = 100 - else - LAZYINITLIST(piece.armor) - piece.armor["bio"] = LAZYACCESS(src.armor, "bio") || 0 + var/datum/component/armor/armor_component = piece.GetComponent(/datum/component/armor) + if(istype(armor_component)) + armor_component.sealed = !seal_target playsound(src, "[!seal_target ? 'sound/machines/rig/rig_deploy.ogg' : 'sound/machines/rig/rig_retract.ogg']", 20, FALSE) else @@ -670,7 +671,7 @@ equip_to = slot_shoes use_obj = boots check_slot = wearer.shoes - if(BP_CHEST) + if("chest") equip_to = slot_wear_suit use_obj = chest check_slot = wearer.wear_suit diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm index 7157c3266b3..014b7e310df 100644 --- a/code/modules/clothing/spacesuits/rig/suits/alien.dm +++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm @@ -33,7 +33,7 @@ armor = list( melee = ARMOR_MELEE_VERY_HIGH, bullet = ARMOR_BALLISTIC_AP, - laser = ARMOR_LASER_MAJOR, + laser = ARMOR_LASER_RIFLES, energy = ARMOR_ENERGY_STRONG, bomb = ARMOR_BOMB_RESISTANT, bio = ARMOR_BIO_SHIELDED, diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 7d05ea75036..6ec996a80e5 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -1,33 +1,9 @@ /* * Contains: - * Lasertag * Costume * Misc */ -/* - * Lasertag - */ -/obj/item/clothing/suit/bluetag - name = "blue laser tag armor" - desc = "Blue Pride, Station Wide." - icon_state = "bluetag" - item_state = "bluetag" - blood_overlay_type = "armor" - body_parts_covered = UPPER_TORSO - allowed = list (/obj/item/gun/energy/lasertag/blue) - siemens_coefficient = 1.0 - -/obj/item/clothing/suit/redtag - name = "red laser tag armor" - desc = "Reputed to go faster." - icon_state = "redtag" - item_state = "redtag" - blood_overlay_type = "armor" - body_parts_covered = UPPER_TORSO - allowed = list (/obj/item/gun/energy/lasertag/red) - siemens_coefficient = 1.0 - /* * Costume */ @@ -576,7 +552,7 @@ w_class = ITEMSIZE_SMALL body_parts_covered = UPPER_TORSO|LOWER_TORSO attack_verb = list("warned", "cautioned", "smashed") - armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/suit/caution/attack_self() toggle() diff --git a/code/modules/clothing/under/accessories/xeno/tajara.dm b/code/modules/clothing/under/accessories/xeno/tajara.dm index 454a4ca1cd0..acd77c29f99 100644 --- a/code/modules/clothing/under/accessories/xeno/tajara.dm +++ b/code/modules/clothing/under/accessories/xeno/tajara.dm @@ -116,7 +116,7 @@ desc_fluff = "The Party of the Free Tajara under the Leadership of Hadii is the only and ruling party in the PRA, with its leader always being the elected president. \ They follow Hadiism as their main ideology, with the objective of securing the tajaran freedom and place in the galactic community. Membership of the Hadiist Party is not open. \ For anyone to become a member, they must be approved by a committee that will consider their qualifications and past. Goverment officials can grant honorary memberships, this is \ - seem as nothing but a honor and does not grant any status or position that a regular Party member would have." + seen as nothing but a honor and does not grant any status or position that a regular Party member would have." w_class = ITEMSIZE_TINY flippable = TRUE v_flippable = FALSE diff --git a/code/modules/cooking/machinery/cooking_machines/_appliance.dm b/code/modules/cooking/machinery/cooking_machines/_appliance.dm index 91c83e0e5f0..b50640222e6 100644 --- a/code/modules/cooking/machinery/cooking_machines/_appliance.dm +++ b/code/modules/cooking/machinery/cooking_machines/_appliance.dm @@ -254,12 +254,11 @@ oilwork(J, CI) for (var/_R in CI.container.reagents.reagent_volumes) - var/decl/reagent/R = decls_repository.get_decl(_R) - if (istype(R, /decl/reagent/nutriment)) + if (ispath(_R, /decl/reagent/nutriment)) CI.max_cookwork += CI.container.reagents.reagent_volumes[_R] *2//Added reagents contribute less than those in food items due to granular form //Nonfat reagents will soak oil - if (!istype(R, /decl/reagent/nutriment/triglyceride)) + if (!ispath(_R, /decl/reagent/nutriment/triglyceride)) CI.max_oil += CI.container.reagents.reagent_volumes[_R] * 0.25 else CI.max_cookwork += CI.container.reagents.reagent_volumes[_R] @@ -275,12 +274,11 @@ var/work = 0 if (istype(S) && S.reagents) for (var/_R in S.reagents.reagent_volumes) - var/decl/reagent/R = decls_repository.get_decl(_R) - if (istype(R, /decl/reagent/nutriment)) + if (ispath(_R, /decl/reagent/nutriment)) work += S.reagents.reagent_volumes[_R] *3//Core nutrients contribute much more than peripheral chemicals //Nonfat reagents will soak oil - if (!istype(R, /decl/reagent/nutriment/triglyceride)) + if (!ispath(_R, /decl/reagent/nutriment/triglyceride)) CI.max_oil += S.reagents.reagent_volumes[_R] * 0.35 else work += S.reagents.reagent_volumes[_R] @@ -575,15 +573,15 @@ result.kitchen_tag = SA.kitchen_tag if (SA.meat_amount) reagent_amount = SA.meat_amount*9 // at a rate of 9 protein per meat - var/decl/reagent/digest_product = victim.get_digestion_product() + var/digest_product_type = victim.get_digestion_product() // DOES NOT RETURN A DECL, RETURNS A PATH var/list/data var/meat_name = result.kitchen_tag || victim.name if(ishuman(victim)) var/mob/living/carbon/human/CH = victim meat_name = CH.species?.name || meat_name - if(istype(digest_product, /decl/reagent/nutriment/protein)) + if(ispath(digest_product_type, /decl/reagent/nutriment/protein)) data = list("[meat_name] meat" = reagent_amount) - result.reagents.add_reagent(victim.get_digestion_product(), reagent_amount, data) + result.reagents.add_reagent(digest_product_type, reagent_amount, data) if (victim.reagents) victim.reagents.trans_to(result, victim.reagents.total_volume) diff --git a/code/modules/cooking/machinery/cooking_machines/fryer.dm b/code/modules/cooking/machinery/cooking_machines/fryer.dm index 25a4f7695ff..4de8faa54cd 100644 --- a/code/modules/cooking/machinery/cooking_machines/fryer.dm +++ b/code/modules/cooking/machinery/cooking_machines/fryer.dm @@ -102,10 +102,9 @@ for (var/obj/item/I in CI.container) if (I.reagents && I.reagents.total_volume) for (var/_R in I.reagents.reagent_volumes) - var/decl/reagent/R = decls_repository.get_decl(_R) - if (istype(R, /decl/reagent/nutriment/triglyceride/oil)) + if (ispath(_R, /decl/reagent/nutriment/triglyceride/oil)) total_oil += I.reagents.reagent_volumes[_R] - if (R.type != our_oil.type) + if (_R != our_oil.type) total_removed += I.reagents.reagent_volumes[_R] I.reagents.remove_reagent(_R, I.reagents.reagent_volumes[_R]) else @@ -206,8 +205,7 @@ //So for now, restrict to oil only var/amount = 0 for (var/_R in I.reagents.reagent_volumes) - var/decl/reagent/R = decls_repository.get_decl(_R) - if (istype(R, /decl/reagent/nutriment/triglyceride/oil)) + if (ispath(_R, /decl/reagent/nutriment/triglyceride/oil)) var/delta = REAGENTS_FREE_SPACE(oil) delta = min(delta, I.reagents.reagent_volumes[_R]) oil.add_reagent(_R, delta) diff --git a/code/modules/cooking/recipes/recipe.dm b/code/modules/cooking/recipes/recipe.dm index 0427336121f..c7e7d67e88b 100644 --- a/code/modules/cooking/recipes/recipe.dm +++ b/code/modules/cooking/recipes/recipe.dm @@ -37,7 +37,7 @@ var/list/reagents // example: = list(/decl/reagent/drink/berryjuice = 5) // do not list same reagent twice var/list/items // example: = list(/obj/item/crowbar, /obj/item/welder) // place /foo/bar before /foo var/list/fruit // example: = list("fruit" = 3) - var/decl/reagent/coating = null//Required coating on all items in the recipe. The default value of null explitly requires no coating + var/coating = null//Required coating on all items in the recipe. The default value of null explitly requires no coating //A value of -1 is permissive and cares not for any coatings //Any typepath indicates a specific coating that should be present //Coatings are used for batter, breadcrumbs, beer-batter, colonel's secret coating, etc @@ -172,7 +172,7 @@ if (coating == -1) return TRUE //-1 value doesnt care - return !coating || (S.coating.type == coating) + return !coating || (S.coating == coating) //general version /decl/recipe/proc/make(var/obj/container as obj) diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index f10a8a8701a..e62977e2686 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -144,7 +144,7 @@ for(var/_R in reagents.reagent_volumes) var/decl/reagent/R = decls_repository.get_decl(_R) var/strength = R.germ_adjust * reagents.reagent_volumes[_R]/4 - if(istype(R, /decl/reagent/alcohol)) + if(ispath(_R, /decl/reagent/alcohol)) var/decl/reagent/alcohol/A = R strength = strength * (A.strength/100) W.germ_level -= min(strength, W.germ_level)//Clean the wound a bit. diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm index e717a4542b7..9437d66ec39 100644 --- a/code/modules/events/infestation.dm +++ b/code/modules/events/infestation.dm @@ -116,7 +116,7 @@ chosen_mob_types += chosen_slime_type if(INFESTATION_SPIDERLINGS) - event_name = "Spiderling Infestation" + event_name = "Greimorian Infestation" chosen_verb = "have burrowed into" for(var/i = 1, i < rand(3,6),i++) chosen_mob_types += /obj/effect/spider/spiderling diff --git a/code/modules/heavy_vehicle/components/armor.dm b/code/modules/heavy_vehicle/components/armor.dm index 0ad058d1b83..b3c2663c895 100644 --- a/code/modules/heavy_vehicle/components/armor.dm +++ b/code/modules/heavy_vehicle/components/armor.dm @@ -13,7 +13,7 @@ /obj/item/robot_parts/robot_component/armor/mech/Initialize() . = ..() - AddComponent(/datum/component/armor, armor, ARMOR_TYPE_EXOSUIT) + AddComponent(/datum/component/armor, armor, ARMOR_TYPE_STANDARD|ARMOR_TYPE_EXOSUIT) /obj/item/robot_parts/robot_component/armor/mech/radproof name = "radiation-proof armor plating" diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index 2f8255cd6cb..9587526a4e7 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -114,7 +114,7 @@ dat += "
This sample contains: " for(var/_R in grown_reagents.reagent_volumes) var/decl/reagent/R = decls_repository.get_decl(_R) - dat += "
- [R.name], [REAGENT_VOLUME(grown_reagents, R.type)] unit(s)" + dat += "
- [R.name], [REAGENT_VOLUME(grown_reagents, _R)] unit(s)" dat += "

Other Data

" diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 5ecece3157f..289b98f4100 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -7,6 +7,7 @@ w_class = ITEMSIZE_SMALL icon = 'icons/obj/assemblies/electronic_setups.dmi' icon_state = "setup_small" + flags = NOBLUDGEON var/max_components = IC_COMPONENTS_BASE var/max_complexity = IC_COMPLEXITY_BASE var/opened = 0 diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm index cb82d8ac7a1..5052ea23b50 100644 --- a/code/modules/integrated_electronics/core/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -109,7 +109,7 @@ settings to specific circuits, or for debugging purposes. It can also pulse activation pins." icon = 'icons/obj/assemblies/electronic_tools.dmi' icon_state = "debugger" - flags = CONDUCT + flags = CONDUCT | NOBLUDGEON w_class = ITEMSIZE_SMALL var/data_to_write = null var/accepting_refs = 0 diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index 3059e12d6af..8349c1f4a21 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -502,8 +502,7 @@ var/list/worths = list( /obj/item/clothing/suit/security/hos/dnavy = 80, /obj/item/clothing/suit/storage/hazardvest = 60, /obj/item/clothing/suit/storage/toggle/labcoat = 55, - /obj/item/clothing/suit/bluetag = 20, - /obj/item/clothing/suit/redtag = 20, + /obj/item/clothing/suit/armor/riot/laser_tag = 125, /obj/item/clothing/suit/fire/heavy = 600, /obj/item/clothing/suit/fire = 500, /obj/item/clothing/suit/radiation = 450, diff --git a/code/modules/makeshift/makeshift_reagents.dm b/code/modules/makeshift/makeshift_reagents.dm index b5243d5d39a..5730e0aae1e 100644 --- a/code/modules/makeshift/makeshift_reagents.dm +++ b/code/modules/makeshift/makeshift_reagents.dm @@ -185,46 +185,48 @@ var/obj/item/weldingtool/welder /obj/structure/distillery/dismantle() - var/obj/structure/reagent_dispensers/keg/keg = new (loc) - if (src.reagents && src.reagents.total_volume) - src.reagents.trans_to_holder(keg.reagents, src.reagents.total_volume) - new /obj/item/stack/rods(get_turf(src), 3) + var/turf/T = get_turf(src) + var/obj/structure/reagent_dispensers/keg/keg = new (T) + if (reagents?.total_volume) + reagents.trans_to_holder(keg.reagents, reagents.total_volume) + new /obj/item/stack/rods(T, 3) if(welder) - welder.forceMove(loc) + welder.forceMove(T) welder = null qdel(src) /obj/structure/distillery/proc/trans_item(obj/item/W, mob/user) if(transfer_out) if(!reagents.total_volume) - to_chat(user, SPAN_NOTICE("\The [src] is empty.")) + to_chat(user, SPAN_NOTICE("[src] is empty.")) return var/amt = reagents.trans_to_holder(W.reagents, reagents.total_volume) - to_chat(user, SPAN_NOTICE("You fill \the [W] with [amt] units from \the [src].")) + to_chat(user, SPAN_NOTICE("You fill [W] with [amt] units from [src].")) return else - if(!W.reagents || !W.reagents.total_volume) - to_chat(user, SPAN_NOTICE("\The [W] is empty.")) + if(!W.reagents?.total_volume) + to_chat(user, SPAN_NOTICE("[W] is empty.")) return - var/amt = min(10, W.reagents.total_volume) - W.reagents.trans_to_holder(src.reagents, amt) // just pour it if you can - to_chat(user, SPAN_NOTICE("You pour [amt] units from \the [W] into \the [src].")) + var/amt = 5 + if(istype(W, /obj/item/reagent_containers)) + var/obj/item/reagent_containers/reagent_container = W + amt = reagent_container.amount_per_transfer_from_this + W.reagents.trans_to_holder(reagents, amt) // just pour it if you can + to_chat(user, SPAN_NOTICE("You pour [amt] units from [W] into [src].")) return /obj/structure/distillery/proc/distill() - if(!reagents || !reagents.total_volume) // can't distill nothing + if(!reagents?.total_volume) // can't distill nothing return for(var/_R in reagents.reagent_volumes) + if(!ispath(_R, /decl/reagent/alcohol)) + continue var/decl/reagent/alcohol/AR = decls_repository.get_decl(_R) - if(!istype(AR)) - return - var/ARvol = REAGENT_VOLUME(reagents, AR.type) - reagents.add_reagent(/decl/reagent/water, (1-(AR.strength/100))*ARvol) - if(istype(AR, /decl/reagent/alcohol)) - reagents.add_reagent(/decl/reagent/alcohol, (AR.strength/100)*ARvol) - else if(istype(AR, /decl/reagent/alcohol/butanol)) - reagents.add_reagent(/decl/reagent/alcohol/butanol, (AR.strength/100)*ARvol) - reagents.remove_reagent(AR.type, ARvol) + var/ARvol = REAGENT_VOLUME(reagents, _R) + var/alcohol_fraction = AR.strength/100 + reagents.add_reagent(/decl/reagent/water, (1-alcohol_fraction)*ARvol) + reagents.add_reagent(ispath(_R, /decl/reagent/alcohol/butanol) ? /decl/reagent/alcohol/butanol : /decl/reagent/alcohol, alcohol_fraction*ARvol) + reagents.remove_reagent(_R, ARvol) icon_state = "distillery-off" /obj/structure/distillery/attackby(obj/item/W, mob/user) diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index e9dcccd25b6..89aa8d138ef 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -67,6 +67,9 @@ new /datum/stack_recipe("custodial cart", /obj/structure/janitorialcart, BUILD_AMT, time = 120, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("closet", /obj/structure/closet, BUILD_AMT, time = 15, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1), + new /datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, BUILD_AMT, one_per_turf = 1, on_floor = 1), + new /datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, BUILD_AMT, one_per_turf = 1, on_floor = 1), + new /datum/stack_recipe("plain comfy chair", /obj/structure/bed/chair/comfy, BUILD_AMT, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("sofa (middle)", /obj/structure/bed/chair/comfy/sofa, BUILD_AMT, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("sofa (left)", /obj/structure/bed/chair/comfy/sofa/left, BUILD_AMT, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("sofa (right)", /obj/structure/bed/chair/comfy/sofa/right, BUILD_AMT, one_per_turf = 1, on_floor = 1), @@ -94,25 +97,6 @@ new /datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, BUILD_AMT, time = 50, one_per_turf = 1, on_floor = 1) )) - recipes += new /datum/stack_recipe_list("office chairs", - list( - new /datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, BUILD_AMT, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, BUILD_AMT, one_per_turf = 1, on_floor = 1) - )) - - recipes += new /datum/stack_recipe_list("comfy chairs", - list( - new /datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, BUILD_AMT, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, BUILD_AMT, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("brown comfy chair", /obj/structure/bed/chair/comfy/brown, BUILD_AMT, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("lime comfy chair", /obj/structure/bed/chair/comfy/lime, BUILD_AMT, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("teal comfy chair", /obj/structure/bed/chair/comfy/teal, BUILD_AMT, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("red comfy chair", /obj/structure/bed/chair/comfy/red, BUILD_AMT, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, BUILD_AMT, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, BUILD_AMT, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, BUILD_AMT, one_per_turf = 1, on_floor = 1) - )) - recipes += new /datum/stack_recipe_list("turret frames", list( new /datum/stack_recipe("light turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1), diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index be609aadd2e..02016ea63a9 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -101,7 +101,7 @@ blinded = 1 silent = 0 else //ALIVE. LIGHTS ARE ON - if( !container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life)) ) + if(!container && (health < config.health_threshold_dead || ((config.revival_brain_life != -1) && world.time - timeofhostdeath > config.revival_brain_life))) death() blinded = 1 silent = 0 diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index d98317f8ca1..514316f5c89 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -146,8 +146,9 @@ //presumably, if they are wearing a helmet that stops pressure effects, then it probably covers the throat as well var/obj/item/clothing/head/helmet = get_equipped_item(slot_head) if(istype(helmet) && (helmet.body_parts_covered & HEAD) && (helmet.flags & STOPPRESSUREDAMAGE)) - //we don't do an armor_check here because this is not an impact effect like a weapon swung with momentum, that either penetrates or glances off. - damage_mod = 1.0 - (LAZYACCESS(helmet.armor, "melee")/100) + var/datum/component/armor/armor_component = helmet.GetComponent(/datum/component/armor) + if(armor_component) + damage_mod -= armor_component.get_blocked(BRUTE, damage_flags, W.armor_penetration, W.force*1.5) var/total_damage = 0 for(var/i in 1 to 3) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 4ec40811bde..52dcbe9823c 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -480,6 +480,8 @@ var/datum/gas_mixture/breath = H.get_breath_from_environment() var/fail = L.handle_breath(breath, 1) if(!fail) + if(!L.is_bruised()) + losebreath = 0 to_chat(src, "You feel a breath of fresh air enter your lungs. It feels good.") cpr(H) //Again. diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index d9e15e8b585..fb4daec6c3a 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -148,12 +148,13 @@ var/turf/T = loc var/footsound var/top_layer = 0 - for(var/obj/structure/S in T) - if(S.layer > top_layer && S.footstep_sound) - top_layer = S.layer - footsound = S.footstep_sound - if(!footsound) - footsound = T.footstep_sound + if(istype(T)) + for(var/obj/structure/S in T) + if(S.layer > top_layer && S.footstep_sound) + top_layer = S.layer + footsound = S.footstep_sound + if(!footsound) + footsound = T.footstep_sound if (client) var/turf/B = GetAbove(T) diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm index 3944d52343b..fd9ad41a6d9 100644 --- a/code/modules/mob/living/carbon/human/species/station/golem.dm +++ b/code/modules/mob/living/carbon/human/species/station/golem.dm @@ -766,7 +766,7 @@ var/global/list/golem_types = list(SPECIES_GOLEM_COAL, /datum/species/golem/uranium/handle_environment_special(var/mob/living/carbon/human/H) if(prob(25)) for(var/mob/living/L in view(7, H)) - L.apply_damage(150, IRRADIATE, damage_flags = DAM_DISPERSED) + L.apply_damage(20, IRRADIATE, damage_flags = DAM_DISPERSED) /datum/species/golem/homunculus name = SPECIES_GOLEM_MEAT diff --git a/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm index f97fce081b5..eb15c7427d3 100644 --- a/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm @@ -10,7 +10,7 @@ grab_mod = 1 blurb = "IPCs with humanlike properties. Their focus is on service, civilian, and medical, but there are no \ - job restrictions. Created in the late days of 2457, the Shell is a controversial IPC model equipped with a synthskin weave applied over its metal chassis \ + job restrictions. Created in the late days of 2450, the Shell is a controversial IPC model equipped with a synthskin weave applied over its metal chassis \ to create an uncannily close approximation of the organic form. Early models of Shell had the advantage of being able to compose themselves of a wide \ variety of organic parts, but contemporary models have been restricted to a single species for the sake of prosthetic integrity. The additional weight of \ the synthskin on the original Hephaestus frame reduces the efficacy of the unit's already strained coolant systems, and increases charge consumption." @@ -19,6 +19,7 @@ icobase = 'icons/mob/human_races/human/r_human.dmi' deform = 'icons/mob/human_races/ipc/robotic.dmi' + preview_icon = 'icons/mob/human_races/ipc/shell_preview.dmi' light_range = 0 light_power = 0 diff --git a/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm b/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm index 70c4d205db8..d0612bd3833 100644 --- a/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm +++ b/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm @@ -81,6 +81,7 @@ ACCENT_SILVERSUN, ACCENT_KONYAN, ACCENT_EUROPA) zombie_type = SPECIES_ZOMBIE_SKRELL + bodyfall_sound = /decl/sound_category/bodyfall_skrell_sound /datum/species/skrell/handle_post_spawn(mob/living/carbon/human/H) ..() diff --git a/code/modules/mob/living/carbon/taste.dm b/code/modules/mob/living/carbon/taste.dm index f908079052a..ddf1e92f8e9 100644 --- a/code/modules/mob/living/carbon/taste.dm +++ b/code/modules/mob/living/carbon/taste.dm @@ -35,8 +35,8 @@ calculate text size per text. var/decl/reagent/R = decls_repository.get_decl(_R) if(!R.taste_mult) continue - if(R.type == /decl/reagent/nutriment) - var/list/taste_data = REAGENT_DATA(src, R.type) + if(_R == /decl/reagent/nutriment) + var/list/taste_data = REAGENT_DATA(src, _R) for(var/taste in taste_data) if(taste in tastes) tastes[taste] += taste_data[taste] @@ -44,7 +44,7 @@ calculate text size per text. tastes[taste] = taste_data[taste] else var/taste_desc = R.taste_description - var/taste_amount = REAGENT_VOLUME(src, R.type) * R.taste_mult + var/taste_amount = REAGENT_VOLUME(src, _R) * R.taste_mult if(R.taste_description in tastes) tastes[taste_desc] += taste_amount else diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index c463b6d33d1..ac8b2dd0ce9 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -161,7 +161,7 @@ if(length(message) >= 2 && is_language_prefix(prefix)) var/language_prefix = lowertext(copytext(message, 2, 4)) var/datum/language/L = language_keys[language_prefix] - if(!L) + if(!L || !can_speak(L)) language_prefix = lowertext(copytext(message, 2, 3)) L = language_keys[language_prefix] if(can_speak(L)) diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 31faf8ca6dc..ae576998854 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -156,20 +156,17 @@ if(prob(damprob)) take_internal_damage(1) if(prob(damprob)) - take_internal_damage(2) + take_internal_damage(1) ..() /obj/item/organ/internal/brain/take_internal_damage(var/damage, var/silent) set waitfor = 0 - if(damage >= (max_damage / 4)) - damage *= 2 ..() if(damage >= (max_damage / 5)) //This probably won't be triggered by oxyloss or mercury. Probably. var/damage_secondary = damage * 0.20 owner.eye_blurry += damage_secondary owner.confused += damage_secondary * 2 owner.Weaken(round(damage_secondary * 3, 1)) - owner.adjustOxyLoss(damage) if(prob(30)) addtimer(CALLBACK(src, .proc/brain_damage_callback, damage), rand(6, 20) SECONDS, TIMER_UNIQUE) diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index 8705083be4b..b638b46e69c 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -1,5 +1,4 @@ #define HUMAN_MAX_OXYLOSS 1 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it. -#define HUMAN_CRIT_MAX_OXYLOSS ( 2.0 / 6) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 50HP to get through, so (1/6)*last_tick_duration per second. Breaths however only happen every 4 ticks. last_tick_duration = ~2.0 on average /obj/item/organ/internal/lungs name = "lungs" @@ -67,7 +66,7 @@ "You can't breathe!", "You hear someone gasp for air!", ) - owner.losebreath += round(damage/2) + owner.losebreath = max(round(damage / 2), owner.losebreath) if(rescued) if(is_bruised()) @@ -377,4 +376,3 @@ rescued = FALSE #undef HUMAN_MAX_OXYLOSS -#undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 7486b2a9d74..d9cf814b36a 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -13,6 +13,7 @@ var/vital //Lose a vital limb, die immediately. var/rejecting // Is this organ already being rejected? var/is_augment = FALSE + var/death_time //Organ damage stats. var/damage = 0 // amount of damage to the organ @@ -128,6 +129,7 @@ return damage = max_damage status |= ORGAN_DEAD + death_time = world.time STOP_PROCESSING(SSprocessing, src) if(owner && vital) owner.death() @@ -141,8 +143,9 @@ /obj/item/organ/proc/can_feel_pain() return (!BP_IS_ROBOTIC(src) && (!species || !(species.flags & NO_PAIN))) +#define ORGAN_RECOVERY_THRESHOLD (5 MINUTES) /obj/item/organ/proc/can_recover() - return max_damage > 0 + return (max_damage > 0) && !(status & ORGAN_DEAD) || death_time >= world.time - ORGAN_RECOVERY_THRESHOLD /obj/item/organ/process() if(loc != owner) diff --git a/code/modules/power/lights/fixtures.dm b/code/modules/power/lights/fixtures.dm index 0cf70217b15..b8060647d30 100644 --- a/code/modules/power/lights/fixtures.dm +++ b/code/modules/power/lights/fixtures.dm @@ -225,7 +225,7 @@ active_power_usage = ((light_range * light_power) * 10) /obj/machinery/light/proc/broken_sparks() - if(world.time > next_spark && has_power()) + if(world.time > next_spark && !(stat & POWEROFF) && has_power()) spark(src, 3, alldirs) next_spark = world.time + 1 MINUTE + (rand(-15, 15) SECONDS) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index c990ee22712..9f2aa18f12a 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -211,41 +211,55 @@ obj/item/gun/energy/retro /obj/item/gun/energy/lasertag name = "laser tag gun" + desc = "A simple low-power laser gun, outfitted for use in laser tag arenas." item_state = "laser" has_item_ratio = FALSE - desc = "Standard issue weapon of the Imperial Guard" origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2) - self_recharge = 1 + self_recharge = TRUE + recharge_time = 2 matter = list(DEFAULT_WALL_MATERIAL = 2000) fire_sound = 'sound/weapons/laser1.ogg' - projectile_type = /obj/item/projectile/beam/lastertag/blue - var/required_vest + projectile_type = /obj/item/projectile/beam/laser_tag + pin = /obj/item/device/firing_pin/tag/red + can_turret = TRUE + turret_is_lethal = FALSE + turret_sprite_set = "red" -/obj/item/gun/energy/lasertag/special_check(var/mob/living/carbon/human/M) - if(ishuman(M)) - if(!istype(M.wear_suit, required_vest)) - to_chat(M, "You need to be wearing your laser tag vest!") - return 0 +/obj/item/gun/energy/lasertag/attackby(obj/item/I, mob/user) + if(I.ismultitool()) + var/chosen_color = input(user, "Which color do you wish your gun to be?", "Color Selection") as null|anything in list("blue", "red") + if(!chosen_color) + return + get_tag_color(chosen_color) + to_chat(user, SPAN_NOTICE("\The [src] is now a [chosen_color] laser tag gun.")) + return return ..() +/obj/item/gun/energy/lasertag/proc/get_tag_color(var/set_color) + projectile_type = text2path("/obj/item/projectile/beam/laser_tag/[set_color]") + if(pin) + QDEL_NULL(pin) + var/pin_path = text2path("/obj/item/device/firing_pin/tag/[set_color]") + pin = new pin_path(src) + switch(set_color) + if("red") + icon = 'icons/obj/guns/redtag.dmi' + if("blue") + icon = 'icons/obj/guns/bluetag.dmi' + icon_state = "[set_color]tag" + item_state = icon_state + modifystate = item_state + update_held_icon() + /obj/item/gun/energy/lasertag/blue icon = 'icons/obj/guns/bluetag.dmi' icon_state = "bluetag" item_state = "bluetag" - projectile_type = /obj/item/projectile/beam/lastertag/blue - required_vest = /obj/item/clothing/suit/bluetag + projectile_type = /obj/item/projectile/beam/laser_tag/blue pin = /obj/item/device/firing_pin/tag/blue - can_turret = 1 - turret_is_lethal = 0 turret_sprite_set = "blue" /obj/item/gun/energy/lasertag/red icon = 'icons/obj/guns/redtag.dmi' icon_state = "redtag" - item_state = "redtag" - projectile_type = /obj/item/projectile/beam/lastertag/red - required_vest = /obj/item/clothing/suit/redtag - pin = /obj/item/device/firing_pin/tag/red - can_turret = 1 - turret_is_lethal = 0 - turret_sprite_set = "red" + item_state = "redtag" \ No newline at end of file diff --git a/code/modules/projectiles/modular/laser_components.dm b/code/modules/projectiles/modular/laser_components.dm index fb6a58635ff..41eb2cf4f4e 100644 --- a/code/modules/projectiles/modular/laser_components.dm +++ b/code/modules/projectiles/modular/laser_components.dm @@ -365,21 +365,21 @@ /obj/item/laser_components/modulator/red name = "red team modulator" desc = "Modulates the beam into firing red team tagger beams." - projectile = /obj/item/projectile/beam/lastertag/red + projectile = /obj/item/projectile/beam/laser_tag damage = 0 icon_state = "red" /obj/item/laser_components/modulator/blue name = "blue team modulator" desc = "Modulates the beam into firing blue team tagger beams." - projectile = /obj/item/projectile/beam/lastertag/blue + projectile = /obj/item/projectile/beam/laser_tag/blue damage = 0 icon_state = "blue" /obj/item/laser_components/modulator/omni name = "omni team modulator" desc = "Modulates the beam into firing omni team tagger beams." - projectile = /obj/item/projectile/beam/lastertag/omni + projectile = /obj/item/projectile/beam/laser_tag/omni damage = 0 icon_state = "omni" diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 21a68092f91..721f157f70d 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -181,28 +181,26 @@ Pins Below. name = "laser tag firing pin" desc = "A recreational firing pin, used in laser tag units to ensure users have their vests on." fail_message = "SUIT CHECK FAILED." - var/obj/item/clothing/suit/suit_requirement = null - var/tagcolor = "" + var/tag_color = "" /obj/item/device/firing_pin/tag/pin_auth(mob/living/user) if(ishuman(user)) - var/mob/living/carbon/human/M = user - if(istype(M.wear_suit, suit_requirement)) - return 1 - to_chat(user, "You need to be wearing [tagcolor] laser tag armor!") - return 0 + var/mob/living/carbon/human/H = user + var/obj/item/clothing/suit/armor/riot/laser_tag/LT = H.wear_suit + if(istype(LT) && tag_color == LT.laser_tag_color) + return TRUE + to_chat(user, SPAN_WARNING("You need to be wearing [tag_color] laser tag armor!")) + return FALSE /obj/item/device/firing_pin/tag/red name = "red laser tag firing pin" icon_state = "firing_pin_red" - suit_requirement = /obj/item/clothing/suit/redtag - tagcolor = "red" + tag_color = "red" /obj/item/device/firing_pin/tag/blue name = "blue laser tag firing pin" icon_state = "firing_pin_blue" - suit_requirement = /obj/item/clothing/suit/bluetag - tagcolor = "blue" + tag_color = "blue" /obj/item/device/firing_pin/Destroy() if(gun) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index cb7750d7489..d6973236951 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -99,27 +99,7 @@ tracer_type = /obj/effect/projectile/tracer/emitter impact_type = /obj/effect/projectile/impact/emitter -/obj/item/projectile/beam/lastertag/blue - name = "lasertag beam" - icon_state = "bluelaser" - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - damage = 0 - no_attack_log = 1 - damage_type = BURN - check_armor = "laser" - - muzzle_type = /obj/effect/projectile/muzzle/laser/blue - tracer_type = /obj/effect/projectile/tracer/laser/blue - impact_type = /obj/effect/projectile/impact/laser/blue - -/obj/item/projectile/beam/lastertag/blue/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living/carbon/human)) - var/mob/living/carbon/human/M = target - if(istype(M.wear_suit, /obj/item/clothing/suit/redtag)) - M.Weaken(5) - return 1 - -/obj/item/projectile/beam/lastertag/red +/obj/item/projectile/beam/laser_tag name = "lasertag beam" icon_state = "laser" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE @@ -127,32 +107,38 @@ no_attack_log = 1 damage_type = BURN check_armor = "laser" + var/laser_tag_color = "red" -/obj/item/projectile/beam/lastertag/red/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living/carbon/human)) - var/mob/living/carbon/human/M = target - if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag)) - M.Weaken(5) - return 1 + muzzle_type = /obj/effect/projectile/muzzle/laser + tracer_type = /obj/effect/projectile/tracer/laser + impact_type = /obj/effect/projectile/impact/laser -/obj/item/projectile/beam/lastertag/omni//A laser tag bolt that stuns EVERYONE +/obj/item/projectile/beam/laser_tag/on_hit(var/atom/target, var/blocked = 0) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + var/obj/item/clothing/suit/armor/riot/laser_tag/LT = H.wear_suit + if(istype(LT) && laser_tag_color != LT.laser_tag_color) + LT.laser_hit() + return TRUE + +/obj/item/projectile/beam/laser_tag/blue + name = "lasertag beam" + icon_state = "bluelaser" + laser_tag_color = "blue" + + muzzle_type = /obj/effect/projectile/muzzle/laser/blue + tracer_type = /obj/effect/projectile/tracer/laser/blue + impact_type = /obj/effect/projectile/impact/laser/blue + +/obj/item/projectile/beam/laser_tag/omni//A laser tag bolt that stuns EVERYONE name = "lasertag beam" icon_state = "omnilaser" - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - damage = 0 - damage_type = BURN - check_armor = "laser" + laser_tag_color = "omni" muzzle_type = /obj/effect/projectile/muzzle/disabler tracer_type = /obj/effect/projectile/tracer/disabler impact_type = /obj/effect/projectile/impact/disabler -/obj/item/projectile/beam/lastertag/omni/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living/carbon/human)) - var/mob/living/carbon/human/M = target - if((istype(M.wear_suit, /obj/item/clothing/suit/bluetag))||(istype(M.wear_suit, /obj/item/clothing/suit/redtag))) - M.Weaken(5) - return 1 /obj/item/projectile/beam/sniper name = "sniper beam" diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index e6b7a801dd0..c74e696bd50 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -385,7 +385,7 @@ var/turf/T = get_turf(mob) if(T && (loc.z == T.z)) if(ishuman(mob)) - mob.apply_effect(450, IRRADIATE) + mob.apply_damage(250, IRRADIATE, damage_flags = DAM_DISPERSED) new /obj/effect/temp_visual/nuke(A.loc) explosion(A,2,5,9) ..() diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 4e8565cee50..7ffa1f2be3d 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -197,6 +197,7 @@ damage = 30 check_armor = "laser" damage_type = BURN + damage_flags = DAM_LASER pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE muzzle_type = /obj/effect/projectile/muzzle/bolt hit_effect = /obj/effect/temp_visual/blaster_effect @@ -216,7 +217,6 @@ pass_flags = PASSTABLE muzzle_type = /obj/effect/projectile/muzzle/bolt - /obj/item/projectile/energy/blaster/heavy damage = 35 diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index dab4244c99c..63b1098240a 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -330,6 +330,12 @@ /obj/item/stack/material/glass = list(/decl/reagent/silicate), /obj/item/stack/material/glass/phoronglass = list(/decl/reagent/platinum, /decl/reagent/silicate, /decl/reagent/silicate, /decl/reagent/silicate), //5 platinum, 15 silicate, ) + var/list/beaker_types = list( // also can't be ground + /obj/item/reagent_containers/glass, + /obj/item/reagent_containers/food/drinks/drinkingglass, + /obj/item/reagent_containers/food/drinks/shaker, + /obj/item/reagent_containers/cooking_container + ) /obj/machinery/reagentgrinder/Initialize() . = ..() @@ -340,10 +346,7 @@ return /obj/machinery/reagentgrinder/attackby(var/obj/item/O as obj, var/mob/user as mob) - - if (istype(O,/obj/item/reagent_containers/glass) || \ - istype(O,/obj/item/reagent_containers/food/drinks/drinkingglass) || \ - istype(O,/obj/item/reagent_containers/food/drinks/shaker)) + if (is_type_in_list(O, beaker_types)) if (beaker) return 1 else diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index b8d3c53d3a1..fae573002f1 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -705,7 +705,6 @@ if(alien != IS_DIONA) if (caffeine) M.add_up_to_chemical_effect(CE_SPEEDBOOST, caffeine) - M.add_chemical_effect(CE_PULSE, 1) M.dizziness = max(0, M.dizziness + adj_dizzy) M.drowsyness = max(0, M.drowsyness + adj_drowsy) M.sleeping = max(0, M.sleeping + adj_sleepy) @@ -4513,6 +4512,19 @@ M.dizziness += 5 M.drowsyness = 0 +/decl/reagent/drink/hrozamal_soda + name = "Hro'zamal Soda" + description = "A cabornated version of the herbal tea made with Hro'zamal Ras'Nifs powder." + color = "#F0C56C" + adj_sleepy = -1 + caffeine = 0.2 + taste_description = "carbonated fruit sweetness" + carbonated = TRUE + + glass_icon_state = "hrozamal_soda_glass" + glass_name = "glass of Hro'zamal Soda" + glass_desc = "A cabornated version of the herbal tea made with Hro'zamal Ras'Nifs powder." + /decl/reagent/nutriment/pumpkinpulp name = "Pumpkin Pulp" description = "The gooey insides of a slain pumpkin. This day is the greatest..." diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index 6c36549fc41..bfdf41fa37a 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -139,13 +139,11 @@ var/removing = (4 * removed) var/datum/reagents/ingested = M.get_ingested_reagents() for(var/_R in ingested.reagent_volumes) - var/decl/reagent/R = decls_repository.get_decl(_R) - if((remove_generic && istype(R, /decl/reagent/toxin)) || (_R in remove_toxins)) - ingested.remove_reagent(R.type, removing) + if((remove_generic && ispath(_R, /decl/reagent/toxin)) || (_R in remove_toxins)) + ingested.remove_reagent(_R, removing) return for(var/_R in M.reagents.reagent_volumes) - var/decl/reagent/R = decls_repository.get_decl(_R) - if((remove_generic && istype(R, /decl/reagent/toxin)) || (_R in remove_toxins)) + if((remove_generic && ispath(_R, /decl/reagent/toxin)) || (_R in remove_toxins)) M.reagents.remove_reagent(_R, removing) return @@ -605,10 +603,9 @@ var/datum/reagents/ingested = M.get_ingested_reagents() if(ingested) for(var/_R in ingested.reagent_volumes) - var/decl/reagent/R = decls_repository.get_decl(_R) - if(istype(R, /decl/reagent/alcohol)) + if(ispath(_R, /decl/reagent/alcohol)) var/amount = min(P, REAGENT_VOLUME(ingested, _R)) - ingested.remove_reagent(R.type, amount) + ingested.remove_reagent(_R, amount) P -= amount if (P <= 0) return @@ -617,8 +614,7 @@ //as a treatment option if someone was dumb enough to do this if(M.bloodstr) for(var/_R in M.bloodstr.reagent_volumes) - var/decl/reagent/R = decls_repository.get_decl(_R) - if(istype(R, /decl/reagent/alcohol)) + if(ispath(_R, /decl/reagent/alcohol)) var/amount = min(P, REAGENT_VOLUME(M.bloodstr, _R)) M.bloodstr.remove_reagent(_R, amount) P -= amount diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 247131ae47c..270fc89ea06 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -79,12 +79,17 @@ qdel(src) /obj/item/reagent_containers/attackby(var/obj/item/W, var/mob/user) + if(istype(W, /obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/dipped = W + dipped.attempt_apply_coating(src, user) + return if(!(W.flags & NOBLUDGEON) && (user.a_intent == I_HURT) && fragile && (W.force > fragile)) if(do_after(user, 10)) if(!QDELETED(src)) visible_message(SPAN_WARNING("[user] smashes [src] with \a [W]!")) user.do_attack_animation(src) shatter(W, user) + return ..() /obj/item/reagent_containers/attack(mob/M, mob/user, def_zone) diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm index b120b33bba4..5e553e7efb8 100644 --- a/code/modules/reagents/reagent_containers/food/cans.dm +++ b/code/modules/reagents/reagent_containers/food/cans.dm @@ -451,3 +451,14 @@ icon_state = "three_towns_cider" center_of_mass = list("x"=16, "y"=10) reagents_to_add = list(/decl/reagent/alcohol/butanol/threetownscider = 30) + +/obj/item/reagent_containers/food/drinks/cans/hrozamal_soda + name = "Hro'zamal Soda" + desc = "A can of Hro'zamal Soda. Made with Hro'zamal Ras'Nifs powder and canned in the People's Republic of Adhomai." + desc_fluff = "Hro'zamal Soda is a soft drink made from the seed's powder of a plant native to Hro'zamal, the sole Hadiist colony. While initially consumed as a herbal tea by the \ + colonists, it was introduced to Adhomai by the Army Expeditionary Force and transformed into a carbonated drink. The beverage is popular with factory workers and university \ + students because of its stimulant effect." + icon_state = "hrozamal_soda_can" + center_of_mass = list("x"=16, "y"=10) + + reagents_to_add = list(/decl/reagent/drink/hrozamal_soda = 30) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index 02088c8e9c5..92f2b8c67f9 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -433,6 +433,17 @@ shatter_material = MATERIAL_PLASTIC fragile = 0 +/obj/item/reagent_containers/food/drinks/bottle/hrozamal_soda + name = "Hro'zamal Soda" + desc = "A bottle of Hro'zamal Soda. Made with Hro'zamal Ras'Nifs powder and bottled in the People's Republic of Adhomai." + desc_fluff = "Hro'zamal Soda is a soft drink made from the seed's powder of a plant native to Hro'zamal, the sole Hadiist colony. While initially consumed as a herbal tea by the \ + colonists, it was introduced to Adhomai by the Army Expeditionary Force and transformed into a carbonated drink. The beverage is popular with factory workers and university \ + students because of its stimulant effect." + icon_state = "hrozamal_soda_bottle" + center_of_mass = list("x"=16, "y"=5) + reagents_to_add = list(/decl/reagent/drink/hrozamal_soda = 100) + fragile = FALSE + /obj/item/reagent_containers/food/drinks/bottle/pwine name = "Chip Getmore's Velvet" desc = "What a delightful packaging for a surely high quality wine! The vintage must be amazing!" diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm index 3bc5d79c334..7d014a7a29b 100644 --- a/code/modules/reagents/reagent_containers/food/lunch.dm +++ b/code/modules/reagents/reagent_containers/food/lunch.dm @@ -65,7 +65,8 @@ var/list/lunchables_drinks_ = list( /obj/item/reagent_containers/food/drinks/cans/tonic, /obj/item/reagent_containers/food/drinks/cans/sodawater, /obj/item/reagent_containers/food/drinks/cans/adhomai_milk, - /obj/item/reagent_containers/food/drinks/cans/beetle_milk + /obj/item/reagent_containers/food/drinks/cans/beetle_milk, + /obj/item/reagent_containers/food/drinks/cans/hrozamal_soda ) // This default list is a bit different, it contains items we don't want diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 64c40bdd51d..15c804a7a7e 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -11,7 +11,7 @@ var/slices_num var/dried_type = null var/dry = 0 - var/decl/reagent/nutriment/coating/coating = null + var/coating = null // coating typepath, NOT decl var/icon/flat_icon = null //Used to cache a flat icon generated from dipping in batter. This is used again to make the cooked-batter-overlay var/do_coating_prefix = TRUE //If 0, we wont do "battered thing" or similar prefixes. Mainly for recipes that include batter but have a special name @@ -142,7 +142,8 @@ else to_chat(user, SPAN_NOTICE("You know the item as [initial(name)], but a little piece of propped-up paper indicates it's \a [name].")) if (coating) - to_chat(user, SPAN_NOTICE("It's coated in [coating.name]!")) + var/decl/reagent/coating_reagent = decls_repository.get_decl(coating) + to_chat(user, SPAN_NOTICE("It's coated in [coating_reagent.name]!")) if (bitecount==0) return else if (bitecount==1) @@ -256,28 +257,35 @@ return ..() //Code for dipping food in batter -/obj/item/reagent_containers/food/snacks/afterattack(obj/O as obj, mob/user as mob, proximity) - if(O.is_open_container() && !(istype(O, /obj/item/reagent_containers/food)) && proximity) - for (var/r in O.reagents.reagent_volumes) - - var/decl/reagent/R = r - if (istype(R, /decl/reagent/nutriment/coating)) - if (apply_coating(O.reagents, R, user)) - return TRUE - - return ..() +/** + * Perform checks, then apply any applicable coatings. + * + * @param dip /obj The object to attempt to dip src into. + * @param user /mob The mob attempting to dip src into dip. + * + * @return TRUE if coating applied, FALSE otherwise + */ +/obj/item/reagent_containers/food/snacks/proc/attempt_apply_coating(obj/dip, mob/user) + if(!dip.is_open_container() || istype(dip, /obj/item/reagent_containers/food) || !Adjacent(user)) + return + for (var/reagent_type in dip.reagents?.reagent_volumes) + if(!ispath(reagent_type, /decl/reagent/nutriment/coating)) + continue + return apply_coating(dip.reagents, reagent_type, user) //This proc handles drawing coatings out of a container when this food is dipped into it -/obj/item/reagent_containers/food/snacks/proc/apply_coating(var/datum/reagents/holder, var/decl/reagent/nutriment/coating/C, var/mob/user) +/obj/item/reagent_containers/food/snacks/proc/apply_coating(var/datum/reagents/holder, var/applied_coating, var/mob/user) if (coating) - to_chat(user, "The [src] is already coated in [coating.name]!") + var/decl/reagent/coating_reagent = decls_repository.get_decl(coating) + to_chat(user, "[src] is already coated in [coating_reagent.name]!") return FALSE + var/decl/reagent/nutriment/coating/applied_coating_reagent = decls_repository.get_decl(applied_coating) + //Calculate the reagents of the coating needed var/req = 0 for (var/r in reagents.reagent_volumes) - var/decl/reagent/R = r - if (istype(R, /decl/reagent/nutriment)) + if (ispath(r, /decl/reagent/nutriment)) req += reagents.reagent_volumes[r] * 0.2 else req += reagents.reagent_volumes[r] * 0.1 @@ -288,8 +296,8 @@ //the food has no reagents left, it's probably getting deleted soon return FALSE - if (holder.reagent_volumes[C.type] < req) - to_chat(user, SPAN_WARNING("There's not enough [C.name] to coat the [src]!")) + if (holder.reagent_volumes[applied_coating] < req) + to_chat(user, SPAN_WARNING("There's not enough [applied_coating_reagent.name] to coat [src]!")) return FALSE //First make sure there's space for our batter @@ -300,10 +308,10 @@ //Suck the coating out of the holder holder.trans_to_holder(reagents, req) - if (!REAGENT_VOLUME(reagents, C.type)) + if (!REAGENT_VOLUME(reagents, applied_coating)) return - coating = C + coating = applied_coating //Now we have to do the witchcraft with masking images //var/icon/I = new /icon(icon, icon_state) @@ -312,7 +320,7 @@ var/icon/I = flat_icon color = "#FFFFFF" //Some fruits use the color var. Reset this so it doesnt tint the batter I.Blend(new /icon('icons/obj/food_custom.dmi', rgb(255,255,255)),ICON_ADD) - I.Blend(new /icon('icons/obj/food_custom.dmi', coating.icon_raw),ICON_MULTIPLY) + I.Blend(new /icon('icons/obj/food_custom.dmi', applied_coating_reagent.icon_raw),ICON_MULTIPLY) var/image/J = image(I) J.alpha = 200 J.blend_mode = BLEND_OVERLAY @@ -320,13 +328,14 @@ add_overlay(J) if (user) - user.visible_message(SPAN_NOTICE("[user] dips [src] into \the [coating.name]"), SPAN_NOTICE("You dip [src] into \the [coating.name]")) + user.visible_message(SPAN_NOTICE("[user] dips [src] into \the [applied_coating_reagent.name]"), SPAN_NOTICE("You dip [src] into \the [applied_coating_reagent.name]")) return TRUE //Called by cooking machines. This is mainly intended to set properties on the food that differ between raw/cooked /obj/item/reagent_containers/food/snacks/proc/cook() if (coating) + var/decl/reagent/nutriment/coating/our_coating = decls_repository.get_decl(coating) var/list/temp = overlays.Copy() for (var/i in temp) if (istype(i, /image)) @@ -343,22 +352,20 @@ var/icon/I = flat_icon color = "#FFFFFF" //Some fruits use the color var I.Blend(new /icon('icons/obj/food_custom.dmi', rgb(255,255,255)),ICON_ADD) - I.Blend(new /icon('icons/obj/food_custom.dmi', coating.icon_cooked),ICON_MULTIPLY) + I.Blend(new /icon('icons/obj/food_custom.dmi', our_coating.icon_cooked),ICON_MULTIPLY) var/image/J = image(I) J.alpha = 200 J.tag = "coating" add_overlay(J) if (do_coating_prefix == 1) - name = "[coating.coated_adj] [name]" + name = "[our_coating.coated_adj] [name]" for (var/r in reagents.reagent_volumes) - var/decl/reagent/R = r - if (istype(R, /decl/reagent/nutriment/coating)) - var/decl/reagent/nutriment/coating/C = R + if (ispath(r, /decl/reagent/nutriment/coating)) + var/decl/reagent/nutriment/coating/C = decls_repository.get_decl(r) LAZYINITLIST(reagents.reagent_data) - LAZYINITLIST(reagents.reagent_data[r]) - reagents.reagent_data[r]["cooked"] = TRUE + LAZYSET(reagents.reagent_data[r], "cooked", TRUE) C.name = C.cooked_name // A proc for setting various flavors of the same type of food instead of creating new foods with the only difference being a flavor @@ -938,25 +945,19 @@ do_coating_prefix = 0 bitesize = 2 reagents_to_add = list(/decl/reagent/nutriment/protein = 6, /decl/reagent/nutriment/coating/batter = 1.7, /decl/reagent/nutriment/triglyceride/oil = 1.5) - -/obj/item/reagent_containers/food/snacks/sausage/battered/Initialize() - . = ..() - coating = decls_repository.get_decl(/decl/reagent/nutriment/coating/batter) + coating = /decl/reagent/nutriment/coating/batter /obj/item/reagent_containers/food/snacks/jalapeno_poppers name = "jalapeno popper" - desc = "A battered, deep-fried chilli pepper" + desc = "A battered, deep-fried chili pepper" icon_state = "popper" filling_color = "#00AA00" do_coating_prefix = 0 reagents_to_add = list(/decl/reagent/nutriment = 2, /decl/reagent/nutriment/coating/batter = 2, /decl/reagent/nutriment/triglyceride/oil = 2) - reagent_data = list(/decl/reagent/nutriment = list("chilli pepper" = 2)) + reagent_data = list(/decl/reagent/nutriment = list("chili pepper" = 2)) bitesize = 1 - -/obj/item/reagent_containers/food/snacks/jalapeno_poppers/Initialize() - . = ..() - coating = decls_repository.get_decl(/decl/reagent/nutriment/coating/batter) + coating = /decl/reagent/nutriment/coating/batter /obj/item/reagent_containers/food/snacks/donkpocket name = "Donk-pocket" @@ -2313,7 +2314,7 @@ filling_color = "#702708" center_of_mass = list("x"=15, "y"=9) reagents_to_add = list(/decl/reagent/nutriment = 3, /decl/reagent/nutriment/protein = 3, /decl/reagent/capsaicin = 3, /decl/reagent/drink/tomatojuice = 2, /decl/reagent/hyperzine = 5) - reagent_data = list(/decl/reagent/nutriment = list("chilli peppers" = 3)) + reagent_data = list(/decl/reagent/nutriment = list("chili peppers" = 3)) bitesize = 5 /obj/item/reagent_containers/food/snacks/stew/bear @@ -2380,7 +2381,7 @@ filling_color = "#EDDD00" center_of_mass = list("x"=18, "y"=14) reagents_to_add = list(/decl/reagent/nutriment = 8, /decl/reagent/nutriment/protein = 2, /decl/reagent/capsaicin = 2) - reagent_data = list(/decl/reagent/nutriment = list("fresh fries" = 4, "cheese" = 2, "chilli peppers" = 2)) + reagent_data = list(/decl/reagent/nutriment = list("fresh fries" = 4, "cheese" = 2, "chili peppers" = 2)) bitesize = 4 /obj/item/reagent_containers/food/snacks/friedmushroom @@ -3200,7 +3201,7 @@ /obj/item/reagent_containers/food/snacks/sliceable/pizza/crunch/Initialize() . = ..() - coating = decls_repository.get_decl(/decl/reagent/nutriment/coating/batter) + coating = /decl/reagent/nutriment/coating/batter /obj/item/reagent_containers/food/snacks/pizzacrunchslice name = "pizza crunch" @@ -3211,10 +3212,7 @@ center_of_mass = list("x"=18, "y"=13) reagents_to_add = list(/decl/reagent/nutriment = 5, /decl/reagent/nutriment/coating/batter = 2, /decl/reagent/nutriment/triglyceride/oil = 1) reagent_data = list(/decl/reagent/nutriment = list("pizza crust" = 5)) - -/obj/item/reagent_containers/food/snacks/sliceable/pizza/crunch/Initialize() - . = ..() - coating = decls_repository.get_decl(/decl/reagent/nutriment/coating/batter) + coating = /decl/reagent/nutriment/coating/batter /obj/item/pizzabox name = "pizza box" @@ -3463,7 +3461,7 @@ reagents_to_add = list(/decl/reagent/nutriment = 3) reagent_data = list(/decl/reagent/nutriment = list("uncooked dough" = 3)) filling_color = "#EDE0AF" - + /obj/item/reagent_containers/food/snacks/doughslice name = "dough slice" desc = "A building block of an impressive dish." @@ -3516,7 +3514,7 @@ if ("rodent") result = new /obj/item/reagent_containers/food/snacks/burger/mouse(src) to_chat(user, "You make a ratburger!") - + else if(istype(W,/obj/item/reagent_containers/food/snacks)) var/obj/item/reagent_containers/food/snacks/csandwich/roll/R = new(get_turf(src)) R.attackby(W,user) @@ -3647,7 +3645,7 @@ reagents_to_add = list(/decl/reagent/nutriment = 3) reagent_data = list(/decl/reagent/nutriment = list("uncooked potatos" = 3)) filling_color = "#EDF291" - + /obj/item/reagent_containers/food/snacks/liquidfood name = "LiquidFood ration" desc = "A prepackaged grey slurry of all the essential nutrients for a spacefarer on the go. Should this be crunchy? Now with artificial flavoring!" @@ -4056,7 +4054,7 @@ reagents_to_add = list(/decl/reagent/nutriment = 2) reagent_data = list(/decl/reagent/nutriment = list("nacho chips" = 1)) filling_color = "#EDF291" - + /obj/item/reagent_containers/food/snacks/chip/on_consume(mob/M as mob) if(reagents && reagents.total_volume) @@ -4224,7 +4222,7 @@ reagents_to_add = list(/decl/reagent/nutriment = 20) reagent_data = list(/decl/reagent/nutriment = list("salsa" = 20)) filling_color = "#FF4D36" - + /obj/item/reagent_containers/food/snacks/dip/guac name = "guac dip" desc = "A recreation of the ancient Sol 'Guacamole' dip using tofu, limes, and spices. This recreation obviously leaves out mole meat." @@ -4474,7 +4472,7 @@ reagents_to_add = list(/decl/reagent/nutriment = 8) reagent_data = list(/decl/reagent/nutriment = list("cheese toast" = 8)) filling_color = "#FFF97D" - + /obj/item/reagent_containers/food/snacks/bacon_and_eggs name = "bacon and eggs" desc = "A piece of bacon and two fried eggs." @@ -5015,13 +5013,3 @@ reagent_data = list(/decl/reagent/nutriment = list("diona delicacy" = 5)) reagents_to_add = list(/decl/reagent/nutriment = 8, /decl/reagent/drink/carrotjuice = 2, /decl/reagent/drink/potatojuice = 2, /decl/reagent/radium = 2) filling_color = "#BD8939" - -/obj/item/reagent_containers/food/snacks/diona_bites - name = "dionae bites" - desc = "Freeze dried Dionae bites artfully crafted by Getmore chefs for that home cooked taste on the go!" - icon_state = "dionaebites" - reagent_data = list(/decl/reagent/nutriment = list("diona delicacy" = 5)) - reagents_to_add = list(/decl/reagent/nutriment = 6) - trash = /obj/item/trash/diona_bites - bitesize = 3 - filling_color = "#BD8939" diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 1d3639fbd7b..4b1c6028e6b 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -195,7 +195,7 @@ log_and_message_admins("shot a welding tank", Proj.firer) log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).",ckey=key_name(Proj.firer)) - if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) && !istype(Proj ,/obj/item/projectile/kinetic)) + if(!istype(Proj ,/obj/item/projectile/beam/laser_tag) && !istype(Proj ,/obj/item/projectile/beam/practice) && !istype(Proj ,/obj/item/projectile/kinetic)) ex_act(2.0) /obj/structure/reagent_dispensers/fueltank/ex_act(var/severity = 3.0) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 52e3831820b..e70b2ae8ad4 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -638,7 +638,7 @@ if (hasmob && prob(3)) for(var/mob/living/H in src) if(!istype(H,/mob/living/silicon/robot/drone)) //Drones use the mailing code to move through the disposal system, - H.take_overall_damage(20, 0, "Blunt Trauma")//horribly maim any living creature jumping down disposals. c'est la vie + H.take_overall_damage(20, 0, DAM_SHARP, "Blunt Trauma")//horribly maim any living creature jumping down disposals. c'est la vie var/obj/structure/disposalpipe/curr = loc if (!loc) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index cbec0dccbbc..149db63495f 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -48,15 +48,15 @@ if(istype(tool, /obj/item/stack/medical/advanced/bruise_pack)) tool_name = "regenerative membrane" else if(istype(tool, /obj/item/stack/medical/bruise_pack)) - tool_name = "the bandaid" + tool_name = "some bandaids" var/obj/item/organ/external/affected = target.get_organ(target_zone) for(var/obj/item/organ/internal/I in affected.internal_organs) - if(I && I.damage > 0 && !BP_IS_ROBOTIC(I)) + if(I && I.damage > 0 && !BP_IS_ROBOTIC(I) && (!I.status & ORGAN_DEAD || I.can_recover())) user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \ "You start treating damage to [target]'s [I.name] with [tool_name]." ) + target.custom_pain("The pain in your [affected.name] is living hell!",100, affecting = affected) - target.custom_pain("The pain in your [affected.name] is living hell!", 75) ..() /decl/surgery_step/internal/fix_organ/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -72,12 +72,20 @@ for(var/obj/item/organ/internal/I in affected.internal_organs) if(I && I.damage > 0 && !BP_IS_ROBOTIC(I)) - user.visible_message("[user] finishes applying [tool_name] to [target]'s [I.name].", \ - SPAN_NOTICE("You treat damage to [target]'s [I.name] with [tool_name].") ) + if(I.status & ORGAN_DEAD && I.can_recover()) + user.visible_message("\The [user] treats damage to [target]'s [I.name] with [tool_name], though it needs to be recovered further.", \ + "You treat damage to [target]'s [I.name] with [tool_name], though it needs to be recovered further." ) + else + user.visible_message("[user] treats damage to [target]'s [I.name] with [tool_name].", \ + "You treat damage to [target]'s [I.name] with [tool_name].") I.surgical_fix(user) + user.visible_message("\The [user] finishes treating damage within \the [target]'s [affected.name] with [tool_name].", \ + "You finish treating damage within \the [target]'s [affected.name] with [tool_name].") var/obj/item/organ/internal/brain/sponge = target.internal_organs_by_name[BP_BRAIN] if(sponge && istype(I, sponge)) target.cure_all_traumas(cure_type = CURE_SURGERY) + if(I.status & ORGAN_DEAD) + to_chat(user, SPAN_DANGER("This organ is still dead! You must remove the dead tissue with a scalpel!")) /decl/surgery_step/internal/fix_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if(!ishuman(target)) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index a9766c68a8c..edeec246065 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -52,7 +52,7 @@ /decl/surgery_step/internal/fix_dead_tissue //Debridement name = "Debride damaged tissue" - priority = 3 + priority = 4 allowed_tools = list( /obj/item/surgery/scalpel = 100, /obj/item/material/knife = 75, @@ -77,7 +77,7 @@ break if(!organ) return - if(organ.damage >= organ.max_damage) + if(organ.damage > organ.max_damage) to_chat(user, SPAN_WARNING("\The [organ] is too damaged. Repair it first.")) return 0 @@ -105,6 +105,7 @@ user.visible_message(SPAN_NOTICE("[user] has cut away necrotic tissue from [target]'s [organ_to_fix.name] with \the [tool]."), \ SPAN_NOTICE("You have cut away necrotic tissue in [target]'s [organ_to_fix.name] with \the [tool].")) organ_to_fix.status &= ~ORGAN_DEAD + organ_to_fix.heal_damage(10) //so that they don't insta-die again /decl/surgery_step/internal/fix_dead_tissue/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -114,7 +115,7 @@ /decl/surgery_step/treat_necrosis name = "Treat necrosis" - priority = 2 + priority = 4 allowed_tools = list( /obj/item/reagent_containers/dropper = 100, /obj/item/reagent_containers/glass/bottle = 75, @@ -126,8 +127,8 @@ can_infect = FALSE blood_level = 0 - min_duration = 50 - max_duration = 60 + min_duration = 100 + max_duration = 110 /decl/surgery_step/treat_necrosis/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if(!..()) diff --git a/code/unit_tests/chemistry_tests.dm b/code/unit_tests/chemistry_tests.dm index 35fc755a910..51b89f9d2a5 100644 --- a/code/unit_tests/chemistry_tests.dm +++ b/code/unit_tests/chemistry_tests.dm @@ -15,7 +15,7 @@ datum/unit_test/specific_heat/start_test() for(var/reagent in decls_repository.get_decls_of_subtype(/decl/reagent/)) var/decl/reagent/R = reagent if(!SSchemistry.has_valid_specific_heat(R)) - log_unit_test("[ascii_red][R.type] lacks a proper specific heat value![ascii_reset]") + log_unit_test("[ascii_red][reagent] lacks a proper specific heat value![ascii_reset]") error_count++ if(error_count) diff --git a/config/example/secretchem.json b/config/example/secretchem.json index a43bd9975fd..eb686317304 100644 --- a/config/example/secretchem.json +++ b/config/example/secretchem.json @@ -3,12 +3,12 @@ "superrine": { "name": "super rine", "id": "superrine", - "result": "water", + "result": "/decl/reagent/water", "resultamount": 60, "required_reagents": { - "water": 1, - "sugar": 1 + "/decl/reagent/water": 1, + "/decl/reagent/sugar": 1 } } } -} \ No newline at end of file +} diff --git a/html/changelog.html b/html/changelog.html index c8100bf66e0..f3b9857f067 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -35,6 +35,103 @@ -->
+

07 March 2021

+

Flpfs updated:

+ +

Geeves updated:

+ +

TheGreyWolf updated:

+ + +

06 March 2021

+

witchbells updated:

+ + +

05 March 2021

+

Alberyk updated:

+ +

Geeves updated:

+ +

MattAtlas updated:

+ +

Yonnimer updated:

+ + +

04 March 2021

+

Alberyk updated:

+ +

Alberyk, Canon35 updated:

+ +

Carpe Venenum updated:

+ +

MattAtlas updated:

+ +

MoondancerPony updated:

+ +

WickedCybs updated:

+ +

03 March 2021

Carpe Venenum updated: