diff --git a/code/controllers/Processes/supply.dm b/code/controllers/Processes/supply.dm index 640b99121f..b2b9951cb6 100644 --- a/code/controllers/Processes/supply.dm +++ b/code/controllers/Processes/supply.dm @@ -224,9 +224,13 @@ var/datum/controller/supply/supply_controller = new() if(SP.access) if(isnum(SP.access)) A.req_access = list(SP.access) - else if(islist(SP.access)) + else if(islist(SP.access) && SP.one_access) var/list/L = SP.access // access var is a plain var, we need a list - A.req_one_access = L.Copy() //VOREStation Edit: Lets make sense + A.req_one_access = L.Copy() + A.req_access.Cut() + else if(islist(SP.access) && !SP.one_access) + var/list/L = SP.access + A.req_access = L.Copy() else log_debug("Supply pack with invalid access restriction [SP.access] encountered!") diff --git a/code/datums/supplypacks/hydroponics_vr.dm b/code/datums/supplypacks/hydroponics_vr.dm index 9ccbdf2d9e..c4003097a7 100644 --- a/code/datums/supplypacks/hydroponics_vr.dm +++ b/code/datums/supplypacks/hydroponics_vr.dm @@ -38,3 +38,14 @@ cost = 60 //considering a corgi crate is 50, and you get two fennecs containertype = /obj/structure/largecrate/animal/fennec containername = "Fennec crate" + +/datum/supply_pack/hydro/fish + name = "Fish supply crate" + contains = list( + /obj/item/weapon/reagent_containers/food/snacks/lobster = 6, + /obj/item/weapon/reagent_containers/food/snacks/cuttlefish = 8, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfish = 1 + ) + cost = 20 + containertype = /obj/structure/closet/crate/freezer + containername = "Fish crate" \ No newline at end of file diff --git a/code/datums/supplypacks/supplypacks.dm b/code/datums/supplypacks/supplypacks.dm index d29f03be6f..d419198af3 100644 --- a/code/datums/supplypacks/supplypacks.dm +++ b/code/datums/supplypacks/supplypacks.dm @@ -33,6 +33,7 @@ var/list/all_supply_groups = list("Atmospherics", var/containertype = null var/containername = null var/access = null + var/one_access = FALSE var/contraband = 0 var/num_contained = 0 //number of items picked to be contained in a /randomised crate var/group = "Miscellaneous" diff --git a/code/game/objects/items/trash_vr.dm b/code/game/objects/items/trash_vr.dm index a738179c7f..43cadda3f7 100644 --- a/code/game/objects/items/trash_vr.dm +++ b/code/game/objects/items/trash_vr.dm @@ -29,4 +29,9 @@ /obj/item/trash/liquidprotein name = "\improper \"LiquidProtein\" ration" icon = 'icons/obj/trash_vr.dmi' - icon_state = "liquidprotein" \ No newline at end of file + icon_state = "liquidprotein" + +/obj/item/trash/fancyplate + name = "dirty fancy plate" + icon = 'icons/obj/trash_vr.dmi' + icon_state = "fancyplate" diff --git a/code/game/objects/structures/props/puzzledoor.dm b/code/game/objects/structures/props/puzzledoor.dm index 70d6508202..f5ec2fe7cb 100644 --- a/code/game/objects/structures/props/puzzledoor.dm +++ b/code/game/objects/structures/props/puzzledoor.dm @@ -18,13 +18,17 @@ var/checkrange_mult = 1 /obj/machinery/door/blast/puzzle/proc/check_locks() + if(!locks || locks.len <= 0) // Puzzle doors with no locks will only listen to boring buttons. + return 0 + for(var/obj/structure/prop/lock/L in locks) if(!L.enabled) return 0 return 1 /obj/machinery/door/blast/puzzle/bullet_act(var/obj/item/projectile/Proj) - visible_message("\The [src] is completely unaffected by \the [Proj].") + if(!istype(Proj, /obj/item/projectile/test)) + visible_message("\The [src] is completely unaffected by \the [Proj].") qdel(Proj) //No piercing. No. /obj/machinery/door/blast/puzzle/ex_act(severity) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 3a3713127a..5957005b89 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -1065,7 +1065,7 @@ var/list/admin_verbs_event_manager = list( if(alert("Are you sure you want to tell them to man up?","Confirmation","Deal with it","No")=="No") return T << "Man up and deal with it." - T << "Move on." + T << "Move along." log_admin("[key_name(usr)] told [key_name(T)] to man up and deal with it.") message_admins("[key_name_admin(usr)] told [key_name(T)] to man up and deal with it.", 1) @@ -1078,7 +1078,7 @@ var/list/admin_verbs_event_manager = list( if(alert("Are you sure you want to tell the whole server up?","Confirmation","Deal with it","No")=="No") return for (var/mob/T as mob in mob_list) - T << "
Man up.
Deal with it.

Move on.

" + T << "
Man up.
Deal with it.

Move along.

" T << 'sound/voice/ManUp1.ogg' log_admin("[key_name(usr)] told everyone to man up and deal with it.") diff --git a/code/modules/clothing/head/helmet_vr.dm b/code/modules/clothing/head/helmet_vr.dm index 8f7ec139ca..edb2d9482a 100644 --- a/code/modules/clothing/head/helmet_vr.dm +++ b/code/modules/clothing/head/helmet_vr.dm @@ -26,4 +26,4 @@ desc = "Vendi, vidi, visa; I came, I saw, I realised this hat was too expensive." icon_state = "ge_helmcent" icon = 'icons/obj/clothing/hats_vr.dmi' - icon_override = 'icons/mob/head_vr.dmi' \ No newline at end of file + icon_override = 'icons/mob/head_vr.dmi' diff --git a/code/modules/clothing/head/misc_vr.dm b/code/modules/clothing/head/misc_vr.dm new file mode 100644 index 0000000000..82cae35465 --- /dev/null +++ b/code/modules/clothing/head/misc_vr.dm @@ -0,0 +1,7 @@ +/obj/item/clothing/head/fish + name = "fish skull" + desc = "You... you're not actually going to wear that, right?" + icon_state = "fishskull" + icon = 'icons/obj/clothing/hats_vr.dmi' + icon_override = 'icons/mob/head_vr.dmi' + flags_inv = HIDEEARS|BLOCKHAIR diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm index 6b08a2ac00..33539575a1 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm @@ -35,13 +35,13 @@ ) /obj/item/clothing/head/helmet/space/rig - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE) /obj/item/clothing/gloves/gauntlets/rig - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE) /obj/item/clothing/shoes/magboots/rig - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE) /obj/item/clothing/suit/space/rig - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE) diff --git a/code/modules/food/food/snacks_vr.dm b/code/modules/food/food/snacks_vr.dm index 52f3752095..0321ca41bb 100644 --- a/code/modules/food/food/snacks_vr.dm +++ b/code/modules/food/food/snacks_vr.dm @@ -277,6 +277,113 @@ reagents.add_reagent("shockchem", 6) bitesize = 7 +/obj/item/weapon/reagent_containers/food/snacks/lobster + name = "raw lobster" + desc = "a shifty lobster. You can try eating it, but its shell is extremely tough." + icon = 'icons/obj/food_vr.dmi' + icon_state = "lobster_raw" + nutriment_amt = 5 + +/obj/item/weapon/reagent_containers/food/snacks/lobster/Initialize() + ..() + bitesize = 0.1 + +/obj/item/weapon/reagent_containers/food/snacks/lobstercooked + name = "cooked lobster" + desc = "a luxurious plate of cooked lobster, its taste accentuated by lemon juice. Reinvigorating!" + icon = 'icons/obj/food_vr.dmi' + icon_state = "lobster_cooked" + trash = /obj/item/trash/plate + nutriment_amt = 20 + nutriment_desc = list("lemon" = 2, "lobster" = 5, "salad" = 2) + +/obj/item/weapon/reagent_containers/food/snacks/lobstercooked/Initialize() + ..() + bitesize = 5 + reagents.add_reagent("protein", 20) + reagents.add_reagent("tricordrazine", 5) + reagents.add_reagent("iron", 5) + +/obj/item/weapon/reagent_containers/food/snacks/cuttlefish + name = "raw cuttlefish" + desc = "it's an adorable squid! you can't possible be thinking about eating this right?" + icon = 'icons/obj/food_vr.dmi' + icon_state = "cuttlefish_raw" + nutriment_amt = 5 + +/obj/item/weapon/reagent_containers/food/snacks/cuttlefish/Initialize() + ..() + bitesize = 10 + +/obj/item/weapon/reagent_containers/food/snacks/cuttlefishcooked + name = "cooked cuttlefish" + desc = "it's a roasted cuttlefish. rubbery, squishy, an acquired taste." + icon = 'icons/obj/food_vr.dmi' + icon_state = "cuttlefish_cooked" + nutriment_amt = 20 + nutriment_desc = list("cuttlefish" = 5, "rubber" = 5, "grease" = 1) + +/obj/item/weapon/reagent_containers/food/snacks/cuttlefishcooked/Initialize() + ..() + bitesize = 5 + reagents.add_reagent("protein", 10) + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfish + name = "extra large monkfish" + desc = "it's a huge monkfish. better clean it first, you can't possibly eat it like this." + icon = 'icons/obj/food48x48_vr.dmi' + icon_state = "monkfish_raw" + nutriment_amt = 30 + w_class = ITEMSIZE_HUGE //Is that a monkfish in your pocket, or are you just happy to see me? + slice_path = /obj/item/weapon/reagent_containers/food/snacks/monkfishfillet + slices_num = 6 + trash = /obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfishremains + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfish/Initialize() + ..() + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/monkfishfillet + name = "monkfish fillet" + desc = "it's a fillet sliced from a monkfish." + icon = 'icons/obj/food_vr.dmi' + icon_state = "monkfish_fillet" + nutriment_amt = 5 + +/obj/item/weapon/reagent_containers/food/snacks/monkfishfillet/Initialize() + ..() + bitesize = 3 + reagents.add_reagent("protein", 1) + +/obj/item/weapon/reagent_containers/food/snacks/monkfishcooked + name = "seasoned monkfish" + desc = "a delicious slice of monkfish prepared with sweet chili and spring onion." + icon = 'icons/obj/food_vr.dmi' + icon_state = "monkfish_cooked" + nutriment_amt = 10 + nutriment_desc = list("fish" = 3, "oil" = 1, "sweet chili" = 3, "spring onion" = 2) + trash = /obj/item/trash/fancyplate + +/obj/item/weapon/reagent_containers/food/snacks/monkfishcooked/Initialize() + ..() + bitesize = 4 + reagents.add_reagent("protein", 5) + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfishremains + name = "monkfish remains" + icon = 'icons/obj/food_vr.dmi' + icon_state = "monkfish_remains" + desc = "the work of a madman." + w_class = ITEMSIZE_LARGE + nutriment_amt = 10 + slice_path = /obj/item/clothing/head/fish + slices_num = 1 + +/obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfishremains/Initialize() + ..() + bitesize = 0.01 //impossible to eat + reagents.add_reagent("carbon", 5) + /obj/item/weapon/reagent_containers/food/snacks/monkeycube/sobakacube name = "sobaka cube" monkey_type = "Sobaka" diff --git a/code/modules/food/recipes_microwave_vr.dm b/code/modules/food/recipes_microwave_vr.dm index f9aadda69d..bc375d0d70 100644 --- a/code/modules/food/recipes_microwave_vr.dm +++ b/code/modules/food/recipes_microwave_vr.dm @@ -153,6 +153,26 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/makaroni +/datum/recipe/lobster + fruit = list("lemon" = 1, "cabbage" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/lobster + ) + result = /obj/item/weapon/reagent_containers/food/snacks/lobstercooked + +/datum/recipe/cuttlefish + items = list( + /obj/item/weapon/reagent_containers/food/snacks/cuttlefish + ) + result = /obj/item/weapon/reagent_containers/food/snacks/cuttlefishcooked + +/datum/recipe/monkfish + fruit = list("chili" = 1, "onion" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/monkfishfillet + ) + result = /obj/item/weapon/reagent_containers/food/snacks/monkfishcooked + /datum/recipe/margheritapizzacargo reagents = list() items = list( diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index 0e35d6b2b0..4958d60794 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -204,8 +204,8 @@ else if((href_list["adj_threshold"]) && (!locked || issilicon(usr))) var/adjust_num = text2num(href_list["adj_threshold"]) heal_threshold += adjust_num - if(heal_threshold < 5) - heal_threshold = 5 + if(heal_threshold <= 0) + heal_threshold = 0.1 if(heal_threshold > 75) heal_threshold = 75 diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/consumption.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/consumption.dm index b997dde35d..84af3fcc3c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/consumption.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/consumption.dm @@ -1,7 +1,7 @@ // Handles hunger, starvation, growth, and eatting humans. // Might be best to make this a /mob/living proc and override. -/mob/living/simple_mob/slime/xenobio/proc/adjust_nutrition(input) +/mob/living/simple_mob/slime/xenobio/proc/adjust_nutrition(input, var/heal = 1) nutrition = between(0, nutrition + input, get_max_nutrition()) if(input > 0) @@ -12,11 +12,12 @@ adjustToxLoss(-10) // Heal 1 point of damage per 5 nutrition coming in. - adjustBruteLoss(-input * 0.2) - adjustFireLoss(-input * 0.2) - adjustToxLoss(-input * 0.2) - adjustOxyLoss(-input * 0.2) - adjustCloneLoss(-input * 0.2) + if(heal) + adjustBruteLoss(-input * 0.2) + adjustFireLoss(-input * 0.2) + adjustToxLoss(-input * 0.2) + adjustOxyLoss(-input * 0.2) + adjustCloneLoss(-input * 0.2) /mob/living/simple_mob/slime/xenobio/proc/get_max_nutrition() // Can't go above it diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm index cd8c840d1f..41eaccebc9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm @@ -1,784 +1,784 @@ -// Here are where all the other colors of slime live. -// They will generally fight each other if not Unified, meaning the xenobiologist has to seperate them. - -// Tier 1. - -/mob/living/simple_mob/slime/xenobio/purple - desc = "This slime is rather toxic to handle, as it is poisonous." - color = "#CC23FF" - slime_color = "purple" - coretype = /obj/item/slime_extract/purple - reagent_injected = "toxin" - - description_info = "This slime spreads a toxin when it attacks. A biosuit or other thick armor can protect from the toxic attack." - player_msg = "You inject a harmful toxin when attacking." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/dark_purple, - /mob/living/simple_mob/slime/xenobio/dark_blue, - /mob/living/simple_mob/slime/xenobio/green, - /mob/living/simple_mob/slime/xenobio - ) - -/mob/living/simple_mob/slime/xenobio/orange - desc = "This slime is known to be flammable and can ignite enemies." - color = "#FFA723" - slime_color = "orange" - coretype = /obj/item/slime_extract/orange - melee_damage_lower = 5 - melee_damage_upper = 5 - heat_resist = 1 - - description_info = "The slime is immune to burning attacks, and attacks from this slime will burn you, and can ignite you. \ - A firesuit can protect from the burning attacks of this slime." - player_msg = "You inflict burning attacks, which causes additional damage, makes the target more flammable, and has a chance to ignite them.
\ - You are also immune to burning attacks." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/dark_purple, - /mob/living/simple_mob/slime/xenobio/yellow, - /mob/living/simple_mob/slime/xenobio/red, - /mob/living/simple_mob/slime/xenobio - ) - -/mob/living/simple_mob/slime/xenobio/orange/apply_melee_effects(atom/A) - ..() - if(isliving(A)) - var/mob/living/L = A - L.inflict_heat_damage(is_adult ? 10 : 5) - to_chat(src, span("span", "You burn \the [L].")) - to_chat(L, span("danger", "You've been burned by \the [src]!")) - L.adjust_fire_stacks(1) - if(prob(12)) - L.IgniteMob() - -/mob/living/simple_mob/slime/xenobio/blue - desc = "This slime produces 'cryotoxin' and uses it against their foes. Very deadly to other slimes." - color = "#19FFFF" - slime_color = "blue" - coretype = /obj/item/slime_extract/blue - reagent_injected = "cryotoxin" - cold_resist = 0.50 // Not as strong as dark blue, which has immunity. - - description_info = "The slime is resistant to the cold, and attacks from this slime can inject cryotoxin into you. \ - A biosuit or other thick armor can protect from the injection." - player_msg = "You inject cryotoxin on attack, which causes them to get very cold, slowing them down and harming them over time.
\ - You are also resistant to cold attacks." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/dark_blue, - /mob/living/simple_mob/slime/xenobio/silver, - /mob/living/simple_mob/slime/xenobio/pink, - /mob/living/simple_mob/slime/xenobio - ) - - -/mob/living/simple_mob/slime/xenobio/metal - desc = "This slime is a lot more resilient than the others, due to having a metamorphic metallic and sloped surface." - color = "#5F5F5F" - slime_color = "metal" - shiny = TRUE - coretype = /obj/item/slime_extract/metal - - description_info = "This slime is a lot more durable and tough to damage than the others. It also seems to provoke others to attack it over others." - player_msg = "You are more resilient and armored than more slimes. Your attacks will also encourage less intelligent enemies to focus on you." - - maxHealth = 250 - maxHealth_adult = 350 - - // The sloped armor. - // It's resistant to most weapons (but a spraybottle still kills it rather fast). - armor = list( - "melee" = 25, - "bullet" = 25, - "laser" = 25, - "energy" = 50, - "bomb" = 80, - "bio" = 100, - "rad" = 100 - ) - - armor_soak = list( - "melee" = 5, - "bullet" = 5, - "laser" = 5, - "energy" = 0, - "bomb" = 0, - "bio" = 0, - "rad" = 0 - ) - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/silver, - /mob/living/simple_mob/slime/xenobio/yellow, - /mob/living/simple_mob/slime/xenobio/gold, - /mob/living/simple_mob/slime/xenobio - ) - -/mob/living/simple_mob/slime/xenobio/metal/apply_melee_effects(atom/A) - ..() - if(isliving(A)) - var/mob/living/L = A - L.taunt(src, TRUE) // We're the party tank now. - -// Tier 2 - -/mob/living/simple_mob/slime/xenobio/yellow - desc = "This slime is very conductive, and is known to use electricity as a means of defense moreso than usual for slimes." - color = "#FFF423" - slime_color = "yellow" - coretype = /obj/item/slime_extract/yellow - melee_damage_lower = 5 - melee_damage_upper = 5 - shock_resist = 1 - - projectiletype = /obj/item/projectile/beam/lightning/slime - projectilesound = 'sound/effects/lightningbolt.ogg' - glow_toggle = TRUE - - description_info = "In addition to being immune to electrical shocks, this slime will fire ranged lightning attacks at \ - enemies if they are at range, inflict shocks upon entities they attack, and generate electricity for their stun \ - attack faster than usual. Insulative or reflective armor can protect from these attacks." - player_msg = "You have a ranged electric attack. You also shock enemies you attack, and your electric stun attack charges passively.
\ - You are also immune to shocking attacks." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/bluespace, - /mob/living/simple_mob/slime/xenobio/bluespace, - /mob/living/simple_mob/slime/xenobio/metal, - /mob/living/simple_mob/slime/xenobio/orange - ) - -/mob/living/simple_mob/slime/xenobio/yellow/apply_melee_effects(atom/A) - ..() - if(isliving(A)) - var/mob/living/L = A - L.inflict_shock_damage(is_adult ? 10 : 5) - to_chat(src, span("span", "You shock \the [L].")) - to_chat(L, span("danger", "You've been shocked by \the [src]!")) - -/mob/living/simple_mob/slime/xenobio/yellow/handle_special() - if(stat == CONSCIOUS) - if(prob(25)) - power_charge = between(0, power_charge + 1, 10) - ..() - -/obj/item/projectile/beam/lightning/slime - power = 10 - fire_sound = 'sound/effects/lightningbolt.ogg' - - -/mob/living/simple_mob/slime/xenobio/dark_purple - desc = "This slime produces ever-coveted phoron. Risky to handle but very much worth it." - color = "#660088" - slime_color = "dark purple" - coretype = /obj/item/slime_extract/dark_purple - reagent_injected = "phoron" - - description_info = "This slime applies phoron to enemies it attacks. A biosuit or other thick armor can protect from the toxic attack. \ - If hit with a burning attack, it will erupt in flames." - player_msg = "You inject phoron into enemies you attack.
\ - You will erupt into flames if harmed by fire!" - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/purple, - /mob/living/simple_mob/slime/xenobio/orange, - /mob/living/simple_mob/slime/xenobio/ruby, - /mob/living/simple_mob/slime/xenobio/ruby - ) - -/mob/living/simple_mob/slime/xenobio/dark_purple/proc/ignite() - visible_message(span("critical", "\The [src] erupts in an inferno!")) - for(var/turf/simulated/target_turf in view(2, src)) - target_turf.assume_gas("phoron", 30, 1500+T0C) - spawn(0) - target_turf.hotspot_expose(1500+T0C, 400) - qdel(src) - -/mob/living/simple_mob/slime/xenobio/dark_purple/ex_act(severity) - log_and_message_admins("[src] ignited due to a chain reaction with an explosion.") - ignite() - -/mob/living/simple_mob/slime/xenobio/dark_purple/fire_act(datum/gas_mixture/air, temperature, volume) - log_and_message_admins("[src] ignited due to exposure to fire.") - ignite() - -/mob/living/simple_mob/slime/xenobio/dark_purple/bullet_act(var/obj/item/projectile/P, var/def_zone) - if(P.damage_type && P.damage_type == BURN && P.damage) // Most bullets won't trigger the explosion, as a mercy towards Security. - log_and_message_admins("[src] ignited due to bring hit by a burning projectile[P.firer ? " by [key_name(P.firer)]" : ""].") - ignite() - else - ..() - -/mob/living/simple_mob/slime/xenobio/dark_purple/attackby(var/obj/item/weapon/W, var/mob/user) - if(istype(W) && W.force && W.damtype == BURN) - log_and_message_admins("[src] ignited due to being hit with a burning weapon ([W]) by [key_name(user)].") - ignite() - else - ..() - - - -/mob/living/simple_mob/slime/xenobio/dark_blue - desc = "This slime makes other entities near it feel much colder, and is more resilient to the cold. It tends to kill other slimes rather quickly." - color = "#2398FF" - glow_toggle = TRUE - slime_color = "dark blue" - coretype = /obj/item/slime_extract/dark_blue - melee_damage_lower = 5 - melee_damage_upper = 5 - cold_resist = 1 - - description_info = "This slime is immune to the cold, however water will still kill it. Its presense, as well as its attacks, will \ - also cause you additional harm from the cold. A winter coat or other cold-resistant clothing can protect from this." - player_msg = "You are immune to the cold, inflict additional cold damage on attack, and cause nearby entities to suffer from coldness." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/purple, - /mob/living/simple_mob/slime/xenobio/blue, - /mob/living/simple_mob/slime/xenobio/cerulean, - /mob/living/simple_mob/slime/xenobio/cerulean - ) - - minbodytemp = 0 - cold_damage_per_tick = 0 - -/mob/living/simple_mob/slime/xenobio/dark_blue/handle_special() - if(stat != DEAD) - cold_aura() - ..() - -/mob/living/simple_mob/slime/xenobio/dark_blue/proc/cold_aura() - for(var/mob/living/L in view(2, src)) - if(L == src) - continue - chill(L) - - var/turf/T = get_turf(src) - var/datum/gas_mixture/env = T.return_air() - if(env) - env.add_thermal_energy(-10 * 1000) - -/mob/living/simple_mob/slime/xenobio/dark_blue/apply_melee_effects(atom/A) - ..() - if(isliving(A)) - var/mob/living/L = A - chill(L) - to_chat(src, span("span", "You chill \the [L].")) - to_chat(L, span("danger", "You've been chilled by \the [src]!")) - - -/mob/living/simple_mob/slime/xenobio/dark_blue/proc/chill(mob/living/L) - L.inflict_cold_damage(is_adult ? 10 : 5) - if(L.get_cold_protection() < 1 && L.has_AI()) // Harmful auras will make the AI react to its bearer. - L.ai_holder.react_to_attack(src) - - -/mob/living/simple_mob/slime/xenobio/silver - desc = "This slime is shiny, and can deflect lasers or other energy weapons directed at it." - color = "#AAAAAA" - slime_color = "silver" - coretype = /obj/item/slime_extract/silver - shiny = TRUE - - description_info = "Tasers, including the slime version, are ineffective against this slime. The slimebation still works." - player_msg = "You automatically reflect lasers, beams, and tasers that hit you." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/metal, - /mob/living/simple_mob/slime/xenobio/blue, - /mob/living/simple_mob/slime/xenobio/amber, - /mob/living/simple_mob/slime/xenobio/amber - ) - -/mob/living/simple_mob/slime/xenobio/silver/bullet_act(var/obj/item/projectile/P, var/def_zone) - if(istype(P,/obj/item/projectile/beam) || istype(P, /obj/item/projectile/energy)) - visible_message(span("danger", "\The [src] reflects \the [P]!")) - - // Find a turf near or on the original location to bounce to - var/new_x = P.starting.x + pick(0, 0, 0, -1, 1, -2, 2) - var/new_y = P.starting.y + pick(0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(src) - - // redirect the projectile - P.redirect(new_x, new_y, curloc, src) - P.reflected = TRUE - return PROJECTILE_CONTINUE // complete projectile permutation - else - ..() - - -// Tier 3 - -/mob/living/simple_mob/slime/xenobio/bluespace - desc = "Trapping this slime in a cell is generally futile, as it can teleport at will." - color = null - slime_color = "bluespace" - icon_state_override = "bluespace" - coretype = /obj/item/slime_extract/bluespace - - description_info = "This slime will teleport to attack something if it is within a range of seven tiles. The teleport has a cooldown of five seconds." - player_msg = "You can teleport at will to a specific tile by clicking on it at range. This has a five second cooldown." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/bluespace, - /mob/living/simple_mob/slime/xenobio/bluespace, - /mob/living/simple_mob/slime/xenobio/yellow, - /mob/living/simple_mob/slime/xenobio/yellow - ) - - special_attack_min_range = 3 - special_attack_max_range = 7 - special_attack_cooldown = 5 SECONDS - -/mob/living/simple_mob/slime/xenobio/bluespace/do_special_attack(atom/A) - // Teleport attack. - if(!A) - to_chat(src, span("warning", "There's nothing to teleport to.")) - return FALSE - - var/list/nearby_things = range(1, A) - var/list/valid_turfs = list() - - // All this work to just go to a non-dense tile. - for(var/turf/potential_turf in nearby_things) - var/valid_turf = TRUE - if(potential_turf.density) - continue - for(var/atom/movable/AM in potential_turf) - if(AM.density) - valid_turf = FALSE - if(valid_turf) - valid_turfs.Add(potential_turf) - - var/turf/T = get_turf(src) - var/turf/target_turf = pick(valid_turfs) - - if(!target_turf) - to_chat(src, span("warning", "There wasn't an unoccupied spot to teleport to.")) - return FALSE - - var/datum/effect/effect/system/spark_spread/s1 = new /datum/effect/effect/system/spark_spread - s1.set_up(5, 1, T) - var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/spark_spread - s2.set_up(5, 1, target_turf) - - - T.visible_message(span("notice", "\The [src] vanishes!")) - s1.start() - - forceMove(target_turf) - playsound(target_turf, 'sound/effects/phasein.ogg', 50, 1) - to_chat(src, span("notice", "You teleport to \the [target_turf].")) - - target_turf.visible_message(span("warning", "\The [src] appears!")) - s2.start() - - if(Adjacent(A)) - attack_target(A) - - -/mob/living/simple_mob/slime/xenobio/ruby - desc = "This slime has great physical strength." - color = "#FF3333" - slime_color = "ruby" - shiny = TRUE - glow_toggle = TRUE - coretype = /obj/item/slime_extract/ruby - - description_info = "This slime is unnaturally stronger, allowing it to hit much harder, take less damage, and be stunned for less time. \ - Their glomp attacks also send the victim flying." - player_msg = "Your attacks knock back the target a fair distance.
\ - You also hit harder, take less damage, and stuns affect you for less time." - - melee_attack_delay = 1 SECOND - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/dark_purple, - /mob/living/simple_mob/slime/xenobio/dark_purple, - /mob/living/simple_mob/slime/xenobio/ruby, - /mob/living/simple_mob/slime/xenobio/ruby - ) - -/mob/living/simple_mob/slime/xenobio/ruby/Initialize() - add_modifier(/datum/modifier/slime_strength, null, src) // Slime is always swole. - return ..() - -/mob/living/simple_mob/slime/xenobio/ruby/apply_melee_effects(atom/A) - ..() - - if(isliving(A) && a_intent == I_HURT) - var/mob/living/L = A - if(L.mob_size <= MOB_MEDIUM) - visible_message(span("danger", "\The [src] sends \the [L] flying with the impact!")) - playsound(src, "punch", 50, 1) - L.Weaken(1) - var/throwdir = get_dir(src, L) - L.throw_at(get_edge_target_turf(L, throwdir), 3, 1, src) - else - to_chat(L, span("warning", "\The [src] hits you with incredible force, but you remain in place.")) - - -/mob/living/simple_mob/slime/xenobio/amber - desc = "This slime seems to be an expert in the culinary arts, as they create their own food to share with others. \ - They would probably be very important to other slimes, if the other colors didn't try to kill them." - color = "#FFBB00" - slime_color = "amber" - shiny = TRUE - glow_toggle = TRUE - coretype = /obj/item/slime_extract/amber - - description_info = "This slime feeds nearby entities passively while it is alive. This can cause uncontrollable \ - slime growth and reproduction if not kept in check. The amber slime cannot feed itself, but can be fed by other amber slimes." - player_msg = "You passively provide nutrition to nearby entities." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/silver, - /mob/living/simple_mob/slime/xenobio/silver, - /mob/living/simple_mob/slime/xenobio/amber, - /mob/living/simple_mob/slime/xenobio/amber - ) - -/mob/living/simple_mob/slime/xenobio/amber/handle_special() - if(stat != DEAD) - feed_aura() - ..() - -/mob/living/simple_mob/slime/xenobio/amber/proc/feed_aura() - for(var/mob/living/L in view(2, src)) - if(L == src) // Don't feed themselves, or it is impossible to stop infinite slimes without killing all of the ambers. - continue - if(istype(L, /mob/living/simple_mob/slime/xenobio)) - var/mob/living/simple_mob/slime/xenobio/X = L - X.adjust_nutrition(rand(15, 25)) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.isSynthetic()) - continue - H.nutrition = between(0, H.nutrition + rand(15, 25), 800) - -/mob/living/simple_mob/slime/xenobio/cerulean - desc = "This slime is generally superior in a wide range of attributes, compared to the common slime. The jack of all trades, but master of none." - color = "#4F7EAA" - slime_color = "cerulean" - coretype = /obj/item/slime_extract/cerulean - - // Less than the specialized slimes, but higher than the rest. - maxHealth = 200 - maxHealth_adult = 250 - - melee_damage_lower = 10 - melee_damage_upper = 30 - - movement_cooldown = 0 // This actually isn't any faster due to AI limitations that hopefully the timer subsystem can fix in the future. - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/dark_blue, - /mob/living/simple_mob/slime/xenobio/dark_blue, - /mob/living/simple_mob/slime/xenobio/cerulean, - /mob/living/simple_mob/slime/xenobio/cerulean - ) - -// Tier 4 - -/mob/living/simple_mob/slime/xenobio/red - desc = "This slime is full of energy, and very aggressive. 'The red ones go faster.' seems to apply here." - color = "#FF3333" - slime_color = "red" - coretype = /obj/item/slime_extract/red - movement_cooldown = 0 // See above. - - description_info = "This slime is faster than the others. Attempting to discipline this slime will always cause it to go rabid and berserk." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/red, - /mob/living/simple_mob/slime/xenobio/oil, - /mob/living/simple_mob/slime/xenobio/oil, - /mob/living/simple_mob/slime/xenobio/orange - ) - - ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/red // Will enrage if disciplined. - - -/mob/living/simple_mob/slime/xenobio/green - desc = "This slime is radioactive." - color = "#14FF20" - slime_color = "green" - coretype = /obj/item/slime_extract/green - glow_toggle = TRUE - reagent_injected = "radium" - var/rads = 25 - - description_info = "This slime will irradiate anything nearby passively, and will inject radium on attack. \ - A radsuit or other thick and radiation-hardened armor can protect from this. It will only radiate while alive." - player_msg = "You passively irradiate your surroundings.
\ - You also inject radium on attack." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/purple, - /mob/living/simple_mob/slime/xenobio/green, - /mob/living/simple_mob/slime/xenobio/emerald, - /mob/living/simple_mob/slime/xenobio/emerald - ) - -/mob/living/simple_mob/slime/xenobio/green/handle_special() - if(stat != DEAD) - irradiate() - ..() - -/mob/living/simple_mob/slime/xenobio/green/proc/irradiate() - radiation_repository.radiate(src, rads) - - - -/mob/living/simple_mob/slime/xenobio/pink - desc = "This slime has regenerative properties." - color = "#FF0080" - slime_color = "pink" - coretype = /obj/item/slime_extract/pink - glow_toggle = TRUE - - description_info = "This slime will passively heal nearby entities within two tiles, including itself. It will only do this while alive." - player_msg = "You passively heal yourself and nearby allies." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/blue, - /mob/living/simple_mob/slime/xenobio/light_pink, - /mob/living/simple_mob/slime/xenobio/light_pink, - /mob/living/simple_mob/slime/xenobio/pink - ) - -/mob/living/simple_mob/slime/xenobio/pink/handle_special() - if(stat != DEAD) - heal_aura() - ..() - -/mob/living/simple_mob/slime/xenobio/pink/proc/heal_aura() - for(var/mob/living/L in view(src, 2)) - if(L.stat == DEAD || !IIsAlly(L)) - continue - L.add_modifier(/datum/modifier/aura/slime_heal, null, src) - -/datum/modifier/aura/slime_heal - name = "slime mending" - desc = "You feel somewhat gooy." - mob_overlay_state = "pink_sparkles" - stacks = MODIFIER_STACK_FORBID - aura_max_distance = 2 - - on_created_text = "Twinkling spores of goo surround you. It makes you feel healthier." - on_expired_text = "The spores of goo have faded, although you feel much healthier than before." - -/datum/modifier/aura/slime_heal/tick() - if(holder.stat == DEAD) - expire() - - if(ishuman(holder)) // Robolimbs need this code sadly. - var/mob/living/carbon/human/H = holder - for(var/obj/item/organ/external/E in H.organs) - var/obj/item/organ/external/O = E - O.heal_damage(2, 2, 0, 1) - else - holder.adjustBruteLoss(-2) - holder.adjustFireLoss(-2) - - holder.adjustToxLoss(-2) - holder.adjustOxyLoss(-2) - holder.adjustCloneLoss(-1) - - -/mob/living/simple_mob/slime/xenobio/gold - desc = "This slime absorbs energy, and cannot be stunned by normal means." - color = "#EEAA00" - shiny = TRUE - slime_color = "gold" - coretype = /obj/item/slime_extract/gold - description_info = "This slime is immune to the slimebaton and taser, and will actually charge the slime, however it will still discipline the slime." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/metal, - /mob/living/simple_mob/slime/xenobio/gold, - /mob/living/simple_mob/slime/xenobio/sapphire, - /mob/living/simple_mob/slime/xenobio/sapphire - ) - -/mob/living/simple_mob/slime/xenobio/gold/slimebatoned(mob/living/user, amount) - power_charge = between(0, power_charge + amount, 10) - -/mob/living/simple_mob/slime/xenobio/gold/get_description_interaction() // So it doesn't say to use a baton on them. - return list() - - -// Tier 5 - -/mob/living/simple_mob/slime/xenobio/oil - desc = "This slime is explosive and volatile. Smoking near it is probably a bad idea." - color = "#333333" - slime_color = "oil" - shiny = TRUE - coretype = /obj/item/slime_extract/oil - - description_info = "If this slime suffers damage from a fire or heat based source, or if it is caught inside \ - an explosion, it will explode. Oil slimes will also suicide-bomb themselves when fighting something that is not a monkey or slime." - player_msg = "You will explode if struck by a burning attack, or if you hit an enemy with a melee attack that is not a monkey or another slime." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/oil, - /mob/living/simple_mob/slime/xenobio/oil, - /mob/living/simple_mob/slime/xenobio/red, - /mob/living/simple_mob/slime/xenobio/red - ) - -/mob/living/simple_mob/slime/xenobio/oil/proc/explode() - if(stat != DEAD) - explosion(src.loc, 0, 2, 4) // A bit weaker since the suicide charger tended to gib the poor sod being targeted. - if(src) // Delete ourselves if the explosion didn't do it. - qdel(src) - -/mob/living/simple_mob/slime/xenobio/oil/apply_melee_effects(atom/A) - if(isliving(A)) - var/mob/living/L = A - if(ishuman(L)) - var/mob/living/carbon/human/H = A - if(istype(H.species, /datum/species/monkey)) - return ..()// Don't blow up when just eatting monkeys. - - else if(isslime(L)) - return ..() - - // Otherwise blow ourselves up. - say(pick("Sacrifice...!", "Sssss...", "Boom...!")) - set_AI_busy(TRUE) - sleep(2 SECONDS) - log_and_message_admins("[src] has suicide-bombed themselves while trying to kill \the [L].") - explode() - - return ..() - -/mob/living/simple_mob/slime/xenobio/oil/ex_act(severity) - log_and_message_admins("[src] exploded due to a chain reaction with another explosion.") - explode() - -/mob/living/simple_mob/slime/xenobio/oil/fire_act(datum/gas_mixture/air, temperature, volume) - log_and_message_admins("[src] exploded due to exposure to fire.") - explode() - -/mob/living/simple_mob/slime/xenobio/oil/bullet_act(obj/item/projectile/P, def_zone) - if(P.damage_type && P.damage_type == BURN && P.damage) // Most bullets won't trigger the explosion, as a mercy towards Security. - log_and_message_admins("[src] exploded due to bring hit by a burning projectile[P.firer ? " by [key_name(P.firer)]" : ""].") - explode() - else - ..() - -/mob/living/simple_mob/slime/xenobio/oil/attackby(obj/item/weapon/W, mob/living/user) - if(istype(W) && W.force && W.damtype == BURN) - log_and_message_admins("[src] exploded due to being hit with a burning weapon ([W]) by [key_name(user)].") - explode() - else - ..() - - -/mob/living/simple_mob/slime/xenobio/sapphire - desc = "This slime seems a bit brighter than the rest, both figuratively and literally." - color = "#2398FF" - slime_color = "sapphire" - shiny = TRUE - glow_toggle = TRUE - coretype = /obj/item/slime_extract/sapphire - ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/sapphire - - description_info = "This slime uses more robust tactics when fighting and won't hold back, so it is dangerous to be alone \ - with one if hostile, and especially dangerous if they outnumber you." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/sapphire, - /mob/living/simple_mob/slime/xenobio/sapphire, - /mob/living/simple_mob/slime/xenobio/gold, - /mob/living/simple_mob/slime/xenobio/gold - ) - - -/mob/living/simple_mob/slime/xenobio/emerald - desc = "This slime is faster than usual, even more so than the red slimes." - color = "#22FF22" - shiny = TRUE - glow_toggle = TRUE - slime_color = "emerald" - coretype = /obj/item/slime_extract/emerald - - description_info = "This slime will make everything around it, and itself, faster for a few seconds, if close by." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/green, - /mob/living/simple_mob/slime/xenobio/green, - /mob/living/simple_mob/slime/xenobio/emerald, - /mob/living/simple_mob/slime/xenobio/emerald - ) - -/mob/living/simple_mob/slime/xenobio/emerald/handle_special() - if(stat != DEAD) - zoom_aura() - ..() - -/mob/living/simple_mob/slime/xenobio/emerald/proc/zoom_aura() - for(var/mob/living/L in view(src, 2)) - if(L.stat == DEAD || !IIsAlly(L)) - continue - L.add_modifier(/datum/modifier/technomancer/haste, 5 SECONDS, src) - - -/mob/living/simple_mob/slime/xenobio/light_pink - desc = "This slime seems a lot more peaceful than the others." - color = "#FF8888" - slime_color = "light pink" - coretype = /obj/item/slime_extract/light_pink - - description_info = "This slime is effectively always disciplined initially." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/pink, - /mob/living/simple_mob/slime/xenobio/pink, - /mob/living/simple_mob/slime/xenobio/light_pink, - /mob/living/simple_mob/slime/xenobio/light_pink - ) - - ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/light_pink - -// Special -/mob/living/simple_mob/slime/xenobio/rainbow - desc = "This slime changes colors constantly." - color = null // Uses a special icon_state. - slime_color = "rainbow" - coretype = /obj/item/slime_extract/rainbow - icon_state_override = "rainbow" - unity = TRUE - - description_info = "This slime is considered to be the same color as all other slime colors at the same time for the purposes of \ - other slimes being friendly to them, and therefore will never be harmed by another slime. \ - Attacking this slime will provoke the wrath of all slimes within range." - player_msg = "You are considered to be the same color as every slime, \ - meaning that you are considered an ally to all slimes." - - slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/rainbow, - /mob/living/simple_mob/slime/xenobio/rainbow, - /mob/living/simple_mob/slime/xenobio/rainbow, - /mob/living/simple_mob/slime/xenobio/rainbow - ) - -/mob/living/simple_mob/slime/xenobio/rainbow/Initialize() - unify() - return ..() - -// The RD's pet slime. -/mob/living/simple_mob/slime/xenobio/rainbow/kendrick - name = "Kendrick" - desc = "The Research Director's pet slime. It shifts colors constantly." - rainbow_core_candidate = FALSE - // Doing pacify() in initialize() won't actually pacify the AI due to the ai_holder not existing due to parent initialize() not being called yet. - // Instead lets just give them an ai_holder that does that for us. - ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/passive - -/mob/living/simple_mob/slime/xenobio/rainbow/kendrick/Initialize() - pacify() // So the physical mob also gets made harmless. - return ..() \ No newline at end of file +// Here are where all the other colors of slime live. +// They will generally fight each other if not Unified, meaning the xenobiologist has to seperate them. + +// Tier 1. + +/mob/living/simple_mob/slime/xenobio/purple + desc = "This slime is rather toxic to handle, as it is poisonous." + color = "#CC23FF" + slime_color = "purple" + coretype = /obj/item/slime_extract/purple + reagent_injected = "toxin" + + description_info = "This slime spreads a toxin when it attacks. A biosuit or other thick armor can protect from the toxic attack." + player_msg = "You inject a harmful toxin when attacking." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/dark_purple, + /mob/living/simple_mob/slime/xenobio/dark_blue, + /mob/living/simple_mob/slime/xenobio/green, + /mob/living/simple_mob/slime/xenobio + ) + +/mob/living/simple_mob/slime/xenobio/orange + desc = "This slime is known to be flammable and can ignite enemies." + color = "#FFA723" + slime_color = "orange" + coretype = /obj/item/slime_extract/orange + melee_damage_lower = 5 + melee_damage_upper = 5 + heat_resist = 1 + + description_info = "The slime is immune to burning attacks, and attacks from this slime will burn you, and can ignite you. \ + A firesuit can protect from the burning attacks of this slime." + player_msg = "You inflict burning attacks, which causes additional damage, makes the target more flammable, and has a chance to ignite them.
\ + You are also immune to burning attacks." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/dark_purple, + /mob/living/simple_mob/slime/xenobio/yellow, + /mob/living/simple_mob/slime/xenobio/red, + /mob/living/simple_mob/slime/xenobio + ) + +/mob/living/simple_mob/slime/xenobio/orange/apply_melee_effects(atom/A) + ..() + if(isliving(A)) + var/mob/living/L = A + L.inflict_heat_damage(is_adult ? 10 : 5) + to_chat(src, span("span", "You burn \the [L].")) + to_chat(L, span("danger", "You've been burned by \the [src]!")) + L.adjust_fire_stacks(1) + if(prob(12)) + L.IgniteMob() + +/mob/living/simple_mob/slime/xenobio/blue + desc = "This slime produces 'cryotoxin' and uses it against their foes. Very deadly to other slimes." + color = "#19FFFF" + slime_color = "blue" + coretype = /obj/item/slime_extract/blue + reagent_injected = "cryotoxin" + cold_resist = 0.50 // Not as strong as dark blue, which has immunity. + + description_info = "The slime is resistant to the cold, and attacks from this slime can inject cryotoxin into you. \ + A biosuit or other thick armor can protect from the injection." + player_msg = "You inject cryotoxin on attack, which causes them to get very cold, slowing them down and harming them over time.
\ + You are also resistant to cold attacks." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/dark_blue, + /mob/living/simple_mob/slime/xenobio/silver, + /mob/living/simple_mob/slime/xenobio/pink, + /mob/living/simple_mob/slime/xenobio + ) + + +/mob/living/simple_mob/slime/xenobio/metal + desc = "This slime is a lot more resilient than the others, due to having a metamorphic metallic and sloped surface." + color = "#5F5F5F" + slime_color = "metal" + shiny = TRUE + coretype = /obj/item/slime_extract/metal + + description_info = "This slime is a lot more durable and tough to damage than the others. It also seems to provoke others to attack it over others." + player_msg = "You are more resilient and armored than more slimes. Your attacks will also encourage less intelligent enemies to focus on you." + + maxHealth = 250 + maxHealth_adult = 350 + + // The sloped armor. + // It's resistant to most weapons (but a spraybottle still kills it rather fast). + armor = list( + "melee" = 25, + "bullet" = 25, + "laser" = 25, + "energy" = 50, + "bomb" = 80, + "bio" = 100, + "rad" = 100 + ) + + armor_soak = list( + "melee" = 5, + "bullet" = 5, + "laser" = 5, + "energy" = 0, + "bomb" = 0, + "bio" = 0, + "rad" = 0 + ) + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/silver, + /mob/living/simple_mob/slime/xenobio/yellow, + /mob/living/simple_mob/slime/xenobio/gold, + /mob/living/simple_mob/slime/xenobio + ) + +/mob/living/simple_mob/slime/xenobio/metal/apply_melee_effects(atom/A) + ..() + if(isliving(A)) + var/mob/living/L = A + L.taunt(src, TRUE) // We're the party tank now. + +// Tier 2 + +/mob/living/simple_mob/slime/xenobio/yellow + desc = "This slime is very conductive, and is known to use electricity as a means of defense moreso than usual for slimes." + color = "#FFF423" + slime_color = "yellow" + coretype = /obj/item/slime_extract/yellow + melee_damage_lower = 5 + melee_damage_upper = 5 + shock_resist = 1 + + projectiletype = /obj/item/projectile/beam/lightning/slime + projectilesound = 'sound/effects/lightningbolt.ogg' + glow_toggle = TRUE + + description_info = "In addition to being immune to electrical shocks, this slime will fire ranged lightning attacks at \ + enemies if they are at range, inflict shocks upon entities they attack, and generate electricity for their stun \ + attack faster than usual. Insulative or reflective armor can protect from these attacks." + player_msg = "You have a ranged electric attack. You also shock enemies you attack, and your electric stun attack charges passively.
\ + You are also immune to shocking attacks." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/bluespace, + /mob/living/simple_mob/slime/xenobio/bluespace, + /mob/living/simple_mob/slime/xenobio/metal, + /mob/living/simple_mob/slime/xenobio/orange + ) + +/mob/living/simple_mob/slime/xenobio/yellow/apply_melee_effects(atom/A) + ..() + if(isliving(A)) + var/mob/living/L = A + L.inflict_shock_damage(is_adult ? 10 : 5) + to_chat(src, span("span", "You shock \the [L].")) + to_chat(L, span("danger", "You've been shocked by \the [src]!")) + +/mob/living/simple_mob/slime/xenobio/yellow/handle_special() + if(stat == CONSCIOUS) + if(prob(25)) + power_charge = between(0, power_charge + 1, 10) + ..() + +/obj/item/projectile/beam/lightning/slime + power = 10 + fire_sound = 'sound/effects/lightningbolt.ogg' + + +/mob/living/simple_mob/slime/xenobio/dark_purple + desc = "This slime produces ever-coveted phoron. Risky to handle but very much worth it." + color = "#660088" + slime_color = "dark purple" + coretype = /obj/item/slime_extract/dark_purple + reagent_injected = "phoron" + + description_info = "This slime applies phoron to enemies it attacks. A biosuit or other thick armor can protect from the toxic attack. \ + If hit with a burning attack, it will erupt in flames." + player_msg = "You inject phoron into enemies you attack.
\ + You will erupt into flames if harmed by fire!" + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/purple, + /mob/living/simple_mob/slime/xenobio/orange, + /mob/living/simple_mob/slime/xenobio/ruby, + /mob/living/simple_mob/slime/xenobio/ruby + ) + +/mob/living/simple_mob/slime/xenobio/dark_purple/proc/ignite() + visible_message(span("critical", "\The [src] erupts in an inferno!")) + for(var/turf/simulated/target_turf in view(2, src)) + target_turf.assume_gas("phoron", 30, 1500+T0C) + spawn(0) + target_turf.hotspot_expose(1500+T0C, 400) + qdel(src) + +/mob/living/simple_mob/slime/xenobio/dark_purple/ex_act(severity) + log_and_message_admins("[src] ignited due to a chain reaction with an explosion.") + ignite() + +/mob/living/simple_mob/slime/xenobio/dark_purple/fire_act(datum/gas_mixture/air, temperature, volume) + log_and_message_admins("[src] ignited due to exposure to fire.") + ignite() + +/mob/living/simple_mob/slime/xenobio/dark_purple/bullet_act(var/obj/item/projectile/P, var/def_zone) + if(P.damage_type && P.damage_type == BURN && P.damage) // Most bullets won't trigger the explosion, as a mercy towards Security. + log_and_message_admins("[src] ignited due to bring hit by a burning projectile[P.firer ? " by [key_name(P.firer)]" : ""].") + ignite() + else + ..() + +/mob/living/simple_mob/slime/xenobio/dark_purple/attackby(var/obj/item/weapon/W, var/mob/user) + if(istype(W) && W.force && W.damtype == BURN) + log_and_message_admins("[src] ignited due to being hit with a burning weapon ([W]) by [key_name(user)].") + ignite() + else + ..() + + + +/mob/living/simple_mob/slime/xenobio/dark_blue + desc = "This slime makes other entities near it feel much colder, and is more resilient to the cold. It tends to kill other slimes rather quickly." + color = "#2398FF" + glow_toggle = TRUE + slime_color = "dark blue" + coretype = /obj/item/slime_extract/dark_blue + melee_damage_lower = 5 + melee_damage_upper = 5 + cold_resist = 1 + + description_info = "This slime is immune to the cold, however water will still kill it. Its presense, as well as its attacks, will \ + also cause you additional harm from the cold. A winter coat or other cold-resistant clothing can protect from this." + player_msg = "You are immune to the cold, inflict additional cold damage on attack, and cause nearby entities to suffer from coldness." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/purple, + /mob/living/simple_mob/slime/xenobio/blue, + /mob/living/simple_mob/slime/xenobio/cerulean, + /mob/living/simple_mob/slime/xenobio/cerulean + ) + + minbodytemp = 0 + cold_damage_per_tick = 0 + +/mob/living/simple_mob/slime/xenobio/dark_blue/handle_special() + if(stat != DEAD) + cold_aura() + ..() + +/mob/living/simple_mob/slime/xenobio/dark_blue/proc/cold_aura() + for(var/mob/living/L in view(2, src)) + if(L == src) + continue + chill(L) + + var/turf/T = get_turf(src) + var/datum/gas_mixture/env = T.return_air() + if(env) + env.add_thermal_energy(-10 * 1000) + +/mob/living/simple_mob/slime/xenobio/dark_blue/apply_melee_effects(atom/A) + ..() + if(isliving(A)) + var/mob/living/L = A + chill(L) + to_chat(src, span("span", "You chill \the [L].")) + to_chat(L, span("danger", "You've been chilled by \the [src]!")) + + +/mob/living/simple_mob/slime/xenobio/dark_blue/proc/chill(mob/living/L) + L.inflict_cold_damage(is_adult ? 10 : 5) + if(L.get_cold_protection() < 1 && L.has_AI()) // Harmful auras will make the AI react to its bearer. + L.ai_holder.react_to_attack(src) + + +/mob/living/simple_mob/slime/xenobio/silver + desc = "This slime is shiny, and can deflect lasers or other energy weapons directed at it." + color = "#AAAAAA" + slime_color = "silver" + coretype = /obj/item/slime_extract/silver + shiny = TRUE + + description_info = "Tasers, including the slime version, are ineffective against this slime. The slimebation still works." + player_msg = "You automatically reflect lasers, beams, and tasers that hit you." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/metal, + /mob/living/simple_mob/slime/xenobio/blue, + /mob/living/simple_mob/slime/xenobio/amber, + /mob/living/simple_mob/slime/xenobio/amber + ) + +/mob/living/simple_mob/slime/xenobio/silver/bullet_act(var/obj/item/projectile/P, var/def_zone) + if(istype(P,/obj/item/projectile/beam) || istype(P, /obj/item/projectile/energy)) + visible_message(span("danger", "\The [src] reflects \the [P]!")) + + // Find a turf near or on the original location to bounce to + var/new_x = P.starting.x + pick(0, 0, 0, -1, 1, -2, 2) + var/new_y = P.starting.y + pick(0, 0, 0, -1, 1, -2, 2) + var/turf/curloc = get_turf(src) + + // redirect the projectile + P.redirect(new_x, new_y, curloc, src) + P.reflected = TRUE + return PROJECTILE_CONTINUE // complete projectile permutation + else + ..() + + +// Tier 3 + +/mob/living/simple_mob/slime/xenobio/bluespace + desc = "Trapping this slime in a cell is generally futile, as it can teleport at will." + color = null + slime_color = "bluespace" + icon_state_override = "bluespace" + coretype = /obj/item/slime_extract/bluespace + + description_info = "This slime will teleport to attack something if it is within a range of seven tiles. The teleport has a cooldown of five seconds." + player_msg = "You can teleport at will to a specific tile by clicking on it at range. This has a five second cooldown." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/bluespace, + /mob/living/simple_mob/slime/xenobio/bluespace, + /mob/living/simple_mob/slime/xenobio/yellow, + /mob/living/simple_mob/slime/xenobio/yellow + ) + + special_attack_min_range = 3 + special_attack_max_range = 7 + special_attack_cooldown = 5 SECONDS + +/mob/living/simple_mob/slime/xenobio/bluespace/do_special_attack(atom/A) + // Teleport attack. + if(!A) + to_chat(src, span("warning", "There's nothing to teleport to.")) + return FALSE + + var/list/nearby_things = range(1, A) + var/list/valid_turfs = list() + + // All this work to just go to a non-dense tile. + for(var/turf/potential_turf in nearby_things) + var/valid_turf = TRUE + if(potential_turf.density) + continue + for(var/atom/movable/AM in potential_turf) + if(AM.density) + valid_turf = FALSE + if(valid_turf) + valid_turfs.Add(potential_turf) + + var/turf/T = get_turf(src) + var/turf/target_turf = pick(valid_turfs) + + if(!target_turf) + to_chat(src, span("warning", "There wasn't an unoccupied spot to teleport to.")) + return FALSE + + var/datum/effect/effect/system/spark_spread/s1 = new /datum/effect/effect/system/spark_spread + s1.set_up(5, 1, T) + var/datum/effect/effect/system/spark_spread/s2 = new /datum/effect/effect/system/spark_spread + s2.set_up(5, 1, target_turf) + + + T.visible_message(span("notice", "\The [src] vanishes!")) + s1.start() + + forceMove(target_turf) + playsound(target_turf, 'sound/effects/phasein.ogg', 50, 1) + to_chat(src, span("notice", "You teleport to \the [target_turf].")) + + target_turf.visible_message(span("warning", "\The [src] appears!")) + s2.start() + + if(Adjacent(A)) + attack_target(A) + + +/mob/living/simple_mob/slime/xenobio/ruby + desc = "This slime has great physical strength." + color = "#FF3333" + slime_color = "ruby" + shiny = TRUE + glow_toggle = TRUE + coretype = /obj/item/slime_extract/ruby + + description_info = "This slime is unnaturally stronger, allowing it to hit much harder, take less damage, and be stunned for less time. \ + Their glomp attacks also send the victim flying." + player_msg = "Your attacks knock back the target a fair distance.
\ + You also hit harder, take less damage, and stuns affect you for less time." + + melee_attack_delay = 1 SECOND + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/dark_purple, + /mob/living/simple_mob/slime/xenobio/dark_purple, + /mob/living/simple_mob/slime/xenobio/ruby, + /mob/living/simple_mob/slime/xenobio/ruby + ) + +/mob/living/simple_mob/slime/xenobio/ruby/Initialize() + add_modifier(/datum/modifier/slime_strength, null, src) // Slime is always swole. + return ..() + +/mob/living/simple_mob/slime/xenobio/ruby/apply_melee_effects(atom/A) + ..() + + if(isliving(A) && a_intent == I_HURT) + var/mob/living/L = A + if(L.mob_size <= MOB_MEDIUM) + visible_message(span("danger", "\The [src] sends \the [L] flying with the impact!")) + playsound(src, "punch", 50, 1) + L.Weaken(1) + var/throwdir = get_dir(src, L) + L.throw_at(get_edge_target_turf(L, throwdir), 3, 1, src) + else + to_chat(L, span("warning", "\The [src] hits you with incredible force, but you remain in place.")) + + +/mob/living/simple_mob/slime/xenobio/amber + desc = "This slime seems to be an expert in the culinary arts, as they create their own food to share with others. \ + They would probably be very important to other slimes, if the other colors didn't try to kill them." + color = "#FFBB00" + slime_color = "amber" + shiny = TRUE + glow_toggle = TRUE + coretype = /obj/item/slime_extract/amber + + description_info = "This slime feeds nearby entities passively while it is alive. This can cause uncontrollable \ + slime growth and reproduction if not kept in check. The amber slime cannot feed itself, but can be fed by other amber slimes." + player_msg = "You passively provide nutrition to nearby entities." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/silver, + /mob/living/simple_mob/slime/xenobio/silver, + /mob/living/simple_mob/slime/xenobio/amber, + /mob/living/simple_mob/slime/xenobio/amber + ) + +/mob/living/simple_mob/slime/xenobio/amber/handle_special() + if(stat != DEAD) + feed_aura() + ..() + +/mob/living/simple_mob/slime/xenobio/amber/proc/feed_aura() + for(var/mob/living/L in view(2, src)) + if(L == src) // Don't feed themselves, or it is impossible to stop infinite slimes without killing all of the ambers. + continue + if(istype(L, /mob/living/simple_mob/slime/xenobio)) + var/mob/living/simple_mob/slime/xenobio/X = L + X.adjust_nutrition(rand(15, 25), 0) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.isSynthetic()) + continue + H.nutrition = between(0, H.nutrition + rand(15, 25), 800) + +/mob/living/simple_mob/slime/xenobio/cerulean + desc = "This slime is generally superior in a wide range of attributes, compared to the common slime. The jack of all trades, but master of none." + color = "#4F7EAA" + slime_color = "cerulean" + coretype = /obj/item/slime_extract/cerulean + + // Less than the specialized slimes, but higher than the rest. + maxHealth = 200 + maxHealth_adult = 250 + + melee_damage_lower = 10 + melee_damage_upper = 30 + + movement_cooldown = 0 // This actually isn't any faster due to AI limitations that hopefully the timer subsystem can fix in the future. + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/dark_blue, + /mob/living/simple_mob/slime/xenobio/dark_blue, + /mob/living/simple_mob/slime/xenobio/cerulean, + /mob/living/simple_mob/slime/xenobio/cerulean + ) + +// Tier 4 + +/mob/living/simple_mob/slime/xenobio/red + desc = "This slime is full of energy, and very aggressive. 'The red ones go faster.' seems to apply here." + color = "#FF3333" + slime_color = "red" + coretype = /obj/item/slime_extract/red + movement_cooldown = 0 // See above. + + description_info = "This slime is faster than the others. Attempting to discipline this slime will always cause it to go rabid and berserk." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/red, + /mob/living/simple_mob/slime/xenobio/oil, + /mob/living/simple_mob/slime/xenobio/oil, + /mob/living/simple_mob/slime/xenobio/orange + ) + + ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/red // Will enrage if disciplined. + + +/mob/living/simple_mob/slime/xenobio/green + desc = "This slime is radioactive." + color = "#14FF20" + slime_color = "green" + coretype = /obj/item/slime_extract/green + glow_toggle = TRUE + reagent_injected = "radium" + var/rads = 25 + + description_info = "This slime will irradiate anything nearby passively, and will inject radium on attack. \ + A radsuit or other thick and radiation-hardened armor can protect from this. It will only radiate while alive." + player_msg = "You passively irradiate your surroundings.
\ + You also inject radium on attack." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/purple, + /mob/living/simple_mob/slime/xenobio/green, + /mob/living/simple_mob/slime/xenobio/emerald, + /mob/living/simple_mob/slime/xenobio/emerald + ) + +/mob/living/simple_mob/slime/xenobio/green/handle_special() + if(stat != DEAD) + irradiate() + ..() + +/mob/living/simple_mob/slime/xenobio/green/proc/irradiate() + radiation_repository.radiate(src, rads) + + + +/mob/living/simple_mob/slime/xenobio/pink + desc = "This slime has regenerative properties." + color = "#FF0080" + slime_color = "pink" + coretype = /obj/item/slime_extract/pink + glow_toggle = TRUE + + description_info = "This slime will passively heal nearby entities within two tiles, including itself. It will only do this while alive." + player_msg = "You passively heal yourself and nearby allies." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/blue, + /mob/living/simple_mob/slime/xenobio/light_pink, + /mob/living/simple_mob/slime/xenobio/light_pink, + /mob/living/simple_mob/slime/xenobio/pink + ) + +/mob/living/simple_mob/slime/xenobio/pink/handle_special() + if(stat != DEAD) + heal_aura() + ..() + +/mob/living/simple_mob/slime/xenobio/pink/proc/heal_aura() + for(var/mob/living/L in view(src, 2)) + if(L.stat == DEAD || !IIsAlly(L)) + continue + L.add_modifier(/datum/modifier/aura/slime_heal, null, src) + +/datum/modifier/aura/slime_heal + name = "slime mending" + desc = "You feel somewhat gooy." + mob_overlay_state = "pink_sparkles" + stacks = MODIFIER_STACK_FORBID + aura_max_distance = 2 + + on_created_text = "Twinkling spores of goo surround you. It makes you feel healthier." + on_expired_text = "The spores of goo have faded, although you feel much healthier than before." + +/datum/modifier/aura/slime_heal/tick() + if(holder.stat == DEAD) + expire() + + if(ishuman(holder)) // Robolimbs need this code sadly. + var/mob/living/carbon/human/H = holder + for(var/obj/item/organ/external/E in H.organs) + var/obj/item/organ/external/O = E + O.heal_damage(2, 2, 0, 1) + else + holder.adjustBruteLoss(-2) + holder.adjustFireLoss(-2) + + holder.adjustToxLoss(-2) + holder.adjustOxyLoss(-2) + holder.adjustCloneLoss(-1) + + +/mob/living/simple_mob/slime/xenobio/gold + desc = "This slime absorbs energy, and cannot be stunned by normal means." + color = "#EEAA00" + shiny = TRUE + slime_color = "gold" + coretype = /obj/item/slime_extract/gold + description_info = "This slime is immune to the slimebaton and taser, and will actually charge the slime, however it will still discipline the slime." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/metal, + /mob/living/simple_mob/slime/xenobio/gold, + /mob/living/simple_mob/slime/xenobio/sapphire, + /mob/living/simple_mob/slime/xenobio/sapphire + ) + +/mob/living/simple_mob/slime/xenobio/gold/slimebatoned(mob/living/user, amount) + power_charge = between(0, power_charge + amount, 10) + +/mob/living/simple_mob/slime/xenobio/gold/get_description_interaction() // So it doesn't say to use a baton on them. + return list() + + +// Tier 5 + +/mob/living/simple_mob/slime/xenobio/oil + desc = "This slime is explosive and volatile. Smoking near it is probably a bad idea." + color = "#333333" + slime_color = "oil" + shiny = TRUE + coretype = /obj/item/slime_extract/oil + + description_info = "If this slime suffers damage from a fire or heat based source, or if it is caught inside \ + an explosion, it will explode. Oil slimes will also suicide-bomb themselves when fighting something that is not a monkey or slime." + player_msg = "You will explode if struck by a burning attack, or if you hit an enemy with a melee attack that is not a monkey or another slime." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/oil, + /mob/living/simple_mob/slime/xenobio/oil, + /mob/living/simple_mob/slime/xenobio/red, + /mob/living/simple_mob/slime/xenobio/red + ) + +/mob/living/simple_mob/slime/xenobio/oil/proc/explode() + if(stat != DEAD) + explosion(src.loc, 0, 2, 4) // A bit weaker since the suicide charger tended to gib the poor sod being targeted. + if(src) // Delete ourselves if the explosion didn't do it. + qdel(src) + +/mob/living/simple_mob/slime/xenobio/oil/apply_melee_effects(atom/A) + if(isliving(A)) + var/mob/living/L = A + if(ishuman(L)) + var/mob/living/carbon/human/H = A + if(istype(H.species, /datum/species/monkey)) + return ..()// Don't blow up when just eatting monkeys. + + else if(isslime(L)) + return ..() + + // Otherwise blow ourselves up. + say(pick("Sacrifice...!", "Sssss...", "Boom...!")) + set_AI_busy(TRUE) + sleep(2 SECONDS) + log_and_message_admins("[src] has suicide-bombed themselves while trying to kill \the [L].") + explode() + + return ..() + +/mob/living/simple_mob/slime/xenobio/oil/ex_act(severity) + log_and_message_admins("[src] exploded due to a chain reaction with another explosion.") + explode() + +/mob/living/simple_mob/slime/xenobio/oil/fire_act(datum/gas_mixture/air, temperature, volume) + log_and_message_admins("[src] exploded due to exposure to fire.") + explode() + +/mob/living/simple_mob/slime/xenobio/oil/bullet_act(obj/item/projectile/P, def_zone) + if(P.damage_type && P.damage_type == BURN && P.damage) // Most bullets won't trigger the explosion, as a mercy towards Security. + log_and_message_admins("[src] exploded due to bring hit by a burning projectile[P.firer ? " by [key_name(P.firer)]" : ""].") + explode() + else + ..() + +/mob/living/simple_mob/slime/xenobio/oil/attackby(obj/item/weapon/W, mob/living/user) + if(istype(W) && W.force && W.damtype == BURN) + log_and_message_admins("[src] exploded due to being hit with a burning weapon ([W]) by [key_name(user)].") + explode() + else + ..() + + +/mob/living/simple_mob/slime/xenobio/sapphire + desc = "This slime seems a bit brighter than the rest, both figuratively and literally." + color = "#2398FF" + slime_color = "sapphire" + shiny = TRUE + glow_toggle = TRUE + coretype = /obj/item/slime_extract/sapphire + ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/sapphire + + description_info = "This slime uses more robust tactics when fighting and won't hold back, so it is dangerous to be alone \ + with one if hostile, and especially dangerous if they outnumber you." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/sapphire, + /mob/living/simple_mob/slime/xenobio/sapphire, + /mob/living/simple_mob/slime/xenobio/gold, + /mob/living/simple_mob/slime/xenobio/gold + ) + + +/mob/living/simple_mob/slime/xenobio/emerald + desc = "This slime is faster than usual, even more so than the red slimes." + color = "#22FF22" + shiny = TRUE + glow_toggle = TRUE + slime_color = "emerald" + coretype = /obj/item/slime_extract/emerald + + description_info = "This slime will make everything around it, and itself, faster for a few seconds, if close by." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/green, + /mob/living/simple_mob/slime/xenobio/green, + /mob/living/simple_mob/slime/xenobio/emerald, + /mob/living/simple_mob/slime/xenobio/emerald + ) + +/mob/living/simple_mob/slime/xenobio/emerald/handle_special() + if(stat != DEAD) + zoom_aura() + ..() + +/mob/living/simple_mob/slime/xenobio/emerald/proc/zoom_aura() + for(var/mob/living/L in view(src, 2)) + if(L.stat == DEAD || !IIsAlly(L)) + continue + L.add_modifier(/datum/modifier/technomancer/haste, 5 SECONDS, src) + + +/mob/living/simple_mob/slime/xenobio/light_pink + desc = "This slime seems a lot more peaceful than the others." + color = "#FF8888" + slime_color = "light pink" + coretype = /obj/item/slime_extract/light_pink + + description_info = "This slime is effectively always disciplined initially." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/pink, + /mob/living/simple_mob/slime/xenobio/pink, + /mob/living/simple_mob/slime/xenobio/light_pink, + /mob/living/simple_mob/slime/xenobio/light_pink + ) + + ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/light_pink + +// Special +/mob/living/simple_mob/slime/xenobio/rainbow + desc = "This slime changes colors constantly." + color = null // Uses a special icon_state. + slime_color = "rainbow" + coretype = /obj/item/slime_extract/rainbow + icon_state_override = "rainbow" + unity = TRUE + + description_info = "This slime is considered to be the same color as all other slime colors at the same time for the purposes of \ + other slimes being friendly to them, and therefore will never be harmed by another slime. \ + Attacking this slime will provoke the wrath of all slimes within range." + player_msg = "You are considered to be the same color as every slime, \ + meaning that you are considered an ally to all slimes." + + slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/rainbow, + /mob/living/simple_mob/slime/xenobio/rainbow, + /mob/living/simple_mob/slime/xenobio/rainbow, + /mob/living/simple_mob/slime/xenobio/rainbow + ) + +/mob/living/simple_mob/slime/xenobio/rainbow/Initialize() + unify() + return ..() + +// The RD's pet slime. +/mob/living/simple_mob/slime/xenobio/rainbow/kendrick + name = "Kendrick" + desc = "The Research Director's pet slime. It shifts colors constantly." + rainbow_core_candidate = FALSE + // Doing pacify() in initialize() won't actually pacify the AI due to the ai_holder not existing due to parent initialize() not being called yet. + // Instead lets just give them an ai_holder that does that for us. + ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime/passive + +/mob/living/simple_mob/slime/xenobio/rainbow/kendrick/Initialize() + pacify() // So the physical mob also gets made harmless. + return ..() diff --git a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm index 3a9cab6bc2..156d67525b 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm @@ -29,7 +29,7 @@ var/supported = FALSE for(var/obj/structure/table/S in loc) supported = TRUE - if(!supported) + if(!supported && !anchored) to_chat(usr, "You will need a better supporting surface before opening \the [src]!") return //VOREStation Addition End diff --git a/html/changelogs/chaoko99 - medibots.yml b/html/changelogs/chaoko99 - medibots.yml new file mode 100644 index 0000000000..aefa9bce3a --- /dev/null +++ b/html/changelogs/chaoko99 - medibots.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Chaoko99 + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "The medibot's minimum configurable threshhold has been lowered to 0, from 5. Perfect for silly-billies coming into medical with 2 brute boo boos, thanks to accidentally throwing something at themselves or.. something." diff --git a/html/changelogs/chaoko99 - reconnect.yml b/html/changelogs/chaoko99 - reconnect.yml new file mode 100644 index 0000000000..082e552457 --- /dev/null +++ b/html/changelogs/chaoko99 - reconnect.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: chaoko99 + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Adds the clientside 'ping' and 'reconnect' commands to the file menu." diff --git a/icons/mob/head_vr.dmi b/icons/mob/head_vr.dmi index 798bff510a..bf19238e2e 100644 Binary files a/icons/mob/head_vr.dmi and b/icons/mob/head_vr.dmi differ diff --git a/icons/obj/clothing/hats_vr.dmi b/icons/obj/clothing/hats_vr.dmi index f20d7c13d6..befa308d4b 100644 Binary files a/icons/obj/clothing/hats_vr.dmi and b/icons/obj/clothing/hats_vr.dmi differ diff --git a/icons/obj/food48x48_vr.dmi b/icons/obj/food48x48_vr.dmi new file mode 100644 index 0000000000..91d4307b37 Binary files /dev/null and b/icons/obj/food48x48_vr.dmi differ diff --git a/icons/obj/food_vr.dmi b/icons/obj/food_vr.dmi index 08c984102b..7a6d3c5226 100644 Binary files a/icons/obj/food_vr.dmi and b/icons/obj/food_vr.dmi differ diff --git a/icons/obj/trash_vr.dmi b/icons/obj/trash_vr.dmi index 6c9d7ea7d3..17004c289d 100644 Binary files a/icons/obj/trash_vr.dmi and b/icons/obj/trash_vr.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index 218c3a48f3..ebde572420 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1075,6 +1075,16 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" + elem + name = "&Reconnect" + command = ".reconnect" + category = "&File" + saved-params = "is-checked" + elem + name = "&Check ping" + command = ".ping" + category = "&File" + saved-params = "is-checked" elem name = "" command = "" diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index 75764756d8..2b2f4d5351 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -6005,6 +6005,21 @@ }, /turf/simulated/floor/tiled, /area/rnd/hallway) +"aki" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/catwalk, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/visible/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{ + icon_state = "intact-scrubbers"; + dir = 4 + }, +/turf/simulated/floor/plating, +/area/maintenance/lower/research) "akj" = ( /obj/structure/catwalk, /obj/effect/decal/cleanable/dirt, @@ -6014,6 +6029,17 @@ }, /turf/simulated/floor/plating, /area/maintenance/lower/trash_pit) +"akk" = ( +/obj/structure/catwalk, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/visible/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/maintenance/lower/research) "akm" = ( /obj/structure/grille, /obj/structure/window/reinforced/full, @@ -13834,14 +13860,6 @@ }, /turf/simulated/floor/tiled, /area/storage/art) -"aEZ" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/maintenance/lower/research) "aFb" = ( /obj/structure/bed/chair/wood{ dir = 4 @@ -43152,7 +43170,7 @@ aBW aDl aDI aEp -aEZ +aki lVl bEX qaO @@ -43294,7 +43312,7 @@ aCB aDm aDJ aDL -jRT +akk jso xJz xoJ diff --git a/maps/tether/tether-06-station2.dmm b/maps/tether/tether-06-station2.dmm index fa40d5e3b7..e26ad41dae 100644 --- a/maps/tether/tether-06-station2.dmm +++ b/maps/tether/tether-06-station2.dmm @@ -3291,13 +3291,25 @@ /turf/simulated/floor/tiled, /area/tether/exploration/hallway) "eJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/firedoor/glass/hidden/steel{ +/obj/effect/floor_decal/corner/lightgrey{ + dir = 9 + }, +/obj/effect/floor_decal/corner/lightgrey{ + dir = 6 + }, +/obj/effect/floor_decal/steeldecal/steel_decals9, +/obj/effect/floor_decal/steeldecal/steel_decals9{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals9{ dir = 1 }, +/obj/effect/floor_decal/steeldecal/steel_decals9{ + dir = 8 + }, +/obj/machinery/vending/nifsoft_shop, /turf/simulated/floor/tiled, -/area/tether/station/stairs_two) +/area/hallway/station/port) "eK" = ( /obj/effect/floor_decal/borderfloor{ dir = 5 @@ -3334,29 +3346,28 @@ /turf/space, /area/space) "eN" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2"; - pixel_y = 0 - }, -/obj/effect/floor_decal/borderfloor{ - dir = 4 - }, -/obj/effect/floor_decal/corner/lightgrey/border{ - dir = 4 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ +/obj/machinery/vending/coffee, +/obj/effect/floor_decal/corner/lightgrey{ dir = 9 }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 10 +/obj/effect/floor_decal/corner/lightgrey{ + dir = 6 }, -/obj/machinery/door/firedoor/glass/hidden/steel{ +/obj/effect/floor_decal/steeldecal/steel_decals9, +/obj/effect/floor_decal/steeldecal/steel_decals9{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals9{ + dir = 1 + }, +/obj/effect/floor_decal/steeldecal/steel_decals9{ dir = 8 }, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled, -/area/tether/station/stairs_two) +/area/hallway/station/port) "eO" = ( /obj/machinery/alarm{ pixel_y = 22 @@ -10747,48 +10758,55 @@ /turf/simulated/floor/tiled, /area/hallway/station/port) "pQ" = ( -/obj/effect/floor_decal/corner/lightgrey{ - dir = 9 +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 }, -/obj/effect/floor_decal/corner/lightgrey{ - dir = 6 - }, -/obj/effect/floor_decal/steeldecal/steel_decals9, -/obj/effect/floor_decal/steeldecal/steel_decals9{ - dir = 4 - }, -/obj/effect/floor_decal/steeldecal/steel_decals9{ +/obj/effect/floor_decal/borderfloor{ dir = 1 }, -/obj/effect/floor_decal/steeldecal/steel_decals9{ - dir = 8 +/obj/effect/floor_decal/corner/lightgrey/border{ + dir = 1 }, -/obj/machinery/vending/nifsoft_shop, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7, /turf/simulated/floor/tiled, -/area/hallway/station/starboard) +/area/hallway/station/port) "pR" = ( -/obj/machinery/vending/coffee, -/obj/effect/floor_decal/corner/lightgrey{ - dir = 9 +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 }, -/obj/effect/floor_decal/corner/lightgrey{ - dir = 6 +/obj/effect/floor_decal/borderfloor{ + dir = 1 }, -/obj/effect/floor_decal/steeldecal/steel_decals9, -/obj/effect/floor_decal/steeldecal/steel_decals9{ +/obj/effect/floor_decal/corner/lightgrey/border{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ dir = 4 }, -/obj/effect/floor_decal/steeldecal/steel_decals9{ - dir = 1 - }, -/obj/effect/floor_decal/steeldecal/steel_decals9{ - dir = 8 - }, -/obj/machinery/light{ - dir = 1 - }, +/obj/effect/floor_decal/steeldecal/steel_decals7, /turf/simulated/floor/tiled, -/area/hallway/station/starboard) +/area/hallway/station/port) "pS" = ( /turf/simulated/wall/r_wall, /area/hallway/station/starboard) @@ -11267,56 +11285,6 @@ /turf/simulated/floor/tiled, /area/hallway/station/port) "qC" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 - }, -/obj/effect/floor_decal/borderfloor{ - dir = 1 - }, -/obj/effect/floor_decal/corner/lightgrey/border{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 4 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7, -/turf/simulated/floor/tiled, -/area/hallway/station/starboard) -"qD" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_x = 0 - }, -/obj/effect/floor_decal/borderfloor{ - dir = 1 - }, -/obj/effect/floor_decal/corner/lightgrey/border{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 4 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7, -/turf/simulated/floor/tiled, -/area/hallway/station/starboard) -"qE" = ( /obj/structure/cable{ d1 = 4; d2 = 8; @@ -11337,7 +11305,22 @@ }, /obj/effect/floor_decal/steeldecal/steel_decals7, /turf/simulated/floor/tiled, -/area/hallway/station/starboard) +/area/hallway/station/port) +"qD" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/hallway/station/port) +"qE" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/turf/simulated/floor/tiled, +/area/hallway/station/port) "qF" = ( /obj/structure/cable{ d1 = 1; @@ -11737,15 +11720,6 @@ /turf/simulated/floor/tiled, /area/hallway/station/port) "rp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/turf/simulated/floor/tiled, -/area/hallway/station/starboard) -"rq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -11754,7 +11728,21 @@ }, /obj/machinery/door/firedoor/glass/hidden/steel, /turf/simulated/floor/tiled, -/area/hallway/station/starboard) +/area/hallway/station/port) +"rq" = ( +/obj/effect/floor_decal/borderfloor, +/obj/effect/floor_decal/corner/lightgrey/border, +/obj/machinery/door/firedoor/glass/hidden/steel{ + dir = 1 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 1 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/hallway/station/port) "rr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 @@ -12209,19 +12197,17 @@ /turf/simulated/floor/tiled, /area/hallway/station/starboard) "sd" = ( -/obj/effect/floor_decal/borderfloor, -/obj/effect/floor_decal/corner/lightgrey/border, /obj/machinery/door/firedoor/glass/hidden/steel{ dir = 1 }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 }, /turf/simulated/floor/tiled, -/area/hallway/station/starboard) +/area/tether/station/stairs_two) "se" = ( /obj/structure/flora/pottedplant/stoutbush, /obj/effect/floor_decal/borderfloor{ @@ -12384,11 +12370,6 @@ /turf/simulated/floor/tiled/techfloor, /area/ai_server_room) "sz" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled, -/area/tether/station/stairs_two) -"sA" = ( /obj/structure/cable{ d1 = 1; d2 = 2; @@ -12407,6 +12388,19 @@ /obj/effect/floor_decal/steeldecal/steel_decals7{ dir = 10 }, +/obj/machinery/door/firedoor/glass/hidden/steel{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/tether/station/stairs_two) +"sA" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled, /area/tether/station/stairs_two) "sB" = ( @@ -13039,11 +13033,11 @@ /turf/simulated/floor/tiled, /area/tether/station/stairs_two) "tJ" = ( -/obj/structure/cable, -/obj/machinery/power/apc{ - dir = 4; - name = "east bump"; - pixel_x = 28 +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 }, /obj/effect/floor_decal/borderfloor{ dir = 4 @@ -13057,6 +13051,8 @@ /obj/effect/floor_decal/steeldecal/steel_decals7{ dir = 10 }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, /area/tether/station/stairs_two) "tK" = ( @@ -13361,17 +13357,8 @@ /turf/simulated/floor/tiled, /area/tether/station/stairs_two) "up" = ( -/obj/effect/floor_decal/borderfloor{ - dir = 4 - }, -/obj/effect/floor_decal/corner/lightgrey/border{ - dir = 4 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 9 - }, -/obj/effect/floor_decal/steeldecal/steel_decals7{ - dir = 10 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 }, /turf/simulated/floor/tiled, /area/tether/station/stairs_two) @@ -13703,14 +13690,11 @@ /turf/simulated/floor/tiled, /area/tether/station/stairs_two) "uS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled, -/area/tether/station/stairs_two) -"uT" = ( -/obj/machinery/light{ +/obj/structure/cable, +/obj/machinery/power/apc{ dir = 4; - icon_state = "tube1" + name = "east bump"; + pixel_x = 28 }, /obj/effect/floor_decal/borderfloor{ dir = 4 @@ -13724,14 +13708,16 @@ /obj/effect/floor_decal/steeldecal/steel_decals7{ dir = 10 }, -/obj/effect/floor_decal/borderfloor/corner2{ - dir = 5 - }, -/obj/effect/floor_decal/corner/lightgrey/bordercorner2{ - dir = 5 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 }, /turf/simulated/floor/tiled, /area/tether/station/stairs_two) +"uT" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled, +/area/tether/station/stairs_two) "uU" = ( /obj/machinery/alarm{ dir = 4; @@ -19748,6 +19734,71 @@ /turf/simulated/floor/tiled, /area/hallway/station/starboard) "EA" = ( +/obj/effect/floor_decal/borderfloor{ + dir = 4 + }, +/obj/effect/floor_decal/corner/lightgrey/border{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 9 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/tether/station/stairs_two) +"EB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/tether/station/stairs_two) +"EC" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/obj/effect/floor_decal/borderfloor{ + dir = 4 + }, +/obj/effect/floor_decal/corner/lightgrey/border{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 9 + }, +/obj/effect/floor_decal/steeldecal/steel_decals7{ + dir = 10 + }, +/obj/effect/floor_decal/borderfloor/corner2{ + dir = 5 + }, +/obj/effect/floor_decal/corner/lightgrey/bordercorner2{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/tiled, +/area/tether/station/stairs_two) +"ED" = ( +/obj/structure/table/rack{ + dir = 8; + layer = 2.9 + }, +/obj/random/maintenance/clean, +/turf/simulated/floor, +/area/maintenance/station/sec_lower) +"EE" = ( /obj/structure/shuttle/engine/propulsion{ dir = 8; icon_state = "propulsion_l" @@ -19757,7 +19808,7 @@ /area/shuttle/large_escape_pod1/station{ base_turf = /turf/simulated/mineral/floor/vacuum }) -"EB" = ( +"EF" = ( /obj/structure/shuttle/engine/propulsion{ dir = 8 }, @@ -19766,7 +19817,7 @@ /area/shuttle/large_escape_pod1/station{ base_turf = /turf/simulated/mineral/floor/vacuum }) -"EC" = ( +"EG" = ( /obj/structure/shuttle/engine/propulsion{ dir = 8; icon_state = "propulsion_r" @@ -19776,14 +19827,6 @@ /area/shuttle/large_escape_pod1/station{ base_turf = /turf/simulated/mineral/floor/vacuum }) -"ED" = ( -/obj/structure/table/rack{ - dir = 8; - layer = 2.9 - }, -/obj/random/maintenance/clean, -/turf/simulated/floor, -/area/maintenance/station/sec_lower) "EH" = ( /obj/random/junk, /obj/effect/floor_decal/techfloor{ @@ -29835,11 +29878,11 @@ pK UU rg rT -eJ -sz -sz -sz -uS +sd +sA +up +uT +EB vu uP sw @@ -29977,11 +30020,11 @@ pL qr rh rU -eN -sA +sz tJ -up -uT +uS +EA +EC vv vv sw @@ -31535,10 +31578,10 @@ fu fq oR kj +eJ pQ -qC -nU -sc +qD +rP sD tk tM @@ -31677,10 +31720,10 @@ fu fq oS kj +eN pR -qD -rp -sc +qE +rP sD tl tN @@ -31819,10 +31862,10 @@ fw fq kj kj -pS -qE +pO +qC +rp rq -sd sE sE sE @@ -32554,11 +32597,11 @@ AN Ci Bw yY -EA -EB -EB -EB -EC +EE +EF +EF +EF +EG yY ac ac diff --git a/vorestation.dme b/vorestation.dme index 96a687412d..af93f3e9db 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1625,6 +1625,7 @@ #include "code\modules\clothing\head\jobs.dm" #include "code\modules\clothing\head\misc.dm" #include "code\modules\clothing\head\misc_special.dm" +#include "code\modules\clothing\head\misc_vr.dm" #include "code\modules\clothing\head\pilot_helmet.dm" #include "code\modules\clothing\head\soft_caps.dm" #include "code\modules\clothing\head\solgov.dm"