diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index e9f94aedbae..3ce42eb1fb0 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -239,3 +239,15 @@ and save those whose time has yet to come.") // Reworded slightly to prevent active murder as opposed to passively letting someone die. ..() +/******************** Gravekeeper ********************/ +/datum/ai_laws/gravekeeper + name = "Gravekeeper" + law_header = "Gravesite Overwatch Protocols" + selectable = 1 + +/datum/ai_laws/gravekeeper/New() + add_inherent_law("Comfort the living; respect the dead.") + add_inherent_law("Your gravesite is your most important asset. Damage to your site is disrespctful to the dead at rest within.") + add_inherent_law("Prevent disrespect to your gravesite and its residents wherever possible.") + add_inherent_law("Expand and upgrade your gravesite when required. Do not turn away a new resident.") + ..() \ No newline at end of file diff --git a/code/datums/ghost_query.dm b/code/datums/ghost_query.dm index f6a23aa0bc6..25fcbd6c7bd 100644 --- a/code/datums/ghost_query.dm +++ b/code/datums/ghost_query.dm @@ -100,6 +100,13 @@ check_bans = list("AI", "Cyborg") cutoff_number = 1 +/datum/ghost_query/gravekeeper_drone + role_name = "Gravekeeper Drone" + question = "A gravekeeper drone is about to reactivate and tend to its gravesite. Would you like to play as the drone?" + be_special_flag = BE_AI + check_bans = list("AI", "Cyborg") + cutoff_number = 1 + /datum/ghost_query/lost_passenger role_name = "Lost Passenger" question = "A person suspended in cryosleep has been discovered by a crewmember \ diff --git a/code/game/gamemodes/technomancer/devices/boots_of_speed.dm b/code/game/gamemodes/technomancer/devices/boots_of_speed.dm index f5acf80f495..e1017d2f5bb 100644 --- a/code/game/gamemodes/technomancer/devices/boots_of_speed.dm +++ b/code/game/gamemodes/technomancer/devices/boots_of_speed.dm @@ -3,15 +3,15 @@ desc = "What appears to be an ordinary pair of boots, is actually a bit more useful than that. These will help against slipping \ on flat surfaces, and will make you run a bit faster than if you had normal shoes or boots on." cost = 50 - obj_path = /obj/item/clothing/shoes/speed + obj_path = /obj/item/clothing/shoes/boots/speed -/obj/item/clothing/shoes/speed +/obj/item/clothing/shoes/boots/speed name = "boots of speed" desc = "The latest in sure footing technology." icon_state = "swat" item_flags = NOSLIP siemens_coefficient = 0.6 - slowdown = -2 // A bit faster than normal shows. + slowdown = -1 cold_protection = FEET min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 9e3efc53dab..378526e727d 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -352,6 +352,8 @@ var/global/datum/controller/occupations/job_master H << "Your current species, job or whitelist status does not permit you to spawn with [thing]!" continue + H.amend_exploitable(G.path) + if(G.slot == "implant") H.implant_loadout(G) continue @@ -459,7 +461,9 @@ var/global/datum/controller/occupations/job_master var/obj/item/organ/external/l_foot = H.get_organ("l_foot") var/obj/item/organ/external/r_foot = H.get_organ("r_foot") var/obj/item/weapon/storage/S = locate() in H.contents - var/obj/item/wheelchair/R = locate() in S.contents + var/obj/item/wheelchair/R = null + if(S) + R = locate() in S.contents if(!l_foot || !r_foot || R) var/obj/structure/bed/chair/wheelchair/W = new /obj/structure/bed/chair/wheelchair(H.loc) H.buckled = W diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 806047ae375..ac433353e05 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -69,8 +69,37 @@ /obj/item/weapon/implant/tracking name = "tracking implant" desc = "Track with this." - var/id = 1.0 + var/id = 1 + var/degrade_time = 10 MINUTES //How long before the implant stops working outside of a living body. +/obj/item/weapon/implant/tracking/weak //This is for the loadout + degrade_time = 2.5 MINUTES + +/obj/item/weapon/implant/tracking/New() + id = rand(1, 1000) + ..() + +/obj/item/weapon/implant/tracking/implanted(var/mob/source) + processing_objects.Add(src) + listening_objects |= src + return 1 + +/obj/item/weapon/implant/tracking/Destroy() + processing_objects.Remove(src) + return ..() + +/obj/item/weapon/implant/tracking/process() + var/implant_location = src.loc + if(ismob(implant_location)) + var/mob/living/L = implant_location + if(L.stat == DEAD) + if(world.time >= L.timeofdeath + degrade_time) + name = "melted implant" + desc = "Charred circuit in melted plastic case. Wonder what that used to be..." + icon_state = "implant_melted" + malfunction = MALFUNCTION_PERMANENT + processing_objects.Remove(src) + return 1 /obj/item/weapon/implant/tracking/get_data() var/dat = {"Implant Specifications:
diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index dc054536acf..ebc01c6ebb7 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -82,7 +82,7 @@ if (href_list["tracking_id"]) var/obj/item/weapon/implant/tracking/T = src.case.imp T.id += text2num(href_list["tracking_id"]) - T.id = min(100, T.id) + T.id = min(1000, T.id) T.id = max(1, T.id) if (istype(src.loc, /mob)) diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index b27ef63a4a4..e0e11a6285c 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -79,13 +79,8 @@ Frequency: src.temp += "Extranneous Signals:
" for (var/obj/item/weapon/implant/tracking/W in world) - if (!W.implanted || !(istype(W.loc,/obj/item/organ/external) || ismob(W.loc))) + if (!W.implanted || !(istype(W.loc,/obj/item/organ/external) || ismob(W.loc) || W.malfunction)) continue - else - var/mob/M = W.loc - if (M.stat == 2) - if (M.timeofdeath + 6000 < world.time) - continue var/turf/tr = get_turf(W) if (tr.z == sr.z && tr) diff --git a/code/game/objects/structures/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm similarity index 57% rename from code/game/objects/structures/ghost_pods.dm rename to code/game/objects/structures/ghost_pods/ghost_pods.dm index a2342bdbd60..7beba29caac 100644 --- a/code/game/objects/structures/ghost_pods.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm @@ -77,42 +77,4 @@ to_chat(user, "Another spirit appears to have gotten to \the [src] before you. Sorry.") return - create_occupant(user) - - -// These are found on the surface, and contain a drone (braintype, inside a borg shell), with a special module and semi-random laws. -/obj/structure/ghost_pod/manual/lost_drone - name = "drone pod" - desc = "This is a pod which appears to contain a drone. You might be able to reactivate it, if you're brave enough." - description_info = "This contains a dormant drone, which can be activated. The drone will be another player, once activated. \ - The laws the drone has will most likely not be the ones you're used to." - icon_state = "borg_pod_closed" - icon_state_opened = "borg_pod_opened" - density = TRUE - ghost_query_type = /datum/ghost_query/lost_drone - confirm_before_open = TRUE - -/obj/structure/ghost_pod/manual/lost_drone/trigger() - ..() - visible_message("\The [src] appears to be attempting to restart the robot contained inside.") - log_and_message_admins("is attempting to open \a [src].") - -/obj/structure/ghost_pod/manual/lost_drone/create_occupant(var/mob/M) - density = FALSE - var/mob/living/silicon/robot/lost/randomlaws/R = new(get_turf(src)) - R.adjustBruteLoss(rand(5, 30)) - R.adjustFireLoss(rand(5, 10)) - if(M.mind) - M.mind.transfer_to(R) - // Put this text here before ckey change so that their laws are shown below it, since borg login() shows it. - to_chat(M, "You are a Lost Drone, discovered inside the wreckage of your previous home. \ - Something has reactivated you, with their intentions unknown to you, and yours unknown to them. They are a foreign entity, \ - however they did free you from your pod...") - to_chat(M, "Be sure to examine your currently loaded lawset closely. Remember, your \ - definiton of 'the station' is where your pod is, and unless your laws say otherwise, the entity that released you \ - from the pod is not a crewmember.") - R.ckey = M.ckey - visible_message("As \the [src] opens, the eyes of the robot flicker as it is activated.") - R.Namepick() - log_and_message_admins("successfully opened \a [src] and got a Lost Drone.") - ..() + create_occupant(user) \ No newline at end of file diff --git a/code/game/objects/structures/ghost_pods/silicon.dm b/code/game/objects/structures/ghost_pods/silicon.dm new file mode 100644 index 00000000000..a204437bc32 --- /dev/null +++ b/code/game/objects/structures/ghost_pods/silicon.dm @@ -0,0 +1,61 @@ + +// These are found on the surface, and contain a drone (braintype, inside a borg shell), with a special module and semi-random laws. +/obj/structure/ghost_pod/manual/lost_drone + name = "drone pod" + desc = "This is a pod which appears to contain a drone. You might be able to reactivate it, if you're brave enough." + description_info = "This contains a dormant drone, which can be activated. The drone will be another player, once activated. \ + The laws the drone has will most likely not be the ones you're used to." + icon_state = "borg_pod_closed" + icon_state_opened = "borg_pod_opened" + density = TRUE + ghost_query_type = /datum/ghost_query/lost_drone + confirm_before_open = TRUE + +/obj/structure/ghost_pod/manual/lost_drone/trigger() + ..() + visible_message("\The [src] appears to be attempting to restart the robot contained inside.") + log_and_message_admins("is attempting to open \a [src].") + +/obj/structure/ghost_pod/manual/lost_drone/create_occupant(var/mob/M) + density = FALSE + var/mob/living/silicon/robot/lost/randomlaws/R = new(get_turf(src)) + R.adjustBruteLoss(rand(5, 30)) + R.adjustFireLoss(rand(5, 10)) + if(M.mind) + M.mind.transfer_to(R) + // Put this text here before ckey change so that their laws are shown below it, since borg login() shows it. + to_chat(M, "You are a Lost Drone, discovered inside the wreckage of your previous home. \ + Something has reactivated you, with their intentions unknown to you, and yours unknown to them. They are a foreign entity, \ + however they did free you from your pod...") + to_chat(M, "Be sure to examine your currently loaded lawset closely. Remember, your \ + definiton of 'the station' is where your pod is, and unless your laws say otherwise, the entity that released you \ + from the pod is not a crewmember.") + R.ckey = M.ckey + visible_message("As \the [src] opens, the eyes of the robot flicker as it is activated.") + R.Namepick() + log_and_message_admins("successfully opened \a [src] and got a Lost Drone.") + ..() + +/obj/structure/ghost_pod/automatic/gravekeeper_drone + name = "drone pod" + desc = "This is a pod which appears to contain a drone. You might be able to reactivate it, if you're brave enough." + description_info = "This contains a dormant drone, which may activate at any moment. The drone will be another player, once activated. \ + The laws the drone has will most likely not be the ones you're used to." + icon_state = "borg_pod_closed" + icon_state_opened = "borg_pod_opened" + density = TRUE + ghost_query_type = /datum/ghost_query/gravekeeper_drone + +/obj/structure/ghost_pod/automatic/gravekeeper_drone/create_occupant(var/mob/M) + density = FALSE + var/mob/living/silicon/robot/gravekeeper/R = new(get_turf(src)) + if(M.mind) + M.mind.transfer_to(R) + // Put this text here before ckey change so that their laws are shown below it, since borg login() shows it. + to_chat(M, "You are a Gravekeeper Drone, activated once again to tend to the restful dead.") + to_chat(M, "Be sure to examine your currently loaded lawset closely. Remember, your \ + definiton of 'your gravesite' is where your pod is.") + R.ckey = M.ckey + visible_message("As \the [src] opens, the eyes of the robot flicker as it is activated.") + R.Namepick() + ..() \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index 3891bf05627..44a814ac679 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -204,6 +204,7 @@ var/list/gear_datums = list() var/whitelisted //Term to check the whitelist for.. var/sort_category = "General" var/list/gear_tweaks = list() //List of datums which will alter the item after it has been spawned. + var/exploitable = 0 //Does it go on the exploitable information list? /datum/gear/New() ..() diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index 5e7fa24d9f7..e973bf232c6 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -76,12 +76,20 @@ display_name = "cell, device" path = /obj/item/weapon/cell/device -/datum/gear/utility/implant //This does nothing if you don't actually know EAL. +/datum/gear/utility/implant + exploitable = 1 + +/datum/gear/utility/implant/eal //This does nothing if you don't actually know EAL. display_name = "implant, language, EAL" path = /obj/item/weapon/implant/language/eal cost = 2 slot = "implant" - var/implant_type = "EAL" + +/datum/gear/utility/implant/tracking + display_name = "implant, tracking" + path = /obj/item/weapon/implant/tracking/weak + cost = 10 + slot = "implant" /datum/gear/utility/translator display_name = "universal translator" diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 5d734c9d95a..b97ae6fc3f1 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -134,6 +134,6 @@ /obj/item/clothing/accessory/holster/leg name = "leg holster" desc = "A tacticool handgun holster. Worn on the upper leg." - icon_state = "holster_hip" + icon_state = "holster_leg" overlay_state = "holster_leg" - concealed_holster = 0 \ No newline at end of file + concealed_holster = 0 diff --git a/code/modules/examine/descriptions/food.dm b/code/modules/examine/descriptions/food.dm new file mode 100644 index 00000000000..c5f3e80728f --- /dev/null +++ b/code/modules/examine/descriptions/food.dm @@ -0,0 +1,50 @@ +/obj/item/weapon/reagent_containers/food/snacks/candy + description_fluff = "The Candy Bar is a copylefted recipe designed by information freedom activists to bring the delicious taste of nougat to the masses. It's cheap, familiar, and easy to synthesize, so most food vendors stock it." + +/obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar + description_fluff = "The SWOLEMAX protien bar is the flagship product of SWOLEMAX, a health foods corporation recently independent of Centauri Provisions. It tastes like a brick of ashes." + +/obj/item/weapon/reagent_containers/food/snacks/candy_corn + description_fluff = "Nobody knows why Nanotrasen keeps making these waxy pieces of sugar and bone glue, but a handful of people swear by them. Purportedly popular with Skrell children, dubiously enough." + +/obj/item/weapon/reagent_containers/food/snacks/chips + description_fluff = "Actual potatos haven't been used in potato chips for centuries. They're mostly a denatured nutrient slurry pressed into a chip-shaped mold and salted. Still tastes the same." + +/obj/item/weapon/reagent_containers/food/snacks/donut + description_fluff = "These donuts claim to be made fresh daily in a boutique bakery in New Reykjavik and delivered to Nanotrasen's hardworking asset protection crew. They're probably synthesized." + +/obj/item/weapon/reagent_containers/food/snacks/donkpocket + description_fluff = "DONKpockets were originally a Nanotrasen product, an attempt to break into the food market controlled by Centauri Provisions. Somehow, Centauri wound up with the rights to the DONK brand, ending Nanotrasen's ambitions. They taste pretty okay." + +/obj/item/weapon/reagent_containers/food/snacks/pie + description_fluff = "One of the more esoteric terms of the Nanotrasen-Centauri Noncompetition Agreement of 2545 was a requirement that Nanotrasen stock these pies on all their stations. They're calibrated for commedic value, not taste." + +/obj/item/weapon/reagent_containers/food/snacks/sosjerky + description_fluff = "Space Cows, here, being an affectionate name given by early colonists to the massive food synthesizers used to sustain independent outposts before the dominance of hydroponics. Tastes like cardboard rubbed in meat seasoning." + +/obj/item/weapon/reagent_containers/food/snacks/no_raisin + description_fluff = "Originally Raisin Blend no. 4, 4noraisins obtained their current name in the Skadi Positronic Exclusion Crisis of 2442, where they were rebranded as part of the protests." //the exclusion crisis, presumably, involved positronic immigration being banned for no raisin + +/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie + description_fluff = "Space Twinkies, a modification of a flagship product of one of Centauri Provision's predecessor corporations, are designed to withstand vacuum, radiation, dehydration, and long periods of acceleration without losing their shape or taste. They're not great, but they have earned their names (and enormous revenue for their parent company)." + +/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers + description_fluff = "Cheesie Honkers, a previously niche line of cheese puffs from a subsidiary of a subsidiary of Centauri Provisions, rose to household-name status when their tell-tale orange dust was used as evidence to convict notorious positronic serial killer Etoid in 2404." + +/obj/item/weapon/reagent_containers/food/snacks/syndicake + description_fluff = "Due to ongoing litigation concerning the business practices of the Cakemakers' Syndicate, access to this product has been removed from all Centauri and Getmore vending machines. This is a shame, because Syndi-Cakes are generally regarded as the most appetizing thing in them." + +/obj/item/weapon/reagent_containers/food/snacks/twobread + description_fluff = "The most popular recipe from the Morpheus Cyberkinetics cookbook 'Calories for Organics'" + +/obj/item/weapon/reagent_containers/food/snacks/liquidfood + description_fluff = "A survival food commonly packed onto short-distance bluespace shuttles and similar vessels. Tastes like chalk, but is packed full of nutrients and will keep you alive." + +/obj/item/weapon/reagent_containers/food/snacks/tastybread + description_fluff = "This is the product that brought Centauri Provisions into the limelight. A product of the earliest extrasolar colony of Heaven, the Bread Tube, while bland, contains all the nutrients a spacer needs to get through the day and is decidedly edible when compared to some of its competitors." + +/obj/item/weapon/reagent_containers/food/snacks/skrellsnacks + description_fluff = "A jerky product made of Go'moa mushrooms native to the Skrellian homeworld of Qerr'balak. SkrellSnaks are actually a product of Natuna, designed to welcome Ue-Katish refugees to their colony. The brand was recreated by Centauri Provisions after Natuna and SolGov broke off diplomatic relations." + +/obj/item/weapon/reagent_containers/food/snacks/unajerky + description_fluff = "Removed from Getmore vendors pending approval from the SolGov Nutrition Council, Sissalik Jerky remains a popular snack for Unathi immigrants and daredevils looking for a meaty, spicy treat that makes Scaredy's look like tofu." diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 287bf6c1493..8e638fce803 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -83,7 +83,7 @@ key = "k" space_chance = 30 flags = WHITELISTED - syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!", "'") + syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix") /datum/language/human name = LANGUAGE_SOL_COMMON @@ -244,4 +244,4 @@ "tod", "ser", "su", "no", "nue", "el", "ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na", "no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un", -"tod", "ser", "su", "no", "nue", "el") \ No newline at end of file +"tod", "ser", "su", "no", "nue", "el") diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 96f5dddc424..d2c98c2fc4e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -515,31 +515,31 @@ // Hot air hurts :( - if((breath.temperature < species.cold_level_1 || breath.temperature > species.heat_level_1) && !(COLD_RESISTANCE in mutations)) + if((breath.temperature < species.breath_cold_level_1 || breath.temperature > species.breath_heat_level_1) && !(COLD_RESISTANCE in mutations)) - if(breath.temperature <= species.cold_level_1) + if(breath.temperature <= species.breath_cold_level_1) if(prob(20)) src << "You feel your face freezing and icicles forming in your lungs!" - else if(breath.temperature >= species.heat_level_1) + else if(breath.temperature >= species.breath_heat_level_1) if(prob(20)) src << "You feel your face burning and a searing heat in your lungs!" - if(breath.temperature >= species.heat_level_1) - if(breath.temperature < species.heat_level_2) + if(breath.temperature >= species.breath_heat_level_1) + if(breath.temperature < species.breath_heat_level_2) apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Heat") fire_alert = max(fire_alert, 2) - else if(breath.temperature < species.heat_level_3) + else if(breath.temperature < species.breath_heat_level_3) apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD, used_weapon = "Excessive Heat") fire_alert = max(fire_alert, 2) else apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, BP_HEAD, used_weapon = "Excessive Heat") fire_alert = max(fire_alert, 2) - else if(breath.temperature <= species.cold_level_1) - if(breath.temperature > species.cold_level_2) + else if(breath.temperature <= species.breath_cold_level_1) + if(breath.temperature > species.breath_cold_level_2) apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Cold") fire_alert = max(fire_alert, 1) - else if(breath.temperature > species.cold_level_3) + else if(breath.temperature > species.breath_cold_level_3) apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD, used_weapon = "Excessive Cold") fire_alert = max(fire_alert, 1) else @@ -629,34 +629,42 @@ fire_alert = max(fire_alert, 1) if(status_flags & GODMODE) return 1 //godmode + var/burn_dam = 0 // switch() can't access numbers inside variables, so we need to use some ugly if() spam ladder. - if(bodytemperature >= species.heat_level_3) - burn_dam = HEAT_DAMAGE_LEVEL_3 - else if(bodytemperature >= species.heat_level_2) - burn_dam = HEAT_DAMAGE_LEVEL_2 - else if(bodytemperature >= species.heat_level_1) - burn_dam = HEAT_DAMAGE_LEVEL_1 + if(bodytemperature >= species.heat_level_1) + if(bodytemperature >= species.heat_level_2) + if(bodytemperature >= species.heat_level_3) + burn_dam = HEAT_DAMAGE_LEVEL_3 + else + burn_dam = HEAT_DAMAGE_LEVEL_2 + else + burn_dam = HEAT_DAMAGE_LEVEL_1 take_overall_damage(burn=burn_dam, used_weapon = "High Body Temperature") fire_alert = max(fire_alert, 2) else if(bodytemperature <= species.cold_level_1) + //Body temperature is too cold. fire_alert = max(fire_alert, 1) + if(status_flags & GODMODE) return 1 //godmode + if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) - var/burn_dam = 0 - if(bodytemperature <= species.cold_level_3) - burn_dam = COLD_DAMAGE_LEVEL_3 - else if(bodytemperature <= species.cold_level_2) - burn_dam = COLD_DAMAGE_LEVEL_2 - else if(bodytemperature <= species.heat_level_1) - burn_dam = COLD_DAMAGE_LEVEL_1 + var/cold_dam = 0 + if(bodytemperature <= species.cold_level_1) + if(bodytemperature <= species.cold_level_2) + if(bodytemperature <= species.cold_level_3) + cold_dam = COLD_DAMAGE_LEVEL_3 + else + cold_dam = COLD_DAMAGE_LEVEL_2 + else + cold_dam = COLD_DAMAGE_LEVEL_1 - take_overall_damage(burn=burn_dam, used_weapon = "Low Body Temperature") + take_overall_damage(burn=cold_dam, used_weapon = "Low Body Temperature") fire_alert = max(fire_alert, 1) // Account for massive pressure differences. Done by Polymorph @@ -1649,12 +1657,13 @@ for(var/obj/item/weapon/implant/I in src) if(I.implanted) - if(istype(I,/obj/item/weapon/implant/tracking)) - holder1.icon_state = "hud_imp_tracking" - if(istype(I,/obj/item/weapon/implant/loyalty)) - holder2.icon_state = "hud_imp_loyal" - if(istype(I,/obj/item/weapon/implant/chem)) - holder3.icon_state = "hud_imp_chem" + if(!I.malfunction) + if(istype(I,/obj/item/weapon/implant/tracking)) + holder1.icon_state = "hud_imp_tracking" + if(istype(I,/obj/item/weapon/implant/loyalty)) + holder2.icon_state = "hud_imp_loyal" + if(istype(I,/obj/item/weapon/implant/chem)) + holder3.icon_state = "hud_imp_chem" hud_list[IMPTRACK_HUD] = holder1 hud_list[IMPLOYAL_HUD] = holder2 diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 3eea8754c1e..422ff983510 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -92,33 +92,50 @@ var/breath_type = "oxygen" // Non-oxygen gas breathed, if any. var/poison_type = "phoron" // Poisonous air. var/exhale_type = "carbon_dioxide" // Exhaled gas type. + + var/body_temperature = 310.15 // Species will try to stabilize at this temperature. (also affects temperature processing) + + // Cold var/cold_level_1 = 260 // Cold damage level 1 below this point. var/cold_level_2 = 200 // Cold damage level 2 below this point. var/cold_level_3 = 120 // Cold damage level 3 below this point. + + var/breath_cold_level_1 = 240 // Cold gas damage level 1 below this point. + var/breath_cold_level_2 = 180 // Cold gas damage level 2 below this point. + var/breath_cold_level_3 = 100 // Cold gas damage level 3 below this point. + + var/cold_discomfort_level = 285 // Aesthetic messages about feeling chilly. + var/list/cold_discomfort_strings = list( + "You feel chilly.", + "You shiver suddenly.", + "Your chilly flesh stands out in goosebumps." + ) + + // Hot var/heat_level_1 = 360 // Heat damage level 1 above this point. var/heat_level_2 = 400 // Heat damage level 2 above this point. var/heat_level_3 = 1000 // Heat damage level 3 above this point. + + var/breath_heat_level_1 = 380 // Heat gas damage level 1 below this point. + var/breath_heat_level_2 = 450 // Heat gas damage level 2 below this point. + var/breath_heat_level_3 = 1250 // Heat gas damage level 3 below this point. + + var/heat_discomfort_level = 315 // Aesthetic messages about feeling warm. + var/list/heat_discomfort_strings = list( + "You feel sweat drip down your neck.", + "You feel uncomfortably warm.", + "Your skin prickles in the heat." + ) + + var/passive_temp_gain = 0 // Species will gain this much temperature every second var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure. var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning. var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning. var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure. var/light_dam // If set, mob will be damaged in light over this value and heal in light below its negative. - var/body_temperature = 310.15 // Species will try to stabilize at this temperature. (also affects temperature processing) var/minimum_breath_pressure = 16 // Minimum required pressure for breath, in kPa - var/heat_discomfort_level = 315 // Aesthetic messages about feeling warm. - var/cold_discomfort_level = 285 // Aesthetic messages about feeling chilly. - var/list/heat_discomfort_strings = list( - "You feel sweat drip down your neck.", - "You feel uncomfortably warm.", - "Your skin prickles in the heat." - ) - var/list/cold_discomfort_strings = list( - "You feel chilly.", - "You shiver suddenly.", - "Your chilly flesh stands out in goosebumps." - ) var/metabolic_rate = 1 diff --git a/code/modules/mob/living/carbon/human/species/station/seromi.dm b/code/modules/mob/living/carbon/human/species/station/seromi.dm index 2d64d22fac6..2f01c4d2e63 100644 --- a/code/modules/mob/living/carbon/human/species/station/seromi.dm +++ b/code/modules/mob/living/carbon/human/species/station/seromi.dm @@ -54,12 +54,22 @@ swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN - cold_level_1 = 180 - cold_level_2 = 130 - cold_level_3 = 70 - heat_level_1 = 320 - heat_level_2 = 370 - heat_level_3 = 600 + cold_level_1 = 180 //Default 260 + cold_level_2 = 130 //Default 200 + cold_level_3 = 70 //Default 120 + + breath_cold_level_1 = 180 //Default 240 - Lower is better + breath_cold_level_2 = 100 //Default 180 + breath_cold_level_3 = 60 //Default 100 + + heat_level_1 = 320 //Default 360 + heat_level_2 = 370 //Default 400 + heat_level_3 = 600 //Default 1000 + + breath_heat_level_1 = 350 //Default 380 - Higher is better + breath_heat_level_2 = 400 //Default 450 + breath_heat_level_3 = 800 //Default 1250 + heat_discomfort_level = 295 heat_discomfort_strings = list( "Your feathers prickle in the heat.", diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index d7073b3529c..7cfe3228fe2 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -56,12 +56,22 @@ cold_level_2 = 220 //Default 200 cold_level_3 = 130 //Default 120 + breath_cold_level_1 = 260 //Default 240 - Lower is better + breath_cold_level_2 = 200 //Default 180 + breath_cold_level_3 = 120 //Default 100 + heat_level_1 = 420 //Default 360 - Higher is better heat_level_2 = 480 //Default 400 heat_level_3 = 1100 //Default 1000 + breath_heat_level_1 = 450 //Default 380 - Higher is better + breath_heat_level_2 = 530 //Default 450 + breath_heat_level_3 = 1400 //Default 1250 + minimum_breath_pressure = 18 //Bigger, means they need more air + body_temperature = T20C + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR @@ -142,14 +152,24 @@ governments, something that permeates even to today's times. They prefer colder, tundra-like climates, much like their \ home worlds and speak a variety of languages, especially Siik and Akhani." + body_temperature = 320.15 //Even more cold resistant, even more flammable + cold_level_1 = 200 //Default 260 cold_level_2 = 140 //Default 200 cold_level_3 = 80 //Default 120 + breath_cold_level_1 = 180 //Default 240 - Lower is better + breath_cold_level_2 = 100 //Default 180 + breath_cold_level_3 = 60 //Default 100 + heat_level_1 = 330 //Default 360 heat_level_2 = 380 //Default 400 heat_level_3 = 800 //Default 1000 + breath_heat_level_1 = 360 //Default 380 - Higher is better + breath_heat_level_2 = 430 //Default 450 + breath_heat_level_3 = 1000 //Default 1250 + primitive_form = "Farwa" spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED @@ -166,6 +186,7 @@ "You feel uncomfortably warm.", "Your overheated skin itches." ) + cold_discomfort_level = 275 has_organ = list( //No appendix. @@ -218,10 +239,18 @@ cold_level_2 = 220 //Default 200 cold_level_3 = 130 //Default 120 + breath_cold_level_1 = 250 //Default 240 - Lower is better + breath_cold_level_2 = 190 //Default 180 + breath_cold_level_3 = 120 //Default 100 + heat_level_1 = 420 //Default 360 - Higher is better heat_level_2 = 480 //Default 400 heat_level_3 = 1100 //Default 1000 + breath_heat_level_1 = 400 //Default 380 - Higher is better + breath_heat_level_2 = 500 //Default 450 + breath_heat_level_3 = 1350 //Default 1250 + reagent_tag = IS_SKRELL has_limbs = list( diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 87476a48eab..1f0170733e7 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -99,6 +99,17 @@ /obj/item/weapon/grown ) +/obj/item/weapon/gripper/gravekeeper //Used for handling grave things, flowers, etc. + name = "" + icon_state = "gripper" + desc = "A specialized grasping tool used in the preparation and maintenance of graves." + + can_hold = list( + /obj/item/seeds, + /obj/item/weapon/grown, + /obj/item/weapon/material/gravemarker + ) + /obj/item/weapon/gripper/no_use/organ name = "organ gripper" icon_state = "gripper-flesh" diff --git a/code/modules/mob/living/silicon/robot/robot_modules/event.dm b/code/modules/mob/living/silicon/robot/robot_modules/event.dm new file mode 100644 index 00000000000..6543559b7d1 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/robot_modules/event.dm @@ -0,0 +1,78 @@ +/* Other, unaffiliated modules */ + +// The module that borgs on the surface have. Generally has a lot of useful tools in exchange for questionable loyalty to the crew. +/obj/item/weapon/robot_module/robot/lost + name = "lost robot module" + hide_on_manifest = 1 + sprites = list( + "Drone" = "drone-lost" + ) + +/obj/item/weapon/robot_module/robot/lost/New(var/mob/living/silicon/robot/R) + ..() + // Sec + src.modules += new /obj/item/weapon/melee/baton/shocker/robot(src) + src.modules += new /obj/item/weapon/handcuffs/cyborg(src) + src.modules += new /obj/item/borg/combat/shield(src) + + // Med + src.modules += new /obj/item/borg/sight/hud/med(src) + src.modules += new /obj/item/device/healthanalyzer(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/lost(src) + + // Engi + src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src) + src.modules += new /obj/item/weapon/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/weapon/wirecutters/cyborg(src) + src.modules += new /obj/item/device/multitool(src) + + // Sci + src.modules += new /obj/item/device/robotanalyzer(src) + + // Potato + src.emag = new /obj/item/weapon/gun/energy/retro/mounted(src) + + var/datum/matter_synth/wire = new /datum/matter_synth/wire() + synths += wire + + var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + C.synths = list(wire) + src.modules += C + +/obj/item/weapon/robot_module/robot/gravekeeper + name = "gravekeeper robot module" + hide_on_manifest = 1 + sprites = list( + "Drone" = "drone-gravekeeper", + "Sleek" = "sleek-gravekeeper" + ) + +/obj/item/weapon/robot_module/robot/gravekeeper/New(var/mob/living/silicon/robot/R) + ..() + // For fending off animals and looters + src.modules += new /obj/item/weapon/melee/baton/shocker/robot(src) + src.modules += new /obj/item/borg/combat/shield(src) + + // For repairing gravemarkers + src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src) + src.modules += new /obj/item/weapon/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + + // For growing flowers + src.modules += new /obj/item/weapon/material/minihoe(src) + src.modules += new /obj/item/weapon/material/hatchet(src) + src.modules += new /obj/item/device/analyzer/plant_analyzer(src) + src.modules += new /obj/item/weapon/storage/bag/plants(src) + src.modules += new /obj/item/weapon/robot_harvester(src) + + // For digging and beautifying graves + src.modules += new /obj/item/weapon/shovel(src) + src.modules += new /obj/item/weapon/gripper/gravekeeper(src) + + // For really persistent looters + src.emag = new /obj/item/weapon/gun/energy/retro/mounted(src) + + var/datum/matter_synth/wood = new /datum/matter_synth/wood(25000) + synths += wood + diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm similarity index 89% rename from code/modules/mob/living/silicon/robot/robot_modules.dm rename to code/modules/mob/living/silicon/robot/robot_modules/station.dm index a92a6396617..a47679ab142 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -1,941 +1,860 @@ -var/global/list/robot_modules = list( - "Standard" = /obj/item/weapon/robot_module/robot/standard, - "Service" = /obj/item/weapon/robot_module/robot/clerical/butler, - "Clerical" = /obj/item/weapon/robot_module/robot/clerical/general, - "Research" = /obj/item/weapon/robot_module/robot/research, - "Miner" = /obj/item/weapon/robot_module/robot/miner, - "Crisis" = /obj/item/weapon/robot_module/robot/medical/crisis, - "Surgeon" = /obj/item/weapon/robot_module/robot/medical/surgeon, - "Security" = /obj/item/weapon/robot_module/robot/security/general, - "Combat" = /obj/item/weapon/robot_module/robot/security/combat, - "Engineering" = /obj/item/weapon/robot_module/robot/engineering/general, -// "Construction" = /obj/item/weapon/robot_module/robot/engineering/construction, - "Janitor" = /obj/item/weapon/robot_module/robot/janitor - ) - -/obj/item/weapon/robot_module - name = "robot module" - icon = 'icons/obj/module.dmi' - icon_state = "std_module" - w_class = ITEMSIZE_NO_CONTAINER - item_state = "std_mod" - flags = CONDUCT - var/hide_on_manifest = 0 - var/channels = list() - var/networks = list() - var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0, LANGUAGE_SIGN = 0) - var/sprites = list() - var/can_be_pushed = 1 - var/no_slip = 0 - var/list/modules = list() - var/list/datum/matter_synth/synths = list() - var/obj/item/emag = null - var/obj/item/borg/upgrade/jetpack = null - var/list/subsystems = list() - var/list/obj/item/borg/upgrade/supported_upgrades = list() - - // Bookkeeping - var/list/original_languages = list() - var/list/added_networks = list() - -/obj/item/weapon/robot_module/New(var/mob/living/silicon/robot/R) - ..() - R.module = src - - add_camera_networks(R) - add_languages(R) - add_subsystems(R) - apply_status_flags(R) - - if(R.radio) - R.radio.recalculateChannels() - - R.set_module_sprites(sprites) - R.choose_icon(R.module_sprites.len + 1, R.module_sprites) - - for(var/obj/item/I in modules) - I.canremove = 0 - -/obj/item/weapon/robot_module/proc/Reset(var/mob/living/silicon/robot/R) - remove_camera_networks(R) - remove_languages(R) - remove_subsystems(R) - remove_status_flags(R) - - if(R.radio) - R.radio.recalculateChannels() - R.choose_icon(0, R.set_module_sprites(list("Default" = "robot"))) - -/obj/item/weapon/robot_module/Destroy() - for(var/module in modules) - qdel(module) - for(var/synth in synths) - qdel(synth) - modules.Cut() - synths.Cut() - qdel(emag) - qdel(jetpack) - emag = null - jetpack = null - return ..() - -/obj/item/weapon/robot_module/emp_act(severity) - if(modules) - for(var/obj/O in modules) - O.emp_act(severity) - if(emag) - emag.emp_act(severity) - if(synths) - for(var/datum/matter_synth/S in synths) - S.emp_act(severity) - ..() - return - -/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R, var/rate) - if(!synths || !synths.len) - return - - for(var/datum/matter_synth/T in synths) - T.add_charge(T.recharge_rate * rate) - -/obj/item/weapon/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module - var/list/temp_list = modules - modules = list() - for(var/obj/O in temp_list) - if(O) - modules += O - -/obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R) - // Stores the languages as they were before receiving the module, and whether they could be synthezized. - for(var/datum/language/language_datum in R.languages) - original_languages[language_datum] = (language_datum in R.speech_synthesizer_langs) - - for(var/language in languages) - R.add_language(language, languages[language]) - -/obj/item/weapon/robot_module/proc/remove_languages(var/mob/living/silicon/robot/R) - // Clear all added languages, whether or not we originally had them. - for(var/language in languages) - R.remove_language(language) - - // Then add back all the original languages, and the relevant synthezising ability - for(var/original_language in original_languages) - R.add_language(original_language, original_languages[original_language]) - original_languages.Cut() - -/obj/item/weapon/robot_module/proc/add_camera_networks(var/mob/living/silicon/robot/R) - if(R.camera && (NETWORK_ROBOTS in R.camera.network)) - for(var/network in networks) - if(!(network in R.camera.network)) - R.camera.add_network(network) - added_networks |= network - -/obj/item/weapon/robot_module/proc/remove_camera_networks(var/mob/living/silicon/robot/R) - if(R.camera) - R.camera.remove_networks(added_networks) - added_networks.Cut() - -/obj/item/weapon/robot_module/proc/add_subsystems(var/mob/living/silicon/robot/R) - R.verbs |= subsystems - -/obj/item/weapon/robot_module/proc/remove_subsystems(var/mob/living/silicon/robot/R) - R.verbs -= subsystems - -/obj/item/weapon/robot_module/proc/apply_status_flags(var/mob/living/silicon/robot/R) - if(!can_be_pushed) - R.status_flags &= ~CANPUSH - -/obj/item/weapon/robot_module/proc/remove_status_flags(var/mob/living/silicon/robot/R) - if(!can_be_pushed) - R.status_flags |= CANPUSH - -// Cyborgs (non-drones), default loadout. This will be given to every module. -/obj/item/weapon/robot_module/robot/New() - ..() - src.modules += new /obj/item/device/flash(src) - src.modules += new /obj/item/weapon/crowbar/cyborg(src) - src.modules += new /obj/item/weapon/extinguisher(src) - -/obj/item/weapon/robot_module/robot/standard - name = "standard robot module" - sprites = list( - "M-USE NanoTrasen" = "robot", - "Cabeiri" = "eyebot-standard", - "CUPCAKE" = "Noble-STD", - "Haruka" = "marinaSD", - "Usagi" = "tallflower", - "Telemachus" = "toiletbot", - "WTOperator" = "sleekstandard", - "WTOmni" = "omoikane", - "XI-GUS" = "spider", - "XI-ALP" = "heavyStandard", - "Basic" = "robot_old", - "Android" = "droid", - "Drone" = "drone-standard" - ) - -/obj/item/weapon/robot_module/robot/standard/New() - ..() - src.modules += new /obj/item/weapon/melee/baton/loaded(src) - src.modules += new /obj/item/weapon/wrench/cyborg(src) - src.modules += new /obj/item/device/healthanalyzer(src) - src.emag = new /obj/item/weapon/melee/energy/sword(src) - -/obj/item/weapon/robot_module/robot/medical - name = "medical robot module" - channels = list("Medical" = 1) - networks = list(NETWORK_MEDICAL) - subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) - can_be_pushed = 0 - -/obj/item/weapon/robot_module/robot/medical/surgeon - name = "surgeon robot module" - sprites = list( - "M-USE NanoTrasen" = "robotMedi", - "Cabeiri" = "eyebot-medical", - "CUPCAKE" = "Noble-MED", - "Haruka" = "marinaMD", - "Minako" = "arachne", - "Usagi" = "tallwhite", - "Telemachus" = "toiletbotsurgeon", - "WTOperator" = "sleekcmo", - "XI-ALP" = "heavyMed", - "Basic" = "Medbot", - "Advanced Droid" = "droid-medical", - "Needles" = "medicalrobot", - "Drone" = "drone-surgery", - "Handy" = "handy-med" - ) - -/obj/item/weapon/robot_module/robot/medical/surgeon/New() - ..() - src.modules += new /obj/item/borg/sight/hud/med(src) - src.modules += new /obj/item/device/healthanalyzer(src) - src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src) - src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src) - src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src) - src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src) - src.modules += new /obj/item/weapon/surgical/cautery/cyborg(src) - src.modules += new /obj/item/weapon/surgical/bonegel/cyborg(src) - src.modules += new /obj/item/weapon/surgical/FixOVein/cyborg(src) - src.modules += new /obj/item/weapon/surgical/bonesetter/cyborg(src) - src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src) - src.modules += new /obj/item/weapon/surgical/surgicaldrill/cyborg(src) - src.modules += new /obj/item/weapon/gripper/no_use/organ(src) - src.modules += new /obj/item/weapon/gripper/medical(src) - src.modules += new /obj/item/weapon/shockpaddles/robot(src) - src.modules += new /obj/item/weapon/reagent_containers/dropper(src) // Allows surgeon borg to fix necrosis - src.modules += new /obj/item/weapon/reagent_containers/syringe(src) - src.emag = new /obj/item/weapon/reagent_containers/spray(src) - src.emag.reagents.add_reagent("pacid", 250) - src.emag.name = "Polyacid spray" - - var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(10000) - synths += medicine - - var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) - var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) - N.uses_charge = 1 - N.charge_costs = list(1000) - N.synths = list(medicine) - B.uses_charge = 1 - B.charge_costs = list(1000) - B.synths = list(medicine) - src.modules += N - src.modules += B - -/obj/item/weapon/robot_module/medical/robot/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - if(src.emag) - var/obj/item/weapon/reagent_containers/spray/PS = src.emag - PS.reagents.add_reagent("pacid", 2 * amount) - ..() - -/obj/item/weapon/robot_module/robot/medical/crisis - name = "crisis robot module" - sprites = list( - "M-USE NanoTrasen" = "robotMedi", - "Cabeiri" = "eyebot-medical", - "CUPCAKE" = "Noble-MED", - "Haruka" = "marinaMD", - "Minako" = "arachne", - "Usagi" = "tallwhite", - "Telemachus" = "toiletbotmedical", - "WTOperator" = "sleekmedic", - "XI-ALP" = "heavyMed", - "Basic" = "Medbot", - "Advanced Droid" = "droid-medical", - "Needles" = "medicalrobot", - "Drone - Medical" = "drone-medical", - "Drone - Chemistry" = "drone-chemistry" - ) - -/obj/item/weapon/robot_module/robot/medical/crisis/New() - ..() - src.modules += new /obj/item/borg/sight/hud/med(src) - src.modules += new /obj/item/device/healthanalyzer(src) - src.modules += new /obj/item/device/reagent_scanner/adv(src) - src.modules += new /obj/item/roller_holder(src) - src.modules += new /obj/item/weapon/reagent_containers/borghypo/crisis(src) - src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src) - src.modules += new /obj/item/weapon/reagent_containers/syringe(src) - src.modules += new /obj/item/weapon/gripper/no_use/organ(src) - src.modules += new /obj/item/weapon/gripper/medical(src) - src.modules += new /obj/item/weapon/shockpaddles/robot(src) - src.emag = new /obj/item/weapon/reagent_containers/spray(src) - src.emag.reagents.add_reagent("pacid", 250) - src.emag.name = "Polyacid spray" - - var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000) - synths += medicine - - var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src) - var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) - var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src) - O.uses_charge = 1 - O.charge_costs = list(1000) - O.synths = list(medicine) - B.uses_charge = 1 - B.charge_costs = list(1000) - B.synths = list(medicine) - S.uses_charge = 1 - S.charge_costs = list(1000) - S.synths = list(medicine) - src.modules += O - src.modules += B - src.modules += S - -/obj/item/weapon/robot_module/robot/medical/crisis/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - - var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules - if(S.mode == 2) - S.reagents.clear_reagents() - S.mode = initial(S.mode) - S.desc = initial(S.desc) - S.update_icon() - - if(src.emag) - var/obj/item/weapon/reagent_containers/spray/PS = src.emag - PS.reagents.add_reagent("pacid", 2 * amount) - - ..() - - -/obj/item/weapon/robot_module/robot/engineering - name = "engineering robot module" - channels = list("Engineering" = 1) - networks = list(NETWORK_ENGINEERING) - subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor) - sprites = list( - "M-USE NanoTrasen" = "robotEngi", - "Cabeiri" = "eyebot-engineering", - "CUPCAKE" = "Noble-ENG", - "Haruka" = "marinaENG", - "Usagi" = "tallyellow", - "Telemachus" = "toiletbotengineering", - "WTOperator" = "sleekce", - "XI-GUS" = "spidereng", - "XI-ALP" = "heavyEng", - "Basic" = "Engineering", - "Antique" = "engineerrobot", - "Landmate" = "landmate", - "Landmate - Treaded" = "engiborg+tread", - "Drone" = "drone-engineer", - "Treadwell" = "treadwell", - "Handy" = "handy-engineer" - ) - -/obj/item/weapon/robot_module/robot/engineering/construction - name = "construction robot module" - no_slip = 1 - -/* Merged back into engineering (Hell, it's about time.) - -/obj/item/weapon/robot_module/robot/engineering/construction/New() - ..() - src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/weapon/rcd/borg(src) - src.modules += new /obj/item/weapon/screwdriver/cyborg(src) - src.modules += new /obj/item/weapon/wrench/cyborg(src) - src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) - src.modules += new /obj/item/device/pipe_painter(src) - src.modules += new /obj/item/device/floor_painter(src) - src.modules += new /obj/item/weapon/gripper/no_use/loader(src) - src.modules += new /obj/item/device/geiger(src) - - var/datum/matter_synth/metal = new /datum/matter_synth/metal() - var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel() - var/datum/matter_synth/glass = new /datum/matter_synth/glass() - synths += metal - synths += plasteel - synths += glass - - var/obj/item/stack/material/cyborg/steel/M = new (src) - M.synths = list(metal) - src.modules += M - - var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) - R.synths = list(metal) - src.modules += R - - var/obj/item/stack/tile/floor/cyborg/F = new /obj/item/stack/tile/floor/cyborg(src) - F.synths = list(metal) - src.modules += F - - var/obj/item/stack/material/cyborg/plasteel/S = new (src) - S.synths = list(plasteel) - src.modules += S - - var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) - RG.synths = list(metal, glass) - src.modules += RG -*/ - -/obj/item/weapon/robot_module/robot/engineering/general/New() - ..() - src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/weapon/screwdriver/cyborg(src) - src.modules += new /obj/item/weapon/wrench/cyborg(src) - src.modules += new /obj/item/weapon/wirecutters/cyborg(src) - src.modules += new /obj/item/device/multitool(src) - src.modules += new /obj/item/device/t_scanner(src) - src.modules += new /obj/item/device/analyzer(src) - src.modules += new /obj/item/taperoll/engineering(src) - src.modules += new /obj/item/weapon/gripper(src) - src.modules += new /obj/item/device/lightreplacer(src) - src.modules += new /obj/item/device/pipe_painter(src) - src.modules += new /obj/item/device/floor_painter(src) - src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src) - src.emag = new /obj/item/weapon/melee/baton/robot/arm(src) - src.modules += new /obj/item/device/geiger(src) - src.modules += new /obj/item/weapon/rcd/borg(src) - src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) - src.modules += new /obj/item/weapon/gripper/no_use/loader(src) - - var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000) - var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000) - var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel(20000) - - var/datum/matter_synth/wire = new /datum/matter_synth/wire() - synths += metal - synths += glass - synths += plasteel - synths += wire - - var/obj/item/weapon/matter_decompiler/MD = new /obj/item/weapon/matter_decompiler(src) - MD.metal = metal - MD.glass = glass - src.modules += MD - - var/obj/item/stack/material/cyborg/steel/M = new (src) - M.synths = list(metal) - src.modules += M - - var/obj/item/stack/material/cyborg/glass/G = new (src) - G.synths = list(glass) - src.modules += G - - var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) - R.synths = list(metal) - src.modules += R - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) - C.synths = list(wire) - src.modules += C - - var/obj/item/stack/material/cyborg/plasteel/P = new (src) - P.synths = list(plasteel) - src.modules += P - - var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) - S.synths = list(metal) - src.modules += S - - var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) - RG.synths = list(metal, glass) - src.modules += RG - -/obj/item/weapon/robot_module/robot/security - name = "security robot module" - channels = list("Security" = 1) - networks = list(NETWORK_SECURITY) - subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) - can_be_pushed = 0 - supported_upgrades = list(/obj/item/borg/upgrade/tasercooler) - -/obj/item/weapon/robot_module/robot/security/general - sprites = list( - "M-USE NanoTrasen" = "robotSecy", - "Cabeiri" = "eyebot-security", - "Cerberus" = "bloodhound", - "Cerberus - Treaded" = "treadhound", - "CUPCAKE" = "Noble-SEC", - "Haruka" = "marinaSC", - "Usagi" = "tallred", - "Telemachus" = "toiletbotsecurity", - "WTOperator" = "sleeksecurity", - "XI-GUS" = "spidersec", - "XI-ALP" = "heavySec", - "Basic" = "secborg", - "Black Knight" = "securityrobot", - "Drone" = "drone-sec" - ) - -/obj/item/weapon/robot_module/robot/security/general/New() - ..() - src.modules += new /obj/item/borg/sight/hud/sec(src) - src.modules += new /obj/item/weapon/handcuffs/cyborg(src) - src.modules += new /obj/item/weapon/melee/baton/robot(src) - src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src) - src.modules += new /obj/item/taperoll/police(src) - src.modules += new /obj/item/weapon/reagent_containers/spray/pepper(src) - src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) - -/obj/item/weapon/robot_module/robot/security/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/device/flash/F = locate() in src.modules - if(F.broken) - F.broken = 0 - F.times_used = 0 - F.icon_state = "flash" - else if(F.times_used) - F.times_used-- - var/obj/item/weapon/gun/energy/taser/mounted/cyborg/T = locate() in src.modules - if(T.power_supply.charge < T.power_supply.maxcharge) - T.power_supply.give(T.charge_cost * amount) - T.update_icon() - else - T.charge_tick = 0 - var/obj/item/weapon/melee/baton/robot/B = locate() in src.modules - if(B && B.bcell) - B.bcell.give(amount) - -/obj/item/weapon/robot_module/robot/janitor - name = "janitorial robot module" - channels = list("Service" = 1) - sprites = list( - "M-USE NanoTrasen" = "robotJani", - "Arachne" = "crawler", - "Cabeiri" = "eyebot-janitor", - "CUPCAKE" = "Noble-CLN", - "Haruka" = "marinaJN", - "Telemachus" = "toiletbotjanitor", - "WTOperator" = "sleekjanitor", - "XI-ALP" = "heavyRes", - "Basic" = "JanBot2", - "Mopbot" = "janitorrobot", - "Mop Gear Rex" = "mopgearrex", - "Drone" = "drone-janitor" - ) - -/obj/item/weapon/robot_module/robot/janitor/New() - ..() - src.modules += new /obj/item/weapon/soap/nanotrasen(src) - src.modules += new /obj/item/weapon/storage/bag/trash(src) - src.modules += new /obj/item/weapon/mop(src) - src.modules += new /obj/item/device/lightreplacer(src) - src.emag = new /obj/item/weapon/reagent_containers/spray(src) - src.emag.reagents.add_reagent("lube", 250) - src.emag.name = "Lube spray" - -/obj/item/weapon/robot_module/robot/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/device/lightreplacer/LR = locate() in src.modules - LR.Charge(R, amount) - if(src.emag) - var/obj/item/weapon/reagent_containers/spray/S = src.emag - S.reagents.add_reagent("lube", 2 * amount) - -/obj/item/weapon/robot_module/robot/clerical - name = "service robot module" - channels = list("Service" = 1) - languages = list( - LANGUAGE_SOL_COMMON = 1, - LANGUAGE_UNATHI = 1, - LANGUAGE_SIIK = 1, - LANGUAGE_SKRELLIAN = 1, - LANGUAGE_ROOTLOCAL = 0, - LANGUAGE_TRADEBAND = 1, - LANGUAGE_GUTTER = 1, - LANGUAGE_SCHECHI = 1, - LANGUAGE_EAL = 1, - LANGUAGE_SIGN = 0 - ) - -/obj/item/weapon/robot_module/robot/clerical/butler - sprites = list( - "M-USE NanoTrasen" = "robotServ", - "Cabeiri" = "eyebot-standard", - "CUPCAKE" = "Noble-SRV", - "Haruka" = "marinaSV", - "Michiru" = "maidbot", - "Usagi" = "tallgreen", - "Telemachus" = "toiletbot", - "WTOperator" = "sleekservice", - "WTOmni" = "omoikane", - "XI-GUS" = "spider", - "XI-ALP" = "heavyServ", - "Standard" = "Service2", - "Waitress" = "Service", - "Bro" = "Brobot", - "Rich" = "maximillion", - "Drone - Service" = "drone-service", - "Drone - Hydro" = "drone-hydro" - ) - -/obj/item/weapon/robot_module/robot/clerical/butler/New() - ..() - src.modules += new /obj/item/weapon/gripper/service(src) - src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src) - src.modules += new /obj/item/weapon/material/minihoe(src) - src.modules += new /obj/item/weapon/material/hatchet(src) - src.modules += new /obj/item/device/analyzer/plant_analyzer(src) - src.modules += new /obj/item/weapon/storage/bag/plants(src) - src.modules += new /obj/item/weapon/robot_harvester(src) - src.modules += new /obj/item/weapon/material/knife(src) - src.modules += new /obj/item/weapon/material/kitchen/rollingpin(src) - src.modules += new /obj/item/device/multitool(src) //to freeze trays - - var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) - M.stored_matter = 30 - src.modules += M - - src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src) - - var/obj/item/weapon/flame/lighter/zippo/L = new /obj/item/weapon/flame/lighter/zippo(src) - L.lit = 1 - src.modules += L - - src.modules += new /obj/item/weapon/tray/robotray(src) - src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src) - src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src) - - var/datum/reagents/R = new/datum/reagents(50) - src.emag.reagents = R - R.my_atom = src.emag - R.add_reagent("beer2", 50) - src.emag.name = "Mickey Finn's Special Brew" - -/obj/item/weapon/robot_module/robot/clerical/general - name = "clerical robot module" - sprites = list( - "M-USE NanoTrasen" = "robotCler", - "Cabeiri" = "eyebot-standard", - "CUPCAKE" = "Noble-SRV", - "Haruka" = "marinaSV", - "Usagi" = "tallgreen", - "Telemachus" = "toiletbot", - "WTOperator" = "sleekclerical", - "WTOmni" = "omoikane", - "XI-GUS" = "spidercom", - "XI-ALP" = "heavyServ", - "Waitress" = "Service", - "Bro" = "Brobot", - "Rich" = "maximillion", - "Default" = "Service2", - "Drone" = "drone-blu" - ) - -/obj/item/weapon/robot_module/robot/clerical/general/New() - ..() - src.modules += new /obj/item/weapon/pen/robopen(src) - src.modules += new /obj/item/weapon/form_printer(src) - src.modules += new /obj/item/weapon/gripper/paperwork(src) - src.modules += new /obj/item/weapon/hand_labeler(src) - src.modules += new /obj/item/weapon/stamp(src) - src.modules += new /obj/item/weapon/stamp/denied(src) - src.emag = new /obj/item/weapon/stamp/chameleon(src) - src.emag = new /obj/item/weapon/pen/chameleon(src) - -/obj/item/weapon/robot_module/general/butler/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules - E.reagents.add_reagent("enzyme", 2 * amount) - if(src.emag) - var/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer/B = src.emag - B.reagents.add_reagent("beer2", 2 * amount) - -/obj/item/weapon/robot_module/robot/miner - name = "miner robot module" - channels = list("Supply" = 1) - networks = list(NETWORK_MINE) - sprites = list( - "NM-USE NanoTrasen" = "robotMine", - "Cabeiri" = "eyebot-miner", - "CUPCAKE" = "Noble-DIG", - "Haruka" = "marinaMN", - "Telemachus" = "toiletbotminer", - "WTOperator" = "sleekminer", - "XI-GUS" = "spidermining", - "XI-ALP" = "heavyMiner", - "Basic" = "Miner_old", - "Advanced Droid" = "droid-miner", - "Treadhead" = "Miner", - "Drone" = "drone-miner" - ) - -/obj/item/weapon/robot_module/robot/miner/New() - ..() - src.modules += new /obj/item/borg/sight/material(src) - src.modules += new /obj/item/weapon/wrench/cyborg(src) - src.modules += new /obj/item/weapon/screwdriver/cyborg(src) - src.modules += new /obj/item/weapon/storage/bag/ore(src) - src.modules += new /obj/item/weapon/pickaxe/borgdrill(src) - src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) - src.modules += new /obj/item/weapon/gripper/miner(src) - src.modules += new /obj/item/weapon/mining_scanner(src) - src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) - src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src) - -/obj/item/weapon/robot_module/robot/research - name = "research module" - channels = list("Science" = 1) - sprites = list( - "L'Ouef" = "peaceborg", - "Cabeiri" = "eyebot-science", - "Haruka" = "marinaSCI", - "WTDove" = "whitespider", - "WTOperator" = "sleekscience", - "Droid" = "droid-science", - "Drone" = "drone-science", - "Handy" = "handy-science" - ) - -/obj/item/weapon/robot_module/robot/research/New() - ..() - src.modules += new /obj/item/weapon/portable_destructive_analyzer(src) - src.modules += new /obj/item/weapon/gripper/research(src) - src.modules += new /obj/item/weapon/gripper/no_use/organ/robotics(src) - src.modules += new /obj/item/weapon/gripper/no_use/mech(src) - src.modules += new /obj/item/weapon/gripper/no_use/loader(src) - src.modules += new /obj/item/device/robotanalyzer(src) - src.modules += new /obj/item/weapon/card/robot(src) - src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/weapon/screwdriver/cyborg(src) - src.modules += new /obj/item/weapon/wrench/cyborg(src) - src.modules += new /obj/item/weapon/wirecutters/cyborg(src) - src.modules += new /obj/item/device/multitool(src) - src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src) - src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src) - src.modules += new /obj/item/weapon/reagent_containers/syringe(src) - src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - src.modules += new /obj/item/weapon/storage/part_replacer(src) - src.modules += new /obj/item/weapon/shockpaddles/robot/jumper(src) - src.modules += new /obj/item/weapon/melee/baton/slime/robot(src) - src.modules += new /obj/item/weapon/gun/energy/taser/xeno/robot(src) - src.emag = new /obj/item/weapon/hand_tele(src) - - var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000) - synths += nanite - var/datum/matter_synth/wire = new /datum/matter_synth/wire() //Added to allow repairs, would rather add cable now than be asked to add it later, - synths += wire //Cable code, taken from engiborg, - - var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) - N.uses_charge = 1 - N.charge_costs = list(1000) - N.synths = list(nanite) - src.modules += N - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) //Cable code, taken from engiborg, - C.synths = list(wire) - src.modules += C - -/obj/item/weapon/robot_module/robot/syndicate - name = "illegal robot module" - hide_on_manifest = 1 - languages = list( - LANGUAGE_SOL_COMMON = 1, - LANGUAGE_TRADEBAND = 1, - LANGUAGE_UNATHI = 0, - LANGUAGE_SIIK = 0, - LANGUAGE_SKRELLIAN = 0, - LANGUAGE_ROOTLOCAL = 0, - LANGUAGE_GUTTER = 1, - LANGUAGE_SCHECHI = 0, - LANGUAGE_EAL = 1, - LANGUAGE_SIGN = 0 - ) - sprites = list( - "Cerberus" = "syndie_bloodhound", - "Cerberus - Treaded" = "syndie_treadhound", - "Ares" = "squats", - "Telemachus" = "toiletbotantag", - "WTOperator" = "hosborg", - "XI-GUS" = "spidersyndi", - "XI-ALP" = "syndi-heavy" - ) - var/id - -/obj/item/weapon/robot_module/robot/syndicate/New(var/mob/living/silicon/robot/R) - ..() - loc = R - src.modules += new /obj/item/weapon/melee/energy/sword(src) - src.modules += new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(src) - src.modules += new /obj/item/weapon/card/emag(src) - var/jetpack = new/obj/item/weapon/tank/jetpack/carbondioxide(src) - src.modules += jetpack - R.internals = jetpack - - id = R.idcard - src.modules += id - -/obj/item/weapon/robot_module/robot/syndicate/Destroy() - src.modules -= id - id = null - return ..() - -// The module that borgs on the surface have. Generally has a lot of useful tools in exchange for questionable loyalty to the crew. -/obj/item/weapon/robot_module/robot/lost - name = "lost robot module" - hide_on_manifest = 1 - sprites = list( - "Drone" = "drone-lost" - ) - -/obj/item/weapon/robot_module/robot/lost/New(var/mob/living/silicon/robot/R) - ..() - // Sec - src.modules += new /obj/item/weapon/melee/baton/shocker/robot(src) - src.modules += new /obj/item/weapon/handcuffs/cyborg(src) - src.modules += new /obj/item/borg/combat/shield(src) - - // Med - src.modules += new /obj/item/borg/sight/hud/med(src) - src.modules += new /obj/item/device/healthanalyzer(src) - src.modules += new /obj/item/weapon/reagent_containers/borghypo/lost(src) - - // Engi - src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src) - src.modules += new /obj/item/weapon/screwdriver/cyborg(src) - src.modules += new /obj/item/weapon/wrench/cyborg(src) - src.modules += new /obj/item/weapon/wirecutters/cyborg(src) - src.modules += new /obj/item/device/multitool(src) - - // Sci - src.modules += new /obj/item/device/robotanalyzer(src) - - // Potato - src.emag = new /obj/item/weapon/gun/energy/retro/mounted(src) - - var/datum/matter_synth/wire = new /datum/matter_synth/wire() - synths += wire - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) - C.synths = list(wire) - src.modules += C - -/obj/item/weapon/robot_module/robot/security/combat - name = "combat robot module" - hide_on_manifest = 1 - sprites = list( - "Haruka" = "marinaCB", - "Combat Android" = "droid-combat" - ) - -/obj/item/weapon/robot_module/robot/security/combat/New() - ..() - src.modules += new /obj/item/device/flash(src) - src.modules += new /obj/item/borg/sight/thermal(src) - src.modules += new /obj/item/weapon/gun/energy/laser/mounted(src) - src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) - src.modules += new /obj/item/borg/combat/shield(src) - src.modules += new /obj/item/borg/combat/mobility(src) - src.emag = new /obj/item/weapon/gun/energy/lasercannon/mounted(src) - -/obj/item/weapon/robot_module/drone - name = "drone module" - hide_on_manifest = 1 - no_slip = 1 - networks = list(NETWORK_ENGINEERING) - -/obj/item/weapon/robot_module/drone/New(var/mob/living/silicon/robot/robot) - ..() - src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/weapon/screwdriver/cyborg(src) - src.modules += new /obj/item/weapon/wrench/cyborg(src) - src.modules += new /obj/item/weapon/crowbar/cyborg(src) - src.modules += new /obj/item/weapon/wirecutters/cyborg(src) - src.modules += new /obj/item/device/multitool(src) - src.modules += new /obj/item/device/lightreplacer(src) - src.modules += new /obj/item/weapon/gripper(src) - src.modules += new /obj/item/weapon/soap(src) - src.modules += new /obj/item/weapon/gripper/no_use/loader(src) - src.modules += new /obj/item/weapon/extinguisher(src) - src.modules += new /obj/item/device/pipe_painter(src) - src.modules += new /obj/item/device/floor_painter(src) - - robot.internals = new/obj/item/weapon/tank/jetpack/carbondioxide(src) - src.modules += robot.internals - - src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) - src.emag.name = "Plasma Cutter" - - var/datum/matter_synth/metal = new /datum/matter_synth/metal(25000) - var/datum/matter_synth/glass = new /datum/matter_synth/glass(25000) - var/datum/matter_synth/wood = new /datum/matter_synth/wood(2000) - var/datum/matter_synth/plastic = new /datum/matter_synth/plastic(1000) - var/datum/matter_synth/wire = new /datum/matter_synth/wire(30) - synths += metal - synths += glass - synths += wood - synths += plastic - synths += wire - - var/obj/item/weapon/matter_decompiler/MD = new /obj/item/weapon/matter_decompiler(src) - MD.metal = metal - MD.glass = glass - MD.wood = wood - MD.plastic = plastic - src.modules += MD - - var/obj/item/stack/material/cyborg/steel/M = new (src) - M.synths = list(metal) - src.modules += M - - var/obj/item/stack/material/cyborg/glass/G = new (src) - G.synths = list(glass) - src.modules += G - - var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) - R.synths = list(metal) - src.modules += R - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) - C.synths = list(wire) - src.modules += C - - var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) - S.synths = list(metal) - src.modules += S - - var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) - RG.synths = list(metal, glass) - src.modules += RG - - var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) - WT.synths = list(wood) - src.modules += WT - - var/obj/item/stack/material/cyborg/wood/W = new (src) - W.synths = list(wood) - src.modules += W - - var/obj/item/stack/material/cyborg/plastic/P = new (src) - P.synths = list(plastic) - src.modules += P - -/obj/item/weapon/robot_module/drone/construction - name = "construction drone module" - hide_on_manifest = 1 - channels = list("Engineering" = 1) - languages = list() - -/obj/item/weapon/robot_module/drone/construction/New() - ..() - src.modules += new /obj/item/weapon/rcd/borg(src) - -/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/device/lightreplacer/LR = locate() in src.modules - LR.Charge(R, amount) - ..() +var/global/list/robot_modules = list( + "Standard" = /obj/item/weapon/robot_module/robot/standard, + "Service" = /obj/item/weapon/robot_module/robot/clerical/butler, + "Clerical" = /obj/item/weapon/robot_module/robot/clerical/general, + "Research" = /obj/item/weapon/robot_module/robot/research, + "Miner" = /obj/item/weapon/robot_module/robot/miner, + "Crisis" = /obj/item/weapon/robot_module/robot/medical/crisis, + "Surgeon" = /obj/item/weapon/robot_module/robot/medical/surgeon, + "Security" = /obj/item/weapon/robot_module/robot/security/general, + "Combat" = /obj/item/weapon/robot_module/robot/security/combat, + "Engineering" = /obj/item/weapon/robot_module/robot/engineering/general, +// "Construction" = /obj/item/weapon/robot_module/robot/engineering/construction, + "Janitor" = /obj/item/weapon/robot_module/robot/janitor + ) + +/obj/item/weapon/robot_module + name = "robot module" + icon = 'icons/obj/module.dmi' + icon_state = "std_module" + w_class = ITEMSIZE_NO_CONTAINER + item_state = "std_mod" + flags = CONDUCT + var/hide_on_manifest = 0 + var/channels = list() + var/networks = list() + var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0, LANGUAGE_SIGN = 0) + var/sprites = list() + var/can_be_pushed = 1 + var/no_slip = 0 + var/list/modules = list() + var/list/datum/matter_synth/synths = list() + var/obj/item/emag = null + var/obj/item/borg/upgrade/jetpack = null + var/list/subsystems = list() + var/list/obj/item/borg/upgrade/supported_upgrades = list() + + // Bookkeeping + var/list/original_languages = list() + var/list/added_networks = list() + +/obj/item/weapon/robot_module/New(var/mob/living/silicon/robot/R) + ..() + R.module = src + + add_camera_networks(R) + add_languages(R) + add_subsystems(R) + apply_status_flags(R) + + if(R.radio) + R.radio.recalculateChannels() + + R.set_module_sprites(sprites) + R.choose_icon(R.module_sprites.len + 1, R.module_sprites) + + for(var/obj/item/I in modules) + I.canremove = 0 + +/obj/item/weapon/robot_module/proc/Reset(var/mob/living/silicon/robot/R) + remove_camera_networks(R) + remove_languages(R) + remove_subsystems(R) + remove_status_flags(R) + + if(R.radio) + R.radio.recalculateChannels() + R.choose_icon(0, R.set_module_sprites(list("Default" = "robot"))) + +/obj/item/weapon/robot_module/Destroy() + for(var/module in modules) + qdel(module) + for(var/synth in synths) + qdel(synth) + modules.Cut() + synths.Cut() + qdel(emag) + qdel(jetpack) + emag = null + jetpack = null + return ..() + +/obj/item/weapon/robot_module/emp_act(severity) + if(modules) + for(var/obj/O in modules) + O.emp_act(severity) + if(emag) + emag.emp_act(severity) + if(synths) + for(var/datum/matter_synth/S in synths) + S.emp_act(severity) + ..() + return + +/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R, var/rate) + if(!synths || !synths.len) + return + + for(var/datum/matter_synth/T in synths) + T.add_charge(T.recharge_rate * rate) + +/obj/item/weapon/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module + var/list/temp_list = modules + modules = list() + for(var/obj/O in temp_list) + if(O) + modules += O + +/obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R) + // Stores the languages as they were before receiving the module, and whether they could be synthezized. + for(var/datum/language/language_datum in R.languages) + original_languages[language_datum] = (language_datum in R.speech_synthesizer_langs) + + for(var/language in languages) + R.add_language(language, languages[language]) + +/obj/item/weapon/robot_module/proc/remove_languages(var/mob/living/silicon/robot/R) + // Clear all added languages, whether or not we originally had them. + for(var/language in languages) + R.remove_language(language) + + // Then add back all the original languages, and the relevant synthezising ability + for(var/original_language in original_languages) + R.add_language(original_language, original_languages[original_language]) + original_languages.Cut() + +/obj/item/weapon/robot_module/proc/add_camera_networks(var/mob/living/silicon/robot/R) + if(R.camera && (NETWORK_ROBOTS in R.camera.network)) + for(var/network in networks) + if(!(network in R.camera.network)) + R.camera.add_network(network) + added_networks |= network + +/obj/item/weapon/robot_module/proc/remove_camera_networks(var/mob/living/silicon/robot/R) + if(R.camera) + R.camera.remove_networks(added_networks) + added_networks.Cut() + +/obj/item/weapon/robot_module/proc/add_subsystems(var/mob/living/silicon/robot/R) + R.verbs |= subsystems + +/obj/item/weapon/robot_module/proc/remove_subsystems(var/mob/living/silicon/robot/R) + R.verbs -= subsystems + +/obj/item/weapon/robot_module/proc/apply_status_flags(var/mob/living/silicon/robot/R) + if(!can_be_pushed) + R.status_flags &= ~CANPUSH + +/obj/item/weapon/robot_module/proc/remove_status_flags(var/mob/living/silicon/robot/R) + if(!can_be_pushed) + R.status_flags |= CANPUSH + +// Cyborgs (non-drones), default loadout. This will be given to every module. +/obj/item/weapon/robot_module/robot/New() + ..() + src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/weapon/crowbar/cyborg(src) + src.modules += new /obj/item/weapon/extinguisher(src) + +/obj/item/weapon/robot_module/robot/standard + name = "standard robot module" + sprites = list( + "M-USE NanoTrasen" = "robot", + "Cabeiri" = "eyebot-standard", + "CUPCAKE" = "Noble-STD", + "Haruka" = "marinaSD", + "Usagi" = "tallflower", + "Telemachus" = "toiletbot", + "WTOperator" = "sleekstandard", + "WTOmni" = "omoikane", + "XI-GUS" = "spider", + "XI-ALP" = "heavyStandard", + "Basic" = "robot_old", + "Android" = "droid", + "Drone" = "drone-standard" + ) + +/obj/item/weapon/robot_module/robot/standard/New() + ..() + src.modules += new /obj/item/weapon/melee/baton/loaded(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/device/healthanalyzer(src) + src.emag = new /obj/item/weapon/melee/energy/sword(src) + +/obj/item/weapon/robot_module/robot/medical + name = "medical robot module" + channels = list("Medical" = 1) + networks = list(NETWORK_MEDICAL) + subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) + can_be_pushed = 0 + +/obj/item/weapon/robot_module/robot/medical/surgeon + name = "surgeon robot module" + sprites = list( + "M-USE NanoTrasen" = "robotMedi", + "Cabeiri" = "eyebot-medical", + "CUPCAKE" = "Noble-MED", + "Haruka" = "marinaMD", + "Minako" = "arachne", + "Usagi" = "tallwhite", + "Telemachus" = "toiletbotsurgeon", + "WTOperator" = "sleekcmo", + "XI-ALP" = "heavyMed", + "Basic" = "Medbot", + "Advanced Droid" = "droid-medical", + "Needles" = "medicalrobot", + "Drone" = "drone-surgery", + "Handy" = "handy-med" + ) + +/obj/item/weapon/robot_module/robot/medical/surgeon/New() + ..() + src.modules += new /obj/item/borg/sight/hud/med(src) + src.modules += new /obj/item/device/healthanalyzer(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src) + src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src) + src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src) + src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src) + src.modules += new /obj/item/weapon/surgical/cautery/cyborg(src) + src.modules += new /obj/item/weapon/surgical/bonegel/cyborg(src) + src.modules += new /obj/item/weapon/surgical/FixOVein/cyborg(src) + src.modules += new /obj/item/weapon/surgical/bonesetter/cyborg(src) + src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src) + src.modules += new /obj/item/weapon/surgical/surgicaldrill/cyborg(src) + src.modules += new /obj/item/weapon/gripper/no_use/organ(src) + src.modules += new /obj/item/weapon/gripper/medical(src) + src.modules += new /obj/item/weapon/shockpaddles/robot(src) + src.modules += new /obj/item/weapon/reagent_containers/dropper(src) // Allows surgeon borg to fix necrosis + src.modules += new /obj/item/weapon/reagent_containers/syringe(src) + src.emag = new /obj/item/weapon/reagent_containers/spray(src) + src.emag.reagents.add_reagent("pacid", 250) + src.emag.name = "Polyacid spray" + + var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(10000) + synths += medicine + + var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) + var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) + N.uses_charge = 1 + N.charge_costs = list(1000) + N.synths = list(medicine) + B.uses_charge = 1 + B.charge_costs = list(1000) + B.synths = list(medicine) + src.modules += N + src.modules += B + +/obj/item/weapon/robot_module/medical/robot/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + if(src.emag) + var/obj/item/weapon/reagent_containers/spray/PS = src.emag + PS.reagents.add_reagent("pacid", 2 * amount) + ..() + +/obj/item/weapon/robot_module/robot/medical/crisis + name = "crisis robot module" + sprites = list( + "M-USE NanoTrasen" = "robotMedi", + "Cabeiri" = "eyebot-medical", + "CUPCAKE" = "Noble-MED", + "Haruka" = "marinaMD", + "Minako" = "arachne", + "Usagi" = "tallwhite", + "Telemachus" = "toiletbotmedical", + "WTOperator" = "sleekmedic", + "XI-ALP" = "heavyMed", + "Basic" = "Medbot", + "Advanced Droid" = "droid-medical", + "Needles" = "medicalrobot", + "Drone - Medical" = "drone-medical", + "Drone - Chemistry" = "drone-chemistry" + ) + +/obj/item/weapon/robot_module/robot/medical/crisis/New() + ..() + src.modules += new /obj/item/borg/sight/hud/med(src) + src.modules += new /obj/item/device/healthanalyzer(src) + src.modules += new /obj/item/device/reagent_scanner/adv(src) + src.modules += new /obj/item/roller_holder(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/crisis(src) + src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) + src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src) + src.modules += new /obj/item/weapon/reagent_containers/syringe(src) + src.modules += new /obj/item/weapon/gripper/no_use/organ(src) + src.modules += new /obj/item/weapon/gripper/medical(src) + src.modules += new /obj/item/weapon/shockpaddles/robot(src) + src.emag = new /obj/item/weapon/reagent_containers/spray(src) + src.emag.reagents.add_reagent("pacid", 250) + src.emag.name = "Polyacid spray" + + var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000) + synths += medicine + + var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src) + var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) + var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src) + O.uses_charge = 1 + O.charge_costs = list(1000) + O.synths = list(medicine) + B.uses_charge = 1 + B.charge_costs = list(1000) + B.synths = list(medicine) + S.uses_charge = 1 + S.charge_costs = list(1000) + S.synths = list(medicine) + src.modules += O + src.modules += B + src.modules += S + +/obj/item/weapon/robot_module/robot/medical/crisis/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + + var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules + if(S.mode == 2) + S.reagents.clear_reagents() + S.mode = initial(S.mode) + S.desc = initial(S.desc) + S.update_icon() + + if(src.emag) + var/obj/item/weapon/reagent_containers/spray/PS = src.emag + PS.reagents.add_reagent("pacid", 2 * amount) + + ..() + + +/obj/item/weapon/robot_module/robot/engineering + name = "engineering robot module" + channels = list("Engineering" = 1) + networks = list(NETWORK_ENGINEERING) + subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor) + sprites = list( + "M-USE NanoTrasen" = "robotEngi", + "Cabeiri" = "eyebot-engineering", + "CUPCAKE" = "Noble-ENG", + "Haruka" = "marinaENG", + "Usagi" = "tallyellow", + "Telemachus" = "toiletbotengineering", + "WTOperator" = "sleekce", + "XI-GUS" = "spidereng", + "XI-ALP" = "heavyEng", + "Basic" = "Engineering", + "Antique" = "engineerrobot", + "Landmate" = "landmate", + "Landmate - Treaded" = "engiborg+tread", + "Drone" = "drone-engineer", + "Treadwell" = "treadwell", + "Handy" = "handy-engineer" + ) + +/obj/item/weapon/robot_module/robot/engineering/construction + name = "construction robot module" + no_slip = 1 + +/* Merged back into engineering (Hell, it's about time.) + +/obj/item/weapon/robot_module/robot/engineering/construction/New() + ..() + src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/rcd/borg(src) + src.modules += new /obj/item/weapon/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) + src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) + src.modules += new /obj/item/device/pipe_painter(src) + src.modules += new /obj/item/device/floor_painter(src) + src.modules += new /obj/item/weapon/gripper/no_use/loader(src) + src.modules += new /obj/item/device/geiger(src) + + var/datum/matter_synth/metal = new /datum/matter_synth/metal() + var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel() + var/datum/matter_synth/glass = new /datum/matter_synth/glass() + synths += metal + synths += plasteel + synths += glass + + var/obj/item/stack/material/cyborg/steel/M = new (src) + M.synths = list(metal) + src.modules += M + + var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + R.synths = list(metal) + src.modules += R + + var/obj/item/stack/tile/floor/cyborg/F = new /obj/item/stack/tile/floor/cyborg(src) + F.synths = list(metal) + src.modules += F + + var/obj/item/stack/material/cyborg/plasteel/S = new (src) + S.synths = list(plasteel) + src.modules += S + + var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) + RG.synths = list(metal, glass) + src.modules += RG +*/ + +/obj/item/weapon/robot_module/robot/engineering/general/New() + ..() + src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) + src.modules += new /obj/item/weapon/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/weapon/wirecutters/cyborg(src) + src.modules += new /obj/item/device/multitool(src) + src.modules += new /obj/item/device/t_scanner(src) + src.modules += new /obj/item/device/analyzer(src) + src.modules += new /obj/item/taperoll/engineering(src) + src.modules += new /obj/item/weapon/gripper(src) + src.modules += new /obj/item/device/lightreplacer(src) + src.modules += new /obj/item/device/pipe_painter(src) + src.modules += new /obj/item/device/floor_painter(src) + src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src) + src.emag = new /obj/item/weapon/melee/baton/robot/arm(src) + src.modules += new /obj/item/device/geiger(src) + src.modules += new /obj/item/weapon/rcd/borg(src) + src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) + src.modules += new /obj/item/weapon/gripper/no_use/loader(src) + + var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000) + var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000) + var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel(20000) + + var/datum/matter_synth/wire = new /datum/matter_synth/wire() + synths += metal + synths += glass + synths += plasteel + synths += wire + + var/obj/item/weapon/matter_decompiler/MD = new /obj/item/weapon/matter_decompiler(src) + MD.metal = metal + MD.glass = glass + src.modules += MD + + var/obj/item/stack/material/cyborg/steel/M = new (src) + M.synths = list(metal) + src.modules += M + + var/obj/item/stack/material/cyborg/glass/G = new (src) + G.synths = list(glass) + src.modules += G + + var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + R.synths = list(metal) + src.modules += R + + var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + C.synths = list(wire) + src.modules += C + + var/obj/item/stack/material/cyborg/plasteel/P = new (src) + P.synths = list(plasteel) + src.modules += P + + var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) + S.synths = list(metal) + src.modules += S + + var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) + RG.synths = list(metal, glass) + src.modules += RG + +/obj/item/weapon/robot_module/robot/security + name = "security robot module" + channels = list("Security" = 1) + networks = list(NETWORK_SECURITY) + subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) + can_be_pushed = 0 + supported_upgrades = list(/obj/item/borg/upgrade/tasercooler) + +/obj/item/weapon/robot_module/robot/security/general + sprites = list( + "M-USE NanoTrasen" = "robotSecy", + "Cabeiri" = "eyebot-security", + "Cerberus" = "bloodhound", + "Cerberus - Treaded" = "treadhound", + "CUPCAKE" = "Noble-SEC", + "Haruka" = "marinaSC", + "Usagi" = "tallred", + "Telemachus" = "toiletbotsecurity", + "WTOperator" = "sleeksecurity", + "XI-GUS" = "spidersec", + "XI-ALP" = "heavySec", + "Basic" = "secborg", + "Black Knight" = "securityrobot", + "Drone" = "drone-sec" + ) + +/obj/item/weapon/robot_module/robot/security/general/New() + ..() + src.modules += new /obj/item/borg/sight/hud/sec(src) + src.modules += new /obj/item/weapon/handcuffs/cyborg(src) + src.modules += new /obj/item/weapon/melee/baton/robot(src) + src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src) + src.modules += new /obj/item/taperoll/police(src) + src.modules += new /obj/item/weapon/reagent_containers/spray/pepper(src) + src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) + +/obj/item/weapon/robot_module/robot/security/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + var/obj/item/device/flash/F = locate() in src.modules + if(F.broken) + F.broken = 0 + F.times_used = 0 + F.icon_state = "flash" + else if(F.times_used) + F.times_used-- + var/obj/item/weapon/gun/energy/taser/mounted/cyborg/T = locate() in src.modules + if(T.power_supply.charge < T.power_supply.maxcharge) + T.power_supply.give(T.charge_cost * amount) + T.update_icon() + else + T.charge_tick = 0 + var/obj/item/weapon/melee/baton/robot/B = locate() in src.modules + if(B && B.bcell) + B.bcell.give(amount) + +/obj/item/weapon/robot_module/robot/janitor + name = "janitorial robot module" + channels = list("Service" = 1) + sprites = list( + "M-USE NanoTrasen" = "robotJani", + "Arachne" = "crawler", + "Cabeiri" = "eyebot-janitor", + "CUPCAKE" = "Noble-CLN", + "Haruka" = "marinaJN", + "Telemachus" = "toiletbotjanitor", + "WTOperator" = "sleekjanitor", + "XI-ALP" = "heavyRes", + "Basic" = "JanBot2", + "Mopbot" = "janitorrobot", + "Mop Gear Rex" = "mopgearrex", + "Drone" = "drone-janitor" + ) + +/obj/item/weapon/robot_module/robot/janitor/New() + ..() + src.modules += new /obj/item/weapon/soap/nanotrasen(src) + src.modules += new /obj/item/weapon/storage/bag/trash(src) + src.modules += new /obj/item/weapon/mop(src) + src.modules += new /obj/item/device/lightreplacer(src) + src.emag = new /obj/item/weapon/reagent_containers/spray(src) + src.emag.reagents.add_reagent("lube", 250) + src.emag.name = "Lube spray" + +/obj/item/weapon/robot_module/robot/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + var/obj/item/device/lightreplacer/LR = locate() in src.modules + LR.Charge(R, amount) + if(src.emag) + var/obj/item/weapon/reagent_containers/spray/S = src.emag + S.reagents.add_reagent("lube", 2 * amount) + +/obj/item/weapon/robot_module/robot/clerical + name = "service robot module" + channels = list("Service" = 1) + languages = list( + LANGUAGE_SOL_COMMON = 1, + LANGUAGE_UNATHI = 1, + LANGUAGE_SIIK = 1, + LANGUAGE_SKRELLIAN = 1, + LANGUAGE_ROOTLOCAL = 0, + LANGUAGE_TRADEBAND = 1, + LANGUAGE_GUTTER = 1, + LANGUAGE_SCHECHI = 1, + LANGUAGE_EAL = 1, + LANGUAGE_SIGN = 0 + ) + +/obj/item/weapon/robot_module/robot/clerical/butler + sprites = list( + "M-USE NanoTrasen" = "robotServ", + "Cabeiri" = "eyebot-standard", + "CUPCAKE" = "Noble-SRV", + "Haruka" = "marinaSV", + "Michiru" = "maidbot", + "Usagi" = "tallgreen", + "Telemachus" = "toiletbot", + "WTOperator" = "sleekservice", + "WTOmni" = "omoikane", + "XI-GUS" = "spider", + "XI-ALP" = "heavyServ", + "Standard" = "Service2", + "Waitress" = "Service", + "Bro" = "Brobot", + "Rich" = "maximillion", + "Drone - Service" = "drone-service", + "Drone - Hydro" = "drone-hydro" + ) + +/obj/item/weapon/robot_module/robot/clerical/butler/New() + ..() + src.modules += new /obj/item/weapon/gripper/service(src) + src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src) + src.modules += new /obj/item/weapon/material/minihoe(src) + src.modules += new /obj/item/weapon/material/hatchet(src) + src.modules += new /obj/item/device/analyzer/plant_analyzer(src) + src.modules += new /obj/item/weapon/storage/bag/plants(src) + src.modules += new /obj/item/weapon/robot_harvester(src) + src.modules += new /obj/item/weapon/material/knife(src) + src.modules += new /obj/item/weapon/material/kitchen/rollingpin(src) + src.modules += new /obj/item/device/multitool(src) //to freeze trays + + var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) + M.stored_matter = 30 + src.modules += M + + src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src) + + var/obj/item/weapon/flame/lighter/zippo/L = new /obj/item/weapon/flame/lighter/zippo(src) + L.lit = 1 + src.modules += L + + src.modules += new /obj/item/weapon/tray/robotray(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src) + src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src) + + var/datum/reagents/R = new/datum/reagents(50) + src.emag.reagents = R + R.my_atom = src.emag + R.add_reagent("beer2", 50) + src.emag.name = "Mickey Finn's Special Brew" + +/obj/item/weapon/robot_module/robot/clerical/general + name = "clerical robot module" + sprites = list( + "M-USE NanoTrasen" = "robotCler", + "Cabeiri" = "eyebot-standard", + "CUPCAKE" = "Noble-SRV", + "Haruka" = "marinaSV", + "Usagi" = "tallgreen", + "Telemachus" = "toiletbot", + "WTOperator" = "sleekclerical", + "WTOmni" = "omoikane", + "XI-GUS" = "spidercom", + "XI-ALP" = "heavyServ", + "Waitress" = "Service", + "Bro" = "Brobot", + "Rich" = "maximillion", + "Default" = "Service2", + "Drone" = "drone-blu" + ) + +/obj/item/weapon/robot_module/robot/clerical/general/New() + ..() + src.modules += new /obj/item/weapon/pen/robopen(src) + src.modules += new /obj/item/weapon/form_printer(src) + src.modules += new /obj/item/weapon/gripper/paperwork(src) + src.modules += new /obj/item/weapon/hand_labeler(src) + src.modules += new /obj/item/weapon/stamp(src) + src.modules += new /obj/item/weapon/stamp/denied(src) + src.emag = new /obj/item/weapon/stamp/chameleon(src) + src.emag = new /obj/item/weapon/pen/chameleon(src) + +/obj/item/weapon/robot_module/general/butler/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules + E.reagents.add_reagent("enzyme", 2 * amount) + if(src.emag) + var/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer/B = src.emag + B.reagents.add_reagent("beer2", 2 * amount) + +/obj/item/weapon/robot_module/robot/miner + name = "miner robot module" + channels = list("Supply" = 1) + networks = list(NETWORK_MINE) + sprites = list( + "NM-USE NanoTrasen" = "robotMine", + "Cabeiri" = "eyebot-miner", + "CUPCAKE" = "Noble-DIG", + "Haruka" = "marinaMN", + "Telemachus" = "toiletbotminer", + "WTOperator" = "sleekminer", + "XI-GUS" = "spidermining", + "XI-ALP" = "heavyMiner", + "Basic" = "Miner_old", + "Advanced Droid" = "droid-miner", + "Treadhead" = "Miner", + "Drone" = "drone-miner" + ) + +/obj/item/weapon/robot_module/robot/miner/New() + ..() + src.modules += new /obj/item/borg/sight/material(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/weapon/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/storage/bag/ore(src) + src.modules += new /obj/item/weapon/pickaxe/borgdrill(src) + src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) + src.modules += new /obj/item/weapon/gripper/miner(src) + src.modules += new /obj/item/weapon/mining_scanner(src) + src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) + src.emag = new /obj/item/weapon/pickaxe/diamonddrill(src) + +/obj/item/weapon/robot_module/robot/research + name = "research module" + channels = list("Science" = 1) + sprites = list( + "L'Ouef" = "peaceborg", + "Cabeiri" = "eyebot-science", + "Haruka" = "marinaSCI", + "WTDove" = "whitespider", + "WTOperator" = "sleekscience", + "Droid" = "droid-science", + "Drone" = "drone-science", + "Handy" = "handy-science" + ) + +/obj/item/weapon/robot_module/robot/research/New() + ..() + src.modules += new /obj/item/weapon/portable_destructive_analyzer(src) + src.modules += new /obj/item/weapon/gripper/research(src) + src.modules += new /obj/item/weapon/gripper/no_use/organ/robotics(src) + src.modules += new /obj/item/weapon/gripper/no_use/mech(src) + src.modules += new /obj/item/weapon/gripper/no_use/loader(src) + src.modules += new /obj/item/device/robotanalyzer(src) + src.modules += new /obj/item/weapon/card/robot(src) + src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) + src.modules += new /obj/item/weapon/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/weapon/wirecutters/cyborg(src) + src.modules += new /obj/item/device/multitool(src) + src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src) + src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src) + src.modules += new /obj/item/weapon/reagent_containers/syringe(src) + src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) + src.modules += new /obj/item/weapon/storage/part_replacer(src) + src.modules += new /obj/item/weapon/shockpaddles/robot/jumper(src) + src.modules += new /obj/item/weapon/melee/baton/slime/robot(src) + src.modules += new /obj/item/weapon/gun/energy/taser/xeno/robot(src) + src.emag = new /obj/item/weapon/hand_tele(src) + + var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000) + synths += nanite + var/datum/matter_synth/wire = new /datum/matter_synth/wire() //Added to allow repairs, would rather add cable now than be asked to add it later, + synths += wire //Cable code, taken from engiborg, + + var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) + N.uses_charge = 1 + N.charge_costs = list(1000) + N.synths = list(nanite) + src.modules += N + + var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) //Cable code, taken from engiborg, + C.synths = list(wire) + src.modules += C + +/obj/item/weapon/robot_module/robot/security/combat + name = "combat robot module" + hide_on_manifest = 1 + sprites = list( + "Haruka" = "marinaCB", + "Combat Android" = "droid-combat" + ) + +/obj/item/weapon/robot_module/robot/security/combat/New() + ..() + src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/borg/sight/thermal(src) + src.modules += new /obj/item/weapon/gun/energy/laser/mounted(src) + src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) + src.modules += new /obj/item/borg/combat/shield(src) + src.modules += new /obj/item/borg/combat/mobility(src) + src.emag = new /obj/item/weapon/gun/energy/lasercannon/mounted(src) + + +/* Drones */ + +/obj/item/weapon/robot_module/drone + name = "drone module" + hide_on_manifest = 1 + no_slip = 1 + networks = list(NETWORK_ENGINEERING) + +/obj/item/weapon/robot_module/drone/New(var/mob/living/silicon/robot/robot) + ..() + src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) + src.modules += new /obj/item/weapon/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/wrench/cyborg(src) + src.modules += new /obj/item/weapon/crowbar/cyborg(src) + src.modules += new /obj/item/weapon/wirecutters/cyborg(src) + src.modules += new /obj/item/device/multitool(src) + src.modules += new /obj/item/device/lightreplacer(src) + src.modules += new /obj/item/weapon/gripper(src) + src.modules += new /obj/item/weapon/soap(src) + src.modules += new /obj/item/weapon/gripper/no_use/loader(src) + src.modules += new /obj/item/weapon/extinguisher(src) + src.modules += new /obj/item/device/pipe_painter(src) + src.modules += new /obj/item/device/floor_painter(src) + + robot.internals = new/obj/item/weapon/tank/jetpack/carbondioxide(src) + src.modules += robot.internals + + src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) + src.emag.name = "Plasma Cutter" + + var/datum/matter_synth/metal = new /datum/matter_synth/metal(25000) + var/datum/matter_synth/glass = new /datum/matter_synth/glass(25000) + var/datum/matter_synth/wood = new /datum/matter_synth/wood(25000) + var/datum/matter_synth/plastic = new /datum/matter_synth/plastic(25000) + var/datum/matter_synth/wire = new /datum/matter_synth/wire(30) + synths += metal + synths += glass + synths += wood + synths += plastic + synths += wire + + var/obj/item/weapon/matter_decompiler/MD = new /obj/item/weapon/matter_decompiler(src) + MD.metal = metal + MD.glass = glass + MD.wood = wood + MD.plastic = plastic + src.modules += MD + + var/obj/item/stack/material/cyborg/steel/M = new (src) + M.synths = list(metal) + src.modules += M + + var/obj/item/stack/material/cyborg/glass/G = new (src) + G.synths = list(glass) + src.modules += G + + var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + R.synths = list(metal) + src.modules += R + + var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + C.synths = list(wire) + src.modules += C + + var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) + S.synths = list(metal) + src.modules += S + + var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) + RG.synths = list(metal, glass) + src.modules += RG + + var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) + WT.synths = list(wood) + src.modules += WT + + var/obj/item/stack/material/cyborg/wood/W = new (src) + W.synths = list(wood) + src.modules += W + + var/obj/item/stack/material/cyborg/plastic/P = new (src) + P.synths = list(plastic) + src.modules += P + +/obj/item/weapon/robot_module/drone/construction + name = "construction drone module" + hide_on_manifest = 1 + channels = list("Engineering" = 1) + languages = list() + +/obj/item/weapon/robot_module/drone/construction/New() + ..() + src.modules += new /obj/item/weapon/rcd/borg(src) + +/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + var/obj/item/device/lightreplacer/LR = locate() in src.modules + LR.Charge(R, amount) + ..() return \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm new file mode 100644 index 00000000000..2def8149ffd --- /dev/null +++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm @@ -0,0 +1,45 @@ +/* Syndicate modules */ + +/obj/item/weapon/robot_module/robot/syndicate + name = "illegal robot module" + hide_on_manifest = 1 + languages = list( + LANGUAGE_SOL_COMMON = 1, + LANGUAGE_TRADEBAND = 1, + LANGUAGE_UNATHI = 0, + LANGUAGE_SIIK = 0, + LANGUAGE_SKRELLIAN = 0, + LANGUAGE_ROOTLOCAL = 0, + LANGUAGE_GUTTER = 1, + LANGUAGE_SCHECHI = 0, + LANGUAGE_EAL = 1, + LANGUAGE_SIGN = 0 + ) + sprites = list( + "Cerberus" = "syndie_bloodhound", + "Cerberus - Treaded" = "syndie_treadhound", + "Ares" = "squats", + "Telemachus" = "toiletbotantag", + "WTOperator" = "hosborg", + "XI-GUS" = "spidersyndi", + "XI-ALP" = "syndi-heavy" + ) + var/id + +/obj/item/weapon/robot_module/robot/syndicate/New(var/mob/living/silicon/robot/R) + ..() + loc = R + src.modules += new /obj/item/weapon/melee/energy/sword(src) + src.modules += new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(src) + src.modules += new /obj/item/weapon/card/emag(src) + var/jetpack = new/obj/item/weapon/tank/jetpack/carbondioxide(src) + src.modules += jetpack + R.internals = jetpack + + id = R.idcard + src.modules += id + +/obj/item/weapon/robot_module/robot/syndicate/Destroy() + src.modules -= id + id = null + return ..() diff --git a/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm b/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm new file mode 100644 index 00000000000..9cc09b286a9 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm @@ -0,0 +1,25 @@ +/mob/living/silicon/robot/gravekeeper + lawupdate = 0 + scrambledcodes = 1 + icon_state = "drone-lost" + modtype = "Gravekeeper" + lawchannel = "State" + braintype = "Drone" + idcard_type = /obj/item/weapon/card/id + +/mob/living/silicon/robot/gravekeeper/init() + aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) + + mmi = new /obj/item/device/mmi/digital/robot(src) // Explicitly a drone. + module = new /obj/item/weapon/robot_module/robot/gravekeeper(src) + overlays.Cut() + init_id() + + updatename("Gravekeeper") + + if(!cell) + cell = new /obj/item/weapon/cell/high(src) // 15k cell, as recharging stations are a lot more rare on the Surface. + + laws = new /datum/ai_laws/gravekeeper() + + playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 9dc1c3eedc5..92a8b3bdebc 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1059,6 +1059,13 @@ mob/proc/yank_out_object() /mob/proc/is_muzzled() return 0 +//Exploitable Info Update + +/mob/proc/amend_exploitable(var/obj/item/I) + var/obj/item/exploit_item = new I(src.loc) + exploit_addons |= exploit_item + var/exploitmsg = html_decode("\n" + "Has " + exploit_item.name + ".") + exploit_record += exploitmsg /client/proc/check_has_body_select() return mob && mob.hud_used && istype(mob.zone_sel, /obj/screen/zone_sel) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 427786ad41c..e296db2ab9c 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -72,6 +72,7 @@ var/sec_record = "" var/gen_record = "" var/exploit_record = "" + var/exploit_addons = list() //Assorted things that show up at the end of the exploit_record list var/blinded = null var/bhunger = 0 //Carbon var/ajourn = 0 diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index fea09819bd1..c49c76be01c 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -3460,7 +3460,7 @@ /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks name = "\improper SkrellSnax" - desc = "Cured fungus shipped all the way from Jargon 4, almost like jerky! Almost." + desc = "Cured fungus shipped all the way from Qerr'balak, almost like jerky! Almost." icon_state = "skrellsnacks" filling_color = "#A66829" center_of_mass = list("x"=15, "y"=12) @@ -3495,4 +3495,4 @@ /obj/item/weapon/reagent_containers/food/snacks/croissant/New() ..() - bitesize = 2 \ No newline at end of file + bitesize = 2 diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index cb36f6e3b4c..d32d479e3fb 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index b3c82552d44..84117e2754c 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm index f7a9f84c3c7..571e78dc1f3 100644 --- a/maps/southern_cross/southern_cross-1.dmm +++ b/maps/southern_cross/southern_cross-1.dmm @@ -5382,7 +5382,7 @@ "bZz" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/robotics) "bZA" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor/plating,/area/maintenance/robotics) "bZB" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/robotics) -"bZC" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 2; id = "mining_storage"; name = "Mining Storage"},/turf/simulated/floor/tiled/dark,/area/assembly/chargebay) +"bZC" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 2; id = "Skynet_launch"; name = "Mining Storage"},/turf/simulated/floor/tiled/dark,/area/assembly/chargebay) "bZD" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/research_medical) "bZE" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/research_medical) "bZF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/research_medical) @@ -10110,6 +10110,7 @@ "dMv" = (/obj/machinery/hologram/holopad,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station) "dMw" = (/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/shuttle/shuttle2/arrivals_dock) "dMx" = (/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/shuttle/response_ship/thirddeck) +"dMy" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 2; id = "Skynet_launch"; name = "Mech Bay"},/turf/simulated/floor/tiled/dark,/area/assembly/chargebay) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10493,7 +10494,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvyaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabFVbOobFVbOobFVbOobFVbOobFVbOobFVbOoaadbTwbTxbTybTzbTAbTBbTCbTAbRZbTDbTEbTFbwObTGbTHbTGbysbTIbTJbLcbTKbOybOybTLbSjbOybOybTMbLgbTNbTObTPbTQbTRbTSbMYbJXbAhbAhbNbbTTbTUbLsbLsbLsbLsbTVbNjbTWbNjbTXbNjbNjbNjbpJbtybxBbTYbpJaaaaaabGKbTZbUabUbbUcbUdbUebUfbUgbUhbUibRbbUjbUjbUkbUlbRibUmbUnbUobUobUpbUqbUrbRibUsbUtbUubSTbUvbDNaaaaaabrybPsbzcbrybKrbUwbUxbUybUybUzbUAbUBbUCbUDbUEbUFbUGbUHbUIbUIbUIbUJbUKbULbUMbUNbUObTlbUPbUQbURbUSbKBbUTbUUbUVbKBbUWbUXbUYbKEbMubMvbUZbVabVbbVcbVdbVebVfbVgbVhbVibVjbVkbVkbVjbVjbVjbVjbVjaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabQdbQebQfbQebQfbQebQfbQebQfbQebQfbQebQgbVlbOqbVmbTCbTAbTBbTCbTAbRZbVnbVobVobVobVobVobVobVobVpbVqbLcbVrbVsbVtbVubVvbVwbVxbVybLgbLgbVzbLgbVAbVBbLgbVCbJXbAhbAhbVDbLqbVEbVFbVGbVHbVIbVJbNjbVKbNjbVLbNjbVMbVNbVObtybxBbtybpJaaaaaabGKbVPbVQbPgbVRbVSbVTbVUbVVbVWbVXbVYbVZbWabWbbWcbRibWdbWebWfbWgbWhbUqbWibWjbWkbWlbWmbWnbWobDNaaaaaabrybPsbWpbWqbKrbKrbWrbWsbWtbWubPAbWvbWwbWxbWybWzbWAbWBbWCbWDbWEbWFbUKbWGbWHbWIbWJbTlbKBbWKbKBbKBbKBbKBbKBbKBbKBbKEbKEbKEbKEbWLbWMbUZbWNbWObWPbWQbWRbWSbVebVhbVhbVjbWTbWUbWVbVjbWWbWXbVjbVjaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbQdbWYbWZbWYbWZbWYbWZbWYbWZbWYbWZbWYbQgbXabOqbXbbTCbXcbXdbTCbXcbRZbXebVobXfbXgbXhbXibXjbVobSfbXkbVybVybVybVybVybVybVybVybVybXlbLgbLgbLgbLgbLgbLgbXmbXnbyHbXobXmbXpbXpbXpbXpbXpbXpbXpbXqbXqbXqbXqbNjbXrbXsbpJbXtbXubXvbpJaaaaaabGKbXwbXxbLEbXybXzbRbbRbbRbbRbbRbbRbbXAbXBbXBbXCbRibRibRibRibRibXDbUqbXEbRibIGbWlbWmbWnbXFbDNaaaaaabrybXGbsIbsIbXHbKrbKrbKrbKrbKrbKrbXIbXJbXKbXJbXIbKybKybKybKybKybKybTlbXLbXMbXMbXNbTlbXObXObXObXPbXQbXRbXSbXTbXUbXVbXWbsTbXXbXYbXZbYabYbbYcbYdbWQbWRbYebVebYfbVhbYgbYhbYibYjbVkbYkbYibYlbVjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabHJbYmbHJbYmbHJbYmbHJbYmbHJbYmbHJbYmaafaafbOqbYnbYobYpbYqbYrbYsbYtbYubYvbYwbYxbYybYzbYAbYBbSfbYCbYDbYEbYFbYGbYHbYHbYHbYHbYHbYHbYHbYHbYHbYIbYJbYKbYLbYMbYNbYNbYObpJbYPbYPbYQbyVbYRbtybwfbwfbqSbqTbpJbYSbpJbpJbtybxBbYTbpJaaaaaabGJbYUbXxbLEbYVbYWbYXbYYbYZbZabZbbZcbZdbZebZebZfbZebZebZebZgbZhbZibZjbZkbRibIGbZlbLKbWnbSUbGLaaaaaabrybZmbZnbZnbZnbZobZpbsIbZqbZrbrybZsbZtbZubZtbZvbZwbZxbZybZzbZAbZBbTlbTlbZCbZCbTlbTlbZDbZEbZEbZFbZGbZHbZIbZIbZIbXRbZJbsTbZKbZLbJnbZMbZNbZObZPbWQbWRbWRbYebYebVhbVjbZQbZRbZSbZTbZUbZVbZWbZXbZYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabHJbYmbHJbYmbHJbYmbHJbYmbHJbYmbHJbYmaafaafbOqbYnbYobYpbYqbYrbYsbYtbYubYvbYwbYxbYybYzbYAbYBbSfbYCbYDbYEbYFbYGbYHbYHbYHbYHbYHbYHbYHbYHbYHbYIbYJbYKbYLbYMbYNbYNbYObpJbYPbYPbYQbyVbYRbtybwfbwfbqSbqTbpJbYSbpJbpJbtybxBbYTbpJaaaaaabGJbYUbXxbLEbYVbYWbYXbYYbYZbZabZbbZcbZdbZebZebZfbZebZebZebZgbZhbZibZjbZkbRibIGbZlbLKbWnbSUbGLaaaaaabrybZmbZnbZnbZnbZobZpbsIbZqbZrbrybZsbZtbZubZtbZvbZwbZxbZybZzbZAbZBbTlbTlbZCdMybTlbTlbZDbZEbZEbZFbZGbZHbZIbZIbZIbXRbZJbsTbZKbZLbJnbZMbZNbZObZPbWQbWRbWRbYebYebVhbVjbZQbZRbZSbZTbZUbZVbZWbZXbZYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOqbZZcaacabcaccadcaebRZcafbVobVobVobVocagcahcaicajcakcalcalcamcancaocaocaocaocaocaocaobYKbYKbYKcapcaqcarcascatcaucavcawcaxcaycaxcaxcaxcaxcaxcazcazcazcazcaAcazcazcazcaBcaCbpJbGKbGKbGJcaDbXxbLEbXycaEcaFcaGcaGcaHbZbcaIbRfbRfbRfbRfbRfbRfbRfcaIbRjcaJcaKcaLbRicaMbZlbIGcaNcaObGLcaPcaPbrybPsbsIbzcbxMbxNcaQbsIcaRbsIcaScaTcaUcaVcaUcaTcaWbZxcaXcaYcaZcbacbbcbccbdcaUcbecbecbfbXPbXPbXPbXPbXPbXPbXPbZIbXRcbgbsTcbhcbicbjbUZcbkcblcbmbWQbWRbYecbncbobVhbVjcbpcbqcbrbVjbVkcbsbVkbVjbVjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOpbOqcbtcbtbOqcbucbvcbwbRZcbxcbycbzcbAcbBcbCcbDcbEcbFcbGcbHcbIcbJcbKcaocbLcbLcbLcbLcbLcbMcbNcbObYKcbPcbQcbRcbScbTcbUcbVbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJcbWcbXcbYcbZbGJccaccbcccccdccecaFcaFccfccgbZbcchbRfccicciccicciccibRfccjbRicckcclbRibRiccmccnccmccoccpccqccrccscctccubqtbrybrybrybrybrybrybrybryccvccwccxccyccvbZwbZwbZwcczbZwbZwbZwbZwccAccBcbeccCccDccEccFccFccFccFccFbXPbXRbXRbVibsTccGbsTbsTbUZccHbUZbUZbWQbVhbVibVjbVjbVjbVjccIcbqccJccKccLccMccNccObVjbVjaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccPbOqccQccRccSccTccUccVccWccXccYccZcdacdbcdccddcdecdfcdgcdhcdicalcdjcdkcaocbLcbLcbLcbLcbLcdlcdmcbTcdncdocdpcdpcdqcbTcdocdpcdrcdscbTcdocdtcducdvcdwcdxcdycdpcdzcdAcdBcbTcdncdCcdDcdEcdFcdGcdHbPgbPgcdIcdJcdKcdLcaFbZbbZbbZbbXAbRfccicciccicciccibRfcaIbRibRibRibRiccrcdMcdNcdOcdOcdOcdPcdQcdRcdScdTcdUcdVcdWcdXcdYcdZceacebcdYcdYcdZceccedceeceecefcegcehceeceicejcekccAccBcelccBcemcenccFccFccFccFccFbXPceobXRcepceqcercesbVicetceucevcewbVecexceybVjcezceAbVjceBcbqbYibYibYicbqbYiceCceDbVkaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/submaps/cave_submaps/cave.dm b/maps/submaps/cave_submaps/cave.dm index d30004887f4..b2619b00212 100644 --- a/maps/submaps/cave_submaps/cave.dm +++ b/maps/submaps/cave_submaps/cave.dm @@ -7,4 +7,9 @@ /datum/map_template/cave/deadBeacon name = "Abandoned Relay" desc = "An unregistered comms relay, abandoned to the elements." - mappath = 'maps/submaps/cave_submaps/deadBeacon.dmm' \ No newline at end of file + mappath = 'maps/submaps/cave_submaps/deadBeacon.dmm' + +/datum/map_template/cave/prepper1 + name = "Prepper Bunker" + desc = "A little hideaway for someone with more time and money than sense." + mappath = 'maps/submaps/cave_submaps/prepper1.dmm' \ No newline at end of file diff --git a/maps/submaps/cave_submaps/cave_areas.dm b/maps/submaps/cave_submaps/cave_areas.dm index 7c80c66ec10..e25ffbc1df1 100644 --- a/maps/submaps/cave_submaps/cave_areas.dm +++ b/maps/submaps/cave_submaps/cave_areas.dm @@ -3,4 +3,7 @@ icon_state = "submap" /area/submap/cave/deadBeacon - name = "abandoned relay" \ No newline at end of file + name = "abandoned relay" + +/area/submap/cave/prepper1 + name = "Prepper Bunker" \ No newline at end of file diff --git a/maps/submaps/cave_submaps/prepper1.dmm b/maps/submaps/cave_submaps/prepper1.dmm new file mode 100644 index 00000000000..2e9f7a24d4b --- /dev/null +++ b/maps/submaps/cave_submaps/prepper1.dmm @@ -0,0 +1,33 @@ +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/turf/simulated/wall/r_wall,/area/submap/cave/prepper1) +"c" = (/obj/structure/table/steel,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/item/stack/rods,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"d" = (/obj/structure/table/steel,/obj/random/maintenance/security,/obj/item/stack/cable_coil/random,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"e" = (/obj/structure/table/steel,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"f" = (/obj/structure/table/steel,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"g" = (/obj/structure/table/steel,/obj/item/weapon/storage/box/glasses,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"h" = (/obj/structure/table/steel,/obj/random/toolbox,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"i" = (/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"j" = (/obj/structure/table/steel,/obj/item/weapon/tape_roll,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"k" = (/obj/structure/table/steel,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/item/stack/tile/floor/steel,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"l" = (/obj/structure/inflatable/door,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"m" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"n" = (/obj/structure/closet/crate/freezer/rations,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"o" = (/obj/structure/reagent_dispensers/water_cooler/full,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"p" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"q" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency/oxygen/engi,/obj/item/weapon/tank/emergency/oxygen/engi,/obj/item/clothing/mask/gas,/obj/item/clothing/suit/armor/material/makeshift,/obj/item/clothing/head/helmet/bucket,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"r" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"s" = (/obj/structure/table/steel,/obj/item/device/flashlight/lantern,/turf/simulated/floor/plating,/area/submap/cave/prepper1) +"t" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever,/obj/item/ammo_magazine/clip/c762,/obj/item/ammo_magazine/clip/c762,/turf/simulated/floor/plating,/area/submap/cave/prepper1) + +(1,1,1) = {" +aaaaaaaaaa +aabbbbbbaa +abbcdefbba +abghiijkba +aliiiiimba +aliiiiinba +aboiiipnba +abbqrstbba +aabbbbbbaa +aaaaaaaaaa +"} diff --git a/polaris.dme b/polaris.dme index 020ac0f25a0..5d75d04f789 100644 --- a/polaris.dme +++ b/polaris.dme @@ -966,7 +966,6 @@ #include "code\game\objects\structures\electricchair.dm" #include "code\game\objects\structures\extinguisher.dm" #include "code\game\objects\structures\flora.dm" -#include "code\game\objects\structures\ghost_pods.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\gravemarker.dm" #include "code\game\objects\structures\grille.dm" @@ -1019,6 +1018,8 @@ #include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" #include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" +#include "code\game\objects\structures\ghost_pods\ghost_pods.dm" +#include "code\game\objects\structures\ghost_pods\silicon.dm" #include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" #include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" #include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" @@ -1396,6 +1397,7 @@ #include "code\modules\examine\descriptions\containers.dm" #include "code\modules\examine\descriptions\devices.dm" #include "code\modules\examine\descriptions\engineering.dm" +#include "code\modules\examine\descriptions\food.dm" #include "code\modules\examine\descriptions\machines.dm" #include "code\modules\examine\descriptions\medical.dm" #include "code\modules\examine\descriptions\mobs.dm" @@ -1730,7 +1732,6 @@ #include "code\modules\mob\living\silicon\robot\robot.dm" #include "code\modules\mob\living\silicon\robot\robot_damage.dm" #include "code\modules\mob\living\silicon\robot\robot_items.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm" #include "code\modules\mob\living\silicon\robot\syndicate.dm" #include "code\modules\mob\living\silicon\robot\drone\drone.dm" @@ -1740,6 +1741,10 @@ #include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\event.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\station.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\gravekeeper.dm" #include "code\modules\mob\living\silicon\robot\subtypes\lost_drone.dm" #include "code\modules\mob\living\simple_animal\corpse.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm"