"
- for(var/ore in ore_values)
- var/value = ore_values[ore]
- dat += "
[capitalize(ore)]
[value * point_upgrade]
"
- dat += "
"
- return dat
-
-/obj/machinery/mineral/ore_redemption/Topic(href, href_list)
- if(..())
- return
- GET_COMPONENT(materials, /datum/component/material_container)
- if(href_list["eject_id"])
- usr.put_in_hands(inserted_id)
- inserted_id = null
- if(href_list["claim"])
- if(inserted_id)
- if(req_access_reclaim in inserted_id.access)
- inserted_id.mining_points += points
- points = 0
- else
- to_chat(usr, "Required access not found.")
- else if(href_list["insert_id"])
- var/obj/item/card/id/I = usr.get_active_hand()
- if(istype(I))
- if(!usr.drop_item())
- return
- I.forceMove(src)
- inserted_id = I
- else
- to_chat(usr, "Not a valid ID!")
- if(href_list["eject_disk"])
- if(inserted_disk)
- inserted_disk.forceMove(loc)
- inserted_disk = null
- if(href_list["insert_disk"])
- var/obj/item/disk/design_disk/D = usr.get_active_hand()
- if(istype(D))
- if(!usr.drop_item())
- return
- D.forceMove(src)
- inserted_disk = D
- if(href_list["upload"])
- if(inserted_disk && inserted_disk.blueprint)
- files.AddDesign2Known(inserted_disk.blueprint)
-
- if(href_list["release"])
- if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user
- var/mat_id = href_list["release"]
- if(!materials.materials[mat_id])
- return
-
- var/datum/material/mat = materials.materials[mat_id]
- var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT
-
- if(!stored_amount)
- return
-
- var/desired = input("How many sheets?", "How many sheets to eject?", 1) as null|num
- var/sheets_to_remove = round(min(desired,50,stored_amount))
-
- var/out = get_step(src, output_dir)
- materials.retrieve_sheets(sheets_to_remove, mat_id, out)
-
- else
- to_chat(usr, "Required access not found.")
-
- if(href_list["alloy"])
- var/alloy_id = href_list["alloy"]
- var/datum/design/alloy = files.FindDesignByID(alloy_id)
- if((check_access(inserted_id) || allowed(usr)) && alloy)
- var/desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
- if(desired < 1) // Stops an exploit that lets you build negative alloys and get free materials
- return
- var/smelt_amount = can_smelt_alloy(alloy)
- var/amount = round(min(desired,50,smelt_amount))
- materials.use_amount(alloy.materials, amount)
-
- var/output = new alloy.build_path(src)
- if(istype(output, /obj/item/stack/sheet))
- var/obj/item/stack/sheet/mineral/produced_alloy = output
- produced_alloy.amount = amount
- unload_mineral(produced_alloy)
- else
- unload_mineral(output)
-
- else
- to_chat(usr, "Required access not found.")
- updateUsrDialog()
-
-/obj/machinery/mineral/ore_redemption/ex_act(severity, target)
- do_sparks(5, 1, src)
- if(severity == 1)
- if(prob(50))
- qdel(src)
- else if(severity == 2)
- if(prob(25))
- qdel(src)
-
-/obj/machinery/mineral/ore_redemption/power_change()
- ..()
- update_icon()
- if(inserted_id && !powered())
- visible_message("The ID slot indicator light flickers on [src] as it spits out a card before powering down.")
- inserted_id.forceMove(loc)
-
-/obj/machinery/mineral/ore_redemption/update_icon()
- if(powered())
- icon_state = initial(icon_state)
- else
- icon_state = "[initial(icon_state)]-off"
-
-/**********************Mining Equipment Locker**************************/
-
-/obj/machinery/mineral/equipment_vendor
- name = "mining equipment vendor"
- desc = "An equipment vendor for miners, points collected at an ore redemption machine can be spent here."
- icon = 'icons/obj/machines/mining_machines.dmi'
- icon_state = "mining"
- density = 1
- anchored = 1.0
- var/obj/item/card/id/inserted_id
- var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces.
- new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
- new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
- new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300),
- new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100),
- new /datum/data/mining_equipment("Absinthe", /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, 100),
- new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
- new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200),
- new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300),
- new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
- new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400),
- new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
- new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500),
-// new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
- new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
- new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
- new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500),
- new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/autoinjector/survival, 500),
- new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600),
- new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
- new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750),
- new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/kinetic_crusher, 750),
- new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750),
- new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 800),
- new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800),
-// new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000),
- new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
- new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
- new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript, 1500),
- new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000),
- new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
- new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
- new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
- new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
- new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
- new /datum/data/mining_equipment("Nanotrasen Minebot", /obj/item/mining_drone_cube, 800),
- new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
- new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
- new /datum/data/mining_equipment("Minebot Cooldown Upgrade", /obj/item/borg/upgrade/modkit/cooldown/minebot, 600),
- new /datum/data/mining_equipment("Minebot AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
- new /datum/data/mining_equipment("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100),
- new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800),
- new /datum/data/mining_equipment("Lazarus Capsule belt", /obj/item/storage/belt/lazarus, 200),
- new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
- new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150),
- new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250),
- new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300),
- new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
- new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
- new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
- new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000)
- )
-
-/obj/machinery/mineral/equipment_vendor/golem
- name = "golem ship equipment vendor"
-
-/obj/machinery/mineral/equipment_vendor/golem/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/circuitboard/mining_equipment_vendor/golem(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/console_screen(null)
- RefreshParts()
-
-/obj/machinery/mineral/equipment_vendor/golem/Initialize()
- . = ..()
- desc += "\nIt seems a few selections have been added."
- prize_list += list(
- new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/golem, 250),
- new /datum/data/mining_equipment("Science Backpack", /obj/item/storage/backpack/science, 250),
- new /datum/data/mining_equipment("Full Toolbelt", /obj/item/storage/belt/utility/full/multitool, 250),
- new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 250),
- new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500),
- new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
- new /datum/data/mining_equipment("KA Trigger Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1000),
- new /datum/data/mining_equipment("Shuttle Console Board", /obj/item/circuitboard/shuttle/golem_ship, 2000),
- new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000)
-
- )
-
-/datum/data/mining_equipment
- var/equipment_name = "generic"
- var/equipment_path = null
- var/cost = 0
-
-/datum/data/mining_equipment/New(name, path, equipment_cost)
- equipment_name = name
- equipment_path = path
- cost = equipment_cost
-
-/obj/machinery/mineral/equipment_vendor/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/circuitboard/mining_equipment_vendor(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- component_parts += new /obj/item/stock_parts/console_screen(null)
- RefreshParts()
-
-/obj/machinery/mineral/equipment_vendor/power_change()
- ..()
- update_icon()
- if(inserted_id && !powered())
- visible_message("The ID slot indicator light flickers on \the [src] as it spits out a card before powering down.")
- inserted_id.forceMove(loc)
-
-/obj/machinery/mineral/equipment_vendor/update_icon()
- if(powered())
- icon_state = initial(icon_state)
- else
- icon_state = "[initial(icon_state)]-off"
-
-/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user)
- if(..())
- return
- interact(user)
-
-/obj/machinery/mineral/equipment_vendor/attack_ghost(mob/user)
- interact(user)
-
-/obj/machinery/mineral/equipment_vendor/interact(mob/user)
- user.set_machine(src)
-
- var/dat
- dat +="
"
- if(istype(inserted_id))
- dat += "You have [inserted_id.mining_points] mining points collected. Eject ID. "
- else
- dat += "No ID inserted. Insert ID. "
- dat += "
"
- dat += " Equipment point cost list:
"
- for(var/datum/data/mining_equipment/prize in prize_list)
- dat += "
"
+ for(var/ore in ore_values)
+ var/value = ore_values[ore]
+ dat += "
[capitalize(ore)]
[value * point_upgrade]
"
+ dat += "
"
+ return dat
+
+/obj/machinery/mineral/ore_redemption/Topic(href, href_list)
+ if(..())
+ return
+ GET_COMPONENT(materials, /datum/component/material_container)
+ if(href_list["eject_id"])
+ usr.put_in_hands(inserted_id)
+ inserted_id = null
+ if(href_list["claim"])
+ if(inserted_id)
+ if(req_access_reclaim in inserted_id.access)
+ inserted_id.mining_points += points
+ points = 0
+ else
+ to_chat(usr, "Required access not found.")
+ else if(href_list["insert_id"])
+ var/obj/item/card/id/I = usr.get_active_hand()
+ if(istype(I))
+ if(!usr.drop_item())
+ return
+ I.forceMove(src)
+ inserted_id = I
+ else
+ to_chat(usr, "Not a valid ID!")
+ if(href_list["eject_disk"])
+ if(inserted_disk)
+ inserted_disk.forceMove(loc)
+ inserted_disk = null
+ if(href_list["insert_disk"])
+ var/obj/item/disk/design_disk/D = usr.get_active_hand()
+ if(istype(D))
+ if(!usr.drop_item())
+ return
+ D.forceMove(src)
+ inserted_disk = D
+ if(href_list["upload"])
+ if(inserted_disk && inserted_disk.blueprint)
+ files.AddDesign2Known(inserted_disk.blueprint)
+
+ if(href_list["release"])
+ if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user
+ var/mat_id = href_list["release"]
+ if(!materials.materials[mat_id])
+ return
+
+ var/datum/material/mat = materials.materials[mat_id]
+ var/stored_amount = mat.amount / MINERAL_MATERIAL_AMOUNT
+
+ if(!stored_amount)
+ return
+
+ var/desired = input("How many sheets?", "How many sheets to eject?", 1) as null|num
+ var/sheets_to_remove = round(min(desired,50,stored_amount))
+
+ var/out = get_step(src, output_dir)
+ materials.retrieve_sheets(sheets_to_remove, mat_id, out)
+
+ else
+ to_chat(usr, "Required access not found.")
+
+ if(href_list["alloy"])
+ var/alloy_id = href_list["alloy"]
+ var/datum/design/alloy = files.FindDesignByID(alloy_id)
+ if((check_access(inserted_id) || allowed(usr)) && alloy)
+ var/desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
+ if(desired < 1) // Stops an exploit that lets you build negative alloys and get free materials
+ return
+ var/smelt_amount = can_smelt_alloy(alloy)
+ var/amount = round(min(desired,50,smelt_amount))
+ materials.use_amount(alloy.materials, amount)
+
+ var/output = new alloy.build_path(src)
+ if(istype(output, /obj/item/stack/sheet))
+ var/obj/item/stack/sheet/mineral/produced_alloy = output
+ produced_alloy.amount = amount
+ unload_mineral(produced_alloy)
+ else
+ unload_mineral(output)
+
+ else
+ to_chat(usr, "Required access not found.")
+ updateUsrDialog()
+
+/obj/machinery/mineral/ore_redemption/ex_act(severity, target)
+ do_sparks(5, 1, src)
+ if(severity == 1)
+ if(prob(50))
+ qdel(src)
+ else if(severity == 2)
+ if(prob(25))
+ qdel(src)
+
+/obj/machinery/mineral/ore_redemption/power_change()
+ ..()
+ update_icon()
+ if(inserted_id && !powered())
+ visible_message("The ID slot indicator light flickers on [src] as it spits out a card before powering down.")
+ inserted_id.forceMove(loc)
+
+/obj/machinery/mineral/ore_redemption/update_icon()
+ if(powered())
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)]-off"
\ No newline at end of file
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
new file mode 100644
index 00000000000..229b9053ae6
--- /dev/null
+++ b/code/modules/mining/machine_vending.dm
@@ -0,0 +1,311 @@
+/**********************Mining Equipment Locker**************************/
+
+/obj/machinery/mineral/equipment_vendor
+ name = "mining equipment vendor"
+ desc = "An equipment vendor for miners, points collected at an ore redemption machine can be spent here."
+ icon = 'icons/obj/machines/mining_machines.dmi'
+ icon_state = "mining"
+ density = 1
+ anchored = 1.0
+ var/obj/item/card/id/inserted_id
+ var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces.
+ new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
+ new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
+ new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300),
+ new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100),
+ new /datum/data/mining_equipment("Absinthe", /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, 100),
+ new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
+ new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200),
+ new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300),
+ new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
+ new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400),
+ new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
+ new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500),
+ new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
+ new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
+ new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
+ new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500),
+ new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/autoinjector/survival, 500),
+ new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600),
+ new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
+ new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750),
+ new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/kinetic_crusher, 750),
+ new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750),
+ new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 800),
+ new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800),
+ new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000),
+ new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
+ new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
+ new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript, 1500),
+ new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000),
+ new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
+ new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
+ new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
+ new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
+ new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
+ new /datum/data/mining_equipment("Nanotrasen Minebot", /obj/item/mining_drone_cube, 800),
+ new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
+ new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
+ new /datum/data/mining_equipment("Minebot Cooldown Upgrade", /obj/item/borg/upgrade/modkit/cooldown/minebot, 600),
+ new /datum/data/mining_equipment("Minebot AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
+ new /datum/data/mining_equipment("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100),
+ new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800),
+ new /datum/data/mining_equipment("Lazarus Capsule belt", /obj/item/storage/belt/lazarus, 200),
+ new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
+ new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150),
+ new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250),
+ new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300),
+ new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
+ new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
+ new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
+ new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000)
+ )
+
+/obj/machinery/mineral/equipment_vendor/golem
+ name = "golem ship equipment vendor"
+
+/obj/machinery/mineral/equipment_vendor/golem/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/circuitboard/mining_equipment_vendor/golem(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/console_screen(null)
+ RefreshParts()
+
+/obj/machinery/mineral/equipment_vendor/golem/Initialize()
+ . = ..()
+ desc += "\nIt seems a few selections have been added."
+ prize_list += list(
+ new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/golem, 250),
+ new /datum/data/mining_equipment("Science Backpack", /obj/item/storage/backpack/science, 250),
+ new /datum/data/mining_equipment("Full Toolbelt", /obj/item/storage/belt/utility/full/multitool, 250),
+ new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 250),
+ new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500),
+ new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
+ new /datum/data/mining_equipment("KA Trigger Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1000),
+ new /datum/data/mining_equipment("Shuttle Console Board", /obj/item/circuitboard/shuttle/golem_ship, 2000),
+ new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000)
+
+ )
+
+/datum/data/mining_equipment
+ var/equipment_name = "generic"
+ var/equipment_path = null
+ var/cost = 0
+
+/datum/data/mining_equipment/New(name, path, equipment_cost)
+ equipment_name = name
+ equipment_path = path
+ cost = equipment_cost
+
+/obj/machinery/mineral/equipment_vendor/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/circuitboard/mining_equipment_vendor(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/matter_bin(null)
+ component_parts += new /obj/item/stock_parts/console_screen(null)
+ RefreshParts()
+
+/obj/machinery/mineral/equipment_vendor/power_change()
+ ..()
+ update_icon()
+ if(inserted_id && !powered())
+ visible_message("The ID slot indicator light flickers on \the [src] as it spits out a card before powering down.")
+ inserted_id.forceMove(loc)
+
+/obj/machinery/mineral/equipment_vendor/update_icon()
+ if(powered())
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)]-off"
+
+/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user)
+ if(..())
+ return
+ interact(user)
+
+/obj/machinery/mineral/equipment_vendor/attack_ghost(mob/user)
+ interact(user)
+
+/obj/machinery/mineral/equipment_vendor/interact(mob/user)
+ user.set_machine(src)
+
+ var/dat
+ dat +="
"
+ if(istype(inserted_id))
+ dat += "You have [inserted_id.mining_points] mining points collected. Eject ID. "
+ else
+ dat += "No ID inserted. Insert ID. "
+ dat += "
"
+ dat += " Equipment point cost list:
"
+ for(var/datum/data/mining_equipment/prize in prize_list)
+ dat += "
"
+ var/datum/browser/popup = new(user, "miningvendor", "Mining Equipment Vendor", 400, 350)
+ popup.set_content(dat)
+ popup.open()
+
+/obj/machinery/mineral/equipment_vendor/Topic(href, href_list)
+ if(..())
+ return 1
+
+ if(href_list["choice"])
+ if(istype(inserted_id))
+ if(href_list["choice"] == "eject")
+ inserted_id.loc = loc
+ inserted_id.verb_pickup()
+ inserted_id = null
+ else if(href_list["choice"] == "insert")
+ var/obj/item/card/id/I = usr.get_active_hand()
+ if(istype(I))
+ if(!usr.drop_item())
+ return
+ I.loc = src
+ inserted_id = I
+ else
+ to_chat(usr, "No valid ID.")
+
+ if(href_list["purchase"])
+ if(istype(inserted_id))
+ var/datum/data/mining_equipment/prize = locate(href_list["purchase"])
+ if(!prize || !(prize in prize_list) || prize.cost > inserted_id.mining_points)
+ return
+
+ inserted_id.mining_points -= prize.cost
+ new prize.equipment_path(src.loc)
+ updateUsrDialog()
+
+/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params)
+ if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
+ updateUsrDialog()
+ return
+ if(panel_open)
+ if(istype(I, /obj/item/crowbar))
+ if(inserted_id)
+ inserted_id.forceMove(loc) //Prevents deconstructing the ORM from deleting whatever ID was inside it.
+ default_deconstruction_crowbar(I)
+ return 1
+ if(istype(I, /obj/item/mining_voucher))
+ if(!powered())
+ return
+ else
+ RedeemVoucher(I, user)
+ return
+ if(istype(I,/obj/item/card/id))
+ if(!powered())
+ return
+ else
+ var/obj/item/card/id/C = usr.get_active_hand()
+ if(istype(C) && !istype(inserted_id))
+ if(!usr.drop_item())
+ return
+ C.forceMove(src)
+ inserted_id = C
+ interact(user)
+ return
+ ..()
+
+/obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer)
+ var/items = list("Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Extraction and Rescue Kit", "Crusher Kit", "Mining Conscription Kit")
+
+ var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in items
+ if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer)
+ return
+
+ var/drop_location = drop_location()
+ switch(selection)
+ if("Survival Capsule and Explorer's Webbing")
+ new /obj/item/storage/belt/mining(drop_location)
+ if("Resonator Kit")
+ new /obj/item/extinguisher/mini(drop_location)
+ new /obj/item/resonator(drop_location)
+ if("Minebot Kit")
+ new /obj/item/mining_drone_cube(drop_location)
+ new /obj/item/weldingtool/hugetank(drop_location)
+ new /obj/item/clothing/head/welding(drop_location)
+ if("Extraction and Rescue Kit")
+ new /obj/item/extraction_pack(drop_location)
+ new /obj/item/fulton_core(drop_location)
+ new /obj/item/stack/marker_beacon/thirty(drop_location)
+ if("Crusher Kit")
+ new /obj/item/extinguisher/mini(drop_location)
+ new /obj/item/twohanded/kinetic_crusher(drop_location)
+ if("Mining Conscription Kit")
+ new /obj/item/storage/backpack/duffel/mining_conscript(drop_location)
+
+ qdel(voucher)
+
+/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
+ do_sparks(5, 1, src)
+ if(prob(50 / severity) && severity < 3)
+ qdel(src)
+
+/**********************Mining Equipment Locker Items**************************/
+
+/**********************Mining Equipment Voucher**********************/
+
+/obj/item/mining_voucher
+ name = "mining voucher"
+ desc = "A token to redeem a piece of equipment. Use it on a mining equipment vendor."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "mining_voucher"
+ w_class = WEIGHT_CLASS_TINY
+
+/**********************Mining Point Card**********************/
+
+/obj/item/card/mining_point_card
+ name = "mining point card"
+ desc = "A small card preloaded with mining points. Swipe your ID card over it to transfer the points, then discard."
+ icon_state = "data"
+ var/points = 500
+
+/obj/item/card/mining_point_card/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/card/id))
+ if(points)
+ var/obj/item/card/id/C = I
+ C.mining_points += points
+ to_chat(user, "You transfer [points] points to [C].")
+ points = 0
+ else
+ to_chat(user, "There's no points left on [src].")
+ ..()
+
+/obj/item/card/mining_point_card/examine(mob/user)
+ ..(user)
+ to_chat(user, "There's [points] points on the card.")
+
+/**********************Conscription Kit**********************/
+
+/obj/item/card/id/mining_access_card
+ name = "mining access card"
+ desc = "A small card, that when used on any ID, will add mining access."
+ icon_state = "data_1"
+
+/obj/item/card/id/mining_access_card/afterattack(atom/movable/AM, mob/user, proximity)
+ . = ..()
+ if(istype(AM, /obj/item/card/id) && proximity)
+ var/obj/item/card/id/I = AM
+ I.access |= list(access_mining, access_mining_station, access_mineral_storeroom, access_cargo)
+ to_chat(user, "You upgrade [I] with mining access.")
+ qdel(src)
+
+/obj/item/storage/backpack/duffel/mining_conscript
+ name = "mining conscription kit"
+ desc = "A kit containing everything a crewmember needs to support a shaft miner in the field."
+
+/obj/item/storage/backpack/duffel/mining_conscript/New()
+ ..()
+ new /obj/item/clothing/glasses/meson(src)
+ new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
+ new /obj/item/storage/bag/ore(src)
+ new /obj/item/clothing/suit/hooded/explorer(src)
+ new /obj/item/encryptionkey/headset_cargo(src)
+ new /obj/item/clothing/mask/gas/explorer(src)
+ new /obj/item/card/id/mining_access_card(src)
+ new /obj/item/gun/energy/kinetic_accelerator(src)
+ new /obj/item/kitchen/knife/combat/survival(src)
+ new /obj/item/flashlight/seclite(src)
\ No newline at end of file
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 87b919ea238..f350633a4c2 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -75,157 +75,6 @@
desc = "A mining lantern."
brightness_on = 6 // luminosity when on
-/*****************************Pickaxe********************************/
-
-/obj/item/pickaxe
- name = "pickaxe"
- icon = 'icons/obj/items.dmi'
- icon_state = "pickaxe"
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 15
- throwforce = 10
- item_state = "pickaxe"
- w_class = WEIGHT_CLASS_BULKY
- materials = list(MAT_METAL=2000) //one sheet, but where can you make them?
- origin_tech = "materials=2;engineering=3"
- attack_verb = list("hit", "pierced", "sliced", "attacked")
- var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg')
- var/drill_verb = "picking"
- sharp = 1
- var/excavation_amount = 100
- usesound = 'sound/effects/picaxe1.ogg'
- toolspeed = 1
-
-/obj/item/pickaxe/proc/playDigSound()
- playsound(src, pick(digsound),20,1)
-
-/obj/item/pickaxe/emergency
- name = "emergency disembarkation tool"
- desc = "For extracting yourself from rough landings."
-
-/obj/item/pickaxe/safety
- name = "safety pickaxe"
- desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon."
- force = 1
- throwforce = 1
- attack_verb = list("ineffectively hit")
-
-/obj/item/pickaxe/mini
- name = "compact pickaxe"
- desc = "A smaller, compact version of the standard pickaxe."
- icon_state = "minipick"
- force = 10
- throwforce = 7
- w_class = WEIGHT_CLASS_NORMAL
- materials = list(MAT_METAL = 1000)
-
-/obj/item/pickaxe/silver
- name = "silver-plated pickaxe"
- icon_state = "spickaxe"
- item_state = "spickaxe"
- origin_tech = "materials=3;engineering=4"
- desc = "A silver-plated pickaxe that mines slightly faster than standard-issue."
- toolspeed = 0.75
-
-/obj/item/pickaxe/gold
- name = "golden pickaxe"
- icon_state = "gpickaxe"
- item_state = "gpickaxe"
- origin_tech = "materials=4;engineering=4"
- desc = "A gold-plated pickaxe that mines faster than standard-issue."
- toolspeed = 0.6
-
-/obj/item/pickaxe/diamond
- name = "diamond-tipped pickaxe"
- icon_state = "dpickaxe"
- item_state = "dpickaxe"
- origin_tech = "materials=5;engineering=4"
- desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt."
- toolspeed = 0.5
-
-/obj/item/pickaxe/drill
- name = "mining drill"
- icon_state = "handdrill"
- item_state = "jackhammer"
- digsound = list('sound/weapons/drill.ogg')
- hitsound = 'sound/weapons/drill.ogg'
- usesound = 'sound/weapons/drill.ogg'
- origin_tech = "materials=2;powerstorage=2;engineering=3"
- desc = "An electric mining drill for the especially scrawny."
- toolspeed = 0.5
-
-/obj/item/pickaxe/drill/cyborg
- name = "cyborg mining drill"
- desc = "An integrated electric mining drill."
- flags = NODROP
-
-/obj/item/pickaxe/drill/diamonddrill
- name = "diamond-tipped mining drill"
- icon_state = "diamonddrill"
- origin_tech = "materials=6;powerstorage=4;engineering=4"
- desc = "Yours is the drill that will pierce the heavens!"
- toolspeed = 0.25
-
-/obj/item/pickaxe/diamonddrill/traitor //Pocket-sized traitor diamond drill.
- name = "supermatter drill"
- icon_state = "smdrill"
- origin_tech = "materials=6;powerstorage=4;engineering=4;syndicate=3"
- desc = "Microscopic supermatter crystals cover the head of this tiny drill."
- w_class = WEIGHT_CLASS_SMALL
-
-/obj/item/pickaxe/drill/cyborg/diamond //This is the BORG version!
- name = "diamond-tipped cyborg mining drill" //To inherit the NODROP flag, and easier to change borg specific drill mechanics.
- icon_state = "diamonddrill"
- toolspeed = 0.25
-
-/obj/item/pickaxe/drill/jackhammer
- name = "sonic jackhammer"
- icon_state = "jackhammer"
- item_state = "jackhammer"
- origin_tech = "materials=6;powerstorage=4;engineering=5;magnets=4"
- digsound = list('sound/weapons/sonic_jackhammer.ogg')
- hitsound = 'sound/weapons/sonic_jackhammer.ogg'
- usesound = 'sound/weapons/sonic_jackhammer.ogg'
- desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls."
- toolspeed = 0.1
-
-/*****************************Shovel********************************/
-
-/obj/item/shovel
- name = "shovel"
- desc = "A large tool for digging and moving dirt."
- icon = 'icons/obj/items.dmi'
- icon_state = "shovel"
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 8
- throwforce = 4
- item_state = "shovel"
- w_class = WEIGHT_CLASS_NORMAL
- materials = list(MAT_METAL=50)
- origin_tech = "materials=2;engineering=2"
- attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
- usesound = 'sound/effects/shovel_dig.ogg'
- toolspeed = 1
-
-/obj/item/shovel/spade
- name = "spade"
- desc = "A small tool for digging and moving dirt."
- icon_state = "spade"
- item_state = "spade"
- force = 5
- throwforce = 7
- w_class = WEIGHT_CLASS_SMALL
- toolspeed = 2
-
-/obj/item/shovel/safety
- name = "safety shovel"
- desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon."
- force = 1
- throwforce = 1
- attack_verb = list("ineffectively hit")
-
/**********************Mining car (Crate like thing, not the rail car)**************************/
/obj/structure/closet/crate/miningcar
@@ -234,60 +83,4 @@
icon_state = "miningcar"
density = 1
icon_opened = "miningcaropen"
- icon_closed = "miningcar"
-
-/*********************Mob Capsule*************************/
-
-/obj/item/mobcapsule
- name = "lazarus capsule"
- desc = "It allows you to store and deploy lazarus-injected creatures easier."
- icon = 'icons/obj/mobcap.dmi'
- icon_state = "mobcap0"
- w_class = WEIGHT_CLASS_TINY
- throw_range = 20
- var/mob/living/simple_animal/captured = null
- var/colorindex = 0
-
-/obj/item/mobcapsule/Destroy()
- if(captured)
- captured.ghostize()
- QDEL_NULL(captured)
- return ..()
-
-/obj/item/mobcapsule/attack(var/atom/A, mob/user, prox_flag)
- if(!istype(A, /mob/living/simple_animal) || isbot(A))
- return ..()
- capture(A, user)
- return 1
-
-/obj/item/mobcapsule/proc/capture(var/mob/target, var/mob/U as mob)
- var/mob/living/simple_animal/T = target
- if(captured)
- to_chat(U, "Capture failed!: The capsule already has a mob registered to it!")
- else
- if(istype(T) && "neutral" in T.faction)
- T.forceMove(src)
- T.name = "[U.name]'s [initial(T.name)]"
- T.cancel_camera()
- name = "Lazarus Capsule: [initial(T.name)]"
- to_chat(U, "You placed a [T.name] inside the Lazarus Capsule!")
- captured = T
- else
- to_chat(U, "You can't capture that mob!")
-
-/obj/item/mobcapsule/throw_impact(atom/A, mob/user)
- ..()
- if(captured)
- dump_contents(user)
-
-/obj/item/mobcapsule/proc/dump_contents(mob/user)
- if(captured)
- captured.forceMove(get_turf(src))
- captured = null
-
-/obj/item/mobcapsule/attack_self(mob/user)
- colorindex += 1
- if(colorindex >= 6)
- colorindex = 0
- icon_state = "mobcap[colorindex]"
- update_icon()
+ icon_closed = "miningcar"
\ No newline at end of file
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index 2ff2a686439..e7036ad4f2f 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -303,6 +303,7 @@
qdel(src)
//AI
+
/obj/item/slimepotion/sentience/mining
name = "minebot AI upgrade"
desc = "Can be used to grant sentience to minebots."
@@ -325,5 +326,21 @@
if(M.stored_gun)
M.stored_gun.overheat_time += base_cooldown_add
+/**********************Mining drone cube**********************/
+
+/obj/item/mining_drone_cube
+ name = "mining drone cube"
+ desc = "Compressed mining drone, ready for deployment. Just press the button to activate!"
+ w_class = WEIGHT_CLASS_SMALL
+ icon = 'icons/obj/aibots.dmi'
+ icon_state = "minedronecube"
+ item_state = "electronic"
+
+/obj/item/mining_drone_cube/attack_self(mob/user)
+ user.visible_message("\The [src] suddenly expands into a fully functional mining drone!", \
+ "You press center button on \the [src]. The device suddenly expands into a fully functional mining drone!")
+ new /mob/living/simple_animal/hostile/mining_drone(get_turf(src))
+ qdel(src)
+
#undef MINEDRONE_COLLECT
-#undef MINEDRONE_ATTACK
+#undef MINEDRONE_ATTACK
\ No newline at end of file
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ores_coins.dm
similarity index 70%
rename from code/modules/mining/ore.dm
rename to code/modules/mining/ores_coins.dm
index 236bcec1231..120dacad800 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -303,8 +303,165 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
qdel(src)
-/obj/item/stack/ore/ex_act()
- return
+/obj/item/stack/ore/ex_act(severity)
+ if(!severity || severity >= 2)
+ return
+ qdel(src)
+
+
+/*****************************Coin********************************/
+
+/obj/item/coin
+ icon = 'icons/obj/economy.dmi'
+ name = "coin"
+ icon_state = "coin__heads"
+ flags = CONDUCT
+ force = 1
+ throwforce = 2
+ w_class = WEIGHT_CLASS_TINY
+ var/string_attached
+ var/list/sideslist = list("heads","tails")
+ var/cmineral = null
+ var/cooldown = 0
+ var/credits = 10
+
+/obj/item/coin/New()
+ pixel_x = rand(0,16)-8
+ pixel_y = rand(0,8)-8
+
+ icon_state = "coin_[cmineral]_[sideslist[1]]"
+ if(cmineral)
+ name = "[cmineral] coin"
+
+/obj/item/coin/gold
+ cmineral = "gold"
+ icon_state = "coin_gold_heads"
+ materials = list(MAT_GOLD = 400)
+ credits = 160
+
+/obj/item/coin/silver
+ cmineral = "silver"
+ icon_state = "coin_silver_heads"
+ materials = list(MAT_SILVER = 400)
+ credits = 40
+
+/obj/item/coin/diamond
+ cmineral = "diamond"
+ icon_state = "coin_diamond_heads"
+ materials = list(MAT_DIAMOND = 400)
+ credits = 120
+
+/obj/item/coin/iron
+ cmineral = "iron"
+ icon_state = "coin_iron_heads"
+ materials = list(MAT_METAL = 400)
+ credits = 20
+
+/obj/item/coin/plasma
+ cmineral = "plasma"
+ icon_state = "coin_plasma_heads"
+ materials = list(MAT_PLASMA = 400)
+ credits = 80
+
+/obj/item/coin/uranium
+ cmineral = "uranium"
+ icon_state = "coin_uranium_heads"
+ materials = list(MAT_URANIUM = 400)
+ credits = 160
+
+/obj/item/coin/clown
+ cmineral = "bananium"
+ icon_state = "coin_bananium_heads"
+ materials = list(MAT_BANANIUM = 400)
+ credits = 600 //makes the clown cri
+
+/obj/item/coin/mime
+ cmineral = "tranquillite"
+ icon_state = "coin_tranquillite_heads"
+ materials = list(MAT_TRANQUILLITE = 400)
+ credits = 600 //makes the mime cri
+
+/obj/item/coin/adamantine
+ cmineral = "adamantine"
+ icon_state = "coin_adamantine_heads"
+ credits = 400
+
+/obj/item/coin/mythril
+ cmineral = "mythril"
+ icon_state = "coin_mythril_heads"
+ credits = 400
+
+/obj/item/coin/twoheaded
+ cmineral = "iron"
+ icon_state = "coin_iron_heads"
+ desc = "Hey, this coin's the same on both sides!"
+ sideslist = list("heads")
+ credits = 20
+
+/obj/item/coin/antagtoken
+ name = "antag token"
+ icon_state = "coin_valid_valid"
+ cmineral = "valid"
+ desc = "A novelty coin that helps the heart know what hard evidence cannot prove."
+ sideslist = list("valid", "salad")
+ credits = 20
+
+/obj/item/coin/antagtoken/syndicate
+ name = "syndicate coin"
+ credits = 160
+
+/obj/item/coin/attackby(obj/item/W as obj, mob/user as mob, params)
+ if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/CC = W
+ if(string_attached)
+ to_chat(user, "There already is a string attached to this coin.")
+ return
+
+ if(CC.use(1))
+ overlays += image('icons/obj/economy.dmi',"coin_string_overlay")
+ string_attached = 1
+ to_chat(user, "You attach a string to the coin.")
+ else
+ to_chat(user, "You need one length of cable to attach a string to the coin.")
+ return
+
+ else if(istype(W,/obj/item/wirecutters))
+ if(!string_attached)
+ ..()
+ return
+
+ var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc)
+ CC.amount = 1
+ CC.update_icon()
+ overlays = list()
+ string_attached = null
+ to_chat(user, "You detach the string from the coin.")
+ else if(istype(W,/obj/item/weldingtool))
+ var/obj/item/weldingtool/WT = W
+ if(WT.welding && WT.remove_fuel(0, user))
+ var/typelist = list("iron" = /obj/item/clothing/gloves/ring,
+ "silver" = /obj/item/clothing/gloves/ring/silver,
+ "gold" = /obj/item/clothing/gloves/ring/gold,
+ "plasma" = /obj/item/clothing/gloves/ring/plasma,
+ "uranium" = /obj/item/clothing/gloves/ring/uranium)
+ var/typekey = typelist[cmineral]
+ if(ispath(typekey))
+ to_chat(user, "You make [src] into a ring.")
+ new typekey(get_turf(loc))
+ qdel(src)
+ else ..()
+
+/obj/item/coin/attack_self(mob/user as mob)
+ if(cooldown < world.time - 15)
+ var/coinflip = pick(sideslist)
+ cooldown = world.time
+ flick("coin_[cmineral]_flip", src)
+ icon_state = "coin_[cmineral]_[coinflip]"
+ playsound(user.loc, 'sound/items/coinflip.ogg', 50, 1)
+ if(do_after(user, 15, target = src))
+ user.visible_message("[user] has flipped [src]. It lands on [coinflip].", \
+ "You flip [src]. It lands on [coinflip].", \
+ "You hear the clattering of loose change.")
#undef GIBTONITE_QUALITY_LOW
#undef GIBTONITE_QUALITY_MEDIUM
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 731f53c7838..7c80b93e5ee 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -29,6 +29,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
var/seedarkness = TRUE
var/data_hud_seen = FALSE //this should one of the defines in __DEFINES/hud.dm
var/ghost_orbit = GHOST_ORBIT_CIRCLE
+ var/health_scan = FALSE //does the ghost have health scanner mode on? by default it should be off
/mob/dead/observer/New(var/mob/body=null, var/flags=1)
set_invisibility(GLOB.observer_default_invisibility)
@@ -236,6 +237,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return 1
/mob/dead/observer/Move(NewLoc, direct)
+ update_parallax_contents()
following = null
setDir(direct)
ghostimage.setDir(dir)
@@ -417,6 +419,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
forceMove(pick(L))
+ update_parallax_contents()
following = null
/mob/dead/observer/verb/follow()
@@ -511,6 +514,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination.
A.forceMove(T)
+ M.update_parallax_contents()
+ following = null
return
to_chat(A, "This mob is not located in the game world.")
@@ -537,6 +542,19 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set hidden = 1
to_chat(src, "You are dead! You have no mind to store memory!")
+
+/mob/dead/observer/verb/toggle_health_scan()
+ set name = "Toggle Health Scan"
+ set desc = "Toggles whether you health-scan living beings on click"
+ set category = "Ghost"
+
+ if(health_scan) //remove old huds
+ to_chat(src, "Health scan disabled.")
+ health_scan = FALSE
+ else
+ to_chat(src, "Health scan enabled.")
+ health_scan = TRUE
+
/mob/dead/observer/verb/analyze_air()
set name = "Analyze Air"
set category = "Ghost"
@@ -761,14 +779,17 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/proc/incarnate_ghost()
if(!client)
return
+
var/mob/living/carbon/human/new_char = new(get_turf(src))
client.prefs.copy_to(new_char)
if(mind)
- mind.active = 1
+ mind.active = TRUE
mind.transfer_to(new_char)
else
new_char.key = key
+ return new_char
+
/mob/dead/observer/is_literate()
return TRUE
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index a8dbaa7ac2f..82b98a3732e 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -1128,6 +1128,7 @@ so that different stomachs can handle things in different ways VB*/
var/obj/item/clothing/C = I
if(C.tint || initial(C.tint))
update_tint()
+ update_sight()
if(I.flags_inv & HIDEMASK || forced)
update_inv_wear_mask()
update_inv_head()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index c0e4d8570a1..0cd4b176e0b 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1877,6 +1877,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
. = ..()
. += "---"
.["Set Species"] = "?_src_=vars;setspecies=[UID()]"
+ .["Copy Outfit"] = "?_src_=vars;copyoutfit=[UID()]"
.["Make AI"] = "?_src_=vars;makeai=[UID()]"
.["Make cyborg"] = "?_src_=vars;makerobot=[UID()]"
.["Make monkey"] = "?_src_=vars;makemonkey=[UID()]"
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index b95920e688b..d172fabef00 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -141,19 +141,19 @@ emp_act
if(l_hand && !istype(l_hand, /obj/item/clothing))
var/final_block_chance = l_hand.block_chance - (Clamp((armour_penetration-l_hand.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example
- if(l_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
+ if(l_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM))
return 1
if(r_hand && !istype(r_hand, /obj/item/clothing))
var/final_block_chance = r_hand.block_chance - (Clamp((armour_penetration-r_hand.armour_penetration)/2,0,100)) + block_chance_modifier //Need to reset the var so it doesn't carry over modifications between attempts
- if(r_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
+ if(r_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM))
return 1
if(wear_suit)
var/final_block_chance = wear_suit.block_chance - (Clamp((armour_penetration-wear_suit.armour_penetration)/2,0,100)) + block_chance_modifier
- if(wear_suit.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
+ if(wear_suit.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM))
return 1
if(w_uniform)
var/final_block_chance = w_uniform.block_chance - (Clamp((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier
- if(w_uniform.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
+ if(w_uniform.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM))
return 1
return 0
@@ -525,4 +525,4 @@ emp_act
if(head)
to_chat(src, "Your [head.name] protects you from the [hot ? "hot" : "cold"] liquid!")
return FALSE
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 925e979c11d..c574cf3cd53 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -63,7 +63,8 @@
else
//No oldFP or it's a different kind of blood
S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP)
- createFootprintsFrom(shoes, dir, T)
+ if(S.bloody_shoes[S.blood_state] > BLOOD_LOSS_IN_SPREAD)
+ createFootprintsFrom(shoes, dir, T)
update_inv_shoes()
else if(hasfeet)
if(bloody_feet && bloody_feet[blood_state])
@@ -72,7 +73,8 @@
return
else
bloody_feet[blood_state] = max(0, bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP)
- createFootprintsFrom(src, dir, T)
+ if(bloody_feet[blood_state] > BLOOD_LOSS_IN_SPREAD)
+ createFootprintsFrom(src, dir, T)
update_inv_shoes()
//End bloody footprints
if(S)
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index cf9fcfd632c..c4ceb829fff 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -567,3 +567,10 @@
return 0
return O.equip(src, visualsOnly)
+
+//delete all equipment without dropping anything
+/mob/living/carbon/human/proc/delete_equipment()
+ for(var/slot in get_all_slots())//order matters, dependant slots go first
+ qdel(slot)
+ for(var/obj/item/I in l_hand, r_hand)
+ qdel(I)
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 785d737aec2..e4ba4349202 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -6,21 +6,19 @@
dangerous_existence = TRUE //So so much
//language = "Clatter"
- species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING)
+ species_traits = list(IS_WHITELISTED, RADIMMUNE, NO_BLOOD, NOTRANSSTING)
forced_heartattack = TRUE // Plasmamen have no blood, but they should still get heart-attacks
skinned_type = /obj/item/stack/sheet/mineral/plasma // We're low on plasma, R&D! *eyes plasmaman co-worker intently*
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
- //default_mutations=list(SKELETON) // This screws things up
-
butt_sprite = "plasma"
breathid = "tox"
- heat_level_1 = 350 // Heat damage level 1 above this point.
- heat_level_2 = 400 // Heat damage level 2 above this point.
- heat_level_3 = 500 // Heat damage level 3 above this point.
+ burn_mod = 1.5
+ heatmod = 1.5
+ brute_mod = 1.5
//Has default darksight of 2.
@@ -48,136 +46,118 @@
message = replacetext(message, "s", stutter("ss"))
return message
-/datum/species/plasmaman/after_equip_job(datum/job/J, mob/living/carbon/human/H)
- var/assigned_role = H.mind && H.mind.assigned_role ? H.mind.assigned_role : "Civilian"
- // Unequip existing suits and hats.
- H.unEquip(H.wear_suit)
- H.unEquip(H.head)
- if(assigned_role != "Clown")
- H.unEquip(H.wear_mask)
-
- H.equip_or_collect(new /obj/item/clothing/mask/breath(H), slot_wear_mask)
- var/suit=/obj/item/clothing/suit/space/eva/plasmaman/assistant
- var/helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
- var/tank_slot = slot_s_store
- var/tank_slot_name = "suit storage"
-
- switch(assigned_role)
- if("Scientist","Roboticist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/science
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science
- if("Geneticist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/science/geneticist
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/geneticist
- if("Research Director")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/science/rd
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd
- if("Station Engineer", "Mechanic")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer
- if("Chief Engineer")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce
- if("Life Support Specialist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/atmostech
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech
- if("Detective")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/security
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security
- if("Warden","Security Officer","Security Pod Pilot")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/security
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security
- if("Internal Affairs Agent")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/lawyer
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer
- if("Magistrate")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/magistrate
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/magistrate
- if("Head of Security", "Special Operations Officer")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hos
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos
- if("Captain", "Blueshield")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/security/captain
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain
- if("Head of Personnel")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hop
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hop
- if("Nanotrasen Representative", "Nanotrasen Navy Officer")
- suit = /obj/item/clothing/suit/space/eva/plasmaman/nt_rep
- helm = /obj/item/clothing/head/helmet/space/eva/plasmaman/nt_rep
- if("Medical Doctor","Brig Physician","Virologist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/medical
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical
- if("Paramedic")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/paramedic
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/paramedic
- if("Chemist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/chemist
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/chemist
- if("Chief Medical Officer")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/cmo
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/cmo
- if("Coroner")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/coroner
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/coroner
- if("Virologist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/virologist
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/virologist
- if("Bartender", "Chef")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/service
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/service
- if("Cargo Technician", "Quartermaster")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/cargo
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/cargo
- if("Shaft Miner")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/explorer
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/explorer
- if("Botanist")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/botanist
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/botanist
+/datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
+ var/current_job = J.title
+ var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman
+ switch(current_job)
if("Chaplain")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/chaplain
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/chaplain
- if("Janitor")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/janitor
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/janitor
- if("Civilian", "Barber")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/assistant
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
- if("Clown")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/clown
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/clown
- if("Mime")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/mime
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
- if("Syndicate Officer")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/nuclear
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear
+ O = new /datum/outfit/plasmaman/chaplain
- if((H.mind.special_role == SPECIAL_ROLE_WIZARD) || (H.mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE))
- H.equip_to_slot(new /obj/item/clothing/suit/space/eva/plasmaman/wizard(H), slot_wear_suit)
- H.equip_to_slot(new /obj/item/clothing/head/helmet/space/eva/plasmaman/wizard(H), slot_head)
- else
- H.equip_or_collect(new suit(H), slot_wear_suit)
- H.equip_or_collect(new helm(H), slot_head)
- H.equip_or_collect(new /obj/item/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy.
- H.equip_or_collect(new /obj/item/plasmensuit_cartridge(H), slot_in_backpack)
- H.equip_or_collect(new /obj/item/plasmensuit_cartridge(H), slot_in_backpack) //Two refill cartridges for their suit. Can fit in boxes.
- to_chat(H, "You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable.")
- H.internal = H.get_item_by_slot(tank_slot)
+ if("Librarian")
+ O = new /datum/outfit/plasmaman/librarian
+
+ if("Janitor")
+ O = new /datum/outfit/plasmaman/janitor
+
+ if("Botanist")
+ O = new /datum/outfit/plasmaman/botany
+
+ if("Bartender", "Internal Affairs Agent", "Magistrate", "Nanotrasen Representative", "Nanotrasen Navy Officer")
+ O = new /datum/outfit/plasmaman/bar
+
+ if("Chef")
+ O = new /datum/outfit/plasmaman/chef
+
+ if("Security Officer", "Security Pod Pilot", "Special Operations Officer")
+ O = new /datum/outfit/plasmaman/security
+
+ if("Detective")
+ O = new /datum/outfit/plasmaman/detective
+
+ if("Warden")
+ O = new /datum/outfit/plasmaman/warden
+
+ if("Head of Security")
+ O = new /datum/outfit/plasmaman/hos
+
+ if("Cargo Technician", "Quartermaster")
+ O = new /datum/outfit/plasmaman/cargo
+
+ if("Shaft Miner")
+ O = new /datum/outfit/plasmaman/mining
+
+ if("Medical Doctor", "Brig Physician", "Paramedic", "Coroner")
+ O = new /datum/outfit/plasmaman/medical
+
+ if("Chief Medical Officer")
+ O = new /datum/outfit/plasmaman/cmo
+
+ if("Chemist")
+ O = new /datum/outfit/plasmaman/chemist
+
+ if("Geneticist")
+ O = new /datum/outfit/plasmaman/genetics
+
+ if("Roboticist")
+ O = new /datum/outfit/plasmaman/robotics
+
+ if("Virologist")
+ O = new /datum/outfit/plasmaman/viro
+
+ if("Scientist")
+ O = new /datum/outfit/plasmaman/science
+
+ if("Research Director")
+ O = new /datum/outfit/plasmaman/rd
+
+ if("Station Engineer", "Mechanic")
+ O = new /datum/outfit/plasmaman/engineering
+
+ if("Chief Engineer")
+ O = new /datum/outfit/plasmaman/ce
+
+ if("Life Support Specialist")
+ O = new /datum/outfit/plasmaman/atmospherics
+
+ if("Mime")
+ O = new /datum/outfit/plasmaman/mime
+
+ if("Clown")
+ O = new /datum/outfit/plasmaman/clown
+
+ if("Head of Personnel")
+ O = new /datum/outfit/plasmaman/hop
+
+ if("Captain")
+ O = new /datum/outfit/plasmaman/captain
+
+ if("Blueshield")
+ O = new /datum/outfit/plasmaman/blueshield
+
+ H.equipOutfit(O, visualsOnly)
+ H.internal = H.r_hand
H.update_action_buttons_icon()
+ return FALSE
/datum/species/plasmaman/handle_life(mob/living/carbon/human/H)
- if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman))
- var/datum/gas_mixture/environment = H.loc.return_air()
- if(environment && environment.oxygen && environment.oxygen >= OXYCONCEN_PLASMEN_IGNITION) //Plasmamen so long as there's enough oxygen (0.5 moles, same as it takes to burn gaseous plasma).
- H.adjust_fire_stacks(0.5)
- if(!H.on_fire && H.fire_stacks > 0)
- H.visible_message("[H]'s body reacts with the atmosphere and bursts into flames!","Your body reacts with the atmosphere and bursts into flame!")
- H.IgniteMob()
+ var/datum/gas_mixture/environment = H.loc.return_air()
+ var/atmos_sealed = FALSE
+ if (H.wear_suit && H.head && istype(H.wear_suit, /obj/item/clothing) && istype(H.head, /obj/item/clothing))
+ var/obj/item/clothing/CS = H.wear_suit
+ var/obj/item/clothing/CH = H.head
+ if (CS.flags & CH.flags & STOPSPRESSUREDMAGE)
+ atmos_sealed = TRUE
+ if((!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman)) && !atmos_sealed)
+ if(environment)
+ if(environment.total_moles())
+ if(environment.oxygen && environment.oxygen >= OXYCONCEN_PLASMEN_IGNITION) //Same threshhold that extinguishes fire
+ H.adjust_fire_stacks(0.5)
+ if(!H.on_fire && H.fire_stacks > 0)
+ H.visible_message("[H]'s body reacts with the atmosphere and bursts into flames!","Your body reacts with the atmosphere and bursts into flame!")
+ H.IgniteMob()
else
- if(H.on_fire && H.fire_stacks > 0)
- var/obj/item/clothing/suit/space/eva/plasmaman/P = H.wear_suit
+ if(H.fire_stacks)
+ var/obj/item/clothing/under/plasmaman/P = H.w_uniform
if(istype(P))
P.Extinguish(H)
H.update_fire()
diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm
index 30653023751..379eb183292 100644
--- a/code/modules/mob/living/carbon/human/status_procs.dm
+++ b/code/modules/mob/living/carbon/human/status_procs.dm
@@ -7,19 +7,19 @@
/mob/living/carbon/human/SetStunned(amount, updating = 1, force = 0)
if(dna.species)
amount = amount * dna.species.stun_mod
- ..()
+ return ..()
/mob/living/carbon/human/SetWeakened(amount, updating = 1, force = 0)
if(dna.species)
amount = amount * dna.species.stun_mod
- ..()
+ return ..()
/mob/living/carbon/human/SetParalysis(amount, updating = 1, force = 0)
if(dna.species)
amount = amount * dna.species.stun_mod
- ..()
+ return ..()
/mob/living/carbon/human/SetSleeping(amount, updating = 1, no_alert = FALSE)
if(dna.species)
amount = amount * dna.species.stun_mod
- ..()
\ No newline at end of file
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 73a76e00420..05dfbd0e302 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -586,7 +586,8 @@ var/global/list/damage_icon_parts = list()
standing.overlays += image("icon" = A.sprite_sheets[dna.species.name], "icon_state" = "[A.icon_state]")
else
standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]")
-
+ standing.alpha = w_uniform.alpha
+ standing.color = w_uniform.color
overlays_standing[UNIFORM_LAYER] = standing
else
// Automatically drop anything in store / id / belt if you're not wearing a uniform. //CHECK IF NECESARRY
@@ -716,12 +717,13 @@ var/global/list/damage_icon_parts = list()
l_ear.screen_loc = ui_l_ear //...draw the item in the inventory screen
client.screen += l_ear //Either way, add the item to the HUD
- var/t_type = l_ear.icon_state
+ var/t_type = l_ear.item_state
+ if(!t_type)
+ t_type = l_ear.icon_state
if(l_ear.icon_override)
t_type = "[t_type]_l"
overlays_standing[EARS_LAYER] = mutable_appearance(l_ear.icon_override, "[t_type]", layer = -EARS_LAYER)
else if(l_ear.sprite_sheets && l_ear.sprite_sheets[dna.species.name])
- t_type = "[t_type]_l"
overlays_standing[EARS_LAYER] = mutable_appearance(l_ear.sprite_sheets[dna.species.name], "[t_type]", layer = -EARS_LAYER)
else
overlays_standing[EARS_LAYER] = mutable_appearance('icons/mob/ears.dmi', "[t_type]", layer = -EARS_LAYER)
@@ -732,12 +734,13 @@ var/global/list/damage_icon_parts = list()
r_ear.screen_loc = ui_r_ear //...draw the item in the inventory screen
client.screen += r_ear //Either way, add the item to the HUD
- var/t_type = r_ear.icon_state
+ var/t_type = r_ear.item_state
+ if(!t_type)
+ t_type = r_ear.icon_state
if(r_ear.icon_override)
t_type = "[t_type]_r"
overlays_standing[EARS_LAYER] = mutable_appearance(r_ear.icon_override, "[t_type]", layer = -EARS_LAYER)
else if(r_ear.sprite_sheets && r_ear.sprite_sheets[dna.species.name])
- t_type = "[t_type]_r"
overlays_standing[EARS_LAYER] = mutable_appearance(r_ear.sprite_sheets[dna.species.name], "[t_type]", layer = -EARS_LAYER)
else
overlays_standing[EARS_LAYER] = mutable_appearance('icons/mob/ears.dmi', "[t_type]", layer = -EARS_LAYER)
@@ -769,6 +772,8 @@ var/global/list/damage_icon_parts = list()
var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "shoeblood")
bloodsies.color = shoes.blood_color
standing.overlays += bloodsies
+ standing.alpha = shoes.alpha
+ standing.color = shoes.color
overlays_standing[SHOES_LAYER] = standing
else
if(feet_blood_DNA)
@@ -819,6 +824,8 @@ var/global/list/damage_icon_parts = list()
var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "helmetblood")
bloodsies.color = head.blood_color
standing.overlays += bloodsies
+ standing.alpha = head.alpha
+ standing.color = head.color
overlays_standing[HEAD_LAYER] = standing
apply_overlay(HEAD_LAYER)
@@ -886,6 +893,8 @@ var/global/list/damage_icon_parts = list()
bloodsies.color = wear_suit.blood_color
standing.overlays += bloodsies
+ standing.alpha = wear_suit.alpha
+ standing.color = wear_suit.color
overlays_standing[SUIT_LAYER] = standing
apply_overlay(SUIT_LAYER)
@@ -931,27 +940,31 @@ var/global/list/damage_icon_parts = list()
if(inv)
inv.update_icon()
if(wear_mask && (istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/accessory)))
- var/obj/item/organ/external/head/head_organ = get_organ("head")
- var/datum/sprite_accessory/alt_heads/alternate_head
- if(head_organ.alt_head && head_organ.alt_head != "None")
- alternate_head = GLOB.alt_heads_list[head_organ.alt_head]
+ if(!(slot_wear_mask in check_obscured_slots()))
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ var/datum/sprite_accessory/alt_heads/alternate_head
+ if(head_organ.alt_head && head_organ.alt_head != "None")
+ alternate_head = GLOB.alt_heads_list[head_organ.alt_head]
- var/mutable_appearance/standing
- var/icon/mask_icon = new(wear_mask.icon)
- if(wear_mask.icon_override)
- mask_icon = new(wear_mask.icon_override)
- standing = mutable_appearance(wear_mask.icon_override, "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
- else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[dna.species.name])
- mask_icon = new(wear_mask.sprite_sheets[dna.species.name])
- standing = mutable_appearance(wear_mask.sprite_sheets[dna.species.name], "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
- else
- standing = mutable_appearance('icons/mob/mask.dmi', "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
+ var/mutable_appearance/standing
+ var/icon/mask_icon = new(wear_mask.icon)
+ if(wear_mask.icon_override)
+ mask_icon = new(wear_mask.icon_override)
+ standing = mutable_appearance(wear_mask.icon_override, "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
+ else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[dna.species.name])
+ mask_icon = new(wear_mask.sprite_sheets[dna.species.name])
+ standing = mutable_appearance(wear_mask.sprite_sheets[dna.species.name], "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
+ else
+ standing = mutable_appearance('icons/mob/mask.dmi', "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER)
- if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA)
- var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "maskblood")
- bloodsies.color = wear_mask.blood_color
- standing.overlays += bloodsies
- overlays_standing[FACEMASK_LAYER] = standing
+ if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA)
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "maskblood")
+ bloodsies.color = wear_mask.blood_color
+ standing.overlays += bloodsies
+
+ standing.alpha = wear_mask.alpha
+ standing.color = wear_mask.color
+ overlays_standing[FACEMASK_LAYER] = standing
apply_overlay(FACEMASK_LAYER)
@@ -973,6 +986,8 @@ var/global/list/damage_icon_parts = list()
standing = mutable_appearance('icons/mob/back.dmi', "[back.icon_state]", layer = -BACK_LAYER)
//create the image
+ standing.alpha = back.alpha
+ standing.color = back.color
overlays_standing[BACK_LAYER] = standing
apply_overlay(BACK_LAYER)
@@ -1006,9 +1021,14 @@ var/global/list/damage_icon_parts = list()
if(!t_state)
t_state = r_hand.icon_state
- var/mutable_appearance/I = mutable_appearance(r_hand.righthand_file, "[t_state]", layer = -R_HAND_LAYER)
- I = center_image(I, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension)
- overlays_standing[R_HAND_LAYER] = I
+ var/mutable_appearance/standing
+ if(r_hand.sprite_sheets_inhand && r_hand.sprite_sheets_inhand[dna.species.name])
+ t_state = "[t_state]_r"
+ standing = mutable_appearance(r_hand.sprite_sheets_inhand[dna.species.name], "[t_state]", layer = -R_HAND_LAYER)
+ else
+ standing = mutable_appearance(r_hand.righthand_file, "[t_state]", layer = -R_HAND_LAYER)
+ standing = center_image(standing, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension)
+ overlays_standing[R_HAND_LAYER] = standing
apply_overlay(R_HAND_LAYER)
@@ -1020,9 +1040,14 @@ var/global/list/damage_icon_parts = list()
if(!t_state)
t_state = l_hand.icon_state
- var/mutable_appearance/I = mutable_appearance(l_hand.lefthand_file, "[t_state]", layer = -L_HAND_LAYER)
- I = center_image(I, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension)
- overlays_standing[L_HAND_LAYER] = I
+ var/mutable_appearance/standing
+ if(l_hand.sprite_sheets_inhand && l_hand.sprite_sheets_inhand[dna.species.name])
+ t_state = "[t_state]_l"
+ standing = mutable_appearance(l_hand.sprite_sheets_inhand[dna.species.name], "[t_state]", layer = -L_HAND_LAYER)
+ else
+ standing = mutable_appearance(l_hand.lefthand_file, "[t_state]", layer = -L_HAND_LAYER)
+ standing = center_image(standing, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension)
+ overlays_standing[L_HAND_LAYER] = standing
apply_overlay(L_HAND_LAYER)
//human HUD updates for items in our inventory
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 7344c6469c4..c3c47235b91 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -31,6 +31,7 @@
ai.camera_visibility(src)
if(ai.client && !ai.multicam_on)
ai.client.eye = src
+ update_parallax_contents()
//Holopad
if(ai.master_multicam)
ai.master_multicam.refresh_view()
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 06043025f7c..51d5820d2bf 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -107,6 +107,8 @@
aiRestorePowerRoutine = 0
update_blind_effects()
update_sight()
+ to_chat(src, "Here are your current laws:")
+ show_laws()
return
switch(PRP)
@@ -126,8 +128,6 @@
theAPC.attack_ai(src)
apc_override = 0
aiRestorePowerRoutine = 3
- to_chat(src, "Here are your current laws:")
- src.show_laws() //WHY THE FUCK IS THIS HERE
sleep(50)
theAPC = null
diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm
index d584d5a50f5..0750e4ea3ed 100644
--- a/code/modules/mob/living/silicon/robot/component.dm
+++ b/code/modules/mob/living/silicon/robot/component.dm
@@ -235,6 +235,12 @@
to_chat(user, "Body Temperature: ???")
return
+ user.visible_message("[user] has analyzed [M]'s components.","You have analyzed [M]'s components.")
+ robot_healthscan(user, M)
+ add_fingerprint(user)
+
+
+proc/robot_healthscan(mob/user, mob/living/M)
var/scan_type
if(istype(M, /mob/living/silicon/robot))
scan_type = "robot"
@@ -244,7 +250,7 @@
to_chat(user, "You can't analyze non-robotic things!")
return
- user.visible_message("[user] has analyzed [M]'s components.","You have analyzed [M]'s components.")
+
switch(scan_type)
if("robot")
var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss()
@@ -308,5 +314,3 @@
to_chat(user, "Internal Fluid Level:[H.blood_volume]/[H.max_blood]")
if(H.bleed_rate)
to_chat(user, "Warning:External component leak detected!")
-
- src.add_fingerprint(user)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index b9ed81f7180..900705733ba 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -885,6 +885,8 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/attack_ghost(mob/user)
if(wiresexposed)
wires.Interact(user)
+ else
+ ..() //this calls the /mob/living/attack_ghost proc for the ghost health/cyborg analyzer
/mob/living/silicon/robot/proc/allowed(obj/item/I)
var/obj/dummy = new /obj(null) // Create a dummy object to check access on as to avoid having to snowflake check_access on every mob
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 90ed82ff395..d8f09f4cb78 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -165,7 +165,7 @@
/obj/item/clothing/suit/armor/vest,
/obj/item/clothing/suit/armor/vest/blueshield,
/obj/item/clothing/suit/space/deathsquad,
- /obj/item/clothing/suit/space/hardsuit/engineering,
+ /obj/item/clothing/suit/space/hardsuit/engine,
/obj/item/radio,
/obj/item/radio/off,
/obj/item/clothing/suit/cardborg,
@@ -356,7 +356,7 @@
desc = "That's not red paint. That's real corgi blood."
valid = 1
- if(/obj/item/clothing/head/helmet/space/hardsuit/engineering)
+ if(/obj/item/clothing/suit/space/hardsuit/engine)
name = "Space Explorer [real_name]"
desc = "That's one small step for a corgi. One giant yap for corgikind."
valid = 1
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index cbc125beeab..2c9cbc355f7 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -34,13 +34,29 @@
holder_type = /obj/item/holder/mouse
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
+ var/chew_probability = 1
/mob/living/simple_animal/mouse/Initialize(mapload)
. = ..()
AddComponent(/datum/component/squeak, list('sound/creatures/mousesqueak.ogg' = 1), 100)
+/mob/living/simple_animal/mouse/handle_automated_action()
+ if(prob(chew_probability))
+ var/turf/simulated/floor/F = get_turf(src)
+ if(istype(F) && !F.intact)
+ var/obj/structure/cable/C = locate() in F
+ if(C && prob(15))
+ if(C.avail())
+ visible_message("[src] chews through [C]. It's toast!")
+ playsound(src, 'sound/effects/sparks2.ogg', 100, 1)
+ C.deconstruct()
+ toast() // mmmm toasty.
+ else
+ C.deconstruct()
+ visible_message("[src] chews through [C].")
+
/mob/living/simple_animal/mouse/handle_automated_speech()
- ..()
+ ..()
if(prob(speak_chance))
for(var/mob/M in view())
M << squeak_sound
@@ -98,7 +114,12 @@
to_chat(M, "[bicon(src)] Squeek!")
..()
-/mob/living/simple_animal/mouse/death(gibbed)
+/mob/living/simple_animal/mouse/proc/toast()
+ add_atom_colour("#3A3A3A", FIXED_COLOUR_PRIORITY)
+ desc = "It's toast."
+ death()
+
+/mob/living/simple_animal/mouse/death(gibbed)
// Only execute the below if we successfully died
playsound(src, squeak_sound, 40, 1)
. = ..(gibbed)
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index c82a0ee7806..1ef6f06259f 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -1,100 +1,106 @@
-#define EGG_INCUBATION_TIME 120
-
/mob/living/simple_animal/hostile/headcrab
- name = "headslug"
- desc = "Absolutely not de-beaked or harmless. Keep away from corpses."
+ name = "headcrab"
+ desc = "A small parasitic creature that would like to connect with your brain stem."
+ icon = 'icons/mob/headcrab.dmi'
icon_state = "headcrab"
icon_living = "headcrab"
icon_dead = "headcrab_dead"
- icon = 'icons/mob/mob.dmi'
- health = 50
- maxHealth = 50
+ health = 40
+ maxHealth = 40
melee_damage_lower = 5
- melee_damage_upper = 5
- attacktext = "chomps"
- attack_sound = 'sound/weapons/bite.ogg'
- faction = list("creature")
- robust_searching = 1
- stat_attack = 2
- obj_damage = 0
- environment_smash = 0
- speak_emote = list("squeaks")
- ventcrawler = 2
- var/datum/mind/origin
- var/egg_lain = 0
+ melee_damage_upper = 10
+ ranged = 1
+ ranged_message = "leaps"
+ ranged_cooldown_time = 40
+ var/jumpdistance = 4
+ var/jumpspeed = 1
+ attacktext = "bites"
+ attack_sound = 'sound/creatures/headcrab_attack.ogg'
+ speak_emote = list("hisses")
+ var/is_zombie = 0
+ stat_attack = 1 //so they continue to attack when they are on the ground.
+ var/host_species = ""
+ var/list/human_overlays = list()
-/mob/living/simple_animal/hostile/headcrab/examine(mob/user)
+/mob/living/simple_animal/hostile/headcrab/Life(seconds, times_fired)
+ if(!is_zombie && isturf(src.loc) && stat != DEAD)
+ for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile
+ if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD))
+ Zombify(H)
+ break
..()
- if(stat == DEAD)
- to_chat(desc = "It appears to be dead.")
-/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
- var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim)
- egg.insert(victim)
- if(origin)
- egg.origin = origin
- else if(mind) // Let's make this a feature
- egg.origin = mind
- for(var/obj/item/organ/internal/I in src)
- I.loc = egg
- visible_message("[src] plants something in [victim]'s flesh!", \
- "We inject our egg into [victim]'s body!")
- egg_lain = 1
+/mob/living/simple_animal/hostile/headcrab/OpenFire(atom/A)
+ if(check_friendly_fire)
+ for(var/turf/T in getline(src,A)) // Not 100% reliable but this is faster than simulating actual trajectory
+ for(var/mob/living/L in T)
+ if(L == src || L == A)
+ continue
+ if(faction_check(L) && !attack_same)
+ return
+ visible_message("[src] [ranged_message] at [A]!")
+ throw_at(A, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE)
+ ranged_cooldown = world.time + ranged_cooldown_time
-/mob/living/simple_animal/hostile/headcrab/AttackingTarget()
- if(egg_lain)
- target.attack_animal(src)
- return
- if(iscarbon(target) && !issmall(target))
- // Changeling egg can survive in aliens!
- var/mob/living/carbon/C = target
- if(C.stat == DEAD)
- if(C.status_flags & XENO_HOST)
- to_chat(src, "A foreign presence repels us from this body. Perhaps we should try to infest another?")
- return
- Infect(target)
- to_chat(src, "With our egg laid, our death approaches rapidly...")
- spawn(100)
- death()
- return
- target.attack_animal(src)
+/mob/living/simple_animal/hostile/headcrab/proc/Zombify(mob/living/carbon/human/H)
+ if(!H.check_death_method())
+ H.death()
+ var/obj/item/organ/external/head/head_organ = H.get_organ("head")
+ is_zombie = TRUE
+ if(H.wear_suit)
+ var/obj/item/clothing/suit/armor/A = H.wear_suit
+ if(A.armor && A.armor["melee"])
+ maxHealth += A.armor["melee"] //That zombie's got armor, I want armor!
+ maxHealth += 50
+ health = maxHealth
+ name = "zombie"
+ desc = "A corpse animated by the alien being on its head."
+ melee_damage_lower = 10
+ melee_damage_upper = 15
+ ranged = 0
+ icon = H.icon
+ speak = list('sound/creatures/zombie_idle1.ogg','sound/creatures/zombie_idle2.ogg','sound/creatures/zombie_idle3.ogg')
+ speak_chance = 50
+ speak_emote = list("groans")
+ attacktext = "bites"
+ attack_sound = 'sound/creatures/zombie_attack.ogg'
+ icon_state = "zombie2_s"
+ if(head_organ)
+ head_organ.h_style = null
+ H.update_hair()
+ host_species = H.dna.species.name
+ human_overlays = H.overlays
+ update_icons()
+ H.forceMove(src)
+ visible_message("The corpse of [H.name] suddenly rises!")
-/obj/item/organ/internal/body_egg/changeling_egg
- name = "changeling egg"
- desc = "Twitching and disgusting."
- origin_tech = "biotech=7" // You need to be really lucky to obtain it.
- var/datum/mind/origin
- var/time
-
-/obj/item/organ/internal/body_egg/changeling_egg/egg_process()
- // Changeling eggs grow in dead people
- time++
- if(time >= EGG_INCUBATION_TIME)
- Pop()
- remove(owner)
+/mob/living/simple_animal/hostile/headcrab/death()
+ ..()
+ if(is_zombie)
qdel(src)
-/obj/item/organ/internal/body_egg/changeling_egg/proc/Pop()
- var/mob/living/carbon/human/monkey/M = new(owner)
- owner.stomach_contents += M
- for(var/obj/item/organ/internal/I in src)
- I.insert(M, 1)
+/mob/living/simple_animal/hostile/headcrab/handle_automated_speech() // This way they have different screams when attacking, sometimes. Might be seen as sphagetthi code though.
+ if(speak_chance)
+ if(rand(0,200) < speak_chance)
+ if(speak && speak.len)
+ playsound(get_turf(src), pick(speak), 200, 1)
- if(origin && origin.current && (origin.current.stat == DEAD))
- origin.transfer_to(M)
- if(!origin.changeling)
- M.make_changeling()
- if(origin.changeling.can_absorb_dna(M, owner))
- origin.changeling.absorb_dna(owner, M)
+/mob/living/simple_animal/hostile/headcrab/Destroy()
+ if(contents)
+ for(var/mob/M in contents)
+ M.loc = get_turf(src)
+ return ..()
- var/datum/action/changeling/humanform/HF = new
- HF.Grant(M)
- for(var/power in origin.changeling.purchasedpowers)
- var/datum/action/changeling/S = power
- if(istype(S) && S.needs_button)
- S.Grant(M)
- M.key = origin.key
- owner.gib()
-#undef EGG_INCUBATION_TIME
+/mob/living/simple_animal/hostile/headcrab/update_icons()
+ ..()
+ if(is_zombie)
+ overlays.Cut()
+ overlays = human_overlays
+ var/image/I = image('icons/mob/headcrab.dmi', icon_state = "headcrabpod")
+ if(host_species == "Vox")
+ I = image('icons/mob/headcrab.dmi', icon_state = "headcrabpod_vox")
+ else if(host_species == "Gray")
+ I = image('icons/mob/headcrab.dmi', icon_state = "headcrabpod_gray")
+ overlays += I
diff --git a/code/modules/mob/living/simple_animal/hostile/headslug.dm b/code/modules/mob/living/simple_animal/hostile/headslug.dm
new file mode 100644
index 00000000000..e2fc98c483f
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/headslug.dm
@@ -0,0 +1,100 @@
+#define EGG_INCUBATION_TIME 120
+
+/mob/living/simple_animal/hostile/headslug
+ name = "headslug"
+ desc = "Absolutely not de-beaked or harmless. Keep away from corpses."
+ icon_state = "headslug"
+ icon_living = "headslug"
+ icon_dead = "headslug_dead"
+ icon = 'icons/mob/mob.dmi'
+ health = 50
+ maxHealth = 50
+ melee_damage_lower = 5
+ melee_damage_upper = 5
+ attacktext = "chomps"
+ attack_sound = 'sound/weapons/bite.ogg'
+ faction = list("creature")
+ robust_searching = 1
+ stat_attack = 2
+ obj_damage = 0
+ environment_smash = 0
+ speak_emote = list("squeaks")
+ ventcrawler = 2
+ var/datum/mind/origin
+ var/egg_lain = 0
+
+/mob/living/simple_animal/hostile/headslug/examine(mob/user)
+ ..()
+ if(stat == DEAD)
+ to_chat(desc = "It appears to be dead.")
+
+/mob/living/simple_animal/hostile/headslug/proc/Infect(mob/living/carbon/victim)
+ var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim)
+ egg.insert(victim)
+ if(origin)
+ egg.origin = origin
+ else if(mind) // Let's make this a feature
+ egg.origin = mind
+ for(var/obj/item/organ/internal/I in src)
+ I.loc = egg
+ visible_message("[src] plants something in [victim]'s flesh!", \
+ "We inject our egg into [victim]'s body!")
+ egg_lain = 1
+
+/mob/living/simple_animal/hostile/headslug/AttackingTarget()
+ if(egg_lain)
+ target.attack_animal(src)
+ return
+ if(iscarbon(target) && !issmall(target))
+ // Changeling egg can survive in aliens!
+ var/mob/living/carbon/C = target
+ if(C.stat == DEAD)
+ if(C.status_flags & XENO_HOST)
+ to_chat(src, "A foreign presence repels us from this body. Perhaps we should try to infest another?")
+ return
+ Infect(target)
+ to_chat(src, "With our egg laid, our death approaches rapidly...")
+ spawn(100)
+ death()
+ return
+ target.attack_animal(src)
+
+/obj/item/organ/internal/body_egg/changeling_egg
+ name = "changeling egg"
+ desc = "Twitching and disgusting."
+ origin_tech = "biotech=7" // You need to be really lucky to obtain it.
+ var/datum/mind/origin
+ var/time
+
+/obj/item/organ/internal/body_egg/changeling_egg/egg_process()
+ // Changeling eggs grow in dead people
+ time++
+ if(time >= EGG_INCUBATION_TIME)
+ Pop()
+ remove(owner)
+ qdel(src)
+
+/obj/item/organ/internal/body_egg/changeling_egg/proc/Pop()
+ var/mob/living/carbon/human/monkey/M = new(owner)
+ owner.stomach_contents += M
+
+ for(var/obj/item/organ/internal/I in src)
+ I.insert(M, 1)
+
+ if(origin && origin.current && (origin.current.stat == DEAD))
+ origin.transfer_to(M)
+ if(!origin.changeling)
+ M.make_changeling()
+ if(origin.changeling.can_absorb_dna(M, owner))
+ origin.changeling.absorb_dna(owner, M)
+
+ var/datum/action/changeling/humanform/HF = new
+ HF.Grant(M)
+ for(var/power in origin.changeling.purchasedpowers)
+ var/datum/action/changeling/S = power
+ if(istype(S) && S.needs_button)
+ S.Grant(M)
+ M.key = origin.key
+ owner.gib()
+
+#undef EGG_INCUBATION_TIME
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
index 7fd32bd71ec..d45e6f6ead8 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
@@ -37,6 +37,7 @@ Difficulty: Medium
ranged = 1
ranged_cooldown_time = 16
pixel_x = -16
+ crusher_loot = list(/obj/item/melee/energy/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator, /obj/item/crusher_trophy/miner_eye)
loot = list(/obj/item/melee/energy/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator)
wander = FALSE
del_on_death = TRUE
@@ -48,7 +49,7 @@ Difficulty: Medium
var/guidance = FALSE
deathmessage = "falls to the ground, decaying into glowing particles."
death_sound = "bodyfall"
-
+
/obj/item/gps/internal/miner
icon_state = null
gpstag = "Resonant Signal"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index a53b8092e54..ac5e40025c6 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -42,6 +42,7 @@ Difficulty: Hard
ranged = 1
pixel_x = -32
del_on_death = 1
+ crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher)
loot = list(/obj/structure/closet/crate/necropolis/bubblegum)
var/charging = 0
medal_type = BOSS_MEDAL_BUBBLEGUM
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 5d66061335c..3ebea47e353 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -45,7 +45,8 @@ Difficulty: Very Hard
del_on_death = 1
medal_type = BOSS_MEDAL_COLOSSUS
score_type = COLOSSUS_SCORE
- loot = list(/obj/machinery/anomalous_crystal/random, /obj/item/organ/internal/vocal_cords/colossus)
+ crusher_loot = list(/obj/structure/closet/crate/necropolis/colossus/crusher)
+ loot = list(/obj/structure/closet/crate/necropolis/colossus)
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
deathmessage = "disintegrates, leaving a glowing core in its wake."
death_sound = 'sound/misc/demon_dies.ogg'
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 68db8cb1274..0789d00832d 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -43,6 +43,7 @@ Difficulty: Medium
move_to_delay = 10
ranged = 1
pixel_x = -16
+ crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon/crusher)
loot = list(/obj/structure/closet/crate/necropolis/dragon)
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
var/swooping = 0
@@ -271,6 +272,7 @@ Difficulty: Medium
melee_damage_lower = 30
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
loot = list()
+ crusher_loot = list()
/mob/living/simple_animal/hostile/megafauna/dragon/lesser/grant_achievement(medaltype,scoretype)
return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 7f974149556..bb4e9297605 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -53,6 +53,7 @@ Difficulty: Hard
ranged_cooldown_time = 40
aggro_vision_range = 23
loot = list(/obj/item/hierophant_staff)
+ crusher_loot = list(/obj/item/hierophant_staff, /obj/item/crusher_trophy/vortex_talisman)
wander = FALSE
var/burst_range = 3 //range on burst aoe
var/beam_range = 5 //range on cross blast beams
@@ -556,6 +557,37 @@ Difficulty: Hard
playsound(M,'sound/weapons/sear.ogg', 50, 1, -4)
M.take_damage(damage, BURN, 0, 0)
+/obj/effect/temp_visual/hierophant/wall //smoothing and pooling were not friends, but pooling is dead.
+ name = "vortex wall"
+ icon = 'icons/turf/walls/hierophant_wall_temp.dmi'
+ icon_state = "wall"
+ light_range = MINIMUM_USEFUL_LIGHT_RANGE
+ duration = 100
+ smooth = SMOOTH_TRUE
+
+/obj/effect/temp_visual/hierophant/wall/New(loc, new_caster)
+ ..()
+ queue_smooth_neighbors(src)
+ queue_smooth(src)
+
+/obj/effect/temp_visual/hierophant/wall/Destroy()
+ queue_smooth_neighbors(src)
+ return ..()
+
+/obj/effect/temp_visual/hierophant/wall/CanPass(atom/movable/mover, turf/target)
+ if(QDELETED(caster))
+ return FALSE
+ if(mover == caster.pulledby)
+ return TRUE
+ if(istype(mover, /obj/item/projectile))
+ var/obj/item/projectile/P = mover
+ if(P.firer == caster)
+ return TRUE
+ if(mover == caster)
+ return TRUE
+ return FALSE
+
+
/obj/effect/hierophant
name = "hierophant rune"
desc = "A powerful magic mark allowing whomever attunes themself to it to return to it at will."
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index a32aceb33e3..f57559d549a 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -31,6 +31,7 @@
/obj/structure/barricade,
/obj/machinery/field,
/obj/machinery/power/emitter)
+ var/list/crusher_loot
var/medal_type
var/score_type = BOSS_SCORE
var/elimination = 0
@@ -43,6 +44,10 @@
layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise
mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway
+/mob/living/simple_animal/hostile/megafauna/New()
+ ..()
+ apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
+
/mob/living/simple_animal/hostile/megafauna/Destroy()
QDEL_NULL(internal_gps)
. = ..()
@@ -53,11 +58,17 @@
/mob/living/simple_animal/hostile/megafauna/death(gibbed)
// this happens before the parent call because `del_on_death` may be set
if(can_die() && !admin_spawned)
- feedback_set_details("megafauna_kills","[initial(name)]")
+ var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
+ if(C && crusher_loot && C.total_damage >= maxHealth * 0.6)
+ spawn_crusher_loot()
if(!elimination) //used so the achievment only occurs for the last legion to die.
grant_achievement(medal_type,score_type)
+ feedback_set_details("megafauna_kills","[initial(name)]")
return ..()
+/mob/living/simple_animal/hostile/megafauna/proc/spawn_crusher_loot()
+ loot = crusher_loot
+
/mob/living/simple_animal/hostile/megafauna/AttackingTarget()
..()
if(isliving(target))
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm
index 28aacd37a73..ad8dcf44699 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm
@@ -77,6 +77,7 @@
stat_attack = 1
flying = TRUE
robust_searching = 1
+ crusher_loot = /obj/item/crusher_trophy/watcher_wing
loot = list()
butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
@@ -102,6 +103,8 @@
light_power = 2.5
light_color = LIGHT_COLOR_ORANGE
projectiletype = /obj/item/projectile/temp/basilisk/magmawing
+ crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing
+ crusher_drop_mod = 60
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing
name = "icewing watcher"
@@ -114,6 +117,8 @@
health = 170
projectiletype = /obj/item/projectile/temp/basilisk/icewing
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) //No sinew; the wings are too fragile to be usable
+ crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing
+ crusher_drop_mod = 30
/obj/item/projectile/temp/basilisk/magmawing
name = "scorching blast"
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
index a1c488b4068..dae7a688cb3 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
@@ -83,6 +83,7 @@
icon_dead = "goliath_dead"
throw_message = "does nothing to the tough hide of the"
pre_attack_icon = "goliath2"
+ crusher_loot = /obj/item/crusher_trophy/goliath_tentacle
butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
loot = list()
stat_attack = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
index 60c1f5e08e7..43d239c59ce 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
@@ -45,6 +45,9 @@
/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget()
OpenFire()
+/mob/living/simple_animal/hostile/asteroid/hivelord/spawn_crusher_loot()
+ loot += crusher_loot //we don't butcher
+
/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed)
// Only execute the below if we successfully died
. = ..(gibbed)
@@ -52,80 +55,6 @@
return FALSE
mouse_opacity = MOUSE_OPACITY_ICON
-/obj/item/organ/internal/hivelord_core
- name = "hivelord remains"
- desc = "All that remains of a hivelord, it seems to be what allows it to break pieces of itself off without being hurt... its healing properties will soon become inert if not used quickly."
- icon_state = "roro core 2"
- flags = NOBLUDGEON
- slot = "hivecore"
- force = 0
- actions_types = list(/datum/action/item_action/organ_action/use)
- var/inert = 0
- var/preserved = 0
-
-/obj/item/organ/internal/hivelord_core/New()
- ..()
- addtimer(CALLBACK(src, .proc/inert_check), 2400)
-
-/obj/item/organ/internal/hivelord_core/proc/inert_check()
- if(owner)
- preserved(implanted = 1)
- else if(preserved)
- preserved()
- else
- go_inert()
-
-/obj/item/organ/internal/hivelord_core/proc/preserved(implanted = 0)
- inert = FALSE
- preserved = TRUE
- update_icon()
-
- if(implanted)
- feedback_add_details("hivelord_core", "[type]|implanted")
- else
- feedback_add_details("hivelord_core", "[type]|stabilizer")
-
-
-/obj/item/organ/internal/hivelord_core/proc/go_inert()
- inert = TRUE
- desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested."
- feedback_add_details("hivelord_core", "[src.type]|inert")
- update_icon()
-
-/obj/item/organ/internal/hivelord_core/ui_action_click()
- owner.revive()
- qdel(src)
-
-/obj/item/organ/internal/hivelord_core/on_life()
- ..()
- if(owner.health < HEALTH_THRESHOLD_CRIT)
- ui_action_click()
-
-/obj/item/organ/internal/hivelord_core/afterattack(atom/target, mob/user, proximity_flag)
- if(proximity_flag && ishuman(target))
- var/mob/living/carbon/human/H = target
- if(inert)
- to_chat(user, "[src] has become inert, its healing properties are no more.")
- return
- else
- if(H.stat == DEAD)
- to_chat(user, "[src] are useless on the dead.")
- return
- if(H != user)
- H.visible_message("[user] forces [H] to apply [src]... They quickly regenerate all injuries!")
- feedback_add_details("hivelord_core","[src.type]|used|other")
- else
- to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.")
- feedback_add_details("hivelord_core","[src.type]|used|self")
- playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
- H.revive()
- user.drop_item()
- qdel(src)
- ..()
-
-/obj/item/organ/internal/hivelord_core/prepare_eat()
- return null
-
/mob/living/simple_animal/hostile/asteroid/hivelordbrood
name = "hivelord brood"
desc = "A fragment of the original Hivelord, rallying behind its original. One isn't much of a threat, but..."
@@ -231,6 +160,7 @@
speak_emote = list("echoes")
attack_sound = 'sound/weapons/pierce.ogg'
throw_message = "bounces harmlessly off of"
+ crusher_loot = /obj/item/crusher_trophy/legion_skull
loot = list(/obj/item/organ/internal/hivelord_core/legion)
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion
del_on_death = 1
@@ -322,34 +252,6 @@
H.forceMove(L)
qdel(src)
-/obj/item/organ/internal/hivelord_core/legion
- name = "legion's soul"
- desc = "A strange rock that still crackles with power... its \
- healing properties will soon become inert if not used quickly."
- icon_state = "legion_soul"
-
-/obj/item/organ/internal/hivelord_core/legion/New()
- ..()
- update_icon()
-
-/obj/item/organ/internal/hivelord_core/legion/update_icon()
- icon_state = inert ? "legion_soul_inert" : "legion_soul"
- overlays.Cut()
- if(!inert && !preserved)
- overlays += image(icon, "legion_soul_crackle")
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
-
-/obj/item/organ/internal/hivelord_core/legion/go_inert()
- . = ..()
- desc = "[src] has become inert, it crackles no more and is useless for \
- healing injuries."
-
-/obj/item/organ/internal/hivelord_core/legion/preserved(implanted = 0)
- ..()
- desc = "[src] has been stabilized. It no longer crackles with power, but it's healing properties are preserved indefinitely."
-
/obj/item/legion_skull
name = "legion's head"
desc = "The once living, now empty eyes of the former human's skull cut deep into your soul."
@@ -403,7 +305,7 @@
if(prob(95))
head = /obj/item/clothing/head/helmet/gladiator
else
- head = /obj/item/clothing/head/skullhelmet
+ head = /obj/item/clothing/head/helmet/skull
suit = /obj/item/clothing/suit/armor/bone
if(prob(5))
back = pickweight(list(/obj/item/twohanded/spear/bonespear = 3, /obj/item/twohanded/fireaxe/boneaxe = 2))
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/mining.dm b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm
index e23624a5a9d..434869c1d6d 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/mining.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm
@@ -1,4 +1,4 @@
-/mob/living/simple_animal/hostile/asteroid/
+/mob/living/simple_animal/hostile/asteroid
vision_range = 2
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
@@ -13,12 +13,18 @@
response_harm = "strikes"
status_flags = 0
a_intent = INTENT_HARM
+ var/crusher_loot
var/throw_message = "bounces off of"
var/icon_aggro = null // for swapping to when we get aggressive
var/fromtendril = FALSE
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
mob_size = MOB_SIZE_LARGE
+ var/crusher_drop_mod = 25
+
+/mob/living/simple_animal/hostile/asteroid/New()
+ ..()
+ apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
/mob/living/simple_animal/hostile/asteroid/Aggro()
..()
@@ -46,3 +52,12 @@
visible_message("The [T.name] [src.throw_message] [src.name]!")
return
..()
+
+/mob/living/simple_animal/hostile/asteroid/death(gibbed)
+ var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
+ if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item
+ spawn_crusher_loot()
+ ..(gibbed)
+
+/mob/living/simple_animal/hostile/asteroid/proc/spawn_crusher_loot()
+ butcher_results[crusher_loot] = 1
\ No newline at end of file
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index 1dded6c4e8c..0794b7d9c70 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -397,6 +397,9 @@
// STUN
/mob/living/Stun(amount, updating = 1, force = 0)
+ if(status_flags & CANSTUN || force)
+ if(absorb_stun(amount, force))
+ return FALSE
return SetStunned(max(stunned, amount), updating, force)
/mob/living/SetStunned(amount, updating = 1, force = 0) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned"
@@ -434,6 +437,9 @@
// WEAKEN
/mob/living/Weaken(amount, updating = 1, force = 0)
+ if(status_flags & CANWEAKEN || force)
+ if(absorb_stun(amount, force))
+ return FALSE
return SetWeakened(max(weakened, amount), updating, force)
/mob/living/SetWeakened(amount, updating = 1, force = 0)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 02cb948c5c9..3c2f9fc732b 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -193,14 +193,7 @@
var/obj/item/W = get_active_hand()
if(istype(W))
- if(istype(W, /obj/item/clothing))
- var/obj/item/clothing/C = W
- if(C.hardsuit_restrict_helmet)
- to_chat(src, "You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)")// Stop eva helms equipping.
- else
- equip_to_slot_if_possible(C, slot)
- else
- equip_to_slot_if_possible(W, slot)
+ equip_to_slot_if_possible(W, slot)
else if(!restrained())
W = get_item_by_slot(slot)
if(W)
@@ -693,7 +686,7 @@ var/list/slot_equipment_priority = list( \
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
msg = sanitize_simple(html_encode(msg), list("\n" = " "))
-
+
var/combined = length(memory + msg)
if(mind && (combined < MAX_PAPER_MESSAGE_LEN))
mind.store_memory(msg)
diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm
index e4e5dd1a33b..e7f06137781 100644
--- a/code/modules/nano/interaction/base.dm
+++ b/code/modules/nano/interaction/base.dm
@@ -24,6 +24,8 @@
return STATUS_UPDATE // Ghosts can view updates
/mob/living/silicon/ai/shared_nano_interaction()
+ if(apc_override)
+ return STATUS_INTERACTIVE
if(lacks_power())
return STATUS_CLOSE
if(check_unable(1, 0))
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index b4c0a5305b7..7f1059f062e 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -11,4 +11,4 @@
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
- transfer_prints = FALSE
\ No newline at end of file
+ transfer_prints = FALSE
diff --git a/code/modules/ninja/suit/head.dm b/code/modules/ninja/suit/head.dm
index 6ed302feaad..a7a21f072f3 100644
--- a/code/modules/ninja/suit/head.dm
+++ b/code/modules/ninja/suit/head.dm
@@ -7,4 +7,4 @@
item_state = "s-ninja_hood"
armor = list(melee = 60, bullet = 60, laser = 45, energy = 15, bomb = 30, bio = 30, rad = 25)
unacidable = 1
- blockTracking = 1
\ No newline at end of file
+ blockTracking = 1
diff --git a/code/modules/ninja/suit/mask.dm b/code/modules/ninja/suit/mask.dm
index 0ebec2e724f..2f76673ab13 100644
--- a/code/modules/ninja/suit/mask.dm
+++ b/code/modules/ninja/suit/mask.dm
@@ -28,4 +28,4 @@ Contents:
/obj/item/clothing/mask/gas/space_ninja/Destroy()
QDEL_NULL(voice_changer)
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm
index 5cb67e73db6..af5f4d3ecc1 100644
--- a/code/modules/ninja/suit/shoes.dm
+++ b/code/modules/ninja/suit/shoes.dm
@@ -9,4 +9,4 @@
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET
- max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
\ No newline at end of file
+ max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 6e550e64893..365cc35cfc6 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -86,4 +86,4 @@ Contents:
suitShoes = null
suitOccupant = null
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index 13d85941a79..176d2abc85c 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -2,6 +2,7 @@ var/list/obj/machinery/photocopier/faxmachine/allfaxes = list()
var/list/admin_departments = list("Central Command")
var/list/hidden_admin_departments = list("Syndicate")
var/list/alldepartments = list()
+var/list/hidden_departments = list()
var/global/list/fax_blacklist = list()
/obj/machinery/photocopier/faxmachine
@@ -9,7 +10,9 @@ var/global/list/fax_blacklist = list()
icon = 'icons/obj/library.dmi'
icon_state = "fax"
insert_anim = "faxsend"
+ pass_flags = PASSTABLE
var/fax_network = "Local Fax Network"
+ var/syndie_restricted = FALSE //is it a syndicate base fax restricted from contacting NT assets?
var/long_range_enabled = 0 // Can we send messages off the station?
req_one_access = list(access_lawyer, access_heads, access_armory)
@@ -35,7 +38,7 @@ var/global/list/fax_blacklist = list()
/obj/machinery/photocopier/faxmachine/proc/update_network()
if(department != "Unknown")
- if(!(("[department]" in alldepartments) || ("[department]" in admin_departments) || ("[department]" in hidden_admin_departments)))
+ if(!(("[department]" in alldepartments) || ("[department]" in hidden_departments) || ("[department]" in admin_departments) || ("[department]" in hidden_admin_departments)))
alldepartments |= department
/obj/machinery/photocopier/faxmachine/longrange
@@ -43,6 +46,17 @@ var/global/list/fax_blacklist = list()
fax_network = "Central Command Quantum Entanglement Network"
long_range_enabled = 1
+/obj/machinery/photocopier/faxmachine/longrange/syndie
+ name = "syndicate long range fax machine"
+ emagged = TRUE
+ syndie_restricted = TRUE
+ req_one_access = list(access_syndicate)
+ //No point setting fax network, being emagged overrides that anyway.
+
+/obj/machinery/photocopier/faxmachine/longrange/syndie/update_network()
+ if(department != "Unknown")
+ hidden_departments |= department
+
/obj/machinery/photocopier/faxmachine/attack_hand(mob/user)
ui_interact(user)
@@ -119,7 +133,7 @@ var/global/list/fax_blacklist = list()
if((destination in admin_departments) || (destination in hidden_admin_departments))
send_admin_fax(usr, destination)
else
- sendfax(destination,usr)
+ sendfax(destination, usr)
if(sendcooldown)
spawn(sendcooldown) // cooldown time
@@ -155,6 +169,14 @@ var/global/list/fax_blacklist = list()
if(emagged)
combineddepartments += hidden_admin_departments.Copy()
+ combineddepartments += hidden_departments.Copy()
+
+ if(syndie_restricted)
+ combineddepartments = hidden_admin_departments.Copy()
+ combineddepartments += hidden_departments.Copy()
+ for(var/obj/machinery/photocopier/faxmachine/F in allfaxes)
+ if(F.emagged)//we can contact emagged faxes on the station
+ combineddepartments |= F.department
destination = input(usr, "To which department?", "Choose a department", "") as null|anything in combineddepartments
if(!destination)
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 7ebc4f4471a..a6a83d07f10 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -158,9 +158,44 @@
to_chat(user, "You need more wires.")
return
- //build the terminal and link it to the network
- make_terminal(user)
- terminal.connect_to_network()
+ if(user.loc == loc)
+ to_chat(user, "You must not be on the same tile as the [src].")
+ return
+
+ //Direction the terminal will face to
+ var/tempDir = get_dir(user, src)
+ switch(tempDir)
+ if(NORTHEAST, SOUTHEAST)
+ tempDir = EAST
+ if(NORTHWEST, SOUTHWEST)
+ tempDir = WEST
+ var/turf/tempLoc = get_step(src, reverse_direction(tempDir))
+ if(istype(tempLoc, /turf/space))
+ to_chat(user, "You can't build a terminal on space.")
+ return
+ else if(istype(tempLoc))
+ if(tempLoc.intact)
+ to_chat(user, "You must remove the floor plating first.")
+ return
+
+ to_chat(user, "You start adding cable to the [src].")
+ playsound(loc, C.usesound, 50, 1)
+
+ if(do_after(user, 50, target = src))
+ if(!terminal && panel_open)
+ T = get_turf(user)
+ var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one
+ if(prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) //animate the electrocution if uncautious and unlucky
+ do_sparks(5, 1, src)
+ return
+
+ C.use(10) // make sure the cable gets used up
+ user.visible_message(\
+ "[user.name] adds the cables and connects the power terminal.",\
+ "You add the cables and connect the power terminal.")
+
+ make_terminal(user, tempDir, tempLoc)
+ terminal.connect_to_network()
return
//disassembling the terminal
@@ -174,18 +209,19 @@
playsound(src.loc, I.usesound, 50, 1)
if(do_after(user, 50 * I.toolspeed, target = src))
- if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal, 1, TRUE)) //animate the electrocution if uncautious and unlucky
- do_sparks(5, 1, src)
- return
+ if(terminal && panel_open)
+ if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal, 1, TRUE)) //animate the electrocution if uncautious and unlucky
+ do_sparks(5, 1, src)
+ return
- //give the wires back and delete the terminal
- new /obj/item/stack/cable_coil(T,10)
- user.visible_message(\
- "[user.name] cuts the cables and dismantles the power terminal.",\
- "You cut the cables and dismantle the power terminal.")
- inputting = 0 //stop inputting, since we have don't have a terminal anymore
- qdel(terminal)
- return
+ //give the wires back and delete the terminal
+ new /obj/item/stack/cable_coil(T,10)
+ user.visible_message(\
+ "[user.name] cuts the cables and dismantles the power terminal.",\
+ "You cut the cables and dismantle the power terminal.")
+ inputting = 0 //stop inputting, since we have don't have a terminal anymore
+ qdel(terminal)
+ return
//crowbarring it !
default_deconstruction_crowbar(I)
@@ -197,6 +233,13 @@
return 1
return 0
+/obj/machinery/power/smes/proc/make_terminal(user, tempDir, tempLoc)
+ // create a terminal object at the same position as original turf loc
+ // wires will attach to this
+ terminal = new /obj/machinery/power/terminal(tempLoc)
+ terminal.dir = tempDir
+ terminal.master = src
+
/obj/machinery/power/smes/Destroy()
if(SSticker && SSticker.current_state == GAME_STATE_PLAYING)
var/area/area = get_area(src)
@@ -299,45 +342,6 @@
update_icon()
return
-//Will return 1 on failure
-/obj/machinery/power/smes/proc/make_terminal(const/mob/user)
- if(user.loc == loc)
- to_chat(user, "You must not be on the same tile as the [src].")
- return 1
-
- //Direction the terminal will face to
- var/tempDir = get_dir(user, src)
- switch(tempDir)
- if(NORTHEAST, SOUTHEAST)
- tempDir = EAST
- if(NORTHWEST, SOUTHWEST)
- tempDir = WEST
- var/turf/tempLoc = get_step(src, reverse_direction(tempDir))
- if(istype(tempLoc, /turf/space))
- to_chat(user, "You can't build a terminal on space.")
- return 1
- else if(istype(tempLoc))
- if(tempLoc.intact)
- to_chat(user, "You must remove the floor plating first.")
- return 1
- to_chat(user, "You start adding cable to the [src].")
- if(do_after(user, 50, target = src))
- var/turf/T = get_turf(user)
- var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one
- if(prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) //animate the electrocution if uncautious and unlucky
- do_sparks(5, 1, src)
- return
-
- user.visible_message(\
- "[user.name] adds the cables and connects the power terminal.",\
- "You add the cables and connect the power terminal.")
-
- terminal = new /obj/machinery/power/terminal(tempLoc)
- terminal.dir = tempDir
- terminal.master = src
- return 0
- return 1
-
/obj/machinery/power/smes/attack_ai(mob/user)
add_hiddenprint(user)
ui_interact(user)
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index d5dfb454e09..0dc634bd958 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -50,6 +50,12 @@
var/obj/item/flashlight/gun_light = null
var/can_flashlight = 0
+ var/can_bayonet = FALSE //if a bayonet can be added or removed if it already has one.
+ var/obj/item/kitchen/knife/bayonet
+ var/mutable_appearance/knife_overlay
+ var/knife_x_offset = 0
+ var/knife_y_offset = 0
+
var/list/upgrades = list()
var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite
@@ -69,12 +75,27 @@
verbs += /obj/item/gun/proc/toggle_gunlight
build_zooming()
+/obj/item/gun/Destroy()
+ QDEL_NULL(bayonet)
+ return ..()
+
+/obj/item/gun/handle_atom_del(atom/A)
+ if(A == bayonet)
+ clear_bayonet()
+ return ..()
+
/obj/item/gun/examine(mob/user)
..()
if(unique_reskin && !current_skin)
to_chat(user, "Alt-click it to reskin it.")
if(unique_rename)
to_chat(user, "Use a pen on it to rename it.")
+ if(bayonet)
+ to_chat(user, "It has \a [bayonet] [can_bayonet ? "" : "permanently "]affixed to it.")
+ if(can_bayonet) //if it has a bayonet and this is false, the bayonet is permanent.
+ to_chat(user, "[bayonet] looks like it can be unscrewed from [src].")
+ else if(can_bayonet)
+ to_chat(user, "It has a bayonet lug on it.")
/obj/item/gun/proc/process_chamber()
return 0
@@ -163,7 +184,7 @@
return 0
return 1
-obj/item/gun/proc/newshot()
+/obj/item/gun/proc/newshot()
return
/obj/item/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override)
@@ -233,11 +254,19 @@ obj/item/gun/proc/newshot()
user.update_inv_r_hand()
feedback_add_details("gun_fired","[type]")
-/obj/item/gun/attack(mob/M as mob, mob/user)
+/obj/item/gun/attack(mob/M, mob/user)
if(user.a_intent == INTENT_HARM) //Flogging
- ..()
- else
- return
+ if(bayonet)
+ M.attackby(bayonet, user)
+ else
+ return ..()
+
+/obj/item/gun/attack_obj(obj/O, mob/user)
+ if(user.a_intent == INTENT_HARM)
+ if(bayonet)
+ O.attackby(bayonet, user)
+ return
+ return ..()
/obj/item/gun/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/flashlight/seclite))
@@ -257,7 +286,7 @@ obj/item/gun/proc/newshot()
if(loc == user)
A.Grant(user)
- if(istype(I, /obj/item/screwdriver))
+ if(isscrewdriver(I))
if(gun_light && can_flashlight)
for(var/obj/item/flashlight/seclite/S in src)
to_chat(user, "You unscrew the seclite from [src].")
@@ -268,11 +297,32 @@ obj/item/gun/proc/newshot()
update_icon()
for(var/datum/action/item_action/toggle_gunlight/TGL in actions)
qdel(TGL)
+ else if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed
+ bayonet.forceMove(get_turf(user))
+ clear_bayonet()
if(unique_rename)
if(istype(I, /obj/item/pen))
rename_gun(user)
- ..()
+ if(istype(I, /obj/item/kitchen/knife))
+ var/obj/item/kitchen/knife/K = I
+ if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it.
+ return ..()
+ if(!user.drop_item())
+ return
+ K.forceMove(src)
+ to_chat(user, "You attach [K] to [src]'s bayonet lug.")
+ bayonet = K
+ var/state = "bayonet" //Generic state.
+ if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state?
+ state = bayonet.icon_state
+ var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi'
+ knife_overlay = mutable_appearance(bayonet_icons, state)
+ knife_overlay.pixel_x = knife_x_offset
+ knife_overlay.pixel_y = knife_y_offset
+ overlays += knife_overlay
+ else
+ return ..()
/obj/item/gun/proc/toggle_gunlight()
set name = "Toggle Gun Light"
@@ -305,6 +355,15 @@ obj/item/gun/proc/newshot()
var/datum/action/A = X
A.UpdateButtonIcon()
+/obj/item/gun/proc/clear_bayonet()
+ if(!bayonet)
+ return
+ bayonet = null
+ if(knife_overlay)
+ overlays -= knife_overlay
+ knife_overlay = null
+ return TRUE
+
/obj/item/gun/extinguish_light()
if(gun_light.on)
toggle_gunlight()
diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm
index 2a20e7e6c81..d9f149b3b17 100644
--- a/code/modules/projectiles/guns/alien.dm
+++ b/code/modules/projectiles/guns/alien.dm
@@ -80,6 +80,7 @@
ammo_type = list(/obj/item/ammo_casing/energy/sonic)
cell_type = /obj/item/stock_parts/cell/super
restricted_species = list(/datum/species/vox/armalis)
+ sprite_sheets_inhand = list("Vox Armalis" = 'icons/mob/species/armalis/held.dmi') //Big guns big birds.
/obj/item/gun/energy/noisecannon/update_icon()
return
diff --git a/code/modules/projectiles/guns/dartgun.dm b/code/modules/projectiles/guns/dartgun.dm
index 7b39bfa3be8..97f4eaebf1c 100644
--- a/code/modules/projectiles/guns/dartgun.dm
+++ b/code/modules/projectiles/guns/dartgun.dm
@@ -101,6 +101,8 @@
beakers += B
to_chat(user, "You slot [B] into [src].")
src.updateUsrDialog()
+ else
+ return ..()
/obj/item/gun/dartgun/can_shoot()
if(!cartridge)
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index cbc230c1e98..6e4de3c49fa 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -140,6 +140,8 @@
if(gun_light.on)
iconF = "flight_on"
overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
+ if(bayonet && can_bayonet)
+ overlays += knife_overlay
if(itemState)
itemState += "[ratio]"
item_state = itemState
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 4662062a56e..d214309728e 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -16,6 +16,9 @@
var/holds_charge = FALSE
var/unique_frequency = FALSE // modified by KA modkits
var/overheat = FALSE
+ can_bayonet = TRUE
+ knife_x_offset = 20
+ knife_y_offset = 12
var/max_mod_capacity = 100
var/list/modkits = list()
@@ -148,6 +151,8 @@
if(gun_light.on)
iconF = "flight_on"
overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
+ if(bayonet && can_bayonet)
+ overlays += knife_overlay
/obj/item/gun/energy/kinetic_accelerator/experimental
@@ -474,6 +479,45 @@
return
new /obj/effect/temp_visual/resonance(target_turf, K.firer, null, 30)
+/obj/item/borg/upgrade/modkit/bounty
+ name = "death syphon"
+ desc = "Killing or assisting in killing a creature permanently increases your damage against that type of creature."
+ denied_type = /obj/item/borg/upgrade/modkit/bounty
+ modifier = 1.25
+ cost = 30
+ var/maximum_bounty = 25
+ var/list/bounties_reaped = list()
+
+/obj/item/borg/upgrade/modkit/bounty/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
+ if(isliving(target))
+ var/mob/living/L = target
+ var/list/existing_marks = L.has_status_effect_list(STATUS_EFFECT_SYPHONMARK)
+ for(var/i in existing_marks)
+ var/datum/status_effect/syphon_mark/SM = i
+ if(SM.reward_target == src) //we want to allow multiple people with bounty modkits to use them, but we need to replace our own marks so we don't multi-reward
+ SM.reward_target = null
+ qdel(SM)
+ L.apply_status_effect(STATUS_EFFECT_SYPHONMARK, src)
+
+/obj/item/borg/upgrade/modkit/bounty/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
+ if(isliving(target))
+ var/mob/living/L = target
+ if(bounties_reaped[L.type])
+ var/kill_modifier = 1
+ if(K.pressure_decrease_active)
+ kill_modifier *= K.pressure_decrease
+ var/armor = L.run_armor_check(K.def_zone, K.flag, "", "", K.armour_penetration)
+ L.apply_damage(bounties_reaped[L.type]*kill_modifier, K.damage_type, K.def_zone, armor)
+
+/obj/item/borg/upgrade/modkit/bounty/proc/get_kill(mob/living/L)
+ var/bonus_mod = 1
+ if(ismegafauna(L)) //megafauna reward
+ bonus_mod = 4
+ if(!bounties_reaped[L.type])
+ bounties_reaped[L.type] = min(modifier * bonus_mod, maximum_bounty)
+ else
+ bounties_reaped[L.type] = min(bounties_reaped[L.type] + (modifier * bonus_mod), maximum_bounty)
+
//Indoors
/obj/item/borg/upgrade/modkit/indoors
name = "decrease pressure penalty"
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index fa34753c6a9..be60248cded 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -175,7 +175,7 @@
power_supply.give(500)
to_chat(user, "You insert [A] in [src], recharging it.")
else
- ..()
+ return ..()
/obj/item/gun/energy/plasmacutter/update_icon()
return
diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm
index 0f05cfa32f6..81b8451eb77 100644
--- a/code/modules/projectiles/guns/grenade_launcher.dm
+++ b/code/modules/projectiles/guns/grenade_launcher.dm
@@ -28,6 +28,8 @@
to_chat(user, "[grenades.len] / [max_grenades] grenades.")
else
to_chat(user, "The grenade launcher cannot hold more grenades.")
+ else
+ return ..()
/obj/item/gun/grenadelauncher/afterattack(obj/target, mob/user , flag)
if(target == user)
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 9defe7637d4..15efee700d2 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -24,6 +24,8 @@
icon_state = "[current_skin][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]"
else
icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]"
+ if(bayonet && can_bayonet)
+ overlays += knife_overlay
/obj/item/gun/projectile/process_chamber(eject_casing = 1, empty_chamber = 1)
var/obj/item/ammo_casing/AC = chambered //Find chambered round
@@ -66,7 +68,6 @@
return
/obj/item/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob, params)
- ..()
if(istype(A, /obj/item/ammo_box/magazine))
var/obj/item/ammo_box/magazine/AM = A
if(istype(AM, mag_type))
@@ -108,7 +109,8 @@
else
to_chat(user, "You can't seem to figure out how to fit [S] on [src].")
return
- return 0
+ else
+ return ..()
/obj/item/gun/projectile/attack_hand(mob/user)
if(loc == user)
@@ -178,6 +180,9 @@
if(sawn_state == SAWN_OFF)
to_chat(user, "\The [src] is already shortened!")
return
+ if(bayonet)
+ to_chat(user, "You cannot saw-off [src] with [bayonet] attached!")
+ return
user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] begins to shorten \the [src].", "You begin to shorten \the [src]...")
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 399925d0e8a..6601f75d52b 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -19,6 +19,8 @@
if(select == 1)
overlays += "[initial(icon_state)]burst"
icon_state = "[initial(icon_state)][magazine ? "-[magazine.max_ammo]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
+ if(bayonet && can_bayonet)
+ overlays += knife_overlay
/obj/item/gun/projectile/automatic/attackby(var/obj/item/A as obj, mob/user as mob, params)
. = ..()
@@ -96,6 +98,9 @@
fire_sound = 'sound/weapons/gunshots/gunshot_smg.ogg'
fire_delay = 2
burst_size = 2
+ can_bayonet = TRUE
+ knife_x_offset = 26
+ knife_y_offset = 12
/obj/item/gun/projectile/automatic/c20r/New()
..()
@@ -123,6 +128,9 @@
can_suppress = 0
burst_size = 1
actions_types = list()
+ can_bayonet = TRUE
+ knife_x_offset = 25
+ knife_y_offset = 12
/obj/item/gun/projectile/automatic/wt550/update_icon()
..()
@@ -172,7 +180,7 @@
underbarrel.attack_self()
underbarrel.attackby(A, user, params)
else
- ..()
+ return ..()
/obj/item/gun/projectile/automatic/m90/update_icon()
..()
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 3cba868a379..6f977f2e024 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -115,7 +115,6 @@
..()
/obj/item/gun/projectile/revolver/detective/attackby(obj/item/A, mob/user, params)
- ..()
if(istype(A, /obj/item/screwdriver))
if(magazine.caliber == "38")
to_chat(user, "You begin to reinforce the barrel of [src]...")
@@ -143,6 +142,8 @@
magazine.caliber = "38"
desc = initial(desc)
to_chat(user, "You remove the modifications on [src]. Now it will fire .38 rounds.")
+ else
+ return ..()
/obj/item/gun/projectile/revolver/fingergun //Summoned by the Finger Gun spell, from advanced mimery traitor item
name = "\improper finger gun"
@@ -347,7 +348,6 @@
options["Cancel"] = null
/obj/item/gun/projectile/revolver/doublebarrel/attackby(obj/item/A, mob/user, params)
- ..()
if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing))
chamber_round()
if(istype(A, /obj/item/melee/energy))
@@ -356,6 +356,8 @@
sawoff(user)
if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter))
sawoff(user)
+ else
+ return ..()
/obj/item/gun/projectile/revolver/doublebarrel/attack_self(mob/living/user)
var/num_unloaded = 0
@@ -394,7 +396,6 @@
var/slung = 0
/obj/item/gun/projectile/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params)
- ..()
if(istype(A, /obj/item/stack/cable_coil) && !sawn_state)
var/obj/item/stack/cable_coil/C = A
if(C.use(10))
@@ -406,6 +407,8 @@
else
to_chat(user, "You need at least ten lengths of cable if you want to make a sling.")
return
+ else
+ return ..()
/obj/item/gun/projectile/revolver/doublebarrel/improvised/update_icon()
..()
@@ -450,9 +453,10 @@
return
/obj/item/gun/projectile/revolver/doublebarrel/improvised/cane/attackby(obj/item/A, mob/user, params)
- ..()
if(istype(A, /obj/item/stack/cable_coil))
return
+ else
+ return ..()
/obj/item/gun/projectile/revolver/doublebarrel/improvised/cane/examine(mob/user) // HAD TO REPEAT EXAMINE CODE BECAUSE GUN CODE DOESNT STEALTH
var/f_name = "\a [src]."
diff --git a/code/modules/projectiles/guns/projectile/saw.dm b/code/modules/projectiles/guns/projectile/saw.dm
index 59bb2595714..9002f12ff35 100644
--- a/code/modules/projectiles/guns/projectile/saw.dm
+++ b/code/modules/projectiles/guns/projectile/saw.dm
@@ -50,14 +50,14 @@
to_chat(user, "You remove the magazine from [src].")
-/obj/item/gun/projectile/automatic/l6_saw/attackby(obj/item/A, mob/user, params)
+/obj/item/gun/projectile/automatic/l6_saw/attackby(obj/item/A, mob/user, params)
if(istype(A, /obj/item/ammo_box/magazine))
var/obj/item/ammo_box/magazine/AM = A
if(istype(AM, mag_type))
if(!cover_open)
to_chat(user, "[src]'s cover is closed! You can't insert a new mag.")
return
- ..()
+ return ..()
//ammo//
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 366b9b6579f..46286bef2af 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -86,7 +86,6 @@
sawn_state = SAWN_INTACT
/obj/item/gun/projectile/shotgun/riot/attackby(obj/item/A, mob/user, params)
- ..()
if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter))
sawoff(user)
if(istype(A, /obj/item/melee/energy))
@@ -95,6 +94,8 @@
sawoff(user)
if(istype(A, /obj/item/pipe))
unsaw(A, user)
+ else
+ return ..()
/obj/item/gun/projectile/shotgun/riot/sawoff(mob/user)
if(sawn_state == SAWN_OFF)
@@ -210,6 +211,9 @@
mag_type = /obj/item/ammo_box/magazine/internal/boltaction
fire_sound = 'sound/weapons/gunshots/gunshot_rifle.ogg'
var/bolt_open = 0
+ can_bayonet = TRUE
+ knife_x_offset = 27
+ knife_y_offset = 13
/obj/item/gun/projectile/shotgun/boltaction/pump(mob/M)
playsound(M, 'sound/weapons/gun_interactions/rifle_load.ogg', 60, 1)
@@ -242,6 +246,7 @@
desc = "Careful not to lose your head."
var/guns_left = 30
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted
+ can_bayonet = FALSE
/obj/item/gun/projectile/shotgun/boltaction/enchanted/New()
..()
diff --git a/code/modules/projectiles/guns/rocket.dm b/code/modules/projectiles/guns/rocket.dm
index fa6dce3f448..983c6f319fd 100644
--- a/code/modules/projectiles/guns/rocket.dm
+++ b/code/modules/projectiles/guns/rocket.dm
@@ -37,6 +37,8 @@
to_chat(user, "[rockets.len] / [max_rockets] rockets.")
else
to_chat(usr, "[src] cannot hold more rockets.")
+ else
+ return ..()
/obj/item/gun/rocketlauncher/can_shoot()
return rockets.len
diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm
index 21d44fa8634..ca18cdcd82e 100644
--- a/code/modules/projectiles/guns/syringe_gun.dm
+++ b/code/modules/projectiles/guns/syringe_gun.dm
@@ -76,7 +76,8 @@
return 1
else
to_chat(user, "[src] cannot hold more syringes.")
- return 0
+ else
+ return ..()
/obj/item/gun/syringe/rapidsyringe
name = "rapid syringe gun"
diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
index 77118450aaa..59d15cf50bd 100644
--- a/code/modules/reagents/chemistry/reagents/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -1149,24 +1149,19 @@
id = "lavaland_extract"
description = "An extract of lavaland atmospheric and mineral elements. Heals the user in small doses, but is extremely toxic otherwise."
color = "#C8A5DC" // rgb: 200, 165, 220
- metabolization_rate = 0.7 //VERY strong chemical
overdose_threshold = 3 //To prevent people stacking massive amounts of a very strong healing reagent
can_synth = FALSE
/datum/reagent/medicine/lavaland_extract/on_mob_life(mob/living/carbon/M)
var/update_flags = STATUS_UPDATE_NONE
- update_flags |= M.adjustToxLoss(-3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
- update_flags |= M.adjustOxyLoss(-3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
- update_flags |= M.adjustBruteLoss(-6*REAGENTS_EFFECT_MULTIPLIER, FALSE)
- update_flags |= M.adjustFireLoss(-6*REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ update_flags |= M.adjustBruteLoss(-5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ update_flags |= M.adjustFireLoss(-5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
return ..() | update_flags
/datum/reagent/medicine/lavaland_extract/overdose_process(mob/living/M) // This WILL be brutal
var/update_flags = STATUS_UPDATE_NONE
M.AdjustConfused(5)
- update_flags |= M.adjustBruteLoss(10*REAGENTS_EFFECT_MULTIPLIER, FALSE)
- update_flags |= M.adjustFireLoss(10*REAGENTS_EFFECT_MULTIPLIER, FALSE)
- update_flags |= M.adjustToxLoss(10*REAGENTS_EFFECT_MULTIPLIER, FALSE)
- update_flags |= M.Stun(7, FALSE)
- update_flags |= M.Weaken(7, FALSE)
+ update_flags |= M.adjustBruteLoss(3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ update_flags |= M.adjustFireLoss(3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ update_flags |= M.adjustToxLoss(3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
return ..() | update_flags
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index d408db7f2f0..5221ae5e600 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -81,7 +81,7 @@
reagents.reaction(M, TOUCH)
reagents.clear_reagents()
- else
+ else
if(M != user)
M.visible_message("[user] attempts to feed something to [M].", \
"[user] attempts to feed something to you.")
@@ -348,6 +348,13 @@
slot_flags = SLOT_HEAD
container_type = OPENCONTAINER
+/obj/item/reagent_containers/glass/bucket/wooden
+ name = "wooden bucket"
+ icon_state = "woodbucket"
+ item_state = "woodbucket"
+ materials = null
+ burn_state = FLAMMABLE
+
/obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot)
..()
if(slot == slot_head && reagents.total_volume)
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index dace5928b2e..3abfbfd0e19 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -155,9 +155,9 @@
name = "survival medipen"
desc = "A medipen for surviving in the harshest of environments, heals and protects from environmental hazards. WARNING: Do not inject more than one pen in quick succession."
icon_state = "stimpen"
- volume = 22
- amount_per_transfer_from_this = 22
- list_reagents = list("salbutamol" = 10, "epinephrine" = 5, "lavaland_extract" = 2, "salglu_solution" = 5) //Short burst of healing, followed by minor healing from the saline
+ volume = 42
+ amount_per_transfer_from_this = 42
+ list_reagents = list("salbutamol" = 10, "teporone" = 15, "epinephrine" = 10, "lavaland_extract" = 2, "weak_omnizine" = 5) //Short burst of healing, followed by minor healing from the saline
/obj/item/reagent_containers/hypospray/autoinjector/nanocalcium
name = "nanocalcium autoinjector"
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index f50b3527aa2..a6dfb7bd848 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -12,6 +12,16 @@
build_path = /obj/item/circuitboard/thermomachine
category = list ("Engineering Machinery")
+/datum/design/recharger
+ name = "Machine Board(Weapon Recharger)"
+ desc = "The circuit board for a weapon recharger"
+ id = "recharger"
+ build_path = /obj/item/circuitboard/recharger
+ materials = list(MAT_GLASS = 1000)
+ build_type = IMPRINTER
+ req_tech = list("powerstorage" = 3, "materials" = 3)
+ category = list("Misc. Machinery")
+
/datum/design/smes
name = "Machine Board (SMES)"
desc = "The circuit board for a SMES."
diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm
index 5570053d946..9c8d963fdcd 100644
--- a/code/modules/response_team/ert.dm
+++ b/code/modules/response_team/ert.dm
@@ -240,32 +240,21 @@ var/ert_request_answered = FALSE
switch(officer_type)
if("Engineer")
M.equipOutfit(engineering_outfit)
- M.job = "ERT Engineering"
if("Security")
M.equipOutfit(security_outfit)
- M.job = "ERT Security"
if("Medic")
M.equipOutfit(medical_outfit)
- M.job = "ERT Medical"
if("Janitor")
M.equipOutfit(janitor_outfit)
- M.job = "ERT Janitor"
if("Paranormal")
M.equipOutfit(paranormal_outfit)
- M.job = "ERT Paranormal"
- M.mind.isholy = TRUE
if("Commander")
- // Override name and age for the commander
- M.rename_character(null, "[pick("Lieutenant", "Captain", "Major")] [pick(GLOB.last_names)]")
- M.age = rand(35,45)
-
M.equipOutfit(command_outfit)
- M.job = "ERT Commander"
/datum/response_team/proc/cannot_send_team()
event_announcement.Announce("[station_name()], we are unfortunately unable to send you an Emergency Response Team at this time.", "ERT Unavailable")
@@ -317,6 +306,7 @@ var/ert_request_answered = FALSE
name = "Response team"
var/rt_assignment = "Emergency Response Team Member"
var/rt_job = "This is a bug"
+ var/rt_mob_job = "This is a bug" // The job set on the actual mob.
allow_backbag_choice = FALSE
allow_loadout = FALSE
pda = /obj/item/pda/heads/ert
diff --git a/code/modules/response_team/ert_outfits.dm b/code/modules/response_team/ert_outfits.dm
index b287643901d..184ce84c50e 100644
--- a/code/modules/response_team/ert_outfits.dm
+++ b/code/modules/response_team/ert_outfits.dm
@@ -23,6 +23,10 @@
PDA.ownrank = rt_assignment
PDA.name = "PDA-[H.real_name] ([PDA.ownjob])"
+/datum/outfit/job/centcom/response_team/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.job = rt_mob_job
//////////////////// COMMANDER ///////////////////
@@ -30,6 +34,7 @@
name = "RT Commander"
rt_assignment = "Emergency Response Team Leader"
rt_job = "Emergency Response Team Leader"
+ rt_mob_job = "ERT Commander"
uniform = /obj/item/clothing/under/rank/centcom_officer
back = /obj/item/storage/backpack/ert/commander
@@ -39,6 +44,12 @@
l_pocket = /obj/item/pinpointer
r_pocket = /obj/item/melee/classic_baton/telescopic
+/datum/outfit/job/centcom/response_team/commander/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+
+ H.rename_character(null, "[pick("Lieutenant", "Captain", "Major")] [pick(GLOB.last_names)]")
+ H.age = rand(35,45)
+
/datum/outfit/job/centcom/response_team/commander/amber
name = "RT Commander (Amber)"
shoes = /obj/item/clothing/shoes/combat
@@ -69,7 +80,6 @@
belt = /obj/item/gun/energy/gun/blueshield/pdw9
backpack_contents = list(
- /obj/item/clothing/head/helmet/space/hardsuit/ert/commander = 1,
/obj/item/clothing/mask/gas/sechailer/swat = 1,
/obj/item/gun/energy/ionrifle/carbine = 1,
/obj/item/restraints/handcuffs = 1,
@@ -87,7 +97,6 @@
belt = /obj/item/gun/projectile/automatic/pistol/enforcer/lethal
backpack_contents = list(
- /obj/item/clothing/head/helmet/space/hardsuit/ert/commander/gamma = 1,
/obj/item/clothing/mask/gas/sechailer/swat = 1,
/obj/item/restraints/handcuffs = 1,
/obj/item/storage/lockbox/mindshield = 1,
@@ -107,6 +116,7 @@
/datum/outfit/job/centcom/response_team/security
name = "RT Security"
rt_job = "Emergency Response Team Officer"
+ rt_mob_job = "ERT Security"
uniform = /obj/item/clothing/under/rank/security
back = /obj/item/storage/backpack/ert/security
belt = /obj/item/storage/belt/security/response_team
@@ -149,7 +159,6 @@
)
backpack_contents = list(
- /obj/item/clothing/head/helmet/space/hardsuit/ert/security = 1,
/obj/item/clothing/mask/gas/sechailer = 1,
/obj/item/clothing/shoes/magboots = 1,
/obj/item/storage/box/handcuffs = 1,
@@ -172,7 +181,6 @@
r_hand = /obj/item/gun/energy/immolator/multi
backpack_contents = list(
- /obj/item/clothing/head/helmet/space/hardsuit/ert/security/gamma = 1,
/obj/item/clothing/mask/gas/sechailer/swat = 1,
/obj/item/storage/box/handcuffs = 1,
/obj/item/storage/box/flashbangs = 1,
@@ -194,6 +202,7 @@
/datum/outfit/job/centcom/response_team/engineer
name = "RT Engineer"
rt_job = "Emergency Response Team Engineer"
+ rt_mob_job = "ERT Engineering"
back = /obj/item/storage/backpack/ert/engineer
uniform = /obj/item/clothing/under/rank/engineer
@@ -213,7 +222,6 @@
r_pocket = /obj/item/melee/classic_baton/telescopic
backpack_contents = list(
- /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer = 1,
/obj/item/clothing/mask/gas = 1,
/obj/item/t_scanner = 1,
/obj/item/stack/sheet/glass/fifty = 1,
@@ -237,7 +245,6 @@
r_pocket = /obj/item/melee/classic_baton/telescopic
backpack_contents = list(
- /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer/gamma = 1,
/obj/item/clothing/mask/gas = 1,
/obj/item/rcd/preloaded = 1,
/obj/item/rcd_ammo = 3,
@@ -257,7 +264,6 @@
r_pocket = /obj/item/melee/classic_baton/telescopic
backpack_contents = list(
- /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer/gamma = 1,
/obj/item/clothing/mask/gas/sechailer/swat = 1,
/obj/item/rcd/combat = 1,
/obj/item/rcd_ammo/large = 3
@@ -276,6 +282,7 @@
/datum/outfit/job/centcom/response_team/medic
name = "RT Medic"
rt_job = "Emergency Response Team Medic"
+ rt_mob_job = "ERT Medical"
uniform = /obj/item/clothing/under/rank/medical
back = /obj/item/storage/backpack/ert/medical
pda = /obj/item/pda/heads/ert/medical
@@ -312,6 +319,7 @@
/datum/outfit/job/centcom/response_team/medic/red
name = "RT Medic (Red)"
+ rt_mob_job = "ERT Medical"
shoes = /obj/item/clothing/shoes/white
gloves = /obj/item/clothing/gloves/color/latex/nitrile
suit = /obj/item/clothing/suit/space/hardsuit/ert/medical
@@ -327,7 +335,6 @@
r_pocket = /obj/item/melee/classic_baton/telescopic
backpack_contents = list(
- /obj/item/clothing/head/helmet/space/hardsuit/ert/medical = 1,
/obj/item/clothing/mask/surgical = 1,
/obj/item/storage/firstaid/toxin = 1,
/obj/item/storage/firstaid/brute = 1,
@@ -354,7 +361,6 @@
r_pocket = /obj/item/reagent_containers/hypospray/autoinjector
backpack_contents = list(
- /obj/item/clothing/head/helmet/space/hardsuit/ert/medical/gamma = 1,
/obj/item/clothing/mask/gas/sechailer/swat = 1,
/obj/item/bodyanalyzer/advanced = 1,
/obj/item/extinguisher/mini = 1,
@@ -377,6 +383,7 @@
/datum/outfit/job/centcom/response_team/paranormal
name = "RT Paranormal"
rt_job = "Emergency Response Team Inquisitor"
+ rt_mob_job = "ERT Paranormal"
uniform = /obj/item/clothing/under/rank/chaplain
back = /obj/item/storage/backpack/ert/security
gloves = /obj/item/clothing/gloves/color/black
@@ -392,6 +399,11 @@
/obj/item/flashlight/seclite = 1
)
+/datum/outfit/job/centcom/response_team/paranormal/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(H.mind)
+ H.mind.isholy = TRUE
+
/datum/outfit/job/centcom/response_team/paranormal/amber
name = "RT Paranormal (Amber)"
suit = /obj/item/clothing/suit/armor/vest/ert/security/paranormal
@@ -402,7 +414,6 @@
/datum/outfit/job/centcom/response_team/paranormal/red
name = "RT Paranormal (Red)"
suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
- head = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor
suit_store = /obj/item/gun/energy/gun
r_pocket = /obj/item/nullrod/ert
glasses = /obj/item/clothing/glasses/sunglasses
@@ -415,7 +426,6 @@
/datum/outfit/job/centcom/response_team/paranormal/gamma
name = "RT Paranormal (Gamma)"
suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
- head = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor
suit_store = /obj/item/gun/energy/gun/nuclear
l_pocket = /obj/item/grenade/clusterbuster/holy
shoes = /obj/item/clothing/shoes/magboots/advance
@@ -433,6 +443,7 @@
/datum/outfit/job/centcom/response_team/janitorial
name = "RT Janitor"
rt_job = "Emergency Response Team Janitor"
+ rt_mob_job = "ERT Janitor"
uniform = /obj/item/clothing/under/color/purple
back = /obj/item/storage/backpack/ert/janitor
belt = /obj/item/storage/belt/janitor/full
@@ -461,7 +472,6 @@
/datum/outfit/job/centcom/response_team/janitorial/red
name = "RT Janitor (Red)"
suit = /obj/item/clothing/suit/space/hardsuit/ert/janitor
- head = /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
r_pocket = /obj/item/scythe/tele
@@ -483,7 +493,6 @@
shoes = /obj/item/clothing/shoes/magboots/advance
backpack_contents = list(
- /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor/gamma = 1,
/obj/item/grenade/chem_grenade/antiweed = 2,
/obj/item/storage/box/lights/mixed = 1,
/obj/item/storage/bag/trash/bluespace = 1,
diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm
index 67765ef8ac5..42e710d0cf6 100644
--- a/code/modules/shuttle/on_move.dm
+++ b/code/modules/shuttle/on_move.dm
@@ -30,17 +30,21 @@
if(id_tag == "s_docking_airlock")
INVOKE_ASYNC(src, .proc/lock)
-/mob/onShuttleMove()
+/mob/onShuttleMove(turf/oldT, turf/T1, rotation)
if(!move_on_shuttle)
return 0
. = ..()
if(!.)
return
- if(client)
- if(buckled)
- shake_camera(src, 2, 1) // turn it down a bit come on
- else
- shake_camera(src, 7, 1)
+ if(!client)
+ return
+
+ if(buckled)
+ shake_camera(src, 2, 1) // turn it down a bit come on
+ else
+ shake_camera(src, 7, 1)
+
+ update_parallax_contents()
/mob/living/carbon/onShuttleMove()
. = ..()
@@ -54,8 +58,10 @@
if(smooth)
queue_smooth(src)
+/mob/postDock()
+ update_parallax_contents()
+
/obj/machinery/door/airlock/postDock(obj/docking_port/stationary/S1)
. = ..()
if(!S1.lock_shuttle_doors && id_tag == "s_docking_airlock")
INVOKE_ASYNC(src, .proc/unlock)
-
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 51ba6c6bad1..bda89160be4 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -189,7 +189,7 @@
/obj/docking_port/stationary/transit
name = "In transit"
turf_type = /turf/space/transit
-
+ var/area/shuttle/transit/assigned_area
lock_shuttle_doors = 1
/obj/docking_port/stationary/transit/register()
@@ -210,8 +210,10 @@
var/list/shuttle_areas
var/timer //used as a timer (if you want time left to complete move, use timeLeft proc)
+ var/last_timer_length
var/mode = SHUTTLE_IDLE //current shuttle mode (see global defines)
var/callTime = 50 //time spent in transit (deciseconds)
+ var/ignitionTime = 30 // time spent "starting the engines". Also rate limits how often we try to reserve transit space if its ever full of transiting shuttles.
var/roundstart_move //id of port to send shuttle to at roundstart
var/travelDir = 0 //direction the shuttle would travel in
var/rebuildable = 0 //can build new shuttle consoles for this one
@@ -325,30 +327,29 @@
switch(mode)
if(SHUTTLE_CALL)
if(S == destination)
- if(world.time <= timer)
- timer = world.time
+ if(timeLeft(1) < callTime)
+ setTimer(callTime)
else
destination = S
- timer = world.time
+ setTimer(callTime)
if(SHUTTLE_RECALL)
if(S == destination)
- timer = world.time - timeLeft(1)
+ setTimer(callTime - timeLeft(1))
else
destination = S
- timer = world.time
+ setTimer(callTime)
mode = SHUTTLE_CALL
- else
+ if(SHUTTLE_IDLE, SHUTTLE_IGNITING)
destination = S
- mode = SHUTTLE_CALL
- timer = world.time
- enterTransit() //hyperspace
+ mode = SHUTTLE_IGNITING
+ setTimer(ignitionTime)
//recall the shuttle to where it was previously
/obj/docking_port/mobile/proc/cancel()
if(mode != SHUTTLE_CALL)
return
- timer = world.time - timeLeft(1)
+ invertTimer()
mode = SHUTTLE_RECALL
/obj/docking_port/mobile/proc/enterTransit()
@@ -358,7 +359,7 @@
var/obj/docking_port/stationary/S0 = get_docked()
var/obj/docking_port/stationary/S1 = findTransitDock()
if(S1)
- if(dock(S1))
+ if(dock(S1, , TRUE))
WARNING("shuttle \"[id]\" could not enter transit space. Docked at [S0 ? S0.id : "null"]. Transit dock [S1 ? S1.id : "null"].")
else
previous = S0
@@ -429,7 +430,7 @@
//this is the main proc. It instantly moves our mobile port to stationary port S1
//it handles all the generic behaviour, such as sanity checks, closing doors on the shuttle, stunning mobs, etc
-/obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1, force=FALSE)
+/obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1, force=FALSE, transit=FALSE)
// Crashing this ship with NO SURVIVORS
if(S1.get_docked() == src)
remove_ripples()
@@ -492,6 +493,7 @@
var/turf/simulated/Ts1 = T1
Ts1.copy_air_with_tile(T0)
+ areaInstance.moving = TRUE
//move mobile to new location
for(var/atom/movable/AM in T0)
AM.onShuttleMove(T0, T1, rotation)
@@ -512,6 +514,7 @@
T0.CalculateAdjacentTurfs()
SSair.add_to_active(T0,1)
+ areaInstance.moving = transit
for(var/A1 in L1)
var/turf/T1 = A1
T1.postDock(S1)
@@ -630,6 +633,11 @@
if(dock(previous))
setTimer(20) //can't dock for some reason, try again in 2 seconds
return
+ if(SHUTTLE_IGNITING)
+ mode = SHUTTLE_CALL
+ setTimer(callTime)
+ enterTransit()
+ return
mode = SHUTTLE_IDLE
timer = 0
destination = null
@@ -642,9 +650,24 @@
create_ripples(destination)
/obj/docking_port/mobile/proc/setTimer(wait)
- if(timer <= 0)
- timer = world.time
- timer += wait - timeLeft(1)
+ timer = world.time + wait
+ last_timer_length = wait
+
+/obj/docking_port/mobile/proc/modTimer(multiple)
+ var/time_remaining = timer - world.time
+ if(time_remaining < 0 || !last_timer_length)
+ return
+ time_remaining *= multiple
+ last_timer_length *= multiple
+ setTimer(time_remaining)
+
+/obj/docking_port/mobile/proc/invertTimer()
+ if(!last_timer_length)
+ return
+ var/time_remaining = timer - world.time
+ if(time_remaining > 0)
+ var/time_passed = last_timer_length - time_remaining
+ setTimer(time_passed)
//returns timeLeft
/obj/docking_port/mobile/proc/timeLeft(divisor)
@@ -787,7 +810,7 @@
return
switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1))
if(0)
- to_chat(usr, "Shuttle received message and will be sent shortly.")
+ atom_say("Shuttle departing! Please stand away from the doors.")
if(1)
to_chat(usr, "Invalid shuttle requested.")
else
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index b6a7e7bb28f..9da43d08fbf 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -247,7 +247,8 @@
/obj/machinery/clonepod,
/obj/effect/hierophant,
/obj/item/warp_cube,
- /obj/machinery/quantumpad
+ /obj/machinery/quantumpad,
+ /obj/structure/extraction_point
)
if(A)
if(is_type_in_list(A, blacklist))
diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm
index 78264ca0329..6f1fb8fe293 100644
--- a/code/modules/surgery/organs/blood.dm
+++ b/code/modules/surgery/organs/blood.dm
@@ -99,11 +99,11 @@
/mob/living/carbon/proc/bleed_internal(amt) // Return 1 if we've coughed blood up, 2 if we're vomited it.
if(blood_volume)
blood_volume = max(blood_volume - amt, 0)
- if (prob(10 * amt)) // +5% chance per internal bleeding site that we'll cough up blood on a given tick.
+ if(prob(10 * amt)) // +5% chance per internal bleeding site that we'll cough up blood on a given tick.
custom_emote(1, "coughs up blood!")
add_splatter_floor(loc, 1)
return 1
- else if (amt >= 1 && prob(5 * amt)) // +2.5% chance per internal bleeding site that we'll cough up blood on a given tick. Must be bleeding internally in more than one place to have a chance at this.
+ else if(amt >= 1 && prob(5 * amt)) // +2.5% chance per internal bleeding site that we'll cough up blood on a given tick. Must be bleeding internally in more than one place to have a chance at this.
vomit(0, 1)
return 2
return 0
@@ -253,7 +253,7 @@
// Only a certain number of drips (or one large splatter) can be on a given turf.
var/obj/effect/decal/cleanable/blood/drip/drop = locate() in T
if(drop)
- if(drop.drips < 3)
+ if(drop.drips < 5)
drop.drips++
drop.overlays |= pick(drop.random_icon_states)
drop.transfer_mob_blood_dna(src)
@@ -278,7 +278,8 @@
B = locate() in bloods
if(!B)
B = new(T)
-
+ if(B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit
+ B.bloodiness += BLOOD_AMOUNT_PER_DECAL
B.transfer_mob_blood_dna(src) //give blood info to the blood decal.
if(temp_blood_DNA)
B.blood_DNA |= temp_blood_DNA
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 6dbc6f4febe..97c54c64e47 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -226,6 +226,8 @@
health = 3
var/organhonked = 0
var/suffering_delay = 900
+ var/datum/component/waddle
+ var/datum/component/squeak
/obj/item/organ/internal/honktumor/insert(mob/living/carbon/M, special = 0)
..()
@@ -236,6 +238,8 @@
genemutcheck(M,CLUMSYBLOCK,null,MUTCHK_FORCED)
genemutcheck(M,COMICBLOCK,null,MUTCHK_FORCED)
organhonked = world.time
+ waddle = M.AddComponent(/datum/component/waddling)
+ squeak = M.AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg' = 1), 50)
/obj/item/organ/internal/honktumor/remove(mob/living/carbon/M, special = 0)
. = ..()
@@ -246,6 +250,8 @@
M.dna.SetSEState(COMICBLOCK,0)
genemutcheck(M,CLUMSYBLOCK,null,MUTCHK_FORCED)
genemutcheck(M,COMICBLOCK,null,MUTCHK_FORCED)
+ QDEL_NULL(waddle)
+ QDEL_NULL(squeak)
qdel(src)
/obj/item/organ/internal/honktumor/on_life()
@@ -282,6 +288,28 @@
owner.nutrition = 9000
owner.overeatduration = 9000
+
+/obj/item/organ/internal/honkbladder
+ name = "honk bladder"
+ desc = "a air filled sac that produces honking noises."
+ icon_state = "honktumor"//Not making a new icon
+ origin_tech = "biotech=1"
+ w_class = WEIGHT_CLASS_TINY
+ parent_organ = "groin"
+ slot = "honk_bladder"
+ health = 3
+ var/datum/component/squeak
+
+/obj/item/organ/internal/honkbladder/insert(mob/living/carbon/M, special = 0)
+
+ squeak = M.AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50)
+
+/obj/item/organ/internal/honkbladder/remove(mob/living/carbon/M, special = 0)
+ . = ..()
+
+ QDEL_NULL(squeak)
+ qdel(src)
+
/obj/item/organ/internal/beard
name = "beard organ"
desc = "Let they who is worthy wear the beard of Thorbjorndottir."
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 94f6be4cc9a..9d91682f057 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -125,6 +125,9 @@ var/static/regex/multispin_words = regex("like a record baby")
return
owner.say(".x[command]")
+/obj/item/organ/internal/vocal_cords/colossus/prepare_eat()
+ return
+
/obj/item/organ/internal/vocal_cords/colossus/can_speak_with()
if(world.time < next_command)
to_chat(owner, "You must wait [(next_command - world.time)/10] seconds before Speaking again.")
diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm
index 6b15018de49..ac225003c52 100644
--- a/code/modules/vehicle/ambulance.dm
+++ b/code/modules/vehicle/ambulance.dm
@@ -102,6 +102,10 @@
anchored = FALSE
throw_pressure_limit = INFINITY //Throwing an ambulance trolley can kill the process scheduler.
+/obj/structure/bed/amb_trolley/examine(mob/user)
+ . = ..()
+ to_chat(user, "Drag [src]'s sprite over the ambulance to (de)attach it.")
+
/obj/structure/bed/amb_trolley/MouseDrop(obj/over_object as obj)
..()
if(istype(over_object, /obj/vehicle/ambulance))
diff --git a/code/modules/vr/vr_outfits.dm b/code/modules/vr/vr_outfits.dm
index ce8d52b4880..e61ea829b27 100644
--- a/code/modules/vr/vr_outfits.dm
+++ b/code/modules/vr/vr_outfits.dm
@@ -1,12 +1,12 @@
//place all the outfits for your levels in here.
/datum/outfit/vr/vr_basic
- name = "basic vr"
+ name = "Basic Virtual Reality"
uniform = /obj/item/clothing/under/psysuit
shoes = /obj/item/clothing/shoes/black
/datum/outfit/vr/roman
- name = "roman"
+ name = "Roman"
uniform = /obj/item/clothing/under/roman
shoes = /obj/item/clothing/shoes/roman
l_hand = /obj/item/shield/riot/roman
diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt
index 2404119d52f..ad859d92543 100644
--- a/config/example/dbconfig.txt
+++ b/config/example/dbconfig.txt
@@ -9,7 +9,7 @@
## This value must be set to the version of the paradise schema in use.
## If this value does not match, the SQL database will not be loaded and an error will be generated.
## Roundstart will be delayed.
-DB_VERSION 8
+DB_VERSION 9
## Server the MySQL database can be found at.
# Examples: localhost, 200.135.5.43, www.mysqldb.com, etc.
diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm
index 3456e0a2ce9..3359e7c6232 100644
--- a/goon/code/datums/browserOutput.dm
+++ b/goon/code/datums/browserOutput.dm
@@ -222,7 +222,7 @@ var/to_chat_filename
var/to_chat_line
var/to_chat_src
// Call using macro: to_chat(target, message, flag)
-/proc/__to_chat(target, message, flag)
+/proc/to_chat_immediate(target, message, flag)
if(!is_valid_tochat_message(message) || !is_valid_tochat_target(target))
target << message
@@ -279,3 +279,9 @@ var/to_chat_src
output_message += "&[url_encode(flag)]"
target << output(output_message, "browseroutput:output")
+
+/proc/__to_chat(target, message, flag)
+ if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized)
+ to_chat_immediate(target, message, flag)
+ return
+ SSchat.queue(target, message, flag)
diff --git a/html/changelog.html b/html/changelog.html
index 2aef4e33f8f..023f1918124 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,168 @@
-->
+
23 August 2019
+
AffectedArc07, Keekenox, Floyd/Qustinnus updated:
+
+
P A R A L L A X (That fancy space thing)
+
Adds a new Parallax layer that resembles Lavaland (Lava Planet), it spawns on a random location near the station. You need your parallax on high to see it.
+
+
Arkatos updated:
+
+
Added colored pillbottles
+
Added an option to change color of the pillbottles to ChemMaster3000
+
Added new description to patch packs
+
Jump to Node ability now shows a location of each Blob node
+
Added SlimeHUD when playing as a slime. This means slimes will have their own unique health doll and pull icon.
+
Action buttons can now be dragged onto each other to swap places
+
Fixed a case where dragging locked action buttons could result in white tooltip over the screen
+
+
AzuleUtama updated:
+
+
The Traitor thermal glasses and chameleon security HUD now use the updated chameleon code. balance: Traitor thermal glasses will no longer cause eye damage when hit with EMP.
+
+
Citinited updated:
+
+
Removes the big pipe dispensers from atmospherics, you can still find them elsewhere.
+
+
Couls updated:
+
+
After many complaints about being stuck in medbay. NT has modified all the airlocks on the station to allow leaving certain departments without requiring an respective ID. This new modification is indicated by a white light near the airlocks in the direction of unrestricted access.
+
New unrestricted access can be built by NT engineers through modification of the airlock electronics.
+
hit effects!
+
hit effect sprites for lasers, bullet hole and dent decals for walls
+
mice now have a very low chance of chewing through wires, this kills them if the wire is powered
+
You can now homerun things thrown at you with a baseball bat!
+
new baseball hit noise, new baseball sprite
+
there are much less one-way airlocks on station
+
+
DoctorDrugs updated:
+
+
removed the ability to eat the divine vocal cords
+
+
EmanTheAlmighty updated:
+
+
The AI can now change its intent by clicking on the new on-screen button or pressing 4 to switch to help or harm.
+
The AI can now toggle airlock safeties instead of toggling door bolt lights by pressing middle mouse.
+
+
Fox McCloud updated:
+
+
Majorly updates lavaland
+
Miner starting equipment altered. They now start with a kinetic accelerator
+
Miners start off with a mini pickaxe
+
Adds in the boxed implant kit, regular shelter capsule, and mining drone passthrough upgrade to the mining equipment vendor
+
re-ordered the equipment vendor, so things are grouped together more logically
+
Added a number of new kinetic accelerator upgrades acquirable through tendril chests
+
Mining bot now uses an actual kinetic accelerator as opposed to a "Look alike"; you can upgrade its internal gun with various kinetic accelerator modkits.
+
Sentient mining bot nerfed; you can no longer apply the armor or melee buff to them; offset by the fact you can upgrade their kinetic gun.
+
Indoor pressure mod removed from R&D and made into a miner traitor item
+
Resonators have an increased amount of fields and do more damage in low pressure. Additionally, if you place a field on a tile that already has a field, it'll cause it to detonate early
+
Plasmacutter no longer does increased damage in low pressure, Advanced plasma cutter does slightly more base damage but has a bit less range. Price has been cut at R&D
+
removed the AoE Mob+Turf upgrade for mining pods
+
Fixes ripleys being slow on lavaland
+
Fixes walking on lavaland sounding like walking on metal plating
+
Adds in kinetic crusher trophies
+
Kinetic crusher can be wielded/unwielded (but you can't attack with it unwielded)
+
Adds the HECK suit as Bubblegum loot
+
Adds the kinetic accelerator bounty mod as Tendril loot
+
Add fulton extract packs to the mining vendor; rescue precious valuable or dead miners!
+
Adds mini-fans to the mining, engineering, and security shuttles
+
Adds a number of primal recipes: rake (cultivator), wooden bucket, firebrand (long burning match), and bone bracers (armored arm protection that goes on your glove slot)
+
Can attach bayonets to C20rs, bolt action rifles, security auto-rifles, and kinetic accelerator; harm intent to stab with them
+
can craft ore boxes out of wood
+
Skull helmets are now proper helmets
+
Survival autoinjectors tweaked
+
Survival autoinjectors have 15 units of teporone in them
+
Survival autoinjectors have double the epinpehrine and weak omnizine instead of saline glucose.
+
lavaland extract altered; it no longer heals tox or oxy, and heals slightly less brute and burn, but has nearly halved the metabolization rate and has a less harsh overdose
+
Fixes airlocks spamming their open and close when you stand in them
+
Fixes overriden door timers not working
+
+
Fox McCloud and FullofSkittles updated:
+
+
Changes the Venus Human Flytrap sprite
+
+
Ionward updated:
+
+
Adjusted Greys uniforms and backpack sprites.
+
Added a bunch of Drask masks and glasses.
+
Added God Eye sprites for Greys, Drask, and Vox.
+
+
JKnutson101 updated:
+
+
Issue where Emergency NanoMed Vendors required Medical ID to Access.
+
Added the ability for cyborgs with zero battery to use the 'succumb' verb.
+
+
Markolie updated:
+
+
Players now have thirty seconds instead of just five seconds to select if they want to be somebody's butler through a die of fate roll.
+
The Netherworld portal is now properly destroyed upon being killed. In addition, its max health is now equal to its starting health.
+
The iron ore sprite that shows up when using the miner scanner no longer has a background, making it blend in better with the actual rock.
+
Tightening the bolts of a falsewall now works properly.
+
Deconstructing plating now requires it to be unfastened using a screwdriver first, in order to prevent it from being accidentally deconstructed with a welder.
+
+
Quantum-M updated:
+
+
Minor grammar edits to the text that tells you that your thirst is dealt with but no blood power is given. balance: Vampires are no longer able to drink get power from ckeyless humanoid monkeys, they will now need to hunt down actual characters with ckey to get power.
+
+
Shadow-Quill updated:
+
+
Mass drivers now need two rods/cable coil instead of three to construct.
+
The RD's office door can now be opened by the RD, instead of by just the Captain.
+
Science lockdown can now only be (de)activated by the RD, instead of any scientist.
+
Using a health analyzer in-hand will switch the verbosity.
+
You no longer have to unscrew a plating to repair it.
+
The shivering symptom in virology now properly chills people.
+
+
SteelSlayer updated:
+
+
Wizard rounds now end if all wizards and apprentices are either dead, inside cyborgs, or in MMIs
+
Re-enabled the wizard's hud. Wizards can now see their own antag icon along with seeing other wizard's and apprentice's icons
+
When a cult sacrifice target leaves the round via cryo, the game will reassign a new target for them
+
Added an alarm sound that plays for cultists when their sacrifice target leave the round via cryo
+
When a cult sacrifice target leaves the round via cryo, the game will update every cultist's notes to reflect the change
+
Adds a new verb named "Toggle Health Scan" to the ghost tab. While toggled on, ghosts can perform health scans on humanoids and cyborgs by left clicking on them
+
+
TDSSS updated:
+
+
syndicate fax machine to lavaland syndie base.
+
syndicate lavaland base self destruct now requires syndie access.
+
moved headsets in lavaland syndie base.
+
Gave the HoP fax long-ranged faxing capabilities.
+
midround event spawned xeno larva now need less time to grow up and evolve.
+
cult talisman got unique icons to tell them apart
+
mining hardsuits come with helmets now again
+
+
Tayyyyyyy updated:
+
+
Whether you join the ERT is no longer determined by how fast you click "yes" on the prompt.
+
Drag and drop support and 20 seconds to pick ERT role instead of 15
+
Fix extra newline after field and disable Github Flavored Markdown in papers (normal markdown still works)
+
autogenerated papers no longer appear as HTML code
+
message window links added to PM send receipt
+
Many shuttle flight directions fixed
+
+
TheSardele updated:
+
+
All-In-one Grinders can now be constructed and upgraded
+
All-In-one Grinders now produce more reagents when upgraded.
+
Icon for cybernetic eyes
+
Sleeping while drunk no longer makes you more drunk.
+
+
dovydas12345 updated:
+
+
Fixes being able to pick up chairs and stools when you have items in both hand or when you don't have hands.
+
Adds a ERT shuttle console which is accessible to ERT members
+
+
farie82 updated:
+
+
Rigging a crate now doesn't delete your coil stack anymore but instead uses 15 of it. Borgs can use it safely again
+
+
kazboo updated:
+
+
adjusts the hierophant blast layer to make for it to always be below the effect. this should be the case already due to mouse_opacity, though for some unknown reason, it just doesn't work sometimes, so this should fix it.
+
+
12 August 2019
AffectedArc07 updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index ef20fb58092..647b9735e00 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -10648,3 +10648,174 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
kazboo:
- tweak: changed the display name shown to a player upon being frozen in a manner
that only the admins ckey is displayed, not the character name along with it
+2019-08-23:
+ AffectedArc07, Keekenox, Floyd/Qustinnus:
+ - rscadd: P A R A L L A X (That fancy space thing)
+ - imageadd: Adds a new Parallax layer that resembles Lavaland (Lava Planet), it
+ spawns on a random location near the station. You need your parallax on high
+ to see it.
+ Arkatos:
+ - imageadd: Added colored pillbottles
+ - rscadd: Added an option to change color of the pillbottles to ChemMaster3000
+ - rscadd: Added new description to patch packs
+ - tweak: Jump to Node ability now shows a location of each Blob node
+ - rscadd: Added SlimeHUD when playing as a slime. This means slimes will have their
+ own unique health doll and pull icon.
+ - rscadd: Action buttons can now be dragged onto each other to swap places
+ - bugfix: Fixed a case where dragging locked action buttons could result in white
+ tooltip over the screen
+ AzuleUtama:
+ - tweak: 'The Traitor thermal glasses and chameleon security HUD now use the updated
+ chameleon code. balance: Traitor thermal glasses will no longer cause eye damage
+ when hit with EMP.'
+ Citinited:
+ - rscdel: Removes the big pipe dispensers from atmospherics, you can still find
+ them elsewhere.
+ Couls:
+ - rscadd: After many complaints about being stuck in medbay. NT has modified all
+ the airlocks on the station to allow leaving certain departments without requiring
+ an respective ID. This new modification is indicated by a white light near the
+ airlocks in the direction of unrestricted access.
+ - rscadd: New unrestricted access can be built by NT engineers through modification
+ of the airlock electronics.
+ - rscadd: hit effects!
+ - imageadd: hit effect sprites for lasers, bullet hole and dent decals for walls
+ - tweak: mice now have a very low chance of chewing through wires, this kills them
+ if the wire is powered
+ - rscadd: You can now homerun things thrown at you with a baseball bat!
+ - tweak: new baseball hit noise, new baseball sprite
+ - tweak: there are much less one-way airlocks on station
+ DoctorDrugs:
+ - tweak: removed the ability to eat the divine vocal cords
+ EmanTheAlmighty:
+ - rscadd: The AI can now change its intent by clicking on the new on-screen button
+ or pressing 4 to switch to help or harm.
+ - tweak: The AI can now toggle airlock safeties instead of toggling door bolt lights
+ by pressing middle mouse.
+ Fox McCloud:
+ - rscadd: Majorly updates lavaland
+ - rscadd: Miner starting equipment altered. They now start with a kinetic accelerator
+ - rscadd: Miners start off with a mini pickaxe
+ - rscadd: Adds in the boxed implant kit, regular shelter capsule, and mining drone
+ passthrough upgrade to the mining equipment vendor
+ - tweak: re-ordered the equipment vendor, so things are grouped together more logically
+ - rscadd: Added a number of new kinetic accelerator upgrades acquirable through
+ tendril chests
+ - tweak: Mining bot now uses an actual kinetic accelerator as opposed to a "Look
+ alike"; you can upgrade its internal gun with various kinetic accelerator modkits.
+ - tweak: Sentient mining bot nerfed; you can no longer apply the armor or melee
+ buff to them; offset by the fact you can upgrade their kinetic gun.
+ - tweak: Indoor pressure mod removed from R&D and made into a miner traitor item
+ - tweak: Resonators have an increased amount of fields and do more damage in low
+ pressure. Additionally, if you place a field on a tile that already has a field,
+ it'll cause it to detonate early
+ - tweak: Plasmacutter no longer does increased damage in low pressure, Advanced
+ plasma cutter does slightly more base damage but has a bit less range. Price
+ has been cut at R&D
+ - rscdel: removed the AoE Mob+Turf upgrade for mining pods
+ - bugfix: Fixes ripleys being slow on lavaland
+ - bugfix: Fixes walking on lavaland sounding like walking on metal plating
+ - rscadd: Adds in kinetic crusher trophies
+ - tweak: Kinetic crusher can be wielded/unwielded (but you can't attack with it
+ unwielded)
+ - rscadd: Adds the HECK suit as Bubblegum loot
+ - rscadd: Adds the kinetic accelerator bounty mod as Tendril loot
+ - rscadd: Add fulton extract packs to the mining vendor; rescue precious valuable
+ or dead miners!
+ - tweak: Adds mini-fans to the mining, engineering, and security shuttles
+ - rscadd: 'Adds a number of primal recipes: rake (cultivator), wooden bucket, firebrand
+ (long burning match), and bone bracers (armored arm protection that goes on
+ your glove slot)'
+ - rscadd: Can attach bayonets to C20rs, bolt action rifles, security auto-rifles,
+ and kinetic accelerator; harm intent to stab with them
+ - rscadd: can craft ore boxes out of wood
+ - bugfix: Skull helmets are now proper helmets
+ - tweak: Survival autoinjectors tweaked
+ - rscadd: Survival autoinjectors have 15 units of teporone in them
+ - tweak: Survival autoinjectors have double the epinpehrine and weak omnizine instead
+ of saline glucose.
+ - tweak: lavaland extract altered; it no longer heals tox or oxy, and heals slightly
+ less brute and burn, but has nearly halved the metabolization rate and has a
+ less harsh overdose
+ - bugfix: Fixes airlocks spamming their open and close when you stand in them
+ - bugfix: Fixes overriden door timers not working
+ Fox McCloud and FullofSkittles:
+ - rscadd: Changes the Venus Human Flytrap sprite
+ Ionward:
+ - imageadd: Adjusted Greys uniforms and backpack sprites.
+ - imageadd: Added a bunch of Drask masks and glasses.
+ - imageadd: Added God Eye sprites for Greys, Drask, and Vox.
+ JKnutson101:
+ - bugfix: Issue where Emergency NanoMed Vendors required Medical ID to Access.
+ - rscadd: Added the ability for cyborgs with zero battery to use the 'succumb' verb.
+ Markolie:
+ - tweak: Players now have thirty seconds instead of just five seconds to select
+ if they want to be somebody's butler through a die of fate roll.
+ - bugfix: The Netherworld portal is now properly destroyed upon being killed. In
+ addition, its max health is now equal to its starting health.
+ - tweak: The iron ore sprite that shows up when using the miner scanner no longer
+ has a background, making it blend in better with the actual rock.
+ - bugfix: Tightening the bolts of a falsewall now works properly.
+ - tweak: Deconstructing plating now requires it to be unfastened using a screwdriver
+ first, in order to prevent it from being accidentally deconstructed with a welder.
+ Quantum-M:
+ - tweak: 'Minor grammar edits to the text that tells you that your thirst is dealt
+ with but no blood power is given. balance: Vampires are no longer able to drink
+ get power from ckeyless humanoid monkeys, they will now need to hunt down actual
+ characters with ckey to get power.'
+ Shadow-Quill:
+ - tweak: Mass drivers now need two rods/cable coil instead of three to construct.
+ - bugfix: The RD's office door can now be opened by the RD, instead of by just the
+ Captain.
+ - tweak: Science lockdown can now only be (de)activated by the RD, instead of any
+ scientist.
+ - tweak: Using a health analyzer in-hand will switch the verbosity.
+ - bugfix: You no longer have to unscrew a plating to repair it.
+ - bugfix: The shivering symptom in virology now properly chills people.
+ SteelSlayer:
+ - bugfix: Wizard rounds now end if all wizards and apprentices are either dead,
+ inside cyborgs, or in MMIs
+ - tweak: Re-enabled the wizard's hud. Wizards can now see their own antag icon along
+ with seeing other wizard's and apprentice's icons
+ - bugfix: When a cult sacrifice target leaves the round via cryo, the game will
+ reassign a new target for them
+ - rscadd: Added an alarm sound that plays for cultists when their sacrifice target
+ leave the round via cryo
+ - rscadd: When a cult sacrifice target leaves the round via cryo, the game will
+ update every cultist's notes to reflect the change
+ - rscadd: Adds a new verb named "Toggle Health Scan" to the ghost tab. While toggled
+ on, ghosts can perform health scans on humanoids and cyborgs by left clicking
+ on them
+ TDSSS:
+ - rscadd: syndicate fax machine to lavaland syndie base.
+ - tweak: syndicate lavaland base self destruct now requires syndie access.
+ - tweak: moved headsets in lavaland syndie base.
+ - tweak: Gave the HoP fax long-ranged faxing capabilities.
+ - tweak: midround event spawned xeno larva now need less time to grow up and evolve.
+ - tweak: cult talisman got unique icons to tell them apart
+ - bugfix: mining hardsuits come with helmets now again
+ Tayyyyyyy:
+ - tweak: Whether you join the ERT is no longer determined by how fast you click
+ "yes" on the prompt.
+ - tweak: Drag and drop support and 20 seconds to pick ERT role instead of 15
+ - bugfix: Fix extra newline after field and disable Github Flavored Markdown in
+ papers (normal markdown still works)
+ - bugfix: autogenerated papers no longer appear as HTML code
+ - tweak: message window links added to PM send receipt
+ - bugfix: Many shuttle flight directions fixed
+ TheSardele:
+ - rscadd: All-In-one Grinders can now be constructed and upgraded
+ - rscadd: All-In-one Grinders now produce more reagents when upgraded.
+ - rscadd: Icon for cybernetic eyes
+ - bugfix: Sleeping while drunk no longer makes you more drunk.
+ dovydas12345:
+ - bugfix: Fixes being able to pick up chairs and stools when you have items in both
+ hand or when you don't have hands.
+ - rscadd: Adds a ERT shuttle console which is accessible to ERT members
+ farie82:
+ - bugfix: Rigging a crate now doesn't delete your coil stack anymore but instead
+ uses 15 of it. Borgs can use it safely again
+ kazboo:
+ - bugfix: adjusts the hierophant blast layer to make for it to always be below the
+ effect. this should be the case already due to mouse_opacity, though for some
+ unknown reason, it just doesn't work sometimes, so this should fix it.
diff --git a/html/changelogs/AutoChangeLog-pr-11712.yml b/html/changelogs/AutoChangeLog-pr-11712.yml
new file mode 100644
index 00000000000..ed9937e57c6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11712.yml
@@ -0,0 +1,9 @@
+author: "Markolie"
+delete-after: True
+changes:
+ - rscadd: "A new outfit manager has been added for admins (under debug). It lets them save and load custom outfits on their computer and use these to equip players."
+ - rscadd: "Upon transforming players into humans or reincarnating them through the player panel, admins will now directly be able to select their equipment."
+ - rscadd: "The select equipment verb now works on observers: it'll create a human with the given equipment under the ghost."
+ - rscadd: "A \"Copy Outfit\" button has been added to the View Variables dropdown, which lets admins instantly copy an outfit."
+ - rscadd: "Outfits now support accessories and internal boxes."
+ - rscdel: "The separate option to equip ERT members has been removed. It's been integrated into their regular outfits."
diff --git a/html/changelogs/AutoChangeLog-pr-11719.yml b/html/changelogs/AutoChangeLog-pr-11719.yml
new file mode 100644
index 00000000000..26164747593
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11719.yml
@@ -0,0 +1,5 @@
+author: "Terilia"
+delete-after: True
+changes:
+ - rscadd: "added headcrabs"
+ - tweak: "adjusted the path's for headslugs. They are not called headcrab anymore"
diff --git a/html/changelogs/AutoChangeLog-pr-11741.yml b/html/changelogs/AutoChangeLog-pr-11741.yml
deleted file mode 100644
index f169e75b08a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11741.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "AzuleUtama"
-delete-after: True
-changes:
- - tweak: "The Traitor thermal glasses and chameleon security HUD now use the updated chameleon code.
-balance: Traitor thermal glasses will no longer cause eye damage when hit with EMP."
diff --git a/html/changelogs/AutoChangeLog-pr-11762.yml b/html/changelogs/AutoChangeLog-pr-11762.yml
new file mode 100644
index 00000000000..e1aeb4f2529
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11762.yml
@@ -0,0 +1,4 @@
+author: "AzuleUtama"
+delete-after: True
+changes:
+ - rscadd: "Adds false-bottomed briefcase from VG."
diff --git a/html/changelogs/AutoChangeLog-pr-11767.yml b/html/changelogs/AutoChangeLog-pr-11767.yml
deleted file mode 100644
index a1ab9b83753..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11767.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "Arkatos"
-delete-after: True
-changes:
- - imageadd: "Added colored pillbottles"
- - rscadd: "Added an option to change color of the pillbottles to ChemMaster3000"
- - rscadd: "Added new description to patch packs"
diff --git a/html/changelogs/AutoChangeLog-pr-11769.yml b/html/changelogs/AutoChangeLog-pr-11769.yml
deleted file mode 100644
index 610e9401fb5..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11769.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Couls"
-delete-after: True
-changes:
- - rscadd: "After many complaints about being stuck in medbay. NT has modified all the airlocks on the station to allow leaving certain departments without requiring an respective ID. This new modification is indicated by a white light near the airlocks in the direction of unrestricted access."
- - rscadd: "New unrestricted access can be built by NT engineers through modification of the airlock electronics."
diff --git a/html/changelogs/AutoChangeLog-pr-11772.yml b/html/changelogs/AutoChangeLog-pr-11772.yml
new file mode 100644
index 00000000000..a59b8791f03
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11772.yml
@@ -0,0 +1,6 @@
+author: "Couls"
+delete-after: True
+changes:
+ - rscadd: "Rechargers can now be crafted from science using one capacitor and a recharger board
+tweak:Smaller machines like microwaves and cell chargers can now be placed on tables(Fax machines included)
+tweak:can screwdriver open rechargers and then apply a crowbar to deconstruct them"
diff --git a/html/changelogs/AutoChangeLog-pr-11774.yml b/html/changelogs/AutoChangeLog-pr-11774.yml
deleted file mode 100644
index 2671e0bd231..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11774.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arkatos"
-delete-after: True
-changes:
- - tweak: "Jump to Node ability now shows a location of each Blob node"
diff --git a/html/changelogs/AutoChangeLog-pr-11776.yml b/html/changelogs/AutoChangeLog-pr-11776.yml
deleted file mode 100644
index 6040b3f474a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11776.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Arkatos"
-delete-after: True
-changes:
- - rscadd: "Added SlimeHUD when playing as a slime. This means slimes will have their own unique health doll and pull icon."
diff --git a/html/changelogs/AutoChangeLog-pr-11783.yml b/html/changelogs/AutoChangeLog-pr-11783.yml
deleted file mode 100644
index 11c3bec4ac4..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11783.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Couls"
-delete-after: True
-changes:
- - rscadd: "hit effects!"
- - imageadd: "hit effect sprites for lasers, bullet hole and dent decals for walls"
diff --git a/html/changelogs/AutoChangeLog-pr-11797.yml b/html/changelogs/AutoChangeLog-pr-11797.yml
new file mode 100644
index 00000000000..58464c2997d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11797.yml
@@ -0,0 +1,4 @@
+author: "Couls"
+delete-after: True
+changes:
+ - tweak: "Blood spread now depends on volume of the blood, requires more drips of blood to create a pool"
diff --git a/html/changelogs/AutoChangeLog-pr-11807.yml b/html/changelogs/AutoChangeLog-pr-11807.yml
deleted file mode 100644
index 1dac37526db..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11807.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Tayyyyyyy"
-delete-after: True
-changes:
- - tweak: "Whether you join the ERT is no longer determined by how fast you click \"yes\" on the prompt."
- - tweak: "Drag and drop support and 20 seconds to pick ERT role instead of 15"
diff --git a/html/changelogs/AutoChangeLog-pr-11810.yml b/html/changelogs/AutoChangeLog-pr-11810.yml
deleted file mode 100644
index b87ad624c90..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11810.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Arkatos"
-delete-after: True
-changes:
- - rscadd: "Action buttons can now be dragged onto each other to swap places"
- - bugfix: "Fixed a case where dragging locked action buttons could result in white tooltip over the screen"
diff --git a/html/changelogs/AutoChangeLog-pr-11827.yml b/html/changelogs/AutoChangeLog-pr-11827.yml
deleted file mode 100644
index 584dfed8901..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11827.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "TDSSS"
-delete-after: True
-changes:
- - tweak: "Gave the HoP fax long-ranged faxing capabilities."
diff --git a/html/changelogs/AutoChangeLog-pr-11830.yml b/html/changelogs/AutoChangeLog-pr-11830.yml
deleted file mode 100644
index f64dd5490f1..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11830.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "EmanTheAlmighty"
-delete-after: True
-changes:
- - rscadd: "The AI can now change its intent by clicking on the new on-screen button or pressing 4 to switch to help or harm."
diff --git a/html/changelogs/AutoChangeLog-pr-11833.yml b/html/changelogs/AutoChangeLog-pr-11833.yml
deleted file mode 100644
index 2e7470e33cb..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11833.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "dovydas12345"
-delete-after: True
-changes:
- - bugfix: "Fixes being able to pick up chairs and stools when you have items in both hand or when you don't have hands."
diff --git a/html/changelogs/AutoChangeLog-pr-11834.yml b/html/changelogs/AutoChangeLog-pr-11834.yml
deleted file mode 100644
index 99a23206448..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11834.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "dovydas12345"
-delete-after: True
-changes:
- - rscadd: "Adds a ERT shuttle console which is accessible to ERT members"
diff --git a/html/changelogs/AutoChangeLog-pr-11843.yml b/html/changelogs/AutoChangeLog-pr-11843.yml
deleted file mode 100644
index ace0ff2485b..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11843.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "JKnutson101"
-delete-after: True
-changes:
- - bugfix: "Issue where Emergency NanoMed Vendors required Medical ID to Access."
diff --git a/html/changelogs/AutoChangeLog-pr-11844.yml b/html/changelogs/AutoChangeLog-pr-11844.yml
deleted file mode 100644
index 448d227c770..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11844.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "JKnutson101"
-delete-after: True
-changes:
- - rscadd: "Added the ability for cyborgs with zero battery to use the 'succumb' verb."
diff --git a/html/changelogs/AutoChangeLog-pr-11845.yml b/html/changelogs/AutoChangeLog-pr-11845.yml
deleted file mode 100644
index 2582e3c3752..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11845.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Tayyyyyyy"
-delete-after: True
-changes:
- - bugfix: "Fix extra newline after field and disable Github Flavored Markdown in papers (normal markdown still works)"
- - bugfix: "autogenerated papers no longer appear as HTML code"
diff --git a/html/changelogs/AutoChangeLog-pr-11862.yml b/html/changelogs/AutoChangeLog-pr-11862.yml
new file mode 100644
index 00000000000..ecd4aa0fa8b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11862.yml
@@ -0,0 +1,4 @@
+author: "Ty-Omaha"
+delete-after: True
+changes:
+ - bugfix: "Fixed a bug where hotwiring solar panels would allow for the station to remain powered in the Grid Check power failure event."
diff --git a/html/changelogs/AutoChangeLog-pr-11863.yml b/html/changelogs/AutoChangeLog-pr-11863.yml
deleted file mode 100644
index ebbb86a7e35..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11863.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "EmanTheAlmighty"
-delete-after: True
-changes:
- - tweak: "The AI can now toggle airlock safeties instead of toggling door bolt lights by pressing middle mouse."
diff --git a/html/changelogs/AutoChangeLog-pr-11868.yml b/html/changelogs/AutoChangeLog-pr-11868.yml
new file mode 100644
index 00000000000..87571fc57e0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11868.yml
@@ -0,0 +1,6 @@
+author: "SteelSlayer"
+delete-after: True
+changes:
+ - bugfix: "You can no longer spam dismantle a SMES terminal and get 10 cable for every progress bar"
+ - bugfix: "The game will properly remove 10 cable from your stack after building a SMES terminal, instead of removing 0"
+ - rscadd: "A cable adding sound gets played when you add wires to create a terminal for a SMES"
diff --git a/html/changelogs/AutoChangeLog-pr-11875.yml b/html/changelogs/AutoChangeLog-pr-11875.yml
deleted file mode 100644
index 35009a885a0..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11875.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "SteelSlayer"
-delete-after: True
-changes:
- - bugfix: "Wizard rounds now end if all wizards and apprentices are either dead, inside cyborgs, or in MMIs"
- - tweak: "Re-enabled the wizard's hud. Wizards can now see their own antag icon along with seeing other wizard's and apprentice's icons"
diff --git a/html/changelogs/AutoChangeLog-pr-11894.yml b/html/changelogs/AutoChangeLog-pr-11894.yml
deleted file mode 100644
index 1257ab8f981..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11894.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "TheSardele"
-delete-after: True
-changes:
- - rscadd: "All-In-one Grinders can now be constructed and upgraded"
- - rscadd: "All-In-one Grinders now produce more reagents when upgraded."
diff --git a/html/changelogs/AutoChangeLog-pr-11899.yml b/html/changelogs/AutoChangeLog-pr-11899.yml
deleted file mode 100644
index 95579acd428..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11899.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: "SteelSlayer"
-delete-after: True
-changes:
- - bugfix: "When a cult sacrifice target leaves the round via cryo, the game will reassign a new target for them"
- - rscadd: "Added an alarm sound that plays for cultists when their sacrifice target leave the round via cryo"
- - rscadd: "When a cult sacrifice target leaves the round via cryo, the game will update every cultist's notes to reflect the change"
diff --git a/html/changelogs/AutoChangeLog-pr-11921.yml b/html/changelogs/AutoChangeLog-pr-11921.yml
new file mode 100644
index 00000000000..d55a327c310
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11921.yml
@@ -0,0 +1,4 @@
+author: "Couls"
+delete-after: True
+changes:
+ - rscadd: "new chatsubsystem from TG!"
diff --git a/html/changelogs/AutoChangeLog-pr-11932.yml b/html/changelogs/AutoChangeLog-pr-11932.yml
deleted file mode 100644
index 787271cc390..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11932.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "TheSardele"
-delete-after: True
-changes:
- - rscadd: "Icon for cybernetic eyes"
diff --git a/html/changelogs/AutoChangeLog-pr-11936.yml b/html/changelogs/AutoChangeLog-pr-11936.yml
new file mode 100644
index 00000000000..bec331efe04
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11936.yml
@@ -0,0 +1,4 @@
+author: "farie82"
+delete-after: True
+changes:
+ - bugfix: "Items with NODROP that are dropped now lose the flag if they didn't get created with it"
diff --git a/html/changelogs/AutoChangeLog-pr-11937.yml b/html/changelogs/AutoChangeLog-pr-11937.yml
deleted file mode 100644
index 6c4eb842bda..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11937.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "farie82"
-delete-after: True
-changes:
- - bugfix: "Rigging a crate now doesn't delete your coil stack anymore but instead uses 15 of it. Borgs can use it safely again"
diff --git a/html/changelogs/AutoChangeLog-pr-11940.yml b/html/changelogs/AutoChangeLog-pr-11940.yml
new file mode 100644
index 00000000000..412460535f2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11940.yml
@@ -0,0 +1,4 @@
+author: "Couls"
+delete-after: True
+changes:
+ - tweak: "Update issue templates to latest version and clean up the current template"
diff --git a/html/changelogs/AutoChangeLog-pr-11941.yml b/html/changelogs/AutoChangeLog-pr-11941.yml
new file mode 100644
index 00000000000..5654ca5bdcf
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11941.yml
@@ -0,0 +1,10 @@
+author: "farie82"
+delete-after: True
+changes:
+ - rscadd: "Adds tip text to the examine text of the ambulance trolley about how to attach it"
+ - rscadd: "Adds tip text to the nuke when trying to use the NAD before deploying it"
+ - rscadd: "Adds tip text to the fire axe cabinet about how to lock/unlock it"
+ - rscadd: "Adds tip text to airlocks if they have a note on them about how to remove the note"
+ - bugfix: "Can't put the NAD in the nuke now when it has the NODROP flag"
+ - bugfix: "Locking a fire axe cabinet is less weird now. No odd 5 seconds sleep"
+ - bugfix: "Can't put a nodrop fire axe in fire axe cabinets now. Duping them"
diff --git a/html/changelogs/AutoChangeLog-pr-11948.yml b/html/changelogs/AutoChangeLog-pr-11948.yml
new file mode 100644
index 00000000000..a7048eee037
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11948.yml
@@ -0,0 +1,9 @@
+author: "EmanTheAlmighty"
+delete-after: True
+changes:
+ - rscadd: "Blobbernauts can now be controlled by players through a prompt which appears when they are spawned by blobs."
+ - rscadd: "Blobbernauts and blobs can now communicate with each other."
+ - rscadd: "Blobbernauts now regenerate health overtime when standing on blob structures."
+ - rscadd: "Blobbernauts will slowly lose health if they are not standing on blob structures while not at full health.
+balance: Blobbernauts have been nerfed, they now have less health, deal less damage and cannot break walls anymore.
+balance: Blob's \"Produce Blobbernaut\" ability has been made more expensive to use, now costing 60 resources instead of 20."
diff --git a/html/changelogs/AutoChangeLog-pr-11949.yml b/html/changelogs/AutoChangeLog-pr-11949.yml
deleted file mode 100644
index 12b6be236a3..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11949.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kazboo"
-delete-after: True
-changes:
- - bugfix: "adjusts the hierophant blast layer to make for it to always be below the effect. this should be the case already due to mouse_opacity, though for some unknown reason, it just doesn't work sometimes, so this should fix it."
diff --git a/html/changelogs/AutoChangeLog-pr-11957.yml b/html/changelogs/AutoChangeLog-pr-11957.yml
new file mode 100644
index 00000000000..6e23f4bd87f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11957.yml
@@ -0,0 +1,5 @@
+author: "FreeStylaLT"
+delete-after: True
+changes:
+ - rscadd: "Added an Engine Picker, which uses new engine beacons."
+ - tweak: "Replaced the current two engine generators with one engine beacon."
diff --git a/html/changelogs/AutoChangeLog-pr-11965.yml b/html/changelogs/AutoChangeLog-pr-11965.yml
deleted file mode 100644
index f70891de781..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11965.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "TDSSS"
-delete-after: True
-changes:
- - tweak: "cult talisman got unique icons to tell them apart"
diff --git a/html/changelogs/AutoChangeLog-pr-11978.yml b/html/changelogs/AutoChangeLog-pr-11978.yml
new file mode 100644
index 00000000000..6a3cce38167
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11978.yml
@@ -0,0 +1,9 @@
+author: "KasparoVy"
+delete-after: True
+changes:
+ - imageadd: "Adds sprites for all Vox & Armalis earwear."
+ - imageadd: "Adds sprites for Armalis default backpack, nitrogen tank (old-style back & new-style belt) & all breath mask variations."
+ - rscadd: "You can now species-fit in-hand icons: Use a single .dmi file and suffix the icon states with _l or _r."
+ - bugfix: "Fixes an issue preventing Vox Armalis from being rendered with the proper in-hand icons for their massive noise cannons."
+ - bugfix: "Fixes an issue preventing the species-fitting of earwear."
+ - bugfix: "Fixes an issue preventing Vox Armalis from wearing the 'Vox' breath mask."
diff --git a/html/changelogs/AutoChangeLog-pr-11980.yml b/html/changelogs/AutoChangeLog-pr-11980.yml
deleted file mode 100644
index 55028f62e4d..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11980.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "TheSardele"
-delete-after: True
-changes:
- - bugfix: "Sleeping while drunk no longer makes you more drunk."
diff --git a/html/changelogs/AutoChangeLog-pr-11981.yml b/html/changelogs/AutoChangeLog-pr-11981.yml
deleted file mode 100644
index 2e17430b9a9..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11981.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-author: "Fox McCloud"
-delete-after: True
-changes:
- - rscadd: "Majorly updates lavaland"
- - rscadd: "Miner starting equipment altered. They now start with a kinetic accelerator"
- - rscadd: "Miners start off with a mini pickaxe"
- - rscadd: "Adds in the boxed implant kit, regular shelter capsule, and mining drone passthrough upgrade to the mining equipment vendor"
- - tweak: "re-ordered the equipment vendor, so things are grouped together more logically"
- - rscadd: "Added a number of new kinetic accelerator upgrades acquirable through tendril chests"
- - tweak: "Mining bot now uses an actual kinetic accelerator as opposed to a \"Look alike\"; you can upgrade its internal gun with various kinetic accelerator modkits."
- - tweak: "Sentient mining bot nerfed; you can no longer apply the armor or melee buff to them; offset by the fact you can upgrade their kinetic gun."
- - tweak: "Indoor pressure mod removed from R&D and made into a miner traitor item"
- - tweak: "Resonators have an increased amount of fields and do more damage in low pressure. Additionally, if you place a field on a tile that already has a field, it'll cause it to detonate early"
- - tweak: "Plasmacutter no longer does increased damage in low pressure, Advanced plasma cutter does slightly more base damage but has a bit less range. Price has been cut at R&D"
- - rscdel: "removed the AoE Mob+Turf upgrade for mining pods"
- - bugfix: "Fixes ripleys being slow on lavaland"
diff --git a/html/changelogs/AutoChangeLog-pr-11984.yml b/html/changelogs/AutoChangeLog-pr-11984.yml
deleted file mode 100644
index 49600d2025b..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11984.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Markolie"
-delete-after: True
-changes:
- - tweak: "Players now have thirty seconds instead of just five seconds to select if they want to be somebody's butler through a die of fate roll."
- - bugfix: "The Netherworld portal is now properly destroyed upon being killed. In addition, its max health is now equal to its starting health."
diff --git a/html/changelogs/AutoChangeLog-pr-11987.yml b/html/changelogs/AutoChangeLog-pr-11987.yml
new file mode 100644
index 00000000000..e7ed3c0b338
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11987.yml
@@ -0,0 +1,13 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - tweak: "Plasmamen dramatically overhauled."
+ - rscadd: "Plasmamen can be cloned without burning to death in the clonepod"
+ - rscdel: "Plasmamen no longer start with spacesuits"
+ - rscadd: "Plasmamen start off with jumpsuits that seal to protect against oxygen. This allows for you to customize their appearance more"
+ - tweak: "Plasmamen helmets now allow you to see a Plasmaman's actual face; should be able to see their eye color and mouth color now"
+ - tweak: "Plasmamen take 50% extra brute and burn"
+ - rscadd: "Plasmamen are immune to radiation"
+ - tweak: "Plasmamen start out with a small tank that can fit on a belt or in a pocket; it should be enough to last an entire shift"
+ - rscadd: "Plasmaman helmets now have built in welding goggles"
+ - tweak: "Plasmaman karma cost lowered from 100 to 45"
diff --git a/html/changelogs/AutoChangeLog-pr-11995.yml b/html/changelogs/AutoChangeLog-pr-11995.yml
deleted file mode 100644
index 63e511de1e9..00000000000
--- a/html/changelogs/AutoChangeLog-pr-11995.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Markolie"
-delete-after: True
-changes:
- - tweak: "The iron ore sprite that shows up when using the miner scanner no longer has a background, making it blend in better with the actual rock."
diff --git a/html/changelogs/AutoChangeLog-pr-12017.yml b/html/changelogs/AutoChangeLog-pr-12017.yml
deleted file mode 100644
index 050f27f75d4..00000000000
--- a/html/changelogs/AutoChangeLog-pr-12017.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Fox McCloud"
-delete-after: True
-changes:
- - bugfix: "Fixes walking on lavaland sounding like walking on metal plating"
diff --git a/html/changelogs/AutoChangeLog-pr-12029.yml b/html/changelogs/AutoChangeLog-pr-12029.yml
new file mode 100644
index 00000000000..3677a1afea3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12029.yml
@@ -0,0 +1,10 @@
+author: "Shadow-Quill"
+delete-after: True
+changes:
+ - rscadd: "[Meta] Added buckshot and slugs to armoury."
+ - rscadd: "[Meta] Added surgical tools, robotic first aid kits, and a photocopier to Robotics."
+ - bugfix: "[Meta] R&D doors now has proper access requirements."
+ - rscadd: "[Meta] Added RCS and telepad to cargo."
+ - bugfix: "[Meta] Disposals sheet stacker and conveyor belts now works properly."
+ - rscadd: "[Meta] One-way airlocks added in Medbay/Brig."
+ - tweak: "[Meta] Disposals sheet stacker disposals chute leads directly to the mailroom."
diff --git a/html/changelogs/AutoChangeLog-pr-12037.yml b/html/changelogs/AutoChangeLog-pr-12037.yml
new file mode 100644
index 00000000000..307b70d781f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12037.yml
@@ -0,0 +1,4 @@
+author: "Couls"
+delete-after: True
+changes:
+ - rscadd: "mining shuttle warning message and delay before launching"
diff --git a/html/changelogs/AutoChangeLog-pr-12038.yml b/html/changelogs/AutoChangeLog-pr-12038.yml
new file mode 100644
index 00000000000..f241cfc6c23
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12038.yml
@@ -0,0 +1,4 @@
+author: "Shadow-Quill"
+delete-after: True
+changes:
+ - bugfix: "AIs not being able to restore their own power if in an area with an APC."
diff --git a/html/changelogs/AutoChangeLog-pr-12063.yml b/html/changelogs/AutoChangeLog-pr-12063.yml
new file mode 100644
index 00000000000..49e805f3dc5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12063.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - bugfix: "Fixes stun absorbing not working"
diff --git a/html/changelogs/AutoChangeLog-pr-12064.yml b/html/changelogs/AutoChangeLog-pr-12064.yml
new file mode 100644
index 00000000000..383526fbbb8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12064.yml
@@ -0,0 +1,5 @@
+author: "Fox McCloud and FullOfSkittles"
+delete-after: True
+changes:
+ - tweak: "Tweaks the gummy worm, gummy bear, jeallybean, toffee, and bacon sprites"
+ - bugfix: "Fixes telebacon not properly acting as...well, a bacon beacon"
diff --git a/html/changelogs/AutoChangeLog-pr-12065.yml b/html/changelogs/AutoChangeLog-pr-12065.yml
new file mode 100644
index 00000000000..865de5c6587
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12065.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - bugfix: "Fixes parallax insane setting not doing anything"
diff --git a/html/changelogs/AutoChangeLog-pr-12066.yml b/html/changelogs/AutoChangeLog-pr-12066.yml
new file mode 100644
index 00000000000..71c585e6514
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12066.yml
@@ -0,0 +1,11 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - tweak: "Ores can be destroyed by devastating explosions"
+ - tweak: "silver, gold, and diamond pickaxes do a bit more damage and mine faster than before"
+ - tweak: "drills slightly slower, but diamond drills slightly faster"
+ - tweak: "Spade is the same speed as a shovel"
+ - tweak: "Hivelord stabilizer will now make a hivelord core/legion soul stabilize and be preserved, even if it was previously inert"
+ - tweak: "can use a hivelord core in your active hand to apply it to yourself"
+ - rscadd: "soulstone in the abandoned locked crates can now be used by anyone"
+ - rscadd: "Adds firelemon seeds to the abandoned locked crates as potential loot"
diff --git a/html/changelogs/AutoChangeLog-pr-12073.yml b/html/changelogs/AutoChangeLog-pr-12073.yml
new file mode 100644
index 00000000000..a44956c76c2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12073.yml
@@ -0,0 +1,11 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - tweak: "Hardsuits have an integrated helmet; you no longer have to attach helmets"
+ - tweak: "Toggling up/down helmets is now done with an action button"
+ - rscdel: "can no longer attach magboots to a hardsuit"
+ - tweak: "Hardsuit base melee armor increased from 10 to 30"
+ - tweak: "Security and HoS hardsuit melee armor increased by 5"
+ - tweak: "HoS hardsuit helmet armor matches his hardsuit"
+ - tweak: "CE's hardsuit helmet armor for rads increased by 10 (should be fully rad proof now)"
+ - tweak: "Elite syndicate suits can't be acided"
diff --git a/html/changelogs/AutoChangeLog-pr-12078.yml b/html/changelogs/AutoChangeLog-pr-12078.yml
new file mode 100644
index 00000000000..d5724a2983f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12078.yml
@@ -0,0 +1,4 @@
+author: "SteelSlayer"
+delete-after: True
+changes:
+ - rscadd: "Adds a handheld defibrillator to the paramedic EVA closet"
diff --git a/html/changelogs/AutoChangeLog-pr-12079.yml b/html/changelogs/AutoChangeLog-pr-12079.yml
new file mode 100644
index 00000000000..06e129f082d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12079.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - bugfix: "Fixes stuns and weakens related to reagents"
diff --git a/html/changelogs/AutoChangeLog-pr-12080.yml b/html/changelogs/AutoChangeLog-pr-12080.yml
new file mode 100644
index 00000000000..14c3e841fd6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12080.yml
@@ -0,0 +1,4 @@
+author: "SteelSlayer"
+delete-after: True
+changes:
+ - bugfix: "You can insert magazines into L6 SAWs again"
diff --git a/html/changelogs/AutoChangeLog-pr-12081.yml b/html/changelogs/AutoChangeLog-pr-12081.yml
new file mode 100644
index 00000000000..931893453db
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12081.yml
@@ -0,0 +1,4 @@
+author: "farie82"
+delete-after: True
+changes:
+ - bugfix: "Implants like the IPC charging work again. They won't get deleted after first use"
diff --git a/html/changelogs/AutoChangeLog-pr-12086.yml b/html/changelogs/AutoChangeLog-pr-12086.yml
new file mode 100644
index 00000000000..6158c7794bd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12086.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - bugfix: "Fixes the displayed cost of Plasmamen"
diff --git a/html/changelogs/AutoChangeLog-pr-12087.yml b/html/changelogs/AutoChangeLog-pr-12087.yml
new file mode 100644
index 00000000000..adab7cd382d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12087.yml
@@ -0,0 +1,4 @@
+author: "KasparoVy"
+delete-after: True
+changes:
+ - bugfix: "Picking up uniforms no longer renders a default grey jumpsuit on Vox."
diff --git a/html/changelogs/AutoChangeLog-pr-12088.yml b/html/changelogs/AutoChangeLog-pr-12088.yml
new file mode 100644
index 00000000000..69587923bc9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12088.yml
@@ -0,0 +1,4 @@
+author: "Shadow-Quill"
+delete-after: True
+changes:
+ - bugfix: "Fixed being able to talk in OOC under certain circumstances if it's disabled."
diff --git a/html/changelogs/AutoChangeLog-pr-12091.yml b/html/changelogs/AutoChangeLog-pr-12091.yml
new file mode 100644
index 00000000000..a76858b61d4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12091.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - bugfix: "Fixes random singularity releases from the grid check event"
diff --git a/html/changelogs/AutoChangeLog-pr-12094.yml b/html/changelogs/AutoChangeLog-pr-12094.yml
new file mode 100644
index 00000000000..5993c40655a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12094.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - bugfix: "Fixes plasmamen atmos techs not getting their proper suit"
diff --git a/html/changelogs/AutoChangeLog-pr-12095.yml b/html/changelogs/AutoChangeLog-pr-12095.yml
new file mode 100644
index 00000000000..eb2cbe520c7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12095.yml
@@ -0,0 +1,5 @@
+author: "Ionward"
+delete-after: True
+changes:
+ - imageadd: "Drask crewmembers now have properly fitting shoes."
+ - imageadd: "Fixed some minor issues in Drasks uniforms"
diff --git a/html/changelogs/AutoChangeLog-pr-12098.yml b/html/changelogs/AutoChangeLog-pr-12098.yml
new file mode 100644
index 00000000000..637f785d4e2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12098.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - bugfix: "Unironically fixes about several thousand runtimes"
diff --git a/icons/effects/parallax.dmi b/icons/effects/parallax.dmi
new file mode 100644
index 00000000000..22f091ff11a
Binary files /dev/null and b/icons/effects/parallax.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index c58a6b635f4..36025c083b4 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index a1e80aa5e65..5c272f8c8e9 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
index a5a14094fd6..6d6165509c8 100644
Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 7f84b29d04e..4bc39d8f80b 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/headcrab.dmi b/icons/mob/headcrab.dmi
new file mode 100644
index 00000000000..4db08f13e76
Binary files /dev/null and b/icons/mob/headcrab.dmi differ
diff --git a/icons/mob/human_races/r_grey.dmi b/icons/mob/human_races/r_grey.dmi
index b243f88e401..1f66332a577 100644
Binary files a/icons/mob/human_races/r_grey.dmi and b/icons/mob/human_races/r_grey.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 47cb86a2c89..03f57f19a92 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index e4630c2764e..b11f98e74ed 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 014242b9d90..ed193927004 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index b18cb799817..cb6a2c6bd64 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/species/armalis/back.dmi b/icons/mob/species/armalis/back.dmi
new file mode 100644
index 00000000000..31f4f21f812
Binary files /dev/null and b/icons/mob/species/armalis/back.dmi differ
diff --git a/icons/mob/species/armalis/belt.dmi b/icons/mob/species/armalis/belt.dmi
new file mode 100644
index 00000000000..2aba8e97d8a
Binary files /dev/null and b/icons/mob/species/armalis/belt.dmi differ
diff --git a/icons/mob/species/armalis/ears.dmi b/icons/mob/species/armalis/ears.dmi
new file mode 100644
index 00000000000..f88c03feae5
Binary files /dev/null and b/icons/mob/species/armalis/ears.dmi differ
diff --git a/icons/mob/species/armalis/mask.dmi b/icons/mob/species/armalis/mask.dmi
new file mode 100644
index 00000000000..e97eb74f8e0
Binary files /dev/null and b/icons/mob/species/armalis/mask.dmi differ
diff --git a/icons/mob/species/drask/eyes.dmi b/icons/mob/species/drask/eyes.dmi
index 918f6e5ef71..818c719a541 100644
Binary files a/icons/mob/species/drask/eyes.dmi and b/icons/mob/species/drask/eyes.dmi differ
diff --git a/icons/mob/species/drask/mask.dmi b/icons/mob/species/drask/mask.dmi
index 9b9c341feb3..096faf15970 100644
Binary files a/icons/mob/species/drask/mask.dmi and b/icons/mob/species/drask/mask.dmi differ
diff --git a/icons/mob/species/drask/shoes.dmi b/icons/mob/species/drask/shoes.dmi
new file mode 100644
index 00000000000..4710f9758c2
Binary files /dev/null and b/icons/mob/species/drask/shoes.dmi differ
diff --git a/icons/mob/species/drask/uniform.dmi b/icons/mob/species/drask/uniform.dmi
index ab315263ed9..424d609399d 100644
Binary files a/icons/mob/species/drask/uniform.dmi and b/icons/mob/species/drask/uniform.dmi differ
diff --git a/icons/mob/species/grey/back.dmi b/icons/mob/species/grey/back.dmi
new file mode 100644
index 00000000000..e73a9798d65
Binary files /dev/null and b/icons/mob/species/grey/back.dmi differ
diff --git a/icons/mob/species/grey/eyes.dmi b/icons/mob/species/grey/eyes.dmi
index 8c732aa782d..937474d97dc 100644
Binary files a/icons/mob/species/grey/eyes.dmi and b/icons/mob/species/grey/eyes.dmi differ
diff --git a/icons/mob/species/grey/head.dmi b/icons/mob/species/grey/head.dmi
index 201e1032562..ca3737c75a8 100644
Binary files a/icons/mob/species/grey/head.dmi and b/icons/mob/species/grey/head.dmi differ
diff --git a/icons/mob/species/grey/uniform.dmi b/icons/mob/species/grey/uniform.dmi
index ddf0250fdc5..068ec0be122 100644
Binary files a/icons/mob/species/grey/uniform.dmi and b/icons/mob/species/grey/uniform.dmi differ
diff --git a/icons/mob/species/plasmaman/helmet.dmi b/icons/mob/species/plasmaman/helmet.dmi
index bd5465857d8..ebcb096aa7b 100644
Binary files a/icons/mob/species/plasmaman/helmet.dmi and b/icons/mob/species/plasmaman/helmet.dmi differ
diff --git a/icons/mob/species/plasmaman/mask.dmi b/icons/mob/species/plasmaman/mask.dmi
index 1acdc5e581f..73ff04e9288 100644
Binary files a/icons/mob/species/plasmaman/mask.dmi and b/icons/mob/species/plasmaman/mask.dmi differ
diff --git a/icons/mob/species/plasmaman/suit.dmi b/icons/mob/species/plasmaman/suit.dmi
deleted file mode 100644
index c4d1a7a2b3c..00000000000
Binary files a/icons/mob/species/plasmaman/suit.dmi and /dev/null differ
diff --git a/icons/mob/species/plasmaman/uniform.dmi b/icons/mob/species/plasmaman/uniform.dmi
new file mode 100644
index 00000000000..6667746c438
Binary files /dev/null and b/icons/mob/species/plasmaman/uniform.dmi differ
diff --git a/icons/mob/species/vox/ears.dmi b/icons/mob/species/vox/ears.dmi
new file mode 100644
index 00000000000..b09c349cae9
Binary files /dev/null and b/icons/mob/species/vox/ears.dmi differ
diff --git a/icons/mob/species/vox/eyes.dmi b/icons/mob/species/vox/eyes.dmi
index 3d9a6c77bf8..3e3705d2a90 100644
Binary files a/icons/mob/species/vox/eyes.dmi and b/icons/mob/species/vox/eyes.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index f79ca1fb338..abce25ab86f 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/basketball.dmi b/icons/obj/basketball.dmi
index a26c3935719..7b34fda1a32 100644
Binary files a/icons/obj/basketball.dmi and b/icons/obj/basketball.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 42f1eda0e74..f7f54357fdb 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index a20cf61eb33..a3d66d4d921 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/hats.dmi b/icons/obj/clothing/species/plasmaman/hats.dmi
index fc76e521d55..60282c030fe 100644
Binary files a/icons/obj/clothing/species/plasmaman/hats.dmi and b/icons/obj/clothing/species/plasmaman/hats.dmi differ
diff --git a/icons/obj/clothing/species/plasmaman/suits.dmi b/icons/obj/clothing/species/plasmaman/suits.dmi
deleted file mode 100644
index 78ddd94dedb..00000000000
Binary files a/icons/obj/clothing/species/plasmaman/suits.dmi and /dev/null differ
diff --git a/icons/obj/clothing/species/plasmaman/uniform.dmi b/icons/obj/clothing/species/plasmaman/uniform.dmi
new file mode 100644
index 00000000000..bc3f4d59a50
Binary files /dev/null and b/icons/obj/clothing/species/plasmaman/uniform.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 8e5a4b8e879..8371295985f 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index f48f0e9f07a..b5c25d474d1 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/food/candy.dmi b/icons/obj/food/candy.dmi
index 89714f5b5b3..66795d6ec95 100644
Binary files a/icons/obj/food/candy.dmi and b/icons/obj/food/candy.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index ebabdcf2ef5..aea237f5bed 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/fulton.dmi b/icons/obj/fulton.dmi
new file mode 100644
index 00000000000..c56c275b3b1
Binary files /dev/null and b/icons/obj/fulton.dmi differ
diff --git a/icons/obj/fulton_balloon.dmi b/icons/obj/fulton_balloon.dmi
new file mode 100644
index 00000000000..5a1fa98e148
Binary files /dev/null and b/icons/obj/fulton_balloon.dmi differ
diff --git a/icons/obj/guns/bayonets.dmi b/icons/obj/guns/bayonets.dmi
new file mode 100644
index 00000000000..32b5448b8ed
Binary files /dev/null and b/icons/obj/guns/bayonets.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index c303e2135bd..23e49287922 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi
index 83cb94a5ca3..730431590ae 100644
Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ
diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi
index cd2c6da08ee..8e91b20368f 100644
Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 29196e625ae..82ab4786c37 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index c8a9abd40f3..c33efec0f5f 100755
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi
index 72cce42bd79..7496d65027c 100644
Binary files a/icons/obj/tank.dmi and b/icons/obj/tank.dmi differ
diff --git a/icons/turf/walls/hierophant_wall_temp.dmi b/icons/turf/walls/hierophant_wall_temp.dmi
new file mode 100644
index 00000000000..9f0d4b8d23c
Binary files /dev/null and b/icons/turf/walls/hierophant_wall_temp.dmi differ
diff --git a/paradise.dme b/paradise.dme
index d72370f4f19..bfc185f1dc4 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -143,6 +143,7 @@
#include "code\_onclick\hud\monkey.dm"
#include "code\_onclick\hud\movable_screen_objects.dm"
#include "code\_onclick\hud\other_mobs.dm"
+#include "code\_onclick\hud\parallax.dm"
#include "code\_onclick\hud\picture_in_picture.dm"
#include "code\_onclick\hud\plane_master.dm"
#include "code\_onclick\hud\radial.dm"
@@ -204,6 +205,7 @@
#include "code\controllers\subsystem\alarm.dm"
#include "code\controllers\subsystem\assets.dm"
#include "code\controllers\subsystem\atoms.dm"
+#include "code\controllers\subsystem\chat.dm"
#include "code\controllers\subsystem\events.dm"
#include "code\controllers\subsystem\fires.dm"
#include "code\controllers\subsystem\garbage.dm"
@@ -223,6 +225,7 @@
#include "code\controllers\subsystem\nightshift.dm"
#include "code\controllers\subsystem\npcpool.dm"
#include "code\controllers\subsystem\overlays.dm"
+#include "code\controllers\subsystem\parallax.dm"
#include "code\controllers\subsystem\radio.dm"
#include "code\controllers\subsystem\shuttles.dm"
#include "code\controllers\subsystem\spacedrift.dm"
@@ -278,6 +281,7 @@
#include "code\datums\components\ducttape.dm"
#include "code\datums\components\jestosterone.dm"
#include "code\datums\components\material_container.dm"
+#include "code\datums\components\paintable.dm"
#include "code\datums\components\squeak.dm"
#include "code\datums\components\waddling.dm"
#include "code\datums\diseases\_disease.dm"
@@ -350,6 +354,8 @@
#include "code\datums\looping_sounds\weather.dm"
#include "code\datums\outfits\outfit.dm"
#include "code\datums\outfits\outfit_admin.dm"
+#include "code\datums\outfits\plasmamen.dm"
+#include "code\datums\outfits\vv_outfit.dm"
#include "code\datums\ruins\lavaland.dm"
#include "code\datums\ruins\space.dm"
#include "code\datums\spells\area_teleport.dm"
@@ -482,7 +488,7 @@
#include "code\game\gamemodes\changeling\powers\epinephrine.dm"
#include "code\game\gamemodes\changeling\powers\fakedeath.dm"
#include "code\game\gamemodes\changeling\powers\fleshmend.dm"
-#include "code\game\gamemodes\changeling\powers\headcrab.dm"
+#include "code\game\gamemodes\changeling\powers\headslug.dm"
#include "code\game\gamemodes\changeling\powers\hivemind.dm"
#include "code\game\gamemodes\changeling\powers\humanform.dm"
#include "code\game\gamemodes\changeling\powers\lesserform.dm"
@@ -846,6 +852,7 @@
#include "code\game\objects\items\devices\autopsy.dm"
#include "code\game\objects\items\devices\camera_bug.dm"
#include "code\game\objects\items\devices\chameleonproj.dm"
+#include "code\game\objects\items\devices\enginepicker.dm"
#include "code\game\objects\items\devices\flash.dm"
#include "code\game\objects\items\devices\flashlight.dm"
#include "code\game\objects\items\devices\floor_painter.dm"
@@ -1157,6 +1164,7 @@
#include "code\modules\admin\IsBanned.dm"
#include "code\modules\admin\machine_upgrade.dm"
#include "code\modules\admin\NewBan.dm"
+#include "code\modules\admin\outfits.dm"
#include "code\modules\admin\player_panel.dm"
#include "code\modules\admin\secrets.dm"
#include "code\modules\admin\sql_notes.dm"
@@ -1380,6 +1388,7 @@
#include "code\modules\clothing\suits\labcoat.dm"
#include "code\modules\clothing\suits\miscellaneous.dm"
#include "code\modules\clothing\suits\storage.dm"
+#include "code\modules\clothing\suits\toggles.dm"
#include "code\modules\clothing\suits\utility.dm"
#include "code\modules\clothing\suits\wiz_robe.dm"
#include "code\modules\clothing\under\color.dm"
@@ -1396,6 +1405,11 @@
#include "code\modules\clothing\under\jobs\engineering.dm"
#include "code\modules\clothing\under\jobs\medsci.dm"
#include "code\modules\clothing\under\jobs\security.dm"
+#include "code\modules\clothing\under\jobs\plasmamen\_plasmamen.dm"
+#include "code\modules\clothing\under\jobs\plasmamen\civilian_service.dm"
+#include "code\modules\clothing\under\jobs\plasmamen\engineering.dm"
+#include "code\modules\clothing\under\jobs\plasmamen\medsci.dm"
+#include "code\modules\clothing\under\jobs\plasmamen\security.dm"
#include "code\modules\countdown\countdown.dm"
#include "code\modules\crafting\craft.dm"
#include "code\modules\crafting\guncrafting.dm"
@@ -1441,6 +1455,7 @@
#include "code\modules\events\false_alarm.dm"
#include "code\modules\events\floorcluwne.dm"
#include "code\modules\events\grid_check.dm"
+#include "code\modules\events\headcrabs.dm"
#include "code\modules\events\immovable_rod.dm"
#include "code\modules\events\infestation.dm"
#include "code\modules\events\ion_storm.dm"
@@ -1638,21 +1653,30 @@
#include "code\modules\martial_arts\sleeping_carp.dm"
#include "code\modules\martial_arts\wrestleing.dm"
#include "code\modules\mining\abandonedcrates.dm"
-#include "code\modules\mining\coins.dm"
-#include "code\modules\mining\equipment_locker.dm"
-#include "code\modules\mining\explorer_gear.dm"
+#include "code\modules\mining\fulton.dm"
#include "code\modules\mining\machine_processing.dm"
+#include "code\modules\mining\machine_redemption.dm"
#include "code\modules\mining\machine_stacking.dm"
#include "code\modules\mining\machine_unloading.dm"
+#include "code\modules\mining\machine_vending.dm"
#include "code\modules\mining\mine_items.dm"
#include "code\modules\mining\minebot.dm"
#include "code\modules\mining\mint.dm"
#include "code\modules\mining\money_bag.dm"
-#include "code\modules\mining\ore.dm"
+#include "code\modules\mining\ores_coins.dm"
#include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mining\shelters.dm"
+#include "code\modules\mining\equipment\explorer_gear.dm"
+#include "code\modules\mining\equipment\kinetic_crusher.dm"
+#include "code\modules\mining\equipment\lazarus_injector.dm"
#include "code\modules\mining\equipment\marker_beacons.dm"
+#include "code\modules\mining\equipment\mineral_scanner.dm"
+#include "code\modules\mining\equipment\mining_tools.dm"
+#include "code\modules\mining\equipment\regenerative_core.dm"
+#include "code\modules\mining\equipment\resonator.dm"
#include "code\modules\mining\equipment\survival_pod.dm"
+#include "code\modules\mining\equipment\vendor_items.dm"
+#include "code\modules\mining\equipment\wormhole_jaunter.dm"
#include "code\modules\mining\laborcamp\laborshuttle.dm"
#include "code\modules\mining\laborcamp\laborstacker.dm"
#include "code\modules\mining\lavaland\ash_flora.dm"
@@ -1919,6 +1943,7 @@
#include "code\modules\mob\living\simple_animal\hostile\floorcluwne.dm"
#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm"
#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm"
+#include "code\modules\mob\living\simple_animal\hostile\headslug.dm"
#include "code\modules\mob\living\simple_animal\hostile\hellhound.dm"
#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm"
#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
diff --git a/sound/creatures/headcrab_attack.ogg b/sound/creatures/headcrab_attack.ogg
new file mode 100644
index 00000000000..4f6d114aa75
Binary files /dev/null and b/sound/creatures/headcrab_attack.ogg differ
diff --git a/sound/creatures/zombie_attack.ogg b/sound/creatures/zombie_attack.ogg
new file mode 100644
index 00000000000..1e9b2a63024
Binary files /dev/null and b/sound/creatures/zombie_attack.ogg differ
diff --git a/sound/creatures/zombie_idle1.ogg b/sound/creatures/zombie_idle1.ogg
new file mode 100644
index 00000000000..851c88deff4
Binary files /dev/null and b/sound/creatures/zombie_idle1.ogg differ
diff --git a/sound/creatures/zombie_idle2.ogg b/sound/creatures/zombie_idle2.ogg
new file mode 100644
index 00000000000..04e75da9b22
Binary files /dev/null and b/sound/creatures/zombie_idle2.ogg differ
diff --git a/sound/creatures/zombie_idle3.ogg b/sound/creatures/zombie_idle3.ogg
new file mode 100644
index 00000000000..b4cd2600757
Binary files /dev/null and b/sound/creatures/zombie_idle3.ogg differ
diff --git a/sound/items/fultext_deploy.ogg b/sound/items/fultext_deploy.ogg
new file mode 100644
index 00000000000..2433b9e0fe3
Binary files /dev/null and b/sound/items/fultext_deploy.ogg differ
diff --git a/sound/items/fultext_launch.ogg b/sound/items/fultext_launch.ogg
new file mode 100644
index 00000000000..2c874419927
Binary files /dev/null and b/sound/items/fultext_launch.ogg differ
diff --git a/sound/weapons/baseball_hit.ogg b/sound/weapons/baseball_hit.ogg
new file mode 100644
index 00000000000..6530945b6c1
Binary files /dev/null and b/sound/weapons/baseball_hit.ogg differ