diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 7859d735d6..201418eba1 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -41663,7 +41663,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/dark/visible{ +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 }, /turf/open/floor/plasteel/white/corner, @@ -44797,7 +44797,7 @@ /area/engine/engineering) "ccy" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/pipe/simple/dark/visible{ +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 }, /turf/open/floor/plasteel, @@ -45150,7 +45150,7 @@ "cdB" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/dark/visible{ +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 }, /turf/open/floor/plating, @@ -54054,6 +54054,13 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"emX" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) "ene" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55773,6 +55780,12 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) +"iBR" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 6 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) "iEJ" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod One" @@ -56517,6 +56530,12 @@ /obj/structure/window, /turf/open/floor/wood, /area/crew_quarters/bar) +"krn" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 9 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) "ksp" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/closed/wall, @@ -57370,6 +57389,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"mAU" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/icemoon/surface/outdoors) "mCy" = ( /obj/machinery/space_heater{ anchored = 1 @@ -97640,14 +97666,14 @@ bFJ bvd bKH bzs -avm -ayF -avm -ayF -avB -ayF -avm -ayF +iBR +avx +mAU +avx +emX +avx +mAU +krn avB awd awe diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 65e1d0e980..f1548bbe0f 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -69,6 +69,7 @@ #define CAT_WEAPONRY "Weaponry" #define CAT_WEAPON "Weapons" #define CAT_AMMO "Ammunition" +#define CAT_PARTS "Weapon Parts" #define CAT_ROBOT "Robots" #define CAT_MISC "Misc" #define CAT_MISCELLANEOUS "Miscellaneous" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 9847556b37..a39ebf36ba 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -30,31 +30,32 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s //Human Overlays Indexes///////// //LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS -#define MUTATIONS_LAYER 32 //mutations. Tk headglows, cold resistance glow, etc -#define GENITALS_BEHIND_LAYER 31 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer -#define BODY_BEHIND_LAYER 30 //certain mutantrace features (tail when looking south) that must appear behind the body parts -#define BODYPARTS_LAYER 29 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag -#define MARKING_LAYER 28 //Matrixed body markings because clashing with snouts? -#define BODY_ADJ_LAYER 27 //certain mutantrace features (snout, body markings) that must appear above the body parts -#define GENITALS_FRONT_LAYER 26 //Draws some genitalia above clothes and the TAUR body if need be. -#define BODY_LAYER 25 //underwear, undershirts, socks, eyes, lips(makeup) -#define BODY_ADJ_UPPER_LAYER 24 -#define FRONT_MUTATIONS_LAYER 23 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) -#define DAMAGE_LAYER 22 //damage indicators (cuts and burns) -#define UNIFORM_LAYER 21 -#define ID_LAYER 20 -#define HANDS_PART_LAYER 19 -#define SHOES_LAYER 18 -#define GLOVES_LAYER 17 -#define EARS_LAYER 16 -#define SUIT_LAYER 15 -#define GENITALS_EXPOSED_LAYER 14 -#define GLASSES_LAYER 13 -#define BELT_LAYER 12 //Possible make this an overlay of somethign required to wear a belt? -#define SUIT_STORE_LAYER 11 -#define NECK_LAYER 10 -#define BACK_LAYER 9 -#define HAIR_LAYER 8 //TODO: make part of head layer? +#define MUTATIONS_LAYER 33 //mutations. Tk headglows, cold resistance glow, etc +#define GENITALS_BEHIND_LAYER 32 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer +#define BODY_BEHIND_LAYER 31 //certain mutantrace features (tail when looking south) that must appear behind the body parts +#define BODYPARTS_LAYER 30 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag +#define MARKING_LAYER 29 //Matrixed body markings because clashing with snouts? +#define BODY_ADJ_LAYER 28 //certain mutantrace features (snout, body markings) that must appear above the body parts +#define GENITALS_FRONT_LAYER 27 //Draws some genitalia above clothes and the TAUR body if need be. +#define BODY_LAYER 26 //underwear, undershirts, socks, eyes, lips(makeup) +#define BODY_ADJ_UPPER_LAYER 25 +#define FRONT_MUTATIONS_LAYER 24 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) +#define DAMAGE_LAYER 23 //damage indicators (cuts and burns) +#define UNIFORM_LAYER 22 +#define ID_LAYER 21 +#define HANDS_PART_LAYER 20 +#define SHOES_LAYER 19 +#define GLOVES_LAYER 18 +#define EARS_LAYER 17 +#define SUIT_LAYER 16 +#define GENITALS_EXPOSED_LAYER 15 +#define GLASSES_LAYER 14 +#define BELT_LAYER 13 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 12 +#define NECK_LAYER 11 +#define BACK_LAYER 10 +#define HAIR_LAYER 9 //TODO: make part of head layer? +#define HORNS_LAYER 8 #define FACEMASK_LAYER 7 #define HEAD_LAYER 6 #define HANDCUFF_LAYER 5 @@ -62,7 +63,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define HANDS_LAYER 3 #define BODY_FRONT_LAYER 2 #define FIRE_LAYER 1 //If you're on fire -#define TOTAL_LAYERS 32 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; +#define TOTAL_LAYERS 33 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; //Human Overlay Index Shortcuts for alternate_worn_layer, layers //Because I *KNOW* somebody will think layer+1 means "above" diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 632904202d..30321f5546 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -89,7 +89,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/effect/spawner/lootdrop/welder_tools = 3, /obj/effect/spawner/lootdrop/low_tools = 5, /obj/item/relic = 3, - /obj/item/weaponcrafting/receiver = 2, + /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 2, /obj/item/clothing/head/cone = 2, /obj/item/grenade/smokebomb = 2, /obj/item/geiger_counter = 3, diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm index caf200446f..f332d53fc8 100644 --- a/code/datums/components/crafting/guncrafting.dm +++ b/code/datums/components/crafting/guncrafting.dm @@ -1,14 +1,7 @@ -//Gun crafting parts til they can be moved elsewhere - -// PARTS // +k// PARTS // /obj/item/weaponcrafting icon = 'icons/obj/improvised.dmi' -/obj/item/weaponcrafting/receiver - name = "modular receiver" - desc = "A prototype modular receiver and trigger assembly for a firearm." - icon_state = "receiver" - /obj/item/weaponcrafting/stock name = "rifle stock" desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood." @@ -19,3 +12,53 @@ name = "durathread string" desc = "A long piece of durathread with some resemblance to cable coil." icon_state = "durastring" + +//////////////////////////////// +// KAT IMPROVISED WEAPON PARTS// +//////////////////////////////// + +/obj/item/weaponcrafting/improvised_parts + name = "Eerie bunch of coloured dots." + desc = "You feel the urge to report to Central that the parent type of guncrafting, which should never appear in this reality, has appeared. Whatever that means." + icon = 'icons/obj/guns/gun_parts.dmi' + icon_state = "palette" + +// BARRELS + +/obj/item/weaponcrafting/improvised_parts/barrel_rifle + name = "rifle barrel" + desc = "A pipe with a diameter just the right size to fire 7.62 rounds out of." + icon_state = "barrel_rifle" + +/obj/item/weaponcrafting/improvised_parts/barrel_shotgun + name = "shotgun barrel" + desc = "A twenty bore shotgun barrel." + icon_state = "barrel_shotgun" + +// RECEIVERS + +/obj/item/weaponcrafting/improvised_parts/rifle_receiver + name = "bolt action receiver" + desc = "A crudely constructed receiver to create an improvised bolt-action breechloaded rifle." + icon_state = "receiver_rifle" + w_class = WEIGHT_CLASS_SMALL + +/obj/item/weaponcrafting/improvised_parts/shotgun_receiver + name = "break-action assembly" + desc = "An improvised receiver to create a break-action breechloaded shotgun." + icon_state = "receiver_shotgun" + w_class = WEIGHT_CLASS_SMALL + +// MISC + +/obj/item/weaponcrafting/improvised_parts/trigger_assembly + name = "firearm trigger assembly" + desc = "A modular trigger assembly with a firing pin, this can be used to make a whole bunch of improvised firearss." + icon_state = "trigger_assembly" + w_class = WEIGHT_CLASS_SMALL + +/obj/item/weaponcrafting/improvised_parts/wooden_body + name = "wooden firearm body" + desc = "A crudely fashioned wooden body to help keep higher calibre improvised weapons from blowing themselves apart." + icon_state = "wooden_body" + diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm index 21a160264a..7d608a55b2 100644 --- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm +++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm @@ -251,8 +251,10 @@ /datum/crafting_recipe/ishotgun name = "Improvised Shotgun" result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised - reqs = list(/obj/item/weaponcrafting/receiver = 1, - /obj/item/pipe = 1, + reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_shotgun = 1, + /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1, + /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1, + /obj/item/weaponcrafting/improvised_parts/wooden_body = 1, /obj/item/weaponcrafting/stock = 1, /obj/item/stack/packageWrap = 5) tools = list(TOOL_SCREWDRIVER) @@ -261,10 +263,12 @@ subcategory = CAT_WEAPON /datum/crafting_recipe/irifle - name = "Improvised Rifle(7.62mm)" + name = "Improvised Rifle (7.62mm)" result = /obj/item/gun/ballistic/shotgun/boltaction/improvised - reqs = list(/obj/item/weaponcrafting/receiver = 1, - /obj/item/pipe = 2, + reqs = list(/obj/item/weaponcrafting/improvised_parts/barrel_rifle = 1, + /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 1, + /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1, + /obj/item/weaponcrafting/improvised_parts/wooden_body = 1, /obj/item/weaponcrafting/stock = 1, /obj/item/stack/packageWrap = 5) tools = list(TOOL_SCREWDRIVER) @@ -394,3 +398,60 @@ time = 5 category = CAT_WEAPONRY subcategory = CAT_AMMO + +//////////////////// +// PARTS CRAFTING // +//////////////////// + +// BARRELS + +/datum/crafting_recipe/rifle_barrel + name = "Improvised Rifle Barrel" + result = /obj/item/weaponcrafting/improvised_parts/barrel_rifle + reqs = list(/obj/item/pipe = 2) + tools = list(TOOL_WELDER,TOOL_SAW) + time = 150 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +/datum/crafting_recipe/shotgun_barrel + name = "Improvised Shotgun Barrel" + result = /obj/item/weaponcrafting/improvised_parts/barrel_shotgun + reqs = list(/obj/item/pipe = 2) + tools = list(TOOL_WELDER,TOOL_SAW) + time = 150 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +// RECEIVERS + +/datum/crafting_recipe/rifle_receiver + name = "Improvised Rifle Receiver" + result = /obj/item/weaponcrafting/improvised_parts/rifle_receiver + reqs = list(/obj/item/stack/sheet/metal = 20) + tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) // Rifle is the easiest to craft and can be made at an autolathe, this is a very light kick in the shin for dual-wielding ishotguns. + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +/datum/crafting_recipe/shotgun_receiver + name = "Improvised Shotgun Receiver" + result = /obj/item/weaponcrafting/improvised_parts/shotgun_receiver + reqs = list(/obj/item/stack/sheet/metal = 10, + /obj/item/stack/sheet/plasteel = 1) + tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) // Increased cost is to stop dual-wield alpha striking. ishotgun is a rvolver and can be duel-wielded + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +// MISC + +/datum/crafting_recipe/trigger_assembly + name = "Trigger Assembly" + result = /obj/item/weaponcrafting/improvised_parts/trigger_assembly + reqs = list(/obj/item/stack/sheet/metal = 3, + /obj/item/assembly/igniter = 1) + tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) + time = 150 + category = CAT_WEAPONRY + subcategory = CAT_PARTS diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 747db3d6ce..ed5104e296 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -391,16 +391,6 @@ /mob/living/carbon/human/proc/hardset_dna(ui, list/mutation_index, newreal_name, newblood_type, datum/species/mrace, newfeatures) - if(newfeatures) - var/old_size = dna.features["body_size"] - dna.features = newfeatures - dna.update_body_size(old_size) - - if(mrace) - var/datum/species/newrace = new mrace.type - newrace.copy_properties_from(mrace) - set_species(newrace, icon_update=0) - if(newreal_name) real_name = newreal_name dna.generate_unique_enzymes() @@ -410,7 +400,17 @@ if(ui) dna.uni_identity = ui - updateappearance(icon_update=0) + updateappearance(icon_update=FALSE) + + if(newfeatures) + var/old_size = dna.features["body_size"] + dna.features = newfeatures + dna.update_body_size(old_size) + + if(mrace) + var/datum/species/newrace = new mrace.type + newrace.copy_properties_from(mrace) + set_species(newrace, icon_update=FALSE) if(LAZYLEN(mutation_index)) dna.mutation_index = mutation_index.Copy() diff --git a/code/datums/wires/apc.dm b/code/datums/wires/apc.dm index 997c77aa51..19b2b8dda8 100644 --- a/code/datums/wires/apc.dm +++ b/code/datums/wires/apc.dm @@ -30,6 +30,7 @@ if(WIRE_POWER1, WIRE_POWER2) // Short for a long while. if(!A.shorted) A.shorted = TRUE + A.update() addtimer(CALLBACK(A, /obj/machinery/power/apc.proc/reset, wire), 1200) if(WIRE_IDSCAN) // Unlock for a little while. A.locked = FALSE @@ -49,6 +50,7 @@ else A.shorted = TRUE A.shock(usr, 50) + A.update() if(WIRE_AI) // Disable AI control. if(mend) A.aidisabled = FALSE diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 2e5dae3e04..68a9c1ce07 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -36,6 +36,7 @@ targetitem = /obj/item/gun/energy/e_gun/hos difficulty = 10 excludefromjob = list("Head Of Security") + altitems = list(/obj/item/gun/ballistic/revolver/mws) /datum/objective_item/steal/handtele name = "a hand teleporter." diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 67113fcf78..a2d3cccc35 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -70,14 +70,13 @@ if(W.amount < 5) to_chat(user, "You need at least five wooden planks to make a wall!") return - else - to_chat(user, "You start adding [I] to [src]...") - if(do_after(user, 50, target=src)) - W.use(5) - var/turf/T = get_turf(src) - T.PlaceOnTop(/turf/closed/wall/mineral/wood/nonmetal) - qdel(src) - return + to_chat(user, "You start adding [I] to [src]...") + if(do_after(user, 50, target=src)) + W.use(5) + var/turf/T = get_turf(src) + T.PlaceOnTop(/turf/closed/wall/mineral/wood/nonmetal) + qdel(src) + return return ..() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 4c12809184..2a45267c65 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -470,15 +470,15 @@ if(welded) weld_overlay = get_airlock_overlay("welded", overlays_file) if(obj_integrity < integrity_failure * max_integrity) - damag_overlay = get_airlock_overlay("sparks_broken", overlays_file, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE) + damag_overlay = get_airlock_overlay("sparks_broken", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) else if(obj_integrity < (0.75 * max_integrity)) - damag_overlay = get_airlock_overlay("sparks_damaged", overlays_file, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE) + damag_overlay = get_airlock_overlay("sparks_damaged", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) if(lights && hasPower()) if(locked) - lights_overlay = get_airlock_overlay("lights_bolts", overlays_file, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE) + lights_overlay = get_airlock_overlay("lights_bolts", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) else if(emergency) - lights_overlay = get_airlock_overlay("lights_emergency", overlays_file, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE) + lights_overlay = get_airlock_overlay("lights_emergency", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) if(note) note_overlay = get_airlock_overlay(notetype, note_overlay_file) @@ -496,18 +496,18 @@ else panel_overlay = get_airlock_overlay("panel_closed", overlays_file) if(obj_integrity < integrity_failure * max_integrity) - damag_overlay = get_airlock_overlay("sparks_broken", overlays_file, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE) + damag_overlay = get_airlock_overlay("sparks_broken", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) else if(obj_integrity < (0.75 * max_integrity)) - damag_overlay = get_airlock_overlay("sparks_damaged", overlays_file, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE) + damag_overlay = get_airlock_overlay("sparks_damaged", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) if(welded) weld_overlay = get_airlock_overlay("welded", overlays_file) - lights_overlay = get_airlock_overlay("lights_denied", overlays_file, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE) + lights_overlay = get_airlock_overlay("lights_denied", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) if(note) note_overlay = get_airlock_overlay(notetype, note_overlay_file) if(AIRLOCK_EMAG) frame_overlay = get_airlock_overlay("closed", icon) - sparks_overlay = get_airlock_overlay("sparks", overlays_file, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE) + sparks_overlay = get_airlock_overlay("sparks", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) if(airlock_material) filling_overlay = get_airlock_overlay("[airlock_material]_closed", overlays_file) else @@ -518,9 +518,9 @@ else panel_overlay = get_airlock_overlay("panel_closed", overlays_file) if(obj_integrity < integrity_failure * max_integrity) - damag_overlay = get_airlock_overlay("sparks_broken", overlays_file, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE) + damag_overlay = get_airlock_overlay("sparks_broken", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) else if(obj_integrity < (0.75 * max_integrity)) - damag_overlay = get_airlock_overlay("sparks_damaged", overlays_file, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE) + damag_overlay = get_airlock_overlay("sparks_damaged", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) if(welded) weld_overlay = get_airlock_overlay("welded", overlays_file) if(note) @@ -533,7 +533,7 @@ else filling_overlay = get_airlock_overlay("fill_closing", icon) if(lights && hasPower()) - lights_overlay = get_airlock_overlay("lights_closing", overlays_file, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE) + lights_overlay = get_airlock_overlay("lights_closing", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) if(panel_open) if(security_level) panel_overlay = get_airlock_overlay("panel_closing_protected", overlays_file) @@ -554,7 +554,7 @@ else panel_overlay = get_airlock_overlay("panel_open", overlays_file) if(obj_integrity < (0.75 * max_integrity)) - damag_overlay = get_airlock_overlay("sparks_open", overlays_file, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE) + damag_overlay = get_airlock_overlay("sparks_open", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) if(note) note_overlay = get_airlock_overlay("[notetype]_open", note_overlay_file) @@ -565,7 +565,7 @@ else filling_overlay = get_airlock_overlay("fill_opening", icon) if(lights && hasPower()) - lights_overlay = get_airlock_overlay("lights_opening", overlays_file, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE) + lights_overlay = get_airlock_overlay("lights_opening", overlays_file, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE) if(panel_open) if(security_level) panel_overlay = get_airlock_overlay("panel_opening_protected", overlays_file) @@ -577,11 +577,17 @@ cut_overlays() add_overlay(frame_overlay) add_overlay(filling_overlay) - add_overlay(lights_overlay) + if(lights_overlay) + add_overlay(lights_overlay) + var/mutable_appearance/lights_vis = mutable_appearance(lights_overlay.icon, lights_overlay.icon_state) + add_overlay(lights_vis) add_overlay(panel_overlay) add_overlay(weld_overlay) add_overlay(sparks_overlay) - add_overlay(damag_overlay) + if(damag_overlay) + add_overlay(damag_overlay) + var/mutable_appearance/damage_vis = mutable_appearance(damag_overlay.icon, damag_overlay.icon_state) + add_overlay(damage_vis) add_overlay(note_overlay) check_unres() diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm old mode 100755 new mode 100644 index 8545e6f35c..2fff2011c1 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -17,6 +17,8 @@ /obj/item/melee/baton, /obj/item/ammo_box/magazine/recharge, /obj/item/modular_computer, + /obj/item/ammo_casing/mws_batt, + /obj/item/ammo_box/magazine/mws_mag, /obj/item/twohanded/electrostaff, /obj/item/gun/ballistic/automatic/magrifle)) @@ -143,6 +145,29 @@ using_power = TRUE update_icon() return + + if(istype(charging, /obj/item/ammo_casing/mws_batt)) + var/obj/item/ammo_casing/mws_batt/R = charging + if(R.cell.charge < R.cell.maxcharge) + R.cell.give(R.cell.chargerate * recharge_coeff) + use_power(250 * recharge_coeff) + using_power = 1 + if(R.BB == null) + R.chargeshot() + update_icon(using_power) + + if(istype(charging, /obj/item/ammo_box/magazine/mws_mag)) + var/obj/item/ammo_box/magazine/mws_mag/R = charging + for(var/B in R.stored_ammo) + var/obj/item/ammo_casing/mws_batt/batt = B + if(batt.cell.charge < batt.cell.maxcharge) + batt.cell.give(batt.cell.chargerate * recharge_coeff) + use_power(250 * recharge_coeff) + using_power = 1 + if(batt.BB == null) + batt.chargeshot() + update_icon(using_power) + else return PROCESS_KILL diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 5b332cda46..7450cb937c 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -99,7 +99,7 @@ if(href_list["reset_radio_short"]) pai.unshort_radio() if(href_list["setlaws"]) - var/newlaws = stripped_multiline_input("Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", MAX_MESSAGE_LEN) + var/newlaws = stripped_multiline_input(usr, "Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", "", MAX_MESSAGE_LEN) if(newlaws && pai) pai.add_supplied_law(0,newlaws) if(href_list["toggle_holo"]) diff --git a/code/game/objects/items/implants/implant_abductor.dm b/code/game/objects/items/implants/implant_abductor.dm index 0c50beadea..e0765e7951 100644 --- a/code/game/objects/items/implants/implant_abductor.dm +++ b/code/game/objects/items/implants/implant_abductor.dm @@ -5,36 +5,30 @@ icon_state = "implant" activated = 1 var/obj/machinery/abductor/pad/home - var/cooldown = 30 + var/next_use = 0 /obj/item/implant/abductor/activate() . = ..() - if(cooldown == initial(cooldown)) + if(next_use <= world.time) home.Retrieve(imp_in,1) - cooldown = 0 - START_PROCESSING(SSobj, src) + next_use = world.time + 60 SECONDS else - to_chat(imp_in, "You must wait [30 - cooldown] seconds to use [src] again!") - -/obj/item/implant/abductor/process() - if(cooldown < initial(cooldown)) - cooldown++ - if(cooldown == initial(cooldown)) - STOP_PROCESSING(SSobj, src) + to_chat(imp_in, "You must wait [DisplayTimeText(next_use - world.time)] to use [src] again!") /obj/item/implant/abductor/implant(mob/living/target, mob/user) - if(..()) - var/obj/machinery/abductor/console/console - if(ishuman(target)) - var/datum/antagonist/abductor/A = target.mind.has_antag_datum(/datum/antagonist/abductor) - if(A) - console = get_abductor_console(A.team.team_number) - home = console.pad - - if(!home) - var/list/consoles = list() - for(var/obj/machinery/abductor/console/C in GLOB.machines) - consoles += C - console = pick(consoles) + . = ..() + if(!.) + return + var/obj/machinery/abductor/console/console + if(ishuman(target)) + var/datum/antagonist/abductor/A = target.mind.has_antag_datum(/datum/antagonist/abductor) + if(A) + console = get_abductor_console(A.team.team_number) home = console.pad - return TRUE + + if(!home) + var/list/consoles = list() + for(var/obj/machinery/abductor/console/C in GLOB.machines) + consoles += C + console = pick(consoles) + home = console.pad diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index c4bb8c594c..ae9ea6985c 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -115,6 +115,20 @@ new /obj/item/toy/crayon/spraycan(src) new /obj/item/clothing/shoes/sandal(src) +/obj/item/choice_beacon/hosgun + name = "personal weapon beacon" + desc = "Use this to summon your personal Head of Security issued firearm!" + +/obj/item/choice_beacon/hosgun/generate_display_names() + var/static/list/hos_gun_list + if(!hos_gun_list) + hos_gun_list = list() + var/list/templist = subtypesof(/obj/item/storage/secure/briefcase/hos/) //we have to convert type = name to name = type, how lovely! + for(var/V in templist) + var/atom/A = V + hos_gun_list[initial(A.name)] = A + return hos_gun_list + /obj/item/skub desc = "It's skub." name = "skub" diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index f26f3587a4..6553cd2f7c 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -240,6 +240,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, one_per_turf = TRUE, on_floor = TRUE),\ )), null, \ + new/datum/stack_recipe("wooden firearm body", /obj/item/weaponcrafting/improvised_parts/wooden_body, 10, time = 40), \ new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), \ new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \ new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wood, 2, time = 30), \ @@ -404,8 +405,6 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ resistance_flags = FLAMMABLE force = 0 throwforce = 0 - pull_effort = 90 - is_fabric = TRUE merge_type = /obj/item/stack/sheet/cloth /obj/item/stack/sheet/cloth/get_main_recipes() @@ -426,7 +425,7 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \ new/datum/stack_recipe("durathread beret", /obj/item/clothing/head/beret/durathread, 2, time = 40), \ new/datum/stack_recipe("durathread beanie", /obj/item/clothing/head/beanie/durathread, 2, time = 40), \ new/datum/stack_recipe("durathread bandana", /obj/item/clothing/mask/bandana/durathread, 1, time = 25), \ - new/datum/stack_recipe("durathread string", /obj/item/weaponcrafting/durathread_string, 1, time = 40) \ + new/datum/stack_recipe("durathread string", /obj/item/weaponcrafting/durathread_string, 1, time = 40), \ )) /obj/item/stack/sheet/durathread @@ -818,13 +817,12 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra max_amount = 80 singular_name = "raw cotton ball" icon_state = "sheet-cotton" - is_fabric = TRUE resistance_flags = FLAMMABLE force = 0 throwforce = 0 merge_type = /obj/item/stack/sheet/cotton - pull_effort = 30 - loom_result = /obj/item/stack/sheet/cloth + var/pull_effort = 30 + var/loom_result = /obj/item/stack/sheet/cloth /obj/item/stack/sheet/cotton/ten amount = 10 diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index 378855707e..dfba533247 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -13,9 +13,6 @@ mats_per_stack = MINERAL_MATERIAL_AMOUNT var/sheettype = null //this is used for girders in the creation of walls/false walls var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity - var/is_fabric = FALSE //is this a valid material for the loom? - var/loom_result //result from pulling on the loom - var/pull_effort = 0 //amount of delay when pulling on the loom var/shard_type // the shard debris typepath left over by solar panels and windows etc. /obj/item/stack/sheet/Initialize(mapload, new_amount, merge) diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index ef70bd201d..1caf13454b 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -147,6 +147,35 @@ for(var/i = 0, i < STR.max_items - 2, i++) new /obj/item/stack/spacecash/c1000(src) +/obj/item/storage/secure/briefcase/mws_pack + name = "\improper \'MWS\' gun kit" + desc = "A storage case for a multi-purpose handgun. Variety hour!" + +/obj/item/storage/secure/briefcase/mws_pack/PopulateContents() + new /obj/item/gun/ballistic/revolver/mws(src) + new /obj/item/ammo_box/magazine/mws_mag(src) + for(var/path in subtypesof(/obj/item/ammo_casing/mws_batt)) + new path(src) + +/obj/item/storage/secure/briefcase/hos/mws_pack_hos + name = "\improper \'MWS\' gun kit" + desc = "A storage case for a multi-purpose handgun. Variety hour!" + +/obj/item/storage/secure/briefcase/hos/mws_pack_hos/PopulateContents() + new /obj/item/gun/ballistic/revolver/mws(src) + new /obj/item/ammo_box/magazine/mws_mag(src) + new /obj/item/ammo_casing/mws_batt/lethal(src) + new /obj/item/ammo_casing/mws_batt/lethal(src) + new /obj/item/ammo_casing/mws_batt/stun(src) + new /obj/item/ammo_casing/mws_batt/stun(src) + new /obj/item/ammo_casing/mws_batt/ion(src) + +/obj/item/storage/secure/briefcase/hos/multiphase_box + name = "\improper X-01 Multiphase energy gun box" + desc = "A storage case for a high-tech energy firearm." + +/obj/item/storage/secure/briefcase/mws_pack_hos/PopulateContents() + new /obj/item/gun/energy/e_gun/hos(src) // ----------------------------- // Secure Safe @@ -183,4 +212,4 @@ return attack_self(user) /obj/item/storage/secure/safe/HoS - name = "head of security's safe" + name = "head of security's safe" \ No newline at end of file diff --git a/code/game/objects/items/tools/saw.dm b/code/game/objects/items/tools/saw.dm new file mode 100644 index 0000000000..aab59c00be --- /dev/null +++ b/code/game/objects/items/tools/saw.dm @@ -0,0 +1,47 @@ +/obj/item/hatchet/saw + name = "handsaw" + desc = "A very sharp handsaw, it's compact." + icon = 'icons/obj/tools.dmi' + icon_state = "saw" + item_state = "sawhandle_greyscale" + lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' + tool_behaviour = TOOL_SAW + force = 10 + throwforce = 8 + throw_speed = 3 + throw_range = 5 + custom_materials = list(/datum/material/iron = 5000) + attack_verb = list("sawed", "sliced", "cut") + hitsound = 'sound/weapons/bladeslice.ogg' + sharpness = IS_SHARP + var/random_color = TRUE //code taken from screwdrivers.dm; cool handles are cool. + var/static/list/saw_colors = list( + "blue" = rgb(24, 97, 213), + "red" = rgb(255, 0, 0), + "pink" = rgb(213, 24, 141), + "brown" = rgb(160, 82, 18), + "green" = rgb(14, 127, 27), + "cyan" = rgb(24, 162, 213), + "yellow" = rgb(255, 165, 0) + ) + +/obj/item/hatchet/saw/Initialize() + . = ..() + if(random_color) + icon_state = "sawhandle_greyscale" + var/our_color = pick(saw_colors) + add_atom_colour(saw_colors[our_color], FIXED_COLOUR_PRIORITY) + update_icon() + if(prob(75)) + pixel_y = rand(-8, 8) + +/obj/item/hatchet/saw/update_overlays() + . = ..() + if(!random_color) //icon override + return + var/mutable_appearance/base_overlay = mutable_appearance(icon, "sawblade") + base_overlay.appearance_flags = RESET_COLOR + . += base_overlay + +// END \ No newline at end of file diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ff59b85332..bc0c1328af 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -777,6 +777,7 @@ var/cooldown = 0 var/obj/machinery/computer/holodeck/holo = null // Holodeck cards should not be infinite var/list/cards = list() + var/original_size = 52 /obj/item/toy/cards/deck/Initialize() . = ..() @@ -834,11 +835,11 @@ /obj/item/toy/cards/deck/update_icon_state() switch(cards.len) - if(27 to INFINITY) + if(INFINITY to original_size/2) icon_state = "deck_[deckstyle]_full" - if(11 to 27) + if(original_size/2 to original_size/4) icon_state = "deck_[deckstyle]_half" - if(1 to 11) + if(original_size/4 to 1) icon_state = "deck_[deckstyle]_low" else icon_state = "deck_[deckstyle]_empty" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index e5c50af782..9f4da351fa 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -76,12 +76,13 @@ new /obj/item/storage/box/flashbangs(src) new /obj/item/shield/riot/tele(src) new /obj/item/storage/belt/security/full(src) - new /obj/item/gun/energy/e_gun/hos(src) + new /obj/item/choice_beacon/hosgun(src) new /obj/item/flashlight/seclite(src) new /obj/item/pinpointer/nuke(src) new /obj/item/circuitboard/machine/techfab/department/security(src) new /obj/item/storage/photo_album/HoS(src) new /obj/item/clothing/suit/hooded/wintercoat/hos(src) + /obj/structure/closet/secure_closet/warden name = "\proper warden's locker" req_access = list(ACCESS_ARMORY) diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm index ad128b01c2..164e597117 100644 --- a/code/game/objects/structures/loom.dm +++ b/code/game/objects/structures/loom.dm @@ -21,21 +21,21 @@ return TRUE ///Handles the weaving. -/obj/structure/loom/proc/weave(obj/item/stack/sheet/S, mob/user) - if(!istype(S) || !S.is_fabric) +/obj/structure/loom/proc/weave(obj/item/stack/sheet/cotton/W, mob/user) + if(!istype(W)) return FALSE if(!anchored) user.show_message("The loom needs to be wrenched down.", MSG_VISUAL) return FALSE - if(S.amount < FABRIC_PER_SHEET) - user.show_message("You need at least [FABRIC_PER_SHEET] units of fabric before using this.", 1) + if(W.amount < FABRIC_PER_SHEET) + user.show_message("You need at least [FABRIC_PER_SHEET] units of fabric before using this.", MSG_VISUAL) return FALSE - user.show_message("You start weaving \the [S.name] through the loom..", MSG_VISUAL) - if(S.use_tool(src, user, S.pull_effort)) - if(S.amount >= FABRIC_PER_SHEET) - new S.loom_result(drop_location()) - S.use(FABRIC_PER_SHEET) - user.show_message("You weave \the [S.name] into a workable fabric.", MSG_VISUAL) + user.show_message("You start weaving \the [W.name] through the loom..", MSG_VISUAL) + if(W.use_tool(src, user, W.pull_effort)) + if(W.amount >= FABRIC_PER_SHEET) + new W.loom_result(drop_location()) + W.use(FABRIC_PER_SHEET) + user.show_message("You weave \the [W.name] into a workable fabric.", MSG_VISUAL) return TRUE #undef FABRIC_PER_SHEET \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm index af48160ef1..0f366fae03 100644 --- a/code/game/turfs/simulated/floor/plasteel_floor.dm +++ b/code/game/turfs/simulated/floor/plasteel_floor.dm @@ -146,3 +146,95 @@ /turf/open/floor/plasteel/sepia icon_state = "sepia" + +/////////////////////////////// +// Pre-Applied Decal Floors // +////////////////////////////// + +// Neutral +/turf/open/floor/plasteel/neutral + icon_state = "neutral_full" +/turf/open/floor/plasteel/neutral/side + icon_state = "neutral" +/turf/open/floor/plasteel/neutral/corner + icon_state = "neutral_corner" + +// Dark Neutral +/turf/open/floor/plasteel/dark/neutral + icon_state = "dark_neutral_full" +/turf/open/floor/plasteel/dark/neutral/checker + icon_state = "dark_neutral_checker" +/turf/open/floor/plasteel/dark/neutral/side + icon_state = "dark_neutral" +/turf/open/floor/plasteel/dark/neutral/corner + icon_state = "dark_neutral_corner" + +// Dark Security +/turf/open/floor/plasteel/dark/security + icon_state = "dark_red_full" +/turf/open/floor/plasteel/dark/security/checker + icon_state = "dark_red_checker" +/turf/open/floor/plasteel/dark/security/side + icon_state = "dark_red" +/turf/open/floor/plasteel/dark/security/corner + icon_state = "dark_red_corner" + +// Engineering +/turf/open/floor/plasteel/engineering + icon_state = "engineering_full" +/turf/open/floor/plasteel/engineering/side + icon_state = "engineering" +/turf/open/floor/plasteel/engineering/corner + icon_state = "engineering_corner" + +// Atmospherics +/turf/open/floor/plasteel/atmospherics + icon_state = "atmospherics_full" +/turf/open/floor/plasteel/atmospherics/side + icon_state = "atmospherics" +/turf/open/floor/plasteel/atmospherics/corner + icon_state = "atmospherics_corner" + +// Command +/turf/open/floor/plasteel/command + icon_state = "command_full" +/turf/open/floor/plasteel/command/side + icon_state = "command" +/turf/open/floor/plasteel/command/corner + icon_state = "command_corner" + +// Medical +/turf/open/floor/plasteel/medical + icon_state = "medical_full" +/turf/open/floor/plasteel/medical/alt + icon_state = "medical_alt" +/turf/open/floor/plasteel/medical/side + icon_state = "medical" +/turf/open/floor/plasteel/medical/corner + icon_state = "medical_corner" + +// Security +/turf/open/floor/plasteel/security + icon_state = "security_full" +/turf/open/floor/plasteel/security/side + icon_state = "security" +/turf/open/floor/plasteel/security/corner + icon_state = "security_corner" + +// Cargo +/turf/open/floor/plasteel/cargo + icon_state = "cargo_full" +/turf/open/floor/plasteel/cargo/side + icon_state = "cargo" +/turf/open/floor/plasteel/cargo/corner + icon_state = "cargo_corner" + +// Misc +/turf/open/floor/plasteel/showroomfloor/shower + icon_state = "shower" +/turf/open/floor/plasteel/goonplaque/alien + icon_state = "plaque1" + desc = "\"This is a plaque is a collaboration of iconography celebrating the peaceful collaboration between the people of Earth and distant alien species." +/turf/open/floor/plasteel/goonplaque/charter + icon_state = "plaque2" + desc = "\"A golden plaque. Etched into it is the introductory article for a cross-species interplanetary constitution, guaranteeing equal rights between species that Nanotrasen relunctantly agreed to." diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm index fd969d511b..5323db001f 100644 --- a/code/game/turfs/simulated/floor/plating/misc_plating.dm +++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm @@ -198,7 +198,7 @@ /turf/open/floor/plating/ice/smooth icon_state = "smooth" smooth = SMOOTH_MORE | SMOOTH_BORDER - canSmoothWith = list(/turf/open/floor/plating/ice/smooth, /turf/open/floor/plating/ice) + canSmoothWith = list(/turf/open/floor/plating/ice/smooth, /turf/open/floor/plating/ice, /turf/open/floor/plating/ice/colder) /turf/open/floor/plating/ice/colder temperature = 140 diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 4e4b270c12..47a98623db 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -177,7 +177,7 @@ if(owner.current.blood_volume < BLOOD_VOLUME_BAD / 2) owner.current.blur_eyes(8 - 8 * (owner.current.blood_volume / BLOOD_VOLUME_BAD)) // Nutrition - owner.current.set_nutrition(min(owner.current.blood_volume, NUTRITION_LEVEL_FULL)) //The amount of blood is how full we are. + owner.current.set_nutrition(min(owner.current.blood_volume, NUTRITION_LEVEL_FED)) //The amount of blood is how full we are. //A bit higher regeneration based on blood volume if(owner.current.blood_volume < 700) additional_regen = 0.4 diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm index a4b19f2d40..f1ce13a90f 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm @@ -113,6 +113,8 @@ "You start tenderly lifting [skewee] off of [src]...") if(!do_after(user, 60, target = skewee)) skewee.visible_message("[skewee] painfully slides back down [src].") + if(skewee.stat >= UNCONSCIOUS) + return //by ratvar, no more spamming my deadchat, holy fuck skewee.say("Oof, ouch owwie!!", forced = "fail brass skewer removal") return skewee.visible_message("[skewee] comes free of [src] with a squelching pop!", \ diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 93927f4420..58e826b36d 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -244,6 +244,7 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) if(!ispath(path)) path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around gases[path] = text2num(gas[id]) + archive() return 1 /datum/gas_mixture/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) diff --git a/code/modules/games/unum.dm b/code/modules/games/unum.dm new file mode 100644 index 0000000000..9820fa6754 --- /dev/null +++ b/code/modules/games/unum.dm @@ -0,0 +1,22 @@ +/// A deck of unum cards. Classic. +/obj/item/toy/cards/deck/unum + name = "\improper UNUM deck" + desc = "A deck of unum cards. House rules to argue over not included." + icon = 'icons/obj/toy.dmi' + icon_state = "deck_unum_full" + deckstyle = "unum" + original_size = 108 + +//Populate the deck. +/obj/item/toy/cards/deck/unum/populate_deck() + for(var/colour in list("Red","Yellow","Green","Blue")) + cards += "[colour] 0" //Uno, i mean, cough cough, Unum decks have only one colour of each 0, weird huh? + for(var/k in 0 to 1) //two of each colour of number + cards += "[colour] skip" + cards += "[colour] reverse" + cards += "[colour] draw 2" + for(var/i in 1 to 9) + cards += "[colour] [i]" + for(var/k in 0 to 3) //4 wilds and draw 4s + cards += "Wildcard" + cards += "Draw 4" diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index d4dc3cb213..3455a97ba2 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -403,6 +403,12 @@ h1.alert, h2.alert {color: #000000;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} .spooky {color: #FF6100;} .velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} + +.lethal {color: #bf3d3d; font-weight: bold;} +.stun {color: #0f81bc; font-weight: bold;} +.ion {color: #d084d6; font-weight: bold;} +.xray {color: #32c025; font-weight: bold;} + @keyframes velvet { 0% { color: #400020; } 40% { color: #FF0000; } diff --git a/code/modules/holiday/halloween/bartholomew.dm b/code/modules/holiday/halloween/bartholomew.dm index f51b8b7ea1..4ef00e29cb 100644 --- a/code/modules/holiday/halloween/bartholomew.dm +++ b/code/modules/holiday/halloween/bartholomew.dm @@ -117,7 +117,7 @@ /obj/item/weldingtool = 3, /obj/item/wirecutters = 2, /obj/item/wrench = 4, - /obj/item/weaponcrafting/receiver = 1, + /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1, /obj/item/geiger_counter = 3, /obj/item/reagent_containers/food/snacks/grown/citrus/orange = 5, /obj/item/assembly/infra = 1, diff --git a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm index 6126b6c04b..b39f48f858 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm @@ -1,7 +1,7 @@ /datum/sprite_accessory/horns icon = 'icons/mob/mutant_bodyparts.dmi' color_src = HORNCOLOR - relevant_layers = list(BODY_ADJ_LAYER) + relevant_layers = list(HORNS_LAYER) /datum/sprite_accessory/horns/none name = "None" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 838de24b60..5364486b04 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -287,12 +287,12 @@ Works together with spawning an observer, noted above. var/maximumRoundEnd = SSautotransfer.starttime + SSautotransfer.voteinterval * SSautotransfer.maxvotes if(penalty - SSshuttle.realtimeofstart > maximumRoundEnd + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime) penalty = CANT_REENTER_ROUND - if(!(ckey in GLOB.client_ghost_timeouts)) - GLOB.client_ghost_timeouts += ckey - GLOB.client_ghost_timeouts[ckey] = 0 - else if(GLOB.client_ghost_timeouts[ckey] == CANT_REENTER_ROUND) + if(!(ghost.ckey in GLOB.client_ghost_timeouts)) + GLOB.client_ghost_timeouts += ghost.ckey + GLOB.client_ghost_timeouts[ghost.ckey] = 0 + else if(GLOB.client_ghost_timeouts[ghost.ckey] == CANT_REENTER_ROUND) return - GLOB.client_ghost_timeouts[ckey] = max(GLOB.client_ghost_timeouts[ckey],penalty) + GLOB.client_ghost_timeouts[ghost.ckey] = max(GLOB.client_ghost_timeouts[ghost.ckey],penalty) // needs to be done AFTER the ckey transfer, too return ghost diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 946ecca64b..de55ef388a 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -628,6 +628,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.remove_overlay(BODY_ADJ_LAYER) H.remove_overlay(BODY_ADJ_UPPER_LAYER) H.remove_overlay(BODY_FRONT_LAYER) + H.remove_overlay(HORNS_LAYER) if(!mutant_bodyparts) return @@ -839,8 +840,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!S.mutant_part_string) dna_feature_as_text_string[S] = bodypart - var/static/list/layer_text = list("[BODY_BEHIND_LAYER]" = "BEHIND", "[BODY_ADJ_LAYER]" = "ADJ", \ - "[BODY_ADJ_UPPER_LAYER]" = "ADJUP", "[BODY_FRONT_LAYER]" = "FRONT") + var/static/list/layer_text = list( + "[BODY_BEHIND_LAYER]" = "BEHIND", + "[BODY_ADJ_LAYER]" = "ADJ", + "[BODY_ADJ_UPPER_LAYER]" = "ADJUP", + "[BODY_FRONT_LAYER]" = "FRONT", + "[HORNS_LAYER]" = "HORNS", + ) var/g = (H.dna.features["body_model"] == FEMALE) ? "f" : "m" var/list/colorlist = list() @@ -1020,6 +1026,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.apply_overlay(BODY_ADJ_LAYER) H.apply_overlay(BODY_ADJ_UPPER_LAYER) H.apply_overlay(BODY_FRONT_LAYER) + H.apply_overlay(HORNS_LAYER) /* diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index 860d531608..b3be01e1b0 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -9,6 +9,8 @@ maxHealth = 100 health = 100 + combat_flags = COMBAT_FLAGS_DEFAULT + var/custom_name = "" var/braintype = "Cyborg" var/obj/item/robot_suit/robot_suit = null //Used for deconstruction to remember what the borg was constructed out of.. diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index f1108189c7..dc091cb451 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1411,6 +1411,7 @@ if(WIRE_POWER1, WIRE_POWER2) if(!wires.is_cut(WIRE_POWER1) && !wires.is_cut(WIRE_POWER2)) shorted = FALSE + update() if(WIRE_AI) if(!wires.is_cut(WIRE_AI)) aidisabled = FALSE diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 344d41071d..3c3f3c9541 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -314,8 +314,11 @@ . = ..() SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(on && status == LIGHT_OK) - SSvis_overlays.add_vis_overlay(src, overlayicon, base_state, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE, dir, clamp(light_power*250, 30, 200)) - + var/overlay_alpha = clamp(light_power*250, 30, 200) + SSvis_overlays.add_vis_overlay(src, overlayicon, base_state, EMISSIVE_UNBLOCKABLE_LAYER, EMISSIVE_UNBLOCKABLE_PLANE, dir, overlay_alpha) + var/mutable_appearance/M = mutable_appearance(overlayicon, base_state) + M.alpha = overlay_alpha + . += M // update the icon_state and luminosity of the light depending on its state /obj/machinery/light/proc/update(trigger = TRUE) diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm index 7ed0cde50a..7a3c82489c 100644 --- a/code/modules/projectiles/boxes_magazines/external/rechargable.dm +++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm @@ -12,3 +12,105 @@ /obj/item/ammo_box/magazine/recharge/attack_self() //No popping out the "bullets" return + +// MWS Magazine // +/obj/item/ammo_box/magazine/mws_mag + name = "microbattery magazine" + desc = "A microbattery holder for the 'Big Iron'" + + icon = 'icons/obj/ammo.dmi' + icon_state = "mws_mag" + caliber = "mws" + ammo_type = /obj/item/ammo_casing/mws_batt + start_empty = TRUE + max_ammo = 3 + + var/list/modes = list() + +/obj/item/ammo_box/magazine/mws_mag/update_overlays() + .=..() + if(!stored_ammo.len) + return //Why bother + + var/x_offset = 5 + var/current = 0 + for(var/B in stored_ammo) + var/obj/item/ammo_casing/mws_batt/batt = B + var/mutable_appearance/cap = mutable_appearance(icon, "[initial(icon_state)]_cap", color = batt.type_color) + cap.pixel_x = current * x_offset //Caps don't need a pixel_y offset + . += cap + if(batt.cell.charge > 0) + var/ratio = CEILING(clamp(batt.cell.charge / batt.cell.maxcharge, 0, 1) * 4, 1) //4 is how many lights we have a sprite for + var/mutable_appearance/charge = mutable_appearance(icon, "[initial(icon_state)]_charge-[ratio]", color = "#29EAF4") //Could use battery color but eh. + charge.pixel_x = current * x_offset + . += charge + + current++ //Increment for offsets + + +// MWS Batteries // +/obj/item/ammo_casing/mws_batt + name = "\'MWS\' microbattery - UNKNOWN" + desc = "A miniature battery for an energy weapon." + icon = 'icons/obj/ammo.dmi' + icon_state = "mws_batt" + slot_flags = SLOT_BELT | SLOT_EARS + throwforce = 1 + + caliber = "mws" + var/type_color = null + var/type_name = null + + var/obj/item/stock_parts/cell/cell + var/cell_type = /obj/item/stock_parts/cell{charge = 600; maxcharge = 600} + + var/e_cost = 100 + projectile_type = /obj/item/projectile/beam + +/obj/item/ammo_casing/mws_batt/Initialize() + . = ..() + pixel_x = rand(-10, 10) + pixel_y = rand(-10, 10) + cell = new cell_type(src) + cell.give(cell.maxcharge) + update_icon() + +/obj/item/ammo_casing/mws_batt/update_overlays() + .=..() + + var/mutable_appearance/ends = mutable_appearance(icon, "[initial(icon_state)]_ends", color = type_color) + . += ends + +/obj/item/ammo_casing/mws_batt/get_cell() + return cell + +/obj/item/ammo_casing/mws_batt/proc/chargeshot() + if(cell.charge >= e_cost) + cell.use(e_cost) + newshot() + return + +// Specific batteries // +/obj/item/ammo_casing/mws_batt/lethal + name = "'MWS' microbattery - LETHAL" + type_color = "#bf3d3d" + type_name = "LETHAL" + projectile_type = /obj/item/projectile/beam + +/obj/item/ammo_casing/mws_batt/stun + name = "'MWS' microbattery - STUN" + type_color = "#0f81bc" + type_name = "STUN" + projectile_type = /obj/item/projectile/beam/disabler + +/obj/item/ammo_casing/mws_batt/xray + name = "'MWS' microbattery - XRAY" + type_color = "#32c025" + type_name = "XRAY" + projectile_type = /obj/item/projectile/beam/xray + +/obj/item/ammo_casing/mws_batt/ion + name = "'MWS' microbattery - ION" + type_color = "#d084d6" + type_name = "ION" + projectile_type = /obj/item/projectile/ion \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index ef28c76da9..c4909c5583 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -128,7 +128,7 @@ zoom(user, FALSE) //we can only stay zoomed in if it's in our hands //yeah and we only unzoom if we're actually zoomed using the gun!! //called after the gun has successfully fired its chambered ammo. -/obj/item/gun/proc/process_chamber() +/obj/item/gun/proc/process_chamber(mob/living/user) return FALSE //check if there's enough ammo/energy/whatever to shoot one time @@ -306,7 +306,7 @@ else shoot_with_empty_chamber(user) return - process_chamber() + process_chamber(user) update_icon() SSblackbox.record_feedback("tally", "gun_fired", 1, type) @@ -345,7 +345,7 @@ shoot_with_empty_chamber(user) firing = FALSE return FALSE - process_chamber() + process_chamber(user) update_icon() return TRUE diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index afe2b9ca3e..9e43ec052f 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -313,19 +313,24 @@ else to_chat(user, "[src] is empty!") -// IMPROVISED SHOTGUN // +///////////////////////////// +// IMPROVISED SHOTGUN // +///////////////////////////// /obj/item/gun/ballistic/revolver/doublebarrel/improvised name = "improvised shotgun" desc = "Essentially a tube that aims shotgun shells." + desc = "A shoddy break-action breechloaded shotgun. Its lacklustre construction will probably result in it hurting people less than a normal shotgun." icon_state = "ishotgun" item_state = "shotgun" w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_MEDIUM force = 10 slot_flags = null mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised sawn_desc = "I'm just here for the gasoline." unique_reskin = null + projectile_damage_multiplier = 0.8 var/slung = FALSE /obj/item/gun/ballistic/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params) @@ -372,3 +377,114 @@ user.emote("scream") user.drop_all_held_items() user.DefaultCombatKnockdown(80) + +// -------------- HoS Modular Weapon System ------------- +// ---------- Code originally from VoreStation ---------- +/obj/item/gun/ballistic/revolver/mws + name = "MWS-01 'Big Iron'" + desc = "Modular Weapons System" + + icon = 'icons/obj/guns/projectile.dmi' + icon_state = "mws" + + fire_sound = 'sound/weapons/Taser.ogg' + + mag_type = /obj/item/ammo_box/magazine/mws_mag + spawnwithmagazine = FALSE + + recoil = 0 + + var/charge_sections = 6 + +/obj/item/gun/ballistic/revolver/mws/examine(mob/user) + . = ..() + . += "Alt-click to remove the magazine." + +/obj/item/gun/ballistic/revolver/mws/shoot_with_empty_chamber(mob/living/user as mob|obj) + process_chamber(user) + if(!chambered || !chambered.BB) + to_chat(user, "*click*") + playsound(src, "gun_dry_fire", 30, 1) + + +/obj/item/gun/ballistic/revolver/mws/process_chamber(mob/living/user) + if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired... + var/obj/item/ammo_casing/mws_batt/shot = chambered + if(shot.cell.charge >= shot.e_cost) + shot.chargeshot() + else + for(var/B in magazine.stored_ammo) + var/obj/item/ammo_casing/mws_batt/other_batt = B + if(istype(other_batt,shot) && other_batt.cell.charge >= other_batt.e_cost) + switch_to(other_batt, user) + break + update_icon() + +/obj/item/gun/ballistic/revolver/mws/proc/switch_to(obj/item/ammo_casing/mws_batt/new_batt, mob/living/user) + if(ishuman(user)) + if(chambered && new_batt.type == chambered.type) + to_chat(user,"[src] is now using the next [new_batt.type_name] power cell.") + else + to_chat(user,"[src] is now firing [new_batt.type_name].") + + chambered = new_batt + update_icon() + +/obj/item/gun/ballistic/revolver/mws/attack_self(mob/living/user) + if(!chambered) + return + + var/list/stored_ammo = magazine.stored_ammo + + if(stored_ammo.len == 1) + return //silly you. + + //Find an ammotype that ISN'T the same, or exhaust the list and don't change. + var/our_slot = stored_ammo.Find(chambered) + + for(var/index in 1 to stored_ammo.len) + var/true_index = ((our_slot + index - 1) % stored_ammo.len) + 1 // Stupid ONE BASED lists! + var/obj/item/ammo_casing/mws_batt/next_batt = stored_ammo[true_index] + if(chambered != next_batt && !istype(next_batt, chambered.type) && next_batt.cell.charge >= next_batt.e_cost) + switch_to(next_batt, user) + break + +/obj/item/gun/ballistic/revolver/mws/AltClick(mob/living/user) + .=..() + if(magazine) + user.put_in_hands(magazine) + magazine.update_icon() + if(magazine.ammo_count()) + playsound(src, 'sound/weapons/gun_magazine_remove_full.ogg', 70, 1) + else + playsound(src, "gun_remove_empty_magazine", 70, 1) + magazine = null + to_chat(user, "You pull the magazine out of [src].") + if(chambered) + chambered = null + update_icon() + +/obj/item/gun/ballistic/revolver/mws/update_overlays() + .=..() + if(!chambered) + return + + var/obj/item/ammo_casing/mws_batt/batt = chambered + var/batt_color = batt.type_color //Used many times + + //Mode bar + var/image/mode_bar = image(icon, icon_state = "[initial(icon_state)]_type") + mode_bar.color = batt_color + . += mode_bar + + //Barrel color + var/mutable_appearance/barrel_color = mutable_appearance(icon, "[initial(icon_state)]_barrel", color = batt_color) + barrel_color.alpha = 150 + . += barrel_color + + //Charge bar + var/ratio = can_shoot() ? CEILING(clamp(batt.cell.charge / batt.cell.maxcharge, 0, 1) * charge_sections, 1) : 0 + for(var/i = 0, i < ratio, i++) + var/mutable_appearance/charge_bar = mutable_appearance(icon, "[initial(icon_state)]_charge", color = batt_color) + charge_bar.pixel_x = i + . += charge_bar \ No newline at end of file diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 4894a8d8eb..e438b351b3 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -126,8 +126,9 @@ /obj/item/gun/ballistic/shotgun/boltaction/improvised name = "Makeshift 7.62mm Rifle" icon_state = "ishotgun" + icon_state = "irifle" item_state = "shotgun" - desc = "A large zip gun more or less that takes a single 7.62mm bullet" + desc = "A bolt-action breechloaded rifle that takes 7.62mm bullets." mag_type = /obj/item/ammo_box/magazine/internal/boltaction/improvised can_bayonet = FALSE diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm index 20a5370793..9cbef4abdd 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm @@ -10,6 +10,7 @@ id = "beanbag_slug" build_type = AUTOLATHE materials = list(/datum/material/iron = 250) + materials = list(/datum/material/iron = 1000) build_path = /obj/item/ammo_casing/shotgun/beanbag category = list("initial", "Security") @@ -73,12 +74,12 @@ build_path = /obj/item/restraints/handcuffs category = list("hacked", "Security") -/datum/design/receiver - name = "Modular Receiver" - id = "receiver" - build_type = AUTOLATHE | NO_PUBLIC_LATHE - materials = list(/datum/material/iron = 15000) - build_path = /obj/item/weaponcrafting/receiver +/datum/design/rifle_receiver + name = "Rifle Receiver" + id = "rifle_receiver" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 40000) + build_path = /obj/item/weaponcrafting/improvised_parts/rifle_receiver category = list("hacked", "Security") /datum/design/shotgun_slug @@ -113,6 +114,10 @@ build_path = /obj/item/ammo_casing/shotgun/incendiary category = list("hacked", "Security") +///////////////// +// Bullets // +///////////////// + /datum/design/riot_dart name = "Foam Riot Dart" id = "riot_dart" diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm index eebeec2c78..ea73df568f 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm @@ -271,4 +271,13 @@ build_type = AUTOLATHE materials = list(/datum/material/iron = 5000, /datum/material/glass = 2000) build_path = /obj/item/vending_refill/custom - category = list("initial", "Misc") \ No newline at end of file + category = list("initial", "Misc") + +/datum/design/trigger_assembly + name = "Trigger Assembly" + id = "trigger_assembly" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 6500, /datum/material/glass = 50) + build_path = /obj/item/weaponcrafting/improvised_parts/trigger_assembly + category = list("initial", "Misc") + diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm index 330dfb8f8a..516c91d426 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm @@ -157,3 +157,11 @@ materials = list(/datum/material/iron = 150, /datum/material/glass = 150) build_path = /obj/item/geiger_counter category = list("initial", "Tools") + +/datum/design/saw + name = "Hand Saw" + id = "handsaw" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 500) + build_path = /obj/item/hatchet/saw + category = list("initial", "Tools") diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index efd9aad673..641e52dd13 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -6,7 +6,8 @@ products = list(/obj/item/toy/cards/deck = 5, /obj/item/storage/pill_bottle/dice = 10, /obj/item/toy/cards/deck/cas = 3, - /obj/item/toy/cards/deck/cas/black = 3) + /obj/item/toy/cards/deck/cas/black = 3, + /obj/item/toy/cards/deck/unum = 3) contraband = list(/obj/item/dice/fudge = 9) premium = list(/obj/item/melee/skateboard/pro = 3, /obj/item/melee/skateboard/hoverboard = 1) diff --git a/html/changelog.html b/html/changelog.html index 3d05d75736..cc419e13fb 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -385,454 +385,6 @@