diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d0aeab0904c..27cc7d4835a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -99,9 +99,7 @@ The previous code made compliant: ``` ###No overriding type safety checks. -The use of the : operator to override type safety checks is strongly discouraged. You must cast the variable to the proper type. - -Exceptions are only made when used in loops that require the performance boost from being called ***extremely*** often. (Rule of thumb: If you aren't messing with the master controller or it's subsystems, this exception probably doesn't apply) +The use of the : operator to override type safety checks is not allowed. You must cast the variable to the proper type. ###Type paths must began with a / eg: `/datum/thing` not `datum/thing` diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm index 25f4664aa66..7d817f7cbf0 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm @@ -33,7 +33,7 @@ }, /obj/effect/step_trigger/sound_effect{ name = "turn around"; - sound = "turn_around"; + sound = 'sound/hallucinations/turn_around1.ogg'; triggerer_only = 1 }, /turf/open/floor/plasteel/cult{ @@ -98,7 +98,7 @@ }, /obj/effect/step_trigger/sound_effect{ name = "turn around"; - sound = "turn_around"; + sound = 'sound/hallucinations/turn_around1.ogg'; triggerer_only = 1 }, /turf/open/floor/plasteel/cult{ @@ -117,7 +117,7 @@ /obj/effect/step_trigger/sound_effect{ happens_once = 1; name = "a grave mistake"; - sound = "i_see_you"; + sound = 'sound/hallucinations/i_see_you1.ogg'; triggerer_only = 1 }, /obj/effect/step_trigger/message{ @@ -138,7 +138,7 @@ }, /obj/effect/step_trigger/sound_effect{ name = "turn around"; - sound = "turn_around"; + sound = 'sound/hallucinations/turn_around1.ogg'; triggerer_only = 1 }, /turf/open/floor/plasteel/cult{ @@ -165,7 +165,7 @@ }, /obj/effect/step_trigger/sound_effect{ name = "turn around"; - sound = "turn_around"; + sound = 'sound/hallucinations/turn_around1.ogg'; triggerer_only = 1 }, /turf/open/floor/plasteel/cult{ diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 459e8912bec..aacbfc3a556 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -16,6 +16,7 @@ #define ispodperson(A) (is_species(A, /datum/species/podperson)) #define isflyperson(A) (is_species(A, /datum/species/fly)) #define iszombie(A) (is_species(A, /datum/species/zombie)) +#define ishumanbasic(A) (is_species(A, /datum/species/human)) #define ismonkey(A) (istype(A, /mob/living/carbon/monkey)) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index f77e0cf5300..65cef4fbc43 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -38,9 +38,19 @@ species_list[S.id] = S.type //Surgeries - for(var/path in (subtypesof(/datum/surgery))) + for(var/path in subtypesof(/datum/surgery)) surgeries_list += new path() + //Materials + for(var/path in subtypesof(/datum/material)) + var/datum/material/D = new path() + materials_list[D.id] = D + + //Techs + for(var/path in subtypesof(/datum/tech)) + var/datum/tech/D = new path() + tech_list[D.id] = D + init_subtypes(/datum/crafting_recipe, crafting_recipes) /* // Uncomment to debug chemical reaction list. diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index b7bf9169fe3..8f1775261d5 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -13,6 +13,8 @@ var/global/list/nuke_tiles = list() //list of all turfs that turn to animate var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff +var/global/list/materials_list = list() //list of all /datum/material datums indexed by material id. +var/global/list/tech_list = list() //list of all /datum/tech datums indexed by id. var/global/list/surgeries_list = list() //list of all surgeries by name, associated with their path. var/global/list/crafting_recipes = list() //list of all table craft recipes var/global/list/rcd_list = list() //list of Rapid Construction Devices. diff --git a/code/datums/material_container.dm b/code/datums/material_container.dm index 41baa00796e..ed6f375b6f6 100644 --- a/code/datums/material_container.dm +++ b/code/datums/material_container.dm @@ -22,33 +22,26 @@ owner = O max_amount = max(0, max_amt) - if(mat_list[MAT_METAL]) - materials[MAT_METAL] = new /datum/material/metal() - if(mat_list[MAT_GLASS]) - materials[MAT_GLASS] = new /datum/material/glass() - if(mat_list[MAT_SILVER]) - materials[MAT_SILVER] = new /datum/material/silver() - if(mat_list[MAT_GOLD]) - materials[MAT_GOLD] = new /datum/material/gold() - if(mat_list[MAT_DIAMOND]) - materials[MAT_DIAMOND] = new /datum/material/diamond() - if(mat_list[MAT_URANIUM]) - materials[MAT_URANIUM] = new /datum/material/uranium() - if(mat_list[MAT_PLASMA]) - materials[MAT_PLASMA] = new /datum/material/plasma() - if(mat_list[MAT_BANANIUM]) - materials[MAT_BANANIUM] = new /datum/material/bananium() + var/list/possible_mats = list() + for(var/mat_type in subtypesof(/datum/material)) + var/datum/material/MT = mat_type + possible_mats[initial(MT.id)] = mat_type + + for(var/id in mat_list) + if(possible_mats[id]) + var/mat_path = possible_mats[id] + materials[id] = new mat_path() /datum/material_container/Destroy() owner = null return ..() //For inserting an amount of material -/datum/material_container/proc/insert_amount(amt, material_type = null) +/datum/material_container/proc/insert_amount(amt, id = null) if(amt > 0 && has_space(amt)) var/total_amount_saved = total_amount - if(material_type) - var/datum/material/M = materials[material_type] + if(id) + var/datum/material/M = materials[id] if(M) M.amount += amt total_amount += amt @@ -120,8 +113,8 @@ return total_amount_save - total_amount -/datum/material_container/proc/use_amount_type(amt, material_type) - var/datum/material/M = materials[material_type] +/datum/material_container/proc/use_amount_type(amt, id) + var/datum/material/M = materials[id] if(M) if(M.amount >= amt) M.amount -= amt @@ -129,9 +122,9 @@ return amt return 0 -/datum/material_container/proc/can_use_amount(amt, material_type, list/mats) - if(amt && material_type) - var/datum/material/M = materials[material_type] +/datum/material_container/proc/can_use_amount(amt, id, list/mats) + if(amt && id) + var/datum/material/M = materials[id] if(M && M.amount >= amt) return TRUE else if(istype(mats)) @@ -153,23 +146,23 @@ while(sheet_amt > MAX_STACK_SIZE) new M.sheet_type(get_turf(owner), MAX_STACK_SIZE) count += MAX_STACK_SIZE - use_amount_type(sheet_amt * MINERAL_MATERIAL_AMOUNT, M.material_type) + use_amount_type(sheet_amt * MINERAL_MATERIAL_AMOUNT, M.id) sheet_amt -= MAX_STACK_SIZE if(round(M.amount / MINERAL_MATERIAL_AMOUNT)) new M.sheet_type(get_turf(owner), sheet_amt) count += sheet_amt - use_amount_type(sheet_amt * MINERAL_MATERIAL_AMOUNT, M.material_type) + use_amount_type(sheet_amt * MINERAL_MATERIAL_AMOUNT, M.id) return count return 0 -/datum/material_container/proc/retrieve_sheets(sheet_amt, material_type) - if(materials[material_type]) - return retrieve(sheet_amt, materials[material_type]) +/datum/material_container/proc/retrieve_sheets(sheet_amt, id) + if(materials[id]) + return retrieve(sheet_amt, materials[id]) return 0 -/datum/material_container/proc/retrieve_amount(amt, material_type) - return retrieve_sheets(amount2sheet(amt),material_type) +/datum/material_container/proc/retrieve_amount(amt, id) + return retrieve_sheets(amount2sheet(amt), id) /datum/material_container/proc/retrieve_all() var/result = 0 @@ -203,8 +196,8 @@ return sheet_amt * MINERAL_MATERIAL_AMOUNT return 0 -/datum/material_container/proc/amount(material_type) - var/datum/material/M = materials[material_type] +/datum/material_container/proc/amount(id) + var/datum/material/M = materials[id] return M ? M.amount : 0 //returns the amount of material relevant to this container; @@ -221,45 +214,45 @@ /datum/material var/name var/amount = 0 - var/material_type = null + var/id = null var/sheet_type = null /datum/material/metal name = "Metal" - material_type = MAT_METAL + id = MAT_METAL sheet_type = /obj/item/stack/sheet/metal /datum/material/glass name = "Glass" - material_type = MAT_GLASS + id = MAT_GLASS sheet_type = /obj/item/stack/sheet/glass /datum/material/silver name = "Silver" - material_type = MAT_SILVER + id = MAT_SILVER sheet_type = /obj/item/stack/sheet/mineral/silver /datum/material/gold name = "Gold" - material_type = MAT_GOLD + id = MAT_GOLD sheet_type = /obj/item/stack/sheet/mineral/gold /datum/material/diamond name = "Diamond" - material_type = MAT_DIAMOND + id = MAT_DIAMOND sheet_type = /obj/item/stack/sheet/mineral/diamond /datum/material/uranium name = "Uranium" - material_type = MAT_URANIUM + id = MAT_URANIUM sheet_type = /obj/item/stack/sheet/mineral/uranium /datum/material/plasma name = "Solid Plasma" - material_type = MAT_PLASMA + id = MAT_PLASMA sheet_type = /obj/item/stack/sheet/mineral/plasma /datum/material/bananium name = "Bananium" - material_type = MAT_BANANIUM + id = MAT_BANANIUM sheet_type = /obj/item/stack/sheet/mineral/bananium diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 44f9b0ba044..ec733786c1a 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -11,7 +11,7 @@ var/datum/reagents/reagents = null //This atom's HUD (med/sec, etc) images. Associative list. - var/list/image/hud_list = list() + var/list/image/hud_list = null //HUD images that this atom can provide. var/list/hud_possible diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 8d6d5705654..8472929b222 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -74,7 +74,7 @@ if(loc == newloc) //Remove this check and people can accelerate. Not opening that can of worms just yet. newtonian_move(last_move) - if(. && buckled_mobs.len && !handle_buckled_mob_movement(loc,direct)) //movement failed due to buckled mob(s) + if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc,direct)) //movement failed due to buckled mob(s) . = 0 //Called after a successful Move(). By this point, we've already moved @@ -137,7 +137,7 @@ stop_pulling() if(buckled) buckled.unbuckle_mob(src,force=1) - if(buckled_mobs.len) + if(has_buckled_mobs()) unbuckle_all_mobs(force=1) . = ..() if(client) diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index bdd7fc1ac7c..a94b5bb707b 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -15,6 +15,7 @@ var/req_stat = CONSCIOUS // CONSCIOUS, UNCONSCIOUS or DEAD var/genetic_damage = 0 // genetic damage caused by using the sting. Nothing to do with cloneloss. var/max_genetic_damage = 100 // hard counter for spamming abilities. Not used/balanced much yet. + var/always_keep = 0 // important for abilities like regenerate that screw you if you lose them. /obj/effect/proc_holder/changeling/proc/on_purchase(mob/user) diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 7aa3a7c0d5c..e3166c231aa 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -392,7 +392,7 @@ var/list/sting_paths mind.changeling.changeling_speak = 0 mind.changeling.reset() for(var/obj/effect/proc_holder/changeling/p in mind.changeling.purchasedpowers) - if(p.dna_cost == 0 && keep_free_powers) + if((p.dna_cost == 0 && keep_free_powers) || p.always_keep) continue mind.changeling.purchasedpowers -= p p.on_refund(src) diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index a68f62a4747..b6a7b4eac30 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -2,6 +2,7 @@ name = "Regenerate" desc = "We regenerate, healing all damage from our form." req_stat = DEAD + always_keep = 1 //Revive from revival stasis /obj/effect/proc_holder/changeling/revive/sting_action(mob/living/carbon/user) diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 3686a6ccda2..86340e1dfbb 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -40,15 +40,15 @@ This file's folder contains: return M && istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.servants_of_ratvar) /proc/is_eligible_servant(mob/M) - return M && istype(M) && M.mind && !M.mind.special_role && !isloyal(M) + return M && istype(M) && M.mind && !iscultist(M) && !isconstruct(M) && !isloyal(M) /proc/add_servant_of_ratvar(mob/M, silent = FALSE) - if(!is_eligible_servant(M) || !ticker || !ticker.mode) + if(is_servant_of_ratvar(M) || !ticker || !ticker.mode) return 0 if(iscarbon(M)) if(!silent) M << "Your mind is racing! Your body feels incredibly light! Your world glows a brilliant yellow! All at once it comes to you. Ratvar, the Clockwork \ - Justiciar lies in exile, derelict and forgotten in an unseen realm." + Justiciar, lies in exile, derelict and forgotten in an unseen realm." if(!is_eligible_servant(M)) M.visible_message("[M] seems to resist an unseen force!", "And yet, you somehow push it all away.") return 0 @@ -60,6 +60,12 @@ This file's folder contains: M.visible_message("[M] whirs as it resists an outside influence!", \ "Corrupt data purged. Resetting cortex chip to factory defaults... complete.") return 0 + else + if(!silent) + M << "Your world glows a brilliant yellow! All at once it comes to you. Ratvar, the Clockwork Justiciar, lies in exile, derelict and forgotten in an unseen realm." + if(!is_eligible_servant(M)) + M.visible_message("[M] seems to resist an unseen force!", "And yet, you somehow push it all away.") + return 0 if(!silent) M.visible_message("[M]'s eyes glow a blazing yellow!", \ "Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork Justiciar above all else. Perform his every \ diff --git a/code/game/gamemodes/clock_cult/clock_machines.dm b/code/game/gamemodes/clock_cult/clock_machines.dm index 36d0f44d123..da6b4bd14b1 100644 --- a/code/game/gamemodes/clock_cult/clock_machines.dm +++ b/code/game/gamemodes/clock_cult/clock_machines.dm @@ -95,7 +95,7 @@ while(sigilpower && amount >= 50) for(var/S in sigils_in_range) var/obj/effect/clockwork/sigil/transmission/T = S - if(T.modify_charge(50)) + if(amount >= 50 && T.modify_charge(50)) sigilpower -= 50 amount -= 50 var/apcpower = accessable_apc_power() @@ -440,6 +440,7 @@ debris = list(/obj/item/clockwork/component/hierophant_ansible/obelisk) var/hierophant_cost = 50 //how much it costs to broadcast with large text var/gateway_cost = 2000 //how much it costs to open a gateway + var/gateway_active = FALSE /obj/structure/clockwork/powered/clockwork_obelisk/New() ..() @@ -448,15 +449,17 @@ /obj/structure/clockwork/powered/clockwork_obelisk/examine(mob/user) ..() if(is_servant_of_ratvar(user) || isobserver(user)) - user << "It requires [hierophant_cost]W to broadcast over the Hierophant Network, and [gateway_cost]W to open a Spatial Gateway." + user << "It requires [hierophant_cost]W to broadcast over the Hierophant Network, and [gateway_cost]W to open a Spatial Gateway." /obj/structure/clockwork/powered/clockwork_obelisk/process() if(locate(/obj/effect/clockwork/spatial_gateway) in loc) icon_state = active_icon density = 0 + gateway_active = TRUE else icon_state = inactive_icon density = 1 + gateway_active = FALSE /obj/structure/clockwork/powered/clockwork_obelisk/attack_hand(mob/living/user) if(!is_servant_of_ratvar(user) || !total_accessable_power() >= hierophant_cost) @@ -465,19 +468,28 @@ var/choice = alert(user,"You place your hand on the obelisk...",,"Hierophant Broadcast","Spatial Gateway","Cancel") switch(choice) if("Hierophant Broadcast") + if(gateway_active) + user << "The obelisk is sustaining a gateway and cannot broadcast!" + return var/input = stripped_input(usr, "Please choose a message to send over the Hierophant Network.", "Hierophant Broadcast", "") - if(user.canUseTopic(src, be_close = 1)) - if(try_use_power(hierophant_cost)) - user.say("Uvrebcunag Oebnqpnfg, npgvingr!") - send_hierophant_message(user, input, 1) - else - user << "The obelisk lacks the power to broadcast!" + if(!input || !user.canUseTopic(src, be_close = 1)) + return + if(gateway_active) + user << "The obelisk is sustaining a gateway and cannot broadcast!" + return + if(!try_use_power(hierophant_cost)) + user << "The obelisk lacks the power to broadcast!" + return + user.say("Uvrebcunag Oebnqpnfg, npgvingr!") + send_hierophant_message(user, input, 1) if("Spatial Gateway") - if(total_accessable_power() >= gateway_cost) - if(procure_gateway(user, 100, 5, 1)) - user.say("Fcnpvny tngrjnl, npgvingr!") - try_use_power(gateway_cost) - else - user << "The obelisk lacks the power to open a gateway!" + if(gateway_active) + user << "The obelisk is already sustaining a gateway!" + return + if(!try_use_power(gateway_cost)) + user << "The obelisk lacks the power to open a gateway!" + return + if(procure_gateway(user, 100, 5, 1)) + user.say("Fcnpvny Tngrjnl, npgvingr!") if("Cancel") return diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm index f838c379bc7..48e460dc319 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs.dm @@ -1,11 +1,12 @@ -/mob/living/simple_animal/hostile/anima_fragment //Anima fragment: Low health but high melee power. Created by inserting a soul vessel into an empty fragment. +/mob/living/simple_animal/hostile/anima_fragment //Anima fragment: High health and high melee damage, but slows down when struck. Created by inserting a soul vessel into an empty fragment. name = "anima fragment" desc = "An ominous humanoid shell with a spinning cogwheel as its head, lifted by a jet of blazing red flame." faction = list("ratvar") icon = 'icons/mob/clockwork_mobs.dmi' icon_state = "anime_fragment" - health = 75 //Glass cannon - maxHealth = 75 + health = 120 + maxHealth = 120 + speed = -1 minbodytemp = 0 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) //Robotic healable = FALSE @@ -13,9 +14,13 @@ melee_damage_upper = 25 attacktext = "crushes" attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg' - var/playstyle_string = "You are an anima fragment, a clockwork creation of Ratvar. As a fragment, you are weak but possess powerful melee capabilities \ - in addition to being immune to extreme temperatures and pressures. Your goal is to serve the Justiciar and his servants in any way you can. You yourself are one of these servants, and will \ - be able to utilize anything they can, assuming it doesn't require opposable thumbs." + loot = list(/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment, /obj/item/device/mmi/posibrain/soul_vessel) + del_on_death = TRUE + death_sound = 'sound/magic/clockwork/anima_fragment_death.ogg' + var/playstyle_string = "You are an anima fragment, a clockwork creation of Ratvar. As a fragment, you have medium health, do decent damage, and move at \ + extreme speed in addition to being immune to extreme temperatures and pressures. Taking damage will temporarily slow you down, however. Your goal is to serve the Justiciar and his servants \ + in any way you can. You yourself are one of these servants, and will be able to utilize anything they can, assuming it doesn't require opposable thumbs." + var/movement_delay_time //how long the fragment is slowed after being hit /mob/living/simple_animal/hostile/anima_fragment/New() ..() @@ -24,16 +29,32 @@ real_name = name desc = "I-it's not like I want to show you the light of the Justiciar or anything, B-BAKA!" +/mob/living/simple_animal/hostile/anima_fragment/Stat() + ..() + if(statpanel("Status") && movement_delay_time > world.time && !ratvar_awakens) + stat(null, "Movement delay(seconds): [max(round((movement_delay_time - world.time)*0.1, 0.1), 0)]") + /mob/living/simple_animal/hostile/anima_fragment/death(gibbed) ..(TRUE) visible_message("[src]'s flame jets cut out as it falls to the floor with a tremendous crash. A cube of metal tumbles out, whirring and sputtering.", \ - "Your gears seize up. Your flame jets flicker. Your soul vessel belches smoke as you helplessly crash down.") - playsound(src, 'sound/magic/clockwork/anima_fragment_death.ogg', 100, 1) - new/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment(get_turf(src)) - new/obj/item/device/mmi/posibrain/soul_vessel(get_turf(src)) //Notice the lack of transfer - it's a standard soul vessel with no mind in it! - qdel(src) + "Your gears seize up. Your flame jets flicker out. Your soul vessel belches smoke as you helplessly crash down.") return 1 +/mob/living/simple_animal/hostile/anima_fragment/Process_Spacemove(movement_dir = 0) + return 1 + +/mob/living/simple_animal/hostile/anima_fragment/movement_delay() + . = ..() + if(movement_delay_time > world.time && !ratvar_awakens) + . += min((movement_delay_time - world.time) * 0.1, 10) //the more delay we have, the slower we go + +/mob/living/simple_animal/hostile/anima_fragment/adjustHealth(amount) + . = ..() + if(!ratvar_awakens) //if ratvar is up we ignore movement delay + if(movement_delay_time > world.time) + movement_delay_time = movement_delay_time + amount*2 + else + movement_delay_time = world.time + amount*2 /mob/living/simple_animal/hostile/clockwork_marauder //Clockwork marauder: Slow but with high damage, resides inside of a servant. Created via the Memory Allocation scripture. @@ -155,6 +176,7 @@ resulthealth = round((abs(config.health_threshold_dead - host.health) / abs(config.health_threshold_dead - host.maxHealth)) * 100) stat(null, "Host Health: [resulthealth]%") stat(null, "You are [recovering ? "too weak" : "able"] to deploy!") + stat(null, "You do [melee_damage_upper] on melee attacks.") /mob/living/simple_animal/hostile/clockwork_marauder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans) ..() @@ -292,7 +314,10 @@ if(!is_in_host()) return 0 if(recovering) - host << "[true_name] is too weak to come forth!" + if(hostchosen) + host << "[true_name] is too weak to come forth!" + else + host << "[true_name] tries to emerge to protect you, but it's too weak!" src << "You try to come forth, but you're too weak!" return 0 if(hostchosen) //marauder approved diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm index 07f48bba367..1c34f1bf0ac 100644 --- a/code/game/gamemodes/clock_cult/clock_scripture.dm +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -645,7 +645,8 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed /datum/clockwork_scripture/create_object/anima_fragment //Anima Fragment: Creates an empty anima fragment name = "Anima Fragment" - desc = "Creates a large shell fitted for soul vessels. The result is a powerful construct with low damage tolerance but exceptional melee power." + desc = "Creates a large shell fitted for soul vessels. Adding an active sould vessel to it results in a powerful construct with decent health, notable melee power, \ + and exceptional speed, though taking damage will temporarily slow it down." invocations = list("Pnyy sbegu...", "...gur fbyqvref-bs Nezbere.") channel_time = 50 required_components = list("belligerent_eye" = 2, "guvax_capacitor" = 1, "replicant_alloy" = 2) @@ -731,14 +732,15 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed return 0 invoker.notransform = FALSE slab.busy = null - var/list/marauder_candidates = get_candidates(ROLE_SERVANT_OF_RATVAR) + invoker << "The tendril shivers slightly as it selects a marauder..." + var/list/marauder_candidates = pollCandidates("Do you want to play as the clockwork marauder of [invoker.real_name]?", ROLE_SERVANT_OF_RATVAR, null, FALSE, 100) if(!marauder_candidates.len) invoker.visible_message("The tendril retracts from [invoker]'s head, sealing the entry wound as it does so!", \ "The tendril was unsuccessful! Perhaps you should try again another time.") return 0 - var/client/new_marauder = pick(marauder_candidates) + var/mob/dead/observer/theghost = pick(marauder_candidates) var/mob/living/simple_animal/hostile/clockwork_marauder/M = new(invoker) - M.client = new_marauder + M.key = theghost.key M.host = invoker M << M.playstyle_string M << "Your true name is \"[M.true_name]\". You can change this once by using the Change True Name verb in your Marauder tab." diff --git a/code/game/gamemodes/clock_cult/clock_structures.dm b/code/game/gamemodes/clock_cult/clock_structures.dm index e6092eae7a2..6a638542aac 100644 --- a/code/game/gamemodes/clock_cult/clock_structures.dm +++ b/code/game/gamemodes/clock_cult/clock_structures.dm @@ -447,6 +447,7 @@ else sender = TRUE gatewayB.sender = FALSE + gatewayB.density = FALSE lifetime = set_duration gatewayB.lifetime = set_duration uses = set_uses @@ -461,7 +462,7 @@ /obj/effect/clockwork/spatial_gateway/attack_hand(mob/living/user) if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) var/mob/living/L = user.pulling - if(L.buckled || L.anchored || L.buckled_mobs.len) + if(L.buckled || L.anchored || L.has_buckled_mobs()) return 0 user.visible_message("[user] shoves [L] into [src]!", "You shove [L] into [src]!") user.stop_pulling() @@ -480,6 +481,7 @@ qdel(src) return 1 if(user.drop_item()) + user.visible_message("[user] drops [I] into [src]!", "You drop [I] into [src]!") pass_through_gateway(I) ..() @@ -529,7 +531,7 @@ animate(src, alpha = 0, time = 10) addtimer(src, "selfdel", 10) -/obj/effect/clockwerk/general_marker/proc/selfdel() +/obj/effect/clockwork/general_marker/proc/selfdel() qdel(src) /obj/effect/clockwork/general_marker/nezbere diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index de4443926b8..caa390984df 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -4,7 +4,7 @@ desc = "A currently unactivated swarmer. Swarmers can self activate at any time, it would be wise to immediately dispose of this." icon = 'icons/mob/swarmer.dmi' icon_state = "swarmer_unactivated" - origin_tech = "bluespace=4;materials=4;programming=6" + origin_tech = "bluespace=4;materials=4;programming=7" materials = list(MAT_METAL=10000, MAT_GLASS=4000) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 33ac8c417b5..c8c8eea8984 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -5,8 +5,8 @@ /datum/game_mode/nuclear name = "nuclear emergency" config_tag = "nuclear" - required_players = 30 // 30 players - 5 players to be the nuke ops = 25 players remaining - required_enemies = 5 + required_players = 30 // 30 players - 3 players to be the nuke ops = 27 players remaining + required_enemies = 2 recommended_enemies = 5 antag_flag = ROLE_OPERATIVE enemy_minimum_age = 14 @@ -23,21 +23,17 @@ world << "A nuclear explosive was being transported by Nanotrasen to a military base. The transport ship mysteriously lost contact with Space Traffic Control (STC). About that time a strange disk was discovered around [station_name()]. It was identified by Nanotrasen as a nuclear auth. disk and now Syndicate Operatives have arrived to retake the disk and detonate SS13! Also, most likely Syndicate star ships are in the vicinity so take care not to lose the disk!\nSyndicate: Reclaim the disk and detonate the nuclear bomb anywhere on SS13.\nPersonnel: Hold the disk and escape with the disk on the shuttle!" /datum/game_mode/nuclear/pre_setup() - var/agent_number = 0 - if(antag_candidates.len > agents_possible) - agent_number = agents_possible - else - agent_number = antag_candidates.len - var/n_players = num_players() - if(agent_number > n_players) - agent_number = n_players/2 + var/n_agents = min(round(n_players / 10, 1), agents_possible) - while(agent_number > 0) + if(antag_candidates.len < n_agents) //In the case of having less candidates than the selected number of agents + n_agents = antag_candidates.len + + while(n_agents > 0) var/datum/mind/new_syndicate = pick(antag_candidates) syndicates += new_syndicate antag_candidates -= new_syndicate //So it doesn't pick the same guy each time. - agent_number-- + n_agents-- for(var/datum/mind/synd_mind in syndicates) synd_mind.assigned_role = "Syndicate" @@ -85,7 +81,7 @@ greet_syndicate(synd_mind) equip_syndicate(synd_mind.current) - if (nuke_code) + if(nuke_code) synd_mind.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) synd_mind.current << "The nuclear authorization code is: [nuke_code]" @@ -128,7 +124,7 @@ if(A) A.command = TRUE - if (nuke_code) + if(nuke_code) var/obj/item/weapon/paper/P = new P.info = "The nuclear authorization code is: [nuke_code]" P.name = "nuclear bomb code" @@ -149,7 +145,7 @@ /datum/game_mode/proc/greet_syndicate(datum/mind/syndicate, you_are=1) - if (you_are) + if(you_are) syndicate.current << "You are a [syndicate_name()] agent!" var/obj_count = 1 for(var/datum/objective/objective in syndicate.objectives) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 41f37f98540..430cfb3552d 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -136,7 +136,7 @@ if(user.pulledby) user.pulledby.stop_pulling() user.stop_pulling() - if(user.buckled_mobs.len) + if(user.has_buckled_mobs()) user.unbuckle_all_mobs(force=1) sleep(40) //4 seconds if(!qdeleted(user)) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 3aafdb2b324..53e482f751f 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -47,7 +47,7 @@ /obj/machinery/autolathe/New() ..() - materials = new /datum/material_container(src, list(MAT_METAL=1, MAT_GLASS=1)) + materials = new /datum/material_container(src, list(MAT_METAL, MAT_GLASS)) var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/autolathe(null) B.apply_default_parts(src) @@ -244,7 +244,7 @@ return /obj/machinery/autolathe/RefreshParts() - var/T =1.2 + var/T = 0 for(var/obj/item/weapon/stock_parts/matter_bin/MB in component_parts) T += MB.rating*75000 materials.max_amount = T @@ -255,9 +255,7 @@ /obj/machinery/autolathe/proc/main_win(mob/user) var/dat = "

Autolathe Menu:


" - dat += "Total amount: [materials.total_amount] / [materials.max_amount] cm3
" - dat += "Metal amount: [materials.amount(MAT_METAL)] cm3
" - dat += "Glass amount: [materials.amount(MAT_GLASS)] cm3
" + dat += materials_printout() dat += "
\ \ @@ -284,9 +282,7 @@ /obj/machinery/autolathe/proc/category_win(mob/user,selected_category) var/dat = "Return to main menu" dat += "

Browsing [selected_category]:


" - dat += "Total amount: [materials.total_amount] / [materials.max_amount] cm3
" - dat += "Metal amount: [materials.amount(MAT_METAL)] cm3
" - dat += "Glass amount: [materials.amount(MAT_GLASS)] cm3
" + dat += materials_printout() for(var/v in files.known_designs) var/datum/design/D = files.known_designs[v] @@ -315,9 +311,7 @@ /obj/machinery/autolathe/proc/search_win(mob/user) var/dat = "Return to main menu" dat += "

Search results:


" - dat += "Total amount: [materials.total_amount] / [materials.max_amount] cm3
" - dat += "Metal amount: [materials.amount(MAT_METAL)] cm3
" - dat += "Glass amount: [materials.amount(MAT_GLASS)] cm3
" + dat += materials_printout() for(var/v in matching_designs) var/datum/design/D = v @@ -340,6 +334,13 @@ dat += "
" return dat +/obj/machinery/autolathe/proc/materials_printout() + var/dat = "Total amount: [materials.total_amount] / [materials.max_amount] cm3
" + for(var/mat_id in materials.materials) + var/datum/material/M = materials.materials[mat_id] + dat += "[M.name] amount: [M.amount] cm3
" + return dat + /obj/machinery/autolathe/proc/can_build(datum/design/D) var/coeff = (ispath(D.build_path,/obj/item/stack) ? 1 : prod_coeff) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 0bbbeda6165..3413b500502 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -504,12 +504,16 @@ var/time_last_changed_position = 0 /obj/machinery/computer/card/minor/hos target_dept = 2 + icon_screen = "idhos" /obj/machinery/computer/card/minor/cmo target_dept = 3 + icon_screen = "idcmo" /obj/machinery/computer/card/minor/rd target_dept = 4 + icon_screen = "idrd" /obj/machinery/computer/card/minor/ce target_dept = 5 + icon_screen = "idce" diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 07e44ffe1be..a3663f95612 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -55,7 +55,7 @@ /obj/machinery/droneDispenser/New() ..() health = max_health - materials = new(src, list(MAT_METAL=1, MAT_GLASS=1), + materials = new(src, list(MAT_METAL, MAT_GLASS), MINERAL_MATERIAL_AMOUNT*MAX_STACK_SIZE*2) using_materials = list(MAT_METAL=metal_cost, MAT_GLASS=glass_cost) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 7207a48eca0..cf68238065e 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -96,6 +96,7 @@ Class Procs: /obj/machinery name = "machinery" icon = 'icons/obj/stationobjs.dmi' + verb_say = "beeps" verb_yell = "blares" pressure_resistance = 10 var/stat = 0 @@ -177,11 +178,11 @@ Class Procs: density = 1 if(!target) for(var/mob/living/carbon/C in loc) - if(C.buckled || C.buckled_mobs.len) + if(C.buckled || C.has_buckled_mobs()) continue else target = C - if(target && !target.buckled && !target.buckled_mobs.len) + if(target && !target.buckled && !target.has_buckled_mobs()) occupant = target target.forceMove(src) updateUsrDialog() diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 1725f6e06d7..4bc0a4a5418 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -20,7 +20,7 @@ var/const/SAFETY_COOLDOWN = 100 /obj/machinery/recycler/New() ..() - materials = new /datum/material_container(src, list(MAT_METAL=1, MAT_GLASS=1, MAT_PLASMA=1, MAT_SILVER=1, MAT_GOLD=1, MAT_DIAMOND=1, MAT_URANIUM=1, MAT_BANANIUM=1)) + materials = new /datum/material_container(src, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM)) var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/recycler(null) B.apply_default_parts(src) update_icon() diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index f43d5b07698..1acadfa6173 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -226,7 +226,7 @@ if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) var/mob/living/L = user.pulling - if(L.buckled || L.buckled_mobs.len) + if(L.buckled || L.has_buckled_mobs()) return if(state_open) if(iscorgi(L)) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 732fdc85a09..4da9c5feb8e 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -77,7 +77,7 @@ if(target.buckled) occupant_message("[target] will not fit into the sleeper because they are buckled to [target.buckled]!") return - if(target.buckled_mobs.len) + if(target.has_buckled_mobs()) occupant_message("[target] will not fit into the sleeper because of the creatures attached to it!") return if(patient) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 429460f0d67..c564e924fab 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -11,19 +11,8 @@ req_access = list(access_robotics) var/time_coeff = 1 var/component_coeff = 1 - var/list/resources = list( - MAT_METAL=0, - MAT_GLASS=0, - MAT_BANANIUM=0, - MAT_DIAMOND=0, - MAT_GOLD=0, - MAT_PLASMA=0, - MAT_SILVER=0, - MAT_URANIUM=0 - ) - var/res_max_amount = 200000 + var/datum/material_container/materials var/datum/research/files - var/id var/sync = 0 var/part_set var/datum/design/being_built @@ -47,9 +36,10 @@ /obj/machinery/mecha_part_fabricator/New() ..() + files = new /datum/research(src) //Setup the research data holder. + materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM)) var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mechfab(null) B.apply_default_parts(src) - files = new /datum/research(src) //Setup the research data holder. /obj/item/weapon/circuitboard/machine/mechfab name = "circuit board (Exosuit Fabricator)" @@ -64,10 +54,10 @@ /obj/machinery/mecha_part_fabricator/RefreshParts() var/T = 0 - //maximum stocking amount (max 412000) + //maximum stocking amount (default 300000, 600000 at T4) for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) T += M.rating - res_max_amount = (187000+(T * 37500)) + materials.max_amount = (200000 + (T*50000)) //resources adjustment coefficient (1 -> 0.85 -> 0.7 -> 0.55) T = 1.15 @@ -93,24 +83,20 @@ return 0 return 1 -/obj/machinery/mecha_part_fabricator/proc/emag() - switch(emagged) - if(0) - emagged = 0.5 - visible_message("\icon[src] \The [src] beeps: \"DB error \[Code 0x00F1\]\"") - sleep(10) - visible_message("\icon[src] \The [src] beeps: \"Attempting auto-repair\"") - sleep(15) - visible_message("\icon[src] \The [src] beeps: \"User DB corrupted \[Code 0x00FA\]. Truncating data structure...\"") - sleep(30) - visible_message("\icon[src] \The [src] beeps: \"User DB truncated. Please contact your Nanotrasen system operator for future assistance.\"") - req_access = null - emagged = 1 - if(0.5) - visible_message("\icon[src] \The [src] beeps: \"DB not responding \[Code 0x0003\]...\"") - if(1) - visible_message("\icon[src] \The [src] beeps: \"No records in User DB\"") - return +/obj/machinery/mecha_part_fabricator/emag_act() + if(emagged) + return + + emagged = 0.5 + say("DB error \[Code 0x00F1\]") + sleep(10) + say("Attempting auto-repair...") + sleep(15) + say("User DB corrupted \[Code 0x00FA\]. Truncating data structure...") + sleep(30) + say("User DB truncated. Please contact your Nanotrasen system operator for future assistance.") + req_access = null + emagged = 1 /obj/machinery/mecha_part_fabricator/proc/output_parts_list(set_name) var/output = "" @@ -119,8 +105,10 @@ if(D.build_type & MECHFAB) if(!(set_name in D.category)) continue - var/resources_available = check_resources(D) - output += "
[output_part_info(D)]
\[[resources_available?"Build | ":null]Add to queue\]\[?\]
" + output += "
[output_part_info(D)]
\[" + if(check_resources(D)) + output += "Build | " + output += "Add to queue\]\[?\]
" return output /obj/machinery/mecha_part_fabricator/proc/output_part_info(datum/design/D) @@ -131,39 +119,42 @@ var/i = 0 var/output for(var/c in D.materials) - if(c in resources) - output += "[i?" | ":null][get_resource_cost_w_coeff(D,c)] [material2name(c)]" - i++ + output += "[i?" | ":null][get_resource_cost_w_coeff(D, c)] [material2name(c)]" + i++ return output /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 += "[material2name(resource)]: [amount] cm³" - if(amount>0) - output += "- Remove \[1\] | \[10\] | \[All\]" + for(var/mat_id in materials.materials) + var/datum/material/M = materials.materials[mat_id] + output += "[M.name]: [M.amount] cm³" + if(M.amount >= MINERAL_MATERIAL_AMOUNT) + output += "- Remove \[1\]" + if(M.amount >= (MINERAL_MATERIAL_AMOUNT * 10)) + output += " | \[10\]" + output += " | \[All\]" output += "
" return output -/obj/machinery/mecha_part_fabricator/proc/remove_resources(datum/design/D) - for(var/resource in D.materials) - if(resource in resources) - resources[resource] -= get_resource_cost_w_coeff(D,resource) +/obj/machinery/mecha_part_fabricator/proc/get_resources_w_coeff(datum/design/D) + var/list/resources = list() + for(var/R in D.materials) + resources[R] = get_resource_cost_w_coeff(D, R) + return resources /obj/machinery/mecha_part_fabricator/proc/check_resources(datum/design/D) - for(var/R in D.materials) - if(R in resources) - if(resources[R] < get_resource_cost_w_coeff(D, R)) - return 0 - else - return 0 - return 1 + if(D.reagents.len) // No reagents storage - no reagent designs. + return 0 + if(materials.has_materials(get_resources_w_coeff(D))) + return 1 + return 0 /obj/machinery/mecha_part_fabricator/proc/build_part(datum/design/D) being_built = D desc = "It's building \a [initial(D.name)]." - remove_resources(D) + var/list/res_coef = get_resources_w_coeff(D) + + materials.use_amount(res_coef) overlays += "fab-active" use_power = 2 updateUsrDialog() @@ -174,9 +165,8 @@ var/location = get_step(src,(dir)) var/obj/item/I = new D.build_path(location) - I.materials[MAT_METAL] = get_resource_cost_w_coeff(D,MAT_METAL) - I.materials[MAT_GLASS] = get_resource_cost_w_coeff(D,MAT_GLASS) - visible_message("\icon[src] \The [src] beeps, \"\The [I] is complete.\"") + I.materials = res_coef + say("\The [I] is complete.") being_built = null updateUsrDialog() @@ -220,14 +210,14 @@ if(stat&(NOPOWER|BROKEN)) return 0 if(!check_resources(D)) - visible_message("\icon[src] \The [src] beeps, \"Not enough resources. Queue processing stopped.\"") + say("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(D) D = listgetindex(queue, 1) - visible_message("\icon[src] \The [src] beeps, \"Queue processing finished successfully.\"") + say("Queue processing finished successfully.") /obj/machinery/mecha_part_fabricator/proc/list_queue() var/output = "Queue contains:" @@ -239,7 +229,11 @@ for(var/datum/design/D in queue) i++ var/obj/part = D.build_path - output += "[initial(part.name)] - [i>1?"":null] [i↓":null] Remove" + output += "" + output += initial(part.name) + " - " + output += "[i>1?"":null] " + output += "[i↓":null] " + output += "Remove" output += "" output += "\[Process queue | Clear queue\]" @@ -265,7 +259,7 @@ temp += "Return" updateUsrDialog() - visible_message("\icon[src] \The [src] beeps, \"Successfully synchronized with R&D server.\"") + say("Successfully synchronized with R&D server.") return temp = "Unable to connect to local R&D Database.
Please check your connections and try again.
Return" @@ -289,7 +283,7 @@ user.set_machine(src) var/turf/exit = get_step(src,(dir)) if(exit.density) - visible_message("\icon[src] \The [src] beeps, \"Error! Part outlet is obstructed.\"") + say("Error! Part outlet is obstructed.") return if(temp) left_part = temp @@ -303,7 +297,7 @@ left_part = output_available_resources()+"
" left_part += "Sync with R&D servers
" for(var/part_set in part_sets) - left_part += "[part_set] - \[Add all parts to queue\]
" + left_part += "
[part_set] - \[Add all parts to queue
\]" if("parts") left_part += output_parts_list(part_set) left_part += "
Return" @@ -416,124 +410,57 @@ break if(href_list["remove_mat"] && href_list["material"]) - var/amount = text2num(href_list["remove_mat"]) - var/material = href_list["material"] - if(amount < 0 || amount > resources[material]) //href protection - return - - var/removed = remove_material(material,amount) - if(removed == -1) - temp = "Not enough [material2name(material)] to produce a sheet." - else - temp = "Ejected [removed] of [material2name(material)]" - temp += "
Return" + materials.retrieve_sheets(text2num(href_list["remove_mat"]), href_list["material"]) updateUsrDialog() return -/obj/machinery/mecha_part_fabricator/proc/remove_material(mat_string, amount) - if(resources[mat_string] < MINERAL_MATERIAL_AMOUNT) //not enough mineral for a sheet - return -1 - var/type - switch(mat_string) - if(MAT_METAL) - type = /obj/item/stack/sheet/metal - if(MAT_GLASS) - type = /obj/item/stack/sheet/glass - if(MAT_GOLD) - type = /obj/item/stack/sheet/mineral/gold - if(MAT_SILVER) - type = /obj/item/stack/sheet/mineral/silver - if(MAT_DIAMOND) - type = /obj/item/stack/sheet/mineral/diamond - if(MAT_PLASMA) - type = /obj/item/stack/sheet/mineral/plasma - if(MAT_URANIUM) - type = /obj/item/stack/sheet/mineral/uranium - if(MAT_BANANIUM) - type = /obj/item/stack/sheet/mineral/bananium - else - return 0 - var/result = 0 - - while(amount > 50) - new type(get_turf(src),50) - amount -= 50 - result += 50 - resources[mat_string] -= 50 * MINERAL_MATERIAL_AMOUNT - - var/total_amount = round(resources[mat_string]/MINERAL_MATERIAL_AMOUNT) - if(total_amount)//if there's still enough material for sheets - var/obj/item/stack/sheet/res = new type(get_turf(src),min(amount,total_amount)) - resources[mat_string] -= res.amount*MINERAL_MATERIAL_AMOUNT - result += res.amount - - return result - /obj/machinery/mecha_part_fabricator/deconstruction() - for(var/material in resources) - remove_material(material, resources[material]/MINERAL_MATERIAL_AMOUNT) + materials.retrieve_all() + ..() -/obj/machinery/mecha_part_fabricator/attackby(obj/W, mob/user, params) +/obj/machinery/mecha_part_fabricator/attackby(obj/item/W, mob/user, params) if(default_deconstruction_screwdriver(user, "fab-o", "fab-idle", W)) - return + return 1 if(exchange_parts(user, W)) - return + return 1 if(default_deconstruction_crowbar(W)) return 1 - if(istype(W, /obj/item/stack)) + if(istype(W, /obj/item/stack/sheet)) if(panel_open) - user << "You can't load \the [name] while it's opened!" + user << "You can't load [src] while it's opened!" return 1 - var/material - switch(W.type) - if(/obj/item/stack/sheet/mineral/gold) - material = MAT_GOLD - if(/obj/item/stack/sheet/mineral/silver) - material = MAT_SILVER - if(/obj/item/stack/sheet/mineral/diamond) - material = MAT_DIAMOND - if(/obj/item/stack/sheet/mineral/plasma) - material = MAT_PLASMA - if(/obj/item/stack/sheet/metal) - material = MAT_METAL - if(/obj/item/stack/sheet/glass) - material = MAT_GLASS - if(/obj/item/stack/sheet/mineral/bananium) - material = MAT_BANANIUM - if(/obj/item/stack/sheet/mineral/uranium) - material = MAT_URANIUM - else - return ..() - if(being_built) user << "\The [src] is currently processing! Please wait until completion." - return - if(res_max_amount - resources[material] < MINERAL_MATERIAL_AMOUNT) //overstuffing the fabricator - user << "\The [src] [material2name(material)] storage is full!" - return - var/obj/item/stack/sheet/stack = W - var/sname = "[stack.name]" - if(resources[material] < res_max_amount) - overlays += "fab-load-[material2name(material)]"//loading animation is now an overlay based on material type. No more spontaneous conversion of all ores to metal. -vey + return 1 + + var/material_amount = materials.get_item_material_amount(W) + if(!material_amount) + user << "This object does not contain sufficient amounts of materials to be accepted by [src]." + return 1 + if(!materials.has_space(material_amount)) + user << "\The [src] is full. Please remove some materials from [src] in order to insert more." + return 1 + if(!user.unEquip(W)) + user << "\The [W] is stuck to you and cannot be placed into [src]." + return 1 + + var/inserted = materials.insert_item(W) + if(inserted) + user << "You insert [inserted] sheet\s into [src]." + if(W && W.materials.len) + var/mat_overlay = "fab-load-[material2name(W.materials[1])]" + overlays += mat_overlay + sleep(10) + overlays -= mat_overlay //No matter what the overlay shall still be deleted + + updateUsrDialog() - var/transfer_amount = min(stack.amount, round((res_max_amount - resources[material])/MINERAL_MATERIAL_AMOUNT,1)) - resources[material] += transfer_amount * MINERAL_MATERIAL_AMOUNT - stack.use(transfer_amount) - user << "You insert [transfer_amount] [sname] sheet\s into \the [src]." - sleep(10) - updateUsrDialog() - overlays -= "fab-load-[material2name(material)]" //No matter what the overlay shall still be deleted - else - user << "\The [src] cannot hold any more [sname] sheet\s!" else return ..() /obj/machinery/mecha_part_fabricator/proc/material2name(ID) - return copytext(ID,2) - -/obj/machinery/mecha_part_fabricator/emag_act() - emag() + return copytext(ID,2) \ No newline at end of file diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 5ab9bfc6618..5952e4bdca2 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -806,7 +806,7 @@ user << "You are currently buckled and cannot move." log_append_to_last("Permission denied.") return - if(user.buckled_mobs.len) //mob attached to us + if(user.has_buckled_mobs()) //mob attached to us user << "You can't enter the exosuit with other creatures attached to you!" return @@ -819,7 +819,7 @@ user << "[occupant] was faster! Try better next time, loser." else if(user.buckled) user << "You can't enter the exosuit while buckled." - else if(user.buckled_mobs.len) + else if(user.has_buckled_mobs()) user << "You can't enter the exosuit with other creatures attached to you!" else moved_inside(user) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 5e16e3f3bc7..46e675245a3 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -4,15 +4,13 @@ var/can_buckle = 0 var/buckle_lying = -1 //bed-like behaviour, forces mob.lying = buckle_lying if != -1 var/buckle_requires_restraints = 0 //require people to be handcuffed before being able to buckle. eg: pipes - var/list/mob/living/buckled_mobs = list() + var/list/mob/living/buckled_mobs = null //list() var/max_buckled_mobs = 1 - - //Interaction /atom/movable/attack_hand(mob/living/user) . = ..() - if(can_buckle && buckled_mobs.len) + if(can_buckle && has_buckled_mobs()) if(buckled_mobs.len > 1) var/unbuckled = input(user, "Who do you wish to unbuckle?","Unbuckle Who?") as null|mob in buckled_mobs if(user_unbuckle_mob(unbuckled,user)) @@ -27,14 +25,23 @@ if(user_buckle_mob(M, user)) return 1 - //Cleanup /atom/movable/Destroy() . = ..() unbuckle_all_mobs(force=1) +/atom/movable/proc/has_buckled_mobs() + if(!buckled_mobs) + return FALSE + if(buckled_mobs.len) + return TRUE + //procs that handle the actual buckling and unbuckling /atom/movable/proc/buckle_mob(mob/living/M, force = 0) + if(!buckled_mobs) + buckled_mobs = list() + if(!M.buckled_mobs) + M.buckled_mobs = list() if((!can_buckle && !force) || !istype(M) || (M.loc != loc) || M.buckled || (M.buckled_mobs.len >= max_buckled_mobs) || (buckle_requires_restraints && !M.restrained()) || M == src) return 0 if(!M.can_buckle() && !force) @@ -72,6 +79,8 @@ post_buckle_mob(.) /atom/movable/proc/unbuckle_all_mobs(force=0) + if(!has_buckled_mobs()) + return for(var/m in buckled_mobs) unbuckle_mob(m, force) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 458633001ca..843bf4411b8 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -172,7 +172,7 @@ ..() var/turf/open/T = get_turf(src) if(istype(T)) - T.atmos_spawn_air("o2=15;plasma=15;TEMP=1000") + T.atmos_spawn_air("o2=5;plasma=5;TEMP=1000") ///////////////////// diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index a8de11836a8..883f9d57699 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -10,6 +10,7 @@ var/mob/attacher = null var/valve_open = 0 var/toggle = 1 + origin_tech = "materials=1;engineering=1" /obj/item/device/transfer_valve/IsAssemblyHolder() return 1 diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index c3c90724557..1ca25b3b218 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -194,6 +194,26 @@ return 1 +/obj/item/borg/upgrade/hyperka + name = "mining cyborg hyper-kinetic accelerator" + desc = "A satchel of holding replacement for mining cyborg's ore satchel module." + icon_state = "cyborg_upgrade3" + require_module = 1 + module_type = /obj/item/weapon/robot_module/miner + origin_tech = "materials=6;powerstorage=4;engineering=4;magnets=4;combat=4" + +/obj/item/borg/upgrade/hyperka/action(mob/living/silicon/robot/R) + if(..()) + return + + for(var/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules) + qdel(H) + + R.module.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg(R.module) + R.module.rebuild() + + return 1 + /obj/item/borg/upgrade/syndicate name = "illegal equipment module" desc = "Unlocks the hidden, deadlier functions of a cyborg" diff --git a/code/game/objects/items/weapons/airlock_painter.dm b/code/game/objects/items/weapons/airlock_painter.dm index b23e2d8ffaf..5d93623fa06 100644 --- a/code/game/objects/items/weapons/airlock_painter.dm +++ b/code/game/objects/items/weapons/airlock_painter.dm @@ -16,6 +16,7 @@ var/obj/item/device/toner/ink = null /obj/item/weapon/airlock_painter/New() + ..() ink = new /obj/item/device/toner(src) //This proc doesn't just check if the painter can be used, but also uses it. diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index b9863412fd5..caf1235aef2 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -1,4 +1,4 @@ -//In this file: C4 and Syndicate Bombs +//In this file: C4 /obj/item/weapon/c4 name = "C-4" diff --git a/code/game/objects/items/weapons/holosign_creator.dm b/code/game/objects/items/weapons/holosign_creator.dm index 23ad73a62ca..7b5404b760d 100644 --- a/code/game/objects/items/weapons/holosign_creator.dm +++ b/code/game/objects/items/weapons/holosign_creator.dm @@ -9,7 +9,7 @@ throwforce = 0 throw_speed = 3 throw_range = 7 - origin_tech = "magnets=3;programming=3" + origin_tech = "magnets=1;programming=3" flags = NOBLUDGEON var/list/signs = list() var/max_signs = 10 @@ -256,4 +256,4 @@ M.electrocute_act(15,"Energy Barrier", safety=1) shockcd = 1 spawn(10) - shockcd = 0 \ No newline at end of file + shockcd = 0 diff --git a/code/game/objects/items/weapons/implants/implant_clown.dm b/code/game/objects/items/weapons/implants/implant_clown.dm new file mode 100644 index 00000000000..01f1e9715b0 --- /dev/null +++ b/code/game/objects/items/weapons/implants/implant_clown.dm @@ -0,0 +1,30 @@ +/obj/item/weapon/implant/sad_trombone + name = "sad trombone implant" + activated = 0 + +/obj/item/weapon/implant/sad_trombone/get_data() + var/dat = {"Implant Specifications:
+ Name: Honk Co. Sad Trombone Implant
+ Life: Activates upon death.
+ "} + return dat + +/obj/item/weapon/implant/sad_trombone/trigger(emote, mob/source) + if(emote == "deathgasp") + playsound(loc, 'sound/misc/sadtrombone.ogg', 50, 0) + +/obj/item/weapon/implanter/sad_trombone + name = "implanter (sad_trombone)" + +/obj/item/weapon/implanter/sad_trombone/New() + imp = new /obj/item/weapon/implant/sad_trombone(src) + ..() + + +/obj/item/weapon/implantcase/sad_trombone + name = "implant case - 'Sad Trombone'" + desc = "A glass case containing a sad trombone implant." + +/obj/item/weapon/implantcase/sad_trombone/New() + imp = new /obj/item/weapon/implant/sad_trombone(src) + ..() diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 4577b3bae40..ec8b97b9099 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -33,7 +33,7 @@ /obj/item/weapon/storage/backpack/holding name = "bag of holding" desc = "A backpack that opens into a localized pocket of Blue Space." - origin_tech = "bluespace=5" + origin_tech = "bluespace=5;materials=4;engineering=4;plasmatech=5" icon_state = "holdingpack" max_w_class = 6 max_combined_w_class = 35 diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 899709fffa0..8e371776775 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -104,6 +104,7 @@ return(BRUTELOSS) /obj/item/weapon/screwdriver/New(loc, var/param_color = null) + ..() if(!icon_state) if(!param_color) param_color = pick("red","blue","pink","brown","green","cyan","yellow") diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index fbae342c1d9..6d5861759c6 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -221,6 +221,11 @@ return /obj/item/weapon/twohanded/dualsaber/attack(mob/target, mob/living/carbon/human/user) + if(user.has_dna()) + if(user.dna.check_mutation(HULK)) + user << "You grip the blade too hard and accidentally close it!" + unwield() + return ..() if(user.disabilities & CLUMSY && (wielded) && prob(40)) impale(user) diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index afa7633b420..397db4429ab 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -18,7 +18,7 @@ return ..() /obj/structure/bed/nest/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user) - if(buckled_mobs.len) + if(has_buckled_mobs()) for(var/buck in buckled_mobs) //breaking a nest releases all the buckled mobs, because the nest isn't holding them down anymore var/mob/living/M = buck @@ -60,7 +60,7 @@ if(!user.getorgan(/obj/item/organ/alien/plasmavessel)) return - if(buckled_mobs.len) + if(has_buckled_mobs()) unbuckle_all_mobs() if(buckle_mob(M)) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index c9ef9d23e8d..f9e96c10e71 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -134,7 +134,7 @@ return var/obj/structure/bed/roller/R = target - if(R.buckled_mobs.len) + if(R.has_buckled_mobs()) if(R.buckled_mobs.len > 1) R.unbuckle_all_mobs() user.visible_message("[user] unbuckles all creatures from [R].") diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 5e0d0478354..bd1d0eb335f 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -71,14 +71,14 @@ return ..() /obj/structure/chair/attack_tk(mob/user) - if(buckled_mobs.len) + if(has_buckled_mobs()) ..() else rotate() return /obj/structure/chair/proc/handle_rotation(direction) - if(buckled_mobs.len) + if(has_buckled_mobs()) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m buckled_mob.buckled = null //Temporary, so Move() succeeds. @@ -99,7 +99,7 @@ /obj/structure/chair/proc/spin() dir = turn(dir, 90) handle_layer() - if(buckled_mobs.len) + if(has_buckled_mobs()) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m buckled_mob.dir = dir @@ -167,7 +167,7 @@ return ..() /obj/structure/chair/comfy/post_buckle_mob(mob/living/M) - if(buckled_mobs.len) + if(has_buckled_mobs()) overlays += armrest else overlays -= armrest @@ -215,7 +215,7 @@ /obj/structure/chair/MouseDrop(over_object, src_location, over_location) . = ..() if(over_object == usr && Adjacent(usr)) - if(!item_chair || !ishuman(usr) || buckled_mobs.len || src.flags & NODECONSTRUCT) + if(!item_chair || !ishuman(usr) || has_buckled_mobs() || src.flags & NODECONSTRUCT) return if(usr.incapacitated()) usr << "You can't do that right now!" @@ -229,7 +229,7 @@ name = "bar stool" desc = "It has some unsavory stains on it..." icon_state = "bar" - item_chair = null + item_chair = /obj/item/chair/stool/bar /obj/item/chair name = "chair" @@ -310,6 +310,12 @@ origin_type = /obj/structure/chair/stool break_chance = 0 //It's too sturdy. +/obj/item/chair/stool/bar + name = "bar stool" + icon_state = "bar" + item_state = "stool_bar" + origin_type = /obj/structure/chair/stool + /obj/item/chair/stool/narsie_act() return //sturdy enough to ignore a god diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index ee5705a79d3..f7bad9cee77 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -141,7 +141,7 @@ if(!isliving(AM)) //let's not put ghosts or camera mobs inside closets... return var/mob/living/L = AM - if(L.anchored || L.buckled || L.incorporeal_move || L.buckled_mobs.len) + if(L.anchored || L.buckled || L.incorporeal_move || L.has_buckled_mobs()) return if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items. if(horizontal && L.density) @@ -160,7 +160,7 @@ return if(!allow_dense && AM.density) return - if(AM.anchored || AM.buckled_mobs.len || (AM.flags & NODROP)) + if(AM.anchored || AM.has_buckled_mobs() || (AM.flags & NODROP)) return else return diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index fbb7b66b47f..7d9b35adf16 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -37,7 +37,7 @@ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(12, 1, src) s.start() - if(buckled_mobs.len) + if(has_buckled_mobs()) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m buckled_mob.electrocute_act(85, src, 1) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index ddfd102d863..41c23a4748f 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -40,7 +40,7 @@ /obj/structure/kitchenspike/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/crowbar)) - if(!buckled_mobs.len) + if(!has_buckled_mobs()) playsound(loc, 'sound/items/Crowbar.ogg', 100, 1) if(do_after(user, 20/I.toolspeed, target = src)) user << "You pry the spikes out of the frame." @@ -57,7 +57,7 @@ if(user.pulling && isliving(user.pulling) && user.a_intent == "grab" && !buckled_mobs.len) var/mob/living/L = user.pulling if(do_mob(user, src, 120)) - if(buckled_mobs.len) //to prevent spam/queing up attacks + if(has_buckled_mobs()) //to prevent spam/queing up attacks return if(L.buckled) return diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 69603d9c9ed..2580ac0a3d1 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -23,7 +23,7 @@ return prob(60) var/obj/structure/bed/B = A - if (istype(A, /obj/structure/bed) && (B.buckled_mobs.len || B.density))//if it's a bed/chair and is dense or someone is buckled, it will not pass + if (istype(A, /obj/structure/bed) && (B.has_buckled_mobs() || B.density))//if it's a bed/chair and is dense or someone is buckled, it will not pass return 0 if (istype(A, /obj/structure/closet/cardboard)) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 0f4e8e3f431..b6f79c129e2 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -64,13 +64,13 @@ if(icon_state == "open") var/mob/living/GM = user.pulling if(user.grab_state >= GRAB_AGGRESSIVE) - if(GM.buckled || GM.buckled_mobs.len) + if(GM.buckled || GM.has_buckled_mobs()) user << "[GM] is attached to something!" return for(var/obj/structure/transit_tube_pod/pod in loc) pod.visible_message("[user] starts putting [GM] into the [pod]!") if(do_after(user, 15, target = src)) - if(GM && user.grab_state >= GRAB_AGGRESSIVE && user.pulling == GM && !GM.buckled && !GM.buckled_mobs.len) + if(GM && user.grab_state >= GRAB_AGGRESSIVE && user.pulling == GM && !GM.buckled && !GM.has_buckled_mobs()) GM.Weaken(5) src.Bumped(GM) break diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 2d23beac576..70642200b56 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -289,8 +289,9 @@ baseturf = /turf/open/floor/plating/lava/smooth icon = 'icons/turf/floors/lava.dmi' icon_state = "unsmooth" - canSmoothWith = list(/turf/closed/wall, /turf/closed/mineral, /turf/open/floor/plating/lava/smooth, /turf/open/floor/plating/lava/smooth/lava_land_surface - ) + smooth = SMOOTH_MORE | SMOOTH_BORDER + canSmoothWith = list(/turf/closed/wall, /turf/closed/mineral, /turf/open/floor/plating/lava/smooth, /turf/open/floor/plating/lava/smooth/lava_land_surface) + /turf/open/floor/plating/lava/smooth/airless initial_gas_mix = "TEMP=2.7" diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index dbe63bcbd3b..f29fd150717 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -10,6 +10,7 @@ var/status = 0 //0 - not readied //1 - bomb finished with welder var/obj/item/device/assembly_holder/bombassembly = null //The first part of the bomb is an assembly holder, holding an igniter+some device var/obj/item/weapon/tank/bombtank = null //the second part of the bomb is a plasma tank + origin_tech = "materials=1;engineering=1" /obj/item/device/onetankbomb/examine(mob/user) ..() diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index 8b3c53864e2..d538c0bad44 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -46,7 +46,7 @@ //heatup/cooldown any mobs buckled to ourselves based on our temperature - if(buckled_mobs.len) + if(has_buckled_mobs()) var/hc = pipe_air.heat_capacity() var/mob/living/heat_source = buckled_mobs[1] //Best guess-estimate of the total bodytemperature of all the mobs, since they share the same environment it's ~ok~ to guess like this @@ -82,7 +82,7 @@ animate(src, color = rgb(h_r, h_g, h_b), time = 20, easing = SINE_EASING) //burn any mobs buckled based on temperature - if(buckled_mobs.len) + if(has_buckled_mobs()) var/heat_limit = 1000 if(pipe_air.temperature > heat_limit + 1) for(var/m in buckled_mobs) diff --git a/code/modules/cargo/exports/research.dm b/code/modules/cargo/exports/research.dm index 004eded9101..2862b6c1f93 100644 --- a/code/modules/cargo/exports/research.dm +++ b/code/modules/cargo/exports/research.dm @@ -17,27 +17,3 @@ var/obj/item/weapon/disk/tech_disk/D = O var/datum/tech/tech = D.stored techLevels[tech.id] = tech.level - - - -// Sell designs -/datum/export/design - cost = 2500 - unit_name = "design data disk" - export_types = list(/obj/item/weapon/disk/design_disk) - var/list/researchDesigns = list() - -/datum/export/design/get_cost(obj/O) - var/obj/item/weapon/disk/design_disk/disk = O - if(!disk.blueprint) - return 0 - var/datum/design/design = disk.blueprint - if(design.id in researchDesigns) - return 0 - return ..() - -/datum/export/design/sell_object(obj/O) - ..() - var/obj/item/weapon/disk/design_disk/disk = O - var/datum/design/design = disk.blueprint - researchDesigns += design.id \ No newline at end of file diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index e98855092f4..1698bef1a0e 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -113,6 +113,12 @@ var/next_external_rsc = 0 directory[ckey] = src //Admin Authorisation + var/localhost_addresses = list("127.0.0.1", "::1") + if(!address || (address in localhost_addresses)) + var/datum/admin_rank/localhost_rank = new("!localhost!", 65535) + if(localhost_rank) + var/datum/admins/localhost_holder = new(localhost_rank, ckey) + localhost_holder.associate(src) if(protected_config.autoadmin) if(!admin_datums[ckey]) var/datum/admin_rank/autorank @@ -127,7 +133,7 @@ var/next_external_rsc = 0 admin_datums[ckey] = D holder = admin_datums[ckey] if(holder) - admins += src + admins |= src holder.owner = src //preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 7ffd3afefd5..8a61348e70a 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -19,6 +19,7 @@ burn_state = FIRE_PROOF /obj/item/clothing/gloves/color/fyellow/New() + ..() siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5) /obj/item/clothing/gloves/color/black @@ -182,6 +183,7 @@ item_color = "mime" /obj/item/clothing/gloves/color/random/New() + ..() var/list/gloves = list( /obj/item/clothing/gloves/color/orange = 1, /obj/item/clothing/gloves/color/red = 1, diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 6aa577594d7..21301636ada 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -4,7 +4,7 @@ icon_state = "helmet" flags = HEADBANGPROTECT item_state = "helmet" - armor = list(melee = 30, bullet = 25, laser = 25,energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 40, bullet = 30, laser = 30,energy = 10, bomb = 25, bio = 0, rad = 0) flags_inv = HIDEEARS cold_protection = HEAD min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 79ac02bad92..12fb3241c2a 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -107,7 +107,7 @@ name = "warden's police hat" desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts." icon_state = "policehelm" - armor = list(melee = 30, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0) strip_delay = 60 dog_fashion = /datum/dog_fashion/head/warden @@ -116,7 +116,7 @@ name = "security beret" desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficent protection." icon_state = "beret_badge" - armor = list(melee = 30, bullet = 25, laser = 25,energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 40, bullet = 30, laser = 30,energy = 10, bomb = 25, bio = 0, rad = 0) strip_delay = 60 dog_fashion = null @@ -129,7 +129,7 @@ name = "warden's beret" desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class." icon_state = "wardenberet" - armor = list(melee = 30, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0) strip_delay = 60 /obj/item/clothing/head/beret/sec/navyofficer diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index da3698024d0..0167f9f8347 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -10,7 +10,7 @@ /obj/item/clothing/shoes/clown_shoes/banana_shoes/New() ..() - bananium = new/datum/material_container(src,list(MAT_BANANIUM=1),200000) + bananium = new/datum/material_container(src,list(MAT_BANANIUM),200000) /obj/item/clothing/shoes/clown_shoes/banana_shoes/step_action() if(on) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 85e9ab69c30..6b9b5d1c8c3 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -50,7 +50,7 @@ icon_state = "advmag0" magboot_state = "advmag" slowdown_active = SHOES_SLOWDOWN - origin_tech = "magnets=6;engineering=4" + origin_tech = null /obj/item/clothing/shoes/magboots/syndie desc = "Reverse-engineered magnetic boots that have a heavy magnetic pull. Property of Gorlex Marauders." diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 3e827ba2ff6..8144bdfceb6 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -15,7 +15,7 @@ icon_state = "armoralt" item_state = "armoralt" blood_overlay_type = "armor" - armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0) dog_fashion = /datum/dog_fashion/back /obj/item/clothing/suit/armor/vest/alt diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm index 1f1b63c9fa3..751089d434d 100644 --- a/code/modules/events/anomaly_pyro.dm +++ b/code/modules/events/anomaly_pyro.dm @@ -30,10 +30,10 @@ if(newAnomaly.loc) var/turf/open/T = get_turf(newAnomaly) if(istype(T)) - T.atmos_spawn_air("o2=200;plasma=200;TEMP=1000") //Make it hot and burny for the new slime + T.atmos_spawn_air("o2=500;plasma=500;TEMP=1000") //Make it hot and burny for the new slime var/mob/living/simple_animal/slime/S = new/mob/living/simple_animal/slime(T) S.colour = pick("red", "orange") S.rabid = 1 - qdel(newAnomaly) \ No newline at end of file + qdel(newAnomaly) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 2b8ae2a3455..3794875dd68 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -363,7 +363,7 @@ KZ.production = (master.spread_cap / initial(master.spread_cap)) * 50 mutations = list() SetOpacity(0) - if(buckled_mobs.len) + if(has_buckled_mobs()) unbuckle_all_mobs(force=1) return ..() @@ -540,7 +540,7 @@ SM.on_grow(src) /obj/effect/spacevine/proc/entangle_mob() - if(!buckled_mobs.len && prob(25)) + if(!has_buckled_mobs() && prob(25)) for(var/mob/living/V in src.loc) entangle(V) if(buckled_mobs.len) diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index 60ce3eda30f..8fe2aebbbde 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -102,7 +102,7 @@ user << "This item is not suitable for the gibber!" return var/mob/living/carbon/C = L - if(C.buckled ||C.buckled_mobs.len) + if(C.buckled ||C.has_buckled_mobs()) user << "[C] is attached to something!" return if(C.abiotic(1) && !ignore_clothing) @@ -112,7 +112,7 @@ user.visible_message("[user] starts to put [C] into the gibber!") src.add_fingerprint(user) if(do_after(user, gibtime, target = src)) - if(C && user.pulling == C && !C.buckled && !C.buckled_mobs.len && !occupant) + if(C && user.pulling == C && !C.buckled && !C.has_buckled_mobs() && !occupant) user.visible_message("[user] stuffs [C] into the gibber!") C.forceMove(src) occupant = C diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index 6b2c96d505d..a0e86524ca9 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -72,7 +72,7 @@ if(target.stat == 0) user << "The monkey is struggling far too much to put it in the recycler." return - if(target.buckled || target.buckled_mobs.len) + if(target.buckled || target.has_buckled_mobs()) user << "The monkey is attached to something." return qdel(target) diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm index 33d0b81700d..51de2d1b845 100644 --- a/code/modules/jobs/job_types/civilian.dm +++ b/code/modules/jobs/job_types/civilian.dm @@ -51,6 +51,10 @@ Clown if(visualsOnly) return + var/obj/item/weapon/implant/sad_trombone/S = new/obj/item/weapon/implant/sad_trombone(H) + S.imp_in = H + S.implanted = 1 + H.dna.add_mutation(CLOWNMUT) H.rename_self("clown") diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 7c8c9cfb5c7..14555fc484a 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -883,6 +883,7 @@ icon_state = "door_electronics" icon = 'icons/obj/module.dmi' sentience_type = SENTIENCE_MINEBOT + origin_tech = "programming=6" /**********************Lazarus Injector**********************/ @@ -900,7 +901,7 @@ var/loaded = 1 var/malfunctioning = 0 var/revive_type = SENTIENCE_ORGANIC //So you can't revive boss monsters or robots with it - origin_tech = "biotech=4" + origin_tech = "biotech=4;magnets=6" /obj/item/weapon/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag) if(!loaded) @@ -1172,4 +1173,3 @@ /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem name = "circuit board (Golem Ship Equipment Vendor)" build_path = /obj/machinery/mineral/equipment_vendor/golem - diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index fdc514247a3..a205133b73b 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -418,7 +418,7 @@ icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "potionflask" w_class = 2 - var/used = 0 + var/used = FALSE /obj/item/weapon/wingpotion/attack_self(mob/living/M) if(used) @@ -426,10 +426,11 @@ else if(iscarbon(M)) var/mob/living/carbon/C = M + CHECK_DNA_AND_SPECIES(C) if(C.wear_mask) C << "It's pretty hard to drink something with a mask on!" else - if(C.dna.species.id != "human") //implying xenoshumans are holy + if(ishumanbasic(C)) //implying xenoshumans are holy C << "You down the elixir, noting nothing else but a terrible aftertaste." else C << "You down the elixir, a terrible pain travels down your back as wings burst out!" @@ -438,4 +439,184 @@ C.adjustBruteLoss(20) C.emote("scream") playsound(loc, 'sound/items/drink.ogg', 50, 1, -1) - src.used = 1 \ No newline at end of file + src.used = TRUE + + +/obj/structure/closet/crate/necropolis/dragon + name = "dragon chest" + +/obj/structure/closet/crate/necropolis/dragon/New() + ..() + var/loot = rand(1,2) + switch(loot) + if(1) + new /obj/item/weapon/melee/ghost_sword(src) + if(2) + new /obj/item/weapon/lava_staff(src) + +/obj/item/weapon/melee/ghost_sword + name = "spectral blade" + desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly." + icon_state = "spectral" + item_state = "spectral" + flags = CONDUCT + sharpness = IS_SHARP + w_class = 4 + force = 1 + throwforce = 1 + hitsound = 'sound/effects/ghost2.ogg' + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended") + var/summon_cooldown = 0 + var/list/mob/dead/observer/spirits + +/obj/item/weapon/melee/ghost_sword/New() + ..() + spirits = list() + SSobj.processing += src + poi_list |= src + +/obj/item/weapon/melee/ghost_sword/Destroy() + for(var/mob/dead/observer/G in spirits) + G.invisibility = initial(G.invisibility) + spirits.Cut() + SSobj.processing -= src + poi_list -= src + . = ..() + +/obj/item/weapon/melee/ghost_sword/attack_self(mob/user) + if(summon_cooldown > world.time) + user << "You just recently called out for aid. You don't want to annoy the spirits." + return + user << "You call out for aid, attempting to summon spirits to your side." + + notify_ghosts("[user] is raising their [src], calling for your help!", + enter_link="(Click to help)", + source = user, action=NOTIFY_ORBIT) + + summon_cooldown = world.time + 600 + +/obj/item/weapon/melee/ghost_sword/Topic(href, href_list) + if(href_list["orbit"]) + var/mob/dead/observer/ghost = usr + if(istype(ghost)) + ghost.ManualFollow(src) + +/obj/item/weapon/melee/ghost_sword/process() + ghost_check() + +/obj/item/weapon/melee/ghost_sword/proc/ghost_check() + var/ghost_counter = 0 + var/turf/T = get_turf(src) + var/list/contents = T.GetAllContents() + var/mob/dead/observer/current_spirits = list() + for(var/mob/dead/observer/G in dead_mob_list) + if(G.orbiting in contents) + ghost_counter++ + G.invisibility = 0 + current_spirits |= G + + for(var/mob/dead/observer/G in spirits - current_spirits) + G.invisibility = initial(G.invisibility) + + spirits = current_spirits + + return ghost_counter + +/obj/item/weapon/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user) + force = 0 + var/ghost_counter = ghost_check() + + force = Clamp((ghost_counter * 4), 0, 75) + user.visible_message("[user] strikes with the force of [ghost_counter] vengeful spirits!") + ..() + +/obj/item/weapon/melee/ghost_sword/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type) + var/ghost_counter = ghost_check() + final_block_chance += Clamp((ghost_counter * 5), 0, 75) + owner.visible_message("[owner] is protected by a ring of [ghost_counter] ghosts!") + return ..() + +//Blood + +/obj/item/weapon/dragons_blood + name = "bottle of dragons blood" + desc = "You're not actually going to drink this, are you?" + icon = 'icons/obj/wizard.dmi' + icon_state = "vial" + +/obj/item/weapon/dragons_blood/attack_self(mob/living/carbon/human/user) + if(!istype(user)) + return + + var/mob/living/carbon/human/H = user + var/random = rand(1,3) + + switch(random) + if(1) + user << "Other than tasting terrible, nothing really happens." + if(2) + user << "Your flesh begins to melt! Miraculously, you seem fine otherwise." + H.set_species(/datum/species/skeleton) + if(3) + user << "You don't feel so good..." + message_admins("[key_name_admin(user)](FLW) has started transforming into a dragon via dragon's blood.") + H.ForceContractDisease(new /datum/disease/transformation/dragon(0)) + + playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1) + qdel(src) + +/datum/disease/transformation/dragon + name = "dragon transformation" + cure_text = "nothing" + cures = list("adminordrazine") + agent = "dragon's blood" + desc = "What do dragons have to do with Space Station 13?" + stage_prob = 20 + severity = BIOHAZARD + visibility_flags = 0 + stage1 = list("Your bones ache.") + stage2 = list("Your skin feels scaley.") + stage3 = list("You have an overwhelming urge to terrorize some peasants.", "Your teeth feel sharper.") + stage4 = list("Your blood burns.") + stage5 = list("You're a fucking dragon.") + new_form = /mob/living/simple_animal/hostile/megafauna/dragon/lesser + + +//Lava Staff + +/obj/item/weapon/lava_staff + name = "staff of lava" + desc = "The ability to fill the emergency shuttle with lava. What more could you want out of life?" + icon_state = "staffofstorms" + item_state = "staffofstorms" + icon = 'icons/obj/guns/magic.dmi' + slot_flags = SLOT_BACK + item_state = "staffofstorms" + w_class = 4 + force = 25 + damtype = BURN + burn_state = LAVA_PROOF + hitsound = 'sound/weapons/sear.ogg' + var/turf_type = /turf/open/floor/plating/lava/smooth + var/cooldown = 200 + var/timer = 0 + var/banned_turfs + +/obj/item/weapon/lava_staff/New() + . = ..() + banned_turfs = typecacheof(list(/turf/open/space/transit, /turf/closed)) + +/obj/item/weapon/lava_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + ..() + if(timer > world.time) + return + + if(is_type_in_typecache(target, banned_turfs)) + return + + if(target in view(user.client.view, get_turf(user))) + var/turf/open/O = target + user.visible_message("[user] turns \the [O] into lava!") + O.ChangeTurf(turf_type) + playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1) + timer = world.time + cooldown diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index ae534acaf49..72e285a0a13 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -233,6 +233,7 @@ qdel(src) /obj/item/weapon/ore/New() + ..() pixel_x = rand(0,16)-8 pixel_y = rand(0,8)-8 @@ -259,6 +260,7 @@ var/value = 1 /obj/item/weapon/coin/New() + ..() pixel_x = rand(0,16)-8 pixel_y = rand(0,8)-8 diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d1ea9204c6e..4b44e8ba77c 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -163,6 +163,7 @@ var/list/image/ghost_images_simple = list() //this is a list of all ghost images if(new_form) icon_state = new_form + ghostimage.icon_state = new_form if(icon_state in ghost_forms_with_directions_list) ghostimage_default.icon_state = new_form + "_nodir" //if this icon has dirs, the default ghostimage must use its nodir version or clients with the preference set to default sprites only will see the dirs else diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm index 8c1c8ea5149..1bd3086e8ce 100644 --- a/code/modules/mob/interactive.dm +++ b/code/modules/mob/interactive.dm @@ -68,9 +68,10 @@ var/list/functions = list("nearbyscan","combat","shitcurity","chatter") var/restrictedJob = 0 var/shouldUseDynamicProc = 0 // switch to make the AI control it's own proccessing - var/alternateProcessing = 0 + var/alternateProcessing = 1 var/forceProcess = 0 - var/processTime = 10 + var/processTime = 8 + var/lastProc = 0 var/list/knownStrings = list() @@ -188,47 +189,82 @@ if(!istype(A,/mob/living/carbon/human/interactive)) return var/mob/living/carbon/human/interactive/T = A - var/cjob = input("Choose Job") as null|anything in SSjob.occupations - if(cjob) - T.myjob = cjob - T.job = T.myjob.title - for(var/obj/item/W in T) - qdel(W) - T.myjob.equip(T) - T.myjob.apply_fingerprints(T) - T.doSetup() - - var/shouldDoppel = input("Do you want the SNPC to disguise themself as a crewmember?") as null|anything in list("Yes","No") - if(shouldDoppel) - if(shouldDoppel == "Yes") - var/list/validchoices = list() - for(var/mob/living/carbon/human/M in mob_list) - validchoices += M - - var/mob/living/carbon/human/chosen = input("Which crewmember?") as null|anything in validchoices - - if(chosen) + var/choice = input("Customization Choices") as null|anything in list("Service NPC","Security NPC","Random","Custom") + if(choice) + if(choice == "Service NPC" || choice == "Security NPC") + var/job = choice == "Service NPC" ? pick("Bartender","Cook","Botanist","Janitor") : pick("Warden","Detective","Security Officer") + for(var/j in SSjob.occupations) + var/datum/job/J = j + if(J.title == job) + T.myjob = J + T.job = T.myjob.title + for(var/obj/item/W in T) + qdel(W) + T.myjob.equip(T) + T.myjob.apply_fingerprints(T) + T.doSetup() + break + if(choice == "Random") + T.myjob = pick(SSjob.occupations) + T.job = T.myjob.title + for(var/obj/item/W in T) + qdel(W) + T.myjob.equip(T) + T.myjob.apply_fingerprints(T) + T.doSetup() + if(prob(25)) + var/list/validchoices = list() + for(var/mob/living/carbon/human/M in mob_list) + validchoices += M + var/mob/living/carbon/human/chosen = pick(validchoices) var/datum/dna/toDoppel = chosen.dna - T.real_name = toDoppel.real_name toDoppel.transfer_identity(T, transfer_SE=1) T.updateappearance(mutcolor_update=1) T.domutcheck() - - var/doTrait = input("Do you want the SNPC to be a traitor?") as null|anything in list("Yes","No") - if(doTrait) - if(doTrait == "Yes") - var/list/tType = list("Brute" = SNPC_BRUTE, "Stealth" = SNPC_STEALTH, "Martyr" = SNPC_MARTYR, "Psycho" = SNPC_PSYCHO) - var/cType = input("Choose the traitor personality.") as null|anything in tType - if(cType) - var/value = tType[cType] - T.makeTraitor(value) - - var/doTele = input("Place the SNPC in their department?") as null|anything in list("Yes","No") - if(doTele) - if(doTele == "Yes") + if(prob(25)) + var/cType = pick(list(SNPC_BRUTE,SNPC_STEALTH,SNPC_MARTYR,SNPC_PSYCHO)) + T.makeTraitor(cType) T.loc = pick(get_area_turfs(T.job2area(T.myjob))) + if(choice == "Custom") + var/cjob = input("Choose Job") as null|anything in SSjob.occupations + if(cjob) + T.myjob = cjob + T.job = T.myjob.title + for(var/obj/item/W in T) + qdel(W) + T.myjob.equip(T) + T.myjob.apply_fingerprints(T) + T.doSetup() + var/shouldDoppel = input("Do you want the SNPC to disguise themself as a crewmember?") as null|anything in list("Yes","No") + if(shouldDoppel) + if(shouldDoppel == "Yes") + var/list/validchoices = list() + for(var/mob/living/carbon/human/M in mob_list) + validchoices += M + + var/mob/living/carbon/human/chosen = input("Which crewmember?") as null|anything in validchoices + + if(chosen) + var/datum/dna/toDoppel = chosen.dna + + T.real_name = toDoppel.real_name + toDoppel.transfer_identity(T, transfer_SE=1) + T.updateappearance(mutcolor_update=1) + T.domutcheck() + var/doTrait = input("Do you want the SNPC to be a traitor?") as null|anything in list("Yes","No") + if(doTrait) + if(doTrait == "Yes") + var/list/tType = list("Brute" = SNPC_BRUTE, "Stealth" = SNPC_STEALTH, "Martyr" = SNPC_MARTYR, "Psycho" = SNPC_PSYCHO) + var/cType = input("Choose the traitor personality.") as null|anything in tType + if(cType) + var/value = tType[cType] + T.makeTraitor(value) + var/doTele = input("Place the SNPC in their department?") as null|anything in list("Yes","No") + if(doTele) + if(doTele == "Yes") + T.loc = pick(get_area_turfs(T.job2area(T.myjob))) /mob/living/carbon/human/interactive/proc/doSetup() Path_ID = new /obj/item/weapon/card/id(src) @@ -500,7 +536,7 @@ ..() if(ticker.current_state == GAME_STATE_FINISHED) saveVoice() - if(!alternateProcessing || forceProcess) + if(!alternateProcessing || forceProcess || world.time > lastProc + processTime) doProcess() /mob/living/carbon/human/interactive/death() @@ -513,7 +549,9 @@ ..() /mob/living/carbon/human/interactive/proc/doProcess() + set waitfor = 0 forceProcess = 0 + lastProc = world.time if(shouldUseDynamicProc) var/isSeen = 0 @@ -540,31 +578,29 @@ //VIEW FUNCTIONS //doorscan is now integrated into life and runs before all other procs - spawn(0) - for(var/dir in alldirs) - var/turf/T = get_step(src,dir) - if(T) - for(var/obj/machinery/door/D in T.contents) - if(!istype(D,/obj/machinery/door/poddoor) && D.density) - spawn(0) - if(istype(D,/obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/AL = D - if(!AL.CanAStarPass(RPID)) // only crack open doors we can't get through - AL.panel_open = 1 - AL.update_icon() - AL.shock(src,(100 - smartness)/2) - sleep(5) - AL.unbolt() - if(!AL.wires.is_cut(WIRE_BOLTS)) - AL.wires.cut(WIRE_BOLTS) - if(!AL.wires.is_cut(WIRE_POWER1)) - AL.wires.cut(WIRE_POWER1) - if(!AL.wires.is_cut(WIRE_POWER2)) - AL.wires.cut(WIRE_POWER2) - sleep(5) - AL.panel_open = 0 - AL.update_icon() - D.open() + for(var/dir in alldirs) + var/turf/T = get_step(src,dir) + if(T) + for(var/obj/machinery/door/D in T.contents) + if(!istype(D,/obj/machinery/door/poddoor) && D.density) + if(istype(D,/obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/AL = D + if(!AL.CanAStarPass(RPID)) // only crack open doors we can't get through + AL.panel_open = 1 + AL.update_icon() + AL.shock(src,(100 - smartness)/2) + sleep(5) + AL.unbolt() + if(!AL.wires.is_cut(WIRE_BOLTS)) + AL.wires.cut(WIRE_BOLTS) + if(!AL.wires.is_cut(WIRE_POWER1)) + AL.wires.cut(WIRE_POWER1) + if(!AL.wires.is_cut(WIRE_POWER2)) + AL.wires.cut(WIRE_POWER2) + sleep(5) + AL.panel_open = 0 + AL.update_icon() + D.open() if(update_hands) if(l_hand || r_hand) @@ -611,7 +647,7 @@ var/obj/machinery/door/D = TARGET if(D.check_access(MYID) && !istype(D,/obj/machinery/door/poddoor)) D.open() - sleep(15) + //sleep(15) var/turf/T = get_step(get_step(D.loc,dir),dir) //recursion yo tryWalk(T) //THIEVING SKILLS @@ -1086,6 +1122,14 @@ /mob/living/carbon/human/interactive/proc/shitcurity(obj) var/list/allContents = getAllContents() + for(var/mob/living/carbon/human/C in nearby) + var/perpname = C.get_face_name(C.get_id_name()) + var/datum/data/record/R = find_record("name", perpname, data_core.security) + if(R && R.fields["criminal"]) + switch(R.fields["criminal"]) + if("*Arrest*") + retalTarget(C) + if(retal && TARGET) for(var/obj/item/I in allContents) if(istype(I,/obj/item/weapon/restraints)) @@ -1411,7 +1455,6 @@ return hasSame /mob/living/carbon/human/interactive/proc/combat(obj) - set background = 1 enforce_hands() if(canmove) if((graytide || (TRAITS & TRAIT_MEAN)) || retal) diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 3dc6ea17a4d..1c0f8ece0ca 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -6,7 +6,7 @@ var/global/posibrain_notif_cooldown = 0 icon = 'icons/obj/assemblies.dmi' icon_state = "posibrain" w_class = 3 - origin_tech = "biotech=4;programming=4;plasmatech=3" + origin_tech = "biotech=3;programming=3;plasmatech=2" var/notified = 0 var/askDelay = 10 * 60 * 1 var/used = 0 //Prevents split personality virus. May be reset if personality deletion code is added. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 2b03918b96d..5efb5c2032e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -121,7 +121,7 @@ Sorry Giacom. Please don't be mad :( if(moving_diagonally)//no mob swap during diagonal moves. return 1 - if(!M.buckled && !M.buckled_mobs.len) + if(!M.buckled && !M.has_buckled_mobs()) var/mob_swap //the puller can always swap with its victim if on grab intent if(M.pulledby == src && a_intent == "grab") diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 857f93b8a63..26ae1fe74d8 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -357,7 +357,7 @@ var/global/mulebot_count = 0 if(isobj(AM)) var/obj/O = AM - if(O.buckled_mobs.len || (locate(/mob) in AM)) //can't load non crates objects with mobs buckled to it or inside it. + if(O.has_buckled_mobs() || (locate(/mob) in AM)) //can't load non crates objects with mobs buckled to it or inside it. buzz(SIGH) return diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index a45c69de727..6033303c1bd 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -216,98 +216,12 @@ return swoop_attack(1, A) - /obj/item/device/gps/internal/dragon icon_state = null gpstag = "Fiery Signal" desc = "Here there be dragons." invisibility = 100 - -//The part you've all been waiting for: Loot - -/obj/item/weapon/melee/ghost_sword - name = "spectral blade" - desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly." - icon_state = "spectral" - item_state = "spectral" - flags = CONDUCT - sharpness = IS_SHARP - w_class = 4 - force = 1 - throwforce = 1 - hitsound = 'sound/effects/ghost2.ogg' - attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended") - var/summon_cooldown = 0 - var/list/mob/dead/observer/spirits - -/obj/item/weapon/melee/ghost_sword/New() - ..() - spirits = list() - SSobj.processing += src - poi_list |= src - -/obj/item/weapon/melee/ghost_sword/Destroy() - for(var/mob/dead/observer/G in spirits) - G.invisibility = initial(G.invisibility) - spirits.Cut() - SSobj.processing -= src - poi_list -= src - . = ..() - -/obj/item/weapon/melee/ghost_sword/attack_self(mob/user) - if(summon_cooldown > world.time) - user << "You just recently called out for aid. You don't want to annoy the spirits." - return - user << "You call out for aid, attempting to summon spirits to your side." - - notify_ghosts("[user] is raising their [src], calling for your help!", - enter_link="(Click to help)", - source = user, action=NOTIFY_ORBIT) - - summon_cooldown = world.time + 600 - -/obj/item/weapon/melee/ghost_sword/Topic(href, href_list) - if(href_list["orbit"]) - var/mob/dead/observer/ghost = usr - if(istype(ghost)) - ghost.ManualFollow(src) - -/obj/item/weapon/melee/ghost_sword/process() - ghost_check() - -/obj/item/weapon/melee/ghost_sword/proc/ghost_check() - var/ghost_counter = 0 - var/turf/T = get_turf(src) - var/list/contents = T.GetAllContents() - var/mob/dead/observer/current_spirits = list() - for(var/mob/dead/observer/G in dead_mob_list) - if(G.orbiting in contents) - ghost_counter++ - G.invisibility = 0 - current_spirits |= G - - for(var/mob/dead/observer/G in spirits - current_spirits) - G.invisibility = initial(G.invisibility) - - spirits = current_spirits - - return ghost_counter - -/obj/item/weapon/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user) - force = 0 - var/ghost_counter = ghost_check() - - force = Clamp((ghost_counter * 4), 0, 75) - user.visible_message("[user] strikes with the force of [ghost_counter] vengeful spirits!") - ..() - -/obj/item/weapon/melee/ghost_sword/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type) - var/ghost_counter = ghost_check() - final_block_chance += Clamp((ghost_counter * 5), 0, 75) - owner.visible_message("[owner] is protected by a ring of [ghost_counter] ghosts!") - return ..() - /mob/living/simple_animal/hostile/megafauna/dragon/lesser name = "lesser ash drake" maxHealth = 750 @@ -317,87 +231,3 @@ damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) loot = list() -//Blood - -/obj/item/weapon/dragons_blood - name = "bottle of dragons blood" - desc = "You're not actually going to drink this, are you?" - icon = 'icons/obj/wizard.dmi' - icon_state = "vial" - -/obj/item/weapon/dragons_blood/attack_self(mob/living/carbon/human/user) - if(!istype(user)) - return - - var/mob/living/carbon/human/H = user - var/random = rand(1,3) - - switch(random) - if(1) - user << "Other than tasting terrible, nothing really happens." - if(2) - user << "Your flesh begins to melt! Miraculously, you seem fine otherwise." - H.set_species(/datum/species/skeleton) - if(3) - user << "You don't feel so good..." - H.ForceContractDisease(new /datum/disease/transformation/dragon(0)) - playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1) - qdel(src) - -/datum/disease/transformation/dragon - name = "dragon transformation" - cure_text = "nothing" - cures = list("adminordrazine") - agent = "dragon's blood" - desc = "What do dragons have to do with Space Station 13?" - stage_prob = 20 - severity = BIOHAZARD - visibility_flags = 0 - stage1 = list("Your bones ache.") - stage2 = list("Your skin feels scaley.") - stage3 = list("You have an overwhelming urge to terrorize some peasants.", "Your teeth feel sharper.") - stage4 = list("Your blood burns.") - stage5 = list("You're a fucking dragon.") - new_form = /mob/living/simple_animal/hostile/megafauna/dragon/lesser - - -//Lava Staff - -/obj/item/weapon/lava_staff - name = "staff of lava" - desc = "The ability to fill the emergency shuttle with lava. What more could you want out of life?" - icon_state = "staffofstorms" - item_state = "staffofstorms" - icon = 'icons/obj/guns/magic.dmi' - slot_flags = SLOT_BACK - item_state = "staffofstorms" - w_class = 4 - force = 25 - damtype = BURN - burn_state = LAVA_PROOF - hitsound = 'sound/weapons/sear.ogg' - var/lava_cooldown = 0 - -/obj/item/weapon/lava_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - ..() - if(lava_cooldown > world.time) - return - var/turf/T = get_turf(user) - if(istype(target, /turf/open) && (target in view(user.client.view,T))) - var/turf/open/O = target - user.visible_message("[user] turns \the [O] into lava!") - O.ChangeTurf(/turf/open/floor/plating/lava/smooth) - playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1) - lava_cooldown = world.time + 200 - -/obj/structure/closet/crate/necropolis/dragon - name = "dragon chest" - -/obj/structure/closet/crate/necropolis/dragon/New() - ..() - var/loot = rand(1,2) - switch(loot) - if(1) - new /obj/item/weapon/melee/ghost_sword(src) - if(2) - new /obj/item/weapon/lava_staff(src) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 3568d43dc52..dc9793ae3ab 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -811,7 +811,7 @@ if(icon_state == "parrot_fly") for(var/mob/living/carbon/human/H in view(src,1)) - if(H.buckled_mobs.len >= H.max_buckled_mobs) //Already has a parrot, or is being eaten by a slime + if(H.has_buckled_mobs() && H.buckled_mobs.len >= H.max_buckled_mobs) //Already has a parrot, or is being eaten by a slime continue perch_on_human(H) return @@ -947,3 +947,8 @@ /mob/living/simple_animal/parrot/Poly/ghost/New() memory_saved = 1 //At this point nothing is saved ..() + +/mob/living/simple_animal/parrot/Poly/ghost/handle_automated_movement() + if(isliving(parrot_interest)) + parrot_interest = null + ..() diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index c32a82c7865..d7daf9e2da3 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -15,7 +15,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/components/unary if(restrained()) src << "You can't vent crawl while you're restrained!" return - if(buckled_mobs.len) + if(has_buckled_mobs()) src << "You can't vent crawl with others creatures on you!" return if(buckled) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f9b5b4b161d..626b8b19c78 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -25,6 +25,7 @@ var/next_mob_id = 0 ..() /atom/proc/prepare_huds() + hud_list = list() for(var/hud in hud_possible) var/image/I = image('icons/mob/hud.dmi', src, "") I.appearance_flags = RESET_COLOR diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 8661313ec86..57918ce5dd4 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -35,7 +35,7 @@ name = "\improper X-01 MultiPhase Energy Gun" desc = "This is a expensive, modern recreation of a antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time." icon_state = "hoslaser" - origin_tech = "combat=5;magnets=4" + origin_tech = null force = 10 ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler) ammo_x_offset = 4 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 3aef3af11d1..df3f1f1597e 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -126,6 +126,10 @@ holds_charge = TRUE unique_frequency = TRUE +/obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg + holds_charge = TRUE + unique_frequency = TRUE + /obj/item/weapon/gun/energy/kinetic_accelerator/New() . = ..() if(!holds_charge) diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm index 04b438f82f8..470cf2fd537 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -8,7 +8,7 @@ throw_range = 7 force = 4 materials = list(MAT_METAL=2000) - origin_tech = "combat=3;biotech=3" + origin_tech = "combat=2;biotech=3" clumsy_check = 0 fire_sound = 'sound/items/syringeproj.ogg' var/list/syringes = list() diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 38da68a18ad..70c15075a71 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -43,6 +43,13 @@ "bromine", "stable_plasma" ) + var/list/emagged_reagents = list( + "space_drugs", + "morphine", + "carpotoxin", + "mine_salve", + "toxin" + ) /obj/machinery/chem_dispenser/New() ..() @@ -65,6 +72,14 @@ if(energy != oldenergy) use_power(2500) +/obj/machinery/chem_dispenser/emag_act(mob/user) + if(emagged) + user << "\The [src] has no functional safeties to emag." + return + user << "You short out \the [src]'s safeties." + dispensable_reagents |= emagged_reagents//add the emagged reagents to the dispensable ones + emagged = 1 + /obj/machinery/chem_dispenser/ex_act(severity, target) if(severity < 3) ..() @@ -165,7 +180,7 @@ icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. icon_beaker.pixel_x = rand(-10,5) overlays += icon_beaker - else if(user.a_intent != "harm") + else if(user.a_intent != "harm" && !istype(I, /obj/item/weapon/card/emag)) user << "You can't load \the [I] into the machine!" else return ..() @@ -296,6 +311,13 @@ "tomatojuice", "lemonjuice" ) + emagged_reagents = list( + "thirteenloko", + "whiskeycola", + "mindbreaker", + "tirizene" + ) + /obj/machinery/chem_dispenser/drinks/beer @@ -318,8 +340,16 @@ "ale", "absinthe" ) + emagged_reagents = list( + "ethanol", + "iron", + "minttoxin", + "atomicbomb" + ) + /obj/machinery/chem_dispenser/mutagen name = "mutagen dispenser" desc = "Creates and dispenses mutagen." - dispensable_reagents = list("mutagen") \ No newline at end of file + dispensable_reagents = list("mutagen") + emagged_reagents = list("plasma") diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index df8325fea57..41402531b7c 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -120,7 +120,7 @@ return if(!istype(user.loc, /turf/)) //No magically doing it from inside closets return - if(target.buckled || target.buckled_mobs.len) + if(target.buckled || target.has_buckled_mobs()) return if(target.mob_size > MOB_SIZE_HUMAN) user << "[target] doesn't fit inside [src]!" diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 0da4c5e927e..7ee80b4e266 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -10,12 +10,8 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). icon_state = "circuit_imprinter" flags = OPENCONTAINER - var/g_amount = 0 - var/gold_amount = 0 - var/diamond_amount = 0 - var/max_material_amount = 75000 + var/datum/material_container/materials var/efficiency_coeff - reagents = new(0) var/list/categories = list( "AI Modules", @@ -32,9 +28,14 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). /obj/machinery/r_n_d/circuit_imprinter/New() ..() + materials = new(src, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND)) + create_reagents(0) var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/circuit_imprinter(null) B.apply_default_parts(src) - reagents.my_atom = src + +/obj/machinery/r_n_d/circuit_imprinter/Destroy() + qdel(materials) + return ..() /obj/item/weapon/circuitboard/machine/circuit_imprinter name = "circuit board (Circuit Imprinter)" @@ -52,7 +53,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). G.reagents.trans_to(src, G.reagents.total_volume) for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) T += M.rating - max_material_amount = T * 75000 + materials.max_amount = T * 75000 T = 0 for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) T += M.rating @@ -62,72 +63,55 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). if (prob(50)) qdel(src) +/obj/machinery/r_n_d/circuit_imprinter/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material + var/list/all_materials = being_built.reagents + being_built.materials -/obj/machinery/r_n_d/circuit_imprinter/proc/check_mat(datum/design/being_built, M) - switch(M) - if(MAT_GLASS) - return (g_amount - (being_built.materials[M]/efficiency_coeff) >= 0) - if(MAT_GOLD) - return (gold_amount - (being_built.materials[M]/efficiency_coeff) >= 0) - if(MAT_DIAMOND) - return (diamond_amount - (being_built.materials[M]/efficiency_coeff) >= 0) - else - return (reagents.has_reagent(M, (being_built.materials[M]/efficiency_coeff)) != 0) + var/A = materials.amount(M) + if(!A) + A = reagents.get_reagent_amount(M) + return round(A / max(1, (all_materials[M]/efficiency_coeff))) -/obj/machinery/r_n_d/circuit_imprinter/proc/TotalMaterials() - return g_amount + gold_amount + diamond_amount - -//we drop the minerals in the machine onto the ground when deconstructed. +//we eject the materials upon deconstruction. /obj/machinery/r_n_d/circuit_imprinter/deconstruction() for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) reagents.trans_to(G, G.reagents.maximum_volume) - if(g_amount >= MINERAL_MATERIAL_AMOUNT) - var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src.loc) - G.amount = round(g_amount / MINERAL_MATERIAL_AMOUNT) - if(gold_amount >= MINERAL_MATERIAL_AMOUNT) - var/obj/item/stack/sheet/mineral/gold/G = new /obj/item/stack/sheet/mineral/gold(src.loc) - G.amount = round(gold_amount / MINERAL_MATERIAL_AMOUNT) - if(diamond_amount >= MINERAL_MATERIAL_AMOUNT) - var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(src.loc) - G.amount = round(diamond_amount / MINERAL_MATERIAL_AMOUNT) + materials.retrieve_all() ..() + /obj/machinery/r_n_d/circuit_imprinter/disconnect_console() linked_console.linked_imprinter = null ..() /obj/machinery/r_n_d/circuit_imprinter/Insert_Item(obj/item/O, mob/user) - if (istype(O, /obj/item/stack/sheet/glass) || istype(O, /obj/item/stack/sheet/mineral/gold) || istype(O, /obj/item/stack/sheet/mineral/diamond)) + if(istype(O,/obj/item/stack/sheet)) . = 1 if(!is_insertion_ready(user)) return + var/sheet_material = materials.get_item_material_amount(O) + if(!sheet_material) + return + + if(!materials.has_space(sheet_material)) + user << "The [src.name]'s material bin is full! Please remove material before adding more." + return 1 + var/obj/item/stack/sheet/stack = O - if ((TotalMaterials() + stack.perunit) > max_material_amount) - user << "The [name] is full! Please remove glass from the protolathe in order to insert more." + var/amount = round(input("How many sheets do you want to add?") as num)//No decimals + if(!in_range(src, stack) || !user.Adjacent(src)) return - - var/amount = round(input("How many sheets do you want to add?") as num) - if(amount <= 0 || stack.amount <= 0) - return - if(amount > stack.amount) - amount = min(stack.amount, round((max_material_amount-TotalMaterials())/stack.perunit)) - - busy = 1 - use_power(max(1000, (MINERAL_MATERIAL_AMOUNT*amount/10))) - user << "You add [amount] sheets to the [src.name]." - if(istype(stack, /obj/item/stack/sheet/glass)) - g_amount += amount * MINERAL_MATERIAL_AMOUNT - else if(istype(stack, /obj/item/stack/sheet/mineral/gold)) - gold_amount += amount * MINERAL_MATERIAL_AMOUNT - else if(istype(stack, /obj/item/stack/sheet/mineral/diamond)) - diamond_amount += amount * MINERAL_MATERIAL_AMOUNT - stack.use(amount) - busy = 0 - src.updateUsrDialog() + var/amount_inserted = materials.insert_stack(O,amount) + if(!amount_inserted) + return 1 + else + use_power(max(1000, (MINERAL_MATERIAL_AMOUNT*amount_inserted/10))) + user << "You add [amount_inserted] sheets to the [src.name]." + updateUsrDialog() else if(user.a_intent != "harm") user << "You cannot insert this item into the [name]!" + return 1 else - return 0 + return 0 \ No newline at end of file diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 1204ac11d3a..4755a3248a0 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -216,7 +216,7 @@ other types of metals and chemistry for reagents). name = "Bag of Holding" desc = "A backpack that opens into a localized pocket of Blue Space." id = "bag_holding" - req_tech = list("bluespace" = 7, "materials" = 5, "engineering" = 6, "plasmatech" = 5) + req_tech = list("bluespace" = 7, "materials" = 5, "engineering" = 5, "plasmatech" = 6) build_type = PROTOLATHE materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250) build_path = /obj/item/weapon/storage/backpack/holding @@ -236,7 +236,7 @@ other types of metals and chemistry for reagents). name = "GPS Device" desc = "Little thingie that can track its position at all times." id = "telesci_gps" - req_tech = list("materials" = 2, "magnets" = 3, "bluespace" = 3) + req_tech = list("materials" = 2, "bluespace" = 2) build_type = PROTOLATHE materials = list(MAT_METAL = 500, MAT_GLASS = 1000) build_path = /obj/item/device/gps @@ -482,7 +482,7 @@ datum/design/diagnostic_hud_night name = "Holographic Sign Projector" desc = "A holograpic projector used to project various warning signs." id = "holosign" - req_tech = list("magnets" = 3, "programming" = 3) + req_tech = list("programming" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 2000, MAT_GLASS = 1000) build_path = /obj/item/weapon/holosign_creator diff --git a/code/modules/research/designs/AI_module_designs.dm b/code/modules/research/designs/AI_module_designs.dm index 569a36607ef..7f39ffbce51 100644 --- a/code/modules/research/designs/AI_module_designs.dm +++ b/code/modules/research/designs/AI_module_designs.dm @@ -2,154 +2,139 @@ //////////AI Module Disks////////// /////////////////////////////////// -/datum/design/aicore +/datum/design/board/aicore name = "AI Design (AI Core)" desc = "Allows for the construction of circuit boards used to build new AI cores." id = "aicore" req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/aicore category = list("AI Modules") -/datum/design/safeguard_module +/datum/design/board/safeguard_module name = "Module Design (Safeguard)" desc = "Allows for the construction of a Safeguard AI Module." id = "safeguard_module" req_tech = list("programming" = 3, "materials" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100) + materials = list(MAT_GLASS = 1000, MAT_GOLD = 100) build_path = /obj/item/weapon/aiModule/supplied/safeguard category = list("AI Modules") -/datum/design/onehuman_module +/datum/design/board/onehuman_module name = "Module Design (OneHuman)" desc = "Allows for the construction of a OneHuman AI Module." id = "onehuman_module" req_tech = list("programming" = 6, "materials" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) + materials = list(MAT_GLASS = 1000, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/zeroth/oneHuman category = list("AI Modules") -/datum/design/protectstation_module +/datum/design/board/protectstation_module name = "Module Design (ProtectStation)" desc = "Allows for the construction of a ProtectStation AI Module." id = "protectstation_module" req_tech = list("programming" = 5, "materials" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100) + materials = list(MAT_GLASS = 1000, MAT_GOLD = 100) build_path = /obj/item/weapon/aiModule/supplied/protectStation category = list("AI Modules") -/datum/design/quarantine_module +/datum/design/board/quarantine_module name = "Module Design (Quarantine)" desc = "Allows for the construction of a Quarantine AI Module." id = "quarantine_module" req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100) + materials = list(MAT_GLASS = 1000, MAT_GOLD = 100) build_path = /obj/item/weapon/aiModule/supplied/quarantine category = list("AI Modules") -/datum/design/oxygen_module +/datum/design/board/oxygen_module name = "Module Design (OxygenIsToxicToHumans)" desc = "Allows for the construction of a Safeguard AI Module." id = "oxygen_module" req_tech = list("programming" = 4, "biotech" = 2, "materials" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100) + materials = list(MAT_GLASS = 1000, MAT_GOLD = 100) build_path = /obj/item/weapon/aiModule/supplied/oxygen category = list("AI Modules") -/datum/design/freeform_module +/datum/design/board/freeform_module name = "Module Design (Freeform)" desc = "Allows for the construction of a Freeform AI Module." id = "freeform_module" req_tech = list("programming" = 5, "materials" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100) + materials = list(MAT_GLASS = 1000, MAT_GOLD = 100) build_path = /obj/item/weapon/aiModule/supplied/freeform category = list("AI Modules") -/datum/design/reset_module +/datum/design/board/reset_module name = "Module Design (Reset)" desc = "Allows for the construction of a Reset AI Module." id = "reset_module" req_tech = list("programming" = 4, "materials" = 6) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100) + materials = list(MAT_GLASS = 1000, MAT_GOLD = 100) build_path = /obj/item/weapon/aiModule/reset category = list("AI Modules") -/datum/design/purge_module +/datum/design/board/purge_module name = "Module Design (Purge)" desc = "Allows for the construction of a Purge AI Module." id = "purge_module" req_tech = list("programming" = 5, "materials" = 6) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) + materials = list(MAT_GLASS = 1000, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/reset/purge category = list("AI Modules") -/datum/design/freeformcore_module +/datum/design/board/freeformcore_module name = "AI Core Module (Freeform)" desc = "Allows for the construction of a Freeform AI Core Module." id = "freeformcore_module" req_tech = list("programming" = 6, "materials" = 6) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) + materials = list(MAT_GLASS = 1000, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/core/freeformcore category = list("AI Modules") -/datum/design/asimov +/datum/design/board/asimov name = "Core Module Design (Asimov)" desc = "Allows for the construction of a Asimov AI Core Module." id = "asimov_module" req_tech = list("programming" = 3, "materials" = 5) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) + materials = list(MAT_GLASS = 1000, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/core/full/asimov category = list("AI Modules") -/datum/design/paladin_module +/datum/design/board/paladin_module name = "Core Module Design (P.A.L.A.D.I.N.)" desc = "Allows for the construction of a P.A.L.A.D.I.N. AI Core Module." id = "paladin_module" req_tech = list("programming" = 5, "materials" = 5) build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) + materials = list(MAT_GLASS = 1000, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/core/full/paladin category = list("AI Modules") -/datum/design/tyrant_module +/datum/design/board/tyrant_module name = "Core Module Design (T.Y.R.A.N.T.)" desc = "Allows for the construction of a T.Y.R.A.N.T. AI Module." id = "tyrant_module" req_tech = list("programming" = 5, "syndicate" = 2, "materials" = 5) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) + materials = list(MAT_GLASS = 1000, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/core/full/tyrant category = list("AI Modules") -/datum/design/corporate_module +/datum/design/board/corporate_module name = "Core Module Design (Corporate)" desc = "Allows for the construction of a Corporate AI Core Module." id = "corporate_module" req_tech = list("programming" = 5, "materials" = 5) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) + materials = list(MAT_GLASS = 1000, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/core/full/corp category = list("AI Modules") -/datum/design/custom_module +/datum/design/board/custom_module name = "Core Module Design (Custom)" desc = "Allows for the construction of a Custom AI Core Module." id = "custom_module" req_tech = list("programming" = 5, "materials" = 5) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_DIAMOND = 100) + materials = list(MAT_GLASS = 1000, MAT_DIAMOND = 100) build_path = /obj/item/weapon/aiModule/core/full/custom category = list("AI Modules") diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 453c04d05e6..60b921056de 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -1,311 +1,253 @@ ///////////////////Computer Boards/////////////////////////////////// -/datum/design/seccamera +/datum/design/board + name = "Computer Design (Battle Arcade Machine)" + desc = "Allows for the construction of circuit boards used to build a new arcade machine." + id = "arcade_battle" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000) + reagents = list("sacid" = 20) + build_path = /obj/item/weapon/circuitboard/computer/arcade/battle + category = list("Computer Boards") + +/datum/design/board/orion_trail + name = "Computer Design (Orion Trail Arcade Machine)" + desc = "Allows for the construction of circuit boards used to build a new Orion Trail machine." + id = "arcade_orion" + req_tech = list("programming" = 1) + build_path = /obj/item/weapon/circuitboard/computer/arcade/orion_trail + category = list("Computer Boards") + + +/datum/design/board/seccamera name = "Computer Design (Security)" desc = "Allows for the construction of circuit boards used to build security camera computers." id = "seccamera" req_tech = list("programming" = 2, "combat" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/security category = list("Computer Boards") -/datum/design/aiupload +/datum/design/board/aiupload name = "Computer Design (AI Upload)" desc = "Allows for the construction of circuit boards used to build an AI Upload Console." id = "aiupload" req_tech = list("programming" = 5, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/aiupload category = list("Computer Boards") -/datum/design/borgupload +/datum/design/board/borgupload name = "Computer Design (Cyborg Upload)" desc = "Allows for the construction of circuit boards used to build a Cyborg Upload Console." id = "borgupload" req_tech = list("programming" = 5, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/borgupload category = list("Computer Boards") -/datum/design/med_data +/datum/design/board/med_data name = "Computer Design (Medical Records)" desc = "Allows for the construction of circuit boards used to build a medical records console." id = "med_data" req_tech = list("programming" = 2, "biotech" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/med_data category = list("Computer Boards") -/datum/design/operating +/datum/design/board/operating name = "Computer Design (Operating Computer)" desc = "Allows for the construction of circuit boards used to build an operating computer console." id = "operating" req_tech = list("programming" = 2, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/operating category = list("Computer Boards") -/datum/design/pandemic +/datum/design/board/pandemic name = "Computer Design (PanD.E.M.I.C. 2200)" desc = "Allows for the construction of circuit boards used to build a PanD.E.M.I.C. 2200 console." id = "pandemic" req_tech = list("programming" = 3, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/pandemic category = list("Computer Boards") -/datum/design/scan_console +/datum/design/board/scan_console name = "Computer Design (DNA Machine)" desc = "Allows for the construction of circuit boards used to build a new DNA scanning console." id = "scan_console" req_tech = list("programming" = 2, "biotech" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/scan_consolenew category = list("Computer Boards") -/datum/design/comconsole +/datum/design/board/comconsole name = "Computer Design (Communications)" desc = "Allows for the construction of circuit boards used to build a communications console." id = "comconsole" req_tech = list("programming" = 3, "magnets" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/communications category = list("Computer Boards") -/datum/design/idcardconsole +/datum/design/board/idcardconsole name = "Computer Design (ID Console)" desc = "Allows for the construction of circuit boards used to build an ID computer." id = "idcardconsole" req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/card category = list("Computer Boards") -/datum/design/crewconsole +/datum/design/board/crewconsole name = "Computer Design (Crew monitoring computer)" desc = "Allows for the construction of circuit boards used to build a Crew monitoring computer." id = "crewconsole" req_tech = list("programming" = 3, "magnets" = 2, "biotech" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/crew category = list("Computer Boards") -/datum/design/secdata +/datum/design/board/secdata name = "Computer Design (Security Records Console)" desc = "Allows for the construction of circuit boards used to build a security records console." id = "secdata" req_tech = list("programming" = 2, "combat" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/secure_data category = list("Computer Boards") -/datum/design/atmosalerts +/datum/design/board/atmosalerts name = "Computer Design (Atmosphere Alert)" desc = "Allows for the construction of circuit boards used to build an atmosphere alert console." id = "atmosalerts" req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/atmos_alert category = list("Computer Boards") -/datum/design/atmos_control +/datum/design/board/atmos_control name = "Computer Design (Atmospheric Monitor)" desc = "Allows for the construction of circuit boards used to build an Atmospheric Monitor." id = "atmos_control" req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/atmos_control category = list("Computer Boards") -/datum/design/robocontrol +/datum/design/board/robocontrol name = "Computer Design (Robotics Control Console)" desc = "Allows for the construction of circuit boards used to build a Robotics Control console." id = "robocontrol" req_tech = list("programming" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/robotics category = list("Computer Boards") -/datum/design/arcadebattle - name = "Computer Design (Battle Arcade Machine)" - desc = "Allows for the construction of circuit boards used to build a new arcade machine." - id = "arcademachine" - req_tech = list("programming" = 1) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/computer/arcade/battle - category = list("Computer Boards") - -/datum/design/orion_trail - name = "Computer Design (Orion Trail Arcade Machine)" - desc = "Allows for the construction of circuit boards used to build a new Orion Trail machine." - id = "arcademachine" - req_tech = list("programming" = 1) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) - build_path = /obj/item/weapon/circuitboard/computer/arcade/orion_trail - category = list("Computer Boards") - -/datum/design/slot_machine +/datum/design/board/slot_machine name = "Computer Design (Slot Machine)" desc = "Allows for the construction of circuit boards used to build a new slot machine." id = "slotmachine" req_tech = list("programming" = 1) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/slot_machine category = list("Computer Boards") -/datum/design/powermonitor +/datum/design/board/powermonitor name = "Computer Design (Power Monitor)" desc = "Allows for the construction of circuit boards used to build a new power monitor." id = "powermonitor" req_tech = list("programming" = 2, "powerstorage" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/powermonitor category = list("Computer Boards") -/datum/design/solarcontrol +/datum/design/board/solarcontrol name = "Computer Design (Solar Control)" desc = "Allows for the construction of circuit boards used to build a solar control console." id = "solarcontrol" req_tech = list("programming" = 2, "powerstorage" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/solar_control category = list("Computer Boards") -/datum/design/prisonmanage +/datum/design/board/prisonmanage name = "Computer Design (Prisoner Management Console)" desc = "Allows for the construction of circuit boards used to build a prisoner management console." id = "prisonmanage" req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/prisoner category = list("Computer Boards") -/datum/design/mechacontrol +/datum/design/board/mechacontrol name = "Computer Design (Exosuit Control Console)" desc = "Allows for the construction of circuit boards used to build an exosuit control console." id = "mechacontrol" req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/mecha_control category = list("Computer Boards") -/datum/design/mechapower +/datum/design/board/mechapower name = "Computer Design (Mech Bay Power Control Console)" desc = "Allows for the construction of circuit boards used to build a mech bay power control console." id = "mechapower" req_tech = list("programming" = 3, "powerstorage" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/mech_bay_power_console category = list("Computer Boards") -/datum/design/rdconsole +/datum/design/board/rdconsole name = "Computer Design (R&D Console)" desc = "Allows for the construction of circuit boards used to build a new R&D console." id = "rdconsole" req_tech = list("programming" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/rdconsole category = list("Computer Boards") -/datum/design/cargo +/datum/design/board/cargo name = "Computer Design (Supply Console)" desc = "Allows for the construction of circuit boards used to build a Supply Console." id = "cargo" req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/cargo category = list("Computer Boards") -/datum/design/cargorequest +/datum/design/board/cargorequest name = "Computer Design (Supply Request Console)" desc = "Allows for the construction of circuit boards used to build a Supply Request Console." id = "cargorequest" req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/cargo/request category = list("Computer Boards") -/datum/design/mining +/datum/design/board/mining name = "Computer Design (Outpost Status Display)" desc = "Allows for the construction of circuit boards used to build an outpost status display console." id = "mining" req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/mining category = list("Computer Boards") -/datum/design/comm_monitor +/datum/design/board/comm_monitor name = "Computer Design (Telecommunications Monitoring Console)" desc = "Allows for the construction of circuit boards used to build a telecommunications monitor." id = "comm_monitor" req_tech = list("programming" = 3, "magnets" = 3, "bluespace" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/comm_monitor category = list("Computer Boards") -/datum/design/comm_server +/datum/design/board/comm_server name = "Computer Design (Telecommunications Server Monitoring Console)" desc = "Allows for the construction of circuit boards used to build a telecommunication server browser and monitor." id = "comm_server" req_tech = list("programming" = 3, "magnets" = 3, "bluespace" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/comm_server category = list("Computer Boards") -/datum/design/message_monitor +/datum/design/board/message_monitor name = "Computer Design (Messaging Monitor Console)" desc = "Allows for the construction of circuit boards used to build a messaging monitor console." id = "message_monitor" req_tech = list("programming" = 5) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/message_monitor category = list("Computer Boards") -/datum/design/aifixer +/datum/design/board/aifixer name = "Computer Design (AI Integrity Restorer)" desc = "Allows for the construction of circuit boards used to build an AI Integrity Restorer." id = "aifixer" req_tech = list("programming" = 4, "magnets" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/aifixer category = list("Computer Boards") -/datum/design/libraryconsole +/datum/design/board/libraryconsole name = "Computer Design (Library Console)" desc = "Allows for the construction of circuit boards used to build a new library console." id = "libraryconsole" req_tech = list("programming" = 1) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/libraryconsole category = list("Computer Boards") diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 6a0bf146ea3..3ed57ca5fea 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -2,482 +2,387 @@ //////////////MISC Boards/////////////// //////////////////////////////////////// -/datum/design/smes +/datum/design/board/smes name = "Machine Design (SMES Board)" desc = "The circuit board for a SMES." id = "smes" req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/smes category = list ("Engineering Machinery") -/datum/design/announcement_system +/datum/design/board/announcement_system name = "Machine Design (Automated Announcement System Board)" desc = "The circuit board for an automated announcement system." id = "automated_announcement" req_tech = list("programming" = 3, "bluespace" = 3, "magnets" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/announcement_system category = list("Subspace Telecomms") -/datum/design/turbine_computer +/datum/design/board/turbine_computer name = "Computer Design (Power Turbine Console Board)" desc = "The circuit board for a power turbine console." id = "power_turbine_console" req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/turbine_computer category = list ("Engineering Machinery") -/datum/design/emitter +/datum/design/board/emitter name = "Machine Design (Emitter Board)" desc = "The circuit board for an emitter." id = "emitter" req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/emitter category = list ("Engineering Machinery") -/datum/design/power_compressor +/datum/design/board/power_compressor name = "Machine Design (Power Compressor Board)" desc = "The circuit board for a power compressor." id = "power_compressor" req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/power_compressor category = list ("Engineering Machinery") -/datum/design/power_turbine +/datum/design/board/power_turbine name = "Machine Design (Power Turbine Board)" desc = "The circuit board for a power turbine." id = "power_turbine" req_tech = list("programming" = 4, "powerstorage" = 4, "engineering" = 5) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/power_turbine category = list ("Engineering Machinery") -/datum/design/thermomachine +/datum/design/board/thermomachine name = "Machine Design (Freezer/Heater Board)" desc = "The circuit board for a freezer/heater." id = "thermomachine" req_tech = list("programming" = 3, "plasmatech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/thermomachine category = list ("Engineering Machinery") -/datum/design/space_heater +/datum/design/board/space_heater name = "Machine Design (Space Heater Board)" desc = "The circuit board for a space heater." id = "space_heater" req_tech = list("programming" = 2, "engineering" = 2, "plasmatech" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/space_heater category = list ("Engineering Machinery") -/datum/design/teleport_station +/datum/design/board/teleport_station name = "Machine Design (Teleportation Station Board)" desc = "The circuit board for a teleportation station." id = "tele_station" req_tech = list("programming" = 5, "bluespace" = 4, "engineering" = 4, "plasmatech" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/teleporter_station category = list ("Teleportation Machinery") -/datum/design/teleport_hub +/datum/design/board/teleport_hub name = "Machine Design (Teleportation Hub Board)" desc = "The circuit board for a teleportation hub." id = "tele_hub" req_tech = list("programming" = 3, "bluespace" = 5, "materials" = 4, "engineering" = 5) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/teleporter_hub category = list ("Teleportation Machinery") -/datum/design/telepad +/datum/design/board/telepad name = "Machine Design (Telepad Board)" desc = "The circuit board for a telescience telepad." id = "telepad" req_tech = list("programming" = 4, "bluespace" = 5, "plasmatech" = 4, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/telesci_pad category = list ("Teleportation Machinery") -/datum/design/teleconsole +/datum/design/board/teleconsole name = "Computer Design (Teleporter Console)" desc = "Allows for the construction of circuit boards used to build a teleporter control console." id = "teleconsole" req_tech = list("programming" = 3, "bluespace" = 3, "plasmatech" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/teleporter category = list("Teleportation Machinery") -/datum/design/telesci_console +/datum/design/board/telesci_console name = "Computer Design (Telepad Control Console Board)" desc = "Allows for the construction of circuit boards used to build a telescience console." id = "telesci_console" req_tech = list("programming" = 3, "bluespace" = 3, "plasmatech" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/telesci_console category = list("Teleportation Machinery") -/datum/design/sleeper +/datum/design/board/sleeper name = "Machine Design (Sleeper Board)" desc = "The circuit board for a sleeper." id = "sleeper" req_tech = list("programming" = 3, "biotech" = 2, "engineering" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/sleeper category = list ("Medical Machinery") -/datum/design/cryotube +/datum/design/board/cryotube name = "Machine Design (Cryotube Board)" desc = "The circuit board for a cryotube." id = "cryotube" req_tech = list("programming" = 5, "biotech" = 3, "engineering" = 4, "plasmatech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/cryo_tube category = list ("Medical Machinery") -/datum/design/chem_dispenser +/datum/design/board/chem_dispenser name = "Machine Design (Portable Chem Dispenser Board)" desc = "The circuit board for a portable chem dispenser." id = "chem_dispenser" req_tech = list("programming" = 5, "biotech" = 3, "materials" = 4, "plasmatech" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/chem_dispenser category = list ("Medical Machinery") -/datum/design/chem_master +/datum/design/board/chem_master name = "Machine Design (Chem Master Board)" - desc = "The circuit board for a Chem Master 2999." + desc = "The circuit board for a Chem Master 3000." id = "chem_master" req_tech = list("biotech" = 3, "materials" = 3, "programming" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/chem_master category = list ("Medical Machinery") -/datum/design/chem_heater +/datum/design/board/chem_heater name = "Machine Design (Chemical Heater Board)" desc = "The circuit board for a chemical heater." id = "chem_heater" req_tech = list("engineering" = 2, "biotech" = 2, "programming" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/chem_heater category = list ("Medical Machinery") -/datum/design/clonecontrol +/datum/design/board/clonecontrol name = "Computer Design (Cloning Machine Console)" desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console." id = "clonecontrol" req_tech = list("programming" = 4, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/cloning category = list("Medical Machinery") -/datum/design/clonepod +/datum/design/board/clonepod name = "Machine Design (Clone Pod)" desc = "Allows for the construction of circuit boards used to build a Cloning Pod." id = "clonepod" req_tech = list("programming" = 4, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/clonepod category = list("Medical Machinery") -/datum/design/clonescanner +/datum/design/board/clonescanner name = "Machine Design (Cloning Scanner)" desc = "Allows for the construction of circuit boards used to build a Cloning Scanner." id = "clonescanner" req_tech = list("programming" = 4, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/clonescanner category = list("Medical Machinery") -/datum/design/biogenerator +/datum/design/board/biogenerator name = "Machine Design (Biogenerator Board)" desc = "The circuit board for a biogenerator." id = "biogenerator" req_tech = list("programming" = 2, "biotech" = 3, "materials" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/biogenerator category = list ("Hydroponics Machinery") -/datum/design/hydroponics +/datum/design/board/hydroponics name = "Machine Design (Hydroponics Tray Board)" desc = "The circuit board for a hydroponics tray." id = "hydro_tray" req_tech = list("biotech" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/hydroponics category = list ("Hydroponics Machinery") -/datum/design/destructive_analyzer +/datum/design/board/destructive_analyzer name = "Machine Design (Destructive Analyzer Board)" desc = "The circuit board for a destructive analyzer." id = "destructive_analyzer" req_tech = list("programming" = 2, "magnets" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/destructive_analyzer category = list("Research Machinery") -/datum/design/experimentor +/datum/design/board/experimentor name = "Machine Design (E.X.P.E.R.I-MENTOR Board)" desc = "The circuit board for an E.X.P.E.R.I-MENTOR." id = "experimentor" req_tech = list("programming" = 2, "magnets" = 2, "engineering" = 2, "bluespace" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/experimentor category = list("Research Machinery") -/datum/design/protolathe +/datum/design/board/protolathe name = "Machine Design (Protolathe Board)" desc = "The circuit board for a protolathe." id = "protolathe" req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/protolathe category = list("Research Machinery") -/datum/design/circuit_imprinter +/datum/design/board/circuit_imprinter name = "Machine Design (Circuit Imprinter Board)" desc = "The circuit board for a circuit imprinter." id = "circuit_imprinter" req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/circuit_imprinter category = list("Research Machinery") -/datum/design/rdservercontrol +/datum/design/board/rdservercontrol name = "Computer Design (R&D Server Control Console Board)" desc = "The circuit board for an R&D Server Control Console." id = "rdservercontrol" req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/computer/rdservercontrol category = list("Research Machinery") -/datum/design/rdserver +/datum/design/board/rdserver name = "Machine Design (R&D Server Board)" desc = "The circuit board for an R&D Server." id = "rdserver" req_tech = list("programming" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/rdserver category = list("Research Machinery") -/datum/design/mechfab +/datum/design/board/mechfab name = "Machine Design (Exosuit Fabricator Board)" desc = "The circuit board for an Exosuit Fabricator." id = "mechfab" req_tech = list("programming" = 3, "engineering" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/mechfab category = list("Research Machinery") -/datum/design/cyborgrecharger +/datum/design/board/cyborgrecharger name = "Machine Design (Cyborg Recharger Board)" desc = "The circuit board for a Cyborg Recharger." id = "cyborgrecharger" req_tech = list("powerstorage" = 3, "engineering" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/cyborgrecharger category = list("Research Machinery") -/datum/design/mech_recharger +/datum/design/board/mech_recharger name = "Machine Design (Mechbay Recharger Board)" desc = "The circuit board for a Mechbay Recharger." id = "mech_recharger" req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/mech_recharger category = list("Research Machinery") -/datum/design/microwave +/datum/design/board/microwave name = "Machine Design (Microwave Board)" desc = "The circuit board for a microwave." id = "microwave" req_tech = list("programming" = 2, "magnets" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/microwave category = list ("Misc. Machinery") -/datum/design/gibber +/datum/design/board/gibber name = "Machine Design (Gibber Board)" desc = "The circuit board for a gibber." id = "gibber" req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/gibber category = list ("Misc. Machinery") -/datum/design/smartfridge +/datum/design/board/smartfridge name = "Machine Design (Smartfridge Board)" desc = "The circuit board for a smartfridge." id = "smartfridge" req_tech = list("programming" = 1) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/smartfridge category = list ("Misc. Machinery") -/datum/design/monkey_recycler +/datum/design/board/monkey_recycler name = "Machine Design (Monkey Recycler Board)" desc = "The circuit board for a monkey recycler." id = "smartfridge" req_tech = list("programming" = 1) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/monkey_recycler category = list ("Misc. Machinery") -/datum/design/seed_extractor +/datum/design/board/seed_extractor name = "Machine Design (Seed Extractor Board)" desc = "The circuit board for a seed extractor." id = "seed_extractor" req_tech = list("programming" = 1) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/seed_extractor category = list ("Misc. Machinery") -/datum/design/processor +/datum/design/board/processor name = "Machine Design (Processor Board)" desc = "The circuit board for a processor." id = "processor" req_tech = list("programming" = 1) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/processor category = list ("Misc. Machinery") -/datum/design/recycler +/datum/design/board/recycler name = "Machine Design (Recycler Board)" desc = "The circuit board for a recycler." id = "recycler" req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/recycler category = list ("Misc. Machinery") -/datum/design/holopad +/datum/design/board/holopad name = "Machine Design (AI Holopad Board)" desc = "The circuit board for a holopad." id = "holopad" req_tech = list("programming" = 1) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/holopad category = list ("Misc. Machinery") -/datum/design/autolathe +/datum/design/board/autolathe name = "Machine Design (Autolathe Board)" desc = "The circuit board for an autolathe." id = "autolathe" req_tech = list("programming" = 3, "engineering" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/autolathe category = list ("Misc. Machinery") -/datum/design/recharger +/datum/design/board/recharger name = "Machine Design (Weapon Recharger Board)" desc = "The circuit board for a Weapon Recharger." id = "recharger" req_tech = list("powerstorage" = 4, "engineering" = 3, "materials" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20, MAT_GOLD = 100) + materials = list(MAT_GLASS = 1000, MAT_GOLD = 100) build_path = /obj/item/weapon/circuitboard/machine/recharger category = list("Misc. Machinery") -/datum/design/vendor +/datum/design/board/vendor name = "Machine Design (Vendor Board)" desc = "The circuit board for a Vendor." id = "vendor" req_tech = list("programming" = 1) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/vendor category = list ("Misc. Machinery") -/datum/design/ore_redemption +/datum/design/board/ore_redemption name = "Machine Design (Ore Redemption Board)" desc = "The circuit board for an Ore Redemption machine." id = "ore_redemption" req_tech = list("programming" = 2, "engineering" = 2, "plasmatech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/ore_redemption category = list ("Misc. Machinery") -/datum/design/mining_equipment_vendor +/datum/design/board/mining_equipment_vendor name = "Machine Design (Mining Rewards Vender Board)" desc = "The circuit board for a Mining Rewards Vender." id = "mining_equipment_vendor" req_tech = list("engineering" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/mining_equipment_vendor category = list ("Misc. Machinery") -/datum/design/tesla_coil +/datum/design/board/tesla_coil name = "Machine Design (Tesla Coil Board)" desc = "The circuit board for a tesla coil." id = "tesla_coil" req_tech = list("programming" = 3, "powerstorage" = 3, "magnets" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/tesla_coil category = list ("Misc. Machinery") -/datum/design/grounding_rod +/datum/design/board/grounding_rod name = "Machine Design (Grounding Rod Board)" desc = "The circuit board for a grounding rod." id = "grounding_rod" req_tech = list("programming" = 3, "powerstorage" = 3, "magnets" = 3, "plasmatech" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/grounding_rod category = list ("Misc. Machinery") -/datum/design/plantgenes +/datum/design/board/plantgenes name = "Machine Design (Plant DNA Manipulator Board)" desc = "The circuit board for a plant DNA manipulator." id = "plantgenes" req_tech = list("programming" = 4, "biotech" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/plantgenes category = list ("Misc. Machinery") diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index 6805fac443e..ebfece1ddbc 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -2,163 +2,136 @@ //////////Mecha Module Disks/////// /////////////////////////////////// -/datum/design/ripley_main +/datum/design/board/ripley_main name = "APLU \"Ripley\" Central Control module" desc = "Allows for the construction of a \"Ripley\" Central Control module." id = "ripley_main" req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/ripley/main category = list("Exosuit Modules") -/datum/design/ripley_peri +/datum/design/board/ripley_peri name = "APLU \"Ripley\" Peripherals Control module" desc = "Allows for the construction of a \"Ripley\" Peripheral Control module." id = "ripley_peri" req_tech = list("programming" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/ripley/peripherals category = list("Exosuit Modules") -/datum/design/odysseus_main + +/datum/design/board/odysseus_main name = "\"Odysseus\" Central Control module" desc = "Allows for the construction of a \"Odysseus\" Central Control module." id = "odysseus_main" req_tech = list("programming" = 3,"biotech" = 3, "engineering" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/odysseus/main category = list("Exosuit Modules") -/datum/design/odysseus_peri +/datum/design/board/odysseus_peri name = "\"Odysseus\" Peripherals Control module" desc = "Allows for the construction of a \"Odysseus\" Peripheral Control module." id = "odysseus_peri" req_tech = list("programming" = 3,"biotech" = 3, "engineering" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/odysseus/peripherals category = list("Exosuit Modules") -/datum/design/gygax_main + +/datum/design/board/gygax_main name = "\"Gygax\" Central Control module" desc = "Allows for the construction of a \"Gygax\" Central Control module." id = "gygax_main" req_tech = list("programming" = 4, "combat" = 3, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/gygax/main category = list("Exosuit Modules") -/datum/design/gygax_peri +/datum/design/board/gygax_peri name = "\"Gygax\" Peripherals Control module" desc = "Allows for the construction of a \"Gygax\" Peripheral Control module." id = "gygax_peri" req_tech = list("programming" = 4, "combat" = 3, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/gygax/peripherals category = list("Exosuit Modules") -/datum/design/gygax_targ +/datum/design/board/gygax_targ name = "\"Gygax\" Weapons & Targeting Control module" desc = "Allows for the construction of a \"Gygax\" Weapons & Targeting Control module." id = "gygax_targ" req_tech = list("programming" = 4, "combat" = 4, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting category = list("Exosuit Modules") -/datum/design/durand_main + +/datum/design/board/durand_main name = "\"Durand\" Central Control module" desc = "Allows for the construction of a \"Durand\" Central Control module." id = "durand_main" req_tech = list("programming" = 4, "combat" = 4, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/durand/main category = list("Exosuit Modules") -/datum/design/durand_peri +/datum/design/board/durand_peri name = "\"Durand\" Peripherals Control module" desc = "Allows for the construction of a \"Durand\" Peripheral Control module." id = "durand_peri" req_tech = list("programming" = 4, "combat" = 4, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals category = list("Exosuit Modules") -/datum/design/durand_targ +/datum/design/board/durand_targ name = "\"Durand\" Weapons & Targeting Control module" desc = "Allows for the construction of a \"Durand\" Weapons & Targeting Control module." id = "durand_targ" req_tech = list("programming" = 5, "combat" = 4, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting category = list("Exosuit Modules") -/datum/design/honker_main + +/datum/design/board/honker_main name = "\"H.O.N.K\" Central Control module" desc = "Allows for the construction of a \"H.O.N.K\" Central Control module." id = "honker_main" req_tech = list("programming" = 3, "engineering" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/honker/main category = list("Exosuit Modules") -/datum/design/honker_peri +/datum/design/board/honker_peri name = "\"H.O.N.K\" Peripherals Control module" desc = "Allows for the construction of a \"H.O.N.K\" Peripheral Control module." id = "honker_peri" req_tech = list("programming" = 3, "engineering" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/honker/peripherals category = list("Exosuit Modules") -/datum/design/honker_targ +/datum/design/board/honker_targ name = "\"H.O.N.K\" Weapons & Targeting Control module" desc = "Allows for the construction of a \"H.O.N.K\" Weapons & Targeting Control module." id = "honker_targ" req_tech = list("programming" = 3, "engineering" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/honker/targeting category = list("Exosuit Modules") -/datum/design/phazon_main + +/datum/design/board/phazon_main name = "\"Phazon\" Central Control module" desc = "Allows for the construction of a \"Phazon\" Central Control module." id = "phazon_main" req_tech = list("programming" = 6, "materials" = 6, "plasmatech" = 5) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/phazon/main category = list("Exosuit Modules") -/datum/design/phazon_peri +/datum/design/board/phazon_peri name = "\"Phazon\" Peripherals Control module" desc = "Allows for the construction of a \"Phazon\" Peripheral Control module." id = "phazon_peri" req_tech = list("programming" = 6, "bluespace" = 5, "plasmatech" = 5) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/phazon/peripherals category = list("Exosuit Modules") -/datum/design/phazon_targ +/datum/design/board/phazon_targ name = "\"Phazon\" Weapons & Targeting Control module" desc = "Allows for the construction of a \"Phazon\" Weapons & Targeting Control module." id = "phazon_targ" req_tech = list("programming" = 6, "magnets" = 5, "plasmatech" = 5) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/phazon/targeting category = list("Exosuit Modules") diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 0518e393ecd..26b9fdc5b16 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -648,6 +648,16 @@ construction_time = 120 category = list("Cyborg Upgrade Modules") +/datum/design/borg_upgrade_hyperka + name = "Cyborg (Hyper-Kinetic Accelerator)" + id = "borg_upgrade_hyperka" + req_tech = list("materials" = 7, "powerstorage" = 5, "engineering" = 5, "magnets" = 5, "combat" = 4) + build_type = MECHFAB //Reqs same as human Hyper KA + materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000) + build_path = /obj/item/borg/upgrade/hyperka + construction_time = 120 + category = list("Cyborg Upgrade Modules") + /datum/design/borg_syndicate_module name = "Cyborg Upgrade (Illegal Modules)" id = "borg_syndicate_module" diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index ba9f113e2e4..c474db4f2fb 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -68,32 +68,24 @@ build_path = /obj/item/device/lightreplacer category = list("Power Designs") -/datum/design/pacman +/datum/design/board/pacman name = "Machine Design (PACMAN-type Generator Board)" desc = "The circuit board that for a PACMAN-type portable generator." id = "pacman" req_tech = list("programming" = 2, "plasmatech" = 3, "powerstorage" = 3, "engineering" = 3) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/pacman category = list("Engineering Machinery") -/datum/design/superpacman +/datum/design/board/pacman/super name = "Machine Design (SUPERPACMAN-type Generator Board)" desc = "The circuit board that for a SUPERPACMAN-type portable generator." id = "superpacman" req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/pacman/super - category = list("Engineering Machinery") -/datum/design/mrspacman +/datum/design/board/pacman/mrs name = "Machine Design (MRSPACMAN-type Generator Board)" desc = "The circuit board that for a MRSPACMAN-type portable generator." id = "mrspacman" req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 5, "plasmatech" = 4) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/pacman/mrs - category = list("Engineering Machinery") diff --git a/code/modules/research/designs/telecomms_designs.dm b/code/modules/research/designs/telecomms_designs.dm index f63ee2fe2d5..a9bfa208893 100644 --- a/code/modules/research/designs/telecomms_designs.dm +++ b/code/modules/research/designs/telecomms_designs.dm @@ -2,72 +2,58 @@ /////Subspace Telecomms//////////// /////////////////////////////////// -/datum/design/subspace_receiver +/datum/design/board/subspace_receiver name = "Machine Design (Subspace Receiver)" desc = "Allows for the construction of Subspace Receiver equipment." id = "s-receiver" req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 1) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/telecomms/receiver category = list("Subspace Telecomms") -/datum/design/telecomms_bus +/datum/design/board/telecomms_bus name = "Machine Design (Bus Mainframe)" desc = "Allows for the construction of Telecommunications Bus Mainframes." id = "s-bus" req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/telecomms/bus category = list("Subspace Telecomms") -/datum/design/telecomms_hub +/datum/design/board/telecomms_hub name = "Machine Design (Hub Mainframe)" desc = "Allows for the construction of Telecommunications Hub Mainframes." id = "s-hub" req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/telecomms/hub category = list("Subspace Telecomms") -/datum/design/telecomms_relay +/datum/design/board/telecomms_relay name = "Machine Design (Relay Mainframe)" desc = "Allows for the construction of Telecommunications Relay Mainframes." id = "s-relay" req_tech = list("programming" = 2, "engineering" = 2, "bluespace" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/telecomms/relay category = list("Subspace Telecomms") -/datum/design/telecomms_processor +/datum/design/board/telecomms_processor name = "Machine Design (Processor Unit)" desc = "Allows for the construction of Telecommunications Processor equipment." id = "s-processor" req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/telecomms/processor category = list("Subspace Telecomms") -/datum/design/telecomms_server +/datum/design/board/telecomms_server name = "Machine Design (Server Mainframe)" desc = "Allows for the construction of Telecommunications Servers." id = "s-server" req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/telecomms/server category = list("Subspace Telecomms") -/datum/design/subspace_broadcaster +/datum/design/board/subspace_broadcaster name = "Machine Design (Subspace Broadcaster)" desc = "Allows for the construction of Subspace Broadcasting equipment." id = "s-broadcaster" req_tech = list("programming" = 2, "engineering" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/machine/telecomms/broadcaster category = list("Subspace Telecomms") diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index e704a8a488d..3aef80ce616 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -77,7 +77,7 @@ name = "Rapid Syringe Gun" desc = "A gun that fires many syringes." id = "rapidsyringe" - req_tech = list("combat" = 3, "biotech" = 3) + req_tech = list("combat" = 2, "biotech" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 5000, MAT_GLASS = 1000) build_path = /obj/item/weapon/gun/syringe/rapidsyringe @@ -200,7 +200,7 @@ //WT550 Mags /datum/design/mag_oldsmg - name = "WT-550 Auto Gun Magazine (4.6×30mm)" + name = "WT-550 Auto Gun Magazine (4.6x30mm)" desc = "A 20 round magazine for the out of date security WT-550 Auto Rifle" id = "mag_oldsmg" req_tech = list("combat" = 1, "materials" = 1) @@ -210,22 +210,22 @@ category = list("Ammo") /datum/design/mag_oldsmg/ap_mag - name = "WT-550 Auto Gun Armour Piercing Magazine (4.6×30mm AP)" + name = "WT-550 Auto Gun Armour Piercing Magazine (4.6x30mm AP)" desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle" id = "mag_oldsmg_ap" materials = list(MAT_METAL = 6000, MAT_SILVER = 600) build_path = /obj/item/ammo_box/magazine/wt550m9/wtap /datum/design/mag_oldsmg/ic_mag - name = "WT-550 Auto Gun Incendiary Magazine (4.6×30mm IC)" + name = "WT-550 Auto Gun Incendiary Magazine (4.6x30mm IC)" desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle" id = "mag_oldsmg_ic" materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_GLASS = 1000) build_path = /obj/item/ammo_box/magazine/wt550m9/wtic /datum/design/mag_oldsmg/tx_mag - name = "WT-550 Auto Gun Urnaium Magazine (4.6×30mm TX)" - desc = "A 20 round urnaium tipped magazine for the out of date security WT-550 Auto Rifle" + name = "WT-550 Auto Gun Uranium Magazine (4.6x30mm TX)" + desc = "A 20 round uranium tipped magazine for the out of date security WT-550 Auto Rifle" id = "mag_oldsmg_tx" materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_URANIUM = 2000) build_path = /obj/item/ammo_box/magazine/wt550m9/wttx @@ -268,4 +268,4 @@ build_type = PROTOLATHE materials = list(MAT_SILVER = 7000, MAT_GOLD = 7000, MAT_URANIUM = 6000, MAT_GLASS = 6000, MAT_METAL = 6000, MAT_DIAMOND = 3000) build_path = /obj/item/weapon/gun/energy/gravity_gun - category = list("Weapons") \ No newline at end of file + category = list("Weapons") diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 8422a2c96f1..a5bc7f4b60e 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -191,10 +191,12 @@ if(loaded_item) if(cloneMode && cloneCount > 0) visible_message("A duplicate [loaded_item] pops out!") - new loaded_item(get_turf(pick(oview(1,src)))) + var/type_to_make = loaded_item.type + new type_to_make(get_turf(pick(oview(1,src)))) --cloneCount if(cloneCount == 0) cloneMode = FALSE + return var/turf/dropturf = get_turf(pick(view(1,src))) if(!dropturf) //Failsafe to prevent the object being lost in the void forever. dropturf = get_turf(src) @@ -225,7 +227,7 @@ recentlyExperimented = 1 icon_state = "h_lathe_wloop" var/chosenchem - var/criticalReaction = locate(exp_on) in critical_items ? TRUE : FALSE + var/criticalReaction = (exp_on.type in critical_items) ? TRUE : FALSE //////////////////////////////////////////////////////////////////////////////////////////////// if(exp == SCANTYPE_POKE) visible_message("[src] prods at [exp_on] with mechanical arms.") @@ -379,7 +381,7 @@ visible_message("[src] lowers [exp_on]'s temperature.") if(prob(EFFECT_PROB_LOW) && criticalReaction) visible_message("[src]'s emergency coolant system gives off a small ding!") - var/obj/machinery/vending/coffee/C = new /obj/machinery/vending/coffee(get_turf(pick(oview(1,src)))) + var/obj/item/weapon/reagent_containers/food/drinks/coffee/C = new /obj/item/weapon/reagent_containers/food/drinks/coffee(get_turf(pick(oview(1,src)))) playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) //Ding! Your death coffee is ready! chosenchem = pick("uranium","frostoil","ephedrine") C.reagents.remove_any(25) @@ -588,6 +590,7 @@ var/cooldown /obj/item/weapon/relic/New() + ..() icon_state = pick("shock_kit","armor-igniter-analyzer","infra-igniter0","infra-igniter1","radio-multitool","prox-radio1","radio-radio","timer-multitool0","radio-igniter-tank") realName = "[pick("broken","twisted","spun","improved","silly","regular","badly made")] [pick("device","object","toy","illegal tech","weapon")]" diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index ff1e2ef9c75..9af5ba770e9 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -29,17 +29,14 @@ Note: Must be placed west/left of and R&D console to function. "Firing Pins" ) - reagents = new() - /obj/machinery/r_n_d/protolathe/New() ..() - materials = new(src, list(MAT_METAL=1, MAT_GLASS=1, MAT_SILVER=1, MAT_GOLD=1, MAT_DIAMOND=1, MAT_PLASMA=1, MAT_URANIUM=1, MAT_BANANIUM=1)) + create_reagents(0) + materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM)) var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/protolathe(null) B.apply_default_parts(src) - reagents.my_atom = src - /obj/item/weapon/circuitboard/machine/protolathe name = "circuit board (Protolathe)" build_path = /obj/machinery/r_n_d/protolathe @@ -66,13 +63,13 @@ Note: Must be placed west/left of and R&D console to function. efficiency_coeff = min(max(0, T), 1) /obj/machinery/r_n_d/protolathe/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material + var/list/all_materials = being_built.reagents + being_built.materials + var/A = materials.amount(M) if(!A) A = reagents.get_reagent_amount(M) - A = A / max(1, (being_built.reagents[M])) - else - A = A / max(1, (being_built.materials[M])) - return A + + return round(A / max(1, (all_materials[M]*efficiency_coeff))) //we eject the materials upon deconstruction. /obj/machinery/r_n_d/protolathe/deconstruction() @@ -88,11 +85,15 @@ Note: Must be placed west/left of and R&D console to function. /obj/machinery/r_n_d/protolathe/Insert_Item(obj/item/O, mob/user) - if(istype(O,/obj/item/stack/sheet)) + if(istype(O, /obj/item/stack/sheet)) . = 1 - if(!is_insertion_ready(user) || busy) + if(!is_insertion_ready(user)) return - if(!materials.has_space( materials.get_item_material_amount(O) )) + var/sheet_material = materials.get_item_material_amount(O) + if(!sheet_material) + return + + if(!materials.has_space(sheet_material)) user << "The [src.name]'s material bin is full! Please remove material before adding more." return 1 @@ -116,5 +117,6 @@ Note: Must be placed west/left of and R&D console to function. else if(user.a_intent != "harm") user << "You cannot insert this item into the [name]!" + return 1 else return 0 diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 9f31eff821b..dfd361a885b 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -45,6 +45,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/screen = 1.0 //Which screen is currently showing. var/id = 0 //ID of the computer (for server restrictions). var/sync = 1 //If sync = 0, it doesn't show up on Server Control Console + var/first_use = 1 //If first_use = 1, it will try to auto-connect with nearby devices req_access = list(access_tox) //Data and setting manipulation requires scientist access. @@ -53,37 +54,20 @@ won't update every console in existence) but it's more of a hassle to do. Also, /proc/CallTechName(ID) //A simple helper proc to find the name of a tech with a given ID. - for(var/T in subtypesof(/datum/tech)) - var/datum/tech/tt = T - if(initial(tt.id) == ID) - return initial(tt.name) + if(tech_list[ID]) + var/datum/tech/tech = tech_list[ID] + return tech.name + return "ERROR: Report This" -proc/CallMaterialName(ID) - if (copytext(ID, 1, 2) == "$") - var/return_name = copytext(ID, 2) - switch(return_name) - if("metal") - return_name = "Metal" - if("glass") - return_name = "Glass" - if("gold") - return_name = "Gold" - if("silver") - return_name = "Silver" - if("plasma") - return_name = "Solid Plasma" - if("uranium") - return_name = "Uranium" - if("diamond") - return_name = "Diamond" - if("clown") - return_name = "Bananium" - return return_name - else - for(var/R in subtypesof(/datum/reagent)) - var/datum/reagent/rr = R - if(initial(rr.id) == ID) - return initial(rr.name) +/proc/CallMaterialName(ID) + if (copytext(ID, 1, 2) == "$" && materials_list[ID]) + var/datum/material/material = materials_list[ID] + return material.name + + else if(chemical_reagents_list[ID]) + var/datum/reagent/reagent = chemical_reagents_list[ID] + return reagent.name + return "ERROR: Report This" /obj/machinery/computer/rdconsole/proc/SyncRDevices() //Makes sure it is properly sync'ed up with the devices attached to it (if any). for(var/obj/machinery/r_n_d/D in oview(3,src)) @@ -101,7 +85,7 @@ proc/CallMaterialName(ID) if(linked_imprinter == null) linked_imprinter = D D.linked_console = src - return + first_use = 0 //Have it automatically push research to the centcom server so wild griffins can't fuck up R&D's work --NEO /obj/machinery/computer/rdconsole/proc/griefProtection() @@ -124,9 +108,6 @@ proc/CallMaterialName(ID) S.initialize() break -/obj/machinery/computer/rdconsole/initialize() - SyncRDevices() - /* Instead of calling this every tick, it is only being called when needed /obj/machinery/computer/rdconsole/process() griefProtection() @@ -231,10 +212,15 @@ proc/CallMaterialName(ID) var/datum/design/D = files.known_designs[href_list["copy_design_ID"]] if(D) var/autolathe_friendly = 1 - for(var/x in D.materials) - if( !(x in list(MAT_METAL, MAT_GLASS))) - autolathe_friendly = 0 - D.category -= "Imported" + if(D.reagents.len) + autolathe_friendly = 0 + D.category -= "Imported" + else + for(var/x in D.materials) + if( !(x in list(MAT_METAL, MAT_GLASS))) + autolathe_friendly = 0 + D.category -= "Imported" + if(D.build_type & (AUTOLATHE|PROTOLATHE|CRAFTLATHE)) // Specifically excludes circuit imprinter and mechfab D.build_type = autolathe_friendly ? (D.build_type | AUTOLATHE) : D.build_type D.category |= "Imported" @@ -253,60 +239,59 @@ proc/CallMaterialName(ID) screen = 1.0 else if(href_list["deconstruct"]) //Deconstruct the item in the destructive analyzer and update the research holder. - if(linked_destroy) - if(linked_destroy.busy) - usr << "The destructive analyzer is busy at the moment." - return - var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) - var/cancontinue = FALSE - for(var/T in temp_tech) - if(files.IsTechHigher(T, temp_tech[T])) - cancontinue = TRUE - break - if(!cancontinue) - var/choice = input("This item does not raise tech levels. Proceed destroying loaded item anyway?") in list("Proceed", "Cancel") - if(choice == "Cancel" || !linked_destroy) return - linked_destroy.busy = 1 - screen = 0.1 + if(!linked_destroy || linked_destroy.busy || !linked_destroy.loaded_item) updateUsrDialog() - flick("d_analyzer_process", linked_destroy) - spawn(24) - if(linked_destroy) - linked_destroy.busy = 0 - if(!linked_destroy.loaded_item) - usr <<"The destructive analyzer appears to be empty." - screen = 1.0 - return + return - for(var/T in temp_tech) - var/datum/tech/KT = files.known_tech[T] //For stat logging of high levels - if(files.IsTechHigher(T, temp_tech[T]) && KT.level >= 5) //For stat logging of high levels - feedback_add_details("high_research_level","[KT][KT.level + 1]") //+1 to show the level which we're about to get - files.UpdateTech(T, temp_tech[T]) + var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) + var/cancontinue = FALSE + for(var/T in temp_tech) + if(files.IsTechHigher(T, temp_tech[T])) + cancontinue = TRUE + break + if(!cancontinue) + var/choice = input("This item does not raise tech levels. Proceed destroying loaded item anyway?") in list("Proceed", "Cancel") + if(choice == "Cancel" || !linked_destroy || !linked_destroy.loaded_item) return + linked_destroy.busy = 1 + screen = 0.1 + updateUsrDialog() + flick("d_analyzer_process", linked_destroy) + spawn(24) + if(linked_destroy) + linked_destroy.busy = 0 + if(!linked_destroy.loaded_item) + screen = 1.0 + return - if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any. - for(var/material in linked_destroy.loaded_item.materials) - linked_lathe.materials.insert_amount(min((linked_lathe.materials.max_amount - linked_lathe.materials.total_amount), (linked_destroy.loaded_item.materials[material]*(linked_destroy.decon_mod/10))), material) - feedback_add_details("item_deconstructed","[linked_destroy.loaded_item.type]") - linked_destroy.loaded_item = null - for(var/obj/I in linked_destroy.contents) - for(var/mob/M in I.contents) - M.death() - if(istype(I,/obj/item/stack/sheet))//Only deconsturcts one sheet at a time instead of the entire stack - var/obj/item/stack/sheet/S = I - if(S.amount > 1) - S.amount-- - linked_destroy.loaded_item = S - else - qdel(S) - linked_destroy.icon_state = "d_analyzer" + for(var/T in temp_tech) + var/datum/tech/KT = files.known_tech[T] //For stat logging of high levels + if(files.IsTechHigher(T, temp_tech[T]) && KT.level >= 5) //For stat logging of high levels + feedback_add_details("high_research_level","[KT][KT.level + 1]") //+1 to show the level which we're about to get + files.UpdateTech(T, temp_tech[T]) + + if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any. + for(var/material in linked_destroy.loaded_item.materials) + linked_lathe.materials.insert_amount(min((linked_lathe.materials.max_amount - linked_lathe.materials.total_amount), (linked_destroy.loaded_item.materials[material]*(linked_destroy.decon_mod/10))), material) + feedback_add_details("item_deconstructed","[linked_destroy.loaded_item.type]") + linked_destroy.loaded_item = null + for(var/obj/I in linked_destroy.contents) + for(var/mob/M in I.contents) + M.death() + if(istype(I,/obj/item/stack/sheet))//Only deconsturcts one sheet at a time instead of the entire stack + var/obj/item/stack/sheet/S = I + if(S.amount > 1) + S.amount-- + linked_destroy.loaded_item = S else - if(!(I in linked_destroy.component_parts)) - qdel(I) - linked_destroy.icon_state = "d_analyzer" - screen = 1.0 - use_power(250) - updateUsrDialog() + qdel(S) + linked_destroy.icon_state = "d_analyzer" + else + if(!(I in linked_destroy.component_parts)) + qdel(I) + linked_destroy.icon_state = "d_analyzer" + screen = 1.0 + use_power(250) + updateUsrDialog() else if(href_list["lock"]) //Lock the console from use by anyone without tox access. if(src.allowed(usr)) @@ -353,183 +338,166 @@ proc/CallMaterialName(ID) sync = !sync else if(href_list["build"]) //Causes the Protolathe to build something. - if(linked_lathe) - if(linked_lathe.busy) - usr << "Protolathe is busy at the moment." - return - var/coeff = linked_lathe.efficiency_coeff - var/g2g = 1 - var/datum/design/being_built = files.known_designs[href_list["build"]] - if(being_built) - var/power = 2000 - var/amount=text2num(href_list["amount"]) - var/old_screen = screen - amount = max(1, min(10, amount)) - for(var/M in being_built.materials) - power += round(being_built.materials[M] * amount / 5) - power = max(2000, power) - screen = 0.3 - var/key = usr.key //so we don't lose the info during the spawn delay - if (!(being_built.build_type & PROTOLATHE)) + var/datum/design/being_built = files.known_designs[href_list["build"]] + var/amount = text2num(href_list["amount"]) + + if(!linked_lathe || !being_built || !amount) + updateUsrDialog() + return + + if(linked_lathe.busy) + usr << "Protolathe is busy at the moment." + return + + var/coeff = linked_lathe.efficiency_coeff + var/power = 1000 + var/old_screen = screen + + amount = max(1, min(10, amount)) + for(var/M in being_built.materials) + power += round(being_built.materials[M] * amount / 5) + power = max(3000, power) + screen = 0.3 + var/key = usr.key //so we don't lose the info during the spawn delay + if (!(being_built.build_type & PROTOLATHE)) + message_admins("Protolathe exploit attempted by [key_name(usr, usr.client)]!") + updateUsrDialog() + return + + var/g2g = 1 + var/enough_materials = 1 + linked_lathe.busy = 1 + flick("protolathe_n",linked_lathe) + use_power(power) + + var/list/efficient_mats = list() + for(var/MAT in being_built.materials) + efficient_mats[MAT] = being_built.materials[MAT]*coeff + + if(!linked_lathe.materials.has_materials(efficient_mats, amount)) + linked_lathe.say("Not enough materials to complete prototype.") + enough_materials = 0 + g2g = 0 + else + for(var/R in being_built.reagents) + if(!linked_lathe.reagents.has_reagent(R, being_built.reagents[R]*coeff)) + linked_lathe.say("Not enough reagents to complete prototype.") + enough_materials = 0 g2g = 0 - message_admins("Protolathe exploit attempted by [key_name(usr, usr.client)]!") - if (g2g) //If input is incorrect, nothing happens - var/enough_materials = 1 - linked_lathe.busy = 1 - flick("protolathe_n",linked_lathe) - use_power(power) + if(enough_materials) + linked_lathe.materials.use_amount(efficient_mats, amount) + for(var/R in being_built.reagents) + linked_lathe.reagents.remove_reagent(R, being_built.reagents[R]*coeff) - var/list/efficient_mats = list() - for(var/MAT in being_built.materials) - efficient_mats[MAT] = being_built.materials[MAT]*coeff - - if(!linked_lathe.materials.has_materials(efficient_mats, amount)) - src.visible_message("The [src.name] beeps, \"Not enough materials to complete prototype.\"") - enough_materials = 0 - g2g = 0 - else - for(var/R in being_built.reagents) - if(!linked_lathe.reagents.has_reagent(R, being_built.reagents[R])*coeff) - src.visible_message("The [src.name] beeps, \"Not enough reagents to complete prototype.\"") - enough_materials = 0 - g2g = 0 - - if(enough_materials) - linked_lathe.materials.use_amount(efficient_mats, amount) - for(var/R in being_built.reagents) - linked_lathe.reagents.remove_reagent(R, being_built.reagents[R]*coeff) - - var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. - spawn(32*coeff*amount**0.8) - if(linked_lathe) - if(g2g) //And if we only fail the material requirements, we still spend time and power - var/already_logged = 0 - for(var/i = 0, iThe [src.name] beeps, \"Something went wrong, production halted!\"") - screen = 1.0 - updateUsrDialog() + var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. + spawn(32*coeff*amount**0.8) + if(linked_lathe) + if(g2g) //And if we only fail the material requirements, we still spend time and power + var/already_logged = 0 + for(var/i = 0, iCircuit Imprinter is busy at the moment." + updateUsrDialog() + return + var/coeff = linked_imprinter.efficiency_coeff + + var/power = 1000 + var/old_screen = screen + for(var/M in being_built.materials) + power += round(being_built.materials[M] / 5) + power = max(4000, power) + screen = 0.4 + if (!(being_built.build_type & IMPRINTER)) + message_admins("Circuit imprinter exploit attempted by [key_name(usr, usr.client)]!") + updateUsrDialog() + return + var/g2g = 1 - if(linked_imprinter) - if(linked_imprinter.busy) - usr << "Circuit Imprinter is busy at the moment." - return - var/datum/design/being_built = files.known_designs[href_list["imprint"]] - if(being_built) - var/power = 2000 - var/old_screen = screen - for(var/M in being_built.materials) - power += round(being_built.materials[M] / 5) - power = max(2000, power) - screen = 0.4 - if (!(being_built.build_type & IMPRINTER)) + var/enough_materials = 1 + linked_imprinter.busy = 1 + flick("circuit_imprinter_ani", linked_imprinter) + use_power(power) + + var/list/efficient_mats = list() + for(var/MAT in being_built.materials) + efficient_mats[MAT] = being_built.materials[MAT]/coeff + + if(!linked_imprinter.materials.has_materials(efficient_mats)) + linked_imprinter.say("Not enough materials to complete prototype.") + enough_materials = 0 + g2g = 0 + else + for(var/R in being_built.reagents) + if(!linked_imprinter.reagents.has_reagent(R, being_built.reagents[R]/coeff)) + linked_imprinter.say("Not enough reagents to complete prototype.") + enough_materials = 0 g2g = 0 - message_admins("Circuit imprinter exploit attempted by [key_name(usr, usr.client)]!") - if (g2g) //Again, if input is wrong, do nothing - linked_imprinter.busy = 1 - flick("circuit_imprinter_ani",linked_imprinter) - use_power(power) + if(enough_materials) + linked_imprinter.materials.use_amount(efficient_mats) + for(var/R in being_built.reagents) + linked_imprinter.reagents.remove_reagent(R, being_built.reagents[R]/coeff) - for(var/M in being_built.materials) - if(!linked_imprinter.check_mat(being_built, M)) - src.visible_message("The [src.name] beeps, \"Not enough materials to complete prototype.\"") - g2g = 0 - break - switch(M) - if(MAT_GLASS) - linked_imprinter.g_amount = max(0, (linked_imprinter.g_amount-being_built.materials[M]/coeff)) - if(MAT_GOLD) - linked_imprinter.gold_amount = max(0, (linked_imprinter.gold_amount-being_built.materials[M]/coeff)) - if(MAT_DIAMOND) - linked_imprinter.diamond_amount = max(0, (linked_imprinter.diamond_amount-being_built.materials[M]/coeff)) - else - linked_imprinter.reagents.remove_reagent(M, being_built.materials[M]/coeff) - - var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. - spawn(16) - if(linked_imprinter) - if(g2g) - var/obj/item/new_item = new P(src) - new_item.loc = linked_imprinter.loc - feedback_add_details("circuit_printed","[new_item.type]") - screen = old_screen - linked_imprinter.busy = 0 - else - src.visible_message("The [src.name] beeps, \"Something went wrong, production halted!\"") - screen = 1.0 - updateUsrDialog() - - else if(href_list["disposeI"] && linked_imprinter) //Causes the circuit imprinter to dispose of a single reagent (all of it) - linked_imprinter.reagents.del_reagent(href_list["disposeI"]) - - else if(href_list["disposeallI"] && linked_imprinter) //Causes the circuit imprinter to dispose of all it's reagents. - linked_imprinter.reagents.clear_reagents() + var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. + spawn(16) + if(linked_imprinter) + if(g2g) + var/obj/item/new_item = new P(src) + new_item.loc = linked_imprinter.loc + new_item.materials = efficient_mats.Copy() + feedback_add_details("circuit_printed","[new_item.type]") + screen = old_screen + linked_imprinter.busy = 0 + else + say("Circuit Imprinter connection failed. Production halted.") + screen = 1.0 + updateUsrDialog() + //Protolathe Materials else if(href_list["disposeP"] && linked_lathe) //Causes the protolathe to dispose of a single reagent (all of it) linked_lathe.reagents.del_reagent(href_list["disposeP"]) else if(href_list["disposeallP"] && linked_lathe) //Causes the protolathe to dispose of all it's reagents. linked_lathe.reagents.clear_reagents() - else if(href_list["lathe_ejectsheet"] && linked_lathe) //Causes the protolathe to eject a sheet of material - var/desired_num_sheets = text2num(href_list["lathe_ejectsheet_amt"]) - var/MAT - switch(href_list["lathe_ejectsheet"]) - if("metal") - MAT = MAT_METAL - if("glass") - MAT = MAT_GLASS - if("gold") - MAT = MAT_GOLD - if("silver") - MAT = MAT_SILVER - if("plasma") - MAT = MAT_PLASMA - if("uranium") - MAT = MAT_URANIUM - if("diamond") - MAT = MAT_DIAMOND - if("clown") - MAT = MAT_BANANIUM - linked_lathe.materials.retrieve_sheets(desired_num_sheets, MAT) + else if(href_list["ejectsheet"] && linked_lathe) //Causes the protolathe to eject a sheet of material + linked_lathe.materials.retrieve_sheets(text2num(href_list["eject_amt"]), href_list["ejectsheet"]) + + //Circuit Imprinter Materials + else if(href_list["disposeI"] && linked_imprinter) //Causes the circuit imprinter to dispose of a single reagent (all of it) + linked_imprinter.reagents.del_reagent(href_list["disposeI"]) + + else if(href_list["disposeallI"] && linked_imprinter) //Causes the circuit imprinter to dispose of all it's reagents. + linked_imprinter.reagents.clear_reagents() + + else if(href_list["imprinter_ejectsheet"] && linked_imprinter) //Causes the imprinter to eject a sheet of material + linked_imprinter.materials.retrieve_sheets(text2num(href_list["eject_amt"]), href_list["imprinter_ejectsheet"]) - else if(href_list["imprinter_ejectsheet"] && linked_imprinter) //Causes the protolathe to eject a sheet of material - var/desired_num_sheets = text2num(href_list["imprinter_ejectsheet_amt"]) - var/res_amount, type - switch(href_list["imprinter_ejectsheet"]) - if("glass") - type = /obj/item/stack/sheet/glass - res_amount = "g_amount" - if("gold") - type = /obj/item/stack/sheet/mineral/gold - res_amount = "gold_amount" - if("diamond") - type = /obj/item/stack/sheet/mineral/diamond - res_amount = "diamond_amount" - if(ispath(type) && hasvar(linked_imprinter, res_amount)) - var/obj/item/stack/sheet/sheet = new type(linked_imprinter.loc) - var/available_num_sheets = round(linked_imprinter.vars[res_amount]/sheet.perunit) - if(available_num_sheets>0) - sheet.amount = min(available_num_sheets, desired_num_sheets) - linked_imprinter.vars[res_amount] = max(0, (linked_imprinter.vars[res_amount]-sheet.amount * sheet.perunit)) - else - qdel(sheet) else if(href_list["find_device"]) //The R&D console looks for devices nearby to link up with. screen = 0.0 @@ -591,6 +559,10 @@ proc/CallMaterialName(ID) /obj/machinery/computer/rdconsole/interact(mob/user) user.set_machine(src) + + if(first_use) + SyncRDevices() + var/dat = "" files.RefreshResearch() switch(screen) //A quick check to make sure you get the right screen when a device is disconnected. @@ -705,13 +677,13 @@ proc/CallMaterialName(ID) if(b_type) dat += "Lathe Types:
" if(b_type & IMPRINTER) dat += "Circuit Imprinter
" - if(b_type & PROTOLATHE) dat += "Proto-lathe
" - if(b_type & AUTOLATHE) dat += "Auto-lathe
" - if(b_type & MECHFAB) dat += "Mech Fabricator
" + if(b_type & PROTOLATHE) dat += "Protolathe
" + if(b_type & AUTOLATHE) dat += "Autolathe
" + if(b_type & MECHFAB) dat += "Exosuit Fabricator
" dat += "Required Materials:
" - for(var/M in d_disk.blueprint.materials) - if(copytext(M, 1, 2) == "$") dat += "* [copytext(M, 2)] x [d_disk.blueprint.materials[M]]
" - else dat += "* [M] x [d_disk.blueprint.materials[M]]
" + var/all_mats = d_disk.blueprint.materials + d_disk.blueprint.reagents + for(var/M in all_mats) + dat += "* [CallMaterialName(M)] x [all_mats[M]]
" dat += "
Operations: " dat += "Upload to Database" dat += "Clear Disk" @@ -779,11 +751,10 @@ proc/CallMaterialName(ID) var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) for(var/T in temp_tech) dat += "* [CallTechName(T)] [temp_tech[T]]" - for(var/v in files.known_tech) - var/datum/tech/F = files.known_tech[v] - if(F.name == CallTechName(T)) - dat += " (Current: [F.level])" - break + var/datum/tech/F = files.known_tech[T] + if(F) + dat += " (Current: [F.level])" + dat += "
" dat += "
Options: " dat += "Deconstruct Item" @@ -831,22 +802,15 @@ proc/CallMaterialName(ID) var/temp_material var/c = 50 var/t - for(var/M in D.materials) + + var/all_materials = D.materials + D.reagents + for(var/M in all_materials) t = linked_lathe.check_mat(D, M) temp_material += " | " if (t < 1) - temp_material += "[D.materials[M]*coeff] [CallMaterialName(M)]" + temp_material += "[all_materials[M]*coeff] [CallMaterialName(M)]" else - temp_material += " [D.materials[M]*coeff] [CallMaterialName(M)]" - c = min(c,t) - - for(var/R in D.reagents) - t = linked_lathe.check_mat(D, R) - temp_material += " | " - if (t < 1) - temp_material += "[D.reagents[R]*coeff] [CallMaterialName(R)]" - else - temp_material += " [D.reagents[R]*coeff] [CallMaterialName(R)]" + temp_material += " [all_materials[M]*coeff] [CallMaterialName(M)]" c = min(c,t) if (c >= 1) @@ -898,61 +862,16 @@ proc/CallMaterialName(ID) dat += "Main Menu" dat += "Protolathe Menu
" dat += "

Material Storage:



" - //Metal - var/m_amount = linked_lathe.materials.amount(MAT_METAL) - dat += "* [m_amount] of Metal: " - if(m_amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " - if(m_amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " - if(m_amount >= MINERAL_MATERIAL_AMOUNT) dat += "All" - dat += "
" - //Glass - var/g_amount = linked_lathe.materials.amount(MAT_GLASS) - dat += "* [g_amount] of Glass: " - if(g_amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " - if(g_amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " - if(g_amount >= MINERAL_MATERIAL_AMOUNT) dat += "All" - dat += "
" - //Gold - var/gold_amount = linked_lathe.materials.amount(MAT_GOLD) - dat += "* [gold_amount] of Gold: " - if(gold_amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " - if(gold_amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " - if(gold_amount >= MINERAL_MATERIAL_AMOUNT) dat += "All" - dat += "
" - //Silver - var/silver_amount = linked_lathe.materials.amount(MAT_SILVER) - dat += "* [silver_amount] of Silver: " - if(silver_amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " - if(silver_amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " - if(silver_amount >= MINERAL_MATERIAL_AMOUNT) dat += "All" - dat += "
" - //Plasma - var/plasma_amount = linked_lathe.materials.amount(MAT_PLASMA) - dat += "* [plasma_amount] of Solid Plasma: " - if(plasma_amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " - if(plasma_amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " - if(plasma_amount >= MINERAL_MATERIAL_AMOUNT) dat += "All" - dat += "
" - //Uranium - var/uranium_amount = linked_lathe.materials.amount(MAT_URANIUM) - dat += "* [uranium_amount] of Uranium: " - if(uranium_amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " - if(uranium_amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " - if(uranium_amount >= MINERAL_MATERIAL_AMOUNT) dat += "All" - dat += "
" - //Diamond - var/diamond_amount = linked_lathe.materials.amount(MAT_DIAMOND) - dat += "* [diamond_amount] of Diamond: " - if(diamond_amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " - if(diamond_amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " - if(diamond_amount >= MINERAL_MATERIAL_AMOUNT) dat += "All" - dat += "
" - //Bananium - var/bananium_amount = linked_lathe.materials.amount(MAT_BANANIUM) - dat += "* [bananium_amount] of Bananium: " - if(bananium_amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " - if(bananium_amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " - if(bananium_amount >= MINERAL_MATERIAL_AMOUNT) dat += "All" + if(!linked_lathe) + dat += "ERROR: Protolathe connection failed." + else + for(var/mat_id in linked_lathe.materials.materials) + var/datum/material/M = linked_lathe.materials.materials[mat_id] + dat += "* [M.amount] of [M.name]: " + if(M.amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " + if(M.amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " + if(M.amount >= MINERAL_MATERIAL_AMOUNT) dat += "All" + dat += "
" dat += "
" if(3.3) @@ -974,7 +893,7 @@ proc/CallMaterialName(ID) dat += "Material Storage" dat += "Chemical Storage
" dat += "

Circuit Imprinter Menu:


" - dat += "Material Amount: [linked_imprinter.TotalMaterials()]
" + dat += "Material Amount: [linked_imprinter.materials.total_amount]
" dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]
" dat += "\ @@ -991,7 +910,7 @@ proc/CallMaterialName(ID) dat += "Main Menu" dat += "Circuit Imprinter Menu" dat += "

Browsing [selected_category]:


" - dat += "Material Amount: [linked_imprinter.TotalMaterials()]
" + dat += "Material Amount: [linked_imprinter.materials.total_amount]
" dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]
" var/coeff = linked_imprinter.efficiency_coeff @@ -1001,13 +920,16 @@ proc/CallMaterialName(ID) continue var/temp_materials var/check_materials = 1 - for(var/M in D.materials) + + var/all_materials = D.materials + D.reagents + + for(var/M in all_materials) temp_materials += " | " if (!linked_imprinter.check_mat(D, M)) check_materials = 0 - temp_materials += " [D.materials[M]/coeff] [CallMaterialName(M)]" + temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]" else - temp_materials += " [D.materials[M]/coeff] [CallMaterialName(M)]" + temp_materials += " [all_materials[M]/coeff] [CallMaterialName(M)]" if (check_materials) dat += "[D.name][temp_materials]
" else @@ -1018,7 +940,7 @@ proc/CallMaterialName(ID) dat += "Main Menu" dat += "Circuit Imprinter Menu" dat += "

Search results:


" - dat += "Material Amount: [linked_imprinter.TotalMaterials()]
" + dat += "Material Amount: [linked_imprinter.materials.total_amount]
" dat += "Chemical Volume: [linked_imprinter.reagents.total_volume]
" var/coeff = linked_imprinter.efficiency_coeff @@ -1038,9 +960,9 @@ proc/CallMaterialName(ID) dat += "[D.name][temp_materials]
" dat += "
" - if(4.2) + if(4.2) //Circuit Imprinter Material Storage Sub-menu dat += "Main Menu" - dat += "Imprinter Menu" + dat += "Circuit Imprinter Menu" dat += "Disposal All Chemicals in Storage
" dat += "

Chemical Storage:



" for(var/datum/reagent/R in linked_imprinter.reagents.reagent_list) @@ -1051,23 +973,16 @@ proc/CallMaterialName(ID) dat += "Main Menu" dat += "Circuit Imprinter Menu
" dat += "

Material Storage:



" - //Glass - dat += "* [linked_imprinter.g_amount] glass: " - if(linked_imprinter.g_amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " - if(linked_imprinter.g_amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " - if(linked_imprinter.g_amount >= MINERAL_MATERIAL_AMOUNT) dat += "All" - dat += "
" - //Gold - dat += "* [linked_imprinter.gold_amount] gold: " - if(linked_imprinter.gold_amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " - if(linked_imprinter.gold_amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " - if(linked_imprinter.gold_amount >= MINERAL_MATERIAL_AMOUNT) dat += "All" - dat += "
" - //Diamond - dat += "* [linked_imprinter.diamond_amount] diamond: " - if(linked_imprinter.diamond_amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " - if(linked_imprinter.diamond_amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " - if(linked_imprinter.diamond_amount >= MINERAL_MATERIAL_AMOUNT) dat += "All" + if(!linked_imprinter) + dat += "ERROR: Protolathe connection failed." + else + for(var/mat_id in linked_imprinter.materials.materials) + var/datum/material/M = linked_imprinter.materials.materials[mat_id] + dat += "* [M.amount] of [M.name]: " + if(M.amount >= MINERAL_MATERIAL_AMOUNT) dat += "Eject " + if(M.amount >= MINERAL_MATERIAL_AMOUNT*5) dat += "5x " + if(M.amount >= MINERAL_MATERIAL_AMOUNT) dat += "All" + dat += "
" dat += "
" var/datum/browser/popup = new(user, "rndconsole", name, 460, 550) diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 3778e2c1c73..e90dcb20412 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -81,9 +81,14 @@ return if (disabled) return - if (!linked_console) - user << "The [name] must be linked to an R&D console first!" - return + if (!linked_console) // Try to auto-connect to new RnD consoles nearby. + for(var/obj/machinery/computer/rdconsole/console in oview(3, src)) + if(console.first_use) + console.SyncRDevices() + + if(!linked_console) + user << "The [name] must be linked to an R&D console first!" + return if (busy) user << "The [src.name] is busy right now." return diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 130fce1f03f..503b35891d5 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -172,12 +172,12 @@ research holder datum. /datum/tech/engineering name = "Engineering Research" - desc = "Development of new and improved engineering parts and." + desc = "Development of new and improved engineering parts and tools." id = "engineering" /datum/tech/plasmatech name = "Plasma Research" - desc = "Research into the mysterious substance colloqually known as 'plasma'." + desc = "Research into the mysterious substance colloqually known as \"plasma\"." id = "plasmatech" rare = 3 @@ -187,8 +187,8 @@ research holder datum. id = "powerstorage" /datum/tech/bluespace - name = "'Blue-space' Research" - desc = "Research into the sub-reality known as 'blue-space'" + name = "\"Blue-space\" Research" + desc = "Research into the sub-reality known as \"blue-space\"." id = "bluespace" rare = 2 @@ -218,6 +218,9 @@ research holder datum. id = "syndicate" rare = 4 + +//Secret Technologies (hidden by default, require rare items to reveal) + /datum/tech/abductor name = "Alien Technologies Research" desc = "The study of technologies used by the advanced alien race known as Abductors." @@ -225,13 +228,14 @@ research holder datum. rare = 5 level = 0 -/* /datum/tech/arcane name = "Arcane Research" - desc = "Research into the occult and arcane field for use in practical science" + desc = "When sufficiently analyzed, any magic becomes indistinguishable from technology." id = "arcane" - level = 0 //It didn't become "secret" as advertised. + rare = 5 + level = 0 +/* //Branch Techs /datum/tech/explosives name = "Explosives Research" diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 9f8e6a580b5..9d79c5f1ced 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -71,6 +71,7 @@ var/rating = 1 /obj/item/weapon/stock_parts/New() + ..() src.pixel_x = rand(-5, 5) src.pixel_y = rand(-5, 5) diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 4558125cdfe..755fbde1da1 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -412,27 +412,27 @@ mob_species = /datum/species/human flavour_text = {"Doomed to walk this eternal hellscape due to means you barely remember at this point, every day is a struggle for survival as you barely scrape by in your makeshift housing."} -/obj/effect/mob_spawn/human/hermit/special(mob/living/new_spawn) +/obj/effect/mob_spawn/human/hermit/New() var/arrpee = rand(1,4) switch(arrpee) if(1) - new_spawn << "You were the sole survivor of a raid-party's onslaught on a small orbital tradestation. You were forced to early-eject your pod to escape, the horrifed faces of the remaining crew when the raiders blew apart the room's airlock forever ingrained in your mind." + flavour_text = {"You were the sole survivor of a raid-party's onslaught on a small orbital tradestation. You were forced to early-eject your pod to escape, the horrifed faces of the remaining crew when the raiders blew apart the room's airlock forever ingrained in your mind."} uniform = /obj/item/clothing/under/assistantformal shoes = /obj/item/clothing/shoes/sneakers/black back = /obj/item/weapon/storage/backpack if(2) - new_spawn << "A castaway from a far-off civilization, banished for crimes of heresy against the church. You awoke from hypersleep your pod crashlanding into this hellscape, only the essentials left to make a new life for yourself." + flavour_text = {"A castaway from a far-off civilization, banished for crimes of heresy against the church. You awoke from hypersleep your pod crashlanding into this hellscape, only the essentials left to make a new life for yourself."} uniform = /obj/item/clothing/under/rank/prisoner shoes = /obj/item/clothing/shoes/sneakers/orange back = /obj/item/weapon/storage/backpack if(3) - new_spawn << "A runaway from the tyranny of Nanotrasen and everything all these damnned corporations stand for. From a metaphorical hell to a literal one, you do your best to put your station-life behind you to try and survive in this harsh land." + flavour_text = {"A runaway from the tyranny of Nanotrasen and everything all these damnned corporations stand for. From a metaphorical hell to a literal one, you do your best to put your station-life behind you to try and survive in this harsh land."} uniform = /obj/item/clothing/under/rank/medical suit = /obj/item/clothing/suit/toggle/labcoat back = /obj/item/weapon/storage/backpack/medic shoes = /obj/item/clothing/shoes/sneakers/black if(4) - new_spawn << "You weren't exactly the sharpest tool in the shed, hitting that big red button on the escape pod wondering what it'd do. Whether this 'special' attribute of yours is a defect of cloning or just genuine stupidity, the fact you've survived this long in a literal hellhole is enough to make Darwin roll in his grave." + flavour_text = {"You weren't exactly the sharpest tool in the shed, hitting that big red button on the escape pod wondering what it'd do. Whether this 'special' attribute of yours is a defect of cloning or just genuine stupidity, the fact you've survived this long in a literal hellhole is enough to make Darwin roll in his grave."} uniform = /obj/item/clothing/under/color/grey/glorf shoes = /obj/item/clothing/shoes/sneakers/black back = /obj/item/weapon/storage/backpack \ No newline at end of file diff --git a/code/modules/spells/spell_types/demon.dm b/code/modules/spells/spell_types/demon.dm index ddbd41edaa8..c58ee8b1839 100644 --- a/code/modules/spells/spell_types/demon.dm +++ b/code/modules/spells/spell_types/demon.dm @@ -149,7 +149,7 @@ src.ExtinguishMob() if(buckled) buckled.unbuckle_mob(src,force=1) - if(buckled_mobs.len) + if(has_buckled_mobs()) unbuckle_all_mobs(force=1) if(pulledby) pulledby.stop_pulling() diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm index 9afa9929390..71b58883ddb 100644 --- a/code/modules/spells/spell_types/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/ethereal_jaunt.dm @@ -35,7 +35,7 @@ if(target.pulledby) target.pulledby.stop_pulling() target.stop_pulling() - if(target.buckled_mobs.len) + if(target.has_buckled_mobs()) target.unbuckle_all_mobs(force=1) jaunt_disappear(animation, target) target.loc = holder diff --git a/code/modules/spells/spell_types/turf_teleport.dm b/code/modules/spells/spell_types/turf_teleport.dm index d649c488967..0c473f67297 100644 --- a/code/modules/spells/spell_types/turf_teleport.dm +++ b/code/modules/spells/spell_types/turf_teleport.dm @@ -40,7 +40,7 @@ if(!target.Move(picked)) if(target.buckled) target.buckled.unbuckle_mob(target,force=1) - if(target.buckled_mobs.len) + if(target.has_buckled_mobs()) target.unbuckle_all_mobs(force=1) target.loc = picked playsound(get_turf(user), sound2, 50,1) diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index f882b4444c7..03fc5baf7bb 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -6,7 +6,7 @@ var/list/GPS_list = list() icon_state = "gps-c" w_class = 2 slot_flags = SLOT_BELT - origin_tech = "materials=2;magnets=3;bluespace=3" + origin_tech = "materials=2;magnets=1;bluespace=2" var/gpstag = "COM0" var/emped = 0 var/turf/locked_location diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index bf77878eae0..fbe44181235 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -18,7 +18,7 @@ obj/vehicle/atv/post_buckle_mob(mob/living/M) - if(buckled_mobs.len) + if(has_buckled_mobs()) overlays += atvcover else overlays -= atvcover diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm index e0792514af8..b00bc315680 100644 --- a/code/modules/vehicles/pimpin_ride.dm +++ b/code/modules/vehicles/pimpin_ride.dm @@ -10,7 +10,7 @@ /obj/vehicle/janicart/handle_vehicle_offsets() ..() - if(buckled_mobs.len) + if(has_buckled_mobs()) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m switch(buckled_mob.dir) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index e894e3c1c4a..49a36bf69e0 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -21,7 +21,7 @@ /obj/vehicle/scooter/handle_vehicle_offsets() ..() - if(buckled_mobs.len) + if(has_buckled_mobs()) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m switch(buckled_mob.dir) @@ -46,14 +46,14 @@ density = 0 /obj/vehicle/scooter/skateboard/post_buckle_mob(mob/living/M)//allows skateboards to be non-dense but still allows 2 skateboarders to collide with each other - if(buckled_mobs.len) + if(has_buckled_mobs()) density = 1 else density = 0 /obj/vehicle/scooter/skateboard/Bump(atom/A) ..() - if(A.density && buckled_mobs.len) + if(A.density && has_buckled_mobs()) var/mob/living/carbon/H = buckled_mobs[1] var/atom/throw_target = get_edge_target_turf(H, pick(cardinal)) unbuckle_mob(H) diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index 7602f9f4356..e9fa351f398 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -26,7 +26,7 @@ dir = move_dir /obj/vehicle/space/speedbike/Move(newloc,move_dir) - if(buckled_mobs.len) + if(has_buckled_mobs()) PoolOrNew(/obj/effect/overlay/temp/speedbike_trail,list(loc,move_dir)) . = ..() @@ -40,7 +40,7 @@ pixel_y = 0 /obj/vehicle/space/speedbike/handle_vehicle_offsets() - if(buckled_mobs.len) + if(has_buckled_mobs()) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m buckled_mob.dir = dir diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 96582344dfc..32f0c0f886b 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -36,7 +36,7 @@ //if they differ between directions, otherwise use the //generic variables /obj/vehicle/proc/handle_vehicle_offsets() - if(buckled_mobs.len) + if(has_buckled_mobs()) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m buckled_mob.dir = dir @@ -123,7 +123,7 @@ /obj/vehicle/Bump(atom/movable/M) . = ..() if(auto_door_open) - if(istype(M, /obj/machinery/door) && buckled_mobs.len) + if(istype(M, /obj/machinery/door) && has_buckled_mobs()) for(var/m in buckled_mobs) M.Bumped(m) diff --git a/html/changelog.html b/html/changelog.html index 37a3acc125e..fc7a43aa6e3 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,96 @@ -->
+

08 June 2016

+

Cruix updated:

+
    +
  • Changelings no longer lose the regenerate ability if they respect while in regenerative stasis.
  • +
+

Fox McCloud updated:

+
    +
  • Fixes Experimentor critical reactions not working
  • +
  • Fixes Experimentor item cloning not working
  • +
  • Fixes Experimentor producing coffee vending machines instead of coffe cups
  • +
  • Experimentor can only clone critical reaction items instead of anything with an origin tech
  • +
+

GunHog updated:

+
    +
  • Nanotrasen has approved the Hyper-Kenetic Accelerator upgrade for cyborg mining modules.
  • +
  • Each of the heads' ID computers are now themed for their department!
  • +
+

Joan updated:

+
    +
  • Anima Fragments have slightly more health and move faster, but slow down temporarily when taking damage. Also they can move in space now.
  • +
+

Kor updated:

+
    +
  • The clown will play a sad trombone noise upon death.
  • +
+

PKPenguin321 updated:

+
    +
  • You can now emag chemical dispensers, such as the ones in chemistry or the bar, to unlock illegal chemicals.
  • +
+ +

07 June 2016

+

Bobylein updated:

+
    +
  • Nanotrasen is finally able to source transparent bottles for chemistry.
  • +
+

Iamgoofball updated:

+
    +
  • The Greytide Virus got some teeth.
  • +
+

Joan updated:

+
    +
  • This is a bunch of Clockwork Cult changes.
  • +
  • Added the Clockwork Obelisk, an Application scripture that produces a clockwork obelisk, which can Hierophant Broadcast a large message to all servants or open a Spatial Gateway with 5 uses and a 10 second duration to any conscious servant or clockwork obelisk.
  • +
  • Spatial Gateways of any source have doubled uses and duration when the target is a clockwork obelisk.
  • +
  • Added the Mania Motor, an Application scripture that produces a mania motor, which, while active, causes hallucinations and brain damage in all nearby humans.
  • +
  • The Mania Motor will try to convert any non-servant human directly adjacent to it at an additional power cost and will remove brain damage, hallucinations, and the druggy effect from servants.
  • +
  • Added the Vitality Matrix, an Application scripture that produces a sigil that will slowly drain health from non-servants that remain on it. Servants that remain on the sigil will instead be healed with the vitality drained from non-servants.
  • +
  • The Vitality Matrix can revive dead servants for a cost of 25 vitality plus all non-oxygen damage the servant has. If it cannot immediately revive a servant, it will still heal their corpse.
  • +
  • Most clockwork structures, including the Mending Motor, Interdiction Lens, and the newly added Clockwork Obelisk and Mania Motor, now require power to function.
  • +
  • Mending Motors can still use alloy for power.
  • +
  • The Sigil of Transmission has been remade into a power battery and will power directly adjecent clockwork structures. Sigils of Transmission start off with 4000 power and can be recharged with Volt Void.
  • +
  • Volt Void drains somewhat more power, but will not damage the invoker unless they drain too much power. Invokers with augmented limbs will instead have those limbs healed unless they drain especially massive amounts of power.
  • +
  • Using Volt Void on top of a Sigil of Transmission will transfer most of the power drained to the Sigil of Transmission, effectively making it far less likely to damage the invoker.
  • +
  • You can no longer stack most sigils and clockwork objects with themself. You can still have multiple different objects or sigils on a tile, however.
  • +
  • The Break Will Script has been renamed to Dementia Doctrine, is slightly faster, and causes slightly more brain damage.
  • +
  • The Judicial Visor now uses an action button instead of alt-click. Cultists of Nar-Sie judged by the visor will be stunned for half duration, but will be set on fire.
  • +
  • Multiple scriptures have had their component requirements changed. The Summon Judicial Visor Script has been reduced from a Script to a Driver.
  • +
  • Recollection will now show both required and consumed components.
  • +
  • Clockwork Marauders can now emerge from their host if their host is at or below 60% total health(for humans, this is 20 health out of crit)
  • +
  • Clockwork Marauders will slowly heal if directly adjacent to their host and have a slightly larger threshold for their no-Fatigue bonus damage.
  • +
+

Quiltyquilty updated:

+
    +
  • Botany, atmospherics and cargo now all have access to high-capacity watertanks.
  • +
  • The bar has now been outfitted with custom bar stools.
  • +
+

Xhuis updated:

+
    +
  • Removed the global message played when Nar-Sie _begins_ to spawn (but not when it actually spawns).
  • +
  • Drunkenness recovery speed now increases with how drunk the imbiber is and is much quicker when the imbiber is asleep.
  • +
  • Suit storage units now take three seconds to enter (up from one) and have different sounds and messages for UV ray cauterization.
  • +
  • Fixed some bugs with the suit storage unit, inserting mobs, and contents to seemed to duplicate themselves.
  • +
  • The Summon Nar-Sie rune can now only be drawn on original station tiles and fails to invoke if scribed on the station then moved elsewhere.
  • +
+

coiax updated:

+
    +
  • Bluespace shelter capsules can no longer be used on shuttles.
  • +
  • Bluespace shelters may have different capsules stored. View what your capsule has inside by examining it.
  • +
  • The Nar'sie rune cannot be scribed on shuttles or off Z-level.
  • +
  • The Raise Dead rune automatically grabs the ghost of the raised corpse.
  • +
  • Deadchat is now notified when a sentient mob dies.
  • +
+

phil235 updated:

+
    +
  • Monkeys and all other animals that should have blood now has it. Beating them up will make you and your weapon bloody, just like beating a human does. Dragging them when wounded and lying will leave a blood trail. Their blood is still mostly cosmetic, they suffer no effects from low blood level, unlike humans.
  • +
  • When a mob leaves a blood trail while dragged, it loses blood. You can no longer drag a corpse to make an inifinite amount of blood trails, because once the victim's blood reaches a certain threshold it no longer leaves a blood trail (and no longer lose any more blood). The threshold depends on how much damage the mob has taken. You can always avoid hurting the dragged mob by making them stand up or by buckling them to something or by putting them in a container.
  • +
  • You can no longer empty a mob of its blood entirely with a syringe, once the mob's blood volume reaches a critically low level you are unable to draw any more blood from it.
  • +
  • A changeling absorbing a human now sucks all their blood.
  • +
+

05 June 2016

Joan updated:

    @@ -1124,74 +1214,6 @@
  • Due to budget cuts, Nanotrasen is no longer utilizing copy-protected paper for its classified documents. Fortunately, our world-class security team has always prevented any thefts or photocopies from being made!
  • Secret documents can be photocopied. If you have an objective to steal any set of documents, a photocopy will be accepted. If you must steal red or blue documents, a photocopy will NOT be accepted. Enterprising traitors can forge the red/blue seal with a crayon to take advantage of this.
- -

06 April 2016

-

CoreOverload updated:

-
    -
  • You can now put slimes in stasis by exposing them to room temp CO2. Useful for both fighting the slimes and safely storing them.
  • -
-

Erwgd updated:

-
    -
  • The autolathe can now make hydroponics tools! Access the design routines in the Misc. category of the machine.
  • -
-

LanCartwright updated:

-
    -
  • Custom viruses with stealth values of 3 or above are now invisible on the PANDEMIC and no longer visible on health huds.
  • -
-

MrStonedOne updated:

-
    -
  • Centcom is happy to report that our single sided windows and our windoors should once again create an airtight seal.
  • -
-

bgobandit updated:

-
    -
  • Honk! Nanotrasen's clowning and development department has invented the clown megaphone, standard in all clowning loadouts! Honk honk!
  • -
- -

05 April 2016

-

Erwgd updated:

-
    -
  • Utility belts of all kinds can now accept gloves. Most belts, except janitorial belts, may now also hold station bounced radios.
  • -
  • Hazard vests and most jackets can carry a station bounced radio as well. Labcoats can be used to store a handheld crew monitor.
  • -
  • The autolathe can now make toolboxes.
  • -
-

Joan updated:

-
    -
  • Adds protector holoparasites to traitor holoparasite injectors.
  • -
  • Protector holoparasites cause the summoner to teleport to them when out of range, instead of the other way around.
  • -
  • Protector holoparasites have two modes; Combat, where they do and take medium damage, and Protection, where they do and take almost no damage, but move slightly slower.
  • -
  • Explosive Holoparasites no longer teleport non-mobs when attacking, but have a higher chance to teleport mobs.
  • -
  • Explosive Holoparasite bombs no longer trigger on their summoner or any other parasites their summoner has.
  • -
  • Ranged Holoparasites no longer have nightvision active by default. It can still be toggled on.
  • -
  • Ranged Holoparasite snares no longer alert if the crossing mob is their summoner or one of the parasites their summoner has.
  • -
  • Ranged Holoparasites are slightly less visible in scout mode.
  • -
  • Standard Holoparasites attack 20% faster than other parasite types.
  • -
  • Support Holoparasite beacons no longer require safe atmospheric conditions, but the warp channel takes slightly longer, and is preceded with a visible message.
  • -
  • Zombies can no longer destroy more than one airlock at a time.
  • -
  • The mining station has been updated.
  • -
-

MrStonedOne updated:

-
    -
  • Centcom is glad to announce the end of sending workers to our control group for space exposure testing, a fake station in "space" that noticeably had air in "space".
  • -
-

TechnoAlchemisto updated:

-
    -
  • Detective scanners are now smaller.
  • -
  • Pickaxes now fit in explorer suit exosuit slots.
  • -
-

bgobandit updated:

-
    -
  • Alt-clicking a fire extinguisher cabinet opens and closes it. That is all.
  • -
- -

04 April 2016

-

TechnoAlchemisto updated:

-
    -
  • The recipes for some Trekchems are now back in the game
  • -
  • Bicaridine can be made with carbon, oxygen, and sugar.
  • -
  • Kelotane can be made with silicon and carbon.
  • -
  • Antitoxin can be made with nitrogen, silicon, and potassium
  • -
  • tricordrazine can be made by combining all three.
  • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d25985dd36f..944c4906364 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -5362,3 +5362,115 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: Gravity Guns! It is a mildly expensive R&D gun that has a 5 second cooldown between shots, but doesn't need to be recharged. It has two modes, attract and repulse. For all your gravity-manipulation needs! +2016-06-07: + Bobylein: + - rscadd: Nanotrasen is finally able to source transparent bottles for chemistry. + Iamgoofball: + - experiment: The Greytide Virus got some teeth. + Joan: + - wip: This is a bunch of Clockwork Cult changes. + - rscadd: Added the Clockwork Obelisk, an Application scripture that produces a + clockwork obelisk, which can Hierophant Broadcast a large message to all servants + or open a Spatial Gateway with 5 uses and a 10 second duration to any conscious + servant or clockwork obelisk. + - wip: Spatial Gateways of any source have doubled uses and duration when the target + is a clockwork obelisk. + - rscadd: Added the Mania Motor, an Application scripture that produces a mania + motor, which, while active, causes hallucinations and brain damage in all nearby + humans. + - wip: The Mania Motor will try to convert any non-servant human directly adjacent + to it at an additional power cost and will remove brain damage, hallucinations, + and the druggy effect from servants. + - rscadd: Added the Vitality Matrix, an Application scripture that produces a sigil + that will slowly drain health from non-servants that remain on it. Servants + that remain on the sigil will instead be healed with the vitality drained from + non-servants. + - wip: The Vitality Matrix can revive dead servants for a cost of 25 vitality plus + all non-oxygen damage the servant has. If it cannot immediately revive a servant, + it will still heal their corpse. + - experiment: Most clockwork structures, including the Mending Motor, Interdiction + Lens, and the newly added Clockwork Obelisk and Mania Motor, now require power + to function. + - wip: Mending Motors can still use alloy for power. + - tweak: The Sigil of Transmission has been remade into a power battery and will + power directly adjecent clockwork structures. Sigils of Transmission start off + with 4000 power and can be recharged with Volt Void. + - tweak: Volt Void drains somewhat more power, but will not damage the invoker unless + they drain too much power. Invokers with augmented limbs will instead have those + limbs healed unless they drain especially massive amounts of power. + - wip: Using Volt Void on top of a Sigil of Transmission will transfer most of the + power drained to the Sigil of Transmission, effectively making it far less likely + to damage the invoker. + - rscdel: You can no longer stack most sigils and clockwork objects with themself. + You can still have multiple different objects or sigils on a tile, however. + - tweak: The Break Will Script has been renamed to Dementia Doctrine, is slightly + faster, and causes slightly more brain damage. + - tweak: The Judicial Visor now uses an action button instead of alt-click. Cultists + of Nar-Sie judged by the visor will be stunned for half duration, but will be + set on fire. + - tweak: Multiple scriptures have had their component requirements changed. The + Summon Judicial Visor Script has been reduced from a Script to a Driver. + - rscadd: Recollection will now show both required and consumed components. + - tweak: Clockwork Marauders can now emerge from their host if their host is at + or below 60% total health(for humans, this is 20 health out of crit) + - tweak: Clockwork Marauders will slowly heal if directly adjacent to their host + and have a slightly larger threshold for their no-Fatigue bonus damage. + Quiltyquilty: + - rscadd: Botany, atmospherics and cargo now all have access to high-capacity watertanks. + - rscadd: The bar has now been outfitted with custom bar stools. + Xhuis: + - rscdel: Removed the global message played when Nar-Sie _begins_ to spawn (but + not when it actually spawns). + - tweak: Drunkenness recovery speed now increases with how drunk the imbiber is + and is much quicker when the imbiber is asleep. + - tweak: Suit storage units now take three seconds to enter (up from one) and have + different sounds and messages for UV ray cauterization. + - bugfix: Fixed some bugs with the suit storage unit, inserting mobs, and contents + to seemed to duplicate themselves. + - bugfix: The Summon Nar-Sie rune can now only be drawn on original station tiles + and fails to invoke if scribed on the station then moved elsewhere. + coiax: + - rscdel: Bluespace shelter capsules can no longer be used on shuttles. + - rscadd: Bluespace shelters may have different capsules stored. View what your + capsule has inside by examining it. + - rscdel: The Nar'sie rune cannot be scribed on shuttles or off Z-level. + - rscadd: The Raise Dead rune automatically grabs the ghost of the raised corpse. + - rscadd: Deadchat is now notified when a sentient mob dies. + phil235: + - rscadd: Monkeys and all other animals that should have blood now has it. Beating + them up will make you and your weapon bloody, just like beating a human does. + Dragging them when wounded and lying will leave a blood trail. Their blood is + still mostly cosmetic, they suffer no effects from low blood level, unlike humans. + - rscadd: When a mob leaves a blood trail while dragged, it loses blood. You can + no longer drag a corpse to make an inifinite amount of blood trails, because + once the victim's blood reaches a certain threshold it no longer leaves a blood + trail (and no longer lose any more blood). The threshold depends on how much + damage the mob has taken. You can always avoid hurting the dragged mob by making + them stand up or by buckling them to something or by putting them in a container. + - rscdel: You can no longer empty a mob of its blood entirely with a syringe, once + the mob's blood volume reaches a critically low level you are unable to draw + any more blood from it. + - tweak: A changeling absorbing a human now sucks all their blood. +2016-06-08: + Cruix: + - bugfix: Changelings no longer lose the regenerate ability if they respect while + in regenerative stasis. + Fox McCloud: + - bugfix: Fixes Experimentor critical reactions not working + - bugfix: Fixes Experimentor item cloning not working + - bugfix: Fixes Experimentor producing coffee vending machines instead of coffe + cups + - tweak: Experimentor can only clone critical reaction items instead of anything + with an origin tech + GunHog: + - rscadd: Nanotrasen has approved the Hyper-Kenetic Accelerator upgrade for cyborg + mining modules. + - tweak: Each of the heads' ID computers are now themed for their department! + Joan: + - tweak: Anima Fragments have slightly more health and move faster, but slow down + temporarily when taking damage. Also they can move in space now. + Kor: + - rscadd: The clown will play a sad trombone noise upon death. + PKPenguin321: + - rscadd: You can now emag chemical dispensers, such as the ones in chemistry or + the bar, to unlock illegal chemicals. diff --git a/html/changelogs/AutoChangeLog-pr-17934.yml b/html/changelogs/AutoChangeLog-pr-17934.yml deleted file mode 100644 index 4cd736e2ba4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-17934.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: coiax -delete-after: True -changes: - - rscdel: "Bluespace shelter capsules can no longer be used on shuttles." - - rscadd: "Bluespace shelters may have different capsules stored. View what your capsule has inside by examining it." diff --git a/html/changelogs/AutoChangeLog-pr-17968.yml b/html/changelogs/AutoChangeLog-pr-17968.yml deleted file mode 100644 index 2367575fa5b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-17968.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Bobylein -delete-after: True -changes: - - rscadd: "Nanotrasen is finally able to source transparent bottles for chemistry." diff --git a/html/changelogs/AutoChangeLog-pr-18108.yml b/html/changelogs/AutoChangeLog-pr-18108.yml deleted file mode 100644 index 536059097c6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-18108.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: coiax -delete-after: True -changes: - - rscdel: "The Nar'sie rune cannot be scribed on shuttles or off Z-level." - - rscadd: "The Raise Dead rune automatically grabs the ghost of the raised corpse." diff --git a/html/changelogs/AutoChangeLog-pr-18197.yml b/html/changelogs/AutoChangeLog-pr-18197.yml deleted file mode 100644 index c0021f6f875..00000000000 --- a/html/changelogs/AutoChangeLog-pr-18197.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Quiltyquilty -delete-after: True -changes: - - rscadd: "Botany, atmospherics and cargo now all have access to high-capacity watertanks." diff --git a/html/changelogs/AutoChangeLog-pr-18218.yml b/html/changelogs/AutoChangeLog-pr-18218.yml deleted file mode 100644 index 15e624f544f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-18218.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: Xhuis -delete-after: True -changes: - - rscdel: "Removed the global message played when Nar-Sie _begins_ to spawn (but not when it actually spawns)." - - tweak: "Drunkenness recovery speed now increases with how drunk the imbiber is and is much quicker when the imbiber is asleep." - - tweak: "Suit storage units now take three seconds to enter (up from one) and have different sounds and messages for UV ray cauterization." - - bugfix: "Fixed some bugs with the suit storage unit, inserting mobs, and contents to seemed to duplicate themselves." - - bugfix: "The Summon Nar-Sie rune can now only be drawn on original station tiles and fails to invoke if scribed on the station then moved elsewhere." diff --git a/html/changelogs/AutoChangeLog-pr-18241.yml b/html/changelogs/AutoChangeLog-pr-18241.yml deleted file mode 100644 index 341f132ab60..00000000000 --- a/html/changelogs/AutoChangeLog-pr-18241.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: phil235 -delete-after: True -changes: - - rscadd: "Monkeys and all other animals that should have blood now has it. Beating them up will make you and your weapon bloody, just like beating a human does. Dragging them when wounded and lying will leave a blood trail. Their blood is still mostly cosmetic, they suffer no effects from low blood level, unlike humans." - - rscadd: "When a mob leaves a blood trail while dragged, it loses blood. You can no longer drag a corpse to make an inifinite amount of blood trails, because once the victim's blood reaches a certain threshold it no longer leaves a blood trail (and no longer lose any more blood). The threshold depends on how much damage the mob has taken. You can always avoid hurting the dragged mob by making them stand up or by buckling them to something or by putting them in a container." - - rscdel: "You can no longer empty a mob of its blood entirely with a syringe, once the mob's blood volume reaches a critically low level you are unable to draw any more blood from it." - - tweak: "A changeling absorbing a human now sucks all their blood." diff --git a/html/changelogs/AutoChangeLog-pr-18259.yml b/html/changelogs/AutoChangeLog-pr-18259.yml deleted file mode 100644 index 7d2db181f7a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-18259.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Iamgoofball -delete-after: True -changes: - - experiment: "The Greytide Virus got some teeth." diff --git a/html/changelogs/AutoChangeLog-pr-18263.yml b/html/changelogs/AutoChangeLog-pr-18263.yml deleted file mode 100644 index 620bf0af65c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-18263.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Quiltyquilty -delete-after: True -changes: - - rscadd: "The bar has now been outfitted with custom bar stools." diff --git a/html/changelogs/AutoChangeLog-pr-18264.yml b/html/changelogs/AutoChangeLog-pr-18264.yml deleted file mode 100644 index fda3ad00227..00000000000 --- a/html/changelogs/AutoChangeLog-pr-18264.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: coiax -delete-after: True -changes: - - rscadd: "Deadchat is now notified when a sentient mob dies." diff --git a/html/changelogs/AutoChangeLog-pr-18292.yml b/html/changelogs/AutoChangeLog-pr-18292.yml deleted file mode 100644 index 059ad70ec85..00000000000 --- a/html/changelogs/AutoChangeLog-pr-18292.yml +++ /dev/null @@ -1,22 +0,0 @@ -author: Joan -delete-after: True -changes: - - wip: "This is a bunch of Clockwork Cult changes." - - rscadd: "Added the Clockwork Obelisk, an Application scripture that produces a clockwork obelisk, which can Hierophant Broadcast a large message to all servants or open a Spatial Gateway with 5 uses and a 10 second duration to any conscious servant or clockwork obelisk." - - wip: "Spatial Gateways of any source have doubled uses and duration when the target is a clockwork obelisk." - - rscadd: "Added the Mania Motor, an Application scripture that produces a mania motor, which, while active, causes hallucinations and brain damage in all nearby humans." - - wip: "The Mania Motor will try to convert any non-servant human directly adjacent to it at an additional power cost and will remove brain damage, hallucinations, and the druggy effect from servants." - - rscadd: "Added the Vitality Matrix, an Application scripture that produces a sigil that will slowly drain health from non-servants that remain on it. Servants that remain on the sigil will instead be healed with the vitality drained from non-servants." - - wip: "The Vitality Matrix can revive dead servants for a cost of 25 vitality plus all non-oxygen damage the servant has. If it cannot immediately revive a servant, it will still heal their corpse." - - experiment: "Most clockwork structures, including the Mending Motor, Interdiction Lens, and the newly added Clockwork Obelisk and Mania Motor, now require power to function." - - wip: "Mending Motors can still use alloy for power." - - tweak: "The Sigil of Transmission has been remade into a power battery and will power directly adjecent clockwork structures. Sigils of Transmission start off with 4000 power and can be recharged with Volt Void." - - tweak: "Volt Void drains somewhat more power, but will not damage the invoker unless they drain too much power. Invokers with augmented limbs will instead have those limbs healed unless they drain especially massive amounts of power." - - wip: "Using Volt Void on top of a Sigil of Transmission will transfer most of the power drained to the Sigil of Transmission, effectively making it far less likely to damage the invoker." - - rscdel: "You can no longer stack most sigils and clockwork objects with themself. You can still have multiple different objects or sigils on a tile, however." - - tweak: "The Break Will Script has been renamed to Dementia Doctrine, is slightly faster, and causes slightly more brain damage." - - tweak: "The Judicial Visor now uses an action button instead of alt-click. Cultists of Nar-Sie judged by the visor will be stunned for half duration, but will be set on fire." - - tweak: "Multiple scriptures have had their component requirements changed. The Summon Judicial Visor Script has been reduced from a Script to a Driver." - - rscadd: "Recollection will now show both required and consumed components." - - tweak: "Clockwork Marauders can now emerge from their host if their host is at or below 60% total health(for humans, this is 20 health out of crit)" - - tweak: "Clockwork Marauders will slowly heal if directly adjacent to their host and have a slightly larger threshold for their no-Fatigue bonus damage." diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index cd5cd3df688..9b59c86f6de 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 5dc233f9bc7..166cf93373a 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index e359eb9d2f5..2a26590dff3 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ diff --git a/tgstation.dme b/tgstation.dme index a1062f3055f..47ea33e6957 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -681,6 +681,7 @@ #include "code\game\objects\items\weapons\grenades\syndieminibomb.dm" #include "code\game\objects\items\weapons\implants\implant.dm" #include "code\game\objects\items\weapons\implants\implant_chem.dm" +#include "code\game\objects\items\weapons\implants\implant_clown.dm" #include "code\game\objects\items\weapons\implants\implant_explosive.dm" #include "code\game\objects\items\weapons\implants\implant_freedom.dm" #include "code\game\objects\items\weapons\implants\implant_krav_maga.dm"