From 5b686b3d8f155529b735be6e77faeaa68dc34a8a Mon Sep 17 00:00:00 2001 From: xxalpha Date: Tue, 18 Nov 2014 22:20:47 +0000 Subject: [PATCH 01/57] A new datum for handling minerals in machines. --- code/datums/mineral_container.dm | 225 +++++++++++++++++++++ code/modules/clothing/shoes/bananashoes.dm | 41 ++-- tgstation.dme | 1 + 3 files changed, 250 insertions(+), 17 deletions(-) create mode 100644 code/datums/mineral_container.dm diff --git a/code/datums/mineral_container.dm b/code/datums/mineral_container.dm new file mode 100644 index 00000000000..b455d4c6991 --- /dev/null +++ b/code/datums/mineral_container.dm @@ -0,0 +1,225 @@ +/* + This datum should be used for handling mineral contents of machines and whatever else is supposed to hold minerals and make use of them. + One mineral_container var can only handle one type of mineral. + + Variables: + amount - raw amount of the mineral this container holds, calculated by the defined value MINERAL_MATERIAL_AMOUNT=2000. + max_amount - raw amount of mineral this container can hold. + sheet_type - type of the mineral sheet the container handles, used for output. + location - location of the object that this container is being used by, used for output. + sheet_stack_size - size of a stack of sheets. Constant. + + Procs: + New - new + Args: 'obj/O' is the object that uses the mineral container, used to get a location. + 'T' is a type variable. + 'M' is the maximum amount, is 0 by default. + 'A' is an amount, is 0 by default. + ------------------------------- + insert - Converts a number of sheets to a raw amount and adds it to the container. Don't use this directly. + Returns amount of sheets inserted if successful, returns 0 if not successful (container full). + Args: 'A' is an amount of sheets. + ---------------------------------- + insert_sheet - Inserts sheets into the container. Use this for inserting mineral sheets. + Returns the amount of sheets inserted if successful, returns 0 if the container is full, + returns -1 if the object inserted is not a mineral sheet of the type the container handles (see 'sheet_type'). + Args: 'obj/S' is a mineral sheet type object. + ----------------------------------------------- + insert_raw - Inserts a raw amount of mineral into the container. Use this for inserting raw values of mineral. + Returns the raw amount of mineral inserted if successful, returns 0 if not successful (container full or negative amount value). + Args: 'A' is a raw amount value of mineral. + --------------------------------------------- + use - Consumes an amount of mineral. Use this for consuming raw amounts of mineral. + Returns the amount of mineral consumed if successful, returns 0 if not successful (container is empty or negative amount value). + Args: 'A' is a raw amount value of mineral. + --------------------------------------------- + useB - Consumes amounts of mineral. Use this for consuming mineral sheets at a time. + Returns the amount of sheets consumed if successful, returns 0 if not successful (container is empty or negative amount value). + Args: 'A' is an amount of sheets. + ----------------------------------- + retrieve - Spawns mineral sheets at 'location'. Use this to retrieve an amount of sheets. + Returns amount of sheets spawned if successful, returns 0 if not successful (not enough mineral or negative amount value). + Args: 'A' is an amount of sheets. + ----------------------------------- + retrieveB - Spawns mineral sheets at 'location' based on a raw mineral amount input. + Returns amount of sheets spawned if successful, returns 0 if not successful. + Args: 'A' is a raw mineral amount value. + ------------------------------------------ + retrieve_all - Spawns all the mineral inside the container at 'location'. Use this to get all the mineral inside the container easily. + Returns amount of sheets spawned if successful, returns 0 if not successful. + Args: None. + ------------- + modLoc - Changes 'location' based on an obj input. Only use this if the object using the container is not stationary. All machines are stationary. + Returns null if obj input is null. + Args: 'obj/O' is the object that uses the mineral container. + -------------------------------------------------------------- + accepts - Checks if the 'obj/O' is a mineral sheet of the same type as 'sheet_type'. + Returns 1 if 'obj/O' is a valid mineral sheet object, 0 if otherwise. + Args: 'obj/O' is any object. + ------------------------------ + isFull - Checks if the container is full. + Returns 1 if the container is full, 0 if otherwise. + Args: None. + ------------- + isEmpty - Checks if the container is empty. + Returns 1 if the container is empty, 0 if otherwise. + Args: None. + ------------- + amount2sheet - Converts a raw mineral amount to a number of mineral sheets. + Returns a positive amount of sheets if successful, 0 if not successful (invalid amount input). + Args: 'A' is a raw mineral amount. + ------------------------------------ + sheet2amount - Converts a number of sheets to a raw mineral amount. + Returns a positive amount of mineral if successful, 0 if not successful (invalid sheet number input). + Args: 'A' is a number of mineral sheets. + ------------------------------------------ + + Self-explanatory procs: + getAmount ; getMaxAmount ; getType + + Other (might remove): + cleanup + + WIP (?): + upgrade - changes max_amount, for machine upgrades. +*/ +/datum/mineral_container + var/amount + var/max_amount + var/sheet_type + var/location + var/const/sheet_stack_size = 50 + //MINERAL_MATERIAL_AMOUNT = 2000 + +/datum/mineral_container/New(obj/O, T, M = 0, A = 0) + if(!O) + return + location = get_turf(O.loc) + + sheet_type = T + + if(A < 0) + amount = 0 + else + amount = A + + if(M < 0) + max_amount = 0 + else + max_amount = M + +/datum/mineral_container/proc/insert(A) + if(A > 0) + var/rawA = A * MINERAL_MATERIAL_AMOUNT + if(rawA <= (max_amount - amount)) + amount += rawA + return A + return 0 + +/datum/mineral_container/proc/insert_sheet(obj/S) + if(accepts(S)) + if(!isFull()) + var/obj/item/stack/sheet/sheet = S + var/sht_amt = amount2sheet(max_amount - amount) + if(sht_amt >= sheet.amount) + return insert(sheet.amount) + else + return insert(sht_amt) + return 0 + return -1 + +/datum/mineral_container/proc/insert_raw(A) + if(A > 0 & !isFull()) + if(A <= max_amount - amount) + amount += A + return A + return 0 + +/datum/mineral_container/proc/use(A) + if(A > 0 & !isEmpty()) + if(amount >= A) + amount -= A + return A + return 0 + +/datum/mineral_container/proc/useB(A) + if(A > 0 & !isEmpty()) + if(amount >= (A * MINERAL_MATERIAL_AMOUNT)) + amount -= A + return A + return 0 + +/datum/mineral_container/proc/retrieve(A) + if(A > 0 && amount >= (A * MINERAL_MATERIAL_AMOUNT)) + var/count = 0 + var/obj/item/stack/sheet/S + + while(A > sheet_stack_size) + S = new sheet_type(location) + S.amount = sheet_stack_size + count += A + amount -= A * MINERAL_MATERIAL_AMOUNT + A -= sheet_stack_size + + if(round(amount / MINERAL_MATERIAL_AMOUNT)) + S = new sheet_type(location) + S.amount = A + count += A + amount -= A * MINERAL_MATERIAL_AMOUNT + return count + return 0 + +/datum/mineral_container/proc/retrieveB(A) + if(A > 0) + return retrieve(amount2sheet(A)) + return 0 + +/datum/mineral_container/proc/retrieve_all() + return retrieve(amount2sheet(amount)) + +/datum/mineral_container/proc/modLoc(obj/O) + if(!O) + return + location = get_turf(O.loc) + +/datum/mineral_container/proc/accepts(obj/O) + return(istype(O,sheet_type)) + +/datum/mineral_container/proc/isFull() + return amount >= max_amount + +/datum/mineral_container/proc/isEmpty() + return amount <= 0 + +/datum/mineral_container/proc/getAmount() + return amount + +/datum/mineral_container/proc/getMaxAmount() + return max_amount + +/datum/mineral_container/proc/getType() + return sheet_type + +/datum/mineral_container/proc/amount2sheet(A) + if(A >= MINERAL_MATERIAL_AMOUNT) + return round(A / MINERAL_MATERIAL_AMOUNT) + return 0 + +/datum/mineral_container/proc/sheet2amount(A) + if(A > 0) + return A * MINERAL_MATERIAL_AMOUNT + return 0 + +/datum/mineral_container/proc/cleanup() + if(!location) + qdel(src) + if(!sheet_type || !ispath(sheet_type)) + qdel(src) + + if(amount < 0) + amount = 0 + else if(amount > max_amount) + amount = max_amount + +/datum/mineral_container/proc/upgrade(M) + max_amount = M \ No newline at end of file diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index 6c1999ac6e1..ae5dac35bf2 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -5,9 +5,13 @@ desc = "Lost prototype of advanced clown tech. Powered by bananium, these shoes leave a trail of chaos in their wake." icon_state = "clown_prototype_off" var/on = 0 - var/bananium = 0 + var/datum/mineral_container/bananium action_button_name = "Toggle Shoes" +/obj/item/clothing/shoes/clown_shoes/banana_shoes/New() + ..() + bananium = new/datum/mineral_container(loc,/obj/item/stack/sheet/mineral/bananium,200000) + /obj/item/clothing/shoes/clown_shoes/banana_shoes/step_action() if(on) if(footstep > 1)//honks when activated @@ -17,8 +21,8 @@ footstep++ new/obj/item/weapon/grown/bananapeel/specialpeel(get_step(src,turn(usr.dir, 180)), 5) //honk - bananium -= 100 - if(bananium < 100) + bananium.use(100) + if(bananium.getAmount() < 100) on = !on update_icon() usr << "You ran out of bananium!" @@ -26,27 +30,30 @@ ..() /obj/item/clothing/shoes/clown_shoes/banana_shoes/attack_self(mob/user) - if(bananium > 0) - var/sheet_amount = round(bananium / 2000) - if(sheet_amount > 0) - var/obj/item/stack/sheet/mineral/bananium/M = new/obj/item/stack/sheet/mineral/bananium(get_turf(loc)) - M.amount = sheet_amount - bananium -= sheet_amount * 2000 - user << "You retrieve [sheet_amount] sheets of bananium." + bananium.modLoc(src) + var/sheet_amount = bananium.retrieve_all() + if(sheet_amount) + user << "You retrieve [sheet_amount] sheets of bananium from the prototype shoes." + else + user << "You cannot retrieve any bananium from the prototype shoes." /obj/item/clothing/shoes/clown_shoes/banana_shoes/attackby(obj/item/O, mob/user) - if(istype(O,/obj/item/stack/sheet/mineral/bananium)) - var/obj/item/stack/sheet/mineral/bananium/M = O - bananium += 2000 * M.amount - user << "You insert [M.amount] bananium sheets into the prototype shoes." - M.use(M.amount) + var/sheet_amount = bananium.insert_sheet(O) + if(sheet_amount > 0) + user << "You insert [sheet_amount] bananium sheets into the prototype shoes." + var/obj/item/stack/sheet/S = O + S.use(sheet_amount) + else if(sheet_amount < 0) + user << "You can only fit bananium sheets into these shoes!" + else + user << "You cannot insert more bananium into the prototype shoes." /obj/item/clothing/shoes/clown_shoes/banana_shoes/examine(mob/user) ..() - user << "The shoes are [on ? "enabled" : "disabled"]. There is [bananium] bananium left." + user << "The shoes are [on ? "enabled" : "disabled"]. There is [bananium.getAmount()] bananium left." /obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click() - if(bananium > 0) + if(bananium.getAmount() > 0) on = !on update_icon() usr << "You [on ? "activate" : "deactivate"] the prototype shoes." diff --git a/tgstation.dme b/tgstation.dme index 850d77cae7b..33bef58257a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -131,6 +131,7 @@ #include "code\datums\datumvars.dm" #include "code\datums\gas_mixture.dm" #include "code\datums\mind.dm" +#include "code\datums\mineral_container.dm" #include "code\datums\mixed.dm" #include "code\datums\modules.dm" #include "code\datums\recipe.dm" From d281aa63619e2bba02df9a768937d029e8aa99fb Mon Sep 17 00:00:00 2001 From: xxalpha Date: Wed, 19 Nov 2014 19:14:07 +0000 Subject: [PATCH 02/57] Changed comments and names of vars. --- code/datums/mineral_container.dm | 181 ++++++--------------- code/modules/clothing/shoes/bananashoes.dm | 2 +- 2 files changed, 48 insertions(+), 135 deletions(-) diff --git a/code/datums/mineral_container.dm b/code/datums/mineral_container.dm index b455d4c6991..953e1607757 100644 --- a/code/datums/mineral_container.dm +++ b/code/datums/mineral_container.dm @@ -7,81 +7,7 @@ max_amount - raw amount of mineral this container can hold. sheet_type - type of the mineral sheet the container handles, used for output. location - location of the object that this container is being used by, used for output. - sheet_stack_size - size of a stack of sheets. Constant. - - Procs: - New - new - Args: 'obj/O' is the object that uses the mineral container, used to get a location. - 'T' is a type variable. - 'M' is the maximum amount, is 0 by default. - 'A' is an amount, is 0 by default. - ------------------------------- - insert - Converts a number of sheets to a raw amount and adds it to the container. Don't use this directly. - Returns amount of sheets inserted if successful, returns 0 if not successful (container full). - Args: 'A' is an amount of sheets. - ---------------------------------- - insert_sheet - Inserts sheets into the container. Use this for inserting mineral sheets. - Returns the amount of sheets inserted if successful, returns 0 if the container is full, - returns -1 if the object inserted is not a mineral sheet of the type the container handles (see 'sheet_type'). - Args: 'obj/S' is a mineral sheet type object. - ----------------------------------------------- - insert_raw - Inserts a raw amount of mineral into the container. Use this for inserting raw values of mineral. - Returns the raw amount of mineral inserted if successful, returns 0 if not successful (container full or negative amount value). - Args: 'A' is a raw amount value of mineral. - --------------------------------------------- - use - Consumes an amount of mineral. Use this for consuming raw amounts of mineral. - Returns the amount of mineral consumed if successful, returns 0 if not successful (container is empty or negative amount value). - Args: 'A' is a raw amount value of mineral. - --------------------------------------------- - useB - Consumes amounts of mineral. Use this for consuming mineral sheets at a time. - Returns the amount of sheets consumed if successful, returns 0 if not successful (container is empty or negative amount value). - Args: 'A' is an amount of sheets. - ----------------------------------- - retrieve - Spawns mineral sheets at 'location'. Use this to retrieve an amount of sheets. - Returns amount of sheets spawned if successful, returns 0 if not successful (not enough mineral or negative amount value). - Args: 'A' is an amount of sheets. - ----------------------------------- - retrieveB - Spawns mineral sheets at 'location' based on a raw mineral amount input. - Returns amount of sheets spawned if successful, returns 0 if not successful. - Args: 'A' is a raw mineral amount value. - ------------------------------------------ - retrieve_all - Spawns all the mineral inside the container at 'location'. Use this to get all the mineral inside the container easily. - Returns amount of sheets spawned if successful, returns 0 if not successful. - Args: None. - ------------- - modLoc - Changes 'location' based on an obj input. Only use this if the object using the container is not stationary. All machines are stationary. - Returns null if obj input is null. - Args: 'obj/O' is the object that uses the mineral container. - -------------------------------------------------------------- - accepts - Checks if the 'obj/O' is a mineral sheet of the same type as 'sheet_type'. - Returns 1 if 'obj/O' is a valid mineral sheet object, 0 if otherwise. - Args: 'obj/O' is any object. - ------------------------------ - isFull - Checks if the container is full. - Returns 1 if the container is full, 0 if otherwise. - Args: None. - ------------- - isEmpty - Checks if the container is empty. - Returns 1 if the container is empty, 0 if otherwise. - Args: None. - ------------- - amount2sheet - Converts a raw mineral amount to a number of mineral sheets. - Returns a positive amount of sheets if successful, 0 if not successful (invalid amount input). - Args: 'A' is a raw mineral amount. - ------------------------------------ - sheet2amount - Converts a number of sheets to a raw mineral amount. - Returns a positive amount of mineral if successful, 0 if not successful (invalid sheet number input). - Args: 'A' is a number of mineral sheets. - ------------------------------------------ - - Self-explanatory procs: - getAmount ; getMaxAmount ; getType - - Other (might remove): - cleanup - - WIP (?): - upgrade - changes max_amount, for machine upgrades. + sheet_stack_size - size of a stack of mineral sheets. Constant. */ /datum/mineral_container var/amount @@ -91,29 +17,29 @@ var/const/sheet_stack_size = 50 //MINERAL_MATERIAL_AMOUNT = 2000 -/datum/mineral_container/New(obj/O, T, M = 0, A = 0) +/datum/mineral_container/New(obj/O, sht_type, max_amt = 0, amt = 0) if(!O) return location = get_turf(O.loc) - sheet_type = T + sheet_type = sht_type - if(A < 0) + if(amt < 0) amount = 0 else - amount = A + amount = amt - if(M < 0) + if(max_amt < 0) max_amount = 0 else - max_amount = M + max_amount = max_amt -/datum/mineral_container/proc/insert(A) - if(A > 0) - var/rawA = A * MINERAL_MATERIAL_AMOUNT - if(rawA <= (max_amount - amount)) - amount += rawA - return A +/datum/mineral_container/proc/insert(sheet_amt) + if(sheet_amt > 0) + var/amt = sheet_amt * MINERAL_MATERIAL_AMOUNT + if(amt <= (max_amount - amount)) + amount += amt + return sheet_amt return 0 /datum/mineral_container/proc/insert_sheet(obj/S) @@ -128,62 +54,60 @@ return 0 return -1 -/datum/mineral_container/proc/insert_raw(A) - if(A > 0 & !isFull()) - if(A <= max_amount - amount) - amount += A - return A +/datum/mineral_container/proc/insert_amount(amt) + if(amt > 0 & !isFull()) + if(amt <= max_amount - amount) + amount += amt + return amt return 0 -/datum/mineral_container/proc/use(A) - if(A > 0 & !isEmpty()) - if(amount >= A) - amount -= A - return A +/datum/mineral_container/proc/use_amount(amt) //for consuming mineral + if(amt > 0 & !isEmpty()) + if(amount >= amt) + amount -= amt + return amt return 0 -/datum/mineral_container/proc/useB(A) - if(A > 0 & !isEmpty()) - if(amount >= (A * MINERAL_MATERIAL_AMOUNT)) - amount -= A - return A +/datum/mineral_container/proc/use_sheets(sheet_amt) //for consuming mineral + if(sheet_amt > 0 & !isEmpty()) + if(amount >= (sheet_amt * MINERAL_MATERIAL_AMOUNT)) + amount -= sheet_amt + return sheet_amt return 0 -/datum/mineral_container/proc/retrieve(A) - if(A > 0 && amount >= (A * MINERAL_MATERIAL_AMOUNT)) +/datum/mineral_container/proc/retrieve(sheet_amt) + if(sheet_amt > 0 && amount >= (sheet_amt * MINERAL_MATERIAL_AMOUNT)) var/count = 0 var/obj/item/stack/sheet/S - while(A > sheet_stack_size) + while(sheet_amt > sheet_stack_size) S = new sheet_type(location) S.amount = sheet_stack_size - count += A - amount -= A * MINERAL_MATERIAL_AMOUNT - A -= sheet_stack_size + count += sheet_stack_size + amount -= sheet_stack_size * MINERAL_MATERIAL_AMOUNT + sheet_amt -= sheet_stack_size if(round(amount / MINERAL_MATERIAL_AMOUNT)) S = new sheet_type(location) - S.amount = A - count += A - amount -= A * MINERAL_MATERIAL_AMOUNT + S.amount = sheet_amt + count += sheet_amt + amount -= sheet_amt * MINERAL_MATERIAL_AMOUNT return count return 0 -/datum/mineral_container/proc/retrieveB(A) - if(A > 0) - return retrieve(amount2sheet(A)) - return 0 +/datum/mineral_container/proc/retrieve_amount(amt) + return retrieve(amount2sheet(amt)) /datum/mineral_container/proc/retrieve_all() return retrieve(amount2sheet(amount)) -/datum/mineral_container/proc/modLoc(obj/O) +/datum/mineral_container/proc/modLoc(obj/O) //obj/O is the object using the container (example: autolathe) ; Use if the object using the container is not stationary or somehow changes place. if(!O) return location = get_turf(O.loc) /datum/mineral_container/proc/accepts(obj/O) - return(istype(O,sheet_type)) + return istype(O,sheet_type) /datum/mineral_container/proc/isFull() return amount >= max_amount @@ -200,26 +124,15 @@ /datum/mineral_container/proc/getType() return sheet_type -/datum/mineral_container/proc/amount2sheet(A) - if(A >= MINERAL_MATERIAL_AMOUNT) - return round(A / MINERAL_MATERIAL_AMOUNT) +/datum/mineral_container/proc/amount2sheet(amt) + if(amt >= MINERAL_MATERIAL_AMOUNT) + return round(amt / MINERAL_MATERIAL_AMOUNT) return 0 -/datum/mineral_container/proc/sheet2amount(A) - if(A > 0) - return A * MINERAL_MATERIAL_AMOUNT +/datum/mineral_container/proc/sheet2amount(sheet_amt) + if(sheet_amt > 0) + return sheet_amt * MINERAL_MATERIAL_AMOUNT return 0 -/datum/mineral_container/proc/cleanup() - if(!location) - qdel(src) - if(!sheet_type || !ispath(sheet_type)) - qdel(src) - - if(amount < 0) - amount = 0 - else if(amount > max_amount) - amount = max_amount - /datum/mineral_container/proc/upgrade(M) max_amount = M \ No newline at end of file diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index ae5dac35bf2..506b9b48ade 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -21,7 +21,7 @@ footstep++ new/obj/item/weapon/grown/bananapeel/specialpeel(get_step(src,turn(usr.dir, 180)), 5) //honk - bananium.use(100) + bananium.use_amount(100) if(bananium.getAmount() < 100) on = !on update_icon() From 3593f4701f5f53c574beef7c6ae2ab9e5047efce Mon Sep 17 00:00:00 2001 From: xxalpha Date: Sat, 3 Jan 2015 15:08:50 +0000 Subject: [PATCH 03/57] Removed unnecessary procs. --- code/datums/mineral_container.dm | 103 ++++++++++++++------- code/modules/clothing/shoes/bananashoes.dm | 9 +- 2 files changed, 74 insertions(+), 38 deletions(-) diff --git a/code/datums/mineral_container.dm b/code/datums/mineral_container.dm index 953e1607757..d4dc10777ff 100644 --- a/code/datums/mineral_container.dm +++ b/code/datums/mineral_container.dm @@ -6,33 +6,25 @@ amount - raw amount of the mineral this container holds, calculated by the defined value MINERAL_MATERIAL_AMOUNT=2000. max_amount - raw amount of mineral this container can hold. sheet_type - type of the mineral sheet the container handles, used for output. - location - location of the object that this container is being used by, used for output. + owner - object that this container is being used by, used for output. sheet_stack_size - size of a stack of mineral sheets. Constant. */ /datum/mineral_container var/amount var/max_amount var/sheet_type - var/location + var/obj/owner var/const/sheet_stack_size = 50 //MINERAL_MATERIAL_AMOUNT = 2000 /datum/mineral_container/New(obj/O, sht_type, max_amt = 0, amt = 0) - if(!O) - return - location = get_turf(O.loc) + if(!O) return + owner = O sheet_type = sht_type - if(amt < 0) - amount = 0 - else - amount = amt - - if(max_amt < 0) - max_amount = 0 - else - max_amount = max_amt + amount = max(0, amt) + max_amount = max(0, max_amt) /datum/mineral_container/proc/insert(sheet_amt) if(sheet_amt > 0) @@ -81,14 +73,14 @@ var/obj/item/stack/sheet/S while(sheet_amt > sheet_stack_size) - S = new sheet_type(location) + S = new sheet_type(get_turf(owner)) S.amount = sheet_stack_size count += sheet_stack_size amount -= sheet_stack_size * MINERAL_MATERIAL_AMOUNT sheet_amt -= sheet_stack_size if(round(amount / MINERAL_MATERIAL_AMOUNT)) - S = new sheet_type(location) + S = new sheet_type(get_turf(owner)) S.amount = sheet_amt count += sheet_amt amount -= sheet_amt * MINERAL_MATERIAL_AMOUNT @@ -101,29 +93,16 @@ /datum/mineral_container/proc/retrieve_all() return retrieve(amount2sheet(amount)) -/datum/mineral_container/proc/modLoc(obj/O) //obj/O is the object using the container (example: autolathe) ; Use if the object using the container is not stationary or somehow changes place. - if(!O) - return - location = get_turf(O.loc) - /datum/mineral_container/proc/accepts(obj/O) return istype(O,sheet_type) -/datum/mineral_container/proc/isFull() +/datum/mineral_container/proc/isFull(amt = 0) + if(amt) return amt + amount > max_amount return amount >= max_amount /datum/mineral_container/proc/isEmpty() return amount <= 0 -/datum/mineral_container/proc/getAmount() - return amount - -/datum/mineral_container/proc/getMaxAmount() - return max_amount - -/datum/mineral_container/proc/getType() - return sheet_type - /datum/mineral_container/proc/amount2sheet(amt) if(amt >= MINERAL_MATERIAL_AMOUNT) return round(amt / MINERAL_MATERIAL_AMOUNT) @@ -134,5 +113,63 @@ return sheet_amt * MINERAL_MATERIAL_AMOUNT return 0 -/datum/mineral_container/proc/upgrade(M) - max_amount = M \ No newline at end of file +/* +/datum/mineral_container_combo + var/datum/mineral_container/m_cont + var/datum/mineral_container/g_cont + var/obj/owner + +/datum/mineral_container_combo/New(obj/O,max_amt = 0, amt = 0) + m_cont = new /datum/mineral_container(O,/obj/item/stack/sheet/metal,max_amt,amt) + g_cont = new /datum/mineral_container(O,/obj/item/stack/sheet/glass,max_amt,amt) + +/datum/mineral_container_combo/proc/insert_stack(obj/item/stack/S) + var/m_amt = S.m_amt * S.amount + var/g_amt = S.g_amt * S.amount + + if(!(m_cont.isFull(m_amt) || g_cont.isFull(g_amt))) + m_cont.insert_amount(m_amt) + g_cont.insert_amount(g_amt) + return m_amt + g_amt + return 0 + +/datum/mineral_container_combo/proc/insert(obj/item/O) + var/m_amt = O.m_amt + var/g_amt = O.g_amt + + if(!(m_cont.isFull(m_amt) || g_cont.isFull(g_amt))) + m_cont.insert_amount(m_amt) + g_cont.insert_amount(g_amt) + return m_amt + g_amt + return 0 + +/datum/mineral_container_combo/proc/insert_sheet(obj/item/stack/sheet/S) + var/a = sheet2num(S) + switch(a) + if(1) + return m_cont.insert_sheet(S) + if(2) + return g_cont.insert_sheet(S) + else + return -99 + +/datum/mineral_container_combo/proc/isFull() + return m_cont.isFull() | (g_cont.isFull() * 2) //returns 0 if neither is full, 1 if only metal is full, 2 if only glass is full, 3 if both are full + +/datum/mineral_container_combo/proc/isEmpty() + return m_cont.isEmpty() | (g_cont.isEmpty() * 2) +*/ + +/proc/sheet2num(obj/item/stack/sheet/S) + if(istype(S,/obj/item/stack/sheet/metal) && !istype(S,/obj/item/stack/sheet/metal/cyborg)) + return 1 + if(istype(S,/obj/item/stack/sheet/glass) && !istype(S,/obj/item/stack/sheet/glass/cyborg)) + return 2 + if(istype(S,/obj/item/stack/sheet/mineral/plasma)) return 3 + if(istype(S,/obj/item/stack/sheet/plasteel)) return 4 + if(istype(S,/obj/item/stack/sheet/mineral/silver)) return 5 + if(istype(S,/obj/item/stack/sheet/mineral/gold)) return 6 + if(istype(S,/obj/item/stack/sheet/mineral/diamond)) return 7 + if(istype(S,/obj/item/stack/sheet/mineral/bananium)) return 8 + if(istype(S,/obj/item/stack/sheet/mineral/wood)) return 9 + return 0 diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index 506b9b48ade..166f84fd70e 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -22,7 +22,7 @@ new/obj/item/weapon/grown/bananapeel/specialpeel(get_step(src,turn(usr.dir, 180)), 5) //honk bananium.use_amount(100) - if(bananium.getAmount() < 100) + if(bananium.amount < 100) on = !on update_icon() usr << "You ran out of bananium!" @@ -30,7 +30,6 @@ ..() /obj/item/clothing/shoes/clown_shoes/banana_shoes/attack_self(mob/user) - bananium.modLoc(src) var/sheet_amount = bananium.retrieve_all() if(sheet_amount) user << "You retrieve [sheet_amount] sheets of bananium from the prototype shoes." @@ -50,10 +49,10 @@ /obj/item/clothing/shoes/clown_shoes/banana_shoes/examine(mob/user) ..() - user << "The shoes are [on ? "enabled" : "disabled"]. There is [bananium.getAmount()] bananium left." + user << "The shoes are [on ? "enabled" : "disabled"]. There is [bananium.amount] bananium left." /obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click() - if(bananium.getAmount() > 0) + if(bananium.amount > 0) on = !on update_icon() usr << "You [on ? "activate" : "deactivate"] the prototype shoes." @@ -65,4 +64,4 @@ icon_state = "clown_prototype_on" else icon_state = "clown_prototype_off" - usr.update_inv_shoes() \ No newline at end of file + usr.update_inv_shoes() From f38683b8712a2da8e8153984d5ebdc1a5aa514c0 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Sat, 23 May 2015 22:39:17 +0100 Subject: [PATCH 04/57] Fixed a few small things. --- code/__DEFINES/misc.dm | 3 +- code/datums/mineral_container.dm | 102 +++++---------------- code/modules/clothing/shoes/bananashoes.dm | 12 +-- tgstation.dme | 1 - 4 files changed, 30 insertions(+), 88 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index bbb172cfe83..45d1a306ea9 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -81,7 +81,8 @@ #define MINERAL_MATERIAL_AMOUNT 2000 //The amount of materials you get from a sheet of mineral like iron/diamond/glass etc - +#define MAX_STACK_SIZE 50 +//The maximum size of a stack object. #define CLICK_CD_MELEE 8 #define CLICK_CD_RANGE 4 diff --git a/code/datums/mineral_container.dm b/code/datums/mineral_container.dm index d4dc10777ff..78894e8223c 100644 --- a/code/datums/mineral_container.dm +++ b/code/datums/mineral_container.dm @@ -3,29 +3,28 @@ One mineral_container var can only handle one type of mineral. Variables: - amount - raw amount of the mineral this container holds, calculated by the defined value MINERAL_MATERIAL_AMOUNT=2000. - max_amount - raw amount of mineral this container can hold. + amount - raw amount of the mineral this container is holding, calculated by the defined value MINERAL_MATERIAL_AMOUNT=2000. + max_amount - max raw amount of mineral this container can hold. sheet_type - type of the mineral sheet the container handles, used for output. owner - object that this container is being used by, used for output. - sheet_stack_size - size of a stack of mineral sheets. Constant. + MAX_STACK_SIZE - size of a stack of mineral sheets. Constant. */ /datum/mineral_container var/amount var/max_amount var/sheet_type var/obj/owner - var/const/sheet_stack_size = 50 + //MAX_STACK_SIZE = 50 //MINERAL_MATERIAL_AMOUNT = 2000 -/datum/mineral_container/New(obj/O, sht_type, max_amt = 0, amt = 0) +/datum/mineral_container/New(obj/O, type, max_amt = 0, amt = 0) if(!O) return owner = O - - sheet_type = sht_type - + sheet_type = type amount = max(0, amt) max_amount = max(0, max_amt) +//For inserting an amount of mineral sheets /datum/mineral_container/proc/insert(sheet_amt) if(sheet_amt > 0) var/amt = sheet_amt * MINERAL_MATERIAL_AMOUNT @@ -34,6 +33,7 @@ return sheet_amt return 0 +//For inserting a mineral sheet /datum/mineral_container/proc/insert_sheet(obj/S) if(accepts(S)) if(!isFull()) @@ -46,6 +46,7 @@ return 0 return -1 +//For inserting an amount of material /datum/mineral_container/proc/insert_amount(amt) if(amt > 0 & !isFull()) if(amt <= max_amount - amount) @@ -53,31 +54,34 @@ return amt return 0 -/datum/mineral_container/proc/use_amount(amt) //for consuming mineral +//For consuming material (amt = amount of material) +/datum/mineral_container/proc/use_amount(amt) if(amt > 0 & !isEmpty()) if(amount >= amt) amount -= amt return amt return 0 -/datum/mineral_container/proc/use_sheets(sheet_amt) //for consuming mineral +//For consuming material (sheet_amt = amount of material equivalent to a number of sheets) +/datum/mineral_container/proc/use_sheets(sheet_amt) if(sheet_amt > 0 & !isEmpty()) if(amount >= (sheet_amt * MINERAL_MATERIAL_AMOUNT)) amount -= sheet_amt return sheet_amt return 0 +//For spawning mineral sheets /datum/mineral_container/proc/retrieve(sheet_amt) if(sheet_amt > 0 && amount >= (sheet_amt * MINERAL_MATERIAL_AMOUNT)) var/count = 0 var/obj/item/stack/sheet/S - while(sheet_amt > sheet_stack_size) + while(sheet_amt > MAX_STACK_SIZE) S = new sheet_type(get_turf(owner)) - S.amount = sheet_stack_size - count += sheet_stack_size - amount -= sheet_stack_size * MINERAL_MATERIAL_AMOUNT - sheet_amt -= sheet_stack_size + S.amount = MAX_STACK_SIZE + count += MAX_STACK_SIZE + amount -= MAX_STACK_SIZE * MINERAL_MATERIAL_AMOUNT + sheet_amt -= MAX_STACK_SIZE if(round(amount / MINERAL_MATERIAL_AMOUNT)) S = new sheet_type(get_turf(owner)) @@ -97,11 +101,10 @@ return istype(O,sheet_type) /datum/mineral_container/proc/isFull(amt = 0) - if(amt) return amt + amount > max_amount - return amount >= max_amount + return (amount + amt) >= max_amount -/datum/mineral_container/proc/isEmpty() - return amount <= 0 +/datum/mineral_container/proc/isEmpty(amt = 0) + return (amount - amt) <= 0 /datum/mineral_container/proc/amount2sheet(amt) if(amt >= MINERAL_MATERIAL_AMOUNT) @@ -112,64 +115,3 @@ if(sheet_amt > 0) return sheet_amt * MINERAL_MATERIAL_AMOUNT return 0 - -/* -/datum/mineral_container_combo - var/datum/mineral_container/m_cont - var/datum/mineral_container/g_cont - var/obj/owner - -/datum/mineral_container_combo/New(obj/O,max_amt = 0, amt = 0) - m_cont = new /datum/mineral_container(O,/obj/item/stack/sheet/metal,max_amt,amt) - g_cont = new /datum/mineral_container(O,/obj/item/stack/sheet/glass,max_amt,amt) - -/datum/mineral_container_combo/proc/insert_stack(obj/item/stack/S) - var/m_amt = S.m_amt * S.amount - var/g_amt = S.g_amt * S.amount - - if(!(m_cont.isFull(m_amt) || g_cont.isFull(g_amt))) - m_cont.insert_amount(m_amt) - g_cont.insert_amount(g_amt) - return m_amt + g_amt - return 0 - -/datum/mineral_container_combo/proc/insert(obj/item/O) - var/m_amt = O.m_amt - var/g_amt = O.g_amt - - if(!(m_cont.isFull(m_amt) || g_cont.isFull(g_amt))) - m_cont.insert_amount(m_amt) - g_cont.insert_amount(g_amt) - return m_amt + g_amt - return 0 - -/datum/mineral_container_combo/proc/insert_sheet(obj/item/stack/sheet/S) - var/a = sheet2num(S) - switch(a) - if(1) - return m_cont.insert_sheet(S) - if(2) - return g_cont.insert_sheet(S) - else - return -99 - -/datum/mineral_container_combo/proc/isFull() - return m_cont.isFull() | (g_cont.isFull() * 2) //returns 0 if neither is full, 1 if only metal is full, 2 if only glass is full, 3 if both are full - -/datum/mineral_container_combo/proc/isEmpty() - return m_cont.isEmpty() | (g_cont.isEmpty() * 2) -*/ - -/proc/sheet2num(obj/item/stack/sheet/S) - if(istype(S,/obj/item/stack/sheet/metal) && !istype(S,/obj/item/stack/sheet/metal/cyborg)) - return 1 - if(istype(S,/obj/item/stack/sheet/glass) && !istype(S,/obj/item/stack/sheet/glass/cyborg)) - return 2 - if(istype(S,/obj/item/stack/sheet/mineral/plasma)) return 3 - if(istype(S,/obj/item/stack/sheet/plasteel)) return 4 - if(istype(S,/obj/item/stack/sheet/mineral/silver)) return 5 - if(istype(S,/obj/item/stack/sheet/mineral/gold)) return 6 - if(istype(S,/obj/item/stack/sheet/mineral/diamond)) return 7 - if(istype(S,/obj/item/stack/sheet/mineral/bananium)) return 8 - if(istype(S,/obj/item/stack/sheet/mineral/wood)) return 9 - return 0 diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index 52a6874ef0f..f574c6a88cc 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -10,11 +10,11 @@ /obj/item/clothing/shoes/clown_shoes/banana_shoes/New() ..() - bananium = new/datum/mineral_container(loc,/obj/item/stack/sheet/mineral/bananium,200000) + bananium = new/datum/mineral_container(src,/obj/item/stack/sheet/mineral/bananium,200000) /obj/item/clothing/shoes/clown_shoes/banana_shoes/step_action() if(on) - if(footstep > 1)//honks when activated + if(footstep > 1)//honks when its on playsound(src, "sound/items/bikehorn.ogg", 75, 1) footstep = 0 else @@ -25,7 +25,7 @@ if(bananium.amount < 100) on = !on update_icon() - usr << "You ran out of bananium!" + loc << "You ran out of bananium!" else ..() @@ -52,12 +52,12 @@ user << "The shoes are [on ? "enabled" : "disabled"]. There is [bananium.amount] bananium left." /obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click() - if(bananium.amount > 0) + if(bananium.amount) on = !on update_icon() - usr << "You [on ? "activate" : "deactivate"] the prototype shoes." + loc << "You [on ? "activate" : "deactivate"] the prototype shoes." else - usr << "You need bananium to turn the prototype shoes on!" + loc << "You need bananium to turn the prototype shoes on!" /obj/item/clothing/shoes/clown_shoes/banana_shoes/update_icon() if(on) diff --git a/tgstation.dme b/tgstation.dme index 5cd3950e3e6..8b99daaec35 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -155,7 +155,6 @@ #include "code\datums\martial.dm" #include "code\datums\mind.dm" #include "code\datums\mineral_container.dm" -#include "code\datums\mixed.dm" #include "code\datums\modules.dm" #include "code\datums\mutations.dm" #include "code\datums\recipe.dm" From 887f8d86a97e81cbafbaf4315e2983a8d6b133b9 Mon Sep 17 00:00:00 2001 From: CorruptComputer Date: Thu, 4 Jun 2015 09:31:00 -0500 Subject: [PATCH 05/57] Updates MapMerge --- .../mapmerge/{MapPatcher.jar => MapMerge.jar} | Bin 10136 -> 12677 bytes .../{prepare_map.bat => Prepare Maps.bat} | 0 tools/mapmerge/Run Map Merge.bat | 5 + tools/mapmerge/Source/Location.java | 42 --- tools/mapmerge/Source/META-INF/MANIFEST.MF | 4 - tools/mapmerge/Source/Map.java | 314 ------------------ tools/mapmerge/Source/MapPatcher.java | 304 ----------------- tools/mapmerge/Source/SavingThread.java | 37 --- tools/mapmerge/clean_map.bat | 7 - tools/mapmerge/install.txt | 19 -- tools/mapmerge/install_driver.bat | 7 - tools/mapmerge/mapmerge.sh | 9 - 12 files changed, 5 insertions(+), 743 deletions(-) rename tools/mapmerge/{MapPatcher.jar => MapMerge.jar} (72%) rename tools/mapmerge/{prepare_map.bat => Prepare Maps.bat} (100%) create mode 100644 tools/mapmerge/Run Map Merge.bat delete mode 100644 tools/mapmerge/Source/Location.java delete mode 100644 tools/mapmerge/Source/META-INF/MANIFEST.MF delete mode 100644 tools/mapmerge/Source/Map.java delete mode 100644 tools/mapmerge/Source/MapPatcher.java delete mode 100644 tools/mapmerge/Source/SavingThread.java delete mode 100644 tools/mapmerge/clean_map.bat delete mode 100644 tools/mapmerge/install.txt delete mode 100644 tools/mapmerge/install_driver.bat delete mode 100644 tools/mapmerge/mapmerge.sh diff --git a/tools/mapmerge/MapPatcher.jar b/tools/mapmerge/MapMerge.jar similarity index 72% rename from tools/mapmerge/MapPatcher.jar rename to tools/mapmerge/MapMerge.jar index 5cbaad488c146d8a7453f114260dbccfe61e7861..aa4a779ca5d1ef5f5651d044c087617bbf1b06f6 100644 GIT binary patch delta 3078 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 diff --git a/tools/mapmerge/prepare_map.bat b/tools/mapmerge/Prepare Maps.bat similarity index 100% rename from tools/mapmerge/prepare_map.bat rename to tools/mapmerge/Prepare Maps.bat diff --git a/tools/mapmerge/Run Map Merge.bat b/tools/mapmerge/Run Map Merge.bat new file mode 100644 index 00000000000..2793b28a6b5 --- /dev/null +++ b/tools/mapmerge/Run Map Merge.bat @@ -0,0 +1,5 @@ +@echo off + +java -jar ../../tools/mapmerge/MapMerge.jar + +pause \ No newline at end of file diff --git a/tools/mapmerge/Source/Location.java b/tools/mapmerge/Source/Location.java deleted file mode 100644 index 2a901d54b27..00000000000 --- a/tools/mapmerge/Source/Location.java +++ /dev/null @@ -1,42 +0,0 @@ -class Location -{ - int x; - int y; - int z; - - public Location() - { - } - - public Location(int paramInt1, int paramInt2, int paramInt3) - { - this.x = paramInt1; - this.y = paramInt2; - this.z = paramInt3; - } - - public void set(int paramInt1, int paramInt2, int paramInt3) - { - this.x = paramInt1; - this.y = paramInt2; - this.z = paramInt3; - } - - public boolean equals(Object paramObject) - { - if (!(paramObject instanceof Location)) return false; - Location localLocation = (Location)paramObject; - if ((this.x != localLocation.x) || (this.y != localLocation.y) || (this.z != localLocation.z)) return false; - return true; - } - - public int hashCode() - { - return (this.z * 256 + this.y) * 256 + this.x; - } - - public String toString() - { - return "(" + this.x + "," + this.y + "," + this.z + ")"; - } -} diff --git a/tools/mapmerge/Source/META-INF/MANIFEST.MF b/tools/mapmerge/Source/META-INF/MANIFEST.MF deleted file mode 100644 index 5aa53c2fa28..00000000000 --- a/tools/mapmerge/Source/META-INF/MANIFEST.MF +++ /dev/null @@ -1,4 +0,0 @@ -Manifest-Version: 1.0 -Created-By: 1.6.0_31 (Sun Microsystems Inc.) -Main-Class: MapPatcher - diff --git a/tools/mapmerge/Source/Map.java b/tools/mapmerge/Source/Map.java deleted file mode 100644 index 949db7e6cad..00000000000 --- a/tools/mapmerge/Source/Map.java +++ /dev/null @@ -1,314 +0,0 @@ -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; -import java.io.InputStreamReader; -import java.io.PrintStream; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Set; -import java.util.Vector; - -public class Map -{ - boolean sizeunknown; - int minx; - int miny; - int minz; - int maxx; - int maxy; - int maxz; - HashMap tile_types; - HashMap codes_by_value; - HashMap tiles; - - public Map() - { - this.sizeunknown = true; - this.tile_types = new HashMap(); - this.codes_by_value = new HashMap(); - this.tiles = new HashMap(); - } - - public Map(File paramFile) - { - this(paramFile, false); - } - - public Map(File paramFile, boolean paramBoolean) - { - this.sizeunknown = true; - try { - BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(paramFile))); - - this.tile_types = new HashMap(); - this.codes_by_value = new HashMap(); - this.tiles = new HashMap(); - - MapPatcher.Systemoutprintln(new StringBuilder().append("Loading map ").append(paramFile.getName()).toString()); - MapPatcher.Systemoutprint("Loading tiles"); - String str1 = ""; - int i = 0; - while ((str1 = localBufferedReader.readLine()) != null) - { - if (str1.equals("")) break; - if (str1.startsWith("\"")) - { - if (i < 1) - { - int j = str1.indexOf("\"", 1); - i = j - 1; - } - String str2 = str1.substring(1, 1 + i); - String str3 = str1.substring(str1.indexOf("(")); - this.tile_types.put(str2, str3); - this.codes_by_value.put(str3, str2); - } - } - - MapPatcher.Systemoutprintln(new StringBuilder().append(" ").append(this.tile_types.size()).toString()); - if (!paramBoolean) - { - MapPatcher.Systemoutprintln("Loading levels"); - while (true) - { - if ((str1 = localBufferedReader.readLine()) != null) { if (str1.startsWith("(")) break label270; } else { - label270: if (str1 == null) - { - break; - } - int k = str1.indexOf(",", 1); - int m = Integer.parseInt(str1.substring(1, k)); - str1 = str1.substring(k); - k = str1.indexOf(",", 1); - int n = Integer.parseInt(str1.substring(1, k)); - str1 = str1.substring(k); - k = str1.indexOf(")", 1); - int i1 = Integer.parseInt(str1.substring(1, k)); - - MapPatcher.Systemoutprintln(new StringBuilder().append("New map part from (").append(m).append(",").append(n).append(",").append(i1).append(")").toString()); - - int i3 = n; - if (this.sizeunknown) - { - this.minx = m; this.maxx = this.minx; - this.miny = n; this.maxy = this.miny; - this.minz = i1; this.maxz = this.minz; - this.sizeunknown = false; - } - if (this.minz > i1) this.minz = i1; - if (this.maxz < i1) this.maxz = i1; - while (!(str1 = localBufferedReader.readLine()).startsWith("\"}")) - { - int i2 = m; - if (this.miny > i3) this.miny = i3; - if (this.maxy < i3) this.maxy = i3; - while (str1.length() > 0) - { - String str4 = str1.substring(0, i); - Location localLocation = new Location(i2, i3, i1); - if (this.minx > i2) this.minx = i2; - if (this.maxx < i2) this.maxx = i2; - this.tiles.put(localLocation, this.tile_types.get(str4)); - str1 = str1.substring(i); - i2++; - } - i3++; - } - } - } - } - localBufferedReader.close(); - } - catch (Exception localException) - { - localException.printStackTrace(); - } - } - - public void mirrorY() - { - for (int i = this.minz; i <= this.maxz; i++) - for (int j = this.minx; j <= this.maxx; j++) - for (int k = this.miny; k < (this.miny + this.maxy) / 2; k++) - { - int m = this.maxy - (k - this.miny); - String str = contentAt2(j, k, i); - setAt(j, k, i, contentAt2(j, m, i)); - setAt(j, m, i, str); - } - } - - public String contentAt(int paramInt1, int paramInt2, int paramInt3) - { - Location localLocation = new Location(paramInt1, paramInt2, paramInt3); - String str = (String)this.tiles.get(localLocation); - if (str == null) System.err.println(new StringBuilder().append("Null at ").append(paramInt1).append(",").append(paramInt2).append(",").append(paramInt3).append(" Possible loading error").toString()); - return str == null ? "null" : str; - } - - public String contentAt2(int paramInt1, int paramInt2, int paramInt3) - { - Location localLocation = new Location(paramInt1, paramInt2, paramInt3); - return (String)this.tiles.get(localLocation); - } - - public void setAt(int paramInt1, int paramInt2, int paramInt3, String paramString) - { - if (this.sizeunknown) - { - this.minx = (this.maxx = paramInt1); - this.miny = (this.maxy = paramInt2); - this.minz = (this.maxz = paramInt3); - this.sizeunknown = false; - } - else - { - this.minx = Math.min(this.minx, paramInt1); - this.miny = Math.min(this.miny, paramInt2); - this.minz = Math.min(this.minz, paramInt3); - this.maxx = Math.max(this.maxx, paramInt1); - this.maxy = Math.max(this.maxy, paramInt2); - this.maxz = Math.max(this.maxz, paramInt3); - } - Location localLocation = new Location(paramInt1, paramInt2, paramInt3); - localLocation.set(paramInt1, paramInt2, paramInt3); - this.tiles.put(localLocation, paramString); - } - - public void save(File paramFile) throws Exception - { - saveReferencing(paramFile, null); - } - - public void saveReferencing(File paramFile, Map paramMap) throws Exception - { - FileWriter localFileWriter = new FileWriter(paramFile); - - this.tile_types.clear(); - this.codes_by_value.clear(); - Vector localVector1 = new Vector(); - for (Object localObject1 = this.tiles.keySet().iterator(); ((Iterator)localObject1).hasNext(); ) { Location localLocation = (Location)((Iterator)localObject1).next(); - - String str1 = (String)this.tiles.get(localLocation); - if (!localVector1.contains(str1)) - localVector1.add(str1); - } - MapPatcher.Systemoutprintln(new StringBuilder().append("We have ").append(localVector1.size()).append(" different tiles").toString()); - localObject1 = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; - - int i = 1; - int j = localObject1.length; - while (j < localVector1.size()) - { - j *= localObject1.length; - i++; - } - Vector localVector2; - if (paramMap == null) { - localVector2 = localVector1; - } - else { - localVector2 = new Vector(); - for (Iterator localIterator = localVector1.iterator(); localIterator.hasNext(); ) { localObject2 = (String)localIterator.next(); - - if (paramMap.codes_by_value.containsKey(localObject2)) - { - localObject3 = paramMap.getIdFor((String)localObject2); - this.tile_types.put(localObject3, localObject2); - this.codes_by_value.put(localObject2, localObject3); - } - else { - localVector2.add(localObject2); - } } - localVector1.clear(); - } - - int k = 0; - for (Object localObject2 = localVector2.iterator(); ((Iterator)localObject2).hasNext(); ) { localObject3 = (String)((Iterator)localObject2).next(); - do - { - str2 = int2code((String[])localObject1, k, i); - k++; - }while (this.tile_types.containsKey(str2)); - this.tile_types.put(str2, localObject3); - this.codes_by_value.put(localObject3, str2); - } - String str2; - localVector2.clear(); - - k = 0; - for (int m = 0; m < this.tile_types.size(); m++) - { - do - { - localObject3 = int2code((String[])localObject1, k, i); - k++; - }while (!this.tile_types.containsKey(localObject3)); - str2 = (String)this.tile_types.get(localObject3); - localFileWriter.write(new StringBuilder().append("\"").append((String)localObject3).append("\" = ").append(str2).append("\r\n").toString()); - } - localVector2.clear(); - - localFileWriter.write("\n"); - - m = 1 + this.maxz - this.minz; - Object localObject3 = new SavingThread[m]; - int n = (this.maxy - this.miny) * ((this.maxx - this.minx) * i + 2) + 32; - - for (k = 0; k < m; k++) - { - localObject3[k] = new SavingThread(this.minz + k, this, n); - localObject3[k].start(); - } - - int i1 = 0; - String str3 = ""; - while (i1 == 0) { - try { - Thread.sleep(100L); } catch (Exception localException) { - } - i1 = 1; - - str3 = ""; - for (k = 0; k < m; k++) - { - if (!localObject3[k].done) - i1 = 0; - if (str3.length() != 0) str3 = new StringBuilder().append(str3).append(" ").toString(); - str3 = new StringBuilder().append(str3).append(localObject3[k].done ? "Done" : new StringBuilder().append(localObject3[k].progress).append("%").toString()).toString(); - } - MapPatcher.Systemoutprint(new StringBuilder().append(str3).append("\r").toString()); - } - - for (k = 0; k < m; k++) { - localFileWriter.write(localObject3[k].result.toString()); - } - localFileWriter.flush(); - localFileWriter.close(); - } - - public String getIdFor(String paramString) - { - if (this.codes_by_value.containsKey(paramString)) - { - return (String)this.codes_by_value.get(paramString); - } - return "???"; - } - - public String int2code(String[] paramArrayOfString, int paramInt1, int paramInt2) - { - String str = ""; - while (paramInt1 >= paramArrayOfString.length) - { - int i = paramInt1 % paramArrayOfString.length; - str = new StringBuilder().append(paramArrayOfString[i]).append(str).toString(); - paramInt1 -= i; - paramInt1 /= paramArrayOfString.length; - } - str = new StringBuilder().append(paramArrayOfString[paramInt1]).append(str).toString(); - while (str.length() < paramInt2) str = new StringBuilder().append(paramArrayOfString[0]).append(str).toString(); - return str; - } -} diff --git a/tools/mapmerge/Source/MapPatcher.java b/tools/mapmerge/Source/MapPatcher.java deleted file mode 100644 index c8d50b9b2fe..00000000000 --- a/tools/mapmerge/Source/MapPatcher.java +++ /dev/null @@ -1,304 +0,0 @@ -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PrintStream; -import java.util.Arrays; - -public class MapPatcher -{ - static boolean silent = false; - - public static void main(String[] paramArrayOfString) - { - String str1 = "usage: [me] -diff [old_map] [new_map] [diff_file]"; - String str2 = "usage: [me] -patch [old_map] [diff_file] [new_map]"; - String str3 = "usage: [me] -pack [unpacked] [packed.dmm]"; - String str4 = "usage: [me] -unpack [packed.dmm] [unpacked]"; - String str5 = "usage: [me] -clean [oldmap.dmm] [newmap.dmm] [cleaned.dmm]"; - String str6 = "usage: [me] -merge [original] [local] [remote] [output]"; - - for (int i = 0; i < paramArrayOfString.length; i++) - if (paramArrayOfString[i].equalsIgnoreCase("-silent")) - { - silent = true; - for (; i < paramArrayOfString.length - 1; i++) - paramArrayOfString[i] = paramArrayOfString[(i + 1)]; - paramArrayOfString = (String[])Arrays.copyOf(paramArrayOfString, paramArrayOfString.length - 1); - break; - } - Object localObject; - int i2; - int i3; - int i5; - if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-merge"))) - { - if (paramArrayOfString.length < 5) - { - System.out.println(str6); - try { System.in.read(); } catch (Exception localException1) { - }return; - } - - Map localMap1 = new Map(new File(paramArrayOfString[1])); - localObject = new Map(new File(paramArrayOfString[2])); - Map localMap8 = new Map(new File(paramArrayOfString[3])); - Map localMap9 = new Map(); - - if ((localMap1.minx != ((Map)localObject).minx) || (localMap1.minx != localMap8.minx) || (localMap1.maxx != ((Map)localObject).maxx) || (localMap1.maxx != localMap8.maxx) || (localMap1.miny != ((Map)localObject).miny) || (localMap1.miny != localMap8.miny) || (localMap1.maxy != ((Map)localObject).maxy) || (localMap1.maxy != localMap8.maxy) || (localMap1.minz != ((Map)localObject).minz) || (localMap1.minz != localMap8.minz) || (localMap1.maxz != ((Map)localObject).maxz) || (localMap1.maxz != localMap8.maxz)) - { - Systemoutprintln("Map sizes differ"); - System.exit(1); - } - try - { - for (int n = localMap1.minz; n <= localMap1.maxz; n++) - for (i2 = localMap1.miny; i2 <= localMap1.maxy; i2++) - for (i3 = localMap1.minx; i3 <= localMap1.maxx; i3++) - { - boolean bool1 = localMap1.contentAt(i3, i2, n).equals(((Map)localObject).contentAt(i3, i2, n)); - boolean bool2 = localMap1.contentAt(i3, i2, n).equals(localMap8.contentAt(i3, i2, n)); - i5 = ((Map)localObject).contentAt(i3, i2, n).equals(localMap8.contentAt(i3, i2, n)); - if ((!bool1) && (!bool2)) - { - if (i5 == 0) - { - Systemoutprintln(i3 + "," + i2 + "," + n + " local and remote don't match original and differ"); - System.exit(1); - } - else { - localMap9.setAt(i3, i2, n, ((Map)localObject).contentAt(i3, i2, n)); - } - } else if (!bool1) - localMap9.setAt(i3, i2, n, ((Map)localObject).contentAt(i3, i2, n)); - else if (!bool2) - localMap9.setAt(i3, i2, n, localMap8.contentAt(i3, i2, n)); - else - localMap9.setAt(i3, i2, n, localMap1.contentAt(i3, i2, n)); - } - Systemoutprintln("Saving"); - localMap9.saveReferencing(new File(paramArrayOfString[4]), localMap1); - Systemoutprintln("Done"); - } - catch (Exception localException12) - { - localException12.printStackTrace(); - } - } - else - { - int m; - int i1; - if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-diff"))) - { - if (paramArrayOfString.length < 4) - { - System.out.println(str1); - try { System.in.read(); } catch (Exception localException2) { - }return; - } - - Map localMap2 = new Map(new File(paramArrayOfString[1])); - localObject = new Map(new File(paramArrayOfString[2])); - - int j = Math.max(localMap2.minx, ((Map)localObject).minx); - m = Math.min(localMap2.maxx, ((Map)localObject).maxx); - i1 = Math.max(localMap2.miny, ((Map)localObject).miny); - i2 = Math.min(localMap2.maxy, ((Map)localObject).maxy); - i3 = Math.max(localMap2.minz, ((Map)localObject).minz); - int i4 = Math.min(localMap2.maxz, ((Map)localObject).maxz); - Systemoutprintln("Comparing: x(" + j + "-" + m + ") y(" + i1 + "-" + i2 + ") z(" + i3 + "-" + i4 + ")"); - try - { - FileWriter localFileWriter2 = new FileWriter(paramArrayOfString[3]); - i5 = 0; - for (int i6 = i3; i6 <= i4; i6++) - { - Systemoutprintln("Z-level " + i6); - for (int i7 = i1; i7 <= i2; i7++) - for (int i8 = j; i8 <= m; i8++) - if (!localMap2.contentAt(i8, i7, i6).equals(((Map)localObject).contentAt(i8, i7, i6))) - { - localFileWriter2.write("(" + i8 + "," + (1 + ((Map)localObject).maxy - i7) + "," + i6 + ")=" + ((Map)localObject).contentAt(i8, i7, i6) + "\n"); - i5++; - } - } - localFileWriter2.flush(); - localFileWriter2.close(); - if (i5 == 0) - Systemoutprintln("Files do match"); - else - Systemoutprintln("Writed out " + i5 + " differences"); - } - catch (Exception localException13) - { - localException13.printStackTrace(); - } - - Systemoutprintln("Done"); - } - else - { - String str7; - String str8; - if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-patch"))) - { - if (paramArrayOfString.length < 4) - { - System.out.println(str2); - try { System.in.read(); } catch (Exception localException3) { - }return; - } - - Map localMap3 = new Map(new File(paramArrayOfString[1])); - try - { - localObject = new BufferedReader(new InputStreamReader(new FileInputStream(paramArrayOfString[2]))); - - while ((str7 = ((BufferedReader)localObject).readLine()) != null) - { - str7 = str7.trim(); - if (str7.length() != 0) - { - m = str7.indexOf(",", 1); - i1 = Integer.parseInt(str7.substring(1, m)); - str7 = str7.substring(m); - m = str7.indexOf(",", 1); - i2 = Integer.parseInt(str7.substring(1, m)); - str7 = str7.substring(m); - m = str7.indexOf(")", 1); - i3 = Integer.parseInt(str7.substring(1, m)); - str8 = str7.substring(str7.indexOf("=") + 1); - localMap3.setAt(i1, 1 + localMap3.maxy - i2, i3, str8); - } - } - localMap3.save(new File(paramArrayOfString[3])); - } - catch (Exception localException8) - { - localException8.printStackTrace(); - } - - Systemoutprintln("Done"); - } - else if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-pack"))) - { - if (paramArrayOfString.length < 3) - { - System.out.println(str3); - try { System.in.read(); } catch (Exception localException4) { - }return; - } - - Map localMap4 = new Map(); - try { - BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(paramArrayOfString[1]))); - Systemoutprintln("Loading"); - - while ((str7 = localBufferedReader.readLine()) != null) - { - str7 = str7.trim(); - if (str7.length() != 0) - { - m = str7.indexOf(",", 1); - i1 = Integer.parseInt(str7.substring(1, m)); - str7 = str7.substring(m); - m = str7.indexOf(",", 1); - i2 = Integer.parseInt(str7.substring(1, m)); - str7 = str7.substring(m); - m = str7.indexOf(")", 1); - i3 = Integer.parseInt(str7.substring(1, m)); - str8 = str7.substring(str7.indexOf("=") + 1); - localMap4.setAt(i1, i2, i3, str8); - } - } - Systemoutprintln("Flipping"); - localMap4.mirrorY(); - Systemoutprintln("Saving, bounds: x{" + localMap4.minx + " - " + localMap4.maxx + "}, y{" + localMap4.miny + " - " + localMap4.maxy + "}, z{" + localMap4.minz + " - " + localMap4.maxz + "}"); - localMap4.save(new File(paramArrayOfString[2])); - Systemoutprintln("Done"); - } - catch (Exception localException9) - { - localException9.printStackTrace(); - } - } - else if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-unpack"))) - { - if (paramArrayOfString.length < 3) - { - System.out.println(str4); - try { System.in.read(); } catch (Exception localException5) { - }return; - } - - Systemoutprintln("Loading"); - Map localMap5 = new Map(new File(paramArrayOfString[1])); - try { - FileWriter localFileWriter1 = new FileWriter(paramArrayOfString[2]); - Systemoutprintln("Saving"); - for (int k = localMap5.minz; k <= localMap5.maxz; k++) - { - Systemoutprintln("Z-level " + k); - for (m = localMap5.miny; m <= localMap5.maxy; m++) - for (i1 = localMap5.minx; i1 <= localMap5.maxx; i1++) - localFileWriter1.write("(" + i1 + "," + (1 + localMap5.maxy - m) + "," + k + ")=" + localMap5.contentAt(i1, m, k) + "\n"); - localFileWriter1.write("\n"); - } - localFileWriter1.flush(); - localFileWriter1.close(); - - Systemoutprintln("Done"); - } - catch (Exception localException10) - { - localException10.printStackTrace(); - } - } - else if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-clean"))) - { - if (paramArrayOfString.length < 4) - { - System.out.println(str5); - try { System.in.read(); } catch (Exception localException6) { - }return; - } - - Map localMap6 = new Map(new File(paramArrayOfString[1]), true); - Map localMap7 = new Map(new File(paramArrayOfString[2])); - try - { - localMap7.saveReferencing(new File(paramArrayOfString[3]), localMap6); - Systemoutprintln("Done"); - } - catch (Exception localException11) - { - localException11.printStackTrace(); - } - } - else - { - System.out.println(str1); - System.out.println(str2); - System.out.println(str3); - System.out.println(str4); - System.out.println(str5); - System.out.println(str6); - try { - System.in.read(); } catch (Exception localException7) { } - } - } - } - } - - public static void Systemoutprintln(String paramString) { if (!silent) - System.out.println(paramString); } - - public static void Systemoutprint(String paramString) - { - if (!silent) - System.out.print(paramString); - } -} diff --git a/tools/mapmerge/Source/SavingThread.java b/tools/mapmerge/Source/SavingThread.java deleted file mode 100644 index 24a3d7b04df..00000000000 --- a/tools/mapmerge/Source/SavingThread.java +++ /dev/null @@ -1,37 +0,0 @@ -class SavingThread extends Thread -{ - int z; - Map mymap; - boolean done; - int progress; - StringBuilder result; - - public SavingThread(int paramInt1, Map paramMap, int paramInt2) - { - this.z = paramInt1; - this.mymap = paramMap; - this.progress = 0; - this.done = false; - this.result = new StringBuilder(paramInt2); - } - - public void run() - { - this.result.append("(" + this.mymap.minx + "," + this.mymap.miny + "," + this.z + ") = {\"\r\n"); - - int i = (this.mymap.maxx - this.mymap.minx) * (this.mymap.maxy - this.mymap.miny) / 100; - int j = 0; - for (int k = this.mymap.miny; k <= this.mymap.maxy; k++) - { - for (int m = this.mymap.minx; m <= this.mymap.maxx; m++) - { - this.result.append(this.mymap.getIdFor(this.mymap.contentAt(m, k, this.z))); - j++; if (j >= i) { j = 0; this.progress += 1; } - } - this.result.append("\r\n"); - } - this.result.append("\"}\r\n"); - this.result.append("\r\n"); - this.done = true; - } -} diff --git a/tools/mapmerge/clean_map.bat b/tools/mapmerge/clean_map.bat deleted file mode 100644 index 8e1c9273d53..00000000000 --- a/tools/mapmerge/clean_map.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off -cd ../../_maps/map_files/ -set /P MAPFILE=Please enter mapfile (relative to map_files folder): - -java -jar ../../tools/mapmerge/MapPatcher.jar -clean "%MAPFILE%.backup" "%MAPFILE%" "%MAPFILE%" - -pause \ No newline at end of file diff --git a/tools/mapmerge/install.txt b/tools/mapmerge/install.txt deleted file mode 100644 index c225e68d706..00000000000 --- a/tools/mapmerge/install.txt +++ /dev/null @@ -1,19 +0,0 @@ -1. Install java(http://www.java.com/en/download/index.jsp) -2. Make sure java is in your PATH. To test this, open git bash, and type "java". If it says unknown command, you need to add JAVA/bin to your PATH variable (A guide for this can be found at https://www.java.com/en/download/help/path.xml ). - -Committing -1. Before starting to edit the map, double-click "prepare_map.bat" in the tools/mapmerge/ directory. -2. After finishing your edit, and before your commit, double-click "clean_map.bat" in the tools/mapmerge/ directory. - -This will make sure in the new version of your map, no paths are needlessly changed, thus instead of 8000 lines changed you'll get 50 lines changed. This not only reduces size of your commit, it also makes it possible to get an overview of your map changes on the "files changed" page in your pull request. - -Merging -The easiest way to do merging is to install the merge driver. For this, you can just double-click "install_driver.bat" in the tools/mapmerge/ directory. - -Alternatively, open -tg-station/.git/config in a text editor, and paste the following lines to the end of it: - -[merge "merge-dmm"] - name = mapmerge driver - driver = ./tools/mapmerge/mapmerge.sh %O %A %B - -After this, merging maps should happen automagically unless there are conflicts(a tile that both you and someone else changed). If there are conflicts, you will unfortunately still be stuck with opening both versions in a map editor, and manually resolving the issues. diff --git a/tools/mapmerge/install_driver.bat b/tools/mapmerge/install_driver.bat deleted file mode 100644 index fa04dddff55..00000000000 --- a/tools/mapmerge/install_driver.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off -echo. >> ../../.git/config -echo [merge "merge-dmm"] >> ../../.git/config -echo name = mapmerge driver >> ../../.git/config -echo driver = ./tools/mapmerge/mapmerge.sh %O %A %B >> ../../.git/config -echo. >> ../../.git/config - diff --git a/tools/mapmerge/mapmerge.sh b/tools/mapmerge/mapmerge.sh deleted file mode 100644 index 145537f7ca7..00000000000 --- a/tools/mapmerge/mapmerge.sh +++ /dev/null @@ -1,9 +0,0 @@ -java -jar tools/mapmerge/MapPatcher.jar -merge $1 $2 $3 $2 -if [ "$?" -gt 0 ] -then - echo "Unable to automatically resolve map conflicts, please merge manually." - exit 1 -fi -java -jar tools/mapmerge/MapPatcher.jar -clean $1 $2 $2 - -exit 0 From 5a7b43dcb66b0e3a674fc029d41c7755bb531bc4 Mon Sep 17 00:00:00 2001 From: CorruptComputer Date: Thu, 4 Jun 2015 10:23:42 -0500 Subject: [PATCH 06/57] Update Prepare Maps.bat --- tools/mapmerge/Prepare Maps.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/mapmerge/Prepare Maps.bat b/tools/mapmerge/Prepare Maps.bat index bfe1e6560e9..89e5a233ed2 100644 --- a/tools/mapmerge/Prepare Maps.bat +++ b/tools/mapmerge/Prepare Maps.bat @@ -7,6 +7,6 @@ cls echo All dmm files in map_files directories have been backed up echo Now you can make your changes... echo --- -echo Remember to run clean_map.bat just before you commit your changes! +echo Remember to run Run_Map_Merge.bat just before you commit your changes! echo --- pause From fa4f857fddd69c427ce731f6a1a9f39f930f77b5 Mon Sep 17 00:00:00 2001 From: CorruptComputer Date: Thu, 4 Jun 2015 15:46:52 -0500 Subject: [PATCH 07/57] Adds Source --- tools/mapmerge/Source/.classpath | 7 +++ tools/mapmerge/Source/.project | 17 ++++++ .../.settings/org.eclipse.jdt.core.prefs | 11 ++++ tools/mapmerge/Source/bin/FileFinder.class | Bin 0 -> 1882 bytes tools/mapmerge/Source/bin/MapMergerMain.class | Bin 0 -> 2783 bytes tools/mapmerge/Source/src/FileFinder.java | 25 ++++++++ tools/mapmerge/Source/src/MapMergerMain.java | 57 ++++++++++++++++++ 7 files changed, 117 insertions(+) create mode 100644 tools/mapmerge/Source/.classpath create mode 100644 tools/mapmerge/Source/.project create mode 100644 tools/mapmerge/Source/.settings/org.eclipse.jdt.core.prefs create mode 100644 tools/mapmerge/Source/bin/FileFinder.class create mode 100644 tools/mapmerge/Source/bin/MapMergerMain.class create mode 100644 tools/mapmerge/Source/src/FileFinder.java create mode 100644 tools/mapmerge/Source/src/MapMergerMain.java diff --git a/tools/mapmerge/Source/.classpath b/tools/mapmerge/Source/.classpath new file mode 100644 index 00000000000..a0cb530fa9d --- /dev/null +++ b/tools/mapmerge/Source/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/tools/mapmerge/Source/.project b/tools/mapmerge/Source/.project new file mode 100644 index 00000000000..df472fbdf11 --- /dev/null +++ b/tools/mapmerge/Source/.project @@ -0,0 +1,17 @@ + + + MapMerger + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/tools/mapmerge/Source/.settings/org.eclipse.jdt.core.prefs b/tools/mapmerge/Source/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000000..3a21537071b --- /dev/null +++ b/tools/mapmerge/Source/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/tools/mapmerge/Source/bin/FileFinder.class b/tools/mapmerge/Source/bin/FileFinder.class new file mode 100644 index 0000000000000000000000000000000000000000..ab01a656c458ab21fe7af582f5c7246df388f46e GIT binary patch literal 1882 zcmb7FZBrXn7(F)$EQAGGNTIbLMXi!eY3ggWi>W}1Vne76O$A>!$r3Imo6PP_$A0!# z_%GD4VC{_4&;BOI@!UJm;Q!^Y_1h{srJYd}kmc5MPs3cTIX_ z*EbLonA>+AI%!YV)4QBV=Vh&-=c{f(22$010i))q(w@t=i`nkvyN=r1XieHg-mN#i zvW^7;=US;vC9COW-*+BmWuTZeoR<~PQBB_!NcGEE>QlqcaOL2V^rXrVdZCq4b-YSC zuYBoM>|{Y8wpuT{aYQk0VgzRdq6^7_feC@hkajnhIL=~x7=$xnU?`4hTrhB6;6itg zT8jLmK)JQR#4EVSJ}a)e)OOsqy@&Q#f!%L+!;^8(4QK!sjNksTgGOzTUax2`-Dw9q&D#>K07|P6mYt)49OjR1U@%$2U(sK zr%b1H9j(pczFSgua%UJh+%>Q%Fx$;u)9nz$#22_n)2(jiw$^j^Nph}7>z)NvFSZ-* zRH7$Qx5L>1y*cb)v1j_ldqz|*6mc}KoYD^)PNQw8?>jx)Zts5~zswDBn*1vhAL1kW zB42O%rSK}H<8|jP3t!b53S93geB$CgCY|d57Z!VjM>~ zni$6zk{sV#Qeq>zup6Sd3qG$lxbNG|qhL2|gCcS-<1j;uEY! z@H0$)Bv^g@!Ef03g-KC7FFeV{5`4~Kme;c`Y_))n3(q5uEfyj;?xVm$1~2Icj79M! zqm<KQUu4zQy+L_!XOA+8APY5^noIvl@g3;peX>)qmy literal 0 HcmV?d00001 diff --git a/tools/mapmerge/Source/bin/MapMergerMain.class b/tools/mapmerge/Source/bin/MapMergerMain.class new file mode 100644 index 0000000000000000000000000000000000000000..c563253301ff53027fedaed4cca3088ea643cadb GIT binary patch literal 2783 zcmaJ@Yf}?v6n)hYhnn!9LmGVW3zSAp%jnD`1`NAb zABY_`x#p`64<-@;M6g3@77kz+_9)mr2a7yMEPK%=ppEMB6LO;0HW=#OJg7oi;y5Zkb)vcGEwylpx&9uWTj-pdR#|+TIWer_8 zz%)ynrwEV*)vn+vCi4BN%q82dj42Z#fF|^6I0&Yma#D|HjIJT6cl$gV2GETiD*9Pt zGJm>pM8h+9mbIj(Qie4s&@hika}DKPyMY{)A|IRMG1ob`qZ8%B9l__Hq~#4#SPsG;2pfD;9X*8&tnG1 zMhsH30*{g_-5w@GW%CrQz=9Nuy*KH$C)rnLXDXYfBE{Kb+9YmPamh;I2LF&-*euYf z6f9TfoX?e$oT7UVIbs~`0>x<~&YOu%me_c8q-eo1Mv0pPHb{4%ru1~0EGOAR3!D9T zD%bD@*5=?8mSF3A7`G8kNsmL?XxzOn6kJg79V2!FE@%k^-jmGOF$Ut^H9T_vmJQ4O zsN(J9;Z4k~@`~cf0~HGY86JOy-Bn=W4FvkHLz_hKXH;C{N)eXw>E}N1Y^6IR?eN~p zpKat@uKMaHv26Ac)jgu+HsE1A!i~jJW*QE0?Bz<8gi!P&$9#+Eb*v1o$)fH$Dza#d zuJ!zerYUUdxPeH2aO)(tcdl!g!p=htzu<`$Z>2Yj{a3Kn)9jl-JYzyj&-IOpX%PQMda?Yg#F{CRVg{wX{! z%{ereGve+zd2#wLcW|oNSMIxnk{P?$RPMWsh0@|nv^;_8yrtkPG~@ct;?>~Ud*&vl zuSwjKI9GtS#Xn~@_(twfi=vR17PV6K1mEhZRK1l7pT0^zpMLi_h4WGkuPfj=vP^j? zS}Fe)ac(iH5kxJ@DE<=OtmSA$1&;BZ;A)DxjbS-XQ>!yn>pa!^p5vc*DvOo)1FLY8 z-xRk{gFmqbe^c4pXcQ$_FKV$tgxT~qqDi#yCf|Wgq7BVrKQ_DBa0;5#8Smo)F_ns~ z_y8X=50>)8NBEeTQ7!862|i^~hQ$hehJB1;3qK=2$3>=Z7TfTJJG#wYnj4+RGF+k+ zKM`!lWp`9dj9+r35X}l)p*Iy@(WA`9oZYW!_bO-BAu!GG{R+NO(4^p71^f(%3ZUi= YG$l}Vmwl=94p!WipRs~W$in#HUkIPCM*si- literal 0 HcmV?d00001 diff --git a/tools/mapmerge/Source/src/FileFinder.java b/tools/mapmerge/Source/src/FileFinder.java new file mode 100644 index 00000000000..0677b777843 --- /dev/null +++ b/tools/mapmerge/Source/src/FileFinder.java @@ -0,0 +1,25 @@ +import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.FileVisitResult; +import java.nio.file.Path; +import java.nio.file.PathMatcher; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; + +public class FileFinder extends SimpleFileVisitor { + private PathMatcher matcher; + public ArrayList foundPaths = new ArrayList<>(); + public FileFinder(String pattern) { + matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern); + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Path name = file.getFileName(); + if (matcher.matches(name)) { + foundPaths.add(file); + } + return FileVisitResult.CONTINUE; + } +} \ No newline at end of file diff --git a/tools/mapmerge/Source/src/MapMergerMain.java b/tools/mapmerge/Source/src/MapMergerMain.java new file mode 100644 index 00000000000..0f38cc91ea5 --- /dev/null +++ b/tools/mapmerge/Source/src/MapMergerMain.java @@ -0,0 +1,57 @@ +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Scanner; + +public class MapMergerMain { + + private static Scanner input = new Scanner(System.in); + + public static void main(String[] args) throws IOException{ + + System.out.print("Path to _maps folder: "); + String pathTo_maps = input.nextLine(); + Path fileDir = Paths.get(pathTo_maps); + FileFinder finder = new FileFinder("*.dmm"); + Files.walkFileTree(fileDir, finder); + ArrayList foundFiles = finder.foundPaths; + if (foundFiles.size() > 0) { + for(int num = 0;num < foundFiles.size();num++){ + System.out.println(num + ": " + foundFiles.get(num)); + } + }else{ + System.out.println("No files were found!"); + } + System.out.print("File to use: "); + int selection; + inputCheck:while(true){ + while(!input.hasNextInt()){ + String temp = input.next(); + System.out.println(temp + " is not a valid int."); + } + selection = input.nextInt(); + if(selection < 0 || selection >= foundFiles.size()){ + if(selection < 0){ + System.out.println("Use a number greater than 0!"); + }else{ + System.out.println("Use a number less than " + foundFiles.size() +"!"); + } + continue inputCheck; + }else{ + break inputCheck; + } + } + + String newMap = foundFiles.get(selection) + ""; + String oldMap = foundFiles.get(selection) + ".backup"; + String[] passInto = new String[4]; + passInto[0] = "-clean"; + passInto[1] = oldMap; + passInto[2] = newMap; + passInto[3] = newMap; + MapPatcher.main(passInto); + } + +} \ No newline at end of file From b61bc08a10ae7587a211c00f297828fc03872684 Mon Sep 17 00:00:00 2001 From: CorruptComputer Date: Thu, 4 Jun 2015 16:08:54 -0500 Subject: [PATCH 08/57] Adds the old source --- .../Source/bin/MapPatcher/Location.java | 42 +++ tools/mapmerge/Source/bin/MapPatcher/Map.java | 314 ++++++++++++++++++ .../Source/bin/MapPatcher/MapPatcher.java | 304 +++++++++++++++++ .../Source/bin/MapPatcher/SavingThread.java | 37 +++ 4 files changed, 697 insertions(+) create mode 100644 tools/mapmerge/Source/bin/MapPatcher/Location.java create mode 100644 tools/mapmerge/Source/bin/MapPatcher/Map.java create mode 100644 tools/mapmerge/Source/bin/MapPatcher/MapPatcher.java create mode 100644 tools/mapmerge/Source/bin/MapPatcher/SavingThread.java diff --git a/tools/mapmerge/Source/bin/MapPatcher/Location.java b/tools/mapmerge/Source/bin/MapPatcher/Location.java new file mode 100644 index 00000000000..2a901d54b27 --- /dev/null +++ b/tools/mapmerge/Source/bin/MapPatcher/Location.java @@ -0,0 +1,42 @@ +class Location +{ + int x; + int y; + int z; + + public Location() + { + } + + public Location(int paramInt1, int paramInt2, int paramInt3) + { + this.x = paramInt1; + this.y = paramInt2; + this.z = paramInt3; + } + + public void set(int paramInt1, int paramInt2, int paramInt3) + { + this.x = paramInt1; + this.y = paramInt2; + this.z = paramInt3; + } + + public boolean equals(Object paramObject) + { + if (!(paramObject instanceof Location)) return false; + Location localLocation = (Location)paramObject; + if ((this.x != localLocation.x) || (this.y != localLocation.y) || (this.z != localLocation.z)) return false; + return true; + } + + public int hashCode() + { + return (this.z * 256 + this.y) * 256 + this.x; + } + + public String toString() + { + return "(" + this.x + "," + this.y + "," + this.z + ")"; + } +} diff --git a/tools/mapmerge/Source/bin/MapPatcher/Map.java b/tools/mapmerge/Source/bin/MapPatcher/Map.java new file mode 100644 index 00000000000..949db7e6cad --- /dev/null +++ b/tools/mapmerge/Source/bin/MapPatcher/Map.java @@ -0,0 +1,314 @@ +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Set; +import java.util.Vector; + +public class Map +{ + boolean sizeunknown; + int minx; + int miny; + int minz; + int maxx; + int maxy; + int maxz; + HashMap tile_types; + HashMap codes_by_value; + HashMap tiles; + + public Map() + { + this.sizeunknown = true; + this.tile_types = new HashMap(); + this.codes_by_value = new HashMap(); + this.tiles = new HashMap(); + } + + public Map(File paramFile) + { + this(paramFile, false); + } + + public Map(File paramFile, boolean paramBoolean) + { + this.sizeunknown = true; + try { + BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(paramFile))); + + this.tile_types = new HashMap(); + this.codes_by_value = new HashMap(); + this.tiles = new HashMap(); + + MapPatcher.Systemoutprintln(new StringBuilder().append("Loading map ").append(paramFile.getName()).toString()); + MapPatcher.Systemoutprint("Loading tiles"); + String str1 = ""; + int i = 0; + while ((str1 = localBufferedReader.readLine()) != null) + { + if (str1.equals("")) break; + if (str1.startsWith("\"")) + { + if (i < 1) + { + int j = str1.indexOf("\"", 1); + i = j - 1; + } + String str2 = str1.substring(1, 1 + i); + String str3 = str1.substring(str1.indexOf("(")); + this.tile_types.put(str2, str3); + this.codes_by_value.put(str3, str2); + } + } + + MapPatcher.Systemoutprintln(new StringBuilder().append(" ").append(this.tile_types.size()).toString()); + if (!paramBoolean) + { + MapPatcher.Systemoutprintln("Loading levels"); + while (true) + { + if ((str1 = localBufferedReader.readLine()) != null) { if (str1.startsWith("(")) break label270; } else { + label270: if (str1 == null) + { + break; + } + int k = str1.indexOf(",", 1); + int m = Integer.parseInt(str1.substring(1, k)); + str1 = str1.substring(k); + k = str1.indexOf(",", 1); + int n = Integer.parseInt(str1.substring(1, k)); + str1 = str1.substring(k); + k = str1.indexOf(")", 1); + int i1 = Integer.parseInt(str1.substring(1, k)); + + MapPatcher.Systemoutprintln(new StringBuilder().append("New map part from (").append(m).append(",").append(n).append(",").append(i1).append(")").toString()); + + int i3 = n; + if (this.sizeunknown) + { + this.minx = m; this.maxx = this.minx; + this.miny = n; this.maxy = this.miny; + this.minz = i1; this.maxz = this.minz; + this.sizeunknown = false; + } + if (this.minz > i1) this.minz = i1; + if (this.maxz < i1) this.maxz = i1; + while (!(str1 = localBufferedReader.readLine()).startsWith("\"}")) + { + int i2 = m; + if (this.miny > i3) this.miny = i3; + if (this.maxy < i3) this.maxy = i3; + while (str1.length() > 0) + { + String str4 = str1.substring(0, i); + Location localLocation = new Location(i2, i3, i1); + if (this.minx > i2) this.minx = i2; + if (this.maxx < i2) this.maxx = i2; + this.tiles.put(localLocation, this.tile_types.get(str4)); + str1 = str1.substring(i); + i2++; + } + i3++; + } + } + } + } + localBufferedReader.close(); + } + catch (Exception localException) + { + localException.printStackTrace(); + } + } + + public void mirrorY() + { + for (int i = this.minz; i <= this.maxz; i++) + for (int j = this.minx; j <= this.maxx; j++) + for (int k = this.miny; k < (this.miny + this.maxy) / 2; k++) + { + int m = this.maxy - (k - this.miny); + String str = contentAt2(j, k, i); + setAt(j, k, i, contentAt2(j, m, i)); + setAt(j, m, i, str); + } + } + + public String contentAt(int paramInt1, int paramInt2, int paramInt3) + { + Location localLocation = new Location(paramInt1, paramInt2, paramInt3); + String str = (String)this.tiles.get(localLocation); + if (str == null) System.err.println(new StringBuilder().append("Null at ").append(paramInt1).append(",").append(paramInt2).append(",").append(paramInt3).append(" Possible loading error").toString()); + return str == null ? "null" : str; + } + + public String contentAt2(int paramInt1, int paramInt2, int paramInt3) + { + Location localLocation = new Location(paramInt1, paramInt2, paramInt3); + return (String)this.tiles.get(localLocation); + } + + public void setAt(int paramInt1, int paramInt2, int paramInt3, String paramString) + { + if (this.sizeunknown) + { + this.minx = (this.maxx = paramInt1); + this.miny = (this.maxy = paramInt2); + this.minz = (this.maxz = paramInt3); + this.sizeunknown = false; + } + else + { + this.minx = Math.min(this.minx, paramInt1); + this.miny = Math.min(this.miny, paramInt2); + this.minz = Math.min(this.minz, paramInt3); + this.maxx = Math.max(this.maxx, paramInt1); + this.maxy = Math.max(this.maxy, paramInt2); + this.maxz = Math.max(this.maxz, paramInt3); + } + Location localLocation = new Location(paramInt1, paramInt2, paramInt3); + localLocation.set(paramInt1, paramInt2, paramInt3); + this.tiles.put(localLocation, paramString); + } + + public void save(File paramFile) throws Exception + { + saveReferencing(paramFile, null); + } + + public void saveReferencing(File paramFile, Map paramMap) throws Exception + { + FileWriter localFileWriter = new FileWriter(paramFile); + + this.tile_types.clear(); + this.codes_by_value.clear(); + Vector localVector1 = new Vector(); + for (Object localObject1 = this.tiles.keySet().iterator(); ((Iterator)localObject1).hasNext(); ) { Location localLocation = (Location)((Iterator)localObject1).next(); + + String str1 = (String)this.tiles.get(localLocation); + if (!localVector1.contains(str1)) + localVector1.add(str1); + } + MapPatcher.Systemoutprintln(new StringBuilder().append("We have ").append(localVector1.size()).append(" different tiles").toString()); + localObject1 = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; + + int i = 1; + int j = localObject1.length; + while (j < localVector1.size()) + { + j *= localObject1.length; + i++; + } + Vector localVector2; + if (paramMap == null) { + localVector2 = localVector1; + } + else { + localVector2 = new Vector(); + for (Iterator localIterator = localVector1.iterator(); localIterator.hasNext(); ) { localObject2 = (String)localIterator.next(); + + if (paramMap.codes_by_value.containsKey(localObject2)) + { + localObject3 = paramMap.getIdFor((String)localObject2); + this.tile_types.put(localObject3, localObject2); + this.codes_by_value.put(localObject2, localObject3); + } + else { + localVector2.add(localObject2); + } } + localVector1.clear(); + } + + int k = 0; + for (Object localObject2 = localVector2.iterator(); ((Iterator)localObject2).hasNext(); ) { localObject3 = (String)((Iterator)localObject2).next(); + do + { + str2 = int2code((String[])localObject1, k, i); + k++; + }while (this.tile_types.containsKey(str2)); + this.tile_types.put(str2, localObject3); + this.codes_by_value.put(localObject3, str2); + } + String str2; + localVector2.clear(); + + k = 0; + for (int m = 0; m < this.tile_types.size(); m++) + { + do + { + localObject3 = int2code((String[])localObject1, k, i); + k++; + }while (!this.tile_types.containsKey(localObject3)); + str2 = (String)this.tile_types.get(localObject3); + localFileWriter.write(new StringBuilder().append("\"").append((String)localObject3).append("\" = ").append(str2).append("\r\n").toString()); + } + localVector2.clear(); + + localFileWriter.write("\n"); + + m = 1 + this.maxz - this.minz; + Object localObject3 = new SavingThread[m]; + int n = (this.maxy - this.miny) * ((this.maxx - this.minx) * i + 2) + 32; + + for (k = 0; k < m; k++) + { + localObject3[k] = new SavingThread(this.minz + k, this, n); + localObject3[k].start(); + } + + int i1 = 0; + String str3 = ""; + while (i1 == 0) { + try { + Thread.sleep(100L); } catch (Exception localException) { + } + i1 = 1; + + str3 = ""; + for (k = 0; k < m; k++) + { + if (!localObject3[k].done) + i1 = 0; + if (str3.length() != 0) str3 = new StringBuilder().append(str3).append(" ").toString(); + str3 = new StringBuilder().append(str3).append(localObject3[k].done ? "Done" : new StringBuilder().append(localObject3[k].progress).append("%").toString()).toString(); + } + MapPatcher.Systemoutprint(new StringBuilder().append(str3).append("\r").toString()); + } + + for (k = 0; k < m; k++) { + localFileWriter.write(localObject3[k].result.toString()); + } + localFileWriter.flush(); + localFileWriter.close(); + } + + public String getIdFor(String paramString) + { + if (this.codes_by_value.containsKey(paramString)) + { + return (String)this.codes_by_value.get(paramString); + } + return "???"; + } + + public String int2code(String[] paramArrayOfString, int paramInt1, int paramInt2) + { + String str = ""; + while (paramInt1 >= paramArrayOfString.length) + { + int i = paramInt1 % paramArrayOfString.length; + str = new StringBuilder().append(paramArrayOfString[i]).append(str).toString(); + paramInt1 -= i; + paramInt1 /= paramArrayOfString.length; + } + str = new StringBuilder().append(paramArrayOfString[paramInt1]).append(str).toString(); + while (str.length() < paramInt2) str = new StringBuilder().append(paramArrayOfString[0]).append(str).toString(); + return str; + } +} diff --git a/tools/mapmerge/Source/bin/MapPatcher/MapPatcher.java b/tools/mapmerge/Source/bin/MapPatcher/MapPatcher.java new file mode 100644 index 00000000000..c8d50b9b2fe --- /dev/null +++ b/tools/mapmerge/Source/bin/MapPatcher/MapPatcher.java @@ -0,0 +1,304 @@ +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.util.Arrays; + +public class MapPatcher +{ + static boolean silent = false; + + public static void main(String[] paramArrayOfString) + { + String str1 = "usage: [me] -diff [old_map] [new_map] [diff_file]"; + String str2 = "usage: [me] -patch [old_map] [diff_file] [new_map]"; + String str3 = "usage: [me] -pack [unpacked] [packed.dmm]"; + String str4 = "usage: [me] -unpack [packed.dmm] [unpacked]"; + String str5 = "usage: [me] -clean [oldmap.dmm] [newmap.dmm] [cleaned.dmm]"; + String str6 = "usage: [me] -merge [original] [local] [remote] [output]"; + + for (int i = 0; i < paramArrayOfString.length; i++) + if (paramArrayOfString[i].equalsIgnoreCase("-silent")) + { + silent = true; + for (; i < paramArrayOfString.length - 1; i++) + paramArrayOfString[i] = paramArrayOfString[(i + 1)]; + paramArrayOfString = (String[])Arrays.copyOf(paramArrayOfString, paramArrayOfString.length - 1); + break; + } + Object localObject; + int i2; + int i3; + int i5; + if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-merge"))) + { + if (paramArrayOfString.length < 5) + { + System.out.println(str6); + try { System.in.read(); } catch (Exception localException1) { + }return; + } + + Map localMap1 = new Map(new File(paramArrayOfString[1])); + localObject = new Map(new File(paramArrayOfString[2])); + Map localMap8 = new Map(new File(paramArrayOfString[3])); + Map localMap9 = new Map(); + + if ((localMap1.minx != ((Map)localObject).minx) || (localMap1.minx != localMap8.minx) || (localMap1.maxx != ((Map)localObject).maxx) || (localMap1.maxx != localMap8.maxx) || (localMap1.miny != ((Map)localObject).miny) || (localMap1.miny != localMap8.miny) || (localMap1.maxy != ((Map)localObject).maxy) || (localMap1.maxy != localMap8.maxy) || (localMap1.minz != ((Map)localObject).minz) || (localMap1.minz != localMap8.minz) || (localMap1.maxz != ((Map)localObject).maxz) || (localMap1.maxz != localMap8.maxz)) + { + Systemoutprintln("Map sizes differ"); + System.exit(1); + } + try + { + for (int n = localMap1.minz; n <= localMap1.maxz; n++) + for (i2 = localMap1.miny; i2 <= localMap1.maxy; i2++) + for (i3 = localMap1.minx; i3 <= localMap1.maxx; i3++) + { + boolean bool1 = localMap1.contentAt(i3, i2, n).equals(((Map)localObject).contentAt(i3, i2, n)); + boolean bool2 = localMap1.contentAt(i3, i2, n).equals(localMap8.contentAt(i3, i2, n)); + i5 = ((Map)localObject).contentAt(i3, i2, n).equals(localMap8.contentAt(i3, i2, n)); + if ((!bool1) && (!bool2)) + { + if (i5 == 0) + { + Systemoutprintln(i3 + "," + i2 + "," + n + " local and remote don't match original and differ"); + System.exit(1); + } + else { + localMap9.setAt(i3, i2, n, ((Map)localObject).contentAt(i3, i2, n)); + } + } else if (!bool1) + localMap9.setAt(i3, i2, n, ((Map)localObject).contentAt(i3, i2, n)); + else if (!bool2) + localMap9.setAt(i3, i2, n, localMap8.contentAt(i3, i2, n)); + else + localMap9.setAt(i3, i2, n, localMap1.contentAt(i3, i2, n)); + } + Systemoutprintln("Saving"); + localMap9.saveReferencing(new File(paramArrayOfString[4]), localMap1); + Systemoutprintln("Done"); + } + catch (Exception localException12) + { + localException12.printStackTrace(); + } + } + else + { + int m; + int i1; + if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-diff"))) + { + if (paramArrayOfString.length < 4) + { + System.out.println(str1); + try { System.in.read(); } catch (Exception localException2) { + }return; + } + + Map localMap2 = new Map(new File(paramArrayOfString[1])); + localObject = new Map(new File(paramArrayOfString[2])); + + int j = Math.max(localMap2.minx, ((Map)localObject).minx); + m = Math.min(localMap2.maxx, ((Map)localObject).maxx); + i1 = Math.max(localMap2.miny, ((Map)localObject).miny); + i2 = Math.min(localMap2.maxy, ((Map)localObject).maxy); + i3 = Math.max(localMap2.minz, ((Map)localObject).minz); + int i4 = Math.min(localMap2.maxz, ((Map)localObject).maxz); + Systemoutprintln("Comparing: x(" + j + "-" + m + ") y(" + i1 + "-" + i2 + ") z(" + i3 + "-" + i4 + ")"); + try + { + FileWriter localFileWriter2 = new FileWriter(paramArrayOfString[3]); + i5 = 0; + for (int i6 = i3; i6 <= i4; i6++) + { + Systemoutprintln("Z-level " + i6); + for (int i7 = i1; i7 <= i2; i7++) + for (int i8 = j; i8 <= m; i8++) + if (!localMap2.contentAt(i8, i7, i6).equals(((Map)localObject).contentAt(i8, i7, i6))) + { + localFileWriter2.write("(" + i8 + "," + (1 + ((Map)localObject).maxy - i7) + "," + i6 + ")=" + ((Map)localObject).contentAt(i8, i7, i6) + "\n"); + i5++; + } + } + localFileWriter2.flush(); + localFileWriter2.close(); + if (i5 == 0) + Systemoutprintln("Files do match"); + else + Systemoutprintln("Writed out " + i5 + " differences"); + } + catch (Exception localException13) + { + localException13.printStackTrace(); + } + + Systemoutprintln("Done"); + } + else + { + String str7; + String str8; + if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-patch"))) + { + if (paramArrayOfString.length < 4) + { + System.out.println(str2); + try { System.in.read(); } catch (Exception localException3) { + }return; + } + + Map localMap3 = new Map(new File(paramArrayOfString[1])); + try + { + localObject = new BufferedReader(new InputStreamReader(new FileInputStream(paramArrayOfString[2]))); + + while ((str7 = ((BufferedReader)localObject).readLine()) != null) + { + str7 = str7.trim(); + if (str7.length() != 0) + { + m = str7.indexOf(",", 1); + i1 = Integer.parseInt(str7.substring(1, m)); + str7 = str7.substring(m); + m = str7.indexOf(",", 1); + i2 = Integer.parseInt(str7.substring(1, m)); + str7 = str7.substring(m); + m = str7.indexOf(")", 1); + i3 = Integer.parseInt(str7.substring(1, m)); + str8 = str7.substring(str7.indexOf("=") + 1); + localMap3.setAt(i1, 1 + localMap3.maxy - i2, i3, str8); + } + } + localMap3.save(new File(paramArrayOfString[3])); + } + catch (Exception localException8) + { + localException8.printStackTrace(); + } + + Systemoutprintln("Done"); + } + else if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-pack"))) + { + if (paramArrayOfString.length < 3) + { + System.out.println(str3); + try { System.in.read(); } catch (Exception localException4) { + }return; + } + + Map localMap4 = new Map(); + try { + BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(paramArrayOfString[1]))); + Systemoutprintln("Loading"); + + while ((str7 = localBufferedReader.readLine()) != null) + { + str7 = str7.trim(); + if (str7.length() != 0) + { + m = str7.indexOf(",", 1); + i1 = Integer.parseInt(str7.substring(1, m)); + str7 = str7.substring(m); + m = str7.indexOf(",", 1); + i2 = Integer.parseInt(str7.substring(1, m)); + str7 = str7.substring(m); + m = str7.indexOf(")", 1); + i3 = Integer.parseInt(str7.substring(1, m)); + str8 = str7.substring(str7.indexOf("=") + 1); + localMap4.setAt(i1, i2, i3, str8); + } + } + Systemoutprintln("Flipping"); + localMap4.mirrorY(); + Systemoutprintln("Saving, bounds: x{" + localMap4.minx + " - " + localMap4.maxx + "}, y{" + localMap4.miny + " - " + localMap4.maxy + "}, z{" + localMap4.minz + " - " + localMap4.maxz + "}"); + localMap4.save(new File(paramArrayOfString[2])); + Systemoutprintln("Done"); + } + catch (Exception localException9) + { + localException9.printStackTrace(); + } + } + else if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-unpack"))) + { + if (paramArrayOfString.length < 3) + { + System.out.println(str4); + try { System.in.read(); } catch (Exception localException5) { + }return; + } + + Systemoutprintln("Loading"); + Map localMap5 = new Map(new File(paramArrayOfString[1])); + try { + FileWriter localFileWriter1 = new FileWriter(paramArrayOfString[2]); + Systemoutprintln("Saving"); + for (int k = localMap5.minz; k <= localMap5.maxz; k++) + { + Systemoutprintln("Z-level " + k); + for (m = localMap5.miny; m <= localMap5.maxy; m++) + for (i1 = localMap5.minx; i1 <= localMap5.maxx; i1++) + localFileWriter1.write("(" + i1 + "," + (1 + localMap5.maxy - m) + "," + k + ")=" + localMap5.contentAt(i1, m, k) + "\n"); + localFileWriter1.write("\n"); + } + localFileWriter1.flush(); + localFileWriter1.close(); + + Systemoutprintln("Done"); + } + catch (Exception localException10) + { + localException10.printStackTrace(); + } + } + else if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-clean"))) + { + if (paramArrayOfString.length < 4) + { + System.out.println(str5); + try { System.in.read(); } catch (Exception localException6) { + }return; + } + + Map localMap6 = new Map(new File(paramArrayOfString[1]), true); + Map localMap7 = new Map(new File(paramArrayOfString[2])); + try + { + localMap7.saveReferencing(new File(paramArrayOfString[3]), localMap6); + Systemoutprintln("Done"); + } + catch (Exception localException11) + { + localException11.printStackTrace(); + } + } + else + { + System.out.println(str1); + System.out.println(str2); + System.out.println(str3); + System.out.println(str4); + System.out.println(str5); + System.out.println(str6); + try { + System.in.read(); } catch (Exception localException7) { } + } + } + } + } + + public static void Systemoutprintln(String paramString) { if (!silent) + System.out.println(paramString); } + + public static void Systemoutprint(String paramString) + { + if (!silent) + System.out.print(paramString); + } +} diff --git a/tools/mapmerge/Source/bin/MapPatcher/SavingThread.java b/tools/mapmerge/Source/bin/MapPatcher/SavingThread.java new file mode 100644 index 00000000000..24a3d7b04df --- /dev/null +++ b/tools/mapmerge/Source/bin/MapPatcher/SavingThread.java @@ -0,0 +1,37 @@ +class SavingThread extends Thread +{ + int z; + Map mymap; + boolean done; + int progress; + StringBuilder result; + + public SavingThread(int paramInt1, Map paramMap, int paramInt2) + { + this.z = paramInt1; + this.mymap = paramMap; + this.progress = 0; + this.done = false; + this.result = new StringBuilder(paramInt2); + } + + public void run() + { + this.result.append("(" + this.mymap.minx + "," + this.mymap.miny + "," + this.z + ") = {\"\r\n"); + + int i = (this.mymap.maxx - this.mymap.minx) * (this.mymap.maxy - this.mymap.miny) / 100; + int j = 0; + for (int k = this.mymap.miny; k <= this.mymap.maxy; k++) + { + for (int m = this.mymap.minx; m <= this.mymap.maxx; m++) + { + this.result.append(this.mymap.getIdFor(this.mymap.contentAt(m, k, this.z))); + j++; if (j >= i) { j = 0; this.progress += 1; } + } + this.result.append("\r\n"); + } + this.result.append("\"}\r\n"); + this.result.append("\r\n"); + this.done = true; + } +} From 9d35e884524fbbf2cd5b5548887af25745141f87 Mon Sep 17 00:00:00 2001 From: CorruptComputer Date: Thu, 4 Jun 2015 16:14:27 -0500 Subject: [PATCH 09/57] Whoops --- tools/mapmerge/Source/{bin => src}/MapPatcher/Location.java | 0 tools/mapmerge/Source/{bin => src}/MapPatcher/Map.java | 0 tools/mapmerge/Source/{bin => src}/MapPatcher/MapPatcher.java | 0 tools/mapmerge/Source/{bin => src}/MapPatcher/SavingThread.java | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename tools/mapmerge/Source/{bin => src}/MapPatcher/Location.java (100%) rename tools/mapmerge/Source/{bin => src}/MapPatcher/Map.java (100%) rename tools/mapmerge/Source/{bin => src}/MapPatcher/MapPatcher.java (100%) rename tools/mapmerge/Source/{bin => src}/MapPatcher/SavingThread.java (100%) diff --git a/tools/mapmerge/Source/bin/MapPatcher/Location.java b/tools/mapmerge/Source/src/MapPatcher/Location.java similarity index 100% rename from tools/mapmerge/Source/bin/MapPatcher/Location.java rename to tools/mapmerge/Source/src/MapPatcher/Location.java diff --git a/tools/mapmerge/Source/bin/MapPatcher/Map.java b/tools/mapmerge/Source/src/MapPatcher/Map.java similarity index 100% rename from tools/mapmerge/Source/bin/MapPatcher/Map.java rename to tools/mapmerge/Source/src/MapPatcher/Map.java diff --git a/tools/mapmerge/Source/bin/MapPatcher/MapPatcher.java b/tools/mapmerge/Source/src/MapPatcher/MapPatcher.java similarity index 100% rename from tools/mapmerge/Source/bin/MapPatcher/MapPatcher.java rename to tools/mapmerge/Source/src/MapPatcher/MapPatcher.java diff --git a/tools/mapmerge/Source/bin/MapPatcher/SavingThread.java b/tools/mapmerge/Source/src/MapPatcher/SavingThread.java similarity index 100% rename from tools/mapmerge/Source/bin/MapPatcher/SavingThread.java rename to tools/mapmerge/Source/src/MapPatcher/SavingThread.java From 2cca4a5a65de0482ac92c1f1d41b6748624cb95b Mon Sep 17 00:00:00 2001 From: kingofkosmos Date: Wed, 10 Jun 2015 19:26:17 +0300 Subject: [PATCH 10/57] Made Autolathe and Exosuit Fabricator produce things on top of themselves. --- code/game/machinery/autolathe.dm | 2 +- code/game/mecha/mech_fabricator.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index c5b55fe62af..9464fa4797c 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -179,7 +179,7 @@ if(href_list["make"]) - var/turf/T = get_step(src.loc, get_dir(src,usr)) + var/turf/T = loc ///////////////// //href protection diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index c9cc3e158d9..ba14de8c664 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -169,7 +169,7 @@ overlays -= "fab-active" desc = initial(desc) - var/location = get_step(src,SOUTH) + var/location = loc var/obj/item/I = new D.build_path(location) I.m_amt = get_resource_cost_w_coeff(D,"$metal") I.g_amt = get_resource_cost_w_coeff(D,"$glass") From 7a6f377eee6629418243fa09fcaf28a64368d75c Mon Sep 17 00:00:00 2001 From: kingofkosmos Date: Fri, 12 Jun 2015 21:13:35 +0300 Subject: [PATCH 11/57] Exosuit Fabricator spitting-direction is now a dir variable. --- code/game/mecha/mech_fabricator.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index ba14de8c664..e2e0503e385 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -169,7 +169,7 @@ overlays -= "fab-active" desc = initial(desc) - var/location = loc + var/location = get_step(src,(dir)) var/obj/item/I = new D.build_path(location) I.m_amt = get_resource_cost_w_coeff(D,"$metal") I.g_amt = get_resource_cost_w_coeff(D,"$glass") @@ -305,7 +305,7 @@ if (..()) return user.set_machine(src) - var/turf/exit = get_step(src,SOUTH) + var/turf/exit = get_step(src,(dir)) if(exit.density) visible_message("\icon[src] \The [src] beeps, \"Error! Part outlet is obstructed.\"") return From b91e99507c7b9acd24ecc13c8d1824fc65ef113f Mon Sep 17 00:00:00 2001 From: LaharlMontogmmery Date: Sun, 21 Jun 2015 15:14:02 +0200 Subject: [PATCH 12/57] Base Changes for BlueSpace Content Transfer --- code/game/objects/items/weapons/storage/backpack.dm | 13 +++++++++++++ code/modules/research/stock_parts.dm | 7 +++++++ 2 files changed, 20 insertions(+) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index d8aed9fdd9d..6d627007af7 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -34,6 +34,8 @@ icon_state = "holdingpack" max_w_class = 5 max_combined_w_class = 35 + var/pshoom = 'sound/items/PSHOOM.ogg' + var/alt_sound = 'sound/items/PSHOOM_2.ogg' /obj/item/weapon/storage/backpack/holding/suicide_act(mob/user) user.visible_message("[user] is jumping into [src]! It looks like \he's trying to commit suicide.") @@ -50,6 +52,17 @@ return return ..() +/obj/item/weapon/storage/backpack/holding/content_can_dump(atom/dest_object, mob/user) + if(Adjacent(user)) + if(dest_object.storage_contents_dump_act(src, user)) + if(alt_sound && prob(1)) + playsound(src, alt_sound, 40, 1) + else + playsound(src, pshoom, 40, 1) + user.Beam(dest_object,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) + return 1 + return 0 + /obj/item/weapon/storage/backpack/holding/handle_item_insertion(obj/item/W, prevent_warning = 0, mob/user) if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail) var/safety = alert(user, "You feel this may not be the best idea.", "Put in [name]?", "Proceed", "Abort") diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 4f67a8aa16d..adc06b14686 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -42,6 +42,13 @@ pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/PSHOOM.ogg' alt_sound = 'sound/items/PSHOOM_2.ogg' +/obj/item/weapon/storage/part_replacer/bluespace/content_can_dump(atom/dest_object, mob/user) + if(Adjacent(user)) + if(dest_object.storage_contents_dump_act(src, user)) + play_rped_sound() + user.Beam(dest_object,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) + return 1 + return 0 /obj/item/weapon/storage/part_replacer/proc/play_rped_sound() //Plays the sound for RPED exhanging or installing parts. From 7c475fb2d0ab65ad61671607fdd17adde4b108ce Mon Sep 17 00:00:00 2001 From: LaharlMontogmmery Date: Sun, 21 Jun 2015 15:51:06 +0200 Subject: [PATCH 13/57] Changelog. --- .../Laharl Montogmmery-PR-10076.yml | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 html/changelogs/Laharl Montogmmery-PR-10076.yml diff --git a/html/changelogs/Laharl Montogmmery-PR-10076.yml b/html/changelogs/Laharl Montogmmery-PR-10076.yml new file mode 100644 index 00000000000..9f041c8d369 --- /dev/null +++ b/html/changelogs/Laharl Montogmmery-PR-10076.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: Laharl Montogmmery + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Click and drag from a bag/stachel/Storage Object to dump his contents on a tile near you. You can do so into another storage item, a bin, or the ground/table if there's nothing else." + - rscadd: "Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach."" \ No newline at end of file From 1f2edf762ca480d9186a57f6fe9d45db03b58e6d Mon Sep 17 00:00:00 2001 From: LaharlMontogmmery Date: Sun, 21 Jun 2015 15:53:55 +0200 Subject: [PATCH 14/57] Hu....Woops. --- html/changelogs/Laharl Montogmmery-PR-10076.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/changelogs/Laharl Montogmmery-PR-10076.yml b/html/changelogs/Laharl Montogmmery-PR-10076.yml index 9f041c8d369..e6ad131cfe7 100644 --- a/html/changelogs/Laharl Montogmmery-PR-10076.yml +++ b/html/changelogs/Laharl Montogmmery-PR-10076.yml @@ -34,4 +34,4 @@ delete-after: True # Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. changes: - rscadd: "Click and drag from a bag/stachel/Storage Object to dump his contents on a tile near you. You can do so into another storage item, a bin, or the ground/table if there's nothing else." - - rscadd: "Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach."" \ No newline at end of file + - rscadd: "Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach." \ No newline at end of file From ea9849a436216884931817e0d91f38892d6cbec2 Mon Sep 17 00:00:00 2001 From: LaharlMontogmmery Date: Sun, 21 Jun 2015 17:20:01 +0200 Subject: [PATCH 15/57] Reduce range of the BoH to 7. --- .../objects/items/weapons/storage/backpack.dm | 17 ++++++++++------- code/modules/research/stock_parts.dm | 11 +++++++---- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 6d627007af7..9aaf2ab747f 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -54,13 +54,16 @@ /obj/item/weapon/storage/backpack/holding/content_can_dump(atom/dest_object, mob/user) if(Adjacent(user)) - if(dest_object.storage_contents_dump_act(src, user)) - if(alt_sound && prob(1)) - playsound(src, alt_sound, 40, 1) - else - playsound(src, pshoom, 40, 1) - user.Beam(dest_object,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) - return 1 + if(get_dist(user, dest_object) < 8) + if(dest_object.storage_contents_dump_act(src, user)) + if(alt_sound && prob(1)) + playsound(src, alt_sound, 40, 1) + else + playsound(src, pshoom, 40, 1) + user.Beam(dest_object,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) + return 1 + user << "The [src.name] buzzes." + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) return 0 /obj/item/weapon/storage/backpack/holding/handle_item_insertion(obj/item/W, prevent_warning = 0, mob/user) diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index adc06b14686..4ee8ea23b77 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -44,10 +44,13 @@ /obj/item/weapon/storage/part_replacer/bluespace/content_can_dump(atom/dest_object, mob/user) if(Adjacent(user)) - if(dest_object.storage_contents_dump_act(src, user)) - play_rped_sound() - user.Beam(dest_object,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) - return 1 + if(get_dist(user, dest_object) < 8) + if(dest_object.storage_contents_dump_act(src, user)) + play_rped_sound() + user.Beam(dest_object,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) + return 1 + user << "The [src.name] buzzes." + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) return 0 /obj/item/weapon/storage/part_replacer/proc/play_rped_sound() From 44b10eb779c3d7b6e032467f64c9668cc16bc77b Mon Sep 17 00:00:00 2001 From: LaharlMontogmmery Date: Sun, 21 Jun 2015 20:00:43 +0200 Subject: [PATCH 16/57] Nerfs the BRPED range to 7. --- code/modules/research/stock_parts.dm | 9 +++++---- html/changelogs/Laharl Montogmmery-PR-10076.yml | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 4ee8ea23b77..6009118aa1f 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -23,10 +23,11 @@ return else if(works_from_distance) - if(istype(T)) - if(T.component_parts) - T.exchange_parts(user, src) - user.Beam(T,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) + if(get_dist(user, T) < 8) + if(istype(T)) + if(T.component_parts) + T.exchange_parts(user, src) + user.Beam(T,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) return /obj/item/weapon/storage/part_replacer/bluespace diff --git a/html/changelogs/Laharl Montogmmery-PR-10076.yml b/html/changelogs/Laharl Montogmmery-PR-10076.yml index e6ad131cfe7..bc8618f9d3f 100644 --- a/html/changelogs/Laharl Montogmmery-PR-10076.yml +++ b/html/changelogs/Laharl Montogmmery-PR-10076.yml @@ -34,4 +34,5 @@ delete-after: True # Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. changes: - rscadd: "Click and drag from a bag/stachel/Storage Object to dump his contents on a tile near you. You can do so into another storage item, a bin, or the ground/table if there's nothing else." - - rscadd: "Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach." \ No newline at end of file + - rscadd: "Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7 tiles." + - rscadd: "BRPED has a range of 7 tiles now for replacing parts now." \ No newline at end of file From b0cd6d34b1dd7c3db2892b31e202bbd77380c462 Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 22 Jun 2015 00:35:24 +0200 Subject: [PATCH 17/57] Lots of work on acids, smoke, foam, reagents reaction() proc. - fixed the fraction argument in reaction(...., INGESTED, fraction) so the proper amounts of each reagent react, not all of it. - slight optimization of datum/reagents/reaction() - small optimization /datum/reagent/proc/reaction_mob - the smoke's reagents no longer do direct transfer upon crossed()/move() but uses "reagents.reaction( mob, TOUCH)" only. - fixes no ingesting smoke if it's in the dark. - removed block gas smoke effect flag from clown mask and other non "actual" gas mask. - refactor how protection against touched chems being absorbed is done. get_permeability_protection() to get that protection. No more simple RNG get touched or not, now the amount that touches you depends on your protection and the volume in question. - changes acid_act to take volume into account. - chem_smoke now uses process() just like foam, we remove the reaction from crossed() and Move(), it's only done in process() now. - optimization of effect/smoke, OOP! And now all smoke effects use objprocessing instead of shitty sleep/spawn - removed mob var/coughedtime. - add a volume check to item/acid_act(), there's a threshold to be able to melt and then a probability to melt (acidpwr&volume). - greatly lowered the amount of reagent in the smoke from dead blobspore (so the volume isn't enough for melting) - human/acid_act(): damage to limbs depends on acidpwr&volume. - fixes metalfoam not working. - smoke powder: only one start() call. - Amound of smoke objects depends on amount of smoke recipe created. - Adds an argument to add_reagent() to block automatic call of handle_reaction() - When using reagents/proc/trans_to(), reactions are now only handled after every reagent is transfered and not before. - Amount of smoke objects depends on amount of smoke reagent created. - radius of foam reaction depends on amount of foam reagent created. - The amount of other reagents inside the smoke/foam decides the life expectancy of the effect. - The amount of reagents in each small smoke cloud/foam cell depends on the amount of other reagents in the initial reaction but also how much smoke/foam was created (more smoke means dilution of the reagents). - smoke/foam's reagent reaction on mob decreases the life expectancy of the effect (to avoid reagent duplication) - The amount of reagent reacting with atoms is less if the life expectancy is high.(to avoid reagent duplication) - The amount of movement from the smoke now depends on the number of smoke clouds created. - removing some useless code in chem_grenade/prime(). - When calling human/acid_act(), item acid melting chance lowers after each each successful melt in the list, some of the acid is "used" to melt that item so the next items have a lower chance to melt (to make melting every clothing harder). - remove the banned reagent list from sprays, not needed anymore now that acid is nerfed. - chem_grenade reaction, if there's no reagent left after reaction (smoke/foam/etc, reagents cleared) you don't get the steam effect and immediate reaction with all atoms around the grenade explosion. (Fixes foam cleaner grenade deleting bloodstains around it as soon as the grenade explodes, even if the foam hasn't reached the tile yet). - melted storage items now drop their content instead of deleting everything. --- code/datums/spell.dm | 8 +- code/game/gamemodes/antag_spawner.dm | 2 +- code/game/gamemodes/blob/blobs/blob_mobs.dm | 4 +- .../shadowling/shadowling_abilities.dm | 4 +- code/game/machinery/bots/medbot.dm | 3 +- code/game/machinery/iv_drip.dm | 3 +- code/game/mecha/combat/marauder.dm | 2 +- code/game/objects/effects/anomalies.dm | 2 +- .../effects/effect_system/effect_system.dm | 4 +- .../effects/effect_system/effects_foam.dm | 47 +- .../effects/effect_system/effects_smoke.dm | 473 +++++++----------- .../objects/effects/explosion_particles.dm | 2 +- code/game/objects/effects/step_triggers.dm | 8 +- code/game/objects/items.dm | 15 +- .../objects/items/weapons/cigs_lighters.dm | 18 +- .../items/weapons/grenades/chem_grenade.dm | 38 +- .../items/weapons/grenades/smokebomb.dm | 8 +- code/game/objects/items/weapons/scrolls.dm | 2 +- .../objects/items/weapons/tanks/watertank.dm | 60 +-- code/game/objects/structures/hivebot.dm | 2 +- code/modules/clothing/masks/gasmask.dm | 12 +- code/modules/events/vent_clog.dm | 2 +- code/modules/events/wizard/curseditems.dm | 2 +- code/modules/events/wizard/imposter.dm | 2 +- code/modules/events/wizard/shuffle.dm | 6 +- code/modules/food&drinks/drinks/drinks.dm | 27 +- code/modules/food&drinks/food/condiment.dm | 29 +- code/modules/food&drinks/food/snacks.dm | 13 +- .../living/carbon/alien/humanoid/humanoid.dm | 3 + .../mob/living/carbon/human/human_defense.dm | 24 +- .../mob/living/carbon/human/human_helpers.dm | 24 +- .../mob/living/carbon/human/species.dm | 15 +- code/modules/mob/living/carbon/life.dm | 12 +- .../mob/living/carbon/monkey/monkey.dm | 11 +- code/modules/mob/living/living.dm | 4 + code/modules/mob/living/living_defines.dm | 4 +- .../mob/living/silicon/robot/robot_modules.dm | 2 - code/modules/mob/mob_defines.dm | 2 - .../suit/n_suit_verbs/ninja_adrenaline.dm | 2 +- .../ninja/suit/n_suit_verbs/ninja_smoke.dm | 2 +- code/modules/power/apc.dm | 4 +- code/modules/power/singularity/narsie.dm | 2 +- code/modules/projectiles/guns/magic/wand.dm | 2 +- code/modules/projectiles/projectile/magic.dm | 2 +- code/modules/reagents/Chemistry-Holder.dm | 36 +- code/modules/reagents/Chemistry-Reagents.dm | 43 +- .../reagents/Chemistry-Recipes/Others.dm | 4 +- .../Chemistry-Recipes/Pyrotechnics.dm | 38 +- code/modules/reagents/reagent_containers.dm | 1 - .../reagents/reagent_containers/borghydro.dm | 3 +- .../reagents/reagent_containers/dropper.dm | 8 +- .../reagents/reagent_containers/glass.dm | 6 - .../reagents/reagent_containers/hypospray.dm | 3 +- .../reagents/reagent_containers/pill.dm | 7 +- .../reagents/reagent_containers/spray.dm | 2 - .../reagents/reagent_containers/syringes.dm | 7 +- code/modules/research/experimentor.dm | 12 +- 57 files changed, 485 insertions(+), 598 deletions(-) diff --git a/code/datums/spell.dm b/code/datums/spell.dm index c01f7c427e6..ec7d7f0a6e8 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -198,20 +198,20 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if(istype(target,/mob/living) && message) target << text("[message]") if(sparks_spread) - var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + var/datum/effect/effect/system/spark_spread/sparks = new sparks.set_up(sparks_amt, 0, location) //no idea what the 0 is sparks.start() if(smoke_spread) if(smoke_spread == 1) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // if more than one smoke, spread it around smoke.start() else if(smoke_spread == 2) - var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread() + var/datum/effect/effect/system/smoke_spread/bad/smoke = new smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // same here smoke.start() else if(smoke_spread == 3) - var/datum/effect/effect/system/sleep_smoke_spread/smoke = new /datum/effect/effect/system/sleep_smoke_spread() + var/datum/effect/effect/system/smoke_spread/sleeping/smoke = new smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // same here smoke.start() diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index a621168182a..99a9cafeedc 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -64,7 +64,7 @@ H << "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later." /obj/item/weapon/antag_spawner/contract/spawn_antag(var/client/C, var/turf/T, var/type = "") - PoolOrNew(/obj/effect/effect/harmless_smoke, T) + PoolOrNew(/obj/effect/effect/smoke, T) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) C.prefs.copy_to(M) M.key = C.key diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 3a6ef5e1d26..809ad10de19 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -90,11 +90,11 @@ /mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) ..(1) // On death, create a small smoke of harmful gas (s-Acid) - var/datum/effect/effect/system/chem_smoke_spread/S = new + var/datum/effect/effect/system/smoke_spread/chem/S = new var/turf/location = get_turf(src) // Create the reagents to put into the air - create_reagents(25) + create_reagents(2) if(overmind && overmind.blob_reagent_datum) reagents.add_reagent(overmind.blob_reagent_datum.id, 25) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index d6abcab574f..a6873eeb611 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -346,10 +346,10 @@ B.reagents.clear_reagents() //Just in case! B.icon_state = null //Invisible B.reagents.add_reagent("blindness_smoke", 10) - var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + var/datum/effect/effect/system/smoke_spread/chem/S = new S.attach(B) if(S) - S.set_up(B.reagents, 10, 0, B.loc) + S.set_up(10, 0, B.loc, null, 0, B.reagents) S.start() sleep(10) S.start() diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index 3040c71c68f..f32f41fab3a 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -487,8 +487,9 @@ if ((get_dist(src, patient) <= 1) && (on)) if(reagent_id == "internal_beaker") if(use_beaker && reagent_glass && reagent_glass.reagents.total_volume) + var/fraction = min(injection_amount/reagent_glass.reagents.total_volume, 1) + reagent_glass.reagents.reaction(patient, INGEST, fraction) reagent_glass.reagents.trans_to(patient,injection_amount) //Inject from beaker instead. - reagent_glass.reagents.reaction(patient, INGEST) else patient.reagents.add_reagent(reagent_id,injection_amount) C.visible_message("[src] injects [patient] with its syringe!", \ diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index e5961c09fc9..c7cce94f929 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -107,7 +107,8 @@ if(istype(beaker, /obj/item/weapon/reagent_containers/blood)) // speed up transfer on blood packs transfer_amount = 10 - beaker.reagents.reaction(attached, INGEST, 1,0) //make reagents reacts, but don't spam messages + var/fraction = min(transfer_amount/beaker.volume, 1) //the fraction that is transfered of the total volume + beaker.reagents.reaction(attached, INGEST, fraction,0) //make reagents reacts, but don't spam messages beaker.reagents.trans_to(attached, transfer_amount) update_icon() diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 15dadd6456d..89580944e01 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -13,7 +13,7 @@ var/smoke = 5 var/smoke_ready = 1 var/smoke_cooldown = 100 - var/datum/effect/effect/system/harmless_smoke_spread/smoke_system = new + var/datum/effect/effect/system/smoke_spread/smoke_system = new operation_req_access = list(access_cent_specops) wreckage = /obj/structure/mecha_wreckage/marauder add_req_access = 0 diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 3c314ee975c..c0f69672087 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -27,7 +27,7 @@ /obj/effect/anomaly/proc/anomalyNeutralize() - PoolOrNew(/obj/effect/effect/bad_smoke, loc) + PoolOrNew(/obj/effect/effect/smoke/bad, loc) for(var/atom/movable/O in src) O.loc = src.loc diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index eb84812588f..8953cc09c7a 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -16,7 +16,7 @@ would spawn and follow the beaker, even if it is carried or thrown. /obj/effect/effect/Destroy() ..() return QDEL_HINT_PUTINPOOL - +/* /datum/effect/effect/proc/fadeOut(var/atom/A, var/frames = 16) if(A.alpha == 0) //Handle already transparent case return @@ -27,7 +27,7 @@ would spawn and follow the beaker, even if it is carried or thrown. A.alpha -= step sleep(world.tick_lag) return - +*/ /datum/effect/effect/system var/number = 3 var/cardinals = 0 diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 96d7433cead..81596aa8a74 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -10,10 +10,10 @@ layer = TURF_LAYER + 0.1 mouse_opacity = 0 var/amount = 3 - var/expand = 1 animate_movement = 0 var/metal = 0 var/lifetime = 6 + var/max_lifetime = 6 /obj/effect/effect/foam/metal/aluminium @@ -36,16 +36,20 @@ /obj/effect/effect/foam/Destroy() SSobj.processing.Remove(src) return ..() - +/* /obj/effect/effect/foam/metal/New(loc) ..() var/obj/structure/foamedmetal/M = new(src.loc) M.metal = metal - M.updateicon() + M.updateicon()*/ /obj/effect/effect/foam/proc/kill_foam() SSobj.processing.Remove(src) + if(metal) + var/obj/structure/foamedmetal/M = new(src.loc) + M.metal = metal + M.updateicon() flick("[icon_state]-disolve", src) spawn(5) qdel(src) @@ -55,21 +59,36 @@ lifetime-- if(lifetime < 1) kill_foam() + return + + var/fraction = 1/max_lifetime + for(var/obj/O in range(0,src)) + if(O.type == src.type) + continue + reagents.reaction(O, TOUCH, fraction) + for(var/mob/living/L in range(0,src)) + foam_mob(L) + var/T = get_turf(src) + reagents.reaction(T, TOUCH, fraction) + if(--amount < 0) return - for(var/atom/M in view(1,src)) - if(M == src) - continue - reagents.reaction(M, TOUCH) spread_foam() +/obj/effect/effect/foam/proc/foam_mob(var/mob/living/L as mob) + if(lifetime<1) + return + if(!istype(L)) + return + var/fraction = 1/max_lifetime + reagents.reaction(L, TOUCH, fraction) + lifetime-- /obj/effect/effect/foam/Crossed(var/atom/movable/AM) if(istype(AM, /mob/living/carbon)) var/mob/living/carbon/M = AM M.slip(5, 2, src) - /obj/effect/effect/foam/metal/Crossed(var/atom/movable/AM) return @@ -87,10 +106,14 @@ if(foundfoam) continue - var/obj/effect/effect/foam/F = PoolOrNew(/obj/effect/effect/foam, T) + for(var/mob/living/L in T) + foam_mob(L) + var/obj/effect/effect/foam/F = PoolOrNew(src.type, T) F.amount = amount reagents.copy_to(F, (reagents.total_volume)) F.color = color + F.metal = metal + F.max_lifetime = max_lifetime /obj/effect/effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -136,7 +159,6 @@ amount = round(sqrt(amt / 2), 1) carry.copy_to(chemholder, carry.total_volume) - /datum/effect/effect/system/foam_spread/metal/set_up(amt=5, loca, var/datum/reagents/carry = null, var/metaltype) ..() metal = metaltype @@ -148,11 +170,12 @@ else var/obj/effect/effect/foam/F = PoolOrNew(foamtype, location) var/foamcolor = mix_color_from_reagents(chemholder.reagents.reagent_list) - chemholder.reagents.copy_to(F, chemholder.reagents.total_volume) + chemholder.reagents.copy_to(F, chemholder.reagents.total_volume/amount) //how much reagents each foam cell holds F.color = foamcolor F.amount = amount F.metal = metal - + F.max_lifetime = Clamp(round(sqrt(chemholder.reagents.total_volume/2), 1), 3, 10) //how long each foam cell lasts. + F.lifetime = F.max_lifetime ////////////////////////////////////////////////////////// // FOAM STRUCTURE. Formed by metal foams. Dense and opaque, but easy to break diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 2d7cba31150..9e071a63205 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -6,37 +6,92 @@ /obj/effect/effect/smoke name = "smoke" - icon = 'icons/effects/water.dmi' - icon_state = "smoke" - opacity = 1 - anchored = 0.0 - mouse_opacity = 0 - var/amount = 8.0 - -/obj/effect/effect/harmless_smoke - name = "smoke" - icon_state = "smoke" - opacity = 1 - anchored = 0.0 - mouse_opacity = 0 - var/amount = 6.0 - //Remove this bit to use the old smoke icon = 'icons/effects/96x96.dmi' pixel_x = -32 pixel_y = -32 - -/obj/effect/effect/harmless_smoke/New() - ..() - spawn (100) - qdel(src) - -/datum/effect/effect/system/harmless_smoke_spread - var/total_smoke = 0 // To stop it being spammed and lagging! + icon_state = "smoke" + opacity = 1 + anchored = 0 + mouse_opacity = 0 + var/steps = 0 + var/lifetime = 10 var/direction + var/fading = 0 -/datum/effect/effect/system/harmless_smoke_spread/set_up(n = 5, c = 0, loca, direct) - if(n > 10) - n = 10 + +/obj/effect/effect/smoke/proc/fade_out(var/frames = 16) + if(alpha == 0) //Handle already transparent case + return + if(frames == 0) + frames = 1 //We will just assume that by 0 frames, the coder meant "during one frame". + var/step = alpha / frames + for(var/i = 0, i < frames, i++) + alpha -= step + sleep(world.tick_lag) + +/obj/effect/effect/smoke/New() + ..() + create_reagents(500) + SSobj.processing.Add(src) + lifetime = lifetime + rand(1,3) + +/obj/effect/effect/smoke/Destroy() + SSobj.processing.Remove(src) + ..() + +/obj/effect/effect/smoke/proc/kill_smoke() + SSobj.processing.Remove(src) + qdel(src) + +/obj/effect/effect/smoke/process() + world << "Process" + lifetime-- + if(lifetime < 3 && !fading) + fading = 1 + spawn(0) + fade_out(100) + if(lifetime < 1) + kill_smoke() + return 0 + if(steps >= 1) + step(src,direction) + steps-- + return 1 + +/obj/effect/effect/smoke/Crossed(mob/living/M as mob) + if(!istype(M)) + return + smoke_mob(M) + +/obj/effect/effect/smoke/Cross(mob/living/M as mob) + if(!istype(M)) + return + smoke_mob(M) + +/obj/effect/effect/smoke/proc/smoke_mob(mob/living/carbon/M as mob) + if(!istype(M)) + return 0 + if(lifetime<1) + return 0 + if(M.internal != null || (M.wear_mask && (M.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) + return 0 + if(M.smoke_delay) + return 0 + M.smoke_delay++ + spawn(10) + if(M) + M.smoke_delay = 0 + return 1 + + + +/datum/effect/effect/system/smoke_spread + var/direction + var/smoke_type = /obj/effect/effect/smoke + +/datum/effect/effect/system/smoke_spread/set_up(n = 5, c = 0, loca, direct) + if(n > 20) + n = 20 number = n cardinals = c if(istype(loca, /turf/)) @@ -46,70 +101,39 @@ if(direct) direction = direct +/datum/effect/effect/system/smoke_spread/start() + for(var/i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/harmless_smoke/smoke = PoolOrNew(/obj/effect/effect/harmless_smoke, location) - src.total_smoke++ - var/direction = src.direction - if(!direction) - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - for(i=0, i 20) - n = 20 - number = n - cardinals = c - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) - if(direct) - direction = direct - -/datum/effect/effect/system/bad_smoke_spread/start() - var/i = 0 - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/bad_smoke/smoke = PoolOrNew(/obj/effect/effect/bad_smoke, location) - src.total_smoke++ - var/direction = src.direction - if(!direction) - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - for(i=0, i= 1) - reagents.reaction(A, TOUCH) - reagents.trans_to(A.reagents, 10) - return - - -/obj/effect/effect/chem_smoke/Crossed(mob/living/carbon/M as mob ) - ..() - if(reagents.total_volume >= 1) - reagents.reaction(M, TOUCH) - reagents.trans_to(M.reagents, 10) - -/datum/effect/effect/system/chem_smoke_spread - var/total_smoke = 0 // To stop it being spammed and lagging! - var/direction +/datum/effect/effect/system/smoke_spread/chem var/obj/chemholder + smoke_type = /obj/effect/effect/smoke/chem - -/datum/effect/effect/system/chem_smoke_spread/New() +/datum/effect/effect/system/smoke_spread/chem/New() ..() chemholder = PoolOrNew(/obj) var/datum/reagents/R = new/datum/reagents(500) chemholder.reagents = R R.my_atom = chemholder -/datum/effect/effect/system/chem_smoke_spread/Destroy() +/datum/effect/effect/system/smoke_spread/chem/Destroy() chemholder = null ..() return QDEL_HINT_PUTINPOOL -/datum/effect/effect/system/chem_smoke_spread/set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct, silent = 0) +/datum/effect/effect/system/smoke_spread/chem/set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct, silent = 0) if(n > 20) n = 20 number = n cardinals = c - carry.copy_to(chemholder, carry.total_volume) - - if(istype(loca, /turf/)) location = loca else location = get_turf(loca) - if(direct) direction = direct + carry.copy_to(chemholder, carry.total_volume) if(!silent) var/contained = "" @@ -270,140 +232,63 @@ log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.") -/datum/effect/effect/system/chem_smoke_spread/start() - var/i = 0 +/datum/effect/effect/system/smoke_spread/chem/start() var/color = mix_color_from_reagents(chemholder.reagents.reagent_list) - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/chem_smoke/smoke = PoolOrNew(/obj/effect/effect/chem_smoke, location) - src.total_smoke++ - var/direction = src.direction - if(!direction) - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - - if(chemholder.reagents.total_volume != 1) // can't split 1 very well - chemholder.reagents.copy_to(smoke, chemholder.reagents.total_volume / number) // copy reagents to each smoke, divide evenly - - if(color) - smoke.color = color // give the smoke color, if it has any to begin with + for(var/i=0, i 1) // can't split 1 very well + chemholder.reagents.copy_to(S, chemholder.reagents.total_volume / number) // copy reagents to each smoke, divide evenly + if(color) + S.color = color // give the smoke color, if it has any to begin with + else + // if no color, just use the old smoke icon + S.icon = 'icons/effects/96x96.dmi' + S.icon_state = "smoke" + S.process() //calling process right now so the smoke immediately attacks mobs. ///////////////////////////////////////////// // Sleep smoke ///////////////////////////////////////////// -/obj/effect/effect/sleep_smoke - name = "smoke" - icon_state = "smoke" - opacity = 1 - anchored = 0.0 - mouse_opacity = 0 - var/amount = 6.0 - //Remove this bit to use the old smoke - icon = 'icons/effects/96x96.dmi' - pixel_x = -32 - pixel_y = -32 +/obj/effect/effect/smoke/sleeping color = "#9C3636" -/obj/effect/effect/sleep_smoke/New() - ..() - spawn (200+rand(10,30)) - qdel(src) +/obj/effect/effect/smoke/sleeping/process() + for(var/mob/living/carbon/M in range(1,src)) + smoke_mob(M) -/obj/effect/effect/sleep_smoke/Move() - ..() - for(var/mob/living/carbon/M in get_turf(src)) - if (M.internal != null && M.wear_mask && (M.wear_mask.flags & MASKINTERNALS)) -// if (M.wear_suit, /obj/item/clothing/suit/wizrobe && (M.hat, /obj/item/clothing/head/wizard) && (M.shoes, /obj/item/clothing/shoes/sandal)) // I'll work on it later - else - M.drop_item() - M:sleeping += 5 - if (M.coughedtime != 1) - M.coughedtime = 1 - M.emote("cough") - spawn(20) - if(M && M.loc) - M.coughedtime = 0 - return - -/obj/effect/effect/sleep_smoke/Crossed(mob/living/carbon/M as mob ) - ..() - if(istype(M, /mob/living/carbon)) - if (M.internal != null && M.wear_mask && (M.wear_mask.flags & MASKINTERNALS)) -// if (M.wear_suit, /obj/item/clothing/suit/wizrobe && (M.hat, /obj/item/clothing/head/wizard) && (M.shoes, /obj/item/clothing/shoes/sandal)) // Work on it later +/obj/effect/effect/smoke/sleeping/smoke_mob(mob/living/carbon/M as mob) + if(..()) + if(M.internal != null || (M.wear_mask && (M.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) return else M.drop_item() - M:sleeping += 5 - if (M.coughedtime != 1) - M.coughedtime = 1 - M.emote("cough") - spawn(20) - if(M && M.loc) - M.coughedtime = 0 - return - -/datum/effect/effect/system/sleep_smoke_spread - var/total_smoke = 0 // To stop it being spammed and lagging! - var/direction - -/datum/effect/effect/system/sleep_smoke_spread/set_up(n = 5, c = 0, loca, direct) - if(n > 20) - n = 20 - number = n - cardinals = c - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) - if(direct) - direction = direct + M.sleeping = max(M.sleeping,10) + M.emote("cough") -/datum/effect/effect/system/sleep_smoke_spread/start() - var/i = 0 - for(i=0, i 20) - return - spawn(0) - if(holder) - src.location = get_turf(holder) - var/obj/effect/effect/sleep_smoke/smoke = PoolOrNew(/obj/effect/effect/sleep_smoke, location) - src.total_smoke++ - var/direction = src.direction - if(!direction) - if(src.cardinals) - direction = pick(cardinal) - else - direction = pick(alldirs) - for(i=0, i 0) .-- //it survives the acid... break - if(.) + if(. && prob(min(meltingpwr/10,90))) //chance to melt depends on acid power and volume. var/turf/T = get_turf(src) if(T) - T.visible_message("[src] melts away!") var/obj/effect/decal/cleanable/molten_item/I = new (T) I.pixel_x = rand(-16,16) I.pixel_y = rand(-16,16) I.desc = "Looks like this was \an [src] some time ago." + if(istype(src,/obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = src + S.do_quick_empty() //melted storage item drops its content. qdel(src) else for(var/armour_value in armor) //but is weakened - armor[armour_value] = max(armor[armour_value]-acidpwr,0) + armor[armour_value] = max(armor[armour_value]-min(acidpwr,meltingpwr/10),0) if(!findtext(desc, "it looks slightly melted...")) //it looks slightly melted... it looks slightly melted... it looks slightly melted... etc. desc += " it looks slightly melted..." //needs a space at the start, formatting diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 99bde856d35..a18807d3bb9 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -203,14 +203,16 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/cigarette/proc/handle_reagents() - if(iscarbon(loc)) - var/mob/living/carbon/C = loc - if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob - if(prob(15)) // so it's not an instarape in case of acid - reagents.reaction(C, INGEST) - reagents.trans_to(C, REAGENTS_METABOLISM) - return - reagents.remove_any(REAGENTS_METABOLISM) + if(reagents.total_volume) + if(iscarbon(loc)) + var/mob/living/carbon/C = loc + if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob + if(prob(15)) // so it's not an instarape in case of acid + var/fraction = min(REAGENTS_METABOLISM/reagents.total_volume, 1) + reagents.reaction(C, INGEST, fraction) + reagents.trans_to(C, REAGENTS_METABOLISM) + return + reagents.remove_any(REAGENTS_METABOLISM) /obj/item/clothing/mask/cigarette/process() diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index ff1812883aa..d021a3b27b5 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -180,31 +180,29 @@ mix_reagents() - if(reagents.total_volume) //The possible reactions didnt use up all reagents. + if(reagents.total_volume) //The possible reactions didnt use up all reagents, so we spread it around. var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() steam.set_up(10, 0, get_turf(src)) steam.attach(src) steam.start() - var/list/viewable = view(affected_area, loc) - var/list/accessible = can_flood_from(loc, affected_area) - var/list/reactable = accessible - var/mycontents = GetAllContents() - for(var/turf/T in accessible) - for(var/atom/A in T.GetAllContents()) - if(A in mycontents) continue - if(!(A in viewable)) continue - reactable |= A - if(!reactable.len) //Nothing to react with. Probably means we're in nullspace. - qdel(src) - return - var/fraction = 1/reactable.len - for(var/atom/A in reactable) - reagents.reaction(A, TOUCH, fraction) + var/list/viewable = view(affected_area, loc) + var/list/accessible = can_flood_from(loc, affected_area) + var/list/reactable = accessible + var/mycontents = GetAllContents() + for(var/turf/T in accessible) + for(var/atom/A in T.GetAllContents()) + if(A in mycontents) continue + if(!(A in viewable)) continue + reactable |= A + if(!reactable.len) //Nothing to react with. Probably means we're in nullspace. + qdel(src) + return + var/fraction = 1/reactable.len + for(var/atom/A in reactable) + reagents.reaction(A, TOUCH, fraction) - invisibility = INVISIBILITY_MAXIMUM //Why am i doing this? - spawn(50) //To make sure all reagents can work - qdel(src) //correctly before deleting the grenade. + qdel(src) /obj/item/weapon/grenade/chem_grenade/proc/mix_reagents() var/total_temp @@ -381,6 +379,7 @@ beakers += B1 beakers += B2 + /obj/item/weapon/grenade/chem_grenade/colorful name = "colorful grenade" desc = "Used for wide scale painting projects." @@ -399,6 +398,7 @@ beakers += B1 beakers += B2 + /obj/item/weapon/grenade/chem_grenade/clf3 name = "clf3 grenade" desc = "BURN!-brand foaming clf3. In a special applicator for rapid purging of wide areas." diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index 5ba0e73fa7d..059fb02ae5c 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -5,11 +5,11 @@ det_time = 20 item_state = "flashbang" slot_flags = SLOT_BELT - var/datum/effect/effect/system/bad_smoke_spread/smoke + var/datum/effect/effect/system/smoke_spread/bad/smoke /obj/item/weapon/grenade/smokebomb/New() ..() - src.smoke = new /datum/effect/effect/system/bad_smoke_spread + src.smoke = new /datum/effect/effect/system/smoke_spread/bad src.smoke.attach(src) /obj/item/weapon/grenade/smokebomb/Destroy() @@ -24,10 +24,6 @@ src.smoke.start() sleep(10) src.smoke.start() - sleep(10) - src.smoke.start() - sleep(10) - src.smoke.start() for(var/obj/effect/blob/B in view(8,src)) var/damage = round(30/(get_dist(B,src)+1)) diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 521f5ab64e7..8166da92f19 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -57,7 +57,7 @@ if(!((user == loc || (in_range(src, user) && istype(src.loc, /turf))))) return - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(5, 0, user.loc) smoke.attach(user) smoke.start() diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index d634d9a832c..310e30dbf5c 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -309,7 +309,9 @@ pass_flags = PASSTABLE /obj/effect/nanofrost_container/proc/Smoke() - PoolOrNew(/obj/effect/effect/freezing_smoke, list(loc, 6, 1)) + var/datum/effect/effect/system/smoke_spread/freezing/S = new + S.set_up(6, 0, loc, null, 1) + S.start() var/obj/effect/decal/cleanable/flour/F = new /obj/effect/decal/cleanable/flour(src.loc) F.color = "#B2FFFF" F.name = "nanofrost residue" @@ -317,33 +319,16 @@ playsound(src,'sound/effects/bamf.ogg',100,1) qdel(src) -/obj/effect/effect/freezing_smoke +/obj/effect/effect/smoke/freezing name = "nanofrost smoke" - icon_state = "smoke" opacity = 0 - anchored = 0.0 - mouse_opacity = 0 - icon = 'icons/effects/96x96.dmi' - pixel_x = -32 - pixel_y = -32 color = "#B2FFFF" - var/amount = 0 -/obj/effect/effect/freezing_smoke/New(loc, var/amt, var/blast) - ..() - spawn(100+rand(10,30)) - qdel(src) - amount = amt - if(amount) - var/datum/effect/effect/system/freezing_smoke_spread/F = new /datum/effect/effect/system/freezing_smoke_spread - F.set_up(amount, 0, src.loc) - F.start() - if(blast) - for(var/turf/T in trange(2, src.loc)) - Chilled(T) - return +/datum/effect/effect/system/smoke_spread/freezing + smoke_type = /obj/effect/effect/smoke/freezing + var/blast = 0 -/obj/effect/effect/freezing_smoke/proc/Chilled(atom/A) +/datum/effect/effect/system/smoke_spread/freezing/proc/Chilled(atom/A) if(istype(A, /turf/simulated)) var/turf/simulated/T = A if(T.air) @@ -364,29 +349,16 @@ L.ExtinguishMob() return -/datum/effect/effect/system/freezing_smoke_spread +/datum/effect/effect/system/smoke_spread/freezing/set_up(n = 5, c = 0, loca, direct, blasting = 0) + ..() + blast = blasting -/datum/effect/effect/system/freezing_smoke_spread/set_up(n = 6, c = 0, loca) - number = n - if(istype(loca, /turf/)) - location = loca - else - location = get_turf(loca) +/datum/effect/effect/system/smoke_spread/freezing/start() + if(blast) + for(var/turf/T in trange(2, location)) + Chilled(T) + ..() -/datum/effect/effect/system/freezing_smoke_spread/start() - var/i = 0 - for(i=0, iThe [src] warps in!") diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index bf59b9d3278..96646718d5e 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -222,7 +222,7 @@ /obj/item/clothing/mask/gas/clown_hat name = "clown wig and mask" desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask." - flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags = MASKCOVERSEYES | MASKINTERNALS icon_state = "clown" item_state = "clown_hat" @@ -245,28 +245,28 @@ /obj/item/clothing/mask/gas/sexyclown name = "sexy-clown wig and mask" desc = "A feminine clown mask for the dabbling crossdressers or female entertainers." - flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags = MASKCOVERSEYES | MASKINTERNALS icon_state = "sexyclown" item_state = "sexyclown" /obj/item/clothing/mask/gas/mime name = "mime mask" desc = "The traditional mime's mask. It has an eerie facial posture." - flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags = MASKCOVERSEYES | MASKINTERNALS icon_state = "mime" item_state = "mime" /obj/item/clothing/mask/gas/monkeymask name = "monkey mask" desc = "A mask used when acting as a monkey." - flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags = MASKCOVERSEYES | MASKINTERNALS icon_state = "monkeymask" item_state = "monkeymask" /obj/item/clothing/mask/gas/sexymime name = "sexy mime mask" desc = "A traditional female mime's mask." - flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags = MASKCOVERSEYES | MASKINTERNALS icon_state = "sexymime" item_state = "sexymime" @@ -283,5 +283,5 @@ /obj/item/clothing/mask/gas/owl_mask name = "owl mask" desc = "Twoooo!" - flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + flags = MASKCOVERSEYES | MASKINTERNALS icon_state = "owl" \ No newline at end of file diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 7703be7fc73..6a9fcf140e5 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -33,7 +33,7 @@ R.my_atom = vent R.add_reagent(pick(gunk), 50) - var/datum/effect/effect/system/chem_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/chem/smoke = new smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1) playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index c057de5b96e..e38777f8ee7 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -43,6 +43,6 @@ I.name = "cursed " + I.name for(var/mob/living/carbon/human/H in living_mob_list) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(max(1,1), 0, H.loc) smoke.start() \ No newline at end of file diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index 5d3567a9d47..cda6dc2d41f 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -14,7 +14,7 @@ if(!candidates) return //Sad Trombone var/client/C = pick(candidates) - PoolOrNew(/obj/effect/effect/harmless_smoke, W.loc) + PoolOrNew(/obj/effect/effect/smoke, W.loc) var/mob/living/carbon/human/I = new /mob/living/carbon/human(W.loc) I.real_name = W.real_name diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm index 4315f3a4261..df271b96ef1 100644 --- a/code/modules/events/wizard/shuffle.dm +++ b/code/modules/events/wizard/shuffle.dm @@ -28,7 +28,7 @@ moblocs.len -= 1 for(var/mob/living/carbon/human/H in living_mob_list) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(max(1,1), 0, H.loc) smoke.start() @@ -60,7 +60,7 @@ mobnames.len -= 1 for(var/mob/living/carbon/human/H in living_mob_list) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(max(1,1), 0, H.loc) smoke.start() @@ -92,6 +92,6 @@ mobs -= mobs[mobs.len] for(var/mob/living/carbon/human/H in living_mob_list) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(max(1,1), 0, H.loc) smoke.start() diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food&drinks/drinks/drinks.dm index 1f07766a523..f8db998ed7c 100644 --- a/code/modules/food&drinks/drinks/drinks.dm +++ b/code/modules/food&drinks/drinks/drinks.dm @@ -34,24 +34,19 @@ if(M == user) M << "You swallow a gulp of [src]." - if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(5) - reagents.trans_to(M, gulp_size) + else - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 - - user.visible_message("[user] attempts to feed [src] to [M].", "You attempt to feed [src] to [M].") - if(!do_mob(user, M)) return - if(!reagents.total_volume) return // The drink might be empty after the delay, such as by spam-feeding - user.visible_message("[user] feeds [src] to [M].", "You feed [src] to [M].") - add_logs(user, M, "fed", object="[reagentlist(src)]") - if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(5) - reagents.trans_to(M, gulp_size) + user.visible_message("[user] attempts to feed [src] to [M].", "You attempt to feed [src] to [M].") + if(!do_mob(user, M)) + return + if(!reagents || !reagents.total_volume) + return // The drink might be empty after the delay, such as by spam-feeding + user.visible_message("[user] feeds [src] to [M].", "You feed [src] to [M].") + add_logs(user, M, "fed", object="[reagentlist(src)]") + var/fraction = min(gulp_size/reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) + reagents.trans_to(M, gulp_size) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) return 1 diff --git a/code/modules/food&drinks/food/condiment.dm b/code/modules/food&drinks/food/condiment.dm index bff39b0e262..a20b7e078cd 100644 --- a/code/modules/food&drinks/food/condiment.dm +++ b/code/modules/food&drinks/food/condiment.dm @@ -30,9 +30,8 @@ return /obj/item/weapon/reagent_containers/food/condiment/attack(mob/M as mob, mob/user as mob, def_zone) - var/datum/reagents/R = src.reagents - if(!R || !R.total_volume) + if(!reagents || !reagents.total_volume) user << "None of [src] left, oh no!" return 0 @@ -41,28 +40,20 @@ if(M == user) M << "You swallow some of contents of \the [src]." - if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(5) - reagents.trans_to(M, 10) - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 - else user.visible_message("[user] attempts to feed [M] from [src].") - if(!do_mob(user, M)) return + if(!do_mob(user, M)) + return + if(!reagents || !reagents.total_volume) + return // The condiment might be empty after the delay. user.visible_message("[user] feeds [M] from [src].") - add_logs(user, M, "fed", object="[reagentlist(src)]") - if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(5) - reagents.trans_to(M, 10) - - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - return 1 - return 0 + var/fraction = min(10/reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) + reagents.trans_to(M, 10) + playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) + return 1 /obj/item/weapon/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity) if(!proximity) return diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food&drinks/food/snacks.dm index 919e6e0a62b..7f8d06dd703 100644 --- a/code/modules/food&drinks/food/snacks.dm +++ b/code/modules/food&drinks/food/snacks.dm @@ -105,14 +105,11 @@ M.satiety -= junkiness playsound(M.loc,'sound/items/eatfood.ogg', rand(10,50), 1) if(reagents.total_volume) - reagents.reaction(M, INGEST) - spawn(5) - if(reagents.total_volume > bitesize) //pretty sure this is unnecessary - reagents.trans_to(M, bitesize) - else - reagents.trans_to(M, reagents.total_volume) - bitecount++ - On_Consume() + var/fraction = min(bitesize/reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) + reagents.trans_to(M, bitesize) + bitecount++ + On_Consume() return 1 return 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 02b856d2356..558604dad94 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -146,3 +146,6 @@ /mob/living/carbon/alien/humanoid/check_ear_prot() return 1 + +/mob/living/carbon/alien/carbon/alien/humanoid/get_permeability_protection() + return 0.8 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 32086909dbf..6b92ce711d6 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -238,6 +238,9 @@ emp_act /mob/living/carbon/human/acid_act(var/acidpwr, var/toxpwr, var/acid_volume) var/list/damaged = list() var/list/inventory_items_to_kill = list() + var/acidity = min(acidpwr*acid_volume/200, toxpwr) + var/acid_volume_left = acid_volume + var/acid_decay = 200/acidpwr // how much volume we lose per item we try to melt. 10 for fluoro, 20 for sulphuric //HEAD// var/obj/item/clothing/head_clothes = null @@ -249,7 +252,8 @@ emp_act head_clothes = head if(head_clothes) if(!head_clothes.unacidable) - head_clothes.acid_act(acidpwr) + head_clothes.acid_act(acidpwr, acid_volume_left) + acid_volume_left = max(acid_volume_left - acid_decay, 0) //We remove some of the acid volume. update_inv_glasses() update_inv_wear_mask() update_inv_head() @@ -270,7 +274,8 @@ emp_act chest_clothes = wear_suit if(chest_clothes) if(!chest_clothes.unacidable) - chest_clothes.acid_act(acidpwr) + chest_clothes.acid_act(acidpwr, acid_volume_left) + acid_volume_left = max(acid_volume_left - acid_decay, 0) update_inv_w_uniform() update_inv_wear_suit() else @@ -299,7 +304,8 @@ emp_act arm_clothes = wear_suit if(arm_clothes) if(!arm_clothes.unacidable) - arm_clothes.acid_act(acidpwr) + arm_clothes.acid_act(acidpwr, acid_volume_left) + acid_volume_left = max(acid_volume_left - acid_decay, 0) update_inv_gloves() update_inv_w_uniform() update_inv_wear_suit() @@ -324,7 +330,8 @@ emp_act leg_clothes = wear_suit if(leg_clothes) if(!leg_clothes.unacidable) - leg_clothes.acid_act(acidpwr) + leg_clothes.acid_act(acidpwr, acid_volume_left) + acid_volume_left = max(acid_volume_left - acid_decay, 0) update_inv_shoes() update_inv_w_uniform() update_inv_wear_suit() @@ -341,11 +348,11 @@ emp_act //DAMAGE// for(var/obj/item/organ/limb/affecting in damaged) - affecting.take_damage(2*toxpwr, toxpwr) + affecting.take_damage(acidity, 2*acidity) if(affecting.name == "head") - affecting.take_damage(2*toxpwr, toxpwr) - if(prob(2*acidpwr)) //Applies disfigurement + if(prob(min(acidpwr*acid_volume/10, 90))) //Applies disfigurement + affecting.take_damage(acidity, 2*acidity) emote("scream") facial_hair_style = "Shaved" hair_style = "Bald" @@ -366,7 +373,8 @@ emp_act inventory_items_to_kill += l_hand for(var/obj/item/I in inventory_items_to_kill) - I.acid_act(acidpwr) + I.acid_act(acidpwr, acid_volume_left) + acid_volume_left = max(acid_volume_left - acid_decay, 0) /mob/living/carbon/human/grabbedby(mob/living/user) if(w_uniform) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 8d08b29ecb2..e163fb158e0 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -139,10 +139,30 @@ /mob/living/carbon/human/can_track(mob/living/user) if(wear_id && istype(wear_id.GetID(), /obj/item/weapon/card/id/syndicate)) - return 0 + return 0 if(istype(head, /obj/item/clothing/head)) var/obj/item/clothing/head/hat = head if(hat.blockTracking) return 0 - + return ..() + +/mob/living/carbon/human/get_permeability_protection() + var/list/prot = list("hands"=0, "chest"=0, "groin"=0, "legs"=0, "feet"=0, "arms"=0, "head"=0) + for(var/obj/item/I in get_equipped_items()) + if(I.body_parts_covered & HANDS) + prot["hands"] = max(1 - I.permeability_coefficient, prot["hands"]) + if(I.body_parts_covered & CHEST) + prot["chest"] = max(1 - I.permeability_coefficient, prot["chest"]) + if(I.body_parts_covered & GROIN) + prot["groin"] = max(1 - I.permeability_coefficient, prot["groin"]) + if(I.body_parts_covered & LEGS) + prot["legs"] = max(1 - I.permeability_coefficient, prot["legs"]) + if(I.body_parts_covered & FEET) + prot["feet"] = max(1 - I.permeability_coefficient, prot["feet"]) + if(I.body_parts_covered & ARMS) + prot["arms"] = max(1 - I.permeability_coefficient, prot["arms"]) + if(I.body_parts_covered & HEAD) + prot["head"] = max(1 - I.permeability_coefficient, prot["head"]) + var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7 + return protection \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index ae6d8824d95..bc1c2c58c3a 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1101,13 +1101,14 @@ // Handle chem smoke effect -- Doohl if(!H.has_smoke_protection()) - for(var/obj/effect/effect/chem_smoke/smoke in view(1, H)) - if(smoke.reagents.total_volume) - smoke.reagents.reaction(H, INGEST) - spawn(5) - if(smoke) - smoke.reagents.copy_to(H, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? - break // If they breathe in the nasty stuff once, no need to continue checking + for(var/obj/effect/effect/smoke/chem/S in range(1, H)) + if(S.reagents.total_volume) + var/amount = min(S.reagents.total_volume/2, 10) + if(amount >= 1) + var/fraction = min(amount/S.reagents.total_volume, 1) + S.reagents.reaction(H,INGEST, fraction) + S.reagents.trans_to(H, amount) + break // If they breathe in the nasty stuff once, no need to continue checking else //Still give containing object the chance to interact if(istype(H.loc, /obj/)) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 9ac7837148a..28b44665bab 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -71,12 +71,12 @@ //Harmful gasses if(!has_smoke_protection()) - for(var/obj/effect/effect/chem_smoke/smoke in view(1,src)) - if(smoke.reagents.total_volume) - smoke.reagents.reaction(src,INGEST) - spawn(5) - if(smoke) - smoke.reagents.copy_to(src, 10) + for(var/obj/effect/effect/smoke/chem/S in range(1,src)) + if(S.reagents.total_volume) + var/amount = min(S.reagents.total_volume, 10) + var/fraction = min(amount/S.reagents.total_volume, 1) + S.reagents.reaction(src,INGEST, fraction) + S.reagents.copy_to(src, amount) break else //Breathe from loc as obj again diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index a7c821c9493..394a92d9437 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -255,7 +255,7 @@ src << "Your mask protects you from the acid." return - take_organ_damage(min(6*toxpwr, acid_volume * toxpwr)) + take_organ_damage(min(6*toxpwr, acid_volume * acidpwr/10)) /mob/living/carbon/monkey/help_shake_act(mob/living/carbon/M) if(health < 0 && ishuman(M)) @@ -263,3 +263,12 @@ H.do_cpr(src) else ..() + +/mob/living/carbon/monkey/get_permeability_protection() + var/protection = 0 + if(head) + protection = 1 - head.permeability_coefficient + if(wear_mask) + protection = max(1 - wear_mask.permeability_coefficient, protection) + protection = protection/7 //the rest of the body isn't covered. + return protection \ No newline at end of file diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index d23dcbabcc0..aea4871ac68 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -858,3 +858,7 @@ Sorry Giacom. Please don't be mad :( return 0 return 1 + +//used in datum/reagents/reaction() proc +/mob/living/proc/get_permeability_protection() + return 0 \ No newline at end of file diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 6509db4ac67..b48f2f21e14 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -43,4 +43,6 @@ var/list/datum/action/actions = list() var/list/pipes_shown = list() - var/last_played_vent \ No newline at end of file + var/last_played_vent + + var/smoke_delay = 0 //used to prevent spam with smoke reagent reaction on mob. \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index e9bd8434232..712d269a592 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -101,8 +101,6 @@ emag.reagents.add_reagent("facid", 250) emag.name = "Fluacid spray" - var/obj/item/weapon/reagent_containers/spray/S = emag - S.banned_reagents = list() var/datum/robot_energy_storage/gauze/gauzestore = new /datum/robot_energy_storage/gauze(src) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index c9883f02afe..265a428ba71 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -100,8 +100,6 @@ var/in_throw_mode = 0 - var/coughedtime = null - var/music_lastplayed = "null" var/job = null//Living diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm index d6dc568105f..94740bd0e1e 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm @@ -18,7 +18,7 @@ spawn(30)//Slight delay so the enemy does not immedietly know the ability was used. Due to lag, this often came before waking up. H.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!")) spawn(70) - reagents.reaction(H, 2) + reagents.reaction(H, INGEST) reagents.trans_id_to(H, "radium", a_transfer) H << "You are beginning to feel the after-effect of the injection." a_boost-- diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm index aef3d012dd8..c89a3b11f92 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm @@ -9,7 +9,7 @@ if(!ninjacost(0,N_SMOKE_BOMB)) var/mob/living/carbon/human/H = affecting - var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread() + var/datum/effect/effect/system/smoke_spread/bad/smoke = new smoke.set_up(10, 0, H.loc) smoke.start() playsound(H.loc, 'sound/effects/bamf.ogg', 50, 2) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 7ddb67eefeb..cc03d8f6120 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -945,11 +945,11 @@ cell.corrupt() src.malfhack = 1 update_icon() - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(3, 0, src.loc) smoke.attach(src) smoke.start() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + var/datum/effect/effect/system/spark_spread/s = new s.set_up(3, 1, src) s.start() visible_message("The [src.name] suddenly lets out a blast of smoke and some sparks!", \ diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 96a08d99e4d..607be1ba324 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -42,7 +42,7 @@ user << "Your soul is too far away." return makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1) - PoolOrNew(/obj/effect/effect/sleep_smoke, user.loc) + PoolOrNew(/obj/effect/effect/smoke/sleeping, user.loc) /obj/singularity/narsie/process() diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 461af979728..55f9ff2849f 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -123,7 +123,7 @@ /obj/item/weapon/gun/magic/wand/teleport/zap_self(mob/living/user as mob) do_teleport(user, user, 10) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(10, 0, user.loc) smoke.start() charges-- diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index efc20cedfd7..ec2bbcdae6c 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -83,7 +83,7 @@ if(!stuff.anchored && stuff.loc) teleammount++ do_teleport(stuff, stuff, 10) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(max(round(10 - teleammount),1), 0, stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity smoke.start() diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 94e40614ab8..0978a34f58f 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -124,7 +124,7 @@ var/const/INGEST = 2 var/current_reagent_transfer = current_reagent.volume * part if(preserve_data) trans_data = copy_data(current_reagent) - R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, src.chem_temp) + R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, src.chem_temp, no_react = 1) //we only handle reaction after every reagent has been transfered. src.remove_reagent(current_reagent.id, current_reagent_transfer) src.update_total() @@ -426,17 +426,21 @@ var/const/INGEST = 2 return 0 /datum/reagents/proc/reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=1,var/show_message=1) - for(var/datum/reagent/R in reagent_list) - if(ismob(A)) - R.reaction_mob(A, method, R.volume*volume_modifier, show_message) - if(isturf(A)) + if(isliving(A)) + var/mob/living/L = A + var/touch_protection = 0 + if(method == TOUCH) + touch_protection = L.get_permeability_protection() + for(var/datum/reagent/R in reagent_list) + R.reaction_mob(L, method, R.volume*volume_modifier, show_message, touch_protection) + else if(isturf(A)) + for(var/datum/reagent/R in reagent_list) R.reaction_turf(A, R.volume*volume_modifier, show_message) - if(isobj(A)) + else if(isobj(A)) + for(var/datum/reagent/R in reagent_list) R.reaction_obj(A, R.volume*volume_modifier, show_message) - return - -/datum/reagents/proc/add_reagent(var/reagent, var/amount, var/list/data=null, var/reagtemp = 300) +/datum/reagents/proc/add_reagent(var/reagent, var/amount, var/list/data=null, var/reagtemp = 300, var/no_react = 0) if(!isnum(amount) || !amount) return 1 update_total() @@ -451,7 +455,8 @@ var/const/INGEST = 2 update_total() my_atom.on_reagent_change() R.on_merge(data) - handle_reactions() + if(!no_react) + handle_reactions() return 0 var/datum/reagent/D = chemical_reagents_list[reagent] @@ -465,19 +470,16 @@ var/const/INGEST = 2 R.data = data R.on_new(data) - //debug - //world << "Adding data" - //for(var/D in R.data) - // world << "Container data: [D] = [R.data[D]]" - //debug update_total() my_atom.on_reagent_change() - handle_reactions() + if(!no_react) + handle_reactions() return 0 else WARNING("[my_atom] attempted to add a reagent called ' [reagent] ' which doesn't exist. ([usr])") - handle_reactions() + if(!no_react) + handle_reactions() return 1 diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 2934c57a3c0..7572041506e 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -34,43 +34,22 @@ ..() holder = null -/datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume, var/show_message = 1) //By default we have a chance to transfer some - if(!istype(M, /mob/living)) +/datum/reagent/proc/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume, var/show_message = 1, var/touch_protection = 0) + if(!istype(M)) return 0 var/datum/reagent/self = src - src = null //of the reagent to the mob on TOUCHING it. + src = null - if(!istype(self.holder.my_atom, /obj/effect/effect/chem_smoke)) - // If the chemicals are in a smoke cloud, do not try to let the chemicals "penetrate" into the mob's system (balance station 13) -- Doohl - - if(method == TOUCH) - - var/chance = 1 - var/block = 0 - - for(var/obj/item/clothing/C in M.get_equipped_items()) - if(C.permeability_coefficient < chance) chance = C.permeability_coefficient - if(istype(C, /obj/item/clothing/suit/bio_suit)) - // bio suits are just about completely fool-proof - Doohl - // kind of a hacky way of making bio suits more resistant to chemicals but w/e - if(prob(75)) - block = 1 - - if(istype(C, /obj/item/clothing/head/bio_hood)) - if(prob(75)) - block = 1 - - chance = chance * 100 - - if(prob(chance) && !block) - if(M.reagents) - M.reagents.add_reagent(self.id,self.volume/2) + if(method == TOUCH) + if(M.reagents) + var/modifier = Clamp((1 - touch_protection) + rand(-5,5)/100, 0, 1) + var/amount = round(volume*modifier) + if(amount >= 1) + M.reagents.add_reagent(self.id, amount) return 1 -/datum/reagent/proc/reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object - src = null //if it can hold reagents. nope! - //if(O.reagents) - // O.reagents.add_reagent(id,volume/3) +/datum/reagent/proc/reaction_obj(var/obj/O, var/volume) + src = null return /datum/reagent/proc/reaction_turf(var/turf/T, var/volume) diff --git a/code/modules/reagents/Chemistry-Recipes/Others.dm b/code/modules/reagents/Chemistry-Recipes/Others.dm index 99866fd47eb..a12bc95ebec 100644 --- a/code/modules/reagents/Chemistry-Recipes/Others.dm +++ b/code/modules/reagents/Chemistry-Recipes/Others.dm @@ -143,10 +143,10 @@ /datum/chemical_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) - + world << "holder volb4:[holder.total_volume]" for(var/mob/M in viewers(5, location)) M << "The solution spews out foam!" - + world << "holder vol w/o created vol:[holder.total_volume]" var/datum/effect/effect/system/foam_spread/s = new() s.set_up(created_volume, location, holder) s.start() diff --git a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm index 4b265fae1b9..9f709414a73 100644 --- a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm +++ b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm @@ -215,20 +215,19 @@ /datum/chemical_reaction/smoke_powder/on_reaction(var/datum/reagents/holder, var/created_volume) if(holder.has_reagent("stabilizing_agent")) return + world << "holder volb4:[holder.total_volume]" holder.remove_reagent("smoke_powder", created_volume) + world << "holder vol w/o created vol:[holder.total_volume]" + var/smoke_amount = round(Clamp(created_volume/5, 1, 20),1) var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + var/datum/effect/effect/system/smoke_spread/chem/S = new S.attach(location) playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - if(S) - S.set_up(holder, 10, 0, location) - S.start() - sleep(10) - S.start() - if(holder && holder.my_atom) - holder.clear_reagents() - return + if(S) + S.set_up(holder, smoke_amount, 0, location) + S.start() + if(holder && holder.my_atom) + holder.clear_reagents() /datum/chemical_reaction/smoke_powder_smoke name = "smoke_powder_smoke" @@ -242,18 +241,16 @@ /datum/chemical_reaction/smoke_powder_smoke/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + var/smoke_amount = round(Clamp(created_volume/5, 1, 20),1) + var/datum/effect/effect/system/smoke_spread/chem/S = new S.attach(location) playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - if(S) - S.set_up(holder, 10, 0, location) - S.start() - sleep(10) - S.start() - if(holder && holder.my_atom) - holder.clear_reagents() - return + if(S) + S.set_up(holder, smoke_amount, 0, location) + S.start() + if(holder && holder.my_atom) + holder.clear_reagents() + /datum/chemical_reaction/sonic_powder @@ -318,6 +315,7 @@ var/turf/simulated/T = get_turf(holder.my_atom) if(istype(T)) T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, created_volume) + holder.clear_reagents() return diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index a938b092061..c3108ddeb0c 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -7,7 +7,6 @@ var/amount_per_transfer_from_this = 5 var/possible_transfer_amounts = list(5,10,15,25,30) var/volume = 30 - var/list/banned_reagents = list() //List of reagent IDs we reject. var/list/list_reagents = null var/spawned_disease = null var/disease_amount = 20 diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index d3c923f6e2c..eed51ff2a81 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -92,7 +92,8 @@ Borg Hypospray if (R.total_volume && M.can_inject(user, 1)) M << "You feel a tiny prick!" user << "You inject [M] with the injector." - R.reaction(M, INGEST) + var/fraction = min(amount_per_transfer_from_this/R.total_volume, 1) + R.reaction(M, INGEST, fraction) if(M.reagents) var/trans = R.trans_to(M, amount_per_transfer_from_this) user << "[trans] unit\s injected. [R.total_volume] unit\s remaining." diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 8a8f5f1728b..5c735a313b0 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -21,6 +21,7 @@ return var/trans = 0 + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) if(ismob(target)) if(istype(target , /mob/living/carbon/human)) @@ -40,12 +41,12 @@ if(safe_thing) if(!safe_thing.reagents) safe_thing.create_reagents(100) + + reagents.reaction(safe_thing, TOUCH, fraction) trans = reagents.trans_to(safe_thing, amount_per_transfer_from_this) target.visible_message("[user] tries to squirt something into [target]'s eyes, but fails!", \ "[user] tries to squirt something into [target]'s eyes, but fails!") - spawn(5) - reagents.reaction(safe_thing, TOUCH) user << "You transfer [trans] unit\s of the solution." update_icon() @@ -53,7 +54,8 @@ target.visible_message("[user] squirts something into [target]'s eyes!", \ "[user] squirts something into [target]'s eyes!") - reagents.reaction(target, TOUCH) + + reagents.reaction(target, TOUCH, fraction) var/mob/M = target var/R if(reagents) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 2a21fe917d8..b8f188c3ba5 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -72,12 +72,6 @@ user << "[target] is full." return - if(istype(target, /obj/item/weapon/reagent_containers)) - var/obj/item/weapon/reagent_containers/RC = target - for(var/bad_reg in RC.banned_reagents) - if(reagents.has_reagent(bad_reg, 1)) //Message is a bit "Game-y" but I can't think up a better one. - user << "A chemical in [src] is far too dangerous to transfer to [RC]!" - return var/trans = reagents.trans_to(target, amount_per_transfer_from_this) user << "You transfer [trans] unit\s of the solution to [target]." diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 708b8659a7a..1a86c6f9ed7 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -25,7 +25,8 @@ M << "You feel a tiny prick!" user << "You inject [M] with [src]." - reagents.reaction(M, INGEST) + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) if(M.reagents) var/list/injected = list() for(var/datum/reagent/R in reagents.reagent_list) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 4520bb48afb..b675f86913b 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -45,10 +45,9 @@ if(reagents.total_volume) reagents.reaction(M, apply_type) - spawn(5) - reagents.trans_to(M, reagents.total_volume) - qdel(src) - return 1 + reagents.trans_to(M, reagents.total_volume) + qdel(src) + return 1 else qdel(src) return 1 diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index edfce7a4595..054b8113f2f 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -15,7 +15,6 @@ amount_per_transfer_from_this = 5 volume = 250 possible_transfer_amounts = null - banned_reagents = list("facid","sacid") /obj/item/weapon/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user as mob) @@ -159,7 +158,6 @@ amount_per_transfer_from_this = 10 volume = 600 origin_tech = "combat=3;materials=3;engineering=3" - banned_reagents = list()//the safeties are off, spray and pay! /obj/item/weapon/reagent_containers/spray/chemsprayer/spray(var/atom/A) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 9d7988c289e..ca5a3160a0c 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -151,7 +151,8 @@ var/contained = english_list(rinject) var/mob/M = target add_logs(user, M, "injected", object="[src.name]", addition="which had [contained]") - reagents.reaction(target, INGEST) + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + reagents.reaction(target, INGEST, fraction) if(ismob(target) && target == user) //Attack log entries are produced here due to failure to produce elsewhere. Remove them here if you have doubles from normal syringes. var/list/rinject = list() @@ -161,8 +162,8 @@ var/mob/M = target log_attack("[user.name] ([user.ckey]) injected [M.name] ([M.ckey]) with [src.name], which had [contained] (INTENT: [uppertext(user.a_intent)])") M.attack_log += text("\[[time_stamp()]\] Injected themselves ([contained]) with [src.name].") - - reagents.reaction(target, INGEST) + var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) + reagents.reaction(target, INGEST, fraction) spawn(5) var/datum/reagent/blood/B for(var/datum/reagent/blood/d in src.reagents.reagent_list) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index be722fe8fb0..309557e09ca 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -230,7 +230,7 @@ loaded_item = null /obj/machinery/r_n_d/experimentor/proc/throwSmoke(var/turf/where) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(1,0, where, 0) smoke.start() @@ -322,7 +322,7 @@ R.my_atom = src R.add_reagent(chosenchem , 50) investigate_log("Experimentor has released [chosenchem] smoke.", "experimentor") - var/datum/effect/effect/system/chem_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/chem/smoke = new smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() @@ -334,7 +334,7 @@ var/datum/reagents/R = new/datum/reagents(50) R.my_atom = src R.add_reagent(chosenchem , 50) - var/datum/effect/effect/system/chem_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/chem/smoke = new smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() @@ -421,7 +421,7 @@ R.my_atom = src R.add_reagent("frostoil" , 50) investigate_log("Experimentor has released frostoil gas.", "experimentor") - var/datum/effect/effect/system/chem_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/chem/smoke = new smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) smoke.start() @@ -443,7 +443,7 @@ ejectItem(TRUE) if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) visible_message("[src] malfunctions, releasing a flurry of chilly air as [exp_on] pops out!") - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(1,0, src.loc, 0) smoke.start() ejectItem() @@ -651,7 +651,7 @@ //////////////// RELIC PROCS ///////////////////////////// /obj/item/weapon/relic/proc/throwSmoke(var/turf/where) - var/datum/effect/effect/system/harmless_smoke_spread/smoke = new + var/datum/effect/effect/system/smoke_spread/smoke = new smoke.set_up(1,0, where, 0) smoke.start() From 5242108c4d467b8e966aacabbf9161170ff6a63c Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 22 Jun 2015 01:39:32 +0200 Subject: [PATCH 18/57] a few fixes --- code/game/gamemodes/blob/blobs/blob_mobs.dm | 2 +- code/game/gamemodes/shadowling/shadowling_abilities.dm | 2 +- code/game/objects/effects/effect_system/effects_foam.dm | 6 ------ code/game/objects/effects/effect_system/effects_smoke.dm | 6 +----- code/modules/mob/living/carbon/human/species.dm | 4 ++-- code/modules/reagents/Chemistry-Recipes/Others.dm | 2 -- code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm | 2 -- 7 files changed, 5 insertions(+), 19 deletions(-) diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 809ad10de19..8580c480ab1 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -94,7 +94,7 @@ var/turf/location = get_turf(src) // Create the reagents to put into the air - create_reagents(2) + create_reagents(25) if(overmind && overmind.blob_reagent_datum) reagents.add_reagent(overmind.blob_reagent_datum.id, 25) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index a6873eeb611..c91dfe7b7eb 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -349,7 +349,7 @@ var/datum/effect/effect/system/smoke_spread/chem/S = new S.attach(B) if(S) - S.set_up(10, 0, B.loc, null, 0, B.reagents) + S.set_up(B.reagents, 10, 0, B.loc) S.start() sleep(10) S.start() diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 81596aa8a74..d1d7ecf4cb9 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -36,12 +36,6 @@ /obj/effect/effect/foam/Destroy() SSobj.processing.Remove(src) return ..() -/* -/obj/effect/effect/foam/metal/New(loc) - ..() - var/obj/structure/foamedmetal/M = new(src.loc) - M.metal = metal - M.updateicon()*/ /obj/effect/effect/foam/proc/kill_foam() diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 9e071a63205..0ddfd597868 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -63,11 +63,6 @@ return smoke_mob(M) -/obj/effect/effect/smoke/Cross(mob/living/M as mob) - if(!istype(M)) - return - smoke_mob(M) - /obj/effect/effect/smoke/proc/smoke_mob(mob/living/carbon/M as mob) if(!istype(M)) return 0 @@ -115,6 +110,7 @@ else S.direction = direction S.steps = pick(0,1,1,1,2,2,2,3) + S.process() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index bc1c2c58c3a..4b1712d4a9f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1103,11 +1103,11 @@ if(!H.has_smoke_protection()) for(var/obj/effect/effect/smoke/chem/S in range(1, H)) if(S.reagents.total_volume) - var/amount = min(S.reagents.total_volume/2, 10) + var/amount = min(S.reagents.total_volume, 10) if(amount >= 1) var/fraction = min(amount/S.reagents.total_volume, 1) S.reagents.reaction(H,INGEST, fraction) - S.reagents.trans_to(H, amount) + S.reagents.copy_to(H, amount) break // If they breathe in the nasty stuff once, no need to continue checking else //Still give containing object the chance to interact diff --git a/code/modules/reagents/Chemistry-Recipes/Others.dm b/code/modules/reagents/Chemistry-Recipes/Others.dm index a12bc95ebec..f03bec05038 100644 --- a/code/modules/reagents/Chemistry-Recipes/Others.dm +++ b/code/modules/reagents/Chemistry-Recipes/Others.dm @@ -143,10 +143,8 @@ /datum/chemical_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) - world << "holder volb4:[holder.total_volume]" for(var/mob/M in viewers(5, location)) M << "The solution spews out foam!" - world << "holder vol w/o created vol:[holder.total_volume]" var/datum/effect/effect/system/foam_spread/s = new() s.set_up(created_volume, location, holder) s.start() diff --git a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm index 9f709414a73..ba20b7c7817 100644 --- a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm +++ b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm @@ -215,9 +215,7 @@ /datum/chemical_reaction/smoke_powder/on_reaction(var/datum/reagents/holder, var/created_volume) if(holder.has_reagent("stabilizing_agent")) return - world << "holder volb4:[holder.total_volume]" holder.remove_reagent("smoke_powder", created_volume) - world << "holder vol w/o created vol:[holder.total_volume]" var/smoke_amount = round(Clamp(created_volume/5, 1, 20),1) var/location = get_turf(holder.my_atom) var/datum/effect/effect/system/smoke_spread/chem/S = new From e86354bbed3e12116e8fad5ab01c7b66469f52ae Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 22 Jun 2015 02:43:26 +0200 Subject: [PATCH 19/57] another fix and smoother smoke fading. --- .../objects/effects/effect_system/effects_smoke.dm | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 0ddfd597868..5f862a5de74 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -16,7 +16,6 @@ var/steps = 0 var/lifetime = 10 var/direction - var/fading = 0 /obj/effect/effect/smoke/proc/fade_out(var/frames = 16) @@ -41,15 +40,12 @@ /obj/effect/effect/smoke/proc/kill_smoke() SSobj.processing.Remove(src) - qdel(src) + fade_out() + spawn(5) + qdel(src) /obj/effect/effect/smoke/process() - world << "Process" lifetime-- - if(lifetime < 3 && !fading) - fading = 1 - spawn(0) - fade_out(100) if(lifetime < 1) kill_smoke() return 0 From e507613fbe7e467760fd54937dfd98fab7b87782 Mon Sep 17 00:00:00 2001 From: MrPerson Date: Mon, 22 Jun 2015 03:18:26 -0700 Subject: [PATCH 20/57] Lighting SS speedup Best of both worlds: No colons AND no pointless typechecking! --- code/controllers/subsystem/lighting.dm | 53 ++++++++++---------------- 1 file changed, 21 insertions(+), 32 deletions(-) diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index cd74bb16b84..a039417c3a3 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -32,62 +32,55 @@ var/datum/subsystem/lighting/SSlighting /datum/subsystem/lighting/fire() changed_lights_workload = MC_AVERAGE(changed_lights_workload, changed_lights.len) -// for(var/area/A in sortedAreas) -// A.luminosity = 1 - - for(var/datum/light_source/thing in changed_lights) - thing.check() + for(var/thing in changed_lights) + var/datum/light_source/LS = thing + LS.check() changed_lights.Cut() changed_turfs_workload = MC_AVERAGE(changed_turfs_workload, changed_turfs.len) - for(var/turf/thing in changed_turfs) - if(thing && thing.lighting_changed) - thing.redraw_lighting() + for(var/thing in changed_turfs) + var/turf/T = thing + if(T.lighting_changed) + T.redraw_lighting() changed_turfs.Cut() -// for(var/area/A in sortedAreas) -// A.luminosity = !A.lighting_use_dynamic - //same as above except it attempts to shift ALL turfs in the world regardless of lighting_changed status //Does not loop. Should be run prior to process() being called for the first time. //Note: if we get additional z-levels at runtime (e.g. if the gateway thin ever gets finished) we can initialize specific //z-levels with the z_level argument /datum/subsystem/lighting/Initialize(timeofday, z_level) -// for(var/area/A in sortedAreas) -// A.luminosity = 1 - for(var/datum/light_source/thing in changed_lights) - thing.add_effect() - thing.changed = 0 + for(var/thing in changed_lights) + var/datum/light_source/LS = thing + LS.check() changed_lights.Cut() var/z_start = 1 var/z_finish = world.maxz - if(1 <= z_level && z_level <= world.maxz) + if(z_level >= 1 && z_level <= world.maxz) z_level = round(z_level) z_start = z_level z_finish = z_level var/list/turfs_to_init = block(locate(1, 1, z_start), locate(world.maxx, world.maxy, z_finish)) - for(var/turf/T in turfs_to_init) + for(var/thing in turfs_to_init) + var/turf/T = thing T.init_lighting() if(z_level) //we need to loop through to clear only shifted turfs from the list. or we will cause errors var/i=1 - for(var/turf/thing in changed_turfs) - if(thing && thing.z < z_start && z_finish < thing.z) + for(var/thing in changed_turfs) + var/turf/T = thing + if(T.z in z_start to z_finish) ++i continue changed_turfs.Cut(i, i+1) else changed_turfs.Cut() -// for(var/area/A in sortedAreas) -// A.luminosity = !A.lighting_use_dynamic - ..() //Used to strip valid information from an existing instance and transfer it to the replacement. i.e. when a crash occurs @@ -99,14 +92,13 @@ var/datum/subsystem/lighting/SSlighting if(!istype(SSlighting.changed_lights)) SSlighting.changed_lights = list() -// for(var/area/A in sortedAreas) -// A.luminosity = 1 - - for(var/datum/light_source/L in SSlighting.changed_lights) + for(var/thing in SSlighting.changed_lights) + var/datum/light_source/LS = thing spawn(-1) //so we don't crash the loop (inefficient) - L.check() + LS.check() - for(var/turf/T in changed_turfs) + for(var/thing in changed_turfs) + var/turf/T = thing if(T.lighting_changed) spawn(-1) T.redraw_lighting() @@ -123,6 +115,3 @@ var/datum/subsystem/lighting/SSlighting varval2 = "/list([length(varval2)])" msg += "\t [varname] = [varval1] -> [varval2]\n" world.log << msg - -// for(var/area/A in sortedAreas) -// A.luminosity = !A.lighting_use_dynamic \ No newline at end of file From 6cab00e31b46aff46eabba95c4db2227fcabaabd Mon Sep 17 00:00:00 2001 From: LaharlMontogmmery Date: Wed, 24 Jun 2015 19:51:28 +0200 Subject: [PATCH 21/57] Reverts BPRED change. --- code/modules/research/stock_parts.dm | 9 ++++----- html/changelogs/Laharl Montogmmery-PR-10076.yml | 3 +-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 6009118aa1f..4ee8ea23b77 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -23,11 +23,10 @@ return else if(works_from_distance) - if(get_dist(user, T) < 8) - if(istype(T)) - if(T.component_parts) - T.exchange_parts(user, src) - user.Beam(T,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) + if(istype(T)) + if(T.component_parts) + T.exchange_parts(user, src) + user.Beam(T,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) return /obj/item/weapon/storage/part_replacer/bluespace diff --git a/html/changelogs/Laharl Montogmmery-PR-10076.yml b/html/changelogs/Laharl Montogmmery-PR-10076.yml index bc8618f9d3f..20bc33c09fc 100644 --- a/html/changelogs/Laharl Montogmmery-PR-10076.yml +++ b/html/changelogs/Laharl Montogmmery-PR-10076.yml @@ -34,5 +34,4 @@ delete-after: True # Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. changes: - rscadd: "Click and drag from a bag/stachel/Storage Object to dump his contents on a tile near you. You can do so into another storage item, a bin, or the ground/table if there's nothing else." - - rscadd: "Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7 tiles." - - rscadd: "BRPED has a range of 7 tiles now for replacing parts now." \ No newline at end of file + - rscadd: "Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7 tiles." \ No newline at end of file From ac6389691014316128e8b9ccd0c2410bcb0c3d43 Mon Sep 17 00:00:00 2001 From: phil235 Date: Wed, 24 Jun 2015 20:58:22 +0200 Subject: [PATCH 22/57] - Foam/moke lifetime is no longer affected by reagents volume. - Remove show_message argument from blob reagent reaction_mob()'s and remove the if(show_message) send_message(). Now send_message is called directly on each blob strike. - Changed blob reagent effects to depend on volume so blob spore smoke isn't deadly. - Breathing smoke now reduces its life expectancy and calls reaction(INGEST) with the accurate amount of reagent. - Adjusted the effects on mobs of some other reagents. - Adjusted reagent amounts in chem grenades. --- code/game/gamemodes/blob/overmind.dm | 2 +- code/game/gamemodes/blob/powers.dm | 3 +- .../effects/effect_system/effects_foam.dm | 19 +-- .../effects/effect_system/effects_smoke.dm | 37 ++++-- .../items/weapons/grenades/chem_grenade.dm | 34 +++--- .../mob/living/carbon/human/human_defense.dm | 2 +- .../mob/living/carbon/human/species.dm | 13 +- code/modules/mob/living/carbon/life.dm | 10 +- code/modules/reagents/Chemistry-Reagents.dm | 2 +- .../Chemistry-Reagents/Blob-Reagents.dm | 113 +++++++----------- .../Chemistry-Reagents/Other-Reagents.dm | 4 +- .../Pyrotechnic-Reagents.dm | 4 +- .../Chemistry-Reagents/Toxin-Reagents.dm | 11 +- html/changelogs/phil235-AcidFix.yml | 6 + 14 files changed, 130 insertions(+), 130 deletions(-) create mode 100644 html/changelogs/phil235-AcidFix.yml diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 40ccd99868f..005c40b3364 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -15,7 +15,7 @@ var/blob_points = 0 var/max_blob_points = 100 var/last_attack = 0 - var/datum/reagent/blob_reagent_datum = new/datum/reagent() + var/datum/reagent/blob/blob_reagent_datum = new/datum/reagent/blob() var/list/blob_mobs = list() var/ghostimage = null diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index a9e9bb233ae..446e324b486 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -276,7 +276,8 @@ last_attack = world.time OB.expand(T, 0, blob_reagent_datum.color) for(var/mob/living/L in T) - blob_reagent_datum.reaction_mob(L, TOUCH) + blob_reagent_datum.reaction_mob(L, TOUCH, 25) + blob_reagent_datum.send_message(L) OB.color = blob_reagent_datum.color return diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index d1d7ecf4cb9..81031ea3985 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -13,7 +13,6 @@ animate_movement = 0 var/metal = 0 var/lifetime = 6 - var/max_lifetime = 6 /obj/effect/effect/foam/metal/aluminium @@ -55,13 +54,16 @@ kill_foam() return - var/fraction = 1/max_lifetime + var/fraction = 1/initial(lifetime) for(var/obj/O in range(0,src)) if(O.type == src.type) continue reagents.reaction(O, TOUCH, fraction) + var/hit = 0 for(var/mob/living/L in range(0,src)) - foam_mob(L) + hit += foam_mob(L) + if(hit) + lifetime++ //this is so the decrease from mobs hit and the natural decrease don't cumulate. var/T = get_turf(src) reagents.reaction(T, TOUCH, fraction) @@ -71,12 +73,13 @@ /obj/effect/effect/foam/proc/foam_mob(var/mob/living/L as mob) if(lifetime<1) - return + return 0 if(!istype(L)) - return - var/fraction = 1/max_lifetime + return 0 + var/fraction = 1/initial(lifetime) reagents.reaction(L, TOUCH, fraction) lifetime-- + return 1 /obj/effect/effect/foam/Crossed(var/atom/movable/AM) if(istype(AM, /mob/living/carbon)) @@ -107,7 +110,6 @@ reagents.copy_to(F, (reagents.total_volume)) F.color = color F.metal = metal - F.max_lifetime = max_lifetime /obj/effect/effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -168,8 +170,7 @@ F.color = foamcolor F.amount = amount F.metal = metal - F.max_lifetime = Clamp(round(sqrt(chemholder.reagents.total_volume/2), 1), 3, 10) //how long each foam cell lasts. - F.lifetime = F.max_lifetime + ////////////////////////////////////////////////////////// // FOAM STRUCTURE. Formed by metal foams. Dense and opaque, but easy to break diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 5f862a5de74..3df4f27680c 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -14,7 +14,7 @@ anchored = 0 mouse_opacity = 0 var/steps = 0 - var/lifetime = 10 + var/lifetime = 5 var/direction @@ -32,7 +32,7 @@ ..() create_reagents(500) SSobj.processing.Add(src) - lifetime = lifetime + rand(1,3) + lifetime += rand(-1,1) /obj/effect/effect/smoke/Destroy() SSobj.processing.Remove(src) @@ -40,8 +40,9 @@ /obj/effect/effect/smoke/proc/kill_smoke() SSobj.processing.Remove(src) - fade_out() - spawn(5) + spawn(0) + fade_out() + spawn(10) qdel(src) /obj/effect/effect/smoke/process() @@ -97,7 +98,6 @@ if(holder) src.location = get_turf(holder) var/obj/effect/effect/smoke/S = PoolOrNew(smoke_type, location) - SSobj.processing.Add(S) if(!direction) if(src.cardinals) S.direction = pick(cardinal) @@ -114,6 +114,9 @@ // Bad smoke ///////////////////////////////////////////// +/obj/effect/effect/smoke/bad + lifetime = 8 + /obj/effect/effect/smoke/bad/process() if(..()) for(var/mob/living/carbon/M in range(1,src)) @@ -145,6 +148,7 @@ /obj/effect/effect/smoke/chem icon = 'icons/effects/chemsmoke.dmi' icon_state = "" + lifetime = 10 var/max_lifetime = 10 /obj/effect/effect/smoke/chem/process() @@ -158,17 +162,21 @@ for(var/turf/T in range(1,src)) reagents.reaction(T, TOUCH, fraction) + var/hit = 0 for(var/mob/living/L in range(1,src)) - smoke_mob(L) + hit += smoke_mob(L) + if(hit) + lifetime++ //this is so the decrease from mobs hit and the natural decrease don't cumulate. -/obj/effect/effect/smoke/chem/smoke_mob((mob/living/carbon/M as mob)) +/obj/effect/effect/smoke/chem/smoke_mob(mob/living/carbon/M as mob) if(lifetime<1) - return + return 0 if(!istype(M)) - return + return 0 var/fraction = 1/max_lifetime reagents.reaction(M, TOUCH, fraction) lifetime-- + return 1 @@ -239,17 +247,19 @@ S.direction = pick(alldirs) else S.direction = direction - if(number<=5) + if(number == 1) + S.steps = 0 + else if(number<=5) S.steps = pick(0,1,1) else if(number<=10) S.steps = pick(0,1,1,1,2) else S.steps = pick(0,1,1,1,2,2,2,3) - S.max_lifetime = Clamp(round(sqrt(chemholder.reagents.total_volume/2), 1), 4, 10) //the more chemicals, the longer the smoke duration. - S.lifetime = S.max_lifetime + + S.max_lifetime = S.lifetime if(chemholder.reagents.total_volume > 1) // can't split 1 very well - chemholder.reagents.copy_to(S, chemholder.reagents.total_volume / number) // copy reagents to each smoke, divide evenly + chemholder.reagents.copy_to(S, chemholder.reagents.total_volume/number) // copy reagents to each smoke, divide evenly if(color) S.color = color // give the smoke color, if it has any to begin with @@ -266,6 +276,7 @@ /obj/effect/effect/smoke/sleeping color = "#9C3636" + lifetime = 10 /obj/effect/effect/smoke/sleeping/process() for(var/mob/living/carbon/M in range(1,src)) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index d021a3b27b5..0d2139e115c 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -349,13 +349,14 @@ /obj/item/weapon/grenade/chem_grenade/teargas/New() ..() - var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) - var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src) - B1.reagents.add_reagent("condensedcapsaicin", 25) - B1.reagents.add_reagent("potassium", 25) - B2.reagents.add_reagent("phosphorus", 25) - B2.reagents.add_reagent("sugar", 25) + B1.reagents.add_reagent("condensedcapsaicin", 70) + B1.reagents.add_reagent("potassium", 30) + B2.reagents.add_reagent("phosphorus", 30) + B2.reagents.add_reagent("sugar", 30) + B1.reagents.add_reagent("condensedcapsaicin", 40) beakers += B1 beakers += B2 @@ -368,13 +369,14 @@ /obj/item/weapon/grenade/chem_grenade/facid/New() ..() - var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) - var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B1 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B2 = new(src) - B1.reagents.add_reagent("facid", 25) - B1.reagents.add_reagent("potassium", 25) - B2.reagents.add_reagent("phosphorus", 25) - B2.reagents.add_reagent("sugar", 25) + B1.reagents.add_reagent("facid", 290) + B1.reagents.add_reagent("potassium", 10) + B2.reagents.add_reagent("phosphorus", 10) + B2.reagents.add_reagent("sugar", 10) + B2.reagents.add_reagent("facid", 280) beakers += B1 beakers += B2 @@ -409,10 +411,10 @@ var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B1 = new(src) var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B2 = new(src) - B1.reagents.add_reagent("fluorosurfactant", 290) - B1.reagents.add_reagent("clf3", 10) - B2.reagents.add_reagent("water", 290) - B2.reagents.add_reagent("clf3", 10) + B1.reagents.add_reagent("fluorosurfactant", 250) + B1.reagents.add_reagent("clf3", 50) + B2.reagents.add_reagent("water", 250) + B2.reagents.add_reagent("clf3", 50) beakers += B1 beakers += B2 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 6b92ce711d6..554db0c32a8 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -240,7 +240,7 @@ emp_act var/list/inventory_items_to_kill = list() var/acidity = min(acidpwr*acid_volume/200, toxpwr) var/acid_volume_left = acid_volume - var/acid_decay = 200/acidpwr // how much volume we lose per item we try to melt. 10 for fluoro, 20 for sulphuric + var/acid_decay = 100/acidpwr // how much volume we lose per item we try to melt. 5 for fluoro, 10 for sulphuric //HEAD// var/obj/item/clothing/head_clothes = null diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 4b1712d4a9f..306bfebf9ca 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1102,13 +1102,12 @@ // Handle chem smoke effect -- Doohl if(!H.has_smoke_protection()) for(var/obj/effect/effect/smoke/chem/S in range(1, H)) - if(S.reagents.total_volume) - var/amount = min(S.reagents.total_volume, 10) - if(amount >= 1) - var/fraction = min(amount/S.reagents.total_volume, 1) - S.reagents.reaction(H,INGEST, fraction) - S.reagents.copy_to(H, amount) - break // If they breathe in the nasty stuff once, no need to continue checking + if(S.reagents.total_volume && S.lifetime) + var/fraction = 1/S.max_lifetime + S.reagents.reaction(H,INGEST, fraction) + var/amount = round(S.reagents.total_volume*fraction,0.1) + S.reagents.copy_to(H, amount) + S.lifetime-- else //Still give containing object the chance to interact if(istype(H.loc, /obj/)) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 28b44665bab..b019a52ab44 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -71,13 +71,13 @@ //Harmful gasses if(!has_smoke_protection()) - for(var/obj/effect/effect/smoke/chem/S in range(1,src)) - if(S.reagents.total_volume) - var/amount = min(S.reagents.total_volume, 10) - var/fraction = min(amount/S.reagents.total_volume, 1) + for(var/obj/effect/effect/smoke/chem/S in range(1, src)) + if(S.reagents.total_volume && S.lifetime) + var/fraction = 1/S.max_lifetime S.reagents.reaction(src,INGEST, fraction) + var/amount = round(S.reagents.total_volume*fraction,0.1) S.reagents.copy_to(src, amount) - break + S.lifetime-- else //Breathe from loc as obj again if(istype(loc, /obj/)) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 7572041506e..5fe6dc7e8fa 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -43,7 +43,7 @@ if(method == TOUCH) if(M.reagents) var/modifier = Clamp((1 - touch_protection) + rand(-5,5)/100, 0, 1) - var/amount = round(volume*modifier) + var/amount = round(volume*modifier, 0.1) if(amount >= 1) M.reagents.add_reagent(self.id, amount) return 1 diff --git a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm index c9ade32e68b..163c1e5176e 100644 --- a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm @@ -11,13 +11,12 @@ color = "#B68D00" message = "The blob splashes you with burning oil" -/datum/reagent/blob/boiling_oil/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) +/datum/reagent/blob/boiling_oil/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) if(method == TOUCH) - M.apply_damage(15, BURN) - M.adjust_fire_stacks(2) + var/ratio = volume/25 + M.apply_damage(15*ratio, BURN) + M.adjust_fire_stacks(2*ratio) M.IgniteMob() - if(show_message) - send_message(M) if(isliving(M)) M.emote("scream") @@ -28,11 +27,10 @@ color = "#008000" message_living = ", and you feel sick and nauseated" -/datum/reagent/blob/toxic_goop/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) +/datum/reagent/blob/toxic_goop/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) if(method == TOUCH) - M.apply_damage(20, TOX) - if(show_message) - send_message(M) + var/ratio = volume/25 + M.apply_damage(20*ratio, TOX) /datum/reagent/blob/skin_ripper name = "Skin Ripper" @@ -41,12 +39,11 @@ color = "#FF4C4C" message_living = ", and you feel your skin ripping and tearing off" -/datum/reagent/blob/skin_ripper/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) +/datum/reagent/blob/skin_ripper/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) if(method == TOUCH) - M.apply_damage(20, BRUTE) - if(show_message) - send_message(M) - if(isliving(M)) + var/ratio = volume/25 + M.apply_damage(20*ratio, BRUTE) + if(iscarbon(M)) M.emote("scream") // Combo Reagents @@ -58,15 +55,14 @@ color = "#7F0000" message_living = ", and you feel your skin char and melt" -/datum/reagent/blob/skin_melter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) +/datum/reagent/blob/skin_melter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) if(method == TOUCH) - M.apply_damage(10, BRUTE) - M.apply_damage(10, BURN) - M.adjust_fire_stacks(2) + var/ratio = volume/25 + M.apply_damage(10*ratio, BRUTE) + M.apply_damage(10*ratio, BURN) + M.adjust_fire_stacks(2*ratio) M.IgniteMob() - if(show_message) - send_message(M) - if(isliving(M)) + if(iscarbon(M)) M.emote("scream") /datum/reagent/blob/lung_destroying_toxin @@ -76,13 +72,13 @@ color = "#00FFC5" message_living = ", and your lungs feel heavy and weak" -/datum/reagent/blob/lung_destroying_toxin/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume,var/show_message = 1) +/datum/reagent/blob/lung_destroying_toxin/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) if(method == TOUCH) - M.apply_damage(20, OXY) - M.losebreath += 15 - M.apply_damage(20, TOX) - if(show_message) - send_message(M) + var/ratio = volume/25 + M.apply_damage(20* ratio, OXY) + M.losebreath += 15*ratio + M.apply_damage(20*ratio, TOX) + // Special Reagents /datum/reagent/blob/radioactive_liquid @@ -92,19 +88,18 @@ color = "#00EE00" message_living = ", and your skin feels papery and everything hurts" -/datum/reagent/blob/radioactive_liquid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume,var/show_message = 1) +/datum/reagent/blob/radioactive_liquid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) if(method == TOUCH) + var/ratio = volume/25 + M.apply_damage(10*ratio, BRUTE) if(istype(M, /mob/living/carbon/human)) - M.apply_damage(10, BRUTE) - M.irradiate(40) - if(prob(33)) + M.irradiate(40*ratio) + if(prob(33*ratio)) randmuti(M) if(prob(98)) randmutb(M) domutcheck(M, null) updateappearance(M) - if(show_message) - send_message(M) /datum/reagent/blob/dark_matter name = "Dark Matter" @@ -113,12 +108,12 @@ color = "#61407E" message = "You feel a thrum as the blob strikes you, and everything flies at you" -/datum/reagent/blob/dark_matter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) +/datum/reagent/blob/dark_matter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) if(method == TOUCH) - M.apply_damage(15, BRUTE) + var/ratio = volume/25 + M.apply_damage(15*ratio, BRUTE) reagent_vortex(M, 0) - if(show_message) - send_message(M) + /datum/reagent/blob/b_sorium name = "Sorium" @@ -127,11 +122,10 @@ color = "#808000" message = "The blob slams into you, and sends you flying" -/datum/reagent/blob/b_sorium/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) +/datum/reagent/blob/b_sorium/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) if(method == TOUCH) - M.apply_damage(15, BRUTE) - if(show_message) - send_message(M) + var/ratio = volume/25 + M.apply_damage(15*ratio, BRUTE) reagent_vortex(M, 1) @@ -142,11 +136,10 @@ color = "#FFA500" message = "The blob strikes you, and its tendrils explode" -/datum/reagent/blob/explosive/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) +/datum/reagent/blob/explosive/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) if(method == TOUCH) - if(prob(75)) - if(show_message) - send_message(M) + var/ratio = volume/25 + if(prob(75*ratio)) explosion(M.loc, 0, 0, 1, 0, 0) /datum/reagent/blob/omnizine @@ -157,25 +150,10 @@ message = "The blob squirts something at you" message_living = ", and you feel great" -/datum/reagent/blob/omnizine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) +/datum/reagent/blob/omnizine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) if(method == TOUCH) - if(show_message) - send_message(M) - M.reagents.add_reagent("omnizine", 11) - -/datum/reagent/blob/morphine - name = "Morphine" - id = "b_morphine" - description = "" - color = "#335555" - message = "The blob squirts something at you" - message_living = ", and you feel numb" - -/datum/reagent/blob/morphine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) - if(method == TOUCH) - if(show_message) - send_message(M) - M.reagents.add_reagent("morphine", 16) + var/ratio = volume/25 + M.reagents.add_reagent("omnizine", 11*ratio) /datum/reagent/blob/spacedrugs name = "Space drugs" @@ -185,12 +163,11 @@ message = "The blob squirts something at you" message_living = ", and you feel funny" -/datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) +/datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) if(method == TOUCH) - if(show_message) - send_message(M) - M.reagents.add_reagent("space_drugs", 15) - M.apply_damage(10, TOX) + var/ratio = volume/25 + M.reagents.add_reagent("space_drugs", 15*ratio) + M.apply_damage(10*ratio, TOX) /datum/reagent/blob/proc/reagent_vortex(var/mob/living/M as mob, var/setting_type) diff --git a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm index 270ddfdabb6..20e4db36eb2 100644 --- a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm @@ -628,7 +628,7 @@ /datum/reagent/nanites/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) src = null - if( (prob(10) && method==TOUCH) || method==INGEST) + if( (prob(min(10, volume)) && method==TOUCH) || method==INGEST) M.ForceContractDisease(new /datum/disease/transformation/robot(0)) /datum/reagent/xenomicrobes @@ -639,7 +639,7 @@ /datum/reagent/xenomicrobes/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) src = null - if( (prob(10) && method==TOUCH) || method==INGEST) + if( (prob(min(10, volume)) && method==TOUCH) || method==INGEST) M.ContractDisease(new /datum/disease/transformation/xeno(0)) /datum/reagent/fluorosurfactant//foam precursor diff --git a/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm index 67c110b34bd..e8d4ebf6909 100644 --- a/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm @@ -67,7 +67,7 @@ /datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) if(method == TOUCH && isliving(M)) - M.adjust_fire_stacks(5) + M.adjust_fire_stacks(min(volume/5, 10)) M.IgniteMob() PoolOrNew(/obj/effect/hotspot, M.loc) @@ -148,7 +148,7 @@ /datum/reagent/napalm/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) if(method == TOUCH && isliving(M)) - M.adjust_fire_stacks(7) + M.adjust_fire_stacks(min(volume/4, 20)) /datum/reagent/cryostylane name = "Cryostylane" diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm index bbb31522bbb..e9b09cac1df 100644 --- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm @@ -34,7 +34,7 @@ if(!istype(M) || !M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. src = null - if((method==TOUCH && prob(33)) || method==INGEST) + if((method==TOUCH && prob(min(33, volume))) || method==INGEST) randmuti(M) if(prob(98)) randmutb(M) @@ -194,8 +194,8 @@ if(iscarbon(M)) var/mob/living/carbon/C = M if(!C.wear_mask) // If not wearing a mask - C.adjustToxLoss(2) // 4 toxic damage per application, doubled for some reason - + var/damage = min(round(0.4*volume, 0.1),10) + C.adjustToxLoss(damage) /datum/reagent/toxin/plantbgone/weedkiller name = "Weed Killer" id = "weedkiller" @@ -215,7 +215,8 @@ if(iscarbon(M)) var/mob/living/carbon/C = M if(!C.wear_mask) // If not wearing a mask - C.adjustToxLoss(2) // 4 toxic damage per application, doubled for some reason + var/damage = min(round(0.4*volume, 0.1),10) + C.adjustToxLoss(damage) /datum/reagent/toxin/spore name = "Spore Toxin" @@ -620,6 +621,7 @@ /datum/reagent/toxin/acid/reaction_mob(var/mob/living/carbon/C, var/method=TOUCH, var/volume) if(!istype(C)) return + volume = round(volume,0.1) if(method != TOUCH) C.take_organ_damage(min(6*toxpwr, volume * toxpwr)) return @@ -629,6 +631,7 @@ /datum/reagent/toxin/acid/reaction_obj(var/obj/O, var/volume) if(istype(O.loc, /mob)) //handled in human acid_act() return + volume = round(volume,0.1) O.acid_act(acidpwr, toxpwr, volume) /datum/reagent/toxin/acid/fluacid diff --git a/html/changelogs/phil235-AcidFix.yml b/html/changelogs/phil235-AcidFix.yml new file mode 100644 index 00000000000..836af7f4c83 --- /dev/null +++ b/html/changelogs/phil235-AcidFix.yml @@ -0,0 +1,6 @@ +author: phil235 + +delete-after: True + +changes: + - tweak: "Smoke (and foam) no longer distribute more reagents than they have. The amount of clouds in a smoke now depends on the amount of smoke created. Acid no longer melts items on a mob at low volume, and the chances to melt them increases with the amount applied on the mob. Sprays can now contain acid again." From 3d5f1267791ced45d15a64635246a7dd6e60668b Mon Sep 17 00:00:00 2001 From: Ikarrus Date: Thu, 25 Jun 2015 00:06:47 -0600 Subject: [PATCH 23/57] Destructible Clothing [WIP] - Clothes can be set on fire and extinguished - Any item can technically be set on fire and extinguished now, but only clothes (and paper) actually burn right now - All of a mob's clothing are burned if the mob is husked by fire - Clothes will also have a chance of being shredded if you are caught in a bomb blast - The bigger the explosion, the higher the chance they have of being destroyed - Outer layer clothing (headgear and exosuits) take the shock first, which absorbs some of the shock for the clothes it covers, according to it's bomb armor --- .../objects/effects/decals/Cleanable/misc.dm | 18 ++++- code/game/objects/items.dm | 18 +++++ .../objects/items/weapons/extinguisher.dm | 3 + .../objects/items/weapons/tanks/watertank.dm | 2 + code/game/objects/structures/watercloset.dm | 9 ++- code/modules/clothing/clothing.dm | 25 ++++++ code/modules/mob/living/carbon/human/human.dm | 8 +- .../mob/living/carbon/human/human_damage.dm | 3 +- .../mob/living/carbon/human/inventory.dm | 81 +++++++++++++++++++ code/modules/paperwork/paper.dm | 31 ++++--- .../Chemistry-Reagents/Other-Reagents.dm | 7 +- 11 files changed, 182 insertions(+), 23 deletions(-) diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 71d209de6a6..f8d8ec3136b 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -142,4 +142,20 @@ gender = PLURAL icon = 'icons/obj/objects.dmi' icon_state = "ash" - anchored = 1 \ No newline at end of file + anchored = 1 + +/obj/effect/decal/cleanable/shreds + name = "shreds" + desc = "The shredded remains of what appears to be clothing." + icon = 'icons/effects/effects.dmi' + icon_state = "shreds" + gender = PLURAL + density = 0 + anchored = 1 + layer = 2 + +/obj/effect/decal/cleanable/shreds/New(loc,var/clothing) + ..(loc) + if(clothing) + name = "shredded [clothing]" + desc = "The sad remains of what used to be a glorious [clothing]." \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 0468739411b..2ad3dfd5afa 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -20,6 +20,7 @@ var/cold_protection = 0 //flags which determine which body parts are protected from cold. Use the HEAD, CHEST, GROIN, etc. flags. See setup.dm var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags var/min_cold_protection_temperature //Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags + var/burning = 0 //If this is set, The item will make an action button on the player's HUD when picked up. var/action_button_name //It is also the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. If it's not set, there'll be no button. @@ -102,6 +103,18 @@ if(!gc_destroyed) contents_explosion(severity, target) +/obj/item/proc/burn() + src.visible_message("[src] disintegrates, leaving behind a pile of ashes.") + new /obj/effect/decal/cleanable/ash(src.loc) + qdel(src) + +/obj/item/proc/extinguish() + if(burning) + burning = 0 + for(var/image/img in overlays) + if(img.icon_state == "fire") + overlays -= img + //user: The mob that is suiciding //damagetype: The type of damage the item will inflict on the user //BRUTELOSS = 1 @@ -155,6 +168,11 @@ /obj/item/attack_hand(mob/user as mob) if (!user) return + + if(burning) + burn() //It just disintigrates if you try to pick it up + return + if (istype(src.loc, /obj/item/weapon/storage)) //If the item is in a storage item, take it out var/obj/item/weapon/storage/S = src.loc diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 2dfa4b44c66..19e57dbb30b 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -151,6 +151,9 @@ if(isliving(atm)) //For extinguishing mobs on fire var/mob/living/M = atm M.ExtinguishMob() + if(istype(atm,/obj/item)) + var/obj/item/Item = atm + Item.extinguish() if(W.loc == my_target) break sleep(2) diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index d634d9a832c..d247c0134e8 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -362,6 +362,8 @@ V.visible_message("[V] was frozen shut!") for(var/mob/living/L in T) L.ExtinguishMob() + for(var/obj/item/Item in T) + Item.extinguish() return /datum/effect/effect/system/freezing_smoke_spread diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index d62a69d769f..240f9e63517 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -229,6 +229,7 @@ //Yes, showers are super powerful as far as washing goes. /obj/machinery/shower/proc/wash(atom/movable/O) if(!on) return + if(ismob(O)) mobpresent += 1 check_heat(O) @@ -303,6 +304,13 @@ else O.clean_blood() + else + O.clean_blood() + + if(istype(O,/obj/item)) + var/obj/item/Item = O + Item.extinguish() + if(isturf(loc)) var/turf/tile = loc loc.clean_blood() @@ -310,7 +318,6 @@ if(is_cleanable(E)) qdel(E) - /obj/machinery/shower/process() if(!on || !mobpresent) return for(var/mob/living/carbon/C in loc) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 049e675e104..51a14b46738 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -17,6 +17,31 @@ var/can_flashlight = 0 var/gang //Is this a gang outfit? +/obj/item/clothing/ex_act(severity, target) + if(prob(armor["bomb"])) + return + switch(severity) + if(1.0) + shred(1,100) + if(2.0) + shred(1,50) + if(3.0) + if(!prob(armor["bomb"])) + shred(1,10) + return + +/obj/item/clothing/fire_act() + if(burning) + return + if(max_heat_protection_temperature) + return + src.visible_message("[src] catches on fire.") + burning = 1 + overlays += image("icon" = 'icons/effects/fire.dmi', "icon_state" = "fire") + spawn(100) + if(burning) + burn() + //Ears: currently only used for headsets and earmuffs /obj/item/clothing/ears name = "ears" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ca9468d1986..b99a78d7e9e 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -116,17 +116,17 @@ gib() return else + shred_clothing(1,150) var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src))) throw_at(target, 200, 4) - //return -// var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src))) - //user.throw_at(target, 200, 4) if (2.0) b_loss += 60 f_loss += 60 + shred_clothing(1,50) + if (prob(getarmor(null, "bomb"))) b_loss = b_loss/1.5 f_loss = f_loss/1.5 @@ -140,6 +140,8 @@ b_loss += 30 if (prob(getarmor(null, "bomb"))) b_loss = b_loss/2 + else + shred_clothing(1,10) if (!istype(ears, /obj/item/clothing/ears/earmuffs)) adjustEarDamage(15,60) if (prob(50)) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 7c0773877c1..4ba2758a8f1 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -10,9 +10,10 @@ total_brute += O.brute_dam total_burn += O.burn_dam health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute - //TODO: fix husking if( ((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD ) ChangeToHusk() + if(bodytemperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + shred_clothing() med_hud_set_health() med_hud_set_status() return diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 1a4cd41351c..4117d85627e 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -390,3 +390,84 @@ src << "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!" return +//Cycles through all clothing slots and tests them for destruction +/mob/living/carbon/human/proc/shred_clothing(var/bomb,var/shock) + var/covered_parts //The body parts that are protected by exterior clothing/armor + var/head_absorbed = 0 //How much of the shock the headgear absorbs when it is shredded. -1=it survives + var/suit_absorbed = 0 //How much of the shock the exosuit absorbs when it is shredded. -1=it survives + + //Backpacks can never be protected but are annoying as fuck to lose, so they get a lower chance to be shredded + if(back) + back.shred(bomb,shock-30,src) + + if(head) + covered_parts |= head.flags_inv + head_absorbed = head.shred(bomb,shock,src) + if(wear_mask) + var/absorbed = ((covered_parts & HIDEMASK) ? head_absorbed : 0) //Check if clothing covering this part absorbed any of the shock + if(!(absorbed < 0)) + //Masks can be used to shield other parts, but are simplified to simply add their absorbsion to the head armor if it covers the face + var/mask_absorbed = wear_mask.shred(bomb,shock-absorbed,src) + if(wear_mask.flags_inv & HIDEFACE) + covered_parts |= wear_mask.flags_inv + if(mask_absorbed < 0) //If the mask didn't get shredded, everything else on the head is protected + head_absorbed = -1 + else + head_absorbed += mask_absorbed + if(ears) + var/absorbed = ((covered_parts & HIDEEARS) ? head_absorbed : 0) + if(!(absorbed < 0)) + ears.shred(bomb,shock-absorbed,src) + if(glasses) + var/absorbed = ((covered_parts & HIDEEYES) ? head_absorbed : 0) + if(!(absorbed < 0)) + glasses.shred(bomb,shock-absorbed,src) + + if(wear_suit) + covered_parts |= wear_suit.flags_inv + suit_absorbed = wear_suit.shred(bomb,shock,src) + if(gloves) + var/absorbed = ((covered_parts & HIDEGLOVES) ? suit_absorbed : 0) + if(!(absorbed < 0)) + gloves.shred(bomb,shock-absorbed,src) + if(shoes) + var/absorbed = ((covered_parts & HIDESHOES) ? suit_absorbed : 0) + if(!(absorbed < 0)) + shoes.shred(bomb,shock-absorbed,src) + if(w_uniform) + var/absorbed = ((covered_parts & HIDEJUMPSUIT) ? suit_absorbed : 0) + if(!(absorbed < 0)) + w_uniform.shred(bomb,shock-absorbed,src) + +/obj/item/proc/shred(var/bomb,var/shock,var/mob/living/carbon/human/Human) + var/shredded + + if(!bomb) + if(!max_heat_protection_temperature) + shredded = 1 //No heat protection, it burns + else + shredded = -1 //Heat protection = Fireproof + + else if(shock > 0) + if(prob(max(10,shock))) + shredded = armor["bomb"] + 10 //It gets shredded, but it also absorbs the shock the clothes underneath would recieve by this amount + else + shredded = -1 //It survives explosion + + if(shredded) + if(Human) //Unequip if equipped + Human.unEquip(src) + + for(var/obj/item/Item in contents) //Empty out the contents + Item.loc = src.loc + + if(bomb) + var/obj/effect/decal/cleanable/shreds/Shreds = new(loc) + Shreds.name = "shredded [src]" + Shreds.desc = "The sad remains of what used to be a glorious [src]." + else + new /obj/effect/decal/cleanable/ash(loc) + + qdel(src) + + return shredded \ No newline at end of file diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index df5d9101500..4ed586cebd6 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -26,7 +26,6 @@ var/list/stamped var/rigged = 0 var/spam_flag = 0 - var/burning = 0 //Whether or not the paper is on fire /obj/item/weapon/paper/New() @@ -39,6 +38,9 @@ /obj/item/weapon/paper/update_icon() + if(burning) + icon_state = "paper_onfire" + return if(info) icon_state = "paper_words" return @@ -89,15 +91,6 @@ spam_flag = 0 -/obj/item/weapon/paper/attack_hand() - var/mob/living/carbon/M = usr - if(burning) - M << "Picking up a burning paper seems awfully stupid." - return //Doesn't make any sense to pick up a burning paper - else //Probably isn't necessary but it's safer - ..() - - /obj/item/weapon/paper/attack_ai(mob/living/silicon/ai/user) var/dist if(istype(user) && user.current) //is AI @@ -325,16 +318,16 @@ user.unEquip(src) user.visible_message("[user] lights [src] ablaze with [P]!", "You light [src] on fire!") - burn(0, 100) + paper_burn(0, 100) add_fingerprint(user) /obj/item/weapon/paper/fire_act() - burn(1, 50) + paper_burn(1, 50) -/obj/item/weapon/paper/proc/burn(var/showmsg, var/burntime) +/obj/item/weapon/paper/proc/paper_burn(var/showmsg, var/burntime) if (burning) return if(showmsg) @@ -343,9 +336,15 @@ icon_state = "paper_onfire" info = "[stars(info)]" spawn(burntime) //7 seconds - src.visible_message("[src] burns away, leaving behind a pile of ashes.") - new /obj/effect/decal/cleanable/ash(src.loc) - qdel(src) + if(burning) + src.visible_message("[src] burns away, leaving behind a pile of ashes.") + new /obj/effect/decal/cleanable/ash(src.loc) + qdel(src) + +/obj/item/weapon/paper/extinguish() + burning = 0 + update_icon() + return /* * Premade paper diff --git a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm index 270ddfdabb6..5a3f47db923 100644 --- a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm @@ -144,6 +144,11 @@ /datum/reagent/water/reaction_obj(var/obj/O, var/volume) src = null + + if(istype(O,/obj/item)) + var/obj/item/Item = O + Item.extinguish() + // Monkey cube if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O @@ -151,7 +156,7 @@ cube.Expand() // Dehydrated carp - if(istype(O,/obj/item/toy/carpplushie/dehy_carp)) + else if(istype(O,/obj/item/toy/carpplushie/dehy_carp)) var/obj/item/toy/carpplushie/dehy_carp/dehy = O dehy.Swell() // Makes a carp From ac321c547c1ba454cb9d96a7af97b267186a8dc7 Mon Sep 17 00:00:00 2001 From: Incoming Date: Thu, 25 Jun 2015 18:20:09 -0400 Subject: [PATCH 24/57] Rainbow slimes finally added to practical play. To get one you have to raise slimes through select breeding to 100 mutation chance. Even if you're blessed with RNG This will take a minimum of 14 generations of slime. Red slime can help speed this a bit, but then you're trading plasma for time. From the default mutation chance you'd have to drop 6 of these potions. Rainbow slimes only split into more rainbow slimes. Rainbow slime cores spawn a random colored slime on use, the practical use is to allow xenobiologists to slime paths they didn't breed for initially if they practiced good slime eugenics. You're still at the utter mercy of RNG though. Mostly a bragging rights reward. --- .../mob/living/simple_animal/slime/powers.dm | 4 +++- .../Chemistry-Recipes/Slime_extracts.dm | 18 ++++++++++++++++++ html/changelogs/incoming5643-rainbowslime.yml | 9 +++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 html/changelogs/incoming5643-rainbowslime.yml diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index e2b541d9c53..a2da3fb63d6 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -182,7 +182,9 @@ var/new_powerlevel = round(powerlevel / 4) for(var/i=1,i<=4,i++) var/mob/living/simple_animal/slime/M = new /mob/living/simple_animal/slime/(loc) - if(prob(mutation_chance)) + if(mutation_chance >= 100) + M.colour = "rainbow" + else if(prob(mutation_chance)) M.colour = slime_mutation[rand(1,4)] else M.colour = colour diff --git a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm index 996604a0822..c476e29ff1e 100644 --- a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm +++ b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm @@ -618,3 +618,21 @@ var/obj/P = new chosen if(P) P.loc = get_turf(holder.my_atom) + +//Rainbow :o) +/datum/chemical_reaction/slimeRNG + name = "Random Core" + id = "slimerng" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/rainbow + +/datum/chemical_reaction/slimeRNG/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) + var/mob/living/simple_animal/slime/S = new /mob/living/simple_animal/slime + S.colour = pick("grey","orange", "metal", "blue", "purple", "dark purple", "dark blue", "green", "silver", "yellow", "gold", "yellow", "red", "silver", "pink", "cerulean", "sepia", "bluespace", "pyrite", "light pink", "oil", "adamantine", "black") + S.loc = get_turf(holder.my_atom) \ No newline at end of file diff --git a/html/changelogs/incoming5643-rainbowslime.yml b/html/changelogs/incoming5643-rainbowslime.yml new file mode 100644 index 00000000000..da966da01d7 --- /dev/null +++ b/html/changelogs/incoming5643-rainbowslime.yml @@ -0,0 +1,9 @@ +author: Incoming5643 + + +delete-after: True + + +changes: + - rscadd: "The secrets of the rainbow slimes have finally been revealed. To attain this rare blob you must breed a slime with a 100% mutation chance!" + - rscadd: "Rainbow slime cores will generate a randomly colored slime when injected with plasma. It's a good plan B if the slimes aren't cooperating in terms of colors. You can get any color slime this way, pray to the RNG!" From d0853e8c4f48c165ac8433ab2b29bc1f2209ed43 Mon Sep 17 00:00:00 2001 From: Incoming Date: Thu, 25 Jun 2015 19:40:55 -0400 Subject: [PATCH 25/57] Gets rid of an old unneeded for loop, reverse copypastas it from where I picked it up. --- code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm index c476e29ff1e..98f34ef9f73 100644 --- a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm +++ b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm @@ -11,10 +11,9 @@ /datum/chemical_reaction/slimespawn/on_reaction(var/datum/reagents/holder) feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) var/mob/living/simple_animal/slime/S = new /mob/living/simple_animal/slime S.loc = get_turf(holder.my_atom) + S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!") /datum/chemical_reaction/slimeinaprov name = "Slime epinephrine" @@ -631,8 +630,7 @@ /datum/chemical_reaction/slimeRNG/on_reaction(var/datum/reagents/holder) feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) var/mob/living/simple_animal/slime/S = new /mob/living/simple_animal/slime S.colour = pick("grey","orange", "metal", "blue", "purple", "dark purple", "dark blue", "green", "silver", "yellow", "gold", "yellow", "red", "silver", "pink", "cerulean", "sepia", "bluespace", "pyrite", "light pink", "oil", "adamantine", "black") - S.loc = get_turf(holder.my_atom) \ No newline at end of file + S.loc = get_turf(holder.my_atom) + S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!") From 792a30413eb9e0eebc01d660999bda0e7d68a8d0 Mon Sep 17 00:00:00 2001 From: Razharas Date: Fri, 26 Jun 2015 17:03:29 +0300 Subject: [PATCH 26/57] Fixes telesci console icon --- code/modules/telesci/telesci_computer.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 0450b8109c1..3e0a44925ea 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -1,7 +1,8 @@ /obj/machinery/computer/telescience name = "\improper Telepad Control Console" desc = "Used to teleport objects to and from the telescience telepad." - icon_state = "teleport" + icon_screen = "teleport" + icon_keyboard = "teleport_key" circuit = /obj/item/weapon/circuitboard/telesci_console var/sending = 1 var/obj/machinery/telepad/telepad = null From c3def066c7caf7cf50a931a9babf5276bcce8d28 Mon Sep 17 00:00:00 2001 From: Anonus Date: Fri, 26 Jun 2015 11:37:07 -0400 Subject: [PATCH 27/57] More obvious m(i/a)crobombs They now have a delay based on how many were implanted. They beep loudly for several seconds before exploding. Overall destructive power is lower, 4/8/16 with 10 microbombs or 1 macrobomb. If you somehow get more microbombs, then you can still get maxcap(but the delay is longer) --- .../objects/items/weapons/implants/implant.dm | 54 ++++++++++++++++--- 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index be83f60bf9d..8f8675b97fc 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -82,6 +82,10 @@ name = "microbomb implant" desc = "And boom goes the weasel." icon_state = "explosive" + var/light = 1.6 + var/medium = 0.8 + var/heavy = 0.4 + var/delay = 7 /obj/item/weapon/implant/explosive/get_data() var/dat = {"Implant Specifications:
@@ -103,18 +107,34 @@ if(!cause || !imp_in) return 0 if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your microbomb implant? This will cause you to explode!", "Microbomb Implant Confirmation", "Yes", "No") != "Yes") return 0 - var/light = 1 - var/medium = 0.5 - var/heavy = 0.25 for(var/obj/item/weapon/implant/explosive/E in imp_in) - heavy += 0.25 - medium += 0.5 - light += 1 + heavy += 0.4 + medium += 0.8 + light += 1.6 + delay += 7 if(E != src) qdel(E) heavy = round(heavy) medium = round(medium) light = round(light) + imp_in << "You activate your microbomb implant." +//If the delay is short, just blow up already jeez + if(delay <= 7) + imp_in.gib() + explosion(src,heavy,medium,light,light, flame_range = light) + qdel(src) + imp_in.visible_message("[imp_in] starts beeping ominously!") + playsound(loc, sound/items/timer.ogg, 30, 0) + sleep(delay/4) + if(imp_in.stat) + imp_in.visible_message("[imp_in] doubles over in pain!") + imp_in.Weaken(7) + playsound(loc, sound/items/timer.ogg, 30, 0) + sleep(delay/4) + playsound(loc, sound/items/timer.ogg, 30, 0) + sleep(delay/4) + playsound(loc, sound/items/timer.ogg, 30, 0) + sleep(delay/4) imp_in.gib() explosion(src,heavy,medium,light,light, flame_range = light) qdel(src) @@ -123,13 +143,33 @@ name = "macrobomb implant" desc = "And boom goes the weasel. And everything else nearby." icon_state = "explosive" + var/light = 16 + var/medium = 8 + var/heavy = 4 + var/delay = 70 /obj/item/weapon/implant/explosive/macro/activate(var/cause) if(!cause || !imp_in) return 0 if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your macrobomb implant? This will cause you to explode and gib!", "Macrobomb Implant Confirmation", "Yes", "No") != "Yes") return 0 + for(var/obj/item/weapon/implant/explosive/macro/E in imp_in) + if(E != src) + qdel(E) + imp_in << "You activate your macrobomb implant." + imp_in.visible_message("[imp_in] starts beeping ominously!") + playsound(loc, sound/items/timer.ogg, 30, 0) + sleep(delay/4) + if(imp_in.stat) + imp_in.visible_message("[imp_in] doubles over in pain!") + imp_in.Weaken(7) + playsound(loc, sound/items/timer.ogg, 30, 0) + sleep(delay/4) + playsound(loc, sound/items/timer.ogg, 30, 0) + sleep(delay/4) + playsound(loc, sound/items/timer.ogg, 30, 0) + sleep(delay/4) imp_in.gib() - explosion(src,5,10,20,20, flame_range = 20) + explosion(src,heavy,medium,light,light, flame_range = light) qdel(src) /obj/item/weapon/implant/chem From d85a612ee894e1e1cdb8fb25a7042c166c6ccd35 Mon Sep 17 00:00:00 2001 From: Anonus Date: Fri, 26 Jun 2015 11:37:33 -0400 Subject: [PATCH 28/57] Microbombs to 2 TC So that traitors don't get to have maxcap for 12 TC --- code/datums/uplink_item.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 87a9734db17..15abad8d676 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -664,9 +664,10 @@ var/list/uplink_items = list() /datum/uplink_item/implants/microbomb name = "Microbomb Implant" - desc = "An implant injected into the body, and later activated either manually or automatically upon death. The more implants inside of you, the higher the explosive power." + desc = "An implant injected into the body, and later activated either manually or automatically upon death. The more implants inside of you, the higher the explosive power. \ + Will permanently destroy your body, however." item = /obj/item/weapon/storage/box/syndie_kit/imp_microbomb - cost = 1 + cost = 2 //CYBERNETIC IMPLANTS From a7a0d6eca7ef06cd46873255f28fe3cca4d824ca Mon Sep 17 00:00:00 2001 From: Anonus Date: Fri, 26 Jun 2015 12:44:01 -0400 Subject: [PATCH 29/57] nobody saw anything --- .../objects/items/weapons/implants/implant.dm | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 8f8675b97fc..4a85d7a9d49 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -82,7 +82,7 @@ name = "microbomb implant" desc = "And boom goes the weasel." icon_state = "explosive" - var/light = 1.6 + var/weak = 1.6 var/medium = 0.8 var/heavy = 0.4 var/delay = 7 @@ -110,43 +110,43 @@ for(var/obj/item/weapon/implant/explosive/E in imp_in) heavy += 0.4 medium += 0.8 - light += 1.6 + weak += 1.6 delay += 7 if(E != src) qdel(E) heavy = round(heavy) medium = round(medium) - light = round(light) + weak = round(weak) imp_in << "You activate your microbomb implant." //If the delay is short, just blow up already jeez if(delay <= 7) imp_in.gib() - explosion(src,heavy,medium,light,light, flame_range = light) + explosion(src,heavy,medium,weak,weak, flame_range = weak) qdel(src) imp_in.visible_message("[imp_in] starts beeping ominously!") - playsound(loc, sound/items/timer.ogg, 30, 0) + playsound(loc, 'sound/items/timer.ogg', 30, 0) sleep(delay/4) if(imp_in.stat) imp_in.visible_message("[imp_in] doubles over in pain!") imp_in.Weaken(7) - playsound(loc, sound/items/timer.ogg, 30, 0) + playsound(loc, 'sound/items/timer.ogg', 30, 0) sleep(delay/4) - playsound(loc, sound/items/timer.ogg, 30, 0) + playsound(loc, 'sound/items/timer.ogg', 30, 0) sleep(delay/4) - playsound(loc, sound/items/timer.ogg, 30, 0) + playsound(loc, 'sound/items/timer.ogg', 30, 0) sleep(delay/4) imp_in.gib() - explosion(src,heavy,medium,light,light, flame_range = light) + explosion(src,heavy,medium,weak,weak, flame_range = weak) qdel(src) /obj/item/weapon/implant/explosive/macro name = "macrobomb implant" desc = "And boom goes the weasel. And everything else nearby." icon_state = "explosive" - var/light = 16 - var/medium = 8 - var/heavy = 4 - var/delay = 70 + weak = 16 + medium = 8 + heavy = 4 + delay = 70 /obj/item/weapon/implant/explosive/macro/activate(var/cause) if(!cause || !imp_in) return 0 @@ -157,19 +157,19 @@ qdel(E) imp_in << "You activate your macrobomb implant." imp_in.visible_message("[imp_in] starts beeping ominously!") - playsound(loc, sound/items/timer.ogg, 30, 0) + playsound(loc, 'sound/items/timer.ogg', 30, 0) sleep(delay/4) if(imp_in.stat) imp_in.visible_message("[imp_in] doubles over in pain!") imp_in.Weaken(7) - playsound(loc, sound/items/timer.ogg, 30, 0) + playsound(loc, 'sound/items/timer.ogg', 30, 0) sleep(delay/4) - playsound(loc, sound/items/timer.ogg, 30, 0) + playsound(loc, 'sound/items/timer.ogg', 30, 0) sleep(delay/4) - playsound(loc, sound/items/timer.ogg, 30, 0) + playsound(loc, 'sound/items/timer.ogg', 30, 0) sleep(delay/4) imp_in.gib() - explosion(src,heavy,medium,light,light, flame_range = light) + explosion(src,heavy,medium,weak,weak, flame_range = weak) qdel(src) /obj/item/weapon/implant/chem From c5a47adb648de63b64961ed66a43a7812b7f7457 Mon Sep 17 00:00:00 2001 From: Xhuis Date: Fri, 26 Jun 2015 14:19:52 -0400 Subject: [PATCH 30/57] Fighting Styles, 1 --- code/__HELPERS/names.dm | 2 +- code/datums/martial.dm | 86 ++++++++++++++++++++++- code/game/gamemodes/gang/gang.dm | 14 ++++ code/game/gamemodes/gang/recaller.dm | 98 ++++++++++++++++++++------- icons/effects/crayondecal.dmi | Bin 23127 -> 23875 bytes 5 files changed, 172 insertions(+), 28 deletions(-) diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 85eb94093cd..ca085a415c4 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -131,7 +131,7 @@ var/syndicate_name = null syndicate_name = name return name -var/gang_name_pool = list("Clandestine", "Prima", "Zero-G", "Max", "Blasto", "Waffle", "North", "Omni", "Newton", "Cyber", "Donk", "Gene", "Gib", "Tunnel", "Diablo", "Psyke", "Osiron") +var/gang_name_pool = list("Clandestine", "Prima", "Zero-G", "Max", "Blasto", "Waffle", "North", "Omni", "Newton", "Cyber", "Donk", "Gene", "Gib", "Tunnel", "Diablo", "Psyke", "Osiron", "Sleeping Carp") var/gang_A_name = null var/gang_B_name = null /proc/gang_name(var/gang) diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 865209ab97e..bbe9d4cc370 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -319,6 +319,90 @@ var/mob/living/carbon/human/H = user var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null) F.teach(H) - H << "You learn the PLASMA FIST style" + H << "You read through the scroll and realize you know the secrets of the Plasma Fist." + if(istype(src, /obj/item/weapon/plasma_fist_scroll/oneuse)) + H.drop_item() + visible_message("[src] lights up in fire and quickly burns to ash.") + new /obj/effect/decal/cleanable/ash(get_turf(src)) + qdel(src) used = 1 desc += "It looks like it's magic was used up." + +/obj/item/weapon/plasma_fist_scroll/oneuse + name = "mysterious scroll" + desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art." + +/obj/item/weapon/twohanded/bostaff + name = "bo staff" + desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts." + force = 10 + w_class = 4 + slot_flags = SLOT_BACK + force_unwielded = 10 + force_wielded = 24 + throwforce = 20 + throw_speed = 2 + attack_verb = list("smashed", "slammed", "whacked", "thwacked") + icon_state = "spearglass0" //temp + +/obj/item/weapon/twohanded/bostaff/update_icon() //temp + icon_state = "spearglass[wielded]" + return + +/obj/item/weapon/twohanded/bostaff/attack(mob/target, mob/living/user) + add_fingerprint(user) + if((CLUMSY in user.disabilities) && prob(50)) + user << "You club yourself over the head with [src]." + user.Weaken(3 * force) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.apply_damage(2*force, BRUTE, "head") + else + user.take_organ_damage(2*force) + return + if(isrobot(target)) + return ..() + if(!isliving(target)) + return ..() + var/mob/living/carbon/C = target + if(C.stat) + user << "It would be dishonorable to attack a foe while they cannot retaliate." + return + switch(user.a_intent) + if("disarm") + if(!wielded) + return ..() + if(!ishuman(target)) + return ..() + var/mob/living/carbon/human/H = target + var/list/fluffmessages = list("[user] clubs [H] with [src]!", \ + "[user] smacks [H] with the butt of [src]!", \ + "[user] broadsides [H] with [src]!", \ + "[user] smashes [H]'s head with [src]!", \ + "[user] beats [H] with front of [src]!", \ + "[user] twirls and slams [H] with [src]!") + H.visible_message("[pick(fluffmessages)]", \ + "[pick(fluffmessages)]") + playsound(get_turf(user), 'sound/effects/woodhit.ogg', 75, 1, -1) + H.adjustStaminaLoss(rand(13,20)) + if(prob(10)) + H.visible_message("[H] collapses!", \ + "Your legs give out!") + H.Weaken(4) + if(H.staminaloss && !H.sleeping) + var/total_health = (H.health - H.staminaloss) + if(total_health <= config.health_threshold_crit && !H.stat) + H.visible_message("[user] delivers a heavy hit to [H]'s head, knocking them out cold!", \ + "[user] knocks you unconscious!") + H.sleeping += 30 + H.adjustBrainLoss(25) + return + else + return ..() + return ..() + +/obj/item/weapon/twohanded/bostaff/IsShield() + if(wielded) + return 1 + else + return 0 diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index 1ccf81b290c..4708d177507 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -11,6 +11,8 @@ var/datum/gang_points/gang_points var/A_style var/B_style + var/A_fighting_style + var/B_fighting_style var/list/A_territory = list() var/list/B_territory = list() var/list/A_territory_new = list() @@ -77,6 +79,7 @@ modePlayer += A_bosses modePlayer += B_bosses + assign_gang_fighting_style() ..() /datum/game_mode/gang/process(seconds) @@ -110,6 +113,17 @@ rival_obj.explanation_text = "Preform a hostile takeover of the station with a Dominator." boss_mind.objectives += rival_obj +/datum/game_mode/proc/assign_gang_fighting_style() + var/aName = gang_name("A") + if(aName == "Sleeping Carp") + A_fighting_style = "martial" + else + A_fighting_style = "normal" + var/bName = gang_name("B") + if(bName == "Sleeping Carp") + B_fighting_style = "martial" + else + B_fighting_style = "normal" /datum/game_mode/proc/greet_gang(var/datum/mind/boss_mind, var/you_are=1) var/obj_count = 1 diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index 6f586dc5764..48458ee8230 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -66,37 +66,71 @@ dat += "
" dat += "Purchase Weapons:
" - dat += "(10 Influence) " - if(points >= 10) - dat += "Switchblade
" - else - dat += "Switchblade
" + ///////////////// + // NORMAL GANG // + ///////////////// - dat += "(20 Influence) " - if(points >= 20) - dat += "10mm Pistol
" - else - dat += "10mm Pistol
" + if(!gangmode || (gang == "A" && gangmode.A_fighting_style == "normal") || (gang == "B" && gangmode.B_fighting_style == "normal")) //If the gamemode is not gang, always use standard loadout. + dat += "(10 Influence) " + if(points >= 10) + dat += "Switchblade
" + else + dat += "Switchblade
" - dat += "(10 Influence) " - if(points >= 10) - dat += "10mm Ammo
" - else - dat += "10mm Ammo
" + dat += "(20 Influence) " + if(points >= 20) + dat += "10mm Pistol
" + else + dat += "10mm Pistol
" - dat += "(40 Influence) " - if(points >= 40) - dat += "Mini Uzi
" - else - dat += "Mini Uzi
" + dat += "(10 Influence) " + if(points >= 10) + dat += "10mm Ammo
" + else + dat += "10mm Ammo
" - dat += "(25 Influence) " - if(points >= 25) - dat += "Uzi Ammo
" - else - dat += "Uzi Magazine
" + dat += "(40 Influence) " + if(points >= 40) + dat += "Mini Uzi
" + else + dat += "Mini Uzi
" + + dat += "(25 Influence) " + if(points >= 25) + dat += "Uzi Ammo
" + else + dat += "Uzi Magazine
" + + dat += "
" + + ////////////////// + // MARTIAL ARTS // + ////////////////// + + else if((gang == "A" && gangmode.A_fighting_style == "martial") || (gang == "B" && gangmode.B_fighting_style == "martial")) + dat += "(10 Influence) " + if(points >= 10) + dat += "Bo Staff
" + else + dat += "Bo Staff
" + + dat += "(20 Influence) " + if(points >= 20) + dat += "Wrestling Belt
" + else + dat += "Wrestling Belt
" + + dat += "(50 Influence) " + if(points >= 50) + dat += "Plasma Fist Scroll (one-use)
" + else + dat += "Plasma Fist Scroll (one-use)
" + dat += "
" + + //////////////////////// + // STANDARD EQUIPMENT // + //////////////////////// - dat += "
" dat += "Purchase Equipment:
" dat += "(5 Influence) " @@ -189,6 +223,18 @@ if(points >= 40) item_type = /obj/item/weapon/gun/projectile/automatic/mini_uzi points = 40 + if("plasmafist") + if(points >= 50) + item_type = /obj/item/weapon/plasma_fist_scroll/oneuse + points = 50 + if("wrestlingbelt") + if(points >= 20) + item_type = /obj/item/weapon/storage/belt/champion/wrestling + points = 20 + if("bostaff") + if(points >= 10) + item_type = /obj/item/weapon/twohanded/bostaff + points = 10 if("9mmammo") if(points >= 25) item_type = /obj/item/ammo_box/magazine/uzim9mm diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi index 0225a6349b62ae23bf6b2b8f628e5d2bee16cfce..668743204d65fa760325c54124326770beb3ec75 100644 GIT binary patch delta 22947 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 delta 22226 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 P$Uy08;V Date: Fri, 26 Jun 2015 16:25:27 -0700 Subject: [PATCH 31/57] Admin help tweaks. The keyword scanner (thing that adds (?) links to player names in admin helps) has been moved to its own proc. This has been added to all admin pms. It has been added to asays as well, with the (FLW) link removed to avoid it being distracting. Replying to an admin help (but not other forms of admin pms nor admin pm replies) by clicking on the name of the ahelper will now send a message to all admins letting them know you are typing up a reply to it. (this should avoid mutiple people replying to the same ahelp) (It also sends a message if you escape out of the ahelp reply as well) --- code/modules/admin/verbs/adminhelp.dm | 84 +++++++++++++++------------ code/modules/admin/verbs/adminpm.dm | 29 +++++++-- code/modules/admin/verbs/adminsay.dm | 2 +- code/modules/client/client procs.dm | 3 + 4 files changed, 77 insertions(+), 41 deletions(-) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index d6ca52c46a3..2531a0df089 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -1,38 +1,7 @@ -/client/var/adminhelptimerid = 0 +/proc/keywords_lookup(var/msg, var/followlink = 1) -/client/proc/giveadminhelpverb() - src.verbs |= /client/verb/adminhelp - adminhelptimerid = 0 - -//This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE! -var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as") - - - -/client/verb/adminhelp(msg as text) - set category = "Admin" - set name = "Adminhelp" - - if(say_disabled) //This is here to try to identify lag problems - usr << "Speech is currently admin-disabled." - return - - //handle muting and automuting - if(prefs.muted & MUTE_ADMINHELP) - src << "Error: Admin-PM: You cannot send adminhelps (Muted)." - return - if(src.handle_spam_prevention(msg,MUTE_ADMINHELP)) - return - - //clean the input msg - if(!msg) return - msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) - if(!msg) return - var/original_msg = msg - - //remove out adminhelp verb temporarily to prevent spamming of admins. - src.verbs -= /client/verb/adminhelp - adminhelptimerid = addtimer(src,"giveadminhelpverb",1200) //2 minute cooldown of admin helps + //This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE! + var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as", "i") //explode the input msg into a list var/list/msglist = text2list(msg, " ") @@ -83,15 +52,58 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," mobs_found += found if(!ai_found && isAI(found)) ai_found = 1 - msg += "[original_word] (?) (FLW) " + if (followlink) + msg += "[original_word](?) (FLW) " + else + msg += "[original_word](?) " continue msg += "[original_word] " + return msg + + +/client/var/adminhelptimerid = 0 + +/client/proc/giveadminhelpverb() + src.verbs |= /client/verb/adminhelp + adminhelptimerid = 0 + + +var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as", "i") + + + +/client/verb/adminhelp(msg as text) + set category = "Admin" + set name = "Adminhelp" + + if(say_disabled) //This is here to try to identify lag problems + usr << "Speech is currently admin-disabled." + return + + //handle muting and automuting + if(prefs.muted & MUTE_ADMINHELP) + src << "Error: Admin-PM: You cannot send adminhelps (Muted)." + return + if(src.handle_spam_prevention(msg,MUTE_ADMINHELP)) + return + + //clean the input msg + if(!msg) return + msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) + if(!msg) return + var/original_msg = msg + + //remove our adminhelp verb temporarily to prevent spamming of admins. + src.verbs -= /client/verb/adminhelp + adminhelptimerid = addtimer(src,"giveadminhelpverb",1200) //2 minute cooldown of admin helps + + msg = keywords_lookup(msg) if(!mob) return //this doesn't happen var/ref_mob = "\ref[mob]" var/ref_client = "\ref[src]" - msg = "HELP: [key_name_admin(src)] (?) (PP) (VV) (SM) (FLW) (TP)[ai_found ? " (CL)" : ""] (REJT): [msg]" + msg = "HELP: [key_name(src)] (?) (PP) (VV) (SM) (FLW) (TP) (REJT): [msg]" //send this msg to all admins diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 944677f2350..e79649e7dc4 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -32,6 +32,26 @@ cmd_admin_pm(targets[target],null) feedback_add_details("admin_verb","APM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/proc/cmd_ahelp_reply(whom) + if(prefs.muted & MUTE_ADMINHELP) + src << "Error: Admin-PM: You are unable to use admin PM-s (muted)." + return + var/client/C + if(istext(whom)) + if(cmptext(copytext(whom,1,2),"@")) + whom = findStealthKey(whom) + C = directory[whom] + else if(istype(whom,/client)) + C = whom + if(!C) + if(holder) src << "Error: Admin-PM: Client not found." + return + message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.") + var/msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null + if (!msg) + message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.") + return + cmd_admin_pm(whom, msg) //takes input from cmd_admin_pm_context, cmd_admin_pm_panel or /client/Topic and sends them a PM. //Fetching a message if needed. src is the sender and C is the target client @@ -71,14 +91,15 @@ if(!msg) return msg = emoji_parse(msg) + var/keywordparsedmsg = keywords_lookup(msg) if(C.holder) if(holder) //both are admins - C << "Admin PM from-[key_name(src, C, 1)]: [msg]" - src << "Admin PM to-[key_name(C, src, 1)]: [msg]" + C << "Admin PM from-[key_name(src, C, 1)]: [keywordparsedmsg]" + src << "Admin PM to-[key_name(C, src, 1)]: [keywordparsedmsg]" else //recipient is an admin but sender is not - C << "Reply PM from-[key_name(src, C, 1)]: [msg]" + C << "Reply PM from-[key_name(src, C, 1)]: [keywordparsedmsg]" src << "PM to-Admins: [msg]" //play the recieving admin the adminhelp sound (if they have them enabled) @@ -117,4 +138,4 @@ //we don't use message_admins here because the sender/receiver might get it too for(var/client/X in admins) if(X.key!=key && X.key!=C.key) //check client/X is an admin and isn't the sender or recipient - X << "PM: [key_name(src, X, 0)]->[key_name(C, X, 0)]: \blue [msg]" //inform X + X << "PM: [key_name(src, X, 0)]->[key_name(C, X, 0)]: \blue [keywordparsedmsg]" //inform X diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 1e077bd66e9..d764f4c02fd 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -8,7 +8,7 @@ if(!msg) return log_admin("[key_name(src)] : [msg]") - + msg = keywords_lookup(msg,0) if(check_rights(R_ADMIN,0)) msg = "ADMIN: [key_name(usr, 1)] (FLW): [msg]" admins << msg diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index aeeb2713757..9f4c6ab0c13 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -31,6 +31,9 @@ //Admin PM if(href_list["priv_msg"]) + if (href_list["ahelp_reply"]) + cmd_ahelp_reply(href_list["priv_msg"]) + return cmd_admin_pm(href_list["priv_msg"],null) return From 0d0f1a5f0da3ec95a0944f451d7c0ece20daacbb Mon Sep 17 00:00:00 2001 From: Jordie Date: Sat, 27 Jun 2015 15:25:58 +1000 Subject: [PATCH 32/57] fixes dropper sprite --- code/modules/reagents/reagent_containers/dropper.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index f67392fab7d..be16ecc6148 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -2,7 +2,7 @@ name = "dropper" desc = "A dropper. Holds up to 5 units." icon = 'icons/obj/chemical.dmi' - icon_state = "dropper" + icon_state = "dropper0" amount_per_transfer_from_this = 5 possible_transfer_amounts = list(1, 2, 3, 4, 5) volume = 5 @@ -87,4 +87,4 @@ if(reagents.total_volume) var/image/filling = image('icons/obj/reagentfillings.dmi', src, "dropper") filling.color = mix_color_from_reagents(reagents.reagent_list) - overlays += filling \ No newline at end of file + overlays += filling From 8759f56f6ff7d7367165523dd5fb832dbea46e18 Mon Sep 17 00:00:00 2001 From: Ikarrus Date: Thu, 25 Jun 2015 00:22:42 -0600 Subject: [PATCH 33/57] Squashed Commits --- code/game/objects/buckling.dm | 3 ++ .../objects/effects/decals/Cleanable/misc.dm | 13 +++--- code/game/objects/items.dm | 33 ++++++++-------- code/game/objects/items/candle.dm | 5 ++- .../game/objects/items/devices/instruments.dm | 2 + code/game/objects/items/devices/pizza_bomb.dm | 5 +++ .../objects/items/devices/taperecorder.dm | 5 +++ code/game/objects/items/stacks/cash.dm | 1 + code/game/objects/items/stacks/medical.dm | 2 + .../items/stacks/sheets/sheet_types.dm | 3 ++ .../objects/items/stacks/tiles/tile_types.dm | 3 ++ code/game/objects/items/toys.dm | 12 +++++- code/game/objects/items/trash.dm | 3 ++ code/game/objects/items/weapons/courtroom.dm | 2 + .../objects/items/weapons/gift_wrappaper.dm | 3 +- .../objects/items/weapons/grenades/grenade.dm | 5 +++ code/game/objects/items/weapons/mop.dm | 1 + code/game/objects/items/weapons/paint.dm | 2 + code/game/objects/items/weapons/scrolls.dm | 1 + code/game/objects/items/weapons/signs.dm | 1 + .../objects/items/weapons/storage/backpack.dm | 12 ++++++ .../objects/items/weapons/storage/bags.dm | 3 ++ .../objects/items/weapons/storage/book.dm | 1 + .../objects/items/weapons/storage/boxes.dm | 1 + .../items/weapons/storage/briefcase.dm | 2 + .../objects/items/weapons/storage/fancy.dm | 1 + .../objects/items/weapons/storage/wallets.dm | 1 + code/game/objects/items/weapons/weaponry.dm | 1 + code/game/objects/objs.dm | 29 +++++++++++++- code/game/objects/structures/artstuff.dm | 3 ++ code/game/objects/structures/bedsheet_bin.dm | 13 ++++++ code/game/objects/structures/flora.dm | 5 +++ code/game/objects/structures/mineral_doors.dm | 2 + .../structures/stool_bed_chair_nest/bed.dm | 3 ++ .../structures/stool_bed_chair_nest/chairs.dm | 7 ++++ code/game/objects/structures/table_frames.dm | 1 + code/game/objects/structures/tables_racks.dm | 2 + code/modules/clothing/clothing.dm | 18 +++------ code/modules/clothing/gloves/color.dm | 5 ++- code/modules/clothing/gloves/miscellaneous.dm | 4 +- code/modules/clothing/head/collectable.dm | 5 ++- code/modules/clothing/head/hardhat.dm | 1 + code/modules/clothing/head/helmet.dm | 1 + code/modules/clothing/head/misc.dm | 8 +--- code/modules/clothing/head/misc_special.dm | 1 + code/modules/clothing/masks/gasmask.dm | 11 +++++- code/modules/clothing/shoes/magboots.dm | 2 +- code/modules/clothing/shoes/miscellaneous.dm | 3 ++ code/modules/clothing/suits/armor.dm | 4 +- code/modules/clothing/suits/bio.dm | 2 + code/modules/clothing/suits/jobs.dm | 1 + code/modules/clothing/suits/miscellaneous.dm | 7 +++- code/modules/clothing/suits/utility.dm | 8 ++-- code/modules/clothing/suits/wiz_robe.dm | 6 ++- code/modules/clothing/under/chameleon.dm | 1 + code/modules/clothing/under/color.dm | 1 + .../clothing/under/jobs/engineering.dm | 2 + code/modules/clothing/under/miscellaneous.dm | 4 ++ code/modules/clothing/under/ties.dm | 1 + code/modules/food&drinks/drinks/drinks.dm | 1 + .../drinks/drinks/drinkingglass.dm | 14 +++++++ code/modules/food&drinks/food.dm | 1 + code/modules/hydroponics/grown.dm | 1 + code/modules/hydroponics/growninedible.dm | 1 + code/modules/hydroponics/seeds.dm | 1 + code/modules/library/lib_items.dm | 3 ++ code/modules/mining/money_bag.dm | 2 + .../mob/living/carbon/human/inventory.dm | 23 ++++++----- code/modules/paperwork/clipboard.dm | 2 +- code/modules/paperwork/folders.dm | 1 + code/modules/paperwork/paper.dm | 26 ++++-------- code/modules/paperwork/paperbin.dm | 11 ++++++ code/modules/paperwork/photography.dm | 6 ++- code/modules/recycling/sortingmachinery.dm | 1 + html/changelogs/ikarrus-shredme.yml | 37 ++++++++++++++++++ icons/effects/effects.dmi | Bin 295135 -> 295406 bytes 76 files changed, 330 insertions(+), 89 deletions(-) create mode 100644 html/changelogs/ikarrus-shredme.yml diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 43cd9f186cf..0c781f27f9b 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -47,6 +47,9 @@ M.update_canmove() post_buckle_mob(M) M.throw_alert("buckled", new_master = src) + if(burn_state == 1) //Sets the mob on fire if you buckle them to a burning object + M.adjust_fire_stacks(1) + M.IgniteMob() return 1 /obj/proc/unbuckle_mob() diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index f8d8ec3136b..1a205f1607a 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -19,6 +19,9 @@ /obj/effect/decal/cleanable/ash/New() ..() reagents.add_reagent("ash", 30) + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) + /obj/effect/decal/cleanable/greenglow name = "green glow" @@ -71,6 +74,8 @@ layer = 3 icon = 'icons/effects/effects.dmi' icon_state = "cobweb1" + burn_state = 0 //Burnable + burntime = 1 /obj/effect/decal/cleanable/molten_item name = "gooey grey mass" @@ -154,8 +159,6 @@ anchored = 1 layer = 2 -/obj/effect/decal/cleanable/shreds/New(loc,var/clothing) - ..(loc) - if(clothing) - name = "shredded [clothing]" - desc = "The sad remains of what used to be a glorious [clothing]." \ No newline at end of file +/obj/effect/decal/cleanable/shreds/New() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2ad3dfd5afa..54484ef4f14 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1,3 +1,5 @@ +var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_state" = "fire") + /obj/item name = "item" icon = 'icons/obj/items.dmi' @@ -20,7 +22,6 @@ var/cold_protection = 0 //flags which determine which body parts are protected from cold. Use the HEAD, CHEST, GROIN, etc. flags. See setup.dm var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags var/min_cold_protection_temperature //Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags - var/burning = 0 //If this is set, The item will make an action button on the player's HUD when picked up. var/action_button_name //It is also the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. If it's not set, there'll be no button. @@ -103,18 +104,6 @@ if(!gc_destroyed) contents_explosion(severity, target) -/obj/item/proc/burn() - src.visible_message("[src] disintegrates, leaving behind a pile of ashes.") - new /obj/effect/decal/cleanable/ash(src.loc) - qdel(src) - -/obj/item/proc/extinguish() - if(burning) - burning = 0 - for(var/image/img in overlays) - if(img.icon_state == "fire") - overlays -= img - //user: The mob that is suiciding //damagetype: The type of damage the item will inflict on the user //BRUTELOSS = 1 @@ -169,9 +158,21 @@ /obj/item/attack_hand(mob/user as mob) if (!user) return - if(burning) - burn() //It just disintigrates if you try to pick it up - return + if(burn_state == 1) + var/mob/living/carbon/human/H = user + if(istype(H)) + if(H.gloves && (H.gloves.max_heat_protection_temperature > 360)) + extinguish() + user << "You put out the fire on [src]." + else + user << "You burn your hand on [src]!" + var/obj/item/organ/limb/affecting = H.get_organ("[user.hand ? "l" : "r" ]_arm") + if(affecting.take_damage( 0, 5 )) // 5 burn damage + H.update_damage_overlays(0) + H.updatehealth() + return + else + extinguish() if (istype(src.loc, /obj/item/weapon/storage)) //If the item is in a storage item, take it out diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 5d63211a30d..276d614a9ad 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -6,7 +6,6 @@ icon_state = "candle1" item_state = "candle1" w_class = 1 - var/wax = 200 var/lit = 0 proc @@ -46,6 +45,10 @@ if(M.lit) light() +/obj/item/candle/fire_act() + if(!src.lit) + light() //honk + return /obj/item/candle/light(var/flavor_text = "[usr] lights the [name].") if(!src.lit) diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm index 6ecc1a86125..dcfaceeffc3 100644 --- a/code/game/objects/items/devices/instruments.dm +++ b/code/game/objects/items/devices/instruments.dm @@ -1,6 +1,8 @@ //copy pasta of the space piano, don't hurt me -Pete /obj/item/device/instrument name = "generic instrument" + burn_state = 0 //Burnable + burntime = 20 var/datum/song/handheld/song var/instrumentId = "generic" var/instrumentExt = "ogg" diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm index 6a1cdcd1151..a77f96f1e9b 100644 --- a/code/game/objects/items/devices/pizza_bomb.dm +++ b/code/game/objects/items/devices/pizza_bomb.dm @@ -3,6 +3,7 @@ desc = "A box suited for pizzas." icon = 'icons/obj/food/containers.dmi' icon_state = "pizzabox1" + burn_state = 0 //Burnable var/timer = 10 //Adjustable timer var/timer_set = 0 var/primed = 0 @@ -54,6 +55,10 @@ sleep(timer) return go_boom() +/obj/item/device/pizza_bomb/burn() //Instead of burning to ashes, it will just explode + go_boom() + return + /obj/item/device/pizza_bomb/proc/go_boom() if(disarmed) visible_message("\icon[src] Sparks briefly jump out of the [correct_wire] wire on \the [src], but it's disarmed!") diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 206e6f64739..60e0ba98c3a 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -56,6 +56,9 @@ mytape = null update_icon() +/obj/item/device/taperecorder/fire_act() + mytape.ruin() //Fires destroy the tape + return() /obj/item/device/taperecorder/attack_hand(mob/user) if(loc == user) @@ -264,6 +267,8 @@ var/list/timestamp = list() var/ruined = 0 +/obj/item/device/tape/fire_act() + ruin() /obj/item/device/tape/attack_self(mob/user) if(!ruined) diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index 6c391dcc3e6..eff17423b61 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -10,6 +10,7 @@ throw_speed = 2 throw_range = 2 w_class = 1.0 + burn_state = 0 //Burnable /obj/item/stack/spacecash/c10 icon_state = "spacecash10" diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 55493399fad..33c7ad85fed 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -7,6 +7,8 @@ w_class = 1 throw_speed = 3 throw_range = 7 + burn_state = 0 //Burnable + burntime = 5 var/heal_brute = 0 var/heal_burn = 0 var/stop_bleeding = 0 diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 34c8445a8d5..28794e5bd7a 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -108,6 +108,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ icon = 'icons/obj/items.dmi' origin_tech = "materials=1;biotech=1" sheettype = "wood" + burn_state = 0 //Burnable /obj/item/stack/sheet/mineral/wood/New(var/loc, var/amount=null) recipes = wood_recipes @@ -122,6 +123,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ singular_name = "cloth roll" icon_state = "sheet-cloth" origin_tech = "materials=2" + burn_state = 0 //Burnable /* * Cardboard @@ -143,6 +145,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \ singular_name = "cardboard sheet" icon_state = "sheet-card" origin_tech = "materials=1" + burn_state = 0 //Burnable /obj/item/stack/sheet/cardboard/New(var/loc, var/amount=null) recipes = cardboard_recipes diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 6d81c36bb2c..e498bc3ebce 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -84,6 +84,7 @@ max_amount = 60 origin_tech = "biotech=1" turf_type = /turf/simulated/floor/fancy/grass + burn_state = 0 //Burnable /* * Wood @@ -101,6 +102,7 @@ max_amount = 60 origin_tech = "biotech=1" turf_type = /turf/simulated/floor/wood + burn_state = 0 //Burnable /* * Carpets @@ -117,6 +119,7 @@ throw_range = 7 max_amount = 60 turf_type = /turf/simulated/floor/fancy/carpet + burn_state = 0 //Burnable /* * High-traction diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 515176b16a2..5bc5733aa4b 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -271,6 +271,7 @@ item_state = "arm_blade" attack_verb = list("pricked", "absorbed", "gored") w_class = 2 + burn_state = 0 //Burnable /* @@ -527,6 +528,10 @@ icon_state = "snappop" w_class = 1 +/obj/item/toy/snappop/fire_act() + throw_impact() + return + /obj/item/toy/snappop/throw_impact(atom/hit_atom) ..() var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread @@ -710,6 +715,8 @@ /obj/item/toy/cards + burn_state = 0 //Burnable + burntime = 5 var/parentdeck = null var/deckstyle = "nanotrasen" var/card_hitsound = null @@ -949,7 +956,8 @@ newobj.card_throw_speed = sourceobj.card_throw_speed newobj.card_throw_range = sourceobj.card_throw_range newobj.card_attack_verb = sourceobj.card_attack_verb - + if(sourceobj.burn_state == -1) + newobj.burn_state = -1 /obj/item/toy/cards/singlecard name = "card" @@ -1065,6 +1073,7 @@ card_throw_speed = 3 card_throw_range = 7 card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut") + burn_state = -1 //Not Burnable /* * Fake nuke @@ -1123,6 +1132,7 @@ icon_state = "carpplushie" w_class = 2.0 attack_verb = list("bitten", "eaten", "fin slapped") + burn_state = 0 //Burnable var/bitesound = 'sound/weapons/bite.ogg' // Attack mob diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 2e22500c790..12e705d193b 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -3,6 +3,7 @@ icon = 'icons/obj/janitor.dmi' desc = "This is rubbish." w_class = 1.0 + burn_state = 0 //Burnable /obj/item/trash/raisins name = "\improper 4no raisins" @@ -51,6 +52,7 @@ /obj/item/trash/tray name = "tray" icon_state = "tray" + burn_state = -1 //Not Burnable /obj/item/trash/candle name = "candle" @@ -60,6 +62,7 @@ /obj/item/trash/can name = "crushed can" icon_state = "cola" + burn_state = -1 //Not Burnable /obj/item/trash/attack(mob/M, mob/living/user) return \ No newline at end of file diff --git a/code/game/objects/items/weapons/courtroom.dm b/code/game/objects/items/weapons/courtroom.dm index c3f62193260..408cbe25a01 100644 --- a/code/game/objects/items/weapons/courtroom.dm +++ b/code/game/objects/items/weapons/courtroom.dm @@ -11,6 +11,7 @@ throwforce = 6.0 w_class = 2.0 attack_verb = list("bashed", "battered", "judged", "whacked") + burn_state = 0 //Burnable /obj/item/weapon/gavelhammer/suicide_act(mob/user) user.visible_message("[user] has sentenced \himself to death with the [src.name]! It looks like \he's trying to commit suicide.") @@ -25,6 +26,7 @@ force = 2.0 throwforce = 2.0 w_class = 1.0 + burn_state = 0 //Burnable /obj/item/weapon/gavelblock/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/gavelhammer)) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 26bdda71d65..f2caf4bc4d4 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -13,7 +13,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "giftcrate3" item_state = "gift1" - + burn_state = 0 //Burnable /obj/item/weapon/a_gift/New() ..() @@ -86,6 +86,7 @@ flags = NOBLUDGEON amount = 25 max_amount = 25 + burn_state = 0 //Burnable /obj/item/stack/wrapping_paper/attack_self(mob/user) user << "You need to use it on a package that has already been wrapped!" diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 85375327940..51272bbd0a7 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -9,10 +9,15 @@ throw_range = 7 flags = CONDUCT slot_flags = SLOT_BELT + burn_state = 0 //Burnable + burntime = 5 var/active = 0 var/det_time = 50 var/display_timer = 1 +/obj/item/weapon/grenade/burn() + prime() + /obj/item/weapon/grenade/proc/clown_check(var/mob/living/carbon/human/user) if(user.disabilities & CLUMSY && prob(50)) user << "Huh? How does this thing work?" diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index ff0a719e4bb..60b08e58e64 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -11,6 +11,7 @@ throw_range = 7 w_class = 3.0 attack_verb = list("mopped", "bashed", "bludgeoned", "whacked") + burn_state = 0 //Burnable var/mopping = 0 var/mopcount = 0 var/mopcap = 5 diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 48809459247..14ddda46e57 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -10,6 +10,8 @@ item_color = "FFFFFF" item_state = "paintcan" w_class = 3.0 + burn_state = 0 //Burnable + burntime = 5 var/paintleft = 10 /obj/item/weapon/paint/red diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 521f5ab64e7..03c15e6fedb 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -9,6 +9,7 @@ throw_speed = 3 throw_range = 7 origin_tech = "bluespace=4" + burn_state = 0 //Burnable /obj/item/weapon/teleportation_scroll/apprentice name = "lesser scroll of teleportation" diff --git a/code/game/objects/items/weapons/signs.dm b/code/game/objects/items/weapons/signs.dm index 15451d602a8..67467ce35c1 100644 --- a/code/game/objects/items/weapons/signs.dm +++ b/code/game/objects/items/weapons/signs.dm @@ -5,6 +5,7 @@ force = 5 w_class = 4.0 attack_verb = list("bashed","smacked") + burn_state = 0 //Burnable var/label = "" var/last_wave = 0 diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index d8aed9fdd9d..a2d03a9ca25 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -18,6 +18,8 @@ slot_flags = SLOT_BACK //ERROOOOO max_w_class = 3 max_combined_w_class = 21 + burn_state = 0 //Burnable + burntime = 20 /obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob, params) playsound(src.loc, "rustle", 50, 1, -5) @@ -34,6 +36,7 @@ icon_state = "holdingpack" max_w_class = 5 max_combined_w_class = 35 + burn_state = -1 // NotBurnable /obj/item/weapon/storage/backpack/holding/suicide_act(mob/user) user.visible_message("[user] is jumping into [src]! It looks like \he's trying to commit suicide.") @@ -129,12 +132,14 @@ desc = "It's a special backpack made exclusively for Nanotrasen officers." icon_state = "captainpack" item_state = "captainpack" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/industrial name = "industrial backpack" desc = "It's a tough backpack for the daily grind of station life." icon_state = "engiepack" item_state = "engiepack" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/botany name = "botany backpack" @@ -159,6 +164,7 @@ desc = "A specially designed backpack. It's fire resistant and smells vaguely of plasma." icon_state = "toxpack" item_state = "toxpack" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/virology name = "virology backpack" @@ -175,6 +181,7 @@ name = "leather satchel" desc = "It's a very fancy satchel made with fine leather." icon_state = "satchel" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/satchel/withwallet/New() ..() @@ -190,6 +197,7 @@ desc = "A tough satchel with extra pockets." icon_state = "satchel-eng" item_state = "engiepack" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/satchel_med name = "medical satchel" @@ -220,6 +228,7 @@ desc = "Useful for holding research materials." icon_state = "satchel-tox" item_state = "satchel-tox" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/satchel_hyd name = "botanist satchel" @@ -238,6 +247,7 @@ desc = "An exclusive satchel for Nanotrasen officers." icon_state = "satchel-cap" item_state = "captainpack" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/satchel_flat name = "smuggler's satchel" @@ -310,6 +320,7 @@ desc = "A large dufflebag for holding extra captainly goods." icon_state = "duffle-captain" item_state = "duffle-captain" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/dufflebag/med name = "medical dufflebag" @@ -328,6 +339,7 @@ desc = "A large dufflebag for holding extra tools and supplies." icon_state = "duffle-eng" item_state = "duffle-eng" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/dufflebag/clown name = "clown's dufflebag" diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 7519804b005..9790b77e206 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -103,6 +103,7 @@ max_w_class = 3 w_class = 1 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown) + burn_state = 0 //Burnable //////// @@ -280,6 +281,7 @@ max_w_class = 3 w_class = 4 //Bigger than a book because physics can_hold = list(/obj/item/weapon/book, /obj/item/weapon/storage/book, /obj/item/weapon/spellbook) + burn_state = 0 //Burnable /* * Trays - Agouri @@ -349,3 +351,4 @@ w_class = 1 preposition = "in" can_hold = list(/obj/item/weapon/reagent_containers/pill, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle) + burn_state = 0 //Burnable diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm index 1efe547141c..dcb45f1fe5d 100644 --- a/code/game/objects/items/weapons/storage/book.dm +++ b/code/game/objects/items/weapons/storage/book.dm @@ -6,6 +6,7 @@ throw_speed = 2 throw_range = 5 w_class = 3.0 + burn_state = 0 //Burnable var/title = "book" /obj/item/weapon/storage/book/attack_self(mob/user) user << "The pages of [title] have been cut out!" diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 936f6e72425..d8ea59ab5f4 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -24,6 +24,7 @@ desc = "It's just an ordinary box." icon_state = "box" item_state = "syringe_kit" + burn_state = 0 //Burnable var/foldable = /obj/item/stack/sheet/cardboard diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm index 93a6fdc2679..b37091113a6 100644 --- a/code/game/objects/items/weapons/storage/briefcase.dm +++ b/code/game/objects/items/weapons/storage/briefcase.dm @@ -11,6 +11,8 @@ max_w_class = 3 max_combined_w_class = 21 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") + burn_state = 0 //Burnable + burntime = 20 /obj/item/weapon/storage/briefcase/New() ..() diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 121a7b505ca..51bfd6cdb6f 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -18,6 +18,7 @@ icon = 'icons/obj/food/containers.dmi' icon_state = "donutbox6" name = "donut box" + burn_state = 0 //Burnable var/icon_type = "donut" /obj/item/weapon/storage/fancy/update_icon(var/itemremoved = 0) diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index 5f2e841eff0..a1b73157d55 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -4,6 +4,7 @@ storage_slots = 4 icon_state = "wallet" w_class = 2 + burn_state = 0 //Burnable can_hold = list( /obj/item/stack/spacecash, /obj/item/weapon/card, diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index bfda5735a2b..15bee3c691d 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -242,6 +242,7 @@ w_class = 2 flags = NOSHIELD attack_verb = list("bludgeoned", "whacked", "disciplined") + burn_state = 0 //Burnable /obj/item/weapon/staff/broom name = "broom" diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index e6a76907189..9eb1d4258ac 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -9,6 +9,9 @@ var/damtype = "brute" var/force = 0 + var/burn_state = -1 // -1=fireproof | 0=will burn in fires | 1=currently on fire + var/burntime = 10 //How long it takes to burn to ashes, in seconds + /obj/Destroy() if(!istype(src, /obj/machinery)) SSobj.processing.Remove(src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists @@ -155,4 +158,28 @@ /obj/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user) var/turf/T = get_turf(src) - return T.storage_contents_dump_act(src_object, user) \ No newline at end of file + return T.storage_contents_dump_act(src_object, user) + +/obj/fire_act(var/global_overlay=1) + if(!burn_state) + burn_state = 1 + if(global_overlay) + overlays += fire_overlay + spawn(burntime*10) + if(burn_state == 1) + burn() + +/obj/proc/burn(var/visible=1) + for(var/obj/item/Item in contents) //Empty out the contents + Item.loc = src.loc + Item.fire_act() //Set them on fire, too + + if(visible) + src.visible_message("[src] burns away, leaving behind a pile of ashes.") + new /obj/effect/decal/cleanable/ash(src.loc) + qdel(src) + +/obj/proc/extinguish() + if(burn_state == 1) + burn_state = 0 + overlays -= fire_overlay \ No newline at end of file diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index 495c7b9c394..ae56de30fb6 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -9,6 +9,8 @@ icon = 'icons/obj/artstuff.dmi' icon_state = "easel" density = 1 + burn_state = 0 //Burnable + burntime = 15 var/obj/item/weapon/canvas/painting = null @@ -50,6 +52,7 @@ var/global/list/globalBlankCanvases[AMT_OF_CANVASES] desc = "draw out your soul on this canvas!" icon = 'icons/obj/artstuff.dmi' icon_state = "11x11" + burn_state = 0 //Burnable var/whichGlobalBackup = 1 //List index /obj/item/weapon/canvas/nineteenXnineteen diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 073ae4e2e53..c27a4f0513e 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -17,6 +17,7 @@ LINEN BINS throw_range = 2 w_class = 1.0 item_color = "white" + burn_state = 0 //Burnable /obj/item/weapon/bedsheet/attack(mob/living/M, mob/user) @@ -170,6 +171,8 @@ LINEN BINS icon = 'icons/obj/structures.dmi' icon_state = "linenbin-full" anchored = 1 + burn_state = 0 //Burnable + burntime = 20 var/amount = 10 var/list/sheets = list() var/obj/item/hidden = null @@ -191,6 +194,16 @@ LINEN BINS if(1 to 5) icon_state = "linenbin-half" else icon_state = "linenbin-full" +/obj/structure/bedsheetbin/fire_act() + if(!amount) + return + ..() + +/obj/structure/bedsheetbin/burn() + amount = 0 + extinguish() + update_icon() + return /obj/structure/bedsheetbin/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/weapon/bedsheet)) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 6ee88dda1bb..f2a83e01012 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -1,3 +1,7 @@ +/obj/structure/flora + burn_state = 0 //Burnable + burntime = 30 + //trees /obj/structure/flora/tree name = "tree" @@ -217,6 +221,7 @@ icon_state = "rock1" icon = 'icons/obj/flora/rocks.dmi' anchored = 1 + burn_state = -1 //Not Burnable /obj/structure/flora/rock/New() ..() diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index a5494427e55..23be1ce7c31 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -242,6 +242,8 @@ hardness = 1 openSound = 'sound/effects/doorcreaky.ogg' closeSound = 'sound/effects/doorcreaky.ogg' + burn_state = 0 //Burnable + burntime = 30 /obj/structure/mineral_door/wood/Dismantle(devastated = 0) if(!devastated) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index af9c059a8f7..1682c22403b 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -13,6 +13,8 @@ icon_state = "bed" can_buckle = 1 buckle_lying = 1 + burn_state = 0 //Burnable + burntime = 30 /obj/structure/stool/bed/alien name = "resting contraption" @@ -59,6 +61,7 @@ icon = 'icons/obj/rollerbed.dmi' icon_state = "down" anchored = 0 + burn_state = -1 //Not Burnable /obj/structure/stool/bed/roller/post_buckle_mob(mob/living/M) if(M == buckled_mob) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 915f56b9ac0..1dea5a15dde 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -3,6 +3,7 @@ desc = "You sit in this. Either by will or force." icon_state = "chair" buckle_lying = 0 //you sit in a chair, not lay + burn_state = -1 //Not Burnable /obj/structure/stool/bed/chair/New() ..() @@ -73,6 +74,10 @@ // Chair types +/obj/structure/stool/bed/chair/wood + burn_state = 0 //Burnable + burntime = 20 + /obj/structure/stool/bed/chair/wood/normal icon_state = "wooden_chair" name = "wooden chair" @@ -96,6 +101,8 @@ desc = "It looks comfy." icon_state = "comfychair" color = rgb(255,255,255) + burn_state = 0 //Burnable + burntime = 30 var/image/armrest = null /obj/structure/stool/bed/chair/comfy/New() diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index 5196a37fa9d..18288c5f670 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -75,6 +75,7 @@ icon_state = "wood_frame" framestack = /obj/item/stack/sheet/mineral/wood framestackamount = 2 + burn_state = 0 //Burnable /obj/structure/table_frame/wood/attackby(var/obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/wrench)) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index cf8b9476c2f..7258982885d 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -432,6 +432,8 @@ frame = /obj/structure/table_frame/wood framestack = /obj/item/stack/sheet/mineral/wood buildstack = /obj/item/stack/sheet/mineral/wood + burn_state = 0 //Burnable + burntime = 20 /obj/structure/table/wood/poker //No specialties, Just a mapping object. name = "gambling table" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 51a14b46738..cb0ec817f87 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,5 +1,7 @@ /obj/item/clothing name = "clothing" + burn_state = 0 //Burnable + burntime = 15 var/flash_protect = 0 //Malk: What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS var/tint = 0 //Malk: Sets the item's level of visual impairment tint, normally set to the same as flash_protect var/up = 0 // but seperated to allow items to protect but not impair vision, like space helmets @@ -30,24 +32,13 @@ shred(1,10) return -/obj/item/clothing/fire_act() - if(burning) - return - if(max_heat_protection_temperature) - return - src.visible_message("[src] catches on fire.") - burning = 1 - overlays += image("icon" = 'icons/effects/fire.dmi', "icon_state" = "fire") - spawn(100) - if(burning) - burn() - //Ears: currently only used for headsets and earmuffs /obj/item/clothing/ears name = "ears" w_class = 1.0 throwforce = 0 slot_flags = SLOT_EARS + burn_state = -1 //Won't burn in fires /obj/item/clothing/ears/earmuffs name = "earmuffs" @@ -73,6 +64,7 @@ var/list/icon/current = list() //the current hud icons strip_delay = 20 put_on_delay = 25 + burn_state = -1 //Won't burn in fires /* SEE_SELF // can see self, no matter what @@ -204,6 +196,7 @@ BLIND // can't see anything flash_protect = 2 strip_delay = 50 put_on_delay = 50 + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/space name = "space suit" @@ -225,6 +218,7 @@ BLIND // can't see anything max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT strip_delay = 80 put_on_delay = 80 + burn_state = -1 //Won't burn in fires //Under clothing /obj/item/clothing/under diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 9d7bf51d33c..18f5c7937f4 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -6,6 +6,7 @@ siemens_coefficient = 0 permeability_coefficient = 0.05 item_color="yellow" + burn_state = -1 //Won't burn in fires /obj/item/clothing/gloves/color/yellow/fake desc = "These gloves will protect the wearer from electric shock. They don't feel like rubber..." @@ -19,6 +20,7 @@ siemens_coefficient = 1 //Set to a default of 1, gets overridden in New() permeability_coefficient = 0.05 item_color="yellow" + burn_state = -1 //Won't burn in fires /obj/item/clothing/gloves/color/fyellow/New() siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5) @@ -33,7 +35,7 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - + burn_state = -1 //Won't burn in fires /obj/item/clothing/gloves/color/black/hos item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way. @@ -148,6 +150,7 @@ permeability_coefficient = 0.01 item_color="white" transfer_prints = TRUE + burn_state = -1 //Won't burn in fires /obj/item/clothing/gloves/color/latex/nitrile name = "nitrile gloves" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 317ae88ac81..257394e13ce 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -21,6 +21,7 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + burn_state = -1 //Not Burnable /obj/item/clothing/gloves/combat name = "combat gloves" @@ -33,4 +34,5 @@ cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT \ No newline at end of file + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + burn_state = -1 //Won't burn in fires \ No newline at end of file diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 4ada082a0fa..7dad46544c3 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -58,6 +58,7 @@ desc = "A collectable welding helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this helmet is done so at the owner's own risk!" icon_state = "welding" item_state = "welding" + burn_state = -1 //Won't burn in fires /obj/item/clothing/head/collectable/slime name = "collectable slime hat" @@ -110,9 +111,11 @@ desc = "Go Red! I mean Green! I mean Red! No Green!" icon_state = "thunderdome" item_state = "thunderdome" + burn_state = -1 //Won't burn in fires /obj/item/clothing/head/collectable/swat name = "collectable SWAT helmet" desc = "That's not real blood. That's red paint." //Reference to the actual description icon_state = "swat" - item_state = "swat" \ No newline at end of file + item_state = "swat" + burn_state = -1 //Won't burn in fires \ No newline at end of file diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index cf491f337dd..16d33da43c8 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -9,6 +9,7 @@ armor = list(melee = 15, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20) flags_inv = 0 action_button_name = "Toggle Helmet Light" + burn_state = -1 //Won't burn in fires attack_self(mob/user) if(!isturf(user.loc)) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index ef549cf4acb..eb2da09dbe7 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -11,6 +11,7 @@ heat_protection = HEAD max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 60 + burn_state = -1 //Won't burn in fires var/obj/machinery/camera/portable/helmetCam = null var/spawnWithHelmetCam = 0 var/canAttachCam = 0 diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 7130556f958..b75de520c4f 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -56,13 +56,6 @@ flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE -/obj/item/clothing/head/that - name = "sturdy top-hat" - desc = "It's an amish looking armored top hat." - icon_state = "tophat" - item_state = "that" - flags_inv = 0 - /obj/item/clothing/head/cardborg name = "cardborg helmet" desc = "A helmet made out of a box." @@ -213,6 +206,7 @@ throw_range = 5 w_class = 2.0 attack_verb = list("warned", "cautioned", "smashed") + burn_state = -1 //Won't burn in fires /obj/item/clothing/head/santa name = "santa hat" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 6eee2eaf8a0..e8ad38ac95b 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -27,6 +27,7 @@ action_button_name = "Toggle Welding Helmet" visor_flags = HEADCOVERSEYES | HEADCOVERSMOUTH visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + burn_state = -1 //Won't burn in fires /obj/item/clothing/head/welding/attack_self() toggle() diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index bf59b9d3278..7ffa365cb39 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -8,6 +8,7 @@ item_state = "gas_alt" gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 + burn_state = -1 //Won't burn in fires // **** Welding gas mask **** @@ -198,6 +199,7 @@ icon_state = "plaguedoctor" item_state = "gas_mask" armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 75, rad = 0) + max_heat_protection_temperature = 0 /obj/item/clothing/mask/gas/syndicate name = "syndicate mask" @@ -225,6 +227,7 @@ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "clown" item_state = "clown_hat" + burn_state = 0 //Burnable /obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user) @@ -248,6 +251,7 @@ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "sexyclown" item_state = "sexyclown" + burn_state = 0 //Burnable /obj/item/clothing/mask/gas/mime name = "mime mask" @@ -255,6 +259,7 @@ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "mime" item_state = "mime" + burn_state = 0 //Burnable /obj/item/clothing/mask/gas/monkeymask name = "monkey mask" @@ -262,6 +267,7 @@ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "monkeymask" item_state = "monkeymask" + burn_state = 0 //Burnable /obj/item/clothing/mask/gas/sexymime name = "sexy mime mask" @@ -269,6 +275,7 @@ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "sexymime" item_state = "sexymime" + burn_state = 0 //Burnable /obj/item/clothing/mask/gas/death_commando name = "Death Commando Mask" @@ -279,9 +286,11 @@ name = "cyborg visor" desc = "Beep boop." icon_state = "death" + burn_state = 0 //Burnable /obj/item/clothing/mask/gas/owl_mask name = "owl mask" desc = "Twoooo!" flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS - icon_state = "owl" \ No newline at end of file + icon_state = "owl" + burn_state = 0 //Burnable \ No newline at end of file diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 8d742f983db..843f69e25c5 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -8,7 +8,7 @@ action_button_name = "Toggle Magboots" strip_delay = 70 put_on_delay = 70 - + burn_state = -1 //Won't burn in fires /obj/item/clothing/shoes/magboots/verb/toggle() set name = "Toggle Magboots" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 1a0a0a4f98c..0bebe7a3ee0 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -15,6 +15,7 @@ permeability_coefficient = 0.05 flags = NOSLIP origin_tech = "syndicate=3" + burn_state = -1 //Won't burn in fires /obj/item/clothing/shoes/sneakers/mime name = "mime shoes" @@ -35,6 +36,7 @@ permeability_coefficient = 0.01 flags = NOSLIP armor = list(melee = 40, bullet = 30, laser = 25, energy = 25, bomb = 50, bio = 30, rad = 30) + burn_state = -1 //Won't burn in fires /obj/item/clothing/shoes/sandal desc = "A pair of rather plain, wooden sandals." @@ -58,6 +60,7 @@ slowdown = SHOES_SLOWDOWN+1 strip_delay = 50 put_on_delay = 50 + burn_state = -1 //Won't burn in fires /obj/item/clothing/shoes/clown_shoes desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 26e08d66b64..77a76ffd640 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -7,6 +7,7 @@ max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT strip_delay = 60 put_on_delay = 40 + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/armor/vest name = "armor" @@ -45,6 +46,7 @@ cold_protection = CHEST|GROIN|ARMS|HANDS heat_protection = CHEST|GROIN|ARMS|HANDS strip_delay = 70 + burn_state = 0 //Burnable /obj/item/clothing/suit/armor/vest/warden/alt name = "warden's armored jacket" @@ -112,7 +114,7 @@ desc = "An armored vest with a detective's badge on it." icon_state = "detective-armor" allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder) - + burn_state = 0 //Burnable //Reactive armor diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 7d75bef57d4..bee7db48b5f 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -8,6 +8,7 @@ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES unacidable = 1 + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/bio_suit name = "bio suit" @@ -26,6 +27,7 @@ strip_delay = 70 put_on_delay = 70 unacidable = 1 + burn_state = -1 //Won't burn in fires //Standard biosuit, orange stripe /obj/item/clothing/head/bio_hood/general diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 7bad9b13400..1ae33b0de80 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -100,6 +100,7 @@ item_state = "hazard" blood_overlay_type = "armor" allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner,) + burn_state = -1 //Won't burn in fires //Lawyer /obj/item/clothing/suit/toggle/lawyer diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 6a9109a3532..d6e1399c1a4 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -16,6 +16,7 @@ blood_overlay_type = "armor" body_parts_covered = CHEST allowed = list (/obj/item/weapon/gun/energy/laser/bluetag) + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/redtag name = "red laser tag armor" @@ -25,6 +26,7 @@ blood_overlay_type = "armor" body_parts_covered = CHEST allowed = list (/obj/item/weapon/gun/energy/laser/redtag) + burn_state = -1 //Won't burn in fires /* * Costume @@ -88,7 +90,7 @@ w_class = 3 allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/hastur name = "\improper Hastur's robe" @@ -236,7 +238,8 @@ desc = "Pompadour not included." icon_state = "leatherjacket" item_state = "hostrench" - + burn_state = -1 //Not Burnable + max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT /obj/item/clothing/suit/jacket/leather/overcoat name = "leather overcoat" diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index c32db545664..bb494884c21 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -28,6 +28,7 @@ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT strip_delay = 60 put_on_delay = 60 + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/fire/firefighter icon_state = "firesuit" @@ -64,7 +65,7 @@ max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 70 put_on_delay = 70 - + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/bomb_suit name = "bomb suit" @@ -85,7 +86,7 @@ min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT strip_delay = 70 put_on_delay = 70 - + burn_state = -1 //Won't burn in fires /obj/item/clothing/head/bomb_hood/security @@ -109,7 +110,7 @@ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100) strip_delay = 60 put_on_delay = 60 - + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/radiation name = "radiation suit" @@ -127,3 +128,4 @@ strip_delay = 60 put_on_delay = 60 flags_inv = HIDEJUMPSUIT + burn_state = -1 //Won't burn in fires diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index dd22a1e9f5c..299daf63152 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -8,6 +8,7 @@ strip_delay = 50 put_on_delay = 50 unacidable = 1 + burn_state = -1 //Won't burn in fires /obj/item/clothing/head/wizard/red name = "red wizard hat" @@ -63,7 +64,7 @@ strip_delay = 50 put_on_delay = 50 unacidable = 1 - + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/wizrobe/red name = "red wizard robe" @@ -117,6 +118,7 @@ permeability_coefficient = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) unacidable = 0 + burn_state = 0 //Burnable /obj/item/clothing/head/wizard/marisa/fake name = "witch hat" @@ -126,6 +128,7 @@ permeability_coefficient = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) unacidable = 0 + burn_state = 0 //Burnable /obj/item/clothing/suit/wizrobe/marisa/fake name = "witch robe" @@ -136,3 +139,4 @@ permeability_coefficient = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) unacidable = 0 + burn_state = 0 //Burnable \ No newline at end of file diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm index 20acefb09d6..f550d51edd5 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/under/chameleon.dm @@ -9,6 +9,7 @@ origin_tech = "syndicate=3" var/list/clothing_choices = list() var/malfunctioning = 0 + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/chameleon/New() ..() diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 84355443233..c5bc98a2cc1 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -16,6 +16,7 @@ icon_state = "black" item_state = "bl_suit" item_color = "black" + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/color/grey name = "grey jumpsuit" diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index bdd52e6ba23..57709b5bdfe 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -6,6 +6,7 @@ item_state = "gy_suit" item_color = "chief" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/rank/atmospheric_technician desc = "It's a jumpsuit worn by atmospheric technicians." @@ -13,6 +14,7 @@ icon_state = "atmos" item_state = "atmos_suit" item_color = "atmos" + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/rank/engineer desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding." diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 42dae95f077..6d19ef1244f 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -37,6 +37,7 @@ item_state = "armor" can_adjust = 0 strip_delay = 100 + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/waiter name = "waiter's outfit" @@ -115,6 +116,7 @@ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT can_adjust = 0 + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/acj name = "administrative cybernetic jumpsuit" @@ -131,6 +133,7 @@ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT can_adjust = 0 + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/owl name = "owl uniform" @@ -338,6 +341,7 @@ body_parts_covered = CHEST|GROIN|ARMS fitted = NO_FEMALE_UNIFORM can_adjust = 0 + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/sundress name = "sundress" diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm index 1dda5f2ebd2..e828b3fe049 100644 --- a/code/modules/clothing/under/ties.dm +++ b/code/modules/clothing/under/ties.dm @@ -84,6 +84,7 @@ desc = "A bronze medal." icon_state = "bronze" item_color = "bronze" + burn_state = -1 //Won't burn in fires //Pinning medals on people /obj/item/clothing/tie/medal/attack(mob/living/carbon/human/M, mob/living/user) diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food&drinks/drinks/drinks.dm index 1f07766a523..21a17114618 100644 --- a/code/modules/food&drinks/drinks/drinks.dm +++ b/code/modules/food&drinks/drinks/drinks.dm @@ -10,6 +10,7 @@ var/gulp_size = 5 //This is now officially broken ... need to think of a nice way to fix it. possible_transfer_amounts = list(5,10,25) volume = 50 + burn_state = -1 /obj/item/weapon/reagent_containers/food/drinks/New() ..() diff --git a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm index 911362474c1..d145ef39fb3 100644 --- a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm @@ -6,6 +6,20 @@ icon_state = "glass_empty" amount_per_transfer_from_this = 10 volume = 50 + burn_state = 0 //Burnable + burntime = 5 + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fire_act() + if(!reagents.total_volume) + return + ..() + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/burn() + reagents.total_volume = 0 //Burns away all the alcohol :( + reagents.reagent_list.Cut() + on_reagent_change() + extinguish() + return /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change() overlays.Cut() diff --git a/code/modules/food&drinks/food.dm b/code/modules/food&drinks/food.dm index 20f54c684eb..5a7dbde5102 100644 --- a/code/modules/food&drinks/food.dm +++ b/code/modules/food&drinks/food.dm @@ -4,6 +4,7 @@ /obj/item/weapon/reagent_containers/food possible_transfer_amounts = null volume = 50 //Sets the default container amount for all food items. + burn_state = 0 //Burnable /obj/item/weapon/reagent_containers/food/New() ..() diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 38c9be4e471..8fe33dc7e58 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -20,6 +20,7 @@ icon = 'icons/obj/hydroponics/harvest.dmi' potency = -1 dried_type = -1 //bit different. saves us from having to define each stupid grown's dried_type as itself. If you don't want a plant to be driable (watermelons) set this to null in the time definition. + burn_state = 0 //Burnable /obj/item/weapon/reagent_containers/food/snacks/grown/New(newloc, new_potency = 50) ..() diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 07ee7c17a2e..f0ca0943691 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -5,6 +5,7 @@ /obj/item/weapon/grown // Grown weapons name = "grown_weapon" icon = 'icons/obj/hydroponics/harvest.dmi' + burn_state = 0 //Burnable var/seed = null var/plantname = "" var/product //a type path diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 0e491e575bf..662f76cb686 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -7,6 +7,7 @@ icon = 'icons/obj/hydroponics/seeds.dmi' icon_state = "seed" //Unknown plant seed - these shouldn't exist in-game. w_class = 1 //Pocketable. + burn_state = 0 //Burnable var/plantname = "Plants" //Name of plant when planted. var/product //A type path. The thing that is created when the plant is harvested. var/species = "" //Used to update icons. Should match the name in the sprites. diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index c3e1af939be..96dc3f1b9a1 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -17,6 +17,8 @@ anchored = 0 density = 1 opacity = 0 + burn_state = 0 //Burnable + burntime = 30 var/state = 0 var/list/allowed_books = list(/obj/item/weapon/book, /obj/item/weapon/spellbook, /obj/item/weapon/storage/book) //Things allowed in the bookcase @@ -165,6 +167,7 @@ throw_range = 5 w_class = 3 //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) attack_verb = list("bashed", "whacked", "educated") + burn_state = 0 //Burnable var/dat //Actual page content var/due_date = 0 //Game time in 1/10th seconds var/author //Who wrote the thing, can be changed by pen or PC. It is not automatically assigned diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index e9befa30d43..a8eefeb5bfc 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -8,6 +8,8 @@ force = 10.0 throwforce = 0 w_class = 4.0 + burn_state = 0 //Burnable + burntime = 20 /obj/item/weapon/moneybag/attack_hand(user as mob) var/amt_gold = 0 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 4117d85627e..525242cfb2d 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -443,31 +443,30 @@ var/shredded if(!bomb) - if(!max_heat_protection_temperature) + if(burn_state != -1) shredded = 1 //No heat protection, it burns else shredded = -1 //Heat protection = Fireproof else if(shock > 0) - if(prob(max(10,shock))) + if(prob(min(90,max(10,shock)))) shredded = armor["bomb"] + 10 //It gets shredded, but it also absorbs the shock the clothes underneath would recieve by this amount else shredded = -1 //It survives explosion - if(shredded) + if(shredded > 0) if(Human) //Unequip if equipped Human.unEquip(src) - for(var/obj/item/Item in contents) //Empty out the contents - Item.loc = src.loc - if(bomb) - var/obj/effect/decal/cleanable/shreds/Shreds = new(loc) - Shreds.name = "shredded [src]" - Shreds.desc = "The sad remains of what used to be a glorious [src]." + for(var/obj/item/Item in contents) //Empty out the contents + Item.loc = src.loc + spawn(1) //so the shreds aren't instantly deleted by the explosion + var/obj/effect/decal/cleanable/shreds/Shreds = new(loc) + Shreds.name = "shredded [src.name]" + Shreds.desc = "The sad remains of what used to be a glorious [src.name]." + qdel(src) else - new /obj/effect/decal/cleanable/ash(loc) - - qdel(src) + burn(0) return shredded \ No newline at end of file diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 8ae11c8f83c..46ddcd420fd 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -10,7 +10,7 @@ var/obj/item/weapon/pen/haspen //The stored pen. var/obj/item/weapon/paper/toppaper //The topmost piece of paper. slot_flags = SLOT_BELT - + burn_state = 0 //Burnable /obj/item/weapon/clipboard/New() update_icon() diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 6f725e04187..1e632fa976a 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -5,6 +5,7 @@ icon_state = "folder" w_class = 2 pressure_resistance = 2 + burn_state = 0 //Burnable /obj/item/weapon/folder/blue desc = "A blue folder." diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 4ed586cebd6..411f5de8522 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -18,6 +18,8 @@ pressure_resistance = 0 slot_flags = SLOT_HEAD body_parts_covered = HEAD + burn_state = 0 //Burnable + burntime = 5 var/info //What's actually written on the paper. var/info_links //A different version of the paper which includes html links at fields and EOF @@ -38,7 +40,7 @@ /obj/item/weapon/paper/update_icon() - if(burning) + if(burn_state == 1) icon_state = "paper_onfire" return if(info) @@ -271,7 +273,7 @@ /obj/item/weapon/paper/attackby(obj/item/weapon/P, mob/living/carbon/human/user, params) ..() - if(burning) + if(burn_state == 1) return if(is_blind(user)) @@ -318,33 +320,21 @@ user.unEquip(src) user.visible_message("[user] lights [src] ablaze with [P]!", "You light [src] on fire!") - paper_burn(0, 100) + fire_act() add_fingerprint(user) /obj/item/weapon/paper/fire_act() - paper_burn(1, 50) - -/obj/item/weapon/paper/proc/paper_burn(var/showmsg, var/burntime) - if (burning) - return - if(showmsg) - src.visible_message("[src] catches on fire.") - burning = 1 + ..(0) icon_state = "paper_onfire" info = "[stars(info)]" - spawn(burntime) //7 seconds - if(burning) - src.visible_message("[src] burns away, leaving behind a pile of ashes.") - new /obj/effect/decal/cleanable/ash(src.loc) - qdel(src) + /obj/item/weapon/paper/extinguish() - burning = 0 + ..() update_icon() - return /* * Premade paper diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index dd672a6d11c..568680b5d45 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -8,9 +8,20 @@ throw_speed = 3 throw_range = 7 pressure_resistance = 8 + burn_state = 0 //Burnable var/amount = 30 //How much paper is in the bin. var/list/papers = new/list() //List of papers put in the bin for reference. +/obj/item/weapon/paper_bin/fire_act() + if(!amount) + return + ..() + +/obj/item/weapon/paper_bin/burn() + amount = 0 + extinguish() + update_icon() + return /obj/item/weapon/paper_bin/MouseDrop(atom/over_object) var/mob/M = usr diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 0832ab226f3..d8312036260 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -17,7 +17,7 @@ icon_state = "film" item_state = "electropack" w_class = 1.0 - + burn_state = 0 //Burnable /* * Photo @@ -28,6 +28,8 @@ icon_state = "photo" item_state = "paper" w_class = 1.0 + burn_state = 0 //Burnable + burntime = 5 var/icon/img //Big photo image var/scribble //Scribble on the back. var/blueprints = 0 //Does it include the blueprints? @@ -92,7 +94,7 @@ icon_state = "album" item_state = "briefcase" can_hold = list(/obj/item/weapon/photo) - + burn_state = 0 //Burnable /* * Camera diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index eda94a40f33..5225e5a4d48 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -117,6 +117,7 @@ flags = NOBLUDGEON amount = 25 max_amount = 25 + burn_state = 0 //burnable /obj/item/stack/packageWrap/afterattack(var/obj/target as obj, mob/user as mob, proximity) diff --git a/html/changelogs/ikarrus-shredme.yml b/html/changelogs/ikarrus-shredme.yml new file mode 100644 index 00000000000..8e01db13def --- /dev/null +++ b/html/changelogs/ikarrus-shredme.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: Ikarrus + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Some objects can be burned now." + - rscadd: "Bombs will shred your clothes, with respect to their layering and armor values. Exterior clothing will shield clothing underneath. Storage items will drop their contents when bombed this way." \ No newline at end of file diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 62170e230e6ae4d432da5e15aa9ea931f00bb209..5102b40d59e40238718af6f984c0312a944f37a0 100644 GIT binary patch delta 15802 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%0D99Ys0%-aIPLHicH2^Nguu{?ek&b@j= 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 Q5rF>WrIn;gBu(D^e=~oUh5!Hn delta 15547 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 CrAr0? From 18098752ac069e60c89d656034e8c79256f08b6c Mon Sep 17 00:00:00 2001 From: Ikarrus Date: Sat, 27 Jun 2015 01:12:54 -0600 Subject: [PATCH 34/57] Gang Tweaks - Gang Lieutenants can buy gang tools now, but at a higher cost than the original boss - Gang leaders can register additional gangtools to themselves for use as spares. - Number of maximum lieutenants lowered to 2 - Pistol cost increased to 25 influence - Uzi cost increased to 50 influence - Uzi Ammo decreased to 20 influence - Overcoats added to items the biogenerator can produce. - Domination attempts reduced to 2 - Gang dominator time bonuses cannot reduce it lower than 5 minutes - Showers will clean off lipstick and face paint --- code/game/gamemodes/gang/gang.dm | 8 +-- code/game/gamemodes/gang/recaller.dm | 62 +++++++++++---------- code/game/objects/structures/watercloset.dm | 10 +++- code/modules/hydroponics/biogenerator.dm | 4 ++ html/changelogs/ikarrus-gangnerf.yml | 42 ++++++++++++++ 5 files changed, 90 insertions(+), 36 deletions(-) create mode 100644 html/changelogs/ikarrus-gangnerf.yml diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index 1ccf81b290c..b76a968bf97 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -32,8 +32,8 @@ var/A_timer = "OFFLINE" var/B_timer = "OFFLINE" //How many attempts at domination each team is allowed - var/A_dominations = 3 - var/B_dominations = 3 + var/A_dominations = 2 + var/B_dominations = 2 /////////////////////////// //Announces the game type// /////////////////////////// @@ -508,7 +508,7 @@ ticker.mode.message_gangtools(ticker.mode.A_tools,"*---------*
[gang_name("A")] Gang Status Report:") var/A_message = "" if(gangmode && isnum(gangmode.A_timer)) - var/new_time = max(180,gangmode.A_timer - ((ticker.mode.A_territory.len + A_uniformed) * 2)) + var/new_time = max(300,gangmode.A_timer - ((ticker.mode.A_territory.len + A_uniformed) * 2)) if(new_time < gangmode.A_timer) A_message += "Takeover shortened by [gangmode.A_timer - new_time] seconds for defending [ticker.mode.A_territory.len] territories and [A_uniformed] uniformed gangsters.
" gangmode.A_timer = new_time @@ -524,7 +524,7 @@ ticker.mode.message_gangtools(ticker.mode.B_tools,"[gang_name("B")] Gang Status Report:") var/B_message = "" if(gangmode && isnum(gangmode.B_timer)) - var/new_time = max(180,gangmode.B_timer - ((ticker.mode.B_territory.len + B_uniformed) * 2)) + var/new_time = max(300,gangmode.B_timer - ((ticker.mode.B_territory.len + B_uniformed) * 2)) if(new_time < gangmode.B_timer) A_message += "Takeover shortened by [gangmode.B_timer - new_time] seconds for defending [ticker.mode.B_territory.len] territories and [B_uniformed] uniformed gangsters.
" gangmode.B_timer = new_time diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index 6f586dc5764..baa02a88234 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -10,9 +10,8 @@ throw_range = 7 flags = CONDUCT var/gang //Which gang uses this? - var/boss = 1 //If it has the power to promote gang members + var/boss = 1 //Is this the original boss? var/recalling = 0 - var/promotions = 0 var/outfits = 3 var/free_pen = 0 @@ -29,17 +28,21 @@ var/dat if(!gang) - dat += "This device is not registered.
" + dat += "This device is not registered.

" if(user.mind in (ticker.mode.A_bosses | ticker.mode.B_bosses)) - dat += "Give this device to another member of your organization to use.
" + dat += "Give this device to another member of your organization to use to promote them.


" + dat += "If this is meant as a spare device for yourself:
" + dat += "Register Device
" else + dat += "You have been selected for a promotion!
" dat += "Register Device
" else var/datum/game_mode/gang/gangmode if(istype(ticker.mode, /datum/game_mode/gang)) gangmode = ticker.mode - var/gang_size = ((gang == "A")? (ticker.mode.A_gang.len + ticker.mode.A_bosses.len) : (ticker.mode.B_gang.len + ticker.mode.B_bosses.len)) + var/gang_bosses = ((gang == "A")? ticker.mode.A_bosses.len : ticker.mode.B_bosses.len) + var/gang_size = gang_bosses + ((gang == "A")? ticker.mode.A_gang.len : ticker.mode.B_gang.len) var/gang_territory = ((gang == "A")? ticker.mode.A_territory.len : ticker.mode.B_territory.len) var/points = ((gang == "A") ? ticker.mode.gang_points.A : ticker.mode.gang_points.B) var/timer @@ -72,8 +75,8 @@ else dat += "Switchblade
" - dat += "(20 Influence) " - if(points >= 20) + dat += "(25 Influence) " + if(points >= 25) dat += "10mm Pistol
" else dat += "10mm Pistol
" @@ -84,14 +87,14 @@ else dat += "10mm Ammo
" - dat += "(40 Influence) " - if(points >= 40) + dat += "(50 Influence) " + if(points >= 50) dat += "Mini Uzi
" else dat += "Mini Uzi
" - dat += "(25 Influence) " - if(points >= 25) + dat += "(20 Influence) " + if(points >= 20) dat += "Uzi Ammo
" else dat += "Uzi Magazine
" @@ -120,15 +123,16 @@ else dat += "Recruitment Pen
" - if(boss) - if(promotions >= 3) - dat += "(Out of stock) Promote a Gangster
" - else - dat += "([(promotions*10)+10] Influence, [3-promotions] left) " - if(points >= (promotions*10)+10) - dat += "Promote a Gangster
" - else - dat += "Promote a Gangster
" + var/tool_cost = (boss ? 10 : 30) + var/gangtooldesc = "Promote a Gangster ([3-gang_bosses] left)" + if(gang_bosses >= 3) + gangtooldesc = "Additional Gangtools" + dat += "([tool_cost] Influence) " + if(points >= tool_cost) + dat += "[gangtooldesc]
" + else + dat += "[gangtooldesc]
" + if(gangmode) if(gang == "A" ? !gangmode.A_dominations : !gangmode.B_dominations) dat += "(Out of stock) Station Dominator" @@ -178,21 +182,21 @@ item_type = /obj/item/weapon/switchblade points = 10 if("pistol") - if(points >= 20) + if(points >= 25) item_type = /obj/item/weapon/gun/projectile/automatic/pistol - points = 20 + points = 25 if("10mmammo") if(points >= 10) item_type = /obj/item/ammo_box/magazine/m10mm points = 10 if("uzi") - if(points >= 40) + if(points >= 50) item_type = /obj/item/weapon/gun/projectile/automatic/mini_uzi - points = 40 + points = 50 if("9mmammo") - if(points >= 25) + if(points >= 20) item_type = /obj/item/ammo_box/magazine/uzim9mm - points = 25 + points = 20 if("C4") if(points >= 10) item_type = /obj/item/weapon/c4 @@ -206,10 +210,10 @@ item_type = /obj/item/weapon/pen/gang points = 50 if("gangtool") - if((promotions < 3) && (points >= (promotions*10)+10)) + var/tool_cost = (boss ? 10 : 30) + if(points >= tool_cost) item_type = /obj/item/device/gangtool/lt - points = (promotions*10)+10 - promotions++ + points = tool_cost if("dominator") if(istype(ticker.mode, /datum/game_mode/gang)) var/datum/game_mode/gang/mode = ticker.mode diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index d62a69d769f..bfeb9ce6108 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -284,9 +284,13 @@ if(H.shoes && washshoes) if(H.shoes.clean_blood()) H.update_inv_shoes(0) - if(H.wear_mask && washmask) - if(H.wear_mask.clean_blood()) - H.update_inv_wear_mask(0) + if(H.wear_mask) + if(washmask) + if(H.wear_mask.clean_blood()) + H.update_inv_wear_mask(0) + else + H.lip_style = null + H.update_body() if(H.glasses && washglasses) if(H.glasses.clean_blood()) H.update_inv_glasses(0) diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index ba32bb2c6ff..bec34b1c197 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -169,6 +169,7 @@ dat += "Shoulder holster: Make ([400/efficiency])
" dat += "Leather Satchel: Make ([400/efficiency])
" dat += "Leather Jacket: Make ([500/efficiency])
" + dat += "Leather Overcoat: Make ([1000/efficiency])
" dat += "" else dat += "
No container inside, please insert container.
" @@ -301,6 +302,9 @@ if("jacket") if (check_cost(500/efficiency)) return 0 else new/obj/item/clothing/suit/jacket/leather(src.loc) + if("overcoat") + if (check_cost(1000/efficiency)) return 0 + else new/obj/item/clothing/suit/jacket/leather/overcoat(src.loc) //if("monkey") // if (check_cost(500)) return 0 // else new/mob/living/carbon/monkey(src.loc) diff --git a/html/changelogs/ikarrus-gangnerf.yml b/html/changelogs/ikarrus-gangnerf.yml new file mode 100644 index 00000000000..2061aa19b38 --- /dev/null +++ b/html/changelogs/ikarrus-gangnerf.yml @@ -0,0 +1,42 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: Ikarrus + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Gang Lieutenants can buy gang tools now, but at a higher cost than the original boss" + - rscadd: "Gang leaders can register additional gangtools to themselves for use as spares." + - tweak: "Number of maximum lieutenants lowered to 2" + - tweak: "Pistol cost increased to 25 influence" + - tweak: "Uzi cost increased to 50 influence" + - tweak: "Uzi Ammo decreased to 20 influence" + - rscadd: "Overcoats added to items the biogenerator can produce." \ No newline at end of file From 5e27cc1fec884c8dfc92fdb4c093dcdb8b6e3767 Mon Sep 17 00:00:00 2001 From: Jordie Date: Sat, 27 Jun 2015 20:49:37 +1000 Subject: [PATCH 35/57] fixes syringe filling with < 3 volume --- code/modules/reagents/reagent_containers/syringes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index ad9c064c873..61dae7c6c2c 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -180,7 +180,7 @@ /obj/item/weapon/reagent_containers/syringe/update_icon() - var/rounded_vol = min(round(reagents.total_volume,5), 15) + var/rounded_vol = min(max(round(reagents.total_volume,5),5),15) overlays.Cut() if(ismob(loc)) var/injoverlay From 59ca40f03d1c9be6bd73090ce274ccc5af8b079a Mon Sep 17 00:00:00 2001 From: Ikarrus Date: Sat, 27 Jun 2015 09:22:14 -0600 Subject: [PATCH 36/57] Burning objects are processed every tick now instead of using a spawn() check --- code/controllers/subsystem/objects.dm | 9 +++++++-- code/game/objects/objs.dm | 15 +++++++-------- code/modules/clothing/clothing.dm | 8 ++++++-- code/modules/mob/living/carbon/human/inventory.dm | 2 +- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/code/controllers/subsystem/objects.dm b/code/controllers/subsystem/objects.dm index ccd49428120..35236b38fb6 100644 --- a/code/controllers/subsystem/objects.dm +++ b/code/controllers/subsystem/objects.dm @@ -9,6 +9,7 @@ var/datum/subsystem/objects/SSobj priority = 12 var/list/processing = list() + var/list/burning = list() /datum/subsystem/objects/New() NEW_SS_GLOBAL(SSobj) @@ -37,5 +38,9 @@ var/datum/subsystem/objects/SSobj ++i continue SSobj.processing.Cut(i, i+1) - - + for(var/obj/burningobj in SSobj.burning) + if(burningobj && (burningobj.burn_state == 1)) + if(burningobj.burn_world_time < world.time) + burningobj.burn() + else + SSobj.burning -= burningobj \ No newline at end of file diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 9eb1d4258ac..51df368a08f 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -11,6 +11,7 @@ var/burn_state = -1 // -1=fireproof | 0=will burn in fires | 1=currently on fire var/burntime = 10 //How long it takes to burn to ashes, in seconds + var/burn_world_time //What world time the object will burn up completely /obj/Destroy() if(!istype(src, /obj/machinery)) @@ -163,23 +164,21 @@ /obj/fire_act(var/global_overlay=1) if(!burn_state) burn_state = 1 + SSobj.burning += src + burn_world_time = world.time + burntime*10 if(global_overlay) overlays += fire_overlay - spawn(burntime*10) - if(burn_state == 1) - burn() + return 1 -/obj/proc/burn(var/visible=1) +/obj/proc/burn() for(var/obj/item/Item in contents) //Empty out the contents Item.loc = src.loc Item.fire_act() //Set them on fire, too - - if(visible) - src.visible_message("[src] burns away, leaving behind a pile of ashes.") new /obj/effect/decal/cleanable/ash(src.loc) qdel(src) /obj/proc/extinguish() if(burn_state == 1) burn_state = 0 - overlays -= fire_overlay \ No newline at end of file + overlays -= fire_overlay + SSobj.burning -= src \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index c655ee34d45..e410f6dde59 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,5 +1,6 @@ /obj/item/clothing name = "clothing" + burn_state = 0 //Burnable var/flash_protect = 0 //Malk: What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS var/tint = 0 //Malk: Sets the item's level of visual impairment tint, normally set to the same as flash_protect var/up = 0 // but seperated to allow items to protect but not impair vision, like space helmets @@ -23,6 +24,7 @@ w_class = 1.0 throwforce = 0 slot_flags = SLOT_EARS + burn_state = -1 //Not Burnable /obj/item/clothing/ears/earmuffs name = "earmuffs" @@ -32,7 +34,7 @@ flags = EARBANGPROTECT strip_delay = 15 put_on_delay = 25 - + burn_state = 0 //Burnable //Glasses /obj/item/clothing/glasses @@ -48,7 +50,7 @@ var/list/icon/current = list() //the current hud icons strip_delay = 20 put_on_delay = 25 - + burn_state = -1 //Not Burnable /* SEE_SELF // can see self, no matter what SEE_MOBS // can see all mobs, no matter what @@ -180,6 +182,7 @@ BLIND // can't see anything strip_delay = 50 put_on_delay = 50 flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + burn_state = -1 //Not Burnable /obj/item/clothing/suit/space name = "space suit" @@ -201,6 +204,7 @@ BLIND // can't see anything max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT strip_delay = 80 put_on_delay = 80 + burn_state = -1 //Not Burnable //Under clothing /obj/item/clothing/under diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 525242cfb2d..a4c1a29a2aa 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -467,6 +467,6 @@ Shreds.desc = "The sad remains of what used to be a glorious [src.name]." qdel(src) else - burn(0) + burn() return shredded \ No newline at end of file From 436099550bc3935bfb2d337b2a172e6ebbfb3577 Mon Sep 17 00:00:00 2001 From: Ikarrus Date: Sat, 27 Jun 2015 09:45:30 -0600 Subject: [PATCH 37/57] Additional Tweaks --- code/game/gamemodes/gang/gang.dm | 6 +++--- code/game/gamemodes/gang/recaller.dm | 13 +++++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index b76a968bf97..2b27a847e36 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -439,8 +439,8 @@ ////////////////////////////////////////////////////////// /datum/gang_points - var/A = 20 - var/B = 20 + var/A = 15 + var/B = 15 var/next_point_interval = 1800 var/next_point_time @@ -578,7 +578,7 @@ //Increase outfit stock for(var/obj/item/device/gangtool/tool in (ticker.mode.A_tools | ticker.mode.B_tools)) - tool.outfits = min(tool.outfits+2,10) + tool.outfits = min(tool.outfits+2,5) //Restart the counter start() diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index baa02a88234..7e0b5f25129 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -26,6 +26,8 @@ if (!can_use(user)) return + var/gang_bosses = ((gang == "A")? ticker.mode.A_bosses.len : ticker.mode.B_bosses.len) + var/dat if(!gang) dat += "This device is not registered.

" @@ -33,15 +35,16 @@ dat += "Give this device to another member of your organization to use to promote them.
" dat += "If this is meant as a spare device for yourself:
" dat += "Register Device
" - else + else if (gang_bosses < 3) dat += "You have been selected for a promotion!
" dat += "Register Device
" + else + dat += "No promotions available: All positions filled." else var/datum/game_mode/gang/gangmode if(istype(ticker.mode, /datum/game_mode/gang)) gangmode = ticker.mode - var/gang_bosses = ((gang == "A")? ticker.mode.A_bosses.len : ticker.mode.B_bosses.len) var/gang_size = gang_bosses + ((gang == "A")? ticker.mode.A_gang.len : ticker.mode.B_gang.len) var/gang_territory = ((gang == "A")? ticker.mode.A_territory.len : ticker.mode.B_territory.len) var/points = ((gang == "A") ? ticker.mode.gang_points.A : ticker.mode.gang_points.B) @@ -292,6 +295,12 @@ /obj/item/device/gangtool/proc/register_device(var/mob/user) + if(!(user.mind in (ticker.mode.B_bosses|ticker.mode.B_bosses))) + var/gang_bosses = ((gang == "A")? ticker.mode.A_bosses.len : ticker.mode.B_bosses.len) + if(gang_bosses >= 3) + user << "\icon[src] Error: All positions filled." + return + if(jobban_isbanned(user, "gangster") || jobban_isbanned(user, "Syndicate")) user << "\icon[src] ACCESS DENIED: Blacklisted user." return 0 From 82baeb49dba198c9b70fb39f7dc0e65b4d9c9b1b Mon Sep 17 00:00:00 2001 From: LaharlMontogmmery Date: Sat, 27 Jun 2015 19:29:52 +0200 Subject: [PATCH 38/57] Fixing up the DME a bit. --- tgstation.dme | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tgstation.dme b/tgstation.dme index 98922e497d9..e12b699a33c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -141,6 +141,7 @@ #include "code\controllers\subsystem\shuttles.dm" #include "code\controllers\subsystem\sun.dm" #include "code\controllers\subsystem\ticker.dm" +#include "code\controllers\subsystem\timer.dm" #include "code\controllers\subsystem\voting.dm" #include "code\controllers\subsystem\shuttles\emergency.dm" #include "code\controllers\subsystem\shuttles\supply.dm" @@ -328,6 +329,7 @@ #include "code\game\gamemodes\extended\extended.dm" #include "code\game\gamemodes\gang\dominator.dm" #include "code\game\gamemodes\gang\gang.dm" +#include "code\game\gamemodes\gang\gang_pen.dm" #include "code\game\gamemodes\gang\recaller.dm" #include "code\game\gamemodes\malfunction\Malf_Modules.dm" #include "code\game\gamemodes\malfunction\malfunction.dm" @@ -1025,8 +1027,13 @@ #include "code\modules\food&drinks\recipes\tablecraft\recipes_sandwich.dm" #include "code\modules\food&drinks\recipes\tablecraft\recipes_soup.dm" #include "code\modules\food&drinks\recipes\tablecraft\recipes_spaghetti.dm" +#include "code\modules\games\cards.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\holidays.dm" +#include "code\modules\html_interface\html_interface.dm" +#include "code\modules\html_interface\html_interface_client.dm" +#include "code\modules\html_interface\cards\cards.dm" +#include "code\modules\html_interface\nanotrasen\nanotrasen.dm" #include "code\modules\hydroponics\biogenerator.dm" #include "code\modules\hydroponics\grown.dm" #include "code\modules\hydroponics\growninedible.dm" @@ -1038,6 +1045,7 @@ #include "code\modules\library\lib_machines.dm" #include "code\modules\library\lib_readme.dm" #include "code\modules\lighting\lighting_system.dm" +#include "code\modules\mining\abandoned_crates.dm" #include "code\modules\mining\equipment_locker.dm" #include "code\modules\mining\machine_input_output_plates.dm" #include "code\modules\mining\machine_processing.dm" From 2dc17294cda0957f2b63c83ca4069b6c42e2018e Mon Sep 17 00:00:00 2001 From: sybil-tgstation13 Date: Sat, 27 Jun 2015 13:35:40 -0400 Subject: [PATCH 39/57] Automatic changelog compile --- html/changelog.html | 16 ++++++++++ html/changelogs/.all_changelog.yml | 12 ++++++++ html/changelogs/NullQuery-Nullstation.yml | 6 ---- html/changelogs/ikarrus-shredme.yml | 37 ----------------------- html/changelogs/vekter-10159.yml | 36 ---------------------- 5 files changed, 28 insertions(+), 79 deletions(-) delete mode 100644 html/changelogs/NullQuery-Nullstation.yml delete mode 100644 html/changelogs/ikarrus-shredme.yml delete mode 100644 html/changelogs/vekter-10159.yml diff --git a/html/changelog.html b/html/changelog.html index 929ed44f31f..ca017facb8f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,22 @@ -->
+

27 June 2015

+

Ikarrus updated:

+
    +
  • Some objects can be burned now.
  • +
  • Bombs will shred your clothes, with respect to their layering and armor values. Exterior clothing will shield clothing underneath. Storage items will drop their contents when bombed this way.
  • +
+

NullQuery updated:

+
    +
  • Introduces html_interface, a module to streamline the management of browser windows.
  • +
  • Adds playing cards that utilize a new HTML window management system.
  • +
+

Vekter updated:

+
    +
  • Added a new military jacket to the Autodrobe and ClothesMate.
  • +
+

26 June 2015

Ikarrus updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index c9ad089f910..fc35b92ba54 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2981,3 +2981,15 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. pudl: - rscadd: You can now play games of mastermind to unlock abandoned crates found throughout space. +2015-06-27: + Ikarrus: + - rscadd: Some objects can be burned now. + - rscadd: Bombs will shred your clothes, with respect to their layering and armor + values. Exterior clothing will shield clothing underneath. Storage items will + drop their contents when bombed this way. + NullQuery: + - wip: Introduces html_interface, a module to streamline the management of browser + windows. + - rscadd: Adds playing cards that utilize a new HTML window management system. + Vekter: + - rscadd: Added a new military jacket to the Autodrobe and ClothesMate. diff --git a/html/changelogs/NullQuery-Nullstation.yml b/html/changelogs/NullQuery-Nullstation.yml deleted file mode 100644 index 981bb1c1d36..00000000000 --- a/html/changelogs/NullQuery-Nullstation.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: NullQuery -delete-after: True - -changes: - - wip: "Introduces html_interface, a module to streamline the management of browser windows." - - rscadd: "Adds playing cards that utilize a new HTML window management system." diff --git a/html/changelogs/ikarrus-shredme.yml b/html/changelogs/ikarrus-shredme.yml deleted file mode 100644 index 8e01db13def..00000000000 --- a/html/changelogs/ikarrus-shredme.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# spellcheck (typo fixes) -# experiment -# tgs (TG-ported fixes?) -################################# - -# Your name. -author: Ikarrus - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. -# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Some objects can be burned now." - - rscadd: "Bombs will shred your clothes, with respect to their layering and armor values. Exterior clothing will shield clothing underneath. Storage items will drop their contents when bombed this way." \ No newline at end of file diff --git a/html/changelogs/vekter-10159.yml b/html/changelogs/vekter-10159.yml deleted file mode 100644 index f99d832a38c..00000000000 --- a/html/changelogs/vekter-10159.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# spellcheck (typo fixes) -# experiment -# tgs (TG-ported fixes?) -################################# - -# Your name. -author: Vekter - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. -# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Added a new military jacket to the Autodrobe and ClothesMate." From 1e842dfade490d10910614619c4300f0e23bdafb Mon Sep 17 00:00:00 2001 From: sybil-tgstation13 Date: Sat, 27 Jun 2015 13:39:20 -0400 Subject: [PATCH 40/57] Automatic changelog compile --- html/changelog.html | 5 +++ html/changelogs/.all_changelog.yml | 7 ++++ .../Laharl Montogmmery-PR-10076.yml | 37 ------------------- 3 files changed, 12 insertions(+), 37 deletions(-) delete mode 100644 html/changelogs/Laharl Montogmmery-PR-10076.yml diff --git a/html/changelog.html b/html/changelog.html index ca017facb8f..ac787eb629e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -61,6 +61,11 @@
  • Some objects can be burned now.
  • Bombs will shred your clothes, with respect to their layering and armor values. Exterior clothing will shield clothing underneath. Storage items will drop their contents when bombed this way.
+

Laharl Montogmmery updated:

+
    +
  • Click and drag from a bag/stachel/Storage Object to dump his contents on a tile near you. You can do so into another storage item, a bin, or the ground/table if there's nothing else.
  • +
  • Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7 tiles.
  • +

NullQuery updated:

  • Introduces html_interface, a module to streamline the management of browser windows.
  • diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index fc35b92ba54..02fc923c03c 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2987,6 +2987,13 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Bombs will shred your clothes, with respect to their layering and armor values. Exterior clothing will shield clothing underneath. Storage items will drop their contents when bombed this way. + Laharl Montogmmery: + - rscadd: Click and drag from a bag/stachel/Storage Object to dump his contents + on a tile near you. You can do so into another storage item, a bin, or the ground/table + if there's nothing else. + - rscadd: 'Storage Content Transfer : Bluespace Boogaloo! You can now transfer the + content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7 + tiles.' NullQuery: - wip: Introduces html_interface, a module to streamline the management of browser windows. diff --git a/html/changelogs/Laharl Montogmmery-PR-10076.yml b/html/changelogs/Laharl Montogmmery-PR-10076.yml deleted file mode 100644 index 20bc33c09fc..00000000000 --- a/html/changelogs/Laharl Montogmmery-PR-10076.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# spellcheck (typo fixes) -# experiment -# tgs (TG-ported fixes?) -################################# - -# Your name. -author: Laharl Montogmmery - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. -# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Click and drag from a bag/stachel/Storage Object to dump his contents on a tile near you. You can do so into another storage item, a bin, or the ground/table if there's nothing else." - - rscadd: "Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7 tiles." \ No newline at end of file From 352500d341e7c980309a4d4a1f66b9c120870133 Mon Sep 17 00:00:00 2001 From: Xhuis Date: Sat, 27 Jun 2015 15:32:54 -0400 Subject: [PATCH 41/57] Sprites bo staff, adds custom martial art --- code/datums/martial.dm | 170 +++++++++++++++++++++++--- code/game/gamemodes/gang/recaller.dm | 16 +-- icons/mob/inhands/items_lefthand.dmi | Bin 97239 -> 97989 bytes icons/mob/inhands/items_righthand.dmi | Bin 95930 -> 96558 bytes icons/obj/weapons.dmi | Bin 32403 -> 32686 bytes icons/obj/wizard.dmi | Bin 10556 -> 10563 bytes 6 files changed, 163 insertions(+), 23 deletions(-) diff --git a/code/datums/martial.dm b/code/datums/martial.dm index bbe9d4cc370..8c5c136980e 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -265,7 +265,132 @@ return 1 +//Used by the gang of the same name. Uses combos. Basic attacks bypass armor and never miss +#define WRIST_WRENCH_COMBO "DD" +#define BACK_KICK_COMBO "HG" +#define STOMACH_KNEE_COMBO "GH" +#define HEAD_KICK_COMBO "DHH" +#define ELBOW_DROP_COMBO "HDHDH" +/datum/martial_art/the_sleeping_carp + name = "The Sleeping Carp" + +/datum/martial_art/the_sleeping_carp/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + if(findtext(streak,WRIST_WRENCH_COMBO)) + streak = "" + wristWrench(A,D) + return 1 + if(findtext(streak,BACK_KICK_COMBO)) + streak = "" + backKick(A,D) + return 1 + if(findtext(streak,STOMACH_KNEE_COMBO)) + streak = "" + kneeStomach(A,D) + return 1 + if(findtext(streak,HEAD_KICK_COMBO)) + streak = "" + headKick(A,D) + return 1 + if(findtext(streak,ELBOW_DROP_COMBO)) + streak = "" + elbowDrop(A,D) + return 1 + return 0 + +/datum/martial_art/the_sleeping_carp/proc/wristWrench(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + if(!D.stat && !D.stunned && !D.weakened) + D.visible_message("[A] grabs [D]'s wrist and wrenches it sideways!", \ + "[A] grabs your wrist and violently wrenches it to the side!") + playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + D.emote("scream") + D.drop_item() + D.apply_damage(5, BRUTE, pick("l_arm", "r_arm")) + D.Stun(2) + return 1 + return basic_hit(A,D) + +/datum/martial_art/the_sleeping_carp/proc/backKick(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + if(A.dir == D.dir && !D.stat && !D.weakened) + D.visible_message("[A] kicks [D] in the back!", \ + "[A] kicks you in the back, making you stumble and fall!") + step_to(D,get_step(D,D.dir),1) + D.Weaken(4) + playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) + return 1 + return basic_hit(A,D) + +/datum/martial_art/the_sleeping_carp/proc/kneeStomach(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + if(!D.stat && !D.weakened) + D.visible_message("[A] knees [D] in the stomach!", \ + "[A] winds you with a knee in the stomach!") + D.audible_message("[D] gags!") + D.losebreath += 3 + D.Stun(1) + playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) + return 1 + return basic_hit(A,D) + +/datum/martial_art/the_sleeping_carp/proc/headKick(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + if(!D.stat && !D.weakened) + D.visible_message("[A] kicks [D] in the head!", \ + "[A] kicks you in the jaw!") + D.apply_damage(20, BRUTE, "head") + D.drop_item() + playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1) + return 1 + return basic_hit(A,D) + +/datum/martial_art/the_sleeping_carp/proc/elbowDrop(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + if(D.weakened || D.resting || D.stat) + D.visible_message("[A] elbow drops [D]!", \ + "[A] piledrives you with their elbow!") + if(D.stat) + D.death() //FINISH HIM! + D.apply_damage(50, BRUTE, "chest") + playsound(get_turf(D), 'sound/weapons/punch1.ogg', 100, 1, -1) + return 1 + return basic_hit(A,D) + +/datum/martial_art/the_sleeping_carp/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + add_to_streak("G") + if(check_streak(A,D)) + return 1 + ..() + var/obj/item/weapon/grab/G = A.get_active_hand() + if(G) + G.state = GRAB_AGGRESSIVE //Instant aggressive grab + +/datum/martial_art/the_sleeping_carp/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + add_to_streak("H") + if(check_streak(A,D)) + return 1 + D.visible_message("[A] [pick("punches", "kicks", "chops", "hits", "slams")] [D]!", \ + "[A] hits you!") + D.apply_damage(10, BRUTE) + playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) + return 1 + + +/datum/martial_art/the_sleeping_carp/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) + add_to_streak("D") + if(check_streak(A,D)) + return 1 + return ..() + +/mob/living/carbon/human/proc/sleeping_carp_help() + set name = "Recall Teachings" + set desc = "Remember the martial techniques of the Sleeping Carp clan." + set category = "Sleeping Carp" + + usr << "You retreat inward and recall the teachings of the Sleeping Carp..." + usr << "Wrist Wrench: Disarm Disarm. Forces opponent to drop item in hand." + usr << "Back Kick: Harm Grab. Opponent must be facing away. Knocks down." + usr << "Stomach Knee: Grab Harm. Knocks the wind out of opponent and stuns." + usr << "Head Kick: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand." + usr << "Elbow Drop: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition." + //ITEMS + /obj/item/clothing/gloves/boxing var/datum/martial_art/boxing/style = new @@ -306,8 +431,8 @@ return /obj/item/weapon/plasma_fist_scroll - name = "Plasma Fist Scroll" - desc = "Teaches the traditional wizard martial art." + name = "frayed scroll" + desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism." icon = 'icons/obj/wizard.dmi' icon_state ="scroll2" var/used = 0 @@ -319,22 +444,36 @@ var/mob/living/carbon/human/H = user var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null) F.teach(H) - H << "You read through the scroll and realize you know the secrets of the Plasma Fist." - if(istype(src, /obj/item/weapon/plasma_fist_scroll/oneuse)) - H.drop_item() - visible_message("[src] lights up in fire and quickly burns to ash.") - new /obj/effect/decal/cleanable/ash(get_turf(src)) - qdel(src) + H << "You have learned the ancient martial art of Plasma Fist." used = 1 - desc += "It looks like it's magic was used up." + desc = "It's completely blank." + name = "empty scroll" + icon_state = "blankscroll" -/obj/item/weapon/plasma_fist_scroll/oneuse +/obj/item/weapon/sleeping_carp_scroll name = "mysterious scroll" desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art." + icon = 'icons/obj/wizard.dmi' + icon_state = "scroll2" + +/obj/item/weapon/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user as mob) + if(!istype(user) || !user) + return + user << "You begin to read the scroll..." + user << "And all at once the secrets of the Sleeping Carp fill your mind. The ancient clan's martial teachings have been imbued into this scroll. As you read through it, \ + these secrets flood into your mind and body. You now know the martial techniques of the Sleeping Carp. Your hand-to-hand combat has become much more effective, and you may now perform powerful \ + combination attacks. To learn more about these combos, use the Recall Teachings ability in the Sleeping Carp tab." + user.verbs += /mob/living/carbon/human/proc/sleeping_carp_help + var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null) + theSleepingCarp.teach(user) + user.drop_item() + visible_message("[src] lights up in fire and quickly burns to ash.") + new /obj/effect/decal/cleanable/ash(get_turf(src)) + qdel(src) /obj/item/weapon/twohanded/bostaff name = "bo staff" - desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts." + desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate." force = 10 w_class = 4 slot_flags = SLOT_BACK @@ -343,17 +482,18 @@ throwforce = 20 throw_speed = 2 attack_verb = list("smashed", "slammed", "whacked", "thwacked") - icon_state = "spearglass0" //temp + icon = 'icons/obj/weapons.dmi' + icon_state = "bostaff0" -/obj/item/weapon/twohanded/bostaff/update_icon() //temp - icon_state = "spearglass[wielded]" +/obj/item/weapon/twohanded/bostaff/update_icon() + icon_state = "bostaff[wielded]" return /obj/item/weapon/twohanded/bostaff/attack(mob/target, mob/living/user) add_fingerprint(user) if((CLUMSY in user.disabilities) && prob(50)) user << "You club yourself over the head with [src]." - user.Weaken(3 * force) + user.Weaken(3) if(ishuman(user)) var/mob/living/carbon/human/H = user H.apply_damage(2*force, BRUTE, "head") diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index 48458ee8230..0dc5f97243f 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -120,11 +120,11 @@ else dat += "Wrestling Belt
    " - dat += "(50 Influence) " - if(points >= 50) - dat += "Plasma Fist Scroll (one-use)
    " + dat += "(30 Influence) " + if(points >= 30) + dat += "Sleeping Carp Scroll (one-use)
    " else - dat += "Plasma Fist Scroll (one-use)
    " + dat += "Sleeping Carp Scroll (one-use)
    " dat += "
    " //////////////////////// @@ -223,10 +223,10 @@ if(points >= 40) item_type = /obj/item/weapon/gun/projectile/automatic/mini_uzi points = 40 - if("plasmafist") - if(points >= 50) - item_type = /obj/item/weapon/plasma_fist_scroll/oneuse - points = 50 + if("scroll") + if(points >= 30) + item_type = /obj/item/weapon/sleeping_carp_scroll + points = 30 if("wrestlingbelt") if(points >= 20) item_type = /obj/item/weapon/storage/belt/champion/wrestling diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 6db0ab5709ae8110538e7df877e16fbb107bc665..79dba919f264e2d0633e685183d4ba0507fc54b1 100644 GIT binary patch delta 15930 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 *ldTk-V* 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 delta 15158 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 diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 83986fd1ae815268ea07c7f4601619e4aad31069..d0e6e69563b676c10d3f8f06cd1998ae3cc46c55 100644 GIT binary patch delta 14257 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 z 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 Dn`@!e delta 13766 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 diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index bd9e5cc7e605bea74dcd5cd6f7c5636bb68c6725..47a2d13262c2d369dbebbb66ae2992e793c8cc9a 100644 GIT binary patch delta 12411 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 HSp@uFIICpm diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index 3624a9b4bffcad0689bea9285ac66af601bcc331..c2f7bfcc2025eb9199f462a596db5e0aef8d03eb 100644 GIT binary patch delta 305 zcmV-10nYxsQo~Y^B!3!uR9JLGWpiV4X>fFDZ*Bkpc$}4!L2kn!5JlJK6r*H|s+zb` zH{Mi^Dld{d5E$Di7^;E9?d`j;lsJto+#N{o|3AzOTlm<2)<>ugHM=4O;~kVxyu7k( zFgkWn!cMTPL(_I~yo4wtLJ6A<%e0{YCFCq?NcK3MZ@|e)cYh9wytPU8UzkX8NuZal zQT;qtuuP+sKTtx>bDr~@WrTxq`q85?geN(zx|q0#2ba4_68YgSd7nsje}d;@$I|tD z?Qc)DFWH1Bn1%gC$#;?NE_l*W0U+3x8v>s|6QaaKW~)KUPp3YW53$QWb_z-;?ySKmq(G DO;M8m delta 298 zcmV+_0oDG)QoK@-B!3fnR9JLGWpiV4X>fFDZ*Bkpc$}q^&5FYy5XaB@6hnKJWn;6j zmt0Cp$)SA*tCK`9x{S8zzWp8o+jN_dz}^&o{|`sq!v1iq&QP8zenW~jcqkx$d*`gT zCbdw&PIA_wZQ3+!Vp0jAfX#+8V<|!b8D}-A4u|!6AZiNEt$)Pi|MNQ4SlvxyIcEl) z`i25Bk%>%XoDufcn`e*O5?<7}bv|;DPc9FYA`1OO@;Q?1{sd3Q4%N+c_m7wEb2c%l zx?Uc5xVo5v$MxjQ?YtcBSBW}>FQ?+nb&N Date: Sat, 27 Jun 2015 13:03:47 -0700 Subject: [PATCH 42/57] Cleans up adminhelp keyword searcher and changelog for #10196. --- code/modules/admin/verbs/adminhelp.dm | 7 +--- code/modules/admin/verbs/adminsay.dm | 2 +- .../MrStonedOne-adminhelp-pr10196.yml | 38 +++++++++++++++++++ 3 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 html/changelogs/MrStonedOne-adminhelp-pr10196.yml diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 2531a0df089..55bb6ae84c8 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -1,4 +1,4 @@ -/proc/keywords_lookup(var/msg, var/followlink = 1) +/proc/keywords_lookup(var/msg) //This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE! var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as", "i") @@ -52,10 +52,7 @@ mobs_found += found if(!ai_found && isAI(found)) ai_found = 1 - if (followlink) - msg += "[original_word](?) (FLW) " - else - msg += "[original_word](?) " + msg += "[original_word](?|F) " continue msg += "[original_word] " return msg diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index d764f4c02fd..ff1e0cf97a3 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -8,7 +8,7 @@ if(!msg) return log_admin("[key_name(src)] : [msg]") - msg = keywords_lookup(msg,0) + msg = keywords_lookup(msg) if(check_rights(R_ADMIN,0)) msg = "ADMIN: [key_name(usr, 1)] (FLW): [msg]" admins << msg diff --git a/html/changelogs/MrStonedOne-adminhelp-pr10196.yml b/html/changelogs/MrStonedOne-adminhelp-pr10196.yml new file mode 100644 index 00000000000..a418c843fbe --- /dev/null +++ b/html/changelogs/MrStonedOne-adminhelp-pr10196.yml @@ -0,0 +1,38 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: MrStonedOne + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "Admins will now receive a notification when one of them starts to reply to an adminhelp to cut down on multiple responses to adminhelps and let admins know when an adminhelp isn't getting replied to." + - rscadd: "The keyword finder in admin helps (adds a (?) link next to player names in the text of adminhelps) has been added for all player to admin pms, as well as admin say." + From 5128873bc6ba93c35cce1e35ca72dc4e42305260 Mon Sep 17 00:00:00 2001 From: barackobama Date: Sat, 27 Jun 2015 23:57:23 +0100 Subject: [PATCH 43/57] move the chemistry fridge between the front desk --- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 95d017a4a21..45e760b0a3b 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -3151,7 +3151,7 @@ "biE" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/prison) "biF" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "biG" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/security/armory) -"biH" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/medical/chemistry) +"biH" = (/obj/machinery/smartfridge/chemistry,/turf/simulated/floor/plating,/area/medical/chemistry) "biI" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) "biJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/medical/medbay) "biK" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay) @@ -3510,7 +3510,6 @@ "bpz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Chemistry Lab"; req_access_txt = "5; 33"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry) "bpA" = (/obj/structure/grille,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/medical/chemistry) "bpB" = (/obj/structure/table/reinforced,/obj/machinery/door/window/southleft{dir = 1; name = "Chemistry Desk"; req_access_txt = "33"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/chemistry) -"bpC" = (/obj/machinery/smartfridge/chemistry,/turf/simulated/wall,/area/medical/chemistry) "bpD" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) "bpE" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) "bpF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) @@ -6643,7 +6642,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaabdDbkJbhRbkKbjrbkLbkMbdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkNbkObkPbkQbkRbkSbkSbkTcuTbkSbkSbkUbkSbkVbkWbkXbkYbkZbecbecbecblaaYvblbaYvblcbldaKAbipbleblfblfblfblfblgblhbliaafaaabljblkbllbfDbfDblmbgZaaaaafblnbloblpblqblrblsblnbltblnbluaHYaHYbeublvbhectCblwblxbeublybjZbkablzblAbfXblBbezblCblDblEbezblFblGblHblIblJblKblLblMblNblOblNblNblNblPbeIblQbhyblRblSblTbkqblUblVblWblWblXblYblZbeKbmabgrbmbbeRbmcbmdbmebkCbhObmfbeRbhPbmgbmhbmibmibmibmibmibmibmjaafaaaaafaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaabdDbmkbhRbhRbhRbdDbdDbdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkNbmlbjxbmmbmnbmobmnbmncuUbmnbmnbmpbmnbmqbmrbmsbmtbmubmvbecbmwbaHbmxbmybmzbedbmAbmBbipbipblibmCbmDbmEbmFbmGbliaaaaaabfCbmHbmIbmJbmIbmKbgZaaaaaablnbmLbmMbmNblnbmOblnbltblnbluaHYaHYbeubmPbhebjXbmQbmRbeubmSbmTbmUbmVbmWbfXbmXbezbfYbmYbmZbezbeAbnabeAbeBbnbbncbncbncbncbncbncbncbncbgibeIbndbkmbknbnebnfbngbnhbnibnibniblXbkvbnjbnkbnlbnmbnnbnobnpbnqbnpbnrbhObnsbeRbntbnubnubnubnubnubnubnubnvbgxbjobjobjoaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbnxbjxbjxbjxbnybnzbnzcuVbjxbjxbjxbjxbjzbnAbeabnBbnCbnDbnEbnFbnGbnHbaHbmzbnIbnJbnKbnLbnMbnNbnObnPbnQbnRbnSbliaafaaabfCbnTbnUbnUbnUbnVbgZaaaaafblnbnWbnXbnYblnbRIblnbltblnboaaHYaKJbobbocbodboebofbogbeubohbjZbhkbmVboibojbmSbmSbokbolbombonboobopbfXboqborbosbvtboubovbowboxboybncbgibeIbozboAboBboCboDbeKboEbnibniboFboGbkvboHboIboJboKboLbnoboMboNbhOboOboPboQbeRboRbrVbrVbrVbrVbrVbrVbrVbhPbgxboTboUbjobjoaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboVboWboVboXboYbjxbjxbiibjxbjxcuWbjxbjxboZaYpaYpbpabpbbjEbpcbpdbecbpebaHbpfbaHbpgblubmAbphbpibpjbpkbplbpmbpnbpobppbliaaaaaabfCbpqbprbpsbprbptbgZaaaaaabpubpvbpwbpubpubpubpubpxbpubpyaKAaKAbeubeubpzbpAbpBbpCbeubpDbjZbpEbpFbpFbpFbpFbpFbpGbpHbpIbpJbpFbpKbpFbpLbpMbosbpNbpObpPbpQbpRbpSbncbpTbpUbpVbpWbpWbpXbpYbpZbqabqbbqbbqcbqdbkvbqebqfbqgbqhbqibnobnobqjbqkbqlbqmbnobeRbrVbrVbrXbenbrZbfUbsabrVbqsbqtbqubqvbqwbjoaaaaafaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboVboWboVboXboYbjxbjxbiibjxbjxcuWbjxbjxboZaYpaYpbpabpbbjEbpcbpdbecbpebaHbpfbaHbpgblubmAbphbpibpjbpkbplbpmbpnbpobppbliaaaaaabfCbpqbprbpsbprbptbgZaaaaaabpubpvbpwbpubpubpubpubpxbpubpyaKAaKAbeubeubpzbpAbpBbeubeubpDbjZbpEbpFbpFbpFbpFbpFbpGbpHbpIbpJbpFbpKbpFbpLbpMbosbpNbpObpPbpQbpRbpSbncbpTbpUbpVbpWbpWbpXbpYbpZbqabqbbqbbqcbqdbkvbqebqfbqgbqhbqibnobnobqjbqkbqlbqmbnobeRbrVbrVbrXbenbrZbfUbsabrVbqsbqtbqubqvbqwbjoaaaaafaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqxbqybqxbqzbjxbjxbjxbnybnzbnzcuVbjxbjxbqAbqBaYpbqCbaHbaHbqDbqEbqFbqGbaHbaHbaHbpgblubqHaHYbpibpjbqIbqKbqJbqLbqMbqNbliaafaafbqObqPbqQbqRbqSbqTbqUaafaafbqVbqWbqXbqYbqZbrabrbbrcbpubrdaHYaHYbmVbrebrfbrgbrhbribrjbrkbrlbrmbrnbrnbrnbrnbrnbrobrpbrqbrrbrsbrtbrubrvbrwbosbrxbrybrzbrAbrBboybncbgibeIbrCbrDbrEbrFbrFbeKbrGbrHbrIbnkbrJbkvbrKbnkbrLbrMbrNbrObrPbrQbrRbrSbrTbrUbhtbthbtgbtjbtibtibtibtlbtkbqnbgxbsdbsebsebjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbsfbjxbjxbjxbiibjxbjxcuWbjxbjxbqAbsgaYpbshbsibjEbsjbskbslbeabaHbaHaZhbmzbsnbqHaHYbpibpjblibsobspbsqbsrbssbliaaaaaaaafbfCbstbsubstbgZaafaaaaaabqVbsvbswbsxbsybszbszbsAbsBbsCaHYaHYbmVbsDbfXbsEbsFbsGbsHbsGbsIbsJbsKbsLbsKbsKbsKbsMbsNbfXbhkbsObsPbsPbsQbsRbosbosbsSbsTbsUbpRboybncbeHbeIbsVbsVbsVbsVbsVbeKbnkbnkbnkbnkbsWbsXbsYbnkbsZbtabtbbtcbtcbtcbtcbtdbtebtfbrYbuAbuzbuCbuBbuBbuDbwabrVbsbbgxbsdbsebseabtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtobqxbqybqxbmlbtpbjxbjxbtqbjxbtpcuWbjxbjxbqAbtraYpbtsbttbnGbtubtvbecbpbbjEbtwbtxbmzbsnbqHaWUbpibtyblibtzbtAbtBbtCbmGbliaaaaaaaafbtDbtEbnUbtFbtGaafaaaaaabqVbtHbtIbtJbtKbtLbtMbtNbpubtOaHYaHYbmSbmSbtPbtQbpGbtRbtSbtTbtUbtVbtWbtXbtWbtXbtWbtXbtWbtXbtYbtZbsPbuabubbucbudbuebufbugbuhbuibujbncbukbulbumbnmbunbhJbhJbuobhJbhJbupbuqburbusbutbtcbuubuvbuwbuxbuxbuxbuybuybuybuybuybwcbwbbwebwdbwebwfbwebrVbsbbgxbwgbqvbwhbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 8c62ccfe2ed6d678341610b2465b4856100bc76c Mon Sep 17 00:00:00 2001 From: Ikarrus Date: Sat, 27 Jun 2015 17:22:02 -0600 Subject: [PATCH 44/57] Moves clothes from out of equipment lockers and into wardrobe closets - Wardrobe closets are not locked, so it should make it a bit easier to steal disguises - Unclutters equipment lockers - Heads still have their one lockers for convenience, but some of the clothes have been removed if they're already in a department's wardrobe --- .../MetaStation/MetaStation.v41A.II.dmm | 32 +- _maps/map_files/MetaStation/z2.dmm | 2 +- _maps/map_files/MiniStation/MiniStation.dmm | 15 +- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 22 +- _maps/map_files/generic/z2.dmm | 2 +- .../objects/items/weapons/storage/backpack.dm | 2 +- .../crates_lockers/closets/job_closets.dm | 310 ++++++++++++++++-- .../crates_lockers/closets/secure/cargo.dm | 14 - .../closets/secure/engineering.dm | 24 +- .../closets/secure/hydroponics.dm | 14 +- .../crates_lockers/closets/secure/medical.dm | 13 - .../closets/secure/scientist.dm | 22 +- .../crates_lockers/closets/secure/security.dm | 6 +- .../crates_lockers/closets/wardrobe.dm | 213 ------------ code/modules/mining/mine_items.dm | 27 +- 15 files changed, 356 insertions(+), 362 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 11d43cc22db..b3d9ccfe523 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -1356,7 +1356,7 @@ "aAd" = (/obj/structure/closet/crate,/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aAe" = (/obj/structure/closet/emcloset,/obj/machinery/status_display{density = 0; pixel_x = 0; pixel_y = 32; supply_display = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aAf" = (/obj/structure/closet/crate,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) -"aAg" = (/obj/machinery/power/apc{dir = 1; name = "Mining APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 38},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) +"aAg" = (/obj/machinery/power/apc{dir = 1; name = "Mining APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 38},/obj/structure/closet/wardrobe/miner,/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aAh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aAi" = (/obj/structure/rack{dir = 1},/obj/item/weapon/storage/toolbox/emergency{pixel_x = 2; pixel_y = -3},/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plasteel{dir = 5; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aAj" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"}) @@ -2818,7 +2818,7 @@ "bcj" = (/obj/item/device/radio/beacon,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge) "bck" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/computer/security/mining,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge) "bcl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/recharger{pixel_y = 3},/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkredcorners"},/area/bridge) -"bcm" = (/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/quartermaster/storage) +"bcm" = (/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering) "bcn" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/tools) "bco" = (/turf/simulated/wall,/area/quartermaster/office{name = "\improper Cargo Office"}) "bcp" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{glass = 0; icon = 'icons/obj/doors/Doormining.dmi'; name = "Cargo Bay"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "48;50"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/office{name = "\improper Cargo Office"}) @@ -3256,7 +3256,7 @@ "bkF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge) "bkG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge) "bkH" = (/obj/machinery/light_switch{pixel_x = -38},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage) -"bkI" = (/obj/structure/closet/secure_closet/cargotech,/obj/structure/disposalpipe/segment,/obj/item/clothing/suit/hooded/wintercoat/cargo,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/quartermaster/storage) +"bkI" = (/obj/structure/closet/wardrobe/cargotech,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/quartermaster/storage) "bkJ" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bkK" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/machinery/door/window{dir = 8; name = "MiniSat Airlock Access"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"}) "bkL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/wall/r_wall,/area/turret_protected/ai) @@ -5171,7 +5171,7 @@ "bVw" = (/obj/item/weapon/crowbar,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard) "bVx" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway) "bVy" = (/obj/machinery/computer/security/telescreen/entertainment,/turf/simulated/wall,/area/crew_quarters/kitchen) -"bVz" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) +"bVz" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos) "bVA" = (/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 4; name = "Atmos RC"; pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/shower{dir = 8; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (WEST)"},/turf/simulated/floor/plasteel,/area/atmos) "bVB" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Port to Filter"; on = 0},/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "Atmospherics - Starboard"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/atmos) "bVC" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/atmos) @@ -5417,7 +5417,7 @@ "cai" = (/obj/machinery/hydroponics/constructable,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/hydroponics) "caj" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel,/area/hydroponics) "cak" = (/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hydroponics) -"cal" = (/obj/structure/closet/secure_closet/hydroponics,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/storage/backpack/satchel_hyd,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"cal" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/closet/wardrobe/botanist,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "cam" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/firealarm{pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "can" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard) "cao" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -5542,7 +5542,7 @@ "ccD" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/hydroponics) "ccE" = (/obj/effect/landmark/start{name = "Botanist"},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics) "ccF" = (/obj/machinery/biogenerator,/obj/machinery/light_switch{pixel_x = 26; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hydroponics) -"ccG" = (/obj/structure/closet/secure_closet/hydroponics,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/obj/item/weapon/storage/backpack/satchel_hyd,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"ccG" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "ccH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "ccI" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard) "ccJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard) @@ -5796,7 +5796,7 @@ "chx" = (/obj/structure/girder,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "chy" = (/obj/structure/girder,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "chz" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central) -"chA" = (/obj/structure/closet/secure_closet/hydroponics,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/item/weapon/storage/backpack/satchel_hyd,/obj/item/clothing/suit/hooded/wintercoat/hydro,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"chA" = (/obj/structure/closet/secure_closet/hydroponics,/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) "chB" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "chC" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "chD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6035,6 +6035,7 @@ "cmc" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/medical/virology) "cmd" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/medical/virology) "cme" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_virology{name = "Test Subject Cell"; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology) +"cmf" = (/obj/structure/closet/wardrobe/science_white,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/explab) "cmg" = (/obj/item/device/flashlight/lamp,/turf/simulated/floor/plating/airless{dir = 2; icon_state = "warnplate"},/area/toxins/test_area) "cmh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology) "cmi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"}) @@ -6198,6 +6199,7 @@ "cpk" = (/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cpl" = (/obj/structure/rack,/obj/item/clothing/suit/apron,/obj/item/clothing/mask/surgical,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) "cpm" = (/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) +"cpn" = (/obj/machinery/light_switch{pixel_y = 28},/obj/structure/closet/l3closet/scientist{pixel_x = -2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cpo" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8},/turf/simulated/floor/plating/airless,/area/space) "cpp" = (/obj/machinery/power/turbine{luminosity = 2},/obj/structure/cable,/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "cpq" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos) @@ -6900,7 +6902,7 @@ "cCL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay3{name = "Medbay Aft"}) "cCM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) "cCN" = (/obj/machinery/power/apc{dir = 4; name = "Medbay Aft APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/disposalpipe/junction,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"}) -"cCO" = (/obj/structure/closet/secure_closet/scientist,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/explab) +"cCO" = (/obj/structure/closet/wardrobe/science_white,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cCP" = (/obj/structure/table/glass,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen/red,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/virology) "cCQ" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics_cloning) "cCR" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/closet/wardrobe/genetics_white,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics) @@ -7118,7 +7120,6 @@ "cGV" = (/obj/machinery/camera{c_tag = "Research Testing Range"; dir = 8; network = list("SS13","RD"); pixel_y = -22},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cGW" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) "cGX" = (/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/toxins/misc_lab{name = "\improper Research Testing Range"}) -"cGY" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cGZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "cHa" = (/obj/structure/lattice,/turf/space,/area/toxins/mixing{name = "\improper Toxins Lab"}) "cHb" = (/obj/machinery/door/poddoor{id = "mixvent"; name = "Mixer Room Vent"},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing{name = "\improper Toxins Lab"}) @@ -7130,7 +7131,6 @@ "cHh" = (/obj/machinery/atmospherics/binary/valve{dir = 4; name = "manual outlet valve"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cHi" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 8},/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cHj" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"}) -"cHk" = (/obj/structure/closet/secure_closet/scientist,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"}) "cHl" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/toxins/test_area) "cHm" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area) "cHn" = (/turf/simulated/wall,/area/medical/virology) @@ -8025,7 +8025,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahatJatJatJatJatJatJatJaahatJaahaahatJatJaahaahalWalWardawwalWalWaaaauraxtaxtaxtaBLaBuaBvaBvaCTaBxaByaBzaBAaBBaBCaBDaBEaCVaBGaDHayWayYaheaaaaxCaAraAqaBJaAsaBKaxCaaaaoOaFwawDawDaOZaBOauAaboaBQaAyaBRagKaBQaAyaBSagKaBQaAyaBTagKaBUaBVaBWagKaBXaBYaBZaCaaCbazxaCcaCdaCeaCfaCgaChazBaCiapjapjapjaCjaCkaykaClaCmaCnaykaCoaCpaCpaCqaCraCsaCtarWarWarWarWarWaocaCuatHaSuaCwaCxaCyavraCAaCBaCCaCCaCCaCCaCDaCEaCFavsaCHayFaCIaahaahaaaaaaaaaaahaahaaaaaaaahaaaatJazRayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaatJatJatJatJatJaahaahaahatJatJatJaafaaaaahaahaahalWalWalOalOaCJagAaaaaaaaqQaxsaxsaxsaqQarCaCLaCMaCNaBxaBvaCOaCPavtayUaCRaCSaEhaCUaEsayWayYaheaahaxCaCWaCzaCYaCXaTEaxCaaaaoOaPeaPeaPeaoOausaDeaboavvavxavwahCavvavxavwahCavvavxavwahCaxDazqayPahCahCauhazrahCaDnazxaDoaDpaDqaDraDsaDtazBaDuaheaheaheaDvaheaykaDwaDxaykaykaDyaDzaDAaDBaDCaDDaDEavRaDFaDGatxarWaFDaDIatHaDJaDKaDLaDLaDMawzazLaDOaDPaDQaDQaDQaDRaDSawAaDUawBaaaaaaaahaaaaaaaaaaahaaaaaaaaaaahaaaaaaaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaDWaDXaDWaagaaaaahaaaaahalWaHcaFHakBawwalWalWaaaauraPPaPfaPQaurarCarCarCayUaEdaBvaEeaCPaEfayUaEgaHFaEiaEjaEkayWayYaheaaaaxCaDbaDaaDTaEmaxCaxCaaaaPUaQuaQuaQuaQvaEraxvaEraEtaEuaEtaEvaEtaEuaEtaEwaEtaEuaExaEyaEzaEAaEBaxEaAJaEEaDmahCavNazBaEGaEHaEIaEJaEKaELazBaEMaykaENaEOaEPaEQaEQaERaESaETaEUaEVaEWaEXaEYaEZaFaauLaFbaFcaFdaFearWaqKaDIatHaFfaFgaFhaFiaFjaFkaFlaDVaFnaFoaFoaFoaFpaFqawAaDUawBaaaaahaahaahaahaahaahaahaahaahaahaahaaaaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaahaahaaaaDWaFsaDWaahaahaahaahaahalWaWhaotaotaFtaFualWaaaaQyarlaQzarlaQBaahaahaaharCaFzaFAaFBaFCaHIayUaFEaFFaWiaIfaFIayWayYaheaaaaahaaaaDYaFLayNaaaaahaaaaErausausausaEraErayOaFOaExaFPaFQaFRaFSaFTaFTaFUaFTaFVaFSaFWaFXaFYaFZaGbaEFaGdaGcahCavNazBazBayQaGfazBaDZazBazBaDuaykaykaykaGhaGiaGjaGkaGlaGmaGnaGoaGpaGqaGraGraGsaGtarWarWarWarWarWaqJaDIatHaGuaGvaGwaGxaGyayRaGAaGBaGCaGDaGEaGFaGGaGHawAaDUawBawBaahaGKaaaaaaaaaaaaaGKaaaaaaaGKaahaahaahayFaGLaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaahaahaaaaDWaFsaDWaahaahaahaahaahalWaWhaotaotaFtaFualWaaaaQyarlaQzarlaQBaahaahaaharCaFzaFAaFBaFCaHIayUaFEaFFaWiaIfaFIayWayYaheaaaaahaaaaDYaFLayNaaaaahaaaaErausausausaEraErayOaFOaExaFPaFQaFRaFSaFTaFTaFUaFTaFVaFSaFWaFXaFYaFZaGbaEFaGdaGcahCavNazBazBayQaGfazBaDZazBazBaDuaykaykaykaGhaGiaGjaGkaGlaGmaGnaGoaGpaGqaGraGraGsaGtarWarWarWarWarWaqJaDIatHaGuaGvaGwaGxaGyayRaGAaGBaGCaGDbcmaGFaGGaGHawAaDUawBawBaahaGKaaaaaaaaaaaaaGKaaaaaaaGKaahaahaahayFaGLaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaaaaahaaaaDWaDXaDWaDWaySaySaySaDWaDWaDWaDWaDWaGQaGRalWaaaaaaaaaaaaaaaaaaaaaaaaaaharCaGTaGUaGVaGWaGXayUaGYaGZayWayWayWayWaEaaheaHbaElazfaEnaHfazhazkazjaHbaEraHjaHkaHkaHlaHmaHnaHoaHpaHqaHraHsaHtaHuaHvaHwaHuaHxaHyaHzaHAaHBaHCazmaGPaHEaGSahCavNaHHazBaznaHJazBaHKaHLaplaHMaykaHNaHOaHPaHQaykaHRaHSaHTaykaHUaHVaHWaHXaHWaHYaHZaIaaIbaIcaIdarWapxaDIatHaIeazpaIgaIhaIiaCAaIjaIkaGCaIlayFayFaImbbLayFawBawBawBaahaaaaaaaaaaaaaaaaIqaaaaaaaaaaahaahaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaahaDWaDWaIraIsaItaIuaIuaIvaIwaIxaIyaIzaDWaDWawwalWaaaaaaaaaaaaaaaaaaaaaaaaaahayUayUayUazsaICayUayUaIDaIEaIFaIGaIHaIIaIJaIKaILaFJaINaGgaIOaINaIPaIQaIRaEraISaITaIUaIVaIVaztaIVaIVaIVaIVaIVaIVaIVaIVaztaIVaIXaIYaIZaJaaJaaJaaJbaJbaJbaJbaJbaJaaJcaJaaJdaJdaJdaJdaGMaJdaDuaykaykaykaJfaJgaykaJhaykaJiaykaJjaJkaJlavRaIAaJnaJoavRaJpaJqaJrarWaJsaJtatHayFayFayFayFayFaCAaJuaJvaGCaJwayFaJxaJyaJzaJAaJzaJBawBaahaaaaaaaahaahaahaahaahaaaaaaaahaahatJayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaDWaJCaJCaJCaIuaIuaIuaIuaIuaIuaJCaJCaJDaDWawwagAaaaaaaaaaaaaaaaaaaaaaaaaaahaahazwaJGaLbaJHaJIaJJaJKaJLaJMaJNaJOaJPaJQaJRaIIaJSaJTaJUaJVaJWaJXaJYaJZaKaaKbaKcaKdazyaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaazAaKfaKgaKhaJaaXbaKjaKkaKlaKmaKnaKoaKpaKqaJaaKraKsaKtaXLaKvaJdaKwaykaKxaKyaGiaJgaykaKzaykaKAaykaKBaKCaKDaKEaKEaKEaKEaKEaKEaKEaKEaKEaocaKFatHaKGaKHaKIaKJayFaKKaFgaJvaKLaKMaKNaKOaKPaKQaKRaKSaKTawBaahaGKaahaahaAaazZaAbaahaKUaaaaahaaaaraayFazXaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8041,7 +8041,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaGObdgaXcaXdaXeaXfaXcaXgaXhaXiaXhaXjaXkaXhaXlaJmaTVaXoaXpalWaaaaaaaaaaaaaaaaaaaaaaaaaahaVZaHdaUSaMsaNUaNUaHeaHgaLhaXsaXtaXuaXvaXwaXxaXyaXzalWawwaLnaLnaLnaAuaAuaHhaLraXDaXEaLraXFaXGaXHaWraXIaXJaXKaWrbdlaXMaXNaXOaXPaXQaXRaXSaXTaXUbeOaJaaJaaXWaXXaXWaJaaJaaFKaYaaYbaFKbcTaYcaYdaYeaYfaYgaocaocaocaocaYhaocaocaocaocaocaocaDIapwapxaYiaYiaYiaYiaYiaYiaYiaWPaYjaYkaYlaWPaHiaYnaWPaYoaYpaCAaCAaYqaYraYsazOaYtazOaYuazRaYvazRayHayIaYwayIayKazRaYvazRayLazWazXaahaahaagaagaafaahaafaagaagaafaafaagaagaagaafaahaahaahaahaahaQxaTiaYxaYyaYyaYyaYyaYyaYzaYzaYzaYAaYzaYzaYzaYyaYBaYyaYyaYyaYCaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaHDaYEaYFaYFaYGaYFaYFaYFaYHaYIaYJaYKaYLaYLaYLaYMaYNaYOaYPalWaaaaaaaahaahaaaaaaaahaahaahaVZbgqbgjbiRaYRaNUbjwaInaYUaYTaYVaYWaYXaYYaYZaZaaZbalWaZcaZdaZeaZfaZgaZhaZiaZjaZkaZlaZmaZnaZoaZnbeTaZqaZraZsbeZaZnbGzaZuaZvaZxaZwaZzaZyaZAaZCaZDaZDaZDaZEaZFaZDaZDaZGaZDaZHaZIaZDaZDaZDaZKaZLaocaZMaZNaZOaZPaZQaZRaZQaZSaZQaZTawhaWOawiaqJapxaYibfWaZUaZVaZWbhfaZZaWPbaababbabbacbabbadaWPbaeaWUbafbagbagbagbagbagbahayFbaiayIbajayIazVayFayFayFbaiayIazVayLayLayFaahaahaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaQxaUvaUwaUCaaaaUzbakbakbalbambanbaobapbambaqbakbaraUzaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaHDaHDbauaHDaTqaHDbawaHDaYEaYFbaxbayaHDbawaHDbhPbaAbaBbaCalWalWalWalWagAagAagAalWalWalWaVZbkHbaJbaJbaJbaJbaKaNUbaLbaMbaNbaOaUXaUXaUXaUXaIBalWalWbaQalWalWbaRbaSbaTbaUbaVbaWbaXbaUbaVbaYbaZbaWbbabaUbaUbaUaZBbbbbbcbbebbdbbfbbgbbhbaUbaUbaUbaUbbjbbkbaUbaUbaXbblbbmbaUbaUbaUbaUbbnbbobbpbbpbbpbcnbbpbbpbbpaocbbqaocaDIaocaocbbrbbrbbrbbrbbsbbtbbtbbubbvbbwaWPbbxbbyaIWbbAbbBbbCaWPbbDbbEbbFbagbbGbbHbbIbagbbJayFayFayFayFayFayFayFbbKayFayFayFayFayFbbLayFaahaQxaQxaafaQxaQxaQxaQxaafaQxaQxaQxaQxaafaQxaQxaQxaQxaQxaQxaQxaQxaTiaUwaUCaaaaUzbakbanbbMbbNbbObbPbbQbbNbbRbanbaraUzaaaaVRaUwaUCbbSbbSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDaahaaaaahaaaaHDbbUaHDbbVbbVbbWbbXaHDbbUaHDaHDaTqbbZbcabcbasuasvbccasvbcdasvbcebcfaswbeqbchaJEaJEaJFaKYaKebcmbkIbcobcpbcqbcobcrbcsblvbctbcubcvbcwbcxbcybczbcAbcBbcCbcCbcDbcEbcFbcGbcHbcIbcJbcKbcKbcKbcKbcKbcKbcKbcLbcMbcNbcNbcNbcNbcNbcNbcNbcNbcObcPbcQbcRbcNbcSbcObcNbcNbmTbcUbcVbbpbcWbcXbcYbcZbdabbpbdbbdcaocbddaocaaabbrbdebdfbbrbjzbdhbdibdjbdkbmIaWPbdmbdnbdobdpbdqbdraWPbdsbdtbdubagbdvbdwbdxbagbdyaKRaKRbdzaKRbdAaKRaKRaKRbdBaKRbdCbdDbdCbdDabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaRJbdEaUwaUCaaaaUzbakbdFbdGbakbdHaKZbdJbakbdKbdLbaraUzaaaaVRaUwbdMaaabbSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDaahaaaaahaaaaHDbbUaHDbbVbbVbbWbbXaHDbbUaHDaHDaTqbbZbcabcbasuasvbccasvbcdasvbcebcfaswbeqbchaJEaJEaJFaKYaKeaJEbkIbcobcpbcqbcobcrbcsblvbctbcubcvbcwbcxbcybczbcAbcBbcCbcCbcDbcEbcFbcGbcHbcIbcJbcKbcKbcKbcKbcKbcKbcKbcLbcMbcNbcNbcNbcNbcNbcNbcNbcNbcObcPbcQbcRbcNbcSbcObcNbcNbmTbcUbcVbbpbcWbcXbcYbcZbdabbpbdbbdcaocbddaocaaabbrbdebdfbbrbjzbdhbdibdjbdkbmIaWPbdmbdnbdobdpbdqbdraWPbdsbdtbdubagbdvbdwbdxbagbdyaKRaKRbdzaKRbdAaKRaKRaKRbdBaKRbdCbdDbdCbdDabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaRJbdEaUwaUCaaaaUzbakbdFbdGbakbdHaKZbdJbakbdKbdLbaraUzaaaaVRaUwbdMaaabbSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaaaaHDbawaHDaHDaHDaHDaHDaHDbawaHDaaaaTqbdQbdRbdSbdSbdSbdSbdSbdSbdSbdSbdTbmMbcobcoaLoaMraLobcobcobcobdYbcobdZbeabebbecbedbeebefbegbehbeibejbcybekbcAbelbembembenbembeobembgbbeRbgbaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGbeubeubevbeubeubeubeubeubeubewbcAbexbbpbnjbezbeAbeBbeCbbpbeDbeEaocaDIajVaaaaOfbeGbeHbeIbeJbeKbeLbeMbeNbncaWPbePaOhaOFaOFaOXaOWaWPbeUbeVbeUbagbeWbeXbeYbagaOYayFayFayFayFayFayFayFayFayFawBayFayFbahayFaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaQxbfbbfcbfdbfeaUzaUzaUzbakbffbfgbfhbakbakbakbfibfjbfkbaraUzaUzaUzbflaToaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaFaXCbaIaXCbdNaXCaXCbdNaXCbaIbdPbdOaTqbdQbfsbftbfubfvbfwbfxbfybfzbdSbfAbfBbfCbfDbnsbfEbnsbfEbfGbfEbfHbcobfIbfJbfKbfLbfMaPgbfObfPbfQbfRbfSaPobfUbfVbotbembfXbfYbfZbgabembhobgcbhraahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbeubgdbgebgfbggbghbgibnVbeubgkbglbgmbbpbgnbgobgpboqbgrbbpaocaocaocbgsaocaaabbrbgtbgubbrbgvbgwbgxbgybgzbgAaWPbgBaPAbgDbgEbgFbgGaWPaCAbgHaCAbagbgIbgJbgKbagbgLbgLbgLaaKaaEaaaaaaaaaaaaaahaaaaaaayFbdDayFaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaRIaRIbgMbgNaUwbgObgPaaaaaaaUzbgQbgRbgSbakbakbgTbakbakbdKbgUbgVaUzaaaaaabgWaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaFaXCaXCbdVbdUbdXbdWbhcbhbbUqboGcDRbdXcVVcVUaHDbdQbdRaQTbhibhjbhkbhlbhmbhnbhMbhpbhqbhNbhsbhsbhtbhubhvbcobcobcobcobhwbhxbhybhzbhAaLobhCbegbehbhDbhEbhFbhGbcAbhHbembhIbhJbhKbhLbhObiQbiqbjAaahaahaQYaRcaRbaRdbhUaRfaRcaRdbhUaRfaRbaRbaRgaahaahbeubhZaRhbibbicbibbidbiebeubifbcAbigboHbbpaRjbiiaRqbbpbbpbikbilaocbinaocbimbbrbbrbbrbbraYiaYiaYibiobipaYiaWPaWPaWPaWPaWPboOboNaWPbisbitbisbagaRzbivaRAbagbiyaRHcVWcVXcVXcVYaaaaaaaaaaahaaaaaaaaaabjaaaaahaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahabjbiCbiDbiEbiDbiFaUCaaaaaaaaaaUzbiGbanbiHbiIbiJbiKaRKbiIbiMbanbaraUzaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8071,8 +8071,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaabWCbWCbWDbWEbWFalWbWGalWalWalWaUObWHbWHbWHbWHbWHbWHbWHaotbWIbWJcbZbwLbWLbWMbyUbWObEobTdbWPbWQbWRavialWbWSbwPbWTbWUbWVbWWbWXbWXbWXbWYbWZbXabXbbWXbXcbXdbWVbWVbXebXfbXfbXfbXgbXfbXhbXibXibXjbXkbXlbXmbXnbXobWXbWXbWXbXpbXqbXibXraXQbXsbXtbyVbXvbXwbXxbyWbyXbXAbXxbXBbXCbXDbXEbNrbXFbXGbWwbXIbXJbXKbXLbWtbXMaocaocaocaocaocbXNbXObzBbzBbzBbWxbGDbKobWzbWybWAbGGbXzbWKbXHbSxbXPbMjbFgbFsbIzbYZbZabZabFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRaUwbJhaRIaRIaRIaRIaRIaRIbWBaRIaRIaRIaRIaRIaRIbgNaUwaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaabWFbXZbYabYbbWFaotbYcbMAcesalWbYebWHceGbYgbYhbYiceIbWHaotalObWJalObwLbwLbwLbwLbwLbwLbwLbwLbwLatRalOalWbYkbwPbYlbYmbaUbaUbaUbaUbaUbaUbaXbaUbYnbYobYpbaWbaUbaUbYqbYrbYsbYtbYubYvbYwbaUbaUbaUbYybYzbaUbaUbaXbaUbaUbaUbaUbYAbaUbYnbYBbYCbYDbYEbYFbYGbYFbYHbYHbYIbYJbYKbYHbYGbYLbNrbNrbNrbNrbYMbYNapwaoaceWbYPapwbYPbYQbYRaocauWaocbzBbXQbXUbXTbXWbXVbYdbYdbYdbINcgpcgpcgpbNRbYSbNSbBIaahbBIbZbcaDcaCbFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRbZcaTkaTkaTkaTkaTkaTkaTkbZdaTkaTkaTkaTkaTkaTkaTkbZeaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahbWFbZfbZgbZhbWFaotbZibZjalWalWbZkbWHbZlbZmbZnbZobZpbWHawqaotbZqbVKbVIbVKbVNbVKbZrbZsbZsbZsbZsbZtaZebZubZvbZwbZxbZybZzbZAbZBbZybZybZybZCbZybZDaZCbZEbZFaZCaZCbZGbZHbZIbZJbZKbZLbZMaZCaZCbZObZPbZQbZQbZRbZSbZRbZRbZRbZTbZUbZVbZWbZXbZYbZZcaacabcaccadcaecafcagcahcaicajcagcakbWicalcambWicanbYNapwapwapwapwapwcaocapcaqcarcascatbYUbYTbYWbYVbYYbYXcgpcgpcgpcgpcgpbEScgpbNRcaubPvbIVbJdbLAcaVbZacbibFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaUyaUyaUyaUyaUyaUyaUyaUycaEaUyaUyaUyaUyaUyaUyaUyaUyaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaabWFcaFcaGcaHbWFcgvaotcaJalWcaKcaLbWHcaMcaNcaOcaPcaQbWHbWHbWHbWHbWHbWHcaRbWHbWHcaSchcchdalOardccuarhcklcklcklcklcklcklcklcchcchcchcchcchcdzcaWcaWcaXcaYcaWcaZcaWcbacbbaXQcbcchzcbecbfcbecbgcbhcbecbecdKbepaXFaXHaXHcbjbepcbkbepbzacbmbzabWibzkbzbcahcbpcbqcagcahcbrcbscbtbzlbWichAcbwbWicbxcbycbzcaqcaqcaqcaqcbAcbBcbCcbDcbCcbEbzGcavcaxcawcgpcaybMdbMdbMdbMdbMdcazcgpbNRbRecaAbzBaahbFvbFvbFvbFvbFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbSaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabWFbzocbMbzobWFalWalWalWalWbWHcbObWHcbPchBcbRcbScbTbWHcbUcbVcbWbWHcbXcbYchQbWHccabWHbWHbWHbWHbWHbWHcklccbbBhbCRbCKcibccgcchcciccjcckcchbASccmbASccnccobASccmbASciKccqccrccsciWbATccvbATccwccxbATccvbATcctccyccyccyccyccycczbepbAUccBbAVbyVccDbYGcahcajcajcagccEcajcajcagccFbWiccGccHbWibYMccIccJcbCcbCcbEcbCcbCccKcbucbdcbucbubzBcbvcbGcbFcbIcbHbEScgpcgpcaybMdcbJbPubNRcbKbNSbzBaahaahaahaahaahaahaahaahbMoaahbMpaahbNWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaabWFcaFcaGcaHbWFcgvaotcaJalWcaKcaLbWHcaMcaNcaOcaPcaQbWHbWHbWHbWHbWHbWHcaRbWHbWHcaSchcchdalOardccuarhcklcklcklcklcklcklcklcchcchcchcchcchcdzcaWcaWcaXcaYcaWcaZcaWcbacbbaXQcbcchzcbecbfcbecbgcbhcbecbecdKbepaXFaXHaXHcbjbepcbkbepbzacbmbzabWibzkbzbcahcbpcbqcagcahcbrcbscbtbzlbWiccGcbwbWicbxcbycbzcaqcaqcaqcaqcbAcbBcbCcbDcbCcbEbzGcavcaxcawcgpcaybMdbMdbMdbMdbMdcazcgpbNRbRecaAbzBaahbFvbFvbFvbFvbFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbSaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabWFbzocbMbzobWFalWalWalWalWbWHcbObWHcbPchBcbRcbScbTbWHcbUcbVcbWbWHcbXcbYchQbWHccabWHbWHbWHbWHbWHbWHcklccbbBhbCRbCKcibccgcchcciccjcckcchbASccmbASccnccobASccmbASciKccqccrccsciWbATccvbATccwccxbATccvbATcctccyccyccyccyccycczbepbAUccBbAVbyVccDbYGcahcajcajcagccEcajcajcagccFbWichAccHbWibYMccIccJcbCcbCcbEcbCcbCccKcbucbdcbucbubzBcbvcbGcbFcbIcbHbEScgpcgpcaybMdcbJbPubNRcbKbNSbzBaahaahaahaahaahaahaahaahbMoaahbMpaahbNWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaaabzocbQbzoaaaaahaaaaaaaaabWHcbObWHbWHbWHbWHccZbWHbWHcdacdbcdabWHbWHbWHbWHbWHcdccddbWHcdecdfcjgcdhccdcdjcdkcdlcdkcdmcdncdocdpcdqcdrbBbcggbBfcdvcdwcdxcdycghchmccmcdBcdCcdDccvcdEcdFcdGcdHcdIcdJchncdLcdMccycdNbBjcdPccycdQbepcdRcdScdTcdUcdVcdWcdXcdYcdZcdWcdXcdYcdYcdWceacebceccedccLcefbYNapwcegcehcbucbucbucbucbuceicejcekbzBccMccNcgpcgpbPqccObFbbFbccPccQccPbFbccRccSbNSbzBbzBbzBaRJaRIaRJaRIaRJaaabCaaaaaahaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaahaahbzocbMbzoaahaahaahaahaahbWHcewcexceybWHcezceAceBbWHceCceDceEceFckXceHckZbWHceJceKceLceMbBlceObBRccUceRceSceTceUceVbDVbDWcchceXceYbCmcfacfbcfccfdcfecffcfgcfhcficdBcdCcdDcfjcfkcflcfmcfncfocfpcfpcfqcfqbCncfscftcfuccycfvbepcfwcfxcfybyVcfzcfAcfBcfCcfDcfCcfEcfCcfFcfCbCJbWibCLcfIcfJcfKccKaocaocaoccbucfLcfMccVcfOcfPcfQcfRbzBccWccYccXcdscdicelceecencemcepceocerceqcevbNSceQchMceQchVchVchVchVciIaahaafaaaaahaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaacfHaaaaaaaahaaaaahaaabWHbWHbWHcbObWHcgicgjcgkcglcgmcgncgoceHceHceBclLbWHcgqcgrbWHcaQcgscgtcgucklbCTbCScmDcgycgzcgAcmEccpccpcgCccpcgDcgEcgFcgFcgGcgHcgIcgJcgKcgLcgMcgNcfjcfkcfkcfkcgOcgPcgQcgRcgScgTbDucgVcgWcgXccycgYbepbepbepbepbWibWicfNbWibWibWibWibWibWibWibWibWibWibWibWibWichachbaoccnHcnqcbuchechfbbichhchichjchkbzBcfScfScfTcfScfUcfScfTcfVcfUcfUbNScfScfWcfYcfXbzBbzBbzBcjjcjochVcjpcjjaaabCaaaaaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8086,14 +8086,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaahaaaaaaaQxaaacgcaaaaaaaaaaaaaahaaabLQbSccocbTrbSQcmCcqBcqCcaRcljcmMcqDcqEcqFcqGcqHcmMcqIcqJcqKcmMciZcqMcqNcqOctPbTNcqRcdwcqScpMcuCbUabUcbUbckUcpMbZncjhcqYcuHcuObUCbEFcrbcrccrdcrecrfcjCcuZcvbcvacvNcvfbUNcrmcrncrocrpcrqcfkcrrcrscrtcfkcrucrvcrwcfkcwwbQSbUPckfcwDbUTcwHclkbUVbEHcjDbWHbWHcrFbWHcrGcwMceHceHcrIcwXbLQaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaahaaachVcpScnVbzBcnVaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaaaaaaaahaaaaaaaafaaabBkaahaaaaaaaaaaahaaabLQbLQcoccmCcmCcoccoccrPcaRcljcmMbVbcrRcrScrTcrUcmMcllcrWcrXbVTcrZcsacsbcsccsdcsecsfcdwcdxbPdcshcsicsjcxkcslcpMceBcjhcsmcxxcxycspcsqcsrcsschUcstcsucxOcxNcsxcsycszcsAbVZcsCcsDcsEcsFcsGcsHcsIcsJcsKcsLcsKcsMcsNcsOcsPcxlbWabXubWNclmbXybXSbXRcnjcsZbWHctactbctcbYicqsceHceHctdctebWHctfaahaaaaaaaaaaahaaaaaaaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaaaaaahaaaaahaaaaaaaahaaaaahaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaahaahaaaaaaaQxaaacfHaaaaaaaaaaaaaahaaabLQcthcoccticoccoccpxbWHbWHctjcpIctlcrRctmcrTctnctoctpctqctrctscttctuctvctwctxctyctzctAcgEcblctCcxPctEctFctEcpQctHcjhctIcyKczGcyLbEFcsrcsschUcstctMcgdczNcASczOctQctRbUNctSctTctUctVctWctXctYctZcfpcfpcuacubcuccudcuecbocbncxzcxoccccbNccfcqdbEHcjDbWHcuncuocupcpjcuqcrIcjEceHcurbLQaaaaahaaaaaaaaaaahaahaafbBZbBZbBZbBZbBZbBZaafbBZbCabBZbMpaahbCaaahaahaafbNWbNWbNWaafaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaQxaaabEzaaaaaaaahaahaahaaabLQcuscmCcodcmCcutceBcclbWHcljcmMcuvcuwcuxcuycuzcmMcBmcuBcBpcmMcuDcoecuFcuGcBqbTNcuIcdwcuJcpMcuKcuLcuMcuNcBscpMcuPcjhcjhcrKcjhcjhcjhcjhcuRcuScuTcjqcjqcjqcjqcjqcuUcrVcjqcjAcjAcrYcuXcuYccCccAccTcvccvccvccvccvdcvecCfcvdbEHbEHbEHctkcsBcdtcCObEHcjDbWHctacdubWHcvlcvmcdAcDacDacdObWHaahaahaahaahaahaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaabCaaaaaaaaahaaaaaaaahaaaaahaahaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaQxaaabEzaaaaaaaahaahaahaaabLQcuscmCcodcmCcutceBcclbWHcljcmMcuvcuwcuxcuycuzcmMcBmcuBcBpcmMcuDcoecuFcuGcBqbTNcuIcdwcuJcpMcuKcuLcuMcuNcBscpMcuPcjhcjhcrKcjhcjhcjhcjhcuRcuScuTcjqcjqcjqcjqcjqcuUcrVcjqcjAcjAcrYcuXcuYccCccAccTcvccvccvccvccvdcvecCfcvdbEHbEHbEHctkcsBcdtcmfbEHcjDbWHctacdubWHcvlcvmcdAcDacDacdObWHaahaahaahaahaahaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaabCaaaaaaaaahaaaaaaaahaaaaahaahaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaQxaahaafaQxaaaaafaQxaQxaahaahaahbEzaahaahaahaaaaahaahbLQcmCcutcmCcvpcqscxAcxBcmFcmGcmMcvrcvscetcvuceucmMcuAcvxcvycmMcuQcvAcvAcvAcvAcvAcvBcvCcvDcvEcvFcvGceNcvIcePcpMcvKcvLcvMcvOcDbcvPceKcvQcvRcvScvTcvUcuVcvLcvXcvYcvZcwacuWcwccvzcvicwfcwgceZcwicwjcwkcwlcwmcwncvdcwocwpcwqcwrcwsbEHbEHbEHbEHbEHbEHcwtbWHbWHbWHbWHbWHbWHbWHbLQbWHbWHbWHaaaaahaaaaaaaaaaahaahaahaafbCabCabCaaafbCabCabCaaafbCabNWbCabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachsaaaaaaaaaaahaaaaaaaaaaahaaaaaaaahaaacgcaaaaaaaahaaaaahaaabLQbLQbLQbLQbWHcwycxEbWHbWHcljcmMcmMcmMcmMcmMcmMcmMcmMcvVcmMcmMcwAbWHcwBcfGcDdcwEctzcwFcwGcpMcDicwIcwJcwKcwKcwKcwKcwKcwKcwKcwLcvWcwLcxScwNcwOcwPcxWcwdcwbcwebWHcEicEicEucEicEicwScwVcwWceZcEVcwYcwZcxacxbcxccvdcxdcxecxfcxgcxhcoUcddciRbWHcxickdcxjbWHcylcddbWHaaaaahaaaaaaaaaaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaahaaaaahaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaabEybEybEybEybEyaahaahaahbEybEybEybBkbEyaaaaQxaaaaahaaaaaaaaaaaaaahbWHbWHbWHbWHcyrcljchEcyXcyEceHczbcaQchEciPbZnbWHcxpceHbWHcxqcxrcxscxncxucxvcxwcpMcpMcpMcpMcwKcgUcgxchGchtchJcwKcxCcxDcxIcxFcxGcdCcxHbWHcxKcxJcxMcxLcEicEWcFPcEXcEicyIcxQcxRciDcxTcxUcxVczdcxXcxYcvdcxZcyacybcyccydcoUcyecyfcygcyhchEcyicygcyjctdbLQaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaahbEXbFabFabFabFabFfbEzbFtbFrbFrbFrbFrbFEaahaahaahaahaahaahaahaahaahabjbWHcykbWHczecymciiciiciiciiciiciiciiciociicynceHcyobWHcypcyqcyqcyqcyscytcyucyvcywcyxcyycwKcyzcyAcyBcyCcyDcwKcqXcyFcyGcyHcxGcdCcCZcwRcyJcwRcwRcwRcEicFTcFUcFPcGrczocyMcyNcyOcyPcyQcyRcyRcyScxXcvdcyTcyacyUcyVcyWcoUciEcyYbWHcyZceHczabWHceHczlbWHaaaaahaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaahaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbJebJebJebJebJeaaabEzaaabJebJebJebJebJeaaaaQxaaaaaaaaaaaaaahaahciGciFciLczfczgczfceEceBceHceHceHczhcziczjceHceHczkbZpcznbWHczmciHczJczIczqczrczscyvcztczuczvcwKczwczxczyczzczAcwKciJczCcwLcwLczDcdCcjncwRczKczHczMczLcEicGtcFPcGucEicABczPczQcvcczRczSczTczUczVczWcvdczXczYczZcAacyVcoUbWHbWHbWHcqobWHcAbbWHbWHbWHbWHaahaahaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaahaaaaahaahaahaaabKIaaaaahaaaaahaaaaahaaaaQxaaaaaaaaaaahaahaaaabjabjbWHczpbWHceHchEceHceHcAdbWHbWHbWHbWHbWHchEczkcaQcgsbWHcAecAfcAgcAhcAicAjcAkciUcAmcAncAociVcAqcArcAscAtcAuciXcjbcAwcAxcwLcjmcAycAzcAAcAEcADcADcAGcEicGNcGNcGVcEicdHczPcAHcvccvccvccvccvccvccvccvdcvdcvdcAIcvdcvdcoUcxicAJckdcAKbWHceHcALcAMcANcAMabjabjaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaabEybEybEybEybEyaahbEzaahbEybEybEybEybEyaahaQxaaaaaaaaaaafaaaaaaaahabjbWHbWHbWHcdebWHcgscAcczBbWHcAQcARcAQbWHcdeczkcBPcBPcBPcBPcBPcBPcBPcATcAUcAVcAWcAXcAYcAZcBacBbcBccBdcBecBfcBgcBhcBicBjcBkcBlcdCczEczFcBncACcACcBocEicGWcGXcGXcEicBrcBtcBucBvcGYcHkcBycBzcBAcBBcBCcBDcBEcBFcBGcBHcdecBIceHceHbWHbWHcBJbWHbWHbWHbWHaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaabEybEybEybEybEyaahbEzaahbEybEybEybEybEyaahaQxaaaaaaaaaaafaaaaaaaahabjbWHbWHbWHcdebWHcgscAcczBbWHcAQcARcAQbWHcdeczkcBPcBPcBPcBPcBPcBPcBPcATcAUcAVcAWcAXcAYcAZcBacBbcBccBdcBecBfcBgcBhcBicBjcBkcBlcdCczEczFcBncACcACcBocEicGWcGXcGXcEicBrcBtcBucBvcpncCOcBycBzcBAcBBcBCcBDcBEcBFcBGcBHcdecBIceHceHbWHbWHcBJbWHbWHbWHbWHaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbEXbFabFabFabFabFfbEzbFtbFrbFrbFrbFrbFEaahcrMaahaahaahaQxaahaahaahaahaahaaabWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHcqsczkcBPcjQcBLcBMcBNcBOcBPcBQcBRcBScyvcBTcBUcBVcwKcBWcBXcBXcBXcBYcwKcBZcCacCbcCccCdcCecCgcwRcChczHcCYcDccEicHocHqcHpcGrcIScCicCjcDecClcCmcCncCocCpcCqcCrcCscCqcCtcCucBHbWHcCwbWHcCvcCvcCxcCycCzcCAcCBaahaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcCCcjScCCaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbJebJebJebJebJeaaabSbaahbJebJebJebJebJeaaaaQxaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaahaahaaaaaaaaaaahaaaaaabWHceHcCEcDfcCFcCGcCHcCIcCJcCKcCLcCMcCNcyvcjUcjTcCQcwKcCRcCScCTcCUcCVcwKcCWcCXcCXcwLbSLcDgcDUcDScEScDVcEUcETcEicHrcHBcHvcHDcEYcFQcDhcHMcDjcDkcDlcDmcDmcDncDocDpcDqcDrcjVcDtcDucDvcDwcDxcDycDzcDzcDzcDAcjWaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjScCCckncCCcjSaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrMaaaaahaaaaahaaaaahaaabBkaaaaahaaaaahaahaahaahcrMaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaahaaaaaabWHchEcDEcBPcDFcDGcDHcDIcDJckqcDLcDMcDNcyvcyvckMcyvcwKcwKcwKcwKcwKcwKcwKckNcwLcwLcAlcFRcwOcwPcApcFScFScGTcGRcEicIhcItcImcIucHLcHQcHPcIdcDXcDYcDZcEacEbcEccEdcEecEfcEgcEhcIycEjcEkcElcEmcEncEocEpcEqcErcjWaahaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcEtcjScEvckRcExcjScEtaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index 3ecffff05b3..11c23c50af0 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -190,7 +190,7 @@ "dH" = (/turf/simulated/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/supply) "dI" = (/turf/simulated/floor/plasteel/shuttle,/area/shuttle/supply) "dJ" = (/turf/simulated/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/supply) -"dK" = (/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor{dir = 1; icon_state = "loadingarea"},/area/centcom/supply) +"dK" = (/obj/structure/closet/wardrobe/cargotech,/turf/simulated/floor{dir = 1; icon_state = "loadingarea"},/area/centcom/supply) "dL" = (/obj/structure/closet,/turf/simulated/floor{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/centcom/supply) "dM" = (/obj/structure/closet/secure_closet/quartermaster,/turf/simulated/floor{dir = 1; icon_state = "loadingarea"},/area/centcom/supply) "dN" = (/obj/structure/closet,/turf/simulated/floor{icon_state = "floor"},/area/centcom/supply) diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm index 181a961b31a..7eaad41fb6b 100644 --- a/_maps/map_files/MiniStation/MiniStation.dmm +++ b/_maps/map_files/MiniStation/MiniStation.dmm @@ -281,11 +281,11 @@ "fu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "fv" = (/obj/effect/landmark/start{name = "Scientist"},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "fw" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central) -"fx" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "browncorner"; dir = 1},/area/quartermaster/storage) +"fx" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -25; pixel_y = 0},/obj/structure/closet/wardrobe/miner,/turf/simulated/floor/plasteel{icon_state = "browncorner"; dir = 1},/area/quartermaster/storage) "fy" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "fz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "fA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage) -"fB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet/secure_closet/cargotech,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/quartermaster/storage) +"fB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet/wardrobe/cargotech,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/quartermaster/storage) "fC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/quartermaster/storage) "fD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/autolathe,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "fE" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage) @@ -328,7 +328,7 @@ "gp" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/weapon/crowbar/red,/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"}) "gq" = (/obj/structure/table,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "gr" = (/obj/machinery/newscaster{pixel_y = 32},/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"gs" = (/obj/structure/closet/secure_closet/scientist,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) +"gs" = (/obj/structure/closet/wardrobe/science_white,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "gt" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/research{name = "Research Division"}) "gu" = (/obj/machinery/door_control{dir = 2; id = "rnd"; name = "Shutters Control Button"; pixel_x = -24; pixel_y = -6},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"}) "gv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/medical/research{name = "Research Division"}) @@ -1205,6 +1205,7 @@ "xi" = (/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/bar) "xj" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/wood,/area/crew_quarters/bar) "xk" = (/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plasteel,/area/engine/engineering) +"xl" = (/obj/structure/closet/wardrobe/white/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) "xm" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay) "xn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/engine/engineering) "xo" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering) @@ -1220,6 +1221,7 @@ "xy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall,/area/crew_quarters/bar) "xz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar) "xA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"xB" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/engine/engineering) "xC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/landmark/start{name = "Bartender"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "xD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) "xE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -1296,7 +1298,6 @@ "yY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/vending/snack,/turf/simulated/floor/plasteel,/area/hallway/primary/central) "yZ" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel,/area/engine/engineering) "za" = (/turf/simulated/floor/plasteel,/area/engine/engineering) -"zb" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/engine/engineering) "zc" = (/obj/structure/grille,/turf/simulated/wall/r_wall,/area/engine/engineering) "zd" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/turf/simulated/wall/r_wall,/area/engine/engineering) "ze" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplatecorner"; dir = 1},/area/engine/engineering) @@ -1799,12 +1800,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavYwawvwuvSwwvSwwvSwwvSwwvSwxvZambxbNbSbNbxwAwBwCwDwEwFlPbxfXfXfXsusuwGsususuttwIsuwJsutCsufXwLwMwNwObxaaaaaaaaamamnPwPwQwRwStDnPamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaphvSvSvqvSwwvSwwwzwwvSwwvSwxvZambxbNbSbNbxbNwWwXwYwZnDbObxfXfXiUsuxaxbueufxeuGxgxhxixjuHsuidbxbxbxbxbxaaaaaaaaaaamhxxmuJpfuUxphxamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavYwUwvwuvSwwvSwwvSwwvSwwvSwxvZambxbNbSbNbxbNxrxspxxsbTxubxfXfXfXsuxvxwxxxyxzxAqCxCxDxExFsubNbxamamaaaaaaaaaaaaaaaanPxGpfpfpfxHnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqwVvmvsvSvSvSvSvSvSvSvSvSvYvZambxcxnNprprprxLbxxMbxbTbObxxNfXxOsuuVsAxRwIxSsMxUxVxWsNuHsubNbxbxbxamaaaaaaaaaaaaaanPnPxZyaybnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqvmvmvmvmvmvmvmvmvmwVxIambxyddtmGbNbNxrbxvobxyfygtNksksksyhyiyjykylsusususususuymsubNbMbNbMbLamamamamamamamamnPhxhxhxnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqwVvmvsvSvSvSvSvSvSvSvSvSvYvZambxcxnNprprprxLbxxMbxbTbObxxNfXxOsuuVsAxRwIxSsMxUxVxWsNuHsubNbxbxbxamaaaaaaaaaaaaaanPxZyaybpfxlnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqvmvmvmvmvmvmvmvmvmwVxIambxyddtmGbNbNxrbxvobxyfygtNksksksyhyiyjykylsusususususuymsubNbMbNbMbLamamamamamamamnPnPhxhxhxnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxbybxbxbxbxbxbNxrbxbxbxbNmsynyojqypyqyrysytpryuyvbNmubNbNbNbNbNbxbybxamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaambxbNbMcTprprywpryxprprprprpryylYlYlYyzmYyAyAyAyAyAyAyAyAyAyAyAbxbxamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamuIbMbNyByCyAyAyAyAyAyAyAyAyAyAyDyEfXyFyGyAyAyHyHyIyIyJyJyKyLuTyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaameXeXyBvgyOyPyRyQySyTyUyVyWyAyXikfXinyYyAyZyHyHyIyIyJyJyKzazbyByBamamzczczdzdzcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaameXeXyBvgyOyPyRyQySyTyUyVyWyAyXikfXinyYyAyZyHyHyIyIyJyJyKzaxByByBamamzczczdzdzcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamqIzazfzazgzgzgzazavwziyAzjfXfXfXzkyAyZyHyHyIyIyJyJzlzazmznqIaaaazczozozozcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqIzazqzrzsztztzrzazuzvzwzxzyzzzAzByAzCzDzDzEzEzFzFzGzHzIzJqJzLzLrmwyzOzPzcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqIzazqzazRzSzSzTzTzUzazVzWzXvhzXzZvKAbAcAcAcAcAcAcAdAezmznqIaaaazczozozozcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 95d017a4a21..2a1de1d8752 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -3123,8 +3123,8 @@ "bic" = (/obj/structure/table,/obj/item/clothing/head/soft,/obj/item/clothing/head/soft,/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bid" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/item/weapon/hand_labeler,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bie" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor/plasteel,/area/quartermaster/storage) -"bif" = (/obj/machinery/camera{c_tag = "Cargo Bay North"},/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor/plasteel,/area/quartermaster/storage) -"big" = (/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor/plasteel,/area/quartermaster/storage) +"bif" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet/wardrobe/botanist,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics) +"big" = (/obj/machinery/camera{c_tag = "Cargo Bay North"},/obj/structure/closet/wardrobe/cargotech,/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bih" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bii" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/quartermaster/storage) "bij" = (/obj/machinery/door_control{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -1; pixel_y = 24; req_access_txt = "31"},/turf/simulated/floor/plasteel,/area/quartermaster/storage) @@ -4232,7 +4232,7 @@ "bDt" = (/obj/machinery/computer/security/mining,/obj/machinery/camera{c_tag = "Mining Dock"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock) "bDu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock) "bDv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock) -"bDw" = (/obj/structure/rack{dir = 1},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/weapon/shovel{pixel_x = -5},/obj/item/weapon/pickaxe{pixel_x = 5},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock) +"bDw" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet/wardrobe/miner,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock) "bDx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/quartermaster/miningdock) "bDy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) "bDz" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) @@ -4496,7 +4496,7 @@ "bIx" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"}) "bIy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bIz" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) -"bIA" = (/obj/structure/closet/secure_closet/scientist,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) +"bIA" = (/obj/structure/closet/wardrobe/science_white,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "bIB" = (/obj/item/device/assembly/signaler{pixel_x = 0; pixel_y = 8},/obj/item/device/assembly/signaler{pixel_x = -8; pixel_y = 5},/obj/item/device/assembly/signaler{pixel_x = 6; pixel_y = 5},/obj/item/device/assembly/signaler{pixel_x = -2; pixel_y = -2},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "bIC" = (/obj/item/device/transfer_valve{pixel_x = -5},/obj/item/device/transfer_valve{pixel_x = -5},/obj/item/device/transfer_valve{pixel_x = 0},/obj/item/device/transfer_valve{pixel_x = 0},/obj/item/device/transfer_valve{pixel_x = 5},/obj/item/device/transfer_valve{pixel_x = 5},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = -30},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "bID" = (/obj/item/device/assembly/timer{pixel_x = 5; pixel_y = 4},/obj/item/device/assembly/timer{pixel_x = -4; pixel_y = 2},/obj/item/device/assembly/timer{pixel_x = 6; pixel_y = -4},/obj/item/device/assembly/timer{pixel_x = 0; pixel_y = 0},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) @@ -6009,7 +6009,7 @@ "clC" = (/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/engine/engineering) "clD" = (/obj/structure/table,/obj/item/device/flashlight{pixel_y = 5},/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/weapon/airlock_painter,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering) "clE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering) -"clF" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/hazardvest,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/obj/machinery/camera{c_tag = "Engineering East"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering) +"clF" = (/obj/structure/closet/l3closet/scientist{pixel_x = -2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "clG" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "clH" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "Incinerator"; luminosity = 2; on = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) "clI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 0; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator) @@ -6488,6 +6488,7 @@ "cuN" = (/turf/space,/turf/simulated/wall/shuttle{dir = 2; icon_state = "swall_f10"; layer = 2},/area/shuttle/pod_4) "cuO" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/wall/shuttle{icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_4) "cuP" = (/obj/machinery/door/airlock/engineering{name = "Telecommunications"; req_access_txt = "61"},/turf/simulated/floor/plasteel,/area/tcommsat/computer) +"cuQ" = (/obj/structure/rack{dir = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/weapon/pickaxe{pixel_x = 5},/obj/item/weapon/shovel{pixel_x = -5},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock) "cuR" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/doorButtons/access_button{idSelf = "virology_airlock_control"; idDoor = "virology_airlock_interior"; name = "Virology Access Button"; pixel_x = 8; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/medical/virology) "cuS" = (/obj/machinery/atmospherics/binary/pump{dir = 1; on = 1},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/obj/machinery/doorButtons/access_button{idSelf = "incinerator_access_control"; idDoor = "incinerator_airlock_interior"; name = "Incinerator airlock control"; pixel_x = -8; pixel_y = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine,/area/maintenance/incinerator) "cuT" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (NORTH)"; dir = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage) @@ -6505,6 +6506,7 @@ "cvf" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_interior"; locked = 1; name = "Turbine Interior Airlock"; req_access_txt = "32"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/maintenance/incinerator) "cvg" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_exterior"; locked = 1; name = "Turbine Exterior Airlock"; req_access_txt = "32"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/maintenance/incinerator) "cvh" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cvi" = (/obj/machinery/camera{c_tag = "Engineering East"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6619,7 +6621,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDccsOcsOcsYarraDbarraDbarraDbarraDbarraCXaDeavMaBGaEqaAvaEraEsaEtaEuaEvaEwayuaExazEaEyaEzaEzaEAaEBaECaEDaEEaEFawKaEGaEGaEGawKaEHaEIaAEaafazNaEJaDyaEKaELaEMazNaafaxoaENaEOaEPaEQaDCaERaESaETaEUaEVaxKaEWaEXaDJaDJaDJaEYaEZaxKaFaaFaaxKaDJaxKaFbaoeaFcacAaeUaeUaeUaeUaeUamXawvaFdaFeaFfaFgaFeayoaFeaFiaFeaFjayZaFkaFlaFmaBdaFnaFoaFpaFqaFraFsaFtaFuaFuaFuaFuaFvaFwaFuaFuaFxaFyaFzaFAaBpaFBaFCaFDaFEaFFaFEaFGaFHaEfaEfaFIaEfaFJaFKaFLaEfaEiaFMaEiaFNaFOaFPaFQaFRaFSaFTaFUaFVaFWaFXaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDcarrarrctiarraDbarraDbctaaDbarraDbarraCXaDeavMaBGaGcaAvaAvaGdaGeaGfaGgaAvayuayuayuayuaGhazEaAzaGiayuaGjaGkaBYaBYaBYaFhaBYaBYaBYaGmaAEaaaazNazNaGnaGoaGnazNazNaaaaxoaxuaxvaGpaGqaGraGsaGtaxvapNaGuaxKaGvaEXaDJaDJaDJaEYaGwaxKaAgaAgaxKaCsaxKaGxaGyaGzacAamXacAacAacAacAacAaGAaGBayZaGlaAmayZaGDayZaGEayZaGFayZaGGaGHaFmaBdaGIaGJaGKaGLaGMaGMaGNaGMaGMaGOaSOaGPaGQauwauwauwauwaGRaGSaGTaGUaGVamlaGWaGWaGWaGWaGXaEfaGYaGZaHaaGCaHcaHdaEfaLyaHfaEiaHgaHhaHiaHjaFRaHkaEjaEkaCTaHlaHmaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDcaDdaDdaDaarraDbarraDbarraDbarraDbarraCXaDeavMaHpaHqaHraHsaHsaHtaHuaxaaHvaHwaHxaHyayuaHzazEazEaHAayuaHBaHCaBYaHDaHEaOwaHGaHHaHIaHJaAEaaaaafaaaaHKaHLaHKaaaaafaaaaxoaxuaxvaDCaHMaHNaHOaHPaxvapNasJaxKaHQaHRaDJaDJaDJaHSaHTaxKaaaaaaaHUaHVaHWaHXaHYbzZaIaaIbaHUaaaaaaaIcaIdaIeaIfayZaIgaAmaAmaAmaCxaAmaAmaAmayZaBdaIhaIiaBdaBdaApaIjaIkaIkaIlaImaInaIkaIoaIpaIpaIqaIpaIraIpaIsaGWaGWaItaGWaGWaGWaGWaIuaIvaGWaGXaEfaGZaIwaIxaIyaIzaIAaEfaIBaICaIDaIEaIFaIGaIHaIIaIJaBAaIKaFVaFWaILaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBFaBEaBEarsartarrarrarrarrarrarraCZarraCXaCYavMaBGaxaaIOaIPaIPaIPaIPaIPaIPaIPaIQaxaayuaIRaISaIRayuayuaITaIUaIVaADaADaADaADaIVaIWaIXaAEaIYaIZaIZaJaaJbaJaaIZaIZaJcaxoaJdaxvaJeaxvaJfaJfaJgaxvaJhaJiaxKaxKaxKaAgaDHaAgaxKaxKaxKaHUaHUaHUaJjaHYaHYaHYaHYaHYaJkaHUaHUaHUaIcaJlaIeaJmayZayZayZayZayZayZayZayZayZayZaJnaJoaJpaJqaJraJsaJtaJuaIkaJvaImaJwaJxaJwaIpaJyaJzaIpaJAaIpaJBaJCaJDaJEaJFaJFaJFaJGaJHaJIaGWaGXaEfaJJaIwaJKaIyaIzaJLaEfaJMaJNaJOaJPaJQaJRaJSaJTaJUaJVaJWaCTaHlaHmaFYaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBFaBEaBEarsartarrarrarrarrarrarraCZarraCXaCYavMaBGaxaaIOaIPaIPaIPaIPaIPaIPaIPaIQaxaayuaIRaISaIRayuayuaITaIUaIVaADaADaADaADaIVaIWaIXaAEaIYaIZaIZaJaaJbaJaaIZaIZaJcaxoaJdaxvaJeaxvaJfaJfaJgaxvaJhaJiaxKaxKaxKaAgaDHaAgaxKaxKaxKaHUaHUaHUaJjaHYaHYaHYaHYaHYaJkaHUaHUaHUaIcaJlaIeaJmayZayZayZayZayZayZayZayZayZayZaJnaJoaJpaJqaJraJsaJtaJuaIkaJvaImaJwaJxaJwaIpaJyaJzaIpaJAaIpaJBaJCaJDaJEbifaJFaJFaJGaJHaJIaGWaGXaEfaJJaIwaJKaIyaIzaJLaEfaJMaJNaJOaJPaJQaJRaJSaJTaJUaJVaJWaCTaHlaHmaFYaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBFaBEaDfaBEaDcaDcaDcaDcaBEaDgaEmaEnaqpaJZaxaaKaaHbaKbaKcaKbaKdarpaKeaKfaxaaKgaKhaKiaKiaKjaKiaKkaKlaKiaKiaKiaKiaKiaKiaKiaKmaKnaKoaKpaKqaKqaKraKsaKqaKqaKqaKtaKuaKvaKraKqaKqaKqaKwaGyaKxaHYaKyaKzaHZaIaaIaaIaaHXaHYaHYaKAaHYaHYaKBaKCaKDaKEaKFaKGaKHaHYaHYaKAaKJaKKaKLaKMaKNaKOaKPaKQaHYaKRaHYaBdaKSaKTaKUaJoaKVaKWaKXaKYaKZaLaaIkaLbaLcaLdaLeaLfaIpaLgaJzaLhaLiaIpaIpaLjaLkaLlaLmaLnaLoaLpaLqaLraGWaGXaEfaLsaLtaLuaLvaLwaLxaEfbhpaLzaEiaLAaLAaLAaLAaEiaLBaCRaJWaCTaBDaBDaBDaLCaLCaLCaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaylavMavMavMavMavMavMaylavMaaaaqpaAuaLEaKaaLFaLGaLHaLHaLIarpaLJaKfaLKaLLaKhaLMaLNaLOaLPaLQaLRaKiaKiaKiaKiaKiaKiaKiaKmaKiaKhaKiaKiaKiaLSaLTaLUaLUaLUaLUaLVaLUaLWaLUaLUaLXaKhaGyaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaKAaHYaHYaLYaLZaMaaKIaMcaMbaMeaHYaHYaKAaHYaHYaHYaHYaHYaHYaHYaHYaHYaMgaHYaBdaKUaKUaKUaMhaMiaMjaMkaMlaMmaMnaIkaMoaImaMpaIkaIkaIpaMqaJzaMraLiaMsaIpaGWaGWaGWaGWaGWaGWaMtaMuaMvaGWaGXaEfaMwaGZaMxaMyaGZaMzaEfaEiaEiaEiaEiaEiaEiaMAaEiaEjaEjaEkaCTaMCaMDaBDaMEaMFaMGaMHaMIaLDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpavMatBavMaNTaNUaNVaNWavMatBavMavMaqpaBGaxaaKaaMJaMKaLHaLHaLIarpaMLaKfaxaaLLaKhaKiaMMaMNaMNaMNaMOaMPaMQaMNaMRaMNaMNaMNaMSaMNaMTaMNaMNaMNaMUaMVaMWaMXaMXaMYaMZaNaaNbaNcaKicrraKhaGyaHYaNeaHYaNfaNfaNfaNfaNfaNfaNfaNfaNgaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNhaNfaNfaNfaNfaNfaNfaNfaNfaHYaHYaHYaBdaNiaNiaNiaNiaNiaNjaNkaJsaODaRdaIkaNmaNnaNoaIkaNpaIpaNqaNraNsaLiaNtaIpaGWaNuaNvaNwaNxaNwaNyaNzaNAaGWaGXaEfaNBaNBaNCaNDaNEaNEbqoaEfaNGaNHaNIaBDaNJaNKaNLaEjaEjaNMaNNaBDaNOaBDaNPaNQaNRaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6638,7 +6640,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarpavMbdyavMaBGaxaaxaaMBavMbdAavMayqbdBbdCbdCbdDbdEbdFbdGbdHbdIbdJbdKbdLbdMbdMbdNbdOaWAaWAaWAbdPbdQaWAaOcaOcaOcaOcbdRaVbbdSbdTaVbbdUaYoaYpbdVaZGaZGbdWbdXaYpbdYaYvbdZbaHbaHbeabebbecbedaHYaWUaYxbaObeebaPbaPbefbaRbaSbegbcWaXfbeibejbekbekbekbelbemaXkbdzbeobepbeqberbajbesbajbetaYHaXqaHYaHYbeubeubeubeubeubeubeubevbewbewbexbeybeybevbezbezbezbezbezbeAbeAbeBbeCbeAbeAbeAbeAbeDaXFbeEbeFbeGbeHbeIaXFaXFaXFbeJbeJbeKbeKbeKbeKbeKbeLbeMbeMbeMbeNbeMbeObePbeMbeMbeQbeRbeRbeRbeRbeSbeTbeUbeVaLDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaztaqpazuatBavMaymaynbeWbeXavMatBazuavMaqpaztarpbdDbeYbeZbeZbeZbfabdJbfbbfcbfdbfdbfebffaWAaYdbfgbdPbfhaWAbfibfiaQEaQEbfjbfkbflbfmbflbflbfnaYpbfobfpaZGaZGbdXbfqbfraYvbfsbaHbaHbeabftbfubedaHYbfvaYxbfwaYAbfxbfybfzbfAbaSbfBaYxaafbfCbfDbfDbfDbfEbfFbfGaafaYHbfHbfIbfJbfKbajbfLbajbfMaYHaXqaHYbfNbeubfObotbfQbfRbfSbeubehbfVbfVbfWbfXbfXbfXbfYbfZbgabgbbezbgcbgdbgebgdbgdbgfbggbeAbeGbghbeGbeGbeGbgibeIbeIbgjbeIbgkbgkbeKbglbgmbgnbeKbgobgpbgobeKbgqbgrbgqbeRbgsbgtbgsbeRbgubgvbeRbgwbgxaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafavMbdyavMavMavMavMavMavMbdAavMaafaafaafaaabdDbgybdDbgzbeZbgAbgBbcraVbbgCbgDbgEbgFbgGbgGbgGbgGbgGbgGbgHbgIbgJbfdbgKbgLaYpaYpaYpaYpaYpaYpbgMaYpaYpaYpbgNbgObgPbgQbgRbaHbaHbeabgSbecbedaHYbgTaYxbgUaYAaYAaYAaYAbfAbaSbgVaYxaafbfCbfDbgWbgXbgYbfDbgZaafaYHbhabbYbhbbhcbajbesbajbajaYHaXqaHYaHYbeubqqbhebhfbhgbhhbhibfXbhjbfXbhkbfXbfXbhlbfYbhmbhnbhobezbhqbgdbkibgdbhqbhrbgdbeAbhsbhsbhubhvbeGbhwbeIbhxbhybhzbhAbhAbeKbhBbhCbhDbhEbhFbhGbhHbeKbhIbhJbhKbeRbhLbhMbhLbhNbhObhObeRbhPbgxaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaacuzaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaabdDbhQbhRbhSbhTbhTbhUbhVaWPbhWaOcbhXbhYbhZbhZbhZbiabiabiabiabiabiabiabibbgNbicbidbiebifbigbihbiibijaYpbikbilbimbinbinbiobaHbaHbeabaHaYvbedaHYaWUbipbiqbirbisbitaYAbiubaSaYxaYxaafbfCbfDbgXbfDbgXbfDbgZaafaYHaYHbivbcZbiwbajbixbiybizaYHaXqaHYbiAbiBbiCbiDbqrbiFbrWbiHbfXbiIbiJbiKbiLbiLbiMbfYbiNbhnbiObezbhqbgdbkibiPbhqbiQbiRbeAbiSbiTbiUbiVbeGbgibeIbiWbiXbiXbiYbiZbjabjbbjcbjcbjcbjdbjebjfbeKbjgbhJbjhbeRbjibjjbjkbjlbjmbjnbeRbhPbgxbjobjobjobjoaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaacuzaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaabdDbhQbhRbhSbhTbhTbhUbhVaWPbhWaOcbhXbhYbhZbhZbhZbiabiabiabiabiabiabiabibbgNbicbidbiebigbjxbihbiibijaYpbikbilbimbinbinbiobaHbaHbeabaHaYvbedaHYaWUbipbiqbirbisbitaYAbiubaSaYxaYxaafbfCbfDbgXbfDbgXbfDbgZaafaYHaYHbivbcZbiwbajbixbiybizaYHaXqaHYbiAbiBbiCbiDbqrbiFbrWbiHbfXbiIbiJbiKbiLbiLbiMbfYbiNbhnbiObezbhqbgdbkibiPbhqbiQbiRbeAbiSbiTbiUbiVbeGbgibeIbiWbiXbiXbiYbiZbjabjbbjcbjcbjcbjdbjebjfbeKbjgbhJbjhbeRbjibjjbjkbjlbjmbjnbeRbhPbgxbjobjobjobjoaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaabdDbjpbdDbjqbjrbjrbjsbdDbjtbjtaOcbjubjvbjubjubjubjvbjuaOcaOcaYpaYpaYpbjwbgNbjxbjxbjybjxbjxbjxbiibjxbjzbjAbjBbjCbjDbjEbjEbjEbjEbjFbjGbjHbjIbjJbjKbjLbjMbjNbjObjPaYAbfAbaSaYxaafaafbfCbfDbgYbjQbgWbjRbgZaafaafaYHbjSbjTaYHaYHaYHaYHbjUaYHbjVaHYaHYbeubjWbhebjXbhgbhhbjYbfXbjZbkabkbbkcbtmbkebezbkfbkgbkhbezbhqbgdbnZbkjbhqbkkbgdbeAbeGbeGbeGbeGbeGbgibeIbklbkmbknbkobkpbkqbkrbksbktbktbkubkvbkwbeKbkxbhJbkybeRbkzbkAbkBbkCbkDbkEbeRbhPbkFbkGbkHbkIbkHaaaaaaaafaaaaafaaaaafaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaabdDbkJbhRbkKbjrbkLbkMbdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkNbkObkPbkQbkRbkSbkSbkTcuTbkSbkSbkUbkSbkVbkWbkXbkYbkZbecbecbecblaaYvblbaYvblcbldaKAbipbleblfblfblfblfblgblhbliaafaaabljblkbllbfDbfDblmbgZaaaaafblnbloblpblqblrblsblnbltblnbluaHYaHYbeublvbhectCblwblxbeublybjZbkablzblAbfXblBbezblCblDblEbezblFblGblHblIblJblKblLblMblNblOblNblNblNblPbeIblQbhyblRblSblTbkqblUblVblWblWblXblYblZbeKbmabgrbmbbeRbmcbmdbmebkCbhObmfbeRbhPbmgbmhbmibmibmibmibmibmibmjaafaaaaafaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaabdDbmkbhRbhRbhRbdDbdDbdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkNbmlbjxbmmbmnbmobmnbmncuUbmnbmnbmpbmnbmqbmrbmsbmtbmubmvbecbmwbaHbmxbmybmzbedbmAbmBbipbipblibmCbmDbmEbmFbmGbliaaaaaabfCbmHbmIbmJbmIbmKbgZaaaaaablnbmLbmMbmNblnbmOblnbltblnbluaHYaHYbeubmPbhebjXbmQbmRbeubmSbmTbmUbmVbmWbfXbmXbezbfYbmYbmZbezbeAbnabeAbeBbnbbncbncbncbncbncbncbncbncbgibeIbndbkmbknbnebnfbngbnhbnibnibniblXbkvbnjbnkbnlbnmbnnbnobnpbnqbnpbnrbhObnsbeRbntbnubnubnubnubnubnubnubnvbgxbjobjobjoaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6657,8 +6659,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaelctjaekctjaejaaaaafaaabwlbwlbDtbxrbDubDvbDwbDxbDybDybDzbDAbDBbDCaafbDDbDEbDFbDGbDHbDIbDJbDIbDKbDIbDIbDIbBdbDLbDMbDNbBhbDObDPbDQbDRbDSbCvbDTbBjbBhbDUbDVbDWbDXbDYbDZbEabEbbCCbEcbCCbxQbEdbEebEfbEgbtXbEhbEibCCbCCbEjbEkbmSbmSbmSbmSbmSbElbEmbpGbEnbEobEpbBKbEqbAwbzibgibBMbCWbCWbCWbCWbCWbCWbCWbBMbErbEsbEtbEubEvbBNbEwbExbEybEzbEAbEBbECbEDbEDbEDbEDbEEbEFbEGbDnbjobvZbEIbEJbEJbEKbELbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNcuCctMcuCafNbERbERbERbwlbESbxrbETbEUbEVbEWbwlbBcbEXbBcbBcbEYbEZaaabFabFbbFcbFdbDIbDIbFebDIbFfbFgbFhbDIbBdbDLbFibFjbBhbFkbFlbFmbFnbFobCvbFpbBjbzibFqbFrbFsbFrbFtbFubtXbFvbCIbFwbCIbFxbtSbFybCJbFAbtXbFCbCCbCCbCCbCCbGNbmSbPIbFEbFFbFGbBEbFHbvlbFIbBKbBKbFJbFKbFLbFMbFNbBMbCWbCWbCWbCWbCWbCWbCWbBMbFObFPbFQbFRbFSbFTbFUbFVbtbbFWbFXbEDbFYbEDbEDbEDbEDbEDbEDbEDbDnbFZbDpbGbbGcbGdbGebGfbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbGgbENbEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekajxctyajxaekbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGQbtXbGObGPbGSbtXbGRbDqbEHbDrbFDbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbAQbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybGabHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajxajxajxctLbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbMNbMNbMNbMNbMNbMNbOnbOCbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdbIAbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbGLbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekctyctyctyaekbERbIObIPbIQbIRbxrbxrbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobvZbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMctxctlbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajxajxajxctLbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbMNbMNbMNbMNbMNbMNbOnbOCbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdclFbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbGLbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekctyctyctyaekbERbIObIPbIQbIRbxrcuQbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobvZbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMctxctlbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajZctzctAafNbERbERbERbwlbwlbERbERbERbwlbwlbwlaaaaaaaaabJYbJZbEZaaaaaaaafaaabBdbKabKbbKcbDIbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnbKobKpbKqbKmbKmbKmbKmbKmbKrbKsbKmbKmbKtbKmbKubKmbKmbKmbKmbKmbyebyebyebyebyebyebyebyebKvbKwbmSbKxbKybKzbKAbKBbKCbKDbKEbKFbKFbKGbKFbKFbKHbKIbBMbKJbKKbKLbKKbKMbKKbKNbKObKPbKQbKRbKSbKTbKUbyqbHnbqibKVaafbKWbKXbKYbKZbLabKZbLbbLcbLdbDnbLebsbbLfbDdbDdbDdbDdbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObLgbIMbIMbIMbLhbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYctjctkctjaeWaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaafbJYbEYbEZaafaafaafaafbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbLjbLkbLlbLmbKmbKnbKobKpbKqbLnbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLBaVQbLDbLDbLDbLDbLDbLDbLEbyebKvbLFbLGbLGbLGbLGbLGbLHbLIbLJbLGbLGbLGbLGbLGbLGbLFbLKbLLbLMbLNbLObLNbLPbLQbLRbLSbLSbLSbLSbLSbLSbLTbLUbLVbqibKVaafbKWbLWbLWcuEbLYcuFbMabMbbMcbDnbMdbsbbkFbjobMebMfbjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObMgbMhbMibMjbHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbMlbMlbMmbMnbMobMobMpbMpbMkbDLbMqbKkbMrbKmbMsbMtbMtbMubMvbLnbMwbMxbMybMzbMAbMBbMCbMDbMEbMFbMGbMFbMHbMIbMJaafbMKbMKbMKbMKbMKbMLbyebKvbMMcqzbMObMPbMQbLGbMRbMSbMTbLGbMUbMVbMWbMVbMUbLFbMXbBMbKKbKKbKKbMYbKKbKKbMZbNabNbbNbbNcbNbbNbbNdbNebNfbNgbKVaafbKWbLWbNhbKZbNibKZbNjbNkbNlbDnbsebsbbkFbjobsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbNmbENbMjaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -6688,7 +6690,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXchEbZZaafbZXchEbZZaafbZXchEbZZaaaaafaafaafaaaaaaaaaaagcjucjvcjubGnbGnbBcaaaaaachGcjwcjxcjycjzcjAchGaaabBccaXbGnciBchIceKciCciCciDceKcjBcgccjCcjDcjEcjFcjCcgccjCcjCcgccjGcjHcjIciIcjJcjKcjLceScjMceKbMKciVciWciVbMKciXciYciXbMKciZcjacjbbMKaafaafaafaafcnDaafcdjcdjcdjcjQcjRcjScvfcjUcjRaafaaaaafcfDaaaaaaaaaaaaaaaabtaafaafaafaafaafaafaaaaaaaaaaaaaaaaaabXkbsecjWbjocjXbsebjocjYbmhbmhcjZbmhbmibmibmickackackbchBckcckdckechBaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafbZXchEbZZaaabZXchEbZZaaabZXchEbZZaafaafaaaaafaafaaaaaaaagbBcbBcbBcbBcbGnbBcaafaafchGckfckgckhckickfchGaafbBcceKckjckkcklceKciCciDciDceKckmcknckockpceSckqckrcksckrckrcktckuckvckwckxckyckyckyckzckAceKbMKciVcjNciVbMKciXcjOciXbMKcjbcjPcjbbMKaaaaaaaafaafaaaaaaaaaaaaaaackBcjRckCckDcuScjRaafaafaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkckFbsebWwcgEbsebjobjobjobjobjobsebjoaafaaaaaaaaaaafckGckGckHckGckGaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabZXckIbZZaaabZXckIbZZaaabZXckIbZZaaaabfaaaaaaaafaafaaaaaaaaaaaaaaabJYbGnbJYaaaaaachGccNckKckLckMckNchGchGchGceKckOckkckPceKceKceKceKceKckQceRckRciHceSceRceRceRckSckTckUceSceSciHceRckVceRceRckWckXceKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKaaaaafaafaaaaaaaaaaaaaaaaaackYcjRcjScvgcjUcjRaaaaafaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkbsebuEbjoclabsebsebsebsebsebsebsebjoaafaaaaaaaaaaafaaackGclbckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaabfaaaaaaaaaaafaafaaaaaaaaaaaabJYbGnbJYaaaaaachGclccldcleclfclgclhclicljclhclkcllclmclncloclpclqclrclschLcqqcluclvclwclxclyclzclyclzclAclBclCchLchLclDchLclEclFceKceKceKceKceKcgccgccgccgcceKaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaackYcjRclGclHclIclJaaaaafaafaafaafaaeaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaabXkbXkbXkbjocipbjobjoclKclLbLebMdbjobjoaafaaaaaaaaaaafaaackGckHckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaabfaaaaaaaaaaafaafaaaaaaaaaaaabJYbGnbJYaaaaaachGclccldcleclfclgclhclicljclhclkcllclmclncloclpclqclrclschLcqqcluclvclwclxclyclzclyclzclAclBclCchLchLclDchLclEcviceKceKceKceKceKcgccgccgccgcceKaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaackYcjRclGclHclIclJaaaaafaafaafaafaaeaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaabXkbXkbXkbjocipbjobjoclKclLbLebMdbjobjoaafaaaaaaaaaaafaaackGckHckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabqabfabfabfabfabfabfabfabfabfaaaaaaaaaaaaaafaafaaaaaaaafbJYbGnbJYaafaafchGclMclNclOclPclQclRclSclTclRclUclVclWclXclYclZcmaclZcmbcmccmdcmecmfcmgcmhcmicmjcmkcmjcmlcmmcmnchPcmecmochPcmpcmqchPcmrceRcmsceKcmtcgccuOcuLcuLcuNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackYcjRcjRcmvcjRcjRaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafcmwaafbjobjobXkbXkbjobjoaaaaafaaaaaaaaaaafaaaaaacmxaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabJYbGnbJYaaaaaachGcmycmzcmAcmBcmCchGcmDcmEchGcmFceRcmGciHceScmHcjCcmIciIcmJcmKcmLcmLcmLcmMcmNcmOcmPcmQcmRcmMcmScmSckUceRckVciIcmTcmUcmVchLcmWcmXcgUcmXcuGcuJcuIcuHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackYaagcjRcmZcjRcnaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaeaaaaaaaaaaaaaaaaafcnbaafaaaaafaaaaaaaafaaaaaaaafaaaaaaaaaaafaaaaaacmxaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbBcbBcbRAbBcbBcaaachGcnccndcnechGchGchGchGchGceKcnfceRcmGcngcnhcnicjCcnjciIcnkcnlcnmcnncnoceKcnpcnqcnrcnscntceKcnucnvcnvcnlcnkciIcnwcnxceSceRcnyceKcnzcgccuKcuLcuLcuMaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaacfDaagcnBcnCcnBaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafcnDaafaaaaafaaaaaaaafaaaabfabfabfabqaafaafaafaafcmxaafaafaafaafaafabqabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm index 9dc7e9110c2..da78e2558b4 100644 --- a/_maps/map_files/generic/z2.dmm +++ b/_maps/map_files/generic/z2.dmm @@ -271,7 +271,7 @@ "fk" = (/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "CentComPort"; name = "Security Doors"; pixel_y = 28; req_access_txt = "101"},/obj/structure/showcase/fakeid,/turf/simulated/floor/plasteel/black,/area/centcom/control) "fl" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/simulated/floor/plasteel/red/side{dir = 2},/area/centcom/evac) "fm" = (/obj/structure/table/reinforced,/obj/item/toy/carpplushie,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel/red/side{dir = 6},/area/centcom/evac) -"fn" = (/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor/plasteel/loadingarea,/area/centcom/supply) +"fn" = (/obj/structure/closet/wardrobe/cargotech,/turf/simulated/floor/plasteel/loadingarea,/area/centcom/supply) "fo" = (/obj/structure/closet,/turf/simulated/floor/plasteel/warning/corner{dir = 1},/area/centcom/supply) "fp" = (/obj/structure/closet,/turf/simulated/floor/plasteel,/area/centcom/supply) "fq" = (/obj/structure/closet/secure_closet/quartermaster,/turf/simulated/floor/plasteel/loadingarea,/area/centcom/supply) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 058ae6c43d8..3cf9da86528 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -351,7 +351,7 @@ item_state = "duffle-sec" /obj/item/weapon/storage/backpack/dufflebag/engineering - name = "engineering dufflebag" + name = "industrial dufflebag" desc = "A large dufflebag for holding extra tools and supplies." icon_state = "duffle-eng" item_state = "duffle-eng" diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 9ac55af828a..4f57788059d 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -1,14 +1,5 @@ -/* Closets for specific jobs - * Contains: - * Bartender - * Janitor - * Lawyer - * Coffin - */ +// Closets for specific jobs -/* - * Bartender - */ /obj/structure/closet/gmcloset name = "formal closet" desc = "It's a storage unit for formal clothing." @@ -31,9 +22,6 @@ new /obj/item/clothing/shoes/sneakers/black(src) new /obj/item/clothing/shoes/sneakers/black(src) -/* - * Chef - */ /obj/structure/closet/chefcloset name = "\proper chef's closet" desc = "It's a storage unit for foodservice garments and mouse traps." @@ -58,9 +46,6 @@ new /obj/item/clothing/under/rank/chef(src) new /obj/item/clothing/head/chefhat(src) -/* - * Janitor - */ /obj/structure/closet/jcloset name = "custodial closet" desc = "It's a storage unit for janitorial clothes and gear." @@ -83,9 +68,7 @@ new /obj/item/weapon/watertank/janitor(src) new /obj/item/weapon/storage/belt/janitor(src) -/* - * Lawyer - */ + /obj/structure/closet/lawcloset name = "legal closet" desc = "It's a storage unit for courtroom apparel and items." @@ -105,7 +88,294 @@ new /obj/item/clothing/shoes/laceup(src) new /obj/item/clothing/shoes/laceup(src) +/obj/structure/closet/wardrobe/chaplain_black + name = "chapel wardrobe" + desc = "It's a storage unit for Nanotrasen-approved religious attire." + icon_door = "black" + +/obj/structure/closet/wardrobe/chaplain_black/New() + ..() + contents = list() + new /obj/item/clothing/under/rank/chaplain(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/suit/nun(src) + new /obj/item/clothing/head/nun_hood(src) + new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) + new /obj/item/clothing/suit/holidaypriest(src) + new /obj/item/weapon/storage/backpack/cultpack (src) + new /obj/item/weapon/storage/fancy/candle_box(src) + new /obj/item/weapon/storage/fancy/candle_box(src) + return + /obj/structure/closet/coffin name = "coffin" desc = "It's a burial receptacle for the dearly departed." - icon_state = "coffin" \ No newline at end of file + icon_state = "coffin" + +/obj/structure/closet/wardrobe/red + name = "security wardrobe" + icon_door = "red" + +/obj/structure/closet/wardrobe/red/New() + ..() + contents = list() + new /obj/item/clothing/suit/hooded/wintercoat/security(src) + new /obj/item/weapon/storage/backpack/security(src) + new /obj/item/weapon/storage/backpack/satchel_sec(src) + new /obj/item/weapon/storage/backpack/dufflebag/sec(src) + new /obj/item/weapon/storage/backpack/dufflebag/sec(src) + new /obj/item/clothing/under/rank/security(src) + new /obj/item/clothing/under/rank/security(src) + new /obj/item/clothing/under/rank/security(src) + new /obj/item/clothing/shoes/jackboots(src) + new /obj/item/clothing/shoes/jackboots(src) + new /obj/item/clothing/shoes/jackboots(src) + new /obj/item/clothing/head/beret/sec(src) + new /obj/item/clothing/head/beret/sec(src) + new /obj/item/clothing/head/beret/sec(src) + new /obj/item/clothing/head/soft/sec(src) + new /obj/item/clothing/head/soft/sec(src) + new /obj/item/clothing/head/soft/sec(src) + new /obj/item/clothing/mask/bandana/red(src) + new /obj/item/clothing/mask/bandana/red(src) + return + + +/obj/structure/closet/wardrobe/cargotech + name = "cargo wardrobe" + icon_door = "orange" + +/obj/structure/closet/wardrobe/cargotech/New() + ..() + contents = list() + new /obj/item/clothing/suit/hooded/wintercoat/cargo(src) + new /obj/item/clothing/under/rank/cargotech(src) + new /obj/item/clothing/under/rank/cargotech(src) + new /obj/item/clothing/under/rank/cargotech(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/clothing/head/soft(src) + new /obj/item/clothing/head/soft(src) + new /obj/item/clothing/head/soft(src) + new /obj/item/device/radio/headset/headset_cargo(src) + +/obj/structure/closet/wardrobe/atmospherics_yellow + name = "atmospherics wardrobe" + icon_door = "atmos_wardrobe" + +/obj/structure/closet/wardrobe/atmospherics_yellow/New() + ..() + contents = list() + new /obj/item/weapon/storage/backpack/dufflebag(src) + new /obj/item/weapon/storage/backpack/satchel_norm(src) + new /obj/item/weapon/storage/backpack(src) + new /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos(src) + new /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos(src) + new /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos(src) + new /obj/item/clothing/under/rank/atmospheric_technician(src) + new /obj/item/clothing/under/rank/atmospheric_technician(src) + new /obj/item/clothing/under/rank/atmospheric_technician(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/head/hardhat/atmos(src) + new /obj/item/clothing/head/hardhat/atmos(src) + new /obj/item/clothing/head/hardhat/atmos(src) + return + +/obj/structure/closet/wardrobe/engineering_yellow + name = "engineering wardrobe" + icon_door = "yellow" + +/obj/structure/closet/wardrobe/engineering_yellow/New() + ..() + contents = list() + new /obj/item/weapon/storage/backpack/dufflebag/engineering(src) + new /obj/item/weapon/storage/backpack/industrial(src) + new /obj/item/weapon/storage/backpack/satchel_eng(src) + new /obj/item/clothing/suit/hooded/wintercoat/engineering(src) + new /obj/item/clothing/under/rank/engineer(src) + new /obj/item/clothing/under/rank/engineer(src) + new /obj/item/clothing/under/rank/engineer(src) + new /obj/item/clothing/suit/hazardvest(src) + new /obj/item/clothing/suit/hazardvest(src) + new /obj/item/clothing/suit/hazardvest(src) + new /obj/item/clothing/shoes/workboots(src) + new /obj/item/clothing/shoes/workboots(src) + new /obj/item/clothing/shoes/workboots(src) + new /obj/item/clothing/head/hardhat(src) + new /obj/item/clothing/head/hardhat(src) + new /obj/item/clothing/head/hardhat(src) + return + +/obj/structure/closet/wardrobe/white/medical + name = "medical doctor's wardrobe" + +/obj/structure/closet/wardrobe/white/medical/New() + ..() + contents = list() + new /obj/item/weapon/storage/backpack/dufflebag/med(src) + new /obj/item/weapon/storage/backpack/medic(src) + new /obj/item/weapon/storage/backpack/satchel_med(src) + new /obj/item/clothing/suit/hooded/wintercoat/medical(src) + new /obj/item/clothing/under/rank/nursesuit (src) + new /obj/item/clothing/head/nursehat (src) + new /obj/item/clothing/under/rank/medical/blue(src) + new /obj/item/clothing/under/rank/medical/green(src) + new /obj/item/clothing/under/rank/medical/purple(src) + new /obj/item/clothing/under/rank/medical(src) + new /obj/item/clothing/under/rank/medical(src) + new /obj/item/clothing/under/rank/medical(src) + new /obj/item/clothing/suit/toggle/labcoat(src) + new /obj/item/clothing/suit/toggle/labcoat(src) + new /obj/item/clothing/suit/toggle/labcoat/emt(src) + new /obj/item/clothing/suit/toggle/labcoat/emt(src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/clothing/head/soft/emt(src) + new /obj/item/clothing/head/soft/emt(src) + new /obj/item/clothing/head/soft/emt(src) + return + +/obj/structure/closet/wardrobe/robotics_black + name = "robotics wardrobe" + icon_door = "black" + +/obj/structure/closet/wardrobe/robotics_black/New() + ..() + contents = list() + new /obj/item/clothing/under/rank/roboticist(src) + new /obj/item/clothing/under/rank/roboticist(src) + new /obj/item/clothing/suit/toggle/labcoat(src) + new /obj/item/clothing/suit/toggle/labcoat(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/clothing/head/soft/black(src) + new /obj/item/clothing/head/soft/black(src) + if(prob(40)) + new /obj/item/clothing/mask/bandana/skull(src) + if(prob(40)) + new /obj/item/clothing/mask/bandana/skull(src) + return + + +/obj/structure/closet/wardrobe/chemistry_white + name = "chemistry wardrobe" + icon_door = "white" + +/obj/structure/closet/wardrobe/chemistry_white/New() + ..() + contents = list() + new /obj/item/clothing/under/rank/chemist(src) + new /obj/item/clothing/under/rank/chemist(src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/clothing/suit/toggle/labcoat/chemist(src) + new /obj/item/clothing/suit/toggle/labcoat/chemist(src) + new /obj/item/weapon/storage/backpack/chemistry(src) + new /obj/item/weapon/storage/backpack/chemistry(src) + new /obj/item/weapon/storage/backpack/satchel_chem(src) + new /obj/item/weapon/storage/backpack/satchel_chem(src) + new /obj/item/weapon/storage/bag/chemistry(src) + new /obj/item/weapon/storage/bag/chemistry(src) + return + + +/obj/structure/closet/wardrobe/genetics_white + name = "genetics wardrobe" + icon_door = "white" + +/obj/structure/closet/wardrobe/genetics_white/New() + ..() + contents = list() + new /obj/item/clothing/under/rank/geneticist(src) + new /obj/item/clothing/under/rank/geneticist(src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/clothing/suit/toggle/labcoat/genetics(src) + new /obj/item/clothing/suit/toggle/labcoat/genetics(src) + new /obj/item/weapon/storage/backpack/genetics(src) + new /obj/item/weapon/storage/backpack/genetics(src) + new /obj/item/weapon/storage/backpack/satchel_gen(src) + new /obj/item/weapon/storage/backpack/satchel_gen(src) + return + + +/obj/structure/closet/wardrobe/virology_white + name = "virology wardrobe" + icon_door = "white" + +/obj/structure/closet/wardrobe/virology_white/New() + ..() + contents = list() + new /obj/item/clothing/under/rank/virologist(src) + new /obj/item/clothing/under/rank/virologist(src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/clothing/suit/toggle/labcoat/virologist(src) + new /obj/item/clothing/suit/toggle/labcoat/virologist(src) + new /obj/item/clothing/mask/surgical(src) + new /obj/item/clothing/mask/surgical(src) + new /obj/item/weapon/storage/backpack/virology(src) + new /obj/item/weapon/storage/backpack/virology(src) + new /obj/item/weapon/storage/backpack/satchel_vir(src) + new /obj/item/weapon/storage/backpack/satchel_vir(src) + return + +/obj/structure/closet/wardrobe/science_white + name = "science wardrobe" + icon_door = "white" + +/obj/structure/closet/wardrobe/science_white/New() + ..() + contents = list() + new /obj/item/weapon/storage/backpack/science(src) + new /obj/item/weapon/storage/backpack/science(src) + new /obj/item/weapon/storage/backpack/satchel_tox(src) + new /obj/item/weapon/storage/backpack/satchel_tox(src) + new /obj/item/clothing/suit/hooded/wintercoat/science(src) + new /obj/item/clothing/under/rank/scientist(src) + new /obj/item/clothing/under/rank/scientist(src) + new /obj/item/clothing/under/rank/scientist(src) + new /obj/item/clothing/suit/toggle/labcoat/science(src) + new /obj/item/clothing/suit/toggle/labcoat/science(src) + new /obj/item/clothing/suit/toggle/labcoat/science(src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/clothing/shoes/sneakers/white(src) + new /obj/item/device/radio/headset/headset_sci(src) + new /obj/item/device/radio/headset/headset_sci(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/mask/gas(src) + return + +/obj/structure/closet/wardrobe/botanist + name = "botanist wardrobe" + icon_door = "green" + +/obj/structure/closet/wardrobe/botanist/New() + ..() + contents = list() + new /obj/item/weapon/storage/backpack/botany(src) + new /obj/item/weapon/storage/backpack/botany(src) + new /obj/item/weapon/storage/backpack/satchel_hyd(src) + new /obj/item/weapon/storage/backpack/satchel_hyd(src) + new /obj/item/clothing/suit/hooded/wintercoat/hydro(src) + new /obj/item/clothing/suit/apron(src) + new /obj/item/clothing/suit/apron(src) + new /obj/item/clothing/suit/apron/overalls(src) + new /obj/item/clothing/suit/apron/overalls(src) + new /obj/item/clothing/under/rank/hydroponics(src) + new /obj/item/clothing/under/rank/hydroponics(src) + new /obj/item/clothing/under/rank/hydroponics(src) + new /obj/item/clothing/mask/bandana(src) + new /obj/item/clothing/mask/bandana(src) + new /obj/item/clothing/mask/bandana(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 8d4bcdf25b9..7629a8a0a5a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -1,16 +1,3 @@ -/obj/structure/closet/secure_closet/cargotech - name = "cargo technician's locker" - req_access = list(access_cargo) - icon_state = "cargo" - -/obj/structure/closet/secure_closet/cargotech/New() - ..() - new /obj/item/clothing/under/rank/cargotech(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/device/radio/headset/headset_cargo(src) - new /obj/item/clothing/gloves/fingerless(src) - new /obj/item/clothing/head/soft(src) - /obj/structure/closet/secure_closet/quartermaster name = "\proper quartermaster's locker" req_access = list(access_qm) @@ -19,7 +6,6 @@ /obj/structure/closet/secure_closet/quartermaster/New() ..() new /obj/item/clothing/cloak/qm(src) - new /obj/item/clothing/suit/hooded/wintercoat/cargo(src) new /obj/item/clothing/under/rank/cargo(src) new /obj/item/clothing/shoes/sneakers/brown(src) new /obj/item/device/radio/headset/headset_cargo(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 5b50e1ba885..eb91fb553eb 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -5,14 +5,7 @@ /obj/structure/closet/secure_closet/engineering_chief/New() ..() - new /obj/item/clothing/suit/hooded/wintercoat/engineering(src) - new /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos(src) - if(prob(50)) - new /obj/item/weapon/storage/backpack/industrial(src) - else - new /obj/item/weapon/storage/backpack/satchel_eng(src) new /obj/item/clothing/cloak/ce(src) - new /obj/item/weapon/storage/backpack/dufflebag/engineering(src) new /obj/item/clothing/under/rank/chief_engineer(src) new /obj/item/clothing/head/hardhat/white(src) new /obj/item/clothing/head/welding(src) @@ -73,21 +66,14 @@ /obj/structure/closet/secure_closet/engineering_personal/New() ..() - if(prob(50)) - new /obj/item/weapon/storage/backpack/industrial(src) - else - new /obj/item/weapon/storage/backpack/satchel_eng(src) - new /obj/item/weapon/storage/backpack/dufflebag/engineering(src) - new /obj/item/clothing/under/rank/engineer(src) - new /obj/item/clothing/shoes/workboots(src) -// new /obj/item/weapon/cartridge/engineering(src) new /obj/item/device/radio/headset/headset_eng(src) - new /obj/item/clothing/suit/hazardvest(src) new /obj/item/weapon/storage/toolbox/mechanical(src) + new /obj/item/weapon/tank/internals/emergency_oxygen/engi(src) new /obj/item/tapeproj/engineering(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/glasses/meson/engine(src) + /obj/structure/closet/secure_closet/atmospherics name = "\proper atmospheric technician's locker" req_access = list(access_atmospherics) @@ -98,10 +84,8 @@ new /obj/item/device/radio/headset/headset_eng(src) new /obj/item/weapon/pipe_dispenser(src) new /obj/item/weapon/storage/toolbox/mechanical(src) - new /obj/item/weapon/storage/backpack/satchel_norm(src) - new /obj/item/weapon/storage/backpack/dufflebag/engineering(src) new /obj/item/weapon/tank/internals/emergency_oxygen/engi(src) + new /obj/item/device/analyzer(src) new /obj/item/tapeproj/engineering(src) new /obj/item/weapon/watertank/atmos(src) - new /obj/item/clothing/suit/fire/atmos(src) - new /obj/item/clothing/head/hardhat/atmos(src) \ No newline at end of file + new /obj/item/clothing/suit/fire/atmos(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm index 0a137e0497e..a9f1fe8adb7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm @@ -5,20 +5,8 @@ /obj/structure/closet/secure_closet/hydroponics/New() ..() - new /obj/item/clothing/suit/hooded/wintercoat/hydro(src) - switch(rand(1,2)) - if(1) - new /obj/item/clothing/suit/apron(src) - if(2) - new /obj/item/clothing/suit/apron/overalls(src) new /obj/item/weapon/storage/bag/plants/portaseeder(src) - new /obj/item/clothing/under/rank/hydroponics(src) new /obj/item/device/analyzer/plant_analyzer(src) new /obj/item/device/radio/headset/headset_srv(src) - new /obj/item/clothing/mask/bandana(src) new /obj/item/weapon/cultivator(src) - new /obj/item/weapon/hatchet(src) - new /obj/item/weapon/storage/backpack/botany(src) - new /obj/item/weapon/storage/backpack/botany(src) - new /obj/item/weapon/storage/backpack/satchel_hyd(src) - new /obj/item/weapon/storage/backpack/satchel_hyd(src) \ No newline at end of file + new /obj/item/weapon/hatchet(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 960f31e3d99..0203442b693 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -44,14 +44,6 @@ /obj/structure/closet/secure_closet/medical3/New() ..() - if(prob(50)) - new /obj/item/weapon/storage/backpack/medic(src) - else - new /obj/item/weapon/storage/backpack/satchel_med(src) - new /obj/item/weapon/storage/backpack/dufflebag/med(src) - new /obj/item/clothing/under/rank/medical(src) - new /obj/item/clothing/suit/toggle/labcoat(src) - new /obj/item/clothing/shoes/sneakers/white(src) new /obj/item/device/radio/headset/headset_med(src) new /obj/item/weapon/defibrillator/loaded(src) new /obj/item/clothing/gloves/color/latex/nitrile(src) @@ -66,11 +58,6 @@ /obj/structure/closet/secure_closet/CMO/New() ..() - new /obj/item/clothing/suit/hooded/wintercoat/medical(src) - if(prob(50)) - new /obj/item/weapon/storage/backpack/medic(src) - else - new /obj/item/weapon/storage/backpack/satchel_med(src) new /obj/item/clothing/cloak/cmo(src) new /obj/item/weapon/storage/backpack/dufflebag/med(src) new /obj/item/clothing/suit/bio_suit/cmo(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index d71768caea0..b5bd0b7df19 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -1,22 +1,3 @@ -/obj/structure/closet/secure_closet/scientist - name = "scientist's locker" - req_access = list(access_tox_storage) - icon_state = "science" - -/obj/structure/closet/secure_closet/scientist/New() - ..() - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/suit/toggle/labcoat/science(src) - new /obj/item/clothing/shoes/sneakers/white(src) -// new /obj/item/weapon/cartridge/signal/toxins(src) - new /obj/item/device/radio/headset/headset_sci(src) - new /obj/item/weapon/tank/internals/air(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/weapon/storage/backpack/science(src) - new /obj/item/weapon/storage/backpack/science(src) - new /obj/item/weapon/storage/backpack/satchel_tox(src) - new /obj/item/weapon/storage/backpack/satchel_tox(src) - /obj/structure/closet/secure_closet/RD name = "\proper research director's locker" req_access = list(access_rd) @@ -25,15 +6,14 @@ /obj/structure/closet/secure_closet/RD/New() ..() new /obj/item/clothing/cloak/rd(src) - new /obj/item/clothing/suit/hooded/wintercoat/science(src) new /obj/item/clothing/suit/bio_suit/scientist(src) new /obj/item/clothing/head/bio_hood/scientist(src) new /obj/item/clothing/suit/toggle/labcoat(src) new /obj/item/clothing/under/rank/research_director(src) new /obj/item/clothing/under/rank/research_director/alt(src) new /obj/item/clothing/under/rank/research_director/turtleneck(src) + new /obj/item/clothing/shoes/sneakers/brown(src) new /obj/item/weapon/cartridge/rd(src) - new /obj/item/clothing/shoes/sneakers/white(src) new /obj/item/clothing/gloves/color/latex(src) new /obj/item/device/radio/headset/heads/rd(src) new /obj/item/weapon/tank/internals/air(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 63074fe5145..fbf237a9cbd 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -31,7 +31,6 @@ /obj/structure/closet/secure_closet/hop/New() ..() - new /obj/item/clothing/suit/hooded/wintercoat/cargo(src) new /obj/item/clothing/under/rank/head_of_personnel(src) new /obj/item/clothing/head/hopcap(src) new /obj/item/weapon/cartridge/hop(src) @@ -55,7 +54,6 @@ /obj/structure/closet/secure_closet/hos/New() ..() new /obj/item/clothing/cloak/hos(src) - new /obj/item/clothing/suit/hooded/wintercoat/security(src) new /obj/item/weapon/cartridge/hos(src) new /obj/item/device/radio/headset/heads/hos(src) new /obj/item/clothing/under/hosparadefem(src) @@ -84,7 +82,7 @@ /obj/structure/closet/secure_closet/warden/New() ..() new /obj/item/device/radio/headset/headset_sec(src) - new /obj/item/clothing/suit/armor/vest/warden/(src) + new /obj/item/clothing/suit/armor/vest/warden(src) new /obj/item/clothing/head/warden(src) new /obj/item/clothing/head/beret/sec/navywarden(src) new /obj/item/clothing/suit/armor/vest/warden/alt(src) @@ -109,8 +107,6 @@ new /obj/item/clothing/suit/armor/vest(src) new /obj/item/device/radio/headset/headset_sec(src) new /obj/item/device/radio/headset/headset_sec/alt(src) - new /obj/item/clothing/head/beret/sec(src) - new /obj/item/clothing/head/soft/sec(src) new /obj/item/weapon/reagent_containers/spray/pepper(src) new /obj/item/device/flash/handheld(src) new /obj/item/weapon/grenade/flashbang(src) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 47bfc73b8cc..68c5a8c32d7 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -13,34 +13,6 @@ new /obj/item/clothing/shoes/sneakers/brown(src) return - -/obj/structure/closet/wardrobe/red - name = "security wardrobe" - icon_door = "red" - -/obj/structure/closet/wardrobe/red/New() - ..() - contents = list() - new /obj/item/weapon/storage/backpack/security(src) - new /obj/item/weapon/storage/backpack/satchel_sec(src) - new /obj/item/weapon/storage/backpack/dufflebag/sec(src) - new /obj/item/weapon/storage/backpack/dufflebag/sec(src) - new /obj/item/clothing/under/rank/security(src) - new /obj/item/clothing/under/rank/security(src) - new /obj/item/clothing/under/rank/security(src) - new /obj/item/clothing/shoes/jackboots(src) - new /obj/item/clothing/shoes/jackboots(src) - new /obj/item/clothing/shoes/jackboots(src) - new /obj/item/clothing/head/beret/sec(src) - new /obj/item/clothing/head/beret/sec(src) - new /obj/item/clothing/head/beret/sec(src) - new /obj/item/clothing/head/soft/sec(src) - new /obj/item/clothing/head/soft/sec(src) - new /obj/item/clothing/head/soft/sec(src) - new /obj/item/clothing/mask/bandana/red(src) - new /obj/item/clothing/mask/bandana/red(src) - return - /obj/structure/closet/wardrobe/pink name = "pink wardrobe" icon_door = "pink" @@ -86,26 +58,6 @@ return -/obj/structure/closet/wardrobe/chaplain_black - name = "chapel wardrobe" - desc = "It's a storage unit for Nanotrasen-approved religious attire." - icon_door = "black" - -/obj/structure/closet/wardrobe/chaplain_black/New() - ..() - contents = list() - new /obj/item/clothing/under/rank/chaplain(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/suit/nun(src) - new /obj/item/clothing/head/nun_hood(src) - new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) - new /obj/item/clothing/suit/holidaypriest(src) - new /obj/item/weapon/storage/backpack/cultpack (src) - new /obj/item/weapon/storage/fancy/candle_box(src) - new /obj/item/weapon/storage/fancy/candle_box(src) - return - - /obj/structure/closet/wardrobe/green name = "green wardrobe" icon_door = "green" @@ -159,42 +111,6 @@ return -/obj/structure/closet/wardrobe/atmospherics_yellow - name = "atmospherics wardrobe" - icon_door = "atmos_wardrobe" - -/obj/structure/closet/wardrobe/atmospherics_yellow/New() - ..() - contents = list() - new /obj/item/clothing/under/rank/atmospheric_technician(src) - new /obj/item/clothing/under/rank/atmospheric_technician(src) - new /obj/item/clothing/under/rank/atmospheric_technician(src) - new /obj/item/device/analyzer(src) - new /obj/item/device/analyzer(src) - new /obj/item/device/analyzer(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) - return - - - -/obj/structure/closet/wardrobe/engineering_yellow - name = "engineering wardrobe" - icon_door = "yellow" - -/obj/structure/closet/wardrobe/engineering_yellow/New() - ..() - contents = list() - new /obj/item/clothing/under/rank/engineer(src) - new /obj/item/clothing/under/rank/engineer(src) - new /obj/item/clothing/under/rank/engineer(src) - new /obj/item/clothing/shoes/sneakers/orange(src) - new /obj/item/clothing/shoes/sneakers/orange(src) - new /obj/item/clothing/shoes/sneakers/orange(src) - return - - /obj/structure/closet/wardrobe/white name = "white wardrobe" icon_door = "white" @@ -213,28 +129,6 @@ new /obj/item/clothing/head/soft/mime(src) return -/obj/structure/closet/wardrobe/white/medical - name = "medical doctor's wardrobe" - -/obj/structure/closet/wardrobe/white/medical/New() - ..() - contents = list() - new /obj/item/clothing/under/rank/nursesuit (src) - new /obj/item/clothing/head/nursehat (src) - new /obj/item/clothing/under/rank/medical/blue(src) - new /obj/item/clothing/under/rank/medical/green(src) - new /obj/item/clothing/under/rank/medical/purple(src) - new /obj/item/clothing/suit/toggle/labcoat/emt(src) - new /obj/item/clothing/suit/toggle/labcoat/emt(src) - new /obj/item/clothing/suit/toggle/labcoat/emt(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/head/soft/emt(src) - new /obj/item/clothing/head/soft/emt(src) - new /obj/item/clothing/head/soft/emt(src) - return - /obj/structure/closet/wardrobe/pjs name = "pajama wardrobe" icon_door = "white" @@ -253,113 +147,6 @@ return -/obj/structure/closet/wardrobe/toxins_white - name = "toxins wardrobe" - icon_door = "white" - -/obj/structure/closet/wardrobe/toxins_white/New() - ..() - contents = list() - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/suit/toggle/labcoat(src) - new /obj/item/clothing/suit/toggle/labcoat(src) - new /obj/item/clothing/suit/toggle/labcoat(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) - return - - -/obj/structure/closet/wardrobe/robotics_black - name = "robotics wardrobe" - icon_door = "black" - -/obj/structure/closet/wardrobe/robotics_black/New() - ..() - contents = list() - new /obj/item/clothing/under/rank/roboticist(src) - new /obj/item/clothing/under/rank/roboticist(src) - new /obj/item/clothing/suit/toggle/labcoat(src) - new /obj/item/clothing/suit/toggle/labcoat(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/clothing/gloves/fingerless(src) - new /obj/item/clothing/gloves/fingerless(src) - new /obj/item/clothing/head/soft/black(src) - new /obj/item/clothing/head/soft/black(src) - if(prob(40)) - new /obj/item/clothing/mask/bandana/skull(src) - if(prob(40)) - new /obj/item/clothing/mask/bandana/skull(src) - return - - -/obj/structure/closet/wardrobe/chemistry_white - name = "chemistry wardrobe" - icon_door = "white" - -/obj/structure/closet/wardrobe/chemistry_white/New() - ..() - contents = list() - new /obj/item/clothing/under/rank/chemist(src) - new /obj/item/clothing/under/rank/chemist(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/suit/toggle/labcoat/chemist(src) - new /obj/item/clothing/suit/toggle/labcoat/chemist(src) - new /obj/item/weapon/storage/backpack/chemistry(src) - new /obj/item/weapon/storage/backpack/chemistry(src) - new /obj/item/weapon/storage/backpack/satchel_chem(src) - new /obj/item/weapon/storage/backpack/satchel_chem(src) - new /obj/item/weapon/storage/bag/chemistry(src) - new /obj/item/weapon/storage/bag/chemistry(src) - return - - -/obj/structure/closet/wardrobe/genetics_white - name = "genetics wardrobe" - icon_door = "white" - -/obj/structure/closet/wardrobe/genetics_white/New() - ..() - contents = list() - new /obj/item/clothing/under/rank/geneticist(src) - new /obj/item/clothing/under/rank/geneticist(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/suit/toggle/labcoat/genetics(src) - new /obj/item/clothing/suit/toggle/labcoat/genetics(src) - new /obj/item/weapon/storage/backpack/genetics(src) - new /obj/item/weapon/storage/backpack/genetics(src) - new /obj/item/weapon/storage/backpack/satchel_gen(src) - new /obj/item/weapon/storage/backpack/satchel_gen(src) - return - - -/obj/structure/closet/wardrobe/virology_white - name = "virology wardrobe" - icon_door = "white" - -/obj/structure/closet/wardrobe/virology_white/New() - ..() - contents = list() - new /obj/item/clothing/under/rank/virologist(src) - new /obj/item/clothing/under/rank/virologist(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/shoes/sneakers/white(src) - new /obj/item/clothing/suit/toggle/labcoat/virologist(src) - new /obj/item/clothing/suit/toggle/labcoat/virologist(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/weapon/storage/backpack/virology(src) - new /obj/item/weapon/storage/backpack/virology(src) - new /obj/item/weapon/storage/backpack/satchel_vir(src) - new /obj/item/weapon/storage/backpack/satchel_vir(src) - return - - /obj/structure/closet/wardrobe/grey name = "grey wardrobe" icon_door = "grey" diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 3ba4b0cdea6..80fb5aa07b9 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -9,6 +9,26 @@ /**********************Miner Lockers**************************/ +/obj/structure/closet/wardrobe/miner + name = "mining wardrobe" + icon_door = "mixed" + +/obj/structure/closet/wardrobe/miner/New() + ..() + contents = list() + new /obj/item/weapon/storage/backpack/dufflebag/engineering(src) + new /obj/item/weapon/storage/backpack/industrial(src) + new /obj/item/weapon/storage/backpack/satchel_eng(src) + new /obj/item/clothing/under/rank/miner(src) + new /obj/item/clothing/under/rank/miner(src) + new /obj/item/clothing/under/rank/miner(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/clothing/gloves/fingerless(src) + /obj/structure/closet/secure_closet/miner name = "miner's equipment" icon_state = "mining" @@ -16,14 +36,7 @@ /obj/structure/closet/secure_closet/miner/New() ..() - if(prob(50)) - new /obj/item/weapon/storage/backpack/industrial(src) - else - new /obj/item/weapon/storage/backpack/satchel_eng(src) new /obj/item/device/radio/headset/headset_cargo(src) - new /obj/item/clothing/under/rank/miner(src) - new /obj/item/clothing/gloves/fingerless(src) - new /obj/item/clothing/shoes/sneakers/black(src) new /obj/item/device/mining_scanner(src) new /obj/item/weapon/storage/bag/ore(src) new /obj/item/weapon/shovel(src) From 9a64d1db9e6d985af5f5f4d41e406ed366c21438 Mon Sep 17 00:00:00 2001 From: MrStonedOne Date: Sat, 27 Jun 2015 16:49:39 -0700 Subject: [PATCH 45/57] Removes duplicate variable in adminhelp. --- code/modules/admin/verbs/adminhelp.dm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 55bb6ae84c8..14a287c31cf 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -64,11 +64,6 @@ src.verbs |= /client/verb/adminhelp adminhelptimerid = 0 - -var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as", "i") - - - /client/verb/adminhelp(msg as text) set category = "Admin" set name = "Adminhelp" From 25125d2067f7cbe3b478b25174888ab25ebfec77 Mon Sep 17 00:00:00 2001 From: sybil-tgstation13 Date: Sat, 27 Jun 2015 19:56:24 -0400 Subject: [PATCH 46/57] Automatic changelog compile --- html/changelog.html | 5 +++ html/changelogs/.all_changelog.yml | 7 ++++ .../MrStonedOne-adminhelp-pr10196.yml | 38 ------------------- 3 files changed, 12 insertions(+), 38 deletions(-) delete mode 100644 html/changelogs/MrStonedOne-adminhelp-pr10196.yml diff --git a/html/changelog.html b/html/changelog.html index ac787eb629e..86348a07518 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -66,6 +66,11 @@
  • Click and drag from a bag/stachel/Storage Object to dump his contents on a tile near you. You can do so into another storage item, a bin, or the ground/table if there's nothing else.
  • Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7 tiles.
+

MrStonedOne updated:

+
    +
  • Admins will now receive a notification when one of them starts to reply to an adminhelp to cut down on multiple responses to adminhelps and let admins know when an adminhelp isn't getting replied to.
  • +
  • The keyword finder in admin helps (adds a (?) link next to player names in the text of adminhelps) has been added for all player to admin pms, as well as admin say.
  • +

NullQuery updated:

  • Introduces html_interface, a module to streamline the management of browser windows.
  • diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 02fc923c03c..499ced648e5 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2994,6 +2994,13 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: 'Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7 tiles.' + MrStonedOne: + - tweak: Admins will now receive a notification when one of them starts to reply + to an adminhelp to cut down on multiple responses to adminhelps and let admins + know when an adminhelp isn't getting replied to. + - rscadd: The keyword finder in admin helps (adds a (?) link next to player names + in the text of adminhelps) has been added for all player to admin pms, as well + as admin say. NullQuery: - wip: Introduces html_interface, a module to streamline the management of browser windows. diff --git a/html/changelogs/MrStonedOne-adminhelp-pr10196.yml b/html/changelogs/MrStonedOne-adminhelp-pr10196.yml deleted file mode 100644 index a418c843fbe..00000000000 --- a/html/changelogs/MrStonedOne-adminhelp-pr10196.yml +++ /dev/null @@ -1,38 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# spellcheck (typo fixes) -# experiment -# tgs (TG-ported fixes?) -################################# - -# Your name. -author: MrStonedOne - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. -# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. -changes: - - tweak: "Admins will now receive a notification when one of them starts to reply to an adminhelp to cut down on multiple responses to adminhelps and let admins know when an adminhelp isn't getting replied to." - - rscadd: "The keyword finder in admin helps (adds a (?) link next to player names in the text of adminhelps) has been added for all player to admin pms, as well as admin say." - From c1a37bb2e0548d486e724c2a2632f5230b92b7da Mon Sep 17 00:00:00 2001 From: phil235 Date: Sun, 28 Jun 2015 15:27:58 +0200 Subject: [PATCH 47/57] Derp, I hate fixing merge conflicts... --- code/modules/clothing/masks/gasmask.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index b438844687a..59566b96179 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -297,6 +297,7 @@ /obj/item/clothing/mask/gas/owl_mask name = "owl mask" desc = "Twoooo!" + icon_state = "owl" flags = MASKINTERNALS flags_cover = MASKCOVERSEYES burn_state = 0 //Burnable From fbafd72660e790eb321e8f4575faffd323780f59 Mon Sep 17 00:00:00 2001 From: Ikarrus Date: Sun, 28 Jun 2015 08:32:33 -0600 Subject: [PATCH 48/57] Pistol Ammo was lost in the conflict resolution --- code/game/gamemodes/gang/recaller.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index 9cb0b9261f8..51d8102eda2 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -89,6 +89,12 @@ else dat += "10mm Pistol
    " + dat += "(10 Influence) " + if(points >= 10) + dat += "10mm Ammo
    " + else + dat += "10mm Ammo
    " + dat += "(50 Influence) " if(points >= 50) dat += "Mini Uzi
    " From 615c0be69793bada2d1ab48fc50106ef512aae2d Mon Sep 17 00:00:00 2001 From: sybil-tgstation13 Date: Sun, 28 Jun 2015 10:40:19 -0400 Subject: [PATCH 49/57] Automatic changelog compile --- html/changelog.html | 16 +++++++++++ html/changelogs/.all_changelog.yml | 16 +++++++++++ html/changelogs/ikarrus-gangnerf.yml | 42 ---------------------------- html/changelogs/phil235-AcidFix.yml | 6 ---- 4 files changed, 32 insertions(+), 48 deletions(-) delete mode 100644 html/changelogs/ikarrus-gangnerf.yml delete mode 100644 html/changelogs/phil235-AcidFix.yml diff --git a/html/changelog.html b/html/changelog.html index 86348a07518..95285d4ee60 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,22 @@ -->
    +

    28 June 2015

    +

    Ikarrus updated:

    +
      +
    • Gang Lieutenants can buy gang tools now, but at a higher cost than the original boss
    • +
    • Gang leaders can register additional gangtools to themselves for use as spares.
    • +
    • Number of maximum lieutenants lowered to 2
    • +
    • Pistol cost increased to 25 influence
    • +
    • Uzi cost increased to 50 influence
    • +
    • Uzi Ammo decreased to 20 influence
    • +
    • Overcoats added to items the biogenerator can produce.
    • +
    +

    phil235 updated:

    +
      +
    • Smoke (and foam) no longer distribute more reagents than they have. The amount of clouds in a smoke now depends on the amount of smoke created. Acid no longer melts items on a mob at low volume, and the chances to melt them increases with the amount applied on the mob. Sprays can now contain acid again.
    • +
    +

    27 June 2015

    Ikarrus updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 499ced648e5..d41017e7482 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -3007,3 +3007,19 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Adds playing cards that utilize a new HTML window management system. Vekter: - rscadd: Added a new military jacket to the Autodrobe and ClothesMate. +2015-06-28: + Ikarrus: + - rscadd: Gang Lieutenants can buy gang tools now, but at a higher cost than the + original boss + - rscadd: Gang leaders can register additional gangtools to themselves for use as + spares. + - tweak: Number of maximum lieutenants lowered to 2 + - tweak: Pistol cost increased to 25 influence + - tweak: Uzi cost increased to 50 influence + - tweak: Uzi Ammo decreased to 20 influence + - rscadd: Overcoats added to items the biogenerator can produce. + phil235: + - tweak: Smoke (and foam) no longer distribute more reagents than they have. The + amount of clouds in a smoke now depends on the amount of smoke created. Acid + no longer melts items on a mob at low volume, and the chances to melt them increases + with the amount applied on the mob. Sprays can now contain acid again. diff --git a/html/changelogs/ikarrus-gangnerf.yml b/html/changelogs/ikarrus-gangnerf.yml deleted file mode 100644 index 2061aa19b38..00000000000 --- a/html/changelogs/ikarrus-gangnerf.yml +++ /dev/null @@ -1,42 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# spellcheck (typo fixes) -# experiment -# tgs (TG-ported fixes?) -################################# - -# Your name. -author: Ikarrus - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. -# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Gang Lieutenants can buy gang tools now, but at a higher cost than the original boss" - - rscadd: "Gang leaders can register additional gangtools to themselves for use as spares." - - tweak: "Number of maximum lieutenants lowered to 2" - - tweak: "Pistol cost increased to 25 influence" - - tweak: "Uzi cost increased to 50 influence" - - tweak: "Uzi Ammo decreased to 20 influence" - - rscadd: "Overcoats added to items the biogenerator can produce." \ No newline at end of file diff --git a/html/changelogs/phil235-AcidFix.yml b/html/changelogs/phil235-AcidFix.yml deleted file mode 100644 index 836af7f4c83..00000000000 --- a/html/changelogs/phil235-AcidFix.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: phil235 - -delete-after: True - -changes: - - tweak: "Smoke (and foam) no longer distribute more reagents than they have. The amount of clouds in a smoke now depends on the amount of smoke created. Acid no longer melts items on a mob at low volume, and the chances to melt them increases with the amount applied on the mob. Sprays can now contain acid again." From cbee684951ee1083daf41a590756e7b9a05439c9 Mon Sep 17 00:00:00 2001 From: Ikarrus Date: Sun, 28 Jun 2015 09:57:24 -0600 Subject: [PATCH 50/57] Macro/Micro bombs are now restricted to the Nuclear game mode. Also fixes some broken spans. --- code/datums/uplink_item.dm | 2 ++ code/game/objects/items/weapons/implants/implant.dm | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 278cbe162df..865fa8d1506 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -668,6 +668,7 @@ var/list/uplink_items = list() Will permanently destroy your body, however." item = /obj/item/weapon/storage/box/syndie_kit/imp_microbomb cost = 2 + gamemodes = list(/datum/game_mode/nuclear) //CYBERNETIC IMPLANTS @@ -760,6 +761,7 @@ var/list/uplink_items = list() desc = "An implant injected into the body, and later activated either manually or automatically upon death. Maximum explosion power." item = /obj/item/weapon/storage/box/syndie_kit/imp_macrobomb cost = 20 + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/badass/random name = "Random Item" diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 4a85d7a9d49..7031edd688f 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -117,7 +117,7 @@ heavy = round(heavy) medium = round(medium) weak = round(weak) - imp_in << "You activate your microbomb implant." + imp_in << "You activate your microbomb implant." //If the delay is short, just blow up already jeez if(delay <= 7) imp_in.gib() @@ -155,7 +155,7 @@ for(var/obj/item/weapon/implant/explosive/macro/E in imp_in) if(E != src) qdel(E) - imp_in << "You activate your macrobomb implant." + imp_in << "You activate your macrobomb implant." imp_in.visible_message("[imp_in] starts beeping ominously!") playsound(loc, 'sound/items/timer.ogg', 30, 0) sleep(delay/4) From 8296c4642a160ac9ab61727ceb8035a8fbff969b Mon Sep 17 00:00:00 2001 From: Ikarrus Date: Sun, 28 Jun 2015 10:01:09 -0600 Subject: [PATCH 51/57] Changelog --- html/changelogs/Ikarrus-fuckbombs.yml | 36 +++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 html/changelogs/Ikarrus-fuckbombs.yml diff --git a/html/changelogs/Ikarrus-fuckbombs.yml b/html/changelogs/Ikarrus-fuckbombs.yml new file mode 100644 index 00000000000..686b5f4a6b3 --- /dev/null +++ b/html/changelogs/Ikarrus-fuckbombs.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: Ikarrus + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscdel: "Micro and Macro bomb implants are now restricted to the Nuclear game mode." From b6028d065fd1d20db5dd9dbe0e89dfb50e392cea Mon Sep 17 00:00:00 2001 From: sybil-tgstation13 Date: Sun, 28 Jun 2015 12:08:11 -0400 Subject: [PATCH 52/57] Automatic changelog compile --- html/changelog.html | 1 + html/changelogs/.all_changelog.yml | 1 + html/changelogs/Ikarrus-fuckbombs.yml | 36 --------------------------- 3 files changed, 2 insertions(+), 36 deletions(-) delete mode 100644 html/changelogs/Ikarrus-fuckbombs.yml diff --git a/html/changelog.html b/html/changelog.html index 95285d4ee60..cc44d2c9f73 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -65,6 +65,7 @@
    • Uzi cost increased to 50 influence
    • Uzi Ammo decreased to 20 influence
    • Overcoats added to items the biogenerator can produce.
    • +
    • Micro and Macro bomb implants are now restricted to the Nuclear game mode.

    phil235 updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d41017e7482..74fb6e96211 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -3018,6 +3018,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Uzi cost increased to 50 influence - tweak: Uzi Ammo decreased to 20 influence - rscadd: Overcoats added to items the biogenerator can produce. + - rscdel: Micro and Macro bomb implants are now restricted to the Nuclear game mode. phil235: - tweak: Smoke (and foam) no longer distribute more reagents than they have. The amount of clouds in a smoke now depends on the amount of smoke created. Acid diff --git a/html/changelogs/Ikarrus-fuckbombs.yml b/html/changelogs/Ikarrus-fuckbombs.yml deleted file mode 100644 index 686b5f4a6b3..00000000000 --- a/html/changelogs/Ikarrus-fuckbombs.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# spellcheck (typo fixes) -# experiment -# tgs (TG-ported fixes?) -################################# - -# Your name. -author: Ikarrus - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. -# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. -changes: - - rscdel: "Micro and Macro bomb implants are now restricted to the Nuclear game mode." From ba6cf03cc6585b842af7bd9865fa35abad3ca000 Mon Sep 17 00:00:00 2001 From: Xhuis Date: Sun, 28 Jun 2015 12:21:36 -0400 Subject: [PATCH 53/57] Changelog for gang fighting styles --- html/changelogs/Xhuis-FightingStyles.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/Xhuis-FightingStyles.yml diff --git a/html/changelogs/Xhuis-FightingStyles.yml b/html/changelogs/Xhuis-FightingStyles.yml new file mode 100644 index 00000000000..753892b792f --- /dev/null +++ b/html/changelogs/Xhuis-FightingStyles.yml @@ -0,0 +1,5 @@ +author: Xhuis +delete-after: True + +changes: + - rscadd: "The Sleeping Carp clan has made its presence known on Space Station 13. Some gangs will name themselves after this group and practice martial arts rather than using traditional gang weaponry. These shadowboxers are not to be taken lightly." From 77a77dd107aa375a7e7c03d23b607d1a75aaf565 Mon Sep 17 00:00:00 2001 From: Orange Borg Date: Sun, 28 Jun 2015 16:41:54 +1200 Subject: [PATCH 54/57] Jetpack speed changes [DNM] being in zero grav now gives a -1 speedup (as if you had gottagofast) being in zero grav with a jetpack gives -2 (gottagoreallyfast) The gottagofast and gottagoreallyfast flags only apply in gravity situations now --- code/modules/mob/living/carbon/human/species.dm | 11 ++++++----- config/admins.txt | 5 +++-- html/changelogs/oranges_nevernottimetofast.yml | 4 ++++ 3 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 html/changelogs/oranges_nevernottimetofast.yml diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 67caa33abac..19a0331b044 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -738,7 +738,7 @@ if(P.allow_thrust(0.01, H)) hasjetpack = 1 - mspeed = 1 - hasjetpack + mspeed = -1 - hasjetpack if(grav || !hasjetpack) var/health_deficiency = (100 - H.health + H.staminaloss) @@ -763,11 +763,12 @@ mspeed += speedmod - if(H.status_flags & GOTTAGOFAST) - mspeed -= 1 + if(grav) + if(H.status_flags & GOTTAGOFAST) + mspeed -= 1 - if(H.status_flags & GOTTAGOREALLYFAST) - mspeed -= 2 + if(H.status_flags & GOTTAGOREALLYFAST) + mspeed -= 2 return mspeed diff --git a/config/admins.txt b/config/admins.txt index 8a308e187ce..a029f2639e4 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -7,7 +7,8 @@ # NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn # # NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # ############################################################################################### -MrStonedOne = Host +Optimumtact = Host +MrStonedOne = Game Master microscopics = Game Master Gun Hog = Game Master KorPhaeron = Game Master @@ -84,4 +85,4 @@ vekter = Game Master Ahammer18 = Game Master ACCount12 = Game Master fayrik = Game Master -shadowlight213 = Game Master \ No newline at end of file +shadowlight213 = Game Master diff --git a/html/changelogs/oranges_nevernottimetofast.yml b/html/changelogs/oranges_nevernottimetofast.yml new file mode 100644 index 00000000000..563e348a786 --- /dev/null +++ b/html/changelogs/oranges_nevernottimetofast.yml @@ -0,0 +1,4 @@ +author: oranges +delete-after: True +changes: + - tweak rscadd: "Thanks to a breakthrough in directed vector thrusting, all nanotrasen brand jetpacks have been greatly improved in speed and handling" From 6ace1a1cd05de8fd5e2081fdbb8aeef77595afcd Mon Sep 17 00:00:00 2001 From: Jordie0608 Date: Mon, 29 Jun 2015 15:39:44 +1000 Subject: [PATCH 55/57] changelog --- html/changelog.html | 22 ++++++++++++++++-- html/changelogs/.all_changelog.yml | 23 +++++++++++++++---- html/changelogs/Xhuis-FightingStyles.yml | 5 ---- html/changelogs/incoming5643-rainbowslime.yml | 9 -------- .../changelogs/oranges_nevernottimetofast.yml | 4 ---- 5 files changed, 39 insertions(+), 24 deletions(-) delete mode 100644 html/changelogs/Xhuis-FightingStyles.yml delete mode 100644 html/changelogs/incoming5643-rainbowslime.yml delete mode 100644 html/changelogs/oranges_nevernottimetofast.yml diff --git a/html/changelog.html b/html/changelog.html index cc44d2c9f73..39819eea8cb 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,25 @@ -->
      +

      29 June 2015

      +

      Ikarrus updated:

      +
        +
      • Clothing has been separated out of equipment lockers into wardrobes to reduce clutter.
      • +
      +

      Incoming5643 updated:

      +
        +
      • The secrets of the rainbow slimes have finally been revealed. To attain this rare blob you must breed a slime with a 100% mutation chance!
      • +
      • Rainbow slime cores will generate a randomly colored slime when injected with plasma. It's a good plan B if the slimes aren't cooperating in terms of colors. You can get any color slime this way, pray to the RNG!
      • +
      +

      Xhuis updated:

      +
        +
      • The Sleeping Carp clan has made its presence known on Space Station 13. Some gangs will name themselves after this group and practice martial arts rather than using traditional gang weaponry. These shadowboxers are not to be taken lightly.
      • +
      +

      oranges updated:

      +
        +
      • Thanks to a breakthrough in directed vector thrusting, all nanotrasen brand jetpacks have been greatly improved in speed and handling
      • +
      +

      28 June 2015

      Ikarrus updated:

        @@ -80,7 +99,6 @@

      Laharl Montogmmery updated:

        -
      • Click and drag from a bag/stachel/Storage Object to dump his contents on a tile near you. You can do so into another storage item, a bin, or the ground/table if there's nothing else.
      • Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7 tiles.

      MrStonedOne updated:

      @@ -164,7 +182,7 @@
      • Admins can now flag ckeys to be alerted when they connect to the server.
      -

      N3X15 updated:

      +

      MrStonedOne updated:

      • Admins can now reject poor adminhelps. This will tell the player how to construct a useful adminhelp and give them back their adminhelp verb
      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 74fb6e96211..39e7dc99b48 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2918,7 +2918,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscdel: Removed bulletproof vests from gangtool menu. Jordie0608: - rscadd: Admins can now flag ckeys to be alerted when they connect to the server. - N3X15: + MrStonedOne: - rscadd: Admins can now reject poor adminhelps. This will tell the player how to construct a useful adminhelp and give them back their adminhelp verb RemieRichards: @@ -2988,9 +2988,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. values. Exterior clothing will shield clothing underneath. Storage items will drop their contents when bombed this way. Laharl Montogmmery: - - rscadd: Click and drag from a bag/stachel/Storage Object to dump his contents - on a tile near you. You can do so into another storage item, a bin, or the ground/table - if there's nothing else. - rscadd: 'Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7 tiles.' @@ -3024,3 +3021,21 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. amount of clouds in a smoke now depends on the amount of smoke created. Acid no longer melts items on a mob at low volume, and the chances to melt them increases with the amount applied on the mob. Sprays can now contain acid again. +2015-06-29: + Ikarrus: + - rscadd: Clothing has been separated out of equipment lockers into wardrobes to + reduce clutter. + Incoming5643: + - rscadd: The secrets of the rainbow slimes have finally been revealed. To attain + this rare blob you must breed a slime with a 100% mutation chance! + - rscadd: Rainbow slime cores will generate a randomly colored slime when injected + with plasma. It's a good plan B if the slimes aren't cooperating in terms of + colors. You can get any color slime this way, pray to the RNG! + Xhuis: + - rscadd: The Sleeping Carp clan has made its presence known on Space Station 13. + Some gangs will name themselves after this group and practice martial arts rather + than using traditional gang weaponry. These shadowboxers are not to be taken + lightly. + oranges: + - tweak rscadd: Thanks to a breakthrough in directed vector thrusting, all nanotrasen + brand jetpacks have been greatly improved in speed and handling diff --git a/html/changelogs/Xhuis-FightingStyles.yml b/html/changelogs/Xhuis-FightingStyles.yml deleted file mode 100644 index 753892b792f..00000000000 --- a/html/changelogs/Xhuis-FightingStyles.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Xhuis -delete-after: True - -changes: - - rscadd: "The Sleeping Carp clan has made its presence known on Space Station 13. Some gangs will name themselves after this group and practice martial arts rather than using traditional gang weaponry. These shadowboxers are not to be taken lightly." diff --git a/html/changelogs/incoming5643-rainbowslime.yml b/html/changelogs/incoming5643-rainbowslime.yml deleted file mode 100644 index da966da01d7..00000000000 --- a/html/changelogs/incoming5643-rainbowslime.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: Incoming5643 - - -delete-after: True - - -changes: - - rscadd: "The secrets of the rainbow slimes have finally been revealed. To attain this rare blob you must breed a slime with a 100% mutation chance!" - - rscadd: "Rainbow slime cores will generate a randomly colored slime when injected with plasma. It's a good plan B if the slimes aren't cooperating in terms of colors. You can get any color slime this way, pray to the RNG!" diff --git a/html/changelogs/oranges_nevernottimetofast.yml b/html/changelogs/oranges_nevernottimetofast.yml deleted file mode 100644 index 563e348a786..00000000000 --- a/html/changelogs/oranges_nevernottimetofast.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: oranges -delete-after: True -changes: - - tweak rscadd: "Thanks to a breakthrough in directed vector thrusting, all nanotrasen brand jetpacks have been greatly improved in speed and handling" From 3564376bab136f68e5457b658721c0f88d036354 Mon Sep 17 00:00:00 2001 From: Jordie Date: Mon, 29 Jun 2015 15:48:56 +1000 Subject: [PATCH 56/57] whoops --- html/changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/changelog.html b/html/changelog.html index 39819eea8cb..e5f040be56e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -71,7 +71,7 @@

    oranges updated:

      -
    • Thanks to a breakthrough in directed vector thrusting, all nanotrasen brand jetpacks have been greatly improved in speed and handling
    • +
    • Thanks to a breakthrough in directed vector thrusting, all nanotrasen brand jetpacks have been greatly improved in speed and handling

    28 June 2015

    From 1da334b35dadf1eb32a1c632b499810e96e6fe43 Mon Sep 17 00:00:00 2001 From: Jordie Date: Mon, 29 Jun 2015 15:49:21 +1000 Subject: [PATCH 57/57] orangesisasuperdork --- html/changelogs/.all_changelog.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 39e7dc99b48..1763d0c5a1d 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -3037,5 +3037,5 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. than using traditional gang weaponry. These shadowboxers are not to be taken lightly. oranges: - - tweak rscadd: Thanks to a breakthrough in directed vector thrusting, all nanotrasen + - tweak: Thanks to a breakthrough in directed vector thrusting, all nanotrasen brand jetpacks have been greatly improved in speed and handling