diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index dc18107a95..9638b040f9 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -42,7 +42,7 @@ selected_target[1] = object selected_target[2] = params while(selected_target[1]) - Click(selected_target[1], location, control, selected_target[2]) + Click(selected_target[1], location, control, selected_target[2], TRUE) sleep(delay) active_mousedown_item = mob.canMobMousedown(object, location, params) if(active_mousedown_item) @@ -145,4 +145,4 @@ if (middragatom == src_object) middragtime = 0 middragatom = null - ..() \ No newline at end of file + ..() diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index fe994facdc..606aca2d3a 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -486,8 +486,9 @@ SUBSYSTEM_DEF(ticker) SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = INSTANT_RUNOFF_VOTING) if("SCORE") SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = MAJORITY_JUDGEMENT_VOTING) + else + SSvote.initiate_vote("map","server",hideresults=TRUE) // fallback - SSvote.initiate_vote("map","server",hideresults=TRUE) /datum/controller/subsystem/ticker/proc/HasRoundStarted() return current_state >= GAME_STATE_PLAYING diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 7879f50ada..934273ae46 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -258,6 +258,9 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( merge_type = /obj/item/stack/sheet/plastitaniumglass shard_type = /obj/item/shard +/obj/item/stack/sheet/plastitaniumglass/fifty + amount = 50 + /obj/item/stack/sheet/plastitaniumglass/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.plastitaniumglass_recipes return ..() diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 828ed96387..6ff6cdfbbf 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -323,6 +323,9 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ point_value = 45 merge_type = /obj/item/stack/sheet/mineral/plastitanium +/obj/item/stack/sheet/mineral/plastitanium/fifty + amount = 50 + GLOBAL_LIST_INIT(plastitanium_recipes, list ( \ new/datum/stack_recipe("plastitanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), \ )) diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index 2762be8edf..311657aba9 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -173,23 +173,25 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", var/unholy2clean = A.reagents.get_reagent_amount(/datum/reagent/fuel/unholywater) A.reagents.del_reagent(/datum/reagent/fuel/unholywater) A.reagents.add_reagent(/datum/reagent/water/holywater,unholy2clean) - if(istype(A, /obj/item/twohanded/required/cult_bastard) && !iscultist(user)) - var/obj/item/twohanded/required/cult_bastard/sword = A - to_chat(user, "You begin to exorcise [sword].") + if(istype(A, /obj/item/twohanded/required/cult_bastard) || istype(A, /obj/item/melee/cultblade) && !iscultist(user)) + to_chat(user, "You begin to exorcise [A].") playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,1) - if(do_after(user, 40, target = sword)) + if(do_after(user, 40, target = A)) playsound(src,'sound/effects/pray_chaplain.ogg',60,1) - for(var/obj/item/soulstone/SS in sword.contents) - SS.usability = TRUE - for(var/mob/living/simple_animal/shade/EX in SS) - SSticker.mode.remove_cultist(EX.mind, 1, 0) - EX.icon_state = "ghost1" - EX.name = "Purified [EX.name]" - SS.release_shades(user) - qdel(SS) - new /obj/item/nullrod/claymore(get_turf(sword)) - user.visible_message("[user] has purified the [sword]!") - qdel(sword) + if(istype(A, /obj/item/twohanded/required/cult_bastard)) + for(var/obj/item/soulstone/SS in A.contents) + SS.usability = TRUE + for(var/mob/living/simple_animal/shade/EX in SS) + SSticker.mode.remove_cultist(EX.mind, 1, 0) + EX.icon_state = "ghost1" + EX.name = "Purified [EX.name]" + SS.release_shades(user) + qdel(SS) + new /obj/item/nullrod/claymore(get_turf(A)) + else + new /obj/item/claymore/purified(get_turf(A)) + user.visible_message("[user] has purified [A]!") + qdel(A) else if(istype(A, /obj/item/soulstone) && !iscultist(user)) var/obj/item/soulstone/SS = A diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index cd6cc5f520..ea9899b2c2 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -79,6 +79,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 user.visible_message("[user] is falling on [src]! It looks like [user.p_theyre()] trying to commit suicide!") return(BRUTELOSS) +/obj/item/claymore/purified + name = "purified longsword" + desc = "A hastily-purified longsword. While not as holy as it could be, it's still a formidable weapon against those who would rather see you dead." + force = 25 + /obj/item/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS desc = "THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!\nActivate it in your hand to point to the nearest victim." flags_1 = CONDUCT_1 diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index 290e69370b..602adfb367 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -70,3 +70,8 @@ name = "secure science crate" desc = "A crate with a lock on it, painted in the scheme of the station's scientists." icon_state = "scisecurecrate" + +/obj/structure/closet/crate/secure/medical + desc = "A secure medical crate." + name = "medical crate" + icon_state = "medical_secure_crate" \ No newline at end of file diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 483b8fccbe..8c91b905a0 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -19,21 +19,20 @@ Estimated time of last contact: Deployment, 5000 millennia ago." assignedrole = "Lifebringer" -/obj/effect/mob_spawn/human/seed_vault/special(mob/living/new_spawn) - var/plant_name = pick("Tomato", "Potato", "Broccoli", "Carrot", "Ambrosia", "Pumpkin", "Ivy", "Kudzu", "Banana", "Moss", "Flower", "Bloom", "Root", "Bark", "Glowshroom", "Petal", "Leaf", \ - "Venus", "Sprout","Cocoa", "Strawberry", "Citrus", "Oak", "Cactus", "Pepper", "Juniper") - new_spawn.real_name = plant_name - if(ishuman(new_spawn)) - var/mob/living/carbon/human/H = new_spawn - H.underwear = "Nude" //You're a plant, partner - H.update_body() - /obj/effect/mob_spawn/human/seed_vault/Destroy() new/obj/structure/fluff/empty_terrarium(get_turf(src)) return ..() /obj/effect/mob_spawn/human/seed_vault/special(mob/living/carbon/human/new_spawn) ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT) + var/plant_name = pick("Tomato", "Potato", "Broccoli", "Carrot", "Ambrosia", "Pumpkin", "Ivy", "Kudzu", "Banana", "Moss", "Flower", "Bloom", "Root", "Bark", "Glowshroom", "Petal", "Leaf", \ + "Venus", "Sprout","Cocoa", "Strawberry", "Citrus", "Oak", "Cactus", "Pepper", "Juniper") + new_spawn.real_name = plant_name //why this works when moving it from one function to another is beyond me + new_spawn.underwear = "Nude" //You're a plant, partner + new_spawn.undershirt = "Nude" //changing underwear/shirt/socks doesn't seem to function correctly right now because of some bug elsewhere? + new_spawn.socks = "Nude" + new_spawn.update_body() + //Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers. /obj/effect/mob_spawn/human/ash_walker diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index d8fc5f22ab..1b38a809cf 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -65,11 +65,6 @@ material_id = MAT_TITANIUM message = "cm3 of titanium" -/datum/export/material/plastitanium - cost = 165 // plasma + titanium costs - material_id = MAT_TITANIUM // code can only check for one material_id; plastitanium is half plasma, half titanium - message = "cm3 of plastitanium" - /datum/export/material/plastic cost = 5 material_id = MAT_PLASTIC diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index f784083097..df1704d660 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -67,6 +67,16 @@ message = "of plasteel" export_types = list(/obj/item/stack/sheet/plasteel) +/datum/export/material/plastitanium + cost = 165 // plasma + titanium costs + export_types = list(/obj/item/stack/sheet/mineral/plastitanium) + message = "of plastitanium" + +/datum/export/material/plastitanium_glass + cost = 168 // plasma + titanium + glass costs + export_types = list(/obj/item/stack/sheet/plastitaniumglass) + message = "of plastitanium glass" + // 1 glass + 0.5 metal, cost is rounded up. /datum/export/stack/rglass cost = 6 diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 4c9ddfe3bc..07a75bbfaf 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -2,7 +2,7 @@ var/name = "Crate" var/group = "" var/hidden = FALSE //Aka emag only - var/contraband = FALSE //Hacking the console with a multitool + var/contraband = FALSE //Requires a hacked console UNLESS DropPodOnly = TRUE, in which case it requires an emag var/cost = 700 // Minimum cost, or infinite points are possible. var/access = FALSE //What access does the Crate itself need? var/access_any = FALSE //Do we care about access? diff --git a/code/modules/cargo/packs/armory.dm b/code/modules/cargo/packs/armory.dm index ea8ef8ba0f..fc95b05007 100644 --- a/code/modules/cargo/packs/armory.dm +++ b/code/modules/cargo/packs/armory.dm @@ -178,7 +178,7 @@ /datum/supply_pack/security/armory/russian name = "Russian Surplus Crate" desc = "Hello Comrade, we have the most modern russian military equipment the black market can offer, for the right price of course. Sadly we couldnt remove the lock so it requires Armory access to open." - cost = 5000 + cost = 7500 contraband = TRUE contains = list(/obj/item/reagent_containers/food/snacks/rationpack, /obj/item/ammo_box/a762, @@ -192,12 +192,11 @@ /obj/item/clothing/mask/russian_balaclava, /obj/item/clothing/head/helmet/rus_ushanka, /obj/item/clothing/suit/armor/vest/russian_coat, - /obj/item/gun/ballistic/shotgun/boltaction, /obj/item/gun/ballistic/shotgun/boltaction) crate_name = "surplus military crate" /datum/supply_pack/security/armory/russian/fill(obj/structure/closet/crate/C) - for(var/i in 1 to 10) + for(var/i in 1 to 5) var/item = pick(contains) new item(C) @@ -218,7 +217,7 @@ crate_name = "swat crate" /datum/supply_pack/security/armory/swattasers //Lesser AEG tbh - name = "SWAT tatical tasers Crate" + name = "SWAT tactical tasers Crate" desc = "Contains two tactical energy gun, these guns are able to tase, disable and lethal as well as hold a seclight. Requires Armory access to open." cost = 7000 contains = list(/obj/item/gun/energy/e_gun/stun, diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm index 4a64979502..c559e7925a 100644 --- a/code/modules/cargo/packs/costumes_toys.dm +++ b/code/modules/cargo/packs/costumes_toys.dm @@ -63,6 +63,7 @@ /obj/item/toy/cards/deck/syndicate, /obj/item/reagent_containers/food/drinks/bottle/absinthe, /obj/item/clothing/under/syndicate/tacticool, + /obj/item/clothing/under/syndicate/skirt, /obj/item/clothing/under/syndicate, /obj/item/suppressor, /obj/item/storage/fancy/cigarettes/cigpack_syndicate, diff --git a/code/modules/cargo/packs/emergency.dm b/code/modules/cargo/packs/emergency.dm index e32811f2d0..be81da3b92 100644 --- a/code/modules/cargo/packs/emergency.dm +++ b/code/modules/cargo/packs/emergency.dm @@ -130,7 +130,7 @@ /datum/supply_pack/emergency/bomb name = "Explosive Emergency Crate" - desc = "Science gone bonkers? Beeping behind the airlock? Buy now and be the hero the station des... I mean needs! (Time not included.)" + desc = "Science gone bonkers? Beeping behind the airlock? Buy now and become the hero the station des... I mean needs! Time not included, but a full bomb suit and hood, as well as a mask and defusal kit are! Non-Nuclear ordnances only." cost = 1500 contains = list(/obj/item/clothing/head/bomb_hood, /obj/item/clothing/suit/bomb_suit, diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index ea327ae820..5d02bbe60f 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -88,6 +88,7 @@ /obj/item/clothing/mask/gas, /obj/item/clothing/suit/space/hardsuit/medical) crate_name = "medical hardsuit" + crate_type = /obj/structure/closet/crate/secure/medical /datum/supply_pack/medical/supplies name = "Medical Supplies Crate" @@ -125,7 +126,7 @@ /obj/item/reagent_containers/medspray/synthflesh, /obj/item/reagent_containers/medspray/sterilizine) crate_name = "medco surgery tools" - crate_type = /obj/structure/closet/crate/medical + crate_type = /obj/structure/closet/crate/secure/medical /datum/supply_pack/medical/surgery name = "Surgical Supplies Crate" diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm index 4aa991fc3f..cdac6f49f2 100644 --- a/code/modules/cargo/packs/organic.dm +++ b/code/modules/cargo/packs/organic.dm @@ -193,6 +193,7 @@ /obj/item/reagent_containers/food/snacks/meat/slab/bear, /obj/item/reagent_containers/food/snacks/meat/slab/xeno, /obj/item/reagent_containers/food/snacks/meat/slab/spider, + /obj/item/reagent_containers/food/snacks/meat/rawcrab, /obj/item/reagent_containers/food/snacks/meat/rawbacon, /obj/item/reagent_containers/food/snacks/spiderleg, /obj/item/reagent_containers/food/snacks/carpmeat, @@ -327,7 +328,7 @@ /datum/supply_pack/organic/seeds name = "Seeds Crate" - desc = "Big things have small beginnings. Contains thirteen different seeds." + desc = "Big things have small beginnings. Contains fourteen different seeds." cost = 1250 contains = list(/obj/item/seeds/chili, /obj/item/seeds/berry, diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm index 8852a7e945..e6671a02ea 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -84,7 +84,7 @@ /datum/supply_pack/science/glasswork name = "Glass Blower Kit Crate" - desc = "Learn and make glassworks of usefull things for a profit! Contains glassworking tools and blowing rods. Glass not included." + desc = "Learn and make glassworks of useful things for a profit! Contains glassworking tools and blowing rods. Glass not included." cost = 1000 contains = list(/obj/item/glasswork/glasskit, /obj/item/glasswork/glasskit, @@ -111,9 +111,9 @@ /datum/supply_pack/science/nuke_b_gone name = "Nuke Defusal Kit" desc = "Contains set of tools to defuse a nuke." - cost = 7500 //Usefull for traitors/nukies that fucked up + cost = 7500 //Useful for traitors/nukies that fucked up dangerous = TRUE - DropPodOnly = TRUE + hidden = TRUE contains = list(/obj/item/nuke_core_container/nt, /obj/item/screwdriver/nuke/nt, /obj/item/paper/guides/nt/nuke_instructions) @@ -194,7 +194,7 @@ /datum/supply_pack/science/supermater name = "Supermatter Extraction Tools Crate" desc = "Contains a set of tools to extract a sliver of supermatter. Consult your CE today!" - cost = 7500 //Usefull for traitors that fucked up + cost = 7500 //Useful for traitors that fucked up hidden = TRUE contains = list(/obj/item/nuke_core_container/supermatter, /obj/item/scalpel/supermatter, diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index fd7e07a66c..90bc837767 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -103,7 +103,7 @@ desc = "An old russian Minutemen crate, comes with a full russian outfit, a mosin and a stripper clip." contraband = TRUE access = FALSE - cost = 5500 // + cost = 6500 // contains = list(/obj/item/clothing/suit/armor/navyblue/russian, /obj/item/clothing/shoes/combat, /obj/item/clothing/head/ushanka, diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index e05cee3487..dc550179f8 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -737,13 +737,13 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) message_admins("Proxy Detection: [key_name_admin(src)] IP intel rated [res.intel*100]% likely to be a Proxy/VPN.") ip_intel = res.intel -/client/Click(atom/object, atom/location, control, params) +/client/Click(atom/object, atom/location, control, params, ignore_spam = FALSE) var/ab = FALSE var/list/L = params2list(params) if (object && object == middragatom && L["left"]) ab = max(0, 5 SECONDS-(world.time-middragtime)*0.1) var/mcl = CONFIG_GET(number/minute_click_limit) - if (!holder && mcl) + if (!holder && !ignore_spam && mcl) var/minute = round(world.time, 600) if (!clicklimiter) clicklimiter = new(LIMITER_SIZE) @@ -768,7 +768,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) return var/scl = CONFIG_GET(number/second_click_limit) - if (!holder && scl) + if (!holder && !ignore_spam && scl) var/second = round(world.time, 10) if (!clicklimiter) clicklimiter = new(LIMITER_SIZE) diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 1bed3b08d4..b29890a97d 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -71,14 +71,42 @@ if(/obj/item/projectile/energy/florayield) H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL) + /datum/species/pod/pseudo_weak name = "Anthromorphic Plant" id = "podweak" - limbs_id = "pod" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS) mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur", "legs") default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs") + limbs_id = "pod" light_nutrition_gain_factor = 7.5 light_bruteheal = 0.2 light_burnheal = 0.2 light_toxheal = 0.7 + +/datum/species/pod/pseudo_weak/spec_death(gibbed, mob/living/carbon/human/H) + if(H) + stop_wagging_tail(H) + +/datum/species/pod/pseudo_weak/spec_stun(mob/living/carbon/human/H,amount) + if(H) + stop_wagging_tail(H) + . = ..() + +/datum/species/pod/pseudo_weak/can_wag_tail(mob/living/carbon/human/H) + return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts) + +/datum/species/pod/pseudo_weak/is_wagging_tail(mob/living/carbon/human/H) + return ("mam_waggingtail" in mutant_bodyparts) + +/datum/species/pod/pseudo_weak/start_wagging_tail(mob/living/carbon/human/H) + if("mam_tail" in mutant_bodyparts) + mutant_bodyparts -= "mam_tail" + mutant_bodyparts |= "mam_waggingtail" + H.update_body() + +/datum/species/pod/pseudo_weak/stop_wagging_tail(mob/living/carbon/human/H) + if("mam_waggingtail" in mutant_bodyparts) + mutant_bodyparts -= "mam_waggingtail" + mutant_bodyparts |= "mam_tail" + H.update_body() diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 433f6a43b5..ccca90807b 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -357,8 +357,8 @@ if(istype(loc, /obj/structure/closet/crate/coffin)|| istype(loc, /obj/structure/closet/body_bag) || istype(loc, /obj/structure/bodycontainer)) return - // No decay if formaldehyde in corpse or when the corpse is charred - if(reagents.has_reagent(/datum/reagent/toxin/formaldehyde, 1) || HAS_TRAIT(src, TRAIT_HUSK)) + // No decay if formaldehyde/preservahyde in corpse or when the corpse is charred + if(reagents.has_reagent(/datum/reagent/toxin/formaldehyde, 1) || HAS_TRAIT(src, TRAIT_HUSK) || reagents.has_reagent(/datum/reagent/preservahyde, 1)) return // Also no decay if corpse chilled or not organic/undead @@ -397,7 +397,7 @@ if(O) O.on_life() else - if(reagents.has_reagent(/datum/reagent/toxin/formaldehyde, 1)) // No organ decay if the body contains formaldehyde. + if(reagents.has_reagent(/datum/reagent/toxin/formaldehyde, 1) || reagents.has_reagent(/datum/reagent/preservahyde, 1)) // No organ decay if the body contains formaldehyde. Or preservahyde. return for(var/V in internal_organs) var/obj/item/organ/O = V diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index e6d44de194..a0eeae1ea9 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -24,7 +24,16 @@ /obj/machinery/power/solar/Initialize(mapload, obj/item/solar_assembly/S) . = ..() - Make(S) + if(!S) + assembly = new /obj/item/solar_assembly + assembly.glass_type = new /obj/item/stack/sheet/glass(null, 2) + assembly.anchored = TRUE + else + S.moveToNullspace() + assembly = S + assembly.glass_type.on_solar_construction(src) + obj_integrity = max_integrity + update_icon() connect_to_network() /obj/machinery/power/solar/Destroy() @@ -45,17 +54,6 @@ control.connected_panels.Remove(src) control = null -/obj/machinery/power/solar/proc/Make(obj/item/solar_assembly/S) - if(!S) - S = new /obj/item/solar_assembly - S.glass_type = new /obj/item/stack/sheet/glass(null, 2) - S.anchored = TRUE - else - S.moveToNullspace() - S.glass_type.on_solar_construction(src) - obj_integrity = max_integrity - update_icon() - /obj/machinery/power/solar/crowbar_act(mob/user, obj/item/I) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) user.visible_message("[user] begins to take the glass off [src].", "You begin to take the glass off [src]...") @@ -201,7 +199,7 @@ new shard(Tsec) new shard(Tsec) else if(glass_type) - forceMove(glass_type, Tsec) + glass_type.forceMove(Tsec) glass_type = null /obj/item/solar_assembly/attackby(obj/item/W, mob/user, params) @@ -226,7 +224,8 @@ var/obj/item/stack/sheet/G = S.change_stack(null, 2) if(G) glass_type = G - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + G.moveToNullspace() + playsound(loc, 'sound/machines/click.ogg', 50, 1) user.visible_message("[user] places the glass on the solar assembly.", "You place the glass on the solar assembly.") if(tracker) new /obj/machinery/power/tracker(get_turf(src), src) diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index c25ece3594..8701dfea7f 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -20,7 +20,15 @@ /obj/machinery/power/tracker/Initialize(mapload, obj/item/solar_assembly/S) . = ..() - Make(S) + if(!S) + assembly = new /obj/item/solar_assembly + assembly.glass_type = new /obj/item/stack/sheet/glass(null, 2) + assembly.tracker = TRUE + assembly.anchored = TRUE + else + S.moveToNullspace() + assembly = S + update_icon() connect_to_network() /obj/machinery/power/tracker/Destroy() @@ -41,16 +49,6 @@ control.connected_tracker = null control = null -/obj/machinery/power/tracker/proc/Make(obj/item/solar_assembly/S) - if(!S) - S = new /obj/item/solar_assembly - S.glass_type = new /obj/item/stack/sheet/glass(null, 2) - S.tracker = TRUE - S.anchored = TRUE - else - S.moveToNullspace() - update_icon() - //updates the tracker icon and the facing angle for the control computer /obj/machinery/power/tracker/proc/set_angle(angle) sun_angle = angle diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 4521e4ea13..139f5a051c 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -52,7 +52,6 @@ var/hitscan = FALSE //Whether this is hitscan. If it is, speed is basically ignored. var/list/beam_segments //assoc list of datum/point or datum/point/vector, start = end. Used for hitscan effect generation. var/datum/point/beam_index - var/turf/hitscan_last //last turf touched during hitscanning. var/tracer_type var/muzzle_type var/impact_type @@ -492,8 +491,6 @@ process_homing() var/forcemoved = FALSE for(var/i in 1 to SSprojectiles.global_iterations_per_move) - if(QDELETED(src)) - return trajectory.increment(trajectory_multiplier) var/turf/T = trajectory.return_turf() if(!istype(T)) @@ -506,14 +503,16 @@ forceMove(T) trajectory_ignore_forcemove = FALSE after_z_change(old, loc) + forcemoved = TRUE + if(QDELETED(src)) + return if(!hitscanning) pixel_x = trajectory.return_px() pixel_y = trajectory.return_py() - forcemoved = TRUE - hitscan_last = loc else if(T != loc) step_towards(src, T) - hitscan_last = loc + if(QDELETED(src)) + return if(!hitscanning && !forcemoved) pixel_x = trajectory.return_px() - trajectory.mpx * trajectory_multiplier * SSprojectiles.global_iterations_per_move pixel_y = trajectory.return_py() - trajectory.mpy * trajectory_multiplier * SSprojectiles.global_iterations_per_move diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 6d37f30884..0a040a4f17 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1482,14 +1482,14 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) /datum/reagent/medicine/polypyr //This is intended to be an ingredient in advanced chems. name = "Polypyrylium Oligomers" - description = "A�purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is valued as an intermediate in the synthesis of the cutting edge pharmaceuticals." + description = "A purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is valued as an intermediate in the synthesis of the cutting edge pharmaceuticals." reagent_state = SOLID color = "#9423FF" metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 50 taste_description = "numbing bitterness" -/datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M) //I w�nted a collection of small positive effects, this is as hard to obtain as coniine after all. +/datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M) //I wanted a collection of small positive effects, this is as hard to obtain as coniine after all. M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25) M.adjustBruteLoss(-0.35, 0) if(prob(50)) @@ -1511,4 +1511,3 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) ..() . = 1 - diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 0e9c148446..adc30ecdc9 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2108,3 +2108,10 @@ to_chat(M, "You feel like playing with your [G.name]!") ..() + +/datum/reagent/preservahyde + name = "Preservahyde" + description = "A powerful preservation agent, utilizing the preservative effects of formaldehyde with significantly less of the histamine." + reagent_state = LIQUID + color = "#f7685e" + metabolization_rate = REAGENTS_METABOLISM * 0.25 diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index d92e7819e4..57748acb1a 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -47,6 +47,12 @@ results = list(/datum/reagent/consumable/sodiumchloride = 3) required_reagents = list(/datum/reagent/water = 1, /datum/reagent/sodium = 1, /datum/reagent/chlorine = 1) +/datum/chemical_reaction/preservahyde + name = "Preservahyde" + id = "preservahyde" + results = list(/datum/reagent/preservahyde = 3) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/bromine = 1) + /datum/chemical_reaction/plasmasolidification name = "Solid Plasma" id = "solidplasma" diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index fd4282b1b0..f29b785c95 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -95,7 +95,7 @@ ignore_flags = 1 //so you can medipen through hardsuits reagent_flags = DRAWABLE flags_1 = null - list_reagents = list(/datum/reagent/medicine/epinephrine = 10, /datum/reagent/toxin/formaldehyde = 3) + list_reagents = list(/datum/reagent/medicine/epinephrine = 10, /datum/reagent/preservahyde = 3) /obj/item/reagent_containers/hypospray/medipen/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins to choke on \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/modules/spells/spell_types/bloodcrawl.dm b/code/modules/spells/spell_types/bloodcrawl.dm index e4c33380b2..49d73b445b 100644 --- a/code/modules/spells/spell_types/bloodcrawl.dm +++ b/code/modules/spells/spell_types/bloodcrawl.dm @@ -13,6 +13,7 @@ action_icon_state = "bloodcrawl" action_background_icon_state = "bg_demon" var/phased = 0 + charge_max = 6 /obj/effect/proc_holder/spell/bloodcrawl/choose_targets(mob/user = usr) for(var/obj/effect/decal/cleanable/target in range(range, get_turf(user))) diff --git a/html/changelogs/AutoChangeLog-pr-10980.yml b/html/changelogs/AutoChangeLog-pr-10980.yml new file mode 100644 index 0000000000..3701aea6e1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10980.yml @@ -0,0 +1,7 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "Medical locked crates" + - balance: "Russian gear crates have less gear in some cases but all will cost more" + - bugfix: "Medical locked crates that were not locked" + - spellcheck: "Crates that were out of date are corrected" diff --git a/html/changelogs/AutoChangeLog-pr-11082.yml b/html/changelogs/AutoChangeLog-pr-11082.yml new file mode 100644 index 0000000000..89d9b4ca52 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11082.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - rscadd: "Preservahyde! Made with water, bromine, and formaldehyde, it doesn't decay into histamine. Instead, it just prevents your organs from rotting into nothing." diff --git a/html/changelogs/AutoChangeLog-pr-11083.yml b/html/changelogs/AutoChangeLog-pr-11083.yml new file mode 100644 index 0000000000..757d9fcb63 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11083.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - balance: "You can now purify eldritch longswords with a bible. This creates purified longswords, which do not have anti-magic properties, but are still good for swinging at cultists." diff --git a/html/changelogs/AutoChangeLog-pr-11087.yml b/html/changelogs/AutoChangeLog-pr-11087.yml new file mode 100644 index 0000000000..179ef6a2b7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11087.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed solar panels/trackers (de)construction being a bit wonky." diff --git a/html/changelogs/AutoChangeLog-pr-11091.yml b/html/changelogs/AutoChangeLog-pr-11091.yml new file mode 100644 index 0000000000..5d43d7dbdf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11091.yml @@ -0,0 +1,5 @@ +author: "BlueWildrose" +delete-after: True +changes: + - bugfix: "podpeople tail wagging" + - tweak: "lifebringer ghost role fixes" diff --git a/html/changelogs/AutoChangeLog-pr-11103.yml b/html/changelogs/AutoChangeLog-pr-11103.yml new file mode 100644 index 0000000000..f38e23f76e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11103.yml @@ -0,0 +1,5 @@ +author: "PersianXerxes" +delete-after: True +changes: + - rscadd: "Better clarified the comment explaining the contraband tag." + - tweak: "Cargo nuclear defusal kits now require an emag'd drop pod console to be purchased." diff --git a/html/changelogs/AutoChangeLog-pr-11131.yml b/html/changelogs/AutoChangeLog-pr-11131.yml new file mode 100644 index 0000000000..9a14049c2f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11131.yml @@ -0,0 +1,4 @@ +author: "Seris02" +delete-after: True +changes: + - balance: "bloodcrawl's cooldown" diff --git a/html/changelogs/AutoChangeLog-pr-11134.yml b/html/changelogs/AutoChangeLog-pr-11134.yml new file mode 100644 index 0000000000..8ec6c97164 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11134.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - bugfix: "mechs with stock parts now have icons" diff --git a/html/changelogs/AutoChangeLog-pr-11138.yml b/html/changelogs/AutoChangeLog-pr-11138.yml new file mode 100644 index 0000000000..fd0e53bb73 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11138.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - tweak: "the game's built in autoclicker aka CanMobAutoclick no longer triggers client/Click()'s anti clickspam guard." diff --git a/icons/mecha/mech_construction.dmi b/icons/mecha/mech_construction.dmi index 42cc8eeb57..d7f0f3e054 100644 Binary files a/icons/mecha/mech_construction.dmi and b/icons/mecha/mech_construction.dmi differ diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi index ca81686e94..ecb66d0119 100644 Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ