Material Reclamation"
+ if(!(linked_destroy.loaded_item.resistance_flags & INDESTRUCTIBLE))
+ var/list/materials = linked_destroy.loaded_item.materials
+ l += "
[RDSCREEN_NOBREAK]"
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index db943a2b96e..702d9cbdb33 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -18,7 +18,7 @@
display_name = "Biological Technology"
description = "What makes us tick." //the MC, silly!
prereq_ids = list("base")
- design_ids = list("chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser")
+ design_ids = list("chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -27,7 +27,7 @@
display_name = "Advanced Biotechnology"
description = "Advanced Biotechnology"
prereq_ids = list("biotech")
- design_ids = list("piercesyringe", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker")
+ design_ids = list("piercesyringe", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker", "healthanalyzer_advanced")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 279767e9a29..1cf12e6d428 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -124,7 +124,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
continue
if(bounty_ship_item_and_contents(AM, dry_run = FALSE))
matched_bounty = TRUE
- if(!AM.anchored)
+ if(!AM.anchored || istype(AM, /obj/mecha))
sold_atoms += export_item_and_contents(AM, contraband, emagged, dry_run = FALSE)
if(sold_atoms)
diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm
index 6bb413b338e..27cfc9208ba 100644
--- a/code/modules/spells/spell_types/godhand.dm
+++ b/code/modules/spells/spell_types/godhand.dm
@@ -60,10 +60,7 @@
target.visible_message("
[target]'s [A] glows brightly as it wards off the spell!")
user.visible_message("
The feedback blows [user]'s arm off!","
The spell bounces from [M]'s skin back into your arm!")
user.flash_act()
- var/obj/item/bodypart/part
- var/index = user.get_held_index_of_item(src)
- if(index)
- part = user.hand_bodyparts[index]
+ var/obj/item/bodypart/part = user.get_holding_bodypart_of_item(src)
if(part)
part.dismember()
..()
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index a58e1951790..87e13955fee 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -199,7 +199,7 @@
/obj/item/bodypart/r_leg/drop_limb(special)
if(owner && !special)
if(owner.legcuffed)
- owner.legcuffed.forceMove(drop_location())
+ owner.legcuffed.forceMove(owner.drop_location()) //At this point bodypart is still in nullspace
owner.legcuffed.dropped(owner)
owner.legcuffed = null
owner.update_inv_legcuffed()
@@ -210,7 +210,7 @@
/obj/item/bodypart/l_leg/drop_limb(special) //copypasta
if(owner && !special)
if(owner.legcuffed)
- owner.legcuffed.forceMove(drop_location())
+ owner.legcuffed.forceMove(owner.drop_location())
owner.legcuffed.dropped(owner)
owner.legcuffed = null
owner.update_inv_legcuffed()
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 05e6553b3ca..a9f2c63e133 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1412,6 +1412,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
limited_stock = 2 //you can't use more than two!
restricted_roles = list("Shaft Miner")
+/datum/uplink_item/role_restricted/blastcannon
+ name = "Blast Cannon"
+ desc = "A highly specialized weapon, the Blast Cannon is actually relatively simple. It contains an attachment for a tank transfer valve mounted to an angled pipe specially constructed \
+ withstand extreme pressure and temperatures, and has a mechanical trigger for triggering the transfer valve. Essentially, it turns the explosive force of a bomb into a narrow-angle \
+ blast wave \"projectile\". Aspiring scientists may find this highly useful, as forcing the pressure shockwave into a narrow angle seems to be able to bypass whatever quirk of physics \
+ disallows explosive ranges above a certain distance, allowing for the device to use the theoretical yield of a transfer valve bomb, instead of the factual yield."
+ item = /obj/item/gun/blastcannon
+ cost = 14 //High cost because of the potential for extreme damage in the hands of a skilled scientist.
+ restricted_roles = list("Research Director", "Scientist")
+
/datum/uplink_item/device_tools/clown_bomb
name = "Clown Bomb"
desc = "The Clown bomb is a hilarious device capable of massive pranks. It has an adjustable timer, \
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 89bbee9d60d..b9112ddfded 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -1,7 +1,3 @@
-#define STANDARD_CHARGE 1
-#define CONTRABAND_CHARGE 2
-#define COIN_CHARGE 3
-
/*
* Vending machine types - Can be found under /code/modules/vending/
*/
@@ -21,7 +17,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
*/
/datum/data/vending_product
- var/product_name = "generic"
+ name = "generic"
var/product_path = null
var/amount = 0
var/max_amount = 0
@@ -74,7 +70,6 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
var/dish_quants = list() //used by the snack machine's custom compartment to count dishes.
var/obj/item/vending_refill/refill_canister = null //The type of refill canisters used by this machine.
- var/refill_count = 3 //The number of canisters the vending machine uses
/obj/machinery/vending/Initialize()
var/build_inv = FALSE
@@ -84,9 +79,9 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
. = ..()
wires = new /datum/wires/vending(src)
if(build_inv) //non-constructable vending machine
- build_inventory(products)
- build_inventory(contraband, 1)
- build_inventory(premium, 0, 1)
+ build_inventory(products, product_records)
+ build_inventory(contraband, hidden_records)
+ build_inventory(premium, coin_records)
slogan_list = splittext(product_slogans, ";")
// So not all machines speak at the exact same time.
@@ -102,17 +97,17 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
return ..()
/obj/machinery/vending/RefreshParts() //Better would be to make constructable child
- if(component_parts)
- product_records = list()
- hidden_records = list()
- coin_records = list()
- build_inventory(products, start_empty = 1)
- build_inventory(contraband, 1, start_empty = 1)
- build_inventory(premium, 0, 1, start_empty = 1)
- for(var/obj/item/vending_refill/VR in component_parts)
- refill_inventory(VR, product_records, STANDARD_CHARGE)
- refill_inventory(VR, coin_records, COIN_CHARGE)
- refill_inventory(VR, hidden_records, CONTRABAND_CHARGE)
+ if(!component_parts)
+ return
+
+ product_records = list()
+ hidden_records = list()
+ coin_records = list()
+ build_inventory(products, product_records, start_empty = TRUE)
+ build_inventory(contraband, hidden_records, start_empty = TRUE)
+ build_inventory(premium, coin_records, start_empty = TRUE)
+ for(var/obj/item/vending_refill/VR in component_parts)
+ restock(VR)
/obj/machinery/vending/deconstruct(disassembled = TRUE)
if(!refill_canister) //the non constructable vendors drop metal instead of a machine frame.
@@ -124,25 +119,33 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/obj_break(damage_flag)
if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1))
- var/dump_amount = 0
- for(var/datum/data/vending_product/R in product_records)
- if(R.amount <= 0) //Try to use a record that actually has something to dump.
- continue
- var/dump_path = R.product_path
- if(!dump_path)
- continue
-
- while(R.amount>0)
- var/obj/O = new dump_path(loc)
- step(O, pick(GLOB.alldirs)) //we only drop 20% of the total of each products and spread it
- R.amount -= 5 //around to not fill the turf with too many objects.
- dump_amount++
- if(dump_amount > 15) //so we don't drop too many items (e.g. ClothesMate)
- break
stat |= BROKEN
icon_state = "[initial(icon_state)]-broken"
-/obj/machinery/vending/proc/build_inventory(list/productlist, hidden=0, req_coin=0, start_empty = null)
+ var/dump_amount = 0
+ var/found_anything = TRUE
+ while (found_anything)
+ found_anything = FALSE
+ for(var/record in shuffle(product_records))
+ var/datum/data/vending_product/R = record
+ if(R.amount <= 0) //Try to use a record that actually has something to dump.
+ continue
+ var/dump_path = R.product_path
+ if(!dump_path)
+ continue
+ R.amount--
+ // busting open a vendor will destroy some of the contents
+ if(found_anything && prob(80))
+ continue
+
+ var/obj/O = new dump_path(loc)
+ step(O, pick(GLOB.alldirs))
+ found_anything = TRUE
+ dump_amount++
+ if (dump_amount >= 16)
+ return
+
+/obj/machinery/vending/proc/build_inventory(list/productlist, list/recordlist, start_empty = FALSE)
for(var/typepath in productlist)
var/amount = productlist[typepath]
if(isnull(amount))
@@ -150,47 +153,54 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
var/atom/temp = typepath
var/datum/data/vending_product/R = new /datum/data/vending_product()
- R.product_name = initial(temp.name)
+ R.name = initial(temp.name)
R.product_path = typepath
if(!start_empty)
R.amount = amount
R.max_amount = amount
- R.display_color = pick("red","blue","green")
+ R.display_color = pick("#ff8080","#80ff80","#8080ff")
+ recordlist += R
- if(hidden)
- hidden_records += R
- else if(req_coin)
- coin_records += R
- else
- product_records += R
+/obj/machinery/vending/proc/restock(obj/item/vending_refill/canister)
+ if (!canister.products)
+ canister.products = products.Copy()
+ if (!canister.contraband)
+ canister.contraband = contraband.Copy()
+ if (!canister.premium)
+ canister.premium = premium.Copy()
+ . = 0
+ . += refill_inventory(canister.products, product_records)
+ . += refill_inventory(canister.contraband, hidden_records)
+ . += refill_inventory(canister.premium, coin_records)
-/obj/machinery/vending/proc/refill_inventory(obj/item/vending_refill/refill, datum/data/vending_product/machine, var/charge_type = STANDARD_CHARGE)
- var/total = 0
- var/to_restock = 0
+/obj/machinery/vending/proc/refill_inventory(list/productlist, list/recordlist)
+ . = 0
+ for(var/R in recordlist)
+ var/datum/data/vending_product/record = R
+ var/diff = min(record.max_amount - record.amount, productlist[record.product_path])
+ if (diff)
+ productlist[record.product_path] -= diff
+ record.amount += diff
+ . += diff
- for(var/datum/data/vending_product/machine_content in machine)
- if(machine_content.amount == 0 && refill.charges[charge_type] > 0)
- machine_content.amount++
- refill.charges[charge_type]--
- total++
- to_restock += machine_content.max_amount - machine_content.amount
- if(to_restock <= refill.charges[charge_type])
- for(var/datum/data/vending_product/machine_content in machine)
- machine_content.amount = machine_content.max_amount
- refill.charges[charge_type] -= to_restock
- total += to_restock
- else
- var/tmp_charges = refill.charges[charge_type]
- for(var/datum/data/vending_product/machine_content in machine)
- if(refill.charges[charge_type] == 0)
- break
- var/restock = CEILING(((machine_content.max_amount - machine_content.amount)/to_restock)*tmp_charges, 1)
- if(restock > refill.charges[charge_type])
- restock = refill.charges[charge_type]
- machine_content.amount += restock
- refill.charges[charge_type] -= restock
- total += restock
- return total
+/obj/machinery/vending/proc/update_canister()
+ if (!component_parts)
+ return
+
+ var/obj/item/vending_refill/R = locate() in component_parts
+ if (!R)
+ CRASH("Constructible vending machine did not have a refill canister")
+ return
+
+ R.products = unbuild_inventory(product_records)
+ R.contraband = unbuild_inventory(hidden_records)
+ R.premium = unbuild_inventory(coin_records)
+
+/obj/machinery/vending/proc/unbuild_inventory(list/recordlist)
+ . = list()
+ for(var/R in recordlist)
+ var/datum/data/vending_product/record = R
+ .[record.product_path] += record.amount
/obj/machinery/vending/crowbar_act(mob/living/user, obj/item/I)
if(!component_parts)
@@ -248,46 +258,52 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
bill = new S.type(src, 1)
to_chat(user, "
You insert [I] into [src].")
return
- else if(istype(I, refill_canister) && refill_canister != null)
- if(stat & (BROKEN|NOPOWER))
- to_chat(user, "
It does nothing.")
- else if(panel_open)
+ else if(refill_canister && istype(I, refill_canister))
+ if (!panel_open)
+ to_chat(user, "
You should probably unscrew the service panel first.")
+ else if (stat & (BROKEN|NOPOWER))
+ to_chat(user, "
[src] does not respond.")
+ else
//if the panel is open we attempt to refill the machine
var/obj/item/vending_refill/canister = I
- if(canister.charges[STANDARD_CHARGE] == 0)
- to_chat(user, "
This [canister.name] is empty!")
+ if(canister.get_part_rating() == 0)
+ to_chat(user, "
[canister] is empty!")
else
- var/transfered = refill_inventory(canister,product_records,STANDARD_CHARGE)
- transfered += refill_inventory(canister,coin_records,COIN_CHARGE)
- transfered += refill_inventory(canister,hidden_records,CONTRABAND_CHARGE)
- if(transfered)
- to_chat(user, "
You loaded [transfered] items in \the [name].")
+ // instantiate canister if needed
+ var/transferred = restock(canister)
+ if(transferred)
+ to_chat(user, "
You loaded [transferred] items in [src].")
else
- to_chat(user, "
The [name] is fully stocked.")
+ to_chat(user, "
There's nothing to restock!")
return
- else
- to_chat(user, "
You should probably unscrew the service panel first.")
else
return ..()
+/obj/machinery/vending/exchange_parts(mob/user, obj/item/storage/part_replacer/W)
+ if(!istype(W))
+ return FALSE
+ if((flags_1 & NODECONSTRUCT_1) && !W.works_from_distance)
+ return FALSE
+ if(!component_parts || !refill_canister)
+ return FALSE
+
+ var/moved = 0
+ if(panel_open || W.works_from_distance)
+ if(W.works_from_distance)
+ display_parts(user)
+ for(var/I in W)
+ if(istype(I, refill_canister))
+ moved += restock(I)
+ else
+ display_parts(user)
+ if(moved)
+ to_chat(user, "[moved] items restocked.")
+ W.play_rped_sound()
+ return TRUE
+
/obj/machinery/vending/on_deconstruction()
- var/product_list = list(product_records, hidden_records, coin_records)
- for(var/i=1, i<=3, i++)
- for(var/datum/data/vending_product/machine_content in product_list[i])
- while(machine_content.amount !=0)
- var/safety = 0 //to avoid infinite loop
- for(var/obj/item/vending_refill/VR in component_parts)
- safety++
- if(VR.charges[i] < VR.init_charges[i])
- VR.charges[i]++
- machine_content.amount--
- if(!machine_content.amount)
- break
- else
- safety--
- if(safety <= 0) // all refill canisters are full
- break
- ..()
+ update_canister()
+ . = ..()
/obj/machinery/vending/emag_act(mob/user)
if(obj_flags & EMAGGED)
@@ -323,7 +339,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
dat += "
Vend "
else
dat += "
Sold out "
- dat += "
[sanitize(R.product_name)]:"
+ dat += "
[sanitize(R.name)]:"
dat += "
[R.amount]"
dat += ""
dat += ""
@@ -358,17 +374,11 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
to_chat(usr, "
There is no money in this machine.")
return
if(coin)
- if(!usr.get_active_held_item())
- usr.put_in_hands(coin)
- else
- coin.forceMove(get_turf(src))
+ usr.put_in_hands(coin)
to_chat(usr, "
You remove [coin] from [src].")
coin = null
if(bill)
- if(!usr.get_active_held_item())
- usr.put_in_hands(bill)
- else
- bill.forceMove(get_turf(src))
+ usr.put_in_hands(bill)
to_chat(usr, "
You remove [bill] from [src].")
bill = null
@@ -545,7 +555,3 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/onTransitZ()
return
-
-#undef STANDARD_CHARGE
-#undef CONTRABAND_CHARGE
-#undef COIN_CHARGE
diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm
index 58ede4f25b3..95211a96005 100644
--- a/code/modules/vending/autodrobe.dm
+++ b/code/modules/vending/autodrobe.dm
@@ -122,8 +122,10 @@
/obj/item/skub = 1)
refill_canister = /obj/item/vending_refill/autodrobe
+/obj/machinery/vending/autodrobe/all_access
+ desc = "A vending machine for costumes. This model appears to have no access restrictions."
+ req_access = null
+
/obj/item/vending_refill/autodrobe
machine_name = "AutoDrobe"
icon_state = "refill_costume"
- charges = list(32, 2, 3)// of 96 standard, 6 contraband, 9 premium
- init_charges = list(32, 2, 3)
diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm
index 09a421d1d57..2f9a862508b 100644
--- a/code/modules/vending/boozeomat.dm
+++ b/code/modules/vending/boozeomat.dm
@@ -38,6 +38,10 @@
req_access = list(ACCESS_BAR)
refill_canister = /obj/item/vending_refill/boozeomat
+/obj/machinery/vending/boozeomat/all_access
+ desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. This model appears to have no access restrictions."
+ req_access = null
+
/obj/machinery/vending/boozeomat/pubby_maint //abandoned bar on Pubbystation
products = list(/obj/item/reagent_containers/food/drinks/bottle/whiskey = 1,
/obj/item/reagent_containers/food/drinks/bottle/absinthe = 1,
@@ -62,5 +66,3 @@
/obj/item/vending_refill/boozeomat
machine_name = "Booze-O-Mat"
icon_state = "refill_booze"
- charges = list(61, 4, 0)//of 182 standard, 12 contraband
- init_charges = list(61, 4, 0)
diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm
index d81a0a01a64..6b9334362df 100644
--- a/code/modules/vending/cigarette.dm
+++ b/code/modules/vending/cigarette.dm
@@ -41,8 +41,6 @@
/obj/item/vending_refill/cigarette
machine_name = "ShadyCigs Deluxe"
icon_state = "refill_smoke"
- charges = list(12, 3, 2)// of 36 standard, 9 contraband, 6 premium
- init_charges = list(12, 3, 2)
/obj/machinery/vending/cigarette/pre_throw(obj/item/I)
if(istype(I, /obj/item/lighter))
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index f3ab636fb05..80e422c6a00 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -35,6 +35,7 @@
/obj/item/clothing/neck/tie/red = 1,
/obj/item/clothing/neck/tie/black = 1,
/obj/item/clothing/neck/tie/horrible = 1,
+ /obj/item/clothing/neck/scarf/pink = 1,
/obj/item/clothing/neck/scarf/red = 1,
/obj/item/clothing/neck/scarf/green = 1,
/obj/item/clothing/neck/scarf/darkblue = 1,
@@ -118,5 +119,3 @@
/obj/item/vending_refill/clothing
machine_name = "ClothesMate"
icon_state = "refill_clothes"
- charges = list(37, 4, 4)// of 111 standard, 12 contraband, 10 premium(?)
- init_charges = list(37, 4, 4)
diff --git a/code/modules/vending/coffee.dm b/code/modules/vending/coffee.dm
index d70cf4ae76a..6ac9dd648d1 100644
--- a/code/modules/vending/coffee.dm
+++ b/code/modules/vending/coffee.dm
@@ -4,8 +4,8 @@
product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies"
icon_state = "coffee"
icon_vend = "coffee-vend"
- products = list(/obj/item/reagent_containers/food/drinks/coffee = 25,
- /obj/item/reagent_containers/food/drinks/mug/tea = 25,
+ products = list(/obj/item/reagent_containers/food/drinks/coffee = 25,
+ /obj/item/reagent_containers/food/drinks/mug/tea = 25,
/obj/item/reagent_containers/food/drinks/mug/coco = 25)
contraband = list(/obj/item/reagent_containers/food/drinks/ice = 12)
refill_canister = /obj/item/vending_refill/coffee
@@ -13,5 +13,3 @@
/obj/item/vending_refill/coffee
machine_name = "Solar's Best Hot Drinks"
icon_state = "refill_joe"
- charges = list(25, 4, 0)//of 75 standard, 12 contraband
- init_charges = list(25, 4, 0)
diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm
index e675b29f811..f61c392ff71 100644
--- a/code/modules/vending/cola.dm
+++ b/code/modules/vending/cola.dm
@@ -22,8 +22,6 @@
/obj/item/vending_refill/cola
machine_name = "Robust Softdrinks"
icon_state = "refill_cola"
- charges = list(30, 4, 1)//of 90 standard, 12 contraband, 1 premium
- init_charges = list(30, 4, 1)
/obj/machinery/vending/cola/random
name = "\improper Random Drinkies"
diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm
index 1bd3c9086d2..4e4d3365679 100644
--- a/code/modules/vending/games.dm
+++ b/code/modules/vending/games.dm
@@ -13,5 +13,3 @@
/obj/item/vending_refill/games
machine_name = "\improper Good Clean Fun"
icon_state = "refill_games"
- charges = list(7, 3, 0) //of 21 standard, 9 contraband
- init_charges = list(7, 3, 0)
diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm
index 6213ebed351..92fd21e852f 100644
--- a/code/modules/vending/liberation.dm
+++ b/code/modules/vending/liberation.dm
@@ -2,7 +2,6 @@
name = "\improper Liberation Station"
desc = "An overwhelming amount of
ancient patriotism washes over you just by looking at the machine."
icon_state = "liberationstation"
- req_access = list(ACCESS_SECURITY)
product_slogans = "Liberation Station: Your one-stop shop for all things second ammendment!;Be a patriot today, pick up a gun!;Quality weapons for cheap prices!;Better dead than red!"
product_ads = "Float like an astronaut, sting like a bullet!;Express your second ammendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?"
vend_reply = "Remember the name: Liberation Station!"
diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm
index d7a905f0d5d..3b387f69599 100644
--- a/code/modules/vending/liberation_toy.dm
+++ b/code/modules/vending/liberation_toy.dm
@@ -2,7 +2,6 @@
name = "\improper Syndicate Donksoft Toy Vendor"
desc = "An ages 8 and up approved vendor that dispenses toys. If you were to find the right wires, you can unlock the adult mode setting!"
icon_state = "syndi"
- req_access = list(ACCESS_SECURITY)
product_slogans = "Get your cool toys today!;Trigger a valid hunter today!;Quality toy weapons for cheap prices!;Give them to HoPs for all access!;Give them to HoS to get permabrigged!"
product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!"
vend_reply = "Come back for more!"
diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm
index bb857d85d7f..bea449845c8 100644
--- a/code/modules/vending/medical.dm
+++ b/code/modules/vending/medical.dm
@@ -5,24 +5,24 @@
icon_deny = "med-deny"
product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!"
req_access = list(ACCESS_MEDICAL)
- products = list(/obj/item/reagent_containers/syringe = 12,
- /obj/item/reagent_containers/dropper = 3,
- /obj/item/healthanalyzer = 4,
- /obj/item/sensor_device = 2,
+ products = list(/obj/item/reagent_containers/syringe = 12,
+ /obj/item/reagent_containers/dropper = 3,
+ /obj/item/healthanalyzer = 4,
+ /obj/item/sensor_device = 2,
/obj/item/pinpointer/crew = 2,
/obj/item/reagent_containers/medspray/sterilizine = 1,
- /obj/item/stack/medical/gauze = 8,
- /obj/item/reagent_containers/pill/patch/styptic = 5,
- /obj/item/reagent_containers/medspray/styptic = 2,
- /obj/item/reagent_containers/pill/patch/silver_sulf = 5,
+ /obj/item/stack/medical/gauze = 8,
+ /obj/item/reagent_containers/pill/patch/styptic = 5,
+ /obj/item/reagent_containers/medspray/styptic = 2,
+ /obj/item/reagent_containers/pill/patch/silver_sulf = 5,
/obj/item/reagent_containers/medspray/silver_sulf = 2,
/obj/item/reagent_containers/pill/insulin = 10,
- /obj/item/reagent_containers/pill/salbutamol = 2,
- /obj/item/reagent_containers/glass/bottle/charcoal = 4,
- /obj/item/reagent_containers/glass/bottle/epinephrine = 4,
+ /obj/item/reagent_containers/pill/salbutamol = 2,
+ /obj/item/reagent_containers/glass/bottle/charcoal = 4,
+ /obj/item/reagent_containers/glass/bottle/epinephrine = 4,
/obj/item/reagent_containers/glass/bottle/salglu_solution = 3,
- /obj/item/reagent_containers/glass/bottle/morphine = 4,
- /obj/item/reagent_containers/glass/bottle/toxin = 3,
+ /obj/item/reagent_containers/glass/bottle/morphine = 4,
+ /obj/item/reagent_containers/glass/bottle/toxin = 3,
/obj/item/reagent_containers/syringe/antiviral = 6)
contraband = list(/obj/item/reagent_containers/pill/tox = 3,
/obj/item/reagent_containers/pill/morphine = 4,
@@ -36,7 +36,5 @@
refill_canister = /obj/item/vending_refill/medical
/obj/item/vending_refill/medical
- machine_name = "NanoMed"
+ machine_name = "NanoMed Plus"
icon_state = "refill_medical"
- charges = list(26, 5, 3)// of 76 standard, 13 contraband, 8 premium
- init_charges = list(26, 5, 3)
diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm
index 6b5005eee42..ef19ce3b9b3 100644
--- a/code/modules/vending/medical_wall.dm
+++ b/code/modules/vending/medical_wall.dm
@@ -15,5 +15,8 @@
/obj/item/reagent_containers/pill/morphine = 2)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
- refill_canister = /obj/item/vending_refill/medical
- refill_count = 1
+ refill_canister = /obj/item/vending_refill/wallmed
+
+/obj/item/vending_refill/wallmed
+ machine_name = "NanoMed"
+ icon_state = "refill_medical"
diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm
index 82c31d1439c..69e510ad5a0 100644
--- a/code/modules/vending/snack.dm
+++ b/code/modules/vending/snack.dm
@@ -17,8 +17,6 @@
/obj/item/vending_refill/snack
machine_name = "Getmore Chocolate Corp"
- charges = list(12, 2, 0)//of 36 standard, 6 contraband
- init_charges = list(12, 2, 0)
/obj/machinery/vending/snack/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/reagent_containers/food/snacks))
diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm
index c55dfff0168..08bb4615bba 100644
--- a/code/modules/vending/toys.dm
+++ b/code/modules/vending/toys.dm
@@ -6,20 +6,22 @@
product_ads = "Feel robust with your toys!;Express your inner child today!;Toy weapons don't kill people, but valid hunters do!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!"
vend_reply = "Come back for more!"
circuit = /obj/item/circuitboard/machine/vending/donksofttoyvendor
- products = list(/obj/item/gun/ballistic/automatic/toy/unrestricted = 10,
- /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10,
- /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10,
- /obj/item/toy/sword = 10,
- /obj/item/ammo_box/foambox = 20,
- /obj/item/toy/foamblade = 10,
- /obj/item/toy/syndicateballoon = 10,
- /obj/item/clothing/suit/syndicatefake = 5,
- /obj/item/clothing/head/syndicatefake = 5)
- contraband = list(/obj/item/gun/ballistic/shotgun/toy/crossbow = 10,
- /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted = 10,
- /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted = 10,
- /obj/item/toy/katana = 10,
- /obj/item/twohanded/dualsaber/toy = 5)
+ products = list(
+ /obj/item/gun/ballistic/automatic/toy/unrestricted = 10,
+ /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10,
+ /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10,
+ /obj/item/toy/sword = 10,
+ /obj/item/ammo_box/foambox = 20,
+ /obj/item/toy/foamblade = 10,
+ /obj/item/toy/syndicateballoon = 10,
+ /obj/item/clothing/suit/syndicatefake = 5,
+ /obj/item/clothing/head/syndicatefake = 5)
+ contraband = list(
+ /obj/item/gun/ballistic/shotgun/toy/crossbow = 10,
+ /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted = 10,
+ /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted = 10,
+ /obj/item/toy/katana = 10,
+ /obj/item/twohanded/dualsaber/toy = 5)
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/donksoft
@@ -27,5 +29,3 @@
/obj/item/vending_refill/donksoft
machine_name = "Donksoft Toy Vendor"
icon_state = "refill_donksoft"
- charges = list(32,28,0)// of 90 standard, 75 contraband, 0 premium
- init_charges = list(32,28,0)
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index 69f3e4b168a..738c7e46003 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -26,8 +26,6 @@
/obj/item/vending_refill/wardrobe/sec_wardrobe
machine_name = "SecDrobe"
- charges = list(10, 0, 3)
- init_charges = list(10, 0, 3)
/obj/machinery/vending/wardrobe/medi_wardrobe
name = "\improper MediDrobe"
@@ -56,8 +54,6 @@
/obj/item/vending_refill/wardrobe/medi_wardrobe
machine_name = "MediDrobe"
- charges = list(10, 0, 0)
- init_charges = list(10, 0, 0)
/obj/machinery/vending/wardrobe/engi_wardrobe
name = "EngiDrobe"
@@ -78,8 +74,6 @@
/obj/item/vending_refill/wardrobe/engi_wardrobe
machine_name = "EngiDrobe"
- charges = list(7, 0, 0)
- init_charges = list(7, 0, 0)
/obj/machinery/vending/wardrobe/atmos_wardrobe
name = "AtmosDrobe"
@@ -98,8 +92,6 @@
/obj/item/vending_refill/wardrobe/atmos_wardrobe
machine_name = "AtmosDrobe"
- charges = list(5, 0, 0)
- init_charges = list(5, 0, 0)
/obj/machinery/vending/wardrobe/cargo_wardrobe
name = "CargoDrobe"
@@ -117,8 +109,6 @@
/obj/item/vending_refill/wardrobe/cargo_wardrobe
machine_name = "CargoDrobe"
- charges = list(5, 0, 0)
- init_charges = list(5, 0, 0)
/obj/machinery/vending/wardrobe/robo_wardrobe
name = "RoboDrobe"
@@ -137,8 +127,6 @@
/obj/item/vending_refill/wardrobe/robo_wardrobe
machine_name = "RoboDrobe"
- charges = list(4, 0, 0)
- init_charges = list(4, 0, 0)
/obj/machinery/vending/wardrobe/science_wardrobe
name = "SciDrobe"
@@ -159,8 +147,6 @@
/obj/item/vending_refill/wardrobe/science_wardrobe
machine_name = "SciDrobe"
- charges = list(8, 0, 0)
- init_charges = list(8, 0, 0)
/obj/machinery/vending/wardrobe/hydro_wardrobe
name = "Hydrobe"
@@ -179,8 +165,6 @@
/obj/item/vending_refill/wardrobe/hydro_wardrobe
machine_name = "HyDrobe"
- charges = list(6, 0, 0)
- init_charges = list(6, 0, 0)
/obj/machinery/vending/wardrobe/curator_wardrobe
name = "CuraDrobe"
@@ -198,8 +182,6 @@
/obj/item/vending_refill/wardrobe/curator_wardrobe
machine_name = "CuraDrobe"
- charges = list(3, 0, 0)
- init_charges = list(3, 0, 0)
/obj/machinery/vending/wardrobe/bar_wardrobe
name = "BarDrobe"
@@ -227,8 +209,6 @@
/obj/item/vending_refill/wardrobe/bar_wardrobe
machine_name = "BarDrobe"
- charges = list(8, 0, 0)
- init_charges = list(8, 0, 0)
/obj/machinery/vending/wardrobe/chef_wardrobe
name = "ChefDrobe"
@@ -251,8 +231,6 @@
/obj/item/vending_refill/wardrobe/chef_wardrobe
machine_name = "ChefDrobe"
- charges = list(6, 0, 0)
- init_charges = list(6, 0, 0)
/obj/machinery/vending/wardrobe/jani_wardrobe
name = "JaniDrobe"
@@ -279,8 +257,6 @@
/obj/item/vending_refill/wardrobe/jani_wardrobe
machine_name = "JaniDrobe"
- charges = list(7, 0, 0)
- init_charges = list(7, 0, 0)
/obj/machinery/vending/wardrobe/law_wardrobe
name = "LawDrobe"
@@ -303,8 +279,6 @@
/obj/item/vending_refill/wardrobe/law_wardrobe
machine_name = "LawDrobe"
- charges = list(5, 0, 0)
- init_charges = list(5, 0, 0)
/obj/machinery/vending/wardrobe/chap_wardrobe
name = "ChapDrobe"
@@ -325,8 +299,6 @@
/obj/item/vending_refill/wardrobe/chap_wardrobe
machine_name = "ChapDrobe"
- charges = list(6, 0, 0)
- init_charges = list(6, 0, 0)
/obj/machinery/vending/wardrobe/chem_wardrobe
name = "ChemDrobe"
@@ -344,8 +316,6 @@
/obj/item/vending_refill/wardrobe/chem_wardrobe
machine_name = "ChemDrobe"
- charges = list(4, 0, 0)
- init_charges = list(4, 0, 0)
/obj/machinery/vending/wardrobe/gene_wardrobe
name = "GeneDrobe"
@@ -362,8 +332,6 @@
/obj/item/vending_refill/wardrobe/gene_wardrobe
machine_name = "GeneDrobe"
- charges = list(4, 0, 0)
- init_charges = list(4, 0, 0)
/obj/machinery/vending/wardrobe/viro_wardrobe
name = "ViroDrobe"
@@ -381,5 +349,3 @@
/obj/item/vending_refill/wardrobe/viro_wardrobe
machine_name = "ViroDrobe"
- charges = list(4, 0, 0)
- init_charges = list(4, 0, 0)
diff --git a/config/admins.txt b/config/admins.txt
index 6825a88aec0..a882f7caea3 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -10,6 +10,7 @@
# and will override any duplicate entries in the database. #
###############################################################################################
Optimumtact = Host
+CitrusGender = Game Master
NewSta = Game Master
Expletives = Game Master
kingofkosmos = Game Master
diff --git a/config/game_options.txt b/config/game_options.txt
index 3eafb02ec5f..2387c0dfef4 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -16,9 +16,6 @@ REVIVAL_BRAIN_LIFE -1
## RENAMING ###
-## Uncomment to allow cyborgs to rename themselves at roundstart. Has no effect on roboticists renaming cyborgs the normal way.
-#RENAME_CYBORG
-
## OOC DURING ROUND ###
## Comment this out if you want OOC to be automatically disabled during the round, it will be enabled during the lobby and after the round end results.
OOC_DURING_ROUND
diff --git a/goon/icons/obj/chairs.dmi b/goon/icons/obj/chairs.dmi
new file mode 100644
index 00000000000..462370ac377
Binary files /dev/null and b/goon/icons/obj/chairs.dmi differ
diff --git a/html/changelog.html b/html/changelog.html
index 04117703b82..d0b04201527 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,134 @@
-->
+
24 June 2018
+
CitrusGender updated:
+
+ - Fixed cyborgs not getting their names at round start
+ - Fixed cyborgs and A.I.s being able to bypass appearance bans
+
+
SpaceManiac updated:
+
+ - The "Save Logs" option in the chat now actually works (IE 10+ only).
+
+
Time-Green updated:
+
+ - Soda is no longer intangible to the laws of physics
+
+
cinder1992 updated:
+
+ - The Captain can now go down with their station in style! Suicide animation added to the Officer's Sabre.
+
+
kevinz000 updated:
+
+ - Cyborgs now drop keys on deconstruction/detonation
+
+
+
23 June 2018
+
Dax Dupont updated:
+
+ - CHANGE PLACES, SHUTTLE CHAIRS HAVE BEEN CHANGED AGAIN.
+ - Create antags now checks for people being on station before applying.
+
+
ExcessiveUseOfCobblestone updated:
+
+ - Plant disks with potency genes clarify the percent is for potency scaling and not relative to max volume on examine.
+
+
Kor updated:
+
+ - Bubblegum has regained his original (deadlier) move set.
+
+
SpaceManiac updated:
+
+ - Fire extinguishers on the emergency shuttle are no longer unclickable once removed from their cabinets.
+
+
kevinz000 updated:
+
+ - Blast cannons have been fixed and are now available for purchase by traitorous scientists for a low low price of 14TC.
+ - Blast cannons take the explosive power of a TTV bomb and ejects a linear projectile that will apply what the bomb would do to a certain tile at that distance to that tile. However, this will not cause breaches, or gib mobs, unless the gods (admins) so will it. experimental: Blast cannons do not respect maxcap. (Unless the admins so will it.)
+
+
+
21 June 2018
+
BlueNothing updated:
+
+ - Grabbers can no longer hold circuit assemblies
+
+
CitrusGender updated:
+
+ - Ruins air alarms will no longer be reported in the station tablets
+ - added a clamp so you can't set a negative multiplier to create materials and create more than 50 items.
+
+
Cobby updated:
+
+ - Removed Advanced Mining Scanner from roundstart voucher kits.
+ - Removed Explorer Webbing from all voucher kits besides the shelter capsule pack.
+
+
Denton updated:
+
+ - The public booze-o-mats and autodrobes on Box/Delta/Meta now have no access requirements, as previously intended.
+ - Regular and advanced health analyzers can now be researched and printed.
+
+
McDonald072 updated:
+
+ - A few new circuits for dealing with atmospherics have been uploaded to your local printers.
+
+
NewSta updated:
+
+ - made it easier to see from the back whether someone is occupying the shuttle chair or not.
+
+
SpaceManiac updated:
+
+ - One canister is now suitable to fully stock a vending machine. Relevant cargo packs have been updated.
+ - Deconstructing and reconstructing a vending machine no longer creates items from thin air.
+ - Using a part replacer on a vending machine no longer empties its inventory.
+ - Bluespace RPEDs can now be used to refill vending machines.
+
+
Tlaltecuhtli updated:
+
+ - anomaly cores no longer tend to dust
+
+
YPOQ updated:
+
+ - Watcher beams will freeze you again
+
+
+
19 June 2018
+
Cyberboss updated:
+
+ - Speaking in deadchat now shows your rank instead of ADMIN
+
+
Dax Dupont updated:
+
+ - Circuit lab no longer starts with super batteries, they have been replaced with high batteries.
+ - Circuit labs now start with 20 sheets of metal instead of 50/100. Plenty of materials on the station you can gather.
+ - Circuit labs no longer have their own protolathe and autolathe. Science has their own lathes already.
+ - There's no more entire library worth of equipment, they can go publish the books like the rest of the station, in the library. At least give the librarians something other to do than screaming about lizard porn on the radio.
+
+
Hyacinth-OR updated:
+
+ - Added a pink scarf to vendomats
+
+
Irafas updated:
+
+ - Players can now ctrl-click the PDA to remove the item in its pen slot
+
+
JStheguy updated:
+
+ - Added the data card reader circuit, a circuit that is able to read data cards, as well as write to them.
+ - Data cards are now longer inexplicably called data disks despite clearly being cards, and can be printed from the "tools" section of the integrated circuit printer.
+ - Data cards no longer have a special "label card" verb and instead can have their names and descriptions changed with a pen.
+ - Also, some aesthetically different variants of the data cards, because why not.
+ - Data cards have new sprites, with support for coloring them via the assembly detailer.
+
+
Naksu updated:
+
+ - Sped up atmos very slightly
+
+
ninjanomnom updated:
+
+ - A plush that knows too much has found its way to the bus ruin.
+
+
18 June 2018
CitrusGender updated:
@@ -1448,64 +1576,6 @@
- the beer and soda dispenser now have their own circuitboards, as well as design ids. you can unlock them through techwebs under the biotech node.
- beer and soda dispensers can no longer be turned into chem dispensers by deconstructing and reconstructing them.
-
-
21 April 2018
-
SailorDave updated:
-
- - A new manipulation circuit, the Seed Extractor. Extracts seeds from produce, and outputs a list of the extracted seeds.
- - A new list circuit, the List Filter. Searches through a list for anything matching the desired element and outputs two lists: one containing just the matches, and the other with matches filtered out.
- - A new list circuit, the Set circuit. Removes duplicate entries from a list.
- - The Plant Manipulation circuit can now plant seeds, and outputs a list of harvested plants.
- - Reagent circuits can now irrigate connected hydroponic trays and inject blood samples into Replica pods.
- - The Examiner circuit can now output worn items and other examined details of carbon and silicon mobs into the description pin, as well as the occupied turf of the scanned object, and can now scan turfs.
- - The locomotion circuit now allows drones to move at base human speed, but cannot be stacked, and assemblies can now open doors they have access to like bots by bumping into them.
- - List Advanced Locator circuit now accepts refs as well as strings.
- - Fixed the Power Transmitter circuit not properly displaying a message when activated.
- - Medical Analyzer circuit can now properly scan non-human mobs.
-
-
-
20 April 2018
-
Astatineguy12 updated:
-
- - Gygax construction now actually uses up the capacitor
-
-
Dax Dupont updated:
-
- - A cat is fine too. You can select cat parts again!
- - Default lizard tail was never properly defaulted, now it is.
- - Fixes an exploit where tendrils/other spawners/anchored mobs in general could be buckled to things and thus moved around.
-
-
Denton updated:
-
- - Due to space OSHA lobbying, the Syndicate's lavaland base now contains a radsuit and decontamination shower.
- - Suit storage units' suit/helmet compartments now accept non-spacesuit clothing (radsuits, EOD suits, firesuits and so on).
-
-
Naksu updated:
-
- - Oingo-boingo punch-face and meteor shot can no longer move gateways or Reebe servant blocker effects
- - Mechas piloted by servants of Ratvar now teleport to the servant side of Reebe when entering a rift
- - Gravity generators can now be thrown in buildmode
-
-
ShizCalev updated:
-
- - Fixed a number of conveyor belts leading to the incorrect direction.
- - Fixed shuttle conveyor belts being out of sync with cargo's conveyors on some maps.
-
-
SpaceManiac updated:
-
- - Cycle-linking is no longer permanently disabled for airlocks on shuttles.
-
-
-
17 April 2018
-
Dax Dupont updated:
-
- - Fixed martial arts/spell granters breaking on interrupt in final stage.
-
-
Naksu updated:
-
- - Welding tools now flash the user as the weld progresses, not just when the welding is started.
- - CentCom officials will now properly display the objectives the admin has assigned them.
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 2e2231d2670..5bd3b454158 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -18538,3 +18538,101 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
console.
- admin: It is now possible to use the ".p" (Asay) and ".d" (Dsay) prefixes while
an admin ghost.
+2018-06-19:
+ Cyberboss:
+ - admin: Speaking in deadchat now shows your rank instead of ADMIN
+ Dax Dupont:
+ - balance: Circuit lab no longer starts with super batteries, they have been replaced
+ with high batteries.
+ - balance: Circuit labs now start with 20 sheets of metal instead of 50/100. Plenty
+ of materials on the station you can gather.
+ - balance: Circuit labs no longer have their own protolathe and autolathe. Science
+ has their own lathes already.
+ - tweak: There's no more entire library worth of equipment, they can go publish
+ the books like the rest of the station, in the library. At least give the librarians
+ something other to do than screaming about lizard porn on the radio.
+ Hyacinth-OR:
+ - rscadd: Added a pink scarf to vendomats
+ Irafas:
+ - rscadd: Players can now ctrl-click the PDA to remove the item in its pen slot
+ JStheguy:
+ - rscadd: Added the data card reader circuit, a circuit that is able to read data
+ cards, as well as write to them.
+ - tweak: Data cards are now longer inexplicably called data disks despite clearly
+ being cards, and can be printed from the "tools" section of the integrated circuit
+ printer.
+ - tweak: Data cards no longer have a special "label card" verb and instead can have
+ their names and descriptions changed with a pen.
+ - rscadd: Also, some aesthetically different variants of the data cards, because
+ why not.
+ - imageadd: Data cards have new sprites, with support for coloring them via the
+ assembly detailer.
+ Naksu:
+ - code_imp: Sped up atmos very slightly
+ ninjanomnom:
+ - rscadd: A plush that knows too much has found its way to the bus ruin.
+2018-06-21:
+ BlueNothing:
+ - tweak: Grabbers can no longer hold circuit assemblies
+ CitrusGender:
+ - bugfix: Ruins air alarms will no longer be reported in the station tablets
+ - bugfix: added a clamp so you can't set a negative multiplier to create materials
+ and create more than 50 items.
+ Cobby:
+ - rscdel: Removed Advanced Mining Scanner from roundstart voucher kits.
+ - rscdel: Removed Explorer Webbing from all voucher kits besides the shelter capsule
+ pack.
+ Denton:
+ - bugfix: The public booze-o-mats and autodrobes on Box/Delta/Meta now have no access
+ requirements, as previously intended.
+ - rscadd: Regular and advanced health analyzers can now be researched and printed.
+ McDonald072:
+ - rscadd: A few new circuits for dealing with atmospherics have been uploaded to
+ your local printers.
+ NewSta:
+ - tweak: made it easier to see from the back whether someone is occupying the shuttle
+ chair or not.
+ SpaceManiac:
+ - tweak: One canister is now suitable to fully stock a vending machine. Relevant
+ cargo packs have been updated.
+ - bugfix: Deconstructing and reconstructing a vending machine no longer creates
+ items from thin air.
+ - bugfix: Using a part replacer on a vending machine no longer empties its inventory.
+ - rscadd: Bluespace RPEDs can now be used to refill vending machines.
+ Tlaltecuhtli:
+ - bugfix: anomaly cores no longer tend to dust
+ YPOQ:
+ - bugfix: Watcher beams will freeze you again
+2018-06-23:
+ Dax Dupont:
+ - imageadd: CHANGE PLACES, SHUTTLE CHAIRS HAVE BEEN CHANGED AGAIN.
+ - admin: Create antags now checks for people being on station before applying.
+ ExcessiveUseOfCobblestone:
+ - spellcheck: Plant disks with potency genes clarify the percent is for potency
+ scaling and not relative to max volume on examine.
+ Kor:
+ - rscadd: Bubblegum has regained his original (deadlier) move set.
+ SpaceManiac:
+ - bugfix: Fire extinguishers on the emergency shuttle are no longer unclickable
+ once removed from their cabinets.
+ kevinz000:
+ - rscadd: Blast cannons have been fixed and are now available for purchase by traitorous
+ scientists for a low low price of 14TC.
+ - rscadd: 'Blast cannons take the explosive power of a TTV bomb and ejects a linear
+ projectile that will apply what the bomb would do to a certain tile at that
+ distance to that tile. However, this will not cause breaches, or gib mobs, unless
+ the gods (admins) so will it. experimental: Blast cannons do not respect maxcap.
+ (Unless the admins so will it.)'
+2018-06-24:
+ CitrusGender:
+ - bugfix: Fixed cyborgs not getting their names at round start
+ - bugfix: Fixed cyborgs and A.I.s being able to bypass appearance bans
+ SpaceManiac:
+ - bugfix: The "Save Logs" option in the chat now actually works (IE 10+ only).
+ Time-Green:
+ - bugfix: Soda is no longer intangible to the laws of physics
+ cinder1992:
+ - rscadd: The Captain can now go down with their station in style! Suicide animation
+ added to the Officer's Sabre.
+ kevinz000:
+ - rscadd: Cyborgs now drop keys on deconstruction/detonation
diff --git a/html/changelogs/AutoChangeLog-pr-38555.yml b/html/changelogs/AutoChangeLog-pr-38555.yml
deleted file mode 100644
index 1c27021e6b1..00000000000
--- a/html/changelogs/AutoChangeLog-pr-38555.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Cyberboss"
-delete-after: True
-changes:
- - admin: "Speaking in deadchat now shows your rank instead of ADMIN"
diff --git a/html/changelogs/AutoChangeLog-pr-38564.yml b/html/changelogs/AutoChangeLog-pr-38564.yml
deleted file mode 100644
index 5f511bce3ae..00000000000
--- a/html/changelogs/AutoChangeLog-pr-38564.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Naksu"
-delete-after: True
-changes:
- - code_imp: "Sped up atmos very slightly"
diff --git a/html/changelogs/AutoChangeLog-pr-38644.yml b/html/changelogs/AutoChangeLog-pr-38644.yml
new file mode 100644
index 00000000000..3683ed1b459
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38644.yml
@@ -0,0 +1,4 @@
+author: "SpaceManiac"
+delete-after: True
+changes:
+ - refactor: "AI static now uses visual contents and should perform better in theory."
diff --git a/html/changelogs/AutoChangeLog-pr-38681.yml b/html/changelogs/AutoChangeLog-pr-38681.yml
new file mode 100644
index 00000000000..3cdbbd96179
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38681.yml
@@ -0,0 +1,4 @@
+author: "MadmanMartian"
+delete-after: True
+changes:
+ - bugfix: "Cameras that are EMPed no longer sound an alarm"
diff --git a/html/changelogs/AutoChangeLog-pr-38682.yml b/html/changelogs/AutoChangeLog-pr-38682.yml
new file mode 100644
index 00000000000..439dcc80f3a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38682.yml
@@ -0,0 +1,4 @@
+author: "Tlaltecuhtli"
+delete-after: True
+changes:
+ - tweak: "tourettes doesnt stack on itself anymore"
diff --git a/html/changelogs/AutoChangeLog-pr-38690.yml b/html/changelogs/AutoChangeLog-pr-38690.yml
new file mode 100644
index 00000000000..23f21fd4d64
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38690.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - rscadd: "R&D deconstructors can now destroy things regardless of if there's a point value or material"
diff --git a/html/changelogs/AutoChangeLog-pr-38693.yml b/html/changelogs/AutoChangeLog-pr-38693.yml
new file mode 100644
index 00000000000..2c1a826ed45
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38693.yml
@@ -0,0 +1,4 @@
+author: "SpaceManiac"
+delete-after: True
+changes:
+ - bugfix: "URLs are no longer auto-linkified in character names and IC messages."
diff --git a/html/changelogs/AutoChangeLog-pr-38696.yml b/html/changelogs/AutoChangeLog-pr-38696.yml
new file mode 100644
index 00000000000..d9f613e1f28
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38696.yml
@@ -0,0 +1,4 @@
+author: "Tlaltecuhtli"
+delete-after: True
+changes:
+ - bugfix: "fixes cult shuttle message repeating"
diff --git a/html/changelogs/AutoChangeLog-pr-38697.yml b/html/changelogs/AutoChangeLog-pr-38697.yml
new file mode 100644
index 00000000000..764069b6535
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38697.yml
@@ -0,0 +1,4 @@
+author: "Dax Dupont"
+delete-after: True
+changes:
+ - admin: "Malf AI machine overloads now are logged/admin messaged."
diff --git a/html/changelogs/AutoChangeLog-pr-38699.yml b/html/changelogs/AutoChangeLog-pr-38699.yml
new file mode 100644
index 00000000000..fef3befb466
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38699.yml
@@ -0,0 +1,4 @@
+author: "Irafas"
+delete-after: True
+changes:
+ - bugfix: "Hardsuit helmets now protect the wearer from pepperspray"
diff --git a/html/changelogs/AutoChangeLog-pr-38702.yml b/html/changelogs/AutoChangeLog-pr-38702.yml
new file mode 100644
index 00000000000..5036847eefe
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38702.yml
@@ -0,0 +1,4 @@
+author: "Naksu"
+delete-after: True
+changes:
+ - code_imp: "Removed unused effect object that could be used to spawn a list of humans"
diff --git a/html/changelogs/AutoChangeLog-pr-38709.yml b/html/changelogs/AutoChangeLog-pr-38709.yml
new file mode 100644
index 00000000000..fba0f2d7d2a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38709.yml
@@ -0,0 +1,4 @@
+author: "SpaceManiac"
+delete-after: True
+changes:
+ - bugfix: "It is once again possible for Cargo to export mechs."
diff --git a/html/changelogs/AutoChangeLog-pr-38711.yml b/html/changelogs/AutoChangeLog-pr-38711.yml
new file mode 100644
index 00000000000..27afc1fafb7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38711.yml
@@ -0,0 +1,4 @@
+author: "SpaceManiac"
+delete-after: True
+changes:
+ - bugfix: "Deaths in the CTF arena are no longer announced to deadchat."
diff --git a/html/changelogs/AutoChangeLog-pr-38725.yml b/html/changelogs/AutoChangeLog-pr-38725.yml
new file mode 100644
index 00000000000..edb95ab6352
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38725.yml
@@ -0,0 +1,4 @@
+author: "Dax Dupont"
+delete-after: True
+changes:
+ - tweak: "The tree of liberty must be refreshed from time to time with the blood of patriots and tyrants. We've removed access requirements from liberation station vendors."
diff --git a/html/changelogs/AutoChangeLog-pr-38727.yml b/html/changelogs/AutoChangeLog-pr-38727.yml
new file mode 100644
index 00000000000..2cb089463c4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38727.yml
@@ -0,0 +1,4 @@
+author: "Irafas"
+delete-after: True
+changes:
+ - bugfix: "Bucket helmets cannot have reagents transferred into them until after they are removed"
diff --git a/html/changelogs/AutoChangeLog-pr-38730.yml b/html/changelogs/AutoChangeLog-pr-38730.yml
new file mode 100644
index 00000000000..ebc17960cef
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-38730.yml
@@ -0,0 +1,8 @@
+author: "Denton"
+delete-after: True
+changes:
+ - tweak: "Camera networks, monitor screens and telescreens have been standardized."
+ - tweak: "Motion-sensitive cameras now show a message when they trigger the alarm."
+ - bugfix: "The Box/Meta auxillary base camera now works."
+ - bugfix: "Bomb test site cameras now emit light, as intended."
+ - bugfix: "Meta: Replaced the RD telescreen in the CE office with the correct one."
diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi
index e6778c51af5..507801844cc 100644
Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ
diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi
index 9247e3ee967..137150bcd44 100644
Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ
diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi
index f0eb8175497..0bf89ab7446 100644
Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ
diff --git a/sound/effects/comfyfire.ogg b/sound/effects/comfyfire.ogg
index 9b796219b3b..1bc7fc02d02 100644
Binary files a/sound/effects/comfyfire.ogg and b/sound/effects/comfyfire.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 92078786f40..cefd5003d81 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -202,6 +202,7 @@
#include "code\controllers\subsystem\blackbox.dm"
#include "code\controllers\subsystem\communications.dm"
#include "code\controllers\subsystem\dbcore.dm"
+#include "code\controllers\subsystem\dcs.dm"
#include "code\controllers\subsystem\disease.dm"
#include "code\controllers\subsystem\events.dm"
#include "code\controllers\subsystem\fire_burning.dm"
@@ -320,6 +321,7 @@
#include "code\datums\components\decal.dm"
#include "code\datums\components\earhealing.dm"
#include "code\datums\components\earprotection.dm"
+#include "code\datums\components\edit_complainer.dm"
#include "code\datums\components\empprotection.dm"
#include "code\datums\components\forced_gravity.dm"
#include "code\datums\components\forensics.dm"
@@ -682,7 +684,6 @@
#include "code\game\objects\effects\forcefields.dm"
#include "code\game\objects\effects\glowshroom.dm"
#include "code\game\objects\effects\landmarks.dm"
-#include "code\game\objects\effects\manifest.dm"
#include "code\game\objects\effects\mines.dm"
#include "code\game\objects\effects\misc.dm"
#include "code\game\objects\effects\overlays.dm"