From 210d8fac22c27af6ce9580ec3eba1c162b2f8720 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Fri, 7 Aug 2015 18:01:12 +0300 Subject: [PATCH 01/24] Updates mechfab to not be terrible, WIP --- baystation12.dme | 1 + code/game/mecha/mech_fabricator.dm | 927 ++++--------------- code/game/objects/items/robot/robot_parts.dm | 6 - code/modules/research/designs.dm | 148 --- code/modules/research/mechfab_designs.dm | 257 +++++ maps/exodus-1.dmm | 2 +- nano/templates/mechfab.tmpl | 51 + 7 files changed, 498 insertions(+), 894 deletions(-) create mode 100644 code/modules/research/mechfab_designs.dm create mode 100644 nano/templates/mechfab.tmpl diff --git a/baystation12.dme b/baystation12.dme index 38fe37bdc94..d4100f4482e 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1557,6 +1557,7 @@ #include "code\modules\research\circuitprinter.dm" #include "code\modules\research\designs.dm" #include "code\modules\research\destructive_analyzer.dm" +#include "code\modules\research\mechfab_designs.dm" #include "code\modules\research\message_server.dm" #include "code\modules\research\protolathe.dm" #include "code\modules\research\rd-readme.dm" diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 07c54ceb2b9..3a0887b1b1f 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -1,126 +1,28 @@ -///////////////////////////// -///// Part Fabricator /////// -///////////////////////////// - /obj/machinery/mecha_part_fabricator icon = 'icons/obj/robotics.dmi' icon_state = "fab-idle" name = "Exosuit Fabricator" - desc = "Nothing is being built." + //desc = "Nothing is being built." density = 1 anchored = 1 use_power = 1 idle_power_usage = 20 active_power_usage = 5000 req_access = list(access_robotics) + var/current_manufacturer - var/time_coeff = 1.5 //can be upgraded with research - var/resource_coeff = 1.5 //can be upgraded with research - var/list/resources = list( - DEFAULT_WALL_MATERIAL=0, - "glass"=0, - "gold"=0, - "silver"=0, - "diamond"=0, - "phoron"=0, - "uranium"=0, - ) + var/speed = 1 + var/mat_efficiency = 1 + var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0) var/res_max_amount = 200000 + var/datum/research/files - var/id - var/sync = 0 - var/part_set - var/obj/being_built - var/list/queue = list() - var/processing_queue = 0 - var/screen = "main" - var/opened = 0 - var/temp - var/output_dir = SOUTH //the direction relative to the fabber at which completed parts appear. - var/list/part_sets = list( //set names must be unique - "Robot"=list( - /obj/item/robot_parts/robot_suit, - /obj/item/robot_parts/chest, - /obj/item/robot_parts/head, - /obj/item/robot_parts/l_arm, - /obj/item/robot_parts/r_arm, - /obj/item/robot_parts/l_leg, - /obj/item/robot_parts/r_leg, - /obj/item/robot_parts/robot_component/binary_communication_device, - /obj/item/robot_parts/robot_component/radio, - /obj/item/robot_parts/robot_component/actuator, - /obj/item/robot_parts/robot_component/diagnosis_unit, - /obj/item/robot_parts/robot_component/camera, - /obj/item/robot_parts/robot_component/armour - ), - "Ripley"=list( - /obj/item/mecha_parts/chassis/ripley, - /obj/item/mecha_parts/part/ripley_torso, - /obj/item/mecha_parts/part/ripley_left_arm, - /obj/item/mecha_parts/part/ripley_right_arm, - /obj/item/mecha_parts/part/ripley_left_leg, - /obj/item/mecha_parts/part/ripley_right_leg - ), -// "Hoverpod"=list( -// /obj/structure/largecrate/hoverpod // Doesn't work, even with required vars. Why? - Gamerofthegame -// ), - "Odysseus"=list( - /obj/item/mecha_parts/chassis/odysseus, - /obj/item/mecha_parts/part/odysseus_torso, - /obj/item/mecha_parts/part/odysseus_head, - /obj/item/mecha_parts/part/odysseus_left_arm, - /obj/item/mecha_parts/part/odysseus_right_arm, - /obj/item/mecha_parts/part/odysseus_left_leg, - /obj/item/mecha_parts/part/odysseus_right_leg - ), + var/list/datum/design/queue = list() + var/progress = 0 + var/busy = 0 - "Gygax"=list( - /obj/item/mecha_parts/chassis/gygax, - /obj/item/mecha_parts/part/gygax_torso, - /obj/item/mecha_parts/part/gygax_head, - /obj/item/mecha_parts/part/gygax_left_arm, - /obj/item/mecha_parts/part/gygax_right_arm, - /obj/item/mecha_parts/part/gygax_left_leg, - /obj/item/mecha_parts/part/gygax_right_leg, - /obj/item/mecha_parts/part/gygax_armour - ), - "Durand"=list( - /obj/item/mecha_parts/chassis/durand, - /obj/item/mecha_parts/part/durand_torso, - /obj/item/mecha_parts/part/durand_head, - /obj/item/mecha_parts/part/durand_left_arm, - /obj/item/mecha_parts/part/durand_right_arm, - /obj/item/mecha_parts/part/durand_left_leg, - /obj/item/mecha_parts/part/durand_right_leg, - /obj/item/mecha_parts/part/durand_armour - ), - "Exosuit Equipment"=list( - /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp, - /obj/item/mecha_parts/mecha_equipment/tool/drill, - /obj/item/mecha_parts/mecha_equipment/tool/extinguisher, - /obj/item/mecha_parts/mecha_equipment/tool/cable_layer, - /obj/item/mecha_parts/mecha_equipment/tool/sleeper, - /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun, - /obj/item/mecha_parts/mecha_equipment/tool/passenger, - /obj/item/mecha_parts/chassis/firefighter, - ///obj/item/mecha_parts/mecha_equipment/repair_droid, - /obj/item/mecha_parts/mecha_equipment/generator, - ///obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING - /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser, - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg - ), - - "Robotic Upgrade Modules" = list( - /obj/item/borg/upgrade/reset, - /obj/item/borg/upgrade/rename, - /obj/item/borg/upgrade/restart, - /obj/item/borg/upgrade/vtec, - /obj/item/borg/upgrade/tasercooler, - /obj/item/borg/upgrade/jetpack - ), - - "Misc"=list(/obj/item/mecha_parts/mecha_tracking) - ) + var/list/categories = list() + var/category = null /obj/machinery/mecha_part_fabricator/New() ..() @@ -134,643 +36,102 @@ component_parts += new /obj/item/weapon/stock_parts/console_screen(src) RefreshParts() - // part_sets["Cyborg Upgrade Modules"] = typesof(/obj/item/borg/upgrade/) - /obj/item/borg/upgrade/ // Eh. This does it dymaically, but to support having the items referenced otherwhere in the code but not being constructable, going to do it manaully. - - for(var/part_set in part_sets) - convert_part_set(part_set) files = new /datum/research(src) //Setup the research data holder. - /* - if(!id) - for(var/obj/machinery/r_n_d/server/centcom/S in world) - S.initialize() - break - */ return /obj/machinery/mecha_part_fabricator/initialize() current_manufacturer = basic_robolimb.company + update_categories() + +/obj/machinery/mecha_part_fabricator/process() + ..() + if(stat) + return + if(busy) + progress += speed + finalize() + update_icon() + +/obj/machinery/mecha_part_fabricator/update_icon() + overlays.Cut() + if(panel_open) + icon_state = "fab-o" + else + icon_state = "fab-idle" + if(busy) + overlays += "fab-active" /obj/machinery/mecha_part_fabricator/RefreshParts() - var/T = 0 + res_max_amount = 0 for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) + res_max_amount += M.rating * 100000 + var/T = 0 + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) T += M.rating - res_max_amount = (187500+(T * 37500)) - T = 0 - for(var/obj/item/weapon/stock_parts/micro_laser/Ma in component_parts) - T += Ma.rating - if(T >= 1) - T -= 1 - var/diff - diff = round(initial(resource_coeff) - (initial(resource_coeff)*(T))/25,0.01) - if(resource_coeff!=diff) - resource_coeff = diff - T = 0 - for(var/obj/item/weapon/stock_parts/manipulator/Ml in component_parts) - T += Ml.rating - if(T>= 1) - T -= 1 - diff = round(initial(time_coeff) - (initial(time_coeff)*(T))/25,0.01) - if(time_coeff!=diff) - time_coeff = diff + mat_efficiency = 1 - (T - 1) / 4 + for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts) // Not resetting T is intended; speed is affected by both + T += M.rating + speed = T / 2 -/obj/machinery/mecha_part_fabricator/Destroy() - for(var/atom/A in src) - qdel(A) - ..() - return - -/obj/machinery/mecha_part_fabricator/proc/operation_allowed(mob/M) - if(isrobot(M) || isAI(M)) - return 1 - if(!istype(req_access) || !req_access.len) - return 1 - else if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - for(var/ID in list(H.get_active_hand(), H.wear_id, H.belt)) - if(src.check_access(ID)) - return 1 - M << "You don't have required permissions to use [src]" - return 0 - -/obj/machinery/mecha_part_fabricator/proc/convert_part_set(set_name as text) - var/list/parts = part_sets[set_name] - if(istype(parts, /list)) - for(var/i=1;i<=parts.len;i++) - var/path = parts[i] - var/part = new path(src) - if(part) - parts[i] = part - //debug below - if(!istype(parts[i],/obj/item)) return 0 - return - - -/obj/machinery/mecha_part_fabricator/proc/add_part_set(set_name as text,parts=null) - if(set_name in part_sets)//attempt to create duplicate set - return 0 - if(isnull(parts)) - part_sets[set_name] = list() - else - part_sets[set_name] = parts - convert_part_set(set_name) - return 1 - -/obj/machinery/mecha_part_fabricator/proc/add_part_to_set(set_name as text,part) - if(!part) return 0 - src.add_part_set(set_name)//if no "set_name" set exists, create - var/list/part_set = part_sets[set_name] - var/atom/apart - if(ispath(part)) - apart = new part(src) - else - apart = part - if(!istype(apart)) return 0 - for(var/obj/O in part_set) - if(O.type == apart.type) - qdel(apart) - return 0 - part_set[++part_set.len] = apart - return 1 - -/obj/machinery/mecha_part_fabricator/proc/remove_part_set(set_name as text) - for(var/i=1,i<=part_sets.len,i++) - if(part_sets[i]==set_name) - part_sets.Cut(i,++i) - return -/* - proc/sanity_check() - for(var/p in resources) - var/index = resources.Find(p) - index = resources.Find(p, ++index) - if(index) //duplicate resource - world << "Duplicate resource definition for [src](\ref[src])" - return 0 - for(var/set_name in part_sets) - var/index = part_sets.Find(set_name) - index = part_sets.Find(set_name, ++index) - if(index) //duplicate part set - world << "Duplicate part set definition for [src](\ref[src])" - return 0 - return 1 -*/ - -/obj/machinery/mecha_part_fabricator/proc/output_parts_list(set_name) - var/output = "" - var/list/part_set = listgetindex(part_sets, set_name) - if(istype(part_set)) - for(var/obj/item/part in part_set) - var/resources_available = check_resources(part) - output += "
[output_part_info(part)]
\[[resources_available?"Build | ":null]Add to queue\]\[?\]
" - return output - -/obj/machinery/mecha_part_fabricator/proc/output_part_info(var/obj/item/part) - var/output = "[part.name] (Cost: [output_part_cost(part)]) [get_construction_time_w_coeff(part)/10]sec" - return output - -/obj/machinery/mecha_part_fabricator/proc/output_part_cost(var/obj/item/part) - var/i = 0 - var/output - if(part.vars.Find("construction_time") && part.vars.Find("construction_cost"))//The most efficient way to go about this. Not all objects have these vars, but if they don't then they CANNOT be made by the mech fab. Doing it this way reduces a major amount of typecasting and switches, while cutting down maintenece for them as well -Sieve - for(var/c in part:construction_cost)//The check should ensure that anything without the var doesn't make it to this point - if(c in resources) - output += "[i?" | ":null][get_resource_cost_w_coeff(part,c)] [c]" - i++ - return output - else - return 0 - -/obj/machinery/mecha_part_fabricator/proc/output_available_resources() - var/output - for(var/resource in resources) - var/amount = min(res_max_amount, resources[resource]) - output += "[resource]: [amount] cm³" - if(amount>0) - output += " - Remove \[1\] | \[10\] | \[All\]" - output += "
" - return output - -/obj/machinery/mecha_part_fabricator/proc/remove_resources(var/obj/item/part) -//Be SURE to add any new equipment to this switch, but don't be suprised if it spits out children objects - if(part.vars.Find("construction_time") && part.vars.Find("construction_cost")) - for(var/resource in part:construction_cost) - if(resource in src.resources) - src.resources[resource] -= get_resource_cost_w_coeff(part,resource) - else +/obj/machinery/mecha_part_fabricator/attack_hand(var/mob/user) + if(..()) + return + if(!allowed(user)) return -/obj/machinery/mecha_part_fabricator/proc/check_resources(var/obj/item/part) -// if(istype(part, /obj/item/robot_parts) || istype(part, /obj/item/mecha_parts) || istype(part,/obj/item/borg/upgrade)) -//Be SURE to add any new equipment to this switch, but don't be suprised if it spits out children objects - if(part.vars.Find("construction_time") && part.vars.Find("construction_cost")) - for(var/resource in part:construction_cost) - if(resource in src.resources) - if(src.resources[resource] < get_resource_cost_w_coeff(part,resource)) - return 0 - return 1 - else - return 0 + ui_interact(user) -/obj/machinery/mecha_part_fabricator/proc/build_part(var/obj/item/part) - if(!part) return +/obj/machinery/mecha_part_fabricator/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] - // critical exploit prevention, do not remove unless you replace it -walter0o - if( !(locate(part, src.contents)) || !(part.vars.Find("construction_time")) || !(part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator - return + var/datum/design/current = queue.len ? queue[1] : null + if(current) + data["current"] = current.name + data["queue"] = get_queue_names() + data["buildable"] = get_build_options() + data["category"] = category + data["categories"] = categories + data["materials"] = get_materials() + data["maxres"] = res_max_amount + if(current) + data["builtperc"] = round((progress / current.time) * 100) - if(current_manufacturer) - src.being_built = new part.type(src, current_manufacturer) - else - src.being_built = new part.type(src, basic_robolimb.company) - - src.desc = "It's building [src.being_built]." - src.remove_resources(part) - src.overlays += "fab-active" - src.use_power = 2 - src.updateUsrDialog() - sleep(get_construction_time_w_coeff(part)) - src.use_power = 1 - src.overlays -= "fab-active" - src.desc = initial(src.desc) - if(being_built) - src.being_built.Move(get_step(src,output_dir)) - src.visible_message("\icon[src] [src] beeps, \"The following has been completed: [src.being_built] is built\".") - src.being_built = null - src.updateUsrDialog() - return 1 - -/obj/machinery/mecha_part_fabricator/proc/update_queue_on_page() - send_byjax(usr,"mecha_fabricator.browser","queue",src.list_queue()) - return - -/obj/machinery/mecha_part_fabricator/proc/add_part_set_to_queue(set_name) - if(set_name in part_sets) - var/list/part_set = part_sets[set_name] - if(islist(part_set)) - for(var/obj/item/part in part_set) - add_to_queue(part) - return - -/obj/machinery/mecha_part_fabricator/proc/add_to_queue(part) - if(!istype(queue)) - queue = list() - if(part) - queue[++queue.len] = part - return queue.len - -/obj/machinery/mecha_part_fabricator/proc/remove_from_queue(index) - if(!isnum(index) || !istype(queue) || (index<1 || index>queue.len)) - return 0 - queue.Cut(index,++index) - return 1 - -/obj/machinery/mecha_part_fabricator/proc/process_queue() - var/obj/item/part = listgetindex(src.queue, 1) - if(!part) - remove_from_queue(1) - if(src.queue.len) - return process_queue() - else - return - if(!(part.vars.Find("construction_time")) || !(part.vars.Find("construction_cost")))//If it shouldn't be printed - remove_from_queue(1)//Take it out of the quene - return process_queue()//Then reprocess it - temp = null - while(part) - if(stat&(NOPOWER|BROKEN)) - return 0 - if(!check_resources(part)) - src.visible_message("\icon[src] [src] beeps, \"Not enough resources. Queue processing stopped\".") - temp = {"Not enough resources to build next part.
- Try again | Return"} - return 0 - remove_from_queue(1) - build_part(part) - part = listgetindex(src.queue, 1) - src.visible_message("\icon[src] [src] beeps, \"Queue processing finished successfully\".") - return 1 - -/obj/machinery/mecha_part_fabricator/proc/list_queue() - var/output = "Queue contains:" - if(!istype(queue) || !queue.len) - output += "
Nothing" - else - output += "
    " - for(var/i=1;i<=queue.len;i++) - var/obj/item/part = listgetindex(src.queue, i) - if(istype(part)) - if(part.vars.Find("construction_time") && part.vars.Find("construction_cost")) - output += "[part.name] - [i>1?"":null] [i↓":null] Remove" - else//Prevents junk items from even appearing in the list, and they will be silently removed when the fab processes - remove_from_queue(i)//Trash it - return list_queue()//Rebuild it - output += "
" - output += "\[Process queue | Clear queue\]" - return output - -/obj/machinery/mecha_part_fabricator/proc/convert_designs() - if(!files) return - var/i = 0 - for(var/datum/design/D in files.known_designs) - if(D.build_type&16) - if(D.category in part_sets)//Checks if it's a valid category - if(add_part_to_set(D.category, D.build_path))//Adds it to said category - i++ - else - if(add_part_to_set("Misc", D.build_path))//If in doubt, chunk it into the Misc - i++ - return i - -/obj/machinery/mecha_part_fabricator/proc/update_tech() - if(!files) return - var/output - for(var/datum/tech/T in files.known_tech) - if(T && T.level > 1) - var/diff - switch(T.id) //bad, bad formulas - if("materials") - var/pmat = 0//Calculations to make up for the fact that these parts and tech modify the same thing - for(var/obj/item/weapon/stock_parts/micro_laser/Ml in component_parts) - pmat += Ml.rating - if(pmat >= 1) - pmat -= 1//So the equations don't have to be reworked, upgrading a single part from T1 to T2 is == to 1 tech level - diff = round(initial(resource_coeff) - (initial(resource_coeff)*(T.level+pmat))/25,0.01) - if(resource_coeff!=diff) - resource_coeff = diff - output+="Production efficiency increased.
" - if("programming") - var/ptime = 0 - for(var/obj/item/weapon/stock_parts/manipulator/Ma in component_parts) - ptime += Ma.rating - if(ptime >= 2) - ptime -= 2 - diff = round(initial(time_coeff) - (initial(time_coeff)*(T.level+ptime))/25,0.1) - if(time_coeff!=diff) - time_coeff = diff - output+="Production routines updated.
" - return output - - -/obj/machinery/mecha_part_fabricator/proc/sync(silent=null) -/* if(queue.len) - if(!silent) - temp = "Error. Please clear processing queue before updating!" - src.updateUsrDialog() - return -*/ - if(!silent) - temp = "Updating local R&D database..." - src.updateUsrDialog() - sleep(30) //only sleep if called by user - var/found = 0 - for(var/obj/machinery/computer/rdconsole/RDC in get_area_all_atoms(get_area(src))) - if(!RDC.sync) - continue - found++ - for(var/datum/tech/T in RDC.files.known_tech) - files.AddTech2Known(T) - for(var/datum/design/D in RDC.files.known_designs) - files.AddDesign2Known(D) - files.RefreshResearch() - var/i = src.convert_designs() - var/tech_output = update_tech() - if(!silent) - temp = "Processed [i] equipment designs.
" - temp += tech_output - temp += "Return" - src.updateUsrDialog() - if(i || tech_output) - src.visible_message("\icon[src] [src] beeps, \"Successfully synchronized with R&D server. New data processed.\"") - if(found == 0) - temp = "Couldn't contact R&D server.
" - temp += "Return" - src.updateUsrDialog() - src.visible_message("\icon[src] [src] beeps, \"Error! Couldn't connect to R&D server.\"") - return - -/obj/machinery/mecha_part_fabricator/proc/get_resource_cost_w_coeff(var/obj/item/part as obj,var/resource as text, var/roundto=1) -//Be SURE to add any new equipment to this switch, but don't be suprised if it spits out children objects - if(part.vars.Find("construction_time") && part.vars.Find("construction_cost")) - return round(part:construction_cost[resource]*resource_coeff, roundto) - else - return 0 - -/obj/machinery/mecha_part_fabricator/proc/get_construction_time_w_coeff(var/obj/item/part as obj, var/roundto=1) -//Be SURE to add any new equipment to this switch, but don't be suprised if it spits out children objects - if(part.vars.Find("construction_time") && part.vars.Find("construction_cost")) - return round(part:construction_time*time_coeff, roundto) - else - return 0 - - -/obj/machinery/mecha_part_fabricator/attack_hand(mob/user as mob) - var/dat, left_part - if (..()) - return - if(!operation_allowed(user)) - return - user.set_machine(src) - var/turf/exit = get_step(src,SOUTH) - if(exit.density) - src.visible_message("\icon[src] [src] beeps, \"Error! Part outlet is obstructed\".") - return - if(temp) - left_part = temp - else if(src.being_built) - left_part = {"Building [src.being_built.name].
- Please wait until completion...
"} - else - switch(screen) - if("main") - left_part = output_available_resources()+"
" - left_part += "Sync with R&D servers | Set manufacturer ([current_manufacturer])
" - for(var/part_set in part_sets) - left_part += "[part_set] - \[Add all parts to queue\]
" - if("parts") - left_part += output_parts_list(part_set) - left_part += "
Return" - dat = {" - - [src.name] - - - - - - - - - -
- [left_part] - - [list_queue()] -
- - "} - user << browse(dat, "window=mecha_fabricator;size=1000x400") - onclose(user, "mecha_fabricator") - return - -/obj/machinery/mecha_part_fabricator/proc/exploit_prevention(var/obj/Part, mob/user as mob, var/desc_exploit) -// critical exploit prevention, feel free to improve or replace this, but do not remove it -walter0o - - if(!Part || !user || !istype(Part) || !istype(user)) // sanity - return 1 - - if( !(locate(Part, src.contents)) || !(Part.vars.Find("construction_time")) || !(Part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator - - var/turf/LOC = get_turf(user) - message_admins("[key_name_admin(user)] tried to exploit an Exosuit Fabricator to [desc_exploit ? "get the desc of" : "duplicate"] [Part] ! ([LOC ? "JMP" : "null"])", 0) - log_admin("EXPLOIT : [key_name(user)] tried to exploit an Exosuit Fabricator to [desc_exploit ? "get the desc of" : "duplicate"] [Part] !") - return 1 - - return null + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "mechfab.tmpl", "Exosuit Fabricator UI", 800, 600) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) /obj/machinery/mecha_part_fabricator/Topic(href, href_list) - - if(..()) // critical exploit prevention, do not remove unless you replace it -walter0o + if(..()) return - var/datum/topic_input/filter = new /datum/topic_input(href,href_list) - if(href_list["set_manufacturer"]) - var/choice = input(usr, "Which manufacturer do you wish to use for this fabricator?") as null|anything in all_robolimbs - if(choice) current_manufacturer = choice - if(href_list["part_set"]) - var/tpart_set = filter.getStr("part_set") - if(tpart_set) - if(tpart_set=="clear") - src.part_set = null - else - src.part_set = tpart_set - screen = "parts" - if(href_list["part"]) - var/obj/part = filter.getObj("part") + if(href_list["build"]) + add_to_queue(text2num(href_list["build"])) - // critical exploit prevention, do not remove unless you replace it -walter0o - if(src.exploit_prevention(part, usr)) - return + if(href_list["remove"]) + remove_from_queue(text2num(href_list["remove"])) - if(!processing_queue) - build_part(part) - else - add_to_queue(part) - if(href_list["add_to_queue"]) - var/obj/part = filter.getObj("add_to_queue") + if(href_list["category"]) + if(href_list["category"] in categories) + category = href_list["category"] +//TODO: eject and sync + return 1 - // critical exploit prevention, do not remove unless you replace it -walter0o - if(src.exploit_prevention(part, usr)) - return - - add_to_queue(part) - - return update_queue_on_page() - if(href_list["remove_from_queue"]) - remove_from_queue(filter.getNum("remove_from_queue")) - return update_queue_on_page() - if(href_list["partset_to_queue"]) - add_part_set_to_queue(filter.get("partset_to_queue")) - return update_queue_on_page() - if(href_list["process_queue"]) - spawn(-1) - if(processing_queue || being_built) - return 0 - processing_queue = 1 - process_queue() - processing_queue = 0 -/* - if(href_list["list_queue"]) - list_queue() -*/ - if(href_list["clear_temp"]) - temp = null - if(href_list["screen"]) - src.screen = href_list["screen"] - if(href_list["queue_move"] && href_list["index"]) - var/index = filter.getNum("index") - var/new_index = index + filter.getNum("queue_move") - if(isnum(index) && isnum(new_index)) - if(InRange(new_index,1,queue.len)) - queue.Swap(index,new_index) - return update_queue_on_page() - if(href_list["clear_queue"]) - queue = list() - return update_queue_on_page() - if(href_list["sync"]) - queue = list() - src.sync() - return update_queue_on_page() - if(href_list["part_desc"]) - var/obj/part = filter.getObj("part_desc") - - // critical exploit prevention, do not remove unless you replace it -walter0o - if(src.exploit_prevention(part, usr, 1)) - return - - if(part) - temp = {"

[part] description:

- [part.desc]
- Return - "} - if(href_list["remove_mat"] && href_list["material"]) - temp = "Ejected [remove_material(href_list["material"],text2num(href_list["remove_mat"]))] of [href_list["material"]]
Return" - src.updateUsrDialog() - return - -/obj/machinery/mecha_part_fabricator/proc/remove_material(var/mat_string, var/amount) - var/type - switch(mat_string) - if(DEFAULT_WALL_MATERIAL) - type = /obj/item/stack/material/steel - if("glass") - type = /obj/item/stack/material/glass - if("gold") - type = /obj/item/stack/material/gold - if("silver") - type = /obj/item/stack/material/silver - if("diamond") - type = /obj/item/stack/material/diamond - if("phoron") - type = /obj/item/stack/material/phoron - if("uranium") - type = /obj/item/stack/material/uranium - else - return 0 - var/result = 0 - var/obj/item/stack/material/res = new type(src) - - // amount available to take out - var/total_amount = round(resources[mat_string]/res.perunit) - - // number of stacks we're going to take out - res.amount = round(min(total_amount,amount)) - - if(res.amount>0) - resources[mat_string] -= res.amount*res.perunit - res.Move(src.loc) - result = res.amount - else - qdel(res) - return result - -/obj/machinery/mecha_part_fabricator/emag_act(var/remaining_charges, var/mob/user) - sleep() - switch(emagged) - if(0) - emagged = 0.5 - src.visible_message("\icon[src] [src] beeps: \"DB error \[Code 0x00F1\]\"") - sleep(10) - src.visible_message("\icon[src] [src] beeps: \"Attempting auto-repair\"") - sleep(15) - src.visible_message("\icon[src] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"") - sleep(30) - src.visible_message("\icon[src] [src] beeps: \"User DB truncated. Please contact your Nanotrasen system operator for future assistance.\"") - req_access = null - emagged = 1 - return 1 - if(0.5) - src.visible_message("\icon[src] [src] beeps: \"DB not responding \[Code 0x0003\]...\"") - if(1) - src.visible_message("\icon[src] [src] beeps: \"No records in User DB\"") - -/obj/machinery/mecha_part_fabricator/attackby(obj/W as obj, mob/user as mob) - if(istype(W,/obj/item/weapon/screwdriver)) - if (!opened) - opened = 1 - icon_state = "fab-o" - user << "You open the maintenance hatch of [src]." - else - opened = 0 - icon_state = "fab-idle" - user << "You close the maintenance hatch of [src]." +/obj/machinery/mecha_part_fabricator/attackby(var/obj/item/I, var/mob/user) + if(busy) + user << "\The [src] is busy. Please wait for completion of previous operation." + return 1 + if(default_deconstruction_screwdriver(user, I)) + return + if(default_deconstruction_crowbar(user, I)) + return + if(default_part_replacement(user, I)) return - if (opened) - if(istype(W, /obj/item/weapon/crowbar)) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc) - M.state = 2 - M.icon_state = "box_1" - for(var/obj/I in component_parts) - I.loc = src.loc - if(src.resources[DEFAULT_WALL_MATERIAL] >= 3750) - var/obj/item/stack/material/steel/G = new /obj/item/stack/material/steel(src.loc) - G.amount = round(src.resources[DEFAULT_WALL_MATERIAL] / G.perunit) - if(src.resources["glass"] >= 3750) - var/obj/item/stack/material/glass/G = new /obj/item/stack/material/glass(src.loc) - G.amount = round(src.resources["glass"] / G.perunit) - if(src.resources["phoron"] >= 2000) - var/obj/item/stack/material/phoron/G = new /obj/item/stack/material/phoron(src.loc) - G.amount = round(src.resources["phoron"] / G.perunit) - if(src.resources["silver"] >= 2000) - var/obj/item/stack/material/silver/G = new /obj/item/stack/material/silver(src.loc) - G.amount = round(src.resources["silver"] / G.perunit) - if(src.resources["gold"] >= 2000) - var/obj/item/stack/material/gold/G = new /obj/item/stack/material/gold(src.loc) - G.amount = round(src.resources["gold"] / G.perunit) - if(src.resources["uranium"] >= 2000) - var/obj/item/stack/material/uranium/G = new /obj/item/stack/material/uranium(src.loc) - G.amount = round(src.resources["uranium"] / G.perunit) - if(src.resources["diamond"] >= 2000) - var/obj/item/stack/material/diamond/G = new /obj/item/stack/material/diamond(src.loc) - G.amount = round(src.resources["diamond"] / G.perunit) - qdel(src) - return 1 - else - user << "You can't load the [src.name] while it's opened." - return 1 var/material - switch(W.type) + switch(I.type) if(/obj/item/stack/material/gold) material = "gold" if(/obj/item/stack/material/silver) @@ -788,30 +149,118 @@ else return ..() - if(src.being_built) - user << "The fabricator is currently processing. Please wait until completion." - return - - var/obj/item/stack/material/stack = W - + var/obj/item/stack/material/stack = I var/sname = "[stack.name]" var/amnt = stack.perunit - if(src.resources[material] < res_max_amount) + + if(materials[material] + amnt <= res_max_amount) if(stack && stack.amount >= 1) var/count = 0 - src.overlays += "fab-load-[material]"//loading animation is now an overlay based on material type. No more spontaneous conversion of all ores to metal. -vey - sleep(10) - - while(src.resources[material] < res_max_amount && stack.amount >= 1) - src.resources[material] += amnt + overlays += "fab-load-metal" + spawn(10) + overlays -= "fab-load-metal" + while(materials[material] + amnt <= res_max_amount && stack.amount >= 1) + materials[material] += amnt stack.use(1) count++ - src.overlays -= "fab-load-[material]" user << "You insert [count] [sname] into the fabricator." - src.updateUsrDialog() - else - user << "The fabricator can only accept full sheets of [sname]." - return + update_busy() else user << "The fabricator cannot hold more [sname]." - return + +/obj/machinery/mecha_part_fabricator/emag_act(var/remaining_charges, var/mob/user) + switch(emagged) + if(0) + emagged = 0.5 + visible_message("\icon[src] [src] beeps: \"DB error \[Code 0x00F1\]\"") + sleep(10) + visible_message("\icon[src] [src] beeps: \"Attempting auto-repair\"") + sleep(15) + visible_message("\icon[src] [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"") + sleep(30) + visible_message("\icon[src] [src] beeps: \"User DB truncated. Please contact your Nanotrasen system operator for future assistance.\"") + req_access = null + emagged = 1 + return 1 + if(0.5) + visible_message("\icon[src] [src] beeps: \"DB not responding \[Code 0x0003\]...\"") + if(1) + visible_message("\icon[src] [src] beeps: \"No records in User DB\"") + +/obj/machinery/mecha_part_fabricator/proc/update_busy() + if(queue.len) + if(can_build(queue[1])) + busy = 1 + else + busy = 0 + else + busy = 0 + +/obj/machinery/mecha_part_fabricator/proc/add_to_queue(var/index) + var/datum/design/D = files.known_designs[index] + queue += D + update_busy() + +/obj/machinery/mecha_part_fabricator/proc/remove_from_queue(var/index) + if(index == 1) + progress = 0 + queue.Cut(index, index + 1) + update_busy() + +/obj/machinery/mecha_part_fabricator/proc/can_build(var/datum/design/D) + for(var/M in D.materials) + if(materials[M] < D.materials[M]) + return 0 + return 1 + +/obj/machinery/mecha_part_fabricator/proc/finalize() + if(!queue.len) + return + var/datum/design/D = queue[1] + if(D.time > progress) + return + if(!can_build(D)) + return + for(var/M in D.materials) + materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency) + if(D.build_path) + new D.build_path(loc)//var/obj/new_item = //TODO + queue.Cut(1, 2) + update_busy() + +/obj/machinery/mecha_part_fabricator/proc/get_queue_names() + . = list() + for(var/i = 2 to queue.len) + var/datum/design/D = queue[i] + . += D.name + +/obj/machinery/mecha_part_fabricator/proc/get_build_options() + . = list() + for(var/i = 1 to files.known_designs.len) + var/datum/design/D = files.known_designs[i] + if(!D.build_path || !(D.build_type & MECHFAB)) + continue + . += list(list("name" = D.name, "id" = i, "category" = D.category, "resourses" = get_design_resourses(D), "time" = get_design_time(D))) + +/obj/machinery/mecha_part_fabricator/proc/get_design_resourses(var/datum/design/D) + var/list/F = list() + for(var/T in D.materials) + F += "[capitalize(T)]: [D.materials[T] * mat_efficiency]" + return english_list(F, and_text = ", ") + +/obj/machinery/mecha_part_fabricator/proc/get_design_time(var/datum/design/D) + return time2text(round(10 * D.time / speed), "mm:ss") + +/obj/machinery/mecha_part_fabricator/proc/update_categories() + categories = list() + for(var/datum/design/D in files.known_designs) + if(!D.build_path || !(D.build_type & MECHFAB)) + continue + categories |= D.category + if(!category || !(category in categories)) + category = categories[1] + +/obj/machinery/mecha_part_fabricator/proc/get_materials() + . = list() + for(var/T in materials) + . += list(list("mat" = capitalize(T), "amt" = materials[T])) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 96ddeccec64..5c4ae785d23 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -69,8 +69,6 @@ desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell." icon_state = "chest" part = list("groin","chest") - construction_time = 350 - construction_cost = list(DEFAULT_WALL_MATERIAL=40000) var/wires = 0.0 var/obj/item/weapon/cell/cell = null @@ -79,8 +77,6 @@ desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals." icon_state = "head" part = list("head") - construction_time = 350 - construction_cost = list(DEFAULT_WALL_MATERIAL=25000) var/obj/item/device/flash/flash1 = null var/obj/item/device/flash/flash2 = null @@ -88,8 +84,6 @@ name = "endoskeleton" desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors." icon_state = "robo_suit" - construction_time = 500 - construction_cost = list(DEFAULT_WALL_MATERIAL=50000) var/obj/item/robot_parts/l_arm/l_arm = null var/obj/item/robot_parts/r_arm/r_arm = null var/obj/item/robot_parts/l_leg/l_leg = null diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index c0841e95eba..3d26f3f3555 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1438,154 +1438,6 @@ CIRCUITS BELOW build_path = /obj/item/weapon/cartridge/captain sort_string = "VBAAO" -/* -MECHAS BELOW -*/ - -/datum/design/item/mecha - build_type = MECHFAB - req_tech = list(TECH_COMBAT = 3) - category = "Exosuit Equipment" - -/datum/design/item/mecha/AssembleDesignName() - ..() - name = "Exosuit module design ([item_name])" - -/datum/design/item/mecha/weapon/AssembleDesignName() - ..() - name = "Exosuit weapon design ([item_name])" - -/datum/design/item/mecha/AssembleDesignDesc() - if(!desc) - desc = "Allows for the construction of \a '[item_name]' exosuit module." - -// *** Weapon modules -/datum/design/item/mecha/weapon/scattershot - id = "mech_scattershot" - req_tech = list(TECH_COMBAT = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot - -/datum/design/item/mecha/weapon/laser - id = "mech_laser" - req_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser - -/datum/design/item/mecha/weapon/laser_rigged - desc = "Allows for the construction of a welder-laser assembly package for non-combat exosuits." - id = "mech_laser_rigged" - req_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser - -/datum/design/item/mecha/weapon/laser_heavy - id = "mech_laser_heavy" - req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy - -/datum/design/item/mecha/weapon/ion - id = "mech_ion" - req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion - -/datum/design/item/mecha/weapon/grenade_launcher - id = "mech_grenade_launcher" - req_tech = list(TECH_COMBAT = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang - -/datum/design/item/mecha/weapon/clusterbang_launcher - desc = "A weapon that violates the Geneva Convention at 6 rounds per minute." - id = "clusterbang_launcher" - req_tech = list(TECH_COMBAT= 5, TECH_MATERIAL = 5, TECH_ILLEGAL = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited - -// *** Nonweapon modules -/datum/design/item/mecha/wormhole_gen - desc = "An exosuit module that can generate small quasi-stable wormholes." - id = "mech_wormhole_gen" - req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 2) - build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator - -/datum/design/item/mecha/teleporter - desc = "An exosuit module that allows teleportation to any position in view." - id = "mech_teleporter" - req_tech = list(TECH_BLUESPACE = 10, TECH_MAGNET = 5) - build_path = /obj/item/mecha_parts/mecha_equipment/teleporter - -/datum/design/item/mecha/rcd - desc = "An exosuit-mounted rapid construction device." - id = "mech_rcd" - req_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_POWER=4, TECH_ENGINERING = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd - -/datum/design/item/mecha/gravcatapult - desc = "An exosuit-mounted gravitational catapult." - id = "mech_gravcatapult" - req_tech = list(TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_ENGINERING = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult - -/datum/design/item/mecha/repair_droid - desc = "Automated repair droid, exosuits' best companion. BEEP BOOP" - id = "mech_repair_droid" - req_tech = list(TECH_MAGNET = 3, TECH_DATA = 3, TECH_ENGINERING = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid - -/datum/design/item/mecha/phoron_generator - desc = "Exosuit-mounted phoron generator." - id = "mech_phoron_generator" - req_tech = list(TECH_PHORON = 2, TECH_POWER= 2, TECH_ENGINERING = 2) - build_path = /obj/item/mecha_parts/mecha_equipment/generator - -/datum/design/item/mecha/energy_relay - id = "mech_energy_relay" - req_tech = list(TECH_MAGNET = 4, TECH_POWER = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay - -/datum/design/item/mecha/ccw_armor - desc = "Exosuit close-combat armor booster." - id = "mech_ccw_armor" - req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4) - build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster - -/datum/design/item/mecha/proj_armor - desc = "Exosuit projectile armor booster." - id = "mech_proj_armor" - req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_ENGINERING=3) - build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster - -/datum/design/item/mecha/syringe_gun - desc = "Exosuit-mounted syringe gun and chemical synthesizer." - id = "mech_syringe_gun" - req_tech = list(TECH_MATERIAL = 3, TECH_BIO=4, TECH_MAGNET=4, TECH_DATA=3) - build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun - -/datum/design/item/mecha/diamond_drill - desc = "A diamond version of the exosuit drill. It's harder, better, faster, stronger." - id = "mech_diamond_drill" - req_tech = list(TECH_MATERIAL = 4, TECH_ENGINERING = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill - -/datum/design/item/mecha/generator_nuclear - desc = "Exosuit-held nuclear reactor. Converts uranium and everyone's health to energy." - id = "mech_generator_nuclear" - req_tech = list(TECH_POWER= 3, TECH_ENGINERING = 3, TECH_MATERIAL = 3) - build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear - -/datum/design/item/synthetic_flash - id = "sflash" - req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2) - build_type = MECHFAB - materials = list("metal" = 750, "glass" = 750) - build_path = /obj/item/device/flash/synthetic - category = "Misc" - -/datum/design/item/borg_syndicate_module - name = "Cyborg lethal weapons upgrade" - desc = "Allows for the construction of lethal upgrades for cyborgs." - id = "borg_syndicate_module" - build_type = MECHFAB - req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3) - build_path = /obj/item/borg/upgrade/syndicate - category = "Cyborg Upgrade Modules" - /* Uncomment if someone makes these buildable /datum/design/circuit/general_alert name = "general alert console" diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm new file mode 100644 index 00000000000..ce2813131c1 --- /dev/null +++ b/code/modules/research/mechfab_designs.dm @@ -0,0 +1,257 @@ +/datum/design/item/mechfab + build_type = MECHFAB + category = "Misc" + +/datum/design/item/mechfab/robot + category = "Robot" + req_tech = list(TECH_MATERIAL = 1) + +/datum/design/item/mechfab/robot/exoskeleton + name = "Robot Exoskeleton" + id = "robot_exoskeleton" + build_path = /obj/item/robot_parts/robot_suit + time = 50 + materials = list(DEFAULT_WALL_MATERIAL = 50000) + +/datum/design/item/mechfab/robot/torso + name = "Robot Torso" + id = "robot_torso" + build_path = /obj/item/robot_parts/chest + time = 35 + materials = list(DEFAULT_WALL_MATERIAL = 40000) + +/datum/design/item/mechfab/robot/head + name = "Robot Head" + id = "robot_head" + build_path = /obj/item/robot_parts/head + time = 35 + materials = list(DEFAULT_WALL_MATERIAL = 25000) + +/* + var/list/part_sets = list( //set names must be unique + "Robot"=list( + /obj/item/robot_parts/robot_suit, + /obj/item/robot_parts/chest, + /obj/item/robot_parts/head, + /obj/item/robot_parts/l_arm, + /obj/item/robot_parts/r_arm, + /obj/item/robot_parts/l_leg, + /obj/item/robot_parts/r_leg, + /obj/item/robot_parts/robot_component/binary_communication_device, + /obj/item/robot_parts/robot_component/radio, + /obj/item/robot_parts/robot_component/actuator, + /obj/item/robot_parts/robot_component/diagnosis_unit, + /obj/item/robot_parts/robot_component/camera, + /obj/item/robot_parts/robot_component/armour + ), + "Ripley"=list( + /obj/item/mecha_parts/chassis/ripley, + /obj/item/mecha_parts/part/ripley_torso, + /obj/item/mecha_parts/part/ripley_left_arm, + /obj/item/mecha_parts/part/ripley_right_arm, + /obj/item/mecha_parts/part/ripley_left_leg, + /obj/item/mecha_parts/part/ripley_right_leg + ), + "Odysseus"=list( + /obj/item/mecha_parts/chassis/odysseus, + /obj/item/mecha_parts/part/odysseus_torso, + /obj/item/mecha_parts/part/odysseus_head, + /obj/item/mecha_parts/part/odysseus_left_arm, + /obj/item/mecha_parts/part/odysseus_right_arm, + /obj/item/mecha_parts/part/odysseus_left_leg, + /obj/item/mecha_parts/part/odysseus_right_leg + ), + + "Gygax"=list( + /obj/item/mecha_parts/chassis/gygax, + /obj/item/mecha_parts/part/gygax_torso, + /obj/item/mecha_parts/part/gygax_head, + /obj/item/mecha_parts/part/gygax_left_arm, + /obj/item/mecha_parts/part/gygax_right_arm, + /obj/item/mecha_parts/part/gygax_left_leg, + /obj/item/mecha_parts/part/gygax_right_leg, + /obj/item/mecha_parts/part/gygax_armour + ), + "Durand"=list( + /obj/item/mecha_parts/chassis/durand, + /obj/item/mecha_parts/part/durand_torso, + /obj/item/mecha_parts/part/durand_head, + /obj/item/mecha_parts/part/durand_left_arm, + /obj/item/mecha_parts/part/durand_right_arm, + /obj/item/mecha_parts/part/durand_left_leg, + /obj/item/mecha_parts/part/durand_right_leg, + /obj/item/mecha_parts/part/durand_armour + ), + "Exosuit Equipment"=list( + /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp, + /obj/item/mecha_parts/mecha_equipment/tool/drill, + /obj/item/mecha_parts/mecha_equipment/tool/extinguisher, + /obj/item/mecha_parts/mecha_equipment/tool/cable_layer, + /obj/item/mecha_parts/mecha_equipment/tool/sleeper, + /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun, + /obj/item/mecha_parts/mecha_equipment/tool/passenger, + /obj/item/mecha_parts/chassis/firefighter, + ///obj/item/mecha_parts/mecha_equipment/repair_droid, + /obj/item/mecha_parts/mecha_equipment/generator, + ///obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING + /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser, + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg + ), + + "Robotic Upgrade Modules" = list( + /obj/item/borg/upgrade/reset, + /obj/item/borg/upgrade/rename, + /obj/item/borg/upgrade/restart, + /obj/item/borg/upgrade/vtec, + /obj/item/borg/upgrade/tasercooler, + /obj/item/borg/upgrade/jetpack + ), + + "Misc"=list(/obj/item/mecha_parts/mecha_tracking) + ) + */ + + +/datum/design/item/mecha + build_type = MECHFAB + req_tech = list(TECH_COMBAT = 3) + category = "Exosuit Equipment" + +/datum/design/item/mecha/AssembleDesignName() + ..() + name = "Exosuit module design ([item_name])" + +/datum/design/item/mecha/weapon/AssembleDesignName() + ..() + name = "Exosuit weapon design ([item_name])" + +/datum/design/item/mecha/AssembleDesignDesc() + if(!desc) + desc = "Allows for the construction of \a '[item_name]' exosuit module." + +// *** Weapon modules +/datum/design/item/mecha/weapon/scattershot + id = "mech_scattershot" + req_tech = list(TECH_COMBAT = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot + +/datum/design/item/mecha/weapon/laser + id = "mech_laser" + req_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser + +/datum/design/item/mecha/weapon/laser_rigged + desc = "Allows for the construction of a welder-laser assembly package for non-combat exosuits." + id = "mech_laser_rigged" + req_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser + +/datum/design/item/mecha/weapon/laser_heavy + id = "mech_laser_heavy" + req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy + +/datum/design/item/mecha/weapon/ion + id = "mech_ion" + req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion + +/datum/design/item/mecha/weapon/grenade_launcher + id = "mech_grenade_launcher" + req_tech = list(TECH_COMBAT = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang + +/datum/design/item/mecha/weapon/clusterbang_launcher + desc = "A weapon that violates the Geneva Convention at 6 rounds per minute." + id = "clusterbang_launcher" + req_tech = list(TECH_COMBAT= 5, TECH_MATERIAL = 5, TECH_ILLEGAL = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited + +// *** Nonweapon modules +/datum/design/item/mecha/wormhole_gen + desc = "An exosuit module that can generate small quasi-stable wormholes." + id = "mech_wormhole_gen" + req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 2) + build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator + +/datum/design/item/mecha/teleporter + desc = "An exosuit module that allows teleportation to any position in view." + id = "mech_teleporter" + req_tech = list(TECH_BLUESPACE = 10, TECH_MAGNET = 5) + build_path = /obj/item/mecha_parts/mecha_equipment/teleporter + +/datum/design/item/mecha/rcd + desc = "An exosuit-mounted rapid construction device." + id = "mech_rcd" + req_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_POWER=4, TECH_ENGINERING = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd + +/datum/design/item/mecha/gravcatapult + desc = "An exosuit-mounted gravitational catapult." + id = "mech_gravcatapult" + req_tech = list(TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_ENGINERING = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult + +/datum/design/item/mecha/repair_droid + desc = "Automated repair droid, exosuits' best companion. BEEP BOOP" + id = "mech_repair_droid" + req_tech = list(TECH_MAGNET = 3, TECH_DATA = 3, TECH_ENGINERING = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid + +/datum/design/item/mecha/phoron_generator + desc = "Exosuit-mounted phoron generator." + id = "mech_phoron_generator" + req_tech = list(TECH_PHORON = 2, TECH_POWER= 2, TECH_ENGINERING = 2) + build_path = /obj/item/mecha_parts/mecha_equipment/generator + +/datum/design/item/mecha/energy_relay + id = "mech_energy_relay" + req_tech = list(TECH_MAGNET = 4, TECH_POWER = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay + +/datum/design/item/mecha/ccw_armor + desc = "Exosuit close-combat armor booster." + id = "mech_ccw_armor" + req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4) + build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster + +/datum/design/item/mecha/proj_armor + desc = "Exosuit projectile armor booster." + id = "mech_proj_armor" + req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_ENGINERING=3) + build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster + +/datum/design/item/mecha/syringe_gun + desc = "Exosuit-mounted syringe gun and chemical synthesizer." + id = "mech_syringe_gun" + req_tech = list(TECH_MATERIAL = 3, TECH_BIO=4, TECH_MAGNET=4, TECH_DATA=3) + build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun + +/datum/design/item/mecha/diamond_drill + desc = "A diamond version of the exosuit drill. It's harder, better, faster, stronger." + id = "mech_diamond_drill" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINERING = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill + +/datum/design/item/mecha/generator_nuclear + desc = "Exosuit-held nuclear reactor. Converts uranium and everyone's health to energy." + id = "mech_generator_nuclear" + req_tech = list(TECH_POWER= 3, TECH_ENGINERING = 3, TECH_MATERIAL = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear + +/datum/design/item/synthetic_flash + id = "sflash" + req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2) + build_type = MECHFAB + materials = list("metal" = 750, "glass" = 750) + build_path = /obj/item/device/flash/synthetic + category = "Misc" + +/datum/design/item/borg_syndicate_module + name = "Cyborg lethal weapons upgrade" + desc = "Allows for the construction of lethal upgrades for cyborgs." + id = "borg_syndicate_module" + build_type = MECHFAB + req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3) + build_path = /obj/item/borg/upgrade/syndicate + category = "Cyborg Upgrade Modules" \ No newline at end of file diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index bac04445db7..9be5ac20524 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -7061,7 +7061,7 @@ "cFX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cFY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cFZ" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/drone_fabrication) -"cGa" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light,/obj/machinery/mecha_part_fabricator{output_dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engineering/drone_fabrication) +"cGa" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light,/obj/machinery/mecha_part_fabricator,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engineering/drone_fabrication) "cGb" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Master Grid"; name_tag = "Master"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/engineering/drone_fabrication) "cGc" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/engineering/drone_fabrication) "cGd" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) diff --git a/nano/templates/mechfab.tmpl b/nano/templates/mechfab.tmpl new file mode 100644 index 00000000000..78e33705073 --- /dev/null +++ b/nano/templates/mechfab.tmpl @@ -0,0 +1,51 @@ +

Exosuit Fabricator

+
+
+ {{for data.categories}} + {{:helper.link(value, null, {'category' : value}, value == data.category ? 'selected' : null)}} + {{empty}} + There are no known designs + {{/for}} +
+
+ {{for data.buildable}} + {{if value.category == data.category}} +
+ {{:helper.link(value.name, null, {'build' : value.id})}} - {{:value.resourses}}, {{:value.time}} +
+ {{/if}} + {{/for}} +
+
+
+
+
+ Queue contains: +
+ {{if data.current}} +
+ Now: {{:data.current}} ({{:data.builtperc}}% ready) - {{:helper.link('Cancel', null, {'remove' : 1})}} +
+ {{for data.queue}} +
+ {{:index + 2}}: {{:value}} - {{:helper.link('Remove', null, {'remove' : index + 2})}} +
+ {{empty}} +
+ The queue is empty +
+ {{/for}} + {{else}} + Nothing + {{/if}} +
+
+ Materials: + {{for data.materials}} +
+ {{:value.mat}}: {{:value.amt}}/{{:data.maxres}} +
+ {{/for}} +
+
+ From dabcccca6b973c40265d78fbc4e7780835c2285f Mon Sep 17 00:00:00 2001 From: Kelenius Date: Sun, 9 Aug 2015 20:45:39 +0300 Subject: [PATCH 02/24] Updates mechfab UI --- code/game/mecha/mech_fabricator.dm | 48 ++++++++++++++-- nano/templates/mechfab.tmpl | 90 +++++++++++++++++------------- 2 files changed, 93 insertions(+), 45 deletions(-) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 3a0887b1b1f..d75a3630e64 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -2,7 +2,7 @@ icon = 'icons/obj/robotics.dmi' icon_state = "fab-idle" name = "Exosuit Fabricator" - //desc = "Nothing is being built." + desc = "A machine used for construction of robotcs and mechas." density = 1 anchored = 1 use_power = 1 @@ -48,8 +48,11 @@ if(stat) return if(busy) + use_power = 2 progress += speed finalize() + else + use_power = 1 update_icon() /obj/machinery/mecha_part_fabricator/update_icon() @@ -64,21 +67,20 @@ /obj/machinery/mecha_part_fabricator/RefreshParts() res_max_amount = 0 for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) - res_max_amount += M.rating * 100000 + res_max_amount += M.rating * 100000 // 200k -> 600k var/T = 0 for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) T += M.rating - mat_efficiency = 1 - (T - 1) / 4 + mat_efficiency = 1 - (T - 1) / 4 // 1 -> 0.5 for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts) // Not resetting T is intended; speed is affected by both T += M.rating - speed = T / 2 + speed = T / 2 // 1 -> 3 /obj/machinery/mecha_part_fabricator/attack_hand(var/mob/user) if(..()) return if(!allowed(user)) return - ui_interact(user) /obj/machinery/mecha_part_fabricator/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) @@ -116,7 +118,10 @@ if(href_list["category"]) if(href_list["category"] in categories) category = href_list["category"] -//TODO: eject and sync + + if(href_list["eject"]) + eject_materials(href_list["eject"], text2num(href_list["amount"])) +//TODO: sync return 1 /obj/machinery/mecha_part_fabricator/attackby(var/obj/item/I, var/mob/user) @@ -264,3 +269,34 @@ . = list() for(var/T in materials) . += list(list("mat" = capitalize(T), "amt" = materials[T])) + +/obj/machinery/mecha_part_fabricator/proc/eject_materials(var/material, var/amount) + material = lowertext(material) + var/mattype + switch(material) + if(DEFAULT_WALL_MATERIAL) + mattype = /obj/item/stack/material/steel + if("glass") + mattype = /obj/item/stack/material/glass + if("gold") + mattype = /obj/item/stack/material/gold + if("silver") + mattype = /obj/item/stack/material/silver + if("diamond") + mattype = /obj/item/stack/material/diamond + if("phoron") + mattype = /obj/item/stack/material/phoron + if("uranium") + mattype = /obj/item/stack/material/uranium + else + return + var/obj/item/stack/material/S = new mattype(loc) + if(amount == 0) + amount = S.max_amount + world << "[materials[material]] | [S.perunit]" + var/ejected = min(round(materials[material] / S.perunit), amount) + S.amount = min(ejected, amount) + if(S.amount <= 0) + qdel(S) + return + materials[material] -= ejected * S.perunit diff --git a/nano/templates/mechfab.tmpl b/nano/templates/mechfab.tmpl index 78e33705073..bf09b8777d7 100644 --- a/nano/templates/mechfab.tmpl +++ b/nano/templates/mechfab.tmpl @@ -1,51 +1,63 @@

Exosuit Fabricator

-
- {{for data.categories}} + {{for data.categories}} +
{{:helper.link(value, null, {'category' : value}, value == data.category ? 'selected' : null)}} - {{empty}} +
+ {{empty}} +
There are no known designs - {{/for}} -
-
- {{for data.buildable}} - {{if value.category == data.category}} -
- {{:helper.link(value.name, null, {'build' : value.id})}} - {{:value.resourses}}, {{:value.time}} -
- {{/if}} - {{/for}} -
+
+ {{/for}} + {{for data.buildable}} + {{if value.category == data.category}} +
+ {{:helper.link(value.name, null, {'build' : value.id})}} - {{:value.resourses}}, {{:value.time}} +
+ {{/if}} + {{/for}}
-
- Queue contains: -
- {{if data.current}} -
- Now: {{:data.current}} ({{:data.builtperc}}% ready) - {{:helper.link('Cancel', null, {'remove' : 1})}} -
- {{for data.queue}} -
- {{:index + 2}}: {{:value}} - {{:helper.link('Remove', null, {'remove' : index + 2})}} -
- {{empty}} -
- The queue is empty -
- {{/for}} - {{else}} - Nothing - {{/if}} + Queue contains:
-
- Materials: - {{for data.materials}} -
- {{:value.mat}}: {{:value.amt}}/{{:data.maxres}} + {{if data.current}} +
+ Now: {{:data.current}} ({{:data.builtperc}}% ready) - {{:helper.link('Cancel', null, {'remove' : 1})}} +
+ {{for data.queue}} +
+ {{:index + 2}}: {{:value}} - {{:helper.link('Remove', null, {'remove' : index + 2})}} +
+ {{empty}} +
+ The queue is empty
{{/for}} -
+ {{else}} +
+ Nothing +
+ {{/if}} + Materials: + {{for data.materials}} +
+
+ {{:value.mat}}: {{:value.amt}}/{{:data.maxres}} +
+
+ {{if value.amt > 2000}} + {{:helper.link('x1', null, {'eject' : value.mat, 'amount' : 1})}} + {{if value.amt > 10000}} + {{:helper.link('x5', null, {'eject' : value.mat, 'amount' : 5})}} + {{if value.amt > 20000}} + {{:helper.link('x10', null, {'eject' : value.mat, 'amount' : 10})}} + {{/if}} + {{/if}} + {{/if}} + {{:helper.link('All', null, {'eject' : value.mat, 'amount' : 0})}} +
+
+ {{/for}}
From 7562f6f01aaa644785ae3aa4520607bc9f93b450 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Mon, 10 Aug 2015 17:46:03 +0300 Subject: [PATCH 03/24] Updates mechfab interface Fixes all bugs I found. --- code/game/mecha/equipment/mecha_equipment.dm | 4 +- .../mecha/equipment/tools/medical_tools.dm | 6 +- code/game/mecha/equipment/tools/tools.dm | 20 +- code/game/mecha/equipment/weapons/weapons.dm | 2 +- code/game/mecha/mech_fabricator.dm | 67 +++- code/game/mecha/mecha_control_console.dm | 4 +- code/game/mecha/mecha_parts.dm | 79 +--- code/game/objects/items/robot/robot_parts.dm | 8 - .../mob/living/silicon/robot/component.dm | 2 - code/modules/research/designs.dm | 132 +++---- code/modules/research/mechfab_designs.dm | 343 +++++++++++++++--- code/modules/research/protolathe.dm | 2 +- code/modules/research/rdmachines.dm | 4 +- nano/templates/mechfab.tmpl | 55 +-- 14 files changed, 473 insertions(+), 255 deletions(-) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 607e8f445c9..733fe7bf82a 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -7,8 +7,8 @@ icon_state = "mecha_equip" force = 5 origin_tech = list(TECH_MATERIAL = 2) - construction_time = 100 - construction_cost = list(DEFAULT_WALL_MATERIAL=10000) + //construction_time = 100 + //construction_cost = list(DEFAULT_WALL_MATERIAL=10000) var/equip_cooldown = 0 var/equip_ready = 1 var/energy_drain = 0 diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 6cec1441323..754f0dc4c3a 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -6,7 +6,7 @@ origin_tech = list(TECH_DATA = 2, TECH_BIO = 3) energy_drain = 20 range = MELEE - construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=10000) + //construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=10000) equip_cooldown = 20 var/mob/living/carbon/occupant = null var/datum/global_iterator/pr_mech_sleeper @@ -386,8 +386,8 @@ range = MELEE|RANGED equip_cooldown = 10 origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3) - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=3000,"glass"=2000) + //construction_time = 200 + //construction_cost = list(DEFAULT_WALL_MATERIAL=3000,"glass"=2000) required_type = /obj/mecha/medical New() diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 91e544cf253..1de3d98ed0e 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -128,7 +128,7 @@ desc = "This is an upgraded version of the drill that'll pierce the heavens! (Can be attached to: Combat and Engineering Exosuits)" icon_state = "mecha_diamond_drill" origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINERING = 3) - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"diamond"=6500) + //construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"diamond"=6500) equip_cooldown = 20 force = 15 @@ -255,8 +255,8 @@ equip_cooldown = 10 energy_drain = 250 range = MELEE|RANGED - construction_time = 1200 - construction_cost = list(DEFAULT_WALL_MATERIAL=30000,"phoron"=25000,"silver"=20000,"gold"=20000) + //construction_time = 1200 + //construction_cost = list(DEFAULT_WALL_MATERIAL=30000,"phoron"=25000,"silver"=20000,"gold"=20000) var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock. var/disabled = 0 //malf @@ -506,7 +506,7 @@ equip_cooldown = 10 energy_drain = 50 range = 0 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"silver"=5000) + //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"silver"=5000) var/deflect_coeff = 1.15 var/damage_coeff = 0.8 @@ -556,7 +556,7 @@ equip_cooldown = 10 energy_drain = 50 range = 0 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"gold"=5000) + //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"gold"=5000) var/deflect_coeff = 1.15 var/damage_coeff = 0.8 @@ -627,7 +627,7 @@ equip_cooldown = 20 energy_drain = 100 range = 0 - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"gold"=1000,"silver"=2000,"glass"=5000) + //construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"gold"=1000,"silver"=2000,"glass"=5000) var/health_boost = 2 var/datum/global_iterator/pr_repair_droid var/icon/droid_overlay @@ -722,7 +722,7 @@ equip_cooldown = 10 energy_drain = 0 range = 0 - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"gold"=2000,"silver"=3000,"glass"=2000) + //construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"gold"=2000,"silver"=3000,"glass"=2000) var/datum/global_iterator/pr_energy_relay var/coeff = 100 var/list/use_channels = list(EQUIP,ENVIRON,LIGHT) @@ -839,7 +839,7 @@ equip_cooldown = 10 energy_drain = 0 range = MELEE - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"silver"=500,"glass"=1000) + //construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"silver"=500,"glass"=1000) var/datum/global_iterator/pr_mech_generator var/coeff = 100 var/obj/item/stack/material/fuel @@ -974,7 +974,7 @@ desc = "Generates power using uranium. Pollutes the environment." icon_state = "tesla" origin_tech = list(TECH_POWER = 3, TECH_ENGINERING = 3) - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"silver"=500,"glass"=1000) + //construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"silver"=500,"glass"=1000) max_fuel = 50000 fuel_per_cycle_idle = 10 fuel_per_cycle_active = 30 @@ -1072,7 +1072,7 @@ origin_tech = list(TECH_ENGINERING = 1, TECH_BIO = 1) energy_drain = 10 range = MELEE - construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=5000) + //construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=5000) equip_cooldown = 20 var/mob/living/carbon/occupant = null var/door_locked = 1 diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index f034f275507..3f59feef7f6 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -274,7 +274,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve name = "\improper SOP-6 grenade launcher" projectile = /obj/item/weapon/grenade/flashbang/clusterbang - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"gold"=6000,"uranium"=6000) + //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"gold"=6000,"uranium"=6000) /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/get_equip_info()//Limited version of the clusterbang launcher that can't reload return "* [chassis.selected==src?"":""][src.name][chassis.selected==src?"":""]\[[src.projectiles]\]" diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index d75a3630e64..e3c344587f2 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -10,7 +10,6 @@ active_power_usage = 5000 req_access = list(access_robotics) - var/current_manufacturer var/speed = 1 var/mat_efficiency = 1 var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "diamond" = 0, "phoron" = 0, "uranium" = 0) @@ -23,6 +22,8 @@ var/list/categories = list() var/category = null + var/manufacturer = null + var/sync_message = "" /obj/machinery/mecha_part_fabricator/New() ..() @@ -40,7 +41,7 @@ return /obj/machinery/mecha_part_fabricator/initialize() - current_manufacturer = basic_robolimb.company + manufacturer = basic_robolimb.company update_categories() /obj/machinery/mecha_part_fabricator/process() @@ -50,7 +51,7 @@ if(busy) use_power = 2 progress += speed - finalize() + check_build() else use_power = 1 update_icon() @@ -64,6 +65,11 @@ if(busy) overlays += "fab-active" +/obj/machinery/mecha_part_fabricator/dismantle() + for(var/f in materials) + eject_materials(f, -1) + ..() + /obj/machinery/mecha_part_fabricator/RefreshParts() res_max_amount = 0 for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) @@ -93,8 +99,12 @@ data["buildable"] = get_build_options() data["category"] = category data["categories"] = categories + if(all_robolimbs) + data["manufacturers"] = all_robolimbs + data["manufacturer"] = manufacturer data["materials"] = get_materials() data["maxres"] = res_max_amount + data["sync"] = sync_message if(current) data["builtperc"] = round((progress / current.time) * 100) @@ -119,9 +129,18 @@ if(href_list["category"] in categories) category = href_list["category"] + if(href_list["manufacturer"]) + if(href_list["manufacturer"] in all_robolimbs) + manufacturer = href_list["manufacturer"] + if(href_list["eject"]) eject_materials(href_list["eject"], text2num(href_list["amount"])) -//TODO: sync + + if(href_list["sync"]) + sync() + else + sync_message = "" + return 1 /obj/machinery/mecha_part_fabricator/attackby(var/obj/item/I, var/mob/user) @@ -218,20 +237,26 @@ return 0 return 1 -/obj/machinery/mecha_part_fabricator/proc/finalize() +/obj/machinery/mecha_part_fabricator/proc/check_build() if(!queue.len) + progress = 0 return var/datum/design/D = queue[1] - if(D.time > progress) - return if(!can_build(D)) + progress = 0 + return + if(D.time > progress) return for(var/M in D.materials) materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency) if(D.build_path) - new D.build_path(loc)//var/obj/new_item = //TODO - queue.Cut(1, 2) - update_busy() + var/obj/new_item = new D.build_path(loc, manufacturer) + visible_message("\The [src] pings, indicating that \the [D] is complete.", "You hear a ping.") + if(mat_efficiency != 1) + if(new_item.matter && new_item.matter.len > 0) + for(var/i in new_item.matter) + new_item.matter[i] = new_item.matter[i] * mat_efficiency + remove_from_queue(1) /obj/machinery/mecha_part_fabricator/proc/get_queue_names() . = list() @@ -270,7 +295,8 @@ for(var/T in materials) . += list(list("mat" = capitalize(T), "amt" = materials[T])) -/obj/machinery/mecha_part_fabricator/proc/eject_materials(var/material, var/amount) +/obj/machinery/mecha_part_fabricator/proc/eject_materials(var/material, var/amount) // 0 amount = 0 means ejecting a full stack; -1 means eject everything + var/recursive = amount == -1 ? 1 : 0 material = lowertext(material) var/mattype switch(material) @@ -291,12 +317,27 @@ else return var/obj/item/stack/material/S = new mattype(loc) - if(amount == 0) + if(amount <= 0) amount = S.max_amount - world << "[materials[material]] | [S.perunit]" var/ejected = min(round(materials[material] / S.perunit), amount) S.amount = min(ejected, amount) if(S.amount <= 0) qdel(S) return materials[material] -= ejected * S.perunit + if(recursive && materials[material] >= S.perunit) + eject_materials(material, -1) + update_busy() + +/obj/machinery/mecha_part_fabricator/proc/sync() + sync_message = "Error: no console found." + for(var/obj/machinery/computer/rdconsole/RDC in get_area_all_atoms(get_area(src))) + if(!RDC.sync) + continue + for(var/datum/tech/T in RDC.files.known_tech) + files.AddTech2Known(T) + for(var/datum/design/D in RDC.files.known_designs) + files.AddDesign2Known(D) + files.RefreshResearch() + sync_message = "Sync complete." + update_categories() diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 3a3e48d1547..723180bcb29 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -69,8 +69,8 @@ icon = 'icons/obj/device.dmi' icon_state = "motion2" origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 2) - construction_time = 50 - construction_cost = list(DEFAULT_WALL_MATERIAL=500) + //construction_time = 50 + //construction_cost = list(DEFAULT_WALL_MATERIAL=500) proc/get_mecha_info() if(!in_mecha()) diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 4e19037ccec..8df85656046 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -11,15 +11,12 @@ w_class = 5 flags = CONDUCT origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2) - var/construction_time = 100 - var/list/construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"glass"=5000) /obj/item/mecha_parts/chassis name="Mecha Chassis" icon_state = "backbone" var/datum/construction/construct - construction_cost = list(DEFAULT_WALL_MATERIAL=20000) flags = CONDUCT attackby(obj/item/W as obj, mob/user as mob) @@ -44,46 +41,35 @@ desc="A torso part of Ripley APLU. Contains power unit, processing core and life support systems." icon_state = "ripley_harness" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_ENGINERING = 2) - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=40000,"glass"=15000) /obj/item/mecha_parts/part/ripley_left_arm name="Ripley Left Arm" desc="A Ripley APLU left arm. Data and power sockets are compatible with most exosuit tools." icon_state = "ripley_l_arm" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2) - construction_time = 150 - construction_cost = list(DEFAULT_WALL_MATERIAL=25000) /obj/item/mecha_parts/part/ripley_right_arm name="Ripley Right Arm" desc="A Ripley APLU right arm. Data and power sockets are compatible with most exosuit tools." icon_state = "ripley_r_arm" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2) - construction_time = 150 - construction_cost = list(DEFAULT_WALL_MATERIAL=25000) /obj/item/mecha_parts/part/ripley_left_leg name="Ripley Left Leg" desc="A Ripley APLU left leg. Contains somewhat complex servodrives and balance maintaining systems." icon_state = "ripley_l_leg" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2) - construction_time = 150 - construction_cost = list(DEFAULT_WALL_MATERIAL=30000) /obj/item/mecha_parts/part/ripley_right_leg name="Ripley Right Leg" desc="A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems." icon_state = "ripley_r_leg" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2) - construction_time = 150 - construction_cost = list(DEFAULT_WALL_MATERIAL=30000) ///////// Gygax /obj/item/mecha_parts/chassis/gygax name = "Gygax Chassis" - construction_cost = list(DEFAULT_WALL_MATERIAL=25000) New() ..() @@ -94,60 +80,45 @@ desc="A torso part of Gygax. Contains power unit, processing core and life support systems. Has an additional equipment slot." icon_state = "gygax_harness" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 3, TECH_ENGINERING = 3) - construction_time = 300 - construction_cost = list(DEFAULT_WALL_MATERIAL=50000,"glass"=20000) /obj/item/mecha_parts/part/gygax_head name="Gygax Head" desc="A Gygax head. Houses advanced surveilance and targeting sensors." icon_state = "gygax_head" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_MAGNET = 3, TECH_ENGINERING = 3) - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"glass"=10000) /obj/item/mecha_parts/part/gygax_left_arm name="Gygax Left Arm" desc="A Gygax left arm. Data and power sockets are compatible with most exosuit tools and weapons." icon_state = "gygax_l_arm" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 3) - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=30000) /obj/item/mecha_parts/part/gygax_right_arm name="Gygax Right Arm" desc="A Gygax right arm. Data and power sockets are compatible with most exosuit tools and weapons." icon_state = "gygax_r_arm" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 3) - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=30000) /obj/item/mecha_parts/part/gygax_left_leg name="Gygax Left Leg" icon_state = "gygax_l_leg" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 3) - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=35000) /obj/item/mecha_parts/part/gygax_right_leg name="Gygax Right Leg" icon_state = "gygax_r_leg" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 3) - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=35000) /obj/item/mecha_parts/part/gygax_armour name="Gygax Armour Plates" icon_state = "gygax_armour" origin_tech = list(TECH_MATERIAL = 6, TECH_COMBAT = 4, TECH_ENGINERING = 5) - construction_time = 600 - construction_cost = list(DEFAULT_WALL_MATERIAL=50000,"diamond"=10000) //////////// Durand /obj/item/mecha_parts/chassis/durand name = "Durand Chassis" - construction_cost = list(DEFAULT_WALL_MATERIAL=25000) New() ..() @@ -157,50 +128,36 @@ name="Durand Torso" icon_state = "durand_harness" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_BIO = 3, TECH_ENGINERING = 3) - construction_time = 300 - construction_cost = list(DEFAULT_WALL_MATERIAL=55000,"glass"=20000,"silver"=10000) /obj/item/mecha_parts/part/durand_head name="Durand Head" icon_state = "durand_head" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_ENGINERING = 3) - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=25000,"glass"=10000,"silver"=3000) /obj/item/mecha_parts/part/durand_left_arm name="Durand Left Arm" icon_state = "durand_l_arm" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINERING = 3) - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"silver"=3000) /obj/item/mecha_parts/part/durand_right_arm name="Durand Right Arm" icon_state = "durand_r_arm" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINERING = 3) - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"silver"=3000) /obj/item/mecha_parts/part/durand_left_leg name="Durand Left Leg" icon_state = "durand_l_leg" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINERING = 3) - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=40000,"silver"=3000) /obj/item/mecha_parts/part/durand_right_leg name="Durand Right Leg" icon_state = "durand_r_leg" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINERING = 3) - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=40000,"silver"=3000) /obj/item/mecha_parts/part/durand_armour name="Durand Armour Plates" icon_state = "durand_armour" origin_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4, TECH_ENGINERING = 5) - construction_time = 600 - construction_cost = list(DEFAULT_WALL_MATERIAL=50000,"uranium"=10000) @@ -247,43 +204,43 @@ /obj/item/mecha_parts/part/phazon_torso name="Phazon Torso" icon_state = "phazon_harness" - construction_time = 300 - construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"glass"=10000,"phoron"=20000) + //construction_time = 300 + //construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"glass"=10000,"phoron"=20000) origin_tech = list(TECH_DATA = 5, TECH_MATERIAL = 7, TECH_BLUESPACE = 6, TECH_POWER = 6) /obj/item/mecha_parts/part/phazon_head name="Phazon Head" icon_state = "phazon_head" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=15000,"glass"=5000,"phoron"=10000) + //construction_time = 200 + //construction_cost = list(DEFAULT_WALL_MATERIAL=15000,"glass"=5000,"phoron"=10000) origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 5, TECH_MAGNET = 6) /obj/item/mecha_parts/part/phazon_left_arm name="Phazon Left Arm" icon_state = "phazon_l_arm" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) + //construction_time = 200 + //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 2) /obj/item/mecha_parts/part/phazon_right_arm name="Phazon Right Arm" icon_state = "phazon_r_arm" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) + //construction_time = 200 + //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 2) /obj/item/mecha_parts/part/phazon_left_leg name="Phazon Left Leg" icon_state = "phazon_l_leg" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) + //construction_time = 200 + //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 3, TECH_MAGNET = 3) /obj/item/mecha_parts/part/phazon_right_leg name="Phazon Right Leg" icon_state = "phazon_r_leg" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) + //construction_time = 200 + //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000) origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 3, TECH_MAGNET = 3) ///////// Odysseus @@ -299,8 +256,6 @@ /obj/item/mecha_parts/part/odysseus_head name="Odysseus Head" icon_state = "odysseus_head" - construction_time = 100 - construction_cost = list(DEFAULT_WALL_MATERIAL=2000,"glass"=10000) origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 2) /obj/item/mecha_parts/part/odysseus_torso @@ -308,40 +263,30 @@ desc="A torso part of Odysseus. Contains power unit, processing core and life support systems." icon_state = "odysseus_torso" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_ENGINERING = 2) - construction_time = 180 - construction_cost = list(DEFAULT_WALL_MATERIAL=25000) /obj/item/mecha_parts/part/odysseus_left_arm name="Odysseus Left Arm" desc="An Odysseus left arm. Data and power sockets are compatible with most exosuit tools." icon_state = "odysseus_l_arm" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2) - construction_time = 120 - construction_cost = list(DEFAULT_WALL_MATERIAL=10000) /obj/item/mecha_parts/part/odysseus_right_arm name="Odysseus Right Arm" desc="An Odysseus right arm. Data and power sockets are compatible with most exosuit tools." icon_state = "odysseus_r_arm" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2) - construction_time = 120 - construction_cost = list(DEFAULT_WALL_MATERIAL=10000) /obj/item/mecha_parts/part/odysseus_left_leg name="Odysseus Left Leg" desc="An Odysseus left leg. Contains somewhat complex servodrives and balance maintaining systems." icon_state = "odysseus_l_leg" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2) - construction_time = 130 - construction_cost = list(DEFAULT_WALL_MATERIAL=15000) /obj/item/mecha_parts/part/odysseus_right_leg name="Odysseus Right Leg" desc="A Odysseus right leg. Contains somewhat complex servodrives and balance maintaining systems." icon_state = "odysseus_r_leg" origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2) - construction_time = 130 - construction_cost = list(DEFAULT_WALL_MATERIAL=15000) /*/obj/item/mecha_parts/part/odysseus_armour name="Odysseus Carapace" diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 5c4ae785d23..32237e694cd 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -32,8 +32,6 @@ name = "left arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_arm" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=18000) part = list("l_arm","l_hand") model_info = 1 @@ -41,8 +39,6 @@ name = "right arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_arm" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=18000) part = list("r_arm","r_hand") model_info = 1 @@ -50,8 +46,6 @@ name = "left leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_leg" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=15000) part = list("l_leg","l_foot") model_info = 1 @@ -59,8 +53,6 @@ name = "right leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_leg" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=15000) part = list("r_leg","r_foot") model_info = 1 diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 1894d62942b..6f0b3d81bd2 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -217,8 +217,6 @@ /obj/item/robot_parts/robot_component icon = 'icons/obj/robot_component.dmi' icon_state = "working" - construction_time = 200 - construction_cost = list(DEFAULT_WALL_MATERIAL=5000) var/brute = 0 var/burn = 0 var/icon_state_broken = "broken" diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 3d26f3f3555..0787cc5f2f1 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -63,7 +63,7 @@ other types of metals and chemistry for reagents). desc = "Produce additional disks for storing device designs." id = "design_disk" req_tech = list(TECH_DATA = 1) - materials = list("metal" = 30, "glass" = 10) + materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) build_path = /obj/item/weapon/disk/design_disk sort_string = "GAAAA" @@ -72,7 +72,7 @@ other types of metals and chemistry for reagents). desc = "Produce additional disks for storing technology data." id = "tech_disk" req_tech = list(TECH_DATA = 1) - materials = list("metal" = 30, "glass" = 10) + materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) build_path = /obj/item/weapon/disk/tech_disk sort_string = "GAAAB" @@ -90,105 +90,105 @@ other types of metals and chemistry for reagents). /datum/design/item/stock_part/basic_capacitor id = "basic_capacitor" req_tech = list(TECH_POWER = 1) - materials = list("metal" = 50, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) build_path = /obj/item/weapon/stock_parts/capacitor sort_string = "CAAAA" /datum/design/item/stock_part/adv_capacitor id = "adv_capacitor" req_tech = list(TECH_POWER = 3) - materials = list("metal" = 50, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) build_path = /obj/item/weapon/stock_parts/capacitor/adv sort_string = "CAAAB" /datum/design/item/stock_part/super_capacitor id = "super_capacitor" req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4) - materials = list("metal" = 50, "glass" = 50, "gold" = 20) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, "gold" = 20) build_path = /obj/item/weapon/stock_parts/capacitor/super sort_string = "CAAAC" /datum/design/item/stock_part/micro_mani id = "micro_mani" req_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1) - materials = list("metal" = 30) + materials = list(DEFAULT_WALL_MATERIAL = 30) build_path = /obj/item/weapon/stock_parts/manipulator sort_string = "CAABA" /datum/design/item/stock_part/nano_mani id = "nano_mani" req_tech = list(TECH_MATERIAL = 3, TECH_DATA = 2) - materials = list("metal" = 30) + materials = list(DEFAULT_WALL_MATERIAL = 30) build_path = /obj/item/weapon/stock_parts/manipulator/nano sort_string = "CAABB" /datum/design/item/stock_part/pico_mani id = "pico_mani" req_tech = list(TECH_MATERIAL = 5, TECH_DATA = 2) - materials = list("metal" = 30) + materials = list(DEFAULT_WALL_MATERIAL = 30) build_path = /obj/item/weapon/stock_parts/manipulator/pico sort_string = "CAABC" /datum/design/item/stock_part/basic_matter_bin id = "basic_matter_bin" req_tech = list(TECH_MATERIAL = 1) - materials = list("metal" = 80) + materials = list(DEFAULT_WALL_MATERIAL = 80) build_path = /obj/item/weapon/stock_parts/matter_bin sort_string = "CAACA" /datum/design/item/stock_part/adv_matter_bin id = "adv_matter_bin" req_tech = list(TECH_MATERIAL = 3) - materials = list("metal" = 80) + materials = list(DEFAULT_WALL_MATERIAL = 80) build_path = /obj/item/weapon/stock_parts/matter_bin/adv sort_string = "CAACB" /datum/design/item/stock_part/super_matter_bin id = "super_matter_bin" req_tech = list(TECH_MATERIAL = 5) - materials = list("metal" = 80) + materials = list(DEFAULT_WALL_MATERIAL = 80) build_path = /obj/item/weapon/stock_parts/matter_bin/super sort_string = "CAACC" /datum/design/item/stock_part/basic_micro_laser id = "basic_micro_laser" req_tech = list(TECH_MAGNET = 1) - materials = list("metal" = 10, "glass" = 20) + materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20) build_path = /obj/item/weapon/stock_parts/micro_laser sort_string = "CAADA" /datum/design/item/stock_part/high_micro_laser id = "high_micro_laser" req_tech = list(TECH_MAGNET = 3) - materials = list("metal" = 10, "glass" = 20) + materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20) build_path = /obj/item/weapon/stock_parts/micro_laser/high sort_string = "CAADB" /datum/design/item/stock_part/ultra_micro_laser id = "ultra_micro_laser" req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5) - materials = list("metal" = 10, "glass" = 20, "uranium" = 10) + materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20, "uranium" = 10) build_path = /obj/item/weapon/stock_parts/micro_laser/ultra sort_string = "CAADC" /datum/design/item/stock_part/basic_sensor id = "basic_sensor" req_tech = list(TECH_MAGNET = 1) - materials = list("metal" = 50, "glass" = 20) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20) build_path = /obj/item/weapon/stock_parts/scanning_module sort_string = "CAAEA" /datum/design/item/stock_part/adv_sensor id = "adv_sensor" req_tech = list(TECH_MAGNET = 3) - materials = list("metal" = 50, "glass" = 20) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20) build_path = /obj/item/weapon/stock_parts/scanning_module/adv sort_string = "CAAEB" /datum/design/item/stock_part/phasic_sensor id = "phasic_sensor" req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 3) - materials = list("metal" = 50, "glass" = 20, "silver" = 10) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20, "silver" = 10) build_path = /obj/item/weapon/stock_parts/scanning_module/phasic sort_string = "CAAEC" @@ -197,7 +197,7 @@ other types of metals and chemistry for reagents). desc = "Special mechanical module made to store, sort, and apply standard machine parts." id = "rped" req_tech = list(TECH_ENGINERING = 3, TECH_MATERIAL = 3) - materials = list("metal" = 15000, "glass" = 5000) + materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 5000) build_path = /obj/item/weapon/storage/part_replacer sort_string = "CBAAA" @@ -217,7 +217,7 @@ other types of metals and chemistry for reagents). build_type = PROTOLATHE | MECHFAB id = "basic_cell" req_tech = list(TECH_POWER = 1) - materials = list("metal" = 700, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50) build_path = /obj/item/weapon/cell category = "Misc" sort_string = "DAAAA" @@ -227,7 +227,7 @@ other types of metals and chemistry for reagents). build_type = PROTOLATHE | MECHFAB id = "high_cell" req_tech = list(TECH_POWER = 2) - materials = list("metal" = 700, "glass" = 60) + materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60) build_path = /obj/item/weapon/cell/high category = "Misc" sort_string = "DAAAB" @@ -236,7 +236,7 @@ other types of metals and chemistry for reagents). name = "super-capacity" id = "super_cell" req_tech = list(TECH_POWER = 3, TECH_MATERIAL = 2) - materials = list("metal" = 700, "glass" = 70) + materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70) build_path = /obj/item/weapon/cell/super category = "Misc" sort_string = "DAAAC" @@ -245,13 +245,13 @@ other types of metals and chemistry for reagents). name = "hyper-capacity" id = "hyper_cell" req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4) - materials = list("metal" = 400, "gold" = 150, "silver" = 150, "glass" = 70) + materials = list(DEFAULT_WALL_MATERIAL = 400, "gold" = 150, "silver" = 150, "glass" = 70) build_path = /obj/item/weapon/cell/hyper category = "Misc" sort_string = "DAAAD" /datum/design/item/hud - materials = list("metal" = 50, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) /datum/design/item/hud/AssembleDesignName() ..() @@ -279,7 +279,7 @@ other types of metals and chemistry for reagents). desc = "Using the meson-scanning technology those glasses allow you to see through walls, floor or anything else." id = "mesons" req_tech = list(TECH_MAGNET = 2, TECH_ENGINERING = 2) - materials = list("metal" = 50, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) build_path = /obj/item/clothing/glasses/meson sort_string = "GAAAC" @@ -290,21 +290,21 @@ other types of metals and chemistry for reagents). /datum/design/item/weapon/mining/jackhammer id = "jackhammer" req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINERING = 2) - materials = list("metal" = 2000, "glass" = 500, "silver" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "silver" = 500) build_path = /obj/item/weapon/pickaxe/jackhammer sort_string = "KAAAA" /datum/design/item/weapon/mining/drill id = "drill" req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINERING = 2) - materials = list("metal" = 6000, "glass" = 1000) //expensive, but no need for miners. + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1000) //expensive, but no need for miners. build_path = /obj/item/weapon/pickaxe/drill sort_string = "KAAAB" /datum/design/item/weapon/mining/plasmacutter id = "plasmacutter" req_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINERING = 3) - materials = list("metal" = 1500, "glass" = 500, "gold" = 500, "phoron" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 500, "gold" = 500, "phoron" = 500) build_path = /obj/item/weapon/pickaxe/plasmacutter sort_string = "KAAAC" @@ -318,7 +318,7 @@ other types of metals and chemistry for reagents). /datum/design/item/weapon/mining/drill_diamond id = "drill_diamond" req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINERING = 4) - materials = list("metal" = 3000, "glass" = 1000, "diamond" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 1000, "diamond" = 2000) build_path = /obj/item/weapon/pickaxe/diamonddrill sort_string = "KAAAE" /////////////////////////////////// @@ -329,7 +329,7 @@ datum/design/circuit/shield materials = list("$glass" = 2000, "sacid" = 20, "$phoron" = 10000, "$diamond" = 5000, "$gold" = 10000) /datum/design/item/medical - materials = list("metal" = 30, "glass" = 20) + materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 20) /datum/design/item/medical/AssembleDesignName() ..() @@ -339,7 +339,7 @@ datum/design/circuit/shield desc = "A hand-held scanner able to diagnose robotic injuries." id = "robot_scanner" req_tech = list(TECH_MAGNET = 3, TECH_BIO = 2, TECH_ENGINERING = 3) - materials = list("metal" = 500, "glass" = 200) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200) build_path = /obj/item/device/robotanalyzer sort_string = "MACFA" @@ -379,7 +379,7 @@ datum/design/circuit/shield desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units." id = "splitbeaker" req_tech = list(TECH_MATERIAL = 2) - materials = list("metal" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 3000) build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact sort_string = "MADAA" @@ -388,7 +388,7 @@ datum/design/circuit/shield desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." id = "bluespacebeaker" req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 6) - materials = list("metal" = 3000, "phoron" = 3000, "diamond" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "phoron" = 3000, "diamond" = 500) build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace sort_string = "MADAB" @@ -396,7 +396,7 @@ datum/design/circuit/shield desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery." id = "nanopaste" req_tech = list(TECH_MATERIAL = 4, TECH_ENGINERING = 3) - materials = list("metal" = 7000, "glass" = 7000) + materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000) build_path = /obj/item/stack/nanopaste sort_string = "MBAAA" @@ -405,7 +405,7 @@ datum/design/circuit/shield desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved." id = "scalpel_laser1" req_tech = list(TECH_BIO = 2, TECH_MATERIAL = 2, TECH_MAGNET = 2) - materials = list("metal" = 12500, "glass" = 7500) + materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500) build_path = /obj/item/weapon/scalpel/laser1 sort_string = "MBBAA" @@ -414,7 +414,7 @@ datum/design/circuit/shield desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced." id = "scalpel_laser2" req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 4, TECH_MAGNET = 4) - materials = list("metal" = 12500, "glass" = 7500, "silver" = 2500) + materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500) build_path = /obj/item/weapon/scalpel/laser2 sort_string = "MBBAB" @@ -423,7 +423,7 @@ datum/design/circuit/shield desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!" id = "scalpel_laser3" req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 5) - materials = list("metal" = 12500, "glass" = 7500, "silver" = 2000, "gold" = 1500) + materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2000, "gold" = 1500) build_path = /obj/item/weapon/scalpel/laser3 sort_string = "MBBAC" @@ -432,12 +432,12 @@ datum/design/circuit/shield desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps." id = "scalpel_manager" req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 7, TECH_MAGNET = 5, TECH_DATA = 4) - materials = list ("metal" = 12500, "glass" = 7500, "silver" = 1500, "gold" = 1500, "diamond" = 750) + materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 1500, "gold" = 1500, "diamond" = 750) build_path = /obj/item/weapon/scalpel/manager sort_string = "MBBAD" /datum/design/item/implant - materials = list("metal" = 50, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) /datum/design/item/implant/AssembleDesignName() ..() @@ -471,14 +471,14 @@ datum/design/circuit/shield /datum/design/item/weapon/stunrevolver id = "stunrevolver" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) - materials = list("metal" = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 4000) build_path = /obj/item/weapon/gun/energy/stunrevolver sort_string = "TAAAA" /datum/design/item/weapon/nuclear_gun id = "nuclear_gun" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3) - materials = list("metal" = 5000, "glass" = 1000, "uranium" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "uranium" = 500) build_path = /obj/item/weapon/gun/energy/gun/nuclear sort_string = "TAAAB" @@ -486,14 +486,14 @@ datum/design/circuit/shield desc = "The lasing medium of this prototype is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core." id = "lasercannon" req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) - materials = list("metal" = 10000, "glass" = 1000, "diamond" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1000, "diamond" = 2000) build_path = /obj/item/weapon/gun/energy/lasercannon sort_string = "TAAAC" /datum/design/item/weapon/phoronpistol id = "ppistol" req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4) - materials = list("metal" = 5000, "glass" = 1000, "phoron" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "phoron" = 3000) build_path = /obj/item/weapon/gun/energy/toxgun sort_string = "TAAAD" @@ -507,14 +507,14 @@ datum/design/circuit/shield /datum/design/item/weapon/smg id = "smg" req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3) - materials = list("metal" = 8000, "silver" = 2000, "diamond" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "silver" = 2000, "diamond" = 1000) build_path = /obj/item/weapon/gun/projectile/automatic sort_string = "TAABA" /datum/design/item/weapon/ammo_9mm id = "ammo_9mm" req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3) - materials = list("metal" = 3750, "silver" = 100) + materials = list(DEFAULT_WALL_MATERIAL = 3750, "silver" = 100) build_path = /obj/item/ammo_magazine/c9mm sort_string = "TAACA" @@ -522,7 +522,7 @@ datum/design/circuit/shield desc = "A stunning shell for a shotgun." id = "stunshell" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3) - materials = list("metal" = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 4000) build_path = /obj/item/ammo_casing/shotgun/stunshell sort_string = "TAACB" @@ -530,14 +530,14 @@ datum/design/circuit/shield desc = "An advanced chem spraying device." id = "chemsprayer" req_tech = list(TECH_MATERIAL = 3, TECH_ENGINERING = 3, TECH_BIO = 2) - materials = list("metal" = 5000, "glass" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer sort_string = "TABAA" /datum/design/item/weapon/rapidsyringe id = "rapidsyringe" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_ENGINERING = 3, TECH_BIO = 2) - materials = list("metal" = 5000, "glass" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) build_path = /obj/item/weapon/gun/launcher/syringe/rapid sort_string = "TABAB" @@ -545,56 +545,56 @@ datum/design/circuit/shield desc = "A gun that shoots high-powered glass-encased energy temperature bullets." id = "temp_gun" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2) - materials = list("metal" = 5000, "glass" = 500, "silver" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 500, "silver" = 3000) build_path = /obj/item/weapon/gun/energy/temperature sort_string = "TABAC" /datum/design/item/weapon/large_grenade id = "large_Grenade" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2) - materials = list("metal" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 3000) build_path = /obj/item/weapon/grenade/chem_grenade/large sort_string = "TACAA" /datum/design/item/weapon/flora_gun id = "flora_gun" req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) - materials = list("metal" = 2000, "glass" = 500, "uranium" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "uranium" = 500) build_path = /obj/item/weapon/gun/energy/floragun sort_string = "TBAAA" /datum/design/item/stock_part/subspace_ansible id = "s-ansible" req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list("metal" = 80, "silver" = 20) + materials = list(DEFAULT_WALL_MATERIAL = 80, "silver" = 20) build_path = /obj/item/weapon/stock_parts/subspace/ansible sort_string = "UAAAA" /datum/design/item/stock_part/hyperwave_filter id = "s-filter" req_tech = list(TECH_DATA = 3, TECH_MAGNET = 3) - materials = list("metal" = 40, "silver" = 10) + materials = list(DEFAULT_WALL_MATERIAL = 40, "silver" = 10) build_path = /obj/item/weapon/stock_parts/subspace/filter sort_string = "UAAAB" /datum/design/item/stock_part/subspace_amplifier id = "s-amplifier" req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list("metal" = 10, "gold" = 30, "uranium" = 15) + materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 30, "uranium" = 15) build_path = /obj/item/weapon/stock_parts/subspace/amplifier sort_string = "UAAAC" /datum/design/item/stock_part/subspace_treatment id = "s-treatment" req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list("metal" = 10, "silver" = 20) + materials = list(DEFAULT_WALL_MATERIAL = 10, "silver" = 20) build_path = /obj/item/weapon/stock_parts/subspace/treatment sort_string = "UAAAD" /datum/design/item/stock_part/subspace_analyzer id = "s-analyzer" req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list("metal" = 10, "gold" = 15) + materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 15) build_path = /obj/item/weapon/stock_parts/subspace/analyzer sort_string = "UAAAE" @@ -617,7 +617,7 @@ datum/design/circuit/shield desc = "A device to automatically replace lights. Refill with working lightbulbs." id = "light_replacer" req_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 4) - materials = list("metal" = 1500, "silver" = 150, "glass" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 1500, "silver" = 150, "glass" = 3000) build_path = /obj/item/device/lightreplacer sort_string = "VAAAH" @@ -625,7 +625,7 @@ datum/design/circuit/shield name = "'pAI', personal artificial intelligence device" id = "paicard" req_tech = list(TECH_DATA = 2) - materials = list("glass" = 500, "metal" = 500) + materials = list("glass" = 500, DEFAULT_WALL_MATERIAL = 500) build_path = /obj/item/device/paicard sort_string = "VABAI" @@ -641,7 +641,7 @@ datum/design/circuit/shield /datum/design/item/posibrain id = "posibrain" req_tech = list(TECH_ENGINERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4) - materials = list("metal" = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100) build_path = /obj/item/device/mmi/digital/posibrain sort_string = "VACAB" @@ -649,7 +649,7 @@ datum/design/circuit/shield id = "mmi" req_tech = list(TECH_DATA = 2, TECH_BIO = 3) build_type = PROTOLATHE | MECHFAB - materials = list("metal" = 1000, "glass" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500) build_path = /obj/item/device/mmi category = "Misc" sort_string = "VACBA" @@ -658,7 +658,7 @@ datum/design/circuit/shield id = "mmi_radio" req_tech = list(TECH_DATA = 2, TECH_BIO = 4) build_type = PROTOLATHE | MECHFAB - materials = list("metal" = 1200, "glass" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 1200, "glass" = 500) build_path = /obj/item/device/mmi/radio_enabled category = "Misc" sort_string = "VACBB" @@ -667,7 +667,7 @@ datum/design/circuit/shield name = "Bluespace tracking beacon design" id = "beacon" req_tech = list(TECH_BLUESPACE = 1) - materials = list ("metal" = 20, "glass" = 10) + materials = list (DEFAULT_WALL_MATERIAL = 20, "glass" = 10) build_path = /obj/item/device/radio/beacon sort_string = "VADAA" @@ -685,7 +685,7 @@ datum/design/circuit/shield desc = "Allows for deciphering the binary channel on-the-fly." id = "binaryencrypt" req_tech = list(TECH_ILLEGAL = 2) - materials = list("metal" = 300, "glass" = 300) + materials = list(DEFAULT_WALL_MATERIAL = 300, "glass" = 300) build_path = /obj/item/device/encryptionkey/binary sort_string = "VASAA" @@ -694,7 +694,7 @@ datum/design/circuit/shield desc = "A kit of dangerous, high-tech equipment with changeable looks." id = "chameleon" req_tech = list(TECH_ILLEGAL = 2) - materials = list("metal" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 500) build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon sort_string = "VASBA" @@ -1350,14 +1350,14 @@ CIRCUITS BELOW desc = "Cheaper than whiny non-digital assistants." id = "pda" req_tech = list(TECH_ENGINERING = 2, TECH_POWER = 3) - materials = list("metal" = 50, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) build_path = /obj/item/device/pda sort_string = "VAAAA" // Cartridges /datum/design/item/pda_cartridge req_tech = list(TECH_ENGINERING = 2, TECH_POWER = 3) - materials = list("metal" = 50, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) /datum/design/item/pda_cartridge/AssembleDesignName() ..() @@ -1449,7 +1449,7 @@ CIRCUITS BELOW name = "loyalty" id = "implant_loyal" req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3) - materials = list("metal" = 7000, "glass" = 7000) + materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000) build_path = /obj/item/weapon/implantcase/loyalty" /datum/design/rust_core_control diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm index ce2813131c1..0210ec670e4 100644 --- a/code/modules/research/mechfab_designs.dm +++ b/code/modules/research/mechfab_designs.dm @@ -1,10 +1,10 @@ /datum/design/item/mechfab build_type = MECHFAB category = "Misc" + req_tech = list(TECH_MATERIAL = 1) /datum/design/item/mechfab/robot category = "Robot" - req_tech = list(TECH_MATERIAL = 1) /datum/design/item/mechfab/robot/exoskeleton name = "Robot Exoskeleton" @@ -27,61 +27,289 @@ time = 35 materials = list(DEFAULT_WALL_MATERIAL = 25000) -/* - var/list/part_sets = list( //set names must be unique - "Robot"=list( - /obj/item/robot_parts/robot_suit, - /obj/item/robot_parts/chest, - /obj/item/robot_parts/head, - /obj/item/robot_parts/l_arm, - /obj/item/robot_parts/r_arm, - /obj/item/robot_parts/l_leg, - /obj/item/robot_parts/r_leg, - /obj/item/robot_parts/robot_component/binary_communication_device, - /obj/item/robot_parts/robot_component/radio, - /obj/item/robot_parts/robot_component/actuator, - /obj/item/robot_parts/robot_component/diagnosis_unit, - /obj/item/robot_parts/robot_component/camera, - /obj/item/robot_parts/robot_component/armour - ), - "Ripley"=list( - /obj/item/mecha_parts/chassis/ripley, - /obj/item/mecha_parts/part/ripley_torso, - /obj/item/mecha_parts/part/ripley_left_arm, - /obj/item/mecha_parts/part/ripley_right_arm, - /obj/item/mecha_parts/part/ripley_left_leg, - /obj/item/mecha_parts/part/ripley_right_leg - ), - "Odysseus"=list( - /obj/item/mecha_parts/chassis/odysseus, - /obj/item/mecha_parts/part/odysseus_torso, - /obj/item/mecha_parts/part/odysseus_head, - /obj/item/mecha_parts/part/odysseus_left_arm, - /obj/item/mecha_parts/part/odysseus_right_arm, - /obj/item/mecha_parts/part/odysseus_left_leg, - /obj/item/mecha_parts/part/odysseus_right_leg - ), +/datum/design/item/mechfab/robot/l_arm + name = "Robot Left Arm" + id = "robot_l_arm" + build_path = /obj/item/robot_parts/l_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 18000) - "Gygax"=list( - /obj/item/mecha_parts/chassis/gygax, - /obj/item/mecha_parts/part/gygax_torso, - /obj/item/mecha_parts/part/gygax_head, - /obj/item/mecha_parts/part/gygax_left_arm, - /obj/item/mecha_parts/part/gygax_right_arm, - /obj/item/mecha_parts/part/gygax_left_leg, - /obj/item/mecha_parts/part/gygax_right_leg, - /obj/item/mecha_parts/part/gygax_armour - ), - "Durand"=list( - /obj/item/mecha_parts/chassis/durand, - /obj/item/mecha_parts/part/durand_torso, - /obj/item/mecha_parts/part/durand_head, - /obj/item/mecha_parts/part/durand_left_arm, - /obj/item/mecha_parts/part/durand_right_arm, - /obj/item/mecha_parts/part/durand_left_leg, - /obj/item/mecha_parts/part/durand_right_leg, - /obj/item/mecha_parts/part/durand_armour - ), +/datum/design/item/mechfab/robot/r_arm + name = "Robot Right Arm" + id = "robot_r_arm" + build_path = /obj/item/robot_parts/r_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 18000) + +/datum/design/item/mechfab/robot/l_leg + name = "Robot Left LeG" + id = "robot_l_leg" + build_path = /obj/item/robot_parts/l_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 15000) + +/datum/design/item/mechfab/robot/r_leg + name = "Robot Right Leg" + id = "robot_r_leg" + build_path = /obj/item/robot_parts/r_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 15000) + +/datum/design/item/mechfab/robot/component + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 5000) + +/datum/design/item/mechfab/robot/component/binary_communication_device + name = "Binary Communication Device" + id = "binary_communication_device" + build_path = /obj/item/robot_parts/robot_component/binary_communication_device + +/datum/design/item/mechfab/robot/component/radio + name = "Radio" + id = "radio" + build_path = /obj/item/robot_parts/robot_component/radio + +/datum/design/item/mechfab/robot/component/actuator + name = "Actuator" + id = "actuator" + build_path = /obj/item/robot_parts/robot_component/actuator + +/datum/design/item/mechfab/robot/component/diagnosis_unit + name = "Diagnosis Unit" + id = "diagnosis_unit" + build_path = /obj/item/robot_parts/robot_component/diagnosis_unit + +/datum/design/item/mechfab/robot/component/camera + name = "Camera" + id = "camera" + build_path = /obj/item/robot_parts/robot_component/camera + +/datum/design/item/mechfab/robot/component/armour + name = "Armour Plating" + id = "armour" + build_path = /obj/item/robot_parts/robot_component/armour + +/datum/design/item/mechfab/ripley + category = "Ripley" + +/datum/design/item/mechfab/ripley/chassis + name = "Ripley Chassis" + id = "ripley_chassis" + build_path = /obj/item/mecha_parts/chassis/ripley + time = 10 + materials = list(DEFAULT_WALL_MATERIAL = 20000) + +/datum/design/item/mechfab/ripley/chassis/firefighter + name = "Firefigher Chassis" + id = "firefighter_chassis" + build_path = /obj/item/mecha_parts/chassis/firefighter + +/datum/design/item/mechfab/ripley/torso + name = "Ripley Torso" + id = "ripley_torso" + build_path = /obj/item/mecha_parts/part/ripley_torso + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 40000, "glass" = 15000) + +/datum/design/item/mechfab/ripley/left_arm + name = "Ripley Left Arm" + id = "ripley_left_arm" + build_path = /obj/item/mecha_parts/part/ripley_left_arm + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 25000) + +/datum/design/item/mechfab/ripley/right_arm + name = "Ripley Right Arm" + id = "ripley_right_arm" + build_path = /obj/item/mecha_parts/part/ripley_right_arm + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 25000) + +/datum/design/item/mechfab/ripley/left_leg + name = "Ripley Left Leg" + id = "ripley_left_leg" + build_path = /obj/item/mecha_parts/part/ripley_left_leg + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 30000) + +/datum/design/item/mechfab/ripley/right_leg + name = "Ripley Right Leg" + id = "ripley_right_leg" + build_path = /obj/item/mecha_parts/part/ripley_right_leg + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 30000) + +/datum/design/item/mechfab/odysseus + category = "Odysseus" + +/datum/design/item/mechfab/odysseus/chassis + name = "Odysseus Chassis" + id = "odysseus_chassis" + build_path = /obj/item/mecha_parts/chassis/odysseus + time = 10 + materials = list(DEFAULT_WALL_MATERIAL = 20000) + +/datum/design/item/mechfab/odysseus/torso + name = "Odysseus Torso" + id = "odysseus_torso" + build_path = /obj/item/mecha_parts/part/odysseus_torso + time = 18 + materials = list(DEFAULT_WALL_MATERIAL = 25000) + +/datum/design/item/mechfab/odysseus/head + name = "Odysseus Head" + id = "odysseus_head" + build_path = /obj/item/mecha_parts/part/odysseus_head + time = 10 + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 10000) + +/datum/design/item/mechfab/odysseus/left_arm + name = "Odysseus Left Arm" + id = "odysseus_left_arm" + build_path = /obj/item/mecha_parts/part/odysseus_left_arm + time = 12 + materials = list(DEFAULT_WALL_MATERIAL = 10000) + +/datum/design/item/mechfab/odysseus/right_arm + name = "Odysseus Right Arm" + id = "odysseus_right_arm" + build_path = /obj/item/mecha_parts/part/odysseus_right_arm + time = 12 + materials = list(DEFAULT_WALL_MATERIAL = 10000) + +/datum/design/item/mechfab/odysseus/left_leg + name = "Odysseus Left Leg" + id = "odysseus_left_leg" + build_path = /obj/item/mecha_parts/part/odysseus_left_leg + time = 13 + materials = list(DEFAULT_WALL_MATERIAL = 15000) + +/datum/design/item/mechfab/odysseus/right_leg + name = "Odysseus Right Leg" + id = "odysseus_right_leg" + build_path = /obj/item/mecha_parts/part/odysseus_right_leg + time = 13 + materials = list(DEFAULT_WALL_MATERIAL = 15000) + +/datum/design/item/mechfab/gygax + category = "Gygax" + +/datum/design/item/mechfab/gygax/chassis + name = "Gygax Chassis" + id = "gygax_chassis" + build_path = /obj/item/mecha_parts/chassis/gygax + time = 10 + materials = list(DEFAULT_WALL_MATERIAL = 25000) + +/datum/design/item/mechfab/gygax/torso + name = "Gygax Torso" + id = "gygax_torso" + build_path = /obj/item/mecha_parts/part/gygax_torso + time = 30 + materials = list(DEFAULT_WALL_MATERIAL = 50000, "glass" = 20000) + +/datum/design/item/mechfab/gygax/head + name = "Gygax Head" + id = "gygax_head" + build_path = /obj/item/mecha_parts/part/gygax_head + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 20000, "glass" = 10000) + +/datum/design/item/mechfab/gygax/left_arm + name = "Gygax Left Arm" + id = "gygax_left_arm" + build_path = /obj/item/mecha_parts/part/gygax_left_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 30000) + +/datum/design/item/mechfab/gygax/right_arm + name = "Gygax Right Arm" + id = "gygax_right_arm" + build_path = /obj/item/mecha_parts/part/gygax_right_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 30000) + +/datum/design/item/mechfab/gygax/left_leg + name = "Gygax Left Leg" + id = "gygax_left_leg" + build_path = /obj/item/mecha_parts/part/gygax_left_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 35000) + +/datum/design/item/mechfab/gygax/right_leg + name = "Gygax Right Leg" + id = "gygax_right_leg" + build_path = /obj/item/mecha_parts/part/gygax_right_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 35000) + +/datum/design/item/mechfab/gygax/armour + name = "Gygax Armour Plates" + id = "gygax_armour" + build_path = /obj/item/mecha_parts/part/gygax_armour + time = 60 + materials = list(DEFAULT_WALL_MATERIAL = 50000, "diamond" = 10000) + +/datum/design/item/mechfab/durand + category = "Durand" + +/datum/design/item/mechfab/durand/chassis + name = "Durand Chassis" + id = "durand_chassis" + build_path = /obj/item/mecha_parts/chassis/durand + time = 10 + materials = list(DEFAULT_WALL_MATERIAL = 25000) + +/datum/design/item/mechfab/durand/torso + name = "Durand Torso" + id = "durand_torso" + build_path = /obj/item/mecha_parts/part/durand_torso + time = 30 + materials = list(DEFAULT_WALL_MATERIAL = 55000, "glass" = 20000, "silver" = 10000) + +/datum/design/item/mechfab/durand/head + name = "Durand Head" + id = "durand_head" + build_path = /obj/item/mecha_parts/part/durand_head + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 25000, "glass" = 10000, "silver" = 3000) + +/datum/design/item/mechfab/durand/left_arm + name = "Durand Left Arm" + id = "durand_left_arm" + build_path = /obj/item/mecha_parts/part/durand_left_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 35000, "silver" = 3000) + +/datum/design/item/mechfab/durand/right_arm + name = "Durand Right Arm" + id = "durand_right_arm" + build_path = /obj/item/mecha_parts/part/durand_right_arm + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 35000, "silver" = 3000) + +/datum/design/item/mechfab/durand/left_leg + name = "Durand Left Leg" + id = "durand_left_leg" + build_path = /obj/item/mecha_parts/part/durand_left_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 40000, "silver" = 3000) + +/datum/design/item/mechfab/durand/right_leg + name = "Durand Right Leg" + id = "durand_right_leg" + build_path = /obj/item/mecha_parts/part/durand_right_leg + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 40000, "silver" = 3000) + +/datum/design/item/mechfab/durand/armour + //name = "Durand Armour Plates" + id = "durand_armour" + build_path = /obj/item/mecha_parts/part/durand_armour + time = 60 + materials = list(DEFAULT_WALL_MATERIAL = 50000, "uranium" = 10000) + +/* "Exosuit Equipment"=list( /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp, /obj/item/mecha_parts/mecha_equipment/tool/drill, @@ -90,7 +318,6 @@ /obj/item/mecha_parts/mecha_equipment/tool/sleeper, /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun, /obj/item/mecha_parts/mecha_equipment/tool/passenger, - /obj/item/mecha_parts/chassis/firefighter, ///obj/item/mecha_parts/mecha_equipment/repair_droid, /obj/item/mecha_parts/mecha_equipment/generator, ///obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING @@ -114,7 +341,6 @@ /datum/design/item/mecha build_type = MECHFAB - req_tech = list(TECH_COMBAT = 3) category = "Exosuit Equipment" /datum/design/item/mecha/AssembleDesignName() @@ -129,6 +355,9 @@ if(!desc) desc = "Allows for the construction of \a '[item_name]' exosuit module." +/datum/design/item/mecha/weapon + req_tech = list(TECH_COMBAT = 3) + // *** Weapon modules /datum/design/item/mecha/weapon/scattershot id = "mech_scattershot" diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 5ff3d23c746..9cb029f58ef 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -8,7 +8,7 @@ active_power_usage = 5000 var/max_material_storage = 100000 - var/list/materials = list("metal" = 0, "glass" = 0, "gold" = 0, "silver" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0) + var/list/materials = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0, "gold" = 0, "silver" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0) var/list/datum/design/queue = list() var/progress = 0 diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 3f73929aadd..031c82a9584 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -16,7 +16,7 @@ /obj/machinery/r_n_d/proc/getMaterialType(var/name) switch(name) - if("metal") + if(DEFAULT_WALL_MATERIAL) return /obj/item/stack/material/steel if("glass") return /obj/item/stack/material/glass @@ -35,7 +35,7 @@ /obj/machinery/r_n_d/proc/getMaterialName(var/type) switch(type) if(/obj/item/stack/material/steel) - return "metal" + return DEFAULT_WALL_MATERIAL if(/obj/item/stack/material/glass) return "glass" if(/obj/item/stack/material/gold) diff --git a/nano/templates/mechfab.tmpl b/nano/templates/mechfab.tmpl index bf09b8777d7..e4e30cdb392 100644 --- a/nano/templates/mechfab.tmpl +++ b/nano/templates/mechfab.tmpl @@ -1,14 +1,23 @@

Exosuit Fabricator

-
- {{for data.categories}} +
+
+ {{:helper.link("Sync", null, {'sync' : 1})}} + {{:data.sync}} +
+ {{if data.manufacturers}}
+ {{for data.manufacturers}} + {{:helper.link(value, null, {'manufacturer' : value}, value == data.manufacturer ? 'selected' : null)}} + {{/for}} +
+ {{/if}} +
+ {{for data.categories}} {{:helper.link(value, null, {'category' : value}, value == data.category ? 'selected' : null)}} -
- {{empty}} -
- There are no known designs -
- {{/for}} + {{empty}} + There are no known designs + {{/for}} +
{{for data.buildable}} {{if value.category == data.category}}
@@ -17,17 +26,26 @@ {{/if}} {{/for}}
-
+
Queue contains:
{{if data.current}}
- Now: {{:data.current}} ({{:data.builtperc}}% ready) - {{:helper.link('Cancel', null, {'remove' : 1})}} +
+ Now: {{:data.current}} ({{:data.builtperc}}% ready) +
+
+ {{:helper.link('Cancel', null, {'remove' : 1})}} +
{{for data.queue}}
- {{:index + 2}}: {{:value}} - {{:helper.link('Remove', null, {'remove' : index + 2})}} +
+ {{:index + 2}}: {{:value}} +
+
+ {{:helper.link('Remove', null, {'remove' : index + 2})}}
{{empty}}
@@ -46,16 +64,11 @@ {{:value.mat}}: {{:value.amt}}/{{:data.maxres}}
- {{if value.amt > 2000}} - {{:helper.link('x1', null, {'eject' : value.mat, 'amount' : 1})}} - {{if value.amt > 10000}} - {{:helper.link('x5', null, {'eject' : value.mat, 'amount' : 5})}} - {{if value.amt > 20000}} - {{:helper.link('x10', null, {'eject' : value.mat, 'amount' : 10})}} - {{/if}} - {{/if}} - {{/if}} - {{:helper.link('All', null, {'eject' : value.mat, 'amount' : 0})}} + {{:helper.link('x1', null, {'eject' : value.mat, 'amount' : 1}, value.amt > 2000 ? null : 'disabled')}} + {{:helper.link('x5', null, {'eject' : value.mat, 'amount' : 5}, value.amt > 10000 ? null : 'disabled')}} + {{:helper.link('x10', null, {'eject' : value.mat, 'amount' : 10}, value.amt > 20000 ? null : 'disabled')}} + {{:helper.link('Stack', null, {'eject' : value.mat, 'amount' : 0})}} + {{:helper.link('All', null, {'eject' : value.mat, 'amount' : -1})}}
{{/for}} From 012fb38de232416adaa5f6e2d8a7cac4a5bc4b6e Mon Sep 17 00:00:00 2001 From: Kelenius Date: Wed, 12 Aug 2015 21:46:11 +0300 Subject: [PATCH 04/24] Finalizes mechfab --- code/__defines/research.dm | 2 +- code/game/mecha/equipment/mecha_equipment.dm | 2 - .../mecha/equipment/tools/medical_tools.dm | 3 - code/game/mecha/equipment/tools/tools.dm | 10 - code/game/mecha/equipment/weapons/weapons.dm | 1 - code/game/mecha/mecha_control_console.dm | 2 - code/game/objects/items/devices/flash.dm | 2 - code/game/objects/items/robot/robot_parts.dm | 2 - .../objects/items/robot/robot_upgrades.dm | 8 - .../game/objects/items/weapons/power_cells.dm | 4 - code/modules/mob/living/carbon/brain/MMI.dm | 4 - .../mob/living/carbon/brain/posibrain.dm | 2 - code/modules/research/designs.dm | 9 +- code/modules/research/mechfab_designs.dm | 289 ++++++++++++------ nano/templates/mechfab.tmpl | 7 +- 15 files changed, 210 insertions(+), 137 deletions(-) diff --git a/code/__defines/research.dm b/code/__defines/research.dm index 87e6bb5f422..9eb06df5e76 100644 --- a/code/__defines/research.dm +++ b/code/__defines/research.dm @@ -14,5 +14,5 @@ #define IMPRINTER 1 //For circuits. Uses glass/chemicals. #define PROTOLATHE 2 //New stuff. Uses glass/metal/chemicals -#define MECHFAB 4 //Remember, objects utilising this flag should have construction_time and construction_cost vars. +#define MECHFAB 4 //Mechfab #define CHASSIS 8 //For protolathe, but differently \ No newline at end of file diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 733fe7bf82a..db1cb3d004f 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -7,8 +7,6 @@ icon_state = "mecha_equip" force = 5 origin_tech = list(TECH_MATERIAL = 2) - //construction_time = 100 - //construction_cost = list(DEFAULT_WALL_MATERIAL=10000) var/equip_cooldown = 0 var/equip_ready = 1 var/energy_drain = 0 diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 754f0dc4c3a..e57ea2e2cae 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -6,7 +6,6 @@ origin_tech = list(TECH_DATA = 2, TECH_BIO = 3) energy_drain = 20 range = MELEE - //construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=10000) equip_cooldown = 20 var/mob/living/carbon/occupant = null var/datum/global_iterator/pr_mech_sleeper @@ -386,8 +385,6 @@ range = MELEE|RANGED equip_cooldown = 10 origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3) - //construction_time = 200 - //construction_cost = list(DEFAULT_WALL_MATERIAL=3000,"glass"=2000) required_type = /obj/mecha/medical New() diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 1de3d98ed0e..fbae64b6cdf 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -128,7 +128,6 @@ desc = "This is an upgraded version of the drill that'll pierce the heavens! (Can be attached to: Combat and Engineering Exosuits)" icon_state = "mecha_diamond_drill" origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINERING = 3) - //construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"diamond"=6500) equip_cooldown = 20 force = 15 @@ -255,8 +254,6 @@ equip_cooldown = 10 energy_drain = 250 range = MELEE|RANGED - //construction_time = 1200 - //construction_cost = list(DEFAULT_WALL_MATERIAL=30000,"phoron"=25000,"silver"=20000,"gold"=20000) var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock. var/disabled = 0 //malf @@ -506,7 +503,6 @@ equip_cooldown = 10 energy_drain = 50 range = 0 - //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"silver"=5000) var/deflect_coeff = 1.15 var/damage_coeff = 0.8 @@ -556,7 +552,6 @@ equip_cooldown = 10 energy_drain = 50 range = 0 - //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"gold"=5000) var/deflect_coeff = 1.15 var/damage_coeff = 0.8 @@ -627,7 +622,6 @@ equip_cooldown = 20 energy_drain = 100 range = 0 - //construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"gold"=1000,"silver"=2000,"glass"=5000) var/health_boost = 2 var/datum/global_iterator/pr_repair_droid var/icon/droid_overlay @@ -722,7 +716,6 @@ equip_cooldown = 10 energy_drain = 0 range = 0 - //construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"gold"=2000,"silver"=3000,"glass"=2000) var/datum/global_iterator/pr_energy_relay var/coeff = 100 var/list/use_channels = list(EQUIP,ENVIRON,LIGHT) @@ -839,7 +832,6 @@ equip_cooldown = 10 energy_drain = 0 range = MELEE - //construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"silver"=500,"glass"=1000) var/datum/global_iterator/pr_mech_generator var/coeff = 100 var/obj/item/stack/material/fuel @@ -974,7 +966,6 @@ desc = "Generates power using uranium. Pollutes the environment." icon_state = "tesla" origin_tech = list(TECH_POWER = 3, TECH_ENGINERING = 3) - //construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"silver"=500,"glass"=1000) max_fuel = 50000 fuel_per_cycle_idle = 10 fuel_per_cycle_active = 30 @@ -1072,7 +1063,6 @@ origin_tech = list(TECH_ENGINERING = 1, TECH_BIO = 1) energy_drain = 10 range = MELEE - //construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=5000) equip_cooldown = 20 var/mob/living/carbon/occupant = null var/door_locked = 1 diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 3f59feef7f6..913f9acb72f 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -274,7 +274,6 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve name = "\improper SOP-6 grenade launcher" projectile = /obj/item/weapon/grenade/flashbang/clusterbang - //construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"gold"=6000,"uranium"=6000) /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/get_equip_info()//Limited version of the clusterbang launcher that can't reload return "* [chassis.selected==src?"":""][src.name][chassis.selected==src?"":""]\[[src.projectiles]\]" diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 723180bcb29..75b8d075d1e 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -69,8 +69,6 @@ icon = 'icons/obj/device.dmi' icon_state = "motion2" origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 2) - //construction_time = 50 - //construction_cost = list(DEFAULT_WALL_MATERIAL=500) proc/get_mecha_info() if(!in_mecha()) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 8f9fa270939..c253976b766 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -194,8 +194,6 @@ desc = "When a problem arises, SCIENCE is the solution." icon_state = "sflash" origin_tech = list(TECH_MAGNET = 2, TECH_COMBAT = 1) - var/construction_cost = list(DEFAULT_WALL_MATERIAL=750,"glass"=750) - var/construction_time=100 /obj/item/device/flash/synthetic/attack(mob/living/M as mob, mob/user as mob) ..() diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 32237e694cd..ad8cffd671d 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -5,8 +5,6 @@ icon_state = "blank" flags = CONDUCT slot_flags = SLOT_BELT - var/construction_time = 100 - var/list/construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"glass"=5000) var/list/part = null // Order of args is important for installing robolimbs. var/sabotaged = 0 //Emagging limbs can have repercussions when installed as prosthetics. var/model_info diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 999303a91dd..4c690010b8f 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -6,8 +6,6 @@ desc = "Protected by FRM." icon = 'icons/obj/module.dmi' icon_state = "cyborg_upgrade" - var/construction_time = 120 - var/construction_cost = list(DEFAULT_WALL_MATERIAL=10000) var/locked = 0 var/require_module = 0 var/installed = 0 @@ -43,7 +41,6 @@ name = "robot reclassification board" desc = "Used to rename a cyborg." icon_state = "cyborg_upgrade1" - construction_cost = list(DEFAULT_WALL_MATERIAL=35000) var/heldname = "default name" /obj/item/borg/upgrade/rename/attack_self(mob/user as mob) @@ -61,7 +58,6 @@ /obj/item/borg/upgrade/restart name = "robot emergency restart module" desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online." - construction_cost = list(DEFAULT_WALL_MATERIAL=60000 , "glass"=5000) icon_state = "cyborg_upgrade1" @@ -85,7 +81,6 @@ /obj/item/borg/upgrade/vtec name = "robotic VTEC Module" desc = "Used to kick in a robot's VTEC systems, increasing their speed." - construction_cost = list(DEFAULT_WALL_MATERIAL=80000 , "glass"=6000 , "gold"= 5000) icon_state = "cyborg_upgrade2" require_module = 1 @@ -102,7 +97,6 @@ /obj/item/borg/upgrade/tasercooler name = "robotic Rapid Taser Cooling Module" desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate." - construction_cost = list(DEFAULT_WALL_MATERIAL=80000 , "glass"=6000 , "gold"= 2000, "diamond" = 500) icon_state = "cyborg_upgrade3" require_module = 1 @@ -137,7 +131,6 @@ /obj/item/borg/upgrade/jetpack name = "mining robot jetpack" desc = "A carbon dioxide jetpack suitable for low-gravity mining operations." - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"phoron"=15000,"uranium" = 20000) icon_state = "cyborg_upgrade3" require_module = 1 @@ -159,7 +152,6 @@ /obj/item/borg/upgrade/syndicate/ name = "illegal equipment module" desc = "Unlocks the hidden, deadlier functions of a robot" - construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"glass"=15000,"diamond" = 10000) icon_state = "cyborg_upgrade3" require_module = 1 diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index bd5e56495a9..535cb65ed59 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -14,8 +14,6 @@ var/maxcharge = 1000 var/rigged = 0 // true if rigged to explode var/minor_fault = 0 //If not 100% reliable, it will build up faults. - var/construction_cost = list(DEFAULT_WALL_MATERIAL=750,"glass"=75) - var/construction_time=100 matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50) suicide_act(mob/user) @@ -83,7 +81,6 @@ icon_state = "scell" maxcharge = 20000 matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70) - construction_cost = list(DEFAULT_WALL_MATERIAL=750,"glass"=100) /obj/item/weapon/cell/super/empty/New() ..() @@ -95,7 +92,6 @@ icon_state = "hpcell" maxcharge = 30000 matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 80) - construction_cost = list(DEFAULT_WALL_MATERIAL=500,"glass"=150,"gold"=200,"silver"=200) /obj/item/weapon/cell/hyper/empty/New() ..() diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 49e8c6ad528..19ab2ff50e1 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -25,10 +25,6 @@ w_class = 3 origin_tech = list(TECH_BIO = 3) - var/list/construction_cost = list(DEFAULT_WALL_MATERIAL=1000,"glass"=500) - var/construction_time = 75 - //these vars are so the mecha fabricator doesn't shit itself anymore. --NEO - req_access = list(access_robotics) //Revised. Brainmob is now contained directly within object of transfer. MMI in this case. diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index ffb37dc116a..1326427914f 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -6,8 +6,6 @@ w_class = 3 origin_tech = list(TECH_ENGINERING = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2, TECH_DATA = 4) - construction_cost = list(DEFAULT_WALL_MATERIAL=500,"glass"=500,"silver"=200,"gold"=200,"phoron"=100,"diamond"=10) - construction_time = 75 var/searching = 0 var/askDelay = 10 * 60 * 1 req_access = list(access_robotics) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 0787cc5f2f1..695cc94894e 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -639,13 +639,17 @@ datum/design/circuit/shield sort_string = "VACAA" /datum/design/item/posibrain + name = "Positronic brain" id = "posibrain" req_tech = list(TECH_ENGINERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4) + build_type = PROTOLATHE | MECHFAB materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100) build_path = /obj/item/device/mmi/digital/posibrain + category = "Misc" sort_string = "VACAB" -/datum/design/item/medical/mmi +/datum/design/item/mmi + name = "Man-machine interface" id = "mmi" req_tech = list(TECH_DATA = 2, TECH_BIO = 3) build_type = PROTOLATHE | MECHFAB @@ -654,7 +658,8 @@ datum/design/circuit/shield category = "Misc" sort_string = "VACBA" -/datum/design/item/medical/mmi_radio +/datum/design/item/mmi_radio + name = "Radio-enabled man-machine interface" id = "mmi_radio" req_tech = list(TECH_DATA = 2, TECH_BIO = 4) build_type = PROTOLATHE | MECHFAB diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm index 0210ec670e4..1ee452ffe5f 100644 --- a/code/modules/research/mechfab_designs.dm +++ b/code/modules/research/mechfab_designs.dm @@ -7,49 +7,49 @@ category = "Robot" /datum/design/item/mechfab/robot/exoskeleton - name = "Robot Exoskeleton" + name = "Robot exoskeleton" id = "robot_exoskeleton" build_path = /obj/item/robot_parts/robot_suit time = 50 materials = list(DEFAULT_WALL_MATERIAL = 50000) /datum/design/item/mechfab/robot/torso - name = "Robot Torso" + name = "Robot torso" id = "robot_torso" build_path = /obj/item/robot_parts/chest time = 35 materials = list(DEFAULT_WALL_MATERIAL = 40000) /datum/design/item/mechfab/robot/head - name = "Robot Head" + name = "Robot head" id = "robot_head" build_path = /obj/item/robot_parts/head time = 35 materials = list(DEFAULT_WALL_MATERIAL = 25000) /datum/design/item/mechfab/robot/l_arm - name = "Robot Left Arm" + name = "Robot left arm" id = "robot_l_arm" build_path = /obj/item/robot_parts/l_arm time = 20 materials = list(DEFAULT_WALL_MATERIAL = 18000) /datum/design/item/mechfab/robot/r_arm - name = "Robot Right Arm" + name = "Robot right arm" id = "robot_r_arm" build_path = /obj/item/robot_parts/r_arm time = 20 materials = list(DEFAULT_WALL_MATERIAL = 18000) /datum/design/item/mechfab/robot/l_leg - name = "Robot Left LeG" + name = "Robot left leg" id = "robot_l_leg" build_path = /obj/item/robot_parts/l_leg time = 20 materials = list(DEFAULT_WALL_MATERIAL = 15000) /datum/design/item/mechfab/robot/r_leg - name = "Robot Right Leg" + name = "Robot right leg" id = "robot_r_leg" build_path = /obj/item/robot_parts/r_leg time = 20 @@ -60,7 +60,7 @@ materials = list(DEFAULT_WALL_MATERIAL = 5000) /datum/design/item/mechfab/robot/component/binary_communication_device - name = "Binary Communication Device" + name = "Binary communication device" id = "binary_communication_device" build_path = /obj/item/robot_parts/robot_component/binary_communication_device @@ -75,7 +75,7 @@ build_path = /obj/item/robot_parts/robot_component/actuator /datum/design/item/mechfab/robot/component/diagnosis_unit - name = "Diagnosis Unit" + name = "Diagnosis unit" id = "diagnosis_unit" build_path = /obj/item/robot_parts/robot_component/diagnosis_unit @@ -85,7 +85,7 @@ build_path = /obj/item/robot_parts/robot_component/camera /datum/design/item/mechfab/robot/component/armour - name = "Armour Plating" + name = "Armour plating" id = "armour" build_path = /obj/item/robot_parts/robot_component/armour @@ -93,47 +93,47 @@ category = "Ripley" /datum/design/item/mechfab/ripley/chassis - name = "Ripley Chassis" + name = "Ripley chassis" id = "ripley_chassis" build_path = /obj/item/mecha_parts/chassis/ripley time = 10 materials = list(DEFAULT_WALL_MATERIAL = 20000) /datum/design/item/mechfab/ripley/chassis/firefighter - name = "Firefigher Chassis" + name = "Firefigher chassis" id = "firefighter_chassis" build_path = /obj/item/mecha_parts/chassis/firefighter /datum/design/item/mechfab/ripley/torso - name = "Ripley Torso" + name = "Ripley torso" id = "ripley_torso" build_path = /obj/item/mecha_parts/part/ripley_torso time = 20 materials = list(DEFAULT_WALL_MATERIAL = 40000, "glass" = 15000) /datum/design/item/mechfab/ripley/left_arm - name = "Ripley Left Arm" + name = "Ripley left arm" id = "ripley_left_arm" build_path = /obj/item/mecha_parts/part/ripley_left_arm time = 15 materials = list(DEFAULT_WALL_MATERIAL = 25000) /datum/design/item/mechfab/ripley/right_arm - name = "Ripley Right Arm" + name = "Ripley right arm" id = "ripley_right_arm" build_path = /obj/item/mecha_parts/part/ripley_right_arm time = 15 materials = list(DEFAULT_WALL_MATERIAL = 25000) /datum/design/item/mechfab/ripley/left_leg - name = "Ripley Left Leg" + name = "Ripley left leg" id = "ripley_left_leg" build_path = /obj/item/mecha_parts/part/ripley_left_leg time = 15 materials = list(DEFAULT_WALL_MATERIAL = 30000) /datum/design/item/mechfab/ripley/right_leg - name = "Ripley Right Leg" + name = "Ripley right leg" id = "ripley_right_leg" build_path = /obj/item/mecha_parts/part/ripley_right_leg time = 15 @@ -143,49 +143,49 @@ category = "Odysseus" /datum/design/item/mechfab/odysseus/chassis - name = "Odysseus Chassis" + name = "Odysseus chassis" id = "odysseus_chassis" build_path = /obj/item/mecha_parts/chassis/odysseus time = 10 materials = list(DEFAULT_WALL_MATERIAL = 20000) /datum/design/item/mechfab/odysseus/torso - name = "Odysseus Torso" + name = "Odysseus torso" id = "odysseus_torso" build_path = /obj/item/mecha_parts/part/odysseus_torso time = 18 materials = list(DEFAULT_WALL_MATERIAL = 25000) /datum/design/item/mechfab/odysseus/head - name = "Odysseus Head" + name = "Odysseus head" id = "odysseus_head" build_path = /obj/item/mecha_parts/part/odysseus_head time = 10 materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 10000) /datum/design/item/mechfab/odysseus/left_arm - name = "Odysseus Left Arm" + name = "Odysseus left arm" id = "odysseus_left_arm" build_path = /obj/item/mecha_parts/part/odysseus_left_arm time = 12 materials = list(DEFAULT_WALL_MATERIAL = 10000) /datum/design/item/mechfab/odysseus/right_arm - name = "Odysseus Right Arm" + name = "Odysseus right arm" id = "odysseus_right_arm" build_path = /obj/item/mecha_parts/part/odysseus_right_arm time = 12 materials = list(DEFAULT_WALL_MATERIAL = 10000) /datum/design/item/mechfab/odysseus/left_leg - name = "Odysseus Left Leg" + name = "Odysseus left leg" id = "odysseus_left_leg" build_path = /obj/item/mecha_parts/part/odysseus_left_leg time = 13 materials = list(DEFAULT_WALL_MATERIAL = 15000) /datum/design/item/mechfab/odysseus/right_leg - name = "Odysseus Right Leg" + name = "Odysseus right leg" id = "odysseus_right_leg" build_path = /obj/item/mecha_parts/part/odysseus_right_leg time = 13 @@ -195,56 +195,56 @@ category = "Gygax" /datum/design/item/mechfab/gygax/chassis - name = "Gygax Chassis" + name = "Gygax chassis" id = "gygax_chassis" build_path = /obj/item/mecha_parts/chassis/gygax time = 10 materials = list(DEFAULT_WALL_MATERIAL = 25000) /datum/design/item/mechfab/gygax/torso - name = "Gygax Torso" + name = "Gygax torso" id = "gygax_torso" build_path = /obj/item/mecha_parts/part/gygax_torso time = 30 materials = list(DEFAULT_WALL_MATERIAL = 50000, "glass" = 20000) /datum/design/item/mechfab/gygax/head - name = "Gygax Head" + name = "Gygax head" id = "gygax_head" build_path = /obj/item/mecha_parts/part/gygax_head time = 20 materials = list(DEFAULT_WALL_MATERIAL = 20000, "glass" = 10000) /datum/design/item/mechfab/gygax/left_arm - name = "Gygax Left Arm" + name = "Gygax left arm" id = "gygax_left_arm" build_path = /obj/item/mecha_parts/part/gygax_left_arm time = 20 materials = list(DEFAULT_WALL_MATERIAL = 30000) /datum/design/item/mechfab/gygax/right_arm - name = "Gygax Right Arm" + name = "Gygax right arm" id = "gygax_right_arm" build_path = /obj/item/mecha_parts/part/gygax_right_arm time = 20 materials = list(DEFAULT_WALL_MATERIAL = 30000) /datum/design/item/mechfab/gygax/left_leg - name = "Gygax Left Leg" + name = "Gygax left leg" id = "gygax_left_leg" build_path = /obj/item/mecha_parts/part/gygax_left_leg time = 20 materials = list(DEFAULT_WALL_MATERIAL = 35000) /datum/design/item/mechfab/gygax/right_leg - name = "Gygax Right Leg" + name = "Gygax right leg" id = "gygax_right_leg" build_path = /obj/item/mecha_parts/part/gygax_right_leg time = 20 materials = list(DEFAULT_WALL_MATERIAL = 35000) /datum/design/item/mechfab/gygax/armour - name = "Gygax Armour Plates" + name = "Gygax armour plates" id = "gygax_armour" build_path = /obj/item/mecha_parts/part/gygax_armour time = 60 @@ -254,233 +254,336 @@ category = "Durand" /datum/design/item/mechfab/durand/chassis - name = "Durand Chassis" + name = "Durand chassis" id = "durand_chassis" build_path = /obj/item/mecha_parts/chassis/durand time = 10 materials = list(DEFAULT_WALL_MATERIAL = 25000) /datum/design/item/mechfab/durand/torso - name = "Durand Torso" + name = "Durand torso" id = "durand_torso" build_path = /obj/item/mecha_parts/part/durand_torso time = 30 materials = list(DEFAULT_WALL_MATERIAL = 55000, "glass" = 20000, "silver" = 10000) /datum/design/item/mechfab/durand/head - name = "Durand Head" + name = "Durand head" id = "durand_head" build_path = /obj/item/mecha_parts/part/durand_head time = 20 materials = list(DEFAULT_WALL_MATERIAL = 25000, "glass" = 10000, "silver" = 3000) /datum/design/item/mechfab/durand/left_arm - name = "Durand Left Arm" + name = "Durand left arm" id = "durand_left_arm" build_path = /obj/item/mecha_parts/part/durand_left_arm time = 20 materials = list(DEFAULT_WALL_MATERIAL = 35000, "silver" = 3000) /datum/design/item/mechfab/durand/right_arm - name = "Durand Right Arm" + name = "Durand right arm" id = "durand_right_arm" build_path = /obj/item/mecha_parts/part/durand_right_arm time = 20 materials = list(DEFAULT_WALL_MATERIAL = 35000, "silver" = 3000) /datum/design/item/mechfab/durand/left_leg - name = "Durand Left Leg" + name = "Durand left leg" id = "durand_left_leg" build_path = /obj/item/mecha_parts/part/durand_left_leg time = 20 materials = list(DEFAULT_WALL_MATERIAL = 40000, "silver" = 3000) /datum/design/item/mechfab/durand/right_leg - name = "Durand Right Leg" + name = "Durand right leg" id = "durand_right_leg" build_path = /obj/item/mecha_parts/part/durand_right_leg time = 20 materials = list(DEFAULT_WALL_MATERIAL = 40000, "silver" = 3000) /datum/design/item/mechfab/durand/armour - //name = "Durand Armour Plates" + name = "Durand armour plates" id = "durand_armour" build_path = /obj/item/mecha_parts/part/durand_armour time = 60 materials = list(DEFAULT_WALL_MATERIAL = 50000, "uranium" = 10000) -/* - "Exosuit Equipment"=list( - /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp, - /obj/item/mecha_parts/mecha_equipment/tool/drill, - /obj/item/mecha_parts/mecha_equipment/tool/extinguisher, - /obj/item/mecha_parts/mecha_equipment/tool/cable_layer, - /obj/item/mecha_parts/mecha_equipment/tool/sleeper, - /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun, - /obj/item/mecha_parts/mecha_equipment/tool/passenger, - ///obj/item/mecha_parts/mecha_equipment/repair_droid, - /obj/item/mecha_parts/mecha_equipment/generator, - ///obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING - /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser, - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg - ), +/datum/design/item/robot_upgrade + build_type = MECHFAB + time = 12 + materials = list(DEFAULT_WALL_MATERIAL = 10000) + category = "Cyborg Upgrade Modules" - "Robotic Upgrade Modules" = list( - /obj/item/borg/upgrade/reset, - /obj/item/borg/upgrade/rename, - /obj/item/borg/upgrade/restart, - /obj/item/borg/upgrade/vtec, - /obj/item/borg/upgrade/tasercooler, - /obj/item/borg/upgrade/jetpack - ), +/datum/design/item/robot_upgrade/rename + name = "Rename module" + desc = "Used to rename a cyborg." + id = "borg_rename_module" + build_path = /obj/item/borg/upgrade/rename - "Misc"=list(/obj/item/mecha_parts/mecha_tracking) - ) - */ +/datum/design/item/robot_upgrade/reset + name = "Reset module" + desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot." + id = "borg_reset_module" + build_path = /obj/item/borg/upgrade/reset +/datum/design/item/robot_upgrade/restart + name = "Emergency restart module" + desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online." + id = "borg_restart_module" + materials = list(DEFAULT_WALL_MATERIAL = 60000, "glass" = 5000) + build_path = /obj/item/borg/upgrade/restart + +/datum/design/item/robot_upgrade/vtec + name = "VTEC module" + desc = "Used to kick in a robot's VTEC systems, increasing their speed." + id = "borg_vtec_module" + materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 5000) + build_path = /obj/item/borg/upgrade/vtec + +/datum/design/item/robot_upgrade/tasercooler + name = "Rapid taser cooling module" + desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate." + id = "borg_taser_module" + materials = list(DEFAULT_WALL_MATERIAL = 80000, "glass" = 6000, "gold" = 2000, "diamond" = 500) + build_path = /obj/item/borg/upgrade/tasercooler + +/datum/design/item/robot_upgrade/jetpack + name = "Jetpack module" + desc = "A carbon dioxide jetpack suitable for low-gravity mining operations." + id = "borg_jetpack_module" + materials = list(DEFAULT_WALL_MATERIAL = 10000, "phoron" = 15000, "uranium" = 20000) + build_path = /obj/item/borg/upgrade/jetpack + +/datum/design/item/robot_upgrade/syndicate + name = "Illegal upgrade" + desc = "Allows for the construction of lethal upgrades for cyborgs." + id = "borg_syndicate_module" + req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, "diamond" = 10000) + build_path = /obj/item/borg/upgrade/syndicate + +/datum/design/item/mecha_tracking + name = "Exosuit tracking beacon" + build_type = MECHFAB + time = 5 + materials = list(DEFAULT_WALL_MATERIAL = 500) + build_path = /obj/item/mecha_parts/mecha_tracking + category = "Misc" /datum/design/item/mecha build_type = MECHFAB category = "Exosuit Equipment" - -/datum/design/item/mecha/AssembleDesignName() - ..() - name = "Exosuit module design ([item_name])" - -/datum/design/item/mecha/weapon/AssembleDesignName() - ..() - name = "Exosuit weapon design ([item_name])" + time = 10 + materials = list(DEFAULT_WALL_MATERIAL = 10000) /datum/design/item/mecha/AssembleDesignDesc() if(!desc) desc = "Allows for the construction of \a '[item_name]' exosuit module." +/datum/design/item/mecha/hydraulic_clamp + name = "Hydraulic clamp" + id = "hydraulic_clamp" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp + +/datum/design/item/mecha/drill + name = "Drill" + id = "drill" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill + +/datum/design/item/mecha/extinguisher + name = "Extinguisher" + id = "extinguisher" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/extinguisher + +/datum/design/item/mecha/cable_layer + name = "Cable layer" + id = "mech_cable_layer" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/cable_layer + +/datum/design/item/mecha/sleeper + name = "Sleeper" + id = "mech_sleeper" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/sleeper + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 10000) + +/datum/design/item/mecha/syringe_gun + name = "Syringe gun" + id = "mech_syringe_gun" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun + time = 20 + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000) + +/* +/datum/design/item/mecha/syringe_gun + desc = "Exosuit-mounted syringe gun and chemical synthesizer." + id = "mech_syringe_gun" + req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun + */ + +/datum/design/item/mecha/passenger + name = "Passenger compartment" + id = "mech_passenger" + build_path = /obj/item/mecha_parts/mecha_equipment/tool/passenger + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + +//obj/item/mecha_parts/mecha_equipment/repair_droid, +//obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING + +/datum/design/item/mecha/generator + name = "Phoron generator" + id = "mech_generator" + build_path = /obj/item/mecha_parts/mecha_equipment/generator + +/datum/design/item/mecha/taser + name = "PBT \"Pacifier\" mounted taser" + id = "mech_taser" + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser + +/datum/design/item/mecha/lmg + name = "Ultra AC 2" + id = "mech_lmg" + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg + /datum/design/item/mecha/weapon req_tech = list(TECH_COMBAT = 3) // *** Weapon modules /datum/design/item/mecha/weapon/scattershot + name = "LBX AC 10 \"Scattershot\"" id = "mech_scattershot" req_tech = list(TECH_COMBAT = 4) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot /datum/design/item/mecha/weapon/laser + name = "CH-PS \"Immolator\" laser" id = "mech_laser" req_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 3) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser /datum/design/item/mecha/weapon/laser_rigged + name = "Jury-rigged welder-laser" desc = "Allows for the construction of a welder-laser assembly package for non-combat exosuits." id = "mech_laser_rigged" req_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser /datum/design/item/mecha/weapon/laser_heavy + name = "CH-LC \"Solaris\" laser cannon" id = "mech_laser_heavy" req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy /datum/design/item/mecha/weapon/ion + name = "mkIV ion heavy cannon" id = "mech_ion" req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion /datum/design/item/mecha/weapon/grenade_launcher + name = "SGL-6 grenade launcher" id = "mech_grenade_launcher" req_tech = list(TECH_COMBAT = 3) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang /datum/design/item/mecha/weapon/clusterbang_launcher + name = "SOP-6 grenade launcher" desc = "A weapon that violates the Geneva Convention at 6 rounds per minute." id = "clusterbang_launcher" req_tech = list(TECH_COMBAT= 5, TECH_MATERIAL = 5, TECH_ILLEGAL = 3) + materials = list(DEFAULT_WALL_MATERIAL = 20000, "gold" = 6000, "uranium" = 6000) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited // *** Nonweapon modules /datum/design/item/mecha/wormhole_gen + name = "Wormhole generator" desc = "An exosuit module that can generate small quasi-stable wormholes." id = "mech_wormhole_gen" req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 2) build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator /datum/design/item/mecha/teleporter + name = "Teleporter" desc = "An exosuit module that allows teleportation to any position in view." id = "mech_teleporter" req_tech = list(TECH_BLUESPACE = 10, TECH_MAGNET = 5) build_path = /obj/item/mecha_parts/mecha_equipment/teleporter /datum/design/item/mecha/rcd + name = "RCD" desc = "An exosuit-mounted rapid construction device." id = "mech_rcd" - req_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_POWER=4, TECH_ENGINERING = 4) + time = 120 + materials = list(DEFAULT_WALL_MATERIAL = 30000, "phoron" = 25000, "silver" = 20000, "gold" = 20000) + req_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_POWER = 4, TECH_ENGINERING = 4) build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd /datum/design/item/mecha/gravcatapult + name = "Gravitational catapult" desc = "An exosuit-mounted gravitational catapult." id = "mech_gravcatapult" req_tech = list(TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_ENGINERING = 3) build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult /datum/design/item/mecha/repair_droid + name = "Repair droid" desc = "Automated repair droid, exosuits' best companion. BEEP BOOP" id = "mech_repair_droid" req_tech = list(TECH_MAGNET = 3, TECH_DATA = 3, TECH_ENGINERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "gold" = 1000, "silver" = 2000, "glass" = 5000) build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid /datum/design/item/mecha/phoron_generator - desc = "Exosuit-mounted phoron generator." + desc = "Phoron reactor." id = "mech_phoron_generator" req_tech = list(TECH_PHORON = 2, TECH_POWER= 2, TECH_ENGINERING = 2) build_path = /obj/item/mecha_parts/mecha_equipment/generator + materials = list(DEFAULT_WALL_MATERIAL = 10000, "silver" = 500, "glass" = 1000) /datum/design/item/mecha/energy_relay + name = "Energy relay" id = "mech_energy_relay" req_tech = list(TECH_MAGNET = 4, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "gold" = 2000, "silver" = 3000, "glass" = 2000) build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay /datum/design/item/mecha/ccw_armor + name = "CCW armor booster" desc = "Exosuit close-combat armor booster." id = "mech_ccw_armor" req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4) + materials = list(DEFAULT_WALL_MATERIAL = 20000, "silver" = 5000) build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster /datum/design/item/mecha/proj_armor desc = "Exosuit projectile armor booster." id = "mech_proj_armor" - req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_ENGINERING=3) + req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_ENGINERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 20000, "gold" = 5000) build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster -/datum/design/item/mecha/syringe_gun - desc = "Exosuit-mounted syringe gun and chemical synthesizer." - id = "mech_syringe_gun" - req_tech = list(TECH_MATERIAL = 3, TECH_BIO=4, TECH_MAGNET=4, TECH_DATA=3) - build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun - /datum/design/item/mecha/diamond_drill + name = "Diamond drill" desc = "A diamond version of the exosuit drill. It's harder, better, faster, stronger." id = "mech_diamond_drill" req_tech = list(TECH_MATERIAL = 4, TECH_ENGINERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "diamond" = 6500) build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill /datum/design/item/mecha/generator_nuclear + name = "Nuclear reactor" desc = "Exosuit-held nuclear reactor. Converts uranium and everyone's health to energy." id = "mech_generator_nuclear" req_tech = list(TECH_POWER= 3, TECH_ENGINERING = 3, TECH_MATERIAL = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "silver" = 500, "glass" = 1000) build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear /datum/design/item/synthetic_flash + name = "Synthetic flash" id = "sflash" req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2) build_type = MECHFAB materials = list("metal" = 750, "glass" = 750) build_path = /obj/item/device/flash/synthetic - category = "Misc" - -/datum/design/item/borg_syndicate_module - name = "Cyborg lethal weapons upgrade" - desc = "Allows for the construction of lethal upgrades for cyborgs." - id = "borg_syndicate_module" - build_type = MECHFAB - req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3) - build_path = /obj/item/borg/upgrade/syndicate - category = "Cyborg Upgrade Modules" \ No newline at end of file + category = "Misc" \ No newline at end of file diff --git a/nano/templates/mechfab.tmpl b/nano/templates/mechfab.tmpl index e4e30cdb392..6f5faab8a05 100644 --- a/nano/templates/mechfab.tmpl +++ b/nano/templates/mechfab.tmpl @@ -21,7 +21,12 @@ {{for data.buildable}} {{if value.category == data.category}}
- {{:helper.link(value.name, null, {'build' : value.id})}} - {{:value.resourses}}, {{:value.time}} +
+ {{:helper.link(value.name, null, {'build' : value.id})}} +
+
+ {{:value.resourses}}, {{:value.time}} +
{{/if}} {{/for}} From 1f1be8e8d7d739fe1b2c563b6a2a04633dc34c77 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Thu, 13 Aug 2015 08:19:48 +0300 Subject: [PATCH 05/24] Changelog --- html/changelogs/Kelenius-ofMechbabAndPanic.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/Kelenius-ofMechbabAndPanic.yml diff --git a/html/changelogs/Kelenius-ofMechbabAndPanic.yml b/html/changelogs/Kelenius-ofMechbabAndPanic.yml new file mode 100644 index 00000000000..67f0c0806c3 --- /dev/null +++ b/html/changelogs/Kelenius-ofMechbabAndPanic.yml @@ -0,0 +1,6 @@ +author: Kelenius + +delete-after: True + +changes: + - tweak: "Mechfab can now be upgraded using RPED, and now uses NanoUI." From 8fcd18157eba3ce929b93131db62c57734e2b132 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Mon, 17 Aug 2015 10:42:27 +0300 Subject: [PATCH 06/24] Fixes mechfab manufacturers --- code/game/mecha/mech_fabricator.dm | 6 +++++- nano/templates/mechfab.tmpl | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index e3c344587f2..f0b6d052a1b 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -100,7 +100,11 @@ data["category"] = category data["categories"] = categories if(all_robolimbs) - data["manufacturers"] = all_robolimbs + var/list/T = list() + for(var/A in all_robolimbs) + var/datum/robolimb/R = all_robolimbs[A] + T += list(list("id" = A, "company" = R.company)) + data["manufacturers"] = T data["manufacturer"] = manufacturer data["materials"] = get_materials() data["maxres"] = res_max_amount diff --git a/nano/templates/mechfab.tmpl b/nano/templates/mechfab.tmpl index 6f5faab8a05..8fcc82f877d 100644 --- a/nano/templates/mechfab.tmpl +++ b/nano/templates/mechfab.tmpl @@ -7,7 +7,7 @@ {{if data.manufacturers}}
{{for data.manufacturers}} - {{:helper.link(value, null, {'manufacturer' : value}, value == data.manufacturer ? 'selected' : null)}} + {{:helper.link(value.company, null, {'manufacturer' : value.id}, value.id == data.manufacturer ? 'selected' : null)}} {{/for}}
{{/if}} From 1ac8b944272e74679cbdf067526e5350ce21f390 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Tue, 25 Aug 2015 12:28:20 +0300 Subject: [PATCH 07/24] Fixes a few issues with the mechfab, fixes #10852 --- code/game/mecha/mech_fabricator.dm | 6 ------ code/modules/research/mechfab_designs.dm | 2 +- code/modules/research/research.dm | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index d04b3340f99..7fc5f17e86d 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -335,19 +335,13 @@ /obj/machinery/mecha_part_fabricator/proc/sync() sync_message = "Error: no console found." - world << "Syncing" for(var/obj/machinery/computer/rdconsole/RDC in get_area_all_atoms(get_area(src))) if(!RDC.sync) continue for(var/datum/tech/T in RDC.files.known_tech) - world << "Adding [T]" - sleep(3) files.AddTech2Known(T) for(var/datum/design/D in RDC.files.known_designs) - world << "Adding [D]" - sleep(3) files.AddDesign2Known(D) - world << "Refreshing" files.RefreshResearch() sync_message = "Sync complete." update_categories() diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm index c3f2821a858..cfdce572b11 100644 --- a/code/modules/research/mechfab_designs.dm +++ b/code/modules/research/mechfab_designs.dm @@ -584,6 +584,6 @@ id = "sflash" req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2) build_type = MECHFAB - materials = list("metal" = 750, "glass" = 750) + materials = list(DEFAULT_WALL_MATERIAL = 750, "glass" = 750) build_path = /obj/item/device/flash/synthetic category = "Misc" \ No newline at end of file diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index ae928749e28..8dc8a12263f 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -98,7 +98,7 @@ research holder datum. var/datum/design/A = known_designs[i] if(A.id == D.id) // We are guaranteed to reach this if the ids are the same, because sort_string will also be the same return - if(A.sort_string >= D.sort_string) + if(A.sort_string > D.sort_string) known_designs.Insert(i, D) return known_designs.Add(D) From a0a8b2865cdf7e47e92ed4aa78b48e2e12d1408a Mon Sep 17 00:00:00 2001 From: Peliia Date: Wed, 26 Aug 2015 16:11:01 +0200 Subject: [PATCH 08/24] Pathogenic Isolator Fixes the Isolator saying "unidentified" for every entry on the List screen. --- nano/templates/pathogenic_isolator.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nano/templates/pathogenic_isolator.tmpl b/nano/templates/pathogenic_isolator.tmpl index 4c46f9b131d..69411d858fc 100644 --- a/nano/templates/pathogenic_isolator.tmpl +++ b/nano/templates/pathogenic_isolator.tmpl @@ -81,7 +81,7 @@ {{if data.database}} {{for data.database}}
-
{{:data.name}}
+
{{:value.name}}
{{:helper.link('Details', 'circle-arrow-s', { 'entry' : 1, 'view' : value.record }, null, 'fixedLeft')}}
{{/for}} From 89629b686fb411af798bb450ef6b47875e3954b1 Mon Sep 17 00:00:00 2001 From: Peliia Date: Wed, 26 Aug 2015 16:18:36 +0200 Subject: [PATCH 09/24] Dish Incubator Now the Incubator should stop magically conjuring food whenever there is a beaker without food inside. --- code/modules/virus2/dishincubator.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm index b176dd3d5e2..81e1b85eca8 100644 --- a/code/modules/virus2/dishincubator.dm +++ b/code/modules/virus2/dishincubator.dm @@ -128,7 +128,7 @@ nanomanager.update_uis(src) if(beaker) - if(!beaker.reagents.remove_reagent("virusfood",5)) + if(beaker.reagents.remove_reagent("virusfood",5)) foodsupply += 10 nanomanager.update_uis(src) From d9e940c3a616c9678849ad6c704a67531a9f14aa Mon Sep 17 00:00:00 2001 From: Peliia Date: Wed, 26 Aug 2015 17:12:30 +0200 Subject: [PATCH 10/24] Dish Incubator Limits Imposes limits on the Dish Incubator, it shall no longer have values above the meters on the display. --- code/modules/virus2/dishincubator.dm | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm index 81e1b85eca8..1648caf6399 100644 --- a/code/modules/virus2/dishincubator.dm +++ b/code/modules/virus2/dishincubator.dm @@ -128,14 +128,21 @@ nanomanager.update_uis(src) if(beaker) - if(beaker.reagents.remove_reagent("virusfood",5)) - foodsupply += 10 + if(beaker.reagents.remove_reagent("virusfood",5) && foodsupply < 100) + if(foodsupply + 10 <= 100) + foodsupply += 10 + else + beaker.reagents.add_reagent("virusfood",(100 - foodsupply)/2) + foodsupply = 100 nanomanager.update_uis(src) - if (locate(/datum/reagent/toxin) in beaker.reagents.reagent_list) + if (locate(/datum/reagent/toxin) in beaker.reagents.reagent_list && toxins < 100) for(var/datum/reagent/toxin/T in beaker.reagents.reagent_list) toxins += max(T.strength,1) beaker.reagents.remove_reagent(T.id,1) + if(toxins > 100) + toxins = 100 + break nanomanager.update_uis(src) /obj/machinery/disease2/incubator/Topic(href, href_list) @@ -170,7 +177,10 @@ return 1 if (href_list["rad"]) - radiation += 10 + if(radiation + 10 > 100) + radiation = 100 + else + radiation += 10 return 1 if (href_list["flush"]) From 8743cd89a4a533620dbfa0dd43534b29ffba403d Mon Sep 17 00:00:00 2001 From: Peliia Date: Thu, 27 Aug 2015 18:59:16 +0200 Subject: [PATCH 11/24] Dish Incubator v2 Adheres to pointers laid out by Ginja. --- code/modules/virus2/dishincubator.dm | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/code/modules/virus2/dishincubator.dm b/code/modules/virus2/dishincubator.dm index 1648caf6399..ed6810980ca 100644 --- a/code/modules/virus2/dishincubator.dm +++ b/code/modules/virus2/dishincubator.dm @@ -128,7 +128,7 @@ nanomanager.update_uis(src) if(beaker) - if(beaker.reagents.remove_reagent("virusfood",5) && foodsupply < 100) + if(foodsupply < 100 && beaker.reagents.remove_reagent("virusfood",5)) if(foodsupply + 10 <= 100) foodsupply += 10 else @@ -177,10 +177,7 @@ return 1 if (href_list["rad"]) - if(radiation + 10 > 100) - radiation = 100 - else - radiation += 10 + radiation = min(100, radiation + 10) return 1 if (href_list["flush"]) From c5e09c30d64061b0896a191ce826c9defd30da34 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Thu, 27 Aug 2015 19:56:18 +0200 Subject: [PATCH 12/24] Alters the round duration format, increases Stat inactivity timeout. Round duration now has a similar format to round time. Stat inactivity timeout is now 10 minutes instead of 1 minute. --- code/__HELPERS/time.dm | 9 ++++++--- code/modules/mob/mob.dm | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index d111ebb8fcc..6411806a356 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -36,9 +36,12 @@ proc/round_duration() var/mills = world.time // 1/10 of a second, not real milliseconds but whatever //var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something - var/mins = (mills % 36000) / 600 - var/hours = mills / 36000 + var/mins = round((mills % 36000) / 600) + var/hours = round(mills / 36000) - last_round_duration = "[round(hours)]h [round(mins)]m" + mins = mins < 10 ? add_zero(mins, 1) : mins + hours = hours < 10 ? add_zero(hours, 1) : hours + + last_round_duration = "[hours]:[mins]" next_duration_update = world.time + 1 MINUTES return last_round_duration diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 93ffec00cc3..2cf562b20c3 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -635,7 +635,7 @@ /mob/Stat() ..() - . = (client && client.inactivity < 1200) + . = (is_client_active(10 MINUTES)) if(.) if(statpanel("Status") && ticker && ticker.current_state != GAME_STATE_PREGAME) From 78a129db9d54a9974ec279f60b959e3236fda757 Mon Sep 17 00:00:00 2001 From: Matthew951 Date: Thu, 27 Aug 2015 14:47:02 -0400 Subject: [PATCH 13/24] Adds a new set of hair and facial hair - Adds "Volaju" hair to sprite_accessories - Adds "Volaju" facial hair to sprite_accessories - Adds two new icons to human_face.dmi corresponding to the above --- .../mob/new_player/sprite_accessories.dm | 8 ++++++++ html/changelogs/Matthew951-Volaju-hair.yml | 5 +++++ icons/mob/human_face.dmi | Bin 56551 -> 57207 bytes 3 files changed, 13 insertions(+) create mode 100644 html/changelogs/Matthew951-Volaju-hair.yml diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 37f0f29803d..dde2d734c5f 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -398,6 +398,10 @@ icon_state = "hair_joestar" gender = MALE + volaju + name = "Volaju" + icon_state = "hair_volaju" + bald name = "Bald" icon_state = "bald" @@ -557,6 +561,10 @@ name = "Adam Jensen Beard" icon_state = "facial_jensen" + volaju + name = "Volaju" + icon_state = "facial_volaju" + dwarf name = "Dwarf Beard" icon_state = "facial_dwarf" diff --git a/html/changelogs/Matthew951-Volaju-hair.yml b/html/changelogs/Matthew951-Volaju-hair.yml new file mode 100644 index 00000000000..be87392bb69 --- /dev/null +++ b/html/changelogs/Matthew951-Volaju-hair.yml @@ -0,0 +1,5 @@ +author: Matthew951 +delete-after: True +changes: + - rscadd: "Added Vincent Volaju's hair." + - rscadd: "Added Vincent Volaju's beard." diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index d334efb02a60902dade33d510a3e1b31bfb7aee5..cf23b8482b351b8c7b5d0972d9c464a904f5e8c3 100644 GIT binary patch literal 57207 zcmc$`c{r5s|2I4$RMr+MS<<4C<&zpBOC?)Hsq9QjWEsl7jUib|l922bk}RVzgJH%} zA^SQQW5{ldeGJ3Q+~@T9exK*~J;(9IOb zvREOTrkco*L4_j;7GE;IHb`%gNQPDO1$lGh4GZn1YFQo9r|(S7o!me0p;ipC-n-iw@hSc6=th4}j;Ty%$5+8S^H1U< zu3&^-?I}@w*2&zR_gTk}a=qH;P-9@q?%FB-Zw(1Q4v!6Se$^%XsA^QWS@@e8x`)R- zs-FM$p5j{*$MZ*fvHPz5nD(;soKCsljcw|!>$AVTM`)+?#p8#YMvaHcPYUie zieAn^T&=(~q@Q}TZ@;#sh02S1|B7>XXO_kMnbW5KC^onS=$TwzM4{|k)JuGb{P})J8|xqk23o9 zv)@rS;F^XNyAT5;pTaUTlfH50czJqEb(b2-Z^{ zzdth7{1?BQY|nj6%hveKGsU#RLKnHvh$tqrfn^1K^xHFN_IBW5Vtl2KOf%7WJmmC+ zAF}YZQY5R_w}QQF+H{AYU2ce(P?pREQZx%reo zY{u;4I_SdNhMiGcu$o6N^D`4a?Cf+EKkOWni7eOqy+0@~^HL!P4o#+mIu~V4AA^04E^!M{Ltl9#{4Zcw}#^S561F2|y8E)p1f=i!L3TAjt8QdGNx&S&~Q-u+s+hgX*8n6uwu z@u4+$#o{nGQyFnX`qb|G>hOohcaTJ^QTzd^sW*3XMP&YQ50%wny{Pv!ckhd@w@}RM zKh^&x@p1e#>#|n1lTgP}@>D?P(T=U1{0%AJrnl0iz1la^r!P9~$V~(h2m&b~mT!WH z!}(G4-T+%}*A7PBR!mMX%|BjgW2~$DtFe*WoTjg@pS|I#NTEPyW|fkRJ|%iuY2yTJ zOtc}8THl=lVZV&`MUJIH{+xqs6f4Pk9{(tqe5Ab2iQ3iGHDi^3Tvj&9tN}G8`+Sz+ z2xku8<3Hbkx~OE+uS%&Bs>7M+%q*cc)wupqS3gX``kCnJIyyS){vbgOJlKq_t!uhD z+1cUyWFVoE5l1@*ZojRc4n!@Y8M3b2Gx~hIdtn$$Yl2(vNr`&pSAW7xr2UhPPEcBO zkgTJ}{8Q}*eyYFOAL657)2o^sR$LJDEa91R>FnXaN{YUC`L($q+_fArmTd@|R_5#N zZJ@6oHQ{-&dD8P7Xv<)_Fk{t6)0XVE4+7EP;yS1i8So}QNTbzG*qrMzc2V`J>4w7o z-C+x1nqE_{%AqqIxSYGUPVL`8II8w$s|M#7*R!$V|3UaS{AHA}sHkQg;nmmx`u&*d z!dug@7%83HyHA{HS({ZcBEzS)t9I8FEinn2c=`gVAmRx^w&~JQhpXA@RdRt24$nmd zAOoVlZjgRH3B`_T%(>*%y6H>izrt{vGcFsjlL>>}6!d}J5kuZE(=%#8>xJc;PuAxL zt41I8`<`~Lpn+!GdKqy?+@>9(vYpy9=duxyUR*$Yu>NYO`_yRV;b&>*V`Ght20k== zp7NUcwwZzTTeK@uJqU4o93kpo^y$Fo$^%17GN1v*b6hu6z}*R#$X|-7zOx;1QMSzC zzTo8p{{7>hZccTMA1}TV-Nej)D*y1{(X2`%U!9>KYl1N;;UqU}T8)mgo<>OreVV{xxv>lJm2iGxwQ56@N%`f$yx ze*MRf=X6W$fBv~Gff)b8b2oTG{8-&^d$?IDxu`SJ?4eg?S@*V3gK{@J81pk~quI=S zRW|>1oX|H%1?0jGLAM41ZoQnmO~f;as<7bYpC*X0J+KXwqO0_-hA&AwN}{pQ$<@tM z&NH-`na2|=ik-6bhKd%fPL#dHp7f&cLNl)TV}>2k=_mx%6~9SGvgsbIZYAd1)kWmc zY`9eJ-TN#m=3Yo;s&K2vMq(K&Hy~r}0#$1|08GT-O%IGD&wYr-mFy+#AU*9`6hgAf zHtS7i&#X(JpOG~Lg0+_47I-9YSaosU{Y$x>1b;1OE}Lc_cxE9V@J3|dce&d!2>0K8 zVQKfd{@s8Ga6S!o?oj4@${bMd4^r9Q#^aD5Hwo;MogIDPw=y|S+hdLV_teprNX^#F3qy@_zrTu7$trV3?1(vP`Hd4 z>{%`j-hpiVx>>^cgyfgxAMLcBt;@xTbN=jn3Bu7Ll(PxBFM0LD-&W@9K>nVTvxDpJ z1>fuj{Q!P+&WMEm?;YS9sw|Lwo}dcHD1@1QZNB;UD(4dpZ6umr9-3<;mXLhC&!aAK zZUQ-Pt`d~_pJtaGmkdekqqJVA<$M$RuCMhdfoD|GA-fn!6wlo%Mlt)Hv?a=ic5dKl zgB|M5CfT#@xtpA;pTAy;QauS-ROXS1*WR2`<&N)v??~b$odj|AJ{t*>zu_fc##OsM z{}pmXY7^5X8Y7W&%>H16KC1{LIHKpI?M9BhdHO&hhTAtlRSo8sdA-{RZWtaPAKw(5 zqhOGxEO3n3;b(0XRuE8kNnc)VFUupII!?-P#7MKVH+^qHwDv~ESFI81PQ=(xfS?05 z!#ZM(vr8t=Jl`x{#5&5C9hE|Ni{Vb5Jb5@Xdikh8!{Y}J>IVZwvewN~#TCozy|*5R zYYl#3m)8d`od(}NdGe(7C)(ol0RbVQ*PE%+Q|Hn3Ch;5lvmDLkboyPxHR!sw3`(!U zs$RF}cHGp^1?}+ODdiSy;m-GKTppD9Xr@7`Fq6rApb`E0)hk^U6&2T^2c?cSm)3IN zgRZ!#tMaW|Wl~`F+zUr}*m^7_mE@&>MuD^=fw`n?YE?8<3K70k}g zzMX&fYgmeU+4Xk~eK?jB=nO@$` zicb6373)$l_hQ|aY+ggFaEmzEu^EX#3dEWE%uE{Y5e)6q?j7>(5;--BETLbObN=eaCnYikQ0b)q#z#fkyC=na6e%l>wr{RZbFcnGwQ1**UbTq}d?ihHW%x+GRV_G8fMCDhuKgw% z8cguBb&|KC?bu59&AqF9>C%x$=MLrHJyT9lNqNlwoo=gR|{P+oQ9Ie5|5 zdU|^ON1SflxKTFz&o|d&$BxBQH%C9|*=S|OF&GS8-4H|#yBLL9BwU+NLVHRoLw-}mj1*jg&5JR9ZM|(mVb(C_sz5>D%>vnF06)R1$Ultx@^0?!%LhIXn&CPnYwA; zx=Jp)_b{6wyuxzt+1*3=E;tqD(M{K$t@X!r_k7JG_n|urv!!j@{N5ooy`(DaSh#ik z)H!Il#n3xMdS*!4YTdQi;}KUb3kR@b1X(@!gAx*ZKzp8iNDTb&i_3Yf9Hc!}Je#?g zjHH<(FKk691&`sY3K1(4&8J>|ifp(XN;)$u&ezS5=fUL>^_gG@uvn}Me0UHV@@-il zRGd>$SvAb<^^@#FRO0dM4krK(pHD8v9MZBi!J>u&En|B7w}!~h3p=6HF-4R1?jFHy z6ulZO3deA9uoJJg1bL(Ob$l=74LTgAprz#2!AGD$dw5~g$2*;^SrnSu=ckee<12(Z zRo44olc-rc%e2+Y9YOIVm5KDDod9+o!-boyhQ(c^Do%w{0wn;j)vyX%40^EfHP+kI zXlGU4o$Emx2P}8xFdRY^7`hGaU_^6nDzuL+$T;t%DQ#tsqcCv9uH826d!~Y14aaxA zF^3`U>FU0g*0!TxqJklxDF;2G9TH4HEbgiWSx|ov&i7Ebp0-QGyc}ws=5ti@*RNl? zrw_c3v#|HFoBy?W<8OBC>|RrbA-Wr;O2`?%)II{%?fC2)^C5AoQG*{+om!-;=avO0R4NpV!df z#Eo;{qoJYUwuc8Q77ZVG&6&db(}Ivo7xzYXeY7z)%6$u9dZpQ!<`cQ;2tGZ1eM0)u zVQFbUhU5`R$=J0uKml$G<-v513pAW^I?GMy(LQ%>?~CZx)>gGF-%?z36TpP44Euw{ zmVCBtd|4nA)`ss%G)-d&x7A(*H4@)+xbN>@(Z6M_nEWU((CTksaPajt13fwM zK+XHob5}>@@)LH)r0U@&>^yDeENHkRb7R{KX8K zmZaj;ZsF08qT)1XtW`+(?6{{v`6Zv0WR+2_>7U5_L7ESoB%~rhELM7Z&Q6X${G_oKZ|1EyZbV!c$XH z@+IOQ^>k(HAB*4Gs##cAs3O=Jq!Nfl_*|*`D&EE>CM~tKI@H?^Cj^G(Bl^ZnG1(}T z$w<&*jn$$x2#4w#8k6&brDj7hWAYD*|-TElP@U_B$G5 z9;K94^9E#tkn;^+sCE`A+b<1lA-)%RY&0IEi-?F)H0uK8lD*M>HS|*xEw6jIxsL0eTkX2z}2sbkF8%^TPs^zU$>%0a5$$>>Sd88&;^(& zg!P!Y?gZ$7%iYROBnkNkD82!K5OoK{q&#fb+Nx)zTe+N?RLC{mkfm_xUd=eRACxHb zM``SlfyA%a0Eq0Gt*cGV>g7J4d zetPabVg%_Yo&S|t_wJtgY{BI>@xQi&Pv!1dg{98nSqw@Y1%H-meLM0o-V2HO{smzQ@<*WvzsonjbX5nzM< zD<6aiRmm69+5&fJ4{;K#<`FZ@X|3Z`hqRcpCi)#(TZQkhW+lvs49|~MRIwZ{ZOxaO zMRGS1-}G+HUA@FZObv-ICv5+kg!|M`ti~b`89MZpSEI@J-0!Yo_)(b{#9GDPf^>-;7Q3y+rFL}ysT`WOF2}) zO1tV-{#_TE^n}{|J6sm@YAxnk&pBmf880uda{Aip?5uMDV>WN{SFD7YJ8x3QbT$sB zHHh)ZiY|QK(ca$fm^}C$d|2_5!M>z@5ED&WV)bgfMt4t7=>n3@8HIe(!7^a?U6q!W zJ0_YZKqsMg)@)qHg%n?PE(IFQaasj>Z(0vtRNU!P+gL~C!1zZCwQ@_?4|vC_p11Yd zn{NiNC)bL5i?ud)Z?9X5d*d0UupA77zk|`7XLa)r(h zc_V0}51=7HI0!A2Pq@wDN29S|0;6DVf&6O#TPQ=JVr3Z2b$}l!%)XAsU%z%(6KchF zM~s4pecSBd!qqeNWV)>z-ZZ^>`(%PMV^=7_E=VD8I>T>bG8tC9v({fYdqJ`$gjp55 zJuaP0A)s1ZQ8oREv8&)iEF}xP#*W|J-KGj_Q=S(st*pLAXp`C<`v~ypj&N{r5S2-2 z&(fBj*?i#2xXCAU#2}b-ZE-R1sA`DQ<20I&gbjP`)?QMiYpy9t1a5tJr&jXiCxFio zx!x30zm7Pb&P89~an&#ruEt}nItB$htt<~l#>Z>|Z9sG*ootkU-@)PdIeZYK5(VAd zix=wudFhr>p91@QyWhrmP-494na&!#Rk@Xq`i{Cn`Uf9X#JaH%`XDwjca)BC_lXM|ddhA8p*Tq7AyqPz)dA^Brl)gKzL@ zneXC+1k{+b<*`S0HJsWj^zwez<{gVdj|F$0iIvE!Y0mocWj|GuSD$SP&1WvwaqqmJ z)4@psGaBU0_S6HoE=t=QZ|)L3c18tRVU}xdw-j^xt!bQfq4Xwh%I}!Q$5@E3mU&I4MnueJ-6cL>;T_7pJmO<$OJ7rK z%oTQTce&~8>*ywznIfh__u+=OAlHZLK@oz=qdmsE6E*UStk)9!M=wO_#59>)LJI;c zG9bcru=X>++`>}7Cs}uOKl_N-NeVH?KH4mpG&VN!X{w5Xqb$V1QD!wyP9+yaM<4k; zc?OMS@q_)3#frIjOHSz5FL8^;gT_B8y8BXBSMfBhglxva84}ri2W#Kin9hxX=UKFs zPhvHK3)A`WoI9Teu&6`2lsVVqIkOsuf zBx;e@t+A=8DOIrj#}D1nYz4^hVJRuQRc2Oty7xMhZi~OIVN+gbZmS^BaA6g8da_Wk zD&((*J5kMYk$C;GiO2{5e=jdTm4hGT03>ge`sc({&)X6rm3YD5V77j|#lMzKt@@V@ zCjAdCNbnu};aicu@SJh^UVU2&h_4a zX&4HUVgQpy$mnOcI%(}|>*ye4VlQ!x1+lh@l}z#5AT6e&FPk925A}k13wd~BHe96b zr?CM+DY>Pb@O`kbl;J4xCom}J=XzMQ7UagC2aE(Hmq*19lrPFM5q>daF(yyWHEQaWW6`AE) z74_R?rKH4LW86=y3#g`Lwl6HW|08XC1OM4%2LOOgt*x(YDm{NXbC{33d2#O?HkDq5 zW)TJM7k|dzmL#;m*hLK<+cc5|ad?AN>7~Cr;>vyZwSJ-+v@|4`??V>$3;A&cDMQ0A zr?j-kF+fywc7EQiBD;BdHNGw2jdv$};Rzhcm!JjXtFuv@c96KwdrPvmO$4Yb$nO?d zko=3?qXwaAKrU#d;+lT@HubTlXS%X|)$)T^$r1q$=DnIr3mst z+dOL2v+`_DPfs_2Ajj|_=}FLTE+;@zsZ5jV$YMC})3hFxD^F$9^&b1LwXd^pmpPu}7ImgjskV0140OE>D7OPiZ(|pr4gPYp-#HWgWF`r=G!JXTi z4DTak!TWpQoz(A@g1wDWpm8ez0QJ>O%ko6oADrE{7`Q)G3Sm}cmXQhRYJGUrToM9= zE6!`=Es{`m?`8Rl*1py91NbKdWX0X3BV*nE6Kp8#moZ(lg_$x{ayB|ei=;~D4 z9gJM2gcZfW7FJU_fa99ioK@e0iikx+LNIL zu0Dy88z=A3t3nq3K)f9tKd)!3R?c6j5vmv#dS8Rb2?z-EvMR+EA3c!_P5>yjZF*N$ z&WB`gg%X9TX~OiS$GR9pOjj-ehSa=ev~$^R%&{lSBXg<$*ta!GvA4H(6UQBi17qJN z0@efaf-*ocpo_Kzi9{w44`(xf>G5qbXgD11GkwSO>L!r&%mKj0o!kbLDyHc-Ym`Bw zn9aGWPs}>EIhMKx{y7`<5#4vV>#Nm_hX2z2wCI|BB13vD+JYR+wZTvPr~H6YTH9}c z$1_^lj!JAk#-ZbqYBtn2s_LDk2$?U5UnM6@Ko5b}?$cmwyHiFqf9DhOnju6~H5(Ev zFBWq-*EB!EjRX>3Bme)^Z%) zKHELJBW@9Cn-M*?u<#DN6y)|mqt-gvrq{Yd7`f5F{^=VFBn6Hh2-t=o#*d>lz+hRN z9c@~N@}gkc|G${N-@U#M1iYc03Sk+KoyLAUqm>F0ySvZJI!Dr!ng?{Io6cwB-U zy-p=M(Rf0mn+j04)Q!PdJ94aX=B3%mcCw&u#Fe9J0V_EPo8;^)0-N1lF=g5d6c&Ej5b8TsWd(oPT`*+vHN~j)BXzq1~&R`qH!iBY>LGX6) z_xHb;)u9iM?-+gO)M1E;jj^0d*d1x?@(2W?K2ap$(Z}-X)HFOzVKVnE~(ulK!24_A5v|vvuPJ za!_{0Ii5go@7^J3E&WUKcw=1LoO9phjg95;Y(=H3PY@)!o=pY>z$do>tgA}!FG_Tw z&1zc9q(flfP;*B|bm0xWRwqz1=(wW3npz-2hBX=STiWXNI!{1tfVYFkn z{oSbhX<;T3K(Pv}?DCyK&!QI`tLWIIWWH1nAmn$qAcBJd_t;syu%l3E^)w*-*%~bO z86ugr{=IM_8Y=3H2{3#u^(S*JQ%csuIy>mdMg={riE-?K8^Onx_-jQt(NuUyQO2kB z&Ga9crk@vHw|!3-sX^2kP0hMF_yRt%JGn&~GMX$zXFQM6+Qryj?I1*s z4$UP=OG&+6n^Dr--fWi3@}~9Zzi3at*mF|$y7ty!hpz4?Hz-k2wxzVRv}^$_3a7D-#JOykMH7rlq+iORn89Sc7mA6C*Q?0S+&$ zITAZwn-TM0`zBK7KMv=Acl_7b{6FaD%q)>O6ak|1P`_UJCEnLCzt)GzO(LB$FH%Rb zyRR!|4v?YKOwlRLB9=HfF~lzu_L9o zVNqmoiFS$~2=@;M3(Lxjeh}QCSnA@H4~au7?DLl{Rev4;Z=h5KGSr+PM;Us`+76I| zFWobjICRKTg)MjTWO{j>AG2&#lMQM(2))u^$W?7~$~pcm@G#2lMt4Bm^$$jdMW3Y% zRoWEypXtaMhEG_3yZ!bl1gA&B>gS(kTZ{RK%4! z7YU$=-c?NANA?nZuCJ%}3E=U*ntp(GWZkcH0&H|%MWu9#1~e+Cqw@g$lILeeJ^K4QYPKt*UBnPMCb5Mkd0@K=pWw zX3MVQxz)Gj+}IgKY@__z`LN*eSk)cODk=l?D43!S9MdVOMxAcSYsAup=S$mjw+#ZNyR<)`092M~MGfXcu;Lw(y9C4}gV19-Ea5>v=io0*x}0VG2X+UFct40;j3o7YmB za}O+jdxFgLmmiVA5kMN%3Iea=L|O!RnJ#1W-%0YavVZ%(v_n%)+e?|>#)Hh2uC~^vm<{(zj z%JfsY&%*hH`^%d@)6i_iLJZTdi`Q1pek*H0WyCE?Nb)P9!<)amrcN;tI0#_m_kuw- z=w`;54!!wz1T`Yu_#2d~e5qC>oKr~1NOQ@A|As$mlbpSmc-!NJqF>yhLeagR#Rsi~b>1?;Bj zSX|SeKc9xH1MawwRG*fWPcfkLd;CPZKRW;$q@~CZ`}h1CipxWI4G0|H@J(-Kf}DvS zI`A15G!pc6H<_%Y9&J|8H?%63>0hrmn3|JGE~+LAsBf5qo$Z8jf7|SvW(0h3adFkO z$)#mo1%A02JaH!DhMyk>GnsX_$ASg7Kd305TPPIO?=%eWw}?Yg@dk)afoDl5>;2cx z0mBxU#WTR)jW1%>0zcx@zp8}o9Y8)Dl?-I)K?qtM&h*Sdkg7btjog>;o;e?cq}6v` z?(}31l}uL{ppnNCi_`#=-Qpy!xs^sM8kEhlYjCn*St=VBep%+`nHLS3{MH?rlJb+mm^+?=Dntv~M+3dsfadL^nku|J5`eAmXyHdRzgp`I(&NB{17va0uocwba?OeudI=pf0i zPx3y0egEc5n1u(zcNKa2w@>)~C#?7}K)8PQbpU%y( zQM69u<0RM2xL{q~<4>bKfW0Ooi#c;Zo(8J>LK5EL4}}O@%)OtPpD$$gba;$ZZ|XE6 zH9)D>bVrtO@N=pj(2f#hr10y01&gZTm369qdI0nFyT%y6^9Ur8ZIHLKi_4kR)YO+C zsvRp81QDxT#H|3@f~2na-81iL!DBG0-N%$3wBTn!ea11(iGZ3Xg9HMd0{F#E>DL7m zkNqXTC%+GT@jzdlU|nhg(owimdZlzX{QIDaG=7S39t`)2nVtRruUQe$+VC{g^vv5n z!#LO;xYwaXqZ6}K>P>+l;E(n;!z1)M)@*0rr*;;?@iRV zXAof_-aad~4v(xc8ENz(P_yYN9K9J4;X__*b|~!a3o{cAdL4C(>F0A{8(PX|;qXWs zxw-NPxPcx;#$c9$_yA0Aw%-j%`}AtLU<<$(#}H_8Fv&a(Xcx97B}Gv9`5%MpB9Ck8 z#4DxIt(}vfjE^p(h&)EOy=#;TnhzU6-U=Je`t|y?P)dOrC9+|_ zPGqVRS+k9ZQ9??D1$%m)t9Uy8%dvhEHeB&EdsgG2Eqil1OI*~_>kTSPo4vjIARE_Y zR3h-~L;q^Q;^yeqLeG@uQSYr_0TaKcOso_uxUGVha6}BgrGD3IqnutW9qt~3J8EWC zF-PlN^TAj7f@h+`vH+@{S|_g?&geB-6zg3En3OlLEN*iqP-A}UoJ`x#XgSULTvv98 zsOaVoIj!5OBu3=|6TTk(K0iPIez8@Oj+wFd`^y#+ERh)<-KnpApE>HIJmHXjJSa*D zqAw%?bLaCB_TqcU5$Tc7+<8=c4@y`0c*6&H`Dy1FirI)qB;a{Jj+Q8*w5f}W1l3GW zGnMAv-d;}=lQ@oHCZJX1?bd&nuL_%s$0OT#c)xpUzA5^s^ce_;yL2a<3Y>;*ZTvEI z$&lQ~W*M@?lPAA#v`fzDlic0(>7sW!&E1 zTo=xF0`M^~pZkkxq}`-QpcqJA@-Ok#{9Y8uP%lvvufbCyhBwOVfME))nD=qf#f%Nj zwZ*$BM(O1EG6S;d@RtO(r5n)|iyI+RIKz+pG;mAl4=X2B7&s~A;^_66??A_-H+T3; zxV1-J2Za(CW)OMH&Q@}@lG<{4?VBAaw*^8*FG-+s2( zli)?bbh!?v+B32L89*q@jY#@;gM>1`oJ&_VGXdGJn(}-@wBTdKCp9~tsq@^LA_yig^_*U zb^m!=o?AV=y>~ybD+}diktaQoGv%nGw?GYU*YCIEmS?$#XKfD5Fdfwr zTc}vGGqd3&Vcm&!VB-9>pJ;!+dq&pWI>n>S-t4&M@MuJXv00Fstslp$A177Bl%l&> z4*^{E?8S>0y+^h;D%OqZy4Yf@s5t!p@v|EC$xx}j$Vi4&{(0;O9iXP(il7y)*|FDy zBO^&4lMCW-#-TusZ((nvSof#_B0O(x1*5LfAA{W&?YH0o62jAuApO)7~+PmaxvH@PFTjiHEKDt>`m-hZWKd7hNk#)5lbcc7) zkQq`aO!Pv@=i9(tjauTEYOJ6OYyAjz8y&teQ(K$L#G~w&0QHU4%^?l2^#|S1@N&PZ zBxq0n%yqjz+A$BVf{AiuW??;$PKo6dq=DFw(JCwhUwadTs3yJYGP72{p9UxsQ0HA5 zM%OMVF^0~kHQ+(Aa&=;52Cot&FTyXIt@M(9PxO! zaUm3ljxz^5f9vxv%+CJPfSR!*pQo{8lR`e>rx`)gTP*eu$7M4jJ4-XjH^A9BAK}B6 z-oHEIvAcV_yK1#loaVX(DK>L~gq35jD6tpBMul+HE&F3q53umq?&lqaa1WGSH_8x+*FGSsIk9aD^o1$ZJ%~+ZPH#h$XC)cTEN0wa1JZQP zo(zA6sKS`1Wo0FEpfa87ejX@J9e8`)D7Hwbl11vX9^Drbw*Qc{G}2br4u;U(o#^C5 zJ|GHm=%bJj-1dhQsbX?&QPEAQ7RN{K?#8bRBmZ1C zvJ|WbIN34GKsRwRwdgK;U)F}M_h>Dbs3>q#-nKbD^7QPUZH@x=`kxN>_U-``h8%N|6VmB~Zf3K2Y^xUKv;|0-4=^Di^(`{oMYb zppXy;?LT_*_Tg>p=~tERU!-hW<%$p_Qhpc_Lhj1huB zU8-S8YxthsD+(6Bn4U?})t#VX$i~;0Cc%I9#YaakK=z4FXTXMlg#*`opO&^y^lA65 zb)ae$S+da@4FBs~{*ND@`g-?FH;JU69{O0-VJ_844)%73tgPqOI{dHWnHVJ%XrQYLcyM%dFvXg@+b&=-scAj9 z^8#nXKsU!Uzjp{-QE^Jv)Rj0Mr#-T^**!CQ{kSF{L~HtTLBDSoFPWy=6M3FMKg6=> zqmy{aJt&IPxkJqk=S)Gp&z6ii&4*fGj_R+OcHK;)KK-^WEUjguO1>c8gPb4ub}G50 zD4+%uUhn#-MWHOon@We;#^HM5FEE!&``(!d)f{Q-Pyn?1fi0`ELtI=OQ!V7adC~$1 zSEfZ~*Bnl)ap*XB{>gZKsrb!^orjJbNo+KW`U&mn?7YS4Iu6@kO8K8`Us$L=@UfpY z6AV&NnSX0aTx^1K`p=&~hqlEu&13l@6*i_w(j~(j25nG?vWaLq}kU}b= zT{C-zI&_KV3XQ8A=M=u@K!3no(OKppc6+e4eCsVh#_*OLfC0Ti{%C-FR%NbhXw1(C zPk=J?1&hUs1$uWp1gQTmkR+ZA0Jj>jX&1A&nc-m@k^s~%gc0MnxiV=LXHoi-A`GS} zprC-D6Lx%SWAF(}CAJh?ZKYL1gC5vQM$g#yH^xcF^;@&h9KfZnuC7bR*;V`h1Ed;8 z6mo;_8;SdC)W%B#(xFq5yWs+xeHw?oeuS~Ur#aRCIokVfkGLX_V^cr;A5hiMa#dI} zu_7V(mLa9`;*rYPoezDWfn=Y9*N21_ex(|gkE1Xv&0&tNxt)uiBaKQL%2|2No36{7 z_CZqbeS+J)vWOq_xH|J5d^;#0D0mIj91E&%i^W`1YN-Kv)82&g?P24m*RSE^9>1XV z>f&tJH%jcB384C``7;Hoh@cYsEyG!g-dBiO!btEoIwk z|8KrG0t;4F6%Y%)A-wrFb%(&nBm&-SsR3D>pTBYBFzGBH+|VO)pR)L5JzKgXn+vmm zl+j;g&6z6=CT;|AON}@U4UOEI8rzXTio!JPIc6kK{;`LLA9@?qB2oz<3Uf0vZ$Pwa zj@TpqEH5+ANOxFL0LNx+y+BdyZV_ubV?VEQ=6sB}5-&%HT>Me2z4hm3OqkSE^&k}5 z5IEN8OKl6r6-cQu2Oew8fP%G43aey41i=SgPpiVG5a4~}g{`)C=SjtAeDPF(DFW64 z(>=@!BZR3rTkenfDWi23n^J67bLQuRu32>_7guZTVz;%BQb4s+uv@oJ*Q_#rkI(tk zLYd=8_QQ(<$ksq5O1K)3bdJnxpJZ>4*%h-{MTxt$&cF6xS8tGX9CFP!60R!g6Ezn| zD~DAsTsQz+^lKRz8MpuC)201ean7BrIm#=JWwjZx^Jo=lFNelV1Swcdwk8^k@MBrVH$uzsDl5+6w#n{%B@S zsgHTeeTlNuruE(_PrF%p>EJ&mIu(a`g|us0)8hN3)GEFW`p7F#?#siuZOVVrMcgzq zV%Jx-j6*9g?W(d<5bw!6KjbFAsCpfg39ZB~zKAy1{6){{Dw%N%@|c3l`A9u)gZ^42 zoydI#c$~UGOw&7!Q8ePW1CT}b#`}^e81PWLp6Pr#^%kTnkU)vd8QtW>-Nr(~s+TtI z80~C3;+b(5&!N?o(t&G{x3uy1@-6m^0m0&>EI3bVd+Dm^vMNt~4si+4ss4BPqS!GQ zYZ3e7pI#-Pwh9i_8p3oAdbr#NNi_pMyqf1QAPGInLDRi&f122)mc z9Mo^zESlbe7&wgEJ%-V&FUw_rg>I+g1FptWUpQR-8rGqaX&+kNSe?y>vE^EL90!j>?C6Ujo;(3 zAG+J=H)nMFg(_+P2vj8DT&omtfzPa+?FPhPEUi4vk;wCKKAMS4sw+T&(~`)H?jW950t^Q

7}1y`R-uc?HY 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

`}_M-%ge3w4>8` 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 BSWW-{ literal 56551 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�qBe$mVYx%#O6}x!yU7xmETTgKEdG$+s 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 Kx99J_(= zVeJd7-+)xW4{rXK40ezoq-rQ&_EUzD-a7U%X8rL9=}Qu|0t$jiZ3Vj^k87En2#Y=* zr2PmHwYYa8Vs7GGS{GdR@LC4e(&glm9A0INGzs&cD_7Lf*@aA^DEJU!YIZ}QNcgoQ zT8gp{DxCMT)1aUj{7>{5m4^V5QP_x=47GJ&&Kv)^V}3vCzR~0<3RHJsNtF6MM_I^! z-hog901RHxjPy4GFb09_o&D&R5dm8a2a9gWXRvW}giF{{=*d;1kQgrgQii^Y*|J{#Cy;5uAr zB;TjInbSs)fut|Z%Cd^*hJ{EY5Ik&4TWb;+>By#)AI70vP2$*?SbQAM$fycDj7Tw4 zROyOMwFQsu-UR`e+aL8zEaWk7s%q_A(T}`#YhH<{e`RM}W1_Mj1UMXfFd8q}0xGo_ z#;GwE=W-gU>h*B@=4PR_ecP(0KKO(qZAGGAAWc^?>HBR-Vp2hL*3o^g*ArXBNlrDq!Ll&&W|X!>h&;+YI*!PKLv5j{Rhb8zqgElfw@ zgTdJnWtz7+@MJrX1t0e=H1_ZVR=MaDT1b)dyI4vO5|uwPWIYD`hJy_yK!;W#@UdQE zFO5;FK#X1q?jaBvlAKL3TdIaR5k&=vK3N58=Z}^7=D3mE-wc( zE)IgOpG~9HA%|(!qu37zCZ*ivd)R)$zz@{khYE0)BYs3|@{ddJt_9t~hV~1AVNLXJ zZQH=et#Sl9rCNpgqaWz;xbA=D0{SUs54;;gUcvFP-u|R=UtG-I&sLuLO~m=t(X*E# zh2LFunRtayrRvWA7K@{gHM+PAu#FnTkf@i8c`yM$Z$_FF?6xcfc^5zN=L#-5x6{CN+YdCI zQasNz$xcD0rnUNaU*uwGrf1xk#ZeX?2HZt0__CQA%=UFS=ewB?rSk2GeRC)Fr zF$9$=$ah!X6dkydI1a4dz=-#;*86${R)B!pXuPVa z$U?1+dZn9Z6V;WS7Ph2e&~?zbx7MM@T6)|)K^+++-a_+n#31{8yQ50MBlgxa`GXOrJjd=m*RETSd&VE_hTk_(W0jp)RfKW-7e7$I+7VW=~3LK)@Q+s;M% z@PuuQhtCS@^|xIBTd?eioXus%iRPZ zF^HYktzvmma1YeH?Qb)b^W_@Ow*dPqRj5+6@Xih1kLJOdt7|z+UKv7m6}(9$-Dj&> zz=2?Wo~Xs%+jw*Ydhn$$rjlGp(T})3IfFMw6klY-?Mt2k=(sS0kLt_vi|rsbHo#XG zsU4t@WgoI5ZyA{wH~^W-{Xso6gHNlpjgro_9w8`#42$0{(b7(a8hRafE%^S89OQ3V zNh`x+YX7O4E$aQ>&tl{J3C@59sWK>TsIMZ~|~9Uf?~ zhvNCWX#E@E^Ap@UqxWgWljgs2xy4)~0wW=cLx4{xaTNDYo)&5v{~_wl zy40eK`&qYpDEizIOWeBUzooR7$3u6l{4cAAacfwx-z_`a)!g=qeSD>&1l;0lOpJ{< zzngtLw$YlmR>W9e-=nP)@p)=1xN{a0#lY485)1?zr>AV*a*&$V9f3`A&e+9S%)s;XMBi?}0K-VxNoW#k28m zd9rpG2vk^+E5(77lQ>Rtd39JO0(b^ZDvLn93_uo8CfID_I&c?H8wS$OOw6hA{$Md+ z&v;X@ftPH-^St(mpXnE93`9+vCQL}d5#{G&BF(x^2sdjAtn7vZ*0U(|j>oo94kdVp9NI$>3`xF@(5P}e97IBMGaQh#S?-e`*$ zX?JIPZRxIO-5CNlf17)&@LY!XZGhW52^={x0^dTQ#PmRoBc|MGXlSgJh%94BU0fX- zdAJ^{p*4a$deH5th1?mQU;@>jSChzxqk!aW9}wA*p=yC(ESoM-D{3D=p`80Qv!%mr zbl#c%orw^`@<=PSXT3ry${jq;oe}TKY z{l-8G5gD_Ng8Sqs=QEkL7>NSEH9zoM2NL$OmGpAMKDzr=UtJ5xw*1uJi5&oFoNTy3 z&H;XZj6{W7WB$vsmL-&_xYP`#=ke3e%paSu)>*X8SPpvz{pN}JS$|S`X#`e!E+DNt zgU>Nw=pO@0Q2XL8Fx~#h)uq5sRvrEiibmv+Q=ZVFyrufM74R1!^}oBem$+Qgn%xdy zI=6=5|H?D-o075Qu95r5Yfivx32^7vy1D=IF8^;_!R*L1#49#=t>JaqXMV;>;Rs5E zS2O44CjK|2zrnQxazV^b;|i!^+5&FpcwkRcwVJR1)usyJ$Za%GO#sX@$*c7B^&S2y zNvO#3rV#`MwtzP9qENq|{yn?;hOL7IKAwlg&j>iQHZ|P_Gd}l8ykh7_EFUmuE09L@ z&q6`=CFPgL2=nZ;lXmv95YJvcL(RvD&dKRRE}d(SgG z9ZVdyFLv_!JOMWamNDOR5uDb^oT$U>?1c-n%A7rm+ziANKV}~RB^y4(fPs1&xI*!q zhdKz=AREv1oY$;z=uw!$d6=j+T!E)~9%n$zZr<9CFOU)M78I~)X}Z`uU#zxHt-P}+ zY5-1VTIvYQ-0{usjZWaNC0lj`$iTG{V)bmI{J)`cJCpQmc*VjcB`0crtAE*C(n-xFJ}hIjU@5<8#1eHIV8I-Dg@0*V85y%x3?!rx8GB zw>{3@mf0<#q#_Qg9^W3xwP|9Xwl!(g{pQ1+Vq02v?$W0aioV*{G_@u!r>I_^p43!R zRLq_ysX>)5C*?~l9Gl2Mga7U!({0a_;E|_d#j+Xk1fF=k?KvZ9RvHK(VR2+e3;<+8 z5c~P}3xrV>Mj~?jwb|3;e14$)XBlOifKoOEAfu%{WPGUg-0k#?`gu?FW|w_9&nWsT+V z1Fw~9ij2CzwFJ*`1`!Bbn{pE-KXC~g&J>;6{s;uxeO7JAmZQS=+?jBP3v zdNWK%rEW7F=j3b)VsB0ezpSet(6&uGaJT$HNOQFsG}l^!nCYRq_o|Z}ny-yuZBM8< z?gLBOSDbs*&;SkCgZUR6(m0j3=I3^UOk``xOYRhk5c!J46`de5r9Cc)A@j zuP>IC-|li#nDe6Nxzm}WTRj9;9{l#$tkd}8{$-n-RvNFS-#=}7Aa(9WRqD!TetU~n zS63c*#yzaEWx?S2wNyUFdq=~-kX@fW3MwY$?G6}J1zg!sDqFRs;NhdA(dVxpfSy(O zz414;mA8E?akr)1^Bz_zV5`gRR&u}VOcGUnykDL60L-~!BlIFe-|D$5ZPQVl%hh&T zlAG@t7Wp)*gBzrYdCS4?Iv)0`7r^r^#}2BNgtu|k+qlKhjj;TClRSol;_gE|( zB*zk*kCw`qL)x{Xy;>{%i70L9-#@|xr+9#Y8PEiQGRizJxzYRGq{sAlVldVePw2Q#mPWxfmzrOv4b)0CSQi%&X zL==RHIgVYx-=FVQAZmmN2Z@oAoWO6iaeL3QY{i%UNLbMMmOE(2p%Xlpy-rn`I(35oXJ2vqmly^3T5&Jv{TI*e4*7+b!Fl@UFHB0f+Tgb{JsFhIA5F1G)a5-& z22tw?z5^sbQ|mhgxgmG1L*Q)bgUd(ziz<*G2u9m(L!_gi9pa6WdGXl`DNwa1mNfw8 zQ_F^Prb4ltSt+OhH!-d}6{0%$t~@;NI|L>KO7o@06M_dj2Tj235?guyJyVhsrSMLa0$d$K5qUdv{H8fA%YE`26`{%xRVb+e|*DZZZ@{Z-{eB?3{%-WF*WC%mWRkfIjAg9N+zn|B4$&*bYp$O4<6e0-hxpA)hL(nBV(sxdj-&qqfrEZQwvRQ z(GO7vLh0odOLqvA+6UkK{EPy(vT^kt4Tgl2)I4wc$Yal?2wbJTTb?IoUw?YDU}E$0 zFVE)9N+B>e{K(y7>({qQzd@r1y!%1N${)bnvzbIzo4qvq&=ijZ6Gjx9?-}5N$uA8W z!wtbC!wPMnr6Y)L7^(^bSEe3W$QhQ3NDdP((_o zp(i3pF*HF45FkkJkrD!gB;Uky?^<`Q`|n#{;Rh>(7>RK{DJ~;Z#F9|fj47ejq|A8y$+i&OCZrF0|Yb@>V{7Ym5Boz z{1pB3{O{qLA=?6%`u-m!%O}HuQbXk=0z8pc@Jf@V+cP#W$(#Q9Z4s}Kn4dyX6NYvi zEZlu8FsLyZ^plB_3G>oxEGDC{pc9kchcnI2ljc$0-K^BPnTRNSFlI87i5^uAuM2+4^uCT;8;-{>&^Ia9wun7u zTj}Eh^qFT<(vMgzPzVZAQbX&`2`J`|)tp7VJM4}wO=o3XWFHV%2U@!H)97f@VjOO* zN3w4hYpl4dgB21+=(|B-@nybcs~pyx?IgKk{xI@ue?=z1FC+3bXhwlVr`xMVE=N zf$`@p(Z1(d=Z9Z7ZJqG&c3u$)dBvp_a$Qn4EL&rL%%)8aJNBKg$}lm~>oUZIk3JiOfsC!~D^P zjpbX*_j4{@2R*7_q-5+X=b;ZOy{&-k$ zaX`hj^Gv#4K<91J|IepFo8xPHjNbg|7?tux@V^#P|Mz?)jJD~Y$NPqf$qG@=s!@@| z+acqhuOLY1&PAKX{+!&O|GkLqL^6L8FN5?cez`TrnB6Avb{|+taa4^SThC3$DyBiv z&Ht~LMfsnC{=8w^fJK`QY(HOPVs|^rr1v+n@%9ju$aaUaK8}V@xqPw0v?B&?ZgJqZ+bl_-CB| zZ@N&)Cn96r-TxtOsE)pxq)7Mc?3rX|#)T;Zdx5MMYjSOJ%|r^%N?S!g;ovlOI(*@8 zr7~IygqN$U{uUM%F&gZC?hd+*2xquaQGX}QUyYuPd+tGqZtBi4uPH1%>v;6=pMh(y z>B1h|dy36jvc+g4B|tAAT>PI)-{DhQ0s^FYEQ12$4jny2@e~SfT*UGmMsUU)+h6;F z<8FA74ULWIlI)3f)tFUD2?;)M<5TKt&8sHfTy8KGRxH|P0(+y&$|`^4h*-|1BSd-iV(SE?Lf6Y*nndcIrS4P!dly+PfvpulDSUv*og`?~aYD zs6n)Gr4*K4kr(uKXXlt>Wjk3K3?Q;0j=y_xF#nZb9&NaUOKM3I$zT}TuJ=#B?_Nca zJ3ClXCcIy)OVRytY;(N-Ms)P0Mx#fK>=AmKgpgOrW~>{EFuO|P%fRqh`*G1kQ4;J* z{>o|=I+#9mKVhD!gEy%>W+)nmb`KE_A2u?biiSGMXTIHG&d6d%FEK^QT30*-$WXLr)FV zAhr1==AV4qnwgS)xr-xmNSgyrO8$9C={ZSnaK-98_IOlmgAuVP*#+dIReaSATs*&M zFrg3J9bq&xi8ww6{%r?y!~l5`c6E(*Kb^c`d!pBhoF#?G2w zlVtsxy>1myeJgM?ie1fa(o<-vI!o@Wo~UqPpUK6Ckb(&oz9ocy8ijVaH>nmoWk`_( z%>%{C^KVGfX3@^0@>zE|?K;(1B>p;$t&1FB2HIzZR!NI8VOsVdWV;a6|s%#((CV%UTpR%ACDI zd!najm8i{HS@x6s=^DXW7+DKY@1#T%4l_FXw8Ncy(G{TvH*l zXS#EGc!lXR&BNv^M~iAs^-s(nTpYuSlIJBe)}K*%alBm0W}>SP)NG#JSr&aWpTjT@ z)hQliK_7igAKkoi5MK1evDav&{bwic>4uiwCr_xK7-B6dR%oz3R4Wmo_&@a8Tc;DMRg&^%9_l3~PQ41xUx;+jobo5z#^pvHb{-$G z{pr#iPZWB-sE1vx9Ul?)PCd>SAayk6qkmW$;0SXndiZ(ig+7P!EmWo&D=VL6!XFGyg2m z!mJis9V5!0p!gns9KYT5p&hJ;PHRXVztXavTYei;Y8nxKCH9b2yusW;GHpAFR+}sT z(~|q1)yXUJeWyk}Xl_;FEu(|y*=bbrQ`CEpeTT9KuqFNx`kgi^Z$v(~)>qx$*|Fs$ z*9nbUgmA;Qs3)z2x6%j3f)l~U-BaIpV~1B(#nMRiH3M7jo(?>9F?374f!iTQDuAY& zI(v12boiO^=p1%>CIcTnhSFwro23$aPi>rQsS`yJSerU*#!*QYMbj$pni-dqeod_n znWVM6fsK5M$Z#ATFBmk;_7lG{5Q^ z(Z%lvCz5B3%w&>J@ayjDW5r!d=8qyiG0Qfokvli-4RnneSTu9i4;^r1TI7yjhx_D( zJzTm;cH_staB-D=4iokj9QO>%F)8hH;A9EZNKz&a&_2#Mv0g9`zkMgyb2XAtqLoY^ zE4EN)+44g!7uQ_Wtaik+K*$qBJeCP#n~0u1C0}~Qf}5-91Pn#D&N_5F@{()lwwJ+6 zdvmXZ3LOBb^&L3RrWFCkaBmdd>l0|1UJU^pFD&#p;`yE*&%}|5rBRBTz|;h>N>hO59KgFD;T5f;2>895Uzp z_@hV17Kc!|kQf5n&!Kz&6a23ClkgY+BvalTcWK3+AS*o=Mf*FzvC=Lw$?-JHBa*B2 z(ssJ#_GhN9XTJK2d@j{PAu0HK5>pa)jKdA|!Q0*!5a8q)_?O`541it42U%pj*xs~29v~~%S zcc6>{mBs$xU>xtEr{>~fPCxPch5=jzZ@i~M2gM8e`rxHZ6Yp?t#rrO%8;hdBdu)@xRe-<$MeKU0?UQf!>Vh1* zGPW@L95b5X08Q^)yz!$!hq4qVr)yzqP8k+E!{~M}|5BVv=ho4(nG~zg!32 z#zTj44*otUE>4@6oXE76SKUl8Hi>YTB}l*d)ZJj=&X6wC%<<#n;u`q;;!YoiX<91i zp1dhU?4j3zj4DFMFLx7=cyEKss;co^s_IWUcgrogMsHgg58V$+NaR;O zC>=t51T>7b-GtwAyl-VC;3Z{xgkrSA_#w$XY-_edq zDWr5YKt$)6bs1q^jW&{I-!b1dqy2^~ffYW~QrYI6&eQbKh0Z<8B*;%iW_6xny#uQ8aHeJLWxS60rgR2XM)+d|HK)$pRMtZX%$o)wSD z&`#(#*y1v@T%AmJe+8jqi?mt{U$#hqlT(w$5;8B{kKlRav{HwI_?UOaXWG4!`Rgn6 zKnu4Vm5y7eJ12HoW7sa~kv1KA$=341=_o9KuIUg9qo$UPXj1GR2OBwy$=wmAlP+8> z{<{z7ZRh2!$<98GEyJ3uIKuvqj~|j!(mo4VQ%oi?QPxtSb%DQ1 z%x>Ff^;yQ-aAsnP8z~sA!1tPK_DY0=r`RzMnHNu`Q?_z*6`jtBlql`R%Vy1|nlQ{A z-`jq2m3FtYlg_1?-rUe?eKxc!{LNN1%;u9!s`O5dayuD2h7o3N%vw^Z6Dg7VC&1(; zA~#2bh4fnO|1)B9=6P92Dm}ZGH+V-6iNKv=&MU4>W90?{yh{jY5zVq(6w+w-EJJtolj0iPcpuYGd-$89(+B_-9_)payIJ-rPV z1~++~o{|76vp%beKF%KIxBV9uIOw}{4@;EI-duNF($raV|FQHeF3$3FJkH?lwdX)% zGCem}BBA5~U$?fjOoVU9k#pNN!h6XiIUtCI_56Mm4gV~uQJ6WaqoFY~O(+#BR#Ngl zxg(cU3w%#%YHCx{+QS<7rZ$z1U{X=v)4a33?32kvMP=o2X`Bce)VXDH`A6ZT6yBpa zTAxupJBqhVSqa=LAU7$syrD3H=YK+9Pd5hUayOsku*1s(=C-#z{fCs& zY0NW}Zc{Iok5CAV006K-Nf;te}xa|>q~=Ug7yYizn?jCW^bz3@_KdgJSh_W z3lW+yZ`VTGc5UBPfrNZHxeMmJ?<7JUM6R@6eK^{TdM#Ur!%@!vqS5KZwNh78wx+P~ z1s{s44cI;~H8L6PR$50IG||N-{nAt?$)BU`=UK`ErGEa`Wc-n3MA(Jw(mf>H2aV z=lPu&vjlhB*w)(QP;E#_j(hi6Nb2+ASJd_nJ>pJ*U5eln!Q z8|l`lLLRE#Ufvt-Gi=Ua$?rS+47CtxNtYM&^7(zFty{gLB}8BUFDwNS7EDO*#>zUnj;`nDPf?`04JXpFZ=W*Tz4@vEYm-!^V*`s| zeLd);5qIpjd*_y|j_n`AQa0^x@oR{>Evua|#4Ov`ki{vFwxz&=0F6$;U_3Vb`T6*Q z-@kuvn|-T);rAhN$R4*f&b2%R?_6)4N_MMkDTh0PX8+iBjrcZw_(rxgd>WG%yExZ! zWk1n$bFg2Rl9qQ?x91dRk;6AZkLu^PLi=t+(B0aNB{C2y6}Y{gt%4=v-O|=_J08n; z?Lm-0f4I@yT#5uO{@jeUxM;OxV^ahN!F{>vFL7CypwBPvO>h!=%7IcaWeo~1E(5=$ z9fxeneJ{Ls7j#w`(?D7}1#QCJBiB|98zUooMJZxyXXpgr+|vrr8#Bi~7$xOfXz_y# zo{Slhk-T@TS9DtROy(KB{{EJ;J}D&%qB@P!RC({`mXZ97LH41m5yV})G%reyQ2QKI zbWzBRv8u{<=48z`BE<94Wc=@x%6rX*P}DHEH7~{bTlU2yidwOD<*Ak?U|tGZ4-Geb zt#$}e;ExXp2^nuXiHvSq)kg7gP3Mv}2VR#Z4Rh=QYPW`yn=#%%KdyS|(aP$oB_aYy zi|V{9PCdGy2W!QCvtK#r7d_5UxVA4P#Yz3;=|>liSb7}t`-++4P5p;_>7ju>^lPdP zH8=m)*Wf+XME)^opIP$VXD|efC9IdR#vw=712?EO-4^Bv-}MfX7Y+Pz4=lE)3ls(^ z6jdzMK9!UiF=cri#mk-#Zs|Umv8N_1ObAiXw7NL#!Zq;J+5eJFy$aTSVz*~8Z&*%B zdir2O;Mnr|)WHH9Hk@=aab#swUj-cJ0Hjq1+&n!yy85pAFj~#i8YA)xI>{0%){|1W zCV%EE3qzfGvcarmLUpLwX!7L`$NE%ft&<-J2M6coUnm#aI@Hg}mgtNd^fG2WuvDTtaFWvV+pPyy?0>lEY!f944Gsk15 zFo;h~Ol+k^rofW2D3hhqUimm64(U!(mQ&M(Jv)(>mY>ThpaS@T7w1M~Sq8(S?^gM_)y*To+`_$km+sfox&3VVQ?gx#g3IKQ3jd zFCSg9yVX;>Q>~I(e~?MqURJSkb!^)0wMf^gSmLg02f&jCYiVf-6=U-k82JrP2fMpv z;BT`9?h2u;82=(r-*;iw_xFJ1;SAD$cUpR=%jViQld{0FNcO~;lj3|(^cOC{F-6* zzmFG{T5u+I+TJ1GZpO zc(`#+VglKhbk9xuc<~q5qDGh|$$(a>0min|>asvLYl2A!$n)3?Ndk)#30li**6>rR z#ifpGOzqR*bL-&#GK9ycPO57u^uH+^`l&?yZFWT@%k zU|pGuvshmYTcXi~qz@(^U5rq(HK?QECUYbEOfI{3?y70<@uT`Fi&{Cpb>9;)RfDdw z@kDKV;5ce~{+WW5&{4ufPLTj%Waz%lYFWYF)6A`cPnsK1P-;MJDN`G4AJC z91t#62CrRP!=R4*HyGGMIXMS2x_@TLSzyPnkRi~Wpvn~=z z&OF~b0WZhHl|M2Y(Fg&m@YV+}+7@g%rc-aPzW9Bs$g`1=kwdl%UR{i?)Io02nv~$4 zwR)3_6W^aZG^kRwRFd(7e{E@>NF>&r*#FlLgWfBAZbR|u(#F~?+q_mMh%mZ=L`)|7Z@dWN|2W?ZM6#HQjXMA8 z8b$L5Vymkpp9s)mb;kAsgY=c2$a8Z%6N0{Jje2M_8-rQA>v}jMm_p3qD|`f8t(a#$N%irfV7i7AtCM9tu-_9vkvJ zjKc5e=(sPPmiOWIsmCDwo*BJltDegbY1-GwMt78db@A3t-zb=3$~H=Z?ONd$))>tZ zPLXy9A1&E!`LV6->W?U|%(tN`uZ+0dTg!W5=TDfuhdnokAO5Pmx*j5t5jf72I%}~V z-!cvSA*kJ#0KtF7WZU1RHx5jnFvR7iODBLGFB*azztTu#M zt=O-fR@bgLXs)c%EZ8SLuFYR;4eWKVqwrYIhUnTn+cF(#cuu4vM35FhmOHZiKxwhp z;vn~dzN`9?hkuV?)=VSq zwhb0W;>v#vrBTq%4Kd9O`MH(TYnKl^?HNJ@)vA zEi-56ngVo&ZReul#fx7d>YARPe*tjQ0>UFu2*^kI-FOUG&(q)EOhZ%i!?k14EV60n zFzle;H8hNZ2CT%^G}Ux!0HTqkI7P5YKGNJPB?aZ#e;MfKBMF#Z^-1W2a~F2>78ku{ z?Jw1>E*RweyN|2-@D5Q{#zna2jqF>CwgBOa^>z0}{1?NiQA1$|dS3x#FsA2cjqH9O ziBWtNlO-FrapIniK=;~W?}m#eULs&URQt)S#!mSIv2UX#&rf zFPQ2ZdO9*%f6-t-<{hHpK;IBMBW%?I>OU4LCIu0=lHI_5?hVaoau6J{gs;z@?Xf^2 zP2580Bk-iZ>Z16^dkgO`%@wzQ#J%RSOoM_rz8* zr?tJ^>iFNCi>=?{rQ=fG zbG>JSpa)4F6}E9zO*Xy6#l?G)hGT^l9;dF{y05tt@A>OOd1a9lQX@z)m>LTu6Gn0- z-@z!;V4oiUQZG}H+Z4C&y3d5F?RIlSK?+xFboEN7(N%}LqxOL?J!A0rX8-Lo0~?2s zKtdG1IUBI@NW55oKJPOxD9XB~Z|CK8_5``1;c@h(TR1p> zU3vAFav2k+1|}vx=3=o{#$QGj$^HFy zK0Y`5`}@b>(RxN_n+fmV{|#K1@=yUJw6g=ji@1$OqdzI(OTXVM=4Orf0j^8E}os1)3((ItxTOYUYjzEGVCMcMf3@+4#sa8LeOhPGS3;9-inJK*nQzkdAFWEz@~9(hfQJQ)Ga z1}KP4;PW(SPHtW;q%y*LdwR_LG~3fPg*`kxG^$t)`|b#nw1u$ja{~`Y@3Ff!P$*O~ zoQnAlRXy)~-no>p4u$XNfyvB5n86&pXEX2+L4pnhgfDMP$w*6rL{Um=>QV~{*2sDr z3V&^pLVlu9l)jeg)?j}0=+V2?=cULo*w%W51+%?@9580zq3A5)4vGFI$Z)BF<$U5M zXUF*@guf2G^S$HVw;q4SLYvOio~T&+-+(VLJr(n}tA6YndUi;)nnv@Ro|^I$MH)h2 z*Fz$Gu*`bX_gUsOthmk}Kdu*w^}hr|bPN;S1nvKG^YWTOE%Qih05|65W_Dp=HXcLO z)6?x68y~Dx zLyCd>8f+%@m3#Lxx~BVVtLMT%#cxPN74=PdixRCvNS-<=R^rmkuwimmpKv^3iB%~^owLbYHXyR}r9|I%{=v7rwQE-(`kCl(v zAC$WLT$1d8R6FM_9(Y(@*VsdI`qC1F5mdu!{}WVrcxm9`MnSf1dNSm`l8=!+VZWjn zFPTctMo?ga-TAj%fjF0@QK8~UaP?CE{kBEFs^?U}p47mpZK^{8Md`a=EkdQ`DHtc{ z@sBC0VO%fz6AL6XzTB=ufrTOyDB4)f9~cy5@iIAi{Ac#f9!;L^m!gnD2w6;VPFoyh z^ntR6PB%xFxaXM2Z)h+wsa2`lI@BEI2HRp=m*!Du&CrPy$1$h_^ag%uClQamTQRY1 zBp@O=A&C5-)QL+zOzOW{qtHudc1-O48A7cQ{?<_&QS-7;WX3%$HbqryAzobbKuy-< zCa9WY90p{$PFo$r&6c_4s7nV;mpRXYFk!A^3a zs;VmIS+JImnY+J8I$=RAVNYa|_%D^8m)ERi9@18I$i9b0v53x09hOTZ zW<^3Ly!z;`*{P|5@FN{-{e3a*Tg%J$eluZpFYx&3C1Y|9@2GZ(sW3uF?#>@UPmdug zz!80Fb`mriZt3Ni`__q(Co1GYSuuxS6v9`aW&AMVq!N)rWdKz%W(mt4SN)t zL*kWLn$+si6no7U_=XF!{0UX6ExcDgZ2?(2QqQ;_;x&9X4e-%fg5bwK-|W24%5?|P zIxM!bCL~;boqD2e&@RLKLVgdiaQ}KwO0Xbe6dBEt0na*AA;3L0MT@3DI{- z$}Zk-qn-V<(=j!(@QRu>_zssRcTs;8{FRBmDG2NMU8w7emAKKZ!V%u(0ZmWaSa z>pficj(2Q!J^T`zT>JWkhpf$ryY}ysJGQi638oHKInJ|2gW>S;esE3-8(~0bH)5S> zj|)Tk_ml^BZiZ)8xH*NXqJ~yDtFe@1o1>Ohz1r{kHvg;BiV~fs_2rUTP1X^)+Hd<_ zaVLy9*8HsSnf$tzl;KW^%tGpojX1YI>kRR9_W;*{zKyC1U@-2Ejr8$4Ke3rT$YI}` zS_*MgurA*VhV$nPeQ;(U76`yTOPB+uY}a9j-lLS|AUyMmI2GOC8P~M$a2fw%gdb#A zHgcd9IAKW3)0uluNz1v%I9LjLiFs^{HI_un5jI>-?yUA2eLTqsFE1?>lBsj9kZUp+ zsUWvFiaK6&hnU~p@*b(5!f&;dGlHbsT~=Hd>dRjaE^eoN=i_R9!!JF^&xrTniI6>$ zQU3Y>o@ySt?Ln;E^;CWxuXP$Pq6+dS@J!wF^Hi#do9sCRLY8SE=IQBt|Ni@tm^v@# zR~C8ZkHM77;O)e}{1Qa>cI#nkFKpTUMy7o2^P`&2xPbcRF7#nt6cAy$dD;nk(3FFtP+xR=S4A>?_lK7^q`F`KcQ&U85d8~obHF4qhc z87yR;wvdD_?&k((k-7TqAcm(yFmbc3?%a3FusQz>uO5jAnZ%lqh^{f9DlpSQyStyh zT$B{pxg0)SR|R0h4&Im^;nFpQ{V~gnf)sk1!%st;Ov;L**O%H4vm|VYL*n3Hhysg? z7_L2U`bLUtcr9WKVG8V}Yv$D4Kk*+H*$^_oISUT_)tveA$LgFKm)L&Jp@uIK(_fP2 zxsMqivpTYFns?iQt8a9h-g94(KOta2oX8!{i~qexBm!lpA@qE1fTzmYK;)_zwYA)U zIn1lGgGNE&*FPqISaXCAr4F7`hJD4k0;xMhtt;w6tIt}s-pR8acu@V3wjAsPDM75dJ!^r<%xO> zs0;O4I|Br(5g~ghJadfjDMmQ#aKolkGSPslT;uEa-4i%Xrsz1Fin`y-zppg|+8{my zY=_bCy9_4j9sO#$h77I@7=_mK)|QA0M4|%W6mtE$`54?SK{H^XDP1$5K2%5hWcS>f zLe0vJZUO;}`x1QADi&+MS0D($!h3p)ev7ga?q#z-vy0XD=ULAg{=Kt6HVEPb4#cl% zV0$FV68I&xpE{s94iJ>qd*&Ma6L`DOj-A-K@yi=BPjDY@ou& za42-y*aYpnn*IKL-DN?$26K*q#eO#v+^-PX7XI;p#eqZQjD}UDjZI#lX$fIak0W}q z7CdH4UULS%a=%G_C{kEF1P$fhZYnASmRa!qwQB68b z9--mMjMi(Xxo>8KE+M3dS7*B`@}!SV|G7GuwP;svQNqlTsd08?LnGH&#BUuYKU*o6 z9?~OS$h5%vK>ESrCSf}a^?iz@xoPQ`Ih9ZYMy3p!NuFNi98ds1sC55?@k96Q7n{d~ z5gi^o|v$ZLlifJvxn;0qu#bmRTJR zKgLFY>_>?HK-L*l3#x<1;7_R{n~TCcdI&@j(=?S#dBkQ#5oTjH^P{6T=km}=>ro!= zq$o}HD1}LEA*n+-Q0`liVOZIz>5RBIzDc8ZWHNai0*shv4MQD!pXo|G6u7M|O#)u(>+S7b#N?TBl{)lv^|JB`Za^*0;T+M+5h#G&rxg@p zwYe?rGQ&}eCirkd}RNE6T>&?=buKrv8^<@y&C(?#E)l^!{GT8ISrVk{gO|0^Q zjR;l_<@W>xxIQ+Sriu!l$Z>~7skb-Kp(v%kuDs=yr9_%Z?GRB5gG)pvq!X)hTDi;^ zRBKPIT~ooU=63YeGWE5$i!jNDw8A!kT(=01mtUm2)uWeNRkfC@;*8}bG=$8lZ>^>L z4D=)+>`OJBkEGP;1`wj{m}CqG0d2JKOidrN7uh9$4B23WOBl$U|l Date: Fri, 28 Aug 2015 17:33:52 +0200 Subject: [PATCH 14/24] Fix Say ":i" working with intercoms, re-add restraint check for Say ":i" See also commits: e9d9ff57ba74386cfc0560997ca7d3e8416c2b6e bbc8ad6383f7c37959a163e9aa0e81f9c7905a5d b9dbeeb3562e46dc2914bf039ad47035bc8b1112 --- code/modules/mob/living/carbon/human/say.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index bbf1844c45b..1fd82ed230f 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -165,10 +165,11 @@ /mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) switch(message_mode) if("intercom") - for(var/obj/item/device/radio/intercom/I in view(1)) - I.talk_into(src, message, verb, speaking) - I.add_fingerprint(src) - used_radios += I + if(!src.restrained()) + for(var/obj/item/device/radio/intercom/I in view(1)) + I.talk_into(src, message, null, verb, speaking) + I.add_fingerprint(src) + used_radios += I if("headset") if(l_ear && istype(l_ear,/obj/item/device/radio)) var/obj/item/device/radio/R = l_ear From 8046fa0fb2191fbf14f43346c7e6e55755cb3fe0 Mon Sep 17 00:00:00 2001 From: Sligneris Date: Sat, 29 Aug 2015 02:34:08 +0200 Subject: [PATCH 15/24] "Junior Officer" alt-title Adds "Junior Officer" as an alternative job title to Security Officers. Pros: - replaces "Security Cadet" as a title that signalizes lesser experience, - opens up roleplay possibilities, - gives no potential room for slot abuse, - gives a reason for a character to make mistakes, allowing for some antag opportunities! Cons: - gives a reason for a character to make mistakes. --- code/game/jobs/job/security.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 4e3a2544f98..29bbb67cca6 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -96,7 +96,6 @@ economic_modifier = 5 access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels) minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels) - alt_titles = list("Forensic Technician") minimal_player_age = 3 equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -135,6 +134,7 @@ spawn_positions = 4 supervisors = "the head of security" selection_color = "#ffeeee" + alt_titles = list("Junior Officer") economic_modifier = 4 access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks) From 22262507b9a5c3712f3ea16458ea71e23562895a Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Sat, 29 Aug 2015 10:03:58 +0200 Subject: [PATCH 16/24] Only living mobs now trigger shrapnel. Fixes issue with manually moving ghosts would step on shrapnel, with glass noise and all. On dev this issue is expanded further as all known movements means use forceMove. --- code/game/objects/items/weapons/material/shards.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index 2f395f2ed0f..b4c12f5ad1b 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -61,9 +61,9 @@ return ..() /obj/item/weapon/material/shard/Crossed(AM as mob|obj) - if(ismob(AM)) + if(isliving(AM)) var/mob/M = AM - M << "\red You step on \the [src]!" + M << "You step on \the [src]!" playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds if(ishuman(M)) var/mob/living/carbon/human/H = M From 92d3e6d2402727c6c7ec5fbbc4535acc85301f85 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sun, 30 Aug 2015 11:45:54 +0930 Subject: [PATCH 17/24] Fixes Yongauni#155 --- code/modules/mob/living/carbon/human/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1fe6843ce65..cd3d8bf07de 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1371,7 +1371,7 @@ handle_regular_hud_updates() /mob/living/carbon/human/Check_Shoegrip() - if((shoes.item_flags & NOSLIP) && istype(shoes, /obj/item/clothing/shoes/magboots)) //magboots + dense_object = no floating + if(shoes && (shoes.item_flags & NOSLIP) && istype(shoes, /obj/item/clothing/shoes/magboots)) //magboots + dense_object = no floating return 1 return 0 From 080e07976ab01f802ca3e4801ee21a8179b73dd4 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Sun, 30 Aug 2015 15:08:39 +0200 Subject: [PATCH 18/24] Removes duplicate camera network definitions. --- code/__defines/machinery.dm | 2 +- code/setup.dm | 984 ------------------------------------ 2 files changed, 1 insertion(+), 985 deletions(-) delete mode 100644 code/setup.dm diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm index 5fc66791c67..13df4a5160e 100644 --- a/code/__defines/machinery.dm +++ b/code/__defines/machinery.dm @@ -43,8 +43,8 @@ var/list/restricted_camera_networks = list("thunder","ERT","NUKE","Secret") #define NETWORK_MINE "MINE" #define NETWORK_RESEARCH "Research" #define NETWORK_RESEARCH_OUTPOST "Research Outpost" -#define NETWORK_PRISON "Prison" #define NETWORK_ROBOTS "Robots" +#define NETWORK_PRISON "Prison" #define NETWORK_SECURITY "Security" #define NETWORK_TELECOM "Tcomsat" #define NETWORK_THUNDER "thunder" diff --git a/code/setup.dm b/code/setup.dm deleted file mode 100644 index 1433e1b8bd4..00000000000 --- a/code/setup.dm +++ /dev/null @@ -1,984 +0,0 @@ -#define DEBUG - -#define GAME_STATE_PREGAME 1 -#define GAME_STATE_SETTING_UP 2 -#define GAME_STATE_PLAYING 3 -#define GAME_STATE_FINISHED 4 - -// Math constants. -#define M_E 2.71828183 -#define M_PI 3.14159265 -#define M_SQRT2 1.41421356 - -#define R_IDEAL_GAS_EQUATION 8.31 // kPa*L/(K*mol). -#define ONE_ATMOSPHERE 101.325 // kPa. -#define IDEAL_GAS_ENTROPY_CONSTANT 1164 // (mol^3 * s^3) / (kg^3 * L). - -// Radiation constants. -#define STEFAN_BOLTZMANN_CONSTANT 5.6704e-8 // W/(m^2*K^4). -#define COSMIC_RADIATION_TEMPERATURE 3.15 // K. -#define AVERAGE_SOLAR_RADIATION 200 // W/m^2. Kind of arbitrary. Really this should depend on the sun position much like solars. -#define RADIATOR_OPTIMUM_PRESSURE 3771 // kPa at 20 C. This should be higher as gases aren't great conductors until they are dense. Used the critical pressure for air. -#define GAS_CRITICAL_TEMPERATURE 132.65 // K. The critical point temperature for air. - -/* - The pipe looks to be thin vertically and wide horizontally, so we'll assume that it's - three centimeters thick, one meter wide, and only explosed to the sun 3 degrees off of edge-on. - Since the radiatior is uniform along it's length, the ratio of surface area touched by sunlight - to the total surface area is the same as the ratio of the perimeter of the cross-section. -*/ -#define RADIATOR_EXPOSED_SURFACE_AREA_RATIO 0.04 // (3 cm + 100 cm * sin(3deg))/(2*(3+100 cm)). Unitless ratio. - -#define CELL_VOLUME 2500 // Liters in a cell. -#define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) // Moles in a 2.5 m^3 cell at 101.325 kPa and 20 C. - -#define O2STANDARD 0.21 // Percentage. -#define N2STANDARD 0.79 - -#define MOLES_PHORON_VISIBLE 0.7 // Moles in a standard cell after which phoron is visible. -#define MOLES_O2STANDARD (MOLES_CELLSTANDARD * O2STANDARD) // O2 standard value (21%) -#define MOLES_N2STANDARD (MOLES_CELLSTANDARD * N2STANDARD) // N2 standard value (79%) - -// These are for when a mob breathes poisonous air. -#define MIN_TOXIN_DAMAGE 1 -#define MAX_TOXIN_DAMAGE 10 - -#define BREATH_VOLUME 0.5 // Liters in a normal breath. -#define BREATH_MOLES (ONE_ATMOSPHERE * BREATH_VOLUME / (T20C * R_IDEAL_GAS_EQUATION)) // Amount of air to take a from a tile -#define BREATH_PERCENTAGE (BREATH_VOLUME / CELL_VOLUME) // Amount of air needed before pass out/suffocation commences. -#define HUMAN_NEEDED_OXYGEN (MOLES_CELLSTANDARD * BREATH_PERCENTAGE * 0.16) - -#define SOUND_MINIMUM_PRESSURE 10 - -// Pressure limits. -#define HAZARD_HIGH_PRESSURE 550 // This determines at what pressure the ultra-high pressure red icon is displayed. (This one is set as a constant) -#define WARNING_HIGH_PRESSURE 325 // This determines when the orange pressure icon is displayed (it is 0.7 * HAZARD_HIGH_PRESSURE) -#define WARNING_LOW_PRESSURE 50 // This is when the gray low pressure icon is displayed. (it is 2.5 * HAZARD_LOW_PRESSURE) -#define HAZARD_LOW_PRESSURE 20 // This is when the black ultra-low pressure icon is displayed. (This one is set as a constant) - -#define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 // This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount. -#define BODYTEMP_AUTORECOVERY_DIVISOR 12 // This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive. -#define BODYTEMP_AUTORECOVERY_MINIMUM 1 // Minimum amount of kelvin moved toward 310.15K per tick. So long as abs(310.15 - bodytemp) is more than 50. -#define BODYTEMP_COLD_DIVISOR 6 // Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster. -#define BODYTEMP_HEAT_DIVISOR 6 // Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is higher than their body temperature. Make it lower to gain bodytemp faster. -#define BODYTEMP_COOLING_MAX -30 // The maximum number of degrees that your body can cool down in 1 tick, when in a cold area. -#define BODYTEMP_HEATING_MAX 30 // The maximum number of degrees that your body can heat up in 1 tick, when in a hot area. - -#define BODYTEMP_HEAT_DAMAGE_LIMIT 360.15 // The limit the human body can take before it starts taking damage from heat. -#define BODYTEMP_COLD_DAMAGE_LIMIT 260.15 // The limit the human body can take before it starts taking damage from coldness. - -#define SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE 2.0 // What min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0. -#define SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE 2.0 // What min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0. -#define HELMET_MIN_COLD_PROTECTION_TEMPERATURE 160 // For normal helmets. -#define ARMOR_MIN_COLD_PROTECTION_TEMPERATURE 160 // For armor. -#define GLOVES_MIN_COLD_PROTECTION_TEMPERATURE 2.0 // For some gloves. -#define SHOE_MIN_COLD_PROTECTION_TEMPERATURE 2.0 // For shoes. - -#define SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE 5000 // These need better heat protect, but not as good heat protect as firesuits. -#define FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE 30000 // What max_heat_protection_temperature is set to for firesuit quality headwear. MUST NOT BE 0. -#define FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE 30000 // For fire-helmet quality items. (Red and white hardhats) -#define HELMET_MAX_HEAT_PROTECTION_TEMPERATURE 600 // For normal helmets. -#define ARMOR_MAX_HEAT_PROTECTION_TEMPERATURE 600 // For armor. -#define GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE 1500 // For some gloves. -#define SHOE_MAX_HEAT_PROTECTION_TEMPERATURE 1500 // For shoes. - -// Fire. -#define FIRE_MIN_STACKS -20 -#define FIRE_MAX_STACKS 25 -#define FIRE_MAX_FIRESUIT_STACKS 20 // If the number of stacks goes above this firesuits won't protect you anymore. If not, you can walk around while on fire like a badass. - -#define THROWFORCE_SPEED_DIVISOR 5 // The throwing speed value at which the throwforce multiplier is exactly 1. -#define THROWNOBJ_KNOCKBACK_SPEED 15 // The minumum speed of a w_class 2 thrown object that will cause living mobs it hits to be knocked back. Heavier objects can cause knockback at lower speeds. -#define THROWNOBJ_KNOCKBACK_DIVISOR 2 // Affects how much speed the mob is knocked back with. - -#define PRESSURE_DAMAGE_COEFFICIENT 4 // The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE. -#define MAX_HIGH_PRESSURE_DAMAGE 4 // This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :( -#define LOW_PRESSURE_DAMAGE 2 // The amount of damage someone takes when in a low pressure area. (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). - -// Doors! -#define DOOR_CRUSH_DAMAGE 10 - -#define HUNGER_FACTOR 0.05 // Factor of how fast mob nutrition decreases -#define REM 0.2 // Means 'Reagent Effect Multiplier'. This is how many units of reagent are consumed per tick -#define CHEM_TOUCH 1 -#define CHEM_INGEST 2 -#define CHEM_BLOOD 3 -#define MINIMUM_CHEMICAL_VOLUME 0.01 -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 -#define REAGENTS_OVERDOSE 30 - -#define MINIMUM_AIR_RATIO_TO_SUSPEND 0.05 // Minimum ratio of air that must move to/from a tile to suspend group processing -#define MINIMUM_AIR_TO_SUSPEND (MOLES_CELLSTANDARD * MINIMUM_AIR_RATIO_TO_SUSPEND) // Minimum amount of air that has to move before a group processing can be suspended -#define MINIMUM_MOLES_DELTA_TO_MOVE (MOLES_CELLSTANDARD * MINIMUM_AIR_RATIO_TO_SUSPEND) // Either this must be active -#define MINIMUM_TEMPERATURE_TO_MOVE (T20C + 100) // or this (or both, obviously) - -#define MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND 0.012 // Minimum temperature difference before group processing is suspended. -#define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 -#define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 // Minimum temperature difference before the gas temperatures are just set to be equal. -#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION (T20C + 10) -#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION (T20C + 200) - -// Must be between 0 and 1. Values closer to 1 equalize temperature faster. Should not exceed 0.4, else strange heat flow occurs. -#define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4 -#define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 -#define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0 -#define SPACE_HEAT_TRANSFER_COEFFICIENT 0.2 // A hack to partly simulate radiative heat. -#define OPEN_HEAT_TRANSFER_COEFFICIENT 0.4 -#define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 // A hack for now. - -// Fire damage. -#define CARBON_LIFEFORM_FIRE_RESISTANCE (T0C + 200) -#define CARBON_LIFEFORM_FIRE_DAMAGE 4 - -// Phoron fire properties. -#define PHORON_MINIMUM_BURN_TEMPERATURE (T0C + 126) //400 K - autoignite temperature in tanks and canisters - enclosed environments I guess -#define PHORON_FLASHPOINT (T0C + 246) //519 K - autoignite temperature in air if that ever gets implemented. - -//These control the mole ratio of oxidizer and fuel used in the combustion reaction -#define FIRE_REACTION_OXIDIZER_AMOUNT 3 //should be greater than the fuel amount if fires are going to spread much -#define FIRE_REACTION_FUEL_AMOUNT 2 - -//These control the speed at which fire burns -#define FIRE_GAS_BURNRATE_MULT 1 -#define FIRE_LIQUID_BURNRATE_MULT 1 - -//If the fire is burning slower than this rate then the reaction is going too slow to be self sustaining and the fire burns itself out. -//This ensures that fires don't grind to a near-halt while still remaining active forever. -#define FIRE_GAS_MIN_BURNRATE 0.01 -#define FIRE_LIQUD_MIN_BURNRATE 0.01 - -//How many moles of fuel are contained within one solid/liquid fuel volume unit -#define LIQUIDFUEL_AMOUNT_TO_MOL 1 //mol/volume unit - -#define T0C 273.15 // 0.0 degrees celcius -#define T20C 293.15 // 20.0 degrees celcius -#define TCMB 2.7 // -270.3 degrees celcius - -// XGM gas flags. -#define XGM_GAS_FUEL 1 -#define XGM_GAS_OXIDIZER 2 -#define XGM_GAS_CONTAMINANT 4 - -#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) // Tank starts leaking. -#define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) // Tank spills all contents into atmosphere. -#define TANK_FRAGMENT_PRESSURE (50.*ONE_ATMOSPHERE) // Boom 3x3 base explosion. -#define TANK_FRAGMENT_SCALE (10.*ONE_ATMOSPHERE) // +1 for each SCALE kPa above threshold. Was 2 atm. - -#define HUMAN_STRIP_DELAY 40 // Takes 40ds = 4s to strip someone. -#define ALIEN_SELECT_AFK_BUFFER 1 // How many minutes that a person can be AFK before not being allowed to be an alien. -#define NORMPIPERATE 30 // Pipe-insulation rate divisor. -#define HEATPIPERATE 8 // Heat-exchange pipe insulation. -#define FLOWFRAC 0.99 // Fraction of gas transfered per process. -#define SHOES_SLOWDOWN -1.0 // How much shoes slow you down by default. Negative values speed you up. - -// Item inventory slot bitmasks. -#define SLOT_OCLOTHING 1 -#define SLOT_ICLOTHING 2 -#define SLOT_GLOVES 4 -#define SLOT_EYES 8 -#define SLOT_EARS 16 -#define SLOT_MASK 32 -#define SLOT_HEAD 64 -#define SLOT_FEET 128 -#define SLOT_ID 256 -#define SLOT_BELT 512 -#define SLOT_BACK 1024 -#define SLOT_POCKET 2048 // This is to allow items with a w_class of 3 or 4 to fit in pockets. -#define SLOT_DENYPOCKET 4096 // This is to deny items with a w_class of 2 or 1 from fitting in pockets. -#define SLOT_TWOEARS 8192 -#define SLOT_TIE 16384 -#define SLOT_HOLSTER 32768 //16th bit - -// Flags bitmasks. -#define STOPPRESSUREDAMAGE 1 // This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere - // To successfully stop you taking all pressure damage you must have both a suit and head item with this flag. -#define NOBLUDGEON 2 // When an item has this it produces no "X has been hit by Y with Z" message with the default handler. -#define AIRTIGHT 4 // Functions with internals. -#define USEDELAY 8 // 1 second extra delay on use. (Can be used once every 2s) -#define NOSHIELD 16 // Weapon not affected by shield. -#define CONDUCT 32 // Conducts electricity. (metal etc.) -#define ON_BORDER 64 // Item has priority to check when entering or leaving. -#define NOBLOODY 512 // Used for items if they don't want to get a blood overlay. -#define NODELAY 8192 // 1 second attack-by delay skipped (Can be used once every 0.2s). Most objects have a 1s attack-by delay, which doesn't require a flag. - -//Use these flags to indicate if an item obscures the specified slots from view, whereas body_parts_covered seems to be used to indicate what body parts the item protects. -#define GLASSESCOVERSEYES 256 -#define MASKCOVERSEYES 256 // Get rid of some of the other retardation in these flags. -#define HEADCOVERSEYES 256 // Feel free to reallocate these numbers for other purposes. -#define MASKCOVERSMOUTH 512 // On other items, these are just for mask/head. -#define HEADCOVERSMOUTH 512 - -#define THICKMATERIAL 256 // From /tg/station: prevents syringes, parapens and hyposprays if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with NOSLIP for shoes) -#define NOSLIP 256 // Prevents from slipping on wet floors, in space, etc. -#define OPENCONTAINER 1024 // Is an open container for chemistry purposes. -#define BLOCK_GAS_SMOKE_EFFECT 2048 // Blocks the effect that chemical clouds would have on a mob -- glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL) -#define PHORONGUARD 4096 // Does not get contaminated by phoron. -#define NOREACT 4096 // Reagents don't react inside this container. -#define BLOCKHEADHAIR 4 // Temporarily removes the user's hair overlay. Leaves facial hair. -#define BLOCKHAIR 8192 // Temporarily removes the user's hair, facial and otherwise. - -// Flags for pass_flags. -#define PASSTABLE 1 -#define PASSGLASS 2 -#define PASSGRILLE 4 -#define PASSBLOB 8 - -// Turf-only flags. -#define NOJAUNT 1 // This is used in literally one place, turf.dm, to block ethereal jaunt. - -// Bitmasks for the flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses. -// WARNING: The following flags apply only to the external suit! -#define HIDEGLOVES 1 -#define HIDESUITSTORAGE 2 -#define HIDEJUMPSUIT 4 -#define HIDESHOES 8 -#define HIDETAIL 16 - -// WARNING: The following flags apply only to the helmets and masks! -#define HIDEMASK 1 -#define HIDEEARS 2 // Headsets and such. -#define HIDEEYES 4 // Glasses. -#define HIDEFACE 8 // Dictates whether we appear as "Unknown". - -// Slots. -#define slot_back 1 -#define slot_wear_mask 2 -#define slot_handcuffed 3 -#define slot_l_hand 4 -#define slot_r_hand 5 -#define slot_belt 6 -#define slot_wear_id 7 -#define slot_l_ear 8 -#define slot_glasses 9 -#define slot_gloves 10 -#define slot_head 11 -#define slot_shoes 12 -#define slot_wear_suit 13 -#define slot_w_uniform 14 -#define slot_l_store 15 -#define slot_r_store 16 -#define slot_s_store 17 -#define slot_in_backpack 18 -#define slot_legcuffed 19 -#define slot_r_ear 20 -#define slot_legs 21 -#define slot_tie 22 - -// Inventory slot strings. -// since numbers cannot be used as associative list keys. -#define slot_back_str "back" -#define slot_l_hand_str "slot_l_hand" -#define slot_r_hand_str "slot_r_hand" -#define slot_w_uniform_str "w_uniform" -#define icon_head "slot_head" - -// Bitflags for clothing parts. -#define HEAD 1 -#define FACE 2 -#define EYES 4 -#define UPPER_TORSO 8 -#define LOWER_TORSO 16 -#define LEG_LEFT 32 -#define LEG_RIGHT 64 -#define LEGS 96 // LEG_LEFT | LEG_RIGHT -#define FOOT_LEFT 128 -#define FOOT_RIGHT 256 -#define FEET 384 // FOOT_LEFT | FOOT_RIGHT -#define ARM_LEFT 512 -#define ARM_RIGHT 1024 -#define ARMS 1536 // ARM_LEFT | ARM_RIGHT -#define HAND_LEFT 2048 -#define HAND_RIGHT 4096 -#define HANDS 6144 // HAND_LEFT | HAND_RIGHT -#define FULL_BODY 8191 - -// Bitflags for the percentual amount of protection a piece of clothing which covers the body part offers. -// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection(). -// The values here should add up to 1, e.g., the head has 30% protection. -#define THERMAL_PROTECTION_HEAD 0.3 -#define THERMAL_PROTECTION_UPPER_TORSO 0.15 -#define THERMAL_PROTECTION_LOWER_TORSO 0.15 -#define THERMAL_PROTECTION_LEG_LEFT 0.075 -#define THERMAL_PROTECTION_LEG_RIGHT 0.075 -#define THERMAL_PROTECTION_FOOT_LEFT 0.025 -#define THERMAL_PROTECTION_FOOT_RIGHT 0.025 -#define THERMAL_PROTECTION_ARM_LEFT 0.075 -#define THERMAL_PROTECTION_ARM_RIGHT 0.075 -#define THERMAL_PROTECTION_HAND_LEFT 0.025 -#define THERMAL_PROTECTION_HAND_RIGHT 0.025 - -// Bitflags for mutations. -#define STRUCDNASIZE 27 -#define UNIDNASIZE 13 - -// Generic mutations: -#define TK 1 -#define COLD_RESISTANCE 2 -#define XRAY 3 -#define HULK 4 -#define CLUMSY 5 -#define FAT 6 -#define HUSK 7 -#define NOCLONE 8 -#define LASER 9 // Harm intent - click anywhere to shoot lasers from eyes. -#define HEAL 10 // Healing people with hands. - -#define SKELETON 29 -#define PLANT 30 - -// Other Mutations: -#define mNobreath 100 // No need to breathe. -#define mRemote 101 // Remote viewing. -#define mRegen 102 // Health regeneration. -#define mRun 103 // No slowdown. -#define mRemotetalk 104 // Remote talking. -#define mMorph 105 // Hanging appearance. -#define mBlend 106 // Nothing. (seriously nothing) -#define mHallucination 107 // Hallucinations. -#define mFingerprints 108 // No fingerprints. -#define mShock 109 // Insulated hands. -#define mSmallsize 110 // Table climbing. - -// disabilities -#define NEARSIGHTED 1 -#define EPILEPSY 2 -#define COUGHING 4 -#define TOURETTES 8 -#define NERVOUS 16 - -// sdisabilities -#define BLIND 1 -#define MUTE 2 -#define DEAF 4 - -// /mob/var/stat things. -#define CONSCIOUS 0 -#define UNCONSCIOUS 1 -#define DEAD 2 - -// Channel numbers for power. -#define EQUIP 1 -#define LIGHT 2 -#define ENVIRON 3 -#define TOTAL 4 // For total power used only. - -// Bitflags for machine stat variable. -#define BROKEN 1 -#define NOPOWER 2 -#define POWEROFF 4 // TBD. -#define MAINT 8 // Under maintenance. -#define EMPED 16 // Temporary broken by EMP pulse. - -// Bitmasks for door switches. -#define OPEN 1 -#define IDSCAN 2 -#define BOLTS 4 -#define SHOCK 8 -#define SAFE 16 - -// Metal sheets, glass sheets, and rod stacks. -#define MAX_STACK_AMOUNT_METAL 50 -#define MAX_STACK_AMOUNT_GLASS 50 -#define MAX_STACK_AMOUNT_RODS 60 - -#define GAS_O2 (1 << 0) -#define GAS_N2 (1 << 1) -#define GAS_PL (1 << 2) -#define GAS_CO2 (1 << 3) -#define GAS_N2O (1 << 4) - -#define IS_MODE_COMPILED(MODE) (ispath(text2path("/datum/game_mode/"+(MODE)))) - -// Damage things. TODO: Merge these down to reduce on defines. -// Way to waste perfectly good damage-type names (BRUTE) on this... If you were really worried about case sensitivity, you could have just used lowertext(damagetype) in the proc. -#define BRUTE "brute" -#define BURN "fire" -#define TOX "tox" -#define OXY "oxy" -#define CLONE "clone" -#define HALLOSS "halloss" - -#define CUT "cut" -#define BRUISE "bruise" - -#define STUN "stun" -#define WEAKEN "weaken" -#define PARALYZE "paralize" -#define IRRADIATE "irradiate" -#define AGONY "agony" // Added in PAIN! -#define SLUR "slur" -#define STUTTER "stutter" -#define EYE_BLUR "eye_blur" -#define DROWSY "drowsy" - -// I hate adding defines like this but I'd much rather deal with bitflags than lists and string searches. -#define BRUTELOSS 1 -#define FIRELOSS 2 -#define TOXLOSS 4 -#define OXYLOSS 8 - -// Bitflags defining which status effects could be or are inflicted on a mob. -#define CANSTUN 1 -#define CANWEAKEN 2 -#define CANPARALYSE 4 -#define CANPUSH 8 -#define LEAPING 16 -#define PASSEMOTES 32 // Mob has a cortical borer or holders inside of it that need to see emotes. -#define GODMODE 4096 -#define FAKEDEATH 8192 // Replaces stuff like changeling.changeling_fakedeath. -#define DISFIGURED 16384 // I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system. -#define XENO_HOST 32768 // Tracks whether we're gonna be a baby alien's mummy. - -// Grab levels. -#define GRAB_PASSIVE 1 -#define GRAB_AGGRESSIVE 2 -#define GRAB_NECK 3 -#define GRAB_UPGRADING 4 -#define GRAB_KILL 5 - -// Security levels. -#define SEC_LEVEL_GREEN 0 -#define SEC_LEVEL_BLUE 1 -#define SEC_LEVEL_RED 2 -#define SEC_LEVEL_DELTA 3 - -#define TRANSITIONEDGE 7 // Distance from edge to move to another z-level. - -// A set of constants used to determine which type of mute an admin wishes to apply. -// Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO, etc. = (MUTE_IC << 1) -// Therefore there needs to be a gap between the flags for the automute flags. -#define MUTE_IC 1 -#define MUTE_OOC 2 -#define MUTE_PRAY 4 -#define MUTE_ADMINHELP 8 -#define MUTE_DEADCHAT 16 -#define MUTE_ALL 31 - -// Number of identical messages required to get the spam-prevention auto-mute thing to trigger warnings and automutes. -#define SPAM_TRIGGER_WARNING 5 -#define SPAM_TRIGGER_AUTOMUTE 10 - -// Some constants for DB_Ban -#define BANTYPE_PERMA 1 -#define BANTYPE_TEMP 2 -#define BANTYPE_JOB_PERMA 3 -#define BANTYPE_JOB_TEMP 4 -#define BANTYPE_ANY_FULLBAN 5 // Used to locate stuff to unban. - -// Invisibility constants. -#define INVISIBILITY_LIGHTING 20 -#define INVISIBILITY_LEVEL_ONE 35 -#define INVISIBILITY_LEVEL_TWO 45 -#define INVISIBILITY_OBSERVER 60 -#define INVISIBILITY_EYE 61 - -#define SEE_INVISIBLE_LIVING 25 -#define SEE_INVISIBLE_OBSERVER_NOLIGHTING 15 -#define SEE_INVISIBLE_LEVEL_ONE 35 -#define SEE_INVISIBLE_LEVEL_TWO 45 -#define SEE_INVISIBLE_CULT 60 -#define SEE_INVISIBLE_OBSERVER 61 - -#define SEE_INVISIBLE_MINIMUM 5 -#define INVISIBILITY_MAXIMUM 100 - -// Object specific defines. -#define CANDLE_LUM 3 // For how bright candles are. - -//Some mob defines below -#define AI_CAMERA_LUMINOSITY 6 - -#define BORGMESON 1 -#define BORGTHERM 2 -#define BORGXRAY 4 - -// Some arbitrary defines to be used by self-pruning global lists. (see master_controller) -#define PROCESS_KILL 26 // Used to trigger removal from a processing list. - -#define HOSTILE_STANCE_IDLE 1 -#define HOSTILE_STANCE_ALERT 2 -#define HOSTILE_STANCE_ATTACK 3 -#define HOSTILE_STANCE_ATTACKING 4 -#define HOSTILE_STANCE_TIRED 5 - -#define ROUNDSTART_LOGOUT_REPORT_TIME 6000 // Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued. - -// Organ defines. -#define ORGAN_CUT_AWAY 1 -#define ORGAN_GAUZED 2 -#define ORGAN_ATTACHABLE 4 -#define ORGAN_BLEEDING 8 -#define ORGAN_BROKEN 32 -#define ORGAN_DESTROYED 64 -#define ORGAN_ROBOT 128 -#define ORGAN_SPLINTED 256 -#define SALVED 512 -#define ORGAN_DEAD 1024 -#define ORGAN_MUTATED 2048 -#define ORGAN_ASSISTED 4096 - -// Admin permissions. Please don't edit these values without speaking to Errorage first. ~Carn -#define R_BUILDMODE 1 -#define R_ADMIN 2 -#define R_BAN 4 -#define R_FUN 8 -#define R_SERVER 16 -#define R_DEBUG 32 -#define R_POSSESS 64 -#define R_PERMISSIONS 128 -#define R_STEALTH 256 -#define R_REJUVINATE 512 -#define R_VAREDIT 1024 -#define R_SOUNDS 2048 -#define R_SPAWN 4096 -#define R_MOD 8192 -#define R_MENTOR 16384 -#define R_HOST 32768 - -#define R_MAXPERMISSION 32768 // This holds the maximum value for a permission. It is used in iteration, so keep it updated. - -// Preference toggles. -#define SOUND_ADMINHELP 1 -#define SOUND_MIDI 2 -#define SOUND_AMBIENCE 4 -#define SOUND_LOBBY 8 -#define CHAT_OOC 16 -#define CHAT_DEAD 32 -#define CHAT_GHOSTEARS 64 -#define CHAT_GHOSTSIGHT 128 -#define CHAT_PRAYER 256 -#define CHAT_RADIO 512 -#define CHAT_ATTACKLOGS 1024 -#define CHAT_DEBUGLOGS 2048 -#define CHAT_LOOC 4096 -#define CHAT_GHOSTRADIO 8192 -#define SHOW_TYPING 16384 -#define CHAT_NOICONS 32768 - -#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC) - -#define BE_TRAITOR 1 -#define BE_OPERATIVE 2 -#define BE_CHANGELING 4 -#define BE_WIZARD 8 -#define BE_MALF 16 -#define BE_REV 32 -#define BE_ALIEN 64 -#define BE_AI 128 -#define BE_CULTIST 256 -#define BE_MONKEY 512 -#define BE_NINJA 1024 -#define BE_RAIDER 2048 -#define BE_PLANT 4096 -#define BE_MUTINEER 8192 -#define BE_PAI 16384 - -var/list/be_special_flags = list( - "Traitor" = BE_TRAITOR, - "Operative" = BE_OPERATIVE, - "Changeling" = BE_CHANGELING, - "Wizard" = BE_WIZARD, - "Malf AI" = BE_MALF, - "Revolutionary" = BE_REV, - "Xenomorph" = BE_ALIEN, - "Positronic Brain" = BE_AI, - "Cultist" = BE_CULTIST, - "Monkey" = BE_MONKEY, - "Ninja" = BE_NINJA, - "Raider" = BE_RAIDER, - "Diona" = BE_PLANT, - "Mutineer" = BE_MUTINEER, - "pAI" = BE_PAI -) - -// Age limits on a character. -#define AGE_MIN 17 -#define AGE_MAX 85 - -// Languages. -#define LANGUAGE_HUMAN 1 -#define LANGUAGE_ALIEN 2 -#define LANGUAGE_DOG 4 -#define LANGUAGE_CAT 8 -#define LANGUAGE_BINARY 16 -#define LANGUAGE_OTHER 32768 - -#define LANGUAGE_UNIVERSAL 65535 - -#define LEFT 1 -#define RIGHT 2 - -// For secHUDs and medHUDs and variants. The number is the location of the image on the list hud_list of humans. -#define HEALTH_HUD 1 // A simple line rounding the mob's number health. -#define STATUS_HUD 2 // Alive, dead, diseased, etc. -#define ID_HUD 3 // The job asigned to your ID. -#define WANTED_HUD 4 // Wanted, released, paroled, security status. -#define IMPLOYAL_HUD 5 // Loyality implant. -#define IMPCHEM_HUD 6 // Chemical implant. -#define IMPTRACK_HUD 7 // Tracking implant. -#define SPECIALROLE_HUD 8 // AntagHUD image. -#define STATUS_HUD_OOC 9 // STATUS_HUD without virus DB check for someone being ill. -#define LIFE_HUD 10 // STATUS_HUD that only reports dead or alive - -// Pulse levels, very simplified. -#define PULSE_NONE 0 // So !M.pulse checks would be possible. -#define PULSE_SLOW 1 // <60 bpm -#define PULSE_NORM 2 // 60-90 bpm -#define PULSE_FAST 3 // 90-120 bpm -#define PULSE_2FAST 4 // >120 bpm -#define PULSE_THREADY 5 // Occurs during hypovolemic shock -#define GETPULSE_HAND 0 // Less accurate. (hand) -#define GETPULSE_TOOL 1 // More accurate. (med scanner, sleeper, etc.) - -// Species flags. -#define NO_BLOOD 1 // Vessel var is not filled with blood, cannot bleed out. -#define NO_BREATHE 2 // Cannot suffocate or take oxygen loss. -#define NO_SCAN 4 // Cannot be scanned in a DNA machine/genome-stolen. -#define NO_PAIN 8 // Cannot suffer halloss/recieves deceptive health indicator. -#define NO_SLIP 16 // Cannot fall over. -#define NO_POISON 32 // Cannot not suffer toxloss. -#define HAS_SKIN_TONE 64 // Skin tone selectable in chargen. (0-255) -#define HAS_SKIN_COLOR 128 // Skin colour selectable in chargen. (RGB) -#define HAS_LIPS 256 // Lips are drawn onto the mob icon. (lipstick) -#define HAS_UNDERWEAR 512 // Underwear is drawn onto the mob icon. -#define IS_PLANT 1024 // Is a treeperson. -#define IS_WHITELISTED 2048 // Must be whitelisted to play. -#define IS_SYNTHETIC 4096 // Is a machine race. -#define HAS_EYE_COLOR 8192 // Eye colour selectable in chargen. (RGB) -#define CAN_JOIN 16384 // Species is selectable in chargen. -#define IS_RESTRICTED 32768 // Is not a core/normally playable species. (castes, mutantraces) -#define REGENERATES_LIMBS 65536 // Attempts to regenerate unamputated limbs. - -// Language flags. -#define WHITELISTED 1 // Language is available if the speaker is whitelisted. -#define RESTRICTED 2 // Language can only be accquired by spawning or an admin. -#define NONVERBAL 4 // Language has a significant non-verbal component. Speech is garbled without line-of-sight. -#define SIGNLANG 8 // Language is completely non-verbal. Speech is displayed through emotes for those who can understand. -#define HIVEMIND 16 // Broadcast to all mobs with this language. -#define NONGLOBAL 32 // Do not add to general languages list. -#define INNATE 64 // All mobs can be assumed to speak and understand this language. (audible emotes) -#define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message -#define NO_STUTTER 256 // No stuttering, slurring, or other speech problems - -//Flags for zone sleeping -#define ZONE_ACTIVE 1 -#define ZONE_SLEEPING 0 - -//some colors -#define COLOR_RED "#FF0000" -#define COLOR_GREEN "#00FF00" -#define COLOR_BLUE "#0000FF" -#define COLOR_CYAN "#00FFFF" -#define COLOR_PINK "#FF00FF" -#define COLOR_YELLOW "#FFFF00" -#define COLOR_ORANGE "#FF9900" -#define COLOR_WHITE "#FFFFFF" -#define COLOR_BLACK "#000000" - -/* - * Germs and infections. -*/ - -#define GERM_LEVEL_AMBIENT 110 // Maximum germ level you can reach by standing still. -#define GERM_LEVEL_MOVE_CAP 200 // Maximum germ level you can reach by running around. - -#define INFECTION_LEVEL_ONE 100 -#define INFECTION_LEVEL_TWO 500 -#define INFECTION_LEVEL_THREE 1000 - -/* - * Shuttles. -*/ - -// These define the time taken for the shuttle to get to the space station, and the time before it leaves again. -#define SHUTTLE_PREPTIME 300 // 5 minutes = 300 seconds - after this time, the shuttle departs centcom and cannot be recalled. -#define SHUTTLE_LEAVETIME 180 // 3 minutes = 180 seconds - the duration for which the shuttle will wait at the station after arriving. -#define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station. -#define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure. - -// Shuttle moving status. -#define SHUTTLE_IDLE 0 -#define SHUTTLE_WARMUP 1 -#define SHUTTLE_INTRANSIT 2 - -// Ferry shuttle processing status. -#define IDLE_STATE 0 -#define WAIT_LAUNCH 1 -#define FORCE_LAUNCH 2 -#define WAIT_ARRIVE 3 -#define WAIT_FINISH 4 - -// computer3 error codes, move lower in the file when it passes dev -Sayu -#define PROG_CRASH 1 // Generic crash. -#define MISSING_PERIPHERAL 2 // Missing hardware. -#define BUSTED_ASS_COMPUTER 4 // Self-perpetuating error. BAC will continue to crash forever. -#define MISSING_PROGRAM 8 // Some files try to automatically launch a program. This is that failing. -#define FILE_DRM 16 // Some files want to not be copied/moved. This is them complaining that you tried. -#define NETWORK_FAILURE 32 - -// Some on_mob_life() procs check for alien races. -#define IS_DIONA 1 -#define IS_VOX 2 -#define IS_SKRELL 3 -#define IS_UNATHI 4 -#define IS_XENOS 5 - -#define MAX_GEAR_COST 5 // Used in chargen for accessory loadout limit. - -/* - * Atmospherics Machinery. -*/ -#define MAX_SIPHON_FLOWRATE 2500 // L/s. This can be used to balance how fast a room is siphoned. Anything higher than CELL_VOLUME has no effect. -#define MAX_SCRUBBER_FLOWRATE 200 // L/s. Max flow rate when scrubbing from a turf. - -// These balance how easy or hard it is to create huge pressure gradients with pumps and filters. -// Lower values means it takes longer to create large pressures differences. -// Has no effect on pumping gasses from high pressure to low, only from low to high. -#define ATMOS_PUMP_EFFICIENCY 2.5 -#define ATMOS_FILTER_EFFICIENCY 2.5 - -// Will not bother pumping or filtering if the gas source as fewer than this amount of moles, to help with performance. -#define MINIMUM_MOLES_TO_PUMP 0.01 -#define MINIMUM_MOLES_TO_FILTER 0.1 - -// The flow rate/effectiveness of various atmos devices is limited by their internal volume, -// so for many atmos devices these will control maximum flow rates in L/s. -#define ATMOS_DEFAULT_VOLUME_PUMP 200 // Liters. -#define ATMOS_DEFAULT_VOLUME_FILTER 200 // L. -#define ATMOS_DEFAULT_VOLUME_MIXER 200 // L. -#define ATMOS_DEFAULT_VOLUME_PIPE 70 // L. - -// Chemistry. -#define CHEM_SYNTH_ENERGY 500 // How much energy does it take to synthesize 1 unit of chemical, in Joules. - -#define SPEED_OF_LIGHT 3e8 // Approximate. -#define SPEED_OF_LIGHT_SQ 9e16 -#define FIRE_DAMAGE_MODIFIER 0.0215 // Higher values result in more external fire damage to the skin. (default 0.0215) -#define AIR_DAMAGE_MODIFIER 2.025 // More means less damage from hot air scalding lungs, less = more damage. (default 2.025) -#define INFINITY 1.#INF -#define BACKGROUND_ENABLED 0 // The default value for all uses of set background. Set background can - // cause gradual lag and is recommended you only turn this on if necessary. - // 1 will enable set background. 0 will disable set background. - -// Setting this much higher than 1024 could allow spammers to DOS the server easily. -#define MAX_MESSAGE_LEN 1024 -#define MAX_PAPER_MESSAGE_LEN 3072 -#define MAX_BOOK_MESSAGE_LEN 9216 -#define MAX_LNAME_LEN 64 -#define MAX_NAME_LEN 26 - -// Event defines. -#define EVENT_LEVEL_MUNDANE 1 -#define EVENT_LEVEL_MODERATE 2 -#define EVENT_LEVEL_MAJOR 3 - -// Suit sensor levels -#define SUIT_SENSOR_OFF 0 -#define SUIT_SENSOR_BINARY 1 -#define SUIT_SENSOR_VITAL 2 -#define SUIT_SENSOR_TRACKING 3 - -// NanoUI flags -#define STATUS_INTERACTIVE 2 // GREEN Visability -#define STATUS_UPDATE 1 // ORANGE Visability -#define STATUS_DISABLED 0 // RED Visability -#define STATUS_CLOSE -1 // Close the interface - -//General-purpose life speed define for plants. -#define HYDRO_SPEED_MULTIPLIER 1 - -// Robot AI notifications -#define ROBOT_NOTIFICATION_NEW_UNIT 1 -#define ROBOT_NOTIFICATION_NEW_NAME 2 -#define ROBOT_NOTIFICATION_NEW_MODULE 3 -#define ROBOT_NOTIFICATION_MODULE_RESET 4 - -#define BOMBCAP_DVSTN_RADIUS (max_explosion_range/4) -#define BOMBCAP_HEAVY_RADIUS (max_explosion_range/2) -#define BOMBCAP_LIGHT_RADIUS max_explosion_range -#define BOMBCAP_FLASH_RADIUS (max_explosion_range*1.5) - -#define DEFAULT_JOB_TYPE /datum/job/assistant - -// Appearance change flags -#define APPEARANCE_UPDATE_DNA 1 -#define APPEARANCE_RACE (2|APPEARANCE_UPDATE_DNA) -#define APPEARANCE_GENDER (4|APPEARANCE_UPDATE_DNA) -#define APPEARANCE_SKIN 8 -#define APPEARANCE_HAIR 16 -#define APPEARANCE_HAIR_COLOR 32 -#define APPEARANCE_FACIAL_HAIR 64 -#define APPEARANCE_FACIAL_HAIR_COLOR 128 -#define APPEARANCE_EYE_COLOR 256 -#define APPEARANCE_ALL_HAIR (APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR) -#define APPEARANCE_ALL 511 - -// Mode/antag template macros. -#define MODE_BORER "borer" -#define MODE_XENOMORPH "xeno" -#define MODE_LOYALIST "loyalist" -#define MODE_MUTINEER "mutineer" -#define MODE_COMMANDO "commando" -#define MODE_DEATHSQUAD "deathsquad" -#define MODE_ERT "ert" -#define MODE_MERCENARY "mercenary" -#define MODE_NINJA "ninja" -#define MODE_RAIDER "raider" -#define MODE_WIZARD "wizard" -#define MODE_CHANGELING "changeling" -#define MODE_CULTIST "cultist" -#define MODE_HIGHLANDER "highlander" -#define MODE_MONKEY "monkey" -#define MODE_RENEGADE "renegade" -#define MODE_REVOLUTIONARY "revolutionary" -#define MODE_MALFUNCTION "malf" -#define MODE_TRAITOR "traitor" - -#define MIN_SUPPLIED_LAW_NUMBER 15 -#define MAX_SUPPLIED_LAW_NUMBER 50 - -//Area flags, possibly more to come -#define RAD_SHIELDED 1 //shielded from radiation, clearly - -//intent flags, why wasn't this done the first time? -#define I_HELP "help" -#define I_DISARM "disarm" -#define I_GRAB "grab" -#define I_HURT "hurt" - -/* - These are used Bump() code for living mobs, in the mob_bump_flag, mob_swap_flags, and mob_push_flags vars to determine whom can bump/swap with whom. -*/ -#define HUMAN 1 -#define MONKEY 2 -#define ALIEN 4 -#define ROBOT 8 -#define SLIME 16 -#define SIMPLE_ANIMAL 32 - - -#define ALLMOBS (HUMAN|MONKEY|ALIEN|ROBOT|SLIME|SIMPLE_ANIMAL) - -#define NEXT_MOVE_DELAY 8 - -#define DROPLIMB_EDGE 0 -#define DROPLIMB_BLUNT 1 -#define DROPLIMB_BURN 2 - -// Custom layer definitions, supplementing the default TURF_LAYER, MOB_LAYER, etc. -#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 -#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed -#define LIGHTING_LAYER 11 -#define OBFUSCATION_LAYER 14 //Where images covering the view for eyes are put -#define SCREEN_LAYER 17 //Mob HUD/effects layer - - -///////////////// -////WIZARD ////// -///////////////// - -/* WIZARD SPELL FLAGS */ -#define GHOSTCAST 1 //can a ghost cast it? -#define NEEDSCLOTHES 2 //does it need the wizard garb to cast? Nonwizard spells should not have this -#define NEEDSHUMAN 4 //does it require the caster to be human? -#define Z2NOCAST 8 //if this is added, the spell can't be cast at centcomm -#define STATALLOWED 16 //if set, the user doesn't have to be conscious to cast. Required for ghost spells -#define IGNOREPREV 32 //if set, each new target does not overlap with the previous one -//The following flags only affect different types of spell, and therefore overlap -//Targeted spells -#define INCLUDEUSER 64 //does the spell include the caster in its target selection? -#define SELECTABLE 128 //can you select each target for the spell? -//AOE spells -#define IGNOREDENSE 64 //are dense turfs ignored in selection? -#define IGNORESPACE 128 //are space turfs ignored in selection? -//End split flags -#define CONSTRUCT_CHECK 256 //used by construct spells - checks for nullrods -#define NO_BUTTON 512 //spell won't show up in the HUD with this - -//invocation -#define SpI_SHOUT "shout" -#define SpI_WHISPER "whisper" -#define SpI_EMOTE "emote" -#define SpI_NONE "none" - -//upgrading -#define Sp_SPEED "speed" -#define Sp_POWER "power" -#define Sp_TOTAL "total" - -//casting costs -#define Sp_RECHARGE "recharge" -#define Sp_CHARGES "charges" -#define Sp_HOLDVAR "holdervar" - -///////WIZ END///////// - -//singularity defines -#define STAGE_ONE 1 -#define STAGE_TWO 3 -#define STAGE_THREE 5 -#define STAGE_FOUR 7 -#define STAGE_FIVE 9 -#define STAGE_SUPER 11 - -// Camera networks -#define NETWORK_CRESCENT "Crescent" -#define NETWORK_CIVILIAN_EAST "Civilian East" -#define NETWORK_CIVILIAN_WEST "Civilian West" -#define NETWORK_COMMAND "Command" -#define NETWORK_ENGINE "Engine" -#define NETWORK_ENGINEERING "Engineering" -#define NETWORK_ENGINEERING_OUTPOST "Engineering Outpost" -#define NETWORK_ERT "ERT" -#define NETWORK_EXODUS "Exodus" -#define NETWORK_MEDICAL "Medical" -#define NETWORK_MINE "MINE" -#define NETWORK_RESEARCH "Research" -#define NETWORK_RESEARCH_OUTPOST "Research Outpost" -#define NETWORK_ROBOTS "Robots" -#define NETWORK_PRISON "Prison" -#define NETWORK_SECURITY "Security" -#define NETWORK_TELECOM "Tcomsat" -#define NETWORK_THUNDER "thunder" - -// Languages -#define LANGUAGE_SOL_COMMON "Sol Common" -#define LANGUAGE_UNATHI "Sinta'unathi" -#define LANGUAGE_SIIK_MAAS "Siik'maas" -#define LANGUAGE_SIIK_TAJR "Siik'tajr" -#define LANGUAGE_SKRELLIAN "Skrellian" -#define LANGUAGE_ROOTSPEAK "Rootspeak" -#define LANGUAGE_TRADEBAND "Tradeband" -#define LANGUAGE_GUTTER "Gutter" - -#define WALL_CAN_OPEN 1 -#define WALL_OPENING 2 - -#define CLAMP01(x) max(0, min(1, x)) - -#define DEFAULT_WALL_MATERIAL "steel" -#define DEFAULT_TABLE_MATERIAL "plastic" - -// Convoluted setup so defines can be supplied by Bay12 main server compile script. -// Should still work fine for people jamming the icons into their repo. -#ifndef CUSTOM_ITEM_OBJ -#define CUSTOM_ITEM_OBJ 'icons/obj/custom_items_obj.dmi' -#endif -#ifndef CUSTOM_ITEM_MOB -#define CUSTOM_ITEM_MOB 'icons/mob/custom_items_mob.dmi' -#endif - -#define SHARD_SHARD "shard" -#define SHARD_SHRAPNEL "shrapnel" -#define SHARD_STONE_PIECE "piece" -#define SHARD_SPLINTER "splinters" -#define SHARD_NONE "" - -#define MATERIAL_UNMELTABLE 1 -#define MATERIAL_BRITTLE 2 -#define MATERIAL_PADDING 4 - -#define TABLE_BRITTLE_MATERIAL_MULTIPLIER 4 // Amount table damage is multiplied by if it is made of a brittle material (e.g. glass) - From fa566fbe47158f92b02db388ad0fba4066d429d3 Mon Sep 17 00:00:00 2001 From: Datraen Date: Sun, 30 Aug 2015 11:58:39 -0400 Subject: [PATCH 19/24] [Botany] Gas-related traits revealed on the plant analyzer http://baystation12.net/forums/threads/the-little-things-4-with-a-vengance.9/page-11#post-10909 --- code/modules/hydroponics/trays/tray_tools.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index 1371aa943f2..6ce3c9931e5 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -198,6 +198,12 @@ if(grown_seed.get_trait(TRAIT_TELEPORTING)) dat += "
The fruit is temporal/spatially unstable." + if(grown_seed.get_trait(TRAIT_EXUDE_GASSES)) + dat += "
It will release gas into the environment." + + if(grown_seed.get_trait(TRAIT_CONSUME_GASSES)) + dat += "
It will remove gas from the environment." + if(dat) last_data = dat dat += "

\[
print report\]" From 1de511b545c5e2550bef3a83b01c748a8cb2ab40 Mon Sep 17 00:00:00 2001 From: Cael Aislinn Date: Mon, 31 Aug 2015 16:41:43 +1000 Subject: [PATCH 20/24] fixes emitter runtime by using new calling syntax Signed-off-by: Cael Aislinn --- code/modules/power/singularity/emitter.dm | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index ceb41d4588d..51093296b27 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -126,27 +126,16 @@ //need to calculate the power per shot as the emitter doesn't fire continuously. var/burst_time = (min_burst_delay + max_burst_delay)/2 + 2*(burst_shots-1) var/power_per_shot = active_power_usage * (burst_time/10) / burst_shots - var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc ) - A.damage = round(power_per_shot/EMITTER_DAMAGE_POWER_TRANSFER) playsound(src.loc, 'sound/weapons/emitter.ogg', 25, 1) if(prob(35)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) s.start() - A.set_dir(src.dir) - A.starting = get_turf(src) - switch(dir) - if(NORTH) - A.original = locate(x, y+1, z) - if(EAST) - A.original = locate(x+1, y, z) - if(WEST) - A.original = locate(x-1, y, z) - else // Any other - A.original = locate(x, y-1, z) - A.process() + var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc ) + A.damage = round(power_per_shot/EMITTER_DAMAGE_POWER_TRANSFER) + A.launch( get_step(src.loc, src.dir) ) /obj/machinery/power/emitter/attackby(obj/item/W, mob/user) @@ -225,7 +214,7 @@ return ..() return - + /obj/machinery/power/emitter/emag_act(var/remaining_charges, var/mob/user) if(!emagged) locked = 0 From af86b8a935c272c7f03112d71552043c6d5f4fae Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Mon, 31 Aug 2015 08:45:20 +0200 Subject: [PATCH 21/24] Ports LummoxJr's get_turf() --- code/_helpers/unsorted.dm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 366fcbbbc10..69c891d2a41 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1053,12 +1053,10 @@ proc/get_mob_with_client_list() //gets the turf the atom is located in (or itself, if it is a turf). //returns null if the atom is not in a turf. -/proc/get_turf(atom/location) - while(location) - if(isturf(location)) - return location - location = location.loc - return null +/proc/get_turf(atom/A) + if(!istype(A)) return + for(A, A && !isturf(A), A=A.loc); + return A /proc/get(atom/loc, type) while(loc) From 9f54a71c2c7584071e16b2c5f2f0aedd15db1e0c Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sun, 30 Aug 2015 17:50:07 +0930 Subject: [PATCH 22/24] Limbs now copy hair data from their owner and may have optional body hair icons blended into them. --- .../mob/living/carbon/human/appearance.dm | 2 ++ .../mob/living/carbon/human/update_icons.dm | 7 ++++++- code/modules/nano/modules/human_appearance.dm | 2 ++ code/modules/organs/organ_external.dm | 6 ++++-- code/modules/organs/organ_icon.dm | 16 ++++++++++++++-- 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index b6587af0877..5f9d7e827cf 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -95,6 +95,8 @@ g_hair = green b_hair = blue + force_update_limbs() + update_body() update_hair() return 1 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 94fe7fd9495..55bce8251cd 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -271,8 +271,13 @@ var/global/list/damage_icon_parts = list() icon_key += "[part.species.race_key]" icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]" icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]" - if(part.s_col) + if(part.s_col && part.s_col.len >= 3) icon_key += "[rgb(part.s_col[1],part.s_col[2],part.s_col[3])]" + if(part.body_hair && part.h_col && part.h_col.len >= 3) + icon_key += "[rgb(part.h_col[1],part.h_col[2],part.h_col[3])]" + else + icon_key += "#000000" + icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" var/icon/base_icon diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index ae072145bb0..c90dc6de8ab 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -152,6 +152,8 @@ generate_data() /datum/nano_module/appearance_changer/proc/generate_data() + if(!owner) + return if(!valid_species.len) valid_species = owner.generate_valid_species(check_whitelist, whitelist, blacklist) if(!valid_hairstyles.len || !valid_facial_hairstyles.len) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 1b6108c2385..da12fdbb1c2 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -35,6 +35,7 @@ var/cannot_break var/s_tone var/list/s_col + var/list/h_col var/list/wounds = list() var/number_wounds = 0 // cache the number of wounds, which is NOT wounds.len! var/perma_injury = 0 @@ -55,6 +56,7 @@ var/dislocated = 0 // If you target a joint, you can dislocate the limb, causing temporary damage to the organ. var/can_grasp //It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point var/can_stand + var/body_hair /obj/item/organ/external/Destroy() if(parent && parent.children) @@ -258,7 +260,7 @@ createwound(BURN, min(burn,can_inflict)) //How much burn damage is left to inflict spillover += max(0, burn - can_inflict) - + //If there are still hurties to dispense if (spillover) owner.shock_stage += spillover * config.organ_damage_spillover_multiplier @@ -275,7 +277,7 @@ //2. If the damage amount dealt exceeds the disintegrate threshold, the organ is completely obliterated. //3. If the organ has already reached or would be put over it's max damage amount (currently redundant), // and the brute damage dealt exceeds the tearoff threshold, the organ is torn off. - + //Check edge eligibility var/edge_eligible = 0 if(edge) diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index d74548ccbe6..bcc8de7694c 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -15,6 +15,7 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human) s_tone = null s_col = null + h_col = null if(status & ORGAN_ROBOT) return if(species && human.species && species.name != human.species.name) @@ -23,16 +24,19 @@ var/global/list/limb_icon_cache = list() s_tone = human.s_tone if(human.species.appearance_flags & HAS_SKIN_COLOR) s_col = list(human.r_skin, human.g_skin, human.b_skin) + h_col = list(human.r_hair, human.g_hair, human.b_hair) /obj/item/organ/external/proc/sync_colour_to_dna() s_tone = null s_col = null + h_col = null if(status & ORGAN_ROBOT) return if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && (species.appearance_flags & HAS_SKIN_TONE)) s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE) if(species.appearance_flags & HAS_SKIN_COLOR) s_col = list(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B)) + h_col = list(dna.GetUIValue(DNA_UI_HAIR_R),dna.GetUIValue(DNA_UI_HAIR_G),dna.GetUIValue(DNA_UI_HAIR_B)) /obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human) ..() @@ -77,8 +81,8 @@ var/global/list/limb_icon_cache = list() var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] if(hair_style && (species.get_bodytype() in hair_style.species_allowed)) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - if(hair_style.do_colouration) - hair_s.Blend(rgb(owner.r_hair, owner.g_hair, owner.b_hair), ICON_ADD) + if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3) + hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_ADD) overlays |= hair_s return mob_icon @@ -121,6 +125,14 @@ var/global/list/limb_icon_cache = list() else if(s_col && s_col.len >= 3) mob_icon.Blend(rgb(s_col[1], s_col[2], s_col[3]), ICON_ADD) + if(body_hair && islist(h_col) && h_col.len >= 3) + var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]" + if(!limb_icon_cache[cache_key]) + var/icon/I = icon(species.icobase, "[icon_name]_[body_hair]") + I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_ADD) + limb_icon_cache[cache_key] = I + mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY) + dir = EAST icon = mob_icon From 337333d45e99976b83ddc9391eb41d8a923906bb Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Mon, 31 Aug 2015 09:10:58 +0200 Subject: [PATCH 23/24] Ports the portable turret projectiles to the new system. --- code/game/machinery/portable_turret.dm | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 2fa0281ecd3..94f9bc70dfa 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -623,7 +623,6 @@ var/list/turret_icons else A = new projectile(loc) playsound(loc, shot_sound, 75, 1) - A.original = target // Lethal/emagged turrets use twice the power due to higher energy beams // Emagged turrets again use twice as much power due to higher firing rates @@ -631,19 +630,15 @@ var/list/turret_icons //Turrets aim for the center of mass by default. //If the target is grabbing someone then the turret smartly aims for extremities + var/def_zone var/obj/item/weapon/grab/G = locate() in target if(G && G.state >= GRAB_NECK) //works because mobs are currently not allowed to upgrade to NECK if they are grabbing two people. - A.def_zone = pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg") + def_zone = pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg") else - A.def_zone = pick("chest", "groin") + def_zone = pick("chest", "groin") //Shooting Code: - A.current = T - A.starting = T - A.yo = U.y - T.y - A.xo = U.x - T.x - spawn(1) - A.process() + A.launch(target, def_zone) /datum/turret_checks var/enabled From a7ff1a09ee158faca656edd344434a0e78f4e890 Mon Sep 17 00:00:00 2001 From: Raptor1628 Date: Mon, 31 Aug 2015 15:32:35 -0400 Subject: [PATCH 24/24] Adds Supply Fax Quartermaster now has fax access and a fax machine. Fax machines have a third admin channel, "Supply" for special requests like three thousand mankinis or a Phazon, up to the admins to accept or deny requests, and deduct cargo points if they'd like to. --- code/modules/paperwork/faxmachine.dm | 6 ++++-- maps/exodus-1.dmm | 10 +++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index c0535f48659..8ff1a680d74 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -1,5 +1,5 @@ var/list/obj/machinery/photocopier/faxmachine/allfaxes = list() -var/list/admin_departments = list("[boss_name]", "Sol Government") +var/list/admin_departments = list("[boss_name]", "Sol Government", "Supply") var/list/alldepartments = list() var/list/adminfaxes = list() //cache for faxes that have been sent to admins @@ -9,7 +9,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins icon = 'icons/obj/library.dmi' icon_state = "fax" insert_anim = "faxsend" - req_one_access = list(access_lawyer, access_heads, access_armory) //Warden needs to be able to Fax solgov too. + req_one_access = list(access_lawyer, access_heads, access_armory, access_qm) use_power = 1 idle_power_usage = 30 @@ -201,6 +201,8 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins if ("Sol Government") message_admins(sender, "SOL GOVERNMENT FAX", rcvdcopy, "CentcommFaxReply", "#1F66A0") //message_admins(sender, "SOL GOVERNMENT FAX", rcvdcopy, "SolGovFaxReply", "#1F66A0") + if ("Supply") + message_admins(sender, "[uppertext(boss_short)] SUPPLY FAX", rcvdcopy, "CentcommFaxReply", "#5F4519") sendcooldown = 1800 sleep(50) diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 567252183fc..ba54788e0fa 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -4520,7 +4520,7 @@ "bIV" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/miningdock) "bIW" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/device/megaphone,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/quartermaster/qm) "bIX" = (/obj/item/weapon/clipboard,/obj/item/weapon/stamp{name = "Quartermaster's stamp"; pixel_x = 0; pixel_y = 0},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/quartermaster/qm) -"bIY" = (/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/structure/table/standard{name = "plastic table frame"},/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bIY" = (/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/structure/table/standard{name = "plastic table frame"},/obj/item/device/eftpos{eftpos_name = "Quartermaster EFTPOS scanner"},/turf/simulated/floor/tiled,/area/quartermaster/qm) "bIZ" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/civilian_west{c_tag = "Cargo - Quartermaster's Office"; dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/qm) "bJa" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIW"; location = "QM"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "bJb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) @@ -4742,8 +4742,8 @@ "bNj" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled,/area/quartermaster/miningdock) "bNk" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/papershredder,/turf/simulated/floor/tiled,/area/quartermaster/qm) "bNl" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/wall,/area/quartermaster/miningdock) -"bNm" = (/obj/structure/table/standard,/obj/item/weapon/coin/silver{pixel_x = -3; pixel_y = 3},/obj/item/weapon/coin/silver,/obj/item/device/eftpos{eftpos_name = "Quartermaster EFTPOS scanner"},/turf/simulated/floor/tiled,/area/quartermaster/qm) -"bNn" = (/obj/structure/closet/secure_closet/quartermaster,/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bNm" = (/obj/structure/table/standard,/obj/machinery/photocopier/faxmachine{department = "Quartermaster's Office"},/turf/simulated/floor/tiled,/area/quartermaster/qm) +"bNn" = (/obj/structure/closet/secure_closet/quartermaster,/obj/item/weapon/coin/silver{pixel_x = -3; pixel_y = 3},/obj/item/weapon/coin/silver,/turf/simulated/floor/tiled,/area/quartermaster/qm) "bNo" = (/obj/structure/table/standard,/obj/item/weapon/cartridge/quartermaster{pixel_x = 6; pixel_y = 5},/obj/item/weapon/cartridge/quartermaster,/obj/item/weapon/cartridge/quartermaster{pixel_x = -4; pixel_y = 7},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/quartermaster/qm) "bNp" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor/tiled,/area/hallway/primary/aft) "bNq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/server) @@ -7067,12 +7067,12 @@ "cFU" = (/obj/machinery/light/small,/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Carbon Dioxide"; dir = 1},/turf/simulated/floor/reinforced/carbon_dioxide,/area/engineering/atmos) "cFV" = (/obj/machinery/light/small,/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Phoron"; dir = 1},/turf/simulated/floor/reinforced/phoron,/area/engineering/atmos) "cFW" = (/obj/machinery/light/small,/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Nitrous Oxide"; dir = 1},/turf/simulated/floor/reinforced/n20,/area/engineering/atmos) -"cFX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cFX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cFY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cFZ" = (/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Tank - Gas Mixing"; dir = 1},/turf/simulated/floor/reinforced/airless,/area/engineering/atmos) "cGa" = (/obj/machinery/computer/drone_control,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cGb" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light,/obj/machinery/mecha_part_fabricator,/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"cGc" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Master Grid"; name_tag = "Master"},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cGc" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Master Grid"; name_tag = "Master"},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cGd" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cGe" = (/obj/structure/bed/chair{dir = 8},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cGf" = (/obj/machinery/power/smes/buildable{charge = 1e+007; cur_coils = 4; input_attempt = 1; input_level = 500000; output_level = 500000; RCon_tag = "Engine - Main"},/obj/structure/cable,/turf/simulated/floor/plating,/area/engineering/engine_smes)