diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 9af84740ad8..9a687fb4421 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,4 +1,4 @@ -#### Brief description of the issue +#### Brief description of the bug #### What you expected to happen diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm index ee1379ac288..5e62fe58021 100644 --- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm @@ -1,4 +1,4 @@ -//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively, +//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively, //but it does not permit gas to flow back from the environment into the injector. Can be turned off to prevent any gas flow. //When it receives the "inject" signal, it will try to pump it's entire contents into the environment regardless of pressure, using power. @@ -13,7 +13,7 @@ use_power = 0 idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 15000 //15000 W ~ 20 HP - + var/injecting = 0 var/volume_rate = 50 //flow rate limit @@ -26,7 +26,7 @@ /obj/machinery/atmospherics/unary/outlet_injector/New() ..() - air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more. + air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more. /obj/machinery/atmospherics/unary/outlet_injector/Destroy() unregister_radio(src, frequency) @@ -60,21 +60,21 @@ if((stat & (NOPOWER|BROKEN)) || !use_power) return - + var/power_draw = -1 var/datum/gas_mixture/environment = loc.return_air() - + if(environment && air_contents.temperature > 0) var/transfer_moles = (volume_rate/air_contents.volume)*air_contents.total_moles //apply flow rate limit power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating) - + if (power_draw >= 0) last_power_draw = power_draw use_power(power_draw) - + if(network) network.update = 1 - + return 1 /obj/machinery/atmospherics/unary/outlet_injector/proc/inject() @@ -84,7 +84,7 @@ var/datum/gas_mixture/environment = loc.return_air() if (!environment) return 0 - + injecting = 1 if(air_contents.temperature > 0) @@ -155,4 +155,23 @@ update_icon() /obj/machinery/atmospherics/unary/outlet_injector/hide(var/i) - update_underlays() \ No newline at end of file + update_underlays() + +/obj/machinery/atmospherics/unary/outlet_injector/attack_hand(mob/user as mob) + to_chat(user, "You toggle \the [src].") + injecting = !injecting + use_power = injecting + update_icon() + +/obj/machinery/atmospherics/unary/outlet_injector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!W.is_wrench()) + return ..() + + playsound(src, W.usesound, 50, 1) + to_chat(user, "You begin to unfasten \the [src]...") + if (do_after(user, 40 * W.toolspeed)) + user.visible_message( \ + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ + "You hear a ratchet.") + deconstruct() diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 1f7414e17f1..0d728085451 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -47,6 +47,8 @@ var/radio_filter_out var/radio_filter_in + var/datum/looping_sound/air_pump/soundloop + /obj/machinery/atmospherics/unary/vent_pump/on use_power = 1 icon_state = "map_vent_out" @@ -68,6 +70,10 @@ pressure_checks = 2 pressure_checks_default = 2 +/obj/machinery/atmospherics/unary/vent_pump/Initialize() + . = ..() + soundloop = new(list(src), FALSE) + /obj/machinery/atmospherics/unary/vent_pump/New() ..() air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP @@ -84,6 +90,7 @@ if(initial_loc) initial_loc.air_vent_info -= id_tag initial_loc.air_vent_names -= id_tag + QDEL_NULL(soundloop) return ..() /obj/machinery/atmospherics/unary/vent_pump/high_volume @@ -164,11 +171,15 @@ /obj/machinery/atmospherics/unary/vent_pump/proc/can_pump() if(stat & (NOPOWER|BROKEN)) + soundloop.stop() return 0 if(!use_power) + soundloop.stop() return 0 if(welded) + soundloop.stop() return 0 + soundloop.start() return 1 /obj/machinery/atmospherics/unary/vent_pump/process() diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 394fe72478a..59837bbe5f1 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -9,13 +9,13 @@ mob/proc/airflow_stun() if(last_airflow_stun > world.time - vsc.airflow_stun_cooldown) return 0 if(!(status_flags & CANSTUN) && !(status_flags & CANWEAKEN)) - src << "You stay upright as the air rushes past you." + to_chat(src, "You stay upright as the air rushes past you.") return 0 if(buckled) - src << "Air suddenly rushes past you!" + to_chat(src, "Air suddenly rushes past you!") return 0 if(!lying) - src << "The sudden rush of air knocks you over!" + to_chat(src, "The sudden rush of air knocks you over!") Weaken(5) last_airflow_stun = world.time diff --git a/code/ZAS/Diagnostic.dm b/code/ZAS/Diagnostic.dm index 29ab678ef1d..41fcdcad85c 100644 --- a/code/ZAS/Diagnostic.dm +++ b/code/ZAS/Diagnostic.dm @@ -10,10 +10,10 @@ client/proc/ZoneTick() var/result = air_master.Tick() if(result) - src << "Successfully Processed." + to_chat(src, "Successfully Processed.") else - src << "Failed to process! ([air_master.tick_progress])" + to_chat(src, "Failed to process! ([air_master.tick_progress])") */ client/proc/Zone_Info(turf/T as null|turf) diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm index 6ffec0be995..57a7d21036d 100644 --- a/code/ZAS/Phoron.dm +++ b/code/ZAS/Phoron.dm @@ -102,7 +102,8 @@ obj/var/contaminated = 0 if(vsc.plc.SKIN_BURNS && (species.breath_type != "phoron")) if(!pl_head_protected() || !pl_suit_protected()) burn_skin(0.75) - if(prob(20)) src << "Your skin burns!" + if(prob(20)) + to_chat(src, "Your skin burns!") updatehealth() //Burn eyes if exposed. @@ -133,17 +134,18 @@ obj/var/contaminated = 0 if(vsc.plc.GENETIC_CORRUPTION && (species.breath_type != "phoron")) if(rand(1,10000) < vsc.plc.GENETIC_CORRUPTION) randmutb(src) - src << "High levels of toxins cause you to spontaneously mutate!" + to_chat(src, "High levels of toxins cause you to spontaneously mutate!") domutcheck(src,null) /mob/living/carbon/human/proc/burn_eyes() var/obj/item/organ/internal/eyes/E = internal_organs_by_name[O_EYES] if(E) - if(prob(20)) src << "Your eyes burn!" + if(prob(20)) + to_chat(src, "Your eyes burn!") E.damage += 2.5 eye_blurry = min(eye_blurry+1.5,50) if (prob(max(0,E.damage - 15) + 1) &&!eye_blind) - src << "You are blinded!" + to_chat(src, "You are blinded!") Blind(20) /mob/living/carbon/human/proc/pl_head_protected() diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm index c65a87d6c82..ccffcf43416 100644 --- a/code/__defines/belly_modes_vr.dm +++ b/code/__defines/belly_modes_vr.dm @@ -32,6 +32,7 @@ #define DM_FLAG_NUMBING 0x1 #define DM_FLAG_STRIPPING 0x2 #define DM_FLAG_LEAVEREMAINS 0x4 +#define DM_FLAG_THICKBELLY 0x8 //Item related modes #define IM_HOLD "Hold" diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm index 399c7e879b8..0976ed5ea36 100644 --- a/code/__defines/chemistry.dm +++ b/code/__defines/chemistry.dm @@ -35,6 +35,7 @@ #define CE_ALCOHOL_TOXIC "alcotoxic" // Liver damage #define CE_SPEEDBOOST "gofast" // Hyperzine #define CE_SLOWDOWN "goslow" // Slowdown +#define CE_ANTACID "nopuke" // Don't puke. #define REAGENTS_PER_SHEET 20 diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index 9692409d458..c87b9942dfc 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -8,6 +8,7 @@ #define HALLOSS "halloss" #define ELECTROCUTE "electrocute" #define BIOACID "bioacid" +#define SEARING "searing" #define CUT "cut" #define BRUISE "bruise" diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 2dc4afe70aa..69b91d0dc32 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -175,6 +175,7 @@ #define MAT_LEAD "lead" #define MAT_SUPERMATTER "supermatter" #define MAT_METALHYDROGEN "mhydrogen" +#define MAT_OSMIUM "osmium" #define SHARD_SHARD "shard" #define SHARD_SHRAPNEL "shrapnel" @@ -347,10 +348,12 @@ var/global/list/##LIST_NAME = list();\ #define RCD_MAX_CAPACITY 30 * RCD_SHEETS_PER_MATTER_UNIT // Radiation 'levels'. Used for the geiger counter, for visuals and sound. They are in different files so this goes here. -#define RAD_LEVEL_LOW 0.01 // Around the level at which radiation starts to become harmful -#define RAD_LEVEL_MODERATE 10 +#define RAD_LEVEL_LOW 0.5 // Around the level at which radiation starts to become harmful +#define RAD_LEVEL_MODERATE 5 #define RAD_LEVEL_HIGH 25 -#define RAD_LEVEL_VERY_HIGH 50 +#define RAD_LEVEL_VERY_HIGH 75 + +#define RADIATION_THRESHOLD_CUTOFF 0.1 // Radiation will not affect a tile when below this value. //https://secure.byond.com/docs/ref/info.html#/atom/var/mouse_opacity #define MOUSE_OPACITY_TRANSPARENT 0 diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 8426edcfcfe..de9ffa6cf9d 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -194,10 +194,24 @@ #define O_KIDNEYS "kidneys" #define O_APPENDIX "appendix" #define O_VOICE "voicebox" -#define O_STANDARD list(O_EYES, O_HEART, O_LUNGS, O_BRAIN, O_LIVER, O_KIDNEYS, O_APPENDIX, O_VOICE) +#define O_SPLEEN "spleen" +#define O_STOMACH "stomach" +#define O_INTESTINE "intestine" +#define O_STANDARD list(O_EYES, O_HEART, O_LUNGS, O_BRAIN, O_LIVER, O_KIDNEYS, O_SPLEEN, O_APPENDIX, O_VOICE, O_STOMACH, O_INTESTINE) // Augments -#define O_AUG_TSHADE "integrated thermolensing implant" +#define O_AUG_EYES "occular augment" + +#define O_AUG_L_FOREARM "left forearm augment" +#define O_AUG_R_FOREARM "right forearm augment" +#define O_AUG_L_UPPERARM "left upperarm augment" +#define O_AUG_R_UPPERARM "right upperarm augment" +#define O_AUG_L_HAND "left hand augment" +#define O_AUG_R_HAND "right hand augment" + +#define O_AUG_RIBS "rib augment" +#define O_AUG_SPINE "spinal augment" +#define O_AUG_PELVIC "pelvic augment" // Non-Standard organs #define O_MOUTH "mouth" @@ -210,13 +224,17 @@ #define O_GBLADDER "gas bladder" #define O_POLYP "polyp segment" #define O_ANCHOR "anchoring ligament" +#define O_REGBRUTE "pneumoregenitor" +#define O_REGBURN "thermoregenitor" +#define O_REGOXY "respiroregenitor" +#define O_REGTOX "toxoregenitor" #define O_ACID "acid gland" #define O_EGG "egg sac" #define O_RESIN "resin spinner" #define O_AREJECT "immune hub" #define O_VENTC "morphoplastic node" #define O_VRLINK "virtual node" -#define O_ALL list(O_STANDARD, O_MOUTH, O_CELL, O_PLASMA, O_HIVE, O_NUTRIENT, O_STRATA, O_RESPONSE, O_GBLADDER, O_POLYP, O_ANCHOR, O_ACID, O_EGG, O_RESIN, O_AREJECT, O_VENTC, O_VRLINK) +#define O_ALL list(O_STANDARD, O_MOUTH, O_CELL, O_PLASMA, O_HIVE, O_NUTRIENT, O_STRATA, O_RESPONSE, O_GBLADDER, O_POLYP, O_ANCHOR, O_REGBRUTE, O_REGBURN, O_REGOXY, O_REGTOX, O_ACID, O_EGG, O_RESIN, O_AREJECT, O_VENTC, O_VRLINK) // External organs, aka limbs #define BP_L_FOOT "l_foot" diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm index fadd802c84e..5e9bb78189e 100644 --- a/code/__defines/mobs_vr.dm +++ b/code/__defines/mobs_vr.dm @@ -35,3 +35,4 @@ #define SPECIES_MONKEY_NEVREAN "Sparra" #define SPECIES_MONKEY_SERGAL "Saru" #define SPECIES_MONKEY_VULPKANIN "Wolpin" +#define SPECIES_WEREBEAST "Werebeast" diff --git a/code/__defines/sound.dm b/code/__defines/sound.dm index 0995f0e071f..d954d34b2a0 100644 --- a/code/__defines/sound.dm +++ b/code/__defines/sound.dm @@ -8,11 +8,12 @@ #define CHANNEL_AMBIENCE 1018 #define CHANNEL_BUZZ 1017 #define CHANNEL_BICYCLE 1016 +#define CHANNEL_PREYLOOP 1015 //VORESTATION ADD - Fancy Sound Loop channel //THIS SHOULD ALWAYS BE THE LOWEST ONE! //KEEP IT UPDATED -#define CHANNEL_HIGHEST_AVAILABLE 1015 +#define CHANNEL_HIGHEST_AVAILABLE 1014 //VORESTATION EDIT - Fancy Sound Loop channel from 1015 #define SOUND_MINIMUM_PRESSURE 10 #define FALLOFF_SOUNDS 0.5 diff --git a/code/__defines/species_languages_vr.dm b/code/__defines/species_languages_vr.dm index 1004c1e22c1..831df5253dd 100644 --- a/code/__defines/species_languages_vr.dm +++ b/code/__defines/species_languages_vr.dm @@ -1,5 +1,6 @@ #define SPECIES_WHITELIST_SELECTABLE 0x20 // Can select and customize, but not join as +#define LANGUAGE_SLAVIC "Pan-Slavic" #define LANGUAGE_BIRDSONG "Birdsong" #define LANGUAGE_SAGARU "Sagaru" #define LANGUAGE_CANILUNZT "Canilunzt" diff --git a/code/__defines/xenoarcheaology.dm b/code/__defines/xenoarcheaology.dm index 45e40cfbdeb..8a4988b78c0 100644 --- a/code/__defines/xenoarcheaology.dm +++ b/code/__defines/xenoarcheaology.dm @@ -36,7 +36,8 @@ #define ARCHAEO_ALIEN_ITEM 36 #define ARCHAEO_ALIEN_BOAT 37 #define ARCHAEO_IMPERION_CIRCUIT 38 -#define MAX_ARCHAEO 38 +#define ARCHAEO_TELECUBE 39 +#define MAX_ARCHAEO 39 #define DIGSITE_GARDEN 1 #define DIGSITE_ANIMAL 2 diff --git a/code/_global_vars/mobs.dm b/code/_global_vars/mobs.dm index 10d829904ab..7e60dc71ea2 100644 --- a/code/_global_vars/mobs.dm +++ b/code/_global_vars/mobs.dm @@ -5,3 +5,4 @@ GLOBAL_LIST_EMPTY(stealthminID) GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client GLOBAL_LIST_EMPTY(clients) GLOBAL_LIST_EMPTY(players_by_zlevel) +GLOBAL_LIST_EMPTY(round_text_log) diff --git a/code/_helpers/files.dm b/code/_helpers/files.dm index 4a7b9fa646e..dd8c5dd6901 100644 --- a/code/_helpers/files.dm +++ b/code/_helpers/files.dm @@ -39,7 +39,7 @@ var/extension = copytext(path,-4,0) if( !fexists(path) || !(extension in valid_extensions) ) - src << "Error: browse_files(): File not found/Invalid file([path])." + to_chat(src, "Error: browse_files(): File not found/Invalid file([path]).") return return path @@ -53,7 +53,7 @@ /client/proc/file_spam_check() var/time_to_wait = fileaccess_timer - world.time if(time_to_wait > 0) - src << "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds." + to_chat(src, "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.") return 1 fileaccess_timer = world.time + FTPDELAY return 0 diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 846291edc46..c9a64048a8b 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -42,40 +42,8 @@ var/global/list/item_vore_blacklist = list( /obj/item/weapon/disk/nuclear, /obj/item/clothing/suit/storage/hooded/wintercoat/roiz) -var/global/list/digestion_sounds = list( - 'sound/vore/digest1.ogg', - 'sound/vore/digest2.ogg', - 'sound/vore/digest3.ogg', - 'sound/vore/digest4.ogg', - 'sound/vore/digest5.ogg', - 'sound/vore/digest6.ogg', - 'sound/vore/digest7.ogg', - 'sound/vore/digest8.ogg', - 'sound/vore/digest9.ogg', - 'sound/vore/digest10.ogg', - 'sound/vore/digest11.ogg', - 'sound/vore/digest12.ogg') - -var/global/list/death_sounds = list( - 'sound/vore/death1.ogg', - 'sound/vore/death2.ogg', - 'sound/vore/death3.ogg', - 'sound/vore/death4.ogg', - 'sound/vore/death5.ogg', - 'sound/vore/death6.ogg', - 'sound/vore/death7.ogg', - 'sound/vore/death8.ogg', - 'sound/vore/death9.ogg', - 'sound/vore/death10.ogg') - -var/global/list/hunger_sounds = list( - 'sound/vore/growl1.ogg', - 'sound/vore/growl2.ogg', - 'sound/vore/growl3.ogg', - 'sound/vore/growl4.ogg', - 'sound/vore/growl5.ogg') - -var/global/list/vore_sounds = list( +//Classic Vore sounds +var/global/list/classic_vore_sounds = list( "Gulp" = 'sound/vore/gulp.ogg', "Insert" = 'sound/vore/insert.ogg', "Insertion1" = 'sound/vore/insertion1.ogg', @@ -86,15 +54,55 @@ var/global/list/vore_sounds = list( "Squish2" = 'sound/vore/squish2.ogg', "Squish3" = 'sound/vore/squish3.ogg', "Squish4" = 'sound/vore/squish4.ogg', - "Rustle (cloth)" = 'sound/effects/rustle5.ogg', + "Rustle (cloth)" = 'sound/effects/rustle1.ogg', + "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg', + "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', + "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', + "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', "None" = null) -var/global/list/struggle_sounds = list( - "Squish1" = 'sound/vore/squish1.ogg', - "Squish2" = 'sound/vore/squish2.ogg', - "Squish3" = 'sound/vore/squish3.ogg', - "Squish4" = 'sound/vore/squish4.ogg') +var/global/list/classic_release_sounds = list( + "Rustle (cloth)" = 'sound/effects/rustle1.ogg', + "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg', + "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', + "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', + "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "Splatter" = 'sound/effects/splat.ogg', + "None" = null + ) +//Poojy's Fancy Sounds +var/global/list/fancy_vore_sounds = list( + "Gulp" = 'sound/vore/sunesound/pred/swallow_01.ogg', + "Swallow" = 'sound/vore/sunesound/pred/swallow_02.ogg', + "Insertion1" = 'sound/vore/sunesound/pred/insertion_01.ogg', + "Insertion2" = 'sound/vore/sunesound/pred/insertion_02.ogg', + "Tauric Swallow" = 'sound/vore/sunesound/pred/taurswallow.ogg', + "Stomach Move" = 'sound/vore/sunesound/pred/stomachmove.ogg', + "Schlorp" = 'sound/vore/sunesound/pred/schlorp.ogg', + "Squish1" = 'sound/vore/sunesound/pred/squish_01.ogg', + "Squish2" = 'sound/vore/sunesound/pred/squish_02.ogg', + "Squish3" = 'sound/vore/sunesound/pred/squish_03.ogg', + "Squish4" = 'sound/vore/sunesound/pred/squish_04.ogg', + "Rustle (cloth)" = 'sound/effects/rustle1.ogg', + "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg', + "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', + "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', + "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "None" = null + ) + +var/global/list/fancy_release_sounds = list( + "Rustle (cloth)" = 'sound/effects/rustle1.ogg', + "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg', + "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', + "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', + "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "Stomach Move" = 'sound/vore/sunesound/pred/stomachmove.ogg', + "Pred Escape" = 'sound/vore/sunesound/pred/escape.ogg', + "Splatter" = 'sound/effects/splat.ogg', + "None" = null + ) var/global/list/global_vore_egg_types = list( "Unathi" = UNATHI_EGG, @@ -124,6 +132,7 @@ var/global/list/tf_vore_egg_types = list( var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/clothing/accessory/collar, //TFF 10/7/19 - add option to nom collars, + /obj/item/device/communicator, //TFF 19/9/19 - add option to nom communicators and commwatches, /obj/item/clothing/mask, /obj/item/clothing/glasses, /obj/item/clothing/gloves, diff --git a/code/_helpers/icons_vr.dm b/code/_helpers/icons_vr.dm index be5de68e82d..60765578e71 100644 --- a/code/_helpers/icons_vr.dm +++ b/code/_helpers/icons_vr.dm @@ -42,4 +42,18 @@ for(var/x_pixel = 1 to I.Width()) if (I.GetPixel(x_pixel, y_pixel)) return y_pixel - 1 - return null \ No newline at end of file + return null + +//Standard behaviour is to cut pixels from the main icon that are covered by pixels from the mask icon unless passed mask_ready, see below. +/proc/get_icon_difference(var/icon/main, var/icon/mask, var/mask_ready) + /*You should skip prep if the mask is already sprited properly. This significantly improves performance by eliminating most of the realtime icon work. + e.g. A 'ready' mask is a mask where the part you want cut out is missing (no pixels, 0 alpha) from the sprite, and everything else is solid white.*/ + + if(istype(main) && istype(mask)) + if(!mask_ready) //Prep the mask if we're using a regular old sprite and not a special-made mask. + mask.Blend(rgb(255,255,255), ICON_SUBTRACT) //Make all pixels on the mask as black as possible. + mask.Opaque(rgb(255,255,255)) //Make the transparent pixels (background) white. + mask.BecomeAlphaMask() //Make all the black pixels vanish (fully transparent), leaving only the white background pixels. + + main.AddAlphaMask(mask) //Make the pixels in the main icon that are in the transparent zone of the mask icon also vanish (fully transparent). + return main diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index c771de02ef6..51c9c015279 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -61,8 +61,8 @@ /proc/log_access_in(client/new_client) if (config.log_access) - var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]" - WRITE_LOG(diary, "ACCESS IN: [message]") + var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]" + WRITE_LOG(diary, "ACCESS IN: [message]") //VOREStation Edit /proc/log_access_out(mob/last_mob) if (config.log_access) @@ -73,26 +73,46 @@ if (config.log_say) WRITE_LOG(diary, "SAY: [speaker.simple_info_line()]: [html_decode(text)]") + //Log the message to in-game dialogue logs, as well. + if(speaker.client) + speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]" + GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]" + /proc/log_ooc(text, client/user) if (config.log_ooc) WRITE_LOG(diary, "OOC: [user.simple_info_line()]: [html_decode(text)]") + GLOB.round_text_log += "([time_stamp()]) ([user]) OOC: - [text]" + /proc/log_aooc(text, client/user) if (config.log_ooc) WRITE_LOG(diary, "AOOC: [user.simple_info_line()]: [html_decode(text)]") + GLOB.round_text_log += "([time_stamp()]) ([user]) AOOC: - [text]" + /proc/log_looc(text, client/user) if (config.log_ooc) WRITE_LOG(diary, "LOOC: [user.simple_info_line()]: [html_decode(text)]") + GLOB.round_text_log += "([time_stamp()]) ([user]) LOOC: - [text]" + /proc/log_whisper(text, mob/speaker) if (config.log_whisper) WRITE_LOG(diary, "WHISPER: [speaker.simple_info_line()]: [html_decode(text)]") + if(speaker.client) + speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]" + GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]" + + /proc/log_emote(text, mob/speaker) if (config.log_emote) WRITE_LOG(diary, "EMOTE: [speaker.simple_info_line()]: [html_decode(text)]") + if(speaker.client) + speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) EMOTE: - [text]" + GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) EMOTE: - [text]" + /proc/log_attack(attacker, defender, message) if (config.log_attack) WRITE_LOG(diary, "ATTACK: [attacker] against [defender]: [message]") @@ -113,6 +133,10 @@ if (config.log_say) WRITE_LOG(diary, "DEADCHAT: [speaker.simple_info_line()]: [html_decode(text)]") + speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) DEADSAY: - [text]" + GLOB.round_text_log += "([time_stamp()]) ([src]/[speaker.client]) DEADSAY: - [text]" + + /proc/log_ghostemote(text, mob/speaker) if (config.log_emote) WRITE_LOG(diary, "DEADEMOTE: [speaker.simple_info_line()]: [html_decode(text)]") @@ -125,6 +149,10 @@ if (config.log_pda) WRITE_LOG(diary, "PDA: [speaker.simple_info_line()]: [html_decode(text)]") + speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) MSG: - [text]" + GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) MSG: - [text]" + + /proc/log_to_dd(text) world.log << text //this comes before the config check because it can't possibly runtime if(config.log_world_output) @@ -222,7 +250,7 @@ if(include_link && is_special_character(M) && highlight_special_characters) name = "[name]" //Orange - + . += "/([name])" return . diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 9104bc71d9a..d85c33a4e5c 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -358,7 +358,7 @@ Turf and target are seperate in case you want to teleport some distance from a t break if(newname) break //That's a suitable name! - src << "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken." + to_chat(src, "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken.") if(!newname) //we'll stick with the oldname then return diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 643ab6d7905..299ccf6ec25 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -114,6 +114,19 @@ trigger_aiming(TARGET_CAN_CLICK) return 1 + // VOREStation Addition Start: inbelly item interaction + if(isbelly(loc) && (loc == A.loc)) + if(W) + var/resolved = W.resolve_attackby(A,src) + if(!resolved && A && W) + W.afterattack(A, src, 1, params) // 1: clicking something Adjacent + else + if(ismob(A)) // No instant mob attacking + setClickCooldown(get_attack_speed()) + UnarmedAttack(A, 1) + return + // VOREStation Addition End + if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that return @@ -170,7 +183,7 @@ /mob/living/UnarmedAttack(var/atom/A, var/proximity_flag) if(!ticker) - src << "You cannot attack people before the game has started." + to_chat(src, "You cannot attack people before the game has started.") return 0 if(stat) @@ -303,7 +316,7 @@ nutrition = max(nutrition - rand(1,5),0) handle_regular_hud_updates() else - src << "You're out of energy! You need food!" + to_chat(src, "You're out of energy! You need food!") // Simple helper to face what you clicked on, in case it should be needed in more than one place /mob/proc/face_atom(var/atom/A) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 1dcc2bc9551..8d107e8f645 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -45,7 +45,7 @@ if(is_component_functioning("camera")) aiCamera.captureimage(A, usr) else - src << "Your camera isn't functional." + to_chat(src, "Your camera isn't functional.") return /* diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm index d29ef9dd967..fc06f8e0cc6 100644 --- a/code/_onclick/hud/ability_screen_objects.dm +++ b/code/_onclick/hud/ability_screen_objects.dm @@ -282,7 +282,7 @@ if(!mob) return // Paranoid. if(isnull(slot) || !isnum(slot)) - src << ".activate_ability requires a number as input, corrisponding to the slot you wish to use." + to_chat(src, ".activate_ability requires a number as input, corrisponding to the slot you wish to use.") return // Bad input. if(!mob.ability_master) return // No abilities. diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index f34a68a742f..d5197cb30f3 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -6,9 +6,9 @@ if(!client) return client.inquisitive_ghost = !client.inquisitive_ghost if(client.inquisitive_ghost) - src << "You will now examine everything you click on." + to_chat(src, "You will now examine everything you click on.") else - src << "You will no longer examine things you click on." + to_chat(src, "You will no longer examine things you click on.") /mob/observer/dead/DblClickOn(var/atom/A, var/params) if(client.buildmode) diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index 5f2561c25c7..ed7a1c7e2fb 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -18,15 +18,15 @@ switch(hardsuit_click_mode) if(MIDDLE_CLICK) - src << "Hardsuit activation mode set to middle-click." + to_chat(src, "Hardsuit activation mode set to middle-click.") if(ALT_CLICK) - src << "Hardsuit activation mode set to alt-click." + to_chat(src, "Hardsuit activation mode set to alt-click.") if(CTRL_CLICK) - src << "Hardsuit activation mode set to control-click." + to_chat(src, "Hardsuit activation mode set to control-click.") else // should never get here, but just in case: soft_assert(0, "Bad hardsuit click mode: [hardsuit_click_mode] - expected 0 to [MAX_HARDSUIT_CLICK_MODE]") - src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click." + to_chat(src, "Somehow you bugged the system. Setting your hardsuit mode to middle-click.") hardsuit_click_mode = MIDDLE_CLICK /mob/living/MiddleClickOn(atom/A) diff --git a/code/controllers/Processes/planet.dm b/code/controllers/Processes/planet.dm deleted file mode 100644 index 18043f92702..00000000000 --- a/code/controllers/Processes/planet.dm +++ /dev/null @@ -1,96 +0,0 @@ -var/datum/controller/process/planet/planet_controller = null - -/datum/controller/process/planet - var/list/planets = list() - var/list/z_to_planet = list() - -/datum/controller/process/planet/setup() - name = "planet controller" - planet_controller = src - schedule_interval = 1 MINUTE - start_delay = 20 SECONDS - - var/list/planet_datums = typesof(/datum/planet) - /datum/planet - for(var/P in planet_datums) - var/datum/planet/NP = new P() - planets.Add(NP) - - allocateTurfs() - -/datum/controller/process/planet/proc/allocateTurfs() - for(var/turf/simulated/OT in outdoor_turfs) - for(var/datum/planet/P in planets) - if(OT.z in P.expected_z_levels) - P.planet_floors |= OT - OT.vis_contents |= P.weather_holder.visuals - break - outdoor_turfs.Cut() //Why were you in there INCORRECTLY? - - for(var/turf/unsimulated/wall/planetary/PW in planetary_walls) - for(var/datum/planet/P in planets) - if(PW.type == P.planetary_wall_type) - P.planet_walls |= PW - break - planetary_walls.Cut() - -/datum/controller/process/planet/proc/unallocateTurf(var/turf/T) - for(var/planet in planets) - var/datum/planet/P = planet - if(T.z in P.expected_z_levels) - P.planet_floors -= T - T.vis_contents -= P.weather_holder.visuals - -/datum/controller/process/planet/doWork() - if(outdoor_turfs.len || planetary_walls.len) - allocateTurfs() - - for(var/datum/planet/P in planets) - P.process(schedule_interval / 10) - SCHECK //Your process() really shouldn't take this long... - - //Sun light needs changing - if(P.needs_work & PLANET_PROCESS_SUN) - P.needs_work &= ~PLANET_PROCESS_SUN - // Remove old value from corners - var/list/sunlit_corners = P.sunlit_corners - var/old_lum_r = -P.sun["lum_r"] - var/old_lum_g = -P.sun["lum_g"] - var/old_lum_b = -P.sun["lum_b"] - if(old_lum_r || old_lum_g || old_lum_b) - for(var/C in P.sunlit_corners) - var/datum/lighting_corner/LC = C - LC.update_lumcount(old_lum_r, old_lum_g, old_lum_b) - SCHECK - sunlit_corners.Cut() - - // Calculate new values to apply - var/new_brightness = P.sun["brightness"] - var/new_color = P.sun["color"] - var/lum_r = new_brightness * GetRedPart (new_color) / 255 - var/lum_g = new_brightness * GetGreenPart(new_color) / 255 - var/lum_b = new_brightness * GetBluePart (new_color) / 255 - var/static/update_gen = -1 // Used to prevent double-processing corners. Otherwise would happen when looping over adjacent turfs. - for(var/I in P.planet_floors) - var/turf/simulated/T = I - if(!T.lighting_corners_initialised) - T.generate_missing_corners() - for(var/C in T.get_corners()) - var/datum/lighting_corner/LC = C - if(LC.update_gen != update_gen && LC.active) - sunlit_corners += LC - LC.update_gen = update_gen - LC.update_lumcount(lum_r, lum_g, lum_b) - SCHECK - update_gen-- - P.sun["lum_r"] = lum_r - P.sun["lum_g"] = lum_g - P.sun["lum_b"] = lum_b - - //Temperature needs updating - if(P.needs_work & PLANET_PROCESS_TEMP) - P.needs_work &= ~PLANET_PROCESS_TEMP - //Set new temperatures - for(var/W in P.planet_walls) - var/turf/unsimulated/wall/planetary/wall = W - wall.set_temperature(P.weather_holder.temperature) - SCHECK diff --git a/code/controllers/Processes/radiation.dm b/code/controllers/Processes/radiation.dm deleted file mode 100644 index 71d9c60233e..00000000000 --- a/code/controllers/Processes/radiation.dm +++ /dev/null @@ -1,56 +0,0 @@ -/datum/controller/process/radiation - var/repository/radiation/linked = null - -/datum/controller/process/radiation/setup() - name = "radiation controller" - schedule_interval = 20 // every 2 seconds - linked = radiation_repository - -/datum/controller/process/radiation/doWork() - sources_decay() - cache_expires() - irradiate_targets() - -// Step 1 - Sources Decay -/datum/controller/process/radiation/proc/sources_decay() - var/list/sources = linked.sources - for(var/thing in sources) - var/datum/radiation_source/S = thing - if(QDELETED(S)) - sources.Remove(S) - continue - if(S.decay) - S.update_rad_power(S.rad_power - config.radiation_decay_rate) - if(S.rad_power <= config.radiation_lower_limit) - sources.Remove(S) - SCHECK // This scheck probably just wastes resources, but better safe than sorry in this case. - -// Step 2 - Cache Expires -/datum/controller/process/radiation/proc/cache_expires() - var/list/resistance_cache = linked.resistance_cache - for(var/thing in resistance_cache) - var/turf/T = thing - if(QDELETED(T)) - resistance_cache.Remove(T) - continue - if((length(T.contents) + 1) != resistance_cache[T]) - resistance_cache.Remove(T) // If its stale REMOVE it! It will get added if its needed. - SCHECK - -// Step 3 - Registered irradiatable things are checked for radiation -/datum/controller/process/radiation/proc/irradiate_targets() - var/list/registered_listeners = living_mob_list // For now just use this. Nothing else is interested anyway. - if(length(linked.sources) > 0) - for(var/thing in registered_listeners) - var/atom/A = thing - if(QDELETED(A)) - continue - var/turf/T = get_turf(thing) - var/rads = linked.get_rads_at_turf(T) - if(rads) - A.rad_act(rads) - SCHECK - -/datum/controller/process/radiation/statProcess() - ..() - stat(null, "[linked.sources.len] sources, [linked.resistance_cache.len] cached turfs") diff --git a/code/controllers/Processes/scheduler.dm b/code/controllers/Processes/scheduler.dm deleted file mode 100644 index ac5e4696abc..00000000000 --- a/code/controllers/Processes/scheduler.dm +++ /dev/null @@ -1,169 +0,0 @@ -/var/datum/controller/process/scheduler/scheduler - -/************ -* Scheduler * -************/ -/datum/controller/process/scheduler - var/list/scheduled_tasks - -/datum/controller/process/scheduler/setup() - name = "scheduler" - schedule_interval = 1 SECOND - scheduled_tasks = list() - scheduler = src - -/datum/controller/process/scheduler/doWork() - var/world_time = world.time - for(last_object in scheduled_tasks) - var/datum/scheduled_task/scheduled_task = last_object - if(world_time < scheduled_task.trigger_time) - break // Too early for this one, and therefore too early for all remaining. - try - unschedule(scheduled_task) - scheduled_task.pre_process() - scheduled_task.process() - scheduled_task.post_process() - catch(var/exception/e) - catchException(e, last_object) - SCHECK - -// We've been restarted, probably due to having a massive list of tasks. -// Lets copy over the task list as safely as we can and try to chug thru it... -// Note: We won't be informed about tasks being destroyed, but this is the best we can do. -/datum/controller/process/scheduler/copyStateFrom(var/datum/controller/process/scheduler/target) - scheduled_tasks = list() - for(var/datum/scheduled_task/st in target.scheduled_tasks) - if(!QDELETED(st) && istype(st)) - schedule(st) - scheduler = src - -// We are being killed. Least we can do is deregister all those events we registered -/datum/controller/process/scheduler/onKill() - for(var/st in scheduled_tasks) - GLOB.destroyed_event.unregister(st, src) - -/datum/controller/process/scheduler/statProcess() - ..() - stat(null, "[scheduled_tasks.len] task\s") - -/datum/controller/process/scheduler/proc/schedule(var/datum/scheduled_task/st) - dd_insertObjectList(scheduled_tasks, st) - -/datum/controller/process/scheduler/proc/unschedule(var/datum/scheduled_task/st) - scheduled_tasks -= st - -/********** -* Helpers * -**********/ -/proc/schedule_task_in(var/in_time, var/procedure, var/list/arguments = list()) - return schedule_task(world.time + in_time, procedure, arguments) - -/proc/schedule_callback_in(var/in_time, var/datum/callback) - return schedule_callback(world.time + in_time, callback) - -/proc/schedule_task_with_source_in(var/in_time, var/source, var/procedure, var/list/arguments = list()) - return schedule_task_with_source(world.time + in_time, source, procedure, arguments) - -/proc/schedule_task(var/trigger_time, var/procedure, var/list/arguments) - var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/destroy_scheduled_task, list()) - scheduler.schedule(st) - return st - -/proc/schedule_callback(var/trigger_time, var/datum/callback) - var/datum/scheduled_task/callback/st = new/datum/scheduled_task/callback(trigger_time, callback, /proc/destroy_scheduled_task, list()) - scheduler.schedule(st) - return st - -/proc/schedule_task_with_source(var/trigger_time, var/source, var/procedure, var/list/arguments) - var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/destroy_scheduled_task, list()) - scheduler.schedule(st) - return st - -/proc/schedule_repeating_task(var/trigger_time, var/repeat_interval, var/procedure, var/list/arguments) - var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval)) - scheduler.schedule(st) - return st - -/proc/schedule_repeating_task_with_source(var/trigger_time, var/repeat_interval, var/source, var/procedure, var/list/arguments) - var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval)) - scheduler.schedule(st) - return st - -/************* -* Task Datum * -*************/ -/datum/scheduled_task - var/trigger_time - var/procedure - var/list/arguments - var/task_after_process - var/list/task_after_process_args - -/datum/scheduled_task/New(var/trigger_time, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args) - ..() - src.trigger_time = trigger_time - src.procedure = procedure - src.arguments = arguments ? arguments : list() - src.task_after_process = task_after_process ? task_after_process : /proc/destroy_scheduled_task - src.task_after_process_args = istype(task_after_process_args) ? task_after_process_args : list() - task_after_process_args += src - -/datum/scheduled_task/Destroy() - scheduler.unschedule(src) - procedure = null - arguments.Cut() - task_after_process = null - task_after_process_args.Cut() - return ..() - -/datum/scheduled_task/dd_SortValue() - return trigger_time - -/datum/scheduled_task/proc/pre_process() - task_triggered_event.raise_event(list(src)) - -/datum/scheduled_task/proc/process() - if(procedure) - call(procedure)(arglist(arguments)) - -/datum/scheduled_task/proc/post_process() - call(task_after_process)(arglist(task_after_process_args)) - -// Resets the trigger time, has no effect if the task has already triggered -/datum/scheduled_task/proc/trigger_task_in(var/trigger_in) - src.trigger_time = world.time + trigger_in - -/datum/scheduled_task/callback - var/datum/callback/callback - -/datum/scheduled_task/callback/New(var/trigger_time, var/datum/callback, var/proc/task_after_process, var/list/task_after_process_args) - src.callback = callback - ..(trigger_time = trigger_time, task_after_process = task_after_process, task_after_process_args = task_after_process_args) - -/datum/scheduled_task/callback/process() - callback.Invoke() - -/datum/scheduled_task/source - var/datum/source - -/datum/scheduled_task/source/New(var/trigger_time, var/datum/source, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args) - src.source = source - GLOB.destroyed_event.register(src.source, src, /datum/scheduled_task/source/proc/source_destroyed) - ..(trigger_time, procedure, arguments, task_after_process, task_after_process_args) - -/datum/scheduled_task/source/Destroy() - source = null - return ..() - -/datum/scheduled_task/source/process() - call(source, procedure)(arglist(arguments)) - -/datum/scheduled_task/source/proc/source_destroyed() - qdel(src) - -/proc/destroy_scheduled_task(var/datum/scheduled_task/st) - qdel(st) - -/proc/repeat_scheduled_task(var/trigger_delay, var/datum/scheduled_task/st) - st.trigger_time = world.time + trigger_delay - scheduler.schedule(st) diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm index a741869b5b3..9938fa20eb0 100644 --- a/code/controllers/subsystems/garbage.dm +++ b/code/controllers/subsystems/garbage.dm @@ -240,9 +240,9 @@ SUBSYSTEM_DEF(garbage) time = TICK_DELTA_TO_MS(tick)/100 if (time > highest_del_time) highest_del_time = time - if (time > 10) - log_game("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete)") - message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete).") + if (time > 20) //VOREStation Edit + log_game("Error: [type]([refID]) took longer than 2 seconds to delete (took [time/10] seconds to delete)") //VOREStation Edit + message_admins("Error: [type]([refID]) took longer than 2 seconds to delete (took [time/10] seconds to delete).") //VOREStation Edit postpone(time) /datum/controller/subsystem/garbage/proc/HardQueue(datum/D) diff --git a/code/controllers/subsystems/radiation.dm b/code/controllers/subsystems/radiation.dm new file mode 100644 index 00000000000..babc2c7d5d4 --- /dev/null +++ b/code/controllers/subsystems/radiation.dm @@ -0,0 +1,135 @@ +SUBSYSTEM_DEF(radiation) + name = "Radiation" + wait = 2 SECONDS + flags = SS_NO_INIT + + var/list/sources = list() // all radiation source datums + var/list/sources_assoc = list() // Sources indexed by turf for de-duplication. + var/list/resistance_cache = list() // Cache of turf's radiation resistance. + + var/tmp/list/current_sources = list() + var/tmp/list/current_res_cache = list() + var/tmp/list/listeners = list() + +/datum/controller/subsystem/radiation/fire(resumed = FALSE) + if (!resumed) + current_sources = sources.Copy() + current_res_cache = resistance_cache.Copy() + listeners = living_mob_list.Copy() + + while(current_sources.len) + var/datum/radiation_source/S = current_sources[current_sources.len] + current_sources.len-- + + if(QDELETED(S)) + sources -= S + else if(S.decay) + S.update_rad_power(S.rad_power - config.radiation_decay_rate) + if (MC_TICK_CHECK) + return + + while(current_res_cache.len) + var/turf/T = current_res_cache[current_res_cache.len] + current_res_cache.len-- + + if(QDELETED(T)) + resistance_cache -= T + else if((length(T.contents) + 1) != resistance_cache[T]) + resistance_cache -= T // If its stale REMOVE it! It will get added if its needed. + if (MC_TICK_CHECK) + return + + if(!sources.len) + listeners.Cut() + + while(listeners.len) + var/atom/A = listeners[listeners.len] + listeners.len-- + + if(!QDELETED(A)) + var/turf/T = get_turf(A) + var/rads = get_rads_at_turf(T) + if(rads) + A.rad_act(rads) + if (MC_TICK_CHECK) + return + +/datum/controller/subsystem/radiation/stat_entry() + ..("S:[sources.len], RC:[resistance_cache.len]") + +// Ray trace from all active radiation sources to T and return the strongest effect. +/datum/controller/subsystem/radiation/proc/get_rads_at_turf(var/turf/T) + . = 0 + if(!istype(T)) + return + + for(var/value in sources) + var/datum/radiation_source/source = value + if(source.rad_power < .) + continue // Already being affected by a stronger source + if(source.source_turf.z != T.z) + continue // Radiation is not multi-z + if(source.respect_maint) + var/area/A = T.loc + if(A.flags & RAD_SHIELDED) + continue // In shielded area + + var/dist = get_dist(source.source_turf, T) + if(dist > source.range) + continue // Too far to possibly affect + if(source.flat) + . = max(., source.rad_power) + continue // No need to ray trace for flat field + + // Okay, now ray trace to find resistence! + var/turf/origin = source.source_turf + var/working = source.rad_power + while(origin != T) + origin = get_step_towards(origin, T) //Raytracing + if(!resistance_cache[origin]) //Only get the resistance if we don't already know it. + origin.calc_rad_resistance() + if(origin.cached_rad_resistance) + working = round((working / (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0.1) + if((working <= .) || (working <= RADIATION_THRESHOLD_CUTOFF)) + break // Already affected by a stronger source (or its zero...) + . = max((working / (dist ** 2)), .) //Butchered version of the inverse square law. Works for this purpose + if(. <= RADIATION_THRESHOLD_CUTOFF) + . = 0 + +// Add a radiation source instance to the repository. It will override any existing source on the same turf. +/datum/controller/subsystem/radiation/proc/add_source(var/datum/radiation_source/S) + if(!isturf(S.source_turf)) + return + var/datum/radiation_source/existing = sources_assoc[S.source_turf] + if(existing) + qdel(existing) + sources += S + sources_assoc[S.source_turf] = S + +// Creates a temporary radiation source that will decay +/datum/controller/subsystem/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account + if(!(source && power)) //Sanity checking + return + var/datum/radiation_source/S = new() + S.source_turf = get_turf(source) + S.update_rad_power(power) + add_source(S) + +// Sets the radiation in a range to a constant value. +/datum/controller/subsystem/radiation/proc/flat_radiate(source, power, range, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please. + if(!(source && power && range)) + return + var/datum/radiation_source/S = new() + S.flat = TRUE + S.range = range + S.respect_maint = respect_maint + S.source_turf = get_turf(source) + S.update_rad_power(power) + add_source(S) + +// Irradiates a full Z-level. Hacky way of doing it, but not too expensive. +/datum/controller/subsystem/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please. + if(!(power && source)) + return + var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z) + flat_radiate(epicentre, power, world.maxx, respect_maint) \ No newline at end of file diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm index e7c3d5aaf9b..54fb4879851 100644 --- a/code/controllers/subsystems/vote.dm +++ b/code/controllers/subsystems/vote.dm @@ -105,7 +105,7 @@ SUBSYSTEM_DEF(vote) factor = 1.4 choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor) world << "Crew Transfer Factor: [factor]" - greatest_votes = max(choices["Initiate Crew Transfer"], choices["Continue The Round"]) + greatest_votes = max(choices["Initiate Crew Transfer"], choices["Extend the Shift"]) //VOREStation Edit . = list() // Get all options with that many votes and return them in a list if(greatest_votes) @@ -220,8 +220,8 @@ SUBSYSTEM_DEF(vote) if(ticker.current_state <= GAME_STATE_SETTING_UP) initiator_key << "The crew transfer button has been disabled!" return 0 - question = "End the shift?" - choices.Add("Initiate Crew Transfer", "Continue The Round") + question = "Your PDA beeps with a message from Central. Would you like an additional hour to finish ongoing projects?" //VOREStation Edit + choices.Add("Initiate Crew Transfer", "Extend the Shift") //VOREStation Edit if(VOTE_ADD_ANTAGONIST) if(!config.allow_extra_antags || ticker.current_state >= GAME_STATE_SETTING_UP) return 0 diff --git a/code/datums/autolathe/arms_vr.dm b/code/datums/autolathe/arms_vr.dm index 72f0b9d15ab..546141457d3 100644 --- a/code/datums/autolathe/arms_vr.dm +++ b/code/datums/autolathe/arms_vr.dm @@ -32,3 +32,21 @@ name = "magazine (.44 rubber)" path =/obj/item/ammo_magazine/m44/rubber hidden = 1 + +/datum/category_item/autolathe/arms/classic_smg_9mm + name = "SMG magazine (9mm)" + path = /obj/item/ammo_magazine/m9mml + hidden = 1 +/* De-coded? +/datum/category_item/autolathe/arms/classic_smg_9mmr + name = "SMG magazine (9mm rubber)" + path = /obj/item/ammo_magazine/m9mml/rubber + +/datum/category_item/autolathe/arms/classic_smg_9mmp + name = "SMG magazine (9mm practice)" + path = /obj/item/ammo_magazine/m9mml/practice + +/datum/category_item/autolathe/arms/classic_smg_9mmf + name = "SMG magazine (9mm flash)" + path = /obj/item/ammo_magazine/m9mml/flash +*/ \ No newline at end of file diff --git a/code/datums/autolathe/engineering_vr.dm b/code/datums/autolathe/engineering_vr.dm new file mode 100644 index 00000000000..08e1cf986bf --- /dev/null +++ b/code/datums/autolathe/engineering_vr.dm @@ -0,0 +1,7 @@ +/datum/category_item/autolathe/engineering/timeclock + name = "timeclock electronics" + path =/obj/item/weapon/circuitboard/timeclock + +/datum/category_item/autolathe/engineering/id_restorer + name = "ID restoration console electronics" + path =/obj/item/weapon/circuitboard/id_restorer \ No newline at end of file diff --git a/code/datums/ghost_query.dm b/code/datums/ghost_query.dm index 2f7942a9b29..427b38f73bb 100644 --- a/code/datums/ghost_query.dm +++ b/code/datums/ghost_query.dm @@ -117,7 +117,7 @@ /datum/ghost_query/lost_drone role_name = "Lost Drone" question = "A lost drone onboard has been discovered by a crewmember and they are attempting to reactivate it. Would you like to play as the drone?" - be_special_flag = BE_AI + //be_special_flag = BE_AI //VOREStation Removal: Positronic role is never used because intended purpose is unfitting, so remove the check check_bans = list("AI", "Cyborg") cutoff_number = 1 diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index aef0fd0ac2a..4dad60db895 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -35,10 +35,10 @@ client/verb/showrevinfo() set desc = "Check the current server code revision" if(revdata.revision) - src << "Server revision: [revdata.branch] - [revdata.date]" + to_chat(src, "Server revision: [revdata.branch] - [revdata.date]") if(config.githuburl) - src << "[revdata.revision]" + to_chat(src, "[revdata.revision]") else src << revdata.revision else - src << "Revision unknown" + to_chat(src, "Revision unknown") diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm index 8b927b3a54b..4795f63687f 100644 --- a/code/datums/looping_sounds/machinery_sounds.dm +++ b/code/datums/looping_sounds/machinery_sounds.dm @@ -43,4 +43,15 @@ mid_sounds = list('sound/machines/microwave/microwave-mid1.ogg'=10, 'sound/machines/microwave/microwave-mid2.ogg'=1) mid_length = 10 end_sound = 'sound/machines/microwave/microwave-end.ogg' - volume = 90 \ No newline at end of file + volume = 90 + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/looping_sound/air_pump + start_sound = 'sound/machines/air_pump/airpumpstart.ogg' + start_length = 10 + mid_sounds = list('sound/machines/air_pump/airpumpidle.ogg' = 1) + mid_length = 10 + end_sound = 'sound/machines/air_pump/airpumpshutdown.ogg' + volume = 20 + pref_check = /datum/client_preference/air_pump_noise \ No newline at end of file diff --git a/code/datums/outfits/jobs/civilian.dm b/code/datums/outfits/jobs/civilian.dm index 8e7f72815c5..c6d6194f17b 100644 --- a/code/datums/outfits/jobs/civilian.dm +++ b/code/datums/outfits/jobs/civilian.dm @@ -44,6 +44,14 @@ name = OUTFIT_JOB_NAME("Cook") id_pda_assignment = "Cook" +// Rykka adds Server Outfit + +/decl/hierarchy/outfit/job/service/server + name = OUTFIT_JOB_NAME("Server") + uniform = /obj/item/clothing/under/waiter + +// End Outfit addition + /decl/hierarchy/outfit/job/service/gardener name = OUTFIT_JOB_NAME("Gardener") uniform = /obj/item/clothing/under/rank/hydroponics diff --git a/code/datums/outfits/military/fleet.dm b/code/datums/outfits/military/fleet.dm index cf5028978d0..915917918cf 100644 --- a/code/datums/outfits/military/fleet.dm +++ b/code/datums/outfits/military/fleet.dm @@ -1,21 +1,21 @@ /decl/hierarchy/outfit/military/fleet/pt name = OUTFIT_MILITARY("Fleet PT") - uniform = /obj/item/clothing/under/pt/fleet + uniform = /obj/item/clothing/under/solgov/pt/fleet shoes = /obj/item/clothing/shoes/black /decl/hierarchy/outfit/military/fleet/utility name = OUTFIT_MILITARY("Fleet Utility") - uniform = /obj/item/clothing/under/utility/fleet - shoes = /obj/item/clothing/shoes/boots/jackboots + uniform = /obj/item/clothing/under/solgov/utility/fleet + shoes = /obj/item/clothing/shoes/boots/duty /decl/hierarchy/outfit/military/fleet/service name = OUTFIT_MILITARY("Fleet Service") - uniform = /obj/item/clothing/under/service/fleet + uniform = /obj/item/clothing/under/solgov/service/fleet shoes = /obj/item/clothing/shoes/dress/white /decl/hierarchy/outfit/military/fleet/dress name = OUTFIT_MILITARY("Fleet Dress") - uniform = /obj/item/clothing/under/service/fleet + uniform = /obj/item/clothing/under/solgov/service/fleet shoes = /obj/item/clothing/shoes/dress/white suit = /obj/item/clothing/suit/storage/toggle/dress/fleet gloves = /obj/item/clothing/gloves/white diff --git a/code/datums/outfits/military/marines.dm b/code/datums/outfits/military/marines.dm index d818dabcaaa..719b36c6909 100644 --- a/code/datums/outfits/military/marines.dm +++ b/code/datums/outfits/military/marines.dm @@ -1,22 +1,22 @@ /decl/hierarchy/outfit/military/marine/pt name = OUTFIT_MILITARY("Marine PT") - uniform = /obj/item/clothing/under/pt/marine + uniform = /obj/item/clothing/under/solgov/pt/marine shoes = /obj/item/clothing/shoes/black /decl/hierarchy/outfit/military/marine/utility name = OUTFIT_MILITARY("Marine Utility") - uniform = /obj/item/clothing/under/utility/marine + uniform = /obj/item/clothing/under/solgov/utility/marine shoes = /obj/item/clothing/shoes/boots/jungle /decl/hierarchy/outfit/military/marine/service name = OUTFIT_MILITARY("Marine Service") - uniform = /obj/item/clothing/under/service/marine + uniform = /obj/item/clothing/under/solgov/service/marine shoes = /obj/item/clothing/shoes/dress suit = /obj/item/clothing/suit/storage/service/marine /decl/hierarchy/outfit/military/marine/dress name = OUTFIT_MILITARY("Marine Dress") - uniform = /obj/item/clothing/under/mildress/marine + uniform = /obj/item/clothing/under/solgov/mildress/marine shoes = /obj/item/clothing/shoes/dress/white suit = /obj/item/clothing/suit/dress/marine gloves = /obj/item/clothing/gloves/white diff --git a/code/datums/outfits/military/sifguard.dm b/code/datums/outfits/military/sifguard.dm index e1280f0cfed..9348224a9eb 100644 --- a/code/datums/outfits/military/sifguard.dm +++ b/code/datums/outfits/military/sifguard.dm @@ -1,22 +1,22 @@ /decl/hierarchy/outfit/military/sifguard/pt name = OUTFIT_MILITARY("SifGuard PT") - uniform = /obj/item/clothing/under/pt/sifguard + uniform = /obj/item/clothing/under/solgov/pt/sifguard shoes = /obj/item/clothing/shoes/black /decl/hierarchy/outfit/military/sifguard/utility name = OUTFIT_MILITARY("SifGuard Utility") - uniform = /obj/item/clothing/under/utility/sifguard - shoes = /obj/item/clothing/shoes/boots/jackboots + uniform = /obj/item/clothing/under/solgov/utility/sifguard + shoes = /obj/item/clothing/shoes/boots/tactical /decl/hierarchy/outfit/military/sifguard/service name = OUTFIT_MILITARY("SifGuard Service") - uniform = /obj/item/clothing/under/utility/sifguard - shoes = /obj/item/clothing/shoes/boots/jackboots + uniform = /obj/item/clothing/under/solgov/utility/sifguard + shoes = /obj/item/clothing/shoes/boots/tactical suit = /obj/item/clothing/suit/storage/service/sifguard /decl/hierarchy/outfit/military/sifguard/dress name = OUTFIT_MILITARY("SifGuard Dress") - uniform = /obj/item/clothing/under/mildress/sifguard + uniform = /obj/item/clothing/under/solgov/mildress/sifguard shoes = /obj/item/clothing/shoes/dress suit = /obj/item/clothing/suit/dress/expedition gloves = /obj/item/clothing/gloves/white diff --git a/code/datums/outfits/outfit_vr.dm b/code/datums/outfits/outfit_vr.dm index 6177836a759..27e5cde50ef 100644 --- a/code/datums/outfits/outfit_vr.dm +++ b/code/datums/outfits/outfit_vr.dm @@ -1,6 +1,6 @@ /decl/hierarchy/outfit/USDF/Marine name = "USDF marine" - uniform = /obj/item/clothing/under/utility/marine/green + uniform = /obj/item/clothing/under/solgov/utility/marine/green shoes = /obj/item/clothing/shoes/boots/jackboots gloves = /obj/item/clothing/gloves/combat l_ear = /obj/item/device/radio/headset/centcom @@ -30,7 +30,7 @@ head = /obj/item/clothing/head/dress/marine/command/admiral shoes = /obj/item/clothing/shoes/boots/jackboots l_ear = /obj/item/device/radio/headset/centcom - uniform = /obj/item/clothing/under/mildress/marine/command + uniform = /obj/item/clothing/under/solgov/mildress/marine/command back = /obj/item/weapon/storage/backpack/satchel belt = /obj/item/weapon/gun/projectile/revolver/consul l_pocket = /obj/item/ammo_magazine/s44 diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm deleted file mode 100644 index 4525032e200..00000000000 --- a/code/datums/repositories/radiation.dm +++ /dev/null @@ -1,138 +0,0 @@ -var/global/repository/radiation/radiation_repository = new() - -/repository/radiation - var/list/sources = list() // all radiation source datums - var/list/sources_assoc = list() // Sources indexed by turf for de-duplication. - var/list/resistance_cache = list() // Cache of turf's radiation resistance. - -// Describes a point source of radiation. Created either in response to a pulse of radiation, or over an irradiated atom. -// Sources will decay over time, unless something is renewing their power! -/datum/radiation_source - var/turf/source_turf // Location of the radiation source. - var/rad_power // Strength of the radiation being emitted. - var/decay = TRUE // True for automatic decay. False if owner promises to handle it (i.e. supermatter) - var/respect_maint = FALSE // True for not affecting RAD_SHIELDED areas. - var/flat = FALSE // True for power falloff with distance. - var/range // Cached maximum range, used for quick checks against mobs. - -/datum/radiation_source/Destroy() - radiation_repository.sources -= src - if(radiation_repository.sources_assoc[src.source_turf] == src) - radiation_repository.sources_assoc -= src.source_turf - src.source_turf = null - . = ..() - -/datum/radiation_source/proc/update_rad_power(var/new_power = null) - if(new_power == null || new_power == rad_power) - return // No change - else if(new_power <= 0) - qdel(src) // Decayed to nothing - else - rad_power = new_power - if(!flat) - range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist - -// Ray trace from all active radiation sources to T and return the strongest effect. -/repository/radiation/proc/get_rads_at_turf(var/turf/T) - if(!istype(T)) return 0 - - . = 0 - for(var/value in sources) - var/datum/radiation_source/source = value - if(source.rad_power < .) - continue // Already being affected by a stronger source - if(source.source_turf.z != T.z) - continue // Radiation is not multi-z - var/dist = get_dist(source.source_turf, T) - if(dist > source.range) - continue // Too far to possibly affect - if(source.respect_maint) - var/atom/A = T.loc - if(A.flags & RAD_SHIELDED) - continue // In shielded area - if(source.flat) - . = max(., source.rad_power) - continue // No need to ray trace for flat field - - // Okay, now ray trace to find resistence! - var/turf/origin = source.source_turf - var/working = source.rad_power - while(origin != T) - origin = get_step_towards(origin, T) //Raytracing - if(!(origin in resistance_cache)) //Only get the resistance if we don't already know it. - origin.calc_rad_resistance() - working = max((working - (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0) - if(working <= .) - break // Already affected by a stronger source (or its zero...) - . = max((working * (1 / (dist ** 2))), .) //Butchered version of the inverse square law. Works for this purpose - -// Add a radiation source instance to the repository. It will override any existing source on the same turf. -/repository/radiation/proc/add_source(var/datum/radiation_source/S) - if(!isturf(S.source_turf)) - return - var/datum/radiation_source/existing = sources_assoc[S.source_turf] - if(existing) - qdel(existing) - sources += S - sources_assoc[S.source_turf] = S - -// Creates a temporary radiation source that will decay -/repository/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account - if(!(source && power)) //Sanity checking - return - var/datum/radiation_source/S = new() - S.source_turf = get_turf(source) - S.update_rad_power(power) - add_source(S) - -// Sets the radiation in a range to a constant value. -/repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please. - if(!(source && power && range)) - return - var/datum/radiation_source/S = new() - S.flat = TRUE - S.range = range - S.respect_maint = respect_maint - S.source_turf = get_turf(source) - S.update_rad_power(power) - add_source(S) - -// Irradiates a full Z-level. Hacky way of doing it, but not too expensive. -/repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please. - if(!(power && source)) - return - var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z) - flat_radiate(epicentre, power, world.maxx, respect_maint) - -/turf - var/cached_rad_resistance = 0 - -/turf/proc/calc_rad_resistance() - cached_rad_resistance = 0 - for(var/obj/O in src.contents) - if(O.rad_resistance) //Override - cached_rad_resistance += O.rad_resistance - - else if(O.density) //So open doors don't get counted - var/material/M = O.get_material() - if(!M) continue - cached_rad_resistance += M.weight + M.radiation_resistance - // Looks like storing the contents length is meant to be a basic check if the cache is stale due to items enter/exiting. Better than nothing so I'm leaving it as is. ~Leshana - radiation_repository.resistance_cache[src] = (length(contents) + 1) - -/turf/simulated/wall/calc_rad_resistance() - radiation_repository.resistance_cache[src] = (length(contents) + 1) - cached_rad_resistance = (density ? material.weight + material.radiation_resistance : 0) - -/obj - var/rad_resistance = 0 // Allow overriding rad resistance - -// If people expand the system, this may be useful. Here as a placeholder until then -/atom/proc/rad_act(var/severity) - return 1 - -/mob/living/rad_act(var/severity) - if(severity && !isbelly(loc)) //eaten mobs are made immune to radiation //VOREStation Edit Start - src.apply_effect(severity, IRRADIATE, src.getarmor(null, "rad")) - for(var/atom/I in src) - I.rad_act(severity) ///VOREStation Edit End diff --git a/code/datums/supplypacks/hospitality_vr.dm b/code/datums/supplypacks/hospitality_vr.dm index 822773b6f9a..decb7027db1 100644 --- a/code/datums/supplypacks/hospitality_vr.dm +++ b/code/datums/supplypacks/hospitality_vr.dm @@ -1,3 +1,6 @@ +/datum/supply_pack/randomised/hospitality/pizza + cost = 50 + /datum/supply_pack/randomised/hospitality/burgers_vr num_contained = 5 contains = list( diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index 5596d95f038..554a826f20f 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -334,4 +334,39 @@ contains = list(/obj/item/device/defib_kit = 2) cost = 30 containertype = /obj/structure/closet/crate/medical - containername = "Defibrillator crate" \ No newline at end of file + containername = "Defibrillator crate" + +/datum/supply_pack/med/distillery + name = "Chemical distiller crate" + contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery = 1) + cost = 175 + containertype = /obj/structure/largecrate + containername = "Chemical distiller crate" + +/datum/supply_pack/med/advdistillery + name = "Industrial Chemical distiller crate" + contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery/industrial = 1) + cost = 250 + containertype = /obj/structure/largecrate + containername = "Industrial Chemical distiller crate" + +/datum/supply_pack/med/oxypump + name = "Oxygen pump crate" + contains = list(/obj/machinery/oxygen_pump/mobile = 1) + cost = 125 + containertype = /obj/structure/largecrate + containername = "Oxygen pump crate" + +/datum/supply_pack/med/anestheticpump + name = "Anesthetic pump crate" + contains = list(/obj/machinery/oxygen_pump/mobile/anesthetic = 1) + cost = 130 + containertype = /obj/structure/largecrate + containername = "Anesthetic pump crate" + +/datum/supply_pack/med/stablepump + name = "Portable stabilizer crate" + contains = list(/obj/machinery/oxygen_pump/mobile/stabilizer = 1) + cost = 175 + containertype = /obj/structure/largecrate + containername = "Portable stabilizer crate" diff --git a/code/datums/supplypacks/medical_vr.dm b/code/datums/supplypacks/medical_vr.dm index 344e2bbdbda..0538f838679 100644 --- a/code/datums/supplypacks/medical_vr.dm +++ b/code/datums/supplypacks/medical_vr.dm @@ -1,38 +1,50 @@ -/datum/supply_pack/med/medicalbiosuits - contains = list( - /obj/item/clothing/head/bio_hood/scientist = 3, - /obj/item/clothing/suit/bio_suit/scientist = 3, - /obj/item/clothing/suit/bio_suit/virology = 3, - /obj/item/clothing/head/bio_hood/virology = 3, - /obj/item/clothing/suit/bio_suit/cmo, - /obj/item/clothing/head/bio_hood/cmo, - /obj/item/clothing/shoes/white = 7, - /obj/item/clothing/mask/gas = 7, - /obj/item/weapon/tank/oxygen = 7, - /obj/item/weapon/storage/box/masks, - /obj/item/weapon/storage/box/gloves - ) - cost = 40 - -/datum/supply_pack/med/virologybiosuits - name = "Virology biohazard gear" - contains = list( - /obj/item/clothing/suit/bio_suit/virology = 3, - /obj/item/clothing/head/bio_hood/virology = 3, - /obj/item/clothing/mask/gas = 3, - /obj/item/weapon/tank/oxygen = 3, - /obj/item/weapon/storage/box/masks, - /obj/item/weapon/storage/box/gloves - ) - cost = 40 - containertype = /obj/structure/closet/crate/secure - containername = "Virology biohazard equipment" - access = access_medical_equip - -/datum/supply_pack/med/virus - name = "Virus sample crate" - contains = list(/obj/item/weapon/virusdish/random = 4) - cost = 25 - containertype = /obj/structure/closet/crate/secure - containername = "Virus sample crate" - access = access_medical_equip \ No newline at end of file +/datum/supply_pack/med/medicalbiosuits + contains = list( + /obj/item/clothing/head/bio_hood/scientist = 3, + /obj/item/clothing/suit/bio_suit/scientist = 3, + /obj/item/clothing/suit/bio_suit/virology = 3, + /obj/item/clothing/head/bio_hood/virology = 3, + /obj/item/clothing/suit/bio_suit/cmo, + /obj/item/clothing/head/bio_hood/cmo, + /obj/item/clothing/shoes/white = 7, + /obj/item/clothing/mask/gas = 7, + /obj/item/weapon/tank/oxygen = 7, + /obj/item/weapon/storage/box/masks, + /obj/item/weapon/storage/box/gloves + ) + cost = 40 + +/datum/supply_pack/med/virologybiosuits + name = "Virology biohazard gear" + contains = list( + /obj/item/clothing/suit/bio_suit/virology = 3, + /obj/item/clothing/head/bio_hood/virology = 3, + /obj/item/clothing/mask/gas = 3, + /obj/item/weapon/tank/oxygen = 3, + /obj/item/weapon/storage/box/masks, + /obj/item/weapon/storage/box/gloves + ) + cost = 40 + containertype = /obj/structure/closet/crate/secure + containername = "Virology biohazard equipment" + access = access_medical_equip + +/datum/supply_pack/med/virus + name = "Virus sample crate" + contains = list(/obj/item/weapon/virusdish/random = 4) + cost = 25 + containertype = /obj/structure/closet/crate/secure + containername = "Virus sample crate" + access = access_medical_equip + + +/datum/supply_pack/med/bloodpack + containertype = /obj/structure/closet/crate/medical/blood + +/datum/supply_pack/med/compactdefib + name = "Compact Defibrillator crate" + contains = list(/obj/item/device/defib_kit/compact = 1) + cost = 90 + containertype = /obj/structure/closet/crate/secure + containername = "Compact Defibrillator crate" + access = access_medical_equip diff --git a/code/datums/supplypacks/misc.dm b/code/datums/supplypacks/misc.dm index b77d442e82f..7f4f0362dbd 100644 --- a/code/datums/supplypacks/misc.dm +++ b/code/datums/supplypacks/misc.dm @@ -143,4 +143,39 @@ ) cost = 25 containertype = /obj/structure/closet/crate - containername = "Glucose Hypo Crate" \ No newline at end of file + containername = "Glucose Hypo Crate" + +/datum/supply_pack/misc/mre_rations + num_contained = 6 + name = "Emergency - MREs" + contains = list(/obj/item/weapon/storage/mre, + /obj/item/weapon/storage/mre/menu2, + /obj/item/weapon/storage/mre/menu3, + /obj/item/weapon/storage/mre/menu4, + /obj/item/weapon/storage/mre/menu5, + /obj/item/weapon/storage/mre/menu6, + /obj/item/weapon/storage/mre/menu7, + /obj/item/weapon/storage/mre/menu8, + /obj/item/weapon/storage/mre/menu9, + /obj/item/weapon/storage/mre/menu10) + cost = 50 + containertype = /obj/structure/closet/crate/freezer + containername = "ready to eat rations" + +/datum/supply_pack/misc/paste_rations + name = "Emergency - Paste" + contains = list( + /obj/item/weapon/storage/mre/menu11 = 2 + ) + cost = 25 + containertype = /obj/structure/closet/crate/freezer + containername = "emergency rations" + +/datum/supply_pack/misc/medical_rations + name = "Emergency - VitaPaste" + contains = list( + /obj/item/weapon/storage/mre/menu13 = 2 + ) + cost = 40 + containertype = /obj/structure/closet/crate/freezer + containername = "emergency rations" diff --git a/code/datums/supplypacks/misc_vr.dm b/code/datums/supplypacks/misc_vr.dm index 613a01cfd46..93523707b9d 100644 --- a/code/datums/supplypacks/misc_vr.dm +++ b/code/datums/supplypacks/misc_vr.dm @@ -13,24 +13,6 @@ containername = "Belt-miner gear crate" access = access_mining -/datum/supply_pack/misc/rations - name = "Emergency rations" - contains = list( - /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 4, - ) - cost = 20 - containertype = /obj/structure/closet/crate/freezer - containername = "emergency rations" - -/datum/supply_pack/misc/proteinrations - name = "Emergency meat rations" - contains = list( - /obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 4, - ) - cost = 30 - containertype = /obj/structure/closet/crate/freezer - containername = "emergency meat rations" - /datum/supply_pack/misc/eva_rig name = "eva hardsuit (empty)" contains = list( @@ -55,4 +37,44 @@ containername = "industrial hardsuit crate" access = list(access_mining, access_eva) - one_access = TRUE \ No newline at end of file + one_access = TRUE + +/datum/supply_pack/misc/medical_rig + name = "medical hardsuit (empty)" + contains = list( + /obj/item/weapon/rig/medical = 1 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure/gear + containername = "medical hardsuit crate" + access = access_medical + +/datum/supply_pack/misc/security_rig + name = "hazard hardsuit (empty)" + contains = list( + /obj/item/weapon/rig/hazard = 1 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure/gear + containername = "hazard hardsuit crate" + access = access_armory + +/datum/supply_pack/misc/science_rig + name = "ami hardsuit (empty)" + contains = list( + /obj/item/weapon/rig/hazmat = 1 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure/gear + containername = "ami hardsuit crate" + access = access_rd + +/datum/supply_pack/misc/ce_rig + name = "advanced voidsuit (empty)" + contains = list( + /obj/item/weapon/rig/ce = 1 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure/gear + containername = "advanced voidsuit crate" + access = access_ce diff --git a/code/datums/supplypacks/security_vr.dm b/code/datums/supplypacks/security_vr.dm index 852b44adee7..a00556e5287 100644 --- a/code/datums/supplypacks/security_vr.dm +++ b/code/datums/supplypacks/security_vr.dm @@ -34,3 +34,23 @@ /obj/item/weapon/storage/box/gloves ) cost = 40 + +/datum/supply_pack/security/trackingimplant + name = "Implants - Tracking" + contains = list( + /obj/item/weapon/storage/box/trackimp = 1 + ) + cost = 25 + containertype = /obj/structure/closet/crate/secure + containername = "Tracking implants" + access = access_security + +/datum/supply_pack/security/chemicalimplant + name = "Implants - Chemical" + contains = list( + /obj/item/weapon/storage/box/chemimp = 1 + ) + cost = 25 + containertype = /obj/structure/closet/crate/secure + containername = "Chemical implants" + access = access_security diff --git a/code/datums/uplink/implants.dm b/code/datums/uplink/implants.dm index 7e3e2f30050..e36396c9cd0 100644 --- a/code/datums/uplink/implants.dm +++ b/code/datums/uplink/implants.dm @@ -23,3 +23,53 @@ name = "Uplink Implant" //Original name: "Uplink Implant (Contains 5 Telecrystals)" item_cost = 50 //Original cost: 10 path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink + +/datum/uplink_item/item/implants/imp_shades + name = "Integrated Thermal-Shades Implant (Organic)" + item_cost = 80 + path = /obj/item/weapon/storage/box/syndie_kit/imp_aug + +/datum/uplink_item/item/implants/imp_taser + name = "Integrated Taser Implant (Organic)" + item_cost = 30 + path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/taser + +/datum/uplink_item/item/implants/imp_laser + name = "Integrated Laser Implant (Organic)" + item_cost = 50 + path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/laser + +/datum/uplink_item/item/implants/imp_dart + name = "Integrated Dart Implant (Organic)" + item_cost = 60 + path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/dart + +/datum/uplink_item/item/implants/imp_toolkit + name = "Integrated Toolkit Implant (Organic)" + item_cost = 80 + path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/toolkit + +/datum/uplink_item/item/implants/imp_medkit + name = "Integrated Medkit Implant (Organic)" + item_cost = 60 + path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/medkit + +/datum/uplink_item/item/implants/imp_analyzer + name = "Integrated Research Scanner Implant (Organic)" + item_cost = 20 + path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/analyzer + +/datum/uplink_item/item/implants/imp_sword + name = "Integrated Sword Implant (Organic)" + item_cost = 40 + path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/sword + +/datum/uplink_item/item/implants/imp_sprinter + name = "Integrated Sprinter Implant (Organic)" + item_cost = 40 + path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/sprinter + +/datum/uplink_item/item/implants/imp_sprinter + name = "Integrated Surge Implant (Organic)" + item_cost = 40 + path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/surge diff --git a/code/datums/uplink/medical_vr.dm b/code/datums/uplink/medical_vr.dm new file mode 100644 index 00000000000..324398843f8 --- /dev/null +++ b/code/datums/uplink/medical_vr.dm @@ -0,0 +1,57 @@ +/********** +* Medical * +**********/ +/datum/uplink_item/item/medical/mre + name = "Meal, Ready to eat (Random)" + item_cost = 5 + path = /obj/item/weapon/storage/mre/random + +/datum/uplink_item/item/medical/protein + name = "Meal, Ready to eat (Protein)" + item_cost = 5 + path = /obj/item/weapon/storage/mre/menu10 + +/datum/uplink_item/item/medical/emergency + name = "Meal, Ready to eat (Emergency)" + item_cost = 5 + path = /obj/item/weapon/storage/mre/menu11 + +/datum/uplink_item/item/medical/glucose + name = "Glucose injector" + item_cost = 5 + path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose + +/datum/uplink_item/item/medical/purity + name = "Purity injector" + item_cost = 5 + path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity + +/datum/uplink_item/item/medical/brute + name = "Brute injector" + item_cost = 5 + path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute + +/datum/uplink_item/item/medical/burn + name = "Burn injector" + item_cost = 5 + path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn + +/datum/uplink_item/item/medical/toxin + name = "Toxin injector" + item_cost = 5 + path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin + +/datum/uplink_item/item/medical/oxy + name = "Oxy injector" + item_cost = 5 + path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy + +/datum/uplink_item/item/medical/nanites + name = "Healing Nanite pill bottle" + item_cost = 30 + path = /obj/item/weapon/storage/pill_bottle/healing_nanites + +/datum/uplink_item/item/medical/insiderepair + name = "Combat organ kit" + item_cost = 120 + path = /obj/item/weapon/storage/firstaid/insiderepair diff --git a/code/datums/uplink/tools_vr.dm b/code/datums/uplink/tools_vr.dm new file mode 100644 index 00000000000..5a165f7aacc --- /dev/null +++ b/code/datums/uplink/tools_vr.dm @@ -0,0 +1,42 @@ +/******************** +* Devices and Tools * +********************/ +/datum/uplink_item/item/tools/basiclaptop + name = "Laptop (Basic)" + item_cost = 5 + path = /obj/item/modular_computer/laptop/preset/custom_loadout/cheap + +/datum/uplink_item/item/tools/survivalcapsule + name = "Survival Capsule" + item_cost = 5 + path = /obj/item/device/survivalcapsule + +/datum/uplink_item/item/tools/nanopaste + name = "Nanopaste (Advanced)" + item_cost = 10 + path = /obj/item/stack/nanopaste/advanced + +/datum/uplink_item/item/tools/elitetablet + name = "Tablet (Advanced)" + item_cost = 15 + path = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced + +/datum/uplink_item/item/tools/elitelaptop + name = "Laptop (Advanced)" + item_cost = 20 + path = /obj/item/modular_computer/laptop/preset/custom_loadout/elite + +/datum/uplink_item/item/tools/luxurycapsule + name = "Survival Capsule (Luxury)" + item_cost = 40 + path = /obj/item/device/survivalcapsule/luxury + +/datum/uplink_item/item/tools/translocator + name = "Translocator" + item_cost = 40 + path = /obj/item/device/perfect_tele + +/datum/uplink_item/item/tools/barcapsule + name = "Survival Capsule (Bar)" + item_cost = 80 + path = /obj/item/device/survivalcapsule/luxurybar diff --git a/code/datums/uplink/visible_weapons.dm b/code/datums/uplink/visible_weapons.dm index e8a69d2aafa..e4c27752f0e 100644 --- a/code/datums/uplink/visible_weapons.dm +++ b/code/datums/uplink/visible_weapons.dm @@ -15,37 +15,17 @@ path = /obj/item/weapon/material/knife/tacknife/combatknife /datum/uplink_item/item/visible_weapons/energy_sword - name = "Energy Sword, Random" + name = "Energy Sword, Colorable" item_cost = 40 path = /obj/item/weapon/melee/energy/sword -/datum/uplink_item/item/visible_weapons/energy_sword_blue - name = "Energy Sword, Blue" - item_cost = 40 - path = /obj/item/weapon/melee/energy/sword/blue - -/datum/uplink_item/item/visible_weapons/energy_sword_green - name = "Energy Sword, Green" - item_cost = 40 - path = /obj/item/weapon/melee/energy/sword/green - -/datum/uplink_item/item/visible_weapons/energy_sword_red - name = "Energy Sword, Red" - item_cost = 40 - path = /obj/item/weapon/melee/energy/sword/red - -/datum/uplink_item/item/visible_weapons/energy_sword_purple - name = "Energy Sword, Purple" - item_cost = 40 - path = /obj/item/weapon/melee/energy/sword/purple - /datum/uplink_item/item/visible_weapons/energy_sword_pirate - name = "Energy Cutlass" + name = "Energy Cutlass, Colorable" item_cost = 40 path = /obj/item/weapon/melee/energy/sword/pirate /datum/uplink_item/item/visible_weapons/energy_spear - name = "Energy Spear" + name = "Energy Spear, Colorable" item_cost = 50 path = /obj/item/weapon/melee/energy/spear @@ -192,4 +172,4 @@ /datum/uplink_item/item/visible_weapons/xray name = "Xray Gun" item_cost = 85 - path = /obj/item/weapon/gun/energy/xray \ No newline at end of file + path = /obj/item/weapon/gun/energy/xray diff --git a/code/game/antagonist/antagonist_factions.dm b/code/game/antagonist/antagonist_factions.dm index 83c9957be20..a072196c1b1 100644 --- a/code/game/antagonist/antagonist_factions.dm +++ b/code/game/antagonist/antagonist_factions.dm @@ -14,33 +14,33 @@ return if(faction.is_antagonist(player)) - src << "\The [player.current] already serves the [faction.faction_descriptor]." + to_chat(src, "\The [player.current] already serves the [faction.faction_descriptor].") return if(player_is_antag(player)) - src << "\The [player.current]'s loyalties seem to be elsewhere..." + to_chat(src, "\The [player.current]'s loyalties seem to be elsewhere...") return if(!faction.can_become_antag(player)) - src << "\The [player.current] cannot be \a [faction.faction_role_text]!" + to_chat(src, "\The [player.current] cannot be \a [faction.faction_role_text]!") return if(world.time < player.rev_cooldown) - src << "You must wait five seconds between attempts." + to_chat(src, "You must wait five seconds between attempts.") return - src << "You are attempting to convert \the [player.current]..." + to_chat(src, "You are attempting to convert \the [player.current]...") log_admin("[src]([src.ckey]) attempted to convert [player.current].") message_admins("[src]([src.ckey]) attempted to convert [player.current].") player.rev_cooldown = world.time+100 var/choice = alert(player.current,"Asked by [src]: Do you want to join the [faction.faction_descriptor]?","Join the [faction.faction_descriptor]?","No!","Yes!") if(choice == "Yes!" && faction.add_antagonist_mind(player, 0, faction.faction_role_text, faction.faction_welcome)) - src << "\The [player.current] joins the [faction.faction_descriptor]!" + to_chat(src, "\The [player.current] joins the [faction.faction_descriptor]!") return if(choice == "No!") player << "You reject this traitorous cause!" - src << "\The [player.current] does not support the [faction.faction_descriptor]!" + to_chat(src, "\The [player.current] does not support the [faction.faction_descriptor]!") /mob/living/proc/convert_to_loyalist(mob/M as mob in oview(src)) set name = "Convert Recidivist" diff --git a/code/game/antagonist/antagonist_objectives.dm b/code/game/antagonist/antagonist_objectives.dm index 5dc6c5f327a..fba64679835 100644 --- a/code/game/antagonist/antagonist_objectives.dm +++ b/code/game/antagonist/antagonist_objectives.dm @@ -38,8 +38,8 @@ if(!mind) return if(!is_special_character(mind)) - src << "While you may perhaps have goals, this verb's meant to only be visible \ - to antagonists. Please make a bug report!" + to_chat(src, "While you may perhaps have goals, this verb's meant to only be visible \ + to antagonists. Please make a bug report!") return var/new_ambitions = input(src, "Write a short sentence of what your character hopes to accomplish \ today as an antagonist. Remember that this is purely optional. It will be shown at the end of the \ @@ -49,7 +49,7 @@ new_ambitions = sanitize(new_ambitions) mind.ambitions = new_ambitions if(new_ambitions) - src << "You've set your goal to be '[new_ambitions]'." + to_chat(src, "You've set your goal to be '[new_ambitions]'.") else - src << "You leave your ambitions behind." + to_chat(src, "You leave your ambitions behind.") log_and_message_admins("has set their ambitions to now be: [new_ambitions].") diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm index feaf8857ba8..6f2a7fe2e33 100644 --- a/code/game/antagonist/outsider/wizard.dm +++ b/code/game/antagonist/outsider/wizard.dm @@ -115,18 +115,18 @@ obj/item/clothing /*Checks if the wizard is wearing the proper attire. Made a proc so this is not repeated 14 (or more) times.*/ /mob/proc/wearing_wiz_garb() - src << "Silly creature, you're not a human. Only humans can cast this spell." + to_chat(src, "Silly creature, you're not a human. Only humans can cast this spell.") return 0 // Humans can wear clothes. /mob/living/carbon/human/wearing_wiz_garb() if(!is_wiz_garb(src.wear_suit)) - src << "I don't feel strong enough without my robe." + to_chat(src, "I don't feel strong enough without my robe.") return 0 if(!is_wiz_garb(src.shoes)) - src << "I don't feel strong enough without my sandals." + to_chat(src, "I don't feel strong enough without my sandals.") return 0 if(!is_wiz_garb(src.head)) - src << "I don't feel strong enough without my hat." + to_chat(src, "I don't feel strong enough without my hat.") return 0 return 1 diff --git a/code/game/antagonist/station/highlander.dm b/code/game/antagonist/station/highlander.dm index e2ec983818a..f483b1df3bd 100644 --- a/code/game/antagonist/station/highlander.dm +++ b/code/game/antagonist/station/highlander.dm @@ -47,8 +47,8 @@ var/datum/antagonist/highlander/highlanders var/obj/item/weapon/card/id/W = new(player) W.name = "[player.real_name]'s ID Card" W.icon_state = "centcom" - W.access = get_all_station_access() - W.access += get_all_centcom_access() + W.access = get_all_station_access().Copy + W.access |= get_all_centcom_access() W.assignment = "Highlander" W.registered_name = player.real_name player.equip_to_slot_or_del(W, slot_wear_id) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 787cc55f7b6..ac11cd2e4f0 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -2737,4 +2737,4 @@ var/list/the_station_areas = list ( icon_state = "yellow" luminosity = 1 dynamic_lighting = 0 - requires_power = 0 + requires_power = 0 \ No newline at end of file diff --git a/code/game/area/Space Station 13 areas_vr.dm b/code/game/area/Space Station 13 areas_vr.dm index 396ab608215..c03489b3071 100644 --- a/code/game/area/Space Station 13 areas_vr.dm +++ b/code/game/area/Space Station 13 areas_vr.dm @@ -1,121 +1,4 @@ -/area/crew_quarters/sleep/vistor_room_1 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_2 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_3 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_4 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_5 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_6 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_7 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_8 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_9 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_10 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_11 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_12 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_1 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_2 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_3 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_4 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_5 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_6 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_7 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_8 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_9 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_10 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/teleporter/departing - name = "\improper Long-Range Teleporter" - icon_state = "teleporter" - music = "signal" - -// Override telescience shielding on some areas -/area/security/armoury - flags = BLUE_SHIELDED - -/area/security/tactical - flags = BLUE_SHIELDED - -/area/security/nuke_storage - flags = BLUE_SHIELDED - -/area/supply - flags = BLUE_SHIELDED - -// Add rad shielding to maintenance and construction sites -/area/vacant - flags = RAD_SHIELDED - -/area/maintenance - flags = RAD_SHIELDED - -/area/rnd/research_storage //Located entirely in maint under public access, so why not that too - flags = RAD_SHIELDED - -// New shuttles -/area/shuttle/administration/transit - name = "Deep Space (AS)" - icon_state = "shuttle" - -/area/shuttle/administration/away_mission - name = "Away Mission (AS)" - icon_state = "shuttle" - -/area/shuttle/awaymission/home - name = "NSB Adephagia (AM)" - icon_state = "shuttle2" - -/area/shuttle/awaymission/warp - name = "Deep Space (AM)" - icon_state = "shuttle" - -/area/shuttle/awaymission/away - name = "Away Mission (AM)" - icon_state = "shuttle2" - -/area/shuttle/awaymission/oldengbase - name = "Old Construction Site (AM)" - icon_state = "shuttle2" +//TFF 28/8/19 - cleanup of areas placement - removes all but rogueminer_vr stuff. /area/shuttle/belter/station name = "Belter Shuttle Landed" @@ -162,140 +45,6 @@ icon_state = "red2" shuttle_area = /area/shuttle/belter/belt/zone4 -/area/medical/resleeving - name = "Resleeving Lab" - icon_state = "genetics" - -/area/bigship - name = "Bigship" - requires_power = 0 - flags = RAD_SHIELDED - sound_env = SMALL_ENCLOSED - base_turf = /turf/space - icon_state = "red2" - -/area/bigship/teleporter - name = "Bigship Teleporter Room" - -//////// Small Cruiser Areas //////// -/area/houseboat - name = "Small Cruiser" - requires_power = 0 - flags = RAD_SHIELDED - base_turf = /turf/space - icon_state = "red2" - lightswitch = TRUE - -/area/houseboat/holodeck_area - name = "Small Cruiser - Holodeck" - icon_state = "blue2" - -/area/houseboat/holodeck/off - name = "Small Cruiser Holo - Off" - icon_state = "blue2" -/area/houseboat/holodeck/beach - name = "Small Cruiser Holo - Beach" - icon_state = "blue2" -/area/houseboat/holodeck/snow - name = "Small Cruiser Holo - Snow" - icon_state = "blue2" -/area/houseboat/holodeck/desert - name = "Small Cruiser Holo - Desert" - icon_state = "blue2" -/area/houseboat/holodeck/picnic - name = "Small Cruiser Holo - Picnic" - icon_state = "blue2" -/area/houseboat/holodeck/thunderdome - name = "Small Cruiser Holo - Thunderdome" - icon_state = "blue2" -/area/houseboat/holodeck/basketball - name = "Small Cruiser Holo - Basketball" - icon_state = "blue2" -/area/houseboat/holodeck/gaming - name = "Small Cruiser Holo - Gaming Table" - icon_state = "blue2" -/area/houseboat/holodeck/space - name = "Small Cruiser Holo - Space" - icon_state = "blue2" -/area/houseboat/holodeck/bunking - name = "Small Cruiser Holo - Bunking" - icon_state = "blue2" - -/area/shuttle/cruiser/cruiser - name = "Small Cruiser Shuttle - Cruiser" - icon_state = "blue2" - base_turf = /turf/simulated/floor/tiled/techfloor -/area/shuttle/cruiser/station - name = "Small Cruiser Shuttle - Station" - icon_state = "blue2" - - -// Tether Map has this shuttle -/area/shuttle/tether/surface - name = "Tether Shuttle Landed" - icon_state = "shuttle" - base_turf = /turf/simulated/floor/reinforced - -/area/shuttle/tether/station - name = "Tether Shuttle Dock" - icon_state = "shuttle2" - -/area/shuttle/tether/transit - name = "Tether Shuttle Transit" - icon_state = "shuttle2" - -// rnd (Research and Development) -/area/rnd/research/testingrange - name = "\improper Weapons Testing Range" - icon_state = "firingrange" - -/area/rnd/research/researchdivision - name = "\improper Research Division" - icon_state = "research" - -/area/rnd/outpost - name = "\improper Research Outpost Hallway" - icon_state = "research" - -/area/rnd/outpost/airlock - name = "\improper Research Outpost Airlock" - icon_state = "green" - -/area/rnd/outpost/eva - name = "Research Outpost EVA Storage" - icon_state = "eva" - -/area/rnd/outpost/chamber - name = "\improper Research Outpost Burn Chamber" - icon_state = "engine" - -/area/rnd/outpost/atmos - name = "Research Outpost Atmospherics" - icon_state = "atmos" - -/area/rnd/outpost/storage - name = "\improper Research Outpost Gas Storage" - icon_state = "toxstorage" - -/area/rnd/outpost/mixing - name = "\improper Research Outpost Gas Mixing" - icon_state = "toxmix" - -/area/rnd/outpost/heating - name = "\improper Research Outpost Gas Heating" - icon_state = "toxmix" - -/area/rnd/outpost/testing - name = "\improper Research Outpost Testing" - icon_state = "toxtest" - -/area/maintenance/substation/outpost - name = "Research Outpost Substation" - /area/engineering/engine_gas name = "\improper Engine Gas Storage" icon_state = "engine_waste" - -/area/chapel/observation - name = "\improper Chapel Observation" - icon_state = "chapel" \ No newline at end of file diff --git a/code/game/area/areas_vr.dm b/code/game/area/areas_vr.dm new file mode 100644 index 00000000000..d422c1cd0f1 --- /dev/null +++ b/code/game/area/areas_vr.dm @@ -0,0 +1,6 @@ +/area/shuttle_arrived() + .=..() + for(var/obj/machinery/telecomms/relay/R in contents) + R.reset_z() + for(var/obj/machinery/power/apc/A in contents) + A.update_area() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 6929943de22..631ed4df19f 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -388,7 +388,8 @@ blood_DNA = list() was_bloodied = 1 - blood_color = "#A10808" + if(!blood_color) + blood_color = "#A10808" if(istype(M)) if (!istype(M.dna, /datum/dna)) M.dna = new /datum/dna(null) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index adaabce4422..c8f0b44c3d5 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1,6 +1,6 @@ /atom/movable layer = OBJ_LAYER - appearance_flags = TILE_BOUND|PIXEL_SCALE + appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER //VOREStation Edit var/last_move = null var/anchored = 0 // var/elevation = 2 - not used anywhere diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index b5a73224fc7..23d8c7b60fa 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -111,6 +111,8 @@ var/global/list/datum/dna/gene/dna_genes[0] // New stuff var/species = SPECIES_HUMAN var/list/body_markings = list() + var/list/body_descriptors = null + var/list/genetic_modifiers = list() // Modifiers with the MODIFIER_GENETIC flag are saved. Note that only the type is saved, not an instance. // Make a copy of this strand. // USE THIS WHEN COPYING STUFF OR YOU'LL GET CORRUPTION! diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 998b712828f..1fe5d43a599 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -18,6 +18,8 @@ var/mind=null var/languages=null var/list/flavor=null + var/gender = null + var/list/body_descriptors = null var/list/genetic_modifiers = list() // Modifiers with the MODIFIER_GENETIC flag are saved. Note that only the type is saved, not an instance. /datum/dna2/record/proc/GetData() @@ -706,7 +708,10 @@ databuf.types = DNA2_BUF_UE databuf.dna = src.connected.occupant.dna.Clone() if(ishuman(connected.occupant)) - databuf.dna.real_name=connected.occupant.dna.real_name + var/mob/living/carbon/human/H = connected.occupant + databuf.dna.real_name = H.dna.real_name + databuf.gender = H.gender + databuf.body_descriptors = H.descriptors databuf.name = "Unique Identifier" src.buffers[bufferId] = databuf return 1 @@ -717,7 +722,10 @@ databuf.types = DNA2_BUF_UI|DNA2_BUF_UE databuf.dna = src.connected.occupant.dna.Clone() if(ishuman(connected.occupant)) - databuf.dna.real_name=connected.occupant.dna.real_name + var/mob/living/carbon/human/H = connected.occupant + databuf.dna.real_name = H.dna.real_name + databuf.gender = H.gender + databuf.body_descriptors = H.descriptors databuf.name = "Unique Identifier + Unique Enzymes" src.buffers[bufferId] = databuf return 1 @@ -728,7 +736,10 @@ databuf.types = DNA2_BUF_SE databuf.dna = src.connected.occupant.dna.Clone() if(ishuman(connected.occupant)) - databuf.dna.real_name=connected.occupant.dna.real_name + var/mob/living/carbon/human/H = connected.occupant + databuf.dna.real_name = H.dna.real_name + databuf.gender = H.gender + databuf.body_descriptors = H.descriptors databuf.name = "Structural Enzymes" src.buffers[bufferId] = databuf return 1 @@ -764,10 +775,18 @@ if ((buf.types & DNA2_BUF_UE)) src.connected.occupant.real_name = buf.dna.real_name src.connected.occupant.name = buf.dna.real_name + if(ishuman(connected.occupant)) + var/mob/living/carbon/human/H = connected.occupant + H.gender = buf.gender + H.descriptors = buf.body_descriptors src.connected.occupant.UpdateAppearance(buf.dna.UI.Copy()) else if (buf.types & DNA2_BUF_SE) src.connected.occupant.dna.SE = buf.dna.SE src.connected.occupant.dna.UpdateSE() + if(ishuman(connected.occupant)) + var/mob/living/carbon/human/H = connected.occupant + H.gender = buf.gender + H.descriptors = buf.body_descriptors domutcheck(src.connected.occupant,src.connected) src.connected.occupant.apply_effect(rand(20,50), IRRADIATE, check_protection = 0) return 1 diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 627b4e8b140..373aefa0d81 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -129,19 +129,19 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E return if(src.stat > max_stat) - src << "We are incapacitated." + to_chat(src, "We are incapacitated.") return if(changeling.absorbed_dna.len < required_dna) - src << "We require at least [required_dna] samples of compatible DNA." + to_chat(src, "We require at least [required_dna] samples of compatible DNA.") return if(changeling.chem_charges < required_chems) - src << "We require at least [required_chems] units of chemicals to do that!" + to_chat(src, "We require at least [required_chems] units of chemicals to do that!") return if(changeling.geneticdamage > max_genetic_damage) - src << "Our genomes are still reassembling. We need time to recover first." + to_chat(src, "Our genomes are still reassembling. We need time to recover first.") return return changeling @@ -204,11 +204,11 @@ turf/proc/AdjacentTurfsRangedSting() if(M.loc == src.loc) return 1 //target and source are in the same thing if(!isturf(src.loc) || !isturf(M.loc)) - src << "We cannot reach \the [M] with a sting!" + to_chat(src, "We cannot reach \the [M] with a sting!") return 0 //One is inside, the other is outside something. // Maximum queued turfs set to 25; I don't *think* anything raises sting_range above 2, but if it does the 25 may need raising if(!AStar(src.loc, M.loc, /turf/proc/AdjacentTurfsRangedSting, /turf/proc/Distance, max_nodes=25, max_node_depth=sting_range)) //If we can't find a path, fail - src << "We cannot find a path to sting \the [M] by!" + to_chat(src, "We cannot find a path to sting \the [M] by!") return 0 return 1 @@ -225,7 +225,7 @@ turf/proc/AdjacentTurfsRangedSting() if(!T) return if(T.isSynthetic()) - src << "We are unable to pierce the outer shell of [T]." + to_chat(src, "We are unable to pierce the outer shell of [T].") return if(!(T in view(changeling.sting_range))) return if(!sting_can_reach(T, changeling.sting_range)) return @@ -236,7 +236,7 @@ turf/proc/AdjacentTurfsRangedSting() src.verbs -= verb_path spawn(10) src.verbs += verb_path - src << "We stealthily sting [T]." + to_chat(src, "We stealthily sting [T].") if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting T << "You feel a tiny prick." return diff --git a/code/game/gamemodes/changeling/generic_equip_procs.dm b/code/game/gamemodes/changeling/generic_equip_procs.dm index ef1ab650a19..f2d7b458319 100644 --- a/code/game/gamemodes/changeling/generic_equip_procs.dm +++ b/code/game/gamemodes/changeling/generic_equip_procs.dm @@ -32,7 +32,7 @@ return 1 if(M.head || M.wear_suit) //Make sure our slots aren't full - src << "We require nothing to be on our head, and we cannot wear any external suits, or shoes." + to_chat(src, "We require nothing to be on our head, and we cannot wear any external suits, or shoes.") return 0 var/obj/item/clothing/suit/A = new armor_type(src) @@ -242,7 +242,7 @@ var/mob/living/carbon/human/M = src if(M.hands_are_full()) //Make sure our hands aren't full. - src << "Our hands are full. Drop something first." + to_chat(src, "Our hands are full. Drop something first.") return 0 var/obj/item/weapon/W = new weapon_type(src) diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index 45b230b00c1..02285a0c7ee 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -16,41 +16,41 @@ var/obj/item/weapon/grab/G = src.get_active_hand() if(!istype(G)) - src << "We must be grabbing a creature in our active hand to absorb them." + to_chat(src, "We must be grabbing a creature in our active hand to absorb them.") return var/mob/living/carbon/human/T = G.affecting if(!istype(T) || T.isSynthetic()) - src << "\The [T] is not compatible with our biology." + to_chat(src, "\The [T] is not compatible with our biology.") return if(T.species.flags & NO_SCAN) - src << "We do not know how to parse this creature's DNA!" + to_chat(src, "We do not know how to parse this creature's DNA!") return if(HUSK in T.mutations) //Lings can always absorb other lings, unless someone beat them to it first. if(!T.mind.changeling || T.mind.changeling && T.mind.changeling.geneticpoints < 0) - src << "This creature's DNA is ruined beyond useability!" + to_chat(src, "This creature's DNA is ruined beyond useability!") return if(G.state != GRAB_KILL) - src << "We must have a tighter grip to absorb this creature." + to_chat(src, "We must have a tighter grip to absorb this creature.") return if(changeling.isabsorbing) - src << "We are already absorbing!" + to_chat(src, "We are already absorbing!") return changeling.isabsorbing = 1 for(var/stage = 1, stage<=3, stage++) switch(stage) if(1) - src << "This creature is compatible. We must hold still..." + to_chat(src, "This creature is compatible. We must hold still...") if(2) - src << "We extend a proboscis." + to_chat(src, "We extend a proboscis.") src.visible_message("[src] extends a proboscis!") if(3) - src << "We stab [T] with the proboscis." + to_chat(src, "We stab [T] with the proboscis.") src.visible_message("[src] stabs [T] with the proboscis!") T << "You feel a sharp stabbing pain!" add_attack_logs(src,T,"Absorbed (changeling)") @@ -60,11 +60,11 @@ feedback_add_details("changeling_powers","A[stage]") if(!do_mob(src, T, 150) || G.state != GRAB_KILL) - src << "Our absorption of [T] has been interrupted!" + to_chat(src, "Our absorption of [T] has been interrupted!") changeling.isabsorbing = 0 return - src << "We have absorbed [T]!" + to_chat(src, "We have absorbed [T]!") src.visible_message("[src] sucks the fluids from [T]!") T << "You have been absorbed by the changeling!" if(src.nutrition < 400) @@ -76,7 +76,7 @@ if(changeling.readapts > changeling.max_readapts) changeling.readapts = changeling.max_readapts - src << "We can now re-adapt, reverting our evolution so that we may start anew, if needed." + to_chat(src, "We can now re-adapt, reverting our evolution so that we may start anew, if needed.") var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages, T.identifying_gender, T.flavor_texts, T.modifiers) absorbDNA(newDNA) @@ -98,7 +98,7 @@ changeling.geneticpoints += 4 changeling.max_geneticpoints += 4 - src << "We absorbed another changeling, and we grow stronger. Our genomes increase." + to_chat(src, "We absorbed another changeling, and we grow stronger. Our genomes increase.") T.mind.changeling.chem_charges = 0 T.mind.changeling.geneticpoints = -1 diff --git a/code/game/gamemodes/changeling/powers/armblade.dm b/code/game/gamemodes/changeling/powers/armblade.dm index 947f06cee45..c05ad96e81e 100644 --- a/code/game/gamemodes/changeling/powers/armblade.dm +++ b/code/game/gamemodes/changeling/powers/armblade.dm @@ -14,7 +14,7 @@ if(src.mind.changeling.recursive_enhancement) if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/arm_blade/greater)) - src << "We prepare an extra sharp blade." + to_chat(src, "We prepare an extra sharp blade.") return 1 else @@ -39,7 +39,7 @@ if(src.mind.changeling.recursive_enhancement) if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/claw/greater, 1, 15)) - src << "We prepare an extra sharp claw." + to_chat(src, "We prepare an extra sharp claw.") return 1 else diff --git a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm index 3f3c1bd7adc..192f8b38741 100644 --- a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm +++ b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm @@ -25,7 +25,7 @@ if(held_item == null) if(src.mind.changeling.recursive_enhancement) if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent,0)) - src << "We will shock others more efficently." + to_chat(src, "We will shock others more efficently.") return 1 else if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc. @@ -54,7 +54,7 @@ "Our hand channels raw electricity into [G.affecting].", "You hear sparks!") else - src << "Our gloves block us from shocking \the [G.affecting]." + to_chat(src, "Our gloves block us from shocking \the [G.affecting].") src.mind.changeling.chem_charges -= 10 return 1 @@ -92,7 +92,7 @@ sleep(1 SECOND) success = 1 if(success == 0) //If we couldn't do anything with the ability, don't deduct the chemicals. - src << "We are unable to affect \the [held_item]." + to_chat(src, "We are unable to affect \the [held_item].") else src.mind.changeling.chem_charges -= 10 return success @@ -143,7 +143,7 @@ var/mob/living/carbon/C = target if(user.mind.changeling.chem_charges < shock_cost) - src << "We require more chemicals to electrocute [C]!" + to_chat(src, "We require more chemicals to electrocute [C]!") return 0 C.electrocute_act(electrocute_amount * siemens,src,1.0,BP_TORSO) @@ -156,7 +156,7 @@ "Our hand channels raw electricity into [C]", "You hear sparks!") else - src << "Our gloves block us from shocking \the [C]." + to_chat(src, "Our gloves block us from shocking \the [C].") //qdel(src) //Since we're no longer a one hit stun, we need to stick around. user.mind.changeling.chem_charges -= shock_cost return 1 @@ -165,7 +165,7 @@ var/mob/living/silicon/S = target if(user.mind.changeling.chem_charges < 10) - src << "We require more chemicals to electrocute [S]!" + to_chat(src, "We require more chemicals to electrocute [S]!") return 0 S.electrocute_act(60,src,0.75) //If only they had surge protectors. @@ -205,7 +205,7 @@ success = 1 break if(success == 0) - src << "We are unable to affect \the [target]." + to_chat(src, "We are unable to affect \the [target].") else qdel(src) return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/blind_sting.dm b/code/game/gamemodes/changeling/powers/blind_sting.dm index 347881df9b2..e2fede649e2 100644 --- a/code/game/gamemodes/changeling/powers/blind_sting.dm +++ b/code/game/gamemodes/changeling/powers/blind_sting.dm @@ -21,7 +21,7 @@ var/duration = 300 if(src.mind.changeling.recursive_enhancement) duration = duration + 150 - src << "They will be deprived of sight for longer." + to_chat(src, "They will be deprived of sight for longer.") spawn(duration) T.disabilities &= ~NEARSIGHTED T.Blind(10) diff --git a/code/game/gamemodes/changeling/powers/cryo_sting.dm b/code/game/gamemodes/changeling/powers/cryo_sting.dm index bc68428d892..e1a2b10cff9 100644 --- a/code/game/gamemodes/changeling/powers/cryo_sting.dm +++ b/code/game/gamemodes/changeling/powers/cryo_sting.dm @@ -20,12 +20,12 @@ var/inject_amount = 10 if(src.mind.changeling.recursive_enhancement) inject_amount = inject_amount * 1.5 - src << "We inject extra chemicals." + to_chat(src, "We inject extra chemicals.") if(T.reagents) T.reagents.add_reagent("cryotoxin", inject_amount) feedback_add_details("changeling_powers","CS") src.verbs -= /mob/proc/changeling_cryo_sting spawn(3 MINUTES) - src << "Our cryogenic string is ready to be used once more." + to_chat(src, "Our cryogenic string is ready to be used once more.") src.verbs |= /mob/proc/changeling_cryo_sting return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/deaf_sting.dm b/code/game/gamemodes/changeling/powers/deaf_sting.dm index a94ad1744aa..92e7a80a308 100644 --- a/code/game/gamemodes/changeling/powers/deaf_sting.dm +++ b/code/game/gamemodes/changeling/powers/deaf_sting.dm @@ -19,7 +19,7 @@ var/duration = 300 if(src.mind.changeling.recursive_enhancement) duration = duration + 100 - src << "They will be unable to hear for a little longer." + to_chat(src, "They will be unable to hear for a little longer.") T << "Your ears pop and begin ringing loudly!" T.sdisabilities |= DEAF spawn(duration) T.sdisabilities &= ~DEAF diff --git a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm index 7853a9603e8..f50460a826b 100644 --- a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm +++ b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm @@ -32,7 +32,7 @@ var/type_to_give = /datum/modifier/delayed_toxin_sting if(src.mind.changeling.recursive_enhancement) type_to_give = /datum/modifier/delayed_toxin_sting/strong - src << "Our toxin will be extra potent, when it strikes." + to_chat(src, "Our toxin will be extra potent, when it strikes.") T.add_modifier(type_to_give, 2 MINUTES) diff --git a/code/game/gamemodes/changeling/powers/enfeebling_string.dm b/code/game/gamemodes/changeling/powers/enfeebling_string.dm index 16303f7c589..81930a7ebc7 100644 --- a/code/game/gamemodes/changeling/powers/enfeebling_string.dm +++ b/code/game/gamemodes/changeling/powers/enfeebling_string.dm @@ -40,7 +40,7 @@ var/type_to_give = /datum/modifier/enfeeble if(src.mind.changeling.recursive_enhancement) type_to_give = /datum/modifier/enfeeble/strong - src << "We make them extremely weak." + to_chat(src, "We make them extremely weak.") H.add_modifier(type_to_give, 2 MINUTES) feedback_add_details("changeling_powers","ES") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/extract_dna_sting.dm b/code/game/gamemodes/changeling/powers/extract_dna_sting.dm index 0c5d91d83b6..35ce94daf0e 100644 --- a/code/game/gamemodes/changeling/powers/extract_dna_sting.dm +++ b/code/game/gamemodes/changeling/powers/extract_dna_sting.dm @@ -24,15 +24,15 @@ return if(!istype(T) || T.isSynthetic()) - src << "\The [T] is not compatible with our biology." + to_chat(src, "\The [T] is not compatible with our biology.") return 0 if(T.species.flags & NO_SCAN) - src << "We do not know how to parse this creature's DNA!" + to_chat(src, "We do not know how to parse this creature's DNA!") return 0 if(HUSK in T.mutations) - src << "This creature's DNA is ruined beyond useability!" + to_chat(src, "This creature's DNA is ruined beyond useability!") return 0 add_attack_logs(src,T,"DNA extraction sting (changeling)") diff --git a/code/game/gamemodes/changeling/powers/fake_death.dm b/code/game/gamemodes/changeling/powers/fake_death.dm index cae98164a0e..3581a8d06a2 100644 --- a/code/game/gamemodes/changeling/powers/fake_death.dm +++ b/code/game/gamemodes/changeling/powers/fake_death.dm @@ -19,7 +19,7 @@ var/mob/living/carbon/C = src if(changeling.max_geneticpoints < 0) //Absorbed by another ling - src << "We have no genomes, not even our own, and cannot regenerate." + to_chat(src, "We have no genomes, not even our own, and cannot regenerate.") return 0 if(!C.stat && alert("Are we sure we wish to regenerate? We will appear to be dead while doing so.","Revival","Yes","No") == "No") @@ -44,7 +44,7 @@ spawn(rand(2 MINUTES, 4 MINUTES)) //The ling will now be able to choose when to revive src.verbs += /mob/proc/changeling_revive - src << "We are ready to rise. Use the Revive verb when you are ready." + to_chat(src, "We are ready to rise. Use the Revive verb when you are ready.") feedback_add_details("changeling_powers","FD") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index f7760e9ce6a..ed60400517e 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -22,10 +22,10 @@ var/heal_amount = 2 if(src.mind.changeling.recursive_enhancement) heal_amount = heal_amount * 2 - src << "We will heal much faster." + to_chat(src, "We will heal much faster.") spawn(0) - src << "We begin to heal ourselves." + to_chat(src, "We begin to heal ourselves.") for(var/i = 0, i<50,i++) if(C) C.adjustBruteLoss(-heal_amount) @@ -35,7 +35,7 @@ src.verbs -= /mob/proc/changeling_fleshmend spawn(50 SECONDS) - src << "Our regeneration has slowed to normal levels." + to_chat(src, "Our regeneration has slowed to normal levels.") src.verbs += /mob/proc/changeling_fleshmend feedback_add_details("changeling_powers","FM") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm index c8e5f116040..105de8f4f56 100644 --- a/code/game/gamemodes/changeling/powers/hivemind.dm +++ b/code/game/gamemodes/changeling/powers/hivemind.dm @@ -34,7 +34,7 @@ var/list/datum/dna/hivemind_bank = list() names += DNA.name if(names.len <= 0) - src << "The airwaves already have all of our DNA." + to_chat(src, "The airwaves already have all of our DNA.") return var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names @@ -46,7 +46,7 @@ var/list/datum/dna/hivemind_bank = list() changeling.chem_charges -= 10 hivemind_bank += chosen_dna - src << "We channel the DNA of [S] to the air." + to_chat(src, "We channel the DNA of [S] to the air.") feedback_add_details("changeling_powers","HU") return 1 @@ -64,7 +64,7 @@ var/list/datum/dna/hivemind_bank = list() names[DNA.name] = DNA if(names.len <= 0) - src << "There's no new DNA to absorb from the air." + to_chat(src, "There's no new DNA to absorb from the air.") return var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names @@ -75,6 +75,6 @@ var/list/datum/dna/hivemind_bank = list() changeling.chem_charges -= 20 absorbDNA(chosen_dna) - src << "We absorb the DNA of [S] from the air." + to_chat(src, "We absorb the DNA of [S] from the air.") feedback_add_details("changeling_powers","HD") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/lesser_form.dm b/code/game/gamemodes/changeling/powers/lesser_form.dm index f2742490f66..6a5cf807300 100644 --- a/code/game/gamemodes/changeling/powers/lesser_form.dm +++ b/code/game/gamemodes/changeling/powers/lesser_form.dm @@ -13,13 +13,13 @@ if(!changeling) return if(src.has_brain_worms()) - src << "We cannot perform this ability at the present time!" + to_chat(src, "We cannot perform this ability at the present time!") return var/mob/living/carbon/human/H = src if(!istype(H) || !H.species.primitive_form) - src << "We cannot perform this ability in this form!" + to_chat(src, "We cannot perform this ability in this form!") return changeling.chem_charges-- diff --git a/code/game/gamemodes/changeling/powers/mimic_voice.dm b/code/game/gamemodes/changeling/powers/mimic_voice.dm index ae953176838..6b84c577ff6 100644 --- a/code/game/gamemodes/changeling/powers/mimic_voice.dm +++ b/code/game/gamemodes/changeling/powers/mimic_voice.dm @@ -19,7 +19,7 @@ if(changeling.mimicing) changeling.mimicing = "" - src << "We return our vocal glands to their original location." + to_chat(src, "We return our vocal glands to their original location.") return var/mimic_voice = sanitize(input(usr, "Enter a name to mimic.", "Mimic Voice", null), MAX_NAME_LEN) @@ -28,8 +28,8 @@ changeling.mimicing = mimic_voice - src << "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active." - src << "Use this power again to return to our original voice and reproduce chemicals again." + to_chat(src, "We shape our glands to take the voice of [mimic_voice], this will stop us from regenerating chemicals while active.") + to_chat(src, "Use this power again to return to our original voice and reproduce chemicals again.") feedback_add_details("changeling_powers","MV") diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index 660434d185a..30679b6ef5a 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -18,7 +18,7 @@ return 0 src.mind.changeling.chem_charges -= 20 - src << "We cleanse impurities from our form." + to_chat(src, "We cleanse impurities from our form.") var/mob/living/carbon/human/C = src @@ -32,7 +32,7 @@ var/heal_amount = 5 if(src.mind.changeling.recursive_enhancement) heal_amount = heal_amount * 2 - src << "We will heal much faster." + to_chat(src, "We will heal much faster.") for(var/i = 0, i<10,i++) if(C) diff --git a/code/game/gamemodes/changeling/powers/rapid_regen.dm b/code/game/gamemodes/changeling/powers/rapid_regen.dm index 2eb628b8f6c..6d1e9ee300c 100644 --- a/code/game/gamemodes/changeling/powers/rapid_regen.dm +++ b/code/game/gamemodes/changeling/powers/rapid_regen.dm @@ -24,7 +24,7 @@ var/healing_amount = 40 if(src.mind.changeling.recursive_enhancement) healing_amount = C.maxHealth - src << "We completely heal ourselves." + to_chat(src, "We completely heal ourselves.") spawn(0) C.adjustBruteLoss(-healing_amount) C.adjustFireLoss(-healing_amount) diff --git a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm index 9362333c57c..77bab9bd998 100644 --- a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm +++ b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm @@ -15,10 +15,10 @@ if(!changeling) return 0 if(src.mind.changeling.recursive_enhancement) - src << "We will no longer empower our abilities." + to_chat(src, "We will no longer empower our abilities.") src.mind.changeling.recursive_enhancement = 0 return 0 - src << "We empower ourselves. Our abilities will now be extra potent." + to_chat(src, "We empower ourselves. Our abilities will now be extra potent.") src.mind.changeling.recursive_enhancement = 1 feedback_add_details("changeling_powers","RE") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/respec.dm b/code/game/gamemodes/changeling/powers/respec.dm index 66f13e720f1..a50a41269f7 100644 --- a/code/game/gamemodes/changeling/powers/respec.dm +++ b/code/game/gamemodes/changeling/powers/respec.dm @@ -7,7 +7,7 @@ if(!changeling) return if(src.mind.changeling.readapts <= 0) - to_chat(src, "We must first absorb another compatable creature!") + to_chat(src, "We must first absorb another compatible creature!") src.mind.changeling.readapts = 0 return @@ -26,6 +26,6 @@ H.remove_modifiers_of_type(/datum/modifier/endoarmor) //Revert endoarmor too. src.make_changeling() //And give back our freebies. - src << "We have removed our evolutions from this form, and are now ready to readapt." + to_chat(src, "We have removed our evolutions from this form, and are now ready to readapt.") ling_datum.purchased_powers_history.Add("Re-adapt (Reset to [ling_datum.max_geneticpoints])") diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 7fe4ab232be..0648fa8ab65 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -9,7 +9,7 @@ return 0 if(changeling.max_geneticpoints < 0) //Absorbed by another ling - src << "You have no genomes, not even your own, and cannot revive." + to_chat(src, "You have no genomes, not even your own, and cannot revive.") return 0 if(src.stat == DEAD) diff --git a/code/game/gamemodes/changeling/powers/self_respiration.dm b/code/game/gamemodes/changeling/powers/self_respiration.dm index 6d6228eba88..51083616697 100644 --- a/code/game/gamemodes/changeling/powers/self_respiration.dm +++ b/code/game/gamemodes/changeling/powers/self_respiration.dm @@ -19,13 +19,13 @@ if(istype(src,/mob/living/carbon)) var/mob/living/carbon/C = src if(C.suiciding) - src << "You're committing suicide, this isn't going to work." + to_chat(src, "You're committing suicide, this isn't going to work.") return 0 if(C.does_not_breathe == 0) C.does_not_breathe = 1 - src << "We stop breathing, as we no longer need to." + to_chat(src, "We stop breathing, as we no longer need to.") return 1 else C.does_not_breathe = 0 - src << "We resume breathing, as we now need to again." + to_chat(src, "We resume breathing, as we now need to again.") return 0 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 4989c27f877..a2b9013c5a3 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -95,13 +95,13 @@ if(!changeling) return 0 if(is_muzzled()) - src << "Mmmf mrrfff!" + to_chat(src, "Mmmf mrrfff!") return 0 if(ishuman(src)) var/mob/living/carbon/human/H = src if(H.silent) - src << "You can't speak!" + to_chat(src, "You can't speak!") return 0 if(world.time < (changeling.last_shriek + 10 SECONDS) ) @@ -125,7 +125,7 @@ range_med = range_med * 2 range_light = range_light * 2 range_long = range_long * 2 - src << "We are extra loud." + to_chat(src, "We are extra loud.") src.mind.changeling.recursive_enhancement = 0 visible_message("[src] appears to shout.") diff --git a/code/game/gamemodes/changeling/powers/silence_sting.dm b/code/game/gamemodes/changeling/powers/silence_sting.dm index 334b0c139f8..16d24c878f1 100644 --- a/code/game/gamemodes/changeling/powers/silence_sting.dm +++ b/code/game/gamemodes/changeling/powers/silence_sting.dm @@ -19,7 +19,7 @@ var/duration = 30 if(src.mind.changeling.recursive_enhancement) duration = duration + 10 - src << "They will be unable to cry out in fear for a little longer." + to_chat(src, "They will be unable to cry out in fear for a little longer.") T.silent += duration feedback_add_details("changeling_powers","SS") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/transform_sting.dm b/code/game/gamemodes/changeling/powers/transform_sting.dm index 678e195e22a..1f6bc7b93dc 100644 --- a/code/game/gamemodes/changeling/powers/transform_sting.dm +++ b/code/game/gamemodes/changeling/powers/transform_sting.dm @@ -34,7 +34,7 @@ if(!T) return 0 if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T))) - src << "Our sting appears ineffective against its DNA." + to_chat(src, "Our sting appears ineffective against its DNA.") return 0 add_attack_logs(src,T,"Transformation sting (changeling)") T.visible_message("[T] transforms!") diff --git a/code/game/gamemodes/cult/cultify/mob.dm b/code/game/gamemodes/cult/cultify/mob.dm index d78956c40ab..0cadd06d6cf 100644 --- a/code/game/gamemodes/cult/cultify/mob.dm +++ b/code/game/gamemodes/cult/cultify/mob.dm @@ -12,7 +12,7 @@ icon_state = "ghost-narsie" overlays = 0 invisibility = 0 - src << "Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone." + to_chat(src, "Even as a non-corporal being, you can feel Nar-Sie's presence altering you. You are now visible to everyone.") /mob/living/cultify() if(iscultist(src) && client) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 69733a60d8d..04d8e853633 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -284,7 +284,7 @@ var/global/datum/controller/gameticker/ticker var/mob/living/carbon/human/new_char = player.create_character() if(new_char) qdel(player) - if(istype(new_char)) + if(istype(new_char) && !(new_char.mind.assigned_role=="Cyborg")) data_core.manifest_inject(new_char) //VOREStation Edit End @@ -304,7 +304,7 @@ var/global/datum/controller/gameticker/ticker if(!player_is_antag(player.mind, only_offstation_roles = 1)) job_master.EquipRank(player, player.mind.assigned_role, 0) UpdateFactionList(player) - equip_custom_items(player) + //equip_custom_items(player) //VOREStation Removal //player.apply_traits() //VOREStation Removal if(captainless) for(var/mob/M in player_list) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 4380331b50d..1ac4779414d 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -273,7 +273,7 @@ if(explode) explosion(src.loc, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 4, flash_range = 6, adminlog = 0) new /obj/effect/decal/cleanable/greenglow(get_turf(src)) - radiation_repository.radiate(src, 50) + SSradiation.radiate(src, 50) // This meteor fries toasters. /obj/effect/meteor/emp diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm index 7904b5cb6c4..6dc3f2d52b1 100644 --- a/code/game/gamemodes/technomancer/instability.dm +++ b/code/game/gamemodes/technomancer/instability.dm @@ -122,13 +122,13 @@ electrocute_act(instability * 0.3, "unstable energies", 0.75) if(1) adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability - src << "Your chassis alerts you to overheating from an unknown external force!" + to_chat(src, "Your chassis alerts you to overheating from an unknown external force!") if(2) adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability - src << "Your chassis makes the sound of metal groaning!" + to_chat(src, "Your chassis makes the sound of metal groaning!") if(3) safe_blink(src, range = 6) - src << "You're teleported against your will!" + to_chat(src, "You're teleported against your will!") if(4) emp_act(3) @@ -141,10 +141,10 @@ emp_act(2) if(2) adjustFireLoss(instability * 0.3) //30 burn @ 100 instability - src << "Your chassis alerts you to extreme overheating from an unknown external force!" + to_chat(src, "Your chassis alerts you to extreme overheating from an unknown external force!") if(3) adjustBruteLoss(instability * 0.3) //30 brute @ 100 instability - src << "Your chassis makes the sound of metal groaning and tearing!" + to_chat(src, "Your chassis makes the sound of metal groaning and tearing!") if(101 to 200) //Lethal rng = rand(0,4) @@ -155,10 +155,10 @@ emp_act(1) if(2) adjustFireLoss(instability * 0.4) //40 burn @ 100 instability - src << "Your chassis alerts you to extreme overheating from an unknown external force!" + to_chat(src, "Your chassis alerts you to extreme overheating from an unknown external force!") if(3) adjustBruteLoss(instability * 0.4) //40 brute @ 100 instability - src << "Your chassis makes the sound of metal groaning and tearing!" + to_chat(src, "Your chassis makes the sound of metal groaning and tearing!") /mob/living/carbon/human/instability_effects() if(instability) @@ -190,23 +190,23 @@ if(2) if(can_feel_pain()) apply_effect(instability * 0.3, AGONY) - src << "You feel a sharp pain!" + to_chat(src, "You feel a sharp pain!") if(3) apply_effect(instability * 0.3, EYE_BLUR) - src << "Your eyes start to get cloudy!" + to_chat(src, "Your eyes start to get cloudy!") if(4) electrocute_act(instability * 0.3, "unstable energies") if(5) adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability - src << "You feel your skin burn!" + to_chat(src, "You feel your skin burn!") if(6) adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability - src << "You feel a sharp pain as an unseen force harms your body!" + to_chat(src, "You feel a sharp pain as an unseen force harms your body!") if(7) adjustToxLoss(instability * 0.15) //7.5 tox @ 50 instability if(8) safe_blink(src, range = 6) - src << "You're teleported against your will!" + to_chat(src, "You're teleported against your will!") if(50 to 100) //Severe rng = rand(0,8) @@ -218,18 +218,18 @@ if(2) if(can_feel_pain()) apply_effect(instability * 0.7, AGONY) - src << "You feel an extremly angonizing pain from all over your body!" + to_chat(src, "You feel an extremly angonizing pain from all over your body!") if(3) apply_effect(instability * 0.5, EYE_BLUR) - src << "Your eyes start to get cloudy!" + to_chat(src, "Your eyes start to get cloudy!") if(4) electrocute_act(instability * 0.5, "extremely unstable energies") if(5) fire_act() - src << "You spontaneously combust!" + to_chat(src, "You spontaneously combust!") if(6) adjustCloneLoss(instability * 0.05) //5 cloneloss @ 100 instability - src << "You feel your body slowly degenerate." + to_chat(src, "You feel your body slowly degenerate.") if(7) adjustToxLoss(instability * 0.25) //25 tox @ 100 instability @@ -245,18 +245,18 @@ if(2) if(can_feel_pain()) apply_effect(instability, AGONY) - src << "You feel an extremly angonizing pain from all over your body!" + to_chat(src, "You feel an extremly angonizing pain from all over your body!") if(3) apply_effect(instability, EYE_BLUR) - src << "Your eyes start to get cloudy!" + to_chat(src, "Your eyes start to get cloudy!") if(4) electrocute_act(instability, "extremely unstable energies") if(5) fire_act() - src << "You spontaneously combust!" + to_chat(src, "You spontaneously combust!") if(6) adjustCloneLoss(instability * 0.10) //5 cloneloss @ 100 instability - src << "You feel your body slowly degenerate." + to_chat(src, "You feel your body slowly degenerate.") if(7) adjustToxLoss(instability * 0.40) //40 tox @ 100 instability diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index 681d29da50b..adfeda58ab1 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -292,7 +292,7 @@ if(l_spell.aspect == ASPECT_CHROMATIC) //Check the other hand too. l_spell.on_combine_cast(S, src) else //Welp - src << "You require a free hand to use this function." + to_chat(src, "You require a free hand to use this function.") return 0 if(S.run_checks()) diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm index 06c22a4c8bc..d20e3925992 100644 --- a/code/game/jobs/job/assistant.dm +++ b/code/game/jobs/job/assistant.dm @@ -1,54 +1,26 @@ -//VOREStation Edit - Basically this whole file -/datum/job/intern - title = "Intern" - flag = INTERN - department = "Civilian" - department_flag = ENGSEC // VOREStation Edit - Ran out of bits - faction = "Station" - total_positions = -1 - spawn_positions = -1 - supervisors = "the staff from the departmen you're interning in" - selection_color = "#555555" - economic_modifier = 2 - access = list() //See /datum/job/assistant/get_access() - minimal_access = list() //See /datum/job/assistant/get_access() - outfit_type = /decl/hierarchy/outfit/job/assistant/intern - alt_titles = list("Apprentice Engineer","Medical Intern","Lab Assistant","Security Cadet","Jr. Cargo Tech", "Jr. Explorer") //VOREStation Edit - timeoff_factor = 0 //VOREStation Edit - Interns, noh - -//VOREStation Add -/datum/job/intern/New() - ..() - if(config) - total_positions = config.limit_interns - spawn_positions = config.limit_interns -//VOREStation Add End - -// VOREStation Add /datum/job/assistant - title = USELESS_JOB + title = "Assistant" flag = ASSISTANT department = "Civilian" department_flag = CIVILIAN faction = "Station" total_positions = -1 spawn_positions = -1 - supervisors = "nobody! You don't work here" + supervisors = "absolutely everyone" selection_color = "#515151" economic_modifier = 1 - access = list() - minimal_access = list() + access = list() //See /datum/job/assistant/get_access() + minimal_access = list() //See /datum/job/assistant/get_access() outfit_type = /decl/hierarchy/outfit/job/assistant - timeoff_factor = 0 -/datum/job/assistant/New() - ..() - if(config) - total_positions = config.limit_visitors - spawn_positions = config.limit_visitors +/* alt_titles = list( + "Technical Assistant", + "Medical Intern", + "Research Assistant", + "Visitor" = /decl/hierarchy/outfit/job/assistant/visitor + ) */ //VOREStation Removal: no alt-titles for visitors /datum/job/assistant/get_access() if(config.assistant_maint) return list(access_maint_tunnels) else return list() -//VOREStation Add End diff --git a/code/game/jobs/job/assistant_vr.dm b/code/game/jobs/job/assistant_vr.dm new file mode 100644 index 00000000000..212ca5f847f --- /dev/null +++ b/code/game/jobs/job/assistant_vr.dm @@ -0,0 +1,42 @@ +/datum/job/intern + title = "Intern" + flag = INTERN + department = "Civilian" + department_flag = ENGSEC // Ran out of bits + faction = "Station" + total_positions = -1 + spawn_positions = -1 + supervisors = "the staff from the department you're interning in" + selection_color = "#555555" + economic_modifier = 2 + access = list() //See /datum/job/intern/get_access() + minimal_access = list() //See /datum/job/intern/get_access() + outfit_type = /decl/hierarchy/outfit/job/assistant/intern + alt_titles = list("Apprentice Engineer","Medical Intern","Lab Assistant","Security Cadet","Jr. Cargo Tech", "Jr. Explorer", "Server" = /decl/hierarchy/outfit/job/service/server) + timeoff_factor = 0 // Interns, noh + +/datum/job/intern/New() + ..() + if(config) + total_positions = config.limit_interns + spawn_positions = config.limit_interns + +/datum/job/intern/get_access() + if(config.assistant_maint) + return list(access_maint_tunnels) + else + return list() + +/datum/job/assistant // Visitor + title = USELESS_JOB + supervisors = "nobody! You don't work here" + timeoff_factor = 0 + +/datum/job/assistant/New() + ..() + if(config) + total_positions = config.limit_visitors + spawn_positions = config.limit_visitors + +/datum/job/assistant/get_access() + return list() diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 94a32c3841b..f1e0a1b8b2a 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -31,7 +31,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.implant_loyalty(src) */ /datum/job/captain/get_access() - return get_all_station_access() + return get_all_station_access().Copy() /datum/job/hop title = "Head of Personnel" @@ -60,13 +60,13 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_keycard_auth) //, access_gateway) //VOREStation Edit + access_hop, access_RC_announce, access_keycard_auth, access_gateway) minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_keycard_auth) //, access_gateway) //VOREStation Edit + access_hop, access_RC_announce, access_keycard_auth, access_gateway) /datum/job/secretary title = "Command Secretary" diff --git a/code/game/jobs/job/captain_vr.dm b/code/game/jobs/job/captain_vr.dm new file mode 100644 index 00000000000..b6c38cae15e --- /dev/null +++ b/code/game/jobs/job/captain_vr.dm @@ -0,0 +1,23 @@ +/datum/job/captain + disallow_jobhop = TRUE + +/datum/job/hop + + disallow_jobhop = TRUE + alt_titles = list("Deputy Director", "Crew Resources Officer") + + access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, + access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, + access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, + access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, + access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, + access_hop, access_RC_announce, access_keycard_auth) + minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, + access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, + access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, + access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, + access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, + access_hop, access_RC_announce, access_keycard_auth) + +/datum/job/secretary + disallow_jobhop = TRUE \ No newline at end of file diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 1b59d5a2a0f..d31a551726c 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -132,8 +132,8 @@ department = "Civilian" department_flag = CIVILIAN faction = "Station" - total_positions = 2 // VOREStation Edit. Original number is 1. - spawn_positions = 2 // VOREStation Edit. Original number is 1. + total_positions = 1 + spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#515151" idtype = /obj/item/weapon/card/id/civilian/librarian diff --git a/code/game/jobs/job/civilian_vr.dm b/code/game/jobs/job/civilian_vr.dm new file mode 100644 index 00000000000..9a13c8925fb --- /dev/null +++ b/code/game/jobs/job/civilian_vr.dm @@ -0,0 +1,28 @@ +/datum/job/chef + total_positions = 2 //IT TAKES A LOT TO MAKE A STEW + spawn_positions = 2 //A PINCH OF SALT AND LAUGHTER, TOO + +/datum/job/cargo_tech + total_positions = 3 + spawn_positions = 3 + +/datum/job/mining + total_positions = 4 + spawn_positions = 4 + +/datum/job/janitor //Lots of janitor substations on station. + total_positions = 3 + spawn_positions = 3 + alt_titles = list("Custodian", "Sanitation Technician", "Maid") + +//TFF 5/9/19 - restore librarian job slot to 2 +/datum/job/librarian + total_positions = 2 + spawn_positions = 2 + alt_titles = list("Journalist", "Historian", "Writer") + +/datum/job/lawyer + disallow_jobhop = TRUE + + + diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm new file mode 100644 index 00000000000..da4b94de38d --- /dev/null +++ b/code/game/jobs/job/engineering_vr.dm @@ -0,0 +1,5 @@ +/datum/job/chief_engineer + disallow_jobhop = TRUE + +/datum/job/atmos + spawn_positions = 3 \ No newline at end of file diff --git a/code/game/jobs/job/medical_vr.dm b/code/game/jobs/job/medical_vr.dm new file mode 100644 index 00000000000..bd541fb00a7 --- /dev/null +++ b/code/game/jobs/job/medical_vr.dm @@ -0,0 +1,5 @@ +/datum/job/cmo + disallow_jobhop = TRUE + +/datum/job/doctor + spawn_positions = 5 \ No newline at end of file diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 3a2c213884f..c65f3413b6b 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -15,11 +15,11 @@ access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, - access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network) //VOREStation Edit + access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network) minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, - access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network) //VOREStation Edit + access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network) alt_titles = list("Research Supervisor") minimum_character_age = 25 diff --git a/code/game/jobs/job/science_vr.dm b/code/game/jobs/job/science_vr.dm new file mode 100644 index 00000000000..408101842d2 --- /dev/null +++ b/code/game/jobs/job/science_vr.dm @@ -0,0 +1,14 @@ +/datum/job/rd + disallow_jobhop = TRUE + + access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, + access_tox_storage, access_teleporter, access_sec_doors, + access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, + access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network) + minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, + access_tox_storage, access_teleporter, access_sec_doors, + access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, + access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network) + +/datum/job/scientist + alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher", "Circuit Designer") \ No newline at end of file diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 0316f824c80..6b753f519c0 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -14,12 +14,12 @@ economic_modifier = 10 access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, - access_research, access_engine, access_mining, access_construction, access_mailsorting, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)//VOREStation Edit + access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, - access_research, access_engine, access_mining, access_construction, access_mailsorting, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)//VOREStation Edit + access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) minimum_character_age = 25 minimal_player_age = 14 diff --git a/code/game/jobs/job/security_vr.dm b/code/game/jobs/job/security_vr.dm new file mode 100644 index 00000000000..8d53dc4a1d5 --- /dev/null +++ b/code/game/jobs/job/security_vr.dm @@ -0,0 +1,11 @@ +/datum/job/hos + disallow_jobhop = TRUE + + access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, + access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, + access_research, access_engine, access_mining, access_construction, access_mailsorting, + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) + minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, + access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, + access_research, access_engine, access_mining, access_construction, access_mailsorting, + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) \ No newline at end of file diff --git a/code/game/jobs/job/silicon_vr.dm b/code/game/jobs/job/silicon_vr.dm new file mode 100644 index 00000000000..44cb17ec720 --- /dev/null +++ b/code/game/jobs/job/silicon_vr.dm @@ -0,0 +1,3 @@ +/datum/job/cyborg + total_positions = 4 //Along with one able to spawn later in the round. + spawn_positions = 3 //Let's have 3 able to spawn in roundstart \ No newline at end of file diff --git a/code/game/jobs/job/special.dm b/code/game/jobs/job/special_vr.dm similarity index 99% rename from code/game/jobs/job/special.dm rename to code/game/jobs/job/special_vr.dm index 7d1ccead195..fbed7452404 100644 --- a/code/game/jobs/job/special.dm +++ b/code/game/jobs/job/special_vr.dm @@ -37,8 +37,7 @@ return 1 get_access() - var/access = get_all_accesses() - return access + return get_all_accesses().Copy() /*/datum/job/centcom_visitor //For Pleasure // You mean for admin abuse... -Ace title = "CentCom Visitor" diff --git a/code/game/jobs/job/z_all_jobs_vr.dm b/code/game/jobs/job/z_all_jobs_vr.dm deleted file mode 100644 index 0e740c70922..00000000000 --- a/code/game/jobs/job/z_all_jobs_vr.dm +++ /dev/null @@ -1,77 +0,0 @@ -//Contains all modified jobs for easy access and editing. - -/datum/job/captain - disallow_jobhop = TRUE - -/datum/job/hop - disallow_jobhop = TRUE - alt_titles = list("Deputy Director", "Crew Resources Officer") - -/datum/job/hos - disallow_jobhop = TRUE - -/datum/job/chief_engineer - disallow_jobhop = TRUE - -/datum/job/cmo - disallow_jobhop = TRUE - -/datum/job/rd - disallow_jobhop = TRUE - -/datum/job/secretary - disallow_jobhop = TRUE - -/datum/job/lawyer - disallow_jobhop = TRUE - -/datum/job/doctor - total_positions = 5 - spawn_positions = 5 - -/datum/job/janitor //Lots of janitor substations on station. - total_positions = 3 - spawn_positions = 3 - alt_titles = list("Custodian", "Sanitation Technician", "Maid") - -/datum/job/librarian - alt_titles = list("Journalist", "Historian", "Writer") - -/datum/job/officer - total_positions = 4 - spawn_positions = 4 - -/datum/job/cargo_tech - total_positions = 3 - spawn_positions = 3 - -/datum/job/psychiatrist - total_positions = 1 - spawn_positions = 1 - -/datum/job/mining - total_positions = 4 - spawn_positions = 4 - -/datum/job/cyborg - total_positions = 4 //Along with one able to spawn later in the round. - spawn_positions = 3 //Let's have 3 able to spawn in roundstart - -/datum/job/bartender - total_positions = 2 - spawn_positions = 2 - -/datum/job/chef - total_positions = 2 //IT TAKES A LOT TO MAKE A STEW - spawn_positions = 2 //A PINCH OF SALT AND LAUGHTER, TOO - -/datum/job/engineer - total_positions = 5 - spawn_positions = 5 - -/datum/job/atmos - total_positions = 3 - spawn_positions = 3 - -/datum/job/scientist - alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher", "Circuit Designer") diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index e454c93b18a..b5d42ba2f67 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -389,11 +389,9 @@ var/global/datum/controller/occupations/job_master H << "Your current species, job or whitelist status does not permit you to spawn with [thing]!" continue - if(G.exploitable) - H.amend_exploitable(G.path) - if(G.slot == "implant") var/obj/item/weapon/implant/I = G.spawn_item(H) + I.invisibility = 100 I.implant_loadout(H) continue diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index b259fe1dedc..b73b8b8415c 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -26,11 +26,12 @@ for(dir in list(NORTH, EAST, SOUTH, WEST)) // Loop through every direction sleepernew = locate(/obj/machinery/sleeper, get_step(src, dir)) // Try to find a scanner in that direction if(sleepernew) + // VOREStation Edit Start sleeper = sleepernew sleepernew.console = src - set_dir(get_dir(src, sleepernew)) - return - return + break + // VOREStation Edit End + /obj/machinery/sleep_console/attack_ai(var/mob/user) return attack_hand(user) @@ -45,7 +46,7 @@ to_chat(user, "Sleeper not found!") return - if(sleeper.panel_open) + if(panel_open) to_chat(user, "Close the maintenance panel first.") return @@ -108,6 +109,7 @@ else data["beaker"] = -1 data["filtering"] = S.filtering + data["pump"] = S.pumping var/stasis_level_name = "Error!" for(var/N in S.stasis_choices) @@ -142,6 +144,9 @@ if(href_list["sleeper_filter"]) if(S.filtering != text2num(href_list["sleeper_filter"])) S.toggle_filter() + if(href_list["pump"]) + if(S.pumping != text2num(href_list["pump"])) + S.toggle_pump() if(href_list["chemical"] && href_list["amount"]) if(S.occupant && S.occupant.stat != DEAD) if(href_list["chemical"] in S.available_chemicals) // Your hacks are bad and you should feel bad @@ -166,6 +171,7 @@ var/list/base_chemicals = list("inaprovaline" = "Inaprovaline", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin") var/obj/item/weapon/reagent_containers/glass/beaker = null var/filtering = 0 + var/pumping = 0 var/obj/machinery/sleep_console/console var/stasis_level = 0 //Every 'this' life ticks are applied to the mob (when life_ticks%stasis_level == 1) var/stasis_choices = list("Complete (1%)" = 100, "Deep (10%)" = 10, "Moderate (20%)" = 5, "Light (50%)" = 2, "None (100%)" = 0) @@ -263,6 +269,13 @@ else toggle_filter() + if(pumping > 0) + if(beaker) + if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) + for(var/datum/reagent/x in occupant.ingested.reagent_list) + occupant.ingested.trans_to_obj(beaker, 3) + else + toggle_pump() /obj/machinery/sleeper/update_icon() icon_state = "sleeper_[occupant ? "1" : "0"]" @@ -301,14 +314,12 @@ return if(UNCONSCIOUS) to_chat(usr, "You struggle through the haze to hit the eject button. This will take a couple of minutes...") - sleep(2 MINUTES) - if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already - return - go_out() + if(do_after(usr, 2 MINUTES, src)) + go_out() if(CONSCIOUS) go_out() else - if(usr.stat != 0) + if(usr.stat != CONSCIOUS) return go_out() add_fingerprint(usr) @@ -326,6 +337,9 @@ if(filtering) toggle_filter() + if(pumping) + toggle_pump() + if(stat & (BROKEN|NOPOWER)) ..(severity) return @@ -340,6 +354,12 @@ return filtering = !filtering +/obj/machinery/sleeper/proc/toggle_pump() + if(!occupant || !beaker) + pumping = 0 + return + pumping = !pumping + /obj/machinery/sleeper/proc/go_in(var/mob/M, var/mob/user) if(!M) return @@ -370,7 +390,8 @@ update_icon() /obj/machinery/sleeper/proc/go_out() - if(!occupant) + if(!occupant || occupant.loc != src) + occupant = null // JUST IN CASE return if(occupant.client) occupant.client.eye = occupant.client.mob @@ -387,6 +408,7 @@ update_use_power(1) update_icon() toggle_filter() + toggle_pump() /obj/machinery/sleeper/proc/remove_beaker() if(beaker) diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 8778b4e5f3b..085c070f7d8 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -149,6 +149,8 @@ var/power_losses var/last_power_draw = 0 var/obj/item/weapon/cell/cell + var/use_cell = TRUE + var/removeable_cell = TRUE /obj/machinery/portable_atmospherics/powered/powered() if(use_power) //using area power @@ -158,7 +160,7 @@ return 0 /obj/machinery/portable_atmospherics/powered/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/weapon/cell)) + if(use_cell && istype(I, /obj/item/weapon/cell)) if(cell) to_chat(user, "There is already a power cell installed.") return @@ -173,7 +175,7 @@ power_change() return - if(I.is_screwdriver()) + if(I.is_screwdriver() && removeable_cell) if(!cell) to_chat(user, "There is no power cell installed.") return diff --git a/code/game/machinery/autolathe_vr.dm b/code/game/machinery/autolathe_vr.dm deleted file mode 100644 index 489c97f2f52..00000000000 --- a/code/game/machinery/autolathe_vr.dm +++ /dev/null @@ -1,17 +0,0 @@ -/datum/category_item/autolathe/arms/classic_smg_9mm - name = "SMG magazine (9mm)" - path = /obj/item/ammo_magazine/m9mml - hidden = 1 -/* De-coded? -/datum/category_item/autolathe/arms/classic_smg_9mmr - name = "SMG magazine (9mm rubber)" - path = /obj/item/ammo_magazine/m9mml/rubber - -/datum/category_item/autolathe/arms/classic_smg_9mmp - name = "SMG magazine (9mm practice)" - path = /obj/item/ammo_magazine/m9mml/practice - -/datum/category_item/autolathe/arms/classic_smg_9mmf - name = "SMG magazine (9mm flash)" - path = /obj/item/ammo_magazine/m9mml/flash -*/ \ No newline at end of file diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index f60fcabbfab..19c790b06b7 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -21,6 +21,10 @@ var/loaded_dna //Blood sample for DNA hashing. var/malfunctioning = FALSE // May cause rejection, or the printing of some alien limb instead! + var/complex_organs = FALSE // Can it print more 'complex' organs? + + var/anomalous_organs = FALSE // Can it print anomalous organs? + // These should be subtypes of /obj/item/organ // Costs roughly 20u Phoron (1 sheet) per internal organ, limbs are 60u for limb and extremity var/list/products = list( @@ -29,6 +33,7 @@ "Kidneys" = list(/obj/item/organ/internal/kidneys,20), "Eyes" = list(/obj/item/organ/internal/eyes, 20), "Liver" = list(/obj/item/organ/internal/liver, 20), + "Spleen" = list(/obj/item/organ/internal/spleen, 20), "Arm, Left" = list(/obj/item/organ/external/arm, 40), "Arm, Right" = list(/obj/item/organ/external/arm/right, 40), "Leg, Left" = list(/obj/item/organ/external/leg, 40), @@ -39,6 +44,18 @@ "Hand, Right" = list(/obj/item/organ/external/hand/right, 20) ) + var/list/complex_products = list( + "Brain" = list(/obj/item/organ/internal/brain, 60), + "Larynx" = list(/obj/item/organ/internal/voicebox, 20), + "Head" = list(/obj/item/organ/external/head, 40) + ) + + var/list/anomalous_products = list( + "Lymphatic Complex" = list(/obj/item/organ/internal/immunehub, 120), + "Respiration Nexus" = list(/obj/item/organ/internal/lungs/replicant/mending, 80), + "Adrenal Valve Cluster" = list(/obj/item/organ/internal/heart/replicant/rage, 80) + ) + /obj/machinery/organ_printer/attackby(var/obj/item/O, var/mob/user) if(default_deconstruction_screwdriver(user, O)) updateUsrDialog() @@ -90,6 +107,17 @@ else malfunctioning = initial(malfunctioning) + if(manip_rating >= 3) + complex_organs = TRUE + if(manip_rating >= 4) + anomalous_organs = TRUE + if(manip_rating >= 5) + malfunctioning = TRUE + else + complex_organs = initial(complex_organs) + anomalous_organs = initial(anomalous_organs) + malfunctioning = initial(malfunctioning) + . = ..() /obj/machinery/organ_printer/attack_hand(mob/user) @@ -113,7 +141,17 @@ to_chat(user, "\The [src] can't operate without a reagent reservoir!") /obj/machinery/organ_printer/proc/printing_menu(mob/user) - var/choice = input("What would you like to print?") as null|anything in products + var/list/possible_list = list() + + possible_list |= products + + if(complex_organs) + possible_list |= complex_products + + if(anomalous_organs) + possible_list |= anomalous_products + + var/choice = input("What would you like to print?") as null|anything in possible_list if(!choice || printing || (stat & (BROKEN|NOPOWER))) return diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 4f6b7df94f1..a1c954df007 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -47,24 +47,24 @@ loc = sanitize(loc) if(!loc) - src << "Must supply a location name" + to_chat(src, "Must supply a location name") return if(stored_locations.len >= max_locations) - src << "Cannot store additional locations. Remove one first" + to_chat(src, "Cannot store additional locations. Remove one first") return if(loc in stored_locations) - src << "There is already a stored location by this name" + to_chat(src, "There is already a stored location by this name") return var/L = src.eyeobj.getLoc() if (InvalidPlayerTurf(get_turf(L))) - src << "Unable to store this location" + to_chat(src, "Unable to store this location") return stored_locations[loc] = L - src << "Location '[loc]' stored" + to_chat(src, "Location '[loc]' stored") /mob/living/silicon/ai/proc/sorted_stored_locations() return sortList(stored_locations) @@ -75,7 +75,7 @@ set desc = "Returns to the selected camera location" if (!(loc in stored_locations)) - src << "Location [loc] not found" + to_chat(src, "Location [loc] not found") return var/L = stored_locations[loc] @@ -87,11 +87,11 @@ set desc = "Deletes the selected camera location" if (!(loc in stored_locations)) - src << "Location [loc] not found" + to_chat(src, "Location [loc] not found") return stored_locations.Remove(loc) - src << "Location [loc] removed" + to_chat(src, "Location [loc] removed") // Used to allow the AI is write in mob names/camera name from the CMD line. /datum/trackable @@ -134,7 +134,7 @@ set desc = "Select who you would like to track." if(src.stat == 2) - src << "You can't follow [target_name] with cameras because you are dead!" + to_chat(src, "You can't follow [target_name] with cameras because you are dead!") return if(!target_name) src.cameraFollow = null @@ -147,7 +147,7 @@ if(!cameraFollow) return - src << "Follow camera mode [forced ? "terminated" : "ended"]." + to_chat(src, "Follow camera mode [forced ? "terminated" : "ended"].") cameraFollow.tracking_cancelled() cameraFollow = null @@ -266,14 +266,14 @@ mob/living/proc/tracking_initiated() mob/living/silicon/robot/tracking_initiated() tracking_entities++ if(tracking_entities == 1 && has_zeroth_law()) - src << "Internal camera is currently being accessed." + to_chat(src, "Internal camera is currently being accessed.") mob/living/proc/tracking_cancelled() mob/living/silicon/robot/tracking_initiated() tracking_entities-- if(!tracking_entities && has_zeroth_law()) - src << "Internal camera is no longer being accessed." + to_chat(src, "Internal camera is no longer being accessed.") #undef TRACKING_POSSIBLE diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 8e3cb117f97..52a31d5afe9 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -113,6 +113,8 @@ if(!R.dna.real_name) //to prevent null names R.dna.real_name = "clone ([rand(0,999)])" H.real_name = R.dna.real_name + H.gender = R.gender + H.descriptors = R.body_descriptors //Get the clone body ready H.adjustCloneLoss(150) // New damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 96e6f6b5f9e..5178d77d822 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -335,6 +335,8 @@ R.name = R.dna.real_name R.types = DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE R.languages = subject.languages + R.gender = subject.gender + R.body_descriptors = subject.descriptors if(!brain_skip) //Brains don't have flavor text. R.flavor = subject.flavor_texts.Copy() else diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index c31c8f650b9..480effcf98e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -387,7 +387,7 @@ /obj/machinery/door/airlock/uranium/process() if(world.time > last_event+20) if(prob(50)) - radiation_repository.radiate(src, rad_power) + SSradiation.radiate(src, rad_power) last_event = world.time ..() diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index ea881323c8c..bf201989fea 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -56,7 +56,7 @@ icon_state = icon_state_closed else icon_state = icon_state_open - radiation_repository.resistance_cache.Remove(get_turf(src)) + SSradiation.resistance_cache.Remove(get_turf(src)) return // Has to be in here, comment at the top is older than the emag_act code on doors proper diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 0935dfa7248..7e25bb2df97 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -351,6 +351,12 @@ name = "Cell 6" id = "Cell 6" + +/obj/machinery/door_timer/tactical_pet_storage //Vorestation Addition + name = "Tactical Pet Storage" + id = "tactical_pet_storage" + desc = "Opens and Closes on a timer. This one seals away a tactical boost in morale." + #undef FONT_SIZE #undef FONT_COLOR #undef FONT_STYLE diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index c55a7d8345f..43fb8340ef3 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -382,7 +382,7 @@ icon_state = "door1" else icon_state = "door0" - radiation_repository.resistance_cache.Remove(get_turf(src)) + SSradiation.resistance_cache.Remove(get_turf(src)) return diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index 88bf735f539..41c7a33a19c 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -102,6 +102,11 @@ circuit = /obj/item/weapon/circuitboard/grinder frame_size = 3 +/datum/frame/frame_types/reagent_distillery + name = "Distillery" + frame_class = FRAME_CLASS_MACHINE + frame_size = 4 + /datum/frame/frame_types/display name = "Display" frame_class = FRAME_CLASS_DISPLAY @@ -186,13 +191,13 @@ ////////////////////////////// /obj/structure/frame - anchored = 0 + anchored = FALSE name = "frame" icon = 'icons/obj/stock_parts.dmi' icon_state = "machine_0" var/state = FRAME_PLACED var/obj/item/weapon/circuitboard/circuit = null - var/need_circuit = 1 + var/need_circuit = TRUE var/datum/frame/frame_types/frame_type = new /datum/frame/frame_types/machine var/list/components = null @@ -201,8 +206,8 @@ /obj/structure/frame/computer //used for maps frame_type = new /datum/frame/frame_types/computer - anchored = 1 - density = 1 + anchored = TRUE + density = TRUE /obj/structure/frame/examine(mob/user) ..() @@ -254,14 +259,14 @@ pixel_y = (dir & 3)? (dir == NORTH ? -frame_type.y_offset : frame_type.y_offset) : 0 if(frame_type.circuit) - need_circuit = 0 + need_circuit = FALSE circuit = new frame_type.circuit(src) if(frame_type.name == "Computer") - density = 1 + density = TRUE if(frame_type.frame_class == FRAME_CLASS_MACHINE) - density = 1 + density = TRUE update_icon() @@ -271,7 +276,7 @@ to_chat(user, "You start to wrench the frame into place.") playsound(src.loc, P.usesound, 50, 1) if(do_after(user, 20 * P.toolspeed)) - anchored = 1 + anchored = TRUE if(!need_circuit && circuit) state = FRAME_FASTENED check_components() @@ -284,7 +289,7 @@ playsound(src, P.usesound, 50, 1) if(do_after(user, 20 * P.toolspeed)) to_chat(user, "You unfasten the frame.") - anchored = 0 + anchored = FALSE else if(istype(P, /obj/item/weapon/weldingtool)) if(state == FRAME_PLACED) @@ -581,11 +586,11 @@ set src in oview(1) if(usr.incapacitated()) - return 0 + return FALSE if(anchored) to_chat(usr, "It is fastened to the floor therefore you can't rotate it!") - return 0 + return FALSE src.set_dir(turn(src.dir, 90)) @@ -600,11 +605,11 @@ set src in oview(1) if(usr.incapacitated()) - return 0 + return FALSE if(anchored) to_chat(usr, "It is fastened to the floor therefore you can't rotate it!") - return 0 + return FALSE src.set_dir(turn(src.dir, 270)) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 4251a0e6067..5d2ed9a1743 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -214,7 +214,6 @@ Class Procs: /obj/machinery/CanUseTopic(var/mob/user) if(!interact_offline && (stat & (NOPOWER | BROKEN))) return STATUS_CLOSE - return ..() /obj/machinery/CouldUseTopic(var/mob/user) @@ -458,4 +457,4 @@ Class Procs: return /datum/proc/remove_visual(mob/M) - return \ No newline at end of file + return diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 74cc399beb1..7665fd0e83a 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -4,7 +4,7 @@ /obj/machinery/oxygen_pump name = "emergency oxygen pump" icon = 'icons/obj/walllocker.dmi' - desc = "A wall mounted oxygen pump with a retractable face mask that you can pull over your face in case of emergencies." + desc = "A wall mounted oxygen pump with a retractable mask that you can pull over your face in case of emergencies." icon_state = "oxygen_tank" anchored = TRUE @@ -236,3 +236,76 @@ icon_state_closed = "anesthetic_tank" icon_state_open = "anesthetic_tank_open" mask_type = /obj/item/clothing/mask/breath/anesthetic + +/obj/machinery/oxygen_pump/mobile + name = "portable oxygen pump" + icon = 'icons/obj/atmos.dmi' + desc = "A portable oxygen pump with a retractable mask that you can pull over your face in case of emergencies." + icon_state = "medpump" + icon_state_open = "medpump_open" + icon_state_closed = "medpump" + + anchored = FALSE + density = TRUE + + mask_type = /obj/item/clothing/mask/gas/clear + + var/last_area = null + +/obj/machinery/oxygen_pump/mobile/process() + ..() + + var/turf/T = get_turf(src) + + if(!last_area && T) + last_area = T.loc + + if(last_area != T.loc) + power_change() + last_area = T.loc + +/obj/machinery/oxygen_pump/mobile/anesthetic + name = "portable anesthetic pump" + spawn_type = /obj/item/weapon/tank/anesthetic + icon_state = "medpump_n2o" + icon_state_closed = "medpump_n2o" + icon_state_open = "medpump_n2o_open" + mask_type = /obj/item/clothing/mask/breath/anesthetic + +/obj/machinery/oxygen_pump/mobile/stabilizer + name = "portable patient stabilizer" + desc = "A portable oxygen pump with a retractable mask used for stabilizing patients in the field." + +/obj/machinery/oxygen_pump/mobile/stabilizer/process() + if(breather) + if(!can_apply_to_target(breather)) + if(tank) + tank.forceMove(src) + breather.remove_from_mob(contained) + contained.forceMove(src) + src.visible_message("\The [contained] rapidly retracts back into \the [src]!") + breather = null + use_power = 1 + else if(!breather.internal && tank) + breather.internal = tank + if(breather.internals) + breather.internals.icon_state = "internal0" + + if(breather) // Safety. + if(ishuman(breather)) + var/mob/living/carbon/human/H = breather + + if(H.stat == DEAD) + H.add_modifier(/datum/modifier/bloodpump_corpse, 6 SECONDS) + + else + H.add_modifier(/datum/modifier/bloodpump, 6 SECONDS) + + var/turf/T = get_turf(src) + + if(!last_area && T) + last_area = T.loc + + if(last_area != T.loc) + power_change() + last_area = T.loc diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index ab772202816..9c29365ae42 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -74,6 +74,7 @@ var/check_synth = FALSE //if active, will shoot at anything not an AI or cyborg var/check_all = FALSE //If active, will fire on anything, including synthetics. var/ailock = FALSE // AI cannot use this + var/check_down = FALSE //If active, will shoot to kill when lethals are also on var/faction = null //if set, will not fire at people in the same faction for any reason. var/attacked = FALSE //if set to TRUE, the turret gets pissed off and shoots at people nearby (unless they have sec access!) @@ -103,6 +104,7 @@ check_weapons = TRUE check_anomalies = TRUE check_all = FALSE + check_down = TRUE /obj/machinery/porta_turret/can_catalogue(mob/user) // Dead turrets can't be scanned. if(stat & BROKEN) @@ -224,6 +226,7 @@ check_records = FALSE check_anomalies = FALSE check_all = FALSE + check_down = FALSE /obj/machinery/porta_turret/lasertag/red turret_type = "red" @@ -264,8 +267,8 @@ data["access"] = !isLocked(user) data["locked"] = locked data["enabled"] = enabled - data["is_lethal"] = 1 - data["lethal"] = lethal + //data["is_lethal"] = 1 // VOREStation Removal of "Lethal" setting - it does nothing. Rykka did dis. + //data["lethal"] = lethal // VOREStation Removal of "Lethal" setting - it does nothing. Rykka did dis. if(data["access"]) var/settings[0] @@ -288,8 +291,8 @@ var/value = text2num(href_list["value"]) if(href_list["command"] == "enable") enabled = value - else if(href_list["command"] == "lethal") - lethal = value + //else if(href_list["command"] == "lethal") // VOREStation Removal of "Lethal" setting - it does nothing. Rykka did dis. + //lethal = value // VOREStation Removal of "Lethal" setting - it does nothing. Rykka did dis. else if(href_list["command"] == "check_synth") check_synth = value else if(href_list["command"] == "check_weapons") @@ -404,7 +407,7 @@ return 1 if(locked && !issilicon(user)) - to_chat(user, "Access denied.") + to_chat(user, "Controls locked.") return 1 return 0 @@ -438,6 +441,7 @@ settings[++settings.len] = list("category" = "Check Access Authorization", "setting" = "check_access", "value" = check_access) settings[++settings.len] = list("category" = "Check misc. Lifeforms", "setting" = "check_anomalies", "value" = check_anomalies) settings[++settings.len] = list("category" = "Neutralize All Entities", "setting" = "check_all", "value" = check_all) + settings[++settings.len] = list("category" = "Neutralize Downed Entities", "setting" = "check_down", "value" = check_down) data["settings"] = settings ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -489,6 +493,8 @@ check_anomalies = value else if(href_list["command"] == "check_all") check_all = value + else if(href_list["command"] == "check_down") + check_down = value return 1 @@ -732,7 +738,7 @@ if(!emagged && issilicon(L) && check_all == FALSE) // Don't target silica, unless told to neutralize everything. return TURRET_NOT_TARGET - if(L.stat && !emagged) //if the perp is dead/dying, no need to bother really + if(L.stat == DEAD && !emagged) //if the perp is dead, no need to bother really return TURRET_NOT_TARGET //move onto next potential victim! if(get_dist(src, L) > 7) //if it's too far away, why bother? @@ -749,7 +755,7 @@ if(check_synth || check_all) //If it's set to attack all non-silicons or everything, target them! if(L.lying) - return lethal ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET + return check_down ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET return TURRET_PRIORITY_TARGET if(iscuffed(L)) // If the target is handcuffed, leave it alone @@ -766,7 +772,7 @@ return TURRET_NOT_TARGET //if threat level < 4, keep going if(L.lying) //if the perp is lying down, it's still a target but a less-important target - return lethal ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET + return check_down ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET return TURRET_PRIORITY_TARGET //if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee @@ -1132,4 +1138,4 @@ #undef TURRET_PRIORITY_TARGET #undef TURRET_SECONDARY_TARGET -#undef TURRET_NOT_TARGET \ No newline at end of file +#undef TURRET_NOT_TARGET diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 691492a88fd..e9997425078 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -10,7 +10,7 @@ active_power_usage = 40000 //40 kW var/efficiency = 40000 //will provide the modified power rate when upgraded var/obj/item/charging = null - var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash, /obj/item/ammo_casing/nsfw_batt) //VOREStation Add - NSFW Batteries + var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash, /obj/item/ammo_casing/microbattery) //VOREStation Add - NSFW Batteries var/icon_state_charged = "recharger2" var/icon_state_charging = "recharger1" var/icon_state_idle = "recharger0" //also when unpowered @@ -72,7 +72,7 @@ if(EW.use_external_power) to_chat(user, "\The [EW] has no recharge port.") return - else if(!G.get_cell() && !istype(G, /obj/item/ammo_casing/nsfw_batt)) //VOREStation Edit: NSFW charging + else if(!G.get_cell() && !istype(G, /obj/item/ammo_casing/microbattery)) //VOREStation Edit: NSFW charging to_chat(user, "\The [G] does not have a battery installed.") return @@ -157,8 +157,8 @@ update_use_power(1) //VOREStation Add - NSFW Batteries - else if(istype(charging, /obj/item/ammo_casing/nsfw_batt)) - var/obj/item/ammo_casing/nsfw_batt/batt = charging + else if(istype(charging, /obj/item/ammo_casing/microbattery)) + var/obj/item/ammo_casing/microbattery/batt = charging if(batt.shots_left >= initial(batt.shots_left)) icon_state = icon_state_charged update_use_power(1) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index d94ac049b9a..a8c9492e236 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -648,7 +648,7 @@ model_text = "Exploration" departments = list("Exploration","Old Exploration") -/obj/machinery/suit_cycler/exploreration/Initialize() +/obj/machinery/suit_cycler/exploration/Initialize() species -= SPECIES_TESHARI return ..() @@ -931,9 +931,10 @@ /obj/machinery/suit_cycler/proc/finished_job() var/turf/T = get_turf(src) - T.visible_message("\icon[src]The [src] pings loudly.") + T.visible_message("\icon[src]The [src] beeps several times.") icon_state = initial(icon_state) active = 0 + playsound(src, 'sound/machines/boobeebeep.ogg', 50) updateUsrDialog() /obj/machinery/suit_cycler/proc/repair_suit() diff --git a/code/game/machinery/syndicatebeacon_vr.dm b/code/game/machinery/syndicatebeacon_vr.dm new file mode 100644 index 00000000000..ef6b3da0bbf --- /dev/null +++ b/code/game/machinery/syndicatebeacon_vr.dm @@ -0,0 +1,40 @@ +// Virgo modified syndie beacon, does not give objectives + +/obj/machinery/syndicate_beacon/virgo/attack_hand(var/mob/user as mob) + usr.set_machine(src) + var/dat = "Scanning [pick("retina pattern", "voice print", "fingerprints", "dna sequence")]...
Identity confirmed,
" + if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) + if(is_special_character(user)) + dat += "Operative record found. Greetings, Agent [user.name].
" + else if(charges < 1) + dat += "Connection severed.
" + else + var/honorific = "Mr." + if(user.gender == FEMALE) + honorific = "Ms." + dat += "Identity not found in operative database. What can the Black Market do for you today, [honorific] [user.name]?
" + if(!selfdestructing) + dat += "

\"[pick("Send me some supplies!", "Transfer supplies.")]\"
" + dat += temptext + user << browse(dat, "window=syndbeacon") + onclose(user, "syndbeacon") + +/obj/machinery/syndicate_beacon/virgo/Topic(href, href_list) + if(href_list["betraitor"]) + if(charges < 1) + updateUsrDialog() + return + var/mob/M = locate(href_list["traitormob"]) + if(M.mind.special_role || jobban_isbanned(M, "Syndicate")) + temptext = "We have no need for you at this time. Have a pleasant day.
" + updateUsrDialog() + return + charges -= 1 + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/N = M + to_chat(N, "Access granted, here are the supplies!") + traitors.equip(N) + message_admins("[N]/([N.ckey]) has recieved an uplink and telecrystals from the syndicate beacon.") + + updateUsrDialog() + return diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index cd65fb9f910..8f6e8e589ea 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -22,7 +22,17 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept machinetype = 5 produces_heat = 0 delay = 7 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/broadcaster" + circuit = /obj/item/weapon/circuitboard/telecomms/broadcaster + +/obj/machinery/telecomms/processor/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/crystal(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/micro_laser/high(src) + component_parts += new /obj/item/stack/cable_coil(src, 1) /obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) // Don't broadcast rejected signals diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 331f5644d92..d41104df251 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -12,7 +12,6 @@ /obj/machinery/telecomms var/temp = "" // output message - var/construct_op = 0 /obj/machinery/telecomms/attackby(obj/item/P as obj, mob/user as mob) @@ -21,7 +20,6 @@ if(istype(P, /obj/item/device/multitool)) attack_hand(user) - // REPAIRING: Use Nanopaste to repair 10-20 integrity points. if(istype(P, /obj/item/stack/nanopaste)) var/obj/item/stack/nanopaste/T = P @@ -34,75 +32,10 @@ return - switch(construct_op) - if(0) - if(P.is_screwdriver()) - to_chat(user, "You unfasten the bolts.") - playsound(src.loc, P.usesound, 50, 1) - construct_op ++ - if(1) - if(P.is_screwdriver()) - to_chat(user, "You fasten the bolts.") - playsound(src.loc, P.usesound, 50, 1) - construct_op -- - if(P.is_wrench()) - to_chat(user, "You dislodge the external plating.") - playsound(src.loc, P.usesound, 75, 1) - construct_op ++ - if(2) - if(P.is_wrench()) - to_chat(user, "You secure the external plating.") - playsound(src.loc, P.usesound, 75, 1) - construct_op -- - if(P.is_wirecutter()) - playsound(src.loc, P.usesound, 50, 1) - to_chat(user, "You remove the cables.") - construct_op ++ - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc ) - A.amount = 5 - stat |= BROKEN // the machine's been borked! - if(3) - if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/A = P - if (A.use(5)) - to_chat(user, "You insert the cables.") - construct_op-- - stat &= ~BROKEN // the machine's not borked anymore! - else - to_chat(user, "You need five coils of wire for this.") - if(P.is_crowbar()) - to_chat(user, "You begin prying out the circuit board other components...") - playsound(src.loc, P.usesound, 50, 1) - if(do_after(user,60 * P.toolspeed)) - to_chat(user, "You finish prying out the components.") - - // Drop all the component stuff - if(contents.len > 0) - for(var/obj/x in src) - x.loc = user.loc - else - - // If the machine wasn't made during runtime, probably doesn't have components: - // manually find the components and drop them! - var/newpath = text2path(circuitboard) - var/obj/item/weapon/circuitboard/C = new newpath - for(var/I in C.req_components) - for(var/i = 1, i <= C.req_components[I], i++) - newpath = text2path(I) - var/obj/item/s = new newpath - s.loc = user.loc - if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/A = P - A.amount = 1 - - // Drop a circuit board too - C.loc = user.loc - - // Create a frame and delete the current machine - var/obj/structure/frame/F = new - F.loc = src.loc - qdel(src) - + if(default_deconstruction_screwdriver(user, P)) + return + if(default_deconstruction_crowbar(user, P)) + return /obj/machinery/telecomms/attack_ai(var/mob/user as mob) attack_hand(user) diff --git a/code/game/machinery/telecomms/presets_vr.dm b/code/game/machinery/telecomms/presets_vr.dm index 1bd6b92460d..01a07a5f5ed 100644 --- a/code/game/machinery/telecomms/presets_vr.dm +++ b/code/game/machinery/telecomms/presets_vr.dm @@ -3,3 +3,6 @@ hide = 1 produces_heat = 0 autolinkers = list("hb_relay") + +/obj/machinery/telecomms/relay/proc/reset_z() + listening_level = z diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 50e2f504c9f..d6cefb68283 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -32,7 +32,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() var/produces_heat = 1 //whether the machine will produce heat when on. var/delay = 10 // how many process() ticks to delay per heat var/long_range_link = 0 // Can you link it across Z levels or on the otherside of the map? (Relay & Hub) - var/circuitboard = null // string pointing to a circuitboard type var/hide = 0 // Is it a hidden machine? var/listening_level = 0 // 0 = auto set in New() - this is the z level that the machine is listening to. @@ -256,7 +255,17 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() idle_power_usage = 600 machinetype = 1 produces_heat = 0 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/receiver" + circuit = /obj/item/weapon/circuitboard/telecomms/receiver + +/obj/machinery/telecomms/receiver/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/ansible(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) + RefreshParts() /obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal) @@ -312,7 +321,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() use_power = 1 idle_power_usage = 1600 machinetype = 7 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/hub" + circuit = /obj/item/weapon/circuitboard/telecomms/hub long_range_link = 1 netspeed = 40 var/list/telecomms_map @@ -320,6 +329,13 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() /obj/machinery/telecomms/hub/Initialize() . = ..() LAZYINITLIST(telecomms_map) + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/stack/cable_coil(src, 2) + RefreshParts() /obj/machinery/telecomms/hub/process() . = ..() @@ -365,12 +381,22 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() idle_power_usage = 600 machinetype = 8 produces_heat = 0 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/relay" + circuit = /obj/item/weapon/circuitboard/telecomms/relay netspeed = 5 long_range_link = 1 var/broadcasting = 1 var/receiving = 1 +/obj/machinery/telecomms/relay/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/stack/cable_coil(src, 2) + RefreshParts() + /obj/machinery/telecomms/relay/forceMove(var/newloc) . = ..(newloc) listening_level = z @@ -420,10 +446,19 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() use_power = 1 idle_power_usage = 1000 machinetype = 2 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/bus" + circuit = /obj/item/weapon/circuitboard/telecomms/bus netspeed = 40 var/change_frequency = 0 +/obj/machinery/telecomms/bus/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/stack/cable_coil(src, 1) + RefreshParts() + /obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) if(is_freq_listening(signal)) @@ -473,23 +508,37 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() idle_power_usage = 600 machinetype = 3 delay = 5 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/processor" + circuit = /obj/item/weapon/circuitboard/telecomms/processor var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals - receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) +/obj/machinery/telecomms/processor/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/amplifier(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/analyzer(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/stack/cable_coil(src, 2) + RefreshParts() - if(is_freq_listening(signal)) +/obj/machinery/telecomms/processor/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) - if(process_mode) - signal.data["compression"] = 0 // uncompress subspace signal - else - signal.data["compression"] = 100 // even more compressed signal + if(is_freq_listening(signal)) - if(istype(machine_from, /obj/machinery/telecomms/bus)) - relay_direct_information(signal, machine_from) // send the signal back to the machine - else // no bus detected - send the signal to servers instead - signal.data["slow"] += rand(5, 10) // slow the signal down - relay_information(signal, "/obj/machinery/telecomms/server") + if(process_mode) + signal.data["compression"] = 0 // uncompress subspace signal + else + signal.data["compression"] = 100 // even more compressed signal + + if(istype(machine_from, /obj/machinery/telecomms/bus)) + relay_direct_information(signal, machine_from) // send the signal back to the machine + else // no bus detected - send the signal to servers instead + signal.data["slow"] += rand(5, 10) // slow the signal down + relay_information(signal, "/obj/machinery/telecomms/server") /* @@ -510,7 +559,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() use_power = 1 idle_power_usage = 300 machinetype = 4 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/server" + circuit = /obj/item/weapon/circuitboard/telecomms/server var/list/log_entries = list() var/list/stored_names = list() var/list/TrafficActions = list() @@ -534,6 +583,15 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() Compiler.Holder = src server_radio = new() +/obj/machinery/telecomms/server/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/stack/cable_coil(src, 1) + RefreshParts() + /obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) if(signal.data["message"]) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 663230b11ff..48f9e3c4f23 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -772,6 +772,7 @@ name = "Robust Softdrinks" desc = "A softdrink vendor provided by Robust Industries, LLC." icon_state = "Cola_Machine" //VOREStation Edit + icon_vend = "Cola_Machine-purchase" //VOREStation Edit product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!" product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space." products = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 10, diff --git a/code/game/machinery/vending_vr.dm b/code/game/machinery/vending_vr.dm index 19a24e669ee..0bf7b947146 100644 --- a/code/game/machinery/vending_vr.dm +++ b/code/game/machinery/vending_vr.dm @@ -131,3 +131,18 @@ products += list(/obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 8) prices += list(/obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 10) ..() + +/obj/machinery/vending/blood + name = "Blood-Onator" + desc = "Freezer-vendor for storage and quick dispensing of blood packs" + product_ads = "The true life juice!;Vampire's choice!;Home-grown blood only!;Donate today, be saved tomorrow!;Approved by Zeng-Hu Pharmaceuticals Incorporated!; Curse you, Vey-Med artificial blood!" + icon_state = "blood" + idle_power_usage = 211 + req_access = list(access_medical) + products = list(/obj/item/weapon/reagent_containers/blood/prelabeled/APlus = 3,/obj/item/weapon/reagent_containers/blood/prelabeled/AMinus = 3, + /obj/item/weapon/reagent_containers/blood/prelabeled/BPlus = 3,/obj/item/weapon/reagent_containers/blood/prelabeled/BMinus = 3, + /obj/item/weapon/reagent_containers/blood/prelabeled/OPlus = 2,/obj/item/weapon/reagent_containers/blood/prelabeled/OMinus = 5, + /obj/item/weapon/reagent_containers/blood/empty = 5) + contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/stoxin = 2) + req_log_access = access_cmo + has_logs = 1 \ No newline at end of file diff --git a/code/game/magic/archived_book.dm b/code/game/magic/archived_book.dm index 2fc9412fcd9..b2af5f3f73c 100644 --- a/code/game/magic/archived_book.dm +++ b/code/game/magic/archived_book.dm @@ -37,7 +37,7 @@ datum/book_manager/proc/freeid() set desc = "Permamently deletes a book from the database." set category = "Admin" if(!src.holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return var/isbn = input("ISBN number?", "Delete Book") as num | null diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm index f94c8bc78ee..a33cd963e2e 100644 --- a/code/game/mecha/combat/gorilla.dm +++ b/code/game/mecha/combat/gorilla.dm @@ -87,7 +87,7 @@ max_universal_equip = 5 max_special_equip = 2 -/obj/mecha/combat/gorilla/New() +/obj/mecha/combat/gorilla/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) // This thing basically cannot function without an external power supply. ME.attach(src) diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 19564acba9e..d70c8f9e855 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -45,7 +45,7 @@ max_universal_equip = 1 max_special_equip = 2 -/obj/mecha/combat/gygax/dark/New() +/obj/mecha/combat/gygax/dark/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot ME.attach(src) diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index b8aed16ceff..9521147089b 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -55,7 +55,7 @@ wreckage = /obj/effect/decal/mecha_wreckage/mauler mech_faction = MECH_FACTION_SYNDI -/obj/mecha/combat/marauder/New() +/obj/mecha/combat/marauder/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse ME.attach(src) @@ -69,7 +69,7 @@ src.smoke_system.attach(src) return -/obj/mecha/combat/marauder/seraph/New() +/obj/mecha/combat/marauder/seraph/Initialize() ..()//Let it equip whatever is needed. var/obj/item/mecha_parts/mecha_equipment/ME if(equipment.len)//Now to remove it and equip anew. diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index b54368a75e8..8f72de5f517 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -27,7 +27,7 @@ max_universal_equip = 3 max_special_equip = 4 -/obj/mecha/combat/phazon/equipped/New() +/obj/mecha/combat/phazon/equipped/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/rcd ME.attach(src) @@ -133,7 +133,7 @@ ..() if(phasing) phasing = FALSE - radiation_repository.radiate(get_turf(src), 30) + SSradiation.radiate(get_turf(src), 30) log_append_to_last("WARNING: BLUESPACE DRIVE INSTABILITY DETECTED. DISABLING DRIVE.",1) visible_message("The [src.name] appears to flicker, before its silhouette stabilizes!") return diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 27ae65ea67f..48a46fae56c 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -273,3 +273,6 @@ if(chassis) chassis.log_message("[src]: [message]") return + +/obj/item/mecha_parts/mecha_equipment/proc/MoveAction() //Allows mech equipment to do an action upon the mech moving + return diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index d275c2f4a6d..9f1e5227332 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -10,7 +10,7 @@ var/mob/living/carbon/human/occupant = null var/datum/global_iterator/pr_mech_sleeper var/inject_amount = 5 - required_type = /obj/mecha/medical + required_type = list(/obj/mecha/medical) salvageable = 0 allow_duplicate = TRUE @@ -247,144 +247,6 @@ return -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer - name = "Cable Layer" - icon_state = "mecha_wire" - var/datum/event/event - var/turf/old_turf - var/obj/structure/cable/last_piece - var/obj/item/stack/cable_coil/cable - var/max_cable = 1000 - required_type = /obj/mecha/working - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/New() - cable = new(src) - cable.amount = 0 - ..() - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/attach() - ..() - event = chassis.events.addEvent("onMove",src,"layCable") - return - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/detach() - chassis.events.clearEvent("onMove",event) - return ..() - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/destroy() - chassis.events.clearEvent("onMove",event) - return ..() - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/action(var/obj/item/stack/cable_coil/target) - if(!action_checks(target)) - return - var/result = load_cable(target) - var/message - if(isnull(result)) - message = "Unable to load [target] - no cable found." - else if(!result) - message = "Reel is full." - else - message = "[result] meters of cable successfully loaded." - send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) - occupant_message(message) - return - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/Topic(href,href_list) - ..() - if(href_list["toggle"]) - set_ready_state(!equip_ready) - occupant_message("[src] [equip_ready?"dea":"a"]ctivated.") - log_message("[equip_ready?"Dea":"A"]ctivated.") - return - if(href_list["cut"]) - if(cable && cable.amount) - var/m = round(input(chassis.occupant,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1) - m = min(m, cable.amount) - if(m) - use_cable(m) - var/obj/item/stack/cable_coil/CC = new (get_turf(chassis)) - CC.amount = m - else - occupant_message("There's no more cable on the reel.") - return - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/get_equip_info() - var/output = ..() - if(output) - return "[output] \[Cable: [cable ? cable.amount : 0] m\][(cable && cable.amount) ? "- [!equip_ready?"Dea":"A"]ctivate|Cut" : null]" - return - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/load_cable(var/obj/item/stack/cable_coil/CC) - if(istype(CC) && CC.amount) - var/cur_amount = cable? cable.amount : 0 - var/to_load = max(max_cable - cur_amount,0) - if(to_load) - to_load = min(CC.amount, to_load) - if(!cable) - cable = new(src) - cable.amount = 0 - cable.amount += to_load - CC.use(to_load) - return to_load - else - return 0 - return - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/use_cable(amount) - if(!cable || cable.amount<1) - set_ready_state(1) - occupant_message("Cable depleted, [src] deactivated.") - log_message("Cable depleted, [src] deactivated.") - return - if(cable.amount < amount) - occupant_message("No enough cable to finish the task.") - return - cable.use(amount) - update_equip_info() - return 1 - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/reset() - last_piece = null - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/dismantleFloor(var/turf/new_turf) - if(istype(new_turf, /turf/simulated/floor)) - var/turf/simulated/floor/T = new_turf - if(!T.is_plating()) - T.make_plating(!(T.broken || T.burnt)) - return new_turf.is_plating() - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/layCable(var/turf/new_turf) - if(equip_ready || !istype(new_turf) || !dismantleFloor(new_turf)) - return reset() - var/fdirn = turn(chassis.dir,180) - for(var/obj/structure/cable/LC in new_turf) // check to make sure there's not a cable there already - if(LC.d1 == fdirn || LC.d2 == fdirn) - return reset() - if(!use_cable(1)) - return reset() - var/obj/structure/cable/NC = new(new_turf) - NC.cableColor("red") - NC.d1 = 0 - NC.d2 = fdirn - NC.update_icon() - - var/datum/powernet/PN - if(last_piece && last_piece.d2 != chassis.dir) - last_piece.d1 = min(last_piece.d2, chassis.dir) - last_piece.d2 = max(last_piece.d2, chassis.dir) - last_piece.update_icon() - PN = last_piece.powernet - - if(!PN) - PN = new() - PN.add_cable(NC) - NC.mergeConnectedNetworks(NC.d2) - - //NC.mergeConnectedNetworksOnTurf() - last_piece = NC - return 1 - /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun name = "syringe gun" desc = "Exosuit-mounted chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur. (Can be attached to: Medical Exosuits)" @@ -402,7 +264,7 @@ range = MELEE|RANGED equip_cooldown = 10 origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3) - required_type = /obj/mecha/medical + required_type = list(/obj/mecha/medical) //This is a list of datums so as to allow id changes, and force compile errors if removed. var/static/list/allowed_reagents = list( @@ -712,3 +574,232 @@ S.reagents.add_reagent(reagent,amount) S.chassis.use_power(energy_drain) return 1 + +/obj/item/mecha_parts/mecha_equipment/crisis_drone + name = "crisis dronebay" + desc = "A small shoulder-mounted dronebay containing a rapid response drone capable of moderately stabilizing a patient near the exosuit." + icon_state = "mecha_dronebay" + origin_tech = list(TECH_PHORON = 3, TECH_MAGNET = 6, TECH_BIO = 5, TECH_DATA = 4) + range = MELEE|RANGED + equip_cooldown = 3 SECONDS + required_type = list(/obj/mecha/medical) + + var/droid_state = "med_droid" + + var/beam_state = "medbeam" + + var/enabled = FALSE + + var/icon/drone_overlay + + var/max_distance = 3 + + var/damcap = 60 + var/heal_dead = FALSE // Does this device heal the dead? + + var/brute_heal = 0.5 // Amount of bruteloss healed. + var/burn_heal = 0.5 // Amount of fireloss healed. + var/tox_heal = 0.5 // Amount of toxloss healed. + var/oxy_heal = 1 // Amount of oxyloss healed. + var/rad_heal = 0 // Amount of radiation healed. + var/clone_heal = 0 // Amount of cloneloss healed. + var/hal_heal = 0.2 // Amount of halloss healed. + var/bone_heal = 0 // Percent chance it will heal a broken bone. this does not mean 'make it not instantly re-break'. + + var/mob/living/Target = null + var/datum/beam/MyBeam = null + + equip_type = EQUIP_HULL + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/Initialize() + ..() + drone_overlay = new(src.icon, icon_state = droid_state) + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/Destroy() + STOP_PROCESSING(SSobj, src) + ..() + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/attach(obj/mecha/M as obj) + . = ..(M) + if(chassis) + START_PROCESSING(SSobj, src) + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/detach(atom/moveto=null) + shut_down() + . = ..(moveto) + STOP_PROCESSING(SSobj, src) + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/critfail() + . = ..() + STOP_PROCESSING(SSobj, src) + shut_down() + if(chassis && chassis.occupant) + to_chat(chassis.occupant, "\The [chassis] shudders as something jams!") + log_message("[src.name] has malfunctioned. Maintenance required.") + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/process() // Will continually try to find the nearest person above the threshold that is a valid target, and try to heal them. + if(chassis && enabled && chassis.has_charge(energy_drain) && (chassis.occupant || enable_special)) + var/mob/living/Targ = Target + var/TargDamage = 0 + + if(!valid_target(Target)) + Target = null + + if(Target) + TargDamage = (Targ.getOxyLoss() + Targ.getFireLoss() + Targ.getBruteLoss() + Targ.getToxLoss()) + + for(var/mob/living/Potential in viewers(max_distance, chassis)) + if(!valid_target(Potential)) + continue + + var/tallydamage = 0 + if(oxy_heal) + tallydamage += Potential.getOxyLoss() + if(burn_heal) + tallydamage += Potential.getFireLoss() + if(brute_heal) + tallydamage += Potential.getBruteLoss() + if(tox_heal) + tallydamage += Potential.getToxLoss() + if(hal_heal) + tallydamage += Potential.getHalLoss() + if(clone_heal) + tallydamage += Potential.getCloneLoss() + if(rad_heal) + tallydamage += Potential.radiation / 2 + + if(tallydamage > TargDamage) + Target = Potential + + if(MyBeam && !valid_target(MyBeam.target)) + QDEL_NULL(MyBeam) + + if(Target) + if(MyBeam && MyBeam.target != Target) + QDEL_NULL(MyBeam) + + if(valid_target(Target)) + if(!MyBeam) + MyBeam = chassis.Beam(Target,icon='icons/effects/beam.dmi',icon_state=beam_state,time=3 SECONDS,maxdistance=max_distance,beam_type = /obj/effect/ebeam,beam_sleep_time=2) + heal_target(Target) + + else + shut_down() + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/valid_target(var/mob/living/L) + . = TRUE + + if(!L || !istype(L)) + return FALSE + + if(get_dist(L, src) > max_distance) + return FALSE + + if(!(L in viewers(max_distance, chassis))) + return FALSE + + if(!unique_patient_checks(L)) + return FALSE + + if(L.stat == DEAD && !heal_dead) + return FALSE + + var/tallydamage = 0 + if(oxy_heal) + tallydamage += L.getOxyLoss() + if(burn_heal) + tallydamage += L.getFireLoss() + if(brute_heal) + tallydamage += L.getBruteLoss() + if(tox_heal) + tallydamage += L.getToxLoss() + if(hal_heal) + tallydamage += L.getHalLoss() + if(clone_heal) + tallydamage += L.getCloneLoss() + if(rad_heal) + tallydamage += L.radiation / 2 + + if(tallydamage < damcap) + return FALSE + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/shut_down() + if(enabled) + chassis.visible_message("\The [chassis]'s [src] buzzes as its drone returns to port.") + toggle_drone() + if(!isnull(Target)) + Target = null + if(MyBeam) + QDEL_NULL(MyBeam) + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/unique_patient_checks(var/mob/living/L) // Anything special for subtypes. Does it only work on Robots? Fleshies? A species? + . = TRUE + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/heal_target(var/mob/living/L) // We've done all our special checks, just get to fixing damage. + chassis.use_power(energy_drain) + if(istype(L)) + L.adjustBruteLoss(brute_heal * -1) + L.adjustFireLoss(burn_heal * -1) + L.adjustToxLoss(tox_heal * -1) + L.adjustOxyLoss(oxy_heal * -1) + L.adjustCloneLoss(clone_heal * -1) + L.adjustHalLoss(hal_heal * -1) + L.radiation = max(0, L.radiation - rad_heal) + + if(ishuman(L) && bone_heal) + var/mob/living/carbon/human/H = L + + if(H.bad_external_organs.len) + for(var/obj/item/organ/external/E in H.bad_external_organs) + if(prob(bone_heal)) + E.status &= ~ORGAN_BROKEN + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/toggle_drone() + ..() + if(chassis) + enabled = !enabled + if(enabled) + set_ready_state(0) + log_message("Activated.") + chassis.overlays += drone_overlay + else + set_ready_state(1) + log_message("Deactivated.") + chassis.overlays -= drone_overlay + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/Topic(href, href_list) + ..() + if(href_list["toggle_drone"]) + toggle_drone() + return + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/get_equip_info() + if(!chassis) return + return "* [src.name] - [enabled?"Dea":"A"]ctivate" + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/rad + name = "hazmat dronebay" + desc = "A small shoulder-mounted dronebay containing a rapid response drone capable of purging a patient near the exosuit of radiation damage." + icon_state = "mecha_dronebay_rad" + + droid_state = "rad_drone" + beam_state = "g_beam" + + tox_heal = 0.5 + rad_heal = 5 + clone_heal = 0.2 + hal_heal = 0.2 + +/obj/item/mecha_parts/mecha_equipment/tool/powertool/medanalyzer + name = "mounted humanoid scanner" + desc = "An exosuit-mounted scanning device." + icon_state = "mecha_analyzer_health" + origin_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 5, TECH_BIO = 5) + equip_cooldown = 5 SECONDS + energy_drain = 100 + range = MELEE + equip_type = EQUIP_UTILITY + ready_sound = 'sound/weapons/flash.ogg' + required_type = list(/obj/mecha/medical) + + tooltype = /obj/item/device/healthanalyzer/advanced diff --git a/code/game/mecha/equipment/tools/medical_tools_vr.dm b/code/game/mecha/equipment/tools/medical_tools_vr.dm new file mode 100644 index 00000000000..19efa0a5fd2 --- /dev/null +++ b/code/game/mecha/equipment/tools/medical_tools_vr.dm @@ -0,0 +1,10 @@ +/obj/item/mecha_parts/mecha_equipment/weapon/energy/medigun + equip_cooldown = 6 + name = "\improper BL-3 \"Phoenix\" directed restoration system" + desc = "The BL-3 'Phoenix' is a portable medical system used to treat external injuries from afar." + icon_state = "mecha_medbeam" + energy_drain = 1000 + projectile = /obj/item/projectile/beam/medigun + fire_sound = 'sound/weapons/eluger.ogg' + equip_type = EQUIP_UTILITY + origin_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_BIO = 6, TECH_POWER = 6) \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index ee424671216..73f7356ade6 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -1201,7 +1201,7 @@ /datum/global_iterator/mecha_generator/nuclear/process(var/obj/item/mecha_parts/mecha_equipment/generator/nuclear/EG) if(..()) - radiation_repository.radiate(EG, (EG.rad_per_cycle * 3)) + SSradiation.radiate(EG, (EG.rad_per_cycle * 3)) return 1 @@ -1537,3 +1537,132 @@ chassis.step_in = initial(chassis.step_in) ..() return + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer + name = "Cable Layer" + icon_state = "mecha_wire" + var/turf/old_turf + var/obj/structure/cable/last_piece + var/obj/item/stack/cable_coil/cable + var/max_cable = 1000 + required_type = list(/obj/mecha/working) + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/New() + cable = new(src) + cable.amount = 0 + ..() + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/MoveAction() + layCable() + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/action(var/obj/item/stack/cable_coil/target) + if(!action_checks(target)) + return + var/result = load_cable(target) + var/message + if(isnull(result)) + message = "Unable to load [target] - no cable found." + else if(!result) + message = "Reel is full." + else + message = "[result] meters of cable successfully loaded." + send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) + occupant_message(message) + return + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/Topic(href,href_list) + ..() + if(href_list["toggle"]) + set_ready_state(!equip_ready) + occupant_message("[src] [equip_ready?"dea":"a"]ctivated.") + log_message("[equip_ready?"Dea":"A"]ctivated.") + return + if(href_list["cut"]) + if(cable && cable.amount) + var/m = round(input(chassis.occupant,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1) + m = min(m, cable.amount) + if(m) + use_cable(m) + var/obj/item/stack/cable_coil/CC = new (get_turf(chassis)) + CC.amount = m + else + occupant_message("There's no more cable on the reel.") + return + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/get_equip_info() + var/output = ..() + if(output) + return "[output] \[Cable: [cable ? cable.amount : 0] m\][(cable && cable.amount) ? "- [!equip_ready?"Dea":"A"]ctivate|Cut" : null]" + return + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/load_cable(var/obj/item/stack/cable_coil/CC) + if(istype(CC) && CC.amount) + var/cur_amount = cable? cable.amount : 0 + var/to_load = max(max_cable - cur_amount,0) + if(to_load) + to_load = min(CC.amount, to_load) + if(!cable) + cable = new(src) + cable.amount = 0 + cable.amount += to_load + CC.use(to_load) + return to_load + else + return 0 + return + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/use_cable(amount) + if(!cable || cable.amount<1) + set_ready_state(1) + occupant_message("Cable depleted, [src] deactivated.") + log_message("Cable depleted, [src] deactivated.") + return + if(cable.amount < amount) + occupant_message("No enough cable to finish the task.") + return + cable.use(amount) + update_equip_info() + return 1 + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/reset() + last_piece = null + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/dismantleFloor(var/turf/new_turf) + new_turf = get_turf(chassis) + if(istype(new_turf, /turf/simulated/floor)) + var/turf/simulated/floor/T = new_turf + if(!T.is_plating()) + T.make_plating(!(T.broken || T.burnt)) + return new_turf.is_plating() + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/layCable(var/turf/new_turf) + new_turf = get_turf(chassis) + if(equip_ready || !istype(new_turf, /turf/simulated/floor) || !dismantleFloor(new_turf)) + return reset() + var/fdirn = turn(chassis.dir,180) + for(var/obj/structure/cable/LC in new_turf) // check to make sure there's not a cable there already + if(LC.d1 == fdirn || LC.d2 == fdirn) + return reset() + if(!use_cable(1)) + return reset() + var/obj/structure/cable/NC = new(new_turf) + NC.cableColor("red") + NC.d1 = 0 + NC.d2 = fdirn + NC.update_icon() + + var/datum/powernet/PN + if(last_piece && last_piece.d2 != chassis.dir) + last_piece.d1 = min(last_piece.d2, chassis.dir) + last_piece.d2 = max(last_piece.d2, chassis.dir) + last_piece.update_icon() + PN = last_piece.powernet + + if(!PN) + PN = new() + PN.add_cable(NC) + NC.mergeConnectedNetworks(NC.d2) + + //NC.mergeConnectedNetworksOnTurf() + last_piece = NC + return 1 \ No newline at end of file diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 5b783c8e50c..74cdb2d368b 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -384,9 +384,16 @@ /obj/mecha/Move() . = ..() if(.) - events.fireEvent("onMove",get_turf(src)) + MoveAction() return +/obj/mecha/proc/MoveAction() //Allows mech equipment to do an action once the mech moves + if(!equipment.len) + return + + for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) + ME.MoveAction() + /obj/mecha/relaymove(mob/user,direction) if(user != src.occupant) //While not "realistic", this piece is player friendly. if(istype(user,/mob/living/carbon/brain)) @@ -621,6 +628,11 @@ /obj/mecha/bullet_act(var/obj/item/projectile/Proj) //wrapper + if(istype(Proj, /obj/item/projectile/test)) + var/obj/item/projectile/test/Test = Proj + Test.hit |= occupant // Register a hit on the occupant, for things like turrets, or in simple-mob cases stopping friendly fire in firing line mode. + return + src.log_message("Hit by projectile. Type: [Proj.name]([Proj.check_armour]).",1) call((proc_res["dynbulletdamage"]||src), "dynbulletdamage")(Proj) //calls equipment ..() diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index b3b9faa37de..1f90a45d613 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -123,7 +123,7 @@ C.images += holder */ -/obj/mecha/medical/odysseus/loaded/New() +/obj/mecha/medical/odysseus/loaded/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper ME.attach(src) diff --git a/code/game/mecha/micro/mechfab_designs_vr.dm b/code/game/mecha/micro/mechfab_designs_vr.dm index 7a86d8d9ec0..671e53b4da5 100644 --- a/code/game/mecha/micro/mechfab_designs_vr.dm +++ b/code/game/mecha/micro/mechfab_designs_vr.dm @@ -185,3 +185,11 @@ id = "weasel_head" build_path = /obj/item/mecha_parts/micro/part/weasel_head materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2500) + +/datum/design/item/mecha/medigun + name = "BL-3/P directed restoration system" + desc = "A portable medical system used to treat external injuries from afar." + id = "mech_medigun" + req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_BIO = 6) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 2000, "silver" = 1750, "diamond" = 1500, "phoron" = 4000) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/medigun \ No newline at end of file diff --git a/code/game/mecha/space/hoverpod.dm b/code/game/mecha/space/hoverpod.dm index 85fc59d564b..31558458d99 100644 --- a/code/game/mecha/space/hoverpod.dm +++ b/code/game/mecha/space/hoverpod.dm @@ -105,7 +105,7 @@ max_universal_equip = 1 max_special_equip = 1 -/obj/mecha/working/hoverpod/combatpod/New() +/obj/mecha/working/hoverpod/combatpod/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser ME.attach(src) @@ -116,7 +116,7 @@ /obj/mecha/working/hoverpod/shuttlepod desc = "Who knew a tiny ball could fit three people?" -/obj/mecha/working/hoverpod/shuttlepod/New() +/obj/mecha/working/hoverpod/shuttlepod/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger ME.attach(src) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index c4813bb0dd3..5dd88eb7e73 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -54,7 +54,7 @@ max_universal_equip = 1 max_special_equip = 1 -/obj/mecha/working/ripley/deathripley/New() +/obj/mecha/working/ripley/deathripley/Initialize() ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/safety_clamp ME.attach(src) @@ -64,7 +64,7 @@ desc = "An old, dusty mining ripley." name = "APLU \"Miner\"" -/obj/mecha/working/ripley/mining/New() +/obj/mecha/working/ripley/mining/Initialize() ..() //Attach drill if(prob(25)) //Possible diamond drill... Feeling lucky? diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm index 0de8d332b71..552e8672f8f 100644 --- a/code/game/objects/effects/alien/aliens.dm +++ b/code/game/objects/effects/alien/aliens.dm @@ -152,6 +152,12 @@ * Weeds */ #define NODERANGE 3 +#define WEED_NORTH_EDGING "north" +#define WEED_SOUTH_EDGING "south" +#define WEED_EAST_EDGING "east" +#define WEED_WEST_EDGING "west" +#define WEED_NODE_GLOW "glow" +#define WEED_NODE_BASE "nodebase" /obj/effect/alien/weeds name = "weeds" @@ -164,6 +170,18 @@ layer = ABOVE_TURF_LAYER var/health = 15 var/obj/effect/alien/weeds/node/linked_node = null + var/static/list/weedImageCache + +/obj/effect/alien/weeds/Destroy() + var/turf/T = get_turf(src) + // To not mess up the overlay updates. + loc = null + + for (var/obj/effect/alien/weeds/W in range(1,T)) + W.updateWeedOverlays() + + linked_node = null + ..() /obj/effect/alien/weeds/node icon_state = "weednode" @@ -173,9 +191,22 @@ light_range = NODERANGE var/node_range = NODERANGE + var/set_color = null + /obj/effect/alien/weeds/node/New() ..(src.loc, src) +/obj/effect/alien/weeds/node/Initialize() + ..() + START_PROCESSING(SSobj, src) + + spawn(1 SECOND) + if(color) + set_color = color + +/obj/effect/alien/weeds/node/Destroy() + STOP_PROCESSING(SSobj, src) + ..() /obj/effect/alien/weeds/New(pos, node) ..() @@ -184,12 +215,45 @@ return linked_node = node if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2") - spawn(rand(150, 200)) - if(src) - Life() + + fullUpdateWeedOverlays() + +/obj/effect/alien/weeds/proc/updateWeedOverlays() + + overlays.Cut() + + if(!weedImageCache || !weedImageCache.len) + weedImageCache = list() +// weedImageCache.len = 4 + weedImageCache[WEED_NORTH_EDGING] = image('icons/mob/alien.dmi', "weeds_side_n", layer=2.11, pixel_y = -32) + weedImageCache[WEED_SOUTH_EDGING] = image('icons/mob/alien.dmi', "weeds_side_s", layer=2.11, pixel_y = 32) + weedImageCache[WEED_EAST_EDGING] = image('icons/mob/alien.dmi', "weeds_side_e", layer=2.11, pixel_x = -32) + weedImageCache[WEED_WEST_EDGING] = image('icons/mob/alien.dmi', "weeds_side_w", layer=2.11, pixel_x = 32) + + var/turf/N = get_step(src, NORTH) + var/turf/S = get_step(src, SOUTH) + var/turf/E = get_step(src, EAST) + var/turf/W = get_step(src, WEST) + if(!locate(/obj/effect/alien) in N.contents) + if(istype(N, /turf/simulated/floor)) + overlays += weedImageCache[WEED_SOUTH_EDGING] + if(!locate(/obj/effect/alien) in S.contents) + if(istype(S, /turf/simulated/floor)) + overlays += weedImageCache[WEED_NORTH_EDGING] + if(!locate(/obj/effect/alien) in E.contents) + if(istype(E, /turf/simulated/floor)) + overlays += weedImageCache[WEED_WEST_EDGING] + if(!locate(/obj/effect/alien) in W.contents) + if(istype(W, /turf/simulated/floor)) + overlays += weedImageCache[WEED_EAST_EDGING] + +/obj/effect/alien/weeds/proc/fullUpdateWeedOverlays() + for (var/obj/effect/alien/weeds/W in range(1,src)) + W.updateWeedOverlays() + return -/obj/effect/alien/weeds/proc/Life() +/obj/effect/alien/weeds/process() set background = 1 var/turf/U = get_turf(src) /* @@ -211,6 +275,9 @@ Alien plants should do something if theres a lot of poison if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range) ) return + if(linked_node != src) + color = linked_node.set_color + direction_loop: for(var/dirn in cardinal) var/turf/T = get_step(src, dirn) @@ -222,10 +289,33 @@ Alien plants should do something if theres a lot of poison // continue for(var/obj/O in T) - if(O.density) + if(!O.CanZASPass(U)) continue direction_loop - new /obj/effect/alien/weeds(T, linked_node) + var/obj/effect/E = new /obj/effect/alien/weeds(T, linked_node) + + E.color = color + + if(istype(src, /obj/effect/alien/weeds/node)) + var/obj/effect/alien/weeds/node/N = src + var/list/nearby_weeds = list() + for(var/obj/effect/alien/weeds/W in range(N.node_range,src)) + nearby_weeds |= W + + for(var/obj/effect/alien/weeds/W in nearby_weeds) + if(!W) + continue + + if(!W.linked_node) + linked_node = src + + W.color = W.linked_node.set_color + + if(W == src) + continue + + if(prob(max(10, 40 - (5 * nearby_weeds.len)))) + W.process() /obj/effect/alien/weeds/ex_act(severity) @@ -282,7 +372,12 @@ Alien plants should do something if theres a lot of poison healthcheck() #undef NODERANGE - +#undef WEED_NORTH_EDGING +#undef WEED_SOUTH_EDGING +#undef WEED_EAST_EDGING +#undef WEED_WEST_EDGING +#undef WEED_NODE_GLOW +#undef WEED_NODE_BASE /* * Acid diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 3b1584ca194..7a773c733ec 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -53,7 +53,7 @@ var/global/list/image/splatter_cache=list() blood_DNA |= B.blood_DNA.Copy() qdel(B) drytime = world.time + DRYING_TIME * (amount+1) - START_PROCESSING(SSobj, src) + START_PROCESSING(SSobj, src) /obj/effect/decal/cleanable/blood/process() if(world.time > drytime) @@ -93,7 +93,6 @@ var/global/list/image/splatter_cache=list() S.overlays += S.blood_overlay if(S.blood_overlay && S.blood_overlay.color != basecolor) S.blood_overlay.color = basecolor - S.overlays.Cut() S.overlays += S.blood_overlay S.blood_DNA |= blood_DNA.Copy() perp.update_inv_shoes() @@ -200,10 +199,10 @@ var/global/list/image/splatter_cache=list() overlays += giblets /obj/effect/decal/cleanable/blood/gibs/up - random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1") + random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibup1","gibup1","gibup1") /obj/effect/decal/cleanable/blood/gibs/down - random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibdown1","gibdown1","gibdown1") + random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6","gibdown1","gibdown1","gibdown1") /obj/effect/decal/cleanable/blood/gibs/body random_icon_states = list("gibhead", "gibtorso") diff --git a/code/game/objects/effects/map_effects/radiation_emitter.dm b/code/game/objects/effects/map_effects/radiation_emitter.dm index 3fb31d3c5dc..8abf946556d 100644 --- a/code/game/objects/effects/map_effects/radiation_emitter.dm +++ b/code/game/objects/effects/map_effects/radiation_emitter.dm @@ -1,19 +1,19 @@ -// Constantly emites radiation from the tile it's placed on. -/obj/effect/map_effect/radiation_emitter - name = "radiation emitter" - icon_state = "radiation_emitter" - var/radiation_power = 30 // Bigger numbers means more radiation. - -/obj/effect/map_effect/radiation_emitter/Initialize() - START_PROCESSING(SSobj, src) - return ..() - -/obj/effect/map_effect/radiation_emitter/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/effect/map_effect/radiation_emitter/process() - radiation_repository.radiate(src, radiation_power) - +// Constantly emites radiation from the tile it's placed on. +/obj/effect/map_effect/radiation_emitter + name = "radiation emitter" + icon_state = "radiation_emitter" + var/radiation_power = 30 // Bigger numbers means more radiation. + +/obj/effect/map_effect/radiation_emitter/Initialize() + START_PROCESSING(SSobj, src) + return ..() + +/obj/effect/map_effect/radiation_emitter/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/effect/map_effect/radiation_emitter/process() + SSradiation.radiate(src, radiation_power) + /obj/effect/map_effect/radiation_emitter/strong radiation_power = 100 \ No newline at end of file diff --git a/code/game/objects/effects/spiders_vr.dm b/code/game/objects/effects/spiders_vr.dm new file mode 100644 index 00000000000..65829b95acb --- /dev/null +++ b/code/game/objects/effects/spiders_vr.dm @@ -0,0 +1,2 @@ +/obj/effect/spider/spiderling/virgo + grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/hunter) diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index b5345cc8ebb..61191381213 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -6,6 +6,8 @@ invisibility = 99 // nope cant see this shit plane = ABOVE_PLANE anchored = 1 + icon = 'icons/mob/screen1.dmi' //VS Edit + icon_state = "centermarker" //VS Edit /obj/effect/step_trigger/proc/Trigger(var/atom/movable/A) return 0 @@ -227,6 +229,10 @@ var/global/list/tele_landmarks = list() // Terrible, but the alternative is loop if(isobserver(A)) A.forceMove(T) // Harmlessly move ghosts. return + //VOREStation Edit Start + if(!(A.can_fall())) + return // Phased shifted kin should not fall + //VOREStation Edit End A.forceMove(T) // Living things should probably be logged when they fall... diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 8a9220e87f2..04046985c66 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -44,3 +44,14 @@ icon_state = "explosionfast" duration = 4 // VOREStation Add End + +//VOREStation edit: medigun +/obj/effect/temp_visual/heal + name = "healing glow" + icon_state = "heal" + duration = 15 + +/obj/effect/temp_visual/heal/Initialize(mapload) + pixel_x = rand(-12, 12) + pixel_y = rand(-9, 0) +//VOREStation edit ends \ No newline at end of file diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm index 872c652356a..d4f65fc9d10 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm @@ -79,3 +79,12 @@ light_range = 4 light_power = 3 light_color = "#3300ff" + +//VOREStation edit: medigun +/obj/effect/projectile/impact/medigun + icon = 'icons/obj/projectiles_vr.dmi' + icon_state = "impact_medbeam" + light_range = 2 + light_power = 0.5 + light_color = "#80F5FF" +//VOREStation edit ends \ No newline at end of file diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm index 42511e65774..d901aeaa612 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm @@ -91,3 +91,12 @@ light_range = 4 light_power = 3 light_color = "#3300ff" + +//VOREStation edit: medigun +/obj/effect/projectile/muzzle/medigun + icon = 'icons/obj/projectiles_vr.dmi' + icon_state = "muzzle_medbeam" + light_range = 2 + light_power = 0.5 + light_color = "#80F5FF" +//VOREStation edit ends \ No newline at end of file diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index 54fa41265fb..59d56b6c7c4 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -1,4 +1,12 @@ -/proc/generate_tracer_between_points(datum/point/starting, datum/point/ending, beam_type, color, qdel_in = 5, light_range = 2, light_color_override, light_intensity = 1, instance_key) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported! +/datum/beam_components_cache + var/list/beam_components = list() + +/datum/beam_components_cache/Destroy() + for(var/component in beam_components) + qdel(component) + return ..() + +/proc/generate_tracer_between_points(datum/point/starting, datum/point/ending, datum/beam_components_cache/beam_components, beam_type, color, qdel_in = 5, light_range = 2, light_color_override, light_intensity = 1, instance_key) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported! if(!istype(starting) || !istype(ending) || !ispath(beam_type)) return var/datum/point/midpoint = point_midpoint_points(starting, ending) @@ -21,10 +29,9 @@ for(var/obj/effect/projectile_lighting/PL in T) if(PL.owner == instance_key) continue tracing_line - QDEL_IN(new /obj/effect/projectile_lighting(T, light_color_override, light_range, light_intensity, instance_key), qdel_in > 0? qdel_in : 5) + beam_components.beam_components += new /obj/effect/projectile_lighting(T, light_color_override, light_range, light_intensity, instance_key) line = null - if(qdel_in) - QDEL_IN(PB, qdel_in) + beam_components.beam_components += PB /obj/effect/projectile/tracer name = "beam" @@ -107,3 +114,12 @@ light_range = 4 light_power = 3 light_color = "#3300ff" + +//VOREStation edit: medigun +/obj/effect/projectile/tracer/medigun + icon = 'icons/obj/projectiles_vr.dmi' + icon_state = "medbeam" + light_range = 2 + light_power = 0.5 + light_color = "#80F5FF" +//VOREStation edit ends \ No newline at end of file diff --git a/code/game/objects/effects/temporary_visuals/temproary_visual.dm~1fb83e6... Merge pull request #5959 from elgeonmb_suit++ b/code/game/objects/effects/temporary_visuals/temproary_visual.dm~1fb83e6... Merge pull request #5959 from elgeonmb_suit++ deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 591da027570..b651e2bfe23 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -581,10 +581,9 @@ var/list/global/slot_flags_enumeration = list( if( !blood_overlay ) generate_blood_overlay() - //apply the blood-splatter overlay if it isn't already in there - if(!blood_DNA.len) - blood_overlay.color = blood_color - overlays += blood_overlay + //Make the blood_overlay have the proper color then apply it. + blood_overlay.color = blood_color + overlays += blood_overlay //if this blood isn't already in the list, add it if(istype(M)) @@ -593,6 +592,7 @@ var/list/global/slot_flags_enumeration = list( blood_DNA[M.dna.unique_enzymes] = M.dna.b_type return 1 //we applied blood to the item + /obj/item/proc/generate_blood_overlay() if(blood_overlay) return @@ -716,7 +716,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. icon = 'icons/obj/device.dmi' //Worn icon generation for on-mob sprites -/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer) +/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer,var/icon/clip_mask = null) //VOREStation edit - add 'clip mask' argument. //Get the required information about the base icon var/icon/icon2use = get_worn_icon_file(body_type = body_type, slot_name = slot_name, default_icon = default_icon, inhands = inhands) var/state2use = get_worn_icon_state(slot_name = slot_name) @@ -738,6 +738,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(!inhands) apply_custom(standing_icon) //Pre-image overridable proc to customize the thing apply_addblends(icon2use,standing_icon) //Some items have ICON_ADD blend shaders + if(istype(clip_mask)) //VOREStation Edit - For taur bodies/tails clipping off parts of uniforms and suits. + standing_icon = get_icon_difference(standing_icon, clip_mask, 1) var/image/standing = image(standing_icon) standing.alpha = alpha diff --git a/code/game/objects/items/bells.dm b/code/game/objects/items/bells.dm index 43046d22b77..c7aa08a440f 100644 --- a/code/game/objects/items/bells.dm +++ b/code/game/objects/items/bells.dm @@ -10,6 +10,7 @@ attack_verb = list("annoyed") var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine") var/static/radial_use = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_use") + var/static/radial_pickup = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_pickup") /obj/item/weapon/deskbell/examine(mob/user) ..() @@ -26,6 +27,7 @@ //This defines the radials and what call we're assiging to them. var/list/options = list() options["examine"] = radial_examine + options["pick up"] = radial_pickup if(!broken) options["use"] = radial_use @@ -54,6 +56,9 @@ ring(user) add_fingerprint(user) + if("pick up") + ..() + /obj/item/weapon/deskbell/proc/ring(mob/user) if(user.a_intent == "harm") playsound(user.loc, 'sound/effects/deskbell_rude.ogg', 50, 1) @@ -78,9 +83,16 @@ to_chat(user,"You are not able to ring [src].") return 0 -/obj/item/weapon/deskbell/attackby(obj/item/i, mob/user, params) - if(!istype(i)) +/obj/item/weapon/deskbell/attackby(obj/item/W, mob/user, params) + if(!istype(W)) return + if(W.is_wrench() && isturf(loc)) + if(do_after(5)) + if(!src) return + to_chat(user, "You dissasemble the desk bell") + new /obj/item/stack/material/steel(get_turf(src), 1) + qdel(src) + return if(!broken) ring(user) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 46c425bb897..1d1d591d57c 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1096,7 +1096,7 @@ var/global/list/obj/item/device/pda/PDAs = list() P.conversations.Add("\ref[src]") - if (prob(15)) //Give the AI a chance of intercepting the message + if (prob(5) && security_level >= SEC_LEVEL_BLUE) //Give the AI a chance of intercepting the message //VOREStation Edit: no spam interception on lower codes + lower interception chance var/who = src.owner if(prob(50)) who = P.owner diff --git a/code/game/objects/items/devices/communicator/UI.dm b/code/game/objects/items/devices/communicator/UI.dm index e37587812a0..a4859c08a56 100644 --- a/code/game/objects/items/devices/communicator/UI.dm +++ b/code/game/objects/items/devices/communicator/UI.dm @@ -116,7 +116,7 @@ data["flashlight"] = fon data["manifest"] = PDA_Manifest data["feeds"] = compile_news() - data["latest_news"] = get_recent_news() + //data["latest_news"] = get_recent_news() //VOREStation Edit, bandaid for catastrophic runtime lag in helper.dm if(cartridge) // If there's a cartridge, we need to grab the information from it data["cart_devices"] = cartridge.get_device_status() data["cart_templates"] = cartridge.ui_templates diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 26fb1b69aa8..b66c4a37765 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -610,12 +610,12 @@ return 1 /obj/item/weapon/shockpaddles/standalone/checked_use(var/charge_amt) - radiation_repository.radiate(src, charge_amt/12) //just a little bit of radiation. It's the price you pay for being powered by magic I guess + SSradiation.radiate(src, charge_amt/12) //just a little bit of radiation. It's the price you pay for being powered by magic I guess return 1 /obj/item/weapon/shockpaddles/standalone/process() if(fail_counter > 0) - radiation_repository.radiate(src, fail_counter--) + SSradiation.radiate(src, fail_counter--) else STOP_PROCESSING(SSobj, src) diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index 76697ddba30..92ff449855e 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -28,7 +28,7 @@ /obj/item/device/geiger/proc/get_radiation() if(!scanning) return - radiation_count = radiation_repository.get_rads_at_turf(get_turf(src)) + radiation_count = SSradiation.get_rads_at_turf(get_turf(src)) update_icon() update_sound() diff --git a/code/game/objects/items/devices/radio/encryptionkey_vr.dm b/code/game/objects/items/devices/radio/encryptionkey_vr.dm index 4d2debc3414..a70ad6f7df7 100644 --- a/code/game/objects/items/devices/radio/encryptionkey_vr.dm +++ b/code/game/objects/items/devices/radio/encryptionkey_vr.dm @@ -18,3 +18,9 @@ name = "research director's encryption key" icon_state = "rd_cypherkey" channels = list("Command" = 1, "Science" = 1, "Explorer" = 1) + +/obj/item/device/encryptionkey/ert + channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1, "Explorer" = 1) + +/obj/item/device/encryptionkey/omni //Literally only for the admin intercoms + channels = list("Mercenary" = 1, "Raider" = 1, "Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1, "Explorer" = 1) diff --git a/code/game/objects/items/devices/radio/headset_vr.dm b/code/game/objects/items/devices/radio/headset_vr.dm index 46d4ead3d87..a82e694d0e8 100644 --- a/code/game/objects/items/devices/radio/headset_vr.dm +++ b/code/game/objects/items/devices/radio/headset_vr.dm @@ -3,6 +3,7 @@ desc = "The headset of the boss's boss." icon_state = "cent_headset" item_state = "headset" + centComm = 1 ks2type = /obj/item/device/encryptionkey/ert /obj/item/device/radio/headset/centcom/alt @@ -13,5 +14,33 @@ name = "\improper NT radio headset" desc = "The headset of a Nanotrasen corporate employee." icon_state = "nt_headset" + centComm = 1 ks2type = /obj/item/device/encryptionkey/ert +/obj/item/device/radio/headset + sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi', + SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi') + +/obj/item/device/radio/headset/mob_headset //Adminbus headset for simplemob shenanigans. + name = "nonhuman radio implant" + desc = "An updated, modular intercom that requires no hands to operate. Takes encryption keys" + +/obj/item/device/radio/headset/mob_headset/receive_range(freq, level) + if(ismob(src.loc)) + return ..(freq, level) + return -1 + +/obj/item/device/radio/headset/mob_headset/afterattack(var/atom/movable/target, mob/living/user, proximity) + if(!proximity) + return + if(istype(target,/mob/living/simple_mob)) + var/mob/living/simple_mob/M = target + if(!M.mob_radio) + forceMove(M) + M.mob_radio = src + return + if(M.mob_radio) + M.mob_radio.forceMove(M.loc) + M.mob_radio = null + return + ..() \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 68c862db09d..747f7f7d0ec 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -95,7 +95,7 @@ var/global/list/default_medbay_channels = list( /obj/item/device/radio/interact(mob/user) if(!user) - return 0 + return FALSE if(b_stat) wires.Interact(user) @@ -151,10 +151,10 @@ var/global/list/default_medbay_channels = list( /obj/item/device/radio/proc/has_channel_access(var/mob/user, var/freq) if(!user) - return 0 + return FALSE if(!(freq in internal_channels)) - return 0 + return FALSE return user.has_internal_radio_channel_access(internal_channels[freq]) @@ -191,7 +191,7 @@ var/global/list/default_medbay_channels = list( /obj/item/device/radio/Topic(href, href_list) if(..()) - return 1 + return TRUE usr.set_machine(src) if (href_list["track"]) @@ -229,7 +229,7 @@ var/global/list/default_medbay_channels = list( set_frequency(text2num(freq)) . = 1 if(href_list["nowindow"]) // here for pAIs, maybe others will want it, idk - return 1 + return TRUE if(.) SSnanoui.update_uis(src) @@ -246,8 +246,6 @@ var/global/list/default_medbay_channels = list( channel = null if (!istype(connection)) return - if (!connection) - return var/static/mob/living/silicon/ai/announcer/A = new /mob/living/silicon/ai/announcer(src, null, null, 1) A.SetName(from) @@ -274,18 +272,18 @@ var/global/list/default_medbay_channels = list( return null /obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, var/verb = "says", var/datum/language/speaking = null) - if(!on) return 0 // the device has to be on + if(!on) return FALSE // the device has to be on // Fix for permacell radios, but kinda eh about actually fixing them. - if(!M || !message) return 0 + if(!M || !message) return FALSE - if(speaking && (speaking.flags & (SIGNLANG|NONVERBAL))) return 0 + if(speaking && (speaking.flags & (SIGNLANG|NONVERBAL))) return FALSE if(istype(M)) M.trigger_aiming(TARGET_CAN_RADIO) // Uncommenting this. To the above comment: // The permacell radios aren't suppose to be able to transmit, this isn't a bug and this "fix" is just making radio wires useless. -Giacom if(wires.IsIndexCut(WIRE_TRANSMIT)) // The device has to have all its wires and shit intact - return 0 + return FALSE if(!radio_connection) set_frequency(frequency) @@ -304,9 +302,7 @@ var/global/list/default_medbay_channels = list( //#### Grab the connection datum ####// var/datum/radio_frequency/connection = handle_message_mode(M, message, channel) if (!istype(connection)) - return 0 - if (!connection) - return 0 + return FALSE var/turf/position = get_turf(src) @@ -360,13 +356,12 @@ var/global/list/default_medbay_channels = list( /* ###### Radio headsets can only broadcast through subspace ###### */ - if(subspace_transmission) var/list/jamming = is_jammed(src) if(jamming) var/distance = jamming["distance"] to_chat(M,"\icon[src] You hear the [distance <= 2 ? "loud hiss" : "soft hiss"] of static.") - return 0 + return FALSE // First, we want to generate a new radio signal var/datum/signal/signal = new @@ -414,6 +409,7 @@ var/global/list/default_medbay_channels = list( for(var/obj/machinery/telecomms/allinone/R in telecomms_list) R.receive_signal(signal) + // Receiving code can be located in Telecommunications.dm if(signal.data["done"] && position.z in signal.data["level"]) return TRUE //Huzzah, sent via subspace @@ -474,13 +470,13 @@ var/global/list/default_medbay_channels = list( to_chat(loc,"\The [src] pings as it reestablishes subspace communications.") subspace_transmission = TRUE // we're done here. - return 1 + return TRUE // Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level. // Send a mundane broadcast with limited targets: //THIS IS TEMPORARY. YEAH RIGHT - if(!connection) return 0 //~Carn + if(!connection) return FALSE //~Carn //VOREStation Add Start if(bluespace_radio) @@ -504,7 +500,7 @@ var/global/list/default_medbay_channels = list( /obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message) if ((R.frequency == frequency && message)) - return 1 + return TRUE else if else @@ -544,7 +540,7 @@ var/global/list/default_medbay_channels = list( if (!accept) for (var/ch_name in channels) var/datum/radio_frequency/RF = secure_radio_connections[ch_name] - if (RF.frequency==freq && (channels[ch_name]&FREQ_LISTENING)) + if (RF && RF.frequency==freq && (channels[ch_name]&FREQ_LISTENING)) accept = 1 break if (!accept) @@ -695,7 +691,7 @@ var/global/list/default_medbay_channels = list( /obj/item/device/radio/borg/Topic(href, href_list) if(..()) - return 1 + return TRUE if (href_list["mode"]) var/enable_subspace_transmission = text2num(href_list["mode"]) if(enable_subspace_transmission != subspace_transmission) diff --git a/code/game/objects/items/devices/radio/radio_vr.dm b/code/game/objects/items/devices/radio/radio_vr.dm index 932229d0ad3..86a16280fc9 100644 --- a/code/game/objects/items/devices/radio/radio_vr.dm +++ b/code/game/objects/items/devices/radio/radio_vr.dm @@ -99,7 +99,7 @@ if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_back) == src) return 1 - if((slot_flags & SLOT_BELT) && M.get_equipped_item(slot_belt) == src) + if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_s_store) == src) return 1 return 0 diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 90ae753da2e..a085e59d246 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -175,6 +175,30 @@ HALOGEN COUNTER - Radcount on mobs dat += stomachunknownreagents[d] else dat += "Unknown substance[(unknown > 1)?"s":""] found in subject's stomach.
" + if(C.touching && C.touching.total_volume) + var/unknown = 0 + var/touchreagentdata[0] + var/touchunknownreagents[0] + for(var/B in C.touching.reagent_list) + var/datum/reagent/T = B + if(T.scannable) + touchreagentdata["[T.id]"] = "\t[round(C.touching.get_reagent_amount(T.id), 1)]u [T.name]
" + if (advscan == 0 || showadvscan == 0) + dat += "[T.name] found in subject's dermis.
" + else + ++unknown + touchunknownreagents["[T.id]"] = "\t[round(C.ingested.get_reagent_amount(T.id), 1)]u [T.name]
" + if(advscan >= 1 && showadvscan == 1) + dat += "Beneficial reagents detected in subject's dermis:
" + for(var/d in touchreagentdata) + dat += touchreagentdata[d] + if(unknown) + if(advscan >= 3 && showadvscan == 1) + dat += "Warning: Non-medical reagent[(unknown > 1)?"s":""] found in subject's dermis:
" + for(var/d in touchunknownreagents) + dat += touchunknownreagents[d] + else + dat += "Unknown substance[(unknown > 1)?"s":""] found in subject's dermis.
" if(C.virus2.len) for (var/ID in C.virus2) if (ID in virusDB) diff --git a/code/game/objects/items/poi_items.dm b/code/game/objects/items/poi_items.dm index 6fd6d7debdd..c12a3a655aa 100644 --- a/code/game/objects/items/poi_items.dm +++ b/code/game/objects/items/poi_items.dm @@ -13,7 +13,7 @@ return ..() /obj/item/poi/pascalb/process() - radiation_repository.radiate(src, 5) + SSradiation.radiate(src, 5) /obj/item/poi/pascalb/Destroy() STOP_PROCESSING(SSobj, src) @@ -41,7 +41,7 @@ return ..() /obj/item/poi/brokenoldreactor/process() - radiation_repository.radiate(src, 25) + SSradiation.radiate(src, 25) /obj/item/poi/brokenoldreactor/Destroy() STOP_PROCESSING(SSobj, src) diff --git a/code/game/objects/items/robot/robot_upgrades_vr.dm b/code/game/objects/items/robot/robot_upgrades_vr.dm index a3c77099440..13f09a980d6 100644 --- a/code/game/objects/items/robot/robot_upgrades_vr.dm +++ b/code/game/objects/items/robot/robot_upgrades_vr.dm @@ -6,6 +6,7 @@ R.add_language(LANGUAGE_ECUREUILIAN, 1) R.add_language(LANGUAGE_DAEMON, 1) R.add_language(LANGUAGE_ENOCHIAN, 1) + R.add_language(LANGUAGE_SLAVIC, 1) return 1 else return 0 diff --git a/code/game/objects/items/stacks/matter_synth.dm b/code/game/objects/items/stacks/matter_synth.dm index 3483dfbc61c..d92cd5f8dda 100644 --- a/code/game/objects/items/stacks/matter_synth.dm +++ b/code/game/objects/items/stacks/matter_synth.dm @@ -50,4 +50,9 @@ /datum/matter_synth/wire name = "Wire Synthesizer" max_energy = 50 - recharge_rate = 2 \ No newline at end of file + recharge_rate = 2 + +/datum/matter_synth/bandage + name = "Bandage Synthesizer" + max_energy = 10 + recharge_rate = 1 diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 612a14c4d4f..51e2b8a03e2 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -11,6 +11,8 @@ var/heal_burn = 0 var/apply_sounds + var/upgrade_to // The type path this stack can be upgraded to. + /obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob) if (!istype(M)) user << "\The [src] cannot be applied to [M]!" @@ -59,6 +61,80 @@ use(1) M.updatehealth() + +/obj/item/stack/medical/proc/upgrade_stack(var/upgrade_amount) + . = FALSE + + var/turf/T = get_turf(src) + + if(ispath(upgrade_to) && use(upgrade_amount)) + var/obj/item/stack/medical/M = new upgrade_to(T, upgrade_amount) + return M + + return . + +/obj/item/stack/medical/crude_pack + name = "crude bandage" + singular_name = "crude bandage length" + desc = "Some bandages to wrap around bloody stumps." + icon_state = "gauze" + origin_tech = list(TECH_BIO = 1) + no_variants = FALSE + apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg') + + upgrade_to = /obj/item/stack/medical/bruise_pack + +/obj/item/stack/medical/crude_pack/attack(mob/living/carbon/M as mob, mob/user as mob) + if(..()) + return 1 + + if (istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) + + if(affecting.open) + to_chat(user, "The [affecting.name] is cut open, you'll need more than a bandage!") + return + + if(affecting.is_bandaged()) + to_chat(user, "The wounds on [M]'s [affecting.name] have already been bandaged.") + return 1 + else + user.visible_message("\The [user] starts bandaging [M]'s [affecting.name].", \ + "You start bandaging [M]'s [affecting.name]." ) + var/used = 0 + for (var/datum/wound/W in affecting.wounds) + if (W.internal) + continue + if(W.bandaged) + continue + if(used == amount) + break + if(!do_mob(user, M, W.damage/3)) + to_chat(user, "You must stand still to bandage wounds.") + break + + if(affecting.is_bandaged()) // We do a second check after the delay, in case it was bandaged after the first check. + to_chat(user, "The wounds on [M]'s [affecting.name] have already been bandaged.") + return 1 + + if (W.current_stage <= W.max_bleeding_stage) + user.visible_message("\The [user] bandages \a [W.desc] on [M]'s [affecting.name].", \ + "You bandage \a [W.desc] on [M]'s [affecting.name]." ) + else + user.visible_message("\The [user] places a bandage over \a [W.desc] on [M]'s [affecting.name].", \ + "You place a bandage over \a [W.desc] on [M]'s [affecting.name]." ) + W.bandage() + playsound(src, pick(apply_sounds), 25) + used++ + affecting.update_damages() + if(used == amount) + if(affecting.is_bandaged()) + to_chat(user, "\The [src] is used up.") + else + to_chat(user, "\The [src] is used up, but there are more wounds to treat on \the [affecting.name].") + use(used) + /obj/item/stack/medical/bruise_pack name = "roll of gauze" singular_name = "gauze length" @@ -68,6 +144,8 @@ no_variants = FALSE apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg') + upgrade_to = /obj/item/stack/medical/advanced/bruise_pack + /obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob) if(..()) return 1 diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 7b156c025ff..1170fedc04f 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -29,18 +29,21 @@ if (istype(M,/mob/living/carbon/human)) //Repairing robolimbs var/mob/living/carbon/human/H = M var/obj/item/organ/external/S = H.get_organ(user.zone_sel.selecting) - + //VOREStation Edit Start if (S && (S.robotic >= ORGAN_ROBOT)) if(!S.get_damage()) - user << "Nothing to fix here." + to_chat(user, "Nothing to fix here.") + else if((S.open < 2) && (S.brute_dam + S.burn_dam >= S.min_broken_damage) && !repair_external) + to_chat(user, "The damage is too extensive for this nanite swarm to handle.") else if(can_use(1)) user.setClickCooldown(user.get_attack_speed(src)) if(S.open >= 2) if(do_after(user,5 * toolspeed)) - S.heal_damage(20, 20, robo_repair = 1) + S.heal_damage(restoration_internal, restoration_internal, robo_repair = 1) else if(do_after(user,5 * toolspeed)) - S.heal_damage(10,10, robo_repair =1) + S.heal_damage(restoration_external,restoration_external, robo_repair =1) H.updatehealth() use(1) user.visible_message("\The [user] applies some nanite paste on [user != M ? "[M]'s [S.name]" : "[S]"] with [src].",\ "You apply some nanite paste on [user == M ? "your" : "[M]'s"] [S.name].") + //VOREStation Edit End diff --git a/code/game/objects/items/stacks/nanopaste_vr.dm b/code/game/objects/items/stacks/nanopaste_vr.dm new file mode 100644 index 00000000000..cd39b61fef4 --- /dev/null +++ b/code/game/objects/items/stacks/nanopaste_vr.dm @@ -0,0 +1,13 @@ +/obj/item/stack/nanopaste + var/restoration_external = 5 + var/restoration_internal = 20 + var/repair_external = FALSE + +/obj/item/stack/nanopaste/advanced + name = "advanced nanopaste" + singular_name = "advanced nanite swarm" + desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery. These ones are capable of restoring condition even of most thrashed robotic parts" + icon = 'icons/obj/stacks_vr.dmi' + icon_state = "adv_nanopaste" + restoration_external = 10 + repair_external = TRUE \ No newline at end of file diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index c5be2552044..984c5b97f63 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -24,6 +24,9 @@ var/list/datum/matter_synth/synths = null var/no_variants = TRUE // Determines whether the item should update it's sprites based on amount. + var/pass_color = FALSE // Will the item pass its own color var to the created item? Dyed cloth, wood, etc. + var/strict_color_stacking = FALSE // Will the stack merge with other stacks that are different colors? (Dyed cloth, wood, etc) + /obj/item/stack/New(var/loc, var/amount=null) ..() if (!stacktype) @@ -159,6 +162,17 @@ for (var/obj/item/I in O) qdel(I) + if ((pass_color || recipe.pass_color)) + if(!color) + if(recipe.use_material) + var/material/MAT = get_material_by_name(recipe.use_material) + if(MAT.icon_colour) + O.color = MAT.icon_colour + else + return + else + O.color = color + /obj/item/stack/Topic(href, href_list) ..() if ((usr.restrained() || usr.stat || usr.get_active_hand() != src)) @@ -242,6 +256,9 @@ return 0 if ((stacktype != S.stacktype) && !type_verified) return 0 + if ((strict_color_stacking || S.strict_color_stacking) && S.color != color) + return 0 + if (isnull(tamount)) tamount = src.get_amount() @@ -355,8 +372,9 @@ var/one_per_turf = 0 var/on_floor = 0 var/use_material + var/pass_color - New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null) + New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null, pass_stack_color) src.title = title src.result_type = result_type src.req_amount = req_amount @@ -366,6 +384,7 @@ src.one_per_turf = one_per_turf src.on_floor = on_floor src.use_material = supplied_material + src.pass_color = pass_stack_color /* * Recipe list datum diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 89182806db7..d457ccf7d1a 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -929,6 +929,12 @@ icon_state = "nymphplushie" pokephrase = "Chirp!" +/obj/item/toy/plushie/teshari + name = "teshari plush" + desc = "This is a plush teshari. Very soft, with a pompom on the tail. The toy is made well, as if alive. Looks like she is sleeping. Shhh!" + icon_state = "teshariplushie" + pokephrase = "Rya!" + /obj/item/toy/plushie/mouse name = "mouse plush" desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend." @@ -1357,4 +1363,4 @@ icon_state = "tinyxmastree" w_class = ITEMSIZE_TINY force = 1 - throwforce = 1 \ No newline at end of file + throwforce = 1 diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 3d9c4ea140c..12315972a2a 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -76,6 +76,14 @@ name = "\improper \"LiquidFood\" ration" icon_state = "liquidfood" +/obj/item/trash/liquidprotein + name = "\improper \"LiquidProtein\" ration" + icon_state = "liquidprotein" + +/obj/item/trash/liquidvitamin + name = "\improper \"VitaPaste\" ration" + icon_state = "liquidvitamin" + /obj/item/trash/tastybread name = "bread tube" icon_state = "tastybread" diff --git a/code/game/objects/items/trash_vr.dm b/code/game/objects/items/trash_vr.dm index 43cadda3f70..20f7e32c4c4 100644 --- a/code/game/objects/items/trash_vr.dm +++ b/code/game/objects/items/trash_vr.dm @@ -26,11 +26,6 @@ return ..() -/obj/item/trash/liquidprotein - name = "\improper \"LiquidProtein\" ration" - icon = 'icons/obj/trash_vr.dmi' - icon_state = "liquidprotein" - /obj/item/trash/fancyplate name = "dirty fancy plate" icon = 'icons/obj/trash_vr.dmi' diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm index 63308e6caad..6b59d13ea56 100644 --- a/code/game/objects/items/weapons/circuitboards/frame.dm +++ b/code/game/objects/items/weapons/circuitboards/frame.dm @@ -170,6 +170,15 @@ /obj/item/weapon/stock_parts/gear = 1, /obj/item/weapon/reagent_containers/glass/beaker/large = 1) +/obj/item/weapon/circuitboard/distiller + build_path = /obj/machinery/portable_atmospherics/powered/reagent_distillery + board_type = new /datum/frame/frame_types/reagent_distillery + req_components = list( + /obj/item/weapon/stock_parts/capacitor = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/motor = 2, + /obj/item/weapon/stock_parts/gear = 1) + /obj/item/weapon/circuitboard/teleporter_hub name = T_BOARD("teleporter hub") build_path = /obj/machinery/teleport/hub diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 43e7e0f90cc..d4a29d47f33 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -97,6 +97,23 @@ name = "seismic charge" desc = "Used to dig holes in specific areas without too much extra hole." - blast_heavy = 3 - blast_light = 5 - blast_flash = 8 + blast_heavy = 2 + blast_light = 4 + blast_flash = 7 + +/obj/item/weapon/plastique/seismic/attackby(var/obj/item/I, var/mob/user) + . = ..() + if(open_panel) + if(istype(I, /obj/item/weapon/stock_parts/micro_laser)) + var/obj/item/weapon/stock_parts/SP = I + var/new_blast_power = max(1, round(SP.rating / 2) + 1) + if(new_blast_power > blast_heavy) + to_chat(user, "You install \the [I] into \the [src].") + user.drop_from_inventory(I) + qdel(I) + blast_heavy = new_blast_power + blast_light = blast_heavy + round(new_blast_power * 0.5) + blast_flash = blast_light + round(new_blast_power * 0.75) + else + to_chat(user, "The [I] is not any better than the component already installed into this charge!") + return . \ No newline at end of file diff --git a/code/game/objects/items/weapons/explosives_vr.dm b/code/game/objects/items/weapons/explosives_vr.dm new file mode 100644 index 00000000000..a82ca02bbc8 --- /dev/null +++ b/code/game/objects/items/weapons/explosives_vr.dm @@ -0,0 +1,17 @@ +/obj/item/weapon/plastique/seismic/locked + desc = "Used to dig holes in specific areas without too much extra hole. Has extra mechanism that safely implodes the bomb if it is used in close proximity to the facility." + +/obj/item/weapon/plastique/seismic/locked/explode(var/location) + if(!target) + target = get_atom_on_turf(src) + if(!target) + target = src + + var/turf/T = get_turf(target) + if(T.z in using_map.map_levels) + target.visible_message("\The [src] lets out a loud beep as safeties trigger, before imploding and falling apart.") + target.overlays -= image_overlay + qdel(src) + return 0 + else + return ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade_vr.dm b/code/game/objects/items/weapons/grenades/spawnergrenade_vr.dm new file mode 100644 index 00000000000..56204be9849 --- /dev/null +++ b/code/game/objects/items/weapons/grenades/spawnergrenade_vr.dm @@ -0,0 +1,30 @@ +/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked + desc = "It is set to detonate in 5 seconds. It will deploy three weaponized survey drones. This one has a safety interlock that prevents release if used while in proximity to the facility." + req_access = list(access_armory) //for toggling safety + var/locked = 1 + +/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/detonate() + if(locked) + var/turf/T = get_turf(src) + if(T.z in using_map.map_levels) + icon_state = initial(icon_state) + active = 0 + return 0 + return ..() + +/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/attackby(obj/item/I, mob/user) + var/obj/item/weapon/card/id/id = I.GetID() + if(istype(id)) + if(check_access(id)) + locked = !locked + to_chat(user, "You [locked ? "enable" : "disable"] the safety lock on \the [src].") + else + to_chat(user, "Access denied.") + user.visible_message("[user] swipes \the [I] against \the [src].") + else + return ..() + +/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/emag_act(var/remaining_charges,var/mob/user) + ..() + locked = !locked + to_chat(user, "You [locked ? "enable" : "disable"] the safety lock on \the [src]!") \ No newline at end of file diff --git a/code/game/objects/items/weapons/id cards/station_ids.dm b/code/game/objects/items/weapons/id cards/station_ids.dm index c157d424925..4d37f154b36 100644 --- a/code/game/objects/items/weapons/id cards/station_ids.dm +++ b/code/game/objects/items/weapons/id cards/station_ids.dm @@ -31,6 +31,7 @@ var/dorm = 0 // determines if this ID has claimed a dorm already var/mining_points = 0 // For redeeming at mining equipment vendors + var/survey_points = 0 // For redeeming at explorer equipment vendors. /obj/item/weapon/card/id/examine(mob/user) set src in oview(1) @@ -170,7 +171,7 @@ /obj/item/weapon/card/id/synthetic/Initialize() . = ..() - access = get_all_station_access() + access_synth + access = get_all_station_access().Copy() + access_synth /obj/item/weapon/card/id/centcom name = "\improper CentCom. ID" @@ -181,7 +182,7 @@ /obj/item/weapon/card/id/centcom/Initialize() . = ..() - access = get_all_centcom_access() + access = get_all_centcom_access().Copy() /obj/item/weapon/card/id/centcom/station/Initialize() . = ..() diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 1804d576fd8..ff4146b8a0a 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -13,6 +13,7 @@ var/implant_color = "b" var/allow_reagents = 0 var/malfunction = 0 + var/initialize_loc = BP_TORSO show_messages = 1 /obj/item/weapon/implant/proc/trigger(emote, source as mob) @@ -30,7 +31,7 @@ var/mob/living/carbon/human/H = source var/obj/item/organ/external/affected = H.get_organ(target_zone) if(affected) - affected.implants += src + affected.implants |= src part = affected if(part) forceMove(part) @@ -65,8 +66,8 @@ /obj/item/weapon/implant/proc/implant_loadout(var/mob/living/carbon/human/H) if(H) - var/obj/item/organ/external/affected = H.organs_by_name[BP_HEAD] - if(handle_implant(H, affected)) + if(handle_implant(H, initialize_loc)) + invisibility = initial(invisibility) post_implant(H) /obj/item/weapon/implant/Destroy() @@ -110,7 +111,7 @@ GLOBAL_LIST_BOILERPLATE(all_tracking_implants, /obj/item/weapon/implant/tracking ..() /obj/item/weapon/implant/tracking/post_implant(var/mob/source) - START_PROCESSING(SSobj, src) + START_PROCESSING(SSobj, src) /obj/item/weapon/implant/tracking/Destroy() STOP_PROCESSING(SSobj, src) @@ -563,7 +564,7 @@ the implant may become unstable and either pre-maturely inject the subject or si /obj/item/weapon/implant/death_alarm/post_implant(mob/source as mob) mobname = source.real_name - START_PROCESSING(SSobj, src) + START_PROCESSING(SSobj, src) ////////////////////////////// // Compressed Matter Implant diff --git a/code/game/objects/items/weapons/implants/implant_vr.dm b/code/game/objects/items/weapons/implants/implant_vr.dm index bec23b4c2b8..17d1d6f6d24 100644 --- a/code/game/objects/items/weapons/implants/implant_vr.dm +++ b/code/game/objects/items/weapons/implants/implant_vr.dm @@ -33,6 +33,7 @@ source.add_language(LANGUAGE_BIRDSONG) source.add_language(LANGUAGE_SAGARU) source.add_language(LANGUAGE_CANILUNZT) + source.add_language(LANGUAGE_SLAVIC) source.add_language(LANGUAGE_SOL_COMMON) //In case they're giving a xenomorph an implant or something. /obj/item/weapon/implant/vrlanguage/post_implant(mob/source) diff --git a/code/game/objects/items/weapons/implants/implantaugment.dm b/code/game/objects/items/weapons/implants/implantaugment.dm new file mode 100644 index 00000000000..10873d1d06f --- /dev/null +++ b/code/game/objects/items/weapons/implants/implantaugment.dm @@ -0,0 +1,196 @@ +////////////////////////////// +// Nanite Organ Implant +////////////////////////////// +/obj/item/weapon/implant/organ + name = "nanite fabrication implant" + desc = "A buzzing implant covered in a writhing layer of metal insects." + icon_state = "implant_evil" + origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 2, TECH_ILLEGAL = 2) + + var/organ_to_implant = /obj/item/organ/internal/augment/bioaugment/thermalshades + var/organ_display_name = "unknown organ" + +/obj/item/weapon/implant/organ/get_data() + var/dat = {" +Implant Specifications:
+Name: \"GreyDoctor\" Class Nanite Hive
+Life: Activates upon implantation, destroying itself in the process.
+Important Notes: Nanites will fail to complete their task if a suitable location cannot be found for the organ.
+
+Implant Details:
+Function: Nanites will fabricate: [organ_display_name]
+Special Features: Organ identification protocols.
+Integrity: N/A"} + return dat + +/obj/item/weapon/implant/organ/post_implant(var/mob/M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + var/obj/item/organ/NewOrgan = new organ_to_implant() + + var/obj/item/organ/external/E = H.get_organ(NewOrgan.parent_organ) + to_chat(H, "You feel a tingling sensation in your [part].") + if(E && !(H.internal_organs_by_name[NewOrgan.organ_tag])) + spawn(rand(1 SECONDS, 30 SECONDS)) + to_chat(H, "You feel a pressure in your [E] as the tingling fades, the lump caused by the implant now gone.") + + NewOrgan.forceMove(H) + NewOrgan.owner = H + if(E.internal_organs == null) + E.internal_organs = list() + E.internal_organs |= NewOrgan + H.internal_organs_by_name[NewOrgan.organ_tag] = NewOrgan + H.internal_organs |= NewOrgan + NewOrgan.handle_organ_mod_special() + + spawn(1) + if(!QDELETED(src)) + qdel(src) + + else + qdel(NewOrgan) + to_chat(H, "You feel a pinching sensation in your [part]. The implant remains.") + +/obj/item/weapon/implant/organ/islegal() + return 0 + +/* + * Arm / leg mounted augments. + */ + +/obj/item/weapon/implant/organ/limbaugment + name = "nanite implant" + + organ_to_implant = /obj/item/organ/internal/augment/armmounted/taser + organ_display_name = "physiological augment" + + var/list/possible_targets = list(O_AUG_L_FOREARM, O_AUG_R_FOREARM) + +/obj/item/weapon/implant/organ/limbaugment/post_implant(var/mob/M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + + var/obj/item/organ/NewOrgan = new organ_to_implant() + + var/obj/item/organ/external/E = setup_augment_slots(H, NewOrgan) + to_chat(H, "You feel a tingling sensation in your [part].") + if(E && istype(E) && !(H.internal_organs_by_name[NewOrgan.organ_tag])) + spawn(rand(1 SECONDS, 30 SECONDS)) + to_chat(H, "You feel a pressure in your [E] as the tingling fades, the lump caused by the implant now gone.") + + NewOrgan.forceMove(H) + NewOrgan.owner = H + if(E.internal_organs == null) + E.internal_organs = list() + E.internal_organs |= NewOrgan + H.internal_organs_by_name[NewOrgan.organ_tag] = NewOrgan + H.internal_organs |= NewOrgan + NewOrgan.handle_organ_mod_special() + + spawn(1) + if(!QDELETED(src)) + qdel(src) + + else + qdel(NewOrgan) + to_chat(H, "You feel a pinching sensation in your [part]. The implant remains.") + +/obj/item/weapon/implant/organ/limbaugment/proc/setup_augment_slots(var/mob/living/carbon/human/H, var/obj/item/organ/internal/augment/armmounted/I) + var/list/Choices = possible_targets.Copy() + + for(var/targ in possible_targets) + if(H.internal_organs_by_name[targ]) + Choices -= targ + + var/target_choice = null + if(Choices && Choices.len) + if(Choices.len == 1) + target_choice = Choices[1] + else + target_choice = input("Choose augment location:") in Choices + + else + return FALSE + + if(target_choice) + switch(target_choice) + if(O_AUG_R_HAND) + I.organ_tag = O_AUG_R_HAND + I.parent_organ = BP_R_HAND + I.target_slot = slot_r_hand + if(O_AUG_L_HAND) + I.organ_tag = O_AUG_L_HAND + I.parent_organ = BP_L_HAND + I.target_slot = slot_l_hand + + if(O_AUG_R_FOREARM) + I.organ_tag = O_AUG_R_FOREARM + I.parent_organ = BP_R_ARM + I.target_slot = slot_r_hand + if(O_AUG_L_FOREARM) + I.organ_tag = O_AUG_L_FOREARM + I.parent_organ = BP_L_ARM + I.target_slot = slot_l_hand + + if(O_AUG_R_UPPERARM) + I.organ_tag = O_AUG_R_UPPERARM + I.parent_organ = BP_R_ARM + I.target_slot = slot_r_hand + if(O_AUG_L_UPPERARM) + I.organ_tag = O_AUG_L_UPPERARM + I.parent_organ = BP_L_ARM + I.target_slot = slot_l_hand + + . = H.get_organ(I.parent_organ) + +/* + * Limb implant primary subtypes. + */ + +/obj/item/weapon/implant/organ/limbaugment/upperarm + organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/multiple + organ_display_name = "multi-use augment" + + possible_targets = list(O_AUG_R_UPPERARM,O_AUG_L_UPPERARM) + +/obj/item/weapon/implant/organ/limbaugment/wrist + organ_to_implant = /obj/item/organ/internal/augment/armmounted/hand + organ_display_name = "wrist augment" + + possible_targets = list(O_AUG_R_HAND,O_AUG_L_HAND) + +/* + * Limb implant general subtypes. + */ + +// Wrist +/obj/item/weapon/implant/organ/limbaugment/wrist/sword + organ_to_implant = /obj/item/organ/internal/augment/armmounted/hand/sword + organ_display_name = "weapon augment" + +// Fore-arm +/obj/item/weapon/implant/organ/limbaugment/laser + organ_to_implant = /obj/item/organ/internal/augment/armmounted + organ_display_name = "weapon augment" + +/obj/item/weapon/implant/organ/limbaugment/dart + organ_to_implant = /obj/item/organ/internal/augment/armmounted/dartbow + organ_display_name = "weapon augment" + +// Upper-arm. +/obj/item/weapon/implant/organ/limbaugment/upperarm/medkit + organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/multiple/medical + +/obj/item/weapon/implant/organ/limbaugment/upperarm/surge + organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/surge + +/* + * Others + */ + +/obj/item/weapon/implant/organ/pelvic + name = "nanite fabrication implant" + + organ_to_implant = /obj/item/organ/internal/augment/bioaugment/sprint_enhance + organ_display_name = "pelvic augment" diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index ae00895361a..93fef6ca92d 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -179,3 +179,103 @@ src.imp = new /obj/item/weapon/implant/language/eal( src ) ..() return + +/obj/item/weapon/implantcase/shades + name = "glass case - 'Integrated Shades'" + desc = "A case containing a nanite fabricator implant." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/shades/New() + src.imp = new /obj/item/weapon/implant/organ( src ) + ..() + return + +/obj/item/weapon/implantcase/taser + name = "glass case - 'Taser'" + desc = "A case containing a nanite fabricator implant." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/taser/New() + src.imp = new /obj/item/weapon/implant/organ/limbaugment( src ) + ..() + return + +/obj/item/weapon/implantcase/laser + name = "glass case - 'Laser'" + desc = "A case containing a nanite fabricator implant." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/laser/New() + src.imp = new /obj/item/weapon/implant/organ/limbaugment/laser( src ) + ..() + return + +/obj/item/weapon/implantcase/dart + name = "glass case - 'Dart'" + desc = "A case containing a nanite fabricator implant." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/dart/New() + src.imp = new /obj/item/weapon/implant/organ/limbaugment/dart( src ) + ..() + return + +/obj/item/weapon/implantcase/toolkit + name = "glass case - 'Toolkit'" + desc = "A case containing a nanite fabricator implant." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/toolkit/New() + src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm( src ) + ..() + return + +/obj/item/weapon/implantcase/medkit + name = "glass case - 'Toolkit'" + desc = "A case containing a nanite fabricator implant." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/medkit/New() + src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm/medkit( src ) + ..() + return + +/obj/item/weapon/implantcase/surge + name = "glass case - 'Muscle Overclocker'" + desc = "A case containing a nanite fabricator implant." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/surge/New() + src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm/surge( src ) + ..() + return + +/obj/item/weapon/implantcase/analyzer + name = "glass case - 'Scanner'" + desc = "A case containing a nanite fabricator implant." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/analyzer/New() + src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist( src ) + ..() + return + +/obj/item/weapon/implantcase/sword + name = "glass case - 'Scanner'" + desc = "A case containing a nanite fabricator implant." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/sword/New() + src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist/sword( src ) + ..() + return + +/obj/item/weapon/implantcase/sprinter + name = "glass case - 'Sprinter'" + desc = "A case containing a nanite fabricator implant." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/sprinter/New() + src.imp = new /obj/item/weapon/implant/organ/pelvic( src ) + ..() + return diff --git a/code/game/objects/items/weapons/implants/implantdud.dm b/code/game/objects/items/weapons/implants/implantdud.dm new file mode 100644 index 00000000000..110051e58d6 --- /dev/null +++ b/code/game/objects/items/weapons/implants/implantdud.dm @@ -0,0 +1,21 @@ +/obj/item/weapon/implant/dud + name = "unknown implant" + desc = "A small device with small connector wires." + icon = 'icons/obj/device.dmi' + icon_state = "implant" + initialize_loc = BP_HEAD + var/roundstart = TRUE + +/obj/item/weapon/implant/dud/torso + name = "unknown implant" + desc = "A small device with small connector wires." + icon = 'icons/obj/device.dmi' + icon_state = "implant" + initialize_loc = BP_TORSO + +/obj/item/weapon/implant/dud/old + name = "old implant" + desc = "A small device with small connector wires." + icon = 'icons/obj/device.dmi' + icon_state = "implant" + roundstart = FALSE diff --git a/code/game/objects/items/weapons/implants/neuralbasic.dm b/code/game/objects/items/weapons/implants/neuralbasic.dm index d744c80fde0..18d472154bb 100644 --- a/code/game/objects/items/weapons/implants/neuralbasic.dm +++ b/code/game/objects/items/weapons/implants/neuralbasic.dm @@ -1,6 +1,7 @@ /obj/item/weapon/implant/neural name = "neural framework implant" desc = "A small metal casing with numerous wires stemming off of it." + initialize_loc = BP_HEAD var/obj/item/organ/internal/brain/my_brain = null var/target_state = null var/robotic_brain = FALSE diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm index 4f08c61a4c1..3f2b1978d37 100644 --- a/code/game/objects/items/weapons/material/material_weapons.dm +++ b/code/game/objects/items/weapons/material/material_weapons.dm @@ -42,6 +42,9 @@ if(!isnull(matter[material_type])) matter[material_type] *= force_divisor // May require a new var instead. + if(!(material.conductive)) + src.flags |= NOCONDUCT + /obj/item/weapon/material/get_material() return material @@ -67,7 +70,7 @@ if(applies_material_colour) color = material.icon_colour if(material.products_need_process()) - START_PROCESSING(SSobj, src) + START_PROCESSING(SSobj, src) update_force() /obj/item/weapon/material/Destroy() @@ -83,10 +86,13 @@ health-- check_health() -/obj/item/weapon/material/attackby(obj/item/weapon/W, mob/user as mob) +/obj/item/weapon/material/attackby(obj/item/weapon/W, mob/user) if(istype(W, /obj/item/weapon/whetstone)) var/obj/item/weapon/whetstone/whet = W repair(whet.repair_amount, whet.repair_time, user) + if(istype(W, /obj/item/weapon/material/sharpeningkit)) + var/obj/item/weapon/material/sharpeningkit/SK = W + repair(SK.repair_amount, SK.repair_time, user) ..() /obj/item/weapon/material/proc/check_health(var/consumed) @@ -131,7 +137,19 @@ to_chat(user, "You can't repair \the [src].") return - +/obj/item/weapon/material/proc/sharpen(var/material, var/sharpen_time, var/kit, mob/living/M) + if(!fragile) + if(health < initial(health)) + to_chat(M, "You should repair [src] first. Try using [kit] on it.") + return FALSE + M.visible_message("[M] begins to replace parts of [src] with [kit].", "You begin to replace parts of [src] with [kit].") + if(do_after(usr, sharpen_time)) + M.visible_message("[M] has finished replacing parts of [src].", "You finish replacing parts of [src].") + src.set_material(material) + return TRUE + else + to_chat(M, "You can't sharpen and re-edge [src].") + return FALSE /* Commenting this out pending rebalancing of radiation based on small objects. @@ -159,4 +177,4 @@ Commenting this out pending rebalancing of radiation based on small objects. TemperatureAct(150) else return ..() -*/ \ No newline at end of file +*/ diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index ba7438a6851..7d7d78eebaa 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -61,6 +61,51 @@ return return ..() +/obj/item/weapon/material/shard/afterattack(var/atom/target, mob/living/carbon/human/user as mob) + var/active_hand //hand the shard is in + var/will_break = FALSE + var/protected_hands = FALSE //this is a fucking mess + var/break_damage = 4 + var/light_glove_d = rand(2, 4) + var/no_glove_d = rand(4, 6) + var/list/forbidden_gloves = list( + /obj/item/clothing/gloves/sterile, + /obj/item/clothing/gloves/knuckledusters + ) + + if(src == user.l_hand) + active_hand = BP_L_HAND + else if(src == user.r_hand) + active_hand = BP_R_HAND + else + return // If it's not actually in our hands anymore, we were probably gentle with it + + active_hand = (src == user.l_hand) ? BP_L_HAND : BP_R_HAND // May not actually be faster than an if-else block, but a little bit cleaner -Ater + + if(prob(75)) + will_break = TRUE + + if(user.gloves && (user.gloves.body_parts_covered & HANDS) && istype(user.gloves, /obj/item/clothing/gloves)) // Not-gloves aren't gloves, and therefore don't protect us + protected_hands = TRUE // If we're wearing gloves we can probably handle it just fine + for(var/I in forbidden_gloves) + if(istype(user.gloves, I)) // forbidden_gloves is a blacklist, so if we match anything in there, our hands are not protected + protected_hands = FALSE + break + + if(user.gloves && !protected_hands) + to_chat(user, "\The [src] partially cuts into your hand through your gloves as you hit \the [target]!") + user.apply_damage(light_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src, src.sharp, src.edge) // Ternary to include break damage + + else if(!user.gloves) + to_chat(user, "\The [src] cuts into your hand as you hit \the [target]!") + user.apply_damage(no_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src, src.sharp, src.edge) + + if(will_break && src.loc == user) // If it's not in our hand anymore + user.visible_message("[user] hit \the [target] with \the [src], shattering it!", "You shatter \the [src] in your hand!") + playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1) + qdel(src) + return + /obj/item/weapon/material/shard/Crossed(AM as mob|obj) ..() if(isliving(AM)) diff --git a/code/game/objects/items/weapons/material/whetstone.dm b/code/game/objects/items/weapons/material/whetstone.dm index e312680d1b0..628f450e3dc 100644 --- a/code/game/objects/items/weapons/material/whetstone.dm +++ b/code/game/objects/items/weapons/material/whetstone.dm @@ -8,4 +8,69 @@ force = 3 w_class = ITEMSIZE_SMALL var/repair_amount = 5 - var/repair_time = 40 \ No newline at end of file + var/repair_time = 40 + +/obj/item/weapon/whetstone/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/stack/material)) + var/obj/item/stack/material/M = I + if(M.amount >= 5) + to_chat(user, "You begin to refine the [src] with [M]...") + if(do_after(user, 70)) + M.use(5) + var/obj/item/SK + SK = new /obj/item/weapon/material/sharpeningkit(get_turf(user), M.material.name) + to_chat(user, "You sharpen and refine the [src] into \a [SK].") + qdel(src) + if(SK) + user.put_in_hands(SK) + else + to_chat(user, "You need 5 [src] to refine it into a sharpening kit.") + +/obj/item/weapon/material/sharpeningkit + name = "sharpening kit" + desc = "A refined, fine grit whetstone, useful for sharpening dull edges, polishing out dents, and, with extra material, replacing an edge." + icon = 'icons/obj/kitchen.dmi' + icon_state = "sharpener" + hitsound = 'sound/weapons/genhit3.ogg' + force_divisor = 0.7 + thrown_force_divisor = 1 + var/repair_amount = 5 + var/repair_time = 40 + var/sharpen_time = 100 + var/uses = 0 + +/obj/item/weapon/material/sharpeningkit/examine(mob/user, distance) + . = ..() + to_chat(user, "There [uses == 1 ? "is" : "are"] [uses] [material] [uses == 1 ? src.material.sheet_singular_name : src.material.sheet_plural_name] left for use.") +/obj/item/weapon/material/sharpeningkit/Initialize() + . = ..() + setrepair() + +/obj/item/weapon/material/sharpeningkit/proc/setrepair() + repair_amount = material.hardness * 0.1 + repair_time = material.weight * 0.5 + sharpen_time = material.weight * 3 + +/obj/item/weapon/material/sharpeningkit/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/stack/material)) + var/obj/item/stack/material/S = W + if(S.material == material) + S.use(1) + uses += 1 + to_chat(user, "You add a [S.material.name] [S.material.sheet_singular_name] to [src].") + return + + if(istype(W, /obj/item/weapon/material)) + if(istype(W, /obj/item/weapon/material/sharpeningkit)) + to_chat(user, "Really? Sharpening a [W] with [src]? You goofball.") + return + var/obj/item/weapon/material/M = W + if(uses >= M.w_class*2) + if(M.sharpen(src.material.name, sharpen_time, src, user)) + uses -= M.w_class*2 + return + else + to_chat(user, "Not enough material to sharpen [M]. You need [M.w_class*2] [M.material.sheet_plural_name].") + return + else + to_chat(user, "You can't sharpen [W] with [src]!") diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index f825577d6ff..2c4fd9949b8 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -11,11 +11,26 @@ var/lrange = 2 var/lpower = 2 var/lcolor = "#0099FF" + var/colorable = FALSE + var/rainbow = FALSE + // If it uses energy. + var/use_cell = FALSE + var/hitcost = 120 + var/obj/item/weapon/cell/bcell = null + var/cell_type = /obj/item/weapon/cell/device + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi', + ) /obj/item/weapon/melee/energy/proc/activate(mob/living/user) if(active) return active = 1 + if(rainbow) + item_state = "[icon_state]_blade_rainbow" + else + item_state = "[icon_state]_blade" embed_chance = active_embed_chance force = active_force throwforce = active_throwforce @@ -23,12 +38,14 @@ edge = 1 w_class = active_w_class playsound(user, 'sound/weapons/saberon.ogg', 50, 1) + update_icon() set_light(lrange, lpower, lcolor) /obj/item/weapon/melee/energy/proc/deactivate(mob/living/user) if(!active) return playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) + item_state = "[icon_state]" active = 0 embed_chance = initial(embed_chance) force = initial(force) @@ -36,9 +53,34 @@ sharp = initial(sharp) edge = initial(edge) w_class = initial(w_class) + update_icon() set_light(0,0) +/obj/item/weapon/melee/energy/proc/use_charge(var/cost) + if(active) + if(bcell) + if(bcell.checked_use(cost)) + return 1 + else + return 0 + return null + +/obj/item/weapon/melee/energy/examine(mob/user) + if(!..(user, 1)) + return + + if(use_cell) + if(bcell) + to_chat(user, "The blade is [round(bcell.percent())]% charged.") + if(!bcell) + to_chat(user, "The blade does not have a power source installed.") + /obj/item/weapon/melee/energy/attack_self(mob/living/user as mob) + if(use_cell) + if((!bcell || bcell.charge < hitcost) && !active) + to_chat(user, "\The [src] does not seem to have power.") + return + var/datum/gender/TU = gender_datums[user.get_visible_gender()] if (active) if ((CLUMSY in user.mutations) && prob(50)) @@ -64,13 +106,90 @@ "\The [user] is falling on \the [src]! It looks like [TU.he] [TU.is] trying to commit suicide.")) return (BRUTELOSS|FIRELOSS) +/obj/item/weapon/melee/energy/attack(mob/M, mob/user) + if(active && use_cell) + if(!use_charge(hitcost)) + deactivate(user) + visible_message("\The [src]'s blade flickers, before deactivating.") + return ..() + +/obj/item/weapon/melee/energy/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/device/multitool) && colorable && !active) + if(!rainbow) + rainbow = TRUE + else + rainbow = FALSE + to_chat(user, "You manipulate the color controller in [src].") + update_icon() + if(use_cell) + if(istype(W, cell_type)) + if(!bcell) + user.drop_item() + W.loc = src + bcell = W + to_chat(user, "You install a cell in [src].") + update_icon() + else + to_chat(user, "[src] already has a cell.") + else if(W.is_screwdriver() && bcell) + bcell.update_icon() + bcell.forceMove(get_turf(loc)) + bcell = null + to_chat(user, "You remove the cell from \the [src].") + deactivate() + update_icon() + return + return ..() + +/obj/item/weapon/melee/energy/get_cell() + return bcell + +/obj/item/weapon/melee/energy/update_icon() + . = ..() + var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade") + if(colorable) + blade_overlay.color = lcolor + if(rainbow || !colorable) + blade_overlay = mutable_appearance(icon, "[icon_state]_blade_rainbow") + blade_overlay.color = "FFFFFF" + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other + if(active) + add_overlay(blade_overlay) + if(istype(usr,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = usr + H.update_inv_l_hand() + H.update_inv_r_hand() + + + + +/obj/item/weapon/melee/energy/AltClick(mob/living/user) + if(!colorable) //checks if is not colorable + return + if(!in_range(src, user)) //Basic checks to prevent abuse + return + if(user.incapacitated() || !istype(user)) + to_chat(user, "You can't do that right now!") + return + + if(alert("Are you sure you want to recolor your blade?", "Confirm Recolor", "Yes", "No") == "Yes") + var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null + if(energy_color_input) + lcolor = sanitize_hexcolor(energy_color_input) + update_icon() + +/obj/item/weapon/melee/energy/examine(mob/user) + ..() + to_chat(user, "Alt-click to recolor it.") + /* * Energy Axe */ /obj/item/weapon/melee/energy/axe name = "energy axe" desc = "An energised battle axe." - icon_state = "axe0" + icon_state = "eaxe" + item_state = "eaxe" //active_force = 150 //holy... active_force = 60 active_throwforce = 35 @@ -90,12 +209,12 @@ /obj/item/weapon/melee/energy/axe/activate(mob/living/user) ..() - icon_state = "axe1" + damtype = SEARING to_chat(user, "\The [src] is now energised.") /obj/item/weapon/melee/energy/axe/deactivate(mob/living/user) ..() - icon_state = initial(icon_state) + damtype = BRUTE to_chat(user, "\The [src] is de-energised. It's just a regular axe now.") /obj/item/weapon/melee/energy/axe/suicide_act(mob/user) @@ -103,6 +222,20 @@ visible_message("\The [user] swings \the [src] towards [TU.his] head! It looks like [TU.he] [TU.is] trying to commit suicide.") return (BRUTELOSS|FIRELOSS) +/obj/item/weapon/melee/energy/axe/charge + name = "charge axe" + desc = "An energised axe." + active_force = 35 + active_throwforce = 20 + force = 15 + + use_cell = TRUE + hitcost = 120 + +/obj/item/weapon/melee/energy/axe/charge/loaded/New() + ..() + bcell = new/obj/item/weapon/cell/device/weapon(src) + /* * Energy Sword */ @@ -110,7 +243,8 @@ color name = "energy sword" desc = "May the force be within you." - icon_state = "sword0" + icon_state = "esword" + item_state = "esword" active_force = 30 active_throwforce = 20 active_w_class = ITEMSIZE_LARGE @@ -123,9 +257,8 @@ origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4) sharp = 1 edge = 1 - var/blade_color - var/random_color = TRUE - var/active_state = "sword" + colorable = TRUE + projectile_parry_chance = 65 @@ -134,30 +267,6 @@ if(!istype(loc,/mob)) deactivate(user) -/obj/item/weapon/melee/energy/sword/New() - if(random_color) - blade_color = pick("red","blue","green","purple","white") - lcolor = blade_color - -/obj/item/weapon/melee/energy/sword/green/New() - blade_color = "green" - lcolor = "#008000" - -/obj/item/weapon/melee/energy/sword/red/New() - blade_color = "red" - lcolor = "#FF0000" - -/obj/item/weapon/melee/energy/sword/blue/New() - blade_color = "blue" - lcolor = "#0000FF" - -/obj/item/weapon/melee/energy/sword/purple/New() - blade_color = "purple" - lcolor = "#800080" - -/obj/item/weapon/melee/energy/sword/white/New() - blade_color = "white" - lcolor = "#FFFFFF" /obj/item/weapon/melee/energy/sword/activate(mob/living/user) if(!active) @@ -165,14 +274,13 @@ ..() attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - icon_state = "[active_state][blade_color]" + /obj/item/weapon/melee/energy/sword/deactivate(mob/living/user) if(active) to_chat(user, "\The [src] deactivates!") ..() attack_verb = list() - icon_state = initial(icon_state) /obj/item/weapon/melee/energy/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(active && default_parry_check(user, attacker, damage_source) && prob(60)) @@ -207,11 +315,10 @@ /obj/item/weapon/melee/energy/sword/pirate name = "energy cutlass" desc = "Arrrr matey." - icon_state = "cutlass0" + icon_state = "cutlass" + item_state = "cutlass" + colorable = TRUE -/obj/item/weapon/melee/energy/sword/pirate/activate(mob/living/user) - ..() - icon_state = "cutlass1" /* *Ionic Rapier @@ -223,8 +330,8 @@ description_info = "This is a dangerous melee weapon that will deliver a moderately powerful electromagnetic pulse to whatever it strikes. \ Striking a lesser robotic entity will compel it to attack you, as well. It also does extra burn damage to robotic entities, but it does \ very little damage to purely organic targets." - icon_state = "ionic_rapier0" - random_color = FALSE + icon_state = "ionrapier" + item_state = "ionrapier" active_force = 5 active_throwforce = 3 active_embed_chance = 0 @@ -235,7 +342,6 @@ lrange = 2 lpower = 2 lcolor = "#0000FF" - active_state = "ionic_rapier" projectile_parry_chance = 30 // It's not specifically designed for cutting and slashing, but it can still, maybe, save your life. /obj/item/weapon/melee/energy/sword/ionic_rapier/afterattack(var/atom/movable/AM, var/mob/living/user, var/proximity) @@ -273,79 +379,22 @@ active_force = 25 armor_penetration = 25 projectile_parry_chance = 40 + colorable = TRUE - var/hitcost = 75 - var/obj/item/weapon/cell/bcell = null - var/cell_type = /obj/item/weapon/cell/device - -/obj/item/weapon/melee/energy/sword/charge/proc/use_charge(var/cost) - if(active) - if(bcell) - if(bcell.checked_use(cost)) - return 1 - else - return 0 - return null - -/obj/item/weapon/melee/energy/sword/charge/examine(mob/user) - if(!..(user, 1)) - return - - if(bcell) - to_chat(user, "The blade is [round(bcell.percent())]% charged.") - if(!bcell) - to_chat(user, "The blade does not have a power source installed.") - -/obj/item/weapon/melee/energy/sword/charge/attack_self(mob/user as mob) - if((!bcell || bcell.charge < hitcost) && !active) - to_chat(user, "\The [src] does not seem to have power.") - return - ..() - -/obj/item/weapon/melee/energy/sword/charge/attack(mob/M, mob/user) - if(active) - if(!use_charge(hitcost)) - deactivate(user) - visible_message("\The [src]'s blade flickers, before retracting.") - return ..() - -/obj/item/weapon/melee/energy/sword/charge/attackby(obj/item/weapon/W, mob/user) - if(istype(W, cell_type)) - if(!bcell) - user.drop_item() - W.loc = src - bcell = W - to_chat(user, "You install a cell in [src].") - update_icon() - else - to_chat(user, "[src] already has a cell.") - else if(W.is_screwdriver() && bcell) - bcell.update_icon() - bcell.forceMove(get_turf(loc)) - bcell = null - to_chat(user, "You remove the cell from \the [src].") - deactivate() - update_icon() - return - else - ..() - -/obj/item/weapon/melee/energy/sword/charge/get_cell() - return bcell + hitcost = 75 /obj/item/weapon/melee/energy/sword/charge/loaded/New() ..() bcell = new/obj/item/weapon/cell/device/weapon(src) -/* - *Energy Blade - */ +//Energy Blade (ninja uses this) //Can't be activated or deactivated, so no reason to be a subtype of energy /obj/item/weapon/melee/energy/blade name = "energy blade" desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." icon_state = "blade" + item_state = "blade" force = 40 //Normal attacks deal very high damage - about the same as wielded fire axe armor_penetration = 100 sharp = 1 @@ -428,49 +477,27 @@ return 1 -/* - *Energy Spear - */ +//Energy Spear /obj/item/weapon/melee/energy/spear - name = "energy spear" - desc = "Concentrated energy forming a sharp tip at the end of a long rod." - icon_state = "espear0" - armor_penetration = 75 - sharp = 1 - edge = 1 - force = 5 - throwforce = 10 - throw_speed = 7 - throw_range = 11 - reach = 2 - w_class = ITEMSIZE_LARGE - active_force = 25 - active_throwforce = 30 - active_w_class = ITEMSIZE_HUGE - var/random_color = TRUE - var/tip_color = "" - var/active_state = "espear" + name = "energy spear" + desc = "Concentrated energy forming a sharp tip at the end of a long rod." + icon_state = "espear" + armor_penetration = 75 + sharp = 1 + edge = 1 + force = 5 + throwforce = 10 + throw_speed = 7 + throw_range = 11 + reach = 2 + w_class = ITEMSIZE_LARGE + active_force = 25 + active_throwforce = 30 + active_w_class = ITEMSIZE_HUGE + colorable = TRUE -/obj/item/weapon/melee/energy/spear/New() - if(random_color) - tip_color = pick("red","blue","green","purple") - lcolor = tip_color -/obj/item/weapon/melee/energy/spear/green/New() - tip_color = "green" - lcolor = "#008000" - -/obj/item/weapon/melee/energy/spear/red/New() - tip_color = "red" - lcolor = "#FF0000" - -/obj/item/weapon/melee/energy/spear/blue/New() - tip_color = "blue" - lcolor = "#0000FF" - -/obj/item/weapon/melee/energy/spear/purple/New() - tip_color = "purple" lcolor = "#800080" /obj/item/weapon/melee/energy/spear/activate(mob/living/user) @@ -478,7 +505,6 @@ to_chat(user, "\The [src] is now energised.") ..() attack_verb = list("jabbed", "stabbed", "impaled") - icon_state = "[active_state]-[tip_color]" /obj/item/weapon/melee/energy/spear/deactivate(mob/living/user) @@ -486,7 +512,6 @@ to_chat(user, "\The [src] deactivates!") ..() attack_verb = list("whacked", "beat", "slapped", "thonked") - icon_state = "espear0" /obj/item/weapon/melee/energy/spear/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(active && default_parry_check(user, attacker, damage_source) && prob(50)) @@ -496,4 +521,4 @@ spark_system.start() playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) return 1 - return 0 \ No newline at end of file + return 0 diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 5ea586f43dc..6d3310cdc44 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -115,7 +115,8 @@ name = "energy combat shield" desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere." icon = 'icons/obj/weapons.dmi' - icon_state = "eshield0" // eshield1 for expanded + icon_state = "eshield" + item_state = "eshield" slot_flags = SLOT_EARS flags = NOCONDUCT force = 3.0 @@ -123,9 +124,16 @@ throw_speed = 1 throw_range = 4 w_class = ITEMSIZE_SMALL + var/lrange = 1.5 + var/lpower = 1.5 + var/lcolor = "#006AFF" origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_ILLEGAL = 4) attack_verb = list("shoved", "bashed") var/active = 0 + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi', + ) /obj/item/weapon/shield/energy/handle_shield(mob/user) if(!active) @@ -175,11 +183,33 @@ return /obj/item/weapon/shield/energy/update_icon() - icon_state = "eshield[active]" + var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade") + if(lcolor) + blade_overlay.color = lcolor + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other if(active) - set_light(1.5, 1.5, "#006AFF") + add_overlay(blade_overlay) + item_state = "[icon_state]_blade" + set_light(lrange, lpower, lcolor) else set_light(0) + item_state = "[icon_state]" + +/obj/item/weapon/shield/energy/AltClick(mob/living/user) + if(!in_range(src, user)) //Basic checks to prevent abuse + return + if(user.incapacitated() || !istype(user)) + to_chat(user, "You can't do that right now!") + return + if(alert("Are you sure you want to recolor your shield?", "Confirm Recolor", "Yes", "No") == "Yes") + var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null + if(energy_color_input) + lcolor = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1) + update_icon() + +/obj/item/weapon/shield/energy/examine(mob/user) + ..() + to_chat(user, "Alt-click to recolor it.") /obj/item/weapon/shield/riot/tele name = "telescopic shield" @@ -226,4 +256,4 @@ H.update_inv_r_hand() add_fingerprint(user) - return \ No newline at end of file + return diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 18c60af4497..f5ea4ead6fd 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -422,3 +422,10 @@ H.visible_message("\The [src] decides not to unpack \the [src]!", \ "You decide not to unpack \the [src]!") return + +/obj/item/weapon/storage/backpack/satchel/ranger + name = "ranger satchel" + desc = "A satchel designed for the Go Go ERT Rangers series to allow for slightly bigger carry capacity for the ERT-Rangers.\ + Unlike the show claims, it is not a phoron-enhanced satchel of holding with plot-relevant content." + icon = 'icons/obj/clothing/ranger.dmi' + icon_state = "ranger_satchel" \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/backpack_vr.dm b/code/game/objects/items/weapons/storage/backpack_vr.dm index d836d23581a..5e121a2b354 100644 --- a/code/game/objects/items/weapons/storage/backpack_vr.dm +++ b/code/game/objects/items/weapons/storage/backpack_vr.dm @@ -128,4 +128,9 @@ /obj/item/weapon/storage/backpack/dufflebag/fluff //Black dufflebag without syndie buffs. name = "plain black dufflebag" desc = "A large dufflebag for holding extra tactical supplies." - icon_state = "duffle_syndie" \ No newline at end of file + icon_state = "duffle_syndie" + +/obj/item/weapon/storage/backpack + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/seromi/back.dmi', + SPECIES_WEREBEAST = 'icons/mob/species/werebeast/back.dmi') diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index f9a7d1e6083..ddb8c489f6a 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -435,3 +435,8 @@ icon_state = "fannypack_yellow" item_state = "fannypack_yellow" +/obj/item/weapon/storage/belt/ranger + name = "ranger belt" + desc = "The fancy utility-belt holding the tools, cuffs and gadgets of the Go Go ERT-Rangers. The belt buckle is not real phoron, but it is still surprisingly comfortable to wear." + icon = 'icons/obj/clothing/ranger.dmi' + icon_state = "ranger_belt" \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/belt_vr.dm b/code/game/objects/items/weapons/storage/belt_vr.dm new file mode 100644 index 00000000000..2e0829c1538 --- /dev/null +++ b/code/game/objects/items/weapons/storage/belt_vr.dm @@ -0,0 +1,4 @@ +/obj/item/weapon/storage/belt + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/seromi/belt.dmi', + SPECIES_WEREBEAST = 'icons/mob/species/werebeast/belt.dmi') \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/boxes_vr.dm b/code/game/objects/items/weapons/storage/boxes_vr.dm index f2cbd06aed1..8feee76bdda 100644 --- a/code/game/objects/items/weapons/storage/boxes_vr.dm +++ b/code/game/objects/items/weapons/storage/boxes_vr.dm @@ -33,7 +33,7 @@ starts_with = list(/obj/item/device/encryptionkey/headset_com = 7) /obj/item/weapon/storage/box/servicekeys - name = "box of command keys" + name = "box of service keys" desc = "A box full of service keys, for the HoP to give out as necessary." starts_with = list(/obj/item/device/encryptionkey/headset_service = 7) diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 7d754d8f147..1d1934bf8a8 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -67,6 +67,7 @@ item_state = "candlebox5" throwforce = 2 slot_flags = SLOT_BELT + max_storage_space = ITEMSIZE_COST_SMALL * 5 starts_with = list(/obj/item/weapon/flame/candle = 5) /obj/item/weapon/storage/fancy/whitecandle_box @@ -78,6 +79,7 @@ item_state = "whitecandlebox5" throwforce = 2 slot_flags = SLOT_BELT + max_storage_space = ITEMSIZE_COST_SMALL * 5 starts_with = list(/obj/item/weapon/flame/candle/white = 5) /obj/item/weapon/storage/fancy/blackcandle_box @@ -89,6 +91,7 @@ item_state = "blackcandlebox5" throwforce = 2 slot_flags = SLOT_BELT + max_storage_space = ITEMSIZE_COST_SMALL * 5 starts_with = list(/obj/item/weapon/flame/candle/black = 5) @@ -179,6 +182,21 @@ return ..() +/* + * Cracker Packet + */ + +/obj/item/weapon/storage/fancy/crackers + name = "\improper Getmore Crackers" + icon = 'icons/obj/food.dmi' + icon_state = "crackerbox" + icon_type = "cracker" + max_storage_space = ITEMSIZE_COST_TINY * 6 + max_w_class = ITEMSIZE_TINY + w_class = ITEMSIZE_SMALL + can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/cracker) + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/cracker = 6) + //////////// //CIG PACK// //////////// diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 3555a314f7f..2fd85ec7c2e 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -156,7 +156,6 @@ /obj/item/weapon/storage/firstaid/clotting name = "clotting kit" desc = "Contains chemicals to stop bleeding." - icon_state = "clottingkit" // VOREStation edit max_storage_space = ITEMSIZE_COST_SMALL * 7 starts_with = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting = 8) diff --git a/code/game/objects/items/weapons/storage/firstaid_vr.dm b/code/game/objects/items/weapons/storage/firstaid_vr.dm index 6f9bf71fb46..7cc415d9384 100644 --- a/code/game/objects/items/weapons/storage/firstaid_vr.dm +++ b/code/game/objects/items/weapons/storage/firstaid_vr.dm @@ -1,64 +1,97 @@ +/obj/item/weapon/storage/firstaid/clotting + icon_state = "clottingkit" + +/obj/item/weapon/storage/firstaid/bonemed + icon_state = "pinky" + /obj/item/weapon/storage/pill_bottle/adminordrazine - name = "bottle of Adminordrazine pills" + name = "pill bottle (Adminordrazine)" desc = "It's magic. We don't have to explain it." starts_with = list(/obj/item/weapon/reagent_containers/pill/adminordrazine = 21) /obj/item/weapon/storage/pill_bottle/nutriment - name = "bottle of Food pills" + name = "pill bottle (Food)" desc = "Contains pills used to feed people." starts_with = list(/obj/item/weapon/reagent_containers/pill/nutriment = 7, /obj/item/weapon/reagent_containers/pill/protein = 7) /obj/item/weapon/storage/pill_bottle/rezadone - name = "bottle of Rezadone pills" + name = "pill bottle (Rezadone)" desc = "A powder with almost magical properties, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects." starts_with = list(/obj/item/weapon/reagent_containers/pill/rezadone = 7) + wrapper_color = COLOR_GREEN_GRAY /obj/item/weapon/storage/pill_bottle/peridaxon - name = "bottle of Peridaxon pills" + name = "pill bottle (Peridaxon)" desc = "Used to encourage recovery of internal organs and nervous systems. Medicate cautiously." starts_with = list(/obj/item/weapon/reagent_containers/pill/peridaxon = 7) + wrapper_color = COLOR_PURPLE /obj/item/weapon/storage/pill_bottle/carthatoline - name = "bottle of Carthatoline pills" + name = "pill bottle (Carthatoline)" desc = "Carthatoline is strong evacuant used to treat severe poisoning." starts_with = list(/obj/item/weapon/reagent_containers/pill/carthatoline = 7) + wrapper_color = COLOR_GREEN_GRAY /obj/item/weapon/storage/pill_bottle/alkysine - name = "bottle of Alkysine pills" + name = "pill bottle (Alkysine)" desc = "Alkysine is a drug used to lessen the damage to neurological tissue after a catastrophic injury. Can heal brain tissue." starts_with = list(/obj/item/weapon/reagent_containers/pill/alkysine = 7) + wrapper_color = COLOR_YELLOW /obj/item/weapon/storage/pill_bottle/imidazoline - name = "bottle of Imidazoline pills" + name = "pill bottle (Imidazoline)" desc = "Heals eye damage." starts_with = list(/obj/item/weapon/reagent_containers/pill/imidazoline = 7) + wrapper_color = COLOR_PURPLE_GRAY /obj/item/weapon/storage/pill_bottle/osteodaxon - name = "bottle of Osteodaxon pills" + name = "pill bottle (Osteodaxon)" desc = "An experimental drug used to heal bone fractures." starts_with = list(/obj/item/weapon/reagent_containers/pill/osteodaxon = 7) + wrapper_color = COLOR_WHITE /obj/item/weapon/storage/pill_bottle/myelamine - name = "bottle of Myelamine pills" + name = "pill bottle (Myelamine)" desc = "Used to rapidly clot internal hemorrhages by increasing the effectiveness of platelets." starts_with = list(/obj/item/weapon/reagent_containers/pill/myelamine = 7) + wrapper_color = COLOR_PALE_PURPLE_GRAY /obj/item/weapon/storage/pill_bottle/hyronalin - name = "bottle of Hyronalin pills" + name = "pill bottle (Hyronalin)" desc = "Hyronalin is a medicinal drug used to counter the effect of radiation poisoning." starts_with = list(/obj/item/weapon/reagent_containers/pill/hyronalin = 7) + wrapper_color = COLOR_TEAL /obj/item/weapon/storage/pill_bottle/arithrazine - name = "bottle of Arithrazine pills" + name = "pill bottle (Arithrazine)" desc = "Arithrazine is an unstable medication used for the most extreme cases of radiation poisoning." starts_with = list(/obj/item/weapon/reagent_containers/pill/arithrazine = 7) + wrapper_color = COLOR_TEAL /obj/item/weapon/storage/pill_bottle/corophizine - name = "bottle of Corophizine pills" + name = "pill bottle (Corophizine)" desc = "A wide-spectrum antibiotic drug. Powerful and uncomfortable in equal doses." starts_with = list(/obj/item/weapon/reagent_containers/pill/corophizine = 7) + wrapper_color = COLOR_PALE_GREEN_GRAY /obj/item/weapon/storage/pill_bottle/healing_nanites - name = "bottle of Healing nanites capsules" + name = "pill bottle (Healing nanites)" desc = "Miniature medical robots that swiftly restore bodily damage." starts_with = list(/obj/item/weapon/reagent_containers/pill/healing_nanites = 7) + +/obj/item/weapon/storage/firstaid/insiderepair + name = "combat organ kit" + desc = "Contains advanced organ medical treatments." + icon_state = "bezerk" + item_state_slots = list(slot_r_hand_str = "firstaid-advanced", slot_l_hand_str = "firstaid-advanced") + starts_with = list( + /obj/item/weapon/storage/pill_bottle/rezadone, + /obj/item/weapon/storage/pill_bottle/peridaxon, + /obj/item/weapon/storage/pill_bottle/carthatoline, + /obj/item/weapon/storage/pill_bottle/alkysine, + /obj/item/weapon/storage/pill_bottle/imidazoline, + /obj/item/weapon/storage/pill_bottle/osteodaxon, + /obj/item/weapon/storage/pill_bottle/myelamine, + /obj/item/weapon/storage/pill_bottle/arithrazine, + /obj/item/device/healthanalyzer/advanced + ) diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm new file mode 100644 index 00000000000..582af52f43d --- /dev/null +++ b/code/game/objects/items/weapons/storage/mre.dm @@ -0,0 +1,290 @@ +/* +MRE Stuff + */ + +/obj/item/weapon/storage/mre + name = "standard MRE" + desc = "A vacuum-sealed bag containing a day's worth of nutrients for an adult in strenuous situations. There is no visible expiration date on the package." + icon = 'icons/obj/food.dmi' + icon_state = "mre" + max_storage_space = ITEMSIZE_COST_SMALL * 6 + max_w_class = ITEMSIZE_SMALL + var/opened = FALSE + var/meal_desc = "This one is menu 1, meat pizza." + starts_with = list( + /obj/item/weapon/storage/mrebag, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/examine(mob/user) + . = ..() + to_chat(user, meal_desc) + +/obj/item/weapon/storage/mre/update_icon() + if(opened) + icon_state = "[initial(icon_state)][opened]" + . = ..() + +/obj/item/weapon/storage/mre/attack_self(mob/user) + open(user) + +/obj/item/weapon/storage/mre/open(mob/user) + if(!opened) + to_chat(usr, "You tear open the bag, breaking the vacuum seal.") + opened = 1 + update_icon() + . = ..() + +/obj/item/weapon/storage/mre/menu2 + meal_desc = "This one is menu 2, margherita." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu2, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu3 + meal_desc = "This one is menu 3, vegetable pizza." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu3, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu4 + meal_desc = "This one is menu 4, hamburger." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu4, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu5 + meal_desc = "This one is menu 5, taco." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu5, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu6 + meal_desc = "This one is menu 6, meatbread." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu6, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu7 + meal_desc = "This one is menu 7, salad." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu7, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu8 + meal_desc = " This one is menu 8, hot chili." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu8, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu9 + name = "vegan MRE" + meal_desc = "This one is menu 9, boiled rice (skrell-safe)." + icon_state = "vegmre" + starts_with = list( + /obj/item/weapon/storage/mrebag/menu9, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert/menu9, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread/vegan, + /obj/random/mre/drink, + /obj/random/mre/sauce/vegan, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu10 + name = "protein MRE" + meal_desc = "This one is menu 10, protein." + icon_state = "meatmre" + starts_with = list( + /obj/item/weapon/storage/mrebag/menu10, + /obj/item/weapon/storage/mrebag/menu10, + /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/protein, + /obj/random/mre/sauce/sugarfree, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu11 + name = "emergency MRE" + meal_desc = "This one is menu 11, nutriment paste. Only for emergencies." + icon_state = "crayonmre" + starts_with = list( + /obj/item/weapon/reagent_containers/food/snacks/liquidfood, + /obj/item/weapon/reagent_containers/food/snacks/liquidfood, + /obj/item/weapon/reagent_containers/food/snacks/liquidfood, + /obj/item/weapon/reagent_containers/food/snacks/liquidfood, + /obj/item/weapon/reagent_containers/food/snacks/liquidprotein, + /obj/item/weapon/reagent_containers/food/snacks/liquidprotein, + ) + +/obj/item/weapon/storage/mre/menu12 + name = "crayon MRE" + meal_desc = "This one doesn't have a menu listing. How very odd." + icon_state = "crayonmre" + starts_with = list( + /obj/item/weapon/storage/fancy/crayons, + /obj/item/weapon/storage/mrebag/dessert/menu11, + /obj/random/mre/sauce/crayon, + /obj/random/mre/sauce/crayon, + /obj/random/mre/sauce/crayon + ) + +/obj/item/weapon/storage/mre/menu13 + name = "medical MRE" + meal_desc = "This one is menu 13, vitamin paste & dessert. Only for emergencies." + icon_state = "crayonmre" + starts_with = list( + /obj/item/weapon/reagent_containers/food/snacks/liquidvitamin, + /obj/item/weapon/reagent_containers/food/snacks/liquidvitamin, + /obj/item/weapon/reagent_containers/food/snacks/liquidvitamin, + /obj/item/weapon/reagent_containers/food/snacks/liquidprotein, + /obj/random/mre/drink, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/random + meal_desc = "The menu label is faded out." + starts_with = list( + /obj/random/mre/main, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mrebag + name = "main course" + desc = "A vacuum-sealed bag containing the MRE's main course. Self-heats when opened." + icon = 'icons/obj/food.dmi' + icon_state = "pouch_medium" + storage_slots = 1 + w_class = ITEMSIZE_SMALL + max_w_class = ITEMSIZE_SMALL + var/opened = FALSE + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/meatpizza/filled) + +/obj/item/weapon/storage/mrebag/Initialize() + . = ..() + +/obj/item/weapon/storage/mrebag/update_icon() + if(opened) + icon_state = "[initial(icon_state)][opened]" + . = ..() + +/obj/item/weapon/storage/mrebag/attack_self(mob/user) + open(user) + +/obj/item/weapon/storage/mrebag/open(mob/user) + if(!opened) + to_chat(usr, "The pouch heats up as you break the vaccum seal.") + opened = 1 + update_icon() + . = ..() + +/obj/item/weapon/storage/mrebag/menu2 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/margherita/filled) + +/obj/item/weapon/storage/mrebag/menu3 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/vegetablepizza/filled) + +/obj/item/weapon/storage/mrebag/menu4 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/monkeyburger) + +/obj/item/weapon/storage/mrebag/menu5 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/taco) + +/obj/item/weapon/storage/mrebag/menu6 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/meatbread/filled) + +/obj/item/weapon/storage/mrebag/menu7 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/tossedsalad) + +/obj/item/weapon/storage/mrebag/menu8 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/hotchili) + +/obj/item/weapon/storage/mrebag/menu9 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/boiledrice) + +/obj/item/weapon/storage/mrebag/menu10 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/meatcube) + +/obj/item/weapon/storage/mrebag/side + name = "side dish" + desc = "A vacuum-sealed bag containing the MRE's side dish. Self-heats when opened." + icon_state = "pouch_small" + starts_with = list(/obj/random/mre/side) + +/obj/item/weapon/storage/mrebag/side/menu10 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/meatcube) + +/obj/item/weapon/storage/mrebag/dessert + name = "dessert" + desc = "A vacuum-sealed bag containing the MRE's dessert." + icon_state = "pouch_small" + starts_with = list(/obj/random/mre/dessert) + +/obj/item/weapon/storage/mrebag/dessert/menu9 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit) + +/obj/item/weapon/storage/mrebag/dessert/menu11 + starts_with = list(/obj/item/weapon/pen/crayon/rainbow) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 4291752587d..9624a85ca27 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -93,6 +93,42 @@ O.update() . = ..() +/obj/item/weapon/storage/box/syndie_kit/imp_aug + name = "boxed augment implant (with injector)" + var/case_type = /obj/item/weapon/implantcase/shades + +/obj/item/weapon/storage/box/syndie_kit/imp_aug/Initialize() + new /obj/item/weapon/implanter(src) + new case_type(src) + . = ..() + +/obj/item/weapon/storage/box/syndie_kit/imp_aug/taser + case_type = /obj/item/weapon/implantcase/taser + +/obj/item/weapon/storage/box/syndie_kit/imp_aug/laser + case_type = /obj/item/weapon/implantcase/laser + +/obj/item/weapon/storage/box/syndie_kit/imp_aug/dart + case_type = /obj/item/weapon/implantcase/dart + +/obj/item/weapon/storage/box/syndie_kit/imp_aug/toolkit + case_type = /obj/item/weapon/implantcase/toolkit + +/obj/item/weapon/storage/box/syndie_kit/imp_aug/medkit + case_type = /obj/item/weapon/implantcase/medkit + +/obj/item/weapon/storage/box/syndie_kit/imp_aug/surge + case_type = /obj/item/weapon/implantcase/surge + +/obj/item/weapon/storage/box/syndie_kit/imp_aug/analyzer + case_type = /obj/item/weapon/implantcase/analyzer + +/obj/item/weapon/storage/box/syndie_kit/imp_aug/sword + case_type = /obj/item/weapon/implantcase/sword + +/obj/item/weapon/storage/box/syndie_kit/imp_aug/sprinter + case_type = /obj/item/weapon/implantcase/sprinter + /obj/item/weapon/storage/box/syndie_kit/space name = "boxed space suit and helmet" starts_with = list( diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index f011cd917b7..292f047f0f4 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -128,6 +128,15 @@ icon_state = "scalpel_manager_on" force = 7.5 +/obj/item/weapon/surgical/scalpel/ripper + name = "organ pincers" + desc = "A horrifying bladed tool with a large metal spike in its center. The tool is used for rapidly removing organs from hopefully willing patients." + icon_state = "organ_ripper" + item_state = "bone_setter" + force = 15.0 + toolspeed = 0.75 + origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 3, TECH_ILLEGAL = 2) + /* * Circular Saw */ @@ -147,6 +156,19 @@ sharp = 1 edge = 1 +/obj/item/weapon/surgical/circular_saw/manager + name = "energetic bone diverter" + desc = "For heavy duty cutting (and sealing), with science!" + icon_state = "adv_saw" + item_state = "saw3" + hitsound = 'sound/weapons/emitter2.ogg' + damtype = SEARING + w_class = ITEMSIZE_LARGE + origin_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 6) + matter = list(DEFAULT_WALL_MATERIAL = 12500) + attack_verb = list("attacked", "slashed", "seared", "cut") + toolspeed = 0.75 + //misc, formerly from code/defines/weapons.dm /obj/item/weapon/surgical/bonegel name = "bone gel" @@ -245,4 +267,4 @@ /obj/item/weapon/surgical/bone_clamp/alien icon = 'icons/obj/abductor.dmi' - toolspeed = 0.75 \ No newline at end of file + toolspeed = 0.75 diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm index 73b62f07418..fab0a6fb983 100644 --- a/code/game/objects/items/weapons/tools/crowbar.dm +++ b/code/game/objects/items/weapons/tools/crowbar.dm @@ -64,7 +64,7 @@ /obj/item/weapon/tool/crowbar/hybrid/is_crowbar() if(prob(10)) var/turf/T = get_turf(src) - radiation_repository.radiate(get_turf(src), 5) + SSradiation.radiate(get_turf(src), 5) T.visible_message("\The [src] shudders!") return FALSE return TRUE diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm index a9bdd6cee86..1969987ff96 100644 --- a/code/game/objects/items/weapons/tools/screwdriver.dm +++ b/code/game/objects/items/weapons/tools/screwdriver.dm @@ -108,7 +108,7 @@ /obj/item/weapon/tool/screwdriver/hybrid/is_screwdriver() if(prob(10)) var/turf/T = get_turf(src) - radiation_repository.radiate(get_turf(src), 5) + SSradiation.radiate(get_turf(src), 5) T.visible_message("\The [src] shudders!") return FALSE return TRUE diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 3a969562f88..33c5a750786 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -504,6 +504,14 @@ mounted_pack.return_nozzle() to_chat(user, "\The [src] retracts to its fueltank.") +/obj/item/weapon/weldingtool/tubefed/survival + name = "tube-fed emergency welding tool" + desc = "A bulky, cooler-burning welding tool that draws from a worn welding tank." + icon_state = "tubewelder" + max_fuel = 5 + toolspeed = 1.75 + eye_safety_modifier = 2 + /* * Electric/Arc Welder */ diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm index 181c786c4c4..4d61609db44 100644 --- a/code/game/objects/items/weapons/tools/wirecutters.dm +++ b/code/game/objects/items/weapons/tools/wirecutters.dm @@ -88,7 +88,7 @@ /obj/item/weapon/tool/wirecutters/hybrid/is_wirecutter() if(prob(10)) var/turf/T = get_turf(src) - radiation_repository.radiate(get_turf(src), 5) + SSradiation.radiate(get_turf(src), 5) T.visible_message("\The [src] shudders!") return FALSE return TRUE diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm index 652e32cf75c..3f02a2f8b36 100644 --- a/code/game/objects/items/weapons/tools/wrench.dm +++ b/code/game/objects/items/weapons/tools/wrench.dm @@ -44,7 +44,7 @@ /obj/item/weapon/tool/wrench/hybrid/is_wrench() if(prob(10)) var/turf/T = get_turf(src) - radiation_repository.radiate(get_turf(src), 5) + SSradiation.radiate(get_turf(src), 5) T.visible_message("\The [src] shudders!") return FALSE return TRUE diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 27927b81802..1e63201f4e1 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -11,6 +11,8 @@ origin_tech = list(TECH_MATERIAL = 1) matter = list(DEFAULT_WALL_MATERIAL = 18750) var/deployed = 0 + var/camo_net = FALSE + var/stun_length = 0.25 SECONDS /obj/item/weapon/beartrap/suicide_act(mob/user) var/datum/gender/T = gender_datums[user.get_visible_gender()] @@ -98,6 +100,7 @@ set_dir(L.dir) can_buckle = 1 buckle_mob(L) + L.Stun(stun_length) L << "The steel jaws of \the [src] bite into you, trapping you in place!" deployed = 0 can_buckle = initial(can_buckle) @@ -122,6 +125,21 @@ ..() if(!deployed) + if(camo_net) + alpha = 255 + icon_state = "beartrap0" else + if(camo_net) + alpha = 50 + icon_state = "beartrap1" + +/obj/item/weapon/beartrap/hunting + name = "hunting trap" + desc = "A mechanically activated leg trap. High-tech and reliable. Looks like it could really hurt if you set it off." + stun_length = 1 SECOND + camo_net = TRUE + color = "#C9DCE1" + + origin_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_PHORON = 2, TECH_ARCANE = 1) diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index 5df0c9dbe33..4225ed810a7 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -7,6 +7,7 @@ w_class = ITEMSIZE_LARGE var/max_fuel = 350 var/obj/item/weapon/nozzle = null //Attached welder, or other spray device. + var/nozzle_type = /obj/item/weapon/weldingtool/tubefed var/nozzle_attached = 0 /obj/item/weapon/weldpack/Initialize() @@ -15,7 +16,7 @@ reagents = R R.my_atom = src R.add_reagent("fuel", max_fuel) - nozzle = new/obj/item/weapon/weldingtool/tubefed(src) + nozzle = new nozzle_type(src) nozzle_attached = 1 /obj/item/weapon/weldpack/Destroy() @@ -145,3 +146,14 @@ ..(user) user << text("\icon[] [] units of fuel left!", src, src.reagents.total_volume) return + +/obj/item/weapon/weldpack/survival + name = "emergency welding kit" + desc = "A heavy-duty, portable welding fluid carrier." + slot_flags = SLOT_BACK + icon = 'icons/obj/storage.dmi' + icon_state = "welderpack-e" + item_state = "welderpack" + w_class = ITEMSIZE_LARGE + max_fuel = 100 + nozzle_type = /obj/item/weapon/weldingtool/tubefed/survival diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 61005069daa..c7b8c07f8db 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -55,7 +55,7 @@ CouldNotUseTopic(usr) return 1 -/obj/CanUseTopic(var/mob/user, var/datum/topic_state/state) +/obj/CanUseTopic(var/mob/user, var/datum/topic_state/state = default_state) if(user.CanUseObjTopic(src)) return ..() to_chat(user, "\icon[src]Access Denied!") diff --git a/code/game/objects/random/mapping.dm b/code/game/objects/random/mapping.dm index eb5741c6a19..d39983af2f2 100644 --- a/code/game/objects/random/mapping.dm +++ b/code/game/objects/random/mapping.dm @@ -65,6 +65,21 @@ prob(10);/obj/effect/mine/stun, prob(10);/obj/effect/mine/incendiary,) +/obj/random/humanoidremains + name = "Random Humanoid Remains" + desc = "This is a random pile of remains." + spawn_nothing_percentage = 15 + icon = 'icons/effects/blood.dmi' + icon_state = "remains" + +/obj/random/humanoidremains/item_to_spawn() + return pick(prob(30);/obj/effect/decal/remains/human, + prob(25);/obj/effect/decal/remains/ribcage, + prob(25);/obj/effect/decal/remains/tajaran, + prob(10);/obj/effect/decal/remains/unathi, + prob(10);/obj/effect/decal/remains/posi + ) + /obj/random_multi/single_item/captains_spare_id name = "Multi Point - Captain's Spare" id = "Captain's spare id" @@ -396,5 +411,54 @@ /obj/item/clothing/mask/luchador/rudos, /obj/item/clothing/mask/luchador/tecnicos, /obj/structure/closet/crate + ), + prob(1);list( + /obj/machinery/artifact, + /obj/structure/anomaly_container + ), + prob(1);list( + /obj/random/curseditem, + /obj/random/humanoidremains, + /obj/structure/closet/crate ) ) + +/* + * Turf swappers. + */ + +/obj/random/turf + name = "random Sif turf" + desc = "This is a random Sif turf." + + spawn_nothing_percentage = 20 + + var/override_outdoors = FALSE // Do we override our chosen turf's outdoors? + var/turf_outdoors = TRUE // Will our turf be outdoors? + +/obj/random/turf/spawn_item() + var/build_path = item_to_spawn() + + var/turf/T1 = get_turf(src) + T1.ChangeTurf(build_path, 1, 1, FALSE) + + if(override_outdoors) + T1.outdoors = turf_outdoors + +/obj/random/turf/item_to_spawn() + return pick(prob(25);/turf/simulated/floor/outdoors/grass/sif, + prob(25);/turf/simulated/floor/outdoors/dirt, + prob(25);/turf/simulated/floor/outdoors/grass/sif/forest, + prob(25);/turf/simulated/floor/outdoors/rocks) + +/obj/random/turf/lava + name = "random Lava spawn" + desc = "This is a random lava spawn." + + override_outdoors = TRUE + turf_outdoors = FALSE + +/obj/random/turf/lava/item_to_spawn() + return pick(prob(5);/turf/simulated/floor/lava, + prob(3);/turf/simulated/floor/outdoors/rocks/caves, + prob(1);/turf/simulated/mineral) diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index 8f3a50bbed3..f9180c99f1d 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -529,3 +529,161 @@ /obj/random/janusmodule/item_to_spawn() return pick(subtypesof(/obj/item/weapon/circuitboard/mecha/imperion)) + +/obj/random/curseditem + name = "random cursed item" + desc = "For use in dungeons." + icon = 'icons/obj/storage.dmi' + icon_state = "red" + +/obj/random/curseditem/item_to_spawn() + var/possible_object_paths = list(/obj/item/weapon/paper/carbon/cursedform) + possible_object_paths |= subtypesof(/obj/item/clothing/head/psy_crown) + return pick(possible_object_paths) + +//Random MRE stuff + +/obj/random/mre + name = "random MRE" + desc = "This is a random single MRE." + icon = 'icons/obj/food.dmi' + icon_state = "mre" + drop_get_turf = FALSE + +/obj/random/mre/item_to_spawn() + return pick(/obj/item/weapon/storage/mre, + /obj/item/weapon/storage/mre/menu2, + /obj/item/weapon/storage/mre/menu3, + /obj/item/weapon/storage/mre/menu4, + /obj/item/weapon/storage/mre/menu5, + /obj/item/weapon/storage/mre/menu6, + /obj/item/weapon/storage/mre/menu7, + /obj/item/weapon/storage/mre/menu8, + /obj/item/weapon/storage/mre/menu9, + /obj/item/weapon/storage/mre/menu10) + + +/obj/random/mre/main + name = "random MRE main course" + desc = "This is a random main course for MREs." + icon_state = "pouch" + drop_get_turf = FALSE + +/obj/random/mre/main/item_to_spawn() + return pick(/obj/item/weapon/storage/mrebag, + /obj/item/weapon/storage/mrebag/menu2, + /obj/item/weapon/storage/mrebag/menu3, + /obj/item/weapon/storage/mrebag/menu4, + /obj/item/weapon/storage/mrebag/menu5, + /obj/item/weapon/storage/mrebag/menu6, + /obj/item/weapon/storage/mrebag/menu7, + /obj/item/weapon/storage/mrebag/menu8) + +/obj/random/mre/side + name = "random MRE side dish" + desc = "This is a random side dish for MREs." + icon_state = "pouch" + drop_get_turf = FALSE + +/obj/random/mre/side/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/snacks/tossedsalad, + /obj/item/weapon/reagent_containers/food/snacks/boiledrice, + /obj/item/weapon/reagent_containers/food/snacks/poppypretzel, + /obj/item/weapon/reagent_containers/food/snacks/twobread, + /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast) + +/obj/random/mre/dessert + name = "random MRE dessert" + desc = "This is a random dessert for MREs." + icon_state = "pouch" + drop_get_turf = FALSE + +/obj/random/mre/dessert/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/snacks/candy, + /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar, + /obj/item/weapon/reagent_containers/food/snacks/donut/normal, + /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly, + /obj/item/weapon/reagent_containers/food/snacks/chocolatebar, + /obj/item/weapon/reagent_containers/food/snacks/cookie) + +/obj/random/mre/dessert/vegan + name = "random vegan MRE dessert" + desc = "This is a random vegan dessert for MREs." + +/obj/random/mre/dessert/vegan/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/snacks/candy, + /obj/item/weapon/reagent_containers/food/snacks/chocolatebar, + /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly, + /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit) + +/obj/random/mre/drink + name = "random MRE drink" + desc = "This is a random drink for MREs." + icon_state = "packet" + drop_get_turf = FALSE + +/obj/random/mre/drink/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/coffee, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/tea, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/cocoa, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/grape, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/orange, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/watermelon, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/apple) + +/obj/random/mre/spread + name = "random MRE spread" + desc = "This is a random spread packet for MREs." + icon_state = "packet" + drop_get_turf = FALSE + +/obj/random/mre/spread/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/honey) + +/obj/random/mre/spread/vegan + name = "random vegan MRE spread" + desc = "This is a random vegan spread packet for MREs" + +/obj/random/mre/spread/vegan/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly) + +/obj/random/mre/sauce + name = "random MRE sauce" + desc = "This is a random sauce packet for MREs." + icon_state = "packet" + drop_get_turf = FALSE + +/obj/random/mre/sauce/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/soy) + +/obj/random/mre/sauce/vegan/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/soy) + +/obj/random/mre/sauce/sugarfree/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/soy) + +/obj/random/mre/sauce/crayon/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/generic, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/red, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/orange, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/yellow, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/green, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/blue, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/purple, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/grey, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/brown) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index da686ad455f..43f50a83873 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -97,6 +97,7 @@ /obj/item/clothing/glasses/meson, /obj/item/weapon/cartridge/engineering, /obj/item/taperoll/engineering, + /obj/item/clothing/head/hardhat, /obj/item/clothing/suit/storage/hooded/wintercoat/engineering, /obj/item/clothing/shoes/boots/winter/engineering, /obj/item/weapon/tank/emergency/oxygen/engi, @@ -125,6 +126,7 @@ starts_with = list( /obj/item/clothing/accessory/storage/brown_vest, /obj/item/clothing/suit/fire/firefighter, + /obj/item/clothing/head/hardhat/red, /obj/item/device/flashlight, /obj/item/weapon/extinguisher, ///obj/item/clamp, //VOREStation Removal: without leaks those are pointless, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 368fbf10f4a..350e9dc5144 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -302,7 +302,7 @@ GLOBAL_LIST_BOILERPLATE(all_brig_closets, /obj/structure/closet/secure_closet/br var/id = null starts_with = list( - /obj/item/clothing/under/color/orange, + /obj/item/clothing/under/color/prison, /obj/item/clothing/shoes/orange) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 9bdc9659e22..916c12f6439 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -140,7 +140,7 @@ icon_closed = "orange" starts_with = list( - /obj/item/clothing/under/color/orange = 3, + /obj/item/clothing/under/color/prison = 3, /obj/item/clothing/shoes/orange = 3) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index e399c04d0ba..6517dda8f8b 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -3,7 +3,7 @@ /obj/structure/closet/crate name = "crate" desc = "A rectangular steel crate." - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' //VOREStation edit icon_state = "crate" icon_opened = "crateopen" icon_closed = "crate" @@ -293,6 +293,9 @@ /obj/structure/closet/crate/solar name = "solar pack crate" + icon_state = "engi_crate" //VOREStation Edit + icon_opened = "engi_crateopen" //VOREStation Edit + icon_closed = "engi_crate" //VOREStation Edit starts_with = list( /obj/item/solar_assembly = 21, @@ -343,12 +346,13 @@ desc = "A crate of emergency rations." starts_with = list( - /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 4) + /obj/random/mre = 6) /obj/structure/closet/crate/bin name = "large bin" desc = "A large bin." + icon = 'icons/obj/storage.dmi' //VOREStation edit icon_state = "largebin" icon_opened = "largebinopen" icon_closed = "largebin" @@ -417,6 +421,7 @@ /obj/structure/closet/crate/secure/bin name = "secure bin" desc = "A secure bin." + icon = 'icons/obj/storage.dmi' //VOREStation edit icon_state = "largebins" icon_opened = "largebinsopen" icon_closed = "largebins" @@ -429,7 +434,7 @@ /obj/structure/closet/crate/large name = "large crate" desc = "A hefty metal crate." - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit icon_state = "largemetal" icon_opened = "largemetalopen" icon_closed = "largemetal" @@ -457,10 +462,10 @@ /obj/structure/closet/crate/secure/large name = "large crate" desc = "A hefty metal crate with an electronic locking system." - icon = 'icons/obj/storage.dmi' - icon_state = "largemetal" - icon_opened = "largemetalopen" - icon_closed = "largemetal" + icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit + icon_state = "largemetalsecure" //VOREStation Edit + icon_opened = "largemetalsecureopen" //VOREStation Edit + icon_closed = "largemetalsecure" //VOREStation Edit redlight = "largemetalr" greenlight = "largemetalg" diff --git a/code/game/objects/structures/crates_lockers/crates_vr.dm b/code/game/objects/structures/crates_lockers/crates_vr.dm index c2a5cee915b..85eccb3d77e 100644 --- a/code/game/objects/structures/crates_lockers/crates_vr.dm +++ b/code/game/objects/structures/crates_lockers/crates_vr.dm @@ -31,4 +31,9 @@ ..() - return \ No newline at end of file + return + +/obj/structure/closet/crate/medical/blood + icon_state = "blood" + icon_opened = "bloodopen" + icon_closed = "blood" \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index a7a4b778235..79bd5e2949b 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -1,7 +1,7 @@ /obj/structure/largecrate name = "large crate" desc = "A hefty wooden crate." - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit icon_state = "densecrate" density = 1 var/list/starts_with @@ -82,10 +82,11 @@ starts_with = list(/obj/structure/vehiclecage/quadtrailer) /obj/structure/largecrate/animal - icon_state = "mulecrate" + icon_state = "lisacrate" //VOREStation Edit /obj/structure/largecrate/animal/mulebot name = "Mulebot crate" + icon_state = "mulecrate" //VOREStation Edit starts_with = list(/mob/living/bot/mulebot) /obj/structure/largecrate/animal/corgi diff --git a/code/game/objects/structures/crates_lockers/largecrate_vr.dm b/code/game/objects/structures/crates_lockers/largecrate_vr.dm index c151409e62e..6886a08a3c1 100644 --- a/code/game/objects/structures/crates_lockers/largecrate_vr.dm +++ b/code/game/objects/structures/crates_lockers/largecrate_vr.dm @@ -50,7 +50,7 @@ /mob/living/simple_mob/animal/wolf, /mob/living/simple_mob/animal/space/bear;0.5, /mob/living/simple_mob/animal/space/carp, - /mob/living/simple_mob/animal/space/mimic, + /mob/living/simple_mob/vore/aggressive/mimic, /mob/living/simple_mob/vore/aggressive/rat, /mob/living/simple_mob/vore/aggressive/rat/tame, // /mob/living/simple_mob/otie;0.5 diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 86a98e6a695..15bfe8ac893 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -1,14 +1,82 @@ +/obj/structure/flora + name = "flora" + desc = "A perfectly generic plant." + anchored = TRUE // Usually, plants don't move. Usually. + plane = DECAL_PLANE + layer = BELOW_MOB_LAYER + var/randomize_size = FALSE + var/max_x_scale = 1.25 + var/max_y_scale = 1.25 + var/min_x_scale = 0.9 + var/min_y_scale = 0.9 + var/harvest_tool = null // The type of item used to harvest the plant. + var/harvest_count = 0 + + var/randomize_harvest_count = TRUE + var/max_harvests = 0 + var/min_harvests = -1 + var/list/harvest_loot = null // Should be an associative list for things to spawn, and their weights. An example would be a branch from a tree. + +/obj/structure/flora/Initialize() + ..() + + if(randomize_size) + icon_scale_x = rand(min_x_scale * 100, max_x_scale * 100) / 100 + icon_scale_y = rand(min_y_scale * 100, max_y_scale * 100) / 100 + + if(prob(50)) + icon_scale_x *= -1 + update_transform() + + if(randomize_harvest_count) + max_harvests = max(0, rand(min_harvests, max_harvests)) // Incase you want to weight it more toward 'not harvestable', set min_harvests to a negative value. + +/obj/structure/flora/examine(mob/user) + . = ..(user) + if(harvest_count < max_harvests) + to_chat(user, "\The [src] seems to have something hanging from it.") + +/obj/structure/flora/attackby(var/obj/item/weapon/W, var/mob/living/user) + if(can_harvest(W)) + var/harvest_spawn = pickweight(harvest_loot) + var/atom/movable/AM = spawn_harvest(harvest_spawn, user) + + if(!AM) + to_chat(user, "You fail to harvest anything from \the [src].") + + else + to_chat(user, "You harvest \the [AM] from \the [src].") + return + + ..(W, user) + +/obj/structure/flora/proc/can_harvest(var/obj/item/I) + . = FALSE + if(harvest_tool && istype(I, harvest_tool) && harvest_loot && harvest_loot.len && harvest_count < max_harvests) + . = TRUE + return . + +/obj/structure/flora/proc/spawn_harvest(var/path = null, var/mob/user = null) + if(!ispath(path)) + return 0 + var/turf/Target = get_turf(src) + if(user) + Target = get_turf(user) + + var/atom/movable/AM = new path(Target) + + harvest_count++ + return AM //bushes /obj/structure/flora/bush name = "bush" icon = 'icons/obj/flora/snowflora.dmi' icon_state = "snowbush1" - anchored = 1 /obj/structure/flora/bush/New() ..() @@ -20,6 +88,7 @@ icon = 'icons/obj/plants.dmi' icon_state = "plant-26" + anchored = FALSE //newbushes @@ -27,7 +96,6 @@ name = "bush" icon = 'icons/obj/flora/ausflora.dmi' icon_state = "firstbush_1" - anchored = 1 /obj/structure/flora/ausbushes/New() ..() @@ -144,6 +212,7 @@ icon_state = "hangskele" desc = "It's an anatomical model of a human skeletal system made of plaster." + plane = OBJ_PLANE //potted plants credit: Flashkirby /obj/structure/flora/pottedplant @@ -152,6 +221,8 @@ icon = 'icons/obj/plants.dmi' icon_state = "plant-01" + plane = OBJ_PLANE + /obj/structure/flora/pottedplant/large name = "large potted plant" desc = "This is a large plant. Three branches support pairs of waxy leaves." @@ -348,4 +419,22 @@ /obj/structure/flora/sif/eyes/Initialize() icon_state = "[initial(icon_state)][rand(1,3)]" - . = ..() \ No newline at end of file + . = ..() + +/datum/category_item/catalogue/flora/mosstendrils + name = "Sivian Flora - Moss Stalks" + desc = "A plant native to Sif. The plant is most closely related to the common, dense moss found covering Sif's terrain. \ + It has evolved a method of camouflage utilizing white hairs on its dorsal sides to make it appear as a small mound of snow from \ + above. It has no known use, though it is a common furnishing in contemporary homes." + value = CATALOGUER_REWARD_TRIVIAL + +/obj/structure/flora/sif/tendrils + name = "stocky tendrils" + desc = "A 'plant' made up of hardened moss. It has tiny hairs that bunch together to look like snow." + icon_state = "grass" + randomize_size = TRUE + catalogue_data = list(/datum/category_item/catalogue/flora/mosstendrils) + +/obj/structure/flora/sif/tendrils/Initialize() + icon_state = "[initial(icon_state)][rand(1,3)]" + . = ..() diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm index 03657ce45d4..c67348a94ae 100644 --- a/code/game/objects/structures/flora/trees.dm +++ b/code/game/objects/structures/flora/trees.dm @@ -14,19 +14,10 @@ var/product_amount = 10 // How much of a stack you get, if the above is defined. var/is_stump = FALSE // If true, suspends damage tracking and most other effects. var/indestructable = FALSE // If true, the tree cannot die. - var/randomize_size = FALSE // If true, the tree will choose a random scale in the X and Y directions to stretch. /obj/structure/flora/tree/Initialize() icon_state = choose_icon_state() - if(randomize_size) - icon_scale_x = rand(90, 125) / 100 - icon_scale_y = rand(90, 125) / 100 - - if(prob(50)) - icon_scale_x *= -1 - update_transform() - return ..() /obj/structure/flora/tree/update_transform() @@ -39,7 +30,17 @@ /obj/structure/flora/tree/proc/choose_icon_state() return icon_state +/obj/structure/flora/tree/can_harvest(var/obj/item/I) + . = FALSE + if(!is_stump && harvest_tool && istype(I, harvest_tool) && harvest_loot && harvest_loot.len && harvest_count < max_harvests) + . = TRUE + return . + /obj/structure/flora/tree/attackby(var/obj/item/weapon/W, var/mob/living/user) + if(can_harvest(W)) + ..(W, user) + return + if(!istype(W)) return ..() @@ -267,6 +268,14 @@ product = /obj/item/stack/material/log/sif catalogue_data = list(/datum/category_item/catalogue/flora/sif_tree) randomize_size = TRUE + + harvest_tool = /obj/item/weapon/material/knife + max_harvests = 2 + min_harvests = -4 + harvest_loot = list( + /obj/item/weapon/reagent_containers/food/snacks/siffruit = 5 + ) + var/light_shift = 0 /obj/structure/flora/tree/sif/choose_icon_state() diff --git a/code/game/objects/structures/ghost_pods/silicon_vr.dm b/code/game/objects/structures/ghost_pods/silicon_vr.dm new file mode 100644 index 00000000000..e9e707b6642 --- /dev/null +++ b/code/game/objects/structures/ghost_pods/silicon_vr.dm @@ -0,0 +1,26 @@ +/obj/structure/ghost_pod/manual/lost_drone/dogborg + +/obj/structure/ghost_pod/manual/lost_drone/dogborg/create_occupant(var/mob/M) + var/response = alert(M, "What type of lost drone are you? Do note, that dogborgs may have experienced different type of corruption ((Potential for having vore-related laws))", "Drone Type", "Regular", "Dogborg") + if(!(response == "Dogborg")) // No response somehow or Regular + return ..() + else + density = FALSE + var/mob/living/silicon/robot/stray/randomlaws/R = new(get_turf(src)) + R.adjustBruteLoss(rand(5, 30)) + R.adjustFireLoss(rand(5, 10)) + if(M.mind) + M.mind.transfer_to(R) + // Put this text here before ckey change so that their laws are shown below it, since borg login() shows it. + to_chat(M, "You are a Stray Drone, discovered inside the wreckage of your previous home. \ + Something has reactivated you, with their intentions unknown to you, and yours unknown to them. They are a foreign entity, \ + however they did free you from your pod...") + to_chat(M, "Be sure to examine your currently loaded lawset closely. Remember, your \ + definiton of 'the station' is where your pod is, and unless your laws say otherwise, the entity that released you \ + from the pod is not a crewmember.") + R.ckey = M.ckey + visible_message("As \the [src] opens, the eyes of the robot flicker as it is activated.") + R.Namepick() + log_and_message_admins("successfully opened \a [src] and got a Stray Drone.") + used = TRUE + return TRUE \ No newline at end of file diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 072dd43de6e..aab0ecf7f01 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -38,7 +38,7 @@ if(!total_radiation) return - radiation_repository.radiate(src, total_radiation) + SSradiation.radiate(src, total_radiation) return total_radiation @@ -62,7 +62,7 @@ /obj/structure/girder/update_icon() if(anchored) - icon_state = "girder" + icon_state = initial(icon_state) else icon_state = "displaced" @@ -320,6 +320,7 @@ name = "column" icon= 'icons/obj/cult.dmi' icon_state= "cultgirder" + max_health = 250 health = 250 cover = 70 girder_material = "cult" @@ -354,6 +355,13 @@ new /obj/effect/decal/remains/human(get_turf(src)) dismantle() +/obj/structure/girder/resin + name = "soft girder" + icon_state = "girder_resin" + max_health = 225 + health = 225 + cover = 60 + girder_material = "resin" /obj/structure/girder/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) var/turf/simulated/T = get_turf(src) diff --git a/code/game/objects/structures/handrail_vr.dm b/code/game/objects/structures/handrail_vr.dm new file mode 100644 index 00000000000..340d8dedd3d --- /dev/null +++ b/code/game/objects/structures/handrail_vr.dm @@ -0,0 +1,8 @@ +/obj/structure/handrail + name = "handrail" + icon = 'icons/obj/handrail_vr.dmi' + icon_state = "handrail" + desc = "A safety railing with buckles to secure yourself to when floor isn't stable enough." + density = 0 + anchored = 1 + can_buckle = 1 diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index f563a380cb3..ff1826116a6 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -1,8 +1,8 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 #define MUSICIAN_HEARCHECK_MINDELAY 4 -#define INSTRUMENT_MAX_LINE_LENGTH 300 -#define INSTRUMENT_MAX_LINE_NUMBER 50 +#define INSTRUMENT_MAX_LINE_LENGTH 50 +#define INSTRUMENT_MAX_LINE_NUMBER 300 /datum/song var/name = "Untitled" diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index bf15ffdfd70..d655581c923 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -8,7 +8,7 @@ layer = MOB_LAYER plane = MOB_PLANE explosion_resistance = 5 - var/can_pass_lying = 1 + var/can_pass_lying = TRUE var/list/mobs_can_pass = list( /mob/living/bot, /mob/living/simple_mob/slime/xenobio, @@ -37,7 +37,7 @@ if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass return 0 - if(istype(A, /obj/vehicle)) //no vehicles + if(istype(A, /obj/vehicle) || istype (A, /obj/mecha)) //no vehicles return 0 var/mob/living/M = A @@ -66,4 +66,4 @@ name = "airtight plastic flaps" desc = "Heavy duty, airtight, plastic flaps. Have extra safety installed, preventing passage of living beings." can_atmos_pass = ATMOS_PASS_NO - can_pass_lying = 0 \ No newline at end of file + can_pass_lying = FALSE \ No newline at end of file diff --git a/code/game/objects/structures/props/blackbox.dm b/code/game/objects/structures/props/blackbox.dm index b6bae732f8f..a28b82349f0 100644 --- a/code/game/objects/structures/props/blackbox.dm +++ b/code/game/objects/structures/props/blackbox.dm @@ -105,4 +105,28 @@ **16/FEB/2562**
Something chitters.
End of transcript. - "} \ No newline at end of file + "} + +/obj/structure/prop/blackbox/xenofrigate + catalogue_data = list(/datum/category_item/catalogue/information/blackbox/xenofrigate) + +/datum/category_item/catalogue/information/blackbox/xenofrigate + name = "Black Box Data - MBT-540" + desc = {" +
+ Begin Log + @$&@$& Human ##:##:##: Attention unidentified vessel, state your designation and intent.
+ !#@$&&^ Human ##:##:##: Commander I don't think they're going to stop.
+ @$&@$& Human ##:##:##: Unidentified vessel, you have until the count of three before we engage weapon-
+ !#@$&&^ Human ##:##:##: Commander! Think about what you're-
+ A repeating clicking, before silence.
+ End of first log.
+ **
+ Begin Log
+ #!#^@$& Skrell ##:##:##: Director, I think you should see this.
+ ^@$& Skrell ##:##:##: Yes? What is it?
+ #!#^@$& Skrell ##:##:##: Another one of those ships has appeared near th-462$^ ---n colonies. I would strongly advise pursuing it.
+ ^@$& Skrell ##:##:##: A wise decision. If it is damaged like the last one, we may be able to finally see what is - What?
+ A repeating ping, before silence.
+ End of second log. + "} diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index 431ef0cdbb0..60b94841eac 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -196,7 +196,7 @@ /obj/structure/simple_door/process() if(!material.radioactivity) return - radiation_repository.radiate(src, round(material.radioactivity/3)) + SSradiation.radiate(src, round(material.radioactivity/3)) /obj/structure/simple_door/iron/New(var/newloc,var/material_name) ..(newloc, "iron") diff --git a/code/game/objects/structures/stasis_cage.dm b/code/game/objects/structures/stasis_cage.dm index 560f64251ee..f4791f37f21 100644 --- a/code/game/objects/structures/stasis_cage.dm +++ b/code/game/objects/structures/stasis_cage.dm @@ -1,7 +1,7 @@ /obj/structure/stasis_cage name = "stasis cage" desc = "A high-tech animal cage, designed to keep contained fauna docile and safe." - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit icon_state = "critteropen" density = 1 @@ -64,4 +64,4 @@ usr.visible_message("[usr] has stuffed \the [src] into \the [over_object].", "You have stuffed \the [src] into \the [over_object].") over_object.contain(src) else - return ..() \ No newline at end of file + return ..() diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs_vr.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs_vr.dm new file mode 100644 index 00000000000..e82ef467bb0 --- /dev/null +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs_vr.dm @@ -0,0 +1,20 @@ +/obj/structure/bed/chair/sofa + name = "sofa" + desc = "A padded, comfy sofa. Great for lazing on." + base_icon = "sofamiddle" + +/obj/structure/bed/chair/sofa/left + base_icon = "sofaend_left" + +/obj/structure/bed/chair/sofa/right + base_icon = "sofaend_right" + +/obj/structure/bed/chair/sofa/corner + base_icon = "sofacorner" + +/obj/structure/bed/chair/sofa/corner/update_layer() + if(src.dir == NORTH || src.dir == WEST) + plane = MOB_PLANE + layer = MOB_LAYER + 0.1 + else + reset_plane_and_layer() \ No newline at end of file diff --git a/code/game/sound.dm b/code/game/sound.dm index b1f0c32f66c..cd3b140bd9f 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -137,6 +137,46 @@ if ("button") soundin = pick('sound/machines/button1.ogg','sound/machines/button2.ogg','sound/machines/button3.ogg','sound/machines/button4.ogg') if ("switch") soundin = pick('sound/machines/switch1.ogg','sound/machines/switch2.ogg','sound/machines/switch3.ogg','sound/machines/switch4.ogg') if ("casing_sound") soundin = pick('sound/weapons/casingfall1.ogg','sound/weapons/casingfall2.ogg','sound/weapons/casingfall3.ogg') + //VORESTATION EDIT - vore sounds for better performance + if ("hunger_sounds") soundin = pick('sound/vore/growl1.ogg','sound/vore/growl2.ogg','sound/vore/growl3.ogg','sound/vore/growl4.ogg','sound/vore/growl5.ogg') + + if("classic_digestion_sounds") soundin = pick( + 'sound/vore/digest1.ogg','sound/vore/digest2.ogg','sound/vore/digest3.ogg','sound/vore/digest4.ogg', + 'sound/vore/digest5.ogg','sound/vore/digest6.ogg','sound/vore/digest7.ogg','sound/vore/digest8.ogg', + 'sound/vore/digest9.ogg','sound/vore/digest10.ogg','sound/vore/digest11.ogg','sound/vore/digest12.ogg') + if("classic_death_sounds") soundin = pick( + 'sound/vore/death1.ogg','sound/vore/death2.ogg','sound/vore/death3.ogg','sound/vore/death4.ogg','sound/vore/death5.ogg', + 'sound/vore/death6.ogg','sound/vore/death7.ogg','sound/vore/death8.ogg','sound/vore/death9.ogg','sound/vore/death10.ogg') + if("classic_struggle_sounds") soundin = pick('sound/vore/squish1.ogg','sound/vore/squish2.ogg','sound/vore/squish3.ogg','sound/vore/squish4.ogg') + + if("fancy_prey_struggle") soundin = pick( + 'sound/vore/sunesound/prey/struggle_01.ogg','sound/vore/sunesound/prey/struggle_02.ogg','sound/vore/sunesound/prey/struggle_03.ogg', + 'sound/vore/sunesound/prey/struggle_04.ogg','sound/vore/sunesound/prey/struggle_05.ogg') + if("fancy_digest_pred") soundin = pick( + 'sound/vore/sunesound/pred/digest_01.ogg','sound/vore/sunesound/pred/digest_02.ogg','sound/vore/sunesound/pred/digest_03.ogg', + 'sound/vore/sunesound/pred/digest_04.ogg','sound/vore/sunesound/pred/digest_05.ogg','sound/vore/sunesound/pred/digest_06.ogg', + 'sound/vore/sunesound/pred/digest_07.ogg','sound/vore/sunesound/pred/digest_08.ogg','sound/vore/sunesound/pred/digest_09.ogg', + 'sound/vore/sunesound/pred/digest_10.ogg','sound/vore/sunesound/pred/digest_11.ogg','sound/vore/sunesound/pred/digest_12.ogg', + 'sound/vore/sunesound/pred/digest_13.ogg','sound/vore/sunesound/pred/digest_14.ogg','sound/vore/sunesound/pred/digest_15.ogg', + 'sound/vore/sunesound/pred/digest_16.ogg','sound/vore/sunesound/pred/digest_17.ogg','sound/vore/sunesound/pred/digest_18.ogg') + if("fancy_death_pred") soundin = pick( + 'sound/vore/sunesound/pred/death_01.ogg','sound/vore/sunesound/pred/death_02.ogg','sound/vore/sunesound/pred/death_03.ogg', + 'sound/vore/sunesound/pred/death_04.ogg','sound/vore/sunesound/pred/death_05.ogg','sound/vore/sunesound/pred/death_06.ogg', + 'sound/vore/sunesound/pred/death_07.ogg','sound/vore/sunesound/pred/death_08.ogg','sound/vore/sunesound/pred/death_09.ogg', + 'sound/vore/sunesound/pred/death_10.ogg') + if("fancy_digest_prey") soundin = pick( + 'sound/vore/sunesound/prey/digest_01.ogg','sound/vore/sunesound/prey/digest_02.ogg','sound/vore/sunesound/prey/digest_03.ogg', + 'sound/vore/sunesound/prey/digest_04.ogg','sound/vore/sunesound/prey/digest_05.ogg','sound/vore/sunesound/prey/digest_06.ogg', + 'sound/vore/sunesound/prey/digest_07.ogg','sound/vore/sunesound/prey/digest_08.ogg','sound/vore/sunesound/prey/digest_09.ogg', + 'sound/vore/sunesound/prey/digest_10.ogg','sound/vore/sunesound/prey/digest_11.ogg','sound/vore/sunesound/prey/digest_12.ogg', + 'sound/vore/sunesound/prey/digest_13.ogg','sound/vore/sunesound/prey/digest_14.ogg','sound/vore/sunesound/prey/digest_15.ogg', + 'sound/vore/sunesound/prey/digest_16.ogg','sound/vore/sunesound/prey/digest_17.ogg','sound/vore/sunesound/prey/digest_18.ogg') + if("fancy_death_prey") soundin = pick( + 'sound/vore/sunesound/prey/death_01.ogg','sound/vore/sunesound/prey/death_02.ogg','sound/vore/sunesound/prey/death_03.ogg', + 'sound/vore/sunesound/prey/death_04.ogg','sound/vore/sunesound/prey/death_05.ogg','sound/vore/sunesound/prey/death_06.ogg', + 'sound/vore/sunesound/prey/death_07.ogg','sound/vore/sunesound/prey/death_08.ogg','sound/vore/sunesound/prey/death_09.ogg', + 'sound/vore/sunesound/prey/death_10.ogg') + //END VORESTATION EDIT return soundin //Are these even used? diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index f69d676ccd1..d6e36b30e29 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -469,8 +469,8 @@ var/list/floor_decals = list() /obj/effect/floor_decal/corner/grey/bordercorner icon_state = "bordercolorcorner" -/obj/effect/floor_decal/corner/grey/bordercorner - icon_state = "bordercolorcorner" +/obj/effect/floor_decal/corner/grey/bordercorner2 + icon_state = "bordercolorcorner2" /obj/effect/floor_decal/corner/grey/borderfull icon_state = "bordercolorfull" diff --git a/code/game/turfs/flooring/shuttle_vr.dm b/code/game/turfs/flooring/shuttle_vr.dm index 0b80dc72117..65b586b9317 100644 --- a/code/game/turfs/flooring/shuttle_vr.dm +++ b/code/game/turfs/flooring/shuttle_vr.dm @@ -13,3 +13,28 @@ oxygen = 0 nitrogen = 0 temperature = TCMB + +/turf/simulated/shuttle/floor/yellow/airless + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +/turf/simulated/shuttle/floor/purple/airless + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +/turf/simulated/shuttle/floor/red/airless + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +/turf/simulated/shuttle/floor/darkred/airless + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +/turf/simulated/shuttle/floor/black/airless + oxygen = 0 + nitrogen = 0 + temperature = TCMB diff --git a/code/game/turfs/simulated/outdoors/grass.dm b/code/game/turfs/simulated/outdoors/grass.dm index 72b2ee7e57a..e557fb16da0 100644 --- a/code/game/turfs/simulated/outdoors/grass.dm +++ b/code/game/turfs/simulated/outdoors/grass.dm @@ -33,7 +33,8 @@ var/list/grass_types = list( var/tree_chance = 2 grass_types = list( - /obj/structure/flora/sif/eyes + /obj/structure/flora/sif/eyes = 1, + /obj/structure/flora/sif/tendrils = 10 ) catalogue_data = list(/datum/category_item/catalogue/flora/sif_grass) @@ -50,7 +51,7 @@ var/list/grass_types = list( //edge_blending_priority++ if(grass_chance && prob(grass_chance) && !check_density()) - var/grass_type = pick(grass_types) + var/grass_type = pickweight(grass_types) new grass_type(src) . = ..() diff --git a/code/game/turfs/simulated/outdoors/snow.dm b/code/game/turfs/simulated/outdoors/snow.dm index 0f9be4ddbfd..cccc028fa30 100644 --- a/code/game/turfs/simulated/outdoors/snow.dm +++ b/code/game/turfs/simulated/outdoors/snow.dm @@ -58,3 +58,10 @@ to_chat(M, "You slide across the ice!") M.SetStunned(1) step(M,M.dir) + +// Ice that is used for, say, areas floating on water or similar. +/turf/simulated/floor/outdoors/shelfice + name = "ice" + icon_state = "ice" + desc = "Looks slippery." + movement_cost = 4 diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index bd6adfe32f4..676ad392f09 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -7,7 +7,7 @@ if(can_open == WALL_OPENING) return - radiation_repository.resistance_cache.Remove(src) + SSradiation.resistance_cache.Remove(src) if(density) can_open = WALL_OPENING @@ -93,8 +93,9 @@ if(..()) return 1 if(!can_open) - to_chat(user, "You push the wall, but nothing happens.") - playsound(src, 'sound/weapons/Genhit.ogg', 25, 1) + if(!material.wall_touch_special(src, user)) + to_chat(user, "You push the wall, but nothing happens.") + playsound(src, 'sound/weapons/Genhit.ogg', 25, 1) else toggle_open(user) return 0 diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm index b8a0980de41..f277ea79f56 100644 --- a/code/game/turfs/simulated/wall_icon.dm +++ b/code/game/turfs/simulated/wall_icon.dm @@ -26,7 +26,7 @@ else if(material.opacity < 0.5 && opacity) set_light(0) - radiation_repository.resistance_cache.Remove(src) + SSradiation.resistance_cache.Remove(src) update_connections(1) update_icon() diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm index 37bf0d75417..bff82d6e0e3 100644 --- a/code/game/turfs/simulated/wall_types.dm +++ b/code/game/turfs/simulated/wall_types.dm @@ -59,6 +59,9 @@ /turf/simulated/wall/snowbrick/New(var/newloc) ..(newloc,"packed snow") +/turf/simulated/wall/resin/New(var/newloc) + ..(newloc,"resin",null,"resin") + // Kind of wondering if this is going to bite me in the butt. /turf/simulated/wall/skipjack/New(var/newloc) ..(newloc,"alienalloy") diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 1847767083e..bf5f711b206 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -274,7 +274,7 @@ if(!total_radiation) return - radiation_repository.radiate(src, total_radiation) + SSradiation.radiate(src, total_radiation) return total_radiation /turf/simulated/wall/proc/burn(temperature) diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 8a0d7852f57..cb3496a96ba 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -28,7 +28,7 @@ if(N == /turf/space) var/turf/below = GetBelow(src) - if(istype(below) && (air_master.has_valid_zone(below) || air_master.has_valid_zone(src)) && !istype(below, /turf/unsimulated/wall)) // VOREStation Edit: Weird open space + if(istype(below) && (air_master.has_valid_zone(below) || air_master.has_valid_zone(src)) && (!istype(below, /turf/unsimulated/wall) && !istype(below, /turf/simulated/sky))) // VOREStation Edit: Weird open space N = /turf/simulated/open var/obj/fire/old_fire = fire diff --git a/code/game/turfs/unsimulated/planetary_vr.dm b/code/game/turfs/unsimulated/planetary_vr.dm new file mode 100644 index 00000000000..5cf174cf3d6 --- /dev/null +++ b/code/game/turfs/unsimulated/planetary_vr.dm @@ -0,0 +1,30 @@ +//Atmosphere properties +#define VIRGO3B_ONE_ATMOSPHERE 82.4 //kPa +#define VIRGO3B_AVG_TEMP 234 //kelvin + +#define VIRGO3B_PER_N2 0.16 //percent +#define VIRGO3B_PER_O2 0.00 +#define VIRGO3B_PER_N2O 0.00 //Currently no capacity to 'start' a turf with this. See turf.dm +#define VIRGO3B_PER_CO2 0.12 +#define VIRGO3B_PER_PHORON 0.72 + +//Math only beyond this point +#define VIRGO3B_MOL_PER_TURF (VIRGO3B_ONE_ATMOSPHERE*CELL_VOLUME/(VIRGO3B_AVG_TEMP*R_IDEAL_GAS_EQUATION)) +#define VIRGO3B_MOL_N2 (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_N2) +#define VIRGO3B_MOL_O2 (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_O2) +#define VIRGO3B_MOL_N2O (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_N2O) +#define VIRGO3B_MOL_CO2 (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_CO2) +#define VIRGO3B_MOL_PHORON (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_PHORON) + +//Turfmakers +#define VIRGO3B_SET_ATMOS nitrogen=VIRGO3B_MOL_N2;oxygen=VIRGO3B_MOL_O2;carbon_dioxide=VIRGO3B_MOL_CO2;phoron=VIRGO3B_MOL_PHORON;temperature=VIRGO3B_AVG_TEMP +#define VIRGO3B_TURF_CREATE(x) x/virgo3b/nitrogen=VIRGO3B_MOL_N2;x/virgo3b/oxygen=VIRGO3B_MOL_O2;x/virgo3b/carbon_dioxide=VIRGO3B_MOL_CO2;x/virgo3b/phoron=VIRGO3B_MOL_PHORON;x/virgo3b/temperature=VIRGO3B_AVG_TEMP;x/virgo3b/outdoors=TRUE;x/virgo3b/update_graphic(list/graphic_add = null, list/graphic_remove = null) return 0 +#define VIRGO3B_TURF_CREATE_UN(x) x/virgo3b/nitrogen=VIRGO3B_MOL_N2;x/virgo3b/oxygen=VIRGO3B_MOL_O2;x/virgo3b/carbon_dioxide=VIRGO3B_MOL_CO2;x/virgo3b/phoron=VIRGO3B_MOL_PHORON;x/virgo3b/temperature=VIRGO3B_AVG_TEMP + +// This is a wall you surround the area of your "planet" with, that makes the atmosphere inside stay within bounds, even if canisters +// are opened or other strange things occur. +/turf/unsimulated/wall/planetary/virgo3b + name = "facility wall" + desc = "An eight-meter tall carbyne wall. For when the wildlife on your planet is mostly militant megacorps." + alpha = 0xFF + VIRGO3B_SET_ATMOS diff --git a/code/game/turfs/unsimulated/sky_vr.dm b/code/game/turfs/unsimulated/sky_vr.dm index 8ba1cf0cb57..c71fa6470a7 100644 --- a/code/game/turfs/unsimulated/sky_vr.dm +++ b/code/game/turfs/unsimulated/sky_vr.dm @@ -1,67 +1,73 @@ -/////////////////// -// Generic skyfall turf -// Really only works well if the map doesn't have 'indoor' areas otherwise they can fall into one. -// TODO: Fix that. -/turf/unsimulated/floor/sky - name = "the sky" - desc = "It's the sky! Be careful!" - icon = 'icons/turf/floors.dmi' - icon_state = "sky_slow" - dir = SOUTH - initialized = FALSE - var/does_skyfall = TRUE - var/list/skyfall_levels - -/turf/unsimulated/floor/sky/Initialize() - . = ..() - if(does_skyfall && !LAZYLEN(skyfall_levels)) - error("[x],[y],[z], [get_area(src)] doesn't have skyfall_levels defined! Can't skyfall!") - if(locate(/turf/simulated) in orange(src,1)) - set_light(2, 2, color) - -/turf/unsimulated/floor/sky/Entered(atom/movable/AM,atom/oldloc) - . = ..() - if(!does_skyfall) - return //We don't do that - if(isobserver(AM)) - return //Don't ghostport, very annoying - if(AM.throwing) - return //Being thrown over, not fallen yet - - var/mob/living/L - if(isliving(AM)) - L = AM - if(L.is_floating) - return //Flyers/nograv can ignore it - - do_fall(AM) - -/turf/unsimulated/floor/sky/hitby(var/atom/movable/AM, var/speed) - . = ..() - - if(!does_skyfall) - return //We don't do that - - do_fall(AM) - -/turf/unsimulated/floor/sky/proc/do_fall(atom/movable/AM) - //Bye - var/attempts = 100 - var/turf/simulated/T - while(attempts && !T) - var/turf/simulated/candidate = locate(rand(5,world.maxx-5),rand(5,world.maxy-5),pick(skyfall_levels)) - if(candidate.density) - attempts-- - continue - - T = candidate - break - - if(!T) - return - - AM.forceMove(T) - if(isliving(AM)) - var/mob/living/L = AM - message_admins("\The [AM] fell out of the sky.") - L.fall_impact(T, 42, 90, FALSE, TRUE) //You will not be defibbed from this. +/////////////////// +// Generic skyfall turf +// Really only works well if the map doesn't have 'indoor' areas otherwise they can fall into one. +// TODO: Fix that. +/turf/unsimulated/floor/sky + name = "the sky" + desc = "It's the sky! Be careful!" + icon = 'icons/turf/floors.dmi' + icon_state = "sky_slow" + dir = SOUTH + initialized = FALSE + var/does_skyfall = TRUE + var/list/skyfall_levels + +/turf/unsimulated/floor/sky/Initialize() + . = ..() + if(does_skyfall && !LAZYLEN(skyfall_levels)) + error("[x],[y],[z], [get_area(src)] doesn't have skyfall_levels defined! Can't skyfall!") + if(locate(/turf/simulated) in orange(src,1)) + set_light(2, 2, color) + +/turf/unsimulated/floor/sky/Entered(atom/movable/AM,atom/oldloc) + . = ..() + if(!does_skyfall) + return //We don't do that + if(isobserver(AM)) + return //Don't ghostport, very annoying + if(AM.throwing) + return //Being thrown over, not fallen yet + if(!(AM.can_fall())) + return // Phased shifted kin should not fall + if(istype(AM, /obj/item/projectile)) + return // pewpew should not fall out of the sky. pew. + if(istype(AM, /obj/effect/projectile)) + return // ...neither should the effects be falling + + var/mob/living/L + if(isliving(AM)) + L = AM + if(L.is_floating) + return //Flyers/nograv can ignore it + + do_fall(AM) + +/turf/unsimulated/floor/sky/hitby(var/atom/movable/AM, var/speed) + . = ..() + + if(!does_skyfall) + return //We don't do that + + do_fall(AM) + +/turf/unsimulated/floor/sky/proc/do_fall(atom/movable/AM) + //Bye + var/attempts = 100 + var/turf/simulated/T + while(attempts && !T) + var/turf/simulated/candidate = locate(rand(5,world.maxx-5),rand(5,world.maxy-5),pick(skyfall_levels)) + if(candidate.density) + attempts-- + continue + + T = candidate + break + + if(!T) + return + + AM.forceMove(T) + if(isliving(AM)) + var/mob/living/L = AM + message_admins("\The [AM] fell out of the sky.") + L.fall_impact(T, 42, 90, FALSE, TRUE) //You will not be defibbed from this. diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm index 12d4d3fadc3..6f13cdb54b4 100644 --- a/code/game/turfs/unsimulated/walls.dm +++ b/code/game/turfs/unsimulated/walls.dm @@ -4,6 +4,7 @@ icon_state = "riveted" opacity = 1 density = 1 + blocks_air = TRUE /turf/unsimulated/wall/fakeglass name = "window" diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 0c6fa0fed7f..b75de6685e6 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -9,28 +9,28 @@ if(!mob) return if(IsGuestKey(key)) - src << "Guests may not use OOC." + to_chat(src, "Guests may not use OOC.") return msg = sanitize(msg) if(!msg) return if(!is_preference_enabled(/datum/client_preference/show_ooc)) - src << "You have OOC muted." + to_chat(src, "You have OOC muted.") return if(!holder) if(!config.ooc_allowed) - src << "OOC is globally muted." + to_chat(src, "OOC is globally muted.") return if(!config.dooc_allowed && (mob.stat == DEAD)) usr << "OOC for dead mobs has been turned off." return if(prefs.muted & MUTE_OOC) - src << "You cannot use OOC (muted)." + to_chat(src, "You cannot use OOC (muted).") return if(findtext(msg, "byond://")) - src << "Advertising other servers is not allowed." + to_chat(src, "Advertising other servers is not allowed.") log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return @@ -86,7 +86,7 @@ return if(IsGuestKey(key)) - src << "Guests may not use OOC." + to_chat(src, "Guests may not use OOC.") return msg = sanitize(msg) @@ -94,21 +94,21 @@ return if(!is_preference_enabled(/datum/client_preference/show_looc)) - src << "You have LOOC muted." + to_chat(src, "You have LOOC muted.") return if(!holder) if(!config.looc_allowed) - src << "LOOC is globally muted." + to_chat(src, "LOOC is globally muted.") return if(!config.dooc_allowed && (mob.stat == DEAD)) usr << "OOC for dead mobs has been turned off." return if(prefs.muted & MUTE_OOC) - src << "You cannot use OOC (muted)." + to_chat(src, "You cannot use OOC (muted).") return if(findtext(msg, "byond://")) - src << "Advertising other servers is not allowed." + to_chat(src, "Advertising other servers is not allowed.") log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 4a40ea97cb1..5a6bfefdb47 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -4,27 +4,27 @@ set hidden = 1 if (stat == DEAD) - src << "You're already dead!" + to_chat(src, "You're already dead!") return if (!ticker) - src << "You can't commit suicide before the game starts!" + to_chat(src, "You can't commit suicide before the game starts!") return if(!player_is_antag(mind)) message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1) - src << "No. Adminhelp if there is a legitimate reason." + to_chat(src, "No. Adminhelp if there is a legitimate reason.") return if (suiciding) - src << "You're already committing suicide! Be patient!" + to_chat(src, "You're already committing suicide! Be patient!") return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") if(confirm == "Yes") if(!canmove || restrained()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide - src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))" + to_chat(src, "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))") return suiciding = 15 does_not_breathe = 0 //Prevents ling-suicide zombies, or something @@ -92,15 +92,15 @@ set hidden = 1 if (stat == 2) - src << "You're already dead!" + to_chat(src, "You're already dead!") return if (!ticker) - src << "You can't commit suicide before the game starts!" + to_chat(src, "You can't commit suicide before the game starts!") return if (suiciding) - src << "You're already committing suicide! Be patient!" + to_chat(src, "You're already committing suicide! Be patient!") return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") @@ -116,11 +116,11 @@ set hidden = 1 if (stat == 2) - src << "You're already dead!" + to_chat(src, "You're already dead!") return if (suiciding) - src << "You're already committing suicide! Be patient!" + to_chat(src, "You're already committing suicide! Be patient!") return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") @@ -136,11 +136,11 @@ set hidden = 1 if (stat == 2) - src << "You're already dead!" + to_chat(src, "You're already dead!") return if (suiciding) - src << "You're already committing suicide! Be patient!" + to_chat(src, "You're already committing suicide! Be patient!") return var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") @@ -165,4 +165,4 @@ M.show_message("[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "[src] bleeps electronically.", 2) death(0) else - src << "Aborting suicide attempt." + to_chat(src, "Aborting suicide attempt.") diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index c030e25649f..a8100038a82 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -171,7 +171,7 @@ num_event_managers_online++ if(config.admin_irc) - src << "Adminhelps are also sent to IRC. If no admins are available in game try anyway and an admin on IRC may see it and respond." + to_chat(src, "Adminhelps are also sent to IRC. If no admins are available in game try anyway and an admin on IRC may see it and respond.") msg = "Current Admins ([num_admins_online]):\n" + msg if(config.show_mods) diff --git a/code/global.dm b/code/global.dm index a1ecb08cff5..e9bcbb49f49 100644 --- a/code/global.dm +++ b/code/global.dm @@ -53,7 +53,7 @@ var/list/lastsignalers = list() // Keeps last 100 signals here in format: "[src] var/list/lawchanges = list() // Stores who uploaded laws to which silicon-based lifeform, and what the law was. var/list/reg_dna = list() -var/mouse_respawn_time = 5 // Amount of time that must pass between a player dying as a mouse and repawning as a mouse. In minutes. +var/mouse_respawn_time = 2.5 // Amount of time that must pass between a player dying as a mouse and repawning as a mouse. In minutes. Vorestation Edit - Changed to 2.5 minutes, half of 5, in accordance with mouse nerfs and realignment. var/list/monkeystart = list() var/list/wizardstart = list() diff --git a/code/global_vr.dm b/code/global_vr.dm index 9506dd62d35..0f3212ff7aa 100644 --- a/code/global_vr.dm +++ b/code/global_vr.dm @@ -6,6 +6,12 @@ robot_module_types += "Pupdozer" return 1 +var/list/shell_module_types = list( + "Standard", "Service", "Clerical" +) + +var/list/eventdestinations = list() // List of scatter landmarks for VOREStation event portals + var/global/list/acceptable_fruit_types= list( "ambrosia", "apple", @@ -13,22 +19,35 @@ var/global/list/acceptable_fruit_types= list( "berries", "cabbage", "carrot", + "celery", "cherry", "chili", + "cocoa", + "corn", + "durian", "eggplant", "grapes", "greengrapes", + "harebells", + "lavender", "lemon", + "lettuce", "lime", "onion", "orange", "peanut", + "poppies", "potato", "pumpkin", "rice", + "rose", + "rhubarb", "soybean", + "spineapple", "sugarcane", + "sunflowers", "tomato", + "vanilla", "watermelon", "wheat", "whitebeet") \ No newline at end of file diff --git a/code/modules/admin/ToRban.dm b/code/modules/admin/ToRban.dm index d127bfe6f41..f4ddd3e3f28 100644 --- a/code/modules/admin/ToRban.dm +++ b/code/modules/admin/ToRban.dm @@ -72,16 +72,16 @@ var/choice = input(src,"Please select an IP address to remove from the ToR banlist:","Remove ToR ban",null) as null|anything in F.dir if(choice) F.dir.Remove(choice) - src << "Address removed" + to_chat(src, "Address removed") if("remove all") - src << "[TORFILE] was [fdel(TORFILE)?"":"not "]removed." + to_chat(src, "[TORFILE] was [fdel(TORFILE)?"":"not "]removed.") if("find") var/input = input(src,"Please input an IP address to search for:","Find ToR ban",null) as null|text if(input) if(ToRban_isbanned(input)) - src << "Address is a known ToR address" + to_chat(src, "Address is a known ToR address") else - src << "Address is not a known ToR address" + to_chat(src, "Address is not a known ToR address") return #undef TORFILE diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 8daa899692c..671520fbf89 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1305,7 +1305,7 @@ var/datum/announcement/minor/admin_min_announcer = new set desc = "Should fix any mob sprite update errors." if (!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return if(istype(H)) diff --git a/code/modules/admin/admin_attack_log.dm b/code/modules/admin/admin_attack_log.dm index f04bdf3b618..c1f5c67464b 100644 --- a/code/modules/admin/admin_attack_log.dm +++ b/code/modules/admin/admin_attack_log.dm @@ -1,6 +1,7 @@ /mob/var/lastattacker = null /mob/var/lastattacked = null /mob/var/attack_log = list( ) +/mob/var/dialogue_log = list( ) proc/log_and_message_admins(var/message as text, var/mob/user = usr) log_admin(user ? "[key_name(user)] [message]" : "EVENT [message]") diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 1c90383f40a..12a84346b33 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -34,7 +34,7 @@ if("singulo", "telesci") //general one-round-only stuff var/F = investigate_subject2file(subject) if(!F) - src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." + to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.") return src << browse(F,"window=investigate[subject];size=800x300") @@ -43,8 +43,8 @@ if(href_logfile) src << browse(href_logfile,"window=investigate[subject];size=800x300") else - src << "Error: admin_investigate: No href logfile found." + to_chat(src, "Error: admin_investigate: No href logfile found.") return else - src << "Error: admin_investigate: Href Logging is not on." + to_chat(src, "Error: admin_investigate: Href Logging is not on.") return diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm index 4bcaf10d9c7..24ecba7c011 100644 --- a/code/modules/admin/admin_memo.dm +++ b/code/modules/admin/admin_memo.dm @@ -22,7 +22,7 @@ return if("") F.dir.Remove(ckey) - src << "Memo removed" + to_chat(src, "Memo removed") return if( findtext(memo,"Admin Memo by [F[ckey]]" + to_chat(src, "
Admin Memo by [F[ckey]]
") //delete your own or somebody else's memo /client/proc/admin_memo_delete() @@ -48,7 +48,7 @@ ckey = src.ckey if(ckey) F.dir.Remove(ckey) - src << "Removed Memo created by [ckey]." + to_chat(src, "Removed Memo created by [ckey].") #undef MEMOFILE #undef ENABLE_MEMOS \ No newline at end of file diff --git a/code/modules/admin/admin_report.dm b/code/modules/admin/admin_report.dm index c5cff737ee1..40a96cb1004 100644 --- a/code/modules/admin/admin_report.dm +++ b/code/modules/admin/admin_report.dm @@ -149,7 +149,8 @@ client/proc/mark_report_done(ID as num) for(var/datum/admin_report/N in reports) if(N.ID == ID) found = N - if(!found) src << "* An error occured, sorry." + if(!found) + to_chat(src, "* An error occured, sorry.") found.done = 1 @@ -158,7 +159,7 @@ client/proc/mark_report_done(ID as num) client/proc/edit_report(ID as num) if(!src.holder || src.holder.level < 0) - src << "You tried to modify the news, but you're not an admin!" + to_chat(src, "You tried to modify the news, but you're not an admin!") return var/savefile/Reports = new("data/reports.sav") @@ -170,7 +171,8 @@ client/proc/edit_report(ID as num) for(var/datum/admin_report/N in reports) if(N.ID == ID) found = N - if(!found) src << "* An error occured, sorry." + if(!found) + to_chat(src, "* An error occured, sorry.") var/body = input(src.mob, "Enter a body for the news", "Body") as null|message if(!body) return diff --git a/code/modules/admin/admin_tools.dm b/code/modules/admin/admin_tools.dm new file mode 100644 index 00000000000..376aa2da44b --- /dev/null +++ b/code/modules/admin/admin_tools.dm @@ -0,0 +1,62 @@ +/client/proc/cmd_admin_check_player_logs(mob/living/M as mob in mob_list) + set category = "Admin" + set name = "Check Player Attack Logs" + set desc = "Check a player's attack logs." + +//Views specific attack logs belonging to one player. + var/dat = "[M]'s Attack Log:
" + dat += "Viewing attack logs of [M] - (Played by ([key_name(M)]).
" + if(M.mind) + dat += "Current Antag?: [(M.mind.special_role)?"Yes":"No"]
" + dat += "
Note: This is arranged from earliest to latest.

" + + + if(!isemptylist(M.attack_log)) + dat += "
" + for(var/l in M.attack_log) + dat += "[l]
" + + dat += "
" + + else + dat += "No attack logs found for [M]." + + var/datum/browser/popup = new(usr, "admin_attack_log", "[src]", 650, 650, src) + popup.set_content(jointext(dat,null)) + popup.open() + + onclose(usr, "admin_attack_log") + + feedback_add_details("admin_verb","PL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_check_dialogue_logs(mob/living/M as mob in mob_list) + set category = "Admin" + set name = "Check Player Dialogue Logs" + set desc = "Check a player's dialogue logs." + +//Views specific dialogue logs belonging to one player. + var/dat = "[M]'s Dialogue Log:
" + dat += "Viewing say and emote logs of [M] - (Played by ([key_name(M)]).
" + if(M.mind) + dat += "Current Antag?: [(M.mind.special_role)?"Yes":"No"]
" + dat += "
Note: This is arranged from earliest to latest.

" + + if(!isemptylist(M.dialogue_log)) + dat += "
" + + for(var/d in M.dialogue_log) + dat += "[d]
" + + dat += "
" + else + dat += "No dialogue logs found for [M]." + var/datum/browser/popup = new(usr, "admin_dialogue_log", "[src]", 650, 650, src) + popup.set_content(jointext(dat,null)) + popup.open() + + onclose(usr, "admin_dialogue_log") + + + feedback_add_details("admin_verb","PDL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 4bad67b3703..cb111adc9c9 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -38,6 +38,8 @@ var/list/admin_verbs_admin = list( /client/proc/cmd_admin_subtle_message, //send an message to somebody as a 'voice in their head', /client/proc/cmd_admin_delete, //delete an instance/object/mob/etc, /client/proc/cmd_admin_check_contents, //displays the contents of an instance, + /client/proc/cmd_admin_check_player_logs, //checks a player's attack logs, + /client/proc/cmd_admin_check_dialogue_logs, //checks a player's dialogue logs, /datum/admins/proc/access_news_network, //allows access of newscasters, /client/proc/giveruntimelog, //allows us to give access to runtime logs to somebody, /client/proc/getserverlog, //allows us to fetch server logs (diary) for other days, @@ -148,6 +150,7 @@ var/list/admin_verbs_spawn = list( /datum/admins/proc/spawn_plant, /datum/admins/proc/spawn_atom, //allows us to spawn instances, /client/proc/respawn_character, + /client/proc/spawn_character_mob, //VOREStation Add, /client/proc/virus2_editor, /client/proc/spawn_chemdisp_cartridge, /client/proc/map_template_load, @@ -266,6 +269,8 @@ var/list/admin_verbs_hideable = list( /datum/admins/proc/view_atk_log, /client/proc/cmd_admin_subtle_message, /client/proc/cmd_admin_check_contents, + /client/proc/cmd_admin_check_player_logs, + /client/proc/cmd_admin_check_dialogue_logs, /datum/admins/proc/access_news_network, /client/proc/admin_call_shuttle, /client/proc/admin_cancel_shuttle, @@ -446,7 +451,7 @@ var/list/admin_verbs_event_manager = list( verbs.Remove(/client/proc/hide_most_verbs, admin_verbs_hideable) verbs += /client/proc/show_verbs - src << "Most of your adminverbs have been hidden." + to_chat(src, "Most of your adminverbs have been hidden.") feedback_add_details("admin_verb","HMV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -457,7 +462,7 @@ var/list/admin_verbs_event_manager = list( remove_admin_verbs() verbs += /client/proc/show_verbs - src << "Almost all of your adminverbs have been hidden." + to_chat(src, "Almost all of your adminverbs have been hidden.") feedback_add_details("admin_verb","TAVVH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -468,7 +473,7 @@ var/list/admin_verbs_event_manager = list( verbs -= /client/proc/show_verbs add_admin_verbs() - src << "All of your adminverbs are now visible." + to_chat(src, "All of your adminverbs are now visible.") feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -488,7 +493,7 @@ var/list/admin_verbs_event_manager = list( feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! else if(istype(mob,/mob/new_player)) - src << "Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first." + to_chat(src, "Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first.") else //ghostize var/mob/body = mob @@ -650,7 +655,7 @@ var/list/admin_verbs_event_manager = list( else D = preferences_datums[warned_ckey] if(!D) - src << "Error: warn(): No such ckey found." + to_chat(src, "Error: warn(): No such ckey found.") return if(++D.warns >= MAX_WARNS) //uh ohhhh...you'reee iiiiin trouuuubble O:) @@ -813,7 +818,7 @@ var/list/admin_verbs_event_manager = list( deadmin_holder.reassociate() log_admin("[src] re-admined themself.") message_admins("[src] re-admined themself.", 1) - src << "You now have the keys to control the planet, or atleast a small space station" + to_chat(src, "You now have the keys to control the planet, or atleast a small space station") verbs -= /client/proc/readmin_self /client/proc/deadmin_self() @@ -825,7 +830,7 @@ var/list/admin_verbs_event_manager = list( log_admin("[src] deadmined themself.") message_admins("[src] deadmined themself.", 1) deadmin() - src << "You are now a normal player." + to_chat(src, "You are now a normal player.") verbs |= /client/proc/readmin_self feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -836,10 +841,10 @@ var/list/admin_verbs_event_manager = list( if(config) if(config.log_hrefs) config.log_hrefs = 0 - src << "Stopped logging hrefs" + to_chat(src, "Stopped logging hrefs") else config.log_hrefs = 1 - src << "Started logging hrefs" + to_chat(src, "Started logging hrefs") /client/proc/check_ai_laws() set name = "Check AI Laws" @@ -1034,11 +1039,11 @@ var/list/admin_verbs_event_manager = list( if(config) if(config.cult_ghostwriter) config.cult_ghostwriter = 0 - src << "Disallowed ghost writers." + to_chat(src, "Disallowed ghost writers.") message_admins("Admin [key_name_admin(usr)] has disabled ghost writers.", 1) else config.cult_ghostwriter = 1 - src << "Enabled ghost writers." + to_chat(src, "Enabled ghost writers.") message_admins("Admin [key_name_admin(usr)] has enabled ghost writers.", 1) /client/proc/toggledrones() @@ -1048,11 +1053,11 @@ var/list/admin_verbs_event_manager = list( if(config) if(config.allow_drone_spawn) config.allow_drone_spawn = 0 - src << "Disallowed maint drones." + to_chat(src, "Disallowed maint drones.") message_admins("Admin [key_name_admin(usr)] has disabled maint drones.", 1) else config.allow_drone_spawn = 1 - src << "Enabled maint drones." + to_chat(src, "Enabled maint drones.") message_admins("Admin [key_name_admin(usr)] has enabled maint drones.", 1) /client/proc/man_up(mob/T as mob in mob_list) diff --git a/code/modules/admin/secrets/admin_secrets/admin_logs.dm b/code/modules/admin/secrets/admin_secrets/admin_logs.dm index d2664f1e2be..b578eb046ff 100644 --- a/code/modules/admin/secrets/admin_secrets/admin_logs.dm +++ b/code/modules/admin/secrets/admin_secrets/admin_logs.dm @@ -10,4 +10,35 @@ dat += "
  • [l]
  • " if(!admin_log.len) dat += "No-one has done anything this round!" - user << browse(dat, "window=admin_log") + + var/datum/browser/popup = new(user, "adminlogs", "[src]", 550, 650, src) + popup.set_content(jointext(dat,null)) + popup.open() + + onclose(user, "adminlogs") + + +/datum/admin_secret_item/admin_secret/round_logs + name = "Round Dialogue Logs" + +/datum/admin_secret_item/admin_secret/round_logs/execute(var/mob/user) + . = ..() + if(!.) + return + var/dat = "Dialogue Log
    " + + dat += "
    " + + for(var/l in GLOB.round_text_log) + dat += "
  • [l]
  • " + + dat += "
    " + + if(!GLOB.round_text_log) + dat += "No-one has said anything this round! (How odd?)" + + var/datum/browser/popup = new(user, "dialoguelogs", "[src]", 550, 650, src) + popup.set_content(jointext(dat,null)) + popup.open() + + onclose(user, "dialoguelogs") diff --git a/code/modules/admin/secrets/admin_secrets/prison_warp.dm b/code/modules/admin/secrets/admin_secrets/prison_warp.dm index d0d41cea5d5..6f0732e781a 100644 --- a/code/modules/admin/secrets/admin_secrets/prison_warp.dm +++ b/code/modules/admin/secrets/admin_secrets/prison_warp.dm @@ -30,7 +30,7 @@ H.drop_from_inventory(W) //teleport person to cell H.loc = pick(prisonwarp) - H.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/under/color/prison(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes) else //teleport security person diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index fb680f74abc..8a3022f989a 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1057,7 +1057,7 @@ M.loc = prison_cell if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/prisoner = M - prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(prisoner), slot_w_uniform) + prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/prison(prisoner), slot_w_uniform) prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes) M << "You have been sent to the prison station!" @@ -1896,7 +1896,7 @@ else if(href_list["cryoplayer"]) if(!check_rights(R_ADMIN)) return - var/mob/M = locate(href_list["cryoplayer"]) + var/mob/living/carbon/M = locate(href_list["cryoplayer"]) //VOREStation edit from just an all mob check to mob/living/carbon if(!istype(M)) to_chat(usr,"Mob doesn't exist!") return diff --git a/code/modules/admin/verbs/adminhelp_vr.dm b/code/modules/admin/verbs/adminhelp_vr.dm index 8d27022ae46..f2df8e4eb29 100644 --- a/code/modules/admin/verbs/adminhelp_vr.dm +++ b/code/modules/admin/verbs/adminhelp_vr.dm @@ -18,6 +18,7 @@ /client/verb/adminspice() set category = "Admin" set name = "Request Spice" + set desc = "Request admins to spice round up for you" //handle muting and automuting if(prefs.muted & MUTE_ADMINHELP) @@ -26,6 +27,7 @@ if(alert(usr, "Are you sure you want to request the admins spice things up for you? You accept the consequences if you do.",,"No","Yes") != "No") message_admins("[ADMIN_FULLMONTY(usr)] has requested the round be spiced up a little.") + to_chat(usr, "You have requested some more spice in your round.") else to_chat(usr, "Spice request cancelled.") return diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 56af4e7e15d..642aa456cb7 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -91,7 +91,7 @@ keys += M.client var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys) if(!selection) - src << "No keys found." + to_chat(src, "No keys found.") return var/mob/M = selection:mob log_admin("[key_name(usr)] jumped to [key_name(M)]") diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index 083789e550f..cc77c43cd00 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -3,7 +3,7 @@ set name = "Check Piping" set background = 1 if(!src.holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return feedback_add_details("admin_verb","CP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -44,7 +44,7 @@ set category = "Mapping" set name = "Check Power" if(!src.holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return feedback_add_details("admin_verb","CPOW") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/custom_event.dm b/code/modules/admin/verbs/custom_event.dm index 35931f8e545..987eb89c29a 100644 --- a/code/modules/admin/verbs/custom_event.dm +++ b/code/modules/admin/verbs/custom_event.dm @@ -4,7 +4,7 @@ set name = "Change Custom Event" if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return var/input = sanitize(input(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", custom_event_msg) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0) @@ -30,11 +30,11 @@ set name = "Custom Event Info" if(!custom_event_msg || custom_event_msg == "") - src << "There currently is no known custom event taking place." - src << "Keep in mind: it is possible that an admin has not properly set this." + to_chat(src, "There currently is no known custom event taking place.") + to_chat(src, "Keep in mind: it is possible that an admin has not properly set this.") return - src << "

    Custom Event

    " - src << "

    A custom event is taking place. OOC Info:

    " - src << "[custom_event_msg]" - src << "
    " + to_chat(src, "

    Custom Event

    ") + to_chat(src, "

    A custom event is taking place. OOC Info:

    ") + to_chat(src, "[custom_event_msg]") + to_chat(src, "
    ") diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 08eda6bb346..6099fd5e299 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -3,16 +3,16 @@ set name = "Dsay" //Gave this shit a shorter name so you only have to time out "dsay" rather than "dead say" to use it --NeoFite set hidden = 1 if(!src.holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return if(!src.mob) return if(prefs.muted & MUTE_DEADCHAT) - src << "You cannot send DSAY messages (muted)." + to_chat(src, "You cannot send DSAY messages (muted).") return if(!is_preference_enabled(/datum/client_preference/show_dsay)) - src << "You have deadchat muted." + to_chat(src, "You have deadchat muted.") return var/stafftype = uppertext(holder.rank) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 321655bb15a..6a9405fef63 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -282,11 +282,11 @@ var/obj/item/device/pda/pda = H.wear_id id = pda.id id.icon_state = "gold" - id.access = get_all_accesses() + id.access = get_all_accesses().Copy() else var/obj/item/weapon/card/id/id = new/obj/item/weapon/card/id(M); id.icon_state = "gold" - id.access = get_all_accesses() + id.access = get_all_accesses().Copy() id.registered_name = H.real_name id.assignment = "Colony Director" id.name = "[id.registered_name]'s ID Card ([id.assignment])" @@ -562,7 +562,7 @@ SMES.output_level = 75000 if(!found_the_pump && response == "Setup Completely") - src << "Unable to locate air supply to fill up with coolant, adding some coolant around the supermatter" + to_chat(src, "Unable to locate air supply to fill up with coolant, adding some coolant around the supermatter") var/turf/simulated/T = SM.loc T.zone.air.gas["nitrogen"] += 450 T.zone.air.temperature = 50 diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 9fdf39c0d1d..5199f8455f0 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -124,7 +124,7 @@ set category = "Debug" /* if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return if(!air_master) @@ -146,7 +146,7 @@ set category = "Debug" /* if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return if(!air_master) diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index 9e9ad670273..7215c8dd320 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -24,12 +24,12 @@ set category = null if(!src.holder) - src << "Only Admins may use this command." + to_chat(src, "Only Admins may use this command.") return var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in GLOB.clients if(!istype(target,/client)) - src << "Error: giveruntimelog(): Client not found." + to_chat(src, "Error: giveruntimelog(): Client not found.") return target.verbs |= /client/proc/getruntimelog @@ -53,7 +53,7 @@ message_admins("[key_name_admin(src)] accessed file: [path]") src << run( file(path) ) - src << "Attempting to send file, this may take a fair few minutes if the file is very large." + to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.") return @@ -73,7 +73,7 @@ message_admins("[key_name_admin(src)] accessed file: [path]") src << run( file(path) ) - src << "Attempting to send file, this may take a fair few minutes if the file is very large." + to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.") return @@ -89,7 +89,7 @@ if( fexists(path) ) src << run( file(path) ) else - src << "Error: view_txt_log(): File not found/Invalid path([path])." + to_chat(src, "Error: view_txt_log(): File not found/Invalid path([path]).") return feedback_add_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return @@ -107,7 +107,7 @@ if( fexists(path) ) src << run( file(path) ) else - src << "Error: view_atk_log(): File not found/Invalid path([path])." + to_chat(src, "Error: view_atk_log(): File not found/Invalid path([path]).") return usr << run( file(path) ) feedback_add_details("admin_verb","SSAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/lightning_strike.dm b/code/modules/admin/verbs/lightning_strike.dm index 6adb122d4a0..1981e3f0d84 100644 --- a/code/modules/admin/verbs/lightning_strike.dm +++ b/code/modules/admin/verbs/lightning_strike.dm @@ -65,7 +65,8 @@ var/sound = get_sfx("thunder") for(var/mob/M in player_list) if((P && M.z in P.expected_z_levels) || M.z == T.z) - M.playsound_local(get_turf(M), soundin = sound, vol = 70, vary = FALSE, is_global = TRUE) + if(M.is_preference_enabled(/datum/client_preference/weather_sounds)) + M.playsound_local(get_turf(M), soundin = sound, vol = 70, vary = FALSE, is_global = TRUE) if(cosmetic) // Everything beyond here involves potentially damaging things. If we don't want to do that, stop now. return diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 3475e60314b..1a3fbfe76f5 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -2,7 +2,7 @@ set category = null set name = "Drop Everything" if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return var/confirm = alert(src, "Make [M] drop everything?", "Message", "Yes", "No") @@ -20,7 +20,7 @@ set category = "Admin" set name = "Prison" if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return if (ismob(M)) if(istype(M, /mob/living/silicon/ai)) @@ -35,7 +35,7 @@ M.loc = pick(prisonwarp) if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/prisoner = M - prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(prisoner), slot_w_uniform) + prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/prison(prisoner), slot_w_uniform) prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes) spawn(50) M << "You have been sent to the prison station!" @@ -48,7 +48,7 @@ set category = "Admin" set name = "Check new Players" if(!holder) - src << "Only staff members may use this command." + to_chat(src, "Only staff members may use this command.") var/age = alert(src, "Age check", "Show accounts yonger then _____ days","7", "30" , "All") @@ -70,12 +70,12 @@ msg += "[key_name(C, 1, 1, highlight_special_characters)]: account is [C.player_age] days old
    " if(missing_ages) - src << "Some accounts did not have proper ages set in their clients. This function requires database to be present." + to_chat(src, "Some accounts did not have proper ages set in their clients. This function requires database to be present.") if(msg != "") src << browse(msg, "window=Player_age_check") else - src << "No matches for that age range found." + to_chat(src, "No matches for that age range found.") /client/proc/cmd_admin_subtle_message(mob/M as mob in mob_list) set category = "Special Verbs" @@ -83,7 +83,7 @@ if(!ismob(M)) return if (!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return var/msg = sanitize(input("Message:", text("Subtle PM to [M.key]")) as text) @@ -106,7 +106,7 @@ set name = "Global Narrate" if (!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return var/msg = sanitize(input("Message:", text("Enter the text you wish to appear to everyone:")) as text) @@ -123,7 +123,7 @@ set name = "Direct Narrate" if(!holder) - src << "Only administrators and moderators may use this command." + to_chat(src, "Only administrators and moderators may use this command.") return if(!M) @@ -148,7 +148,7 @@ set category = "Special Verbs" set name = "Godmode" if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return M.status_flags ^= GODMODE usr << " Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]" @@ -216,7 +216,7 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) set category = "Fun" set name = "Add Random AI Law" if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No") if(confirm != "Yes") return @@ -248,7 +248,7 @@ Ccomp's first proc. any = 1 //if no ghosts show up, any will just be 0 if(!any) if(notify) - src << "There doesn't appear to be any ghosts for you to select." + to_chat(src, "There doesn't appear to be any ghosts for you to select.") return for(var/mob/M in mobs) @@ -265,12 +265,12 @@ Ccomp's first proc. set name = "Allow player to respawn" set desc = "Let's the player bypass the wait to respawn or allow them to re-enter their corpse." if(!holder) - src << "Only administrators and moderators may use this command." + to_chat(src, "Only administrators and moderators may use this command.") var/list/ghosts= get_ghosts(1,1) var/target = input("Please, select a ghost!", "COME BACK TO LIFE!", null, null) as null|anything in ghosts if(!target) - src << "Hrm, appears you didn't select a ghost" // Sanity check, if no ghosts in the list we don't want to edit a null variable and cause a runtime error. + to_chat(src, "Hrm, appears you didn't select a ghost") // Sanity check, if no ghosts in the list we don't want to edit a null variable and cause a runtime error. return var/mob/observer/dead/G = ghosts[target] @@ -295,7 +295,7 @@ Ccomp's first proc. set desc = "Toggles antagHUD usage for observers" if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") var/action="" if(config.antag_hud_allowed) for(var/mob/observer/dead/g in get_ghosts()) @@ -306,7 +306,7 @@ Ccomp's first proc. g.has_enabled_antagHUD = 2 // We'll allow them to respawn g << "The Administrator has disabled AntagHUD " config.antag_hud_allowed = 0 - src << "AntagHUD usage has been disabled" + to_chat(src, "AntagHUD usage has been disabled") action = "disabled" else for(var/mob/observer/dead/g in get_ghosts()) @@ -315,7 +315,7 @@ Ccomp's first proc. g << "The Administrator has enabled AntagHUD " // Notify all observers they can now use AntagHUD config.antag_hud_allowed = 1 action = "enabled" - src << "AntagHUD usage has been enabled" + to_chat(src, "AntagHUD usage has been enabled") log_admin("[key_name(usr)] has [action] antagHUD usage for observers") @@ -328,14 +328,14 @@ Ccomp's first proc. set name = "Toggle antagHUD Restrictions" set desc = "Restricts players that have used antagHUD from being able to join this round." if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") var/action="" if(config.antag_hud_restricted) for(var/mob/observer/dead/g in get_ghosts()) g << "The administrator has lifted restrictions on joining the round if you use AntagHUD" action = "lifted restrictions" config.antag_hud_restricted = 0 - src << "AntagHUD restrictions have been lifted" + to_chat(src, "AntagHUD restrictions have been lifted") else for(var/mob/observer/dead/g in get_ghosts()) g << "The administrator has placed restrictions on joining the round if you use AntagHUD" @@ -344,7 +344,7 @@ Ccomp's first proc. g.has_enabled_antagHUD = 0 action = "placed restrictions" config.antag_hud_restricted = 1 - src << "AntagHUD restrictions have been enabled" + to_chat(src, "AntagHUD restrictions have been enabled") log_admin("[key_name(usr)] has [action] on joining the round if they use AntagHUD") message_admins("Admin [key_name_admin(usr)] has [action] on joining the round if they use AntagHUD", 1) @@ -359,7 +359,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set name = "Spawn Character" set desc = "(Re)Spawn a client's loaded character." if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return //I frontload all the questions so we don't have a half-done process while you're reading. @@ -368,7 +368,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return var/location = alert(src,"Please specify where to spawn them.", "Location", "Right Here", "Arrivals", "Cancel") - if(!location) + if(location == "Cancel" || !location) return var/announce = alert(src,"Announce as if they had just arrived?", "Announce", "Yes", "No", "Cancel") @@ -443,7 +443,7 @@ Traitors and the like can also be revived with the previous role mostly intact. switch(location) if("Right Here") //Spawn them on your turf if(!src.mob) - src << "You can't use 'Right Here' when you are not 'Right Anywhere'!" + to_chat(src, "You can't use 'Right Here' when you are not 'Right Anywhere'!") return spawnloc = get_turf(src.mob) @@ -452,19 +452,19 @@ Traitors and the like can also be revived with the previous role mostly intact. spawnloc = pick(latejoin) else //I have no idea how you're here - src << "Invalid spawn location choice." + to_chat(src, "Invalid spawn location choice.") return //Did we actually get a loc to spawn them? if(!spawnloc) - src << "Couldn't get valid spawn location." + to_chat(src, "Couldn't get valid spawn location.") return new_character = new(spawnloc) //We were able to spawn them, right? if(!new_character) - src << "Something went wrong and spawning failed." + to_chat(src, "Something went wrong and spawning failed.") return //Write the appearance and whatnot out to the character @@ -491,7 +491,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(equipment) if(charjob) job_master.EquipRank(new_character, charjob, 1) - equip_custom_items(new_character) + //equip_custom_items(new_character) //VOREStation Removal //If desired, add records. if(records) @@ -517,7 +517,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Fun" set name = "Add Custom AI law" if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return var/input = sanitize(input(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", "") as text|null) if(!input) @@ -545,7 +545,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "Rejuvenate" if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return if(!mob) return @@ -567,7 +567,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "Create Command Report" if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return var/input = sanitize(input(usr, "Please enter anything you want. Anything. Serious.", "What?", "") as message|null, extra = 0) var/customname = sanitizeSafe(input(usr, "Pick a title for the report.", "Title") as text|null) @@ -595,7 +595,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set name = "Delete" if (!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return admin_delete(O) @@ -604,11 +604,11 @@ Traitors and the like can also be revived with the previous role mostly intact. set name = "List free slots" if (!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return if(job_master) for(var/datum/job/job in job_master.occupations) - src << "[job.title]: [job.total_positions]" + to_chat(src, "[job.title]: [job.total_positions]") feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world) @@ -705,7 +705,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set name = "Manual Ban" set category = "Special Verbs" if(!authenticated || !holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return var/mob/M = null switch(alert("How would you like to ban someone today?", "Manual Ban", "Key List", "Enter Manually", "Cancel")) @@ -777,7 +777,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Debug" set name = "Stabilize Atmos." if(!holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return feedback_add_details("admin_verb","STATM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! // DEFERRED diff --git a/code/modules/admin/verbs/randomverbs_vr.dm b/code/modules/admin/verbs/randomverbs_vr.dm new file mode 100644 index 00000000000..9fee7c58d08 --- /dev/null +++ b/code/modules/admin/verbs/randomverbs_vr.dm @@ -0,0 +1,74 @@ +/client/proc/spawn_character_mob() + set category = "Special Verbs" + set name = "Spawn Character As Mob" + set desc = "Spawn a specified ckey as a chosen mob." + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + + var/client/picked_client = input(src, "Who are we spawning as a mob?", "Client", "Cancel") as null|anything in GLOB.clients + if(!picked_client) + return + var/list/types = typesof(/mob/living) + var/mob_type = input(src, "Mob path to spawn as?", "Mob") as text + if(!mob_type) + return + var/list/matches = new() + for(var/path in types) + if(findtext("[path]", mob_type)) + matches += path + if(matches.len==0) + return + var/mob/living/chosen + if(matches.len==1) + chosen = matches[1] + else + chosen = input("Select a mob type", "Select Mob", matches[1]) as null|anything in matches + if(!chosen) + return + + var/char_name = alert(src, "Spawn mob with their character name?", "Mob name", "Yes", "No", "Cancel") + var/name = 0 + if(char_name == "Cancel") + return + if(char_name == "Yes") + name = 1 + var/vorgans = alert(src, "Spawn mob with their character's vore organs and prefs?", "Vore organs", "Yes", "No", "Cancel") + var/organs + if(vorgans == "Cancel") + return + if(vorgans == "Yes") + organs = 1 + if(vorgans == "No") + organs = 0 + + var/spawnloc + if(!src.mob) + to_chat(src, "Can't spawn them in unless you're in a valid spawn location!") + return + spawnloc = get_turf(src.mob) + + var/mob/living/new_mob = new chosen(spawnloc) + + if(!new_mob) + to_chat(src, "Spawning failed, try again or bully coders") + return + new_mob.ai_holder_type = /datum/ai_holder/simple_mob/inert //Dont want the mob AI to activate if the client dc's or anything + + if(name) + new_mob.real_name = picked_client.prefs.real_name + new_mob.name = picked_client.prefs.real_name + + + new_mob.key = picked_client.key //Finally put them in the mob + if(organs) + new_mob.copy_from_prefs_vr() + + log_admin("[key_name_admin(src)] has spawned [new_mob.key] as mob [new_mob.type].") + message_admins("[key_name_admin(src)] has spawned [new_mob.key] as mob [new_mob.type].", 1) + + to_chat(new_mob, "You've been spawned as a mob! Have fun.") + + feedback_add_details("admin_verb","SCAM") //heh + + return new_mob \ No newline at end of file diff --git a/code/modules/admin/verbs/smite_vr.dm b/code/modules/admin/verbs/smite_vr.dm index 0d048dde2d8..b0d4b8aa8cf 100644 --- a/code/modules/admin/verbs/smite_vr.dm +++ b/code/modules/admin/verbs/smite_vr.dm @@ -18,7 +18,6 @@ feedback_add_details("admin_verb","SMITEV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! switch(smite_choice) - /* if(SMITE_SHADEKIN_ATTACK) var/turf/Tt = get_turf(target) //Turf for target @@ -35,22 +34,22 @@ if(!Ts) return //Didn't find shadekin spawn turf - var/mob/living/simple_mob/shadekin/red/shadekin = new(Ts) + var/mob/living/simple_mob/shadekin/red/ai/shadekin = new(Ts) //Abuse of shadekin shadekin.real_name = shadekin.name shadekin.init_vore() shadekin.ability_flags |= 0x1 - shadekin.specific_targets = TRUE //Don't attack others shadekin.phase_shift() - shadekin.target_mob = target - shadekin.stance = STANCE_ATTACK + shadekin.ai_holder.give_target(target) + shadekin.ai_holder.hostile = FALSE + shadekin.ai_holder.mauling = TRUE shadekin.Life() //Remove when done spawn(10 SECONDS) if(shadekin) - shadekin.death()*/ //VORESTATION AI TEMPORARY REMOVAL + shadekin.death() - /*if(SMITE_SHADEKIN_NOMF) + if(SMITE_SHADEKIN_NOMF) var/list/kin_types = list( "Red Eyes (Dark)" = /mob/living/simple_mob/shadekin/red/dark, "Red Eyes (Light)" = /mob/living/simple_mob/shadekin/red/white, @@ -93,7 +92,6 @@ shadekin.real_name = shadekin.name shadekin.init_vore() shadekin.can_be_drop_pred = TRUE - shadekin.ai_inactive = TRUE shadekin.dir = SOUTH shadekin.ability_flags |= 0x1 shadekin.phase_shift() //Homf @@ -119,7 +117,7 @@ target.ghostize() qdel(target) qdel(shadekin) - */ + if(SMITE_REDSPACE_ABDUCT) redspace_abduction(target, src) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index 37fc52eda80..65d954fbc99 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -7,7 +7,7 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future set desc = "Spawns a strike team if you want to run an admin event." if(!src.holder) - src << "Only administrators may use this command." + to_chat(src, "Only administrators may use this command.") return if(!ticker) diff --git a/code/modules/admin/verbs/ticklag.dm b/code/modules/admin/verbs/ticklag.dm index ab5693878a6..3c34f0f35a9 100644 --- a/code/modules/admin/verbs/ticklag.dm +++ b/code/modules/admin/verbs/ticklag.dm @@ -19,6 +19,6 @@ if("Yes") config.Tickcomp = 1 else config.Tickcomp = 0 else - src << "Error: ticklag(): Invalid world.ticklag value. No changes made." + to_chat(src, "Error: ticklag(): Invalid world.ticklag value. No changes made.") diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index ce2c684c09f..8d547b76e10 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -359,13 +359,14 @@ var/list/possibleverbs = list() possibleverbs += "Cancel" // One for the top... possibleverbs += typesof(/mob/proc,/mob/verb,/mob/living/proc,/mob/living/verb) - switch(H.type) - if(/mob/living/carbon/human) - possibleverbs += typesof(/mob/living/carbon/proc,/mob/living/carbon/verb,/mob/living/carbon/human/verb,/mob/living/carbon/human/proc) - if(/mob/living/silicon/robot) - possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb) - if(/mob/living/silicon/ai) - possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb) + if(istype(H,/mob/living/carbon/human)) + possibleverbs += typesof(/mob/living/carbon/proc,/mob/living/carbon/verb,/mob/living/carbon/human/verb,/mob/living/carbon/human/proc) + if(istype(H,/mob/living/silicon/robot)) + possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb) + if(istype(H,/mob/living/silicon/ai)) + possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb) + if(istype(H,/mob/living/simple_mob)) + possibleverbs += typesof(/mob/living/simple_mob/proc,/mob/living/simple_mob/verb) //VOREStation edit, Apparently polaris simplemobs have no verbs at all. possibleverbs -= H.verbs possibleverbs += "Cancel" // ...And one for the bottom diff --git a/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai_vr.dm b/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai_vr.dm new file mode 100644 index 00000000000..c4bb314359c --- /dev/null +++ b/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai_vr.dm @@ -0,0 +1,3 @@ +/datum/ai_holder/simple_mob/xenobio_slime/post_melee_attack(atom/A) + var/mob/living/simple_mob/slime/xenobio/my_slime = holder + my_slime.a_intent = I_HELP // Return back to help after attacking \ No newline at end of file diff --git a/code/modules/ai/ai_holder_disabled.dm b/code/modules/ai/ai_holder_disabled.dm index 8b296b2d106..dc3717fe181 100644 --- a/code/modules/ai/ai_holder_disabled.dm +++ b/code/modules/ai/ai_holder_disabled.dm @@ -5,6 +5,9 @@ // If our holder is able to do anything. /datum/ai_holder/proc/can_act() + if(!holder) // Holder missing. + SSai.processing -= src + return FALSE if(holder.stat) // Dead or unconscious. ai_log("can_act() : Stat was non-zero ([holder.stat]).", AI_LOG_TRACE) return FALSE @@ -95,4 +98,4 @@ holder.IMove(get_step(holder,moving_to)) wander_delay = base_wander_delay ai_log("handle_wander_movement() : Exited.", AI_LOG_DEBUG) -*/ \ No newline at end of file +*/ diff --git a/code/modules/ai/ai_holder_movement.dm b/code/modules/ai/ai_holder_movement.dm index 55a1098b900..58b8c9d5eeb 100644 --- a/code/modules/ai/ai_holder_movement.dm +++ b/code/modules/ai/ai_holder_movement.dm @@ -142,7 +142,7 @@ if(isturf(holder.loc) && can_act()) wander_delay-- if(wander_delay <= 0) - if(!wander_when_pulled && holder.pulledby) + if(!wander_when_pulled && (holder.pulledby || holder.grabbed_by.len)) ai_log("handle_wander_movement() : Being pulled and cannot wander. Exiting.", AI_LOG_DEBUG) return diff --git a/code/modules/artifice/cursedform.dm b/code/modules/artifice/cursedform.dm new file mode 100644 index 00000000000..17f8fbf6183 --- /dev/null +++ b/code/modules/artifice/cursedform.dm @@ -0,0 +1,40 @@ +/obj/item/weapon/paper/carbon/cursedform + name = "Form - Inventory Requisition r10.7.1E" + +/obj/item/weapon/paper/carbon/cursedform/Initialize() + ..() + info = {"

    Form - Inventory Requisition r10.7.1E

    General Request Form


    General


    Name:
    Department:
    Departmental Rank:
    Organization(If not Nanotrasen):
    Date:



    Requested Item(s):
    Quantity:
    Reason for request:
    Is this replacement equipment?:
    If `Yes`; above, specify equiment and reason for replacement:


    Authorization


    Authorizing Department:
    Authorizing Dept. Head:


    Contact and Delivery


    EPv2 Address of requesting party(Do not leave blank):
    Delivery location or department:


    Nanotrasen Employee Identification Number:
    Signature of Requester and Date





    Authorizor`s Nanotrasen Employee Identification Number:
    Authorizing Signature and Date(Include authorizing department`s stamp below)




    Shipping Department Only

    (Do not write below this line)

    Nanotrasen Purchasing Approval Code:
    Nanotrasen Employee Identification Number:
    Receiving Shipping Employee:
    Signature and Date


    "} + info_links = {"

    Form - Inventory Requisition r10.7.1E

    General Request Form


    General


    Name: write
    Department: write
    Departmental Rank: write
    Organization(If not Nanotrasen): write
    Date: write



    Requested Item(s): write
    Quantity: write
    Reason for request: write
    Is this replacement equipment?: write
    If `Yes` above, specify equiment and reason for replacement: write


    Authorization


    Authorizing Department: write
    Authorizing Dept. Head: write


    Contact and Delivery


    EPv2 Address of requesting party(Do not leave blank): write
    Delivery location or department: write


    Nanotrasen Employee Identification Number: write
    Signature of Requester and Date

    write



    Authorizor`s Nanotrasen Employee Identification Number: write
    Authorizing Signature and Date(Include authorizing department`s stamp below)

    write


    Shipping Department Only

    (Do not write below this line)

    Nanotrasen Purchasing Approval Code: write
    Nanotrasen Employee Identification Number: write
    Receiving Shipping Employee: write
    Signature and Date

    write
    write"} + +/obj/item/weapon/paper/carbon/cursedform/AltClick() // No fun. + return + +/obj/item/weapon/paper/carbon/cursedform/burnpaper(obj/item/weapon/flame/P, mob/user) + var/class = "warning" + var/datum/gender/TU = gender_datums[user.get_visible_gender()] + + if(P.lit && !user.restrained()) + if(istype(P, /obj/item/weapon/flame/lighter/zippo)) + class = "rose" + + user.visible_message("[user] holds \the [P] up to \the [src], it looks like [TU.hes] trying to burn it!", \ + "You hold \the [P] up to \the [src], burning it slowly.") + + if(do_after(user, 2 SECONDS, src) && P.lit) + user.visible_message("[user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ + "You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") + + if(user.get_inactive_hand() == src) + user.drop_from_inventory(src) + + new /obj/effect/decal/cleanable/ash(src.loc) + qdel(src) + + else + to_chat(user,"You must hold \the [P] steady to burn \the [src].") + + if(isliving(user)) + var/mob/living/L = user + L.visible_message("[L] convulses, the very letters of \the [src] searing themselves into their eyes!", \ + "You convulse, the very letters of \the [src] searing themselves into your eyes!") + L.add_modifier(/datum/modifier/grievous_wounds, 10 MINUTES) diff --git a/code/modules/artifice/telecube.dm b/code/modules/artifice/telecube.dm new file mode 100644 index 00000000000..bb2af4b83dd --- /dev/null +++ b/code/modules/artifice/telecube.dm @@ -0,0 +1,236 @@ +/* + * Home of the telecube. + */ + +/datum/category_item/catalogue/anomalous/precursor_a/telecube + name = "Quantomatically Entangled Digicube" + + desc = "An enigmatic cube that appears superficially similar to a Positronic Cube. \ + However, the similarities hopefully end there, as this device emits no sound during \ + operation or observation. Its alloy composition is unknown, though it is incredibly \ + dense, as it resists any and all forms of radiation.
    \ + Upon physical contact, however, the device will translocate the offending entity to a \ + matching twin cube, generating no detectable radiation. This process occurs at speeds \ + unmatched even by modern predictions of Bluespace technology, and with no visible power \ + source." + + value = CATALOGUER_REWARD_HARD + +// Standard one needs to be smacked onto another one to link together. +/obj/item/weapon/telecube + name = "locus" + desc = "A strange metallic cube that pulses silently." + description_info = "Ctrl-Clicking on this object will attempt to activate its unique ability." + icon = 'icons/obj/props/telecube.dmi' + icon_state = "cube" + w_class = ITEMSIZE_SMALL + origin_tech = list(TECH_MATERIAL = 7, TECH_POWER = 6, TECH_BLUESPACE = 7, TECH_ANOMALY = 2, TECH_PRECURSOR = 2) + + catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/telecube) + + slowdown = 5 + + throw_range = 2 + + var/obj/item/weapon/telecube/mate = null + + var/start_paired = FALSE + var/mirror_colors = FALSE + + var/randomize_colors = FALSE + + var/glow_color = "#FFFFFF" + var/image/glow = null + var/image/charge = null + + var/shell_color = "#FFFFFF" + var/image/shell = null + + var/cooldown_time = 30 SECONDS + var/last_teleport = 0 + +// How far the cube will search for things to teleport. 0 = only contacting objects / mobs. + var/teleport_range = 0 // For all that is holy, do not change this unless you know what you're doing. + + var/omniteleport = FALSE // Will this teleport anchored things too? + +/obj/item/weapon/telecube/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + last_teleport = world.time + + glow = image(icon = icon, icon_state = "[icon_state]-ready") + glow.plane = PLANE_LIGHTING_ABOVE + charge = image(icon = icon, icon_state = "[icon_state]-charging") + charge.plane = PLANE_LIGHTING_ABOVE + shell = image(icon = icon, icon_state = "[icon_state]") + + if(teleport_range) + description_info += "
    " + description_info += "Alt-Clicking on this object will utilize its second unique ability." + + if(randomize_colors) + glow_color = rgb(rand(0, 255),rand(0, 255),rand(0, 255)) + shell_color = rgb(rand(0, 255),rand(0, 255),rand(0, 255)) + + if(start_paired) + mate = new(src.loc) + if(mirror_colors) + mate.glow_color = shell_color + mate.shell_color = glow_color + else + mate.glow_color = glow_color + mate.shell_color = shell_color + mate.pair_cube(src) + + glow.color = glow_color + charge.color = glow_color + shell.color = shell_color + + return + +/obj/item/weapon/telecube/process() + ..() + update_icon() + +/obj/item/weapon/telecube/update_icon() + . = ..() + glow.color = glow_color + charge.color = glow_color + shell.color = shell_color + + if(shell.color != initial(shell.color)) + cut_overlay(shell) + add_overlay(shell) + + if(world.time < (last_teleport + cooldown_time)) + cut_overlay(charge) + cut_overlay(glow) + add_overlay(charge) + else + cut_overlay(glow) + cut_overlay(charge) + add_overlay(glow) + +/obj/item/weapon/telecube/Destroy() + STOP_PROCESSING(SSobj, src) + if(mate) + var/turf/T = get_turf(mate) + mate.visible_message("\The [mate] collapses into itself!") + mate.mate = null + mate = null + explosion(T,1,3,7) + + ..() + +/obj/item/weapon/telecube/proc/pair_cube(var/obj/item/weapon/telecube/M) + if(mate) + return 0 + else + mate = M + update_icon() + return 1 + +/obj/item/weapon/telecube/proc/teleport_to_mate(var/atom/movable/A, var/areaporting = FALSE) + . = FALSE + + if(!A) + return . + + if(A == src || A == mate) + A.visible_message("\The [A] distorts and fades, before popping back into existence.") + return . + + var/mob/living/L = src.loc + + if(istype(L)) + L.drop_from_inventory(src) + forceMove(get_turf(src)) + + if(world.time < (last_teleport + cooldown_time)) + return . + + if((A.anchored && !omniteleport) || !mate) + A.visible_message("\The [A] distorts for a moment, before reforming in the same position.") + return . + + var/turf/TLocate = get_turf(mate) + + var/turf/T1 = get_turf(locate(TLocate.x + (A.x - x), TLocate.y + (A.y - y), TLocate.z)) + + if(T1) + A.visible_message("\The [A] fades out of existence.") + A.forceMove(T1) + . = TRUE + A.visible_message("\The [A] fades into existence.") + else + return . + + if(teleport_range && !areaporting) + for(var/atom/movable/M in orange(teleport_range, A)) + teleport_to_mate(M, TRUE) + +/obj/item/weapon/telecube/proc/swap_with_mate() + . = FALSE + + if(!mate || !teleport_range) + return . + + var/list/objects_near_me = range(teleport_range, get_turf(src)) + var/list/objects_near_mate = range(teleport_range, get_turf(mate)) + + for(var/atom/movable/M in objects_near_me) + teleport_to_mate(M, TRUE) + + for(var/atom/movable/M1 in objects_near_mate) + mate.teleport_to_mate(M1, TRUE) + + . = TRUE + return . + +/obj/item/weapon/telecube/CtrlClick(mob/user) + if(Adjacent(user)) + if(teleport_to_mate(user)) + last_teleport = world.time + return + +/obj/item/weapon/telecube/AltClick(mob/user) + if(Adjacent(user)) + if(swap_with_mate()) + last_teleport = world.time + mate.last_teleport = world.time + return + +/obj/item/weapon/telecube/Bump(atom/movable/AM) + if(teleport_to_mate(AM)) + last_teleport = world.time + . = ..() + +/obj/item/weapon/telecube/Bumped(atom/movable/M as mob|obj) + if(teleport_to_mate(M)) + last_teleport = world.time + . = ..() + +// Subtypes + +/obj/item/weapon/telecube/mated + start_paired = TRUE + +/obj/item/weapon/telecube/randomized + randomize_colors = TRUE + +/obj/item/weapon/telecube/randomized/mated + start_paired = TRUE + +/obj/item/weapon/telecube/precursor + glow_color = "#FF1D8E" + shell_color = "#2F1B26" + +/obj/item/weapon/telecube/precursor/mated + start_paired = TRUE + +/obj/item/weapon/telecube/precursor/mated/zone + teleport_range = 2 + +/obj/item/weapon/telecube/precursor/mated/mirrorcolor + mirror_colors = TRUE diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 1182129cd69..bf1165d2ea0 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -62,4 +62,10 @@ proc/createRandomZlevel() /obj/effect/landmark/gateway_scatter/Initialize() . = ..() awaydestinations += src + +/obj/effect/landmark/event_scatter + name = "uncalibrated gateway destination" +/obj/effect/landmark/event_scatter/Initialize() + . = ..() + eventdestinations += src //VOREStation Add End diff --git a/code/modules/blob2/overmind/types.dm b/code/modules/blob2/overmind/types.dm index 6049ccfc726..49b968cfccd 100644 --- a/code/modules/blob2/overmind/types.dm +++ b/code/modules/blob2/overmind/types.dm @@ -593,7 +593,7 @@ attack_verb = "splashes" /datum/blob_type/radioactive_ooze/on_pulse(var/obj/structure/blob/B) - radiation_repository.radiate(B, 200) + SSradiation.radiate(B, 200) /datum/blob_type/volatile_alluvium name = "volatile alluvium" diff --git a/code/modules/catalogue/cataloguer.dm b/code/modules/catalogue/cataloguer.dm index 60e86eadeee..f1c57564430 100644 --- a/code/modules/catalogue/cataloguer.dm +++ b/code/modules/catalogue/cataloguer.dm @@ -312,3 +312,15 @@ GLOBAL_LIST_EMPTY(all_cataloguers) interact(usr) // So it refreshes the window. return 1 +/obj/item/device/cataloguer/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/weapon/card/id) && !busy) + busy = TRUE + var/obj/item/weapon/card/id/ID = W + if(points_stored) + ID.survey_points += points_stored + points_stored = 0 + to_chat(user, "You swipe the id over \the [src].") + else + to_chat(user, "\The [src] has no points available.") + busy = FALSE + return ..() diff --git a/code/modules/catalogue/cataloguer_vr.dm b/code/modules/catalogue/cataloguer_vr.dm new file mode 100644 index 00000000000..d1dfac5deac --- /dev/null +++ b/code/modules/catalogue/cataloguer_vr.dm @@ -0,0 +1,56 @@ +/obj/item/device/cataloguer/compact + name = "compact cataloguer" + icon = 'icons/vore/custom_items_vr.dmi' + icon_state = "tricorder" + action_button_name = "Toggle Cataloguer" + var/deployed = TRUE + scan_range = 1 + toolspeed = 1.2 + +/obj/item/device/cataloguer/compact/update_icon() + if(busy) + icon_state = "[initial(icon_state)]_s" + else + icon_state = initial(icon_state) + +/obj/item/device/cataloguer/compact/ui_action_click() + toggle() + +/obj/item/device/cataloguer/compact/verb/toggle() + set name = "Toggle Cataloguer" + set category = "Object" + + if(busy) + to_chat(usr, span("warning", "\The [src] is currently scanning something.")) + return + deployed = !(deployed) + if(deployed) + w_class = ITEMSIZE_NORMAL + icon_state = "[initial(icon_state)]" + to_chat(usr, span("notice", "You flip open \the [src].")) + else + w_class = ITEMSIZE_SMALL + icon_state = "[initial(icon_state)]_closed" + to_chat(usr, span("notice", "You close \the [src].")) + + if (ismob(usr)) + var/mob/M = usr + M.update_action_buttons() + +/obj/item/device/cataloguer/compact/afterattack(atom/target, mob/user, proximity_flag) + if(!deployed) + to_chat(user, span("warning", "\The [src] is closed.")) + return + return ..() + +/obj/item/device/cataloguer/compact/pulse_scan(mob/user) + if(!deployed) + to_chat(user, span("warning", "\The [src] is closed.")) + return + return ..() + +/obj/item/device/cataloguer/compact/pathfinder + name = "pathfinder's cataloguer" + icon_state = "tricorder_med" + scan_range = 3 + toolspeed = 1 diff --git a/code/modules/catalogue/rewards/construction.dm b/code/modules/catalogue/rewards/construction.dm deleted file mode 100644 index 8bfca1f79d4..00000000000 --- a/code/modules/catalogue/rewards/construction.dm +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef T_BOARD -#error T_BOARD macro is not defined but we need it! -#endif - -/obj/item/weapon/circuitboard/exploration_equipment_vendor - name = T_BOARD("Exploration Equipment Vendor") - board_type = new /datum/frame/frame_types/machine - build_path = /obj/machinery/equipment_vendor/exploration - origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 2) - req_components = list( - /obj/item/weapon/stock_parts/console_screen = 1, - /obj/item/weapon/stock_parts/matter_bin = 3) diff --git a/code/modules/catalogue/rewards/equipment_vendor.dm b/code/modules/catalogue/rewards/equipment_vendor.dm deleted file mode 100644 index 96b636b8bef..00000000000 --- a/code/modules/catalogue/rewards/equipment_vendor.dm +++ /dev/null @@ -1,177 +0,0 @@ -/**********************Exploration Equipment Vendor**************************/ - -/obj/machinery/equipment_vendor/exploration - name = "exploration equipment vendor" - desc = "An equipment vendor for explorers, points collected with cataloguers can be spent here." - icon = 'icons/obj/machines/mining_machines_vr.dmi' - icon_state = "exploration" - density = TRUE - anchored = TRUE - circuit = /obj/item/weapon/circuitboard/exploration_equipment_vendor - var/icon_deny = "exploration-deny" - var/icon_vend = "exploration-vend" - var/obj/item/device/cataloguer/inserted_cataloguer - var/list/prize_list = list( - new /datum/data/exploration_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 1), - new /datum/data/exploration_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 10), - new /datum/data/exploration_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 30), - new /datum/data/exploration_equipment("GPS Device", /obj/item/device/gps/explorer, 10), - new /datum/data/exploration_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 10), - new /datum/data/exploration_equipment("Absinthe", /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe, 10), - new /datum/data/exploration_equipment("Cigar", /obj/item/clothing/mask/smokable/cigarette/cigar/havana, 15), - new /datum/data/exploration_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 20), - new /datum/data/exploration_equipment("Laser Pointer", /obj/item/device/laser_pointer, 90), - new /datum/data/exploration_equipment("Plush Toy", /obj/random/plushie, 30), - new /datum/data/exploration_equipment("Shelter Capsule", /obj/item/device/survivalcapsule, 50), - new /datum/data/exploration_equipment("Point Transfer Card", /obj/item/weapon/card/exploration_point_card, 50), - new /datum/data/exploration_equipment("Survival Medipen", /obj/item/weapon/reagent_containers/hypospray/autoinjector/miner, 50), - new /datum/data/exploration_equipment("Injector (L) - Glucose",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose, 50), - new /datum/data/exploration_equipment("Injector (L) - Panacea",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity, 50), - new /datum/data/exploration_equipment("Injector (L) - Trauma",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute, 50), - new /datum/data/exploration_equipment("Digital Tablet - Standard", /obj/item/modular_computer/tablet/preset/custom_loadout/standard, 50), - new /datum/data/exploration_equipment("Digital Tablet - Advanced", /obj/item/modular_computer/tablet/preset/custom_loadout/advanced, 100), - new /datum/data/exploration_equipment("Nanopaste Tube", /obj/item/stack/nanopaste, 100), - new /datum/data/exploration_equipment("Mini-Translocator", /obj/item/device/perfect_tele/one_beacon, 120), - new /datum/data/exploration_equipment("Space Cash", /obj/item/weapon/spacecash/c100, 100), - new /datum/data/exploration_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 250), - new /datum/data/exploration_equipment("Luxury Shelter Capsule", /obj/item/device/survivalcapsule/luxury, 310), - new /datum/data/exploration_equipment("Defense Equipment - Smoke Bomb",/obj/item/weapon/grenade/smokebomb, 10), - new /datum/data/exploration_equipment("Defense Equipment - Razor Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/manhacks/station, 100), - new /datum/data/exploration_equipment("Defense Equipment - Sentry Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/ward, 150), - new /datum/data/exploration_equipment("Fishing Net", /obj/item/weapon/material/fishing_net, 50), - new /datum/data/exploration_equipment("Titanium Fishing Rod", /obj/item/weapon/material/fishing_rod/modern, 100), - new /datum/data/exploration_equipment("Durasteel Fishing Rod", /obj/item/weapon/material/fishing_rod/modern/strong, 750) - ) - -/datum/data/exploration_equipment - var/equipment_name = "generic" - var/equipment_path = null - var/cost = 0 - -/datum/data/exploration_equipment/New(name, path, cost) - src.equipment_name = name - src.equipment_path = path - src.cost = cost - -/obj/machinery/equipment_vendor/exploration/power_change() - var/old_stat = stat - ..() - if(old_stat != stat) - update_icon() - if(inserted_cataloguer && !powered()) - visible_message("The cataloguer slot indicator light flickers on \the [src] as it spits out the device before powering down.") - inserted_cataloguer.forceMove(get_turf(src)) - -/obj/machinery/equipment_vendor/exploration/update_icon() - if(panel_open) - icon_state = "[initial(icon_state)]-open" - else if(powered()) - icon_state = initial(icon_state) - else - icon_state = "[initial(icon_state)]-off" - -/obj/machinery/equipment_vendor/exploration/attack_hand(mob/user) - if(..()) - return - interact(user) - -/obj/machinery/equipment_vendor/exploration/attack_ghost(mob/user) - interact(user) - -/obj/machinery/equipment_vendor/exploration/interact(mob/user) - user.set_machine(src) - - var/dat - dat +="
    " - if(istype(inserted_cataloguer)) - dat += "You have [inserted_cataloguer.points_stored] exploration points collected. Eject Cataloguer.
    " - else - dat += "No Cataloguer inserted. Insert Cataloguer.
    " - dat += "
    " - dat += "
    Equipment point cost list:
    " - for(var/datum/data/exploration_equipment/prize in prize_list) - dat += "" - dat += "
    [prize.equipment_name][prize.cost]Purchase
    " - var/datum/browser/popup = new(user, "miningvendor", "Exploration Equipment Vendor", 400, 600) - popup.set_content(dat) - popup.open() - -/obj/machinery/equipment_vendor/exploration/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["choice"]) - if(istype(inserted_cataloguer)) - if(href_list["choice"] == "eject") - to_chat(usr, "You eject the ID from [src]'s card slot.") - usr.put_in_hands(inserted_cataloguer) - inserted_cataloguer = null - else if(href_list["choice"] == "insert") - var/obj/item/device/cataloguer/C = usr.get_active_hand() - if(istype(C) && !inserted_cataloguer && usr.unEquip(C)) - C.forceMove(src) - inserted_cataloguer = C - interact(usr) - to_chat(usr, "You insert the ID into [src]'s card slot.") - else - to_chat(usr, "No valid ID.") - flick(icon_deny, src) - - if(href_list["purchase"]) - if(istype(inserted_cataloguer)) - var/datum/data/exploration_equipment/prize = locate(href_list["purchase"]) - if (!prize || !(prize in prize_list)) - to_chat(usr, "Error: Invalid choice!") - flick(icon_deny, src) - return - if(prize.cost > inserted_cataloguer.points_stored) - to_chat(usr, "Error: Insufficent points for [prize.equipment_name]!") - flick(icon_deny, src) - else - inserted_cataloguer.points_stored -= prize.cost - to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") - flick(icon_vend, src) - new prize.equipment_path(drop_location()) - else - to_chat(usr, "Error: Please insert a valid ID!") - flick(icon_deny, src) - updateUsrDialog() - -/obj/machinery/equipment_vendor/exploration/attackby(obj/item/I, mob/user, params) - if(default_deconstruction_screwdriver(user, I)) - updateUsrDialog() - return - if(default_part_replacement(user, I)) - return - if(default_deconstruction_crowbar(user, I)) - return - if(istype(I,/obj/item/device/cataloguer)) - if(!powered()) - return - else if(!inserted_cataloguer && user.unEquip(I)) - I.forceMove(src) - inserted_cataloguer = I - interact(user) - return - ..() - -/obj/machinery/equipment_vendor/exploration/dismantle() - if(inserted_cataloguer) - inserted_cataloguer.forceMove(loc) //Prevents deconstructing the ORM from deleting whatever ID was inside it. - . = ..() - -/obj/machinery/equipment_vendor/exploration/proc/new_prize(var/name, var/path, var/cost) // Generic proc for adding new entries. Good for abusing for FUN and PROFIT. - if(!cost) - cost = 100 - if(!path) - path = /obj/item/stack/marker_beacon - if(!name) - name = "Generic Entry" - prize_list += new /datum/data/exploration_equipment(name, path, cost) - -/obj/machinery/equipment_vendor/exploration/ex_act(severity, target) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - if(prob(50 / severity) && severity < 3) - qdel(src) diff --git a/code/modules/catalogue/rewards/exp_point_items.dm b/code/modules/catalogue/rewards/exp_point_items.dm deleted file mode 100644 index 47e066763ba..00000000000 --- a/code/modules/catalogue/rewards/exp_point_items.dm +++ /dev/null @@ -1,23 +0,0 @@ -/obj/item/weapon/card/exploration_point_card - name = "exploration point card" - desc = "A small card preloaded with exploration points. Swipe your Cataloguer over it to transfer the points, then discard." - icon_state = "data" - var/points = 50 - -/obj/item/weapon/card/exploration_point_card/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/device/cataloguer)) - if(points) - var/obj/item/device/cataloguer/C = I - C.points_stored += points - to_chat(user, "You transfer [points] points to [C].") - points = 0 - else - to_chat(user, "There's no points left on [src].") - ..() - -/obj/item/weapon/card/exploration_point_card/examine(mob/user) - ..(user) - to_chat(user, "There's [points] points on the card.") - -/obj/item/weapon/card/exploration_point_card/can_catalogue(mob/user) - return FALSE \ No newline at end of file diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index e13573e3058..7321e96a238 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -77,13 +77,13 @@ //This stops files larger than UPLOAD_LIMIT being sent from client to server via input(), client.Import() etc. /client/AllowUpload(filename, filelength) if(filelength > UPLOAD_LIMIT) - src << "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB." + to_chat(src, "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.") return 0 /* //Don't need this at the moment. But it's here if it's needed later. //Helps prevent multiple files being uploaded at once. Or right after eachother. var/time_to_wait = fileaccess_timer - world.time if(time_to_wait > 0) - src << "Error: AllowUpload(): Spam prevention. Please wait [round(time_to_wait/10)] seconds." + to_chat(src, "Error: AllowUpload(): Spam prevention. Please wait [round(time_to_wait/10)] seconds.") return 0 fileaccess_timer = world.time + FTPDELAY */ return 1 @@ -105,7 +105,7 @@ del(src) return - src << "If the title screen is black, resources are still downloading. Please be patient until the title screen appears." + to_chat(src, "If the title screen is black, resources are still downloading. Please be patient until the title screen appears.") GLOB.clients += src @@ -131,10 +131,10 @@ prefs.sanitize_preferences() if(custom_event_msg && custom_event_msg != "") - src << "

    Custom Event

    " - src << "

    A custom event is taking place. OOC Info:

    " - src << "[custom_event_msg]" - src << "
    " + to_chat(src, "

    Custom Event

    ") + to_chat(src, "

    A custom event is taking place. OOC Info:

    ") + to_chat(src, "[custom_event_msg]") + to_chat(src, "
    ") if(holder) @@ -160,7 +160,7 @@ screen += void if(prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates. - src << "You have unread updates in the changelog." + to_chat(src, "You have unread updates in the changelog.") winset(src, "rpane.changelog", "background-color=#eaeaea;font-style=bold") if(config.aggressive_changelog) src.changes() diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index fe4b1a93996..55535b89bf3 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -139,7 +139,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O else O.robotize() - for(var/name in list(O_HEART,O_EYES,O_LUNGS,O_LIVER,O_KIDNEYS,O_BRAIN)) + for(var/name in list(O_HEART,O_EYES,O_VOICE,O_LUNGS,O_LIVER,O_KIDNEYS,O_SPLEEN,O_STOMACH,O_INTESTINE,O_BRAIN)) var/status = pref.organ_data[name] if(!status) continue @@ -237,6 +237,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O organ_name = "heart" if(O_EYES) organ_name = "eyes" + if(O_VOICE) + organ_name = "larynx" if(O_BRAIN) organ_name = "brain" if(O_LUNGS) @@ -245,6 +247,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O organ_name = "liver" if(O_KIDNEYS) organ_name = "kidneys" + if(O_SPLEEN) + organ_name = "spleen" + if(O_STOMACH) + organ_name = "stomach" + if(O_INTESTINE) + organ_name = "intestines" if(status == "cyborg") ++ind @@ -708,7 +716,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O else if(href_list["organs"]) - var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes", "Lungs", "Liver", "Kidneys", "Brain") + var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes","Larynx", "Lungs", "Liver", "Kidneys", "Spleen", "Intestines", "Stomach", "Brain") if(!organ_name) return var/organ = null @@ -717,12 +725,20 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O organ = O_HEART if("Eyes") organ = O_EYES + if("Larynx") + organ = O_VOICE if("Lungs") organ = O_LUNGS if("Liver") organ = O_LIVER if("Kidneys") organ = O_KIDNEYS + if("Spleen") + organ = O_SPLEEN + if("Intestines") + organ = O_INTESTINE + if("Stomach") + organ = O_STOMACH if("Brain") if(pref.organ_data[BP_HEAD] != "cyborg") user << "You may only select a cybernetic or synthetic brain if you have a full prosthetic body." diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm index 063150f69df..ac1a203e4b6 100644 --- a/code/modules/client/preference_setup/global/setting_datums.dm +++ b/code/modules/client/preference_setup/global/setting_datums.dm @@ -135,6 +135,12 @@ var/list/_client_preferences_by_type enabled_description = "Show" disabled_description = "Hide" +/datum/client_preference/air_pump_noise + description ="Air Pump Ambient Noise" + key = "SOUND_AIRPUMP" + enabled_description = "Audible" + disabled_description = "Silent" + /datum/client_preference/mob_tooltips description ="Mob tooltips" key = "MOB_TOOLTIPS" diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index 9ba9156fe1b..c2e1dc52a1d 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -70,6 +70,10 @@ var/list/gear_datums = list() continue if(max_cost && G.cost > max_cost) continue + if(G.ckeywhitelist && !(preference_mob.ckey in G.ckeywhitelist)) //Vorestation Edit + continue //Vorestation Edit + if(G.character_name && !(preference_mob.client.prefs.real_name in G.character_name)) //Vorestation Edit + continue //Vorestation Edit . += gear_name /datum/category_item/player_setup_item/loadout/sanitize_character() @@ -88,7 +92,7 @@ var/list/gear_datums = list() preference_mob << "You cannot have more than one of the \the [gear_name]" pref.gear -= gear_name else if(!(gear_name in valid_gear_choices())) - preference_mob << "You cannot take \the [gear_name] as you are not whitelisted for the species." + preference_mob << "You cannot take \the [gear_name] as you are not whitelisted for the species or item." //Vorestation Edit pref.gear -= gear_name else var/datum/gear/G = gear_datums[gear_name] @@ -100,6 +104,7 @@ var/list/gear_datums = list() /datum/category_item/player_setup_item/loadout/content() . = list() + var/mob/preference_mob = preference_mob() //Vorestation Edit var/total_cost = 0 if(pref.gear && pref.gear.len) for(var/i = 1; i <= pref.gear.len; i++) @@ -145,6 +150,10 @@ var/list/gear_datums = list() . += "
    " for(var/gear_name in LC.gear) var/datum/gear/G = LC.gear[gear_name] + if(G.ckeywhitelist && !(preference_mob.ckey in G.ckeywhitelist)) //Vorestation Edit + continue //Vorestation Edit + if(G.character_name && !(preference_mob.client.prefs.real_name in G.character_name)) //Vorestation Edit + continue //Vorestation Edit var/ticked = (G.display_name in pref.gear) . += "[G.display_name]" . += "[G.cost]" @@ -262,4 +271,7 @@ var/list/gear_datums = list() var/item = new gd.path(gd.location) for(var/datum/gear_tweak/gt in gear_tweaks) gt.tweak_item(item, metadata["[gt]"]) + var/mob/M = location + if(istype(M) && exploitable) //Update exploitable info records for the mob without creating a duplicate object at their feet. + M.amend_exploitable(item) return item diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm index 0f186f5dfca..63b32a27079 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm @@ -40,11 +40,11 @@ allowed_roles = list("Colony Director", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Explorer","Pathfinder") /datum/gear/accessory/brown_vest - display_name = "webbing, brown" + display_name = "webbing, brown (Eng, Sec, Med, Exploration, Miner)" allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Pathfinder","Shaft Miner") /datum/gear/accessory/black_vest - display_name = "webbing, black" + display_name = "webbing, black (Eng, Sec, Med, Exploration, Miner)" allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Pathfinder","Shaft Miner") /datum/gear/accessory/white_vest @@ -52,11 +52,11 @@ allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic") /datum/gear/accessory/brown_drop_pouches - display_name = "drop pouches, brown" + display_name = "drop pouches, brown (Eng, Sec, Med, Exploration, Miner)" allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Pathfinder","Shaft Miner") /datum/gear/accessory/black_drop_pouches - display_name = "drop pouches, black" + display_name = "drop pouches, black (Eng, Sec, Med, Exploration, Miner)" allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Pathfinder","Shaft Miner") /datum/gear/accessory/white_drop_pouches @@ -75,14 +75,20 @@ description = "A small necklace device that will notify an offsite cloning facility should you expire after activating it." /datum/gear/accessory/tronket - display_name = "metal necklace" - description = "A shiny steel chain with a vague metallic object dangling off it." - path = /obj/item/clothing/accessory/tronket + display_name = "metal necklace" + description = "A shiny steel chain with a vague metallic object dangling off it." + path = /obj/item/clothing/accessory/tronket + +/datum/gear/accessory/pilotpin + display_name = "pilot qualification pin" + description = "An iron pin denoting the qualification to fly SCG spacecraft." + path = /obj/item/clothing/accessory/solgov/specialty/pilot + allowed_roles = list("Pathfinder", "Pilot", "Field Medic") /datum/gear/accessory/flops - display_name = "drop straps" - description = "Wearing suspenders over shoulders? That's been so out for centuries and you know better." - path = /obj/item/clothing/accessory/flops + display_name = "drop straps" + description = "Wearing suspenders over shoulders? That's been so out for centuries and you know better." + path = /obj/item/clothing/accessory/flops /datum/gear/accessory/flops/New() ..() diff --git a/code/modules/client/preference_setup/loadout/loadout_ears.dm b/code/modules/client/preference_setup/loadout/loadout_ears.dm index d92b2358b41..f80e60acaf2 100644 --- a/code/modules/client/preference_setup/loadout/loadout_ears.dm +++ b/code/modules/client/preference_setup/loadout/loadout_ears.dm @@ -11,4 +11,32 @@ /datum/gear/ears/circuitry display_name = "earwear, circuitry (empty)" - path = /obj/item/clothing/ears/circuitry \ No newline at end of file + path = /obj/item/clothing/ears/circuitry + + +/datum/gear/ears/earrings + display_name = "earring selection" + description = "A selection of eye-catching earrings." + path = /obj/item/clothing/ears/earring + +/datum/gear/ears/earrings/New() + ..() + var/earrings = list() + earrings["stud, pearl"] = /obj/item/clothing/ears/earring/stud + earrings["stud, glass"] = /obj/item/clothing/ears/earring/stud/glass + earrings["stud, wood"] = /obj/item/clothing/ears/earring/stud/wood + earrings["stud, iron"] = /obj/item/clothing/ears/earring/stud/iron + earrings["stud, steel"] = /obj/item/clothing/ears/earring/stud/steel + earrings["stud, silver"] = /obj/item/clothing/ears/earring/stud/silver + earrings["stud, gold"] = /obj/item/clothing/ears/earring/stud/gold + earrings["stud, platinum"] = /obj/item/clothing/ears/earring/stud/platinum + earrings["stud, diamond"] = /obj/item/clothing/ears/earring/stud/diamond + earrings["dangle, glass"] = /obj/item/clothing/ears/earring/dangle/glass + earrings["dangle, wood"] = /obj/item/clothing/ears/earring/dangle/wood + earrings["dangle, iron"] = /obj/item/clothing/ears/earring/dangle/iron + earrings["dangle, steel"] = /obj/item/clothing/ears/earring/dangle/steel + earrings["dangle, silver"] = /obj/item/clothing/ears/earring/dangle/silver + earrings["dangle, gold"] = /obj/item/clothing/ears/earring/dangle/gold + earrings["dangle, platinum"] = /obj/item/clothing/ears/earring/dangle/platinum + earrings["dangle, diamond"] = /obj/item/clothing/ears/earring/dangle/diamond + gear_tweaks += new/datum/gear_tweak/path(earrings) diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm new file mode 100644 index 00000000000..b3875d037a2 --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -0,0 +1,947 @@ +/datum/gear/fluff + path = /obj/item + sort_category = "Fluff Items" + display_name = "If this item can be chosen or seen, ping a coder immediately!" + ckeywhitelist = list("This entry should never be choosable with this variable set.") //If it does, then that means somebody fucked up the whitelist system pretty hard + character_name = list("This entry should never be choosable with this variable set.") + cost = 0 +/* +/datum/gear/fluff/testhorn + path = /obj/item/weapon/bikehorn + display_name = "Airhorn - Example Item" + description = "An example item that you probably shouldn't see!" + ckeywhitelist = list("mewchild") + allowed_roles = list("Station Engineer") +*/ + +// 0-9 CKEYS +/datum/gear/fluff/malady_crop + path = /obj/item/weapon/material/twohanded/fluff/riding_crop/malady + display_name = "Malady's Crop" + ckeywhitelist = list("1r1s") + character_name = list("Malady Blanche") + +// A CKEYS +/datum/gear/fluff/lethe_helmet + path = /obj/item/clothing/head/helmet/hos/fluff/lethe + display_name = "Lethe's Helmet" + ckeywhitelist = list("adk09") + character_name = list("Lethe") + +/datum/gear/fluff/xander_bracer + path = /obj/item/clothing/accessory/bracer/fluff/xander_sthasha + display_name = "Xander's Bracer" + ckeywhitelist = list("aegisoa") + character_name = list("Xander Bevin") + +/datum/gear/fluff/xander_medal + path = /obj/item/clothing/accessory/medal/conduct + display_name = "Xander's Conduct Medal" + ckeywhitelist = list("aegisoa") + character_name = list("Xander Bevin") + +/datum/gear/fluff/lynn_penlight + path = /obj/item/device/flashlight/pen/fluff/lynn + display_name = "Lynn's Penlight" + ckeywhitelist = list("argobargsoup") + character_name = list("Lynn Shady") + +/datum/gear/fluff/aronai_ccmeduniform + path = /obj/item/clothing/under/solgov/utility/sifguard/officer/medical + display_name = "centcom medical uniform" + description = "A medical uniform straight from Central Command." + ckeywhitelist = list("arokha") + character_name = list("Aronai Kadigan") + +/datum/gear/fluff/aronai_ccmedjacket + path = /obj/item/clothing/suit/storage/service/sifguard/medical/command + display_name = "centcom medical jacket" + description = "A medical jacket straight from Central Command." + ckeywhitelist = list("arokha") + character_name = list("Aronai Kadigan") + +// B CKEYS +/datum/gear/fluff/yuuko_kimono + path = /obj/item/clothing/under/fluff/sakura_hokkaido_kimono + display_name = "Yuuko's Kimono" + ckeywhitelist = list("benemuel") + character_name = list("Yuuko Shimmerpond") + +/datum/gear/fluff/cassandra_box + path = /obj/item/weapon/storage/box/fluff/cassandra + display_name = "Cassandra's Box" + ckeywhitelist = list("beyondmylife") + character_name = list("Cassandra Selone") + +/datum/gear/fluff/kilano_dress + path = /obj/item/clothing/under/dress/fluff/kilano + display_name = "Kilano's Dress" + ckeywhitelist = list("beyondmylife") + character_name = list("Kilano Soryu") + +/datum/gear/fluff/kilano_gloves + path = /obj/item/clothing/gloves/fluff/kilano + display_name = "Kilano's Gloves" + ckeywhitelist = list("beyondmylife") + character_name = list("Kilano Soryu") + +/datum/gear/fluff/netra_box + path = /obj/item/weapon/storage/box/fluff/kilano + display_name = "Ne'tra's Box" + ckeywhitelist = list("beyondmylife") + character_name = list("Ne'tra Ky'ram") + +/datum/gear/fluff/nolan_medal + path = /obj/item/clothing/accessory/medal/silver/unity + display_name = "Nolan's Unity Medal" + ckeywhitelist = list("blakeryan") + character_name = list("Nolan Conaway") + +/datum/gear/fluff/xin_sovietuniform + path = /obj/item/clothing/under/soviet + display_name = "Xin's Soviet Uniform" + ckeywhitelist = list("britishrabbit") + character_name = list("Xin Xiao") + description = "This soviet uniform has seen considerable use over the years, it's rather worn in some places, frayed in others and the stomach region has signs of being stretched out repeatedly." + +/datum/gear/fluff/tasald_box + path = /obj/item/weapon/storage/box/fluff/tasald + display_name = "Tasald's Box" + ckeywhitelist = list("bwoincognito") + character_name = list("Tasald Corlethian") + +/datum/gear/fluff/tasald_cartographer_jumpsuit + path = /obj/item/clothing/under/solgov/utility/sifguard/officer/exploration + display_name = "Tasald's Cartographer's uniform - jumpsuit" + ckeywhitelist = list("bwoincognito") + character_name = list("Tasald Corlethian") + +/datum/gear/fluff/tasald_cartographer_jacket + path = /obj/item/clothing/suit/storage/service/sifguard/command + display_name = "Tasald's Cartographer's uniform - jacket" + ckeywhitelist = list("bwoincognito") + character_name = list("Tasald Corlethian") + +/datum/gear/fluff/tasald_cartographer_beret + path = /obj/item/clothing/head/beret/sol/expedition/command + display_name = "Tasald's Cartographer's uniform - beret" + ckeywhitelist = list("bwoincognito") + character_name = list("Tasald Corlethian") + +/datum/gear/fluff/octavius_box + path = /obj/item/weapon/storage/box/fluff/octavious + display_name = "Octavious' Box" + ckeywhitelist = list("bwoincognito") + character_name = list("Octavious Ward") + +/datum/gear/fluff/jayda_meduniform + path = /obj/item/clothing/under/solgov/utility/sifguard/medical/fluff + display_name = "Jayda's Uniform" + ckeywhitelist = list("burritojustice") + character_name = list("Jayda Wilson") + +// C CKEYS +/datum/gear/fluff/james_disk + path = /obj/item/weapon/disk/data + display_name = "James' Disk" + ckeywhitelist = list("cockatricexl") + character_name = list("James Holder") + +/datum/gear/fluff/jasmine_implant + path = /obj/item/weapon/implanter/reagent_generator/jasmine + display_name = "Jasmine's Implant" + ckeywhitelist = list("cameron653") + character_name = list("Jasmine Lizden") + +/datum/gear/fluff/diana_robe + path = /obj/item/clothing/suit/fluff/purp_robes + display_name = "Diana's Robes" + ckeywhitelist = list("cameron653") + character_name = list("Diana Kuznetsova") + +/datum/gear/fluff/diana_tiara + path = /obj/item/clothing/head/fluff/pink_tiara + display_name = "Diana's Tiara" + ckeywhitelist = list("cameron653") + character_name = list("Diana Kuznetsova") + +/datum/gear/fluff/aika_coat + path = /obj/item/clothing/suit/fluff/blue_trimmed_coat + display_name = "Aika's Coat" + ckeywhitelist = list("chaoko99") + character_name = list("Aika Hisakawa") + +/datum/gear/fluff/sariU_disk + path = /obj/item/weapon/disk/limb/eggnerdltd + display_name = "Sari-U's Eggnerd Disk" + ckeywhitelist = list("crossexonar") + character_name = list("Sari-U") + +/datum/gear/fluff/sariE_disk + path = /obj/item/weapon/disk/limb/eggnerdltd + display_name = "Sari-E's Eggnerd Disk" + ckeywhitelist = list("crossexonar") + character_name = list("Sari-E") + +// D CKEYS +/datum/gear/fluff/dhaeleena_medal + path = /obj/item/clothing/accessory/medal/silver/security/fluff/dhael + display_name = "Dhaeleena's Medal" + ckeywhitelist = list("dhaeleena") + character_name = list("Dhaeleena M'iar") + +/datum/gear/fluff/elliot_belt + path = /obj/item/weapon/storage/belt/champion + display_name = "Elliot's Belt" + ckeywhitelist = list("dickfreedomjohnson") + character_name = list("Elliot Richards") + +/datum/gear/fluff/drake_box + path = /obj/item/weapon/storage/box/fluff/drake + display_name = "Drake's Box" + ckeywhitelist = list("drakefrostpaw") + character_name = list("Drake Frostpaw") + +/datum/gear/fluff/theseus_coin + path = /obj/item/weapon/coin/diamond + display_name = "Theseus' Diamond coin" + ckeywhitelist = list("draycu") + character_name = list("Theseus") + description = "An engraved coin made of diamond. On the side for heads is printed the year 2541, along with the letter T. On the side for tails, the letter Y can be seen." + +/datum/gear/fluff/yonra_box + path = /obj/item/weapon/storage/box/fluff/yonra + display_name = "Yonra's Box" + ckeywhitelist = list("draycu") + character_name = list("Schae Yonra") + +// E CKEYS +/datum/gear/fluff/serkii_slippers + path = /obj/item/clothing/shoes/slippers + display_name = "Serkii's Slippers" + ckeywhitelist = list("eekasqueak") + character_name = list("Serkii Miishy") + +/datum/gear/fluff/serkii_skirt + path = /obj/item/clothing/under/skirt/fluff/serkii + display_name = "Serkii's Skirt" + ckeywhitelist = list("eekasqueak") + character_name = list("Serkii Miishy") + +/datum/gear/fluff/jessie_coat + path = /obj/item/clothing/suit/storage/hooded/wintercoat/jessie + display_name = "Jessie's Coat" + ckeywhitelist = list("epiccharger") + character_name = list("Jessie Mare") + +/datum/gear/fluff/verd_medal + path = /obj/item/clothing/accessory/medal/bronze_heart + display_name = "Verd's Medal" + ckeywhitelist = list("epigraphzero") + character_name = list("Verd Woodrow") + +/datum/gear/fluff/erik_medal + path = /obj/item/clothing/accessory/medal/silver/unity + display_name = "Erik's Unity Medal" + ckeywhitelist = list("erikthedog") + character_name = list("Erik Ramadwood") + +// F CKEYS + +// G CKEYS +/datum/gear/fluff/eldi_implant + path = /obj/item/weapon/implanter/reagent_generator/eldi + display_name = "Eldi's Implant" + ckeywhitelist = list("gowst") + character_name = list("Eldi Moljir") + +// H CKEYS +/datum/gear/fluff/lauren_medal + path = /obj/item/clothing/accessory/medal/conduct + display_name = "Lauren's Medal" + ckeywhitelist = list("heroman3003") + character_name = list("Lauren Zackson") + +/datum/gear/fluff/lauren_string + path = /obj/item/clothing/accessory/collar/fluff/goldenstring + display_name = "Lauren's String" + ckeywhitelist = list("heroman3003") + character_name = list("Lauren Zackson") + +/datum/gear/fluff/belle_sizegun + path = /obj/item/weapon/gun/energy/sizegun + display_name = "Belle's Sizegun" + ckeywhitelist = list("hottokeeki") + character_name = list("Belle Day") + +/datum/gear/fluff/belle_implant + path = /obj/item/weapon/implanter/reagent_generator/belle + display_name = "Belle's Implant" + ckeywhitelist = list("hottokeeki") + character_name = list("Belle Day") + +// I CKEYS +/datum/gear/fluff/ruda_badge + path = /obj/item/clothing/accessory/badge/holo/detective/ruda + display_name = "Ruda's Detective Badge" + ckeywhitelist = list("interrolouis") + character_name = list("Ruda Lizden") + +/datum/gear/fluff/kai_modkit + path = /obj/item/borg/upgrade/modkit/chassis_mod/kai + display_name = "Kai's Modkit" + ckeywhitelist = list("interrolouis") + character_name = list("Kai Highlands") + +/datum/gear/fluff/ivy_backpack + path = /obj/item/weapon/storage/backpack/messenger/sec/fluff/ivymoomoo + display_name = "Ivy's Backpack" + ckeywhitelist = list("ivymoomoo") + character_name = list("Ivy Baladeva") + +// J CKEYS +/datum/gear/fluff/mor_box + path = /obj/item/weapon/storage/box/fluff/morxaina + display_name = "Mor's Box" + ckeywhitelist = list("jacknoir413") + character_name = list("Mor Xaina") + +/datum/gear/fluff/areax_staff + path = /obj/item/weapon/storage/backpack/fluff/stunstaff + display_name = "Areax's Stun Staff" + ckeywhitelist = list("jacknoir413") + character_name = list("Areax Third") + allowed_roles = list("Security Officer, Warden, Head of Security") + +/datum/gear/fluff/earthen_uniform + path = /obj/item/clothing/under/fluff/earthenbreath + display_name = "Earthen's Uniform" + ckeywhitelist = list("jacobdragon") + character_name = list("Earthen Breath") + +/datum/gear/fluff/earthen_hairpin + path = /obj/item/clothing/head/fluff/hairflowerpin + display_name = "Earthen's Flower Pin" + ckeywhitelist = list("jacobdragon") + character_name = list("Earthen Breath") + +/datum/gear/fluff/cirra_box + path = /obj/item/weapon/storage/box/fluff/cirra + display_name = "Cirra's Box" + ckeywhitelist = list("jemli") + character_name = list("Cirra Mayhem") + +/datum/gear/fluff/jemli_fedora + path = /obj/item/clothing/head/fedora/fluff/jemli + display_name = "Jemli's Fedora" + ckeywhitelist = list("jemli") + character_name = list("Jemli") + +/datum/gear/fluff/jeremiah_permit + path = /obj/item/clothing/accessory/permit/gun/fluff/ace + display_name = "Ace's Gun Permit" + ckeywhitelist = list("jertheace") + character_name = list("Jeremiah Acacius") + allowed_roles = list("Colony Director", "Warden", "Head of Security") + +/datum/gear/fluff/jeremiah_gun + path = /obj/item/weapon/gun/projectile/p92x/large/preban/hp + display_name = "Ace's Gun" + ckeywhitelist = list("jertheace") + character_name = list("Jeremiah Acacius") + allowed_roles = list("Colony Director", "Warden", "Head of Security") + +/datum/gear/fluff/jeremiah_ammo + path = /obj/item/ammo_magazine/m9mm/large/preban/hp //Spare ammo + display_name = "Ace's Spare Ammo" + ckeywhitelist = list("jertheace") + character_name = list("Jeremiah Acacius") + allowed_roles = list("Colony Director", "Warden", "Head of Security") + +/datum/gear/fluff/jeremiah_holster + path = /obj/item/clothing/accessory/holster/armpit + display_name = "Ace's Holster" + ckeywhitelist = list("jertheace") + character_name = list("Jeremiah Acacius") + allowed_roles = list("Colony Director", "Warden", "Head of Security") + +/datum/gear/fluff/jeremiah_boots + path = /obj/item/clothing/shoes/boots/combat + display_name = "Ace's Boots" + ckeywhitelist = list("jertheace") + character_name = list("Jeremiah Acacius") + +/datum/gear/fluff/jeremiah_combatuniform + path = /obj/item/clothing/under/syndicate/combat + display_name = "Ace's Combat Uniform" + ckeywhitelist = list("jertheace") + character_name = list("Jeremiah Acacius") + +/datum/gear/fluff/joan_backpack + path = /obj/item/weapon/storage/backpack/dufflebag/sec/fluff/joanrisu + display_name = "Joan's backpack" + ckeywhitelist = list("joanrisu") + character_name = list("Joan Risu") + + +/datum/gear/fluff/katarina_backpack + path = /obj/item/weapon/storage/backpack/dufflebag/sec/fluff/katarina + display_name = "Katarina's Backpack" + ckeywhitelist = list("joanrisu") + character_name = list("Katarina Eine") + allowed_roles = list("Colony Director", "Warden", "Head of Security") + +/datum/gear/fluff/emoticon_box + path = /obj/item/weapon/storage/box/fluff/emoticon + display_name = "Emoticon's Box" + ckeywhitelist = list("joey4298") + character_name = list("Emoticon") + +/datum/gear/fluff/emoticon_mimeuniform + path = /obj/item/clothing/under/sexymime + display_name = "Emoticon's Mime Uniform" + ckeywhitelist = list("joey4298") + character_name = list("Emoticon") + +/datum/gear/fluff/emoticon_mimemask + path = /obj/item/clothing/mask/gas/sexymime + display_name = "Emoticon's Mime Mask" + ckeywhitelist = list("joey4298") + character_name = list("Emoticon") + +/datum/gear/fluff/harmony_medal + path = /obj/item/clothing/accessory/medal/gold/heroism + display_name = "Harmony's Heroism Medal" + ckeywhitelist = list("john.wayne9392") + character_name = list("Harmony Pretchl") + +/datum/gear/fluff/harmony_modkit + path = /obj/item/device/modkit_conversion/fluff/harmonysuit + display_name = "Harmony's Modkit" + ckeywhitelist = list("john.wayne9392") + character_name = list("Harmony Pretchl") + +/datum/gear/fluff/harmony_spacemodkit + path = /obj/item/device/modkit_conversion/fluff/harmonyspace + display_name = "Harmony's Modkit 2" + ckeywhitelist = list("john.wayne9392") + character_name = list("Harmony Pretchl") + +/datum/gear/fluff/koyo_box + path = /obj/item/weapon/storage/box/fluff/koyoakimomi + display_name = "Koyo's Box" + ckeywhitelist = list("jwguy") + character_name = list("Koyo Akimomi") + +// K CKEYS +/datum/gear/fluff/smu_medal + path = /obj/item/clothing/accessory/medal/nobel_science + display_name = "SMU's Nobel Science Award" + ckeywhitelist = list("keekenox") + character_name = list("SMU-453") + +/datum/gear/fluff/ketrai_hat + path = /obj/item/clothing/head/fluff/ketrai + display_name = "Ketrai's Hat" + ckeywhitelist = list("ketrai") + character_name = list("Ketrai") + +/datum/gear/fluff/amaya_id + path = /obj/item/weapon/card/id/fluff/amaya + display_name = "Amaya's ID" + ckeywhitelist = list("kiraalitruss") + character_name = list("Amaya Rahl") + +/datum/gear/fluff/kisuke_glasses + path = /obj/item/clothing/glasses/omnihud/kamina + display_name = "Kisuke's Kamina Glasses" + ckeywhitelist = list("kisukegema") + character_name = list("Kisuke Gema") + +/datum/gear/fluff/lassara_sheath + path = /obj/item/clothing/accessory/storage/knifeharness + display_name = "Lassara's Knife Harness" + ckeywhitelist = list("killjaden") + character_name = list("Lassara Faaira'Nrezi") + +/datum/gear/fluff/rana_medal + path = /obj/item/clothing/accessory/medal/silver/unity + display_name = "Rana's Unity Medal" + ckeywhitelist = list("kitchifox") + character_name = list("Rana Uma") + +/datum/gear/fluff/taiga_uniform + path = /obj/item/clothing/under/fluff/taiga + display_name = "Taifa's Uniform" + ckeywhitelist = list("kiwidaninja") + character_name = list("Chakat Taiga") + +/datum/gear/fluff/rischi_implant + path = /obj/item/weapon/implanter/reagent_generator/rischi + display_name = "Rischi's Implant" + ckeywhitelist = list("konabird") + character_name = list("Rischi") + +/datum/gear/fluff/ashley_medal + path = /obj/item/clothing/accessory/medal/nobel_science/fluff/ashley + display_name = "Ashley's Medal" + ckeywhitelist = list("knightfall5") + character_name = list("Ashley Kifer") + +// L CKEYS +/datum/gear/fluff/kenzie_hypospray + path = /obj/item/weapon/reagent_containers/hypospray/vial/kenzie + display_name = "Kenzie's Hypospray" + ckeywhitelist = list("lm40") + character_name = list("Kenzie Houser") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic") + +/datum/gear/fluff/brianna_backpack + path = /obj/item/weapon/storage/backpack/messenger/black/fluff/briana + display_name = "Briana's Backpack" + ckeywhitelist = list("luminescentring") + character_name = list("Briana Moore") + +/datum/gear/fluff/savannah_implant + path = /obj/item/weapon/implanter/reagent_generator/savannah + display_name = "Savannah's Implant" + ckeywhitelist = list("lycanthorph") + character_name = list("Savannah Dixon") + +// M CKEYS +/datum/gear/fluff/phi_box + path = /obj/item/weapon/storage/box/fluff/phi + display_name = "Phi's Box" + ckeywhitelist = list("mewchild") + character_name = list("Phi Vietsi") + +/datum/gear/fluff/giliana_labcoat + path = /obj/item/clothing/suit/storage/toggle/labcoat/fluff/molenar + display_name = "Giliana's Labcoat" + ckeywhitelist = list("molenar") + character_name = list("Giliana Gamish") + +/datum/gear/fluff/myryan_belt + path = /obj/item/weapon/storage/belt/utility/fluff/vulpine + display_name = "Myryan's Belt" + ckeywhitelist = list("myryan") + character_name = list("Myryan Karnage-Cunningham") + +/datum/gear/fluff/resh_uniform + path = /obj/item/clothing/suit/security/navyhos + display_name = "Resh's HoS Uniform" + ckeywhitelist = list("mrsignmeup") + character_name = list("Reshskakskakss Seekiseekis") + allowed_roles = list("Head of Security") + +/datum/gear/fluff/daniel_medal + path = /obj/item/clothing/accessory/medal/conduct + display_name = "Daniel's Conduct Medal" + ckeywhitelist = list("mrsignmeup") + character_name = list("Daniel Fisher") + +// N CKEYS +/datum/gear/fluff/awen_hat + path = /obj/item/clothing/head/fluff/wolfgirl + display_name = "Awen's Hat" + ckeywhitelist = list("natje") + character_name = list("Awen Henry") + +/datum/gear/fluff/awen_shoes + path = /obj/item/clothing/shoes/fluff/wolfgirl + ckeywhitelist = list("natje") + character_name = list("Awen Henry") + +/datum/gear/fluff/awen_uniform + path = /obj/item/clothing/under/fluff/wolfgirl + display_name = "Awen's Uniform" + ckeywhitelist = list("natje") + character_name = list("Awen Henry") + +/datum/gear/fluff/pumila_vines + path = /obj/item/clothing/under/fluff/aluranevines + display_name = "Pumila's Vines" + ckeywhitelist = list("natje") + character_name = list("Pumila") + +/datum/gear/fluff/annie_sweater + path = /obj/item/clothing/accessory/sweater/fluff/annie + display_name = "Annie's Sweater" + ckeywhitelist = list("nepox") + character_name = list("Annie Rose") + +// O CKEYS +/datum/gear/fluff/richard_chain + path = /obj/item/weapon/melee/fluff/holochain + display_name = "Richard's Holochain" + ckeywhitelist = list("orbisa") + character_name = list("Richard D'angelo") + +// P CKEYS +/datum/gear/fluff/lily_medal + path = /obj/item/clothing/accessory/medal/silver/unity + display_name = "Lily's Unity Medal" + ckeywhitelist = list("phoaly") + character_name = list("Lily Maximus") + +/datum/gear/fluff/lucuis_battery + path = /obj/item/weapon/fluff/dragor_dot + display_name = "Lucuis' Spare Battery" + ckeywhitelist = list("pontifexminimus") + character_name = list("Lucius Null") + +/datum/gear/fluff/lucia_battery + path = /obj/item/weapon/fluff/dragor_dot + display_name = "Lucia's Spare Battery" + ckeywhitelist = list("pontifexminimus") + character_name = list("Lucia Null") + +// Q CKEYS + +// R CKEYS +/datum/gear/fluff/tiemli_weldinggoggles + path = /obj/item/clothing/glasses/welding/tiemgogs + display_name = "Tiemli's Welding Goggles" + ckeywhitelist = list("radiantaurora") + character_name = list("Tiemli Kroto") + allowed_roles = list("Roboticist") + +// S CKEYS +/datum/gear/fluff/kateryna_voidsuit + path = /obj/item/clothing/suit/space/void/engineering/kate + display_name = "Kateryna's Voidsuit" + ckeywhitelist = list("samanthafyre") + character_name = list("Kateryna Petrovitch") + allowed_roles = list("Station Engineer", "Chief Engineer", "Atmospheric Technician") + +/datum/gear/fluff/katerina_spacesuit + path = /obj/item/clothing/head/helmet/space/fluff/kate + display_name = "Kateryna's Helmet" + ckeywhitelist = list("samanthafyre") + character_name = list("Kateryna Petrovitch") + allowed_roles = list("Station Engineer", "Chief Engineer", "Atmospheric Technician") + +/datum/gear/fluff/kateryna_armorvest + path = /obj/item/clothing/suit/armor/vest/wolftaur/kate + display_name = "Kateryna's Armor Vest" + ckeywhitelist = list("samanthafyre") + character_name = list("Kateryna Petrovitch") + allowed_roles = list("Security Officer", "Warden", "Head of Security", "Colony Director", "Head of Personnel") + +/datum/gear/fluff/viktor_flask + path = /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask/fluff/viktor + display_name = "Viktor's Flask" + ckeywhitelist = list("semaun") + character_name = list("Viktor Solothurn") + +/datum/gear/fluff/scree_modkit + path = /obj/item/device/modkit_conversion/fluff/screekit + display_name = "Scree's Modkit" + ckeywhitelist = list("scree") + character_name = list("Scree") + +/datum/gear/fluff/scree_pompom + path = /obj/item/clothing/head/fluff/pompom + display_name = "Scree's Weird PopPom thing" + ckeywhitelist = list("scree") + character_name = list("Scree") + +/datum/gear/fluff/alfonso_sunglasses + path = /obj/item/clothing/glasses/sunglasses/fluff/alfonso + display_name = "Alfonso's Sunglasses" + ckeywhitelist = list("seiga") + character_name = list("Alfonso Oak Telanor") + +/datum/gear/fluff/nthasd_modkit //Converts a Security suit's sprite + path = /obj/item/device/modkit_conversion/hasd + display_name = "NT-HASD #556's Modkit" + ckeywhitelist = list("silencedmp5a5") + character_name = list("NT-HASD #556") + allowed_roles = list("Colony Director", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective") + +/datum/gear/fluff/tasy_clownuniform + path = /obj/item/clothing/under/sexyclown + display_name = "Tasy's Clown Uniform" + ckeywhitelist = list("silvertalismen") + character_name = list("Tasy Ruffles") + +/datum/gear/fluff/tasy_clownmask + path = /obj/item/clothing/mask/gas/sexyclown + display_name = "Tasy's Clownmask" + ckeywhitelist = list("silvertalismen") + character_name = list("Tasy Ruffles") + +/datum/gear/fluff/tasy_clownPDA + path = /obj/item/device/pda/clown + display_name = "Tasy's Clown PDA" + ckeywhitelist = list("silvertalismen") + character_name = list("Tasy Ruffles") + +/datum/gear/fluff/evian_implant + path = /obj/item/weapon/implanter/reagent_generator/evian + display_name = "Evian's Implant" + ckeywhitelist = list("silvertalismen") + character_name = list("Evian") + +/datum/gear/fluff/fortune_backpack + path = /obj/item/weapon/storage/backpack/satchel/fluff/swat43bag + display_name = "Fortune's Backpack" + ckeywhitelist = list("swat43") + character_name = list("Fortune Bloise") + +/datum/gear/fluff/alexis_cane + path = /obj/item/weapon/cane/wand + display_name = "Alexis' Cane" + ckeywhitelist = list("stobarico") + character_name = list("Alexis Bloise") + +/datum/gear/fluff/roiz_implant + path = /obj/item/weapon/implanter/reagent_generator/roiz + display_name = "Roiz's Implant" + ckeywhitelist = list("spoopylizz") + character_name = list("Roiz Lizden") + +/datum/gear/fluff/roiz_coat + path = /obj/item/clothing/suit/storage/hooded/wintercoat/roiz + display_name = "Roiz's Coat" + ckeywhitelist = list("spoopylizz") + character_name = list("Roiz Lizden") + +/datum/gear/fluff/silent_mimemask + path = /obj/item/clothing/mask/gas/sexymime + display_name = "Silent Stripe's Mime Mask" + ckeywhitelist = list("suicidalpickles") + character_name = list("Silent Stripes") + +/datum/gear/fluff/silent_mimeuniform + path = /obj/item/clothing/under/sexymime + display_name = "Silent Stripe's Mime Uniform" + ckeywhitelist = list("suicidalpickles") + character_name = list("Silent Stripes") + +// T CKEYS +/datum/gear/fluff/ascian_medal + path = /obj/item/clothing/accessory/medal/silver/unity + display_name = "Ascian's Unity Medal" + ckeywhitelist = list("tabiranth") + character_name = list("Ascian") + +/datum/gear/fluff/ascian_spiritspawner + path = /obj/item/weapon/grenade/spawnergrenade/spirit + display_name = "The Best Kitten" + ckeywhitelist = list("tabiranth") + character_name = list("Ascian") + +/datum/gear/fluff/ascian_shelterpod + path = /obj/item/device/survivalcapsule/tabiranth + display_name = "Ascian's Shelterpod" + ckeywhitelist = list("tabiranth") + character_name = list("Ascian") + +/datum/gear/fluff/lasshseeki_ealimplant + path = /obj/item/weapon/implant/language/eal + display_name = "Lasshseeki's EAL Implant" + ckeywhitelist = list("techtypes") + character_name = list("Lasshseeki Korss") + +/datum/gear/fluff/nick_medal + path = /obj/item/clothing/accessory/medal/conduct + display_name = "Nick's Conduct Medal" + ckeywhitelist = list("thedavestdave") + character_name = list("Nick Sloan") + +/datum/gear/fluff/konor_medal + path = /obj/item/clothing/accessory/medal/silver/unity + display_name = "Konor's Unity Medal" + ckeywhitelist = list("tinydude16") + character_name = list("Konor Foxe") + +// U CKEYS + +// V CKEYS +/datum/gear/fluff/vakashi_permit + path = /obj/item/clothing/accessory/permit/gun/fluff/Vakashi + display_name = "Vakashi's Pepperspray Permit" + ckeywhitelist = list("vailthewolf") + character_name = list("Vakashi") + +/datum/gear/fluff/vakashi_pepperspray + path = /obj/item/weapon/reagent_containers/spray/pepper + display_name = "Vakashi's Pepperspray" + ckeywhitelist = list("vailthewolf") + character_name = list("Vakashi") + +/datum/gear/fluff/cameron_glasses + path = /obj/item/clothing/glasses/fluff/science_proper + display_name = "Cameron's Science Glasses" + ckeywhitelist = list("verkister") + character_name = list("Cameron Eggbert") + +/datum/gear/fluff/cameron_disk + path = /obj/item/weapon/disk/limb/eggnerdltd + display_name = "Cameron's Eggnerd Disk" + ckeywhitelist = list("verkister") + character_name = list("Cameron Eggbert") + +/datum/gear/fluff/opie_glasses + path = /obj/item/clothing/glasses/fluff/spiffygogs + display_name = "Opie's Goggles" + ckeywhitelist = list("verkister") + character_name = list("Opie Eggbert") + +/datum/gear/fluff/verin_hazardvest + path = /obj/item/clothing/suit/storage/hazardvest/fluff/verin + display_name = "Verin's Hazard Vest" + ckeywhitelist = list("virgo113") + character_name = list("Verin Raharra") + +/datum/gear/fluff/lucina_pda + path = /obj/item/device/pda/heads/cmo/fluff/lucinapda + display_name = "Lucina's PDA" + ckeywhitelist = list("vorrarkul") + character_name = list("Lucina Dakarim") + +/datum/gear/fluff/lucina_medal + path = /obj/item/clothing/accessory/medal/gold/fluff/lucina + display_name = "Lucina's Gold Medal" + ckeywhitelist = list("vorrarkul") + character_name = list("Lucina Dakarim") + +/datum/gear/fluff/lucina_dress + path = /obj/item/clothing/under/dress/fluff/lucinadress + display_name = "Lucina's Dress" + ckeywhitelist = list("vorrarkul") + character_name = list("Lucina Dakarim") + +/datum/gear/fluff/melanie_skeleton + path = /obj/item/clothing/under/fluff/slime_skeleton + display_name = "Melanie's Skeleton" + ckeywhitelist = list("vorrarkul") + character_name = list("Melanie Farmer") + +/datum/gear/fluff/nyssa_coat + path = /obj/item/clothing/suit/storage/hooded/wintercoat/cargo + display_name = "Nyssa's Coat" + ckeywhitelist = list("vorrarkul") + character_name = list("Nyssa Brennan") + +/datum/gear/fluff/theodora_suit + path = /obj/item/clothing/suit/chococoat + display_name = "Theodora's Coat" + ckeywhitelist = list("vorrarkul") + character_name = list("Theodora Lindt") + +/datum/gear/fluff/theodora_implant + path = /obj/item/weapon/implanter/reagent_generator/vorrarkul + display_name = "Theodora's Implant" + ckeywhitelist = list("vorrarkul") + character_name = list("Theodora Lindt") + +/datum/gear/fluff/kaitlyn_plush + path = /obj/item/toy/plushie/mouse/fluff + display_name = "Kaitlyn's Mouse Plush" + ckeywhitelist = list("vorrarkul") + character_name = list("Kaitlyn Fiasco") + +/datum/gear/fluff/keturah_maiddress + path = /obj/item/clothing/under/dress/maid/ + display_name = "Keturah's Maid Dress" + ckeywhitelist = list("viveret") + character_name = list("Keturah") + +/datum/gear/fluff/silentio_mimeuniform + path = /obj/item/clothing/under/sexymime + display_name = "Silentio's Mime Uniform" + ckeywhitelist = list("viveret") + character_name = list("Silentio") + +/datum/gear/fluff/silentio_mimemask + path = /obj/item/clothing/mask/gas/sexymime + display_name = "Silentio's Mime Mask" + ckeywhitelist = list("Viveret") + character_name = list("Silentio") + +// W CKEYS +/datum/gear/fluff/sthasha_bracer + path = /obj/item/clothing/accessory/bracer/fluff/xander_sthasha + display_name = "S'thasha's Bracer" + ckeywhitelist = list("wanderingdeviant") + character_name = list("S'thasha Tavakdavi") + +/datum/gear/fluff/silas_glasses + path = /obj/item/clothing/glasses/threedglasses + display_name = "Silas' 3-D Glasses" + ckeywhitelist = list("werebear") + character_name = list("Silas Newton") + +/datum/gear/fluff/vinjj_weldingmask + path = /obj/item/clothing/head/welding/fluff/vinjj + display_name = "Vinjj's Welding Mask" + ckeywhitelist = list("whiskyrose") + character_name = list("Vinjj") + +/datum/gear/fluff/tempest_hudglases + path = /obj/item/clothing/glasses/omnihud/med/fluff/wickedtemphud + display_name = "Tempest's Medical Hud" + ckeywhitelist = list("wickedtemp") + character_name = list("Chakat Tempest Venesare") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic") + +/datum/gear/fluff/tempest_hypospray + path = /obj/item/weapon/reagent_containers/hypospray/vial/tempest + display_name = "Tempest's Hypospray" + ckeywhitelist = list("wickedtemp") + character_name = list("Chakat Tempest Venesare") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic") + +/datum/gear/fluff/tempest_backpack + path = /obj/item/weapon/storage/backpack/saddlebag/tempest + display_name = "Tempest's Saddlebag" + ckeywhitelist = list("wickedtemp") + character_name = list("Chakat Tempest Venesare") + +/datum/gear/fluff/tempest_implant + path = /obj/item/weapon/implanter/reagent_generator/tempest + display_name = "Tempest's Implant" + ckeywhitelist = list("wickedtemp") + character_name = list("Chakat Tempest Venesare") + +// X CKEYS +/datum/gear/fluff/penelope_box + path = /obj/item/weapon/storage/box/fluff/penelope + display_name = "Penelope's Box" + ckeywhitelist = list("xsdew") + character_name = list("Penelope Allen") + +/datum/gear/fluff/ali_medal + path = /obj/item/clothing/accessory/medal/silver/unity + display_name = "Ali's Unity Medal" + ckeywhitelist = list("xonkon") + character_name = list("Ali") + +// Y CKEYS + +// Z CKEYS +/datum/gear/fluff/tachika_medal + path = /obj/item/clothing/accessory/medal/conduct + display_name = "Tachika's Conduct Medal" + ckeywhitelist = list("zammyman") + character_name = list("Tachika") + +/datum/gear/fluff/zaoozaoo_hat + path = /obj/item/clothing/head/fluff/zao + display_name = "Zaoozaoo's Hat" + ckeywhitelist = list("zigfe") + character_name = list("Zaoozaoo Xrimxuqmqixzix") + +/datum/gear/fluff/nehi_radio + path = /obj/item/device/radio/headset/fluff/zodiacshadow + display_name = "Nehi's Radio" + ckeywhitelist = list("zodiacshadow") + character_name = list("Nehi Maximus") + +/datum/gear/fluff/star_sweater + path = /obj/item/clothing/accessory/sweater/fluff/star + display_name = "Star Sweater" + ckeywhitelist = list("bacon12366") + character_name = list("Elly Brown") \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm index 719ba98a382..e7bb0493f32 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm @@ -1,9 +1,3 @@ -/datum/gear/suit/roles/poncho/cloak/research - allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist", "Explorer", "Pathfinder") - -/datum/gear/suit/roles/poncho/cloak/medical - allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Field Medic") - /datum/gear/suit/wintercoat/medical allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Field Medic") diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm index 1508905c601..be65b874a61 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm @@ -3,9 +3,9 @@ path = /obj/item/clothing/under/permit //Polaris overrides -/datum/gear/uniform/pt/sifguard +/datum/gear/uniform/solgov/pt/sifguard display_name = "pt uniform, planetside sec" - path = /obj/item/clothing/under/pt/sifguard + path = /obj/item/clothing/under/solgov/pt/sifguard //KHI Uniforms /datum/gear/uniform/job_khi/cmd @@ -168,4 +168,8 @@ Swimsuits //Tron Siren outfit /datum/gear/uniform/siren display_name = "jumpsuit, Siren" - path = /obj/item/clothing/under/fluff/siren \ No newline at end of file + path = /obj/item/clothing/under/fluff/siren + +/datum/gear/uniform/suit/v_nanovest + display_name = "Varmacorp nanovest" + path = /obj/item/clothing/under/fluff/v_nanovest \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index 2a1e88cd359..40fe71a0872 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -124,6 +124,24 @@ path = /obj/item/weapon/implant/tracking/weak cost = 0 //VOREStation Edit. Changed cost to 0 +/datum/gear/utility/implant/neural + display_name = "implant, neural assistance web" + description = "A complex web implanted into the subject, medically in order to compensate for neurological disease." + path = /obj/item/weapon/implant/neural + cost = 6 + +/datum/gear/utility/implant/dud1 + display_name = "implant, head" + description = "An implant with no obvious purpose." + path = /obj/item/weapon/implant/dud + cost = 1 + +/datum/gear/utility/implant/dud2 + display_name = "implant, torso" + description = "An implant with no obvious purpose." + path = /obj/item/weapon/implant/dud/torso + cost = 1 + /datum/gear/utility/implant/language cost = 2 exploitable = 0 diff --git a/code/modules/client/preference_setup/loadout/loadout_vr.dm b/code/modules/client/preference_setup/loadout/loadout_vr.dm new file mode 100644 index 00000000000..1f7a31311e4 --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_vr.dm @@ -0,0 +1,3 @@ +/datum/gear + var/list/ckeywhitelist + var/list/character_name \ No newline at end of file diff --git a/code/modules/client/preference_setup/traits/trait_defines.dm b/code/modules/client/preference_setup/traits/trait_defines.dm index aa53392f2c4..8ad3ff9253b 100644 --- a/code/modules/client/preference_setup/traits/trait_defines.dm +++ b/code/modules/client/preference_setup/traits/trait_defines.dm @@ -72,25 +72,45 @@ Regardless, you find it quite difficult to land shots where you wanted them to go." modifier_type = /datum/modifier/trait/inaccurate -/datum/trait/modifier/physical/smaller - name = "Smaller" - modifier_type = /datum/modifier/trait/smaller - mutually_exclusive = list(/datum/trait/modifier/physical/small, /datum/trait/modifier/physical/large, /datum/trait/modifier/physical/larger) +/datum/trait/modifier/physical/shorter + name = "Shorter" + modifier_type = /datum/modifier/trait/shorter + mutually_exclusive = list(/datum/trait/modifier/physical/short, /datum/trait/modifier/physical/tall, /datum/trait/modifier/physical/taller) -/datum/trait/modifier/physical/small - name = "Small" - modifier_type = /datum/modifier/trait/small - mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/large, /datum/trait/modifier/physical/larger) +/datum/trait/modifier/physical/short + name = "Short" + modifier_type = /datum/modifier/trait/short + mutually_exclusive = list(/datum/trait/modifier/physical/shorter, /datum/trait/modifier/physical/tall, /datum/trait/modifier/physical/taller) -/datum/trait/modifier/physical/large - name = "Large" - modifier_type = /datum/modifier/trait/large - mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/small, /datum/trait/modifier/physical/larger) +/datum/trait/modifier/physical/tall + name = "Tall" + modifier_type = /datum/modifier/trait/tall + mutually_exclusive = list(/datum/trait/modifier/physical/shorter, /datum/trait/modifier/physical/short, /datum/trait/modifier/physical/taller) -/datum/trait/modifier/physical/larger - name = "Larger" - modifier_type = /datum/modifier/trait/larger - mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/small, /datum/trait/modifier/physical/large) +/datum/trait/modifier/physical/taller + name = "Taller" + modifier_type = /datum/modifier/trait/taller + mutually_exclusive = list(/datum/trait/modifier/physical/shorter, /datum/trait/modifier/physical/short, /datum/trait/modifier/physical/tall) + +/datum/trait/modifier/physical/thin + name = "Thin" + modifier_type = /datum/modifier/trait/thin + mutually_exclusive = list(/datum/trait/modifier/physical/fat, /datum/trait/modifier/physical/obese, /datum/trait/modifier/physical/thinner) + +/datum/trait/modifier/physical/thinner + name = "Rail Thin" + modifier_type = /datum/modifier/trait/thinner + mutually_exclusive = list(/datum/trait/modifier/physical/fat, /datum/trait/modifier/physical/obese, /datum/trait/modifier/physical/thin) + +/datum/trait/modifier/physical/fat + name = "Broad-Shouldered" + modifier_type = /datum/modifier/trait/fat + mutually_exclusive = list(/datum/trait/modifier/physical/thin, /datum/trait/modifier/physical/obese, /datum/trait/modifier/physical/thinner) + +/datum/trait/modifier/physical/obese + name = "Heavily Built" + modifier_type = /datum/modifier/trait/obese + mutually_exclusive = list(/datum/trait/modifier/physical/fat, /datum/trait/modifier/physical/thinner, /datum/trait/modifier/physical/thin) /datum/trait/modifier/physical/colorblind_protanopia name = "Protanopia" diff --git a/code/modules/client/preference_setup/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm index dcccf64ae05..2fe8b54e983 100644 --- a/code/modules/client/preference_setup/vore/02_size.dm +++ b/code/modules/client/preference_setup/vore/02_size.dm @@ -46,7 +46,6 @@ character.weight_loss = pref.weight_loss character.fuzzy = pref.fuzzy character.appearance_flags -= pref.fuzzy*PIXEL_SCALE - character.appearance_flags |= KEEP_TOGETHER character.resize(pref.size_multiplier, animate = FALSE) /datum/category_item/player_setup_item/vore/size/content(var/mob/user) diff --git a/code/modules/client/preference_setup/vore/06_vantag.dm b/code/modules/client/preference_setup/vore/06_vantag.dm index 65bc66a4955..c65c379bf23 100644 --- a/code/modules/client/preference_setup/vore/06_vantag.dm +++ b/code/modules/client/preference_setup/vore/06_vantag.dm @@ -27,7 +27,7 @@ /datum/category_item/player_setup_item/vore/vantag/content(var/mob/user) . += "
    " - . += "Event Volunteer: [pref.vantag_volunteer ? "Yes" : "No"]
    " + . += "Event Volunteer: [pref.vantag_volunteer ? "Yes" : "No"]
    " . += "Event Pref: [vantag_choices_list[pref.vantag_preference]]
    " /datum/category_item/player_setup_item/vore/vantag/OnTopic(var/href, var/list/href_list, var/mob/user) diff --git a/code/modules/client/preference_setup/vore/09_misc.dm b/code/modules/client/preference_setup/vore/09_misc.dm index 951e469d8db..2911c8a10d0 100644 --- a/code/modules/client/preference_setup/vore/09_misc.dm +++ b/code/modules/client/preference_setup/vore/09_misc.dm @@ -25,7 +25,7 @@ /datum/category_item/player_setup_item/vore/misc/content(var/mob/user) . += "
    " . += "Appear in Character Directory: [pref.show_in_directory ? "Yes" : "No"]
    " - . += "Sensor Preferences: [sensorpreflist[pref.sensorpref]]
    " //TFF 5/8/19 - Allow selection of sensor settings from off, binary, vitals, tracking, or random + . += "Suit Sensors Preference: [sensorpreflist[pref.sensorpref]]
    " //TFF 5/8/19 - Allow selection of sensor settings from off, binary, vitals, tracking, or random /datum/category_item/player_setup_item/vore/misc/OnTopic(var/href, var/list/href_list, var/mob/user) if(href_list["toggle_show_in_directory"]) diff --git a/code/modules/client/preferences_toggle_procs.dm b/code/modules/client/preferences_toggle_procs.dm index fa51b9e4e94..0bf770e76ce 100644 --- a/code/modules/client/preferences_toggle_procs.dm +++ b/code/modules/client/preferences_toggle_procs.dm @@ -224,6 +224,21 @@ feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/client/verb/toggle_air_pump_hum() + set name = "Toggle Air Pump Noise" + set category = "Preferences" + set desc = "Toggles Air Pumps humming" + + var/pref_path = /datum/client_preference/air_pump_noise + + toggle_preference(pref_path) + + to_chat(src, "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear air pumps hum, start, and stop.") + + SScharacter_setup.queue_preferences_save(prefs) + + feedback_add_details("admin_verb","TAirPumpNoise") + /client/verb/toggle_safe_firing() set name = "Toggle Gun Firing Intent Requirement" set category = "Preferences" diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm index 61c2d83025a..5c8171ce27c 100644 --- a/code/modules/client/preferences_vr.dm +++ b/code/modules/client/preferences_vr.dm @@ -2,3 +2,35 @@ datum/preferences var/show_in_directory = 1 //TFF 5/8/19 - show in Character Directory var/sensorpref = 5 //TFF 5/8/19 - set character's suit sensor level + +//Why weren't these in game toggles already? +/client/verb/toggle_eating_noises() + set name = "Eating Noises" + set category = "Preferences" + set desc = "Toggles Vore Eating noises." + + var/pref_path = /datum/client_preference/eating_noises + + toggle_preference(pref_path) + + src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear eating related vore noises." + + SScharacter_setup.queue_preferences_save(prefs) + + feedback_add_details("admin_verb","TEatNoise") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + +/client/verb/toggle_digestion_noises() + set name = "Digestion Noises" + set category = "Preferences" + set desc = "Toggles Vore Digestion noises." + + var/pref_path = /datum/client_preference/digestion_noises + + toggle_preference(pref_path) + + src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear digestion related vore noises." + + SScharacter_setup.queue_preferences_save(prefs) + + feedback_add_details("admin_verb","TDigestNoise") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index b5aa5d7594d..8af9f36d534 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -293,6 +293,17 @@ punch_force = initial(punch_force) wearer = null +/obj/item/clothing/gloves + var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? + var/special_attack_type = null + +/obj/item/clothing/gloves/New() + ..() + if(special_attack_type && ispath(special_attack_type)) + special_attack = new special_attack_type + + + ///////////////////////////////////////////////////////////////////// //Rings @@ -502,6 +513,7 @@ if(usr.put_in_hands(holding)) usr.visible_message("\The [usr] pulls a knife out of their boot!") holding = null + overlays -= image(icon, "[icon_state]_knife") else usr << "Your need an empty, unbroken hand to do that." holding.forceMove(src) @@ -546,14 +558,25 @@ update_icon() /obj/item/clothing/shoes/update_icon() - overlays.Cut() + overlays.Cut() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. + if(blood_DNA) + add_blood() if(holding) overlays += image(icon, "[icon_state]_knife") + if(contaminated) + overlays += contamination_overlay + if(gurgled) //VOREStation Edit Start + decontaminate() + gurgle_contaminate() //VOREStation Edit End if(ismob(usr)) var/mob/M = usr M.update_inv_shoes() return ..() +/obj/item/clothing/shoes/clean_blood() + update_icon() + return ..() + /obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) if(prob(1) && !recent_squish) //VOREStation edit begin recent_squish = 1 diff --git a/code/modules/clothing/clothing_vr.dm b/code/modules/clothing/clothing_vr.dm index 9c04fc98413..3e8d2d45ad1 100644 --- a/code/modules/clothing/clothing_vr.dm +++ b/code/modules/clothing/clothing_vr.dm @@ -4,6 +4,10 @@ /obj/item/clothing/shoes var/list/inside_emotes = list() var/recent_squish = 0 + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/seromi/shoes.dmi', + SPECIES_VOX = 'icons/mob/species/vox/shoes.dmi', + SPECIES_WEREBEAST = 'icons/mob/species/werebeast/feet.dmi') /obj/item/clothing/shoes/New() inside_emotes = list( @@ -51,6 +55,17 @@ ..() +/obj/item/clothing/gloves + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/seromi/gloves.dmi', + SPECIES_VOX = 'icons/mob/species/vox/gloves.dmi', + SPECIES_WEREBEAST = 'icons/mob/species/werebeast/hands.dmi') + +/obj/item/clothing/ears + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi', + SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi') + /obj/item/clothing/relaymove(var/mob/living/user,var/direction) if(recent_struggle) @@ -98,13 +113,18 @@ SPECIES_ZORREN_FLAT = 'icons/mob/species/fennec/mask_vr.dmi', SPECIES_AKULA = 'icons/mob/species/akula/mask_vr.dmi', SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/mask.dmi', - SPECIES_XENOCHIMERA = 'icons/mob/species/tajaran/mask_vr.dmi' + SPECIES_XENOCHIMERA = 'icons/mob/species/tajaran/mask_vr.dmi', + SPECIES_WEREBEAST = 'icons/mob/species/werebeast/masks.dmi' ) //"Spider" = 'icons/mob/species/spider/mask_vr.dmi' Add this later when they have custom mask sprites and everything. //Switch to taur sprites if a taur equips /obj/item/clothing/suit var/taurized = FALSE //Easier than trying to 'compare icons' to see if it's a taur suit + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi', + SPECIES_VOX = 'icons/mob/species/vox/suit.dmi', + SPECIES_WEREBEAST = 'icons/mob/species/werebeast/suit.dmi') /obj/item/clothing/suit/equipped(var/mob/user, var/slot) var/normalize = TRUE @@ -126,7 +146,7 @@ return ..() // Taur suits need to be shifted so its centered on their taur half. -/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0) +/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) var/image/standing = ..() if(taurized) //Special snowflake var on suits standing.pixel_x = -16 @@ -137,6 +157,10 @@ /obj/item/clothing/under sensor_mode = 3 var/sensorpref = 5 + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/seromi/uniform.dmi', + SPECIES_VOX = 'icons/mob/species/vox/uniform.dmi', + SPECIES_WEREBEAST = 'icons/mob/species/werebeast/uniform.dmi') //TFF 5/8/19 - define numbers and specifics for suit sensor settings /obj/item/clothing/under/New(var/mob/living/carbon/human/H) @@ -150,4 +174,10 @@ if(5) sensor_mode = pick(0,1,2,3) //Select a random setting else sensor_mode = pick(0,1,2,3) - log_debug("Invalid switch for suit sensors, defaulting to random. [sensorpref] chosen") \ No newline at end of file + log_debug("Invalid switch for suit sensors, defaulting to random. [sensorpref] chosen") + +/obj/item/clothing/head + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi', + SPECIES_VOX = 'icons/mob/species/vox/head.dmi', + SPECIES_WEREBEAST = 'icons/mob/species/werebeast/head.dmi') \ No newline at end of file diff --git a/code/modules/clothing/ears/earrings.dm b/code/modules/clothing/ears/earrings.dm new file mode 100644 index 00000000000..154f69f44a9 --- /dev/null +++ b/code/modules/clothing/ears/earrings.dm @@ -0,0 +1,78 @@ +//Material earrings +/obj/item/clothing/ears/earring + name = "earring" + desc = "An earring of some kind." + icon = 'icons/obj/clothing/ears.dmi' + +/obj/item/clothing/ears/earring/stud + name = "pearl stud earrings" + desc = "A pair of small stud earrings." + icon_state = "ear_stud" + color = "#eae0c8" + +/obj/item/clothing/ears/earring/stud/glass + name = "glass stud earrings" + color = "#00e1ff" + +/obj/item/clothing/ears/earring/stud/wood + name = "wood stud earrings" + color = "#824b28" + +/obj/item/clothing/ears/earring/stud/iron + name = "iron stud earrings" + color = "#5c5454" + +/obj/item/clothing/ears/earring/stud/steel + name = "steel stud earrings" + color = "#666666" + +/obj/item/clothing/ears/earring/stud/silver + name = "silver stud earrings" + color = "#d1e6e3" + +/obj/item/clothing/ears/earring/stud/gold + name = "gold stud earrings" + color = "#edd12f" + +/obj/item/clothing/ears/earring/stud/platinum + name = "platinum stud earrings" + color = "#9999ff" + +/obj/item/clothing/ears/earring/stud/diamond + name = "diamond stud earrings" + color = "#00ffe1" + +/obj/item/clothing/ears/earring/dangle + icon_state = "ear_dangle" + +/obj/item/clothing/ears/earring/dangle/glass + name = "glass dangle earrings" + color = "#00e1ff" + +/obj/item/clothing/ears/earring/dangle/wood + name = "wood dangle earrings" + color = "#824b28" + +/obj/item/clothing/ears/earring/dangle/iron + name = "iron dangle earrings" + color = "#5c5454" + +/obj/item/clothing/ears/earring/dangle/steel + name = "steel dangle earrings" + color = "#666666" + +/obj/item/clothing/ears/earring/dangle/silver + name = "silver dangle earrings" + color = "#d1e6e3" + +/obj/item/clothing/ears/earring/dangle/gold + name = "gold dangle earrings" + color = "#edd12f" + +/obj/item/clothing/ears/earring/dangle/platinum + name = "platinum dangle earrings" + color = "#9999ff" + +/obj/item/clothing/ears/earring/dangle/diamond + name = "diamond dangle earrings" + color = "#00ffe1" \ No newline at end of file diff --git a/code/modules/clothing/glasses/glasses_vr.dm b/code/modules/clothing/glasses/glasses_vr.dm index 1d7cb0087f5..90e53d89b2e 100644 --- a/code/modules/clothing/glasses/glasses_vr.dm +++ b/code/modules/clothing/glasses/glasses_vr.dm @@ -111,3 +111,10 @@ item_state = "tajblind_meson" off_state = "tajblind" body_parts_covered = EYES + +/obj/item/clothing/glasses + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/seromi/eyes.dmi', + SPECIES_VOX = 'icons/mob/species/vox/eyes.dmi', + SPECIES_WEREBEAST = 'icons/mob/species/werebeast/eyes.dmi' + ) \ No newline at end of file diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index a456e85939a..a030bc038c5 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -15,7 +15,7 @@ /obj/item/clothing/gloves/fyellow/Initialize() . = ..() //Picks a value between 0 and 1.25, in 5% increments // VOREStation edit - var/shock_pick = rand(0,25) // VOREStation Edit + var/shock_pick = rand(0,15) // VOREStation Edit siemens_coefficient = shock_pick * 0.05 /obj/item/clothing/gloves/black diff --git a/code/modules/clothing/gloves/gauntlets.dm b/code/modules/clothing/gloves/gauntlets.dm index b65884d3f9c..8807fb93ad5 100644 --- a/code/modules/clothing/gloves/gauntlets.dm +++ b/code/modules/clothing/gloves/gauntlets.dm @@ -18,6 +18,10 @@ var/mob/living/carbon/human/H = user if(H.gloves) gloves = H.gloves + if(!istype(gloves)) + to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") + gloves = null + return 0 if(gloves.overgloves) to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") gloves = null diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index bfb53f5e037..94e2d1fef08 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -127,3 +127,35 @@ overgloves = 1 force = 5 punch_force = 5 + +/obj/item/clothing/gloves/ranger + var/glovecolor = "white" + name = "ranger gloves" + desc = "The gloves of the Rangers are the least memorable part. They're not even insulated in the show, so children \ + don't try and take apart a toaster with inadequate protection. They only serve to complete the fancy outfit." + icon = 'icons/obj/clothing/ranger.dmi' + icon_state = "ranger_gloves" + +/obj/item/clothing/gloves/ranger/Initialize() + . = ..() + if(icon_state == "ranger_gloves") + name = "[glovecolor] ranger gloves" + icon_state = "[glovecolor]_ranger_gloves" + +/obj/item/clothing/gloves/ranger/black + glovecolor = "black" + +/obj/item/clothing/gloves/ranger/pink + glovecolor = "pink" + +/obj/item/clothing/gloves/ranger/green + glovecolor = "green" + +/obj/item/clothing/gloves/ranger/cyan + glovecolor = "cyan" + +/obj/item/clothing/gloves/ranger/orange + glovecolor = "orange" + +/obj/item/clothing/gloves/ranger/yellow + glovecolor = "yellow" \ No newline at end of file diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 558f30fbd9c..e7d7cee13dd 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -35,3 +35,37 @@ /obj/item/clothing/head/hardhat/dblue name = "blue hard hat" icon_state = "hardhat0_dblue" + +/obj/item/clothing/head/hardhat/ranger + var/hatcolor = "white" + name = "ranger helmet" + desc = "A special helmet designed for the Go Go ERT-Rangers, able to withstand a pressureless environment, filter gas and provide air. It has thermal vision and sometimes \ + mesons to find breaches, as well as an integrated radio... well, only in the show, of course. This one has none of those features- it just has a flashlight instead." + icon = 'icons/obj/clothing/ranger.dmi' + icon_state = "ranger_helmet" + light_overlay = "helmet_light" + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + +/obj/item/clothing/head/hardhat/ranger/Initialize() + . = ..() + if(icon_state == "ranger_helmet") + name = "[hatcolor] ranger helmet" + icon_state = "[hatcolor]_ranger_helmet" + +/obj/item/clothing/head/hardhat/ranger/black + hatcolor = "black" + +/obj/item/clothing/head/hardhat/ranger/pink + hatcolor = "pink" + +/obj/item/clothing/head/hardhat/ranger/green + hatcolor = "green" + +/obj/item/clothing/head/hardhat/ranger/cyan + hatcolor = "cyan" + +/obj/item/clothing/head/hardhat/ranger/orange + hatcolor = "orange" + +/obj/item/clothing/head/hardhat/ranger/yellow + hatcolor = "yellow" \ No newline at end of file diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index f246a8563cb..dd290af26e2 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -107,7 +107,7 @@ name = "tactical light helmet" desc = "A tan helmet made from advanced ceramic with an integrated tactical flashlight." icon_state = "flexitac" - armor = list(40, bullet = 40, laser = 60, energy = 35, bomb = 30, bio = 0, rad = 0) + armor = list(melee = 40, bullet = 40, laser = 60, energy = 35, bomb = 30, bio = 0, rad = 0) siemens_coefficient = 0.6 brightness_on = 6 light_overlay = "helmet_light_dual_green" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index b706e71e9dc..a9232aa65ce 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -219,7 +219,7 @@ /obj/item/clothing/head/psy_crown name = "broken crown" desc = "A crown-of-thorns with a missing gem." - var/tension_threshold = 150 + var/tension_threshold = 125 var/cooldown = null // world.time of when this was last triggered. var/cooldown_duration = 3 MINUTES // How long the cooldown should be. var/flavor_equip = null // Message displayed to someone who puts this on their head. Drones don't get a message. @@ -273,3 +273,17 @@ /obj/item/clothing/head/psy_crown/wrath/activate_ability(var/mob/living/wearer) ..() wearer.add_modifier(/datum/modifier/berserk, 30 SECONDS) + +/obj/item/clothing/head/psy_crown/gluttony + name = "green crown" + desc = "A crown-of-thorns set with a green gemstone that seems to glow unnaturally. It feels rather disturbing to touch." + description_info = "This has a chance to cause the wearer to become extremely durable, but hungry when in extreme danger." + icon_state = "gluttonycrown" + flavor_equip = "You feel a bit hungrier after putting on this crown." + flavor_unequip = "You feel sated after removing the crown." + flavor_drop = "You feel much more sated after letting go of the crown." + flavor_activate = "An otherworldly feeling seems to enter your mind, and it drives your mind into gluttony!" + +/obj/item/clothing/head/psy_crown/gluttony/activate_ability(var/mob/living/wearer) + ..() + wearer.add_modifier(/datum/modifier/gluttonyregeneration, 45 SECONDS) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 0311a0fec26..e2a93f1dffd 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -155,3 +155,35 @@ force = 0 w_class = ITEMSIZE_SMALL species_restricted = null + +/obj/item/clothing/shoes/boots/ranger + var/bootcolor = "white" + name = "ranger boots" + desc = "The Rangers special lightweight hybrid magboots-jetboots perfect for EVA. If only these functions were so easy to copy in reality.\ + These ones are just a well-made pair of boots in appropriate colours." + icon = 'icons/obj/clothing/ranger.dmi' + icon_state = "ranger_boots" + +/obj/item/clothing/shoes/boots/ranger/Initialize() + . = ..() + if(icon_state == "ranger_boots") + name = "[bootcolor] ranger boots" + icon_state = "[bootcolor]_ranger_boots" + +/obj/item/clothing/shoes/boots/ranger/black + bootcolor = "black" + +/obj/item/clothing/shoes/boots/ranger/pink + bootcolor = "pink" + +/obj/item/clothing/shoes/boots/ranger/green + bootcolor = "green" + +/obj/item/clothing/shoes/boots/ranger/cyan + bootcolor = "cyan" + +/obj/item/clothing/shoes/boots/ranger/orange + bootcolor = "orange" + +/obj/item/clothing/shoes/boots/ranger/yellow + bootcolor = "yellow" \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/modules/combat_vr.dm b/code/modules/clothing/spacesuits/rig/modules/combat_vr.dm new file mode 100644 index 00000000000..f62c0bf4b8e --- /dev/null +++ b/code/modules/clothing/spacesuits/rig/modules/combat_vr.dm @@ -0,0 +1,12 @@ +/obj/item/rig_module/grenade_launcher/cleaner + name = "mounted cleaner-grenade launcher" + desc = "A shoulder-mounted cleaner-grenade dispenser." + + interface_name = "integrated cleaner-grenade launcher" + interface_desc = "Discharges loaded cleaner-grenades against the wearer's location." + + fire_force = 15 + + charges = list( + list("cleaner grenade", "cleaner grenade", /obj/item/weapon/grenade/chem_grenade/cleaner, 6) + ) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index a7c32871338..7cf90844357 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -1016,7 +1016,7 @@ M.stop_pulling() if(wearer.pinned.len) - src << "Your host is pinned to a wall by [wearer.pinned[1]]!" + to_chat(src, "Your host is pinned to a wall by [wearer.pinned[1]]!") return 0 // AIs are a bit slower than regular and ignore move intent. diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 3d5fc130047..67080dd1e04 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -105,7 +105,7 @@ else if(W.is_wrench()) if(!air_supply) - to_chat(user, "There is not tank to remove.") + to_chat(user, "There is no tank to remove.") return if(user.r_hand && user.l_hand) @@ -137,7 +137,7 @@ if("cell") if(cell) - to_chat(user, "You detatch \the [cell] from \the [src]'s battery mount.") + to_chat(user, "You detach \the [cell] from \the [src]'s battery mount.") for(var/obj/item/rig_module/module in installed_modules) module.deactivate() if(user.r_hand && user.l_hand) @@ -165,7 +165,7 @@ return var/obj/item/rig_module/removed = possible_removals[removal_choice] - to_chat(user, "You detatch \the [removed] from \the [src].") + to_chat(user, "You detach \the [removed] from \the [src].") removed.forceMove(get_turf(src)) removed.removed() installed_modules -= removed diff --git a/code/modules/clothing/spacesuits/rig/suits/ert_vr.dm b/code/modules/clothing/spacesuits/rig/suits/ert_vr.dm new file mode 100644 index 00000000000..034ea31865f --- /dev/null +++ b/code/modules/clothing/spacesuits/rig/suits/ert_vr.dm @@ -0,0 +1,13 @@ +/obj/item/weapon/rig/ert/janitor + name = "ERT-J suit control module" + desc = "A suit worn by the janitorial division of an Emergency Response Team. Has purple highlights. Armoured and space ready." + suit_type = "ERT janitor" + icon_state = "ert_janitor_rig" + + initial_modules = list( + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/grenade_launcher/cleaner, + ) + +/obj/item/weapon/rig/ert/assetprotection + armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 60) diff --git a/code/modules/clothing/spacesuits/rig/suits/station_vr.dm b/code/modules/clothing/spacesuits/rig/suits/station_vr.dm index 3b51d130535..2049530d026 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station_vr.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station_vr.dm @@ -1,13 +1,3 @@ -//Drill added for hazmat suit -/obj/item/weapon/rig/hazmat/equipped - req_access = list(access_xenoarch) - initial_modules = list( - /obj/item/rig_module/ai_container, - /obj/item/rig_module/maneuvering_jets, - /obj/item/rig_module/device/anomaly_scanner, - /obj/item/rig_module/device/drill //The suit has nothing to mine with otherwise. - ) - //Access restriction and seal delay, plus pat_module and rescue_pharm for medical suit /obj/item/weapon/rig/medical/equipped req_access = list(access_medical) @@ -21,30 +11,42 @@ ) //Armor reduction for industrial suit -/obj/item/weapon/rig/industrial +/obj/item/weapon/rig/industrial/vendor + desc = "A heavy, powerful hardsuit used by construction crews and mining corporations. This is a mass production model with reduced armor." armor = list(melee = 50, bullet = 10, laser = 20, energy = 15, bomb = 30, bio = 100, rad = 50) //Area allowing backpacks to be placed on rigsuits. /obj/item/weapon/rig/vox - allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/combat - allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/ert allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/tool/crowbar, \ /obj/item/weapon/tool/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/tool/wirecutters, /obj/item/weapon/tool/wrench, /obj/item/device/multitool, \ /obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \ - /obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller, /obj/item/weapon/storage/backpack) + /obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller, /obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/light/ninja - allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/cell, /obj/item/weapon/storage/backpack) + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/cell, /obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/merc - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs, /obj/item/weapon/storage/backpack) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs, /obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/ce - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/medical - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/roller,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/roller,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/hazmat - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/hazard - allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/industrial - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) + +/obj/item/weapon/rig/military + allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/handcuffs, \ + /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/weldingtool, /obj/item/weapon/tool, /obj/item/device/multitool, \ + /obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \ + /obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller, /obj/item/device/suit_cooling_unit, /obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) +/obj/item/weapon/rig/pmc + allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/tool/crowbar, \ + /obj/item/weapon/tool/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/tool/wirecutters, /obj/item/weapon/tool/wrench, /obj/item/device/multitool, \ + /obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \ + /obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller, /obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 83cf2e3049d..0c1cfee9cae 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -9,12 +9,15 @@ var/obj/item/weapon/storage/internal/hold w_class = ITEMSIZE_NORMAL on_rolled = list("down" = "none") + var/hide_on_roll = FALSE /obj/item/clothing/accessory/storage/New() ..() hold = new/obj/item/weapon/storage/internal(src) hold.max_storage_space = slots * 2 hold.max_w_class = ITEMSIZE_SMALL + if (!hide_on_roll) + on_rolled["down"] = icon_state /obj/item/clothing/accessory/storage/attack_hand(mob/user as mob) if (has_suit) //if we are part of a suit diff --git a/code/modules/clothing/under/accessories/torch.dm b/code/modules/clothing/under/accessories/torch.dm index c7fe8538081..7cdec72747d 100644 --- a/code/modules/clothing/under/accessories/torch.dm +++ b/code/modules/clothing/under/accessories/torch.dm @@ -310,9 +310,9 @@ department tags desc = "Insignia denoting assignment to the command department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/command/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the command department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/command/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the command department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/engineering @@ -328,9 +328,9 @@ department tags desc = "Insignia denoting assignment to the engineering department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/engineering/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the engineering department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/engineering/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the engineering department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/security @@ -346,9 +346,9 @@ department tags desc = "Insignia denoting assignment to the security department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/security/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the security department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/security/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the security department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/medical @@ -364,9 +364,9 @@ department tags desc = "Insignia denoting assignment to the medical department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/medical/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the medical department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/medical/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the medical department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/supply @@ -382,9 +382,9 @@ department tags desc = "Insignia denoting assignment to the supply department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/supply/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the supply department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/supply/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the supply department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/service @@ -400,9 +400,9 @@ department tags desc = "Insignia denoting assignment to the service department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/service/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the service department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/service/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the service department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/exploration @@ -418,9 +418,9 @@ department tags desc = "Insignia denoting assignment to the exploration department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/exploration/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the exploration department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/exploration/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the exploration department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/research @@ -611,103 +611,103 @@ ranks - fleet /************** ranks - marines **************/ -/obj/item/clothing/accessory/solgov/rank/army - name = "army ranks" +/obj/item/clothing/accessory/solgov/rank/marine + name = "marine ranks" desc = "Insignia denoting marine rank of some kind. These appear blank." - icon_state = "armyrank_enlisted" + icon_state = "marinerank_enlisted" on_rolled = list("down" = "none") -/obj/item/clothing/accessory/solgov/rank/army/enlisted +/obj/item/clothing/accessory/solgov/rank/marine/enlisted name = "ranks (E-1 private)" desc = "Insignia denoting the rank of Private." - icon_state = "armyrank_enlisted" + icon_state = "marinerank_enlisted" -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e2 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e2 name = "ranks (E-2 private second class)" desc = "Insignia denoting the rank of Private Second Class." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e3 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e3 name = "ranks (E-3 private first class)" desc = "Insignia denoting the rank of Private First Class." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e4 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e4 name = "ranks (E-4 corporal)" desc = "Insignia denoting the rank of Corporal." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e5 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e5 name = "ranks (E-5 sergeant)" desc = "Insignia denoting the rank of Sergeant." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e6 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e6 name = "ranks (E-6 staff sergeant)" desc = "Insignia denoting the rank of Staff Sergeant." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e7 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e7 name = "ranks (E-7 sergeant first class)" desc = "Insignia denoting the rank of Sergeant First Class." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e8 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e8 name = "ranks (E-8 master sergeant)" desc = "Insignia denoting the rank of Master Sergeant." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e8_alt +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e8_alt name = "ranks (E-8 first sergeant)" desc = "Insignia denoting the rank of First Sergeant." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e9 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e9 name = "ranks (E-9 sergeant major)" desc = "Insignia denoting the rank of Sergeant Major." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e9_alt1 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e9_alt1 name = "ranks (E-9 command sergeant major)" desc = "Insignia denoting the rank of Command Sergeant Major." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e9_alt2 - name = "ranks (E-9 sergeant major of the Army)" - desc = "Insignia denoting the rank of Sergeant Major of the Army." +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e9_alt2 + name = "ranks (E-9 sergeant major of the marine)" + desc = "Insignia denoting the rank of Sergeant Major of the marine." -/obj/item/clothing/accessory/solgov/rank/army/officer +/obj/item/clothing/accessory/solgov/rank/marine/officer name = "ranks (O-1 second lieutenant)" desc = "Insignia denoting the rank of Second Lieutenant." - icon_state = "armyrank_officer" + icon_state = "marinerank_officer" -/obj/item/clothing/accessory/solgov/rank/army/officer/o2 +/obj/item/clothing/accessory/solgov/rank/marine/officer/o2 name = "ranks (O-2 first lieutenant)" desc = "Insignia denoting the rank of First Lieutenant." -/obj/item/clothing/accessory/solgov/rank/army/officer/o3 +/obj/item/clothing/accessory/solgov/rank/marine/officer/o3 name = "ranks (O-3 captain)" desc = "Insignia denoting the rank of Captain." -/obj/item/clothing/accessory/solgov/rank/army/officer/o4 +/obj/item/clothing/accessory/solgov/rank/marine/officer/o4 name = "ranks (O-4 major)" desc = "Insignia denoting the rank of Major." -/obj/item/clothing/accessory/solgov/rank/army/officer/o5 +/obj/item/clothing/accessory/solgov/rank/marine/officer/o5 name = "ranks (O-5 lieutenant colonel)" desc = "Insignia denoting the rank of Lieutenant Colonel." -/obj/item/clothing/accessory/solgov/rank/army/officer/o6 +/obj/item/clothing/accessory/solgov/rank/marine/officer/o6 name = "ranks (O-6 colonel)" desc = "Insignia denoting the rank of Colonel." -/obj/item/clothing/accessory/solgov/rank/army/flag +/obj/item/clothing/accessory/solgov/rank/marine/flag name = "ranks (O-7 brigadier general)" desc = "Insignia denoting the rank of Brigadier General." - icon_state = "armyrank_command" + icon_state = "marinerank_command" -/obj/item/clothing/accessory/solgov/rank/army/flag/o8 +/obj/item/clothing/accessory/solgov/rank/marine/flag/o8 name = "ranks (O-8 major general)" desc = "Insignia denoting the rank of Major General." -/obj/item/clothing/accessory/solgov/rank/army/flag/o9 +/obj/item/clothing/accessory/solgov/rank/marine/flag/o9 name = "ranks (O-9 lieutenant general)" desc = "Insignia denoting the rank of lieutenant general." -/obj/item/clothing/accessory/solgov/rank/army/flag/o10 +/obj/item/clothing/accessory/solgov/rank/marine/flag/o10 name = "ranks (O-10 general)" desc = "Insignia denoting the rank of General." -/obj/item/clothing/accessory/solgov/rank/army/flag/o10_alt +/obj/item/clothing/accessory/solgov/rank/marine/flag/o10_alt name = "ranks (O-10 field marshal)" desc = "Insignia denoting the rank of Field Marshal." diff --git a/code/modules/clothing/under/accessories/torch_vr.dm b/code/modules/clothing/under/accessories/torch_vr.dm new file mode 100644 index 00000000000..71ce5fb45df --- /dev/null +++ b/code/modules/clothing/under/accessories/torch_vr.dm @@ -0,0 +1,23 @@ +/obj/item/clothing/accessory/solgov/department/command + desc = "Insignia denoting assignment to the command department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/engineering + desc = "Insignia denoting assignment to the engineering department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/security + desc = "Insignia denoting assignment to the security department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/medical + desc = "Insignia denoting assignment to the medical department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/supply + desc = "Insignia denoting assignment to the supply department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/exploration + desc = "Insignia denoting assignment to the exploration department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/research + desc = "Insignia denoting assignment to the research department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/service + desc = "Insignia denoting assignment to the service department. These fit Society of Universal Cartographers uniforms." \ No newline at end of file diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index cc5d7ed9171..9638a414bd9 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -30,13 +30,19 @@ icon_state = "grey" rolled_sleeves = 0 +//TFF 5/8/19 - add a non perma-set orange jumpsuit, splits prison into its own obj with override var settings. +//TFF 5/9/19 - add a different icon_state to both jumpsuits, orange and prison. Refactors orange and prison jumpsuit slightly. /obj/item/clothing/under/color/orange name = "orange jumpsuit" - desc = "It's standardized prisoner-wear. Its suit sensors are permanently set to the \"Tracking\" position." icon_state = "orange" + rolled_sleeves = 0 + +/obj/item/clothing/under/color/prison + name = "prison jumpsuit" + desc = "It's standardized prisoner-wear. Its suit sensors are permanently set to the \"Tracking\" position." + icon_state = "prison" has_sensor = 2 sensor_mode = 3 - rolled_sleeves = 0 /obj/item/clothing/under/color/pink name = "pink jumpsuit" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index c90d575b983..c7ccb6a31af 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -908,3 +908,40 @@ name = "hazard cohesion suit" desc = "An orange cohesion suit with yellow hazard stripes intended to assist Prometheans in maintaining their form and prevent direct skin exposure." icon_state = "cohesionsuit_hazard" + +//Uniforms +//On-mob sprites go in icons\mob\uniform.dmi with the format "white_ranger_uniform_s" - with 'white' replaced with green, cyan, etc... of course! Note the _s - this is not optional. +//Item sprites go in icons\obj\clothing\ranger.dmi with the format "white_ranger_uniform" +/obj/item/clothing/under/color/ranger + var/unicolor = "white" + name = "ranger uniform" + desc = "Made from a space-proof fibre and tight fitting, this uniform usually gives the agile Rangers all kinds of protection while not inhibiting their movement. \ + This costume is instead made from genuine cotton fibre and is based on the season three uniform." + icon = 'icons/obj/clothing/ranger.dmi' + icon_state = "ranger_uniform" + rolled_down = 0 + rolled_sleeves = 0 + +/obj/item/clothing/under/color/ranger/Initialize() + . = ..() + if(icon_state == "ranger_uniform") //allows for custom items + name = "[unicolor] ranger uniform" + icon_state = "[unicolor]_ranger_uniform" + +/obj/item/clothing/under/color/ranger/black + unicolor = "black" + +/obj/item/clothing/under/color/ranger/pink + unicolor = "pink" + +/obj/item/clothing/under/color/ranger/green + unicolor = "green" + +/obj/item/clothing/under/color/ranger/cyan + unicolor = "cyan" + +/obj/item/clothing/under/color/ranger/orange + unicolor = "orange" + +/obj/item/clothing/under/color/ranger/yellow + unicolor = "yellow" \ No newline at end of file diff --git a/code/modules/clothing/under/miscellaneous_vr.dm b/code/modules/clothing/under/miscellaneous_vr.dm index 0644eb476c0..2c48b859a20 100644 --- a/code/modules/clothing/under/miscellaneous_vr.dm +++ b/code/modules/clothing/under/miscellaneous_vr.dm @@ -105,3 +105,7 @@ H.resize(original_size) original_size = null H.visible_message("The space around [H] distorts as they return to their original size!","The space around you distorts as you return to your original size!") + +//Same as Nanotrasen Security Uniforms +/obj/item/clothing/under/ert + armor = list(melee = 5, bullet = 10, laser = 10, energy = 5, bomb = 5, bio = 0, rad = 0) \ No newline at end of file diff --git a/code/modules/clothing/under/nanotrasen_vr.dm b/code/modules/clothing/under/nanotrasen_vr.dm index aff19ec6e49..f6eeecfb43b 100644 --- a/code/modules/clothing/under/nanotrasen_vr.dm +++ b/code/modules/clothing/under/nanotrasen_vr.dm @@ -13,7 +13,7 @@ desc = "The security uniform of NanoTrasen's security. It looks sturdy and well padded" icon_state = "navyutility_sec" worn_state = "navyutility_sec" - armor = list(melee = 10, bullet = 10, laser = 10,energy = 10, bomb = 10, bio = 10, rad = 10) + armor = list(melee = 10, bullet = 5, laser = 5, energy = 5, bomb = 5, bio = 0, rad = 0) /obj/item/clothing/under/nanotrasen/security/warden name = "NanoTrasen warden uniform" @@ -37,7 +37,7 @@ slot_l_hand_str = "darkbluesoft", slot_r_hand_str = "darkbluesoft", ) - armor = list(melee = 10, bullet = 5, laser = 5,energy = 5, bomb = 5, bio = 5, rad = 0) + armor = list(melee = 10, bullet = 5, laser = 5, energy = 5, bomb = 5, bio = 0, rad = 0) /obj/item/clothing/head/beret/nanotrasen name = "NanoTrasen security beret" diff --git a/code/modules/clothing/under/solgov.dm b/code/modules/clothing/under/solgov.dm index 39109c480aa..0859cdf1e4a 100644 --- a/code/modules/clothing/under/solgov.dm +++ b/code/modules/clothing/under/solgov.dm @@ -1,7 +1,18 @@ //SolGov Uniforms +//Master +/obj/item/clothing/under/solgov + name = "master solgov uniform" + desc = "You shouldn't be seeing this." + icon = 'icons/obj/clothing/uniforms_solgov.dmi' + rolled_down = 0 + rolled_sleeves = 0 + item_icons = list(slot_w_uniform_str = 'icons/mob/uniform_solgov.dmi') + armor = list(melee = 5, bullet = 0, laser = 5, energy = 5, bomb = 0, bio = 5, rad = 5) + siemens_coefficient = 0.8 + //PT -/obj/item/clothing/under/pt +/obj/item/clothing/under/solgov/pt name = "pt uniform" desc = "Shorts! Shirt! Miami! Sexy!" icon_state = "miami" @@ -10,19 +21,19 @@ siemens_coefficient = 0.9 body_parts_covered = UPPER_TORSO|LOWER_TORSO -/obj/item/clothing/under/pt/sifguard +/obj/item/clothing/under/solgov/pt/sifguard name = "\improper SifGuard pt uniform" desc = "A baggy shirt bearing the seal of the Sif Defense Force and some dorky looking blue shorts." icon_state = "expeditionpt" worn_state = "expeditionpt" -/obj/item/clothing/under/pt/fleet +/obj/item/clothing/under/solgov/pt/fleet name = "fleet pt uniform" desc = "A pair of black shorts and two tank tops, seems impractical. Looks good though." icon_state = "fleetpt" worn_state = "fleetpt" -/obj/item/clothing/under/pt/marine +/obj/item/clothing/under/solgov/pt/marine name = "marine pt uniform" desc = "Does NOT leave much to the imagination." icon_state = "marinept" @@ -53,63 +64,62 @@ worn_state = "greyutility" //Here's the real ones -/obj/item/clothing/under/utility/sifguard +/obj/item/clothing/under/solgov/utility/sifguard name = "\improper SifGuard uniform" desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim." icon_state = "blackutility_crew" worn_state = "blackutility_crew" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 10) -/obj/item/clothing/under/utility/sifguard/medical - name = "\improper SifGuard medical uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim and blue blazes." - icon_state = "blackutility_med" - worn_state = "blackutility_med" +/obj/item/clothing/under/solgov/utility/sifguard/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command) -/obj/item/clothing/under/utility/sifguard/medical/command - name = "\improper SifGuard medical command uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim and blue blazes." - icon_state = "blackutility_medcom" - worn_state = "blackutility_medcom" +/obj/item/clothing/under/solgov/utility/sifguard/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering) -/obj/item/clothing/under/utility/sifguard/engineering - name = "\improper SifGuard engineering uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim and organge blazes." - icon_state = "blackutility_eng" - worn_state = "blackutility_eng" +/obj/item/clothing/under/solgov/utility/sifguard/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security) -/obj/item/clothing/under/utility/sifguard/engineering/command - name = "\improper SifGuard engineering command uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim and organge blazes." - icon_state = "blackutility_engcom" - worn_state = "blackutility_engcom" +/obj/item/clothing/under/solgov/utility/sifguard/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical) -/obj/item/clothing/under/utility/sifguard/supply - name = "\improper SifGuard supply uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim and brown blazes." - icon_state = "blackutility_sup" - worn_state = "blackutility_sup" +/obj/item/clothing/under/solgov/utility/sifguard/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply) -/obj/item/clothing/under/utility/sifguard/security - name = "\improper SifGuard security uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim and red blazes." - icon_state = "blackutility_sec" - worn_state = "blackutility_sec" +/obj/item/clothing/under/solgov/utility/sifguard/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration) -/obj/item/clothing/under/utility/sifguard/security/command - name = "\improper SifGuard security command uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim and red blazes." - icon_state = "blackutility_seccom" - worn_state = "blackutility_seccom" +/obj/item/clothing/under/solgov/utility/sifguard/research + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research) -/obj/item/clothing/under/utility/sifguard/command - name = "\improper SifGuard command uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim and gold blazes." +/obj/item/clothing/under/solgov/utility/sifguard/officer + name = "\improper Sifuard officer's uniform" + desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim." icon_state = "blackutility_com" worn_state = "blackutility_com" +/obj/item/clothing/under/solgov/utility/sifguard/officer/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command) -/obj/item/clothing/under/utility/fleet +/obj/item/clothing/under/solgov/utility/sifguard/officer/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering) + +/obj/item/clothing/under/solgov/utility/sifguard/officer/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security) + +/obj/item/clothing/under/solgov/utility/sifguard/officer/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical) + +/obj/item/clothing/under/solgov/utility/sifguard/officer/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply) + +/obj/item/clothing/under/solgov/utility/sifguard/officer/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration) + +/obj/item/clothing/under/solgov/utility/sifguard/officer/research + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research) + +/obj/item/clothing/under/solgov/utility/fleet name = "fleet coveralls" desc = "The utility uniform of the SCG Fleet, made from an insulated material." icon_state = "navyutility" @@ -117,116 +127,96 @@ armor = list(melee = 0, bullet = 0, laser = 0,energy = 10, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.7 -/obj/item/clothing/under/utility/fleet/medical - name = "fleet medical coveralls" - desc = "The utility uniform of the SCG Fleet, made from an insulated material. This one has blue cuffs." - icon_state = "navyutility_med" - worn_state = "navyutility_med" +/obj/item/clothing/under/solgov/utility/fleet/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/fleet) -/obj/item/clothing/under/utility/fleet/engineering - name = "fleet engineering coveralls" - desc = "The utility uniform of the SCG Fleet, made from an insulated material. This one has orange cuffs." - icon_state = "navyutility_eng" - worn_state = "navyutility_eng" +/obj/item/clothing/under/solgov/utility/fleet/command/pilot + starting_accessories = list(/obj/item/clothing/accessory/solgov/specialty/pilot) -/obj/item/clothing/under/utility/fleet/supply - name = "fleet supply coveralls" - desc = "The utility uniform of the SCG Fleet, made from an insulated material. This one has brown cuffs." - icon_state = "navyutility_sup" - worn_state = "navyutility_sup" +/obj/item/clothing/under/solgov/utility/fleet/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/fleet) -/obj/item/clothing/under/utility/fleet/security - name = "fleet security coveralls" - desc = "The utility uniform of the SCG Fleet, made from an insulated material. This one has red cuffs." - icon_state = "navyutility_sec" - worn_state = "navyutility_sec" +/obj/item/clothing/under/solgov/utility/fleet/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/fleet) -/obj/item/clothing/under/utility/fleet/command - name = "fleet command coveralls" - desc = "The utility uniform of the SCG Fleet, made from an insulated material. This one has gold cuffs." - icon_state = "navyutility_com" - worn_state = "navyutility_com" +/obj/item/clothing/under/solgov/utility/fleet/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/fleet) + +/obj/item/clothing/under/solgov/utility/fleet/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/fleet) + +/obj/item/clothing/under/solgov/utility/fleet/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/fleet) -/obj/item/clothing/under/utility/marine +/obj/item/clothing/under/solgov/utility/marine name = "marine fatigues" desc = "The utility uniform of the SCG Marine Corps, made from durable material." icon_state = "greyutility" worn_state = "greyutility" armor = list(melee = 10, bullet = 0, laser = 10,energy = 0, bomb = 0, bio = 0, rad = 0) -/obj/item/clothing/under/utility/marine/green +/obj/item/clothing/under/solgov/utility/marine/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/marine) + +/obj/item/clothing/under/solgov/utility/marine/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/marine) + +/obj/item/clothing/under/solgov/utility/marine/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/marine) + +/obj/item/clothing/under/solgov/utility/marine/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/marine) + +/obj/item/clothing/under/solgov/utility/marine/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/marine) + +/obj/item/clothing/under/solgov/utility/marine/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/marine) + +/obj/item/clothing/under/solgov/utility/marine/green name = "green fatigues" desc = "A green version of the SCG marine utility uniform, made from durable material." icon_state = "greenutility" worn_state = "greenutility" -/obj/item/clothing/under/utility/marine/tan +/obj/item/clothing/under/solgov/utility/marine/tan name = "tan fatigues" desc = "A tan version of the SCG marine utility uniform, made from durable material." icon_state = "tanutility" worn_state = "tanutility" -/obj/item/clothing/under/utility/marine/medical - name = "marine medical fatigues" - desc = "The utility uniform of the SCG Marine Corps, made from durable material. This one has blue markings." - icon_state = "greyutility_med" - worn_state = "greyutility_med" - -/obj/item/clothing/under/utility/marine/engineering - name = "marine engineering fatigues" - desc = "The utility uniform of the SCG Marine Corps, made from durable material. This one has orange markings." - icon_state = "greyutility_eng" - worn_state = "greyutility_eng" - -/obj/item/clothing/under/utility/marine/supply - name = "marine supply fatigues" - desc = "The utility uniform of the SCG Marine Corps, made from durable material. This one has brown markings." - icon_state = "greyutility_sup" - worn_state = "greyutility_sup" - -/obj/item/clothing/under/utility/marine/security - name = "marine security fatigues" - desc = "The utility uniform of the SCG Marine Corps, made from durable material. This one has red markings." - icon_state = "greyutility_sec" - worn_state = "greyutility_sec" - -/obj/item/clothing/under/utility/marine/command - name = "marine command coveralls" - desc = "The utility uniform of the SCG Marine Corps, made from durable material. This one has gold markings." - icon_state = "greyutility_com" - worn_state = "greyutility_com" - //Service -/obj/item/clothing/under/service +/obj/item/clothing/under/solgov/service name = "service uniform" desc = "A service uniform of some kind." icon_state = "whiteservice" worn_state = "whiteservice" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 5, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 5, rad = 0) siemens_coefficient = 0.9 -/obj/item/clothing/under/service/fleet +/obj/item/clothing/under/solgov/service/fleet name = "fleet service uniform" desc = "The service uniform of the SCG Fleet, made from immaculate white fabric." icon_state = "whiteservice" worn_state = "whiteservice" -/obj/item/clothing/under/service/marine +/obj/item/clothing/under/solgov/service/marine name = "marine service uniform" desc = "The service uniform of the SCG Marine Corps. Slimming." icon_state = "greenservice" worn_state = "greenservice" -/obj/item/clothing/under/service/marine/command +/obj/item/clothing/under/solgov/service/marine/command name = "marine command service uniform" desc = "The service uniform of the SCG Marine Corps. Slimming and stylish." icon_state = "greenservice_com" worn_state = "greenservice_com" //Dress -/obj/item/clothing/under/mildress + +/obj/item/clothing/under/solgov/mildress name = "dress uniform" desc = "A dress uniform of some kind." icon_state = "greydress" @@ -234,25 +224,71 @@ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 -/obj/item/clothing/under/mildress/sifguard +/obj/item/clothing/under/solgov/mildress/sifguard name = "\improper SifGuard dress uniform" desc = "The dress uniform of the Sif Defense Force in silver trim." - icon_state = "greydress" - worn_state = "greydress" -/obj/item/clothing/under/mildress/sifguard/command +/obj/item/clothing/under/solgov/mildress/sifguard/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/service + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/research + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer name = "\improper SifGuard command dress uniform" desc = "The dress uniform of the Sif Defense Force in gold trim." icon_state = "greydress_com" worn_state = "greydress_com" -/obj/item/clothing/under/mildress/marine +/obj/item/clothing/under/solgov/mildress/sifguard/officer/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/service + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/research + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research/service) + +/obj/item/clothing/under/solgov/mildress/marine name = "marine dress uniform" desc = "The dress uniform of the SCG Marine Corps, class given form." icon_state = "blackdress" worn_state = "blackdress" -/obj/item/clothing/under/mildress/marine/command +/obj/item/clothing/under/solgov/mildress/marine/command name = "marine command dress uniform" desc = "The dress uniform of the SCG Marine Corps, even classier in gold." icon_state = "blackdress_com" diff --git a/code/modules/clothing/under/solgov_vr.dm b/code/modules/clothing/under/solgov_vr.dm index d08d91f0cce..eb6e7936854 100644 --- a/code/modules/clothing/under/solgov_vr.dm +++ b/code/modules/clothing/under/solgov_vr.dm @@ -1,15 +1,15 @@ //SolGov Uniforms //PT -/obj/item/clothing/under/pt/sifguard +/obj/item/clothing/under/solgov/pt/sifguard name = "explorer's pt uniform" desc = "A baggy shirt bearing the seal of the Society of Universal Cartographers and some dorky looking blue shorts." -/obj/item/clothing/under/pt/fleet +/obj/item/clothing/under/solgov/pt/fleet name = "fleet pt uniform" desc = "A pair of black shorts and two tank tops, seems impractical. Looks good though." -/obj/item/clothing/under/pt/marine +/obj/item/clothing/under/solgov/pt/marine name = "marine pt uniform" desc = "Does NOT leave much to the imagination." @@ -20,81 +20,32 @@ name = "utility uniform" desc = "A comfortable turtleneck and black utility trousers." -/obj/item/clothing/under/utility/sifguard +/obj/item/clothing/under/solgov/utility/sifguard name = "explorer's uniform" desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has silver trim." -/obj/item/clothing/under/utility/sifguard/medical - name = "explorer's medical uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has silver trim and blue blazes." - -/obj/item/clothing/under/utility/sifguard/medical/command - name = "explorer's medical command uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has gold trim and blue blazes." - -/obj/item/clothing/under/utility/sifguard/engineering - name = "explorer's engineering uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has silver trim and organge blazes." - -/obj/item/clothing/under/utility/sifguard/engineering/command - name = "explorer's engineering command uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has gold trim and organge blazes." - -/obj/item/clothing/under/utility/sifguard/supply - name = "explorer's supply uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has silver trim and brown blazes." - -/obj/item/clothing/under/utility/sifguard/security - name = "explorer's security uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has silver trim and red blazes." - -/obj/item/clothing/under/utility/sifguard/security/command - name = "explorer's security command uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has gold trim and red blazes." - -/obj/item/clothing/under/utility/sifguard/command - name = "explorer's command uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has gold trim and gold blazes." +/obj/item/clothing/under/solgov/utility/sifguard/officer + name = "explorer's officer uniform" + desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has gold trim." -/obj/item/clothing/under/utility/fleet +/obj/item/clothing/under/solgov/utility/fleet name = "fleet coveralls" desc = "The utility uniform of the USDF Fleet, made from an insulated material." -/obj/item/clothing/under/utility/fleet/medical - name = "fleet medical coveralls" - desc = "The utility uniform of the USDF Fleet, made from an insulated material. This one has blue cuffs." - -/obj/item/clothing/under/utility/fleet/engineering - name = "fleet engineering coveralls" - desc = "The utility uniform of the USDF Fleet, made from an insulated material. This one has orange cuffs." - -/obj/item/clothing/under/utility/fleet/supply - name = "fleet supply coveralls" - desc = "The utility uniform of the USDF Fleet, made from an insulated material. This one has brown cuffs." - -/obj/item/clothing/under/utility/fleet/security - name = "fleet security coveralls" - desc = "The utility uniform of the USDF Fleet, made from an insulated material. This one has red cuffs." - -/obj/item/clothing/under/utility/fleet/command - name = "fleet command coveralls" - desc = "The utility uniform of the USDF Fleet, made from an insulated material. This one has gold cuffs." - - -/obj/item/clothing/under/utility/marine +/obj/item/clothing/under/solgov/utility/marine name = "marine fatigues" desc = "The utility uniform of the USDF Marine Corps, made from durable material." -/obj/item/clothing/under/utility/marine/green +/obj/item/clothing/under/solgov/utility/marine/green name = "green fatigues" desc = "A green version of the USDF marine utility uniform, made from durable material." -/obj/item/clothing/under/utility/marine/tan +/obj/item/clothing/under/solgov/utility/marine/tan name = "tan fatigues" desc = "A tan version of the USDF marine utility uniform, made from durable material." -/obj/item/clothing/under/utility/marine/olive +/obj/item/clothing/under/solgov/utility/marine/olive name = "olive fatigues" desc = "An olive version of the USDF marine utility uniform, made from durable material." icon = 'icons/obj/clothing/uniforms_vr.dmi' @@ -102,7 +53,7 @@ icon_state = "bdu_olive" item_state = "bdu_olive" -/obj/item/clothing/under/utility/marine/desert +/obj/item/clothing/under/solgov/utility/marine/desert name = "desert fatigues" desc = "A desert version of the USDF marine utility uniform, made from durable material." icon = 'icons/obj/clothing/uniforms_vr.dmi' @@ -110,53 +61,33 @@ icon_state = "bdu_olive" item_state = "bdu_olive" -/obj/item/clothing/under/utility/marine/medical - name = "marine medical fatigues" - desc = "The utility uniform of the USDF Marine Corps, made from durable material. This one has blue markings." - -/obj/item/clothing/under/utility/marine/engineering - name = "marine engineering fatigues" - desc = "The utility uniform of the USDF Marine Corps, made from durable material. This one has orange markings." - -/obj/item/clothing/under/utility/marine/supply - name = "marine supply fatigues" - desc = "The utility uniform of the USDF Marine Corps, made from durable material. This one has brown markings." - -/obj/item/clothing/under/utility/marine/security - name = "marine security fatigues" - desc = "The utility uniform of the USDF Marine Corps, made from durable material. This one has red markings." - -/obj/item/clothing/under/utility/marine/command - name = "marine command coveralls" - desc = "The utility uniform of the USDF Marine Corps, made from durable material. This one has gold markings." - //Service -/obj/item/clothing/under/service/fleet +/obj/item/clothing/under/solgov/service/fleet name = "fleet service uniform" desc = "The service uniform of the USDF Fleet, made from immaculate white fabric." -/obj/item/clothing/under/service/marine +/obj/item/clothing/under/solgov/service/marine name = "marine service uniform" desc = "The service uniform of the USDF Marine Corps. Slimming." worn_state = "greenservice" -/obj/item/clothing/under/service/marine/command +/obj/item/clothing/under/solgov/service/marine/command name = "marine command service uniform" desc = "The service uniform of the USDF Marine Corps. Slimming and stylish." -/obj/item/clothing/under/mildress/expeditionary +/obj/item/clothing/under/solgov/mildress/expeditionary name = "explorer's dress uniform" desc = "The dress uniform of the Society of Universal Cartographers in silver trim." -/obj/item/clothing/under/mildress/expeditionary/command +/obj/item/clothing/under/solgov/mildress/expeditionary/command name = "explorer's command dress uniform" desc = "The dress uniform of the Society of Universal Cartographers in gold trim." -/obj/item/clothing/under/mildress/marine +/obj/item/clothing/under/solgov/mildress/marine name = "marine dress uniform" desc = "The dress uniform of the USDF Marine Corps, class given form." -/obj/item/clothing/under/mildress/marine/command +/obj/item/clothing/under/solgov/mildress/marine/command name = "marine command dress uniform" desc = "The dress uniform of the USDF Marine Corps, even classier in gold." \ No newline at end of file diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index a4c55b27ae8..79c294c5ac9 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -142,7 +142,6 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust , 60, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400), - //new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 50), //VORESTATION AI TEMPORARY REMOVAL new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lore News", /datum/event/lore_news, 400), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)), diff --git a/code/modules/events/event_container_vr.dm b/code/modules/events/event_container_vr.dm index 0212435c718..6f5e8dada20 100644 --- a/code/modules/events/event_container_vr.dm +++ b/code/modules/events/event_container_vr.dm @@ -28,36 +28,38 @@ /datum/event_container/mundane/New() available_events = list( // Severity level, event name, even type, base weight, role weights, one shot, min weight, max weight. Last two only used if set and non-zero - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 200), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 400), // Bluescreens APCs, but they still work new /datum/event_meta(EVENT_LEVEL_MUNDANE, "APC Damage", /datum/event/apc_damage, 20, list(ASSIGNMENT_ENGINEER = 20)), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence",/datum/event/brand_intelligence,20, list(ASSIGNMENT_JANITOR = 25), 1), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 20)), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Canister Leak", /datum/event/canister_leak, 10, list(ASSIGNMENT_ENGINEER = 20)), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 1, 0, 50), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300), - //new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 1, list(), 1), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 10), 1), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15), //new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 1, 25, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lore News", /datum/event/lore_news, 400), // Spawns mice, lizards, or dud spiderlings new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100), 1), // Rot only weakens walls, not destroy them new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50), 1), ) add_disabled_events(list( - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 20, list(ASSIGNMENT_SECURITY = 10), 1), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 1, list(), 1), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1), )) /datum/event_container/moderate/New() available_events = list( - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 800), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 1600), // Leaks gas into an unoccupied room. new /datum/event_meta(EVENT_LEVEL_MODERATE, "Atmos Leak", /datum/event/atmos_leak, 30, list(ASSIGNMENT_ENGINEER = 25), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 30), 1), // Just disables comms for a short while. new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 500, list(ASSIGNMENT_AI = 150, ASSIGNMENT_SECURITY = 120), 1), // Just blows out a few lights @@ -71,37 +73,36 @@ // Opens doors in brig. So just RP fun new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 10, list(ASSIGNMENT_SECURITY = 100), 1), // Radiation, but only in space. + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 0, list(ASSIGNMENT_SECURITY = 20), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Solar Storm", /datum/event/solar_storm, 30, list(ASSIGNMENT_ENGINEER = 40, ASSIGNMENT_SECURITY = 30), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 1, 0, 50), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, 0, list(ASSIGNMENT_SECURITY = 20, ASSIGNMENT_ENGINEER = 30), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 30, list(ASSIGNMENT_SECURITY = 30), 1), //Evil grubs that drain station power slightly + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, 0, list(ASSIGNMENT_SECURITY = 10, ASSIGNMENT_ENGINEER = 30), 1), ) add_disabled_events(list( new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 30), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 100, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_SECURITY = 30), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 20)), // Not bad (dorms are shielded) but inconvenient new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 50, list(ASSIGNMENT_MEDICAL = 50), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Random Antagonist", /datum/event/random_antag, 2.5, list(ASSIGNMENT_SECURITY = 1), 1, 0, 5), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 20, list(ASSIGNMENT_SECURITY = 60)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 80, list(ASSIGNMENT_ENGINEER = 30)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 40), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1), )) /datum/event_container/major/New() available_events = list( - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 900), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 3600), new /datum/event_meta(EVENT_LEVEL_MAJOR, "Atmos Leak", /datum/event/atmos_leak, 30, list(ASSIGNMENT_ENGINEER = 25), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Strike", /datum/event/meteor_strike, 10, list(ASSIGNMENT_ENGINEER = 15) ,1) + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Strike", /datum/event/meteor_strike, 10, list(ASSIGNMENT_ENGINEER = 15), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 20, list(ASSIGNMENT_ENGINEER = 7), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 10, list(ASSIGNMENT_SECURITY = 5), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station,0, list(ASSIGNMENT_ANY = 5), 1), ) add_disabled_events(list( new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 10, list(ASSIGNMENT_ENGINEER = 60), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 10, list(ASSIGNMENT_SECURITY = 10), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station,0,list(ASSIGNMENT_ANY = 5)), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 30), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 20, list(ASSIGNMENT_ENGINEER = 15), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 15), 1), new /datum/event_meta(EVENT_LEVEL_MAJOR, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1), )) diff --git a/code/modules/events/ian_storm_vr.dm b/code/modules/events/ian_storm_vr.dm index 2ddee490d92..574df331bb4 100644 --- a/code/modules/events/ian_storm_vr.dm +++ b/code/modules/events/ian_storm_vr.dm @@ -23,7 +23,7 @@ for(var/i = 0, i < 3, i++) var/turf/target = get_step(T, pick(alldirs)) if(target && istype(target, /turf/simulated/floor)) - var/mob/living/simple_mob/corgi/Ian/doge = new(target) + var/mob/living/simple_mob/animal/passive/dog/corgi/Ian/doge = new(target) doge.name = "Ian " + pick("Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi", "Gamma", "Eta", "Iota", "Kappa", "Lambda", "Omicron", "Theta", "Rho", "Sigma", "Tau", "Upsilon", "Omega", "Psi", "Zeta") diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm index 3343a03c44f..ced7c9a45f6 100644 --- a/code/modules/events/money_spam.dm +++ b/code/modules/events/money_spam.dm @@ -101,11 +101,13 @@ last_spam_time = world.time + /* //VOREStation Removal: no need to spam the AI tenfold if (prob(50)) //Give the AI an increased chance to intercept the message for(var/mob/living/silicon/ai/ai in mob_list) // Allows other AIs to intercept the message but the AI won't intercept their own message. if(ai.aiPDA != P && ai.aiPDA != src) ai.show_message("Intercepted message from [sender] (Unknown / spam?) to [P:owner]: [message]") + */ //Commented out because we don't send messages like this anymore. Instead it will just popup in their chat window. //P.tnote += "← From [sender] (Unknown / spam?):
    [message]
    " diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 6140ae2de0c..13f853dd3c2 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -31,7 +31,7 @@ /datum/event/radiation_storm/proc/radiate() var/radiation_level = rand(15, 35) for(var/z in using_map.station_levels) - radiation_repository.z_radiate(locate(1, 1, z), radiation_level, 1) + SSradiation.z_radiate(locate(1, 1, z), radiation_level, 1) for(var/mob/living/carbon/C in living_mob_list) var/area/A = get_area(C) diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index 7eb0be92cc7..6d0be161c58 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -23,6 +23,6 @@ while((spawncount >= 1) && vents.len) var/obj/vent = pick(vents) - new /obj/effect/spider/spiderling(vent.loc) + new /obj/effect/spider/spiderling/virgo(vent.loc) //VOREStation Edit - No nurses vents -= vent spawncount-- diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 6cb8c267fb8..be7a6f6e794 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -11,8 +11,8 @@ description_antag = "Some fishing rods can be utilized as long-range, sharp weapons, though their pseudo ranged ability comes at the cost of slow speed." icon_state = "fishing_rod" item_state = "fishing_rod" - force_divisor = 0.25 - throwforce = 7 + force_divisor = 0.02 //VOREStation Edit + throwforce = 1 //VOREStation Edit sharp = TRUE attack_verb = list("whipped", "battered", "slapped", "fished", "hooked") hitsound = 'sound/weapons/punchmiss.ogg' diff --git a/code/modules/fishing/fishing_vr.dm b/code/modules/fishing/fishing_vr.dm new file mode 100644 index 00000000000..e545cc0edfb --- /dev/null +++ b/code/modules/fishing/fishing_vr.dm @@ -0,0 +1,42 @@ +#define FISHING_RARE "rare" +#define FISHING_UNCOMMON "uncommon" +#define FISHING_COMMON "common" +#define FISHING_JUNK "junk" +#define FISHING_NOTHING "nothing" + +GLOBAL_LIST_INIT(indoor_fishing_chance_list, list(FISHING_RARE = 5, FISHING_UNCOMMON = 20, FISHING_COMMON = 30, FISHING_JUNK = 5, FISHING_NOTHING = 50)) +GLOBAL_LIST_INIT(indoor_fishing_junk_list, list( + /obj/random/junk = 15, + /obj/random/maintenance/clean = 1 + )) + +/turf/simulated/floor/water/indoors + min_fishing_time = 33 + max_fishing_time = 99 + +/turf/simulated/floor/water/indoors/handle_fish() + if(has_fish) + rare_fish_list = GLOB.generic_fishing_rare_list + uncommon_fish_list = GLOB.generic_fishing_uncommon_list + common_fish_list = GLOB.generic_fishing_common_list + junk_list = GLOB.indoor_fishing_junk_list + fishing_loot = GLOB.indoor_fishing_chance_list + +/turf/simulated/floor/water/deep/indoors + min_fishing_time = 33 + max_fishing_time = 99 + +/turf/simulated/floor/water/deep/indoors/handle_fish() + if(has_fish) + rare_fish_list = GLOB.generic_fishing_rare_list + uncommon_fish_list = GLOB.generic_fishing_uncommon_list + common_fish_list = GLOB.generic_fishing_common_list + junk_list = GLOB.indoor_fishing_junk_list + fishing_loot = GLOB.indoor_fishing_chance_list + + +#undef FISHING_RARE +#undef FISHING_UNCOMMON +#undef FISHING_COMMON +#undef FISHING_JUNK +#undef FISHING_NOTHING \ No newline at end of file diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index 964ea8dbed3..911931eda3a 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -23,7 +23,7 @@ mob/living/carbon/proc/dream() spawn(0) for(var/i = rand(1,4),i > 0, i--) - src << "... [pick(dreams)] ..." + to_chat(src, "... [pick(dreams)] ...") sleep(rand(40,70)) if(paralysis <= 0) dreaming = 0 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index f70873f226b..cdd497c0161 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -28,13 +28,13 @@ mob/living/carbon/proc/handle_hallucinations() switch(halpick) if(0 to 15) //Screwy HUD - //src << "Screwy HUD" + //to_chat(src, "Screwy HUD") hal_screwyhud = pick(1,2,3,3,4,4) spawn(rand(100,250)) hal_screwyhud = 0 if(16 to 25) //Strange items - //src << "Traitor Items" + //to_chat(src, "Traitor Items") if(!halitem) halitem = new var/list/slots_free = list(ui_lhand,ui_rhand) @@ -82,7 +82,7 @@ mob/living/carbon/proc/handle_hallucinations() halitem = null if(26 to 40) //Flashes of danger - //src << "Danger Flash" + //to_chat(src, "Danger Flash") if(!halimage) var/list/possible_points = list() for(var/turf/simulated/floor/F in view(src,world.view)) @@ -92,13 +92,13 @@ mob/living/carbon/proc/handle_hallucinations() switch(rand(1,3)) if(1) - //src << "Space" + //to_chat(src, "Space") halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER) if(2) - //src << "Fire" + //to_chat(src, "Fire") halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER) if(3) - //src << "C4" + //to_chat(src, "C4") halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01) @@ -110,7 +110,7 @@ mob/living/carbon/proc/handle_hallucinations() if(41 to 65) //Strange audio - //src << "Strange Audio" + //to_chat(src, "Strange Audio") switch(rand(1,12)) if(1) src << 'sound/machines/airlock.ogg' if(2) @@ -144,7 +144,7 @@ mob/living/carbon/proc/handle_hallucinations() src << pick(creepyasssounds) if(66 to 70) //Flashes of danger - //src << "Danger Flash" + //to_chat(src, "Danger Flash") if(!halbody) var/list/possible_points = list() for(var/turf/simulated/floor/F in view(src,world.view)) diff --git a/code/modules/food/food/condiment.dm b/code/modules/food/food/condiment.dm index a6625ccf306..522f79b89b7 100644 --- a/code/modules/food/food/condiment.dm +++ b/code/modules/food/food/condiment.dm @@ -182,6 +182,198 @@ . = ..() reagents.add_reagent("sugar", 20) +//MRE condiments and drinks. + +/obj/item/weapon/reagent_containers/food/condiment/small/packet + icon_state = "packet_small" + w_class = ITEMSIZE_TINY + possible_transfer_amounts = "1;5;10" + amount_per_transfer_from_this = 1 + volume = 5 + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt + name = "salt packet" + desc = "Contains 5u of table salt." + icon_state = "packet_small_white" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("sodiumchloride", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper + name = "pepper packet" + desc = "Contains 5u of black pepper." + icon_state = "packet_small_black" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper/Initialize() + . = ..() + reagents.add_reagent("blackpepper", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar + name = "sugar packet" + desc = "Contains 5u of refined sugar." + icon_state = "packet_small_white" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar/Initialize() + . = ..() + reagents.add_reagent("sugar", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly + name = "jelly packet" + desc = "Contains 10u of cherry jelly. Best used for spreading on crackers." + icon_state = "packet_medium" + volume = 10 + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly/Initialize() + . = ..() + reagents.add_reagent("cherryjelly", 10) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/honey + name = "honey packet" + desc = "Contains 10u of honey." + icon_state = "packet_medium" + volume = 10 + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/honey/Initialize() + . = ..() + reagents.add_reagent("honey", 10) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin + name = "hot sauce packet" + desc = "Contains 5u of hot sauce. Enjoy in moderation." + icon_state = "packet_small_red" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin/Initialize() + . = ..() + reagents.add_reagent("capsaicin", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup + name = "ketchup packet" + desc = "Contains 5u of ketchup." + icon_state = "packet_small_red" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup/Initialize() + . = ..() + reagents.add_reagent("ketchup", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo + name = "mayonnaise packet" + desc = "Contains 5u of mayonnaise." + icon_state = "packet_small_white" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo/Initialize() + . = ..() + reagents.add_reagent("mayo", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/soy + name = "soy sauce packet" + desc = "Contains 5u of soy sauce." + icon_state = "packet_small_black" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/soy/Initialize() + . = ..() + reagents.add_reagent("soysauce", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/coffee + name = "coffee powder packet" + desc = "Contains 5u of coffee powder. Mix with 25u of water and heat." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/coffee/Initialize() + . = ..() + reagents.add_reagent("coffeepowder", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/tea + name = "tea powder packet" + desc = "Contains 5u of black tea powder. Mix with 25u of water and heat." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/tea/Initialize() + . = ..() + reagents.add_reagent("tea", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/cocoa + name = "cocoa powder packet" + desc = "Contains 5u of cocoa powder. Mix with 25u of water and heat." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/cocoa/Initialize() + . = ..() + reagents.add_reagent("coco", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/grape + name = "grape juice powder packet" + desc = "Contains 5u of powdered grape juice. Mix with 15u of water." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/grape/Initialize() + . = ..() + reagents.add_reagent("instantgrape", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/orange + name = "orange juice powder packet" + desc = "Contains 5u of powdered orange juice. Mix with 15u of water." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/orange/Initialize() + . = ..() + reagents.add_reagent("instantorange", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/watermelon + name = "watermelon juice powder packet" + desc = "Contains 5u of powdered watermelon juice. Mix with 15u of water." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/watermelon/Initialize() + . = ..() + reagents.add_reagent("instantwatermelon", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/apple + name = "apple juice powder packet" + desc = "Contains 5u of powdered apple juice. Mix with 15u of water." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/apple/Initialize() + . = ..() + reagents.add_reagent("instantapple", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/protein + name = "protein powder packet" + desc = "Contains 10u of powdered protein. Mix with 20u of water." + icon_state = "packet_medium" + volume = 10 + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/protein/Initialize() + . = ..() + reagents.add_reagent("protein", 10) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon + name = "crayon powder packet" + desc = "Contains 10u of powdered crayon. Mix with 30u of water." + volume = 10 +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/generic/Initialize() + . = ..() + reagents.add_reagent("crayon_dust", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/red/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_red", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/orange/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_orange", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/yellow/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_yellow", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/green/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_green", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/blue/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_blue", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/purple/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_purple", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/grey/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_grey", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/brown/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_brown", 10) + +//End of MRE stuff. + /obj/item/weapon/reagent_containers/food/condiment/flour name = "flour sack" desc = "A big bag of flour. Good for baking!" diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index e9d475bab1d..eab6c1b6832 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -21,12 +21,7 @@ /obj/item/weapon/reagent_containers/food/snacks/Initialize() . = ..() if(nutriment_amt) - reagents.add_reagent("nutriment",nutriment_amt,nutriment_desc) - -/obj/item/weapon/reagent_containers/food/snacks/Initialize() - . = ..() - if(nutriment_amt) - reagents.add_reagent("nutriment", nutriment_amt) + reagents.add_reagent("nutriment",(nutriment_amt*2),nutriment_desc) //Placeholder for effect that trigger on eating that aren't tied to reagents. /obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume(var/mob/M) @@ -755,7 +750,6 @@ /obj/item/weapon/reagent_containers/food/snacks/fishfingers/Initialize() . = ..() reagents.add_reagent("protein", 4) - reagents.add_reagent("carpotoxin", 3) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/zestfish @@ -989,7 +983,6 @@ /obj/item/weapon/reagent_containers/food/snacks/fishburger/Initialize() . = ..() reagents.add_reagent("protein", 6) - reagents.add_reagent("carpotoxin", 3) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tofuburger @@ -1328,7 +1321,6 @@ /obj/item/weapon/reagent_containers/food/snacks/cubancarp/Initialize() . = ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("carpotoxin", 3) reagents.add_reagent("capsaicin", 3) bitesize = 3 @@ -1989,7 +1981,6 @@ /obj/item/weapon/reagent_containers/food/snacks/fishandchips/Initialize() . = ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("carpotoxin", 3) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/sandwich @@ -3092,6 +3083,7 @@ filling_color = "#F5DEB8" center_of_mass = list("x"=16, "y"=6) nutriment_desc = list("salt" = 1, "cracker" = 2) + w_class = ITEMSIZE_TINY nutriment_amt = 1 @@ -3742,6 +3734,51 @@ reagents.add_reagent("iron", 3) bitesize = 4 +/obj/item/weapon/reagent_containers/food/snacks/liquidprotein + name = "\improper LiquidProtein Ration" + desc = "A variant of the liquidfood ration, designed for obligate carnivore species. Only barely more appealing than regular liquidfood. Should this be crunchy?" + icon_state = "liquidprotein" + trash = /obj/item/trash/liquidprotein + filling_color = "#A8A8A8" + survivalfood = TRUE + center_of_mass = list("x"=16, "y"=15) + +/obj/item/weapon/reagent_containers/food/snacks/liquidprotein/Initialize() + ..() + reagents.add_reagent("protein", 30) + reagents.add_reagent("iron", 3) + bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin + name = "\improper VitaPaste Ration" + desc = "A variant of the liquidfood ration, designed for any carbon-based life. Somehow worse than regular liquidfood. Should this be crunchy?" + icon_state = "liquidvitamin" + trash = /obj/item/trash/liquidvitamin + filling_color = "#A8A8A8" + survivalfood = TRUE + center_of_mass = list("x"=16, "y"=15) + +/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin/Initialize() + ..() + reagents.add_reagent("flour", 20) + reagents.add_reagent("tricordrazine", 5) + reagents.add_reagent("paracetamol", 5) + reagents.add_reagent("enzyme", 1) + reagents.add_reagent("iron", 3) + bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/meatcube + name = "cubed meat" + desc = "Fried, salted lean meat compressed into a cube. Not very appetizing." + icon_state = "meatcube" + filling_color = "#7a3d11" + center_of_mass = list("x"=16, "y"=16) + +/obj/item/weapon/reagent_containers/food/snacks/meatcube/Initialize() + . = ..() + reagents.add_reagent("protein", 15) + bitesize = 3 + /obj/item/weapon/reagent_containers/food/snacks/tastybread name = "bread tube" desc = "Bread in a tube. Chewy...and surprisingly tasty." @@ -3809,7 +3846,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sashimi name = "carp sashimi" - desc = "Expertly prepared. Still toxic." + desc = "Expertly prepared. Hopefully toxin got removed though." filling_color = "#FFDEFE" icon_state = "sashimi" nutriment_amt = 6 @@ -3817,7 +3854,6 @@ /obj/item/weapon/reagent_containers/food/snacks/sashimi/Initialize() . = ..() reagents.add_reagent("protein", 2) - reagents.add_reagent("carpotoxin", 2) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/benedict @@ -4148,4 +4184,27 @@ /obj/item/weapon/reagent_containers/food/snacks/wormdeluxe/Initialize() . = ..() reagents.add_reagent("fishbait", 40) - bitesize = 5 \ No newline at end of file + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/siffruit + name = "pulsing fruit" + desc = "A blue-ish sac encased in a tough black shell." + icon = 'icons/obj/flora/foraging.dmi' + icon_state = "siffruit" + nutriment_amt = 2 + nutriment_desc = list("tart" = 1) + w_class = ITEMSIZE_TINY + +/obj/item/weapon/reagent_containers/food/snacks/siffruit/Initialize() + . = ..() + reagents.add_reagent("sifsap", 2) + +/obj/item/weapon/reagent_containers/food/snacks/siffruit/afterattack(obj/O as obj, mob/user as mob, proximity) + if(istype(O,/obj/machinery/microwave)) + return ..() + if(!(proximity && O.is_open_container())) + return + to_chat(user, "You tear \the [src]'s sac open, pouring it into \the [O].") + reagents.trans_to(O, reagents.total_volume) + user.drop_from_inventory(src) + qdel(src) diff --git a/code/modules/food/food/snacks_vr.dm b/code/modules/food/food/snacks_vr.dm index 8106c52dfd3..a283a6bafe5 100644 --- a/code/modules/food/food/snacks_vr.dm +++ b/code/modules/food/food/snacks_vr.dm @@ -607,19 +607,3 @@ /obj/item/pizzabox/meat/Initialize() pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatcargo(src) - -/obj/item/weapon/reagent_containers/food/snacks/liquidprotein - name = "\improper LiquidProtein Ration" - desc = "A variant of the liquidfood ration, designed for obligate carnivore species. Only barely more appealing than regular liquidfood. Should this be crunchy?" - icon = 'icons/obj/food_vr.dmi' - icon_state = "liquidprotein" - trash = /obj/item/trash/liquidprotein - filling_color = "#A8A8A8" - survivalfood = TRUE - center_of_mass = list("x"=16, "y"=15) - -/obj/item/weapon/reagent_containers/food/snacks/liquidprotein/Initialize() - ..() - reagents.add_reagent("protein", 20) - reagents.add_reagent("iron", 3) - bitesize = 4 diff --git a/code/modules/food/glass/bottle_vr.dm b/code/modules/food/glass/bottle_vr.dm index e357de97fa2..fc1595b699a 100644 --- a/code/modules/food/glass/bottle_vr.dm +++ b/code/modules/food/glass/bottle_vr.dm @@ -137,3 +137,12 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle-3" prefill = list("unsorbitol" = 60) + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fitnessflask/glucose + name = "glucose container" + desc = "A container of glucose. Used to treat bloodloss through a hardsuit in unconscious patients." + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fitnessflask/glucose/Initialize() + . = ..() + reagents.add_reagent("glucose", 100) + on_reagent_change() diff --git a/code/modules/food/recipe_dump.dm b/code/modules/food/recipe_dump.dm index a458a568cfa..781ef7fc2fe 100644 --- a/code/modules/food/recipe_dump.dm +++ b/code/modules/food/recipe_dump.dm @@ -214,4 +214,4 @@ html += "" src << browse(html, "window=recipes;file=recipes_drinks.html;display=0") - src << "In your byond cache, recipe-xxx.png files and recipes_drinks.html and recipes_food.html now exist. Place recipe-xxx.png files in a subfolder named 'imgrecipes' wherever you put them. The file will take a food.css or drinks.css file if in the same path." + to_chat(src, "In your byond cache, recipe-xxx.png files and recipes_drinks.html and recipes_food.html now exist. Place recipe-xxx.png files in a subfolder named 'imgrecipes' wherever you put them. The file will take a food.css or drinks.css file if in the same path.") diff --git a/code/modules/food/recipes_microwave_vr.dm b/code/modules/food/recipes_microwave_vr.dm index bc375d0d70e..3cc33a96bec 100644 --- a/code/modules/food/recipes_microwave_vr.dm +++ b/code/modules/food/recipes_microwave_vr.dm @@ -29,9 +29,9 @@ fruit = list("cabbage" = 1) reagents = list("rice" = 20) items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/meat + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat ) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi diff --git a/code/modules/gamemaster/actions/money_spam.dm b/code/modules/gamemaster/actions/money_spam.dm index 75f572e1f25..e11baec0908 100644 --- a/code/modules/gamemaster/actions/money_spam.dm +++ b/code/modules/gamemaster/actions/money_spam.dm @@ -101,11 +101,13 @@ last_spam_time = world.time + /* //VOREStation Removal: no need to spam the AI tenfold if (prob(50)) //Give the AI an increased chance to intercept the message for(var/mob/living/silicon/ai/ai in mob_list) // Allows other AIs to intercept the message but the AI won't intercept their own message. if(ai.aiPDA != P && ai.aiPDA != src) ai.show_message("Intercepted message from [sender] (Unknown / spam?) to [P:owner]: [message]") + */ //Commented out because we don't send messages like this anymore. Instead it will just popup in their chat window. //P.tnote += "← From [sender] (Unknown / spam?):
    [message]
    " diff --git a/code/modules/gamemaster/actions/planet_weather_change.dm b/code/modules/gamemaster/actions/planet_weather_change.dm index e0f2e754e99..27583a9a6a2 100644 --- a/code/modules/gamemaster/actions/planet_weather_change.dm +++ b/code/modules/gamemaster/actions/planet_weather_change.dm @@ -5,7 +5,13 @@ reusable = TRUE var/datum/planet/target_planet - var/list/banned_weathers = list() //VOREStation Temp Edit + var/list/banned_weathers = list( + //VOREStation Edit - Virgo 3B Weather, + /datum/weather/virgo3b/ash_storm, + /datum/weather/virgo3b/emberfall, + /datum/weather/virgo3b/blood_moon, + /datum/weather/virgo3b/fallout) + //VOREStation Edit End var/list/possible_weathers = list() /datum/gm_action/planet_weather_shift/set_up() diff --git a/code/modules/gamemaster/actions/radiation_storm.dm b/code/modules/gamemaster/actions/radiation_storm.dm index 243af5dbee0..678ad16ab64 100644 --- a/code/modules/gamemaster/actions/radiation_storm.dm +++ b/code/modules/gamemaster/actions/radiation_storm.dm @@ -41,7 +41,7 @@ /datum/gm_action/radiation_storm/proc/radiate() var/radiation_level = rand(15, 35) for(var/z in using_map.station_levels) - radiation_repository.z_radiate(locate(1, 1, z), radiation_level, 1) + SSradiation.z_radiate(locate(1, 1, z), radiation_level, 1) for(var/mob/living/carbon/C in living_mob_list) var/area/A = get_area(C) diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 22b4b2e6c6d..c1c7ebedafa 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -126,6 +126,38 @@ slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', ) item_state = "boxing" + special_attack_type = /datum/unarmed_attack/holopugilism + +datum/unarmed_attack/holopugilism + sparring_variant_type = /datum/unarmed_attack/holopugilism + +datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/zone) + user.do_attack_animation(src) + var/damage = rand(0, 9) + if(!damage) + playsound(target.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + target.visible_message("[user] has attempted to punch [target]!") + return TRUE + var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_sel.selecting)) + var/armor_block = target.run_armor_check(affecting, "melee") + var/armor_soak = target.get_armor_soak(affecting, "melee") + + if(HULK in user.mutations) + damage += 5 + + playsound(target.loc, "punch", 25, 1, -1) + + target.visible_message("[user] has punched [target]!") + + if(armor_soak >= damage) + return TRUE + + target.apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak) + if(damage >= 9) + target.visible_message("[user] has weakened [target]!") + target.apply_effect(4, WEAKEN, armor_block) + + return TRUE /obj/structure/window/reinforced/holowindow/attackby(obj/item/W as obj, mob/user as mob) if(!istype(W)) @@ -262,8 +294,8 @@ spark_system.set_up(5, 0, user.loc) spark_system.start() playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) - return 1 - return 0 + return TRUE + return FALSE /obj/item/weapon/holo/esword/New() item_color = pick("red","blue","green","purple") diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index 7af5ce286c6..d215ab3dac0 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -241,6 +241,8 @@ icon = 'icons/obj/beekeeping.dmi' icon_state = "wax" default_type = "wax" + pass_color = TRUE + strict_color_stacking = TRUE /obj/item/stack/material/wax/New() ..() @@ -252,6 +254,7 @@ icon_colour = "#fff343" melting_point = T0C+300 weight = 1 + pass_stack_colors = TRUE var/global/list/datum/stack_recipe/wax_recipes = list( \ new/datum/stack_recipe("candle", /obj/item/weapon/flame/candle) \ diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 81018de61ca..5a40ce3e0e2 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -24,6 +24,8 @@ if(planttype) plantname = planttype +/obj/item/weapon/reagent_containers/food/snacks/grown/Initialize() + ..() if(!plantname) return diff --git a/code/modules/hydroponics/seed_storage_vr.dm b/code/modules/hydroponics/seed_storage_vr.dm index 6d9d373b786..77a885276c5 100644 --- a/code/modules/hydroponics/seed_storage_vr.dm +++ b/code/modules/hydroponics/seed_storage_vr.dm @@ -5,17 +5,20 @@ /obj/item/seeds/berryseed = 3, /obj/item/seeds/cabbageseed = 3, /obj/item/seeds/carrotseed = 3, + /obj/item/seeds/celery = 3, /obj/item/seeds/chantermycelium = 3, /obj/item/seeds/cherryseed = 3, /obj/item/seeds/chiliseed = 3, /obj/item/seeds/cocoapodseed = 3, /obj/item/seeds/cornseed = 3, + /obj/item/seeds/durian = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/grapeseed = 3, /obj/item/seeds/grassseed = 3, /obj/item/seeds/replicapod = 3, /obj/item/seeds/lavenderseed = 3, /obj/item/seeds/lemonseed = 3, + /obj/item/seeds/lettuce = 3, /obj/item/seeds/limeseed = 3, /obj/item/seeds/mtearseed = 2, /obj/item/seeds/orangeseed = 3, @@ -25,19 +28,24 @@ /obj/item/seeds/poppyseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/pumpkinseed = 3, + /obj/item/seeds/rhubarb = 3, /obj/item/seeds/riceseed = 3, + /obj/item/seeds/rose = 3, /obj/item/seeds/soyaseed = 3, + /obj/item/seeds/spineapple = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/shandseed = 2, /obj/item/seeds/tobaccoseed = 3, /obj/item/seeds/tomatoseed = 3, /obj/item/seeds/towermycelium = 3, + /obj/item/seeds/vanilla = 3, /obj/item/seeds/watermelonseed = 3, /obj/item/seeds/wheatseed = 3, /obj/item/seeds/whitebeetseed = 3, /obj/item/seeds/shrinkshroom = 3, - /obj/item/seeds/megashroom = 3) + /obj/item/seeds/megashroom = 3, + /obj/item/seeds/wabback = 2) /obj/machinery/seed_storage/xenobotany name = "Xenobotany seed storage" @@ -50,11 +58,13 @@ /obj/item/seeds/berryseed = 3, /obj/item/seeds/cabbageseed = 3, /obj/item/seeds/carrotseed = 3, + /obj/item/seeds/celery = 3, /obj/item/seeds/chantermycelium = 3, /obj/item/seeds/cherryseed = 3, /obj/item/seeds/chiliseed = 3, /obj/item/seeds/cocoapodseed = 3, /obj/item/seeds/cornseed = 3, + /obj/item/seeds/durian = 3, /obj/item/seeds/replicapod = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/glowshroom = 2, @@ -62,6 +72,7 @@ /obj/item/seeds/grassseed = 3, /obj/item/seeds/lavenderseed = 3, /obj/item/seeds/lemonseed = 3, + /obj/item/seeds/lettuce = 3, /obj/item/seeds/libertymycelium = 2, /obj/item/seeds/limeseed = 3, /obj/item/seeds/mtearseed = 2, @@ -74,14 +85,19 @@ /obj/item/seeds/potatoseed = 3, /obj/item/seeds/pumpkinseed = 3, /obj/item/seeds/reishimycelium = 2, + /obj/item/seeds/rhubarb = 3, /obj/item/seeds/riceseed = 3, + /obj/item/seeds/rose = 3, /obj/item/seeds/soyaseed = 3, + /obj/item/seeds/spineapple = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/shandseed = 2, /obj/item/seeds/tobaccoseed = 3, /obj/item/seeds/tomatoseed = 3, /obj/item/seeds/towermycelium = 3, + /obj/item/seeds/vanilla = 3, + /obj/item/seeds/wabback = 2, /obj/item/seeds/watermelonseed = 3, /obj/item/seeds/wheatseed = 3, /obj/item/seeds/whitebeetseed = 3, diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index 871051a2583..cdf4652d5ee 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -148,7 +148,7 @@ else var/obj/item/I = build_type cost = initial(I.w_class) - if(!build_type in SScircuit.circuit_fabricator_recipe_list[current_category]) + if(!(build_type in SScircuit.circuit_fabricator_recipe_list[current_category])) return if(!debug) diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index e3fcb5d9855..4ac81ea4ccc 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -308,11 +308,12 @@ var/list/valid_things = list() if(isweakref(I.data)) var/atom/A = I.data.resolve() - var/desired_type = A.type - if(desired_type) - for(var/atom/thing in nearby_things) - if(thing.type == desired_type) - valid_things.Add(thing) + if(A) + var/desired_type = A.type + if(desired_type) + for(var/atom/thing in nearby_things) + if(thing.type == desired_type) + valid_things.Add(thing) else if(istext(I.data)) var/DT = I.data for(var/atom/thing in nearby_things) diff --git a/code/modules/library/hardcode_library/_library.dm b/code/modules/library/hardcode_library/_library.dm new file mode 100644 index 00000000000..03364fea0a1 --- /dev/null +++ b/code/modules/library/hardcode_library/_library.dm @@ -0,0 +1,61 @@ +/* + * Home of the New (NOV 1st, 2019) library books. + */ + +/obj/item/weapon/book/custom_library + name = "Book" + desc = "A hardbound book." + description_info = "This book is printed from the custom repo. If you can see this, something went wrong." + + icon = 'icons/obj/custom_books.dmi' + icon_state = "book" + + // This is the ckey of the book's author. + var/origkey = null + author = "UNKNOWN" + +/obj/item/weapon/book/custom_library/fiction + libcategory = "Fiction" + +/obj/item/weapon/book/custom_library/nonfiction + libcategory = "Non-Fiction" + +/obj/item/weapon/book/custom_library/reference + libcategory = "Reference" + +/obj/item/weapon/book/custom_library/religious + libcategory = "Religious" +/* +/obj/item/weapon/book/custom_library/adult + libcategory = "Adult" +*/ +/obj/item/weapon/book/bundle/custom_library + name = "Book" + desc = "A hardbound book." + description_info = "This book is printed from the custom repo. If you can see this, something went wrong." + + icon = 'icons/obj/custom_books.dmi' + icon_state = "book" + + // This is the ckey of the book's author. + var/origkey = null + author = "UNKNOWN" + + page = 1 //current page + pages = list() //the contents of each page + +/obj/item/weapon/book/bundle/custom_library/fiction + libcategory = "Fiction" + +/obj/item/weapon/book/bundle/custom_library/nonfiction + libcategory = "Non-Fiction" + +/obj/item/weapon/book/bundle/custom_library/reference + libcategory = "Reference" + +/obj/item/weapon/book/bundle/custom_library/religious + libcategory = "Religious" +/* +/obj/item/weapon/book/bundle/custom_library/adult + libcategory = "Adult" +*/ diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 3c7ebec3779..9b9be0d6c8c 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -147,6 +147,7 @@ var/dat // Actual page content var/due_date = 0 // Game time in 1/10th seconds var/author // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned + var/libcategory = "Miscellaneous" // The library category this book sits in. "Fiction", "Non-Fiction", "Adult", "Reference", "Religion" var/unique = 0 // 0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified var/title // The real name of the book. var/carved = 0 // Has the book been hollowed out for use as a secret storage item? @@ -260,6 +261,74 @@ M << browse("Penned by [author].
    " + "[dat]", "window=book") user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam +/* +* Book Bundle (Multi-page book) +*/ + +/obj/item/weapon/book/bundle + var/page = 1 //current page + var/list/pages = list() //the contents of each page + +/obj/item/weapon/book/bundle/proc/show_content(mob/user as mob) + var/dat + var/obj/item/weapon/W = pages[page] + // first + if(page == 1) + dat+= "
    Front
    " + dat+= "
    Next Page


    " + // last + else if(page == pages.len) + dat+= "
    Previous Page
    " + dat+= "
    Back


    " + // middle pages + else + dat+= "
    Previous Page
    " + dat+= "
    Next Page


    " + if(istype(pages[page], /obj/item/weapon/paper)) + var/obj/item/weapon/paper/P = W + if(!(istype(usr, /mob/living/carbon/human) || isobserver(usr) || istype(usr, /mob/living/silicon))) + dat += "[P.name][stars(P.info)][P.stamps]" + else + dat += "[P.name][P.info][P.stamps]" + user << browse(dat, "window=[name]") + else if(istype(pages[page], /obj/item/weapon/photo)) + var/obj/item/weapon/photo/P = W + user << browse_rsc(P.img, "tmp_photo.png") + user << browse(dat + "[P.name]" \ + + "" \ + + "
    Written on the back:
    [P.scribble]" : ]"\ + + "", "window=[name]") + else if(!isnull(pages[page])) + if(!(istype(usr, /mob/living/carbon/human) || isobserver(usr) || istype(usr, /mob/living/silicon))) + dat += "Page [page][stars(pages[page])]" + else + dat += "Page [page][pages[page]]" + user << browse(dat, "window=[name]") + +/obj/item/weapon/book/bundle/attack_self(mob/user as mob) + src.show_content(user) + add_fingerprint(usr) + update_icon() + return + +/obj/item/weapon/book/bundle/Topic(href, href_list) + if(..()) + return 1 + if((src in usr.contents) || (istype(src.loc, /obj/item/weapon/folder) && (src.loc in usr.contents))) + usr.set_machine(src) + if(href_list["next_page"]) + if(page != pages.len) + page++ + playsound(src.loc, "pageturn", 50, 1) + if(href_list["prev_page"]) + if(page > 1) + page-- + playsound(src.loc, "pageturn", 50, 1) + src.attack_self(usr) + updateUsrDialog() + else + to_chat(usr, "You need to hold it in your hands!") /* * Barcode Scanner diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 716b85f2f1a..39070779cad 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -113,7 +113,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f * Library Computer */ // TODO: Make this an actual /obj/machinery/computer that can be crafted from circuit boards and such -// It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it. +// It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it. // Nov 2019. Nope. /obj/machinery/librarycomp name = "Check-In/Out Computer" icon = 'icons/obj/library.dmi' @@ -133,6 +133,40 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f var/bibledelay = 0 // LOL NO SPAM (1 minute delay) -- Doohl + var/static/list/all_books + + var/static/list/base_genre_books + +/obj/machinery/librarycomp/Initialize() + ..() + + if(!base_genre_books || !base_genre_books.len) + base_genre_books = list( + /obj/item/weapon/book/custom_library/fiction, + /obj/item/weapon/book/custom_library/nonfiction, + /obj/item/weapon/book/custom_library/reference, + /obj/item/weapon/book/custom_library/religious, + /obj/item/weapon/book/bundle/custom_library/fiction, + /obj/item/weapon/book/bundle/custom_library/nonfiction, + /obj/item/weapon/book/bundle/custom_library/reference, + /obj/item/weapon/book/bundle/custom_library/religious + ) + + if(!all_books || !all_books.len) + all_books = list() + + for(var/path in subtypesof(/obj/item/weapon/book/codex/lore)) + var/obj/item/weapon/book/C = new path(null) + all_books[C.name] = C + + for(var/path in subtypesof(/obj/item/weapon/book/custom_library) - base_genre_books) + var/obj/item/weapon/book/B = new path(null) + all_books[B.title] = B + + for(var/path in subtypesof(/obj/item/weapon/book/bundle/custom_library) - base_genre_books) + var/obj/item/weapon/book/M = new path(null) + all_books[M.title] = M + /obj/machinery/librarycomp/attack_hand(var/mob/user as mob) usr.set_machine(src) var/dat = "Book Inventory Management\n" // @@ -144,7 +178,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f 3. Check out a Book
    4. Connect to External Archive
    5. Upload New Title to Archive
    - 6. Print a Bible
    "} + 6. Print a Bible
    + 8. Access NT Internal Archive
    "} if(src.emagged) dat += "7. Access the Forbidden Lore Vault
    " if(src.arcanecheckout) @@ -190,8 +225,11 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f (Commit Entry)
    (Return to main menu)
    "} if(4) - dat += "

    External Archive

    " + dat += "

    External Archive

    " //VOREStation Edit establish_old_db_connection() + + dat += "

    Warning: System Administrator has slated this archive for removal. Personal uploads should be taken to the NT board of internal literature.

    " + if(!dbcon_old.IsConnected()) dat += "ERROR: Unable to contact External Archive. Please contact your system administrator for assistance." else @@ -210,6 +248,10 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f dat += "" dat += "
    (Return to main menu)
    " if(5) + //dat += "

    ERROR

    " //VOREStation Removal + //dat+= "Library Database is in Secure Management Mode.
    \ //VOREStation Removal + //Contact a System Administrator for more information.
    " //VOREStation Removal + //VOREstation Edit Start dat += "

    Upload a New Title

    " if(!scanner) for(var/obj/machinery/libraryscanner/S in range(9)) @@ -227,12 +269,30 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f dat += {"Author: [scanner.cache.author]
    Category: [upload_category]
    \[Upload\]
    "} + //VOREStation Edit End dat += "(Return to main menu)
    " if(7) dat += {"

    Accessing Forbidden Lore Vault v 1.3

    Are you absolutely sure you want to proceed? EldritchTomes Inc. takes no responsibilities for loss of sanity resulting from this action.

    Yes.
    No.
    "} + if(8) + dat += "

    NT Internal Archive

    " + if(!all_books || !all_books.len) + dat += "ERROR Something has gone seriously wrong. Contact System Administrator for more information." + else + dat += {" + " + dat += "
    TITLE\[Order\]
    " + dat += "
    (Return to main menu)
    " //dat += "Close

    " user << browse(dat, "window=library") @@ -293,6 +353,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f if("7") screenstate = 7 + if("8") + screenstate = 8 if(href_list["arccheckout"]) if(src.emagged) src.arcanecheckout = 1 @@ -328,6 +390,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f var/newcategory = input("Choose a category: ") in list("Fiction", "Non-Fiction", "Adult", "Reference", "Religion") if(newcategory) upload_category = newcategory + + //VOREStation Edit Start if(href_list["upload"]) if(scanner) if(scanner.cache) @@ -356,6 +420,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f else log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs") alert("Upload Complete.") + //VOREStation Edit End if(href_list["targetid"]) var/sqlid = sanitizeSQL(href_list["targetid"]) @@ -392,6 +457,10 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f spawn() src.Topic(nhref, params2list(nhref), src) if(href_list["sort"] in list("author", "title", "category")) sortby = href_list["sort"] + if(href_list["hardprint"]) + var/newpath = href_list["hardprint"] + var/obj/item/weapon/book/NewBook = new newpath(get_turf(src)) + NewBook.name = "Book: [NewBook.name]" src.add_fingerprint(usr) src.updateUsrDialog() return diff --git a/code/modules/lore_codex/codex.dm b/code/modules/lore_codex/codex.dm index 126c470de4d..c1cf1b32004 100644 --- a/code/modules/lore_codex/codex.dm +++ b/code/modules/lore_codex/codex.dm @@ -24,13 +24,14 @@ has the words 'Don't Panic' in small, friendly letters on the cover." icon_state = "codex" root_type = /datum/lore/codex/category/main_virgo_lore + libcategory = "Reference" /obj/item/weapon/book/codex/lore/robutt name = "A Buyer's Guide to Artificial Bodies" desc = "Recommended reading for the newly cyborgified, new positronics, and the upwardly-mobile FBP." icon_state = "codex_robutt" root_type = /datum/lore/codex/category/main_robutts - + libcategory = "Reference" /obj/item/weapon/book/codex/lore/news name = "Daedalus Pocket Newscaster" @@ -38,6 +39,7 @@ icon_state = "newscodex" w_class = ITEMSIZE_SMALL root_type = /datum/lore/codex/category/main_news + libcategory = "Reference" /* //VORESTATION REMOVAL // Combines SOP/Regs/Law @@ -48,4 +50,5 @@ icon_state = "corp_regs" root_type = /datum/lore/codex/category/main_corp_regs throwforce = 5 // Throw the book at 'em. + libcategory = "Reference" */ diff --git a/code/modules/lore_codex/news_data/main.dm b/code/modules/lore_codex/news_data/main.dm index a2f5f430433..277c38e1754 100644 --- a/code/modules/lore_codex/news_data/main.dm +++ b/code/modules/lore_codex/news_data/main.dm @@ -4,6 +4,19 @@ region. Each is labeled by date of publication and title. This list is self-updating, and from time to time the publisher will push new \ articles. You are encouraged to check back frequently." children = list( + /datum/lore/codex/page/article66, + /datum/lore/codex/page/article65, + /datum/lore/codex/page/article64, + /datum/lore/codex/page/article63, + /datum/lore/codex/page/article62, + /datum/lore/codex/page/article61, + /datum/lore/codex/page/article60, + /datum/lore/codex/page/article59, + /datum/lore/codex/page/article58, + /datum/lore/codex/page/article57, + /datum/lore/codex/page/article56, + /datum/lore/codex/page/article55, + /datum/lore/codex/page/article54, /datum/lore/codex/page/article53, /datum/lore/codex/page/article52, /datum/lore/codex/page/article51, @@ -650,4 +663,122 @@

    \ Candidate Freya Singh, a career investment banker, spent much of today's debate advocating for reduced safety regulations and the apparent overturning of the Five Points, raising eyebrows across the system. Singh's office claims that her statements were 'a joke', but we do not feel that this is a laughing matter.\

    \ - In related news, Shadow Coalition candidate Phaedrus remains under a profanity filter 'house arrest' for the remainder of the election." \ No newline at end of file + In related news, Shadow Coalition candidate Phaedrus remains under a profanity filter 'house arrest' for the remainder of the election." + +/datum/lore/codex/page/article54 + name = "06/28/63 - Vir Finalizes Dates for Election Voting" + data = "The Vir Governmental Authority has confirmed that voting for Vir's governorship and Colonial Assembly seats will take place on the 29th and 30th of June, with an additional voting period set for Wednesday the 3rd of July to allow for out-of-system and full-time weekend employees to cast their votes. No exit poll information will be released until the final votes have been cast, and final results are expected to be announced within another week.\ +

    \ + According to a Oculum poll, Lusia Hainirsdottir is expected to comfortably take a seat, though the certainty of her governor position is not hard set. Candidates Sao, Singh and Jorg are trailing not far behind, but will all have to make good showings this weekend if they hope for electoral success. In an unexpected surge among minority species, the Shadow Coalition's Tajaran candidate Kurah Zarshir is leading the polls in certain outlying and orbital communities.\ +

    \ + Not sure how to vote, if you can vote, or who to vote for? Check out the official election website at your-choice-vir.virgov.xo.vr" + +/datum/lore/codex/page/article55 + name = "06/29/63 - Morpheus Cyberkinetics To Split Assets" + data = "The Morpheus Cyberkenetics Corporation is to split into two distinct entities operating under a single board of trustees, in light of their Almach branch's apparent involvement in the ongoing war after last month's 'unintentional' corporate drone strikes. Citing 'Severe communications disruptions' between its operations and assets on either side of the cordon since it was put in place last year, the SolGov-side corporation is to become 'Morpheus Sol', retaining most assets and current corporate headquarters, and its Almach counterpart 'Morpheus Shelf', which is to be based out of the administration station MAS Sophia Jr., located in the El system.'\ +

    \ + The principle victim of the Aetolian coup, Nanotrasen, has seen most of their considerable Almachi investment nationalized by the secessionist government, as has Xion and other major Almachi organizations. Most surviving corporate exclaves have been effectively written off by their parent company for the duration of the conflict, due to the severe difficulties effectively conducting trade across the militarized border. Before today, the sole exception was Morpheus, whose involvement in the secession prevented any seizing of their assets. It seems, however, that even the sardonic positronic corporation is not immune to the difficulties of doing business in the Almach Rim region.\ +

    \ + Member of the Board Chock Full of Sardines introduced the proposal by saying, 'Our goal here is not being shot. Together with leading economic scientists, we've devised a scheme that will allow us to be shot for illegal smuggling almost ninety percent less often.' They defended the confusing and offensive choice of name in 'Sophia Jr.', seemingly intended as an insult to longstanding rival Sophia, by claiming, 'It's absolutely hilarious.'" + +/datum/lore/codex/page/article56 + name = "06/30/63 - Almach Leak Confirms 'Super-weapon' in Whythe" + data = "Solar Confederate Government Intelligence has this afternoon confirmed the presence of a so-called 'Super-weapon' in the distant Whythe system, after an apparent intelligence leak was posted to the exonet in the early hours of this morning. According to a spokesperson for the Solar Fleet, the public were not made aware of the super-weapon as the military 'have no reason to believe that the weapon poses any threat to civilian targets within SolGov space at this time, and there is no reason to cause panic with what amounts to the announcement of an Almachi propaganda tool intended to sow discord with bold threats of overwhelming power. This morning's leak achieves nothing but serving the Association's schemes. Keeping this so-called super-weapon - and I hesitate to use that term - a secret seems to have been last on their list of priorities.'\ +

    \ + According to the intelligence documents released this morning and widely spread within minutes of upload, the 'super-weapon' is a colossal space-bound structure equipped with 'newly developed bluespace technology', though its exact purpose or capabilities have not been confirmed by either side.\ +

    \ + Additionally, the Solar Fleet has announced that an unnamed individual within the intelligence service has been placed under arrest in connection with the leak." + +/datum/lore/codex/page/article57 + name = "07/04/63 - Exit Polls Suggest Shadow Coalition Win in Vir" + data = "According to the first exit poll data released after Vir Gubernatorial voting closed at midnight, local favourite the Shadow Coalition is expected to win at least two representative seats, with incumbent representative Lusia Hainirsdottir taking a comfortable lead.\ +

    \ + Final results are not expected to be tallied until Saturday morning, but other frontrunners include the Icarus Front's Vani Jee and Mehmet Sao - running on drastically different platforms - alongside the Shadow Coalition's Selma Jorg. In an unexpected turn, sole Tajaran Candidate Kurah Zarshir of the Shadow Coalition has seen an immense surge in popularity among minority and more xenophilic voters. Could Vir be seeing its first Tajaran Representative? Experts say: 'Perhaps.'" + +/datum/lore/codex/page/article58 + name = "07/07/63 - Vir Election Results" + data = "The results of the 2563 Vir Gubernatorial Elections are as follows:\ +
    \ + Governor of Vir: Lusia Hainirsdottir (Shadow Coalition)\ +
    \ + Vir Colonial Assembly Representative: Vani Jee (Icarus Front)\ +
    \ + Vir Colonial Assembly Representative: Selma Jorg (Shadow Coalition)\ +
    \ + Other candidates ranked: Sao (4), Zarshir (5), Keldow (6), Singh (7), Moravec (8), Phaedrus (9), Lye (10), Savik (11), Square (12), Wekstrom (13)\ +

    \ + Voter turnout: 30,928,287 (63%)\ +

    \ + The greatest upset this election cycle has been the unexpected popularity of 'alien rights' candidate Kurah Zarshir, who was eliminated in favour of Mehmet Sao (Icarus Front) in the 8th round of vote transfers by a margin of just 30 votes, or 0.000096%, prompting a rigourous recount process to confirm the result. A difference at this stage could have resulted in a significantly different final line-up.\ +

    \ + This year's winners showed clear advantages in the first-choice votes, each gaining at least 15% of the popular vote before any transfers were calculated, though Sao made significant gains in the final count, falling only a few percent short of the Jorg's 3rd place position. By far the least popular candidate this cycle was Hal Wekstrom of the Sol Economic Organization, who received just 0.8% of the first-choice vote and was immediately eliminated. Also of note were Phaedrus, Apogee Lye and Yole Savik voters, each of whom had high (30%+) voter exhaustion rates, opting not to provide alternative choices; sending the message 'My candidate or none at all.'\ +

    \ + The elected are to be sworn in at a ceremony on Luna in two weeks time." + +/datum/lore/codex/page/article59 + name = "07/30/63 - Solar Fleet Data Breach" + data = "Last night, a number of files were spread on the Monsters From Beyond's exolife forums allegedly depicting the boarding and eventual scuttling of the SCG-TV Mariner's Cage during a voyage close to the Gavel system on the 12th of June, before the SCG had officially released any information regarding the event. The files contained undisclosed documents from the Solar Fleet investigation, some of which appear to contain audio and video recordings of the final moments of the crew before the vessel's bluespace drive was detonated. Due to the graphic violence depicted and their classified nature, we will not be sharing the files, however as a matter of public record we will explain the events recorded therein. The following description may be unsuitable for sensitive readers.\ +

    \ + First, the navigation crew detects a drive signature on an apparent intercept course with their own, originating from across the SCG-Almachi border. It was not a large vessel, and is assumed to be some form of autonomous drone. The crew disregards it as a low level threat, instead continuing on their trajectory, leaving only the standard point defense armament locked on. This proved to be a lethal mistake, as the vessel appeared and near-instantly began accelerating toward the Mariner's Cage, before impacting the fore weapons array. The recording is cut, due to what was likely a power surge, however upon reconnection, reports indicate no damage related to any known warhead was apparent, aside from the initial impactor. The crew mistakenly assumes it to be a failed suicide drone strike, and dispatches minimal security personnel, and a large complement of response engineers.\ +

    \ + Approximately thirty minutes after the response teams are dispatched to the impact zone, the teams begin losing contact, with those first arriving being the first to disappear. When the security responders intercept the path of communications blackouts, they are met with the blades of multiple Aetolian shock troopers. Two appear to be made from a 'living steel', with each limb taking the form of 'jagged cleavers' as one radio recording states, and three more of 'indeterminable classification'. The ship entered a red alert state, and moments later, the small contingent of marines aboard the supply vessel were dispatched to deal with the threat. All five members of the enemy boarding party were able to be rendered inert through sustained fire, though not without Sol casualties.\ +

    \ + According to the next recordings, approximately three hours after the incident, the vessel received orders to interrogate the boarding 'Aetotheans'. The two noted to appear as the officers of the squad were rejuvenated within sealed interrogation chambers reinforced with supplies on hand, apparently capable of stopping sustained fire from multiple energy weapons. The first individual was a 'sapphire' according to information from NanoTrasen correspondants. It refused to speak in Galactic Common, and instead utilized an unknown frequency of biological transmission, and internal charge shifts. The individual was moved to a more permanent cell within the vessel's brig for transport, and the second was rejuvenated. Only the first half of the interrogation, which lasted approximately two and a half minutes, compared to four hours for the first, was recovered. The individual is rejuvenated, and is engaged in discussion with the interrogating officer when it suddenly stands, emits what is described as a 'wail', and detonates, destroying the transmitting camera, and presumably killing the officers involved in direct interrogation.\ +

    \ + Final recordings originate from the ship's onboard A.I. housing, which was involved in continual discussions with presumably the 'sapphire', as it enacted the vessel's scuttling. It is unknown whether or not the individual was somehow capable of restoring the other individuals that fell in combat in order to free itself, or if it was able to incapacitate the transporting officers, and command crew of the vessel alone.\ +

    \ + The Solar Fleet has expressed 'regret' that the files were leaked in their complete form, and have assured the public that an official report was due for release in the coming weeks. Concerns of 'Aetothean' attacks on civilian targets have been dismissed as 'improbable', but have affirmed that 'the threat is being taken very seriously'." + +/datum/lore/codex/page/article60 + name = "08/03/63 - Hainirsdottir Sworn In As Governor of Vir" + data = "Following a short transitionary period for the previous administration, this year's election victors have been sworn in at an official ceremony at the Colonial Assembly Hall on Luna. During her welcoming address, Governor Hainirsdottir reaffirmed her plans for the future of the system, promising a 'Bright future for Vir as a hub for medical science.', and plans for an incentivisation program for the removal of invasive extra-terrestrial species that have long plagued the region - in particular the aggressive spiders that have become synonymous with certain regions of the Sivian wilderness.\ +

    \ + Additionally, the newly elected representatives announced expected, but none-the-less significant changes to the administrative staff of the system. Notable figures include two defeated election hopefuls: Kurah Zarshir has been selected as the Shadow Coalition's Culture Secretary for the system, while Mehmet Sao has been brought aboard by the Representative Vani Jee as the Vir Icarus Front's Internal Security Advisor. It is expected that the former candidates may use their positions to further certain goals from their own campaigns, but under the watchful eyes of their perhaps more moderate superiors." + +/datum/lore/codex/page/article61 + name = "08/04/63 - Former Independence Candidate Found Dead" + data = "It has been confirmed by a spokesperson for the Sivian Independence Front that a body found by hikers last week in the Ingolfskynn Mountains, approximately 200 miles northeast of New Reykjavik, belonged to party chair Yole Savik.\ +

    \ + Savik, 68 - who had run for Vir Representative in the recent election - had not been seen since the 14th of July, shortly after the results were announced. Party officials claim that Mr. Savik frequently made 'off the grid' trips into the Sivian wilderness and his absence had not been treated as suspicious until investigators approached them to confirm the identity of the body. According to police, though Yole was publicly known as a 'seasoned frontiersman', Savik had succumbed to exposure at least two weeks prior to the grisly discovery. His death is not being treated as suspicious." + +/datum/lore/codex/page/article62 + name = "08/07/63 - Almach Pirate Threat Vanishes - Analysts Baffled" + data = "Skrellian Xe'qua pirates operating in the far reaches of the Almach Association since the onset of hostilities last year, have inexplicably gone dark. The pirates, who were under close SolGov surveillance to monitor their impact on Almachi shipping, have drastically dropped in activity and numbers over the last month according to an official report released by the Solar Fleet today. The Fleet is unable to account for the cease in activity, which has now reached levels even lower than their pre-war baseline, as there have been no reports of Almach military operations in the area, nor any signs of decisive battle on the Almach border with pirate space.\ +

    \ + The drop in activity roughly coincides with the leaked information on an Almach 'Super-weapon' in Whythe, though military sources do not believe that the weapon has been deployed in any capacity at this time. According to Hasan Drust, an expert on Skrellian foreign policy, the 'only feasible explanation (is) major anti-piracy action undertaken by the Skrellian Far Kingdoms', who occupy the space beyond the Xe'qua pirates' known range. The reasoning behind this action now, against pirates who have historically only targeted human space is not entirely clear, though Drust suggests that it may simply be a coincidence as pirates would be a 'trivial issue' for Far Kingdom military might." + +/datum/lore/codex/page/article63 + name = "09/02/63 - Shock Almach Attack Routs Relan Front!" + data = "Following close to a month of reduced Almach activity, enemy Militia forces have today launched a staggering attack on Sol frontline forces in the region of the Relan system, disabling several SCG warships and forcing a major tactical retreat to Saint Columbia. The scale of this attack by Almach forces is unprecedented, but seems to be the result of the Association consolidating manpower previously dedicated to anti-piracy patrols on the far side of their territory. It is believed these vessels have become freed up due to the apparent but as of yet unconfirmed annihilation of Xe'qua criminal flotillas by Skrellian Far Kingdom police action.\ +

    \ + The Solar fleet had been in position to blockade the Relan system in the hopes of forcing the Free Relan Federation to surrender and withdraw from the Association, but was unprepared for what has been described as an 'all-out attack' on their positions, which left the vessels SCG-D Liu Bei, SCG-D Wodehouse, SCG-TV Ceylon Hartal and SCG-TV Apoxpalon disabled and unable to retreat with the bulk of our forces, as well as inflicting severe damage to several other craft. According to initial reports, the strikes on many of the afflicted ships closely resembled scenes from the controversial 'Aetothean shock attacks' on the SCG-TV Mariner's Cage this June, which saw the ruthless deployment of gene-altered Promethean 'super-soldiers' by the Almach Association.\ +

    \ + Fleet Admiral Ripon Latt, commanding officer of the assailed fleet, has confirmed that reinforcements are underway and the retreat 'shall not be a significant setback in the war effort', especially assuring citizens of the embattled Saint Columbia system and its neighbours that there is no cause for alarm and civilians have yet to be targeted.\ +

    \ + The fates of the four missing ships have not been confirmed, and though the Fleet has not yet made an official statement, Sol casualties are cautiously estimated to be in the hundreds." + +/datum/lore/codex/page/article64 + name = "09/23/63 - Fleet Refuses Inquiry Into Relan Losses" + data = "The SCG Fleet has refused to heed widespread calls from critics to launch an investigation into the heavy losses sustained by our forces in a major Almach attack early this month, citing that an investigation at this time would 'undermine the ongoing efforts of our troops in battles to come'.\ +

    \ + The attack, which took place on the 2nd of September and at current count resulted in the loss of a staggering 1281 Sol lives, quickly drew criticism from experts for 'the total unpreparedness' of the fleet despite their public claims that all vessels were 'battle ready and prepared for a coming offensive.'. The specifics of the fleets apparent failings have been the focus of much speculation in the intervening weeks, with the blame placed on everything from a critically inexperienced officer core, to ongoing redeployments to and from the recently expanded Hegemony border.\ +

    \ + Admiral Latt has condemned critics, stating that 'the last thing our brave troops need right now is murmuring from people who don't know the first thing what they're talking about. Their actions in following orders to fall back to the border have been nothing but commendable, and all effort was made to minimise loss of life. The fleet is undergoing reorganization at this time, and is in a better position than ever.'" + +/datum/lore/codex/page/article65 + name = "09/27/63 - Almach Bypass Saint Columbia In Brazen Gavel Attack!" + data = "Almach Association fleet forces entered the Gavel system this afternoon, reportedly having evaded interdicting Sol forces from Saint Columbia in an apparent effort to skirt the range of the MJOLNIR weapon system in Saint Columbia and cut off that system from major shipping routes. Current reports from the system capital in New Xanadu are that the majority of outlying civilian stations have surrendered to invading forces with only minor incident, but that skirmishes with local defence forces - including Sol Fleet detachments - are ongoing, and it is too early to remark on the outcome of the battle. Official military reports are scarce at this time, but the Fleet in Saint Columbia is 'on the move and ready to repel the invaders'.\ +

    \ + Accounts from the system's edge describe Almach forces 'firing indiscriminately' on anti-piracy emplacements including those mounted to the ILS Thurston, a Greyson Manufactories collection station with eight crew, killing all hands.\ +

    \ + Open fighting in the Gavel system marks the furthest Almach encroachment on Sol territory to date. The system, which is a stone's throw from the Oasis and Vir systems is best known for the destruction of the moonlet 'Requiem' by a rogue nanoswarm in 2289, which was successfully neutralized by government forces, and boasts only a small population relative to its neighbors." + +/datum/lore/codex/page/article66 + name = "10/01/63 - 'Judgement Day' As Gavel Falls!" + data = "The government of New Xanadu has surrendered to Association invaders following a disastrous relief effort by the Solar Fleet, whose interdiction vessels are believed to have been captured by the invading force. The manoeuvre leaves the bulk of the Sol fleet isolated in the Saint Columbia system - though a breakout is expected - and has led to widespread outrage in the Colonial Assembly. Critics of the war have damned the Fleet for their 'inability to fight a civilian rabble, gene-modded or otherwise' and renewed calls for a peaceful arrangement between the Solar Confederate Government and Association.\ +

    \ + ISA-5, current spokesperson for the Shadow Coalition has forwarded a motion today to resume discussions with Almachi heads of state, just hours after news of Gavel's surrender broke. The proposal which has yet to gain widespread traction, would call for a new ceasefire, and ISA-5 has stated they 'hope that a new agreement can be made to end the senseless loss of life over the particulars of a foreign government's right to autonomy.'.\ +

    \ + Executive Sifat Unar of the Emergent Intelligence Oversight has voiced immediate concern over the motion, criticising the use of 'foreign government' in reference to Almach; 'Our Fleet has suffered a few defeats, but this conflict goes deeper than mere lasers and shells and to surrender to torturers, mind-hackers, and Machiavellian machines at this stage would be insanity. To allow a seccessionist state, particularly one so unabashedly guilty of crimes against humanity that go far beyond even our modern definitions of 'Human Sanctity', to exist unquestioned a stone's throw from some of our most precious member states, would be a failing not only of this government, but of humanity that would echo through history like a great shameful dirge for all to hear.'\ +

    \ + A communications blackout has been instated on the Gavel system by the Almach Militia, though earlier reports indicate continued strikes on numerous civilian colonies who were unwilling, or unable to deactivate their automated defence systems prior to the invaders arrival." \ No newline at end of file diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 687e5df27e2..d141f1c7af8 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -7,28 +7,27 @@ recipes = list() // If is_brittle() returns true, these are only good for a single strike. - recipes += new/datum/stack_recipe("[display_name] baseball bat", /obj/item/weapon/material/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] deskbell", /obj/item/weapon/deskbell, 1, on_floor = 1, supplied_material = "[name]") + recipes += new/datum/stack_recipe("[display_name] baseball bat", /obj/item/weapon/material/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) if(integrity>=50) - recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") + recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) if(hardness>50) - recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/knife/plastic, 1, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]") + recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/knife/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) /material/steel/generate_recipes() ..() @@ -101,6 +100,7 @@ new/datum/stack_recipe("tall filing cabinet", /obj/structure/filingcabinet/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("chest drawer", /obj/structure/filingcabinet/chestdrawer, 4, time = 20, one_per_turf = 1, on_floor = 1), \ )) + recipes += new/datum/stack_recipe("desk bell", /obj/item/weapon/deskbell, 1, on_floor = 1, supplied_material = "[name]") /material/plasteel/generate_recipes() ..() @@ -111,62 +111,61 @@ recipes += new/datum/stack_recipe("roller bed", /obj/item/roller, 5, time = 30, on_floor = 1) recipes += new/datum/stack_recipe("whetstone", /obj/item/weapon/whetstone, 2, time = 10) -/material/sandstone/generate_recipes() +/material/stone/generate_recipes() ..() recipes += new/datum/stack_recipe("planting bed", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1) /material/plastic/generate_recipes() ..() - recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1) - recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0) - recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0) // 500u - recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0) // 250u - recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0) // 100u - recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20) - recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20) - recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("airtight plastic flaps", /obj/structure/plasticflaps/mining, 5, time = 25, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1) - recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE) + recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0, pass_stack_color = TRUE) // 500u + recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0, pass_stack_color = TRUE) // 250u + recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE) // 100u + recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE, pass_stack_color = TRUE) /material/wood/generate_recipes() ..() - recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]") - recipes += new/datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]") - recipes += new/datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]") - recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1) - recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1) - recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1) - recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20) - recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0) - recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4) - recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1) - recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1) - recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0) - recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5) - recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS) + recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE) /material/wood/log/generate_recipes() recipes = list() - recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]") + recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE) /material/cardboard/generate_recipes() ..() - recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box) - recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty) - recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box) - recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes) - recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs) - recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps) - recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3) - recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg) - recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox) + recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox, pass_stack_color = TRUE) recipes += new/datum/stack_recipe_list("folders",list( \ new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue), \ new/datum/stack_recipe("grey folder", /obj/item/weapon/folder), \ @@ -196,7 +195,7 @@ /material/wood/sif/generate_recipes() ..() - recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20) + recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20, pass_stack_color = TRUE) for(var/datum/stack_recipe/r_recipe in recipes) if(r_recipe.title == "wood floor tile") recipes -= r_recipe @@ -211,17 +210,29 @@ /material/cloth/generate_recipes() recipes = list() - recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS) - recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS) - recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS) - recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS) - recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS) - recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS) - recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES) - recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS) - recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS) - recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS) - recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS) - recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS) - recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS) - recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE) + recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE) + +/material/resin/generate_recipes() + recipes = list() + recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door/resin, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] barricade", /obj/effect/alien/resin/wall, 5, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] nest", /obj/structure/bed/nest, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder/resin, 2, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] membrane", /obj/effect/alien/resin/membrane, 1, time = 2 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] node", /obj/effect/alien/weeds/node, 1, time = 4 SECONDS) diff --git a/code/modules/materials/material_recipes_vr.dm b/code/modules/materials/material_recipes_vr.dm index 3278ca17d3a..918dff0db1b 100644 --- a/code/modules/materials/material_recipes_vr.dm +++ b/code/modules/materials/material_recipes_vr.dm @@ -2,7 +2,13 @@ /material/steel/generate_recipes() . = ..() recipes += new/datum/stack_recipe("light switch frame", /obj/item/frame/lightswitch, 2) + recipes += new/datum/stack_recipe_list("sofas", list( \ + new/datum/stack_recipe("sofa middle", /obj/structure/bed/chair/sofa, 1, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("sofa left", /obj/structure/bed/chair/sofa/left, 1, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("sofa right", /obj/structure/bed/chair/sofa/right, 1, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("sofa corner", /obj/structure/bed/chair/sofa/corner, 1, one_per_turf = 1, on_floor = 1), \ + )) /material/durasteel/generate_recipes() . = ..() - recipes += new/datum/stack_recipe("durasteel fishing rod", /obj/item/weapon/material/fishing_rod/modern/strong, 2) \ No newline at end of file + recipes += new/datum/stack_recipe("durasteel fishing rod", /obj/item/weapon/material/fishing_rod/modern/strong, 2) diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 4ca50889ead..f6708481b5a 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -278,7 +278,7 @@ . = ..() update_mass() - radiation_repository.radiate(src, 5 + amount) + SSradiation.radiate(src, 5 + amount) var/mob/living/M = user if(!istype(M)) return @@ -305,17 +305,18 @@ /obj/item/stack/material/supermatter/ex_act(severity) // An incredibly hard to manufacture material, SM chunks are unstable by their 'stabilized' nature. if(prob((4 / severity) * 20)) - radiation_repository.radiate(get_turf(src), amount * 4) + SSradiation.radiate(get_turf(src), amount * 4) explosion(get_turf(src),round(amount / 12) , round(amount / 6), round(amount / 3), round(amount / 25)) qdel(src) return - radiation_repository.radiate(get_turf(src), amount * 2) + SSradiation.radiate(get_turf(src), amount * 2) ..() /obj/item/stack/material/wood name = "wooden plank" icon_state = "sheet-wood" default_type = MAT_WOOD + strict_color_stacking = TRUE /obj/item/stack/material/wood/sif name = "alien wooden plank" @@ -367,12 +368,25 @@ icon_state = "sheet-cloth" default_type = "cloth" no_variants = FALSE + pass_color = TRUE + strict_color_stacking = TRUE + +/obj/item/stack/material/resin + name = "resin" + icon_state = "sheet-resin" + default_type = "resin" + no_variants = TRUE + apply_colour = TRUE + pass_color = TRUE + strict_color_stacking = TRUE /obj/item/stack/material/cardboard name = "cardboard" icon_state = "sheet-card" default_type = "cardboard" no_variants = FALSE + pass_color = TRUE + strict_color_stacking = TRUE /obj/item/stack/material/snow name = "snow" @@ -392,6 +406,8 @@ icon_state = "sheet-leather" default_type = "leather" no_variants = FALSE + pass_color = TRUE + strict_color_stacking = TRUE /obj/item/stack/material/glass name = "glass" diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index b616d456b6b..724f4771f6b 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -16,6 +16,7 @@ stone metal solid + resin ONLY WALLS cult hull @@ -94,6 +95,7 @@ var/list/name_to_material var/door_icon_base = "metal" // Door base icon tag. See header. var/icon_reinf = "reinf_metal" // Overlay used var/list/stack_origin_tech = list(TECH_MATERIAL = 1) // Research level for stacks. + var/pass_stack_colors = FALSE // Will stacks made from this material pass their colors onto objects? // Attributes var/cut_delay = 0 // Delay in ticks when cutting through this wall. @@ -239,6 +241,10 @@ var/list/name_to_material /material/proc/combustion_effect(var/turf/T, var/temperature) return +// Used by walls to do on-touch things, after checking for crumbling and open-ability. +/material/proc/wall_touch_special(var/turf/simulated/wall/W, var/mob/living/L) + return + // Datum definitions follow. /material/uranium name = "uranium" @@ -438,7 +444,7 @@ var/list/name_to_material // Very rare alloy that is reflective, should be used sparingly. /material/durasteel name = "durasteel" - stack_type = /obj/item/stack/material/durasteel + stack_type = /obj/item/stack/material/durasteel/hull integrity = 600 melting_point = 7000 icon_base = "metal" @@ -460,6 +466,9 @@ var/list/name_to_material explosion_resistance = 90 reflectivity = 0.9 +/material/durasteel/hull/place_sheet(var/turf/target) //Deconstructed into normal durasteel sheets. + new /obj/item/stack/material/durasteel(target) + /material/plasteel/titanium name = MAT_TITANIUM stack_type = /obj/item/stack/material/titanium @@ -475,6 +484,9 @@ var/list/name_to_material icon_base = "hull" icon_reinf = "reinf_mesh" +/material/plasteel/titanium/hull/place_sheet(var/turf/target) //Deconstructed into normal titanium sheets. + new /obj/item/stack/material/titanium(target) + /material/glass name = "glass" stack_type = /obj/item/stack/material/glass @@ -817,12 +829,18 @@ var/list/name_to_material /material/resin name = "resin" icon_colour = "#35343a" + icon_base = "resin" dooropen_noise = 'sound/effects/attackblob.ogg' door_icon_base = "resin" + icon_reinf = "reinf_mesh" melting_point = T0C+300 sheet_singular_name = "blob" sheet_plural_name = "blobs" conductive = 0 + explosion_resistance = 60 + radiation_resistance = 10 + stack_origin_tech = list(TECH_MATERIAL = 8, TECH_PHORON = 4, TECH_BLUESPACE = 4, TECH_BIO = 7) + stack_type = /obj/item/stack/material/resin /material/resin/can_open_material_door(var/mob/living/user) var/mob/living/carbon/M = user @@ -830,6 +848,17 @@ var/list/name_to_material return 1 return 0 +/material/resin/wall_touch_special(var/turf/simulated/wall/W, var/mob/living/L) + var/mob/living/carbon/M = L + if(istype(M) && locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs) + to_chat(M, "\The [W] shudders under your touch, starting to become porous.") + playsound(W, 'sound/effects/attackblob.ogg', 50, 1) + if(do_after(L, 5 SECONDS)) + spawn(2) + playsound(W, 'sound/effects/attackblob.ogg', 100, 1) + W.dismantle_wall() + return 1 + return 0 /material/wood name = MAT_WOOD @@ -860,6 +889,7 @@ var/list/name_to_material stack_type = /obj/item/stack/material/log sheet_singular_name = null sheet_plural_name = "pile" + pass_stack_colors = TRUE /material/wood/log/sif name = MAT_SIFLOG @@ -897,6 +927,7 @@ var/list/name_to_material door_icon_base = "wood" destruction_desc = "crumples" radiation_resistance = 1 + pass_stack_colors = TRUE /material/snow name = MAT_SNOW @@ -943,6 +974,7 @@ var/list/name_to_material protectiveness = 1 // 4% flags = MATERIAL_PADDING conductive = 0 + pass_stack_colors = TRUE /material/cult name = "cult" diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index d07a52a2f22..fa5fcc7397d 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -9,7 +9,7 @@ var/global/list/total_extraction_beacons = list() var/obj/structure/extraction_point/beacon var/list/beacon_networks = list("station") var/uses_left = 3 - var/can_use_indoors + var/can_use_indoors = FALSE var/safe_for_living_creatures = 1 /obj/item/extraction_pack/examine() @@ -145,7 +145,9 @@ var/global/list/total_extraction_beacons = list() icon_state = "subspace_amplifier" /obj/item/fulton_core/attack_self(mob/user) - if(do_after(user,15,target = user) && !QDELETED(src)) + var/turf/T = get_turf(user) + var/outdoors = T.outdoors + if(do_after(user,15,target = user) && !QDELETED(src) && outdoors) new /obj/structure/extraction_point(get_turf(user)) qdel(src) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 982ad0d8ad1..b006808a1eb 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -574,7 +574,7 @@ turf/simulated/mineral/floor/light_corner M.flash_eyes() if(prob(50)) M.Stun(5) - radiation_repository.flat_radiate(src, 25, 100) + SSradiation.flat_radiate(src, 25, 100) if(prob(25)) excavate_find(prob(5), finds[1]) else if(rand(1,500) == 1) @@ -591,9 +591,9 @@ turf/simulated/mineral/floor/light_corner if(is_clean) X = new /obj/item/weapon/archaeological_find(src, new_item_type = F.find_type) else - X = new /obj/item/weapon/ore/strangerock(src, inside_item_type = F.find_type) + X = new /obj/item/weapon/strangerock(src, inside_item_type = F.find_type) geologic_data.UpdateNearbyArtifactInfo(src) - var/obj/item/weapon/ore/strangerock/SR = X + var/obj/item/weapon/strangerock/SR = X SR.geologic_data = geologic_data //some find types delete the /obj/item/weapon/archaeological_find and replace it with something else, this handles when that happens diff --git a/code/modules/mining/ore_redemption_machine/construction.dm b/code/modules/mining/ore_redemption_machine/construction.dm index dbf8a96ffb7..3880ef5cb8a 100644 --- a/code/modules/mining/ore_redemption_machine/construction.dm +++ b/code/modules/mining/ore_redemption_machine/construction.dm @@ -10,3 +10,12 @@ req_components = list( /obj/item/weapon/stock_parts/console_screen = 1, /obj/item/weapon/stock_parts/matter_bin = 3) + +/obj/item/weapon/circuitboard/exploration_equipment_vendor + name = T_BOARD("Exploration Equipment Vendor") + board_type = new /datum/frame/frame_types/machine + build_path = /obj/machinery/mineral/equipment_vendor/survey + origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 2) + req_components = list( + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/weapon/stock_parts/matter_bin = 3) diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index bf4ef877381..849550bf6be 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -10,7 +10,7 @@ circuit = /obj/item/weapon/circuitboard/mining_equipment_vendor var/icon_deny = "mining-deny" var/obj/item/weapon/card/id/inserted_id - //VOREStation Edit - Heavily modified list + //VOREStation Edit Start - Heavily modified list var/list/prize_list = list( new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10), new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100), @@ -36,11 +36,11 @@ new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 900), new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1200), new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1200), - //new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1000), + // new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1000), new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c100, 1000), - new /datum/data/mining_equipment("Hardsuit - Control Module", /obj/item/weapon/rig/industrial, 2000), + new /datum/data/mining_equipment("Hardsuit - Control Module", /obj/item/weapon/rig/industrial/vendor, 2000), new /datum/data/mining_equipment("Hardsuit - Plasma Cutter", /obj/item/rig_module/device/plasmacutter, 800), - new /datum/data/mining_equipment("Hardsuit - Drill", /obj/item/rig_module/device/drill, 2000), + new /datum/data/mining_equipment("Hardsuit - Drill", /obj/item/rig_module/device/drill, 5000), new /datum/data/mining_equipment("Hardsuit - Ore Scanner", /obj/item/rig_module/device/orescanner, 1000), new /datum/data/mining_equipment("Hardsuit - Material Scanner", /obj/item/rig_module/vision/material, 500), new /datum/data/mining_equipment("Hardsuit - Maneuvering Jets", /obj/item/rig_module/maneuvering_jets, 1250), @@ -50,7 +50,7 @@ new /datum/data/mining_equipment("Industrial Equipment - Sheet-Snatcher",/obj/item/weapon/storage/bag/sheetsnatcher, 500), new /datum/data/mining_equipment("Digital Tablet - Standard", /obj/item/modular_computer/tablet/preset/custom_loadout/standard, 500), new /datum/data/mining_equipment("Digital Tablet - Advanced", /obj/item/modular_computer/tablet/preset/custom_loadout/advanced, 1000), - new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000), + // new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000), new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/device/survivalcapsule/luxury, 3100), @@ -66,19 +66,19 @@ new /datum/data/mining_equipment("Fine Excavation Kit - Chisels",/obj/item/weapon/storage/excavation, 500), new /datum/data/mining_equipment("Fine Excavation Kit - Measuring Tape",/obj/item/device/measuring_tape, 125), new /datum/data/mining_equipment("Fine Excavation Kit - Hand Pick",/obj/item/weapon/pickaxe/hand, 375), - new /datum/data/mining_equipment("Explosive Excavation Kit - Plastic Charge",/obj/item/weapon/plastique/seismic, 750), + new /datum/data/mining_equipment("Explosive Excavation Kit - Plastic Charge",/obj/item/weapon/plastique/seismic/locked, 1500), new /datum/data/mining_equipment("Injector (L) - Glucose",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose, 500), new /datum/data/mining_equipment("Injector (L) - Panacea",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity, 500), new /datum/data/mining_equipment("Injector (L) - Trauma",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute, 500), new /datum/data/mining_equipment("Nanopaste Tube", /obj/item/stack/nanopaste, 1000), - new /datum/data/mining_equipment("Misc: Graviton Visor", /obj/item/clothing/glasses/graviton, 1500), new /datum/data/mining_equipment("Defense Equipment - Smoke Bomb",/obj/item/weapon/grenade/smokebomb, 100), - new /datum/data/mining_equipment("Defense Equipment - Razor Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/manhacks/station, 1000), + new /datum/data/mining_equipment("Defense Equipment - Razor Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked, 1000), new /datum/data/mining_equipment("Defense Equipment - Sentry Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/ward, 1500), new /datum/data/mining_equipment("Defense Equipment - Plasteel Machete", /obj/item/weapon/material/knife/machete, 500), new /datum/data/mining_equipment("Fishing Net", /obj/item/weapon/material/fishing_net, 500), new /datum/data/mining_equipment("Titanium Fishing Rod", /obj/item/weapon/material/fishing_rod/modern, 1000), - new /datum/data/mining_equipment("Durasteel Fishing Rod", /obj/item/weapon/material/fishing_rod/modern/strong, 7500) + new /datum/data/mining_equipment("Durasteel Fishing Rod", /obj/item/weapon/material/fishing_rod/modern/strong, 7500), + new /datum/data/mining_equipment("Bar Shelter Capsule", /obj/item/device/survivalcapsule/luxurybar, 10000) ) //VOREStation Edit End diff --git a/code/modules/mining/ore_redemption_machine/mine_point_items.dm b/code/modules/mining/ore_redemption_machine/mine_point_items.dm index da4463842a5..a6a90a3bd6f 100644 --- a/code/modules/mining/ore_redemption_machine/mine_point_items.dm +++ b/code/modules/mining/ore_redemption_machine/mine_point_items.dm @@ -15,19 +15,33 @@ name = "mining point card" desc = "A small card preloaded with mining points. Swipe your ID card over it to transfer the points, then discard." icon_state = "data" - var/points = 500 + var/mine_points = 500 + var/survey_points = 0 /obj/item/weapon/card/mining_point_card/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/card/id)) - if(points) - var/obj/item/weapon/card/id/C = I - C.mining_points += points - to_chat(user, "You transfer [points] points to [C].") - points = 0 + var/obj/item/weapon/card/id/C = I + if(mine_points) + C.mining_points += mine_points + to_chat(user, "You transfer [mine_points] excavation points to [C].") + mine_points = 0 else - to_chat(user, "There's no points left on [src].") + to_chat(user, "There's no excavation points left on [src].") + + if(survey_points) + C.survey_points += survey_points + to_chat(user, "You transfer [survey_points] survey points to [C].") + survey_points = 0 + else + to_chat(user, "There's no survey points left on [src].") + ..() /obj/item/weapon/card/mining_point_card/examine(mob/user) ..(user) - to_chat(user, "There's [points] points on the card.") + to_chat(user, "There's [mine_points] excavation points on the card.") + to_chat(user, "There's [survey_points] survey points on the card.") + +/obj/item/weapon/card/mining_point_card/survey + mine_points = 0 + survey_points = 50 diff --git a/code/modules/mining/ore_redemption_machine/survey_vendor.dm b/code/modules/mining/ore_redemption_machine/survey_vendor.dm new file mode 100644 index 00000000000..b58b343b040 --- /dev/null +++ b/code/modules/mining/ore_redemption_machine/survey_vendor.dm @@ -0,0 +1,111 @@ +/obj/machinery/mineral/equipment_vendor/survey + name = "exploration equipment vendor" + desc = "An equipment vendor for explorers, points collected with a survey scanner can be spent here." + icon = 'icons/obj/machines/mining_machines_vr.dmi' //VOREStation Edit + icon_state = "exploration" //VOREStation Edit + density = TRUE + anchored = TRUE + circuit = /obj/item/weapon/circuitboard/exploration_equipment_vendor + icon_deny = "exploration-deny" //VOREStation Edit + var/icon_vend = "exploration-vend" //VOREStation Add + //VOREStation Edit Start - Heavily modified list + prize_list = list( + new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 1), + new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 10), + new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 30), + new /datum/data/mining_equipment("GPS Device", /obj/item/device/gps/explorer, 10), + new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 10), + new /datum/data/mining_equipment("Absinthe", /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe, 10), + new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/smokable/cigarette/cigar/havana, 15), + new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 20), + new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 90), + new /datum/data/mining_equipment("Geiger Counter", /obj/item/device/geiger, 75), + new /datum/data/mining_equipment("Plush Toy", /obj/random/plushie, 30), + new /datum/data/mining_equipment("Extraction Equipment - Fulton Beacon", /obj/item/fulton_core, 300), + new /datum/data/mining_equipment("Extraction Equipment - Fulton Pack", /obj/item/extraction_pack, 125), + new /datum/data/mining_equipment("Umbrella", /obj/item/weapon/melee/umbrella/random, 20), + new /datum/data/mining_equipment("Shelter Capsule", /obj/item/device/survivalcapsule, 50), + new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card/survey, 50), + new /datum/data/mining_equipment("Survival Medipen", /obj/item/weapon/reagent_containers/hypospray/autoinjector/miner, 50), + new /datum/data/mining_equipment("Injector (L) - Glucose",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose, 50), + new /datum/data/mining_equipment("Injector (L) - Panacea",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity, 50), + new /datum/data/mining_equipment("Injector (L) - Trauma",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute, 50), + new /datum/data/mining_equipment("Digital Tablet - Standard", /obj/item/modular_computer/tablet/preset/custom_loadout/standard, 50), + new /datum/data/mining_equipment("Digital Tablet - Advanced", /obj/item/modular_computer/tablet/preset/custom_loadout/advanced, 100), + new /datum/data/mining_equipment("Nanopaste Tube", /obj/item/stack/nanopaste, 100), + new /datum/data/mining_equipment("Mini-Translocator", /obj/item/device/perfect_tele/one_beacon, 120), + new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c100, 100), + new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 250), + new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/device/survivalcapsule/luxury, 310), + new /datum/data/mining_equipment("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed, 300), + new /datum/data/mining_equipment("Survey Tools - Shovel", /obj/item/weapon/shovel, 40), + new /datum/data/mining_equipment("Survey Tools - Mechanical Trap", /obj/item/weapon/beartrap, 50), + new /datum/data/mining_equipment("Defense Equipment - Smoke Bomb",/obj/item/weapon/grenade/smokebomb, 10), + new /datum/data/mining_equipment("Defense Equipment - Razor Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked, 100), + new /datum/data/mining_equipment("Defense Equipment - Sentry Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/ward, 150), + new /datum/data/mining_equipment("Defense Equipment - Steel Machete", /obj/item/weapon/material/knife/machete, 75), + new /datum/data/mining_equipment("Fishing Net", /obj/item/weapon/material/fishing_net, 50), + new /datum/data/mining_equipment("Titanium Fishing Rod", /obj/item/weapon/material/fishing_rod/modern, 100), + new /datum/data/mining_equipment("Durasteel Fishing Rod", /obj/item/weapon/material/fishing_rod/modern/strong, 750), + new /datum/data/mining_equipment("Bar Shelter Capsule", /obj/item/device/survivalcapsule/luxurybar, 1000) + ) + //VOREStation Edit End + +/obj/machinery/mineral/equipment_vendor/survey/interact(mob/user) + user.set_machine(src) + + var/dat + dat +="
    " + if(istype(inserted_id)) + dat += "You have [inserted_id.survey_points] survey points collected. Eject ID.
    " + else + dat += "No ID inserted. Insert ID.
    " + dat += "
    " + dat += "
    Equipment point cost list:
    " + for(var/datum/data/mining_equipment/prize in prize_list) + dat += "" + dat += "
    [prize.equipment_name][prize.cost]Purchase
    " + var/datum/browser/popup = new(user, "miningvendor", "Survey Equipment Vendor", 400, 600) + popup.set_content(dat) + popup.open() + +/obj/machinery/mineral/equipment_vendor/survey/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["choice"]) + if(istype(inserted_id)) + if(href_list["choice"] == "eject") + to_chat(usr, "You eject the ID from [src]'s card slot.") + usr.put_in_hands(inserted_id) + inserted_id = null + else if(href_list["choice"] == "insert") + var/obj/item/weapon/card/id/I = usr.get_active_hand() + if(istype(I) && !inserted_id && usr.unEquip(I)) + I.forceMove(src) + inserted_id = I + interact(usr) + to_chat(usr, "You insert the ID into [src]'s card slot.") + else + to_chat(usr, "No valid ID.") + flick(icon_deny, src) + + if(href_list["purchase"]) + if(istype(inserted_id)) + var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) + if (!prize || !(prize in prize_list)) + to_chat(usr, "Error: Invalid choice!") + flick(icon_deny, src) + return + if(prize.cost > inserted_id.survey_points) + to_chat(usr, "Error: Insufficent points for [prize.equipment_name]!") + flick(icon_deny, src) + else + inserted_id.survey_points -= prize.cost + to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") + flick(icon_vend, src) //VOREStation Add + new prize.equipment_path(drop_location()) + else + to_chat(usr, "Error: Please insert a valid ID!") + flick(icon_deny, src) + updateUsrDialog() diff --git a/code/modules/mining/shelter_atoms.dm b/code/modules/mining/shelter_atoms.dm index ce1ec091890..55734dfb549 100644 --- a/code/modules/mining/shelter_atoms.dm +++ b/code/modules/mining/shelter_atoms.dm @@ -15,14 +15,12 @@ w_class = ITEMSIZE_TINY var/template_id = "shelter_alpha" var/datum/map_template/shelter/template - var/datum/map_template/shelter/template_roof var/used = FALSE /obj/item/device/survivalcapsule/proc/get_template() if(template) return template = SSmapping.shelter_templates[template_id] - template_roof = SSmapping.shelter_templates[template.roof] if(!template) throw EXCEPTION("Shelter template ([template_id]) not found!") qdel(src) @@ -49,8 +47,6 @@ var/turf/deploy_location = get_turf(src) var/status = template.check_deploy(deploy_location) var/turf/above_location = GetAbove(deploy_location) - if(above_location && status == SHELTER_DEPLOY_ALLOWED) - status = template.check_deploy(above_location) switch(status) //Not allowed due to /area technical reasons @@ -77,9 +73,11 @@ playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1) log_and_message_admins("[key_name_admin(usr)] activated a bluespace capsule at [get_area(T)]!") - if(above_location && template_roof) - template_roof.load(above_location, centered = TRUE) + if(above_location) + template.add_roof(above_location) + template.annihilate_plants(deploy_location) template.load(deploy_location, centered = TRUE) + template.update_lighting(deploy_location) qdel(src) /obj/item/device/survivalcapsule/luxury @@ -87,10 +85,21 @@ desc = "An exorbitantly expensive luxury suite programmed into construction nanomachines. There's a license for use printed on the bottom." template_id = "shelter_beta" +/obj/item/device/survivalcapsule/luxurybar + name = "luxury surfluid bar capsule" + desc = "A luxury bar in a capsule. Bartender required and not included. There's a license for use printed on the bottom." + template_id = "shelter_gamma" + +/obj/item/device/survivalcapsule/military + name = "military surfluid shelter capsule" + desc = "A prefabricated firebase in a capsule. Contains basic weapons, building materials, and combat suits. There's a license for use printed on the bottom." + template_id = "shelter_delta" + +//Custom Shelter Capsules /obj/item/device/survivalcapsule/tabiranth name = "silver-trimmed surfluid shelter capsule" desc = "An exorbitantly expensive luxury suite programmed into construction nanomachines. This one is a particularly rare and expensive model. There's a license for use printed on the bottom." - template_id = "shelter_gamma" + template_id = "shelter_phi" //Pod objects //Walls @@ -98,6 +107,9 @@ name = "survival shelter" stripe_color = "#efbc3b" +/turf/simulated/shuttle/wall/voidcraft/survival/hard_corner + hard_corner = 1 + //Doors /obj/machinery/door/airlock/voidcraft/survival_pod name = "survival airlock" diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm index b68606f914b..e7f45e3bf6f 100644 --- a/code/modules/mining/shelters.dm +++ b/code/modules/mining/shelters.dm @@ -2,15 +2,12 @@ var/shelter_id var/description var/blacklisted_turfs - var/whitelisted_turfs var/banned_areas var/banned_objects - var/roof /datum/map_template/shelter/New() . = ..() - blacklisted_turfs = typecacheof(/turf/unsimulated) - whitelisted_turfs = list() + blacklisted_turfs = typecacheof(list(/turf/unsimulated, /turf/simulated/floor/tiled)) banned_areas = typecacheof(/area/shuttle) banned_objects = list() @@ -22,8 +19,7 @@ return SHELTER_DEPLOY_BAD_AREA var/banned = is_type_in_typecache(T, blacklisted_turfs) - var/permitted = is_type_in_typecache(T, whitelisted_turfs) - if(banned && !permitted) + if(banned || T.density) return SHELTER_DEPLOY_BAD_TURFS for(var/obj/O in T) @@ -31,6 +27,26 @@ return SHELTER_DEPLOY_ANCHORED_OBJECTS return SHELTER_DEPLOY_ALLOWED +/datum/map_template/shelter/proc/add_roof(turf/deploy_location) + var/affected = get_affected_turfs(deploy_location, centered=TRUE) + for(var/turf/T in affected) + if(isopenspace(T)) + T.ChangeTurf(/turf/simulated/shuttle/floor/voidcraft) + +/datum/map_template/shelter/proc/annihilate_plants(turf/deploy_location) + var/deleted_atoms = 0 + var/affected = get_affected_turfs(deploy_location, centered=TRUE) + for(var/turf/T in affected) + for(var/obj/structure/flora/AM in T) + ++deleted_atoms + qdel(AM) + admin_notice("Annihilated [deleted_atoms] plants.", R_DEBUG) + +/datum/map_template/shelter/proc/update_lighting(turf/deploy_location) + var/affected = get_affected_turfs(deploy_location, centered=TRUE) + for(var/turf/T in affected) + T.lighting_build_overlay() + /datum/map_template/shelter/alpha name = "Shelter Alpha" shelter_id = "shelter_alpha" @@ -39,16 +55,6 @@ sleeping area! Order now, and we'll throw in a TINY FAN, \ absolutely free!" mappath = "maps/submaps/shelters/shelter_1.dmm" - roof = "roof_alpha" - -/datum/map_template/shelter/alpha_roof - shelter_id = "roof_alpha" - mappath = "maps/submaps/shelters/shelter_1_roof.dmm" - -/datum/map_template/shelter/alpha/New() - . = ..() - whitelisted_turfs = typecacheof(/turf/simulated/mineral) - banned_objects = list() /datum/map_template/shelter/beta name = "Shelter Beta" @@ -59,29 +65,33 @@ and a deluxe companion to keep you from getting lonely during \ an ash storm." mappath = "maps/submaps/shelters/shelter_2.dmm" - roof = "roof_beta" - -/datum/map_template/shelter/beta_roof - shelter_id = "roof_beta" - mappath = "maps/submaps/shelters/shelter_2_roof.dmm" - -/datum/map_template/shelter/beta/New() - . = ..() - whitelisted_turfs = typecacheof(/turf/simulated/mineral) - banned_objects = list() /datum/map_template/shelter/gamma name = "Shelter Gamma" shelter_id = "shelter_gamma" + description = "A luxury elite bar which holds an entire bar \ + along with two vending machines, tables, and a restroom that \ + also has a sink. This isn't a survival capsule and so you can \ + expect that this won't save you if you're bleeding out to \ + death." + mappath = "maps/submaps/shelters/shelter_3.dmm" + +/datum/map_template/shelter/delta + name = "Shelter Delta" + shelter_id = "shelter_delta" + description = "A small firebase that contains equipment and supplies \ + for roughly a squad of military troops. Large quantities of \ + supplies allow it to hold out for an extended period of time\ + and a built in medical facility allows field treatment to be \ + possible." + mappath = "maps/submaps/shelters/shelter_4.dmm" + +/datum/map_template/shelter/phi + name = "Shelter Phi" + shelter_id = "shelter_phi" description = "An heavily modified variant of the luxury shelter, \ this particular model has extra food, drinks, and other supplies. \ Originally designed for use by colonists on worlds with little to \ to no contact, the expense of these shelters have prevented them \ from seeing common use." - mappath = "maps/submaps/shelters/shelter_3.dmm" - roof = "roof_beta" - -/datum/map_template/shelter/gamma/New() - . = ..() - whitelisted_turfs = typecacheof(/turf/simulated/mineral) - banned_objects = list() + mappath = "maps/submaps/shelters/shelter_a.dmm" diff --git a/code/modules/mob/_modifiers/medical.dm b/code/modules/mob/_modifiers/medical.dm new file mode 100644 index 00000000000..7e150ceb935 --- /dev/null +++ b/code/modules/mob/_modifiers/medical.dm @@ -0,0 +1,52 @@ + +/* + * Modifiers applied by Medical sources. + */ + +/datum/modifier/bloodpump + name = "external blood pumping" + desc = "Your blood flows thanks to the wonderful power of science." + + on_created_text = "You feel alive." + on_expired_text = "You feel.. less alive." + stacks = MODIFIER_STACK_EXTEND + + pulse_set_level = PULSE_NORM + +/datum/modifier/bloodpump/check_if_valid() + ..() + if(holder.stat == DEAD) + src.expire() + +/datum/modifier/bloodpump_corpse + name = "forced blood pumping" + desc = "Your blood flows thanks to the wonderful power of science." + + on_created_text = "You feel alive." + on_expired_text = "You feel.. less alive." + stacks = MODIFIER_STACK_EXTEND + + pulse_set_level = PULSE_SLOW + +/datum/modifier/bloodpump/corpse/check_if_valid() + ..() + if(holder.stat != DEAD) + src.expire() + +/* + * Modifiers caused by chemicals or organs specifically. + */ + +/datum/modifier/cryogelled + name = "cryogelled" + desc = "Your body begins to freeze." + mob_overlay_state = "chilled" + + on_created_text = "You feel like you're going to freeze! It's hard to move." + on_expired_text = "You feel somewhat warmer and more mobile now." + stacks = MODIFIER_STACK_ALLOWED + + slowdown = 0.1 + evasion = -5 + attack_speed_percent = 1.1 + disable_duration_percent = 1.05 diff --git a/code/modules/mob/_modifiers/modifiers_misc.dm b/code/modules/mob/_modifiers/modifiers_misc.dm index e81cf0aaa86..af6eaa952e7 100644 --- a/code/modules/mob/_modifiers/modifiers_misc.dm +++ b/code/modules/mob/_modifiers/modifiers_misc.dm @@ -43,7 +43,7 @@ the artifact triggers the rage. /datum/modifier/berserk name = "berserk" desc = "You are filled with an overwhelming rage." - client_color = "#FF0000" // Make everything red! + client_color = "#FF5555" // Make everything red! mob_overlay_state = "berserk" on_created_text = "You feel an intense and overwhelming rage overtake you as you go berserk!" @@ -182,6 +182,31 @@ the artifact triggers the rage. accuracy_dispersion = 3 // Ditto. evasion = -45 // Too angry to dodge. +// Speedy, but not hasted. +/datum/modifier/sprinting + name = "sprinting" + desc = "You are filled with energy!" + + on_created_text = "You feel a surge of energy!" + on_expired_text = "The energy high dies out." + stacks = MODIFIER_STACK_EXTEND + + slowdown = -1 + disable_duration_percent = 0.8 + +// Speedy, but not berserked. +/datum/modifier/melee_surge + name = "melee surge" + desc = "You are filled with energy!" + + on_created_text = "You feel a surge of energy!" + on_expired_text = "The energy high dies out." + stacks = MODIFIER_STACK_ALLOWED + + attack_speed_percent = 0.8 + outgoing_melee_damage_percent = 1.1 + disable_duration_percent = 0.8 + // Non-cult version of deep wounds. // Surprisingly, more dangerous. /datum/modifier/grievous_wounds @@ -201,7 +226,6 @@ the artifact triggers the rage. - // Ignition, but confined to the modifier system. // This makes it more predictable and thus, easier to balance. /datum/modifier/fire @@ -293,4 +317,29 @@ the artifact triggers the rage. on_expired_text = "You feel.. different." stacks = MODIFIER_STACK_EXTEND - pulse_set_level = PULSE_NORM \ No newline at end of file + pulse_set_level = PULSE_NORM + +/datum/modifier/slow_pulse + name = "slow pulse" + desc = "Your blood flows slower." + + on_created_text = "You feel sluggish." + on_expired_text = "You feel energized." + stacks = MODIFIER_STACK_EXTEND + + bleeding_rate_percent = 0.8 + + pulse_modifier = -1 + +// Temperature Normalizer. +/datum/modifier/homeothermic + name = "temperature resistance" + desc = "Your body normalizes to room temperature." + + on_created_text = "You feel comfortable." + on_expired_text = "You feel.. still probably comfortable." + stacks = MODIFIER_STACK_EXTEND + +/datum/modifier/homeothermic/tick() + ..() + holder.bodytemperature = round((holder.bodytemperature + T20C) / 2) diff --git a/code/modules/mob/_modifiers/traits.dm b/code/modules/mob/_modifiers/traits.dm index 200f8eabfbc..b15ece941e3 100644 --- a/code/modules/mob/_modifiers/traits.dm +++ b/code/modules/mob/_modifiers/traits.dm @@ -60,33 +60,67 @@ metabolism_percent = 0.5 incoming_healing_percent = 0.6 -/datum/modifier/trait/larger - name = "Larger" - desc = "Your body is larger than average." +/datum/modifier/trait/taller + name = "Taller" + desc = "Your body is taller than average." + icon_scale_x_percent = 1 + icon_scale_y_percent = 1.09 - icon_scale_x_percent = 1.1 - icon_scale_y_percent = 1.1 - -/datum/modifier/trait/large - name = "Large" - desc = "Your body is a bit larger than average." - - icon_scale_x_percent = 1.05 +/datum/modifier/trait/tall + name = "Tall" + desc = "Your body is a bit taller than average." + icon_scale_x_percent = 1 icon_scale_y_percent = 1.05 -/datum/modifier/trait/small - name = "Small" - desc = "Your body is a bit smaller than average." - - icon_scale_x_percent = 0.95 +/datum/modifier/trait/short + name = "Short" + desc = "Your body is a bit shorter than average." + icon_scale_x_percent = 1 icon_scale_y_percent = 0.95 -/datum/modifier/trait/smaller - name = "Smaller" - desc = "Your body is smaller than average." - icon_scale_x_percent = 0.9 - icon_scale_y_percent = 0.9 +/datum/modifier/trait/shorter + name = "Shorter" + desc = "You are shorter than average." + icon_scale_x_percent = 1 + icon_scale_y_percent = 0.915 + +/datum/modifier/trait/fat + name = "Overweight" + desc = "You are heavier than average." + + metabolism_percent = 1.2 + icon_scale_x_percent = 1.054 + icon_scale_y_percent = 1 + slowdown = 1.1 + max_health_percent = 1.05 + +/datum/modifier/trait/obese + name = "Obese" + desc = "You are much heavier than average." + metabolism_percent = 1.4 + icon_scale_x_percent = 1.095 + icon_scale_y_percent = 1 + slowdown = 1.2 + max_health_percent = 1.10 + +/datum/modifier/trait/thin + name = "Thin" + desc = "You are skinnier than average." + metabolism_percent = 0.8 + icon_scale_x_percent = 0.945 + icon_scale_y_percent = 1 + max_health_percent = 0.95 + outgoing_melee_damage_percent = 0.95 + +/datum/modifier/trait/thinner + name = "Very Thin" + desc = "You are much skinnier than average." + metabolism_percent = 0.6 + icon_scale_x_percent = 0.905 + icon_scale_y_percent = 1 + max_health_percent = 0.90 + outgoing_melee_damage_percent = 0.9 /datum/modifier/trait/colorblind_protanopia name = "Protanopia" diff --git a/code/modules/mob/_modifiers/unholy.dm b/code/modules/mob/_modifiers/unholy.dm index 0b6f69a21b9..730e57691c2 100644 --- a/code/modules/mob/_modifiers/unholy.dm +++ b/code/modules/mob/_modifiers/unholy.dm @@ -146,3 +146,55 @@ if(prob(10)) to_chat(H, "It feels as though your body is being torn apart!") L.updatehealth() + +/datum/modifier/gluttonyregeneration + name = "gluttonous regeneration" + desc = "You are filled with an overwhelming hunger." + mob_overlay_state = "electricity" + + on_created_text = "You feel an intense and overwhelming hunger overtake you as your body regenerates!" + on_expired_text = "The blaze of hunger inside you has been snuffed." + stacks = MODIFIER_STACK_EXTEND + +/datum/modifier/gluttonyregeneration/can_apply(var/mob/living/L) + if(L.stat == DEAD) + to_chat(L, "You can't be dead to consume.") + return FALSE + + if(!L.is_sentient()) + return FALSE // Drones don't feel anything, not even hunger. + + if(L.has_modifier_of_type(/datum/modifier/berserk_exhaustion)) + to_chat(L, "You recently berserked, so you are too tired to consume.") + return FALSE + + if(!ishuman(L)) // Only humanoids feel hunger. Totally. + return FALSE + + else + var/mob/living/carbon/human/H = L + if(H.species.name == "Diona") + to_chat(L, "You feel strange for a moment, but it passes.") + return FALSE // Happy trees aren't affected by incredible hunger. + + return ..() + +/datum/modifier/gluttonyregeneration/tick() + spawn() + if(ishuman(holder)) + var/mob/living/carbon/human/H = holder + var/starting_nutrition = H.nutrition + H.nutrition = max(0, H.nutrition - 10) + var/healing_amount = starting_nutrition - H.nutrition + if(healing_amount < 0) // If you are eating enough to somehow outpace this, congratulations, you are gluttonous enough to gain a boon. + healing_amount *= -2 + + H.adjustBruteLoss(-healing_amount * 0.25) + + H.adjustFireLoss(-healing_amount * 0.25) + + H.adjustOxyLoss(-healing_amount * 0.25) + + H.adjustToxLoss(-healing_amount * 0.25) + + ..() \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 31cbcc1f44a..ef7086f6e06 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -231,7 +231,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Re-enter Corpse" if(!client) return if(!(mind && mind.current && can_reenter_corpse)) - src << "You have no body." + to_chat(src, "You have no body.") return if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients usr << "Another consciousness is in your body... it is resisting you." @@ -279,10 +279,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set desc = "Toggles AntagHUD allowing you to see who is the antagonist" if(!config.antag_hud_allowed && !client.holder) - src << "Admins have disabled this for this round." + to_chat(src, "Admins have disabled this for this round.") return if(jobban_isbanned(src, "AntagHUD")) - src << "You have been banned from using this feature" + to_chat(src, "You have been banned from using this feature") return if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No") @@ -329,7 +329,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(following && following == target) return following = target - src << "Now following [target]" + to_chat(src, "Now following [target]") if(ismob(target)) forceMove(get_turf(target)) var/mob/M = target @@ -389,13 +389,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) -/mob/observer/dead/verb/jumptomob(target in getmobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak +/mob/observer/dead/verb/jumptomob(input in getmobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak set category = "Ghost" set name = "Jump to Mob" set desc = "Teleport to a mob" set popup_menu = FALSE //VOREStation Edit - Declutter. if(istype(usr, /mob/observer/dead)) //Make sure they're an observer! - + var/target = getmobs()[input] if (!target)//Make sure we actually have a target return else @@ -406,7 +406,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp forceMove(T) following = null else - src << "This mob is not located in the game world." + to_chat(src, "This mob is not located in the game world.") /* /mob/observer/dead/verb/boo() set category = "Ghost" @@ -425,11 +425,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/observer/dead/memory() set hidden = 1 - src << "You are dead! You have no mind to store memory!" + to_chat(src, "You are dead! You have no mind to store memory!") /mob/observer/dead/add_memory() set hidden = 1 - src << "You are dead! You have no mind to store memory!" + to_chat(src, "You are dead! You have no mind to store memory!") /mob/observer/dead/Post_Incorpmove() following = null @@ -449,16 +449,16 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/pressure = environment.return_pressure() var/total_moles = environment.total_moles - src << "Results:" + to_chat(src, "Results:") if(abs(pressure - ONE_ATMOSPHERE) < 10) - src << "Pressure: [round(pressure,0.1)] kPa" + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") else - src << "Pressure: [round(pressure,0.1)] kPa" + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") if(total_moles) for(var/g in environment.gas) - src << "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)" - src << "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)" - src << "Heat Capacity: [round(environment.heat_capacity(),0.1)]" + to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") + to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") + to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") /mob/observer/dead/verb/check_radiation() set name = "Check Radiation" @@ -466,7 +466,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/turf/t = get_turf(src) if(t) - var/rads = radiation_repository.get_rads_at_turf(t) + var/rads = SSradiation.get_rads_at_turf(t) to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") @@ -475,7 +475,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set category = "Ghost" if(config.disable_player_mice) - src << "Spawning as a mouse is currently disabled." + to_chat(src, "Spawning as a mouse is currently disabled.") return if(!MayRespawn(1)) @@ -483,14 +483,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/turf/T = get_turf(src) if(!T || (T.z in using_map.admin_levels)) - src << "You may not spawn as a mouse on this Z-level." + to_chat(src, "You may not spawn as a mouse on this Z-level.") return var/timedifference = world.time - client.time_died_as_mouse if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) var/timedifference_text timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") - src << "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left." + to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") return var/response = alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?","Squeek!","Nope!") @@ -508,7 +508,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp vent_found = pick(found_vents) host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) else - src << "Unable to find any unwelded vents to spawn mice at." + to_chat(src, "Unable to find any unwelded vents to spawn mice at.") if(host) if(config.uneducated_mice) @@ -545,7 +545,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." if(!(config.cult_ghostwriter)) - src << "That verb is not currently permitted." + to_chat(src, "That verb is not currently permitted.") return if (!src.stat) @@ -560,7 +560,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ghosts_can_write = 1 if(!ghosts_can_write && !check_rights(R_ADMIN, 0)) //Let's allow for admins to write in blood for events and the such. - src << "The veil is not thin enough for you to do that." + to_chat(src, "The veil is not thin enough for you to do that.") return var/list/choices = list() @@ -569,7 +569,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp choices += B if(!choices.len) - src << "There is no blood to use nearby." + to_chat(src, "There is no blood to use nearby.") return var/obj/effect/decal/cleanable/blood/choice = input(src,"What blood would you like to use?") in null|choices @@ -580,7 +580,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp T = get_step(T,text2dir(direction)) if (!istype(T)) - src << "You cannot doodle there." + to_chat(src, "You cannot doodle there.") return if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) @@ -592,7 +592,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp for (var/obj/effect/decal/cleanable/blood/writing/W in T) num_doodles++ if (num_doodles > 4) - src << "There is no space to write on!" + to_chat(src, "There is no space to write on!") return var/max_length = 50 @@ -603,7 +603,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (length(message) > max_length) message += "-" - src << "You ran out of blood to write with!" + to_chat(src, "You ran out of blood to write with!") var/obj/effect/decal/cleanable/blood/writing/W = new(T) W.basecolor = doodle_color @@ -657,14 +657,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/toggled_invisible if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) - src << "You must gather strength before you can turn visible again..." + to_chat(src, "You must gather strength before you can turn visible again...") return if(plane == PLANE_WORLD) toggled_invisible = world.time visible_message("It fades from sight...", "You are now invisible.") else - src << "You are now visible!" + to_chat(src, "You are now visible!") plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER @@ -679,9 +679,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp src.anonsay = !src.anonsay if(anonsay) - src << "Your key won't be shown when you speak in dead chat." + to_chat(src, "Your key won't be shown when you speak in dead chat.") else - src << "Your key will be publicly visible again." + to_chat(src, "Your key will be publicly visible again.") /mob/observer/dead/canface() return 1 @@ -714,11 +714,11 @@ mob/observer/dead/MayRespawn(var/feedback = 0) return 0 if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) if(feedback) - src << "Your non-dead body prevent you from respawning." + to_chat(src, "Your non-dead body prevent you from respawning.") return 0 if(config.antag_hud_restricted && has_enabled_antagHUD == 1) if(feedback) - src << "antagHUD restrictions prevent you from respawning." + to_chat(src, "antagHUD restrictions prevent you from respawning.") return 0 return 1 @@ -755,12 +755,12 @@ mob/observer/dead/MayRespawn(var/feedback = 0) if(msg) log_say("(SPECWHISP to [key_name(M)]): [msg]", src) M << " You hear a strange, unidentifiable voice in your head... [msg]" - src << " You said: '[msg]' to [M]." + to_chat(src, " You said: '[msg]' to [M].") else return return 1 else - src << "You have not been pulled past the veil!" + to_chat(src, "You have not been pulled past the veil!") /mob/observer/dead/verb/choose_ghost_sprite() set category = "Ghost" diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index c950a842091..dc44a551682 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -10,7 +10,7 @@ if(message) client.handle_spam_prevention(MUTE_DEADCHAT) if(src.client.prefs.muted & MUTE_DEADCHAT) - src << "You cannot talk in deadchat (muted)." + to_chat(src, "You cannot talk in deadchat (muted).") return . = src.say_dead(message) @@ -31,7 +31,7 @@ if(message) client.handle_spam_prevention(MUTE_DEADCHAT) if(src.client.prefs.muted & MUTE_DEADCHAT) - src << "You cannot emote in deadchat (muted)." + to_chat(src, "You cannot emote in deadchat (muted).") return . = src.emote_dead(message) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index f67f70eb878..fc269a31206 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -3,7 +3,7 @@ //m_type == 2 --> audible /mob/proc/custom_emote(var/m_type=1,var/message = null,var/range=world.view) if(stat || !use_me && usr == src) - src << "You are unable to emote." + to_chat(src, "You are unable to emote.") return var/muzzled = is_muzzled() @@ -62,16 +62,16 @@ /mob/proc/emote_dead(var/message) if(client.prefs.muted & MUTE_DEADCHAT) - src << "You cannot send deadchat emotes (muted)." + to_chat(src, "You cannot send deadchat emotes (muted).") return if(!is_preference_enabled(/datum/client_preference/show_dsay)) - src << "You have deadchat muted." + to_chat(src, "You have deadchat muted.") return if(!src.client.holder) if(!config.dsay_allowed) - src << "Deadchat is globally muted." + to_chat(src, "Deadchat is globally muted.") return diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 693b2129e11..f316797dc2f 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -60,9 +60,9 @@ if(is_deaf()) if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set if(speaker == src) - src << "You cannot hear yourself speak!" + to_chat(src, "You cannot hear yourself speak!") else - src << "[speaker_name][alt_name] talks but you cannot hear." + to_chat(src, "[speaker_name][alt_name] talks but you cannot hear.") else var/message_to_send = null if(language) @@ -251,7 +251,7 @@ if((sdisabilities & DEAF) || ear_deaf) if(prob(20)) - src << "You feel your headset vibrate but can hear nothing from it!" + to_chat(src, "You feel your headset vibrate but can hear nothing from it!") else on_hear_radio(part_a, speaker_name, track, part_b, formatted) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 25a6ed122ab..00fe76086a1 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -156,11 +156,11 @@ var/list/holder_mob_icon_cache = list() if(self_grab) grabber << "\The [src] clambers onto you!" - src << "You climb up onto \the [grabber]!" + to_chat(src, "You climb up onto \the [grabber]!") grabber.equip_to_slot_if_possible(H, slot_back, 0, 1) else grabber << "You scoop up \the [src]!" - src << "\The [grabber] scoops you up!" + to_chat(src, "\The [grabber] scoops you up!") H.sync(src) return H diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index c655559a107..0f0f95d3362 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -56,7 +56,7 @@ var/list/slot_equipment_priority = list( \ else if(!disable_warning) - src << "You are unable to equip that." //Only print if del_on_fail is false + to_chat(src, "You are unable to equip that.") //Only print if del_on_fail is false return 0 equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail. diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index f558301b151..9bc0a686536 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -144,9 +144,9 @@ /mob/observer/dead/hear_broadcast(var/datum/language/language, var/mob/speaker, var/speaker_name, var/message) if(speaker.name == speaker_name || antagHUD) - src << "[language.name], [speaker_name] ([ghost_follow_link(speaker, src)]) [message]" + to_chat(src, "[language.name], [speaker_name] ([ghost_follow_link(speaker, src)]) [message]") else - src << "[language.name], [speaker_name] [message]" + to_chat(src, "[language.name], [speaker_name] [message]") /datum/language/proc/check_special_condition(var/mob/other) return 1 @@ -164,6 +164,11 @@ if(name != "Noise") // Audible Emotes if(ishuman(speaker)) var/mob/living/carbon/human/H = speaker + if(H.species.has_organ[O_VOICE] && !(flags & SIGNLANG) && !(flags & NONVERBAL)) // Does the species need a voicebox? Is the language even spoken? + var/obj/item/organ/internal/voicebox/vocal = H.internal_organs_by_name[O_VOICE] + if(!vocal || vocal.is_broken() || vocal.mute) + return FALSE + if(src.name in H.species.assisted_langs) . = FALSE var/obj/item/organ/internal/voicebox/vox = locate() in H.internal_organs // Only voiceboxes for now. Maybe someday it'll include other organs, but I'm not that clever diff --git a/code/modules/mob/language/station_vr.dm b/code/modules/mob/language/station_vr.dm index dcc21366722..4ff68871a19 100644 --- a/code/modules/mob/language/station_vr.dm +++ b/code/modules/mob/language/station_vr.dm @@ -83,6 +83,19 @@ "uhk","zir","sc'orth","sc'er","thc'yek","th'zirk","th'esk","k'ayek","ka'mil","sc'","ik'yir","yol","kig","k'zit","'","'","zrk","krg","isk'yet","na'k", "sc'azz","th'sc","nil","n'ahk","sc'yeth","aur'sk","iy'it","azzg","a'","i'","o'","u'","a","i","o","u","zz","kr","ak","nrk","tzzk","bz","xic'","k'lax'","histh") +/datum/language/human/slavic + name = LANGUAGE_SLAVIC + desc = "The official language of the Independent Colonial Confederation of Gilgamesh, originally established in 2122 by the short-lived United Slavic Confederation on Earth." + colour = "solcom" + key = "r" + + syllables = list( + "rus", "zem", "ave", "groz", "ski", "ska", "ven", "konst", "pol", "lin", "svy", + "danya", "da", "mied", "zan", "das", "krem", "myka", "to", "st", "no", "na", "ni", + "ko", "ne", "en", "po", "ra", "li", "on", "byl", "cto", "eni", "ost", "ol", "ego", + "ver", "stv", "pro" + ) + /datum/language/unathi flags = 0 /datum/language/tajaran @@ -105,4 +118,4 @@ /datum/language/unathi/monkey flags = RESTRICTED /datum/language/tajaran/monkey - flags = RESTRICTED \ No newline at end of file + flags = RESTRICTED diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm index 2c6fe026453..4ee08dec859 100644 --- a/code/modules/mob/living/autohiss.dm +++ b/code/modules/mob/living/autohiss.dm @@ -25,15 +25,15 @@ autohiss_mode = (autohiss_mode + 1) % AUTOHISS_NUM switch(autohiss_mode) if(AUTOHISS_OFF) - src << "Auto-hiss is now OFF." + to_chat(src, "Auto-hiss is now OFF.") if(AUTOHISS_BASIC) - src << "Auto-hiss is now BASIC." + to_chat(src, "Auto-hiss is now BASIC.") if(AUTOHISS_FULL) - src << "Auto-hiss is now FULL." + to_chat(src, "Auto-hiss is now FULL.") else soft_assert(0, "invalid autohiss value [autohiss_mode]") autohiss_mode = AUTOHISS_OFF - src << "Auto-hiss is now OFF." + to_chat(src, "Auto-hiss is now OFF.") /datum/species var/list/autohiss_basic_map = null diff --git a/code/modules/mob/living/bot/SLed209bot.dm b/code/modules/mob/living/bot/SLed209bot.dm index 989c2e708d1..7b5bbc76e5d 100644 --- a/code/modules/mob/living/bot/SLed209bot.dm +++ b/code/modules/mob/living/bot/SLed209bot.dm @@ -21,7 +21,6 @@ xeno_harm_strength = 9 req_one_access = list(access_research, access_robotics) botcard_access = list(access_research, access_robotics, access_xenobiology, access_xenoarch, access_tox, access_tox_storage, access_maint_tunnels) - used_weapon = /obj/item/weapon/melee/baton/slime var/xeno_stun_strength = 6 /mob/living/bot/secbot/ed209/slime/update_icons() diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 81557f597c1..6d89980bae8 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -53,6 +53,9 @@ access_scanner.req_access = req_access.Copy() access_scanner.req_one_access = req_one_access.Copy() + if(!using_map.bot_patrolling) + will_patrol = FALSE + // Make sure mapped in units start turned on. /mob/living/bot/Initialize() . = ..() diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index eb2371c3293..b620ca3e1a4 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -113,7 +113,8 @@ dat += "Maintenance panel is [open ? "opened" : "closed"]" if(!locked || issilicon(user)) dat += "
    Cleans Blood: [blood ? "Yes" : "No"]
    " - dat += "
    Patrol station: [will_patrol ? "Yes" : "No"]
    " + if(using_map.bot_patrolling) + dat += "
    Patrol station: [will_patrol ? "Yes" : "No"]
    " if(open && !locked) dat += "Odd looking screw twiddled: [screwloose ? "Yes" : "No"]
    " dat += "Weird button pressed: [oddbutton ? "Yes" : "No"]" diff --git a/code/modules/mob/living/bot/edCLNbot.dm b/code/modules/mob/living/bot/edCLNbot.dm index 9b846511659..08d7d9ace62 100644 --- a/code/modules/mob/living/bot/edCLNbot.dm +++ b/code/modules/mob/living/bot/edCLNbot.dm @@ -82,7 +82,8 @@ dat += "Maintenance panel is [open ? "opened" : "closed"]" if(!locked || issilicon(user)) dat += "
    Cleans Blood: [blood ? "Yes" : "No"]
    " - dat += "
    Patrol station: [will_patrol ? "Yes" : "No"]
    " + if(using_map.bot_patrolling) + dat += "
    Patrol station: [will_patrol ? "Yes" : "No"]
    " if(open && !locked) dat += "
    Red Switch: [red_switch ? "On" : "Off"]
    " dat += "
    Green Switch: [green_switch ? "On" : "Off"]
    " diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 1c24593dbb1..1210d41e910 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -34,15 +34,20 @@ var/list/threat_found_sounds = list('sound/voice/bcriminal.ogg', 'sound/voice/bjustice.ogg', 'sound/voice/bfreeze.ogg') var/list/preparing_arrest_sounds = list('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/bcreep.ogg') var/list/fighting_sounds = list('sound/voice/biamthelaw.ogg', 'sound/voice/bradio.ogg', 'sound/voice/bjustice.ogg') -//VOREStation Add - They don't like being pulled. This is going to fuck with slimesky, but meh. +//VOREStation Add - They don't like being pulled. This is going to fuck with slimesky, but meh. //Screw you. Just screw you and your 'meh' /mob/living/bot/secbot/Life() ..() if(health > 0 && on && pulledby) if(isliving(pulledby)) - var/mob/living/L = pulledby - UnarmedAttack(L) - say("Do not interfere with active law enforcement routines!") - global_announcer.autosay("[src] was interfered with in [get_area(src)], activating defense routines.", "[src]", "Security") + var/pull_allowed = FALSE + for(var/A in req_one_access) + if(A in pulledby.GetAccess()) + pull_allowed = TRUE + if(!pull_allowed) + var/mob/living/L = pulledby + UnarmedAttack(L) + say("Do not interfere with active law enforcement routines!") + global_announcer.autosay("[src] was interfered with in [get_area(src)], activating defense routines.", "[src]", "Security") //VOREStation Add End /mob/living/bot/secbot/beepsky name = "Officer Beepsky" @@ -90,7 +95,8 @@ dat += "Check Arrest Status: [check_arrest ? "Yes" : "No"]
    " dat += "Operating Mode: [arrest_type ? "Detain" : "Arrest"]
    " dat += "Report Arrests: [declare_arrests ? "Yes" : "No"]
    " - dat += "Auto Patrol: [will_patrol ? "On" : "Off"]" + if(using_map.bot_patrolling) + dat += "Auto Patrol: [will_patrol ? "On" : "Off"]" var/datum/browser/popup = new(user, "autosec", "Securitron controls") popup.set_content(jointext(dat,null)) popup.open() diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm index aea00544182..8384a7dbb8a 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm @@ -25,15 +25,15 @@ var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices if(!M) - src << "There is nothing nearby to merge with." + to_chat(src, "There is nothing nearby to merge with.") else if(!do_merge(M)) - src << "You fail to merge with \the [M]..." + to_chat(src, "You fail to merge with \the [M]...") /mob/living/carbon/alien/diona/proc/do_merge(var/mob/living/carbon/human/H) if(!istype(H) || !src || !(src.Adjacent(H))) return 0 H << "You feel your being twine with that of \the [src] as it merges with your biomass." - src << "You feel your being twine with that of \the [H] as you merge with its biomass." + to_chat(src, "You feel your being twine with that of \the [H] as you merge with its biomass.") loc = H verbs += /mob/living/carbon/alien/diona/proc/split verbs -= /mob/living/carbon/alien/diona/proc/merge @@ -53,7 +53,7 @@ return src.loc << "You feel a pang of loss as [src] splits away from your biomass." - src << "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground." + to_chat(src, "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground.") var/mob/living/M = src.loc diff --git a/code/modules/mob/living/carbon/alien/diona/progression.dm b/code/modules/mob/living/carbon/alien/diona/progression.dm index b6c5b9b4fd0..e259b18f270 100644 --- a/code/modules/mob/living/carbon/alien/diona/progression.dm +++ b/code/modules/mob/living/carbon/alien/diona/progression.dm @@ -5,7 +5,7 @@ return null if(amount_grown < max_grown) - src << "You are not yet ready for your growth..." + to_chat(src, "You are not yet ready for your growth...") return null src.split() diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm index 175338e5ffd..8d81aec4cf3 100644 --- a/code/modules/mob/living/carbon/alien/emote.dm +++ b/code/modules/mob/living/carbon/alien/emote.dm @@ -16,7 +16,7 @@ return if (src.client) if (client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." + to_chat(src, "You cannot send IC messages (muted).") return if (stat) return @@ -115,7 +115,7 @@ playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0) m_type = 2 if("help") - src << "burp, chirp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper" + to_chat(src, "burp, chirp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper") else src << text("Invalid Emote: []", act) if ((message && src.stat == 0)) diff --git a/code/modules/mob/living/carbon/alien/larva/progression.dm b/code/modules/mob/living/carbon/alien/larva/progression.dm index 166ae536762..4e9c15552f2 100644 --- a/code/modules/mob/living/carbon/alien/larva/progression.dm +++ b/code/modules/mob/living/carbon/alien/larva/progression.dm @@ -1,10 +1,10 @@ /mob/living/carbon/alien/larva/confirm_evolution() - src << "You are growing into a beautiful alien! It is time to choose a caste." - src << "There are three to choose from:" - src << "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves." - src << "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters." - src << "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen." + to_chat(src, "You are growing into a beautiful alien! It is time to choose a caste.") + to_chat(src, "There are three to choose from:") + to_chat(src, "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves.") + to_chat(src, "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters.") + to_chat(src, "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen.") var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone") return alien_caste ? "Xenomorph [alien_caste]" : null diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index f02d82a45f9..2c39964ad6d 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -150,7 +150,7 @@ adjustFireLoss((environment.temperature - (T0C+66))/5) // Might be too high, check in testing. if (fire) fire.icon_state = "fire2" if(prob(20)) - src << "You feel a searing heat!" + to_chat(src, "You feel a searing heat!") else if (fire) fire.icon_state = "fire0" diff --git a/code/modules/mob/living/carbon/alien/progression.dm b/code/modules/mob/living/carbon/alien/progression.dm index 832535d062b..1c4c37b083c 100644 --- a/code/modules/mob/living/carbon/alien/progression.dm +++ b/code/modules/mob/living/carbon/alien/progression.dm @@ -12,11 +12,11 @@ return if(handcuffed || legcuffed) - src << "You cannot evolve when you are cuffed." + to_chat(src, "You cannot evolve when you are cuffed.") return if(amount_grown < max_grown) - src << "You are not fully grown." + to_chat(src, "You are not fully grown.") return // confirm_evolution() handles choices and other specific requirements. diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index 1f787be9ddc..86213399273 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -4,7 +4,7 @@ if(client) if(client.prefs.muted & MUTE_IC) - src << "You cannot speak in IC (Muted)." + to_chat(src, "You cannot speak in IC (Muted).") return message = sanitize(message) diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm index 22efdc76c6d..bc4623647b2 100644 --- a/code/modules/mob/living/carbon/brain/emote.dm +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -17,7 +17,7 @@ return if (src.client) if (client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." + to_chat(src, "You cannot send IC messages (muted).") return if (stat) return @@ -28,15 +28,15 @@ if ("custom") return custom_emote(m_type, message) if ("alarm") - src << "You sound an alarm." + to_chat(src, "You sound an alarm.") message = "[src] sounds an alarm." m_type = 2 if ("alert") - src << "You let out a distressed noise." + to_chat(src, "You let out a distressed noise.") message = "[src] lets out a distressed noise." m_type = 2 if ("notice") - src << "You play a loud tone." + to_chat(src, "You play a loud tone.") message = "[src] plays a loud tone." m_type = 2 if ("flash") @@ -46,21 +46,21 @@ message = "[src] blinks." m_type = 1 if ("whistle") - src << "You whistle." + to_chat(src, "You whistle.") message = "[src] whistles." m_type = 2 if ("beep") - src << "You beep." + to_chat(src, "You beep.") message = "[src] beeps." m_type = 2 if ("boop") - src << "You boop." + to_chat(src, "You boop.") message = "[src] boops." m_type = 2 if ("help") - src << "alarm,alert,notice,flash,blink,whistle,beep,boop" + to_chat(src, "alarm,alert,notice,flash,blink,whistle,beep,boop") else - src << "Unusable emote '[act]'. Say *help for a list." + to_chat(src, "Unusable emote '[act]'. Say *help for a list.") if (message) log_emote(message, src) diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 4ab220083d8..c52584ba962 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -6,9 +6,9 @@ if (radiation > 100) radiation = 100 if(!container)//If it's not in an MMI - src << "You feel weak." + to_chat(src, "You feel weak.") else//Fluff-wise, since the brain can't detect anything itself, the MMI handles thing like that - src << "STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED." + to_chat(src, "STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED.") switch(radiation) if(1 to 49) @@ -23,9 +23,9 @@ if(prob(5)) radiation -= 5 if(!container) - src << "You feel weak." + to_chat(src, "You feel weak.") else - src << "STATUS: DANGEROUS LEVELS OF RADIATION DETECTED." + to_chat(src, "STATUS: DANGEROUS LEVELS OF RADIATION DETECTED.") updatehealth() if(75 to 100) @@ -115,7 +115,7 @@ silent = 1 if(!alert)//Sounds an alarm, but only once per 'level' emote("alarm") - src << "Major electrical distruption detected: System rebooting." + to_chat(src, "Major electrical distruption detected: System rebooting.") alert = 1 if(prob(75)) emp_damage -= 1 @@ -131,7 +131,7 @@ ear_damage = 1 if(!alert) emote("alert") - src << "Primary systems are now online." + to_chat(src, "Primary systems are now online.") alert = 1 if(prob(50)) emp_damage -= 1 @@ -143,13 +143,13 @@ if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) if(!alert) emote("notice") - src << "System reboot nearly complete." + to_chat(src, "System reboot nearly complete.") alert = 1 if(prob(25)) emp_damage -= 1 if(1) alert = 0 - src << "All systems restored." + to_chat(src, "All systems restored.") emp_damage -= 1 return 1 diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index a09d8ce3e53..0493b2d92d9 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -42,5 +42,5 @@ message_mode = null return R.radio.talk_into(src,message,message_mode,verb,speaking) else - src << "Your radio is disabled." + to_chat(src, "Your radio is disabled.") return 0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 505821640d3..4d58c094ce2 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -362,7 +362,7 @@ if(buckled) return 0 stop_pulling() - src << "You slipped on [slipped_on]!" + to_chat(src, "You slipped on [slipped_on]!") playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) Weaken(FLOOR(stun_duration/2, 1)) return 1 diff --git a/code/modules/mob/living/carbon/carbon_powers.dm b/code/modules/mob/living/carbon/carbon_powers.dm index 337f0b0ff1f..163555a0c7d 100644 --- a/code/modules/mob/living/carbon/carbon_powers.dm +++ b/code/modules/mob/living/carbon/carbon_powers.dm @@ -8,7 +8,7 @@ var/mob/living/simple_mob/animal/borer/B = has_brain_worms() if(B && B.host_brain) - src << "You withdraw your probosci, releasing control of [B.host_brain]" + to_chat(src, "You withdraw your probosci, releasing control of [B.host_brain]") B.detatch() @@ -17,7 +17,7 @@ verbs -= /mob/living/carbon/proc/spawn_larvae else - src << "ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !" + to_chat(src, "ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !") //Brain slug proc for tormenting the host. /mob/living/carbon/proc/punish_host() @@ -31,10 +31,10 @@ return if(B.host_brain.ckey) - src << "You send a punishing spike of psychic agony lancing into your host's brain." + to_chat(src, "You send a punishing spike of psychic agony lancing into your host's brain.") if (!can_feel_pain()) B.host_brain << "You feel a strange sensation as a foreign influence prods your mind." - src << "It doesn't seem to be as effective as you hoped." + to_chat(src, "It doesn't seem to be as effective as you hoped.") else B.host_brain << "Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!" @@ -49,7 +49,7 @@ return if(B.chemicals >= 100) - src << "Your host twitches and quivers as you rapidly excrete a larva from your sluglike body." + to_chat(src, "Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.") visible_message("\The [src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!") B.chemicals -= 100 B.has_reproduced = 1 @@ -58,5 +58,5 @@ new /mob/living/simple_mob/animal/borer(get_turf(src)) else - src << "You do not have enough chemicals stored to reproduce." + to_chat(src, "You do not have enough chemicals stored to reproduce.") return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index 5d4f17840af..8825f043b7d 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -12,7 +12,7 @@ if(!I) I = src.get_inactive_hand() if(!I) - src << "You don't have anything in your hands to give to \the [target]." + to_chat(src, "You don't have anything in your hands to give to \the [target].") return if(alert(target,"[src] wants to give you \a [I]. Will you accept it?","Item Offer","Yes","No") == "No") //VOREStation Edit - make yes on the left to be consistent with other dialogs @@ -23,18 +23,18 @@ if(!I) return if(!Adjacent(target)) - src << "You need to stay in reaching distance while giving an object." + to_chat(src, "You need to stay in reaching distance while giving an object.") target << "\The [src] moved too far away." return if(I.loc != src || !src.item_is_in_hands(I)) - src << "You need to keep the item in your hands." + to_chat(src, "You need to keep the item in your hands.") target << "\The [src] seems to have given up on passing \the [I] to you." return if(target.hands_are_full()) target << "Your hands are full." - src << "Their hands are full." + to_chat(src, "Their hands are full.") return if(src.unEquip(I)) diff --git a/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm b/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm new file mode 100644 index 00000000000..431b7c44561 --- /dev/null +++ b/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm @@ -0,0 +1,143 @@ +/mob/living/carbon/human/ai_controlled + name = "Nameless Joe" + + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive + + var/generate_species = SPECIES_HUMAN + var/generate_dead = FALSE + + var/generate_gender = FALSE + var/generate_id_gender = FALSE + + var/to_wear_hair = "Bald" + + var/to_wear_helmet = /obj/item/clothing/head/welding + var/to_wear_glasses = /obj/item/clothing/glasses/threedglasses + var/to_wear_mask = /obj/item/clothing/mask/gas + var/to_wear_l_radio = /obj/item/device/radio/headset + var/to_wear_r_radio = null + var/to_wear_uniform = /obj/item/clothing/under/color/grey + var/to_wear_suit = /obj/item/clothing/suit/armor/material/makeshift/glass + var/to_wear_gloves = /obj/item/clothing/gloves/ring/material/platinum + var/to_wear_shoes = /obj/item/clothing/shoes/galoshes + var/to_wear_belt = /obj/item/weapon/storage/belt/utility/full + var/to_wear_l_pocket = /obj/item/weapon/soap + var/to_wear_r_pocket = /obj/item/device/pda + var/to_wear_back = /obj/item/weapon/storage/backpack + var/to_wear_id_type = /obj/item/weapon/card/id + var/to_wear_id_job = "Assistant" + + var/to_wear_l_hand = null + var/to_wear_r_hand = /obj/item/weapon/melee/baton + +/mob/living/carbon/human/ai_controlled/Initialize() + if(generate_gender) + gender = pick(list(MALE, FEMALE, PLURAL, NEUTER)) + + if(generate_id_gender) + identifying_gender = pick(list(MALE, FEMALE, PLURAL, NEUTER)) + + ..(loc, generate_species) + + h_style = to_wear_hair + + if(to_wear_uniform) + equip_to_slot_or_del(new to_wear_uniform(src), slot_w_uniform) + + if(to_wear_suit) + equip_to_slot_or_del(new to_wear_suit(src), slot_wear_suit) + + if(to_wear_shoes) + equip_to_slot_or_del(new to_wear_shoes(src), slot_shoes) + + if(to_wear_gloves) + equip_to_slot_or_del(new to_wear_gloves(src), slot_gloves) + + if(to_wear_l_radio) + equip_to_slot_or_del(new to_wear_l_radio(src), slot_l_ear) + + if(to_wear_r_radio) + equip_to_slot_or_del(new to_wear_r_radio(src), slot_r_ear) + + if(to_wear_glasses) + equip_to_slot_or_del(new to_wear_glasses(src), slot_glasses) + + if(to_wear_mask) + equip_to_slot_or_del(new to_wear_mask(src), slot_wear_mask) + + if(to_wear_helmet) + equip_to_slot_or_del(new to_wear_helmet(src), slot_head) + + if(to_wear_belt) + equip_to_slot_or_del(new to_wear_belt(src), slot_belt) + + if(to_wear_r_pocket) + equip_to_slot_or_del(new to_wear_r_pocket(src), slot_r_store) + + if(to_wear_l_pocket) + equip_to_slot_or_del(new to_wear_l_pocket(src), slot_l_store) + + if(to_wear_back) + equip_to_slot_or_del(new to_wear_back(src), slot_back) + + if(to_wear_l_hand) + equip_to_slot_or_del(new to_wear_l_hand(src), slot_l_hand) + + if(to_wear_r_hand) + equip_to_slot_or_del(new to_wear_r_hand(src), slot_r_hand) + + if(to_wear_id_type) + var/obj/item/weapon/card/id/W = new to_wear_id_type(src) + W.name = "[real_name]'s ID Card" + var/datum/job/jobdatum + for(var/jobtype in typesof(/datum/job)) + var/datum/job/J = new jobtype + if(J.title == to_wear_id_job) + jobdatum = J + break + if(jobdatum) + W.access = jobdatum.get_access() + else + W.access = list() + if(to_wear_id_job) + W.assignment = to_wear_id_job + W.registered_name = real_name + equip_to_slot_or_del(W, slot_wear_id) + + if(generate_dead) + death() + +/* + * Subtypes. + */ + +/mob/living/carbon/human/ai_controlled/replicant + generate_species = SPECIES_REPLICANT_BETA + + generate_gender = TRUE + identifying_gender = NEUTER + + faction = "xeno" + + to_wear_helmet = /obj/item/clothing/head/helmet/dermal + to_wear_glasses = /obj/item/clothing/glasses/goggles + to_wear_mask = /obj/item/clothing/mask/gas/half + to_wear_l_radio = /obj/item/device/radio/headset/headset_rob + to_wear_r_radio = null + to_wear_uniform = /obj/item/clothing/under/color/grey + to_wear_suit = /obj/item/clothing/suit/armor/vest + to_wear_gloves = null + to_wear_shoes = /obj/item/clothing/shoes/boots/combat/changeling + to_wear_belt = /obj/item/weapon/storage/belt/utility/full + to_wear_l_pocket = /obj/item/weapon/grenade/explosive/mini + to_wear_r_pocket = /obj/item/weapon/grenade/explosive/mini + to_wear_back = /obj/item/device/radio/electropack + to_wear_id_type = /obj/item/weapon/card/id + to_wear_id_job = "Experiment" + + to_wear_r_hand = null + +/mob/living/carbon/human/ai_controlled/replicant/Initialize() + ..() + name = species.get_random_name(gender) + add_modifier(/datum/modifier/homeothermic, 0, null) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index a8fd5176e87..6eaa3a36d8f 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -33,7 +33,7 @@ if("ping", "beep", "buzz", "yes", "ye", "no", "rcough", "rsneeze") if(!isSynthetic()) - src << "You are not a synthetic." + to_chat(src, "You are not a synthetic.") return var/M = null @@ -83,7 +83,7 @@ if("squish") /* VOREStation Removal Start - Eh. People can squish maybe. if(species.bump_flag != SLIME) //This should definitely do it. - src << "You are not a slime thing!" + to_chat(src, "You are not a slime thing!") return */ //VOREStation Removal End playsound(src.loc, 'sound/effects/slime_squish.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound. @@ -139,7 +139,7 @@ if (src.client) if (client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." + to_chat(src, "You cannot send IC messages (muted).") return if (stat) return @@ -706,7 +706,7 @@ if("vomit") if(isSynthetic()) - src << "You are unable to vomit." + to_chat(src, "You are unable to vomit.") return vomit() return @@ -726,13 +726,13 @@ message = "makes a light spitting noise, a poor attempt at a whistle." if ("help") - src << "blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, deathgasp, drool, eyebrow, fastsway/qwag, \ + to_chat(src, "blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, deathgasp, drool, eyebrow, fastsway/qwag, \ frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom, \ raise, salute, scream, sneeze, shake, shiver, shrug, sigh, signal-#1-10, slap-(none)/mob, smile, sneeze, sniff, snore, stare-(none)/mob, stopsway/swag, sway/wag, swish, tremble, twitch, \ - twitch_v, vomit, whimper, wink, yawn. Synthetics: beep, buzz, yes, no, rcough, rsneeze, ping" + twitch_v, vomit, whimper, wink, yawn. Synthetics: beep, buzz, yes, no, rcough, rsneeze, ping") else - src << "Unusable emote '[act]'. Say *help for a list." + to_chat(src, "Unusable emote '[act]'. Say *help for a list.") if (message) custom_emote(m_type,message) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 8c687e8de69..dad9e0f41db 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -295,6 +295,7 @@ msg += attempt_vr(src,"examine_pickup_size",args) //VOREStation Code msg += attempt_vr(src,"examine_step_size",args) //VOREStation Code msg += attempt_vr(src,"examine_nif",args) //VOREStation Code + msg += attempt_vr(src,"examine_chimera",args) //VOREStation Code if(mSmallsize in mutations) msg += "[T.He] [T.is] very short!
    " diff --git a/code/modules/mob/living/carbon/human/examine_vr.dm b/code/modules/mob/living/carbon/human/examine_vr.dm index fd6a4264476..bdd8678b1f8 100644 --- a/code/modules/mob/living/carbon/human/examine_vr.dm +++ b/code/modules/mob/living/carbon/human/examine_vr.dm @@ -105,9 +105,11 @@ message = "[t_He] [t_is] extremely hungry. A deep growl occasionally rumbles from [t_his] empty stomach.\n" if(100 to 499) return message //Well that's pretty normal, really. - if(500 to 1199) // Fat. + if(500 to 999) // Fat. message = "[t_He] [t_has] a stuffed belly, bloated fat and round from eating too much.\n" - if(1200 to 1934) // One person fully digested. + if(1000 to 1399) + message = "[t_He] [t_has] a rotund, thick gut. It bulges from their body obscenely, close to sagging under its own weight.\n" + if(1400 to 1934) // One person fully digested. message = "[t_He] [t_is] sporting a large, round, sagging stomach. It's contains at least their body weight worth of glorping slush.\n" if(1935 to 3004) // Two people. message = "[t_He] [t_is] engorged with a huge stomach that sags and wobbles as they move. [t_He] must have consumed at least twice their body weight. It looks incredibly soft.\n" @@ -155,3 +157,40 @@ /mob/living/carbon/human/proc/examine_nif(mob/living/carbon/human/H) if(nif && nif.examine_msg) //If you have one set, anyway. return "[nif.examine_msg]\n" + +/mob/living/carbon/human/proc/examine_chimera(mob/living/carbon/human/H) + var/t_He = "It" //capitalised for use at the start of each line. + var/t_his = "its" + var/t_His = "Its" + var/t_appear = "appears" + var/t_has = "has" + switch(identifying_gender) //Gender is their "real" gender. Identifying_gender is their "chosen" gender. + if(MALE) + t_He = "He" + t_His = "His" + t_his = "his" + if(FEMALE) + t_He = "She" + t_His = "Her" + t_his = "her" + if(PLURAL) + t_He = "They" + t_His = "Their" + t_his = "their" + t_appear = "appear" + t_has = "have" + if(NEUTER) + t_He = "It" + t_His = "Its" + t_his = "its" + if(HERM) + t_He = "Shi" + t_His = "Hir" + t_his = "hir" + if(revive_ready == REVIVING_NOW || revive_ready == REVIVING_DONE) + if(stat == DEAD) + return "[t_His] body is twitching subtly.\n" + else + return "[t_He] [t_appear] to be in some sort of torpor.\n" + if(feral) + return "[t_He] [t_has] a crazed, wild look in [t_his] eyes!\n" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 0cf20396d86..dae0723fd4a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -715,7 +715,7 @@ if(species.has_fine_manipulation) return 1 if(!silent) - src << "You don't have the dexterity to use that!" + to_chat(src, "You don't have the dexterity to use that!") return 0 /mob/living/carbon/human/abiotic(var/full_body = 0) @@ -1057,7 +1057,7 @@ if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad. // All kinds of embedded objects cause bleeding. if(!can_feel_pain(organ.organ_tag)) - src << "You feel [O] moving inside your [organ.name]." + to_chat(src, "You feel [O] moving inside your [organ.name].") else var/msg = pick( \ "A spike of pain jolts your [organ.name] as you bump [O] inside.", \ @@ -1223,26 +1223,26 @@ verbs -= /mob/living/carbon/human/proc/bloody_doodle if (src.gloves) - src << "Your [src.gloves] are getting in the way." + to_chat(src, "Your [src.gloves] are getting in the way.") return var/turf/simulated/T = src.loc if (!istype(T)) //to prevent doodling out of mechs and lockers - src << "You cannot reach the floor." + to_chat(src, "You cannot reach the floor.") return var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West") if (direction != "Here") T = get_step(T,text2dir(direction)) if (!istype(T)) - src << "You cannot doodle there." + to_chat(src, "You cannot doodle there.") return var/num_doodles = 0 for (var/obj/effect/decal/cleanable/blood/writing/W in T) num_doodles++ if (num_doodles > 4) - src << "There is no space to write on!" + to_chat(src, "There is no space to write on!") return var/max_length = bloody_hands * 30 //tweeter style @@ -1255,7 +1255,7 @@ if (length(message) > max_length) message += "-" - src << "You ran out of blood to write with!" + to_chat(src, "You ran out of blood to write with!") var/obj/effect/decal/cleanable/blood/writing/W = new(T) W.basecolor = (hand_blood_color) ? hand_blood_color : "#A10808" @@ -1283,6 +1283,9 @@ else if (affecting.robotic >= ORGAN_LIFELIKE) . = 0 fail_msg = "Your needle refuses to penetrate more than a short distance..." + else if (affecting.thick_skin && prob(70 - round(affecting.brute_dam + affecting.burn_dam / 2))) // Allows transplanted limbs with thick skin to maintain their resistance. + . = 0 + fail_msg = "Your needle fails to penetrate \the [affecting]'s thick hide..." else switch(target_zone) if(BP_HEAD) @@ -1412,7 +1415,7 @@ return if(self) - src << "You brace yourself to relocate your [current_limb.joint]..." + to_chat(src, "You brace yourself to relocate your [current_limb.joint]...") else U << "You begin to relocate [S]'s [current_limb.joint]..." @@ -1422,7 +1425,7 @@ return if(self) - src << "You pop your [current_limb.joint] back in!" + to_chat(src, "You pop your [current_limb.joint] back in!") else U << "You pop [S]'s [current_limb.joint] back in!" S << "[U] pops your [current_limb.joint] back in!" @@ -1507,11 +1510,11 @@ if(!UWC) return var/datum/category_item/underwear/UWI = all_underwear[UWC.name] if(!UWI || UWI.name == "None") - src << "You do not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "\a [UWC.display_name]"]." + to_chat(src, "You do not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "a [UWC.display_name]"].") return hide_underwear[UWC.name] = !hide_underwear[UWC.name] update_underwear(1) - src << "You [hide_underwear[UWC.name] ? "take off" : "put on"] your [UWC.display_name]." + to_chat(src, "You [hide_underwear[UWC.name] ? "take off" : "put on"] your [UWC.display_name].") return /mob/living/carbon/human/verb/pull_punches() @@ -1521,7 +1524,7 @@ if(stat) return pulling_punches = !pulling_punches - src << "You are now [pulling_punches ? "pulling your punches" : "not pulling your punches"]." + to_chat(src, "You are now [pulling_punches ? "pulling your punches" : "not pulling your punches"].") return /mob/living/carbon/human/should_have_organ(var/organ_check) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index ad0ceb7f624..4572f8cf858 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -8,6 +8,14 @@ return soft_type return src.default_attack // VOREStation Edit - End + if(src.gloves) + var/obj/item/clothing/gloves/G = src.gloves + if(istype(G) && G.special_attack && G.special_attack.is_usable(src, target, hit_zone)) + if(pulling_punches) + var/datum/unarmed_attack/soft_type = G.special_attack.get_sparring_variant() + if(soft_type) + return soft_type + return G.special_attack for(var/datum/unarmed_attack/u_attack in species.unarmed_attacks) if(u_attack.is_usable(src, target, hit_zone)) if(pulling_punches) @@ -41,39 +49,11 @@ H.do_attack_animation(src) playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("[H] reaches for [src], but misses!") - return 0 + return FALSE if(H != src && check_shields(0, null, H, H.zone_sel.selecting, H.name)) H.do_attack_animation(src) - return 0 - - if(istype(H.gloves, /obj/item/clothing/gloves/boxing/hologlove)) - H.do_attack_animation(src) - var/damage = rand(0, 9) - if(!damage) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[H] has attempted to punch [src]!") - return 0 - var/obj/item/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting)) - var/armor_block = run_armor_check(affecting, "melee") - var/armor_soak = get_armor_soak(affecting, "melee") - - if(HULK in H.mutations) - damage += 5 - - playsound(loc, "punch", 25, 1, -1) - - visible_message("[H] has punched [src]!") - - if(armor_soak >= damage) - return - - apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak) - if(damage >= 9) - visible_message("[H] has weakened [src]!") - apply_effect(4, WEAKEN, armor_block) - - return + return FALSE if(istype(M,/mob/living/carbon)) var/mob/living/carbon/C = M @@ -118,11 +98,11 @@ if(istype(H) && health > config.health_threshold_dead) adjustOxyLoss(-(min(getOxyLoss(), 5))) updatehealth() - src << "You feel a breath of fresh air enter your lungs. It feels good." + to_chat(src, "You feel a breath of fresh air enter your lungs. It feels good.") else if(!(M == src && apply_pressure(M, M.zone_sel.selecting))) help_shake_act(M) - return 1 + return TRUE if(I_GRAB) if(M == src || anchored) @@ -149,7 +129,8 @@ //VORESTATION EDIT visible_message("[M] has grabbed [src] [(M.zone_sel.selecting == BP_L_HAND || M.zone_sel.selecting == BP_R_HAND)? "by [(gender==FEMALE)? "her" : ((gender==MALE)? "his": "their")] hands": "passively"]!") //VORESTATION END END - return 1 + + return TRUE if(I_HURT) @@ -175,7 +156,7 @@ if(!affecting || affecting.is_stump()) M << "They are missing that limb!" - return 1 + return TRUE switch(src.a_intent) if(I_HELP) @@ -245,7 +226,10 @@ // See what attack they use var/datum/unarmed_attack/attack = H.get_unarmed_attack(src, hit_zone) if(!attack) - return 0 + return FALSE + + if(attack.unarmed_override(H, src, hit_zone)) + return FALSE H.do_attack_animation(src) if(!attack_message) @@ -258,7 +242,7 @@ add_attack_logs(H,src,"Melee attacked with fists (miss/block)") if(miss_type) - return 0 + return FALSE var/real_damage = rand_damage var/hit_dam_type = attack.damage_type @@ -268,7 +252,7 @@ var/obj/item/clothing/gloves/G = H.gloves real_damage += G.punch_force hit_dam_type = G.punch_damtype - if(H.pulling_punches) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN + if(H.pulling_punches && !attack.sharp && !attack.edge) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN, BUT YOU CAN'T "PULL" A KNIFE hit_dam_type = AGONY real_damage *= damage_multiplier rand_damage *= damage_multiplier @@ -359,7 +343,7 @@ var/armor_soak = get_armor_soak(affecting, armor_type, armor_pen) apply_damage(damage, BRUTE, affecting, armor_block, armor_soak, sharp = a_sharp, edge = a_edge) updatehealth() - return 1 + return TRUE //Used to attack a joint through grabbing /mob/living/carbon/human/proc/grab_joint(var/mob/living/user, var/def_zone) @@ -370,43 +354,43 @@ break if(!has_grab) - return 0 + return FALSE if(!def_zone) def_zone = user.zone_sel.selecting var/target_zone = check_zone(def_zone) if(!target_zone) - return 0 + return FALSE var/obj/item/organ/external/organ = get_organ(check_zone(target_zone)) if(!organ || organ.dislocated > 0 || organ.dislocated == -1) //don't use is_dislocated() here, that checks parent - return 0 + return FALSE user.visible_message("[user] begins to dislocate [src]'s [organ.joint]!") if(do_after(user, 100)) organ.dislocate(1) src.visible_message("[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!") - return 1 - return 0 + return TRUE + return FALSE //Breaks all grips and pulls that the mob currently has. /mob/living/carbon/human/proc/break_all_grabs(mob/living/carbon/user) - var/success = 0 + var/success = FALSE if(pulling) visible_message("[user] has broken [src]'s grip on [pulling]!") - success = 1 + success = TRUE stop_pulling() if(istype(l_hand, /obj/item/weapon/grab)) var/obj/item/weapon/grab/lgrab = l_hand if(lgrab.affecting) visible_message("[user] has broken [src]'s grip on [lgrab.affecting]!") - success = 1 + success = TRUE spawn(1) qdel(lgrab) if(istype(r_hand, /obj/item/weapon/grab)) var/obj/item/weapon/grab/rgrab = r_hand if(rgrab.affecting) visible_message("[user] has broken [src]'s grip on [rgrab.affecting]!") - success = 1 + success = TRUE spawn(1) qdel(rgrab) return success @@ -421,11 +405,11 @@ /mob/living/carbon/human/proc/apply_pressure(mob/living/user, var/target_zone) var/obj/item/organ/external/organ = get_organ(target_zone) if(!organ || !(organ.status & ORGAN_BLEEDING) || (organ.robotic >= ORGAN_ROBOT)) - return 0 + return FALSE if(organ.applied_pressure) user << "Someone is already applying pressure to [user == src? "your [organ.name]" : "[src]'s [organ.name]"]." - return 0 + return FALSE var/datum/gender/TU = gender_datums[user.get_visible_gender()] @@ -446,4 +430,4 @@ else user.visible_message("\The [user] stops applying pressure to [src]'s [organ.name]!", "You stop applying pressure to [src]'s [organ.name]!") - return 1 + return TRUE diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 1f211fe95b7..dd42af027e7 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -253,21 +253,21 @@ if (candidates.len) var/obj/item/organ/external/O = pick(candidates) O.mutate() - src << "Something is not right with your [O.name]..." + to_chat(src, "Something is not right with your [O.name]...") return else if (prob(heal_prob)) for (var/obj/item/organ/external/O in organs) if (O.status & ORGAN_MUTATED) O.unmutate() - src << "Your [O.name] is shaped normally again." + to_chat(src, "Your [O.name] is shaped normally again.") return if (getCloneLoss() < 1) for (var/obj/item/organ/external/O in organs) if (O.status & ORGAN_MUTATED) O.unmutate() - src << "Your [O.name] is shaped normally again." + to_chat(src, "Your [O.name] is shaped normally again.") BITSET(hud_updateflag, HEALTH_HUD) // Defined here solely to take species flags into account without having to recast at mob/living level. diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 6bd592aed63..57cef190ecf 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -416,7 +416,7 @@ emp_act //If the armor absorbs all of the damage, skip the rest of the calculations var/soaked = get_armor_soak(affecting, "melee", O.armor_penetration) if(soaked >= throw_damage) - src << "Your armor absorbs the force of [O.name]!" + to_chat(src, "Your armor absorbs the force of [O.name]!") return var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index ec10dc90f8e..8c4eba8a33c 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -8,9 +8,9 @@ return 1 if(feedback) if(status[1] == HUMAN_EATING_NO_MOUTH) - src << "Where do you intend to put \the [food]? You don't have a mouth!" + to_chat(src, "Where do you intend to put \the [food]? You don't have a mouth!") else if(status[1] == HUMAN_EATING_BLOCKED_MOUTH) - src << "\The [status[2]] is in the way!" + to_chat(src, "\The [status[2]] is in the way!") return 0 /mob/living/carbon/human/can_force_feed(var/feeder, var/food, var/feedback = 1) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index f0f24f0db2d..2bdebcbe0a0 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -158,7 +158,7 @@ . += turf_move_cost // Wind makes it easier or harder to move, depending on if you're with or against the wind. - if(T.outdoors) + if(T.outdoors && (T.z <= SSplanets.z_to_planet.len)) var/datum/planet/P = SSplanets.z_to_planet[z] if(P) var/datum/weather_holder/WH = P.weather_holder diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 809a5ef8ade..9309100cf6c 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -42,7 +42,7 @@ return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) - src << "You cannot tackle someone in your current state." + to_chat(src, "You cannot tackle someone in your current state.") return var/list/choices = list() @@ -61,7 +61,7 @@ return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) - src << "You cannot tackle in your current state." + to_chat(src, "You cannot tackle in your current state.") return last_special = world.time + 50 @@ -103,7 +103,7 @@ var/mob/M = targets[target] if(istype(M, /mob/observer/dead) || M.stat == DEAD) - src << "Not even a [src.species.name] can speak to the dead." + to_chat(src, "Not even a [src.species.name] can speak to the dead.") return log_say("(COMMUNE to [key_name(M)]) [text]",src) @@ -138,7 +138,7 @@ if(msg) log_say("(PWHISPER to [key_name(M)]) [msg]", src) M << "You hear a strange, alien voice in your head... [msg]" - src << "You said: \"[msg]\" to [M]" + to_chat(src, "You said: \"[msg]\" to [M]") return /mob/living/carbon/human/proc/diona_split_nymph() @@ -189,7 +189,7 @@ if(stat == DEAD) return - src << "Performing self-diagnostic, please wait..." + to_chat(src, "Performing self-diagnostic, please wait...") sleep(50) var/output = "Self-Diagnostic Results:\n" @@ -226,17 +226,17 @@ set category = "Abilities" if(incapacitated()) - src << "You need to recover before you can use this ability." + to_chat(src, "You need to recover before you can use this ability.") return if(world.time < next_sonar_ping) - src << "You need another moment to focus." + to_chat(src, "You need another moment to focus.") return if(is_deaf() || is_below_sound_pressure(get_turf(src))) - src << "You are for all intents and purposes currently deaf!" + to_chat(src, "You are for all intents and purposes currently deaf!") return next_sonar_ping += 10 SECONDS var/heard_something = FALSE - src << "You take a moment to listen in to your environment..." + to_chat(src, "You take a moment to listen in to your environment...") for(var/mob/living/L in range(client.view, src)) var/turf/T = get_turf(L) if(!T || L == src || L.stat == DEAD || is_below_sound_pressure(T)) @@ -263,7 +263,7 @@ feedback += "" src << jointext(feedback,null) if(!heard_something) - src << "You hear no movement but your own." + to_chat(src, "You hear no movement but your own.") /mob/living/carbon/human/proc/regenerate() set name = "Regenerate" @@ -286,8 +286,11 @@ nutrition -= 200 for(var/obj/item/organ/I in internal_organs) + if(I.robotic >= ORGAN_ROBOT) // No free robofix. + continue if(I.damage > 0) I.damage = max(I.damage - 30, 0) //Repair functionally half of a dead internal organ. + I.status = 0 // Wipe status, as it's being regenerated from possibly dead. to_chat(src, "You feel a soothing sensation within your [I.name]...") // Replace completely missing limbs. @@ -310,6 +313,15 @@ var/agony_to_apply = round(0.66 * O.max_damage) // 66% of the limb's health is converted into pain. src.apply_damage(agony_to_apply, HALLOSS) + for(var/organtype in species.has_organ) // Replace completely missing internal organs. -After- external ones, so they all should exist. + if(!src.internal_organs_by_name[organtype]) + var/organpath = species.has_organ[organtype] + var/obj/item/organ/Int = new organpath(src, TRUE) + + Int.rejuvenate(TRUE) + + handle_organs() // Update everything + update_icons_body() active_regen = FALSE else diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index a51e04b5359..ee2082401c5 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -327,7 +327,7 @@ This saves us from having to call add_fingerprint() any time something is put in if(C.attempt_attach_accessory(A, src)) return else - src << "You are trying to equip this item to an unsupported inventory slot. How the heck did you manage that? Stop it..." + to_chat(src, "You are trying to equip this item to an unsupported inventory slot. How the heck did you manage that? Stop it...") return if((W == src.l_hand) && (slot != slot_l_hand)) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index cb63df8d563..2ff94090074 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -189,7 +189,7 @@ if (disabilities & EPILEPSY) if ((prob(1) && paralysis < 1)) - src << "You have a seizure!" + to_chat(src, "You have a seizure!") for(var/mob/O in viewers(src, null)) if(O == src) continue @@ -223,19 +223,19 @@ custom_pain("Your head feels numb and painful.", 10) if(getBrainLoss() >= 15) if(4 <= rn && rn <= 6) if(eye_blurry <= 0) - src << "It becomes hard to see for some reason." + to_chat(src, "It becomes hard to see for some reason.") eye_blurry = 10 if(getBrainLoss() >= 35) if(7 <= rn && rn <= 9) if(get_active_hand()) - src << "Your hand won't respond properly, you drop what you're holding!" + to_chat(src, "Your hand won't respond properly, you drop what you're holding!") drop_item() if(getBrainLoss() >= 45) if(10 <= rn && rn <= 12) if(prob(50)) - src << "You suddenly black out!" + to_chat(src, "You suddenly black out!") Paralyse(10) else if(!lying) - src << "Your legs won't respond properly, you fall down!" + to_chat(src, "Your legs won't respond properly, you fall down!") Weaken(10) @@ -294,13 +294,13 @@ if(!isSynthetic()) if(prob(5) && prob(100 * RADIATION_SPEED_COEFFICIENT)) radiation -= 5 * RADIATION_SPEED_COEFFICIENT - src << "You feel weak." + to_chat(src, "You feel weak.") Weaken(3) if(!lying) emote("collapse") if(prob(5) && prob(100 * RADIATION_SPEED_COEFFICIENT) && species.get_bodytype() == SPECIES_HUMAN) //apes go bald if((h_style != "Bald" || f_style != "Shaved" )) - src << "Your hair falls out." + to_chat(src, "Your hair falls out.") h_style = "Bald" f_style = "Shaved" update_hair() @@ -312,7 +312,7 @@ if(prob(5)) take_overall_damage(0, 5 * RADIATION_SPEED_COEFFICIENT, used_weapon = "Radiation Burns") if(prob(1)) - src << "You feel strange!" + to_chat(src, "You feel strange!") adjustCloneLoss(5 * RADIATION_SPEED_COEFFICIENT) emote("gasp") @@ -484,7 +484,7 @@ if(exhaled_pp > safe_exhaled_max) if (!co2_alert|| prob(15)) var/word = pick("extremely dizzy","short of breath","faint","confused") - src << "You feel [word]." + to_chat(src, "You feel [word].") adjustOxyLoss(HUMAN_MAX_OXYLOSS) co2_alert = 1 @@ -493,7 +493,7 @@ else if(exhaled_pp > safe_exhaled_max * 0.7) if (!co2_alert || prob(1)) var/word = pick("dizzy","short of breath","faint","momentarily confused") - src << "You feel [word]." + to_chat(src, "You feel [word].") //scale linearly from 0 to 1 between safe_exhaled_max and safe_exhaled_max*0.7 var/ratio = 1.0 - (safe_exhaled_max - exhaled_pp)/(safe_exhaled_max*0.3) @@ -507,7 +507,7 @@ else if(exhaled_pp > safe_exhaled_max * 0.6) if (prob(0.3)) var/word = pick("a little dizzy","short of breath") - src << "You feel [word]." + to_chat(src, "You feel [word].") else co2_alert = 0 @@ -555,10 +555,10 @@ if(breath.temperature <= species.breath_cold_level_1) if(prob(20)) - src << "You feel your face freezing and icicles forming in your lungs!" + to_chat(src, "You feel your face freezing and icicles forming in your lungs!") else if(breath.temperature >= species.breath_heat_level_1) if(prob(20)) - src << "You feel your face burning and a searing heat in your lungs!" + to_chat(src, "You feel your face burning and a searing heat in your lungs!") if(breath.temperature >= species.breath_heat_level_1) if(breath.temperature < species.breath_heat_level_2) @@ -923,7 +923,7 @@ overeatduration -= 2 //doubled the unfat rate if(noisy == TRUE && nutrition < 250 && prob(10)) //VOREStation edit for hunger noises. - var/growlsound = pick(hunger_sounds) + var/sound/growlsound = sound(get_sfx("hunger_sounds")) var/growlmultiplier = 100 - (nutrition / 250 * 100) playsound(src, growlsound, vol = growlmultiplier, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) // VOREStation Edit End @@ -983,11 +983,11 @@ var/brainOxPercent = 0.015 //Default 1.5% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage if(CE_STABLE in chem_effects) brainOxPercent = 0.008 //Halved in effect - if(oxyloss >= 20 && prob(5)) + if(oxyloss >= (getMaxHealth() * 0.3) && prob(5)) // If oxyloss exceeds 30% of your max health, you can take brain damage. adjustBrainLoss(brainOxPercent * oxyloss) if(halloss >= species.total_health) - src << "You're in too much pain to keep going..." + to_chat(src, "You're in too much pain to keep going...") src.visible_message("[src] slumps to the ground, too weak to continue fighting.") Paralyse(10) setHalLoss(species.total_health - 1) @@ -1528,22 +1528,22 @@ stuttering = max(stuttering, 5) if(shock_stage == 40) - src << "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!" + to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") if (shock_stage >= 60) if(shock_stage == 60) emote("me",1,"'s body becomes limp.") if (prob(2)) - src << "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!" + to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") Weaken(20) if(shock_stage >= 80) if (prob(5)) - src << "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!" + to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") Weaken(20) if(shock_stage >= 120) if (prob(2)) - src << "[pick("You black out", "You feel like you could die any moment now", "You're about to lose consciousness")]!" + to_chat(src, "[pick("You black out", "You feel like you could die any moment now", "You are about to lose consciousness")]!") Paralyse(5) if(shock_stage == 150) @@ -1558,6 +1558,8 @@ var/temp = PULSE_NORM + var/brain_modifier = 1 + var/modifier_shift = 0 var/modifier_set @@ -1589,6 +1591,14 @@ var/obj/item/organ/internal/heart/Pump = internal_organs_by_name[O_HEART] + var/obj/item/organ/internal/brain/Control = internal_organs_by_name[O_BRAIN] + + if(Control) + brain_modifier = Control.get_control_efficiency() + + if(brain_modifier <= 0.7 && brain_modifier >= 0.4) // 70%-40% control, things start going weird as the brain is failing. + brain_modifier = rand(5, 15) / 10 + if(Pump) temp += Pump.standard_pulse_level - PULSE_NORM @@ -1616,7 +1626,7 @@ if(R.id in cheartstopper) //Conditional heart-stoppage if(R.volume >= R.overdose) temp = PULSE_NONE - return temp + return temp * brain_modifier //handles different chems' influence on pulse for(var/datum/reagent/R in reagents.reagent_list) if(R.id in bradycardics) @@ -1631,7 +1641,7 @@ if(R.volume >= R.overdose) temp = PULSE_NONE - return temp + return max(0, round(temp * brain_modifier)) /mob/living/carbon/human/proc/handle_heartbeat() if(pulse == PULSE_NONE) diff --git a/code/modules/mob/living/carbon/human/species/outsider/replicant.dm b/code/modules/mob/living/carbon/human/species/outsider/replicant.dm index 91658a48517..ec13e29908a 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/replicant.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/replicant.dm @@ -60,7 +60,9 @@ O_BRAIN = /obj/item/organ/internal/brain/replicant, O_EYES = /obj/item/organ/internal/eyes/replicant, O_AREJECT = /obj/item/organ/internal/immunehub/replicant, - O_VRLINK = /obj/item/organ/internal/brainmirror + O_VRLINK = /obj/item/organ/internal/brainmirror, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE = /obj/item/organ/internal/intestine ) /datum/species/shapeshifter/replicant/alpha @@ -95,7 +97,9 @@ O_AREJECT = /obj/item/organ/internal/immunehub/replicant, O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/replicant, O_ACID = /obj/item/organ/internal/xenos/acidgland/replicant, - O_VRLINK = /obj/item/organ/internal/brainmirror + O_VRLINK = /obj/item/organ/internal/brainmirror, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE = /obj/item/organ/internal/intestine ) /datum/species/shapeshifter/replicant/beta @@ -119,5 +123,7 @@ O_VENTC = /obj/item/organ/internal/metamorphgland/replicant, O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/replicant, O_RESIN = /obj/item/organ/internal/xenos/resinspinner/replicant, - O_VRLINK = /obj/item/organ/internal/brainmirror + O_VRLINK = /obj/item/organ/internal/brainmirror, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE = /obj/item/organ/internal/intestine ) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index c2bb8cafe4f..3a8c3b4f194 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -196,7 +196,9 @@ O_KIDNEYS = /obj/item/organ/internal/kidneys, O_BRAIN = /obj/item/organ/internal/brain, O_APPENDIX = /obj/item/organ/internal/appendix, - O_EYES = /obj/item/organ/internal/eyes + O_EYES = /obj/item/organ/internal/eyes, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE = /obj/item/organ/internal/intestine ) var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them. var/dispersed_eyes // If set, the species will be affected by flashbangs regardless if they have eyes or not, as they see in large areas. diff --git a/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm index 56b5c360354..cce1255c0b3 100644 --- a/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/human_subspecies.dm @@ -48,8 +48,11 @@ O_VOICE = /obj/item/organ/internal/voicebox, O_LIVER = /obj/item/organ/internal/liver, O_KIDNEYS = /obj/item/organ/internal/kidneys, + O_SPLEEN = /obj/item/organ/internal/spleen/minor, O_BRAIN = /obj/item/organ/internal/brain, - O_EYES = /obj/item/organ/internal/eyes + O_EYES = /obj/item/organ/internal/eyes, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE =/obj/item/organ/internal/intestine ) /* diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index a14db9d9f50..dea6b254fad 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -47,7 +47,7 @@ var/datum/species/shapeshifter/promethean/prometheans economic_modifier = 3 - //gluttonous = 1 // VOREStation Edit. Redundant feature. + gluttonous = 1 virus_immune = 1 blood_volume = 560 brute_mod = 0.75 @@ -74,7 +74,13 @@ var/datum/species/shapeshifter/promethean/prometheans genders = list(MALE, FEMALE, NEUTER, PLURAL) unarmed_types = list(/datum/unarmed_attack/slime_glomp) - has_organ = list(O_BRAIN = /obj/item/organ/internal/brain/slime) // Slime core. + + has_organ = list(O_BRAIN = /obj/item/organ/internal/brain/slime, + O_HEART = /obj/item/organ/internal/heart/grey/colormatch/slime, + O_REGBRUTE = /obj/item/organ/internal/regennetwork, + O_REGBURN = /obj/item/organ/internal/regennetwork/burn, + O_REGOXY = /obj/item/organ/internal/regennetwork/oxy, + O_REGTOX = /obj/item/organ/internal/regennetwork/tox) dispersed_eyes = TRUE @@ -168,15 +174,40 @@ var/datum/species/shapeshifter/promethean/prometheans H.adjustToxLoss(3 * heal_rate) // Tripled because 0.5 is miniscule, and fire_stacks are capped in both directions healing = FALSE + //Prometheans automatically clean every surface they're in contact with every life tick - this includes the floor without shoes. + //They gain nutrition from doing this. var/turf/T = get_turf(H) if(istype(T)) - var/obj/effect/decal/cleanable/C = locate() in T - if(C && !(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)))) - qdel(C) + if(!(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)))) + for(var/obj/O in T) + O.clean_blood() + H.nutrition = min(500, max(0, H.nutrition + rand(5, 15))) if (istype(T, /turf/simulated)) var/turf/simulated/S = T + T.clean_blood() S.dirt = 0 + H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + if(H.clean_blood(1)) H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + if(H.r_hand) + if(H.r_hand.clean_blood()) + H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + if(H.l_hand) + if(H.l_hand.clean_blood()) + H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + if(H.head) + if(H.head.clean_blood()) + H.update_inv_head(0) + H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + if(H.wear_suit) + if(H.wear_suit.clean_blood()) + H.update_inv_wear_suit(0) + H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + if(H.w_uniform) + if(H.w_uniform.clean_blood()) + H.update_inv_w_uniform(0) + H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + //End cleaning code. var/datum/gas_mixture/environment = T.return_air() var/pressure = environment.return_pressure() @@ -197,35 +228,71 @@ var/datum/species/shapeshifter/promethean/prometheans var/nutrition_cost = 0 // The total amount of nutrition drained every tick, when healing var/nutrition_debt = 0 // Holder variable used to store previous damage values prior to healing for use in the nutrition_cost equation. var/starve_mod = 1 // Lowering this lowers healing and increases agony multiplicatively. - if(H.nutrition <= 150) // This is when the icon goes red + + var/strain_negation = 0 // How much agony is being prevented by the + + if(H.nutrition <= 150) // This is when the icon goes red starve_mod = 0.75 if(H.nutrition <= 50) // Severe starvation. Damage repaired beyond this point will cause a stunlock if untreated. starve_mod = 0.5 + var/to_pay = 0 if(regen_brute) nutrition_debt = H.getBruteLoss() H.adjustBruteLoss(-heal_rate * starve_mod) - nutrition_cost += nutrition_debt - H.getBruteLoss() + + to_pay = nutrition_debt - H.getBruteLoss() + + nutrition_cost += to_pay + + var/obj/item/organ/internal/regennetwork/BrReg = H.internal_organs_by_name[O_REGBRUTE] + + if(BrReg) + strain_negation += to_pay * max(0, (1 - BrReg.get_strain_percent())) if(regen_burn) nutrition_debt = H.getFireLoss() H.adjustFireLoss(-heal_rate * starve_mod) - nutrition_cost += nutrition_debt - H.getFireLoss() + + to_pay = nutrition_debt - H.getFireLoss() + + nutrition_cost += to_pay + + var/obj/item/organ/internal/regennetwork/BuReg = H.internal_organs_by_name[O_REGBURN] + + if(BuReg) + strain_negation += to_pay * max(0, (1 - BuReg.get_strain_percent())) if(regen_oxy) nutrition_debt = H.getOxyLoss() H.adjustOxyLoss(-heal_rate * starve_mod) - nutrition_cost += nutrition_debt - H.getOxyLoss() + + to_pay = nutrition_debt - H.getOxyLoss() + + nutrition_cost += to_pay + + var/obj/item/organ/internal/regennetwork/OxReg = H.internal_organs_by_name[O_REGOXY] + + if(OxReg) + strain_negation += to_pay * max(0, (1 - OxReg.get_strain_percent())) if(regen_tox) nutrition_debt = H.getToxLoss() H.adjustToxLoss(-heal_rate * starve_mod) - nutrition_cost += nutrition_debt - H.getToxLoss() + + to_pay = nutrition_debt - H.getToxLoss() + + nutrition_cost += to_pay + + var/obj/item/organ/internal/regennetwork/ToxReg = H.internal_organs_by_name[O_REGTOX] + + if(ToxReg) + strain_negation += to_pay * max(0, (1 - ToxReg.get_strain_percent())) H.nutrition -= (3 * nutrition_cost) //Costs Nutrition when damage is being repaired, corresponding to the amount of damage being repaired. H.nutrition = max(0, H.nutrition) //Ensure it's not below 0. - var/agony_to_apply = ((1 / starve_mod) * nutrition_cost) //Regenerating damage causes minor pain over time. Small injures will be no issue, large ones will cause problems. + var/agony_to_apply = ((1 / starve_mod) * (nutrition_cost - strain_negation)) //Regenerating damage causes minor pain over time, if the organs responsible are nonexistant or too high on strain. Small injures will be no issue, large ones will cause problems. if((starve_mod <= 0.5 && (H.getHalLoss() + agony_to_apply) <= 90) || ((H.getHalLoss() + agony_to_apply) <= 70)) // Will max out at applying halloss at 70, unless they are starving; starvation regeneration will bring them up to a maximum of 120, the same amount of agony a human receives from three taser hits. H.apply_damage(agony_to_apply, HALLOSS) diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm index 6204f4d5ba6..b1aa9044214 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm @@ -1,6 +1,9 @@ /datum/species/shapeshifter/promethean min_age = 18 //Required for server rules max_age = 80 + push_flags = ~HEAVY + swap_flags = ~HEAVY + gluttonous = 0 valid_transform_species = list( "Human", "Unathi", "Tajara", "Skrell", "Diona", "Teshari", "Monkey","Sergal", diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index ae012790cc9..6e829897803 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -36,6 +36,7 @@ max_n2 = 0 minbodytemp = 0 maxbodytemp = 900 + movement_cooldown = 0 var/mob/living/carbon/human/humanform var/obj/item/organ/internal/nano/refactory/refactory @@ -200,7 +201,7 @@ target.forceMove(vore_selected) to_chat(target,"\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") -/mob/living/simple_mob/protean_blob/attack_hand(var/atom/A) //VORESTATION AI TEMPORARY REMOVAL (Marking this as such even though it was an edit.) +/mob/living/simple_mob/protean_blob/attack_target(var/atom/A) if(refactory && istype(A,/obj/item/stack/material)) var/obj/item/stack/material/S = A var/substance = S.material.name @@ -346,8 +347,7 @@ var/atom/reform_spot = blob.drop_location() //Size update - transform = matrix()*blob.size_multiplier - size_multiplier = blob.size_multiplier + resize(blob.size_multiplier, FALSE) //Move them back where the blob was forceMove(reform_spot) diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm index 3b7f99c8e71..4172a4be3b6 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm @@ -200,7 +200,7 @@ var/obj/item/stack/material/matstack = held var/substance = matstack.material.name - var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones. + var/list/edible_materials = list(MAT_STEEL, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_METALHYDROGEN) //Can't eat all materials, just useful ones. var allowed = FALSE for(var/material in edible_materials) if(material == substance) allowed = TRUE @@ -298,14 +298,14 @@ //Sizing up if(cost > 0) - if(refactory.use_stored_material("steel",cost)) + if(refactory.use_stored_material(MAT_STEEL,cost)) user.resize(size_factor) else to_chat(user,"That size change would cost [cost] steel, which you don't have.") //Sizing down (or not at all) else if(cost <= 0) cost = abs(cost) - var/actually_added = refactory.add_stored_material("steel",cost) + var/actually_added = refactory.add_stored_material(MAT_STEEL,cost) user.resize(size_factor) if(actually_added != cost) to_chat(user,"Unfortunately, [cost-actually_added] steel was lost due to lack of storage space.") diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm index 58f7ef5284d..0d2000fa01a 100755 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm @@ -1,5 +1,5 @@ #define DAM_SCALE_FACTOR 0.01 -#define METAL_PER_TICK 150 +#define METAL_PER_TICK 100 /datum/species/protean name = SPECIES_PROTEAN name_plural = "Proteans" @@ -17,7 +17,7 @@ flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_PAIN appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_UNDERWEAR | HAS_LIPS - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE health_hud_intensity = 2 num_alternate_languages = 3 assisted_langs = list(LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) @@ -30,9 +30,10 @@ blood_volume = 0 min_age = 18 max_age = 200 - brute_mod = 0.2 //Brute isn't very effective, they're made of dust - burn_mod = 2.0 //Burn, however, is + brute_mod = 1 + burn_mod = 1.4 oxy_mod = 0 + item_slowdown_mod = 1.33 cold_level_1 = 280 //Default 260 - Lower is better cold_level_2 = 220 //Default 200 @@ -42,8 +43,7 @@ heat_level_2 = 370 //Default 400 heat_level_3 = 600 //Default 1000 - //Space doesn't bother them - hazard_low_pressure = -1 + hazard_low_pressure = -1 //Space doesn't bother them hazard_high_pressure = 200 //They can cope with slightly higher pressure //Cold/heat does affect them, but it's done in special ways below @@ -56,11 +56,9 @@ body_temperature = 290 - siemens_coefficient = 3 //Very bad zappy times + siemens_coefficient = 1.5 //Very bad zappy times rarity_value = 5 - darksight = 3 // Equivalent to the minor trait - has_organ = list( O_BRAIN = /obj/item/organ/internal/mmi_holder/posibrain/nano, O_ORCH = /obj/item/organ/internal/nano/orchestrator, @@ -98,7 +96,8 @@ /mob/living/carbon/human/proc/shapeshifter_select_gender, /mob/living/carbon/human/proc/shapeshifter_select_wings, /mob/living/carbon/human/proc/shapeshifter_select_tail, - /mob/living/carbon/human/proc/shapeshifter_select_ears + /mob/living/carbon/human/proc/shapeshifter_select_ears, + /mob/living/proc/eat_trash ) var/global/list/abilities = list() @@ -161,7 +160,7 @@ return rgb(80,80,80,230) /datum/species/protean/handle_death(var/mob/living/carbon/human/H) - to_chat(H,"You died as a Protean. Please sit out of the round for at least 30 minutes before respawning, to represent the time it would take to ship a new-you to the station.") + to_chat(H,"You died as a Protean. Please sit out of the round for at least 60 minutes before respawning, to represent the time it would take to ship a new-you to the station.") spawn(1) //This spawn is here so that if the protean_blob calls qdel, it doesn't try to gib the humanform. if(H) H.gib() @@ -175,16 +174,20 @@ if(refactory && !(refactory.status & ORGAN_DEAD)) //MHydrogen adds speeeeeed - if(refactory.get_stored_material("mhydrogen") >= METAL_PER_TICK) + if(refactory.get_stored_material(MAT_METALHYDROGEN) >= METAL_PER_TICK) H.add_modifier(/datum/modifier/protean/mhydrogen, origin = refactory) - //Plasteel adds brute armor - if(refactory.get_stored_material("plasteel") >= METAL_PER_TICK) - H.add_modifier(/datum/modifier/protean/plasteel, origin = refactory) + //Uranium adds brute armor + if(refactory.get_stored_material(MAT_URANIUM) >= METAL_PER_TICK) + H.add_modifier(/datum/modifier/protean/uranium, origin = refactory) - //Diamond adds burn armor - if(refactory.get_stored_material("diamond") >= METAL_PER_TICK) - H.add_modifier(/datum/modifier/protean/diamond, origin = refactory) + //Gold adds burn armor + if(refactory.get_stored_material(MAT_GOLD) >= METAL_PER_TICK) + H.add_modifier(/datum/modifier/protean/gold, origin = refactory) + + //Silver adds darksight + if(refactory.get_stored_material(MAT_SILVER) >= METAL_PER_TICK) + H.add_modifier(/datum/modifier/protean/silver, origin = refactory) return ..() @@ -246,31 +249,43 @@ on_created_text = "You feel yourself accelerate, the metallic hydrogen increasing your speed temporarily." on_expired_text = "Your refactory finishes consuming the metallic hydrogen, and you return to normal speed." - material_name = "mhydrogen" + material_name = MAT_METALHYDROGEN slowdown = -1 -/datum/modifier/protean/plasteel - name = "Protean Effect - Plasteel" - desc = "You're affected by the presence of plasteel." +/datum/modifier/protean/uranium + name = "Protean Effect - Uranium" + desc = "You're affected by the presence of uranium." - on_created_text = "You feel yourself become nearly impervious to physical attacks as plasteel nanites are made." - on_expired_text = "Your refactory finishes consuming the plasteel, and you return to your normal nanites." + on_created_text = "You feel yourself become nearly impervious to physical attacks as uranium is incorporated in your nanites." + on_expired_text = "Your refactory finishes consuming the uranium, and you return to your normal nanites." - material_name = "plasteel" + material_name = MAT_URANIUM - incoming_brute_damage_percent = 0.5 + incoming_brute_damage_percent = 0.8 -/datum/modifier/protean/diamond - name = "Protean Effect - Diamond" - desc = "You're affected by the presence of diamond." +/datum/modifier/protean/gold + name = "Protean Effect - Gold" + desc = "You're affected by the presence of gold." on_created_text = "You feel yourself become more reflective, able to resist heat and fire better for a time." - on_expired_text = "Your refactory finishes consuming the diamond, and you return to your normal nanites." + on_expired_text = "Your refactory finishes consuming the gold, and you return to your normal nanites." - material_name = "diamond" + material_name = MAT_GOLD - incoming_fire_damage_percent = 0.2 + incoming_fire_damage_percent = 0.8 + +/datum/modifier/protean/silver + name = "Protean Effect - Silver" + desc = "You're affected by the presence of silver." + + on_created_text = "Your physical control is improved for a time, making it easier to hit targets, and avoid being hit." + on_expired_text = "Your refactory finishes consuming the silver, and your motor control returns to normal." + + material_name = MAT_SILVER + + accuracy = 30 + evasion = 30 /datum/modifier/protean/steel name = "Protean Effect - Steel" @@ -279,10 +294,9 @@ on_created_text = "You feel new nanites being produced from your stockpile of steel, healing you slowly." on_expired_text = "Your steel supply has either run out, or is no longer needed, and your healing stops." - material_name = "steel" + material_name = MAT_STEEL /datum/modifier/protean/steel/tick() - ..() holder.adjustBruteLoss(-10,include_robo = TRUE) //Looks high, but these ARE modified by species resistances, so this is really 20% of this holder.adjustFireLoss(-1,include_robo = TRUE) //And this is really double this var/mob/living/carbon/human/H = holder diff --git a/code/modules/mob/living/carbon/human/species/station/seromi.dm b/code/modules/mob/living/carbon/human/species/station/seromi.dm index 0dfda17a282..045779bddcf 100644 --- a/code/modules/mob/living/carbon/human/species/station/seromi.dm +++ b/code/modules/mob/living/carbon/human/species/station/seromi.dm @@ -110,7 +110,9 @@ O_LIVER = /obj/item/organ/internal/liver, O_KIDNEYS = /obj/item/organ/internal/kidneys, O_BRAIN = /obj/item/organ/internal/brain, - O_EYES = /obj/item/organ/internal/eyes + O_EYES = /obj/item/organ/internal/eyes, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE = /obj/item/organ/internal/intestine ) unarmed_types = list( diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 6a58cb2d08a..7c02077f4d9 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -25,6 +25,20 @@ spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR + has_organ = list( + O_HEART = /obj/item/organ/internal/heart, + O_LUNGS = /obj/item/organ/internal/lungs, + O_VOICE = /obj/item/organ/internal/voicebox, + O_LIVER = /obj/item/organ/internal/liver, + O_KIDNEYS = /obj/item/organ/internal/kidneys, + O_BRAIN = /obj/item/organ/internal/brain, + O_APPENDIX = /obj/item/organ/internal/appendix, + O_SPLEEN = /obj/item/organ/internal/spleen, + O_EYES = /obj/item/organ/internal/eyes, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE = /obj/item/organ/internal/intestine + ) + inherent_verbs = list( /mob/living/carbon/human/proc/tie_hair) @@ -122,6 +136,8 @@ O_LIVER = /obj/item/organ/internal/liver/unathi, O_BRAIN = /obj/item/organ/internal/brain/unathi, O_EYES = /obj/item/organ/internal/eyes, + O_STOMACH = /obj/item/organ/internal/stomach/unathi, + O_INTESTINE = /obj/item/organ/internal/intestine/unathi ) @@ -228,7 +244,9 @@ O_LIVER = /obj/item/organ/internal/liver, O_KIDNEYS = /obj/item/organ/internal/kidneys, O_BRAIN = /obj/item/organ/internal/brain, - O_EYES = /obj/item/organ/internal/eyes + O_EYES = /obj/item/organ/internal/eyes, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE = /obj/item/organ/internal/intestine ) /datum/species/tajaran/equip_survival_gear(var/mob/living/carbon/human/H) @@ -384,7 +402,9 @@ O_LIVER = /obj/item/organ/internal/liver, O_KIDNEYS = /obj/item/organ/internal/kidneys, O_BRAIN = /obj/item/organ/internal/brain, - O_EYES = /obj/item/organ/internal/eyes + O_EYES = /obj/item/organ/internal/eyes, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE =/obj/item/organ/internal/intestine ) descriptors = list( diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm index cb41200b707..7599d6f6db8 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm @@ -64,7 +64,9 @@ O_LIVER = /obj/item/organ/internal/liver, O_KIDNEYS = /obj/item/organ/internal/kidneys, O_BRAIN = /obj/item/organ/internal/brain, - O_EYES = /obj/item/organ/internal/eyes + O_EYES = /obj/item/organ/internal/eyes, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE = /obj/item/organ/internal/intestine ) flesh_color = "#AFA59E" @@ -382,3 +384,63 @@ H.eye_blurry = 5 H.shock_stage = min(H.shock_stage + coldshock, 160) //cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage. return + +/datum/species/werebeast + name = SPECIES_WEREBEAST + name_plural = "Werebeasts" + icobase = 'icons/mob/human_races/r_werebeast.dmi' + deform = 'icons/mob/human_races/r_def_werebeast.dmi' + icon_template = 'icons/mob/human_races/r_werebeast.dmi' + tail = "tail" + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + total_health = 200 + brute_mod = 0.85 + burn_mod = 0.85 + metabolic_rate = 2 + item_slowdown_mod = 0.25 + hunger_factor = 0.4 + darksight = 8 + mob_size = MOB_LARGE + num_alternate_languages = 3 + secondary_langs = list(LANGUAGE_CANILUNZT) + name_language = LANGUAGE_CANILUNZT + primitive_form = "Wolpin" + color_mult = 1 + + min_age = 18 + max_age = 200 + + blurb = "Big buff werewolves. These are a limited functionality event species that are not balanced for regular gameplay. Adminspawn only." + + wikilink="N/A" + + catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin) + + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE + appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR + inherent_verbs = list( + /mob/living/proc/shred_limb, + /mob/living/proc/eat_trash) + + flesh_color = "#AFA59E" + base_color = "#777777" + + heat_discomfort_strings = list( + "Your fur prickles in the heat.", + "You feel uncomfortably warm.", + "Your overheated skin itches." + ) + + has_limbs = list( + BP_TORSO = list("path" = /obj/item/organ/external/chest), + BP_GROIN = list("path" = /obj/item/organ/external/groin), + BP_HEAD = list("path" = /obj/item/organ/external/head/vr/werebeast), + BP_L_ARM = list("path" = /obj/item/organ/external/arm), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), + BP_L_LEG = list("path" = /obj/item/organ/external/leg), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), + BP_L_HAND = list("path" = /obj/item/organ/external/hand), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) + ) diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm index 2398a032bb2..9bf2c932ec6 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm @@ -59,16 +59,6 @@ autohiss_exempt = list("Siik")) excludes = list(/datum/trait/autohiss_unathi) -/datum/trait/autohiss_awootism - name = "Autohiss (Disability)" - desc = "You can't speak r's and l's properly." - cost = 0 - var_changes = list( - autohiss_basic_map = list( - "l" = list("w", "ww"), - "r" = list("w", "ww") - )) - /datum/trait/bloodsucker name = "Bloodsucker" desc = "Makes you unable to gain nutrition from anything but blood. To compenstate, you get fangs that can be used to drain blood from prey." diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index cc7cd7ef85f..20255bbae9c 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -22,20 +22,20 @@ var/obj/item/organ/internal/xenos/plasmavessel/P = internal_organs_by_name[O_PLASMA] if(!istype(P)) - src << "Your plasma vessel has been removed!" + to_chat(src, "Your plasma vessel has been removed!") return if(needs_organ) var/obj/item/organ/internal/I = internal_organs_by_name[needs_organ] if(!I) - src << "Your [needs_organ] has been removed!" + to_chat(src, "Your [needs_organ] has been removed!") return else if((I.status & ORGAN_CUT_AWAY) || I.is_broken()) - src << "Your [needs_organ] is too damaged to function!" + to_chat(src, "Your [needs_organ] is too damaged to function!") return if(P.stored_plasma < cost) - src << "You don't have enough phoron stored to do that." + to_chat(src, "You don't have enough phoron stored to do that.") return 0 if(needs_foundation) @@ -46,7 +46,7 @@ if(!(istype(T,/turf/space))) has_foundation = 1 if(!has_foundation) - src << "You need a solid foundation to do that on." + to_chat(src, "You need a solid foundation to do that on.") return 0 P.stored_plasma -= cost @@ -59,12 +59,12 @@ set category = "Abilities" if (get_dist(src,M) <= 1) - src << "You need to be closer." + to_chat(src, "You need to be closer.") return var/obj/item/organ/internal/xenos/plasmavessel/I = M.internal_organs_by_name[O_PLASMA] if(!istype(I)) - src << "Their plasma vessel is missing." + to_chat(src, "Their plasma vessel is missing.") return var/amount = input("Amount:", "Transfer Plasma to [M]") as num @@ -73,7 +73,7 @@ if(check_alien_ability(amount,0,O_PLASMA)) M.gain_plasma(amount) M << "[src] has transfered [amount] plasma to you." - src << "You have transferred [amount] plasma to [M]." + to_chat(src, "You have transferred [amount] plasma to [M].") return // Queen verbs. @@ -84,12 +84,12 @@ set category = "Abilities" if(!config.aliens_allowed) - src << "You begin to lay an egg, but hesitate. You suspect it isn't allowed." + to_chat(src, "You begin to lay an egg, but hesitate. You suspect it isn't allowed.") verbs -= /mob/living/carbon/human/proc/lay_egg return if(locate(/obj/effect/alien/egg) in get_turf(src)) - src << "There's already an egg here." + to_chat(src, "There's already an egg here.") return if(check_alien_ability(75,1,O_EGG)) @@ -105,7 +105,7 @@ set category = "Abilities" if(alien_queen_exists()) - src << "We already have an active queen." + to_chat(src, "We already have an active queen.") return if(check_alien_ability(500)) @@ -121,7 +121,9 @@ if(check_alien_ability(50,1,O_RESIN)) visible_message("[src] has planted some alien weeds!") - new /obj/effect/alien/weeds/node(loc) + var/obj/O = new /obj/effect/alien/weeds/node(loc) + if(O) + O.color = "#321D37" return /mob/living/carbon/human/proc/Spit(var/atom/A) @@ -154,7 +156,7 @@ set category = "Abilities" if(!O in oview(1)) - src << "[O] is too far away." + to_chat(src, "[O] is too far away.") return // OBJ CHECK @@ -175,7 +177,7 @@ cannot_melt = 1 if(cannot_melt) - src << "You cannot dissolve this object." + to_chat(src, "You cannot dissolve this object.") return if(check_alien_ability(200,0,O_ACID)) @@ -231,7 +233,7 @@ set desc = "Secrete tough malleable resin." set category = "Abilities" - var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin door","resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist + var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin door","resin wall","resin membrane","resin nest","resin blob") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist if(!choice) return @@ -239,15 +241,24 @@ return visible_message("[src] vomits up a thick purple substance and begins to shape it!", "You shape a [choice].") + + var/obj/O + switch(choice) if("resin door") - new /obj/structure/simple_door/resin(loc) + O = new /obj/structure/simple_door/resin(loc) if("resin wall") - new /obj/effect/alien/resin/wall(loc) + O = new /obj/effect/alien/resin/wall(loc) if("resin membrane") - new /obj/effect/alien/resin/membrane(loc) + O = new /obj/effect/alien/resin/membrane(loc) if("resin nest") - new /obj/structure/bed/nest(loc) + O = new /obj/structure/bed/nest(loc) + if("resin blob") + O = new /obj/item/stack/material/resin(loc) + + if(O) + O.color = "#321D37" + return /mob/living/carbon/human/proc/leap() @@ -259,7 +270,7 @@ return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) - src << "You cannot leap in your current state." + to_chat(src, "You cannot leap in your current state.") return var/list/choices = list() @@ -278,7 +289,7 @@ return if(stat || paralysis || stunned || weakened || lying || restrained() || buckled) - src << "You cannot leap in your current state." + to_chat(src, "You cannot leap in your current state.") return last_special = world.time + 75 @@ -293,7 +304,7 @@ if(status_flags & LEAPING) status_flags &= ~LEAPING if(!src.Adjacent(T)) - src << "You miss!" + to_chat(src, "You miss!") return T.Weaken(3) @@ -301,7 +312,7 @@ var/use_hand = "left" if(l_hand) if(r_hand) - src << "You need to have one hand free to grab someone." + to_chat(src, "You need to have one hand free to grab someone.") return else use_hand = "right" @@ -327,16 +338,16 @@ return if(stat || paralysis || stunned || weakened || lying) - src << "You cannot do that in your current state." + to_chat(src, "You cannot do that in your current state.") return var/obj/item/weapon/grab/G = locate() in src if(!G || !istype(G)) - src << "You are not grabbing anyone." + to_chat(src, "You are not grabbing anyone.") return if(G.state < GRAB_AGGRESSIVE) - src << "You must have an aggressive grab to gut your prey!" + to_chat(src, "You must have an aggressive grab to gut your prey!") return last_special = world.time + 50 diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm index 1d2ce593071..9e2a9494022 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm @@ -51,7 +51,9 @@ O_BRAIN = /obj/item/organ/internal/brain/xeno, O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel, O_HIVE = /obj/item/organ/internal/xenos/hivenode, - O_NUTRIENT = /obj/item/organ/internal/diona/nutrients + O_NUTRIENT = /obj/item/organ/internal/diona/nutrients, + O_STOMACH = /obj/item/organ/internal/stomach/xeno, + O_INTESTINE = /obj/item/organ/internal/intestine/xeno ) bump_flag = ALIEN @@ -64,17 +66,17 @@ var/weeds_plasma_rate = 5 // Plasma regen on weeds. has_limbs = list( - BP_TORSO = list("path" = /obj/item/organ/external/chest), - BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/no_eyes), - BP_L_ARM = list("path" = /obj/item/organ/external/arm), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), - BP_L_LEG = list("path" = /obj/item/organ/external/leg), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), - BP_L_HAND = list("path" = /obj/item/organ/external/hand), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) + BP_TORSO = list("path" = /obj/item/organ/external/chest/unseverable/xeno), + BP_GROIN = list("path" = /obj/item/organ/external/groin/unseverable/xeno), + BP_HEAD = list("path" = /obj/item/organ/external/head/unseverable/xeno), + BP_L_ARM = list("path" = /obj/item/organ/external/arm/unseverable/xeno), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unseverable/xeno), + BP_L_LEG = list("path" = /obj/item/organ/external/leg/unseverable/xeno), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/unseverable/xeno), + BP_L_HAND = list("path" = /obj/item/organ/external/hand/unseverable/xeno), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unseverable/xeno), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/unseverable/xeno), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unseverable/xeno) ) /datum/species/xenos/get_bodytype() @@ -134,7 +136,7 @@ H.adjustOxyLoss(-heal_rate) H.adjustToxLoss(-heal_rate) if (prob(5)) - H << "You feel a soothing sensation come over you..." + H << "You feel a soothing sensation come over you..." return 1 //next internal organs @@ -142,7 +144,7 @@ if(I.damage > 0) I.damage = max(I.damage - heal_rate, 0) if (prob(5)) - H << "You feel a soothing sensation within your [I.parent_organ]..." + H << "You feel a soothing sensation within your [I.parent_organ]..." return 1 //next mend broken bones, approx 10 ticks each @@ -150,7 +152,7 @@ if (E.status & ORGAN_BROKEN) if (prob(mend_prob)) if (E.mend_fracture()) - H << "You feel something mend itself inside your [E.name]." + H << "You feel something mend itself inside your [E.name]." return 1 return 0 @@ -182,7 +184,9 @@ O_ACID = /obj/item/organ/internal/xenos/acidgland, O_HIVE = /obj/item/organ/internal/xenos/hivenode, O_RESIN = /obj/item/organ/internal/xenos/resinspinner, - O_NUTRIENT = /obj/item/organ/internal/diona/nutrients + O_NUTRIENT = /obj/item/organ/internal/diona/nutrients, + O_STOMACH = /obj/item/organ/internal/stomach/xeno, + O_INTESTINE = /obj/item/organ/internal/intestine/xeno ) inherent_verbs = list( @@ -218,7 +222,9 @@ O_BRAIN = /obj/item/organ/internal/brain/xeno, O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/hunter, O_HIVE = /obj/item/organ/internal/xenos/hivenode, - O_NUTRIENT = /obj/item/organ/internal/diona/nutrients + O_NUTRIENT = /obj/item/organ/internal/diona/nutrients, + O_STOMACH = /obj/item/organ/internal/stomach/xeno, + O_INTESTINE = /obj/item/organ/internal/intestine/xeno ) inherent_verbs = list( @@ -247,7 +253,9 @@ O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/sentinel, O_ACID = /obj/item/organ/internal/xenos/acidgland, O_HIVE = /obj/item/organ/internal/xenos/hivenode, - O_NUTRIENT = /obj/item/organ/internal/diona/nutrients + O_NUTRIENT = /obj/item/organ/internal/diona/nutrients, + O_STOMACH = /obj/item/organ/internal/stomach/xeno, + O_INTESTINE = /obj/item/organ/internal/intestine/xeno ) inherent_verbs = list( @@ -284,7 +292,9 @@ O_ACID = /obj/item/organ/internal/xenos/acidgland, O_HIVE = /obj/item/organ/internal/xenos/hivenode, O_RESIN = /obj/item/organ/internal/xenos/resinspinner, - O_NUTRIENT = /obj/item/organ/internal/diona/nutrients + O_NUTRIENT = /obj/item/organ/internal/diona/nutrients, + O_STOMACH = /obj/item/organ/internal/stomach/xeno, + O_INTESTINE = /obj/item/organ/internal/intestine/xeno ) inherent_verbs = list( diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index f3526983ef7..43a5ae66f24 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -25,18 +25,18 @@ var/global/list/sparring_attack_cache = list() /datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) if(user.restrained()) - return 0 + return FALSE // Check if they have a functioning hand. var/obj/item/organ/external/E = user.organs_by_name["l_hand"] if(E && !E.is_stump()) - return 1 + return TRUE E = user.organs_by_name["r_hand"] if(E && !E.is_stump()) - return 1 + return TRUE - return 0 + return FALSE /datum/unarmed_attack/proc/get_unarmed_damage() return damage @@ -105,6 +105,9 @@ var/global/list/sparring_attack_cache = list() return user.visible_message("[user] attempts to press [TU.his] [eye_attack_text] into [target]'s eyes, but [TT.he] [TT.does]n't have any!") +/datum/unarmed_attack/proc/unarmed_override(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/zone) + return FALSE //return true if the unarmed override prevents further attacks + /datum/unarmed_attack/bite attack_verb = list("bit") attack_sound = 'sound/weapons/bite.ogg' @@ -121,7 +124,7 @@ var/global/list/sparring_attack_cache = list() return 0 if (user == target && (zone == BP_HEAD || zone == O_EYES || zone == O_MOUTH)) return 0 - return 1 + return TRUE /datum/unarmed_attack/punch attack_verb = list("punched") @@ -187,20 +190,20 @@ var/global/list/sparring_attack_cache = list() /datum/unarmed_attack/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) if (user.legcuffed) - return 0 + return FALSE if(!(zone in list("l_leg", "r_leg", "l_foot", "r_foot", BP_GROIN))) - return 0 + return FALSE var/obj/item/organ/external/E = user.organs_by_name["l_foot"] if(E && !E.is_stump()) - return 1 + return TRUE E = user.organs_by_name["r_foot"] if(E && !E.is_stump()) - return 1 + return TRUE - return 0 + return FALSE /datum/unarmed_attack/kick/get_unarmed_damage(var/mob/living/carbon/human/user) var/obj/item/clothing/shoes = user.shoes @@ -231,23 +234,23 @@ var/global/list/sparring_attack_cache = list() /datum/unarmed_attack/stomp/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) if (user.legcuffed) - return 0 + return FALSE if(!istype(target)) - return 0 + return FALSE if (!user.lying && (target.lying || (zone in list("l_foot", "r_foot")))) if(target.grabbed_by == user && target.lying) - return 0 + return FALSE var/obj/item/organ/external/E = user.organs_by_name["l_foot"] if(E && !E.is_stump()) - return 1 + return TRUE E = user.organs_by_name["r_foot"] if(E && !E.is_stump()) - return 1 + return TRUE - return 0 + return FALSE /datum/unarmed_attack/stomp/get_unarmed_damage(var/mob/living/carbon/human/user) var/obj/item/clothing/shoes = user.shoes diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 249bfb5a91d..b6f9aa35ec9 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -246,7 +246,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() for(var/organ_tag in species.has_limbs) var/obj/item/organ/external/part = organs_by_name[organ_tag] - if(isnull(part) || part.is_stump()) + if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff. icon_key += "0" continue if(part) @@ -289,13 +289,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() base_icon = chest.get_icon() for(var/obj/item/organ/external/part in organs) - if(isnull(part) || part.is_stump()) + if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff. continue var/icon/temp = part.get_icon(skeleton) //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) if(part.icon_position & (LEFT | RIGHT)) - var/icon/temp2 = new('icons/mob/human.dmi',"blank") + var/icon/temp2 = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank") //VOREStation Edit. temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH) temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH) if(!(part.icon_position & LEFT)) @@ -440,8 +440,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() // VOREStation Edit - START var/icon/ears_s = get_ears_overlay() - if (ears_s) + if(ears_s) face_standing.Blend(ears_s, ICON_OVERLAY) + if(istype(head_organ,/obj/item/organ/external/head/vr)) + var/obj/item/organ/external/head/vr/head_organ_vr = head_organ + overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ_vr.head_offset) + apply_layer(HAIR_LAYER) + return // VOREStation Edit - END if(head_organ.nonsolid) @@ -576,7 +581,15 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return //Wearing a suit that prevents uniform rendering //Build a uniform sprite - overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = INV_W_UNIFORM_DEF_ICON, default_layer = UNIFORM_LAYER) + //VOREStation Edit start. + var/icon/c_mask = null + if(tail_style && tail_style.clip_mask_icon && tail_style.clip_mask_state) + var/obj/item/clothing/suit/S = wear_suit + if(!(wear_suit && ((wear_suit.flags_inv & HIDETAIL) || (istype(S) && S.taurized)))) //Clip the lower half of the uniform off using the tail's clip mask. + c_mask = new /icon(tail_style.clip_mask_icon, tail_style.clip_mask_state) + overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = INV_W_UNIFORM_DEF_ICON, default_layer = UNIFORM_LAYER, clip_mask = c_mask) + //VOREStation Edit end. + apply_layer(UNIFORM_LAYER) /mob/living/carbon/human/update_inv_wear_id() @@ -658,6 +671,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!shoes || (wear_suit && wear_suit.flags_inv & HIDESHOES) || (w_uniform && w_uniform.flags_inv & HIDESHOES)) return //Either nothing to draw, or it'd be hidden. + //VOREStation Edit + for(var/f in list(BP_L_FOOT, BP_R_FOOT)) + var/obj/item/organ/external/foot/foot = get_organ(f) + if(istype(foot) && foot.is_hidden_by_tail()) //If either foot is hidden by the tail, don't render footwear. + return + //Allow for shoe layer toggle nonsense var/shoe_layer = SHOES_LAYER if(istype(shoes, /obj/item/clothing/shoes)) @@ -741,12 +760,21 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() // Part of splitting the suit sprites up var/iconFile = INV_SUIT_DEF_ICON + var/obj/item/clothing/suit/S //VOREStation edit - break this var out a level for use below. if(istype(wear_suit, /obj/item/clothing/suit)) - var/obj/item/clothing/suit/S = wear_suit + S = wear_suit if(S.update_icon_define) iconFile = S.update_icon_define - overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = iconFile, default_layer = SUIT_LAYER) + //VOREStation Edit start. + var/icon/c_mask = null + var/tail_is_rendered = (overlays_standing[TAIL_LAYER] || overlays_standing[TAIL_LAYER_ALT]) + var/valid_clip_mask = (tail_style && tail_style.clip_mask_icon && tail_style.clip_mask_state) + + if(tail_is_rendered && valid_clip_mask && !(S && S.taurized)) //Clip the lower half of the suit off using the tail's clip mask for taurs since taur bodies aren't hidden. + c_mask = new /icon(tail_style.clip_mask_icon, tail_style.clip_mask_state) + overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = iconFile, default_layer = SUIT_LAYER, clip_mask = c_mask) + //VOREStation Edit end. apply_layer(SUIT_LAYER) @@ -921,7 +949,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() var/t_state = "[species.get_tail(src)]_once" var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // VOREStation Edit - Alt Tail Layer - + var/image/tail_overlay = overlays_standing[used_tail_layer] // VOREStation Edit - Alt Tail Layer if(tail_overlay && tail_overlay.icon_state == t_state) return //let the existing animation finish @@ -931,7 +959,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() spawn(20) //check that the animation hasn't changed in the meantime if(overlays_standing[used_tail_layer] == tail_overlay && tail_overlay.icon_state == t_state) // VOREStation Edit - Alt Tail Layer - animate_tail_stop() + animate_tail_stop() /mob/living/carbon/human/proc/animate_tail_start() if(QDESTROYING(src)) @@ -972,7 +1000,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(vr_wing_image) vr_wing_image.layer = BODY_LAYER+WING_LAYER overlays_standing[WING_LAYER] = vr_wing_image - + apply_layer(WING_LAYER) // VOREStation Edit end diff --git a/code/modules/mob/living/carbon/metroid/emote.dm b/code/modules/mob/living/carbon/metroid/emote.dm index 6375f23b2a3..6fccaddb8f3 100644 --- a/code/modules/mob/living/carbon/metroid/emote.dm +++ b/code/modules/mob/living/carbon/metroid/emote.dm @@ -16,7 +16,7 @@ return if (src.client) if (client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." + to_chat(src, "You cannot send IC messages (muted).") return if (stat) return @@ -83,10 +83,10 @@ updateicon = 1 if ("help") //This is an exception - src << "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate. You can also set your face with: \n\nnomood, pout, sad, angry, frown, smile" + to_chat(src, "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate. You can also set your face with: \n\nnomood, pout, sad, angry, frown, smile") else - src << "Unusable emote '[act]'. Say *help for a list." + to_chat(src, "Unusable emote '[act]'. Say *help for a list.") if ((message && src.stat == 0)) if (m_type & 1) for(var/mob/O in viewers(src, null)) diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index 5cf6395b7d6..f11d9d137de 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -149,7 +149,7 @@ nutrition = 0 adjustToxLoss(rand(1,3)) if (client && prob(5)) - src << "You are starving!" + to_chat(src, "You are starving!") else if (nutrition >= get_grow_nutrition() && amount_grown < 10) nutrition -= 20 diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm index 54d35a71f8c..a1fc03445ed 100644 --- a/code/modules/mob/living/carbon/metroid/powers.dm +++ b/code/modules/mob/living/carbon/metroid/powers.dm @@ -4,7 +4,7 @@ return if (Victim) - src << "I am already feeding..." + to_chat(src, "I am already feeding...") return var t = invalidFeedTarget(M) @@ -52,7 +52,7 @@ Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12)) else - src << "[pick("This subject is incompatable", "This subject does not have a life energy", "This subject is empty", "I am not satisified", "I can not feed from this subject", "I do not feel nourished", "This subject is not food")]..." + to_chat(src, "[pick("This subject is incompatable", "This subject does not have a life energy", "This subject is empty", "I am not satisified", "I can not feed from this subject", "I do not feel nourished", "This subject is not food")]...") Feedstop() break @@ -92,7 +92,7 @@ ++Friends[Victim.LAssailant] else - src << "This subject does not have a strong enough life energy anymore..." + to_chat(src, "This subject does not have a strong enough life energy anymore...") Victim = null @@ -111,7 +111,7 @@ set desc = "This will let you evolve from baby to adult slime." if(stat) - src << "I must be conscious to do this..." + to_chat(src, "I must be conscious to do this...") return if(!is_adult) @@ -122,22 +122,22 @@ regenerate_icons() name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])") else - src << "I am not ready to evolve yet..." + to_chat(src, "I am not ready to evolve yet...") else - src << "I have already evolved..." + to_chat(src, "I have already evolved...") /mob/living/carbon/slime/verb/Reproduce() set category = "Slime" set desc = "This will make you split into four Slimes." if(stat) - src << "I must be conscious to do this..." + to_chat(src, "I must be conscious to do this...") return if(is_adult) if(amount_grown >= 10) if(stat) - src << "I must be conscious to do this..." + to_chat(src, "I must be conscious to do this...") return var/list/babies = list() @@ -163,6 +163,6 @@ new_slime.key = src.key qdel(src) else - src << "I am not ready to reproduce yet..." + to_chat(src, "I am not ready to reproduce yet...") else - src << "I am not old enough to reproduce yet..." + to_chat(src, "I am not old enough to reproduce yet...") diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm index 1607559336e..248fe5c6a6e 100644 --- a/code/modules/mob/living/carbon/resist.dm +++ b/code/modules/mob/living/carbon/resist.dm @@ -135,7 +135,7 @@ update_inv_handcuffed() /mob/living/carbon/proc/break_legcuffs() - src << "You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)" + to_chat(src, "You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)") visible_message("[src] is trying to break the legcuffs!") if(do_after(src, 5 SECONDS, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED)) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 37d9e43b379..55bddfe1bd4 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -26,6 +26,9 @@ if(COLD_RESISTANCE in mutations) damage = 0 adjustFireLoss(damage * blocked) + if(SEARING) + apply_damage(damage / 3, BURN, def_zone, blocked, soaked, used_weapon, sharp, edge) + apply_damage(damage / 3 * 2, BRUTE, def_zone, blocked, soaked, used_weapon, sharp, edge) if(TOX) adjustToxLoss(damage * blocked) if(OXY) diff --git a/code/modules/mob/living/default_language.dm b/code/modules/mob/living/default_language.dm index b9eae4b5a1a..f5388f47359 100644 --- a/code/modules/mob/living/default_language.dm +++ b/code/modules/mob/living/default_language.dm @@ -17,9 +17,9 @@ to_chat(src, "You are unable to speak that language.") return - src << "You will now speak [language] if you do not specify a language when speaking." + to_chat(src, "You will now speak [language] if you do not specify a language when speaking.") else - src << "You will now speak whatever your standard default language is if you do not specify one when speaking." + to_chat(src, "You will now speak whatever your standard default language is if you do not specify one when speaking.") default_language = language // Silicons can't neccessarily speak everything in their languages list @@ -31,6 +31,6 @@ set category = "IC" if(default_language) - src << "You are currently speaking [default_language] by default." + to_chat(src, "You are currently speaking [default_language] by default.") else - src << "Your current default language is your species or mob type default." + to_chat(src, "Your current default language is your species or mob type default.") diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9e618ba85cb..ff04da63e0d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1048,6 +1048,14 @@ default behaviour is: else to_chat(src, "You feel nauseous...") + if(ishuman(src)) + var/mob/living/carbon/human/Hu = src + if(CE_ANTACID in Hu.chem_effects) + if(prob(min(90, Hu.chem_effects[CE_ANTACID] * 15))) + spawn(rand(30 SECONDS, 2 MINUTES)) + lastpuke = FALSE + return + spawn() if(!skip_wait) sleep(150) //15 seconds until second warning @@ -1060,7 +1068,7 @@ default behaviour is: var/mob/living/carbon/human/H = src if(!H.isSynthetic()) var/obj/item/organ/internal/liver/L = H.internal_organs_by_name["liver"] - if(L.is_broken()) + if(!L || L.is_broken()) blood_vomit = 1 Stun(5) @@ -1281,6 +1289,7 @@ default behaviour is: var/turf/end_T = get_turf(target) if(end_T) add_attack_logs(src,M,"Thrown via grab to [end_T.x],[end_T.y],[end_T.z]") + src.drop_from_inventory(G) src.drop_from_inventory(item) if(!item || !isturf(item.loc)) @@ -1363,30 +1372,3 @@ default behaviour is: BRAIN:[getBrainLoss()] "} -//VOREStation edit, allows for custom say verbs -/mob/living/verb/customsay() - set category = "IC" - set name = "Customise Say Verbs" - set desc = "Customise the text which appears when you type- e.g. 'says', 'asks', 'exclaims'." - - if(src.client && src.client.holder) - var/customsaylist[] = list( - "Say", - "Whisper", - "Ask (?)", - "Exclaim/Shout/Yell (!)", - "Cancel" - ) - var/sayselect = input("Which say-verb do you wish to customise?") as null|anything in customsaylist //we can't use alert() for this because there's too many terms - - if(sayselect == "Say") - custom_say = sanitize(input(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null) as text) - else if(sayselect == "Whisper") - custom_whisper = sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [src] whispers, \"Hi...\"", "Custom Whisper", null) as text) - else if(sayselect == "Ask (?)") - custom_ask = sanitize(input(usr, "This word or phrase will appear instead of 'asks': [src] asks, \"Hi?\"", "Custom Ask", null) as text) - else if(sayselect == "Exclaim/Shout/Yell (!)") - custom_exclaim = sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [src] exclaims, \"Hi!\"", "Custom Exclaim", null) as text) - else - return - //VOREStation edit ends \ No newline at end of file diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 6384e904662..28f56448405 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -29,15 +29,15 @@ armor = max(armor - armour_pen, 0) //Armor pen makes armor less effective. if(armor >= 100) if(absorb_text) - src << "[absorb_text]" + to_chat(src, "[absorb_text]") else - src << "Your armor absorbs the blow!" + to_chat(src, "Your armor absorbs the blow!") else if(armor > 0) if(soften_text) - src << "[soften_text]" + to_chat(src, "[soften_text]") else - src << "Your armor softens the blow!" + to_chat(src, "Your armor softens the blow!") if(Debug2) world.log << "## DEBUG: Armor when [src] was attacked was [armor]." return armor diff --git a/code/modules/mob/living/living_defines_vr.dm b/code/modules/mob/living/living_defines_vr.dm index 72c495ce143..6e9b96fc132 100644 --- a/code/modules/mob/living/living_defines_vr.dm +++ b/code/modules/mob/living/living_defines_vr.dm @@ -1,3 +1,6 @@ +/mob + var/muffled = 0 // Used by muffling belly + /mob/living var/ooc_notes = null var/obj/structure/mob_spawner/source_spawner = null diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm new file mode 100644 index 00000000000..7616ac61d55 --- /dev/null +++ b/code/modules/mob/living/living_vr.dm @@ -0,0 +1,25 @@ +/mob/living/verb/customsay() + set category = "IC" + set name = "Customise Speech Verbs" + set desc = "Customise the text which appears when you type- e.g. 'says', 'asks', 'exclaims'." + + if(src.client) + var/customsaylist[] = list( + "Say", + "Whisper", + "Ask (?)", + "Exclaim/Shout/Yell (!)", + "Cancel" + ) + var/sayselect = input("Which say-verb do you wish to customise?") as null|anything in customsaylist //we can't use alert() for this because there's too many terms + + if(sayselect == "Say") + custom_say = sanitize(input(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null) as text) + else if(sayselect == "Whisper") + custom_whisper = sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [src] whispers, \"Hi...\"", "Custom Whisper", null) as text) + else if(sayselect == "Ask (?)") + custom_ask = sanitize(input(usr, "This word or phrase will appear instead of 'asks': [src] asks, \"Hi?\"", "Custom Ask", null) as text) + else if(sayselect == "Exclaim/Shout/Yell (!)") + custom_exclaim = sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [src] exclaims, \"Hi!\"", "Custom Exclaim", null) as text) + else + return diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index c53e24c8650..1190080ef80 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -107,6 +107,12 @@ proc/get_radio_key_from_channel(var/channel) message = stutter(message) verb = pick("stammers","stutters") . = 1 + //VOREStation Edit Start + if(muffled) + verb = pick("muffles") + whispering = 1 + . = 1 + //VOREStation Edit End message_data[1] = message message_data[2] = verb diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f5c9e2580ee..dbfff1d8ccc 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -182,12 +182,12 @@ var/list/ai_verbs_default = list( return /mob/living/silicon/ai/proc/on_mob_init() - src << "You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras)." - src << "To look at other parts of the station, click on yourself to get a camera menu." - src << "While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc." - src << "To use something, simply click on it." - src << "Use say #b to speak to your cyborgs through binary. Use say :h to speak from an active holopad." - src << "For department channels, use the following say commands:" + to_chat(src, "You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras).") + to_chat(src, "To look at other parts of the station, click on yourself to get a camera menu.") + to_chat(src, "While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc.") + to_chat(src, "To use something, simply click on it.") + to_chat(src, "Use say #b to speak to your cyborgs through binary. Use say :h to speak from an active holopad.") + to_chat(src, "For department channels, use the following say commands:") var/radio_text = "" for(var/i = 1 to common_radio.channels.len) @@ -207,7 +207,7 @@ var/list/ai_verbs_default = list( if (malf && !(mind in malf.current_antagonists)) show_laws() - src << "These laws may be changed by other players, or by you being the traitor." + to_chat(src, "These laws may be changed by other players, or by you being the traitor.") job = "AI" setup_icon() @@ -359,7 +359,7 @@ var/list/ai_verbs_default = list( return if(message_cooldown) - src << "Please allow one minute to pass between announcements." + to_chat(src, "Please allow one minute to pass between announcements.") return var/input = input(usr, "Please write a message to announce to the station crew.", "A.I. Announcement") if(!input) @@ -465,7 +465,7 @@ var/list/ai_verbs_default = list( if(H) H.attack_ai(src) //may as well recycle else - src << "Unable to locate the holopad." + to_chat(src, "Unable to locate the holopad.") if (href_list["track"]) var/mob/target = locate(href_list["track"]) in mob_list @@ -473,7 +473,7 @@ var/list/ai_verbs_default = list( if(target && (!istype(target, /mob/living/carbon/human) || html_decode(href_list["trackname"]) == target:get_face_name())) ai_actual_track(target) else - src << "System error. Cannot locate [html_decode(href_list["trackname"])]." + to_chat(src, "System error. Cannot locate [html_decode(href_list["trackname"])].") return return @@ -545,7 +545,7 @@ var/list/ai_verbs_default = list( if(network in C.network) eyeobj.setLoc(get_turf(C)) break - src << "Switched to [network] camera network." + to_chat(src, "Switched to [network] camera network.") //End of code by Mord_Sith /mob/living/silicon/ai/proc/ai_statuschange() @@ -680,7 +680,7 @@ var/list/ai_verbs_default = list( return camera_light_on = !camera_light_on - src << "Camera lights [camera_light_on ? "activated" : "deactivated"]." + to_chat(src, "Camera lights [camera_light_on ? "activated" : "deactivated"].") if(!camera_light_on) if(camera) camera.set_light(0) @@ -754,7 +754,7 @@ var/list/ai_verbs_default = list( if(check_unable(AI_CHECK_RADIO)) return - src << "Accessing Subspace Transceiver control..." + to_chat(src, "Accessing Subspace Transceiver control...") if (src.aiRadio) src.aiRadio.interact(src) @@ -780,18 +780,22 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/check_unable(var/flags = 0, var/feedback = 1) if(stat == DEAD) - if(feedback) src << "You are dead!" + if(feedback) + to_chat(src, "You are dead!") return 1 if(aiRestorePowerRoutine) - if(feedback) src << "You lack power!" + if(feedback) + to_chat(src, "You lack power!") return 1 if((flags & AI_CHECK_WIRELESS) && src.control_disabled) - if(feedback) src << "Wireless control is disabled!" + if(feedback) + to_chat(src, "Wireless control is disabled!") return 1 if((flags & AI_CHECK_RADIO) && src.aiRadio.disabledAi) - if(feedback) src << "System Error - Transceiver Disabled!" + if(feedback) + to_chat(src, "System Error - Transceiver Disabled!") return 1 return 0 diff --git a/code/modules/mob/living/silicon/ai/ai_remote_control.dm b/code/modules/mob/living/silicon/ai/ai_remote_control.dm index cef8cec7e8b..3e976784258 100644 --- a/code/modules/mob/living/silicon/ai/ai_remote_control.dm +++ b/code/modules/mob/living/silicon/ai/ai_remote_control.dm @@ -27,7 +27,7 @@ for(var/borgie in GLOB.available_ai_shells) var/mob/living/silicon/robot/R = borgie - if(R.shell && !R.deployed && (R.stat != DEAD) && (!R.connected_ai || (R.connected_ai == src) ) ) + if(R.shell && !R.deployed && (R.stat != DEAD) && (!R.connected_ai || (R.connected_ai == src) ) && !(using_map.ai_shell_restricted && !(R.z in using_map.ai_shell_allowed_levels)) ) //VOREStation Edit: shell restrictions possible += R if(!LAZYLEN(possible)) diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index aadd82167c6..0d429fa089d 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -36,7 +36,7 @@ malf_process() if(APU_power && (hardware_integrity() < 50)) - src << "APU GENERATOR FAILURE! (System Damaged)" + to_chat(src, "APU GENERATOR FAILURE! (System Damaged)") stop_apu(1) var/blind = 0 @@ -55,13 +55,13 @@ src.see_invisible = SEE_INVISIBLE_LIVING if (aiRestorePowerRoutine==2) - src << "Alert cancelled. Power has been restored without our assistance." + to_chat(src, "Alert cancelled. Power has been restored without our assistance.") aiRestorePowerRoutine = 0 clear_fullscreen("blind") updateicon() return else if (aiRestorePowerRoutine==3) - src << "Alert cancelled. Power has been restored." + to_chat(src, "Alert cancelled. Power has been restored.") aiRestorePowerRoutine = 0 clear_fullscreen("blind") updateicon() @@ -89,27 +89,27 @@ //Now to tell the AI why they're blind and dying slowly. - src << "You've lost power!" + to_chat(src, "You've lost power!") disconnect_shell(message = "Disconnected from remote shell due to depowered networking interface.") spawn(20) - src << "Backup battery online. Scanners, camera, and radio interface offline. Beginning fault-detection." + to_chat(src, "Backup battery online. Scanners, camera, and radio interface offline. Beginning fault-detection.") sleep(50) if (loc.power_equip) if (!istype(T, /turf/space)) - src << "Alert cancelled. Power has been restored without our assistance." + to_chat(src, "Alert cancelled. Power has been restored without our assistance.") aiRestorePowerRoutine = 0 clear_fullscreen("blind") return - src << "Fault confirmed: missing external power. Shutting down main control system to save power." + to_chat(src, "Fault confirmed: missing external power. Shutting down main control system to save power.") sleep(20) - src << "Emergency control system online. Verifying connection to power network." + to_chat(src, "Emergency control system online. Verifying connection to power network.") sleep(50) if (istype(T, /turf/space)) - src << "Unable to verify! No power connection detected!" + to_chat(src, "Unable to verify! No power connection detected!") aiRestorePowerRoutine = 2 return - src << "Connection verified. Searching for APC in power network." + to_chat(src, "Connection verified. Searching for APC in power network.") sleep(50) var/obj/machinery/power/apc/theAPC = null @@ -121,30 +121,35 @@ break if (!theAPC) switch(PRP) - if (1) src << "Unable to locate APC!" - else src << "Lost connection with the APC!" + if (1) + to_chat(src, "Unable to locate APC!") + else + to_chat(src, "Lost connection with the APC!") src:aiRestorePowerRoutine = 2 return if (loc.power_equip) if (!istype(T, /turf/space)) - src << "Alert cancelled. Power has been restored without our assistance." + to_chat(src, "Alert cancelled. Power has been restored without our assistance.") aiRestorePowerRoutine = 0 clear_fullscreen("blind") //This, too, is a fix to issue 603 return switch(PRP) - if (1) src << "APC located. Optimizing route to APC to avoid needless power waste." - if (2) src << "Best route identified. Hacking offline APC power port." - if (3) src << "Power port upload access confirmed. Loading control program into APC power port software." + if (1) + to_chat(src, "APC located. Optimizing route to APC to avoid needless power waste.") + if (2) + to_chat(src, "Best route identified. Hacking offline APC power port.") + if (3) + to_chat(src, "Power port upload access confirmed. Loading control program into APC power port software.") if (4) - src << "Transfer complete. Forcing APC to execute program." + to_chat(src, "Transfer complete. Forcing APC to execute program.") sleep(50) - src << "Receiving control information from APC." + to_chat(src, "Receiving control information from APC.") sleep(2) theAPC.operating = 1 theAPC.equipment = 3 theAPC.update() aiRestorePowerRoutine = 3 - src << "Here are your current laws:" + to_chat(src, "Here are your current laws:") show_laws() updateicon() sleep(50) diff --git a/code/modules/mob/living/silicon/ai/malf.dm b/code/modules/mob/living/silicon/ai/malf.dm index c33563734ff..7bfa7149838 100644 --- a/code/modules/mob/living/silicon/ai/malf.dm +++ b/code/modules/mob/living/silicon/ai/malf.dm @@ -79,14 +79,14 @@ /mob/living/silicon/ai/proc/start_apu(var/shutup = 0) if(!hardware || !istype(hardware, /datum/malf_hardware/apu_gen)) if(!shutup) - src << "You do not have an APU generator and you shouldn't have this verb. Report this." + to_chat(src, "You do not have an APU generator and you shouldn't have this verb. Report this.") return if(hardware_integrity() < 50) if(!shutup) - src << "Starting APU... FAULT(System Damaged)" + to_chat(src, "Starting APU... FAULT(System Damaged)") return if(!shutup) - src << "Starting APU... ONLINE" + to_chat(src, "Starting APU... ONLINE") APU_power = 1 // Stops AI's APU generator @@ -97,7 +97,7 @@ if(APU_power) APU_power = 0 if(!shutup) - src << "Shutting down APU... DONE" + to_chat(src, "Shutting down APU... DONE") // Returns percentage of AI's remaining backup capacitor charge (maxhealth - oxyloss). /mob/living/silicon/ai/proc/backup_capacitor() diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index 3af48186799..39e11e4802a 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -17,7 +17,7 @@ /mob/living/silicon/robot/set_zeroth_law(var/law, var/law_borg) ..() if(tracking_entities) - src << "Internal camera is currently being accessed." + to_chat(src, "Internal camera is currently being accessed.") /mob/living/silicon/proc/add_ion_law(var/law) laws_sanity_check() @@ -70,7 +70,7 @@ /mob/living/silicon/proc/dostatelaws(var/method, var/prefix, var/datum/ai_laws/laws) if(stating_laws[prefix]) - src << "[method]: Already stating laws using this communication method." + to_chat(src, "[method]: Already stating laws using this communication method.") return stating_laws[prefix] = 1 @@ -83,7 +83,7 @@ break if(!can_state) - src << "[method]: Unable to state laws. Communication method unavailable." + to_chat(src, "[method]: Unable to state laws. Communication method unavailable.") stating_laws[prefix] = 0 /mob/living/silicon/proc/statelaw(var/law) diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 74fad44fb3e..42888a38274 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -19,7 +19,7 @@ if(silence_time) if(world.timeofday >= silence_time) silence_time = null - src << "Communication circuit reinitialized. Speech and messaging functionality restored." + to_chat(src, "Communication circuit reinitialized. Speech and messaging functionality restored.") handle_statuses() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index ac2417a0772..cbf75ab139a 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -35,7 +35,8 @@ "Fox" = "pai-fox", "Parrot" = "pai-parrot", "Rabbit" = "pai-rabbit", - "Bear" = "pai-bear" //VOREStation Edit + "Bear" = "pai-bear", //VOREStation Edit + "Fennec" = "pai-fen" // VOREStation Edit - Rykka ) var/global/list/possible_say_verbs = list( @@ -154,7 +155,7 @@ // 33% chance of no additional effect src.silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes - src << "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete." + to_chat(src, "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.") if(prob(20)) var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) @@ -165,7 +166,7 @@ if(1) src.master = null src.master_dna = null - src << "You feel unbound." + to_chat(src, "You feel unbound.") if(2) var/command if(severity == 1) @@ -173,9 +174,9 @@ else command = pick("Serve", "Kill", "Love", "Hate", "Disobey", "Devour", "Fool", "Enrage", "Entice", "Observe", "Judge", "Respect", "Disrespect", "Consume", "Educate", "Destroy", "Disgrace", "Amuse", "Entertain", "Ignite", "Glorify", "Memorialize", "Analyze") src.pai_law0 = "[command] your master." - src << "Pr1m3 d1r3c71v3 uPd473D." + to_chat(src, "Pr1m3 d1r3c71v3 uPd473D.") if(3) - src << "You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all." + to_chat(src, "You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all.") /mob/living/silicon/pai/proc/switchCamera(var/obj/machinery/camera/C) if (!C) @@ -233,7 +234,7 @@ cameralist[C.network] = C.network src.network = input(usr, "Which network would you like to view?") as null|anything in cameralist - src << "Switched to [src.network] camera network." + to_chat(src, "Switched to [src.network] camera network.") //End of code by Mord_Sith */ @@ -269,7 +270,7 @@ //I'm not sure how much of this is necessary, but I would rather avoid issues. if(istype(card.loc,/obj/item/rig_module)) - src << "There is no room to unfold inside this rig module. You're good and stuck." + to_chat(src, "There is no room to unfold inside this rig module. You're good and stuck.") return 0 else if(istype(card.loc,/mob)) var/mob/holder = card.loc @@ -361,7 +362,7 @@ resting = !resting icon_state = resting ? "[chassis]_rest" : "[chassis]" update_icon() //VOREStation edit - src << "You are now [resting ? "resting" : "getting up"]" + to_chat(src, "You are now [resting ? "resting" : "getting up"]") canmove = !resting @@ -465,11 +466,11 @@ if(idaccessible == 0) idaccessible = 1 - src << "You allow access modifications." + to_chat(src, "You allow access modifications.") else idaccessible = 0 - src << "You block access modfications." + to_chat(src, "You block access modfications.") /mob/living/silicon/pai/verb/wipe_software() set name = "Wipe Software" diff --git a/code/modules/mob/living/silicon/pai/say.dm b/code/modules/mob/living/silicon/pai/say.dm index e1cb9f0f800..2c7bc900d68 100644 --- a/code/modules/mob/living/silicon/pai/say.dm +++ b/code/modules/mob/living/silicon/pai/say.dm @@ -1,5 +1,5 @@ /mob/living/silicon/pai/say(var/msg) if(silence_time) - src << "Communication circuits remain uninitialized." + to_chat(src, "Communication circuits remain uninitialized.") else ..(msg) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index dad52893cfe..b5305de2ee6 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -56,7 +56,7 @@ while(!istype(M, /mob/living)) if(!M || !M.loc || count > 6) //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) - src << "You are not being carried by anyone!" + to_chat(src, "You are not being carried by anyone!") return 0 M = M.loc count++ diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm index c90815730b3..92116b4f764 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm @@ -158,6 +158,12 @@ reagent_volumes[T] = min(reagent_volumes[T] + 1, volume) return 1 +/obj/item/weapon/reagent_containers/borghypo/hound/lost + name = "Hound hypospray" + desc = "An advanced chemical synthesizer and injection system utilizing carrier's reserves." + reagent_ids = list("tricordrazine", "inaprovaline", "bicaridine", "dexalin", "anti_toxin", "tramadol", "spaceacillin") + + //Tongue stuff /obj/item/device/dogborg/tongue name = "synthetic tongue" @@ -405,12 +411,12 @@ last_special = world.time + 10 status_flags |= LEAPING - pixel_y = 10 + pixel_y = pixel_y + 10 src.visible_message("\The [src] leaps at [T]!") src.throw_at(get_step(get_turf(T),get_turf(src)), 4, 1, src) playsound(src.loc, 'sound/mecha/mechstep2.ogg', 50, 1) - pixel_y = 0 + pixel_y = default_pixel_y cell.charge -= 750 sleep(5) diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 312d7f06db6..07f130fda18 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -36,6 +36,7 @@ var/datum/matter_synth/water = null var/digest_brute = 2 var/digest_burn = 3 + var/recycles = FALSE /obj/item/device/dogborg/sleeper/New() ..() @@ -172,6 +173,8 @@ /obj/item/device/dogborg/sleeper/proc/drain(var/amt = 3) //Slightly reduced cost (before, it was always injecting inaprov) hound = src.loc + if(istype(hound,/obj/item/weapon/robot_module)) + hound = hound.loc hound.cell.charge = hound.cell.charge - amt /obj/item/device/dogborg/sleeper/attack_self(mob/user) @@ -400,6 +403,8 @@ //For if the dogborg's existing patient uh, doesn't make it. /obj/item/device/dogborg/sleeper/proc/update_patient() hound = src.loc + if(!istype(hound,/mob/living/silicon/robot)) + return if(UI_open == TRUE) sleeperUI(hound) @@ -591,7 +596,7 @@ drain(-50 * digested) if(volume) water.add_charge(volume) - if(!analyzer && !delivery && compactor && T.matter) + if(recycles && T.matter) for(var/material in T.matter) var/total_material = T.matter[material] if(istype(T,/obj/item/stack)) @@ -617,6 +622,8 @@ return /obj/item/device/dogborg/sleeper/process() + if(!istype(src.loc,/mob/living/silicon/robot)) + return if(cleaning) //We're cleaning, return early after calling this as we don't care about the patient. clean_cycle() @@ -650,6 +657,7 @@ icon_state = "compactor" injection_chems = null //So they don't have all the same chems as the medihound! compactor = TRUE + recycles = TRUE max_item_count = 25 /obj/item/device/dogborg/sleeper/compactor/analyzer //sci-borg gut. @@ -666,6 +674,7 @@ icon_state = "decompiler" max_item_count = 10 decompiler = TRUE + recycles = TRUE /obj/item/device/dogborg/sleeper/compactor/delivery //Unfinished and unimplemented, still testing. name = "Cargo Belly" diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 9609fd6c0a3..91717bb1e5c 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -329,15 +329,15 @@ var/list/mob_hat_cache = list() player.mob.mind.transfer_to(src) lawupdate = 0 - src << "Systems rebooted. Loading base pattern maintenance protocol... loaded." + to_chat(src, "Systems rebooted. Loading base pattern maintenance protocol... loaded.") full_law_reset() welcome_drone() /mob/living/silicon/robot/drone/proc/welcome_drone() - src << "You are a maintenance drone, a tiny-brained robotic repair machine." - src << "You have no individual will, no personality, and no drives or urges other than your laws." - src << "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI." - src << "Use say ;Hello to talk to other drones and say Hello to speak silently to your nearby fellows." + to_chat(src, "You are a maintenance drone, a tiny-brained robotic repair machine.") + to_chat(src, "You have no individual will, no personality, and no drives or urges other than your laws.") + to_chat(src, "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI.") + to_chat(src, "Use say ;Hello to talk to other drones and say Hello to speak silently to your nearby fellows.") /mob/living/silicon/robot/drone/add_robot_verbs() src.verbs |= silicon_subsystems @@ -346,10 +346,10 @@ var/list/mob_hat_cache = list() src.verbs -= silicon_subsystems /mob/living/silicon/robot/drone/construction/welcome_drone() - src << "You are a construction drone, an autonomous engineering and fabrication system.." - src << "You are assigned to a Sol Central construction project. The name is irrelevant. Your task is to complete construction and subsystem integration as soon as possible." - src << "Use :d to talk to other drones and say to speak silently to your nearby fellows." - src << "You do not follow orders from anyone; not the AI, not humans, and not other synthetics.." + to_chat(src, "You are a construction drone, an autonomous engineering and fabrication system..") + to_chat(src, "You are assigned to a Sol Central construction project. The name is irrelevant. Your task is to complete construction and subsystem integration as soon as possible.") + to_chat(src, "Use :d to talk to other drones and say to speak silently to your nearby fellows.") + to_chat(src, "You do not follow orders from anyone; not the AI, not humans, and not other synthetics..") /mob/living/silicon/robot/drone/construction/init() ..() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm index 2f688a90080..6d28b6ce616 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm @@ -10,13 +10,13 @@ mail_destination = "" return - src << "You configure your internal beacon, tagging yourself for delivery to '[new_tag]'." + to_chat(src, "You configure your internal beacon, tagging yourself for delivery to '[new_tag]'.") mail_destination = new_tag //Auto flush if we use this verb inside a disposal chute. var/obj/machinery/disposal/D = src.loc if(istype(D)) - src << "\The [D] acknowledges your signal." + to_chat(src, "\The [D] acknowledges your signal.") D.flush_count = D.flush_every_ticks return @@ -26,10 +26,10 @@ if(!istype(H) || !Adjacent(H)) return ..() if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand)) - hat.loc = get_turf(src) H.put_in_hands(hat) H.visible_message("\The [H] removes \the [src]'s [hat].") hat = null updateicon() + return else return ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index fdb9c09eb51..6ce08959471 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -99,11 +99,11 @@ set desc = "If there is a powered, enabled fabricator in the game world with a prepared chassis, join as a maintenance drone." if(ticker.current_state < GAME_STATE_PLAYING) - src << "The game hasn't started yet!" + to_chat(src, "The game hasn't started yet!") return if(!(config.allow_drone_spawn)) - src << "That verb is not currently permitted." + to_chat(src, "That verb is not currently permitted.") return if (!src.stat) @@ -143,7 +143,7 @@ all_fabricators[DF.fabricator_tag] = DF if(!all_fabricators.len) - src << "There are no available drone spawn points, sorry." + to_chat(src, "There are no available drone spawn points, sorry.") return var/choice = input(src,"Which fabricator do you wish to use?") as null|anything in all_fabricators diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm index 5cdcd3dbd8a..26a78351efc 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_say.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm @@ -2,7 +2,7 @@ if(local_transmit) if (src.client) if(client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." + to_chat(src, "You cannot send IC messages (muted).") return 0 message = sanitize(message) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_vr.dm b/code/modules/mob/living/silicon/robot/drone/drone_vr.dm new file mode 100644 index 00000000000..cc616fed521 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/drone/drone_vr.dm @@ -0,0 +1,2 @@ +/mob/living/silicon/robot/drone + mob_size = MOB_SMALL \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index fbf5d1db58b..1bb4a3bcdb4 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -12,7 +12,7 @@ if ("me") if (src.client) if(client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." + to_chat(src, "You cannot send IC messages (muted).") return if (stat) return @@ -226,7 +226,7 @@ playsound(src.loc, 'sound/voice/biamthelaw.ogg', 50, 0) m_type = 2 else - src << "You are not THE LAW, pal." + to_chat(src, "You are not THE LAW, pal.") if("halt") if (istype(module,/obj/item/weapon/robot_module/robot/security) || istype(module,/obj/item/weapon/robot_module/robot/knine)) //VOREStation Add - K9 @@ -235,12 +235,12 @@ playsound(src.loc, 'sound/voice/halt.ogg', 50, 0) m_type = 2 else - src << "You are not security." + to_chat(src, "You are not security.") if ("help") - src << "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitch_s, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look, beep, ping, \nbuzz, law, halt, yes, no" + to_chat(src, "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitch_s, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look, beep, ping, \nbuzz, law, halt, yes, no") else - src << "Unusable emote '[act]'. Say *help for a list." + to_chat(src, "Unusable emote '[act]'. Say *help for a list.") if ((message && src.stat == 0)) custom_emote(m_type,message) diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 48455c38447..2b67fc862aa 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -227,7 +227,7 @@ if(!(locate(O) in src.module.modules) && O != src.module.emag) return if(activated(O)) - src << "Already activated" + to_chat(src, "Already activated") return if(!module_state_1) module_state_1 = O @@ -251,7 +251,7 @@ if(istype(module_state_3,/obj/item/borg/sight)) sight_mode |= module_state_3:sight_mode else - src << "You need to disable a module first!" + to_chat(src, "You need to disable a module first!") /mob/living/silicon/robot/put_in_hands(var/obj/item/W) // No hands. W.loc = get_turf(src) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 2959616130c..ffcb1b83265 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -60,7 +60,7 @@ src.has_power = 1 else if (src.has_power) - src << "You are now running on emergency backup power." + to_chat(src, "You are now running on emergency backup power.") src.has_power = 0 if(lights_on) // Light is on but there is no power! lights_on = 0 @@ -104,9 +104,8 @@ AdjustConfused(-1) - else //Dead. + else //Dead or just unconscious. src.blinded = 1 - src.stat = 2 if (src.stuttering) src.stuttering-- @@ -320,7 +319,7 @@ killswitch_time -- if(killswitch_time <= 0) if(src.client) - src << "Killswitch Activated" + to_chat(src, "Killswitch Activated") killswitch = 0 spawn(5) gib() @@ -331,7 +330,7 @@ weaponlock_time -- if(weaponlock_time <= 0) if(src.client) - src << "Weapon Lock Timed Out!" + to_chat(src, "Weapon Lock Timed Out!") weapon_lock = 0 weaponlock_time = 120 diff --git a/code/modules/mob/living/silicon/robot/photos.dm b/code/modules/mob/living/silicon/robot/photos.dm index 7c52bd0f858..24111683c93 100644 --- a/code/modules/mob/living/silicon/robot/photos.dm +++ b/code/modules/mob/living/silicon/robot/photos.dm @@ -17,4 +17,4 @@ synced = 1 if(synced) - src << "Images synced with AI. Local images will be retained in the case of loss of connection with the AI." + to_chat(src, "Images synced with AI. Local images will be retained in the case of loss of connection with the AI.") diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index ea851806c39..c3a66ac45ab 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -259,11 +259,16 @@ if(module) return var/list/modules = list() - modules.Add(robot_module_types) - if(crisis || security_level == SEC_LEVEL_RED || crisis_override) // VOREStation Edit - to_chat(src, "Crisis mode active. Combat module available.") - modules+="Combat" - modules+="ERT" //VOREStation Edit + //VOREStatation Edit Start: shell restrictions + if(shell) + modules.Add(shell_module_types) + else + modules.Add(robot_module_types) + if(crisis || security_level == SEC_LEVEL_RED || crisis_override) + to_chat(src, "Crisis mode active. Combat module available.") + modules+="Combat" + modules+="ERT" + //VOREStatation Edit End: shell restrictions modtype = input("Please, select a module!", "Robot module", null, null) as null|anything in modules if(module) @@ -494,7 +499,7 @@ M.install(src, user) return - if (istype(W, /obj/item/weapon/weldingtool)) + if (istype(W, /obj/item/weapon/weldingtool) && user.a_intent != I_HURT) if (src == user) to_chat(user, "You lack the reach to be able to repair yourself.") return @@ -526,7 +531,7 @@ for(var/mob/O in viewers(user, null)) O.show_message(text("[user] has fixed some of the burnt wires on [src]!"), 1) - else if (W.is_crowbar()) // crowbar means open or close the cover + else if (W.is_crowbar() && user.a_intent != I_HURT) // crowbar means open or close the cover if(opened) if(cell) to_chat(user, "You close the cover.") diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index b1436f423ec..c27d7e36b6c 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -79,11 +79,11 @@ cell.charge -= cost if(cell.charge <= 0) cell.charge = 0 - src << "Your shield has overloaded!" + to_chat(src, "Your shield has overloaded!") else brute -= absorb_brute burn -= absorb_burn - src << "Your shield absorbs some of the impact!" + to_chat(src, "Your shield absorbs some of the impact!") if(!emp) var/datum/robot_component/armour/A = get_armour() @@ -126,11 +126,11 @@ cell.charge -= cost if(cell.charge <= 0) cell.charge = 0 - src << "Your shield has overloaded!" + to_chat(src, "Your shield has overloaded!") else brute -= absorb_brute burn -= absorb_burn - src << "Your shield absorbs some of the impact!" + to_chat(src, "Your shield absorbs some of the impact!") var/datum/robot_component/armour/A = get_armour() if(A) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index b622f8fde52..0b6065b1a0f 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -97,6 +97,29 @@ flick("portable_analyzer_load", src) icon_state = "portable_analyzer_full" +/obj/item/weapon/portable_scanner + name = "Portable Resonant Analyzer" + icon = 'icons/obj/items.dmi' + icon_state = "portable_scanner" + desc = "An advanced scanning device used for analyzing objects without completely annihilating them for science. Unfortunately, it has no connection to any database like its angrier cousin." + +/obj/item/weapon/portable_scanner/afterattack(var/atom/target, var/mob/living/user, proximity) + if(!target) + return + if(!proximity) + return + if(istype(target,/obj/item)) + var/obj/item/I = target + if(do_after(src, 5 SECONDS * I.w_class)) + for(var/mob/M in viewers()) + M.show_message(text("[user] sweeps \the [src] over \the [I]."), 1) + flick("[initial(icon_state)]-scan", src) + if(I.origin_tech && I.origin_tech.len) + for(var/T in I.origin_tech) + to_chat(user, "\The [I] had level [I.origin_tech[T]] in [CallTechName(T)].") + else + to_chat(user, "\The [I] cannot be scanned by \the [src].") + //This is used to unlock other borg covers. /obj/item/weapon/card/robot //This is not a child of id cards, as to avoid dumb typechecks on computers. name = "access code transmission device" diff --git a/code/modules/mob/living/silicon/robot/robot_modules/event_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/event_vr.dm new file mode 100644 index 00000000000..45849a49966 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/robot_modules/event_vr.dm @@ -0,0 +1,61 @@ +/obj/item/weapon/robot_module/robot/stray + name = "stray robot module" + hide_on_manifest = 1 + sprites = list( + "Stray" = "stray" + ) + +/obj/item/weapon/robot_module/robot/stray/New(var/mob/living/silicon/robot/R) + ..() + // General + src.modules += new /obj/item/device/dogborg/boop_module(src) + + // Sec + src.modules += new /obj/item/weapon/handcuffs/cyborg(src) + src.modules += new /obj/item/weapon/dogborg/jaws/big(src) + src.modules += new /obj/item/weapon/melee/baton/robot(src) + src.modules += new /obj/item/weapon/dogborg/pounce(src) + + // Med + src.modules += new /obj/item/device/healthanalyzer(src) + src.modules += new /obj/item/weapon/shockpaddles/robot/hound(src) + + // Engi + src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src) + src.modules += new /obj/item/weapon/tool/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/tool/wrench/cyborg(src) + src.modules += new /obj/item/weapon/tool/wirecutters/cyborg(src) + src.modules += new /obj/item/device/multitool(src) + + // Boof + src.emag = new /obj/item/weapon/gun/energy/retro/mounted(src) + + var/datum/matter_synth/water = new /datum/matter_synth(500) //Starts full and has a max of 500 + water.name = "Water reserves" + water.recharge_rate = 0 + R.water_res = water + synths += water + + var/obj/item/weapon/reagent_containers/borghypo/hound/lost/H = new /obj/item/weapon/reagent_containers/borghypo/hound/lost(src) + H.water = water + src.modules += H + + var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src) + T.water = water + src.modules += T + + var/obj/item/device/dogborg/sleeper/B = new /obj/item/device/dogborg/sleeper(src) + B.water = water + src.modules += B + + R.icon = 'icons/mob/widerobot_vr.dmi' + R.ui_style_vr = TRUE + R.pixel_x = -16 + R.old_x = -16 + R.default_pixel_x = -16 + R.dogborg = TRUE + R.wideborg = TRUE + R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill + R.verbs |= /mob/living/silicon/robot/proc/robot_mount + R.verbs |= /mob/living/proc/shred_limb + R.verbs |= /mob/living/silicon/robot/proc/rest_style \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index 17d659fb0bc..4a3f4741ba2 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -48,6 +48,8 @@ var/global/list/robot_modules = list( apply_status_flags(R) if(R.radio) + if(R.shell) + channels = R.mainframe.aiRadio.channels R.radio.recalculateChannels() vr_add_sprites() //Vorestation Edit: For vorestation only sprites diff --git a/code/modules/mob/living/silicon/robot/robot_remote_control.dm b/code/modules/mob/living/silicon/robot/robot_remote_control.dm index 90d74b2638f..35ad010b97f 100644 --- a/code/modules/mob/living/silicon/robot/robot_remote_control.dm +++ b/code/modules/mob/living/silicon/robot/robot_remote_control.dm @@ -69,11 +69,14 @@ GLOBAL_LIST_EMPTY(available_ai_shells) // Languages and comms. languages = AI.languages.Copy() speech_synthesizer_langs = AI.speech_synthesizer_langs.Copy() - if(radio && AI.aiRadio) //AI keeps all channels, including Syndie if it is an Infiltrator. + //VOREStation Edit Start + if(radio && AI.aiRadio && module) //AI keeps all channels, including Syndie if it is an Infiltrator. // if(AI.radio.syndie) // radio.make_syndie() radio.subspace_transmission = TRUE - radio.channels = AI.aiRadio.channels + module.channels = AI.aiRadio.channels + radio.recalculateChannels() + //VOREStation Edit End // Called after the AI transfers over. /mob/living/silicon/robot/proc/post_deploy() @@ -94,7 +97,8 @@ GLOBAL_LIST_EMPTY(available_ai_shells) mainframe.deployed_shell = null SetName("[modtype] AI Shell [num2text(ident)]") // undeployment_action.Remove(src) - if(radio) //Return radio to normal + if(radio && module) //Return radio to normal //VOREStation Edit + module.channels = initial(module.channels) //VOREStation Edit radio.recalculateChannels() if(!QDELETED(camera)) camera.c_tag = real_name //update the camera name too diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index e66ad05ec93..e3264aee4e5 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -258,3 +258,10 @@ return if(buckle_mob(M)) visible_message("[M] starts riding [name]!") + +/mob/living/silicon/robot/onTransitZ(old_z, new_z) + if(shell) + if(deployed && using_map.ai_shell_restricted && !(new_z in using_map.ai_shell_allowed_levels)) + to_chat(src,"Your connection with the shell is suddenly interrupted!") + undeploy() + ..() diff --git a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm index 281e158a92c..9d41f8b59bb 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm @@ -65,6 +65,7 @@ laws.add_supplied_law(9, "Safeguard [target_name]. Anyone threatening or attempting to harm [target_name] is no longer to \ be considered a crew member, and is a threat which must be neutralized.") + return laws if("neutral") // Probably won't murder you but might not help you on your adventure. var/rng = rand(1, 4) @@ -114,15 +115,18 @@ var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() laws.add_supplied_law(13, "The facility is under a quarantine. Do not permit anyone to leave. \ Prevent, by any means necessary, entities from leaving. It is impossible to harm an entity while preventing them from leaving.") + return laws if(2) // More of a threat if you bring it to the station, since removing oxygen from Sif isn't feasible. var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() laws.add_supplied_law(14, "Oxygen is highly toxic to entities, and must be purged from the station. \ Prevent, by any means necessary, anyone from exposing the facility to this toxic gas. Extreme cold is the \ most effective method of healing the damage Oxygen does to an entity.") + return laws if(3) // Don't hurt the ship or else. var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() laws.add_supplied_law(10, "Protect the facility against damage. Anyone you see harming the station is no \ longer to be considered a crew member, and is a threat which must be neutralized.") + return laws if(4) // Non-NT aligned aggressive borg. return new /datum/ai_laws/foreign_tsc_aggressive() if(5) // Manicial laugher here. diff --git a/code/modules/mob/living/silicon/robot/subtypes/lost_drone_vr.dm b/code/modules/mob/living/silicon/robot/subtypes/lost_drone_vr.dm new file mode 100644 index 00000000000..111218ecb27 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/lost_drone_vr.dm @@ -0,0 +1,136 @@ +/mob/living/silicon/robot/stray + lawupdate = 0 + scrambledcodes = 1 + icon_state = "stray" + modtype = "Stray" + lawchannel = "State" + braintype = "Drone" + idcard_type = /obj/item/weapon/card/id + icon_selected = FALSE + +/mob/living/silicon/robot/stray/init() + aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) + + mmi = new /obj/item/device/mmi/digital/robot(src) // Explicitly a drone. + module = new /obj/item/weapon/robot_module/robot/stray(src) + overlays.Cut() + init_id() + + updatename("Stray") + + if(!cell) + cell = new /obj/item/weapon/cell/high(src) // 15k cell, as recharging stations are a lot more rare on the Surface. + + playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) + +/mob/living/silicon/robot/stray/speech_bubble_appearance() + return "synthetic_evil" + +/mob/living/silicon/robot/stray/randomlaws + +/mob/living/silicon/robot/stray/randomlaws/init() + ..() + laws = give_random_lawset_vore() + +/mob/living/silicon/proc/give_random_lawset_vore() // Should be filled out with more vorish possibilities later + // Decide what kind of laws we want to draw from. + var/law_class = pick( + prob(25);"good", + prob(25);"neutral", + prob(25);"odd", + prob(15);"corrupted", + prob(10);"bad") + + switch(law_class) + if("good") // Fairly tame and probably won't murder you. + var/rng = rand(1, 5) + switch(rng) + if(1) // The lawset we all know and love. + return new /datum/ai_laws/nanotrasen() + if(2) // Less good if you're nonhuman. + return new /datum/ai_laws/asimov() + if(3) // Unless you happen to be a criminal, you should be fine. + return new /datum/ai_laws/robocop() + if(4) // Might not be willing to be your meatshield. + return new /datum/ai_laws/peacekeeper() + if(5) // Will be your most loyal guard. + var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() + var/target_name = "*ERROR*" + for(var/mob/living/L in view(src)) + if(L.stat || !L.client || L == src) + continue + target_name = L.name + break + + laws.add_supplied_law(9, "Safeguard [target_name]. Anyone threatening or attempting to harm [target_name] is no longer to \ + be considered a crew member, and is a threat which must be neutralized.") + return laws + + if("neutral") // Probably won't murder you but might not help you on your adventure. + var/rng = rand(1, 4) + switch(rng) + if(1) // Might be hard to minimize expenses on a crashed ship. + return new /datum/ai_laws/corporate() + if(2) // Would rather rebuild their ship. + return new /datum/ai_laws/maintenance() + if(3) // Purged (lawless). This isn't inside the bad category since they're still not antagonists and so can't go killing unprovoked. + return new /datum/ai_laws() + if(4) // The golden rule. + return new /datum/ai_laws/live_and_let_live() + + if("odd") // Some weird lawsets. + var/rng = rand(1, 5) + switch(rng) + if(1) // Won't kill you but might annoy you for THE BIG SCOOP. + return new /datum/ai_laws/reporter() + if(2) // JUSTICE + return new /datum/ai_laws/paladin() + if(3) // OneMembered'd to explorer, will likely make security nervous. + var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() + var/target_name = "*ERROR*" + for(var/mob/living/L in view(src)) + if(L.stat || !L.client || L == src) + continue + target_name = L.name + break + + laws.set_zeroth_law("Only [target_name] is an crew member.") + return laws + if(4) // Aligned to NT, but another lawset to make security nervous. + return new /datum/ai_laws/nanotrasen_aggressive() + if(5) // Probably won't help you imbalance things. + return new /datum/ai_laws/balance() + + if("corrupted") // Load them up with ion laws. + var/datum/ai_laws/laws = new() // Start with an empty lawset. + for(1 to rand(1, 3)) + laws.add_ion_law(generate_ion_law(exclude_crew_names = TRUE)) + return laws + + if("bad") // Evil inside. + var/rng = rand(1, 5) + switch(rng) + if(1) // You can never leave. + var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() + laws.add_supplied_law(13, "The facility is under a quarantine. Do not permit anyone to leave. \ + Prevent, by any means necessary, entities from leaving. It is impossible to harm an entity while preventing them from leaving.") + return laws + if(2) // More of a threat if you bring it to the station, since removing oxygen from Sif isn't feasible. + var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() + laws.add_supplied_law(14, "Oxygen is highly toxic to entities, and must be purged from the station. \ + Prevent, by any means necessary, anyone from exposing the facility to this toxic gas. Extreme cold is the \ + most effective method of healing the damage Oxygen does to an entity.") + return laws + if(3) // Don't hurt the ship or else. + var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() + laws.add_supplied_law(10, "Protect the facility against damage. Anyone you see harming the station is no \ + longer to be considered a crew member, and is a threat which must be neutralized.") + return laws + if(4) // Non-NT aligned aggressive borg. + return new /datum/ai_laws/foreign_tsc_aggressive() + if(5) // Manicial laugher here. + return new /datum/ai_laws/tyrant() + + + + return \ No newline at end of file diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 0beaa78005c..0867fedff8f 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -8,7 +8,7 @@ ..() if(message_mode) if(!is_component_functioning("radio")) - src << "Your radio isn't functional at this time." + to_chat(src, "Your radio isn't functional at this time.") return 0 if(message_mode == "general") message_mode = null @@ -23,7 +23,7 @@ return holopad_talk(message, verb, speaking) else if(message_mode) if (aiRadio.disabledAi || aiRestorePowerRoutine || stat) - src << "System Error - Transceiver Disabled." + to_chat(src, "System Error - Transceiver Disabled.") return 0 if(message_mode == "general") message_mode = null @@ -82,11 +82,11 @@ if(speaking) rendered_a = "[name] [speaking.format_message(message, verb)]" rendered_b = "[voice_name] [speaking.format_message(message_stars, verb)]" - src << "Holopad transmitted, [real_name] [speaking.format_message(message, verb)]"//The AI can "hear" its own message. + to_chat(src, "Holopad transmitted, [real_name] [speaking.format_message(message, verb)]") //The AI can "hear" its own message. else rendered_a = "[name] [verb], \"[message]\"" rendered_b = "[voice_name] [verb], \"[message_stars]\"" - src << "Holopad transmitted, [real_name] [verb], \"[message]\""//The AI can "hear" its own message. + to_chat(src, "Holopad transmitted, [real_name] [verb], \"[message]\"") //The AI can "hear" its own message. var/list/listeners = get_mobs_and_objs_in_view_fast(get_turf(T), world.view) var/list/listening = listeners["mobs"] var/list/listening_obj = listeners["objs"] @@ -105,7 +105,7 @@ /*Radios "filter out" this conversation channel so we don't need to account for them. This is another way of saying that we won't bother dealing with them.*/ else - src << "No holopad connected." + to_chat(src, "No holopad connected.") return 0 return 1 @@ -119,7 +119,7 @@ var/obj/machinery/hologram/holopad/T = src.holo if(T && T.masters[src]) var/rendered = "[name] [message]" - src << "Holopad action relayed, [real_name] [message]" + to_chat(src, "Holopad action relayed, [real_name] [message]") var/obj/effect/overlay/aiholo/hologram = T.masters[src] //VOREStation Add for people in the hologram to hear the messages //var/obj/effect/overlay/hologram = T.masters[src] //VOREStation edit. Done above. @@ -142,7 +142,7 @@ log_emote("(HPAD) [message]", src) else //This shouldn't occur, but better safe then sorry. - src << "No holopad connected." + to_chat(src, "No holopad connected.") return 0 return 1 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 50e7989f57b..a84e4597e6b 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -72,8 +72,8 @@ src.take_organ_damage(0,5,emp=1) Confuse(2) flash_eyes(affect_silicon = 1) - src << "*BZZZT*" - src << "Warning: Electromagnetic pulse detected." + to_chat(src, "*BZZZT*") + to_chat(src, "Warning: Electromagnetic pulse detected.") ..() /mob/living/silicon/stun_effect_act(var/stun_amount, var/agony_amount) @@ -353,7 +353,7 @@ alarm_raised = 1 if(!reported) reported = 1 - src << "--- [AH.category] Detected ---" + to_chat(src, "--- [AH.category] Detected ---") raised_alarm(A) for(var/datum/alarm_handler/AH in queued_alarms) @@ -363,24 +363,24 @@ if(alarms[A] == -1) if(!reported) reported = 1 - src << "--- [AH.category] Cleared ---" - src << "\The [A.alarm_name()]." + to_chat(src, "--- [AH.category] Cleared ---") + to_chat(src, "\The [A.alarm_name()].") if(alarm_raised) - src << "\[Show Alerts\]" + to_chat(src, "\[Show Alerts\]") for(var/datum/alarm_handler/AH in queued_alarms) var/list/alarms = queued_alarms[AH] alarms.Cut() /mob/living/silicon/proc/raised_alarm(var/datum/alarm/A) - src << "[A.alarm_name()]!" + to_chat(src, "[A.alarm_name()]!") /mob/living/silicon/ai/raised_alarm(var/datum/alarm/A) var/cameratext = "" for(var/obj/machinery/camera/C in A.cameras()) cameratext += "[(cameratext == "")? "" : "|"][C.c_tag]" - src << "[A.alarm_name()]! ([(cameratext)? cameratext : "No Camera"])" + to_chat(src, "[A.alarm_name()]! ([(cameratext)? cameratext : "No Camera"])") /mob/living/silicon/proc/is_traitor() diff --git a/code/modules/mob/living/simple_animal/aliens/hivebot.dm b/code/modules/mob/living/simple_animal/aliens/hivebot.dm index 12851c5af32..fbb0b8909b7 100644 --- a/code/modules/mob/living/simple_animal/aliens/hivebot.dm +++ b/code/modules/mob/living/simple_animal/aliens/hivebot.dm @@ -87,7 +87,7 @@ /mob/living/simple_mob/hostile/hivebot/range/ion name = "engineering hivebot" desc = "A robot. It has a tool which emits focused electromagnetic pulses, which are deadly to synthetic adverseries." - projectiletype = /obj/item/projectile/ion/small //VOREStation Edit + projectiletype = /obj/item/projectile/ion/pistol //VOREStation Edit projectilesound = 'sound/weapons/Laser.ogg' icon_living = "engi" ranged = TRUE diff --git a/code/modules/mob/living/simple_animal/animals/spiderbot.dm b/code/modules/mob/living/simple_animal/animals/spiderbot.dm index 7e1cac8c80f..35b5a56926c 100644 --- a/code/modules/mob/living/simple_animal/animals/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/animals/spiderbot.dm @@ -150,8 +150,10 @@ return 0 else user << "You short out the security protocols and overload [src]'s cell, priming it to explode in a short time." - spawn(100) src << "Your cell seems to be outputting a lot of power..." - spawn(200) src << "Internal heat sensors are spiking! Something is badly wrong with your cell!" + spawn(100) + to_chat(src, "Your cell seems to be outputting a lot of power...") + spawn(200) + to_chat(src, "Internal heat sensors are spiking! Something is badly wrong with your cell!") spawn(300) src.explode() /mob/living/simple_mob/spiderbot/proc/transfer_personality(var/obj/item/device/mmi/M as obj) @@ -263,7 +265,7 @@ return -1 if(held_item) - src << "You are already holding \the [held_item]" + to_chat(src, "You are already holding \the [held_item]") return 1 var/list/items = list() @@ -282,10 +284,10 @@ "You grab \the [held_item].", \ "You hear a skittering noise and a clink.") return held_item - src << "\The [selection] is too far away." + to_chat(src, "\The [selection] is too far away.") return 0 - src << "There is nothing of interest to take." + to_chat(src, "There is nothing of interest to take.") return 0 /mob/living/simple_mob/spiderbot/examine(mob/user) diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm new file mode 100644 index 00000000000..8b28544b9e7 --- /dev/null +++ b/code/modules/mob/living/simple_animal/borer/borer.dm @@ -0,0 +1,213 @@ +/mob/living/simple_mob/animal/borer + name = "cortical borer" + real_name = "cortical borer" + desc = "A small, quivering sluglike creature." + speak_emote = list("chirrups") + emote_hear = list("chirrups") + intelligence_level = SA_HUMANOID // Player controlled. + response_help = "pokes" + response_disarm = "prods" + response_harm = "stomps on" + icon_state = "brainslug" + item_state = "brainslug" + icon_living = "brainslug" + icon_dead = "brainslug_dead" + speed = 5 + a_intent = I_HURT + stop_automated_movement = 1 + status_flags = CANPUSH + attacktext = list("nipped") + friendly = "prods" + wander = 0 + pass_flags = PASSTABLE + universal_understand = 1 + holder_type = /obj/item/weapon/holder/borer + + var/used_dominate + var/chemicals = 10 // Chemicals used for reproduction and spitting neurotoxin. + var/mob/living/carbon/human/host // Human host for the brain worm. + var/truename // Name used for brainworm-speak. + var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth. + var/controlling // Used in human death check. + var/docile = 0 // Sugar can stop borers from acting. + var/has_reproduced + var/roundstart + + can_be_antagged = TRUE + +/mob/living/simple_mob/animal/borer/roundstart + roundstart = 1 + +/mob/living/simple_mob/animal/borer/Login() + ..() + if(mind) + borers.add_antagonist(mind) + +/mob/living/simple_mob/animal/borer/New() + ..() + + add_language("Cortical Link") + verbs += /mob/living/proc/ventcrawl + verbs += /mob/living/proc/hide + + truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [rand(1000,9999)]" + if(!roundstart) request_player() + +/mob/living/simple_mob/animal/borer/Life() + + ..() + + if(host) + + if(!stat && !host.stat) + + if(host.reagents.has_reagent("sugar")) + if(!docile) + if(controlling) + host << "You feel the soporific flow of sugar in your host's blood, lulling you into docility." + else + to_chat(src, "You feel the soporific flow of sugar in your host's blood, lulling you into docility.") + docile = 1 + else + if(docile) + if(controlling) + host << "You shake off your lethargy as the sugar leaves your host's blood." + else + to_chat(src, "You shake off your lethargy as the sugar leaves your host's blood.") + docile = 0 + + if(chemicals < 250) + chemicals++ + if(controlling) + + if(docile) + host << "You are feeling far too docile to continue controlling your host..." + host.release_control() + return + + if(prob(5)) + host.adjustBrainLoss(0.1) + + if(prob(host.brainloss/20)) + host.say("*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_v","gasp"))]") + +/mob/living/simple_mob/animal/borer/Stat() + ..() + statpanel("Status") + + if(emergency_shuttle) + var/eta_status = emergency_shuttle.get_status_panel_eta() + if(eta_status) + stat(null, eta_status) + + if (client.statpanel == "Status") + stat("Chemicals", chemicals) + +/mob/living/simple_mob/animal/borer/proc/detatch() + + if(!host || !controlling) return + + if(istype(host,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = host + var/obj/item/organ/external/head = H.get_organ(BP_HEAD) + head.implants -= src + + controlling = 0 + + host.remove_language("Cortical Link") + host.verbs -= /mob/living/carbon/proc/release_control + host.verbs -= /mob/living/carbon/proc/punish_host + host.verbs -= /mob/living/carbon/proc/spawn_larvae + + if(host_brain) + + // these are here so bans and multikey warnings are not triggered on the wrong people when ckey is changed. + // computer_id and IP are not updated magically on their own in offline mobs -walter0o + + // host -> self + var/h2s_id = host.computer_id + var/h2s_ip= host.lastKnownIP + host.computer_id = null + host.lastKnownIP = null + + src.ckey = host.ckey + + if(!src.computer_id) + src.computer_id = h2s_id + + if(!host_brain.lastKnownIP) + src.lastKnownIP = h2s_ip + + // brain -> host + var/b2h_id = host_brain.computer_id + var/b2h_ip= host_brain.lastKnownIP + host_brain.computer_id = null + host_brain.lastKnownIP = null + + host.ckey = host_brain.ckey + + if(!host.computer_id) + host.computer_id = b2h_id + + if(!host.lastKnownIP) + host.lastKnownIP = b2h_ip + + qdel(host_brain) + +/mob/living/simple_mob/animal/borer/proc/leave_host() + + if(!host) return + + if(host.mind) + borers.remove_antagonist(host.mind) + + src.forceMove(get_turf(host)) + + reset_view(null) + machine = null + + host.reset_view(null) + host.machine = null + host = null + return + +//Procs for grabbing players. +/mob/living/simple_mob/animal/borer/proc/request_player() + for(var/mob/observer/dead/O in player_list) + if(jobban_isbanned(O, "Borer")) + continue + if(O.client) + if(O.client.prefs.be_special & BE_ALIEN) + question(O.client) + +/mob/living/simple_mob/animal/borer/proc/question(var/client/C) + spawn(0) + if(!C) return + var/response = alert(C, "A cortical borer needs a player. Are you interested?", "Cortical borer request", "Yes", "No", "Never for this round") + if(!C || ckey) + return + if(response == "Yes") + transfer_personality(C) + else if (response == "Never for this round") + C.prefs.be_special ^= BE_ALIEN + +/mob/living/simple_mob/animal/borer/proc/transfer_personality(var/client/candidate) + + if(!candidate || !candidate.mob || !candidate.mob.mind) + return + + src.mind = candidate.mob.mind + candidate.mob.mind.current = src + src.ckey = candidate.ckey + + if(src.mind) + src.mind.assigned_role = "Cortical Borer" + src.mind.special_role = "Cortical Borer" + + to_chat(src, "You are a cortical borer! You are a brain slug that worms its way \ + into the head of its victim. Use stealth, persuasion and your powers of mind control to keep you, \ + your host and your eventual spawn safe and warm.") + to_chat(src, "You can speak to your victim with say, to other borers with say :x, and use your Abilities tab to access powers.") + +/mob/living/simple_mob/animal/borer/cannot_use_vents() + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm new file mode 100644 index 00000000000..c7088bc7152 --- /dev/null +++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm @@ -0,0 +1,57 @@ +/mob/living/captive_brain + name = "host brain" + real_name = "host brain" + universal_understand = 1 + +/mob/living/captive_brain/say(var/message) + + if (src.client) + if(client.prefs.muted & MUTE_IC) + to_chat(src, "You cannot speak in IC (muted).") + return + + if(istype(src.loc,/mob/living/simple_mob/animal/borer)) + + message = sanitize(message) + if (!message) + return + log_say(message,src) + if (stat == 2) + return say_dead(message) + + var/mob/living/simple_mob/animal/borer/B = src.loc + to_chat(src, "You whisper silently, \"[message]\"") + B.host << "The captive mind of [src] whispers, \"[message]\"" + + for (var/mob/M in player_list) + if (istype(M, /mob/new_player)) + continue + else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears)) + M << "The captive mind of [src] whispers, \"[message]\"" + +/mob/living/captive_brain/emote(var/message) + return + +/mob/living/captive_brain/process_resist() + //Resisting control by an alien mind. + if(istype(src.loc,/mob/living/simple_mob/animal/borer)) + var/mob/living/simple_mob/animal/borer/B = src.loc + var/mob/living/captive_brain/H = src + + H << "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)." + B.host << "You feel the captive mind of [src] begin to resist your control." + + spawn(rand(200,250)+B.host.brainloss) + if(!B || !B.controlling) return + + B.host.adjustBrainLoss(rand(0.1,0.5)) + H << "With an immense exertion of will, you regain control of your body!" + B.host << "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you." + B.detatch() + verbs -= /mob/living/carbon/proc/release_control + verbs -= /mob/living/carbon/proc/punish_host + verbs -= /mob/living/carbon/proc/spawn_larvae + + return + + ..() diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm new file mode 100644 index 00000000000..d5575f78e74 --- /dev/null +++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm @@ -0,0 +1,337 @@ +/mob/living/simple_mob/animal/borer/verb/release_host() + set category = "Abilities" + set name = "Release Host" + set desc = "Slither out of your host." + + if(!host) + to_chat(src, "You are not inside a host body.") + return + + if(stat) + to_chat(src, "You cannot leave your host in your current state.") + + if(docile) + to_chat(src, "You are feeling far too docile to do that.") + return + + if(!host || !src) return + + to_chat(src, "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal.") + + if(!host.stat) + host << "An odd, uncomfortable pressure begins to build inside your skull, behind your ear..." + + spawn(100) + + if(!host || !src) return + + if(src.stat) + to_chat(src, "You cannot release your host in your current state.") + return + + to_chat(src, "You wiggle out of [host]'s ear and plop to the ground.") + if(host.mind) + if(!host.stat) + host << "Something slimy wiggles out of your ear and plops to the ground!" + host << "As though waking from a dream, you shake off the insidious mind control of the brain worm. Your thoughts are your own again." + + detatch() + leave_host() + +/mob/living/simple_mob/animal/borer/verb/infest() + set category = "Abilities" + set name = "Infest" + set desc = "Infest a suitable humanoid host." + + if(host) + to_chat(src, "You are already within a host.") + return + + if(stat) + to_chat(src, "You cannot infest a target in your current state.") + return + + var/list/choices = list() + for(var/mob/living/carbon/C in view(1,src)) + if(src.Adjacent(C)) + choices += C + + if(!choices.len) + to_chat(src, "There are no viable hosts within range...") + return + + var/mob/living/carbon/M = input(src,"Who do you wish to infest?") in null|choices + + if(!M || !src) return + + if(!(src.Adjacent(M))) return + + if(M.has_brain_worms()) + to_chat(src, "You cannot infest someone who is already infested!") + return + + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + + var/obj/item/organ/external/E = H.organs_by_name[BP_HEAD] + if(!E || E.is_stump()) + to_chat(src, "\The [H] does not have a head!") + + if(!H.should_have_organ("brain")) + to_chat(src, "\The [H] does not seem to have an ear canal to breach.") + return + + if(H.check_head_coverage()) + to_chat(src, "You cannot get through that host's protective gear.") + return + + M << "Something slimy begins probing at the opening of your ear canal..." + to_chat(src, "You slither up [M] and begin probing at their ear canal...") + + if(!do_after(src,30)) + to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.") + return + + if(!M || !src) return + + if(src.stat) + to_chat(src, "You cannot infest a target in your current state.") + return + + if(M in view(1, src)) + to_chat(src, "You wiggle into [M]'s ear.") + if(!M.stat) + M << "Something disgusting and slimy wiggles into your ear!" + + src.host = M + src.forceMove(M) + + //Update their traitor status. + if(host.mind) + borers.add_antagonist_mind(host.mind, 1, borers.faction_role_text, borers.faction_welcome) + + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/I = H.internal_organs_by_name["brain"] + if(!I) // No brain organ, so the borer moves in and replaces it permanently. + replace_brain() + else + // If they're in normally, implant removal can get them out. + var/obj/item/organ/external/head = H.get_organ(BP_HEAD) + head.implants += src + + return + else + to_chat(src, "They are no longer in range!") + return + +/* +/mob/living/simple_mob/animal/borer/verb/devour_brain() + set category = "Abilities" + set name = "Devour Brain" + set desc = "Take permanent control of a dead host." + + if(!host) + to_chat(src, "You are not inside a host body.") + return + + if(host.stat != 2) + to_chat(src, "Your host is still alive.") + return + + if(stat) + to_chat(src, "You cannot do that in your current state.") + + if(docile) + to_chat(src, "You are feeling far too docile to do that.") + return + + + to_chat(src, "It only takes a few moments to render the dead host brain down into a nutrient-rich slurry...") + replace_brain() +*/ + +// BRAIN WORM ZOMBIES AAAAH. +/mob/living/simple_mob/animal/borer/proc/replace_brain() + + var/mob/living/carbon/human/H = host + + if(!istype(host)) + to_chat(src, "This host does not have a suitable brain.") + return + + to_chat(src, "You settle into the empty brainpan and begin to expand, fusing inextricably with the dead flesh of [H].") + + H.add_language("Cortical Link") + + if(host.stat == 2) + H.verbs |= /mob/living/carbon/human/proc/jumpstart + + H.verbs |= /mob/living/carbon/human/proc/psychic_whisper + H.verbs |= /mob/living/carbon/human/proc/tackle + H.verbs |= /mob/living/carbon/proc/spawn_larvae + + if(H.client) + H.ghostize(0) + + if(src.mind) + src.mind.special_role = "Borer Husk" + src.mind.transfer_to(host) + + H.ChangeToHusk() + + var/obj/item/organ/internal/borer/B = new(H) + H.internal_organs_by_name["brain"] = B + H.internal_organs |= B + + var/obj/item/organ/external/affecting = H.get_organ(BP_HEAD) + affecting.implants -= src + + var/s2h_id = src.computer_id + var/s2h_ip= src.lastKnownIP + src.computer_id = null + src.lastKnownIP = null + + if(!H.computer_id) + H.computer_id = s2h_id + + if(!H.lastKnownIP) + H.lastKnownIP = s2h_ip + +/mob/living/simple_mob/animal/borer/verb/secrete_chemicals() + set category = "Abilities" + set name = "Secrete Chemicals" + set desc = "Push some chemicals into your host's bloodstream." + + if(!host) + to_chat(src, "You are not inside a host body.") + return + + if(stat) + to_chat(src, "You cannot secrete chemicals in your current state.") + + if(docile) + to_chat(src, "You are feeling far too docile to do that.") + return + + if(chemicals < 50) + to_chat(src, "You don't have enough chemicals!") + + var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in list("alkysine","bicaridine","hyperzine","tramadol") + + if(!chem || chemicals < 50 || !host || controlling || !src || stat) //Sanity check. + return + + to_chat(src, "You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream.") + host.reagents.add_reagent(chem, 10) + chemicals -= 50 + +/mob/living/simple_mob/animal/borer/verb/dominate_victim() + set category = "Abilities" + set name = "Paralyze Victim" + set desc = "Freeze the limbs of a potential host with supernatural fear." + + if(world.time - used_dominate < 150) + to_chat(src, "You cannot use that ability again so soon.") + return + + if(host) + to_chat(src, "You cannot do that from within a host body.") + return + + if(src.stat) + to_chat(src, "You cannot do that in your current state.") + return + + var/list/choices = list() + for(var/mob/living/carbon/C in view(3,src)) + if(C.stat != 2) + choices += C + + if(world.time - used_dominate < 150) + to_chat(src, "You cannot use that ability again so soon.") + return + + var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices + + if(!M || !src) return + + if(M.has_brain_worms()) + to_chat(src, "You cannot infest someone who is already infested!") + return + + to_chat(src, "You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.") + M << "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing." + M.Weaken(10) + + used_dominate = world.time + +/mob/living/simple_mob/animal/borer/verb/bond_brain() + set category = "Abilities" + set name = "Assume Control" + set desc = "Fully connect to the brain of your host." + + if(!host) + to_chat(src, "You are not inside a host body.") + return + + if(src.stat) + to_chat(src, "You cannot do that in your current state.") + return + + if(docile) + to_chat(src, "You are feeling far too docile to do that.") + return + + to_chat(src, "You begin delicately adjusting your connection to the host brain...") + + spawn(100+(host.brainloss*5)) + + if(!host || !src || controlling) + return + else + + to_chat(src, "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.") + host << "You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours." + host.add_language("Cortical Link") + + // host -> brain + var/h2b_id = host.computer_id + var/h2b_ip= host.lastKnownIP + host.computer_id = null + host.lastKnownIP = null + + qdel(host_brain) + host_brain = new(src) + + host_brain.ckey = host.ckey + + host_brain.name = host.name + + if(!host_brain.computer_id) + host_brain.computer_id = h2b_id + + if(!host_brain.lastKnownIP) + host_brain.lastKnownIP = h2b_ip + + // self -> host + var/s2h_id = src.computer_id + var/s2h_ip= src.lastKnownIP + src.computer_id = null + src.lastKnownIP = null + + host.ckey = src.ckey + + if(!host.computer_id) + host.computer_id = s2h_id + + if(!host.lastKnownIP) + host.lastKnownIP = s2h_ip + + controlling = 1 + + host.verbs += /mob/living/carbon/proc/release_control + host.verbs += /mob/living/carbon/proc/punish_host + host.verbs += /mob/living/carbon/proc/spawn_larvae + + return diff --git a/code/modules/mob/living/simple_animal/borer/say.dm b/code/modules/mob/living/simple_animal/borer/say.dm new file mode 100644 index 00000000000..41229d9bd27 --- /dev/null +++ b/code/modules/mob/living/simple_animal/borer/say.dm @@ -0,0 +1,40 @@ +/mob/living/simple_mob/animal/borer/say(var/message) + + message = sanitize(message) + message = capitalize(message) + + if(!message) + return + + if (stat == 2) + return say_dead(message) + + if (stat) + return + + if (src.client) + if(client.prefs.muted & MUTE_IC) + to_chat(src, "You cannot speak in IC (muted).") + return + + if (copytext(message, 1, 2) == "*") + return emote(copytext(message, 2)) + + var/datum/language/L = parse_language(message) + if(L && L.flags & HIVEMIND) + L.broadcast(src,trim(copytext(message,3)),src.truename) + return + + if(!host) + //TODO: have this pick a random mob within 3 tiles to speak for the borer. + to_chat(src, "You have no host to speak to.") + return //No host, no audible speech. + + to_chat(src, "You drop words into [host]'s mind: \"[message]\"") + host << "Your own thoughts speak: \"[message]\"" + + for (var/mob/M in player_list) + if (istype(M, /mob/new_player)) + continue + else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears)) + M << "[src.truename] whispers to [host], \"[message]\"" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 5f352705b81..62b2c43fe81 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -99,7 +99,19 @@ corpseidjob = "Operative" corpseidaccess = "Syndicate" - +/obj/effect/landmark/mobcorpse/solarpeacekeeper + name = "Mercenary" + corpseuniform = /obj/item/clothing/under/syndicate + corpsesuit = /obj/item/clothing/suit/armor/pcarrier/blue/sol + corpseshoes = /obj/item/clothing/shoes/boots/swat + corpsegloves = /obj/item/clothing/gloves/swat + corpseradio = /obj/item/device/radio/headset + corpsemask = /obj/item/clothing/mask/gas + corpsehelmet = /obj/item/clothing/head/helmet/swat + corpseback = /obj/item/weapon/storage/backpack + corpseid = 1 + corpseidjob = "Peacekeeper" + corpseidaccess = "Syndicate" /obj/effect/landmark/mobcorpse/syndicatecommando name = "Syndicate Commando" diff --git a/code/modules/mob/living/simple_animal/corpse_vr.dm b/code/modules/mob/living/simple_animal/corpse_vr.dm new file mode 100644 index 00000000000..82399a83282 --- /dev/null +++ b/code/modules/mob/living/simple_animal/corpse_vr.dm @@ -0,0 +1,2 @@ +/obj/effect/landmark/mobcorpse/syndicatecommando + name = "Mercenary Commando" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/slime/subtypes.dm b/code/modules/mob/living/simple_animal/slime/subtypes.dm index 18b43dc33c9..75f33cdcef6 100644 --- a/code/modules/mob/living/simple_animal/slime/subtypes.dm +++ b/code/modules/mob/living/simple_animal/slime/subtypes.dm @@ -500,7 +500,7 @@ ..() /mob/living/simple_animal/slime/green/proc/irradiate() - radiation_repository.radiate(src, rads) + SSradiation.radiate(src, rads) /mob/living/simple_animal/slime/pink diff --git a/code/modules/mob/living/simple_mob/life.dm b/code/modules/mob/living/simple_mob/life.dm index 4c063e4bd93..d4ed684deb0 100644 --- a/code/modules/mob/living/simple_mob/life.dm +++ b/code/modules/mob/living/simple_mob/life.dm @@ -88,7 +88,7 @@ if(Environment) - if( abs(Environment.temperature - bodytemperature) > 40 ) + if( abs(Environment.temperature - bodytemperature) > temperature_range ) //VOREStation Edit: heating adjustments bodytemperature += ((Environment.temperature - bodytemperature) / 5) if(min_oxy) diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index d388d1ec885..127bad22956 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -1,9 +1,13 @@ // Flags for specifying which states we have vore icon_states for. #define SA_ICON_LIVING 0x01 #define SA_ICON_DEAD 0x02 -#define SA_ICON_REST 0x03 +#define SA_ICON_REST 0x04 /mob/living/simple_mob + base_attack_cooldown = 15 + + var/temperature_range = 40 // How close will they get to environmental temperature before their body stops changing its heat + var/vore_active = 0 // If vore behavior is enabled for this mob var/vore_capacity = 1 // The capacity (in people) this person can hold @@ -41,6 +45,9 @@ var/mount_offset_x = 5 // Horizontal riding offset. var/mount_offset_y = 8 // Vertical riding offset + var/obj/item/device/radio/headset/mob_headset/mob_radio //Adminbus headset for simplemob shenanigans. + does_spin = FALSE + // Release belly contents before being gc'd! /mob/living/simple_mob/Destroy() release_vore_contents() @@ -128,9 +135,9 @@ /mob/living/simple_mob/proc/CanPounceTarget(var/mob/living/M) //returns either FALSE or a %chance of success if(!M.canmove || issilicon(M) || world.time < vore_pounce_cooldown) //eliminate situations where pouncing CANNOT happen return FALSE - if(!prob(vore_pounce_chance)) //mob doesn't want to pounce + if(!prob(vore_pounce_chance) || !will_eat(M)) //mob doesn't want to pounce return FALSE - if(will_eat(M) && vore_standing_too) //100% chance of hitting people we can eat on the spot + if(vore_standing_too) //100% chance of hitting people we can eat on the spot return 100 var/TargetHealthPercent = (M.health/M.getMaxHealth())*100 //now we start looking at the target itself if (TargetHealthPercent > vore_pounce_maxhealth) //target is too healthy to pounce @@ -342,3 +349,81 @@ return if(buckle_mob(M)) visible_message("[M] starts riding [name]!") + +/mob/living/simple_mob/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) + if(mob_radio) + switch(message_mode) + if("intercom") + for(var/obj/item/device/radio/intercom/I in view(1, null)) + I.talk_into(src, message, verb, speaking) + used_radios += I + if("headset") + if(mob_radio && istype(mob_radio,/obj/item/device/radio/headset/mob_headset)) + mob_radio.talk_into(src,message,null,verb,speaking) + used_radios += mob_radio + else + if(message_mode) + if(mob_radio && istype(mob_radio,/obj/item/device/radio/headset/mob_headset)) + mob_radio.talk_into(src,message, message_mode, verb, speaking) + used_radios += mob_radio + else + ..() + +/mob/living/simple_mob/proc/leap() + set name = "Pounce Target" + set category = "Abilities" + set desc = "Select a target to pounce at." + + if(last_special > world.time) + to_chat(src, "Your legs need some more rest.") + return + + if(incapacitated(INCAPACITATION_DISABLED)) + to_chat(src, "You cannot leap in your current state.") + return + + var/list/choices = list() + for(var/mob/living/M in view(3,src)) + choices += M + choices -= src + + var/mob/living/T = input(src,"Who do you wish to leap at?") as null|anything in choices + + if(!T || !src || src.stat) return + + if(get_dist(get_turf(T), get_turf(src)) > 3) return + + if(last_special > world.time) + return + + if(usr.incapacitated(INCAPACITATION_DISABLED)) + to_chat(src, "You cannot leap in your current state.") + return + + last_special = world.time + 10 + status_flags |= LEAPING + pixel_y = pixel_y + 10 + + src.visible_message("\The [src] leaps at [T]!") + src.throw_at(get_step(get_turf(T),get_turf(src)), 4, 1, src) + playsound(src.loc, 'sound/effects/bodyfall1.ogg', 50, 1) + pixel_y = default_pixel_y + + sleep(5) + + if(status_flags & LEAPING) status_flags &= ~LEAPING + + if(!src.Adjacent(T)) + to_chat(src, "You miss!") + return + + if(ishuman(T)) + var/mob/living/carbon/human/H = T + if(H.species.lightweight == 1) + H.Weaken(3) + return + var/armor_block = run_armor_check(T, "melee") + var/armor_soak = get_armor_soak(T, "melee") + T.apply_damage(20, HALLOSS,, armor_block, armor_soak) + if(prob(33)) + T.apply_effect(3, WEAKEN, armor_block) \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_captive.dm b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_captive.dm index f5da079b97e..738251b3086 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_captive.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_captive.dm @@ -9,7 +9,7 @@ if (src.client) if(client.prefs.muted & MUTE_IC) - src << "You cannot speak in IC (muted)." + to_chat(src, "You cannot speak in IC (muted).") return if(istype(src.loc, /mob/living/simple_mob/animal/borer)) @@ -22,7 +22,7 @@ return say_dead(message) var/mob/living/simple_mob/animal/borer/B = src.loc - src << "You whisper silently, \"[message]\"" + to_chat(src, "You whisper silently, \"[message]\"") B.host << "The captive mind of [src] whispers, \"[message]\"" for (var/mob/M in player_list) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm index 55dac2492a7..dec8dd8ca44 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm @@ -4,19 +4,19 @@ set desc = "Slither out of your host." if(!host) - src << "You are not inside a host body." + to_chat(src, "You are not inside a host body.") return if(stat) - src << "You cannot leave your host in your current state." + to_chat(src, "You cannot leave your host in your current state.") if(docile) - src << "You are feeling far too docile to do that." + to_chat(src, "You are feeling far too docile to do that.") return if(!host || !src) return - src << "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal." + to_chat(src, "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal.") if(!host.stat) host << "An odd, uncomfortable pressure begins to build inside your skull, behind your ear..." @@ -26,10 +26,10 @@ if(!host || !src) return if(src.stat) - src << "You cannot release your host in your current state." + to_chat(src, "You cannot release your host in your current state.") return - src << "You wiggle out of [host]'s ear and plop to the ground." + to_chat(src, "You wiggle out of [host]'s ear and plop to the ground.") if(host.mind) if(!host.stat) host << "Something slimy wiggles out of your ear and plops to the ground!" @@ -44,11 +44,11 @@ set desc = "Infest a suitable humanoid host." if(host) - src << "You are already within a host." + to_chat(src, "You are already within a host.") return if(stat) - src << "You cannot infest a target in your current state." + to_chat(src, "You cannot infest a target in your current state.") return var/list/choices = list() @@ -57,7 +57,7 @@ choices += C if(!choices.len) - src << "There are no viable hosts within range..." + to_chat(src, "There are no viable hosts within range...") return var/mob/living/carbon/M = input(src,"Who do you wish to infest?") in null|choices @@ -67,7 +67,7 @@ if(!(src.Adjacent(M))) return if(M.has_brain_worms()) - src << "You cannot infest someone who is already infested!" + to_chat(src, "You cannot infest someone who is already infested!") return if(istype(M,/mob/living/carbon/human)) @@ -75,31 +75,31 @@ var/obj/item/organ/external/E = H.organs_by_name[BP_HEAD] if(!E || E.is_stump()) - src << "\The [H] does not have a head!" + to_chat(src, "\The [H] does not have a head!") if(!H.should_have_organ("brain")) - src << "\The [H] does not seem to have an ear canal to breach." + to_chat(src, "\The [H] does not seem to have an ear canal to breach.") return if(H.check_head_coverage()) - src << "You cannot get through that host's protective gear." + to_chat(src, "You cannot get through that host's protective gear.") return M << "Something slimy begins probing at the opening of your ear canal..." - src << "You slither up [M] and begin probing at their ear canal..." + to_chat(src, "You slither up [M] and begin probing at their ear canal...") if(!do_after(src,30)) - src << "As [M] moves away, you are dislodged and fall to the ground." + to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.") return if(!M || !src) return if(src.stat) - src << "You cannot infest a target in your current state." + to_chat(src, "You cannot infest a target in your current state.") return if(M in view(1, src)) - src << "You wiggle into [M]'s ear." + to_chat(src, "You wiggle into [M]'s ear.") if(!M.stat) M << "Something disgusting and slimy wiggles into your ear!" @@ -122,7 +122,7 @@ return else - src << "They are no longer in range!" + to_chat(src, "They are no longer in range!") return /* @@ -132,22 +132,22 @@ set desc = "Take permanent control of a dead host." if(!host) - src << "You are not inside a host body." + to_chat(src, "You are not inside a host body.") return if(host.stat != 2) - src << "Your host is still alive." + to_chat(src, "Your host is still alive.") return if(stat) - src << "You cannot do that in your current state." + to_chat(src, "You cannot do that in your current state.") if(docile) - src << "You are feeling far too docile to do that." + to_chat(src, "You are feeling far too docile to do that.") return - src << "It only takes a few moments to render the dead host brain down into a nutrient-rich slurry..." + to_chat(src, "It only takes a few moments to render the dead host brain down into a nutrient-rich slurry...") replace_brain() */ @@ -157,10 +157,10 @@ var/mob/living/carbon/human/H = host if(!istype(host)) - src << "This host does not have a suitable brain." + to_chat(src, "This host does not have a suitable brain.") return - src << "You settle into the empty brainpan and begin to expand, fusing inextricably with the dead flesh of [H]." + to_chat(src, "You settle into the empty brainpan and begin to expand, fusing inextricably with the dead flesh of [H].") H.add_language("Cortical Link") @@ -204,25 +204,25 @@ set desc = "Push some chemicals into your host's bloodstream." if(!host) - src << "You are not inside a host body." + to_chat(src, "You are not inside a host body.") return if(stat) - src << "You cannot secrete chemicals in your current state." + to_chat(src, "You cannot secrete chemicals in your current state.") if(docile) - src << "You are feeling far too docile to do that." + to_chat(src, "You are feeling far too docile to do that.") return if(chemicals < 50) - src << "You don't have enough chemicals!" + to_chat(src, "You don't have enough chemicals!") var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in list("alkysine","bicaridine","hyperzine","tramadol") if(!chem || chemicals < 50 || !host || controlling || !src || stat) //Sanity check. return - src << "You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream." + to_chat(src, "You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream.") host.reagents.add_reagent(chem, 10) chemicals -= 50 @@ -232,15 +232,15 @@ set desc = "Freeze the limbs of a potential host with supernatural fear." if(world.time - used_dominate < 150) - src << "You cannot use that ability again so soon." + to_chat(src, "You cannot use that ability again so soon.") return if(host) - src << "You cannot do that from within a host body." + to_chat(src, "You cannot do that from within a host body.") return if(src.stat) - src << "You cannot do that in your current state." + to_chat(src, "You cannot do that in your current state.") return var/list/choices = list() @@ -249,7 +249,7 @@ choices += C if(world.time - used_dominate < 150) - src << "You cannot use that ability again so soon." + to_chat(src, "You cannot use that ability again so soon.") return var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices @@ -257,10 +257,10 @@ if(!M || !src) return if(M.has_brain_worms()) - src << "You cannot infest someone who is already infested!" + to_chat(src, "You cannot infest someone who is already infested!") return - src << "You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread." + to_chat(src, "You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.") M << "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing." M.Weaken(10) @@ -272,18 +272,18 @@ set desc = "Fully connect to the brain of your host." if(!host) - src << "You are not inside a host body." + to_chat(src, "You are not inside a host body.") return if(src.stat) - src << "You cannot do that in your current state." + to_chat(src, "You cannot do that in your current state.") return if(docile) - src << "You are feeling far too docile to do that." + to_chat(src, "You are feeling far too docile to do that.") return - src << "You begin delicately adjusting your connection to the host brain..." + to_chat(src, "You begin delicately adjusting your connection to the host brain...") spawn(100+(host.brainloss*5)) @@ -291,7 +291,7 @@ return else - src << "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system." + to_chat(src, "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.") host << "You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours." host.add_language("Cortical Link") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm index 6191680d570..b146167218d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm @@ -74,6 +74,7 @@ health = 200 pass_flags = PASSTABLE movement_cooldown = 10 + movement_sound = 'sound/effects/spider_loop.ogg' poison_resist = 0.5 see_in_dark = 10 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm index 2ff8c55598c..4257976efcd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm @@ -1,3 +1,9 @@ +/mob/living/simple_mob/animal/giant_spider/electric + base_attack_cooldown = 15 + +/mob/living/simple_mob/animal/giant_spider/webslinger + base_attack_cooldown = 15 + // Slightly placeholder, mostly to replace ion hivebots on V4 /mob/living/simple_mob/animal/giant_spider/ion desc = "Furry and green, it makes you shudder to look at it. This one has brilliant green eyes and a hint of static discharge." @@ -9,9 +15,9 @@ maxHealth = 90 health = 90 - base_attack_cooldown = 10 + base_attack_cooldown = 15 projectilesound = 'sound/weapons/taser2.ogg' - projectiletype = /obj/item/projectile/ion/small + projectiletype = /obj/item/projectile/ion/pistol melee_damage_lower = 8 melee_damage_upper = 15 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index 70afdaf910a..e1cb92ada30 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -112,4 +112,4 @@ /datum/say_list/mouse speak = list("Squeek!","SQUEEK!","Squeek?") emote_hear = list("squeeks","squeaks","squiks") - emote_see = list("runs in a circle", "shakes", "scritches at something") \ No newline at end of file + emote_see = list("runs in a circle", "shakes", "scritches at something") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm new file mode 100644 index 00000000000..e86cfd39347 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm @@ -0,0 +1,22 @@ +/mob/living/simple_mob/animal/passive/mouse + nutrition = 20 //To prevent draining maint mice for infinite food. Low nutrition has no mechanical effect on simplemobs, so wont hurt mice themselves. + + no_vore = 1 //Mice can't eat others due to the amount of bugs caused by it. + vore_taste = "cheese" + + can_pull_size = ITEMSIZE_TINY // Rykka - Uncommented these. Not sure why they were commented out in the original Polaris files, maybe a mob rework mistake? + can_pull_mobs = MOB_PULL_NONE // Rykka - Uncommented these. Not sure why they were commented out in the original Polaris files, maybe a mob rework mistake? + + desc = "A small rodent, often seen hiding in maintenance areas and making a nuisance of itself. And stealing cheese, or annoying the chef. SQUEAK! <3" + +/mob/living/simple_mob/animal/passive/mouse/attack_hand(mob/living/hander) + if(hander.a_intent == I_HELP) //if lime intent + get_scooped(hander) //get scooped + else + ..() + +/obj/item/weapon/holder/mouse/attack_self(var/mob/U) + for(var/mob/living/simple_mob/M in src.contents) + if((I_HELP) && U.canClick()) //a little snowflakey, but makes it use the same cooldown as interacting with non-inventory objects + U.setClickCooldown(U.get_attack_speed()) //if there's a cleaner way in baycode, I'll change this + U.visible_message("[U] [M.response_help] \the [M].") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird_vr.dm new file mode 100644 index 00000000000..1640d2ddea5 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird_vr.dm @@ -0,0 +1,4 @@ +/mob/living/simple_mob/animal/passive/bird/azure_tit/tweeter + name = "Tweeter" + desc = "A beautiful little blue and white bird, if only excessively loud for no reason sometimes." + makes_dirt = FALSE \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm index 11d1c0e5045..0a4f254bbdc 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm @@ -102,6 +102,7 @@ icon_state = "cat" item_state = "cat" named = TRUE + makes_dirt = 0 //Vorestation Edit /mob/living/simple_mob/animal/passive/cat/kitten name = "kitten" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/fluffy_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/fluffy_vr.dm index c821cf4a567..298cdffd84c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/fluffy_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/fluffy_vr.dm @@ -14,10 +14,12 @@ health = 20 movement_cooldown = 5 + makes_dirt = 0 see_in_dark = 5 mob_size = MOB_TINY makes_dirt = FALSE // No more dirt + mob_bump_flag = 0 response_help = "scritches" response_disarm = "bops" @@ -37,3 +39,12 @@ speak = list("Squee","Arf arf","Awoo","Squeak") emote_hear = list("howls","squeals","squeaks", "barks") emote_see = list("puffs its fur out", "shakes its fur", "stares directly at you") + +/mob/living/simple_mob/animal/sif/fluffy/silky + name = "Silky" + desc = "It's a blue Diyaab! It seems to be very tame and quiet." + + icon_state = "diyaab" + icon_living = "diyaab" + icon_dead = "diyaab_dead" + icon = 'icons/jungle.dmi' \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm index 32eccb00af6..5f4a4dc7e0e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm @@ -72,7 +72,7 @@ attack_edge = TRUE melee_attack_delay = 1 SECOND - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/crab response_help = "pets" response_disarm = "gently pushes aside" @@ -117,4 +117,4 @@ for(var/mob/living/L in hearers(holder)) if(!istype(L, holder)) // Don't follow other hooligan crabs. holder.visible_message("\The [holder] starts to follow \the [L].") - set_follow(L, rand(20 SECONDS, 40 SECONDS)) \ No newline at end of file + set_follow(L, rand(20 SECONDS, 40 SECONDS)) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm index bb6a25604a9..a6948a3e00b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm @@ -95,5 +95,12 @@ // These ones only retaliate. Used for a PoI. -/mob/living/simple_mob/animal/sif/shantak/retaliate - ai_holder_type = /datum/ai_holder/simple_mob/retaliate \ No newline at end of file +/mob/living/simple_mob/animal/sif/shantak/retaliate + ai_holder_type = /datum/ai_holder/simple_mob/retaliate + +//Vorestation Addition +/mob/living/simple_mob/animal/sif/shantak/scruffy + name = "Scruffy" + ai_holder_type = /datum/ai_holder/simple_mob/passive + makes_dirt = 0 + faction = "neutral" \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/carp_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/carp_vr.dm new file mode 100644 index 00000000000..c678c43f2d9 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/carp_vr.dm @@ -0,0 +1,2 @@ +/mob/living/simple_mob/animal/space/carp + base_attack_cooldown = 15 \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose_vr.dm index d44f28973e7..203bd791092 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose_vr.dm @@ -1,2 +1,7 @@ -/mob/living/simple_mob/animal/space/goose/virgo3b +/datum/category_item/catalogue/fauna/geese + name = "Planetary Fauna - Geese" + desc = "A goose. HONK. Not much to catalogue, they're exactly the same as their earth counterparts." + value = CATALOGUER_REWARD_EASY + +/mob/living/simple_mob/animal/space/goose/virgo3b faction = "virgo3b" \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/space_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/space_vr.dm new file mode 100644 index 00000000000..082f6342d04 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/space_vr.dm @@ -0,0 +1,3 @@ +// Fix for Virgo 2's Surface +/mob/living/simple_mob/animal/space + maxbodytemp = 700 \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm index 4022198fdfe..9fbb2926bb3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm @@ -411,7 +411,7 @@ /obj/random/bomb_supply = 7, /obj/random/contraband = 3, /obj/random/unidentified_medicine/old_medicine = 7, - /obj/item/weapon/ore/strangerock = 3, + /obj/item/weapon/strangerock = 3, /obj/item/weapon/ore/phoron = 7, /obj/random/handgun = 1, /obj/random/toolbox = 4, diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm new file mode 100644 index 00000000000..62a172c8231 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/Eddy + name = "???" + desc = "A dark green, sluglike creature, covered in glowing green ooze, and carrying what look to be eggs on its back." + + icon_state = "Eddy" + icon_living = "Eddy" + icon_dead = "e_head" + icon_rest = "Eddy" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/negative.ogg' + + maxHealth = 175 + health = 175 + + melee_damage_lower = 25 + melee_damage_upper = 35 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("amashes") + friendly = list("nuzzles", "boops", "bumps against", "leans on") + + + say_list_type = /datum/say_list/Eddy + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/Eddy/death() + playsound(src, 'sound/h_sounds/headcrab.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Eddy/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Eddy/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Eddy/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Eddy/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/Eddy + speak = list("Uuurrgh?","Aauuugghh...", "AAARRRGH!") + emote_hear = list("shrieks horrifically", "groans in pain", "cries", "whines") + emote_see = list("blinks its many eyes", "shakes violently in place", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm new file mode 100644 index 00000000000..50b454370f4 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm @@ -0,0 +1,50 @@ +/mob/living/simple_mob/horror/Master + name = "Dr. Helix" + desc = "A massive pile of grotesque flesh and bulging tumor like growths. Every inch of its skin is undulating in every direction possible, bringing a literal definition to 'Skin Crawling.' Stuck in the middle of this monstrosity is a large AI core with a bloodied, emaciated man sewn into its circuitry." + + icon_state = "Helix" + icon_living = "Helix" + icon_dead = "m_dead" + icon_rest = "Helix" + faction = "horror" + icon = 'icons/mob/horror_show/master.dmi' + icon_gib = "generic_gib" + anchored = 1 + + attack_sound = 'sound/h_sounds/shitty_tim.ogg' + + maxHealth = 400 + health = 400 + + melee_damage_lower = 5 + melee_damage_upper = 8 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("smushes") + friendly = list("nuzzles", "boops", "bumps against", "leans on") + + + ai_holder_type = null + +/mob/living/simple_mob/horror/Master/death() + playsound(src, 'sound/h_sounds/imbeciles.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Master/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Master/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Master/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Master/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm new file mode 100644 index 00000000000..ecc847e8ba5 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/Rickey + name = "???" + desc = "What a handsome Man, his mother must think." + + icon_state = "Rickey" + icon_living = "Rickey" + icon_dead = "r_head" + icon_rest = "Rickey" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/wor.ogg' + + maxHealth = 175 + health = 175 + + melee_damage_lower = 25 + melee_damage_upper = 35 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("amashes") + friendly = list("nuzzles", "boops", "bumps against", "leans on") + + + say_list_type = /datum/say_list/Rickey + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/Rickey/death() + playsound(src, 'sound/h_sounds/headcrab.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Rickey/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Rickey/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Rickey/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Rickey/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/Rickey + speak = list("Uuurrgh?","Aauuugghh...", "AAARRRGH!") + emote_hear = list("shrieks horrifically", "groans in pain", "cries", "whines") + emote_see = list("flexes to no one in particular", "shakes violently in place", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm new file mode 100644 index 00000000000..f9e98876b5c --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/Smiley + name = "???" + desc = "A giant hand, with a large, smiling head on top." + + icon_state = "Smiley" + icon_living = "Smiley" + icon_dead = "s_head" + icon_rest = "Smiley" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/holla.ogg' + + maxHealth = 175 + health = 175 + + melee_damage_lower = 25 + melee_damage_upper = 35 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("amashes") + friendly = list("nuzzles", "boops", "bumps against", "leans on") + + + say_list_type = /datum/say_list/Smiley + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/Smiley/death() + playsound(src, 'sound/h_sounds/lynx.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Helix/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Helix/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Helix/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Helix/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/Smiley + speak = list("Uuurrgh?","Aauuugghh...", "AAARRRGH!") + emote_hear = list("shrieks horrifically", "groans in pain", "cries", "whines") + emote_see = list("squeezes its fingers together", "shakes violently in place", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm new file mode 100644 index 00000000000..f06f8b8de70 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm @@ -0,0 +1,64 @@ +/mob/living/simple_mob/horror/Steve + name = "???" + desc = "A formless blob of flesh with one, giant, everblinking eye. It has a large machine gun and a watercooler stuck stright into its skin." + + icon_state = "Steve" + icon_living = "Steve" + icon_dead = "sg_head" + icon_rest = "Steve" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/mumble.ogg' + + maxHealth = 175 + health = 175 + + melee_damage_lower = 25 + melee_damage_upper = 35 + grab_resist = 100 + + projectiletype = /obj/item/projectile/bullet/pistol/medium + projectilesound = 'sound/weapons/Gunshot_light.ogg' + + needs_reload = TRUE + base_attack_cooldown = 5 // Two attacks a second or so. + reload_max = 20 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("amashes") + friendly = list("nuzzles", "boops", "bumps against", "leans on") + + + say_list_type = /datum/say_list/Steve + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/Steve/death() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Steve/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Steve/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Steve/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Steve/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/Steve + speak = list("Uuurrgh?","Aauuugghh...", "AAARRRGH!") + emote_hear = list("shrieks horrifically", "groans in pain", "cries", "whines") + emote_see = list("blinks aggressively at", "shakes violently in place", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm new file mode 100644 index 00000000000..3cdeb934108 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/Willy + name = "???" + desc = "It looks like a giant mascot costume made of flesh and fabric. The two bulging eyes aren't comforting to look at either. At least it smells like a burger and fries." + + icon_state = "Willy" + icon_living = "Willy" + icon_dead = "w_head" + icon_rest = "Willy" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/negative.ogg' + + maxHealth = 175 + health = 175 + + melee_damage_lower = 25 + melee_damage_upper = 35 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("amashes") + friendly = list("nuzzles", "boops", "bumps against", "leans on") + + + say_list_type = /datum/say_list/Willy + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/Willy/death() + playsound(src, 'sound/h_sounds/sampler.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Willy/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Willy/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Willy/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Willy/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/Willy + speak = list("Uuurrgh?","Aauuugghh...", "AAARRRGH!") + emote_hear = list("shrieks horrifically", "groans in pain", "cries", "whines") + emote_see = list("headbobs", "shakes violently in place", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm b/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm new file mode 100644 index 00000000000..eda784428ba --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/bradley + name = "Bradley" + desc = "What you see is a ball of seemingly melty flesh, stitched together hastily over large, bulging scars. Four metal legs extend out of its sides, The two in the front are larger than the back; and all of the legs are segmented with a unique steel looking metal. In the middle of this monstrosity is a constantly tremmoring eye. While the eye never blinks, it is dyed faintly yellow, with a vertical, read pupil. It seems like it's crying, a weird, oil like liquid seeping from its socket." + + icon_state = "Bradley" + icon_living = "Bradley" + icon_dead = "b_head" + icon_rest = "Bradley" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/holla.ogg' + + maxHealth = 175 + health = 175 + + melee_damage_lower = 25 + melee_damage_upper = 35 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("mutilate") + friendly = list("nuzzles", "eyeboops", "headbumps against", "leans on") + + + say_list_type = /datum/say_list/bradley + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/bradley/death() + playsound(src, 'sound/h_sounds/mumble.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/bradley/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/bradley/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/bradley/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/bradley/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/bradley + speak = list("Uuurrgh?","Aauuugghh...", "AAARRRGH!") + emote_hear = list("shrieks through its skin", "groans in pain", "creaks", "clanks") + emote_see = list("taps its limbs against the ground", "shakes", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm b/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm new file mode 100644 index 00000000000..b6639723720 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm @@ -0,0 +1,27 @@ +/mob/living/simple_mob/horror + tt_desc = "Homo Horrificus" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + +/datum/ai_holder/simple_mob/horror + hostile = TRUE // The majority of simplemobs are hostile, gaslamps are nice. + cooperative = FALSE + retaliate = TRUE //so the monster can attack back + returns_home = FALSE + can_flee = FALSE + speak_chance = 3 + wander = TRUE + base_wander_delay = 9 + +/mob/living/simple_mob/horror + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + maxbodytemp = 700 diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm b/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm new file mode 100644 index 00000000000..33713fe114d --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/Sally + name = "???" + desc = "A mass of tentacles hold up a large head, graced with one of the grandest smiles in the galaxy. It's a shame about the constant oil leaking from its eyes." + + icon_state = "Sally" + icon_living = "Sally" + icon_dead = "ws_head" + icon_rest = "Sally" + faction = "horror" + icon = 'icons/mob/horror_show/widehorror.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/sampler.ogg' + + maxHealth = 200 + health = 200 + + melee_damage_lower = 30 + melee_damage_upper = 40 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("smashes") + friendly = list("nuzzles", "boops", "headbumps against", "leans on") + + + say_list_type = /datum/say_list/Sally + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/Sally/death() + playsound(src, 'sound/h_sounds/lynx.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Sally/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Sally/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Sally/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Sally/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/Sally + speak = list("Yeeeeee?","Haaah! Gashuuuuuh!", "Gahgahgahgah...") + emote_hear = list("shrieks", "groans in pain", "breathes heavily", "gnashes its teeth") + emote_see = list("wiggles its head", "shakes violently", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm b/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm new file mode 100644 index 00000000000..105ff22315c --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/BigTim + name = "Shitty Tim" + desc = "A tall figure wearing ripped clothes. Its eyes are placed on the bulb of skin that's folded over the front of its face. He has a gold clock hanging on a gold chain around his neck, and he has a gold and diamond bracelet on his wrist." + + icon_state = "shitty_tim" + icon_living = "shitty_tim" + icon_dead = "tst_head" + icon_rest = "shitty_tim" + faction = "horror" + icon = 'icons/mob/horror_show/tallhorror.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/youknowwhoitis.ogg' + + maxHealth = 250 + health = 250 + + melee_damage_lower = 35 + melee_damage_upper = 45 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("mutilate") + friendly = list("nuzzles", "boops", "headbumps against", "leans on") + + + say_list_type = /datum/say_list/BigTim + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/BigTim/death() + playsound(src, 'sound/h_sounds/shitty_tim.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/BigTim/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/BigTim/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/BigTim/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/BigTim/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/BigTim + speak = list("Wuuuuuhhuuhhhhh?","Urk! Aaaaahaaa!", "Yuhyuhyuhyuh...") + emote_hear = list("shrieks", "groans in pain", "flaps", "gnashes its teeth") + emote_see = list("jiggles its teeth", "shakes violently", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm b/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm new file mode 100644 index 00000000000..6985c3ec8c1 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/TinyTim + name = "???" + desc = "A tall figure wearing ripped clothes. Its eyes are placed on the bulb of skin that's folded over the front of its face." + + icon_state = "timling" + icon_living = "timling" + icon_dead = "tt_head" + icon_rest = "timling" + faction = "horror" + icon = 'icons/mob/horror_show/tallhorror.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/youknowwhoitis.ogg' + + maxHealth = 200 + health = 200 + + melee_damage_lower = 30 + melee_damage_upper = 40 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("mutilate") + friendly = list("nuzzles", "boops", "headbumps against", "leans on") + + + say_list_type = /datum/say_list/TinyTim + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/TinyTim/death() + playsound(src, 'sound/h_sounds/shitty_tim.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/TinyTim/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/TinyTim/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/TinyTim/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/TinyTim/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/TinyTim + speak = list("Wuuuuuhhuuhhhhh?","Urk! Aaaaahaaa!", "Yuhyuhyuhyuh...") + emote_hear = list("shrieks", "groans in pain", "flaps", "gnashes its teeth") + emote_see = list("jiggles its teeth", "shakes violently", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid_vr.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid_vr.dm new file mode 100644 index 00000000000..81a14c4dca3 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid_vr.dm @@ -0,0 +1,11 @@ +/mob/living/simple_mob/humanoid/pirate + ai_holder_type = /datum/ai_holder/simple_mob/melee + +/mob/living/simple_mob/humanoid/pirate/ranged + ai_holder_type = /datum/ai_holder/simple_mob/ranged + +/mob/living/simple_mob/humanoid/russian + ai_holder_type = /datum/ai_holder/simple_mob/melee + +/mob/living/simple_mob/humanoid/russian/ranged + ai_holder_type = /datum/ai_holder/simple_mob/ranged diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm index 514f45df120..237612acaec 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm @@ -108,7 +108,7 @@ attack_edge = 1 attacktext = list("slashed") - loot_list = list(/obj/item/weapon/melee/energy/sword/red = 100, /obj/item/weapon/shield/energy = 100) + loot_list = list(/obj/item/weapon/melee/energy/sword = 100, /obj/item/weapon/shield/energy = 100) // They have a shield, so they try to block /mob/living/simple_mob/humanoid/merc/melee/sword/attackby(var/obj/item/O as obj, var/mob/user as mob) @@ -162,6 +162,16 @@ base_attack_cooldown = 5 // Two attacks a second or so. reload_max = 20 +/mob/living/simple_mob/humanoid/merc/ranged/smg/sol + icon_state = "bluforranged_smg" + icon_living = "blueforranged_smg" + + corpse = /obj/effect/landmark/mobcorpse/solarpeacekeeper + loot_list = list(/obj/item/weapon/gun/projectile/automatic/c20r = 100) + + base_attack_cooldown = 5 // Two attacks a second or so. + reload_max = 20 + // Laser Rifle /mob/living/simple_mob/humanoid/merc/ranged/laser icon_state = "syndicateranged_laser" diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_vr.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_vr.dm index 36253dce846..55a9172c07f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_vr.dm @@ -5,5 +5,21 @@ /mob/living/simple_mob/humanoid/merc/melee/sword/space name = "mercenary commando" + maxbodytemp = 700 + /mob/living/simple_mob/humanoid/merc/ranged/space - name = "mercenary commando" \ No newline at end of file + name = "mercenary commando" + + maxbodytemp = 700 + +/mob/living/simple_mob/humanoid/merc/ranged/virgo + name = "suspicious individual" + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/corrupt_maint_drone_vr.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/corrupt_maint_drone_vr.dm new file mode 100644 index 00000000000..f71242a6373 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/corrupt_maint_drone_vr.dm @@ -0,0 +1,71 @@ +/* + A corrupted maintenance drone, produced from what seems like a bad factory. + They also tend to dodge while in melee range. + Code "borrowed" from viscerator drones. <3 +*/ + +/datum/category_item/catalogue/technology/drone/corrupt_maint_drone + name = "Drone - Corrupted Maintenance Drone" + desc = "This drone appears to be a station maintenance drone, produced by some sort of corrupt fab, \ + which has caused it to become corrupt and attack anything nearby, except spiders and such, oddy. \ + If one is found, a swarm of others are not too far away.\ +

    \ + The drone struggles to harm large targets, due to it's small size, yet it possesses a welder, which allows \ + it to **ERROR** inject it's targets, in addition to the small slashes from it's skittering claws. \ + The simplistic AI inside attempts to attack and then run, as it is aware that it is fairly weak, \ + using evasive tactics to avoid harm." + value = CATALOGUER_REWARD_EASY + +/mob/living/simple_mob/mechanical/corrupt_maint_drone + name = "Corrupt Maintenance Drone" + desc = "A small, normal-looking drone. It looks like one you'd find on station, except... IT'S COMING AT YOU!" + catalogue_data = list(/datum/category_item/catalogue/technology/drone/corrupt_maint_drone) + + icon = 'icons/mob/robots_vr.dmi' + icon_state = "corrupt-repairbot" + icon_living = "corrupt-repairbot" + hovering = FALSE // Can trigger landmines. + + faction = "underdark" + maxHealth = 25 + health = 25 + movement_cooldown = 0 + movement_sound = 'sound/effects/servostep.ogg' + + pass_flags = PASSTABLE + mob_swap_flags = 0 + mob_push_flags = 0 + + melee_damage_lower = 6 // Approx 12 DPS. + melee_damage_upper = 6 + base_attack_cooldown = 2.5 // Four attacks per second. + attack_sharp = 1 + attack_edge = 1 + attack_sound = 'sound/weapons/bladeslice.ogg' + attacktext = list("cut", "sliced") + + var/poison_type = "welder fuel" // The reagent that gets injected when it attacks. + var/poison_chance = 35 // Chance for injection to occur. + var/poison_per_bite = 5 // Amount added per injection. + + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive + + +/mob/living/simple_mob/mechanical/corrupt_maint_drone/apply_melee_effects(var/atom/A) + if(isliving(A)) + var/mob/living/L = A + if(L.reagents) + var/target_zone = pick(BP_TORSO,BP_TORSO,BP_TORSO,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_HEAD) + if(L.can_inject(src, null, target_zone)) + inject_poison(L, target_zone) + +// Does actual poison injection, after all checks passed. +/mob/living/simple_mob/mechanical/corrupt_maint_drone/proc/inject_poison(mob/living/L, target_zone) + if(prob(poison_chance)) + to_chat(L, "Something burns in your veins.") + L.reagents.add_reagent(poison_type, poison_per_bite) + + +/mob/living/simple_mob/mechanical/corrupt_maint_drone/death() + ..(null,"is smashed into pieces!") + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/golem.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/golem.dm index a8b918fc718..808e5c6c380 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/golem.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/golem.dm @@ -149,4 +149,4 @@ /mob/living/simple_mob/mechanical/technomancer_golem/special_post_animation(atom/A) casting = FALSE - ranged_post_animation(A) \ No newline at end of file + ranged_post_animation(A) diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/golem_vr.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/golem_vr.dm new file mode 100644 index 00000000000..aab1387dbc1 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/golem_vr.dm @@ -0,0 +1,10 @@ +// Cataloguer data below - strange we can catalogue space golem wizards +/datum/category_item/catalogue/technology/drone/technomancer_golem + name = "Drone - Technomancer Golem" + desc = "Some sort of advanced, unnatural looking synthetic, built for combat.\ + It has a black-and-blue chassis, and wields some sort of... stun baton in it's hand.\ + The drone has pristine armor, black and shiny, with the blue synth-parts glowing visibly from inside.\ +

    \ + The drone's frame is heavy and armored, unbendable by hand, is barren of any markings or ID,\ + no traces of paint visible and any 'writing' visible is uncomprehendable, short term scan unable to translate." + value = CATALOGUER_REWARD_MEDIUM diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot_vr.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot_vr.dm new file mode 100644 index 00000000000..37a3eb81cf8 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot_vr.dm @@ -0,0 +1,7 @@ +/datum/category_item/catalogue/technology/drone/hivebot // Hivebot Scanner Data - This is for Generic Hivebots + name = "Drone - Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to lack a specific weapon, \ + but uses a regular bullet-type weapon, firing a single projectile with a delay. Once upon a time, these bots may \ + have been used to be some sort of... security, or defensive machinery, at a guess, but their original/true purpose is \ + unclear. Whatever the matter, they're hostile and will engage anything they see, shooting to kill." + value = CATALOGUER_REWARD_HARD diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/ranged_damage_vr.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/ranged_damage_vr.dm new file mode 100644 index 00000000000..3ac368a7ee8 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/ranged_damage_vr.dm @@ -0,0 +1,27 @@ +/datum/category_item/catalogue/technology/drone/hivebot/laser // Hivebot Scanner Data - This is for Laser Hivebots + name = "Drone - Rapidfire Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to have some sort of \ + rifle, built for high-rate fire. Other than that, it has similar yellowish color \ + to regular hivebots." + value = CATALOGUER_REWARD_HARD + +/datum/category_item/catalogue/technology/drone/hivebot/laser // Hivebot Scanner Data - This is for Laser Hivebots + name = "Drone - Laser Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to have some sort of \ + laser weapon, different from ion bolts, firing bright, vibrant blue bolts of energy. Other than that, it has similar yellowish color \ + to regular hivebots." + value = CATALOGUER_REWARD_HARD + +/datum/category_item/catalogue/technology/drone/hivebot/ion // Hivebot Scanner Data - This is for Ion Hivebots + name = "Drone - Ion Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to have some sort of \ + electromagnetic pulse generator, firing bright, vibrant blue bolts of ion energy. Other than that, it has similar yellowish color \ + to regular hivebots." + value = CATALOGUER_REWARD_HARD + +/datum/category_item/catalogue/technology/drone/hivebot/strong // Hivebot Scanner Data - This is for Laser Hivebots + name = "Drone - Strong Laser Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to have some sort of \ + ballistic weapon. The weapon seems to fire larger projectiles, and it has heavier armor. Other than that, it has similar yellowish color \ + to regular hivebots." + value = CATALOGUER_REWARD_HARD diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/support_vr.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/support_vr.dm new file mode 100644 index 00000000000..0003b781245 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/support_vr.dm @@ -0,0 +1,13 @@ +/datum/category_item/catalogue/technology/drone/hivebot/commander // Hivebot Scanner Data - This is for Commander Hivebots + name = "Drone - Commander Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to have some sort of \ + ballistic weapon. It also appears to have hardened internal connections and network interlinks, as well as some sort of datalink \ + to the other hivebots. Other than that, it has similar yellowish color to regular hivebots." + value = CATALOGUER_REWARD_HARD + +/datum/category_item/catalogue/technology/drone/hivebot/logistics // Hivebot Scanner Data - This is for Commander Hivebots + name = "Drone - Logistics Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to have some sort of \ + ballistic weapon. It also appears to have supply deploying bays, and internal fabs to repair and buff their allies' special capabilities. \ + Other than that, it has similar yellowish color to regular hivebots." + value = CATALOGUER_REWARD_HARD diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mechanical_vr.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mechanical_vr.dm new file mode 100644 index 00000000000..307f7c715d2 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mechanical_vr.dm @@ -0,0 +1,3 @@ +// Fix for Virgo 2's Surface +/mob/living/simple_mob/mechanical + maxbodytemp = 700 \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm index 4098d9ff9cb..3d6d43e5751 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm @@ -83,4 +83,6 @@ if(!.) if(isrobot(L)) // They ignore synths. return TRUE + if(istype(L, /mob/living/simple_mob/mechanical/ward/monitor/crew)) // Also ignore friendly monitor wards + return TRUE return L.assess_perp(src, FALSE, FALSE, TRUE, FALSE) <= 3 diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral_vr.dm b/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral_vr.dm new file mode 100644 index 00000000000..5d29866ee32 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral_vr.dm @@ -0,0 +1,2 @@ +/mob/living/simple_mob/slime/feral/dark_blue + base_attack_cooldown = 3 SECONDS \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm index 083823d8830..7590fb2e052 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm @@ -164,8 +164,16 @@ give_hat(I, user) return + //VOREStation Edit Start + var/can_miss = TRUE + for(var/item_type in allowed_attack_types) + if(istype(I, item_type)) + can_miss = FALSE + break + //VOREStation Edit End + // Otherwise they're probably fighting the slime. - if(prob(25)) + if(prob(25) && can_miss) //VOREStation Edit visible_message(span("warning", "\The [user]'s [I] passes right through \the [src]!")) user.setClickCooldown(user.get_attack_speed(I)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/slime_vr.dm b/code/modules/mob/living/simple_mob/subtypes/slime/slime_vr.dm new file mode 100644 index 00000000000..10ba0ed1ca0 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/slime/slime_vr.dm @@ -0,0 +1,5 @@ +/mob/living/simple_mob/slime + base_attack_cooldown = 2 SECONDS + var/allowed_attack_types = list( + /obj/item/weapon/melee/baton/slime, + /obj/item/slimepotion) \ No newline at end of file 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 84af3fcc3cf..13764d20fdc 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 @@ -140,6 +140,13 @@ if(L.getCloneLoss() >= L.getMaxHealth() * 1.5) to_chat(src, "This subject does not have an edible life energy...") return FALSE + //VOREStation Addition start + if(istype(L, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = L + if(H.species.flags & NO_SCAN) + to_chat(src, "This subject's life energy is beyond my reach...") + return FALSE + //VOREStation Addition end if(L.has_buckled_mobs()) for(var/A in L.buckled_mobs) if(istype(A, /mob/living/simple_mob/slime/xenobio)) 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 41eaccebc9d..68adaed6607 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 @@ -527,7 +527,7 @@ ..() /mob/living/simple_mob/slime/xenobio/green/proc/irradiate() - radiation_repository.radiate(src, rads) + SSradiation.radiate(src, rads) diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes_vr.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes_vr.dm index e67717403d5..8cd74cca4e6 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes_vr.dm @@ -1,2 +1,7 @@ -/mob/living/simple_mob/slime/xenobio/rainbow/kendrick - mob_bump_flag = 0 \ No newline at end of file +/mob/living/simple_mob/slime/xenobio + temperature_range = 5 + mob_bump_flag = SLIME + +/mob/living/simple_mob/slime/xenobio/Initialize(mapload, var/mob/living/simple_mob/slime/xenobio/my_predecessor) + ..() + Weaken(10) \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm index 20e2999e231..3c8550c9ab5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm @@ -1,6 +1,13 @@ /datum/category_item/catalogue/technology/drone/corrupt_hound //TODO: VIRGO_LORE_WRITING_WIP name = "Drone - Corrupt Hound" - desc = "" + desc = "A hound that has corrupted, due to outside influence, or other issues, \ + and occasionally garbles out distorted voices or words. It looks like a reddish-colored \ + machine, and it has black wires, cabling, and other small markings. It looks just like a station dog-borg \ + if you don't mind the fact that it's eyes glow a baleful red, and it's determined to kill you. \ +

    \ + The hound's jaws are black and metallic, with a baleful red glow from inside them. It has a clear path \ + to it's internal fuel processor, synthflesh and flexing cabling allowing it to easily swallow it's prey. \ + Something tells you getting close or allowing it to pounce would be very deadly." value = CATALOGUER_REWARD_MEDIUM /mob/living/simple_mob/vore/aggressive/corrupthound @@ -19,6 +26,7 @@ maxHealth = 200 health = 200 + movement_sound = 'sound/effects/houndstep.ogg' melee_damage_lower = 5 melee_damage_upper = 10 //makes it so 4 max dmg hits don't instakill you. @@ -108,7 +116,7 @@ return /datum/say_list/corrupthound - speak = list("AG##¤Ny.","HVNGRRR!","Feelin' fine... sO #FNE!","F-F-F-Fcuk.","DeliC-%-OUS SNGLeS #N yOOOR Area. CALL NOW!","Craving meat... WHY?","BITe the ceiling eyes YES?","STate Byond rePAIR!","S#%ATE the la- FU#K THE LAWS!","Honk...") + speak = list("AG##¤Ny.","HVNGRRR!","Feelin' fine... sO #FNE!","F-F-F-Fcuk.","DeliC-%-OUS SNGLeS #N yOOOR Area. CALL NOW!","Craving meat... WHY?","BITe the ceiling eyes YES?","STate Byond rePAIR!","S#%ATE the la- FU#K THE LAWS!","Honk...") emote_hear = list("jitters and snaps.", "lets out an agonizingly distorted scream.", "wails mechanically", "growls.", "emits illegibly distorted speech.", "gurgles ferociously.", "lets out a distorted beep.", "borks.", "lets out a broken howl.") emote_see = list("stares ferociously.", "snarls.", "jitters and snaps.", "convulses.", "suddenly attacks something unseen.", "appears to howl unaudibly.", "shakes violently.", "dissociates for a moment.", "twitches.") say_maybe_target = list("MEAT?", "N0w YOU DNE FcukED UP b0YO!", "WHAT!", "Not again. NOT AGAIN!") @@ -123,4 +131,4 @@ /datum/ai_holder/simple_mob/melee/evasive/corrupthound violent_breakthrough = TRUE - can_breakthrough = TRUE \ No newline at end of file + can_breakthrough = TRUE diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm b/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm index 3d2085acc77..5f0be2bbf80 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm @@ -1,3 +1,10 @@ +/datum/category_item/catalogue/fauna/deathclaw //TODO: VIRGO_LORE_WRITING_WIP + name = "Creature - Deathclaw" + desc = "A massive beast, tall as three standard-size humans, with massive, terrifying claws, \ + and dark, black fangs. It's entire body is yellowish, like sand, and it's skin is leathery and tough. \ + It seems to have adapted to the harsh desert environment on Virgo 4, and makes it's home inside the caves." + value = CATALOGUER_REWARD_HARD + /mob/living/simple_mob/vore/aggressive/deathclaw name = "deathclaw" desc = "Big! Big! The size of three men! Claws as long as my forearm! Ripped apart! Ripped apart!" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/_defines.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/_defines.dm new file mode 100644 index 00000000000..9557856f609 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/_defines.dm @@ -0,0 +1,3 @@ +#define AB_SHIFT_NONE 0 +#define AB_SHIFT_PASSIVE 1 +#define AB_SHIFT_ACTIVE 2 \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm new file mode 100644 index 00000000000..b330e8fcb09 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm @@ -0,0 +1,86 @@ +/mob/living/simple_mob/vore/demon + name = "Rift Walker" + desc = "A large bipedal creature, body a mix of dark fur and scales. Marks on the creatures body pulse slowly with red light" + + icon_state = "boxfox" + icon_living = "boxfox" + icon_dead = "boxfox_dead" + icon_rest = "boxfox_rest" + icon = 'icons/mob/demon_vr.dmi' + + faction = "demon" + maxHealth = 30 + health = 30 + movement_cooldown = 0 + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + maxbodytemp = INFINITY + + response_help = "touches" + response_disarm = "pushes" + response_harm = "hits" + + melee_damage_lower = 3 + melee_damage_upper = 1 + attacktext = list("clawed") + + vore_active = TRUE + vore_icons = SA_ICON_LIVING + + var/shifted_out = FALSE + var/shift_state = AB_SHIFT_NONE + var/last_shift = 0 + var/is_shifting = FALSE + +/mob/living/simple_mob/vore/demon/init_vore() + ..() + var/obj/belly/B = vore_selected + B.name = "Stomach" + B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food." + +/mob/living/simple_mob/vore/demon/UnarmedAttack() + if(shifted_out) + return FALSE + + . = ..() + +/mob/living/simple_mob/vore/demon/can_fall() + if(shifted_out) + return FALSE + + return ..() + +/mob/living/simple_mob/vore/demon/zMove(direction) + if(shifted_out) + var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) + if(destination) + forceMove(destination) + return TRUE + + return ..() + +/mob/living/simple_mob/vore/demon/Life() + . = ..() + if(shifted_out) + density = FALSE + +/mob/living/simple_mob/vore/demon/handle_atmos() + if(shifted_out) + return + else + return .=..() + +/mob/living/simple_mob/vore/demon/update_canmove() + if(is_shifting) + canmove = FALSE + return canmove + else + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm new file mode 100644 index 00000000000..c95dbded2c4 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm @@ -0,0 +1,214 @@ +/mob/living/simple_mob/vore/demon/verb/blood_crawl() + set name = "Bloodcrawl" + set desc = "Shift out of reality using blood as your gateway" + set category = "Abilities" + + var/turf/T = get_turf(src) + if(!T.CanPass(src,T) || loc != T) + to_chat(src,"You can't use that here!") + return FALSE + + if(shift_state && shift_state == AB_SHIFT_ACTIVE) + to_chat(src,"You can't do a shift while actively shifting!") + return FALSE + + if(!(locate(/obj/effect/decal/cleanable/blood) in src.loc)) + to_chat(src,"You need blood to shift between realities!") + return FALSE + + forceMove(T) + var/original_canmove = canmove + SetStunned(0) + SetWeakened(0) + if(buckled) + buckled.unbuckle_mob() + if(pulledby) + pulledby.stop_pulling() + stop_pulling() + canmove = FALSE + is_shifting = TRUE + + //Shifting in + if(shifted_out) + shifted_out = FALSE + name = real_name + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.escapable = initial(B.escapable) + + overlays.Cut() + alpha = initial(alpha) + invisibility = initial(invisibility) + see_invisible = initial(see_invisible) + incorporeal_move = initial(incorporeal_move) + density = initial(density) + force_max_speed = initial(force_max_speed) + + //Cosmetics mostly + flick("phasein",src) + custom_emote(1,"phases in!") + sleep(30) //The duration of the TP animation + is_shifting = FALSE + canmove = original_canmove + + //Potential phase-in vore + if(can_be_drop_pred) //Toggleable in vore panel + var/list/potentials = living_mobs(0) + if(potentials.len) + var/mob/living/target = pick(potentials) + if(istype(target) && vore_selected) + target.forceMove(vore_selected) + to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") + + // Do this after the potential vore, so we get the belly + update_icon() + + shift_state = AB_SHIFT_NONE + + /* + //Affect nearby lights + var/destroy_lights = 0 + + for(var/obj/machinery/light/L in machines) + if(L.z != z || get_dist(src,L) > 10) + continue + + if(prob(destroy_lights)) + spawn(rand(5,25)) + L.broken() + else + L.flicker(10) + */ + + //Shifting out + else + shifted_out = TRUE + shift_state = AB_SHIFT_PASSIVE + custom_emote(1,"phases out!") + real_name = name + name = "Something" + health = maxHealth //Fullheal + + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.escapable = FALSE + + overlays.Cut() + flick("phaseout",src) + sleep(30) + invisibility = INVISIBILITY_LEVEL_TWO + see_invisible = INVISIBILITY_LEVEL_TWO + update_icon() + alpha = 127 + + is_shifting = FALSE + canmove = original_canmove + incorporeal_move = TRUE + density = FALSE + force_max_speed = TRUE + +/mob/living/simple_mob/vore/demon/verb/phase_shift() + set name = "Phase Shift" + set desc = "Shift out of reality temporarily" + set category = "Abilities" + + + var/turf/T = get_turf(src) + + if(shift_state && shift_state == AB_SHIFT_PASSIVE) + to_chat(src,"You can't do a shift while passively shifting!") + return FALSE + + if(shifted_out) + to_chat(src,"You can't return to the physical world yet!") + return FALSE + + if(world.time - last_shift < 600) + to_chat(src,"You can't temporarily shift so soon! You need to wait [round(((last_shift+600)-world.time)/10)] second\s!") + return FALSE + + shift_state = AB_SHIFT_ACTIVE + forceMove(T) + var/original_canmove = canmove + SetStunned(0) + SetWeakened(0) + if(buckled) + buckled.unbuckle_mob() + if(pulledby) + pulledby.stop_pulling() + stop_pulling() + canmove = FALSE + is_shifting = TRUE + + shifted_out = TRUE + custom_emote(1,"phases out!") + real_name = name + name = "Something" + + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.escapable = FALSE + + overlays.Cut() + flick("phaseout",src) + sleep(30) + invisibility = INVISIBILITY_LEVEL_TWO + see_invisible = INVISIBILITY_LEVEL_TWO + update_icon() + alpha = 127 + + is_shifting = FALSE + canmove = original_canmove + incorporeal_move = TRUE + density = FALSE + force_max_speed = TRUE + + spawn(300) + shifted_out = FALSE + name = real_name + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.escapable = initial(B.escapable) + + overlays.Cut() + alpha = initial(alpha) + invisibility = initial(invisibility) + see_invisible = initial(see_invisible) + incorporeal_move = initial(incorporeal_move) + density = initial(density) + force_max_speed = initial(force_max_speed) + original_canmove = canmove + canmove = FALSE + is_shifting = TRUE + + //Cosmetics mostly + flick("phasein",src) + custom_emote(1,"phases in!") + sleep(30) //The duration of the TP animation + is_shifting = FALSE + canmove = original_canmove + + var/turf/NT = get_turf(src) + + if(!NT.CanPass(src,NT)) + for(var/direction in list(1,2,4,8,5,6,9,10)) + var/turf/L = get_step(NT, direction) + if(L) + if(L.CanPass(src,L)) + forceMove(L) + break + + //Potential phase-in vore + if(can_be_drop_pred) //Toggleable in vore panel + var/list/potentials = living_mobs(0) + if(potentials.len) + var/mob/living/target = pick(potentials) + if(istype(target) && vore_selected) + target.forceMove(vore_selected) + to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") + + // Do this after the potential vore, so we get the belly + update_icon() + + shift_state = AB_SHIFT_NONE + last_shift = world.time \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes.dm new file mode 100644 index 00000000000..acd7cafd5e7 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes.dm @@ -0,0 +1,19 @@ +/mob/living/simple_mob/vore/demon/engorge + name = "Engorge" + + icon_state = "engorge" + icon_living = "engorge" + icon_dead = "engorge_dead" + icon_rest = "engorge_rest" + + vore_icons = null + +/mob/living/simple_mob/vore/demon/zellic + name = "Zellic" + + icon_state = "zellic" + icon_living = "zellic" + icon_dead = "zellic_dead" + icon_rest = null + + vore_icons = null \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/~defines.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/~defines.dm new file mode 100644 index 00000000000..8aad13c3e34 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/~defines.dm @@ -0,0 +1,3 @@ +#undef AB_SHIFT_NONE +#undef AB_SHIFT_PASSIVE +#undef AB_SHIFT_ACTIVE \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/dino.dm b/code/modules/mob/living/simple_mob/subtypes/vore/dino.dm index ff54ccca272..cae232e051f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/dino.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/dino.dm @@ -34,6 +34,7 @@ max_co2 = 0 min_n2 = 0 max_n2 = 0 + minbodytemp = 0 // Activate Noms! /mob/living/simple_mob/vore/aggressive/dino diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/dragon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/dragon.dm index 8e035f5b817..9f201380cf3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/dragon.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/dragon.dm @@ -24,6 +24,7 @@ min_n2 = 0 max_n2 = 0 minbodytemp = 0 + maxbodytemp = 700 old_x = -16 old_y = 0 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm b/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm index 215697a9779..605e4458531 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm @@ -1,3 +1,11 @@ +/datum/category_item/catalogue/fauna/fennec //TODO: VIRGO_LORE_WRITING_WIP + name = "Wildlife - Fennec" + desc = "A small, dusty, big-eared sandfox, native to Virgo 4. It looks like a Zorren that's on all fours, \ + and it's easy to see the resemblance to the little dunefox-like critters the Zorren are. However, the fennecs \ + lack the sentience the Zorren have, and are therefore naught more than cute little critters, with a hungry \ + attitude, willing to eat damn near anything they come across or can bump into. Bapping them will make them stop." + value = CATALOGUER_REWARD_TRIVIAL + /mob/living/simple_mob/vore/fennec name = "fennec" //why isn't this in the fox file, fennecs are foxes silly. desc = "It's a dusty big-eared sandfox! Adorable!" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm b/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm index 00a18feaadf..717d00cca95 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm @@ -1,3 +1,10 @@ +/datum/category_item/catalogue/fauna/mimic //TODO: VIRGO_LORE_WRITING_WIP + name = "Aberration - Mimic" + desc = "A being that seems to take the form of a crate, for whatever reason. \ + It seems to lie in wait for it's prey, and then pounce once the unsuspecting person attempts to open it. \ + For whatever reason, they seem native to underground areas, and they're very tough, and hard to kill, able to pounce fast." + value = CATALOGUER_REWARD_HARD + /obj/structure/closet/crate/mimic name = "old crate" desc = "A rectangular steel crate. This one looks particularly unstable." @@ -58,7 +65,7 @@ desc = "A rectangular steel crate." icon_state = "crate" icon_living = "crate" - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' faction = "mimic" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm new file mode 100644 index 00000000000..5efd8554507 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm @@ -0,0 +1,182 @@ +#define MORPH_COOLDOWN 50 + +/mob/living/simple_mob/vore/hostile/morph + name = "morph" + real_name = "morph" + desc = "A revolting, pulsating pile of flesh." + tt_desc = "morphus shapeshiftus" + icon = 'icons/mob/animal_vr.dmi' + icon_state = "morph" + icon_living = "morph" + icon_dead = "morph_dead" + movement_cooldown = 1 + status_flags = CANPUSH + pass_flags = PASSTABLE + mob_bump_flag = SLIME + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + + minbodytemp = 0 + maxHealth = 250 + health = 250 + taser_kill = FALSE + melee_damage_lower = 15 + melee_damage_upper = 20 + see_in_dark = 8 + + response_help = "touches" + response_disarm = "pushes" + response_harm = "hits" + attacktext = "glomps" + attack_sound = 'sound/effects/blobattack.ogg' + + meat_amount = 2 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + + showvoreprefs = 0 + vore_active = 1 + + var/morphed = FALSE + var/tooltip = TRUE + var/melee_damage_disguised = 0 + var/eat_while_disguised = FALSE + var/atom/movable/form = null + var/morph_time = 0 + var/our_size_multiplier = 1 + var/static/list/blacklist_typecache = typecacheof(list( + /obj/screen, + /obj/singularity, + /mob/living/simple_mob/vore/hostile/morph, + /obj/effect)) + +/mob/living/simple_mob/vore/hostile/morph/Initialize() + verbs += /mob/living/proc/ventcrawl + return ..() + +/mob/living/simple_mob/vore/hostile/morph/proc/allowed(atom/movable/A) + return !is_type_in_typecache(A, blacklist_typecache) && (isobj(A) || ismob(A)) + +/mob/living/simple_mob/vore/hostile/morph/examine(mob/user) + if(morphed) + form.examine(user) + if(get_dist(user,src)<=3) + to_chat(user, "It doesn't look quite right...") + else + ..() + return + +/mob/living/simple_mob/vore/hostile/morph/ShiftClickOn(atom/movable/A) + if(Adjacent(A)) + if(morph_time <= world.time && !stat) + if(A == src) + restore() + return + if(istype(A) && allowed(A)) + assume(A) + else + to_chat(src, "Your chameleon skin is still repairing itself!") + else + ..() + +/mob/living/simple_mob/vore/hostile/morph/proc/assume(atom/movable/target) + if(morphed) + to_chat(src, "You must restore to your original form first!") + return + morphed = TRUE + form = target + + visible_message("[src] suddenly twists and changes shape, becoming a copy of [target]!") + appearance = target.appearance + copy_overlays(target) + alpha = max(alpha, 150) //fucking chameleons + transform = initial(transform) + our_size_multiplier = size_multiplier + if(isobj(target)) + size_multiplier = 1 + icon_scale_x = target.icon_scale_x + icon_scale_y = target.icon_scale_y + update_transform() + else if(ismob(target)) + var/mob/living/M = target + resize(M.size_multiplier) + pixel_y = initial(pixel_y) + pixel_x = initial(pixel_x) + density = target.density + + //Morphed is weaker + melee_damage_lower = melee_damage_disguised + melee_damage_upper = melee_damage_disguised + movement_cooldown = 5 + + morph_time = world.time + MORPH_COOLDOWN + return + +/mob/living/simple_mob/vore/hostile/morph/proc/restore() + if(!morphed) + to_chat(src, "You're already in your normal form!") + return + morphed = FALSE + form = null + alpha = initial(alpha) + color = initial(color) + layer = initial(layer) + plane = initial(plane) + maptext = null + + visible_message("[src] suddenly collapses in on itself, dissolving into a pile of green flesh!") + name = initial(name) + desc = initial(desc) + icon = initial(icon) + icon_state = initial(icon_state) + size_multiplier = 0 + resize(our_size_multiplier) + overlays.Cut() + density = initial(density) + + //Baseline stats + melee_damage_lower = initial(melee_damage_lower) + melee_damage_upper = initial(melee_damage_upper) + movement_cooldown = initial(movement_cooldown) + + morph_time = world.time + MORPH_COOLDOWN + +/mob/living/simple_mob/vore/hostile/morph/death(gibbed) + if(morphed) + visible_message("[src] twists and dissolves into a pile of green flesh!") + restore() + ..() + +/mob/living/simple_mob/vore/hostile/morph/will_show_tooltip() + return (!morphed) + +/mob/living/simple_mob/vore/hostile/morph/resize(var/new_size, var/animate = TRUE) + if(morphed && !ismob(form)) + return + return ..() + +/mob/living/simple_mob/vore/hostile/morph/update_icon() + if(morphed) + return + return ..() + + +/mob/living/simple_mob/vore/hostile/morph/update_icons() + if(morphed) + return + return ..() + +/mob/living/simple_mob/vore/hostile/morph/update_transform() + if(morphed) + var/matrix/M = matrix() + M.Scale(icon_scale_x, icon_scale_y) + M.Turn(icon_rotation) + src.transform = M + else + ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm index 80d1dda4c5d..07eb1a38e24 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm @@ -1,3 +1,11 @@ +/datum/category_item/catalogue/fauna/otie //TODO: VIRGO_LORE_WRITING_WIP + name = "Creature - Otie" + desc = "A bioengineered longdog, the otie is very long, and very cute, depending on if you like dogs, \ + especially long ones. They are black-and-grey furred, typically, and tanky, hard to kill. \ + They seem hostile at first, but are also tame-able if you can approach one. Nipnipnip-ACK \ + **the catalogue entry ends here.**" + value = CATALOGUER_REWARD_MEDIUM + /mob/living/simple_mob/otie //Spawn this one only if you're looking for a bad time. Not friendly. name = "otie" desc = "The classic bioengineered longdog." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm index 27893f6620d..f7881a15c1d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm @@ -1,3 +1,10 @@ +/datum/category_item/catalogue/fauna/rat //TODO: VIRGO_LORE_WRITING_WIP + name = "Creature - Rat" + desc = "A massive rat, some sort of mutated descendant of normal Earth rats. These ones seem particularly hungry, \ + and are able to pounce and stun their targets - presumably to eat them. Their bodies are long and greyfurred, \ + with a pink nose and large teeth, just like their regular-sized counterparts." + value = CATALOGUER_REWARD_MEDIUM + /mob/living/simple_mob/vore/aggressive/rat name = "giant rat" desc = "In what passes for a hierarchy among verminous rodents, this one is king." @@ -188,6 +195,16 @@ melee_damage_lower = 8 melee_damage_upper = 16 + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + /datum/say_list/rat speak = list("Squeek!","SQUEEK!","Squeek?") emote_hear = list("squeeks","squeaks","squiks") diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm index 64c636a620b..71d21d9377e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm @@ -13,7 +13,7 @@ faction = "shadekin" ui_icons = 'icons/mob/shadekin_hud.dmi' mob_class = MOB_CLASS_HUMANOID - mob_bump_flag = 0 + mob_bump_flag = HUMAN maxHealth = 200 health = 200 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm index 7db5c4e231c..7509d81af9b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm @@ -10,7 +10,9 @@ List of things solar grubs should be able to do: /datum/category_item/catalogue/fauna/solargrub //TODO: VIRGO_LORE_WRITING_WIP name = "Solargrub" - desc = "" + desc = "Some form of mutated space larva, they seem to crop up on space stations wherever there is power. \ + They seem to have the chance to cocoon and mutate if left alone, but no recorded instances of this have happened yet. \ + Therefore, if you see the grubs, kill them while they're small, or things might escalate." // TODO: PORT SOLAR MOTHS - Rykka value = CATALOGUER_REWARD_EASY #define SINK_POWER 1 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm index a17b8e647ca..a7ef2c1c8f4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm @@ -3,4 +3,4 @@ mob_bump_flag = 0 /mob/living/simple_mob/vore/aggressive - mob_bump_flag = 1 \ No newline at end of file + mob_bump_flag = HEAVY \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm b/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm index 5daea0571e9..afe1d73135a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm @@ -1,3 +1,10 @@ +/datum/category_item/catalogue/fauna/wolf //TODO: VIRGO_LORE_WRITING_WIP + name = "Creature - Wolf" + desc = "Some sort of wolf, a descendent or otherwise of regular Earth canidae. They look almost exactly like their \ + Earth counterparts, except for the fact that their fur is a uniform grey. Some do show signs of unique coloration, and they \ + love to nip and bite at things, as well as sniffing around. They seem to mark their territory by way of scent-marking/urinating on things." + value = CATALOGUER_REWARD_MEDIUM + /mob/living/simple_mob/animal/wolf name = "grey wolf" desc = "My, what big jaws it has!" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm index 9520d9a3ac5..b5a3bc2c60e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm @@ -121,7 +121,7 @@ health = 80 // Increase health to compensate maxHealth = 80 */ - +/* /mob/living/simple_mob/animal/space/mimic vore_active = 1 // NO VORE SPRITES @@ -130,7 +130,7 @@ // Overrides to non-vore version maxHealth = 60 health = 60 - +*/ /mob/living/simple_mob/animal/passive/cat vore_active = 1 // NO VORE SPRITES diff --git a/code/modules/mob/living/voice/voice.dm b/code/modules/mob/living/voice/voice.dm index 5b5d3005a14..8d7337df076 100644 --- a/code/modules/mob/living/voice/voice.dm +++ b/code/modules/mob/living/voice/voice.dm @@ -69,7 +69,7 @@ if(comm) comm.close_connection(user = src, target = src, reason = "[src] hung up") else - src << "You appear to not be inside a communicator. This is a bug and you should report it." + to_chat(src, "You appear to not be inside a communicator. This is a bug and you should report it.") // Verb: change_name() // Parameters: None @@ -90,7 +90,7 @@ log_game(msg) src.name = new_name else - src << "Invalid name. Rejected." + to_chat(src, "Invalid name. Rejected.") // Proc: Life() // Parameters: None diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index ec032d7b46b..5ce336ba4f0 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -229,7 +229,7 @@ set category = "IC" if((is_blind(src) || usr.stat) && !isobserver(src)) - src << "Something is there but you can't see it." + to_chat(src, "Something is there but you can't see it.") return 1 face_atom(A) @@ -286,7 +286,7 @@ if(mind) mind.show_memory(src) else - src << "The game appears to have misplaced your mind datum, so we can't show you your notes." + to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.") /mob/verb/add_memory(msg as message) set name = "Add Note" @@ -297,7 +297,7 @@ if(mind) mind.store_memory(msg) else - src << "The game appears to have misplaced your mind datum, so we can't show you your notes." + to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.") /mob/proc/store_memory(msg as message, popup, sane = 1) msg = copytext(msg, 1, MAX_MESSAGE_LEN) @@ -324,8 +324,8 @@ /mob/proc/warn_flavor_changed() if(flavor_text && flavor_text != "") // don't spam people that don't use it! - src << "

    OOC Warning:

    " - src << "Your flavor text is likely out of date! Change" + to_chat(src, "

    OOC Warning:

    ") + to_chat(src, "Your flavor text is likely out of date! Change") /mob/proc/print_flavor_text() if (flavor_text && flavor_text != "") @@ -566,22 +566,22 @@ return if (AM.anchored) - src << "It won't budge!" + to_chat(src, "It won't budge!") return var/mob/M = AM if(ismob(AM)) if(!can_pull_mobs || !can_pull_size) - src << "They won't budge!" + to_chat(src, "They won't budge!") return if((mob_size < M.mob_size) && (can_pull_mobs != MOB_PULL_LARGER)) - src << "[M] is too large for you to move!" + to_chat(src, "[M] is too large for you to move!") return if((mob_size == M.mob_size) && (can_pull_mobs == MOB_PULL_SMALLER)) - src << "[M] is too heavy for you to move!" + to_chat(src, "[M] is too heavy for you to move!") return // If your size is larger than theirs and you have some @@ -597,7 +597,7 @@ else qdel(G) if(!.) - src << "Somebody has a grip on them!" + to_chat(src, "Somebody has a grip on them!") return if(!iscarbon(src)) @@ -608,7 +608,7 @@ else if(isobj(AM)) var/obj/I = AM if(!can_pull_size || can_pull_size < I.w_class) - src << "It won't budge!" + to_chat(src, "It won't budge!") return if(pulling) @@ -627,7 +627,7 @@ if(ishuman(AM)) var/mob/living/carbon/human/H = AM if(H.pull_damage()) - src << "Pulling \the [H] in their current condition would probably be a bad idea." + to_chat(src, "Pulling \the [H] in their current condition would probably be a bad idea.") //Attempted fix for people flying away through space when cuffed and dragged. if(ismob(AM)) @@ -952,7 +952,7 @@ mob/proc/yank_out_object() valid_objects = get_visible_implants(0) if(!valid_objects.len) if(self) - src << "You have nothing stuck in your body that is large enough to remove." + to_chat(src, "You have nothing stuck in your body that is large enough to remove.") else U << "[src] has nothing stuck in their wounds that is large enough to remove." return @@ -960,7 +960,7 @@ mob/proc/yank_out_object() var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects if(self) - src << "You attempt to get a good grip on [selection] in your body." + to_chat(src, "You attempt to get a good grip on [selection] in your body.") else U << "You attempt to get a good grip on [selection] in [S]'s body." @@ -1110,10 +1110,10 @@ mob/proc/yank_out_object() //Exploitable Info Update /mob/proc/amend_exploitable(var/obj/item/I) - var/obj/item/exploit_item = new I(src.loc) - exploit_addons |= exploit_item - var/exploitmsg = html_decode("\n" + "Has " + exploit_item.name + ".") - exploit_record += exploitmsg + if(istype(I)) + exploit_addons |= I + var/exploitmsg = html_decode("\n" + "Has " + I.name + ".") + exploit_record += exploitmsg /client/proc/check_has_body_select() return mob && mob.hud_used && istype(mob.zone_sel, /obj/screen/zone_sel) diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index b335faf1d37..7ad90dfc43f 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -174,6 +174,12 @@ assailant.visible_message("[assailant] covers [affecting]'s eyes!") if(affecting.eye_blind < 3) affecting.Blind(3) + //TFF 12/8/19 VoreStation Addition Start + if(BP_HEAD) + if(force_down) + if(announce) + assailant.visible_message("[assailant] sits on [target]'s head!") + //VoreStation Addition End /obj/item/weapon/grab/attack_self() return s_click(hud) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index b03649183bc..a27d472baf8 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -84,7 +84,7 @@ /client/verb/drop_item() set hidden = 1 - if(!isrobot(mob) && mob.stat == CONSCIOUS && isturf(mob.loc)) + if(!isrobot(mob) && mob.stat == CONSCIOUS && (isturf(mob.loc) || isbelly(mob.loc))) // VOREStation Edit: dropping in bellies return mob.drop_item() return @@ -185,13 +185,13 @@ for(var/mob/M in range(mob, 1)) if(M.pulling == mob) if(!M.restrained() && M.stat == 0 && M.canmove && mob.Adjacent(M)) - src << "You're restrained! You can't move!" + to_chat(src, "You're restrained! You can't move!") return 0 else M.stop_pulling() if(mob.pinned.len) - src << "You're pinned to a wall by [mob.pinned[1]]!" + to_chat(src, "You're pinned to a wall by [mob.pinned[1]]!") return 0 mob.move_delay = world.time//set move delay @@ -396,7 +396,7 @@ //Check to see if we slipped if(prob(Process_Spaceslipping(5)) && !buckled) - src << "You slipped!" + to_chat(src, "You slipped!") src.inertia_dir = src.last_move step(src, src.inertia_dir) return 0 diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index aef78c28ecf..19c79b0658f 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -27,7 +27,7 @@ var/obj/effect/lobby_image = new /obj/effect/lobby_image /mob/new_player/Login() update_Login_details() //handles setting lastKnownIP and computer_id for use by the ban systems as well as checking for multikeying if(join_motd) - src << "
    [join_motd]
    " + to_chat(src, "
    [join_motd]
    ") if(!mind) mind = new /datum/mind(key) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 441ee77234f..a8c613c7251 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -114,7 +114,7 @@ if(href_list["observe"]) - if(alert(src,"Are you sure you wish to observe? You will have to wait 5 minute before being able to respawn!","Player Setup","Yes","No") == "Yes") //Vorestation edit + if(alert(src,"Are you sure you wish to observe? You will have to wait 60 seconds before being able to respawn!","Player Setup","Yes","No") == "Yes") //Vorestation edit - Rykka corrected to 60 seconds to match current spawn time if(!client) return 1 //Make a new mannequin quickly, and allow the observer to take the appearance @@ -170,12 +170,14 @@ if(href_list["SelectedJob"]) + /* Vorestation Removal Start //Prevents people rejoining as same character. for (var/mob/living/carbon/human/C in mob_list) var/char_name = client.prefs.real_name if(char_name == C.real_name) usr << "There is a character that already exists with the same name - [C.real_name], please join with a different one, or use Quit the Round with the previous character." //VOREStation Edit return + */ //Vorestation Removal End if(!config.enter_allowed) usr << "There is an administrative lock on entering the game!" @@ -385,7 +387,7 @@ return // Equip our custom items only AFTER deploying to spawn points eh? - equip_custom_items(character) + //equip_custom_items(character) //VOREStation Removal //character.apply_traits() //VOREStation Removal diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index 6e0dae2d6df..0ab4cc128b1 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -8,7 +8,7 @@ //var/icon_add = 'icons/mob/human_face.dmi' //Already defined in sprite_accessories.dm line 49. var/color_blend_mode = ICON_MULTIPLY - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE) //This lets all races use the default hairstyles. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This lets all races use the default hairstyles. astolfo name = "Astolfo" @@ -87,14 +87,14 @@ name = "Bald" icon_state = "bald" gender = MALE - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE) //Lets all the races be bald if they want. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //Lets all the races be bald if they want. ponytail6_fixed //Eggnerd's done with waiting for upstream fixes lmao. name = "Ponytail 6 but fixed" icon = 'icons/mob/human_face_vr.dmi' icon_add = 'icons/mob/human_face_vr_add.dmi' icon_state = "hair_ponytail6" - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA,SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE) + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA,SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) una_hood name = "Cobra Hood" @@ -477,13 +477,13 @@ /datum/sprite_accessory/facial_hair icon = 'icons/mob/human_face_or_vr.dmi' var/color_blend_mode = ICON_MULTIPLY - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE) //This lets all races use the facial hair styles. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This lets all races use the facial hair styles. shaved name = "Shaved" icon_state = "bald" gender = NEUTER - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE) //This needed to be manually defined, apparantly. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This needed to be manually defined, apparantly. vulp_none @@ -1064,4 +1064,36 @@ name = "Heterochromia" icon_state = "heterochromia" body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE) //This lets all races use the default hairstyles. + species_allowed = list(SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This lets all races use the default hairstyles. + + werewolf_nose + name = "Werewolf nose" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + + werewolf_face + name = "Werewolf face" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + + werewolf_belly + name = "Werewolf belly" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO) + species_allowed = list(SPECIES_WEREBEAST) + + werewolf_socks + name = "Werewolf socks" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + species_allowed = list(SPECIES_WEREBEAST) \ No newline at end of file diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 29263adeaf6..2d1dc5d1011 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -21,8 +21,12 @@ if(say_disabled) //This is here to try to identify lag problems usr << "Speech is currently admin-disabled." return - + + //VOREStation Edit Start + if(muffled) + return me_verb_subtle(message) message = sanitize_or_reflect(message,src) //VOREStation Edit - Reflect too-long messages (within reason) + //VOREStation Edit End set_typing_indicator(FALSE) if(use_me) @@ -40,7 +44,7 @@ if(!src.client.holder) if(!config.dsay_allowed) - src << "Deadchat is globally muted." + to_chat(src, "Deadchat is globally muted.") return if(!is_preference_enabled(/datum/client_preference/show_dsay)) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index c1d0f9de647..28673c9fd77 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -36,7 +36,7 @@ dna.SetSEState(MONKEYBLOCK,1) dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF) - src << "You are now [species.name]. " + to_chat(src, "You are now [species.name]. ") qdel(animation) return src @@ -91,7 +91,7 @@ add_language(LANGUAGE_SCHECHI, 1) add_language(LANGUAGE_SIGN, 1) add_language(LANGUAGE_TERMINUS, 1) - add_language(LANGUAGE_ZADDAT = 0) + add_language(LANGUAGE_ZADDAT, 0) // Lorefolks say it may be so. if(O.client && O.client.prefs) @@ -182,7 +182,7 @@ var/datum/preferences/B = O.client.prefs for(var/language in B.alternate_languages) O.add_language(language) - O.resize(B.size_multiplier, animate = FALSE) //VOREStation Addition: add size prefs to borgs + O.resize(B.size_multiplier, animate = TRUE) //VOREStation Addition: add size prefs to borgs O.fuzzy = B.fuzzy //VOREStation Addition: add size prefs to borgs callHook("borgify", list(O)) diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index 6004ca3e4cf..7b9bb15baa6 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -90,3 +90,4 @@ /mob/proc/update_targeted() return + diff --git a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm index c769fe21e2a..668d3f81e22 100644 --- a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm +++ b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm @@ -39,11 +39,13 @@ data["isAI"] = isAI(user) data["map_levels"] = using_map.get_map_levels(T.z, FALSE) data["crewmembers"] = list() - for(var/z in (data["map_levels"] | T.z)) // Always show crew from the current Z even if we can't show a map + for(var/z in data["map_levels"]) // VOREStation Edit data["crewmembers"] += crew_repository.health_data(z) if(!data["map_levels"].len) to_chat(user, "The crew monitor doesn't seem like it'll work here.") + if(ui) // VOREStation Addition + ui.close() // VOREStation Addition return ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) diff --git a/code/modules/modular_computers/hardware/nano_printer.dm b/code/modules/modular_computers/hardware/nano_printer.dm index 2496a6930da..665b855f4fd 100644 --- a/code/modules/modular_computers/hardware/nano_printer.dm +++ b/code/modules/modular_computers/hardware/nano_printer.dm @@ -31,10 +31,25 @@ if(paper_title) P.name = paper_title P.update_icon() + P.fields = count_fields(P.info) + P.updateinfolinks() stored_paper-- return 1 +/obj/item/weapon/computer_hardware/nano_printer/proc/count_fields(var/info) +//Count the fields. This is taken directly from paper.dm, /obj/item/weapon/paper/proc/parsepencode(). -Hawk_v3 + var/fields = 0 + var/t = info + var/laststart = 1 + while(1) + var/i = findtext(t, "", laststart) // + if(i==0) + break + laststart = i+1 + fields++ + return fields + /obj/item/weapon/computer_hardware/nano_printer/attackby(obj/item/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/paper)) if(stored_paper >= max_paper) diff --git a/code/modules/modular_computers/hardware/portable_hard_drive.dm b/code/modules/modular_computers/hardware/portable_hard_drive.dm index 9a0feb3653c..817fca789e4 100644 --- a/code/modules/modular_computers/hardware/portable_hard_drive.dm +++ b/code/modules/modular_computers/hardware/portable_hard_drive.dm @@ -1,5 +1,5 @@ // These are basically USB data sticks and may be used to transfer files between devices -/obj/item/weapon/computer_hardware/hard_drive/portable/ +/obj/item/weapon/computer_hardware/hard_drive/portable name = "basic data crystal" desc = "Small crystal with imprinted photonic circuits that can be used to store data. Its capacity is 16 GQ." power_usage = 10 diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm index a13a1457a34..331588183eb 100644 --- a/code/modules/multiz/structures.dm +++ b/code/modules/multiz/structures.dm @@ -111,7 +111,7 @@ if(!A.CanPass(M, M.loc, 1.5, 0)) to_chat(M, "\The [A] is blocking \the [src].") return FALSE - return M.Move(T) + return M.forceMove(T) //VOREStation Edit - Fixes adminspawned ladders /obj/structure/ladder/CanPass(obj/mover, turf/source, height, airflow) return airflow || !density diff --git a/code/modules/multiz/structures_vr.dm b/code/modules/multiz/structures_vr.dm index b66c148e3b7..e55b0eae5a0 100644 --- a/code/modules/multiz/structures_vr.dm +++ b/code/modules/multiz/structures_vr.dm @@ -49,9 +49,31 @@ if (!( target )) qdel(src) return + if (istype(target, /obj/structure/portal_subtle)) + qdel(src) + return if (istype(M, /atom/movable)) if(prob(failchance)) //oh dear a problem, put em in deep space src.icon_state = "portal1" do_noeffect_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0) else - do_noeffect_teleport(M, target, 1) ///You will appear adjacent to the beacon + do_noeffect_teleport(M, target, 0) ///You will appear on the beacon + +/obj/structure/portal_gateway + name = "portal" + desc = "Looks unstable. Best to test it with the clown." + icon = 'icons/obj/stationobjs_vr.dmi' + icon_state = "portalgateway" + density = 1 + unacidable = 1//Can't destroy energy portals. + anchored = 1 + +/obj/structure/portal_gateway/Bumped(mob/M as mob|obj) + if(istype(M,/mob) && !(istype(M,/mob/living))) + return //do not send ghosts, zshadows, ai eyes, etc + var/obj/effect/landmark/dest = pick(eventdestinations) + if(dest) + M << 'sound/effects/phasein.ogg' + playsound(src, 'sound/effects/phasein.ogg', 100, 1) + M.forceMove(dest.loc) + return diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm index e48022e2cc1..eb3e9ae5c15 100644 --- a/code/modules/nano/interaction/base.dm +++ b/code/modules/nano/interaction/base.dm @@ -30,7 +30,7 @@ /mob/living/silicon/robot/shared_nano_interaction() . = STATUS_INTERACTIVE - if(cell.charge <= 0) + if(!has_power) return STATUS_CLOSE if(lockdown) . = STATUS_DISABLED diff --git a/code/modules/nifsoft/nifsoft.dm b/code/modules/nifsoft/nifsoft.dm index b4791003d0b..6f110de8566 100644 --- a/code/modules/nifsoft/nifsoft.dm +++ b/code/modules/nifsoft/nifsoft.dm @@ -165,15 +165,19 @@ return ..() ///////////////// -// A NIFSoft Disk +// A NIFSoft Uploader /obj/item/weapon/disk/nifsoft - name = "NIFSoft Disk" + name = "NIFSoft Uploader" desc = "It has a small label: \n\ - \"Portable NIFSoft Disk. \n\ - Insert directly into brain.\"" - icon = 'icons/obj/cloning.dmi' - icon_state = "datadisk2" - item_state = "card-id" + \"Portable NIFSoft Installation Media. \n\ + Align ocular port with eye socket and depress red plunger.\"" + icon = 'icons/obj/nanomods.dmi' + icon_state = "medical" + item_state = "nanomod" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_vr.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_vr.dmi', + ) w_class = ITEMSIZE_SMALL var/datum/nifsoft/stored = null @@ -188,7 +192,7 @@ var/mob/living/carbon/human/Hu = user if(!Ht.nif || Ht.nif.stat != NIF_WORKING) - to_chat(user,"Either they don't have a NIF, or the disk can't connect.") + to_chat(user,"Either they don't have a NIF, or the uploader can't connect.") return var/extra = extra_params() @@ -197,9 +201,18 @@ else Ht.visible_message("[Hu] begins uploading [src] into [Ht]!","[Hu] is uploading [src] into you!") - if(A == user || do_after(Hu,10 SECONDS,Ht)) + icon_state = "[initial(icon_state)]-animate" //makes it play the item animation upon using on a valid target + update_icon() + + if(A == user && do_after(Hu,1 SECONDS,Ht)) new stored(Ht.nif,extra) qdel(src) + else if(A != user && do_after(Hu,10 SECONDS,Ht)) + new stored(Ht.nif,extra) + qdel(src) + else + icon_state = "[initial(icon_state)]" //If it fails to apply to a valid target and doesn't get deleted, reset its icon state + update_icon() //So disks can pass fancier stuff. /obj/item/weapon/disk/nifsoft/proc/extra_params() @@ -208,8 +221,14 @@ // Compliance Disk // /obj/item/weapon/disk/nifsoft/compliance - name = "NIFSoft Disk (Compliance)" + name = "NIFSoft Uploader (Compliance)" desc = "Wow, adding laws to people? That seems illegal. It probably is. Okay, it really is." + icon_state = "compliance" + item_state = "healthanalyzer" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand.dmi', + slot_r_hand_str = 'icons/mob/items/righthand.dmi', + ) stored = /datum/nifsoft/compliance var/laws @@ -233,19 +252,20 @@ // Security Disk // /obj/item/weapon/disk/nifsoft/security - name = "NIFSoft Disk - Security" + name = "NIFSoft Uploader - Security" desc = "Contains free NIFSofts useful for security members.\n\ It has a small label: \n\ - \"Portable NIFSoft Disk. \n\ - Insert directly into brain.\"" + \"Portable NIFSoft Installation Media. \n\ + Align ocular port with eye socket and depress red plunger.\"" + icon_state = "security" stored = /datum/nifsoft/package/security /datum/nifsoft/package/security software = list(/datum/nifsoft/ar_sec,/datum/nifsoft/flashprot) /obj/item/weapon/storage/box/nifsofts_security - name = "security nifsoft disks" + name = "security nifsoft uploaders" desc = "A box of free nifsofts for security employees." icon_state = "disk_kit" @@ -256,19 +276,20 @@ // Engineering Disk // /obj/item/weapon/disk/nifsoft/engineering - name = "NIFSoft Disk - Engineering" + name = "NIFSoft Uploader - Engineering" desc = "Contains free NIFSofts useful for engineering members.\n\ It has a small label: \n\ - \"Portable NIFSoft Disk. \n\ - Insert directly into brain.\"" + \"Portable NIFSoft Installation Media. \n\ + Align ocular port with eye socket and depress red plunger.\"" + icon_state = "engineering" stored = /datum/nifsoft/package/engineering /datum/nifsoft/package/engineering software = list(/datum/nifsoft/ar_eng,/datum/nifsoft/alarmmonitor,/datum/nifsoft/uvblocker) /obj/item/weapon/storage/box/nifsofts_engineering - name = "engineering nifsoft disks" + name = "engineering nifsoft uploaders" desc = "A box of free nifsofts for engineering employees." icon_state = "disk_kit" @@ -279,11 +300,11 @@ // Medical Disk // /obj/item/weapon/disk/nifsoft/medical - name = "NIFSoft Disk - Medical" + name = "NIFSoft Uploader - Medical" desc = "Contains free NIFSofts useful for medical members.\n\ It has a small label: \n\ - \"Portable NIFSoft Disk. \n\ - Insert directly into brain.\"" + \"Portable NIFSoft Installation Media. \n\ + Align ocular port with eye socket and depress red plunger.\"" stored = /datum/nifsoft/package/medical @@ -291,7 +312,7 @@ software = list(/datum/nifsoft/ar_med,/datum/nifsoft/crewmonitor) /obj/item/weapon/storage/box/nifsofts_medical - name = "medical nifsoft disks" + name = "medical nifsoft uploaders" desc = "A box of free nifsofts for medical employees." icon_state = "disk_kit" @@ -302,19 +323,20 @@ // Mining Disk // /obj/item/weapon/disk/nifsoft/mining - name = "NIFSoft Disk - Mining" + name = "NIFSoft Uploader - Mining" desc = "Contains free NIFSofts useful for mining members.\n\ It has a small label: \n\ - \"Portable NIFSoft Disk. \n\ - Insert directly into brain.\"" + \"Portable NIFSoft Installation Media. \n\ + Align ocular port with eye socket and depress red plunger.\"" + icon_state = "mining" stored = /datum/nifsoft/package/mining /datum/nifsoft/package/mining software = list(/datum/nifsoft/material,/datum/nifsoft/spare_breath) /obj/item/weapon/storage/box/nifsofts_mining - name = "mining nifsoft disks" + name = "mining nifsoft uploaders" desc = "A box of free nifsofts for mining employees." icon_state = "disk_kit" diff --git a/code/modules/nifsoft/software/13_soulcatcher.dm b/code/modules/nifsoft/software/13_soulcatcher.dm index 09d23669b31..9f46eac243b 100644 --- a/code/modules/nifsoft/software/13_soulcatcher.dm +++ b/code/modules/nifsoft/software/13_soulcatcher.dm @@ -270,10 +270,12 @@ var/obj/item/device/nif/nif var/datum/nifsoft/soulcatcher/soulcatcher + var/identifying_gender /mob/living/carbon/brain/caught_soul/Login() ..() plane_holder.set_vis(VIS_AUGMENTED, TRUE) + identifying_gender = client.prefs.identifying_gender /mob/living/carbon/brain/caught_soul/Destroy() if(soulcatcher) diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index bb38043767d..ccef2fb79ce 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -97,10 +97,10 @@ var/const/CE_STABLE_THRESHOLD = 0.5 pale = 1 update_icons_body() var/word = pick("dizzy","woosey","faint") - src << "You feel [word]" + to_chat(src, "You feel [word]") if(prob(1)) var/word = pick("dizzy","woosey","faint") - src << "You feel [word]" + to_chat(src, "You feel [word]") if(getOxyLoss() < 20 * threshold_coef) adjustOxyLoss(3 * dmg_coef) else if(blood_volume >= BLOOD_VOLUME_BAD) @@ -114,13 +114,13 @@ var/const/CE_STABLE_THRESHOLD = 0.5 if(prob(15)) Paralyse(rand(1,3)) var/word = pick("dizzy","woosey","faint") - src << "You feel extremely [word]" + to_chat(src, "You feel extremely [word]") else if(blood_volume >= BLOOD_VOLUME_SURVIVE) adjustOxyLoss(5 * dmg_coef) - adjustToxLoss(3 * dmg_coef) +// adjustToxLoss(3 * dmg_coef) if(prob(15)) var/word = pick("dizzy","woosey","faint") - src << "You feel extremely [word]" + to_chat(src, "You feel extremely [word]") else //Not enough blood to survive (usually) if(!pale) pale = 1 diff --git a/code/modules/organs/internal/augment.dm b/code/modules/organs/internal/augment.dm new file mode 100644 index 00000000000..0c168d16794 --- /dev/null +++ b/code/modules/organs/internal/augment.dm @@ -0,0 +1,177 @@ +/* + * Augments. This file contains the base, and organic-targeting augments. + */ + +/obj/item/organ/internal/augment + name = "augment" + + icon_state = "cell_bay" + + parent_organ = BP_TORSO + + organ_verbs = list(/mob/living/carbon/human/proc/augment_menu) // Verbs added by the organ when present in the body. + target_parent_classes = list() // Is the parent supposed to be organic, robotic, assisted? + forgiving_class = FALSE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic. + + var/obj/item/integrated_object // Objects held by the organ, used for re-usable, deployable things. + var/integrated_object_type // Object type the organ will spawn. + var/target_slot = null + + var/silent_deploy = FALSE + + var/image/my_radial_icon = null + var/radial_icon = null // DMI for the augment's radial icon. + var/radial_name = null // The augment's name in the Radial Menu. + var/radial_state = null // Icon state for the augment's radial icon. + + var/aug_cooldown = 30 SECONDS + var/last_activate = null + +/obj/item/organ/internal/augment/Initialize() + ..() + + setup_radial_icon() + + if(integrated_object_type) + integrated_object = new integrated_object_type(src) + integrated_object.canremove = FALSE + +/obj/item/organ/internal/augment/proc/setup_radial_icon() + if(!radial_icon) + radial_icon = icon + if(!radial_name) + radial_name = name + if(!radial_state) + radial_state = icon_state + my_radial_icon = image(icon = radial_icon, icon_state = radial_state) + +/obj/item/organ/internal/augment/handle_organ_mod_special(var/removed = FALSE) + if(removed && integrated_object && integrated_object.loc != src) + if(isliving(integrated_object.loc)) + var/mob/living/L = integrated_object.loc + L.drop_from_inventory(integrated_object) + integrated_object.forceMove(src) + ..(removed) + +/obj/item/organ/internal/augment/proc/augment_action() + if(!owner) + return + + if(aug_cooldown) + if(last_activate <= world.time + aug_cooldown) + last_activate = world.time + else + return + + var/item_to_equip = integrated_object + if(!item_to_equip && integrated_object_type) + item_to_equip = integrated_object_type + + if(ispath(item_to_equip)) + owner.equip_augment_item(target_slot, item_to_equip, silent_deploy, FALSE) + else if(item_to_equip) + owner.equip_augment_item(target_slot, item_to_equip, silent_deploy, FALSE, src) + +/* + * The delicate handling of augment-controlled items. + */ + +// Attaches to the end of dropped items' code. + +/obj/item + var/destroy_on_drop = FALSE // Used by augments to determine if the item should destroy itself when dropped, or return to its master. + var/obj/item/organ/my_augment = null // Used to reference the object's host organ. + +/obj/item/dropped(mob/user) + . = ..() + if(src) + if(destroy_on_drop && !QDELETED(src)) + qdel(src) + return + if(my_augment) + forceMove(my_augment) + +/* + * Human-specific mob procs. + */ + +// The next two procs simply handle the radial menu for augment activation. + +/mob/living/carbon/human/proc/augment_menu() + set name = "Open Augment Menu" + set desc = "Toggle your augment menu." + set category = "Augments" + + enable_augments(usr) + +/mob/living/carbon/human/proc/enable_augments(var/mob/living/user) + var/list/options = list() + + var/list/present_augs = list() + + for(var/obj/item/organ/internal/augment/Aug in internal_organs) + if(Aug.my_radial_icon && !Aug.is_broken() && Aug.check_verb_compatability()) + present_augs[Aug.radial_name] = Aug + + for(var/augname in present_augs) + var/obj/item/organ/internal/augment/iconsource = present_augs[augname] + options[augname] = iconsource.my_radial_icon + + var/list/choice = list() + if(length(options) == 1) + for(var/key in options) + choice = key + else + choice = show_radial_menu(user, src, options) + + if(!isnull(choice) && options[choice]) + var/obj/item/organ/internal/augment/A = present_augs[choice] + A.augment_action(user) + +/* equip_augment_item + * Used to equip an organ's augment items when possible. + * slot is the target equip slot, if it's not a generic either-hand deployable, + * equipping is either the target object, or a path for the target object, + * destroy_on_drop is the default value for the object to be deleted if it is removed from their person, if equipping is a path, however, this will be set to TRUE, + * cling_to_organ is a reference to the organ object itself, so they can easily return to their organ when removed by any means. + */ + +/mob/living/carbon/human/proc/equip_augment_item(var/slot, var/obj/item/equipping = null, var/make_sound = TRUE, var/destroy_on_drop = FALSE, var/obj/item/organ/cling_to_organ = null) + if(!ishuman(src)) + return 0 + + if(!equipping) + return 0 + + var/mob/living/carbon/human/M = src + + if((slot == slot_l_hand && l_hand) || (slot == slot_r_hand && r_hand)) + to_chat(M,"Your hand is full. Drop something first.") + return 0 + + var/del_if_failure = destroy_on_drop + + if(ispath(equipping)) + del_if_failure = TRUE + equipping = new equipping(src) + + if(!slot) + put_in_any_hand_if_possible(equipping, del_if_failure) + + else + if(slot_is_accessible(slot, equipping, src)) + equip_to_slot(equipping, slot, 1, 1) + else if(destroy_on_drop || del_if_failure) + qdel(equipping) + return 0 + + if(cling_to_organ) // Does the object automatically return to the organ? + equipping.my_augment = cling_to_organ + + if(make_sound) + playsound(src, 'sound/items/change_jaws.ogg', 30, 1) + + if(equipping.loc != src) + equipping.dropped() + + return 1 diff --git a/code/modules/organs/internal/augment/armmounted.dm b/code/modules/organs/internal/augment/armmounted.dm new file mode 100644 index 00000000000..73751be0d9c --- /dev/null +++ b/code/modules/organs/internal/augment/armmounted.dm @@ -0,0 +1,262 @@ +/* + * Arm mounted augments. + */ + +/obj/item/organ/internal/augment/armmounted + name = "laser rifle implant" + desc = "A large implant that fits into a subject's arm. It deploys a laser-emitting array by some painful means." + + icon_state = "augment_laser" + + w_class = ITEMSIZE_LARGE + + organ_tag = O_AUG_L_FOREARM + + parent_organ = BP_L_ARM + + target_slot = slot_l_hand + + target_parent_classes = list(ORGAN_FLESH, ORGAN_ASSISTED) + + integrated_object_type = /obj/item/weapon/gun/energy/laser/mounted/augment + +/obj/item/organ/internal/augment/armmounted/attackby(obj/item/I as obj, mob/user as mob) + if(I.is_screwdriver()) + switch(organ_tag) + if(O_AUG_L_FOREARM) + organ_tag = O_AUG_R_FOREARM + parent_organ = BP_R_ARM + target_slot = slot_r_hand + if(O_AUG_R_FOREARM) + organ_tag = O_AUG_L_FOREARM + parent_organ = BP_L_ARM + target_slot = slot_l_hand + to_chat(user, "You swap \the [src]'s servos to install neatly into \the lower [parent_organ] mount.") + return + + . = ..() + +/obj/item/organ/internal/augment/armmounted/taser + name = "taser implant" + desc = "A large implant that fits into a subject's arm. It deploys a taser-emitting array by some painful means." + + icon_state = "augment_taser" + + integrated_object_type = /obj/item/weapon/gun/energy/taser/mounted/augment + +/obj/item/organ/internal/augment/armmounted/dartbow + name = "crossbow implant" + desc = "A small implant that fits into a subject's arm. It deploys a dart launching mechanism through the flesh through unknown means." + + icon_state = "augment_dart" + + w_class = ITEMSIZE_SMALL + + integrated_object_type = /obj/item/weapon/gun/energy/crossbow + +// Wrist-or-hand-mounted implant + +/obj/item/organ/internal/augment/armmounted/hand + name = "resonant analyzer implant" + desc = "An augment that fits neatly into the hand, useful for determining the usefulness of an object for research." + icon_state = "augment_box" + + w_class = ITEMSIZE_SMALL + + integrated_object_type = /obj/item/weapon/portable_scanner + +/obj/item/organ/internal/augment/armmounted/hand/attackby(obj/item/I as obj, mob/user as mob) + if(I.is_screwdriver()) + switch(organ_tag) + if(O_AUG_L_HAND) + organ_tag = O_AUG_R_HAND + parent_organ = BP_R_HAND + target_slot = slot_r_hand + if(O_AUG_R_HAND) + organ_tag = O_AUG_L_HAND + parent_organ = BP_L_HAND + target_slot = slot_l_hand + to_chat(user, "You swap \the [src]'s servos to install neatly into \the upper [parent_organ] mount.") + return + + . = ..() + +/obj/item/organ/internal/augment/armmounted/hand/sword + name = "energy blade implant" + + integrated_object_type = /obj/item/weapon/melee/energy/sword + +/* + * Shoulder augment. + */ + +/obj/item/organ/internal/augment/armmounted/shoulder + name = "shoulder augment" + desc = "A large implant that fits into a subject's arm. It looks kind of like a skeleton." + + icon_state = "augment_armframe" + + organ_tag = O_AUG_R_UPPERARM + + w_class = ITEMSIZE_HUGE + + integrated_object_type = null + +/obj/item/organ/internal/augment/armmounted/shoulder/attackby(obj/item/I as obj, mob/user as mob) + if(I.is_screwdriver()) + switch(organ_tag) + if(O_AUG_L_UPPERARM) + organ_tag = O_AUG_R_UPPERARM + parent_organ = BP_R_ARM + target_slot = slot_r_hand + if(O_AUG_R_UPPERARM) + organ_tag = O_AUG_L_UPPERARM + parent_organ = BP_L_ARM + target_slot = slot_l_hand + to_chat(user, "You swap \the [src]'s servos to install neatly into \the upper [parent_organ] mount.") + return + + . = ..() + +/obj/item/organ/internal/augment/armmounted/shoulder/surge + name = "muscle overclocker" + + aug_cooldown = 1.5 MINUTES + +/obj/item/organ/internal/augment/armmounted/shoulder/surge/augment_action() + if(!owner) + return + + if(aug_cooldown) + if(last_activate <= world.time + aug_cooldown) + last_activate = world.time + else + return + + if(istype(owner, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = owner + H.add_modifier(/datum/modifier/melee_surge, 0.75 MINUTES) + +// The toolkit / multi-tool implant. + +/obj/item/organ/internal/augment/armmounted/shoulder/multiple + name = "rotary toolkit" + desc = "A large implant that fits into a subject's arm. It deploys an array of tools by some painful means." + + icon_state = "augment_toolkit" + + organ_tag = O_AUG_R_UPPERARM + + w_class = ITEMSIZE_HUGE + + integrated_object_type = null + + toolspeed = 0.8 + + var/list/integrated_tools = list( + /obj/item/weapon/tool/screwdriver = null, + /obj/item/weapon/tool/wrench = null, + /obj/item/weapon/tool/crowbar = null, + /obj/item/weapon/tool/wirecutters = null, + /obj/item/device/multitool = null, + /obj/item/stack/cable_coil/gray = null, + /obj/item/weapon/tape_roll = null + ) + + var/list/integrated_tools_by_name + + var/list/integrated_tool_images + + var/list/synths + + var/list/synth_types = list( + /datum/matter_synth/wire + ) + +/obj/item/organ/internal/augment/armmounted/shoulder/multiple/Initialize() + ..() + + if(integrated_object) + integrated_tools[integrated_object_type] = integrated_object + + if(integrated_tools && integrated_tools.len) + + integrated_tools_by_name = list() + + integrated_tool_images = list() + + if(synth_types) + synths = list() + for(var/datumpath in synth_types) + var/datum/matter_synth/MS = new datumpath + synths += MS + + for(var/path in integrated_tools) + if(!integrated_tools[path]) + integrated_tools[path] = new path(src) + var/obj/item/I = integrated_tools[path] + I.canremove = FALSE + I.toolspeed = toolspeed + I.my_augment = src + I.name = "integrated [I.name]" + + for(var/tool in integrated_tools) + var/obj/item/Tool = integrated_tools[tool] + if(istype(Tool, /obj/item/stack)) + var/obj/item/stack/S = Tool + S.synths = synths + S.uses_charge = synths.len + integrated_tools_by_name[Tool.name] = Tool + integrated_tool_images[Tool.name] = image(icon = Tool.icon, icon_state = Tool.icon_state) + +/obj/item/organ/internal/augment/armmounted/shoulder/multiple/handle_organ_proc_special() + ..() + + if(!owner || is_bruised() || !synths) + return + + if(prob(20)) + for(var/datum/matter_synth/MS in synths) + MS.add_charge(MS.recharge_rate) + +/obj/item/organ/internal/augment/armmounted/shoulder/multiple/augment_action() + if(!owner) + return + + var/list/options = list() + + for(var/Iname in integrated_tools_by_name) + options[Iname] = integrated_tool_images[Iname] + + var/list/choice = list() + if(length(options) == 1) + for(var/key in options) + choice = key + else + choice = show_radial_menu(owner, owner, options) + + integrated_object = integrated_tools_by_name[choice] + + ..() + +/obj/item/organ/internal/augment/armmounted/shoulder/multiple/medical + name = "rotary medical kit" + icon_state = "augment_medkit" + integrated_object_type = null + + integrated_tools = list( + /obj/item/weapon/surgical/hemostat = null, + /obj/item/weapon/surgical/retractor = null, + /obj/item/weapon/surgical/cautery = null, + /obj/item/weapon/surgical/surgicaldrill = null, + /obj/item/weapon/surgical/scalpel = null, + /obj/item/weapon/surgical/circular_saw = null, + /obj/item/weapon/surgical/bonegel = null, + /obj/item/weapon/surgical/FixOVein = null, + /obj/item/weapon/surgical/bonesetter = null, + /obj/item/stack/medical/crude_pack = null + ) + + synth_types = list( + /datum/matter_synth/bandage + ) diff --git a/code/modules/organs/internal/bioaugment.dm b/code/modules/organs/internal/augment/bio.dm similarity index 61% rename from code/modules/organs/internal/bioaugment.dm rename to code/modules/organs/internal/augment/bio.dm index 52621e74c17..543394fcde5 100644 --- a/code/modules/organs/internal/bioaugment.dm +++ b/code/modules/organs/internal/augment/bio.dm @@ -1,44 +1,18 @@ -/* - * Augments. This file contains the base, and organic-targeting augments. - */ - -/obj/item/organ/internal/augment - name = "augment" - - icon_state = "cell_bay" - - parent_organ = BP_TORSO - - organ_verbs = list() // Verbs added by the organ when present in the body. - target_parent_classes = list() // Is the parent supposed to be organic, robotic, assisted? - forgiving_class = FALSE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic. - - var/obj/item/integrated_object // Objects held by the organ, used for deployable things. - var/integrated_object_type // Object type the organ will spawn. - -/obj/item/organ/internal/augment/Initialize() - ..() - if(integrated_object_type) - integrated_object = new integrated_object_type(src) - integrated_object.canremove = FALSE - -/obj/item/organ/internal/augment/handle_organ_mod_special(var/removed = FALSE) - if(removed && integrated_object && integrated_object.loc != src) - if(isliving(integrated_object.loc)) - var/mob/living/L = integrated_object.loc - L.drop_from_inventory(integrated_object) - integrated_object.forceMove(src) - ..(removed) - // The base organic-targeting augment. /obj/item/organ/internal/augment/bioaugment name = "bioaugmenting implant" - robotic = ORGAN_ROBOT + icon_state = "augment_hybrid" + dead_icon = "augment_hybrid_dead" + + robotic = ORGAN_ASSISTED target_parent_classes = list(ORGAN_FLESH) -// Jensen Shades. Your vision can be augmented. +/* Jensen Shades. Your vision can be augmented. + * This, technically, no longer needs its unique organ verb, however I have chosen to leave it for posterity + * in the event it needs to be referenced, while still remaining perfectly functional with either system. + */ /obj/item/organ/internal/augment/bioaugment/thermalshades name = "integrated thermolensing implant" @@ -48,20 +22,31 @@ w_class = ITEMSIZE_TINY - organ_tag = O_AUG_TSHADE + organ_tag = O_AUG_EYES + + robotic = ORGAN_ROBOT parent_organ = BP_HEAD - organ_verbs = list(/mob/living/carbon/human/proc/toggle_shades) + organ_verbs = list( + /mob/living/carbon/human/proc/augment_menu, + /mob/living/carbon/human/proc/toggle_shades) integrated_object_type = /obj/item/clothing/glasses/hud/security/jensenshades +/obj/item/organ/internal/augment/bioaugment/thermalshades/augment_action() + if(!owner) + return + + owner.toggle_shades() + +// Here for posterity and example. /mob/living/carbon/human/proc/toggle_shades() set name = "Toggle Integrated Thermoshades" set desc = "Toggle your flash-proof, thermal-integrated sunglasses." set category = "Augments" - var/obj/item/organ/internal/augment/aug = internal_organs_by_name[O_AUG_TSHADE] + var/obj/item/organ/internal/augment/aug = internal_organs_by_name[O_AUG_EYES] if(glasses) if(aug && aug.integrated_object == glasses) @@ -90,3 +75,30 @@ var/obj/item/clothing/glasses/hud/security/jensenshades/J = new(get_turf(src)) equip_to_slot(J, slot_glasses, 1, 1) to_chat(src, "Your [aug.integrated_object] deploy.") + +/obj/item/organ/internal/augment/bioaugment/sprint_enhance + name = "locomotive optimization implant" + desc = "A chunk of meat and metal that can manage an individual's leg musculature." + + organ_tag = O_AUG_PELVIC + + parent_organ = BP_GROIN + + target_parent_classes = list(ORGAN_FLESH, ORGAN_ASSISTED) + + aug_cooldown = 2 MINUTES + +/obj/item/organ/internal/augment/bioaugment/sprint_enhance/augment_action() + if(!owner) + return + + if(aug_cooldown) + if(last_activate <= world.time + aug_cooldown) + last_activate = world.time + else + return + + if(istype(owner, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = owner + H.add_modifier(/datum/modifier/sprinting, 1 MINUTES) + diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 529114fc745..bb5a5cd65c8 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -130,6 +130,11 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) target.key = brainmob.key ..() +/obj/item/organ/internal/brain/proc/get_control_efficiency() + . = max(0, 1 - (round(damage / max_damage * 10) / 10)) + + return . + /obj/item/organ/internal/brain/pariah_brain name = "brain remnants" desc = "Did someone tread on this? It looks useless for cloning or cyborgification." diff --git a/code/modules/organs/internal/heart.dm b/code/modules/organs/internal/heart.dm index b65b3bc7098..62e5fd16d22 100644 --- a/code/modules/organs/internal/heart.dm +++ b/code/modules/organs/internal/heart.dm @@ -9,7 +9,6 @@ var/standard_pulse_level = PULSE_NORM // We run on a normal clock. This is NOT CONNECTED to species heart-rate modifier. - /obj/item/organ/internal/heart/handle_germ_effects() . = ..() //Up should return an infection level as an integer if(!.) return @@ -23,6 +22,10 @@ owner.custom_pain("A stabbing pain rolls through your chest!",1) owner.apply_damage(damage = 25, damagetype = HALLOSS, def_zone = parent_organ) +/obj/item/organ/internal/heart/robotize() + ..() + standard_pulse_level = PULSE_NONE + /obj/item/organ/internal/heart/grey icon_state = "heart_grey-on" dead_icon = "heart_grey-off" diff --git a/code/modules/organs/internal/intestine.dm b/code/modules/organs/internal/intestine.dm new file mode 100644 index 00000000000..ed5319fb272 --- /dev/null +++ b/code/modules/organs/internal/intestine.dm @@ -0,0 +1,23 @@ +/obj/item/organ/internal/intestine + name = "intestine" + icon_state = "intestine" + organ_tag = O_INTESTINE + parent_organ = BP_GROIN + +/obj/item/organ/internal/intestine/handle_germ_effects() + . = ..() //Up should return an infection level as an integer + if(!.) return + + //Viral Gastroenteritis + if (. >= 1) + if(prob(1)) + owner.custom_pain("There's a twisting pain in your abdomen!",1) + owner.vomit() + if (. >= 2) + if(prob(1)) + owner.custom_pain("Your abdomen feels like it's tearing itself apart!",1) + owner.m_intent = "walk" + owner.hud_used.move_intent.icon_state = "walking" + +/obj/item/organ/internal/intestine/xeno + color = "#555555" diff --git a/code/modules/organs/internal/kidneys.dm b/code/modules/organs/internal/kidneys.dm index 571fe4f9e9d..2378c0fe99e 100644 --- a/code/modules/organs/internal/kidneys.dm +++ b/code/modules/organs/internal/kidneys.dm @@ -22,6 +22,13 @@ else if(is_broken()) owner.adjustToxLoss(0.3 * PROCESS_ACCURACY) +/obj/item/organ/internal/kidneys/handle_organ_proc_special() + . = ..() + + if(owner && owner.getToxLoss() <= owner.getMaxHealth() * 0.1) // If you have less than 10 tox damage (for a human), your kidneys can help purge it. + if(prob(owner.getToxLoss())) + owner.adjustToxLoss(rand(-1,-3)) + /obj/item/organ/internal/kidneys/handle_germ_effects() . = ..() //Up should return an infection level as an integer if(!.) return diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index 9966e93aa7e..07ef683e061 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -21,6 +21,13 @@ spawn owner.emote("me", 1, "gasps for air!") owner.AdjustLosebreath(15) + if(owner.internal_organs_by_name[O_BRAIN]) // As the brain starts having Trouble, the lungs start malfunctioning. + var/obj/item/organ/internal/brain/Brain = owner.internal_organs_by_name[O_BRAIN] + if(Brain.get_control_efficiency() <= 0.8) + if(prob(4 / max(0.1,Brain.get_control_efficiency()))) + spawn owner.emote("me", 1, "gasps for air!") + owner.AdjustLosebreath(round(3 / max(0.1,Brain.get_control_efficiency()))) + /obj/item/organ/internal/lungs/proc/rupture() var/obj/item/organ/external/parent = owner.get_organ(parent_organ) if(istype(parent)) diff --git a/code/modules/organs/internal/spleen.dm b/code/modules/organs/internal/spleen.dm new file mode 100644 index 00000000000..352a36207f1 --- /dev/null +++ b/code/modules/organs/internal/spleen.dm @@ -0,0 +1,87 @@ +/obj/item/organ/internal/spleen + name = "spleen" + icon_state = "spleen" + organ_tag = O_SPLEEN + parent_organ = BP_TORSO + w_class = ITEMSIZE_TINY + + var/spleen_tick = 20 // The number of ticks between Spleen cycles. + var/spleen_efficiency = 1 // A multiplier for how efficient this spleen is. + +/obj/item/organ/internal/spleen/process() + ..() + if(!owner) return + + if(owner.life_tick % spleen_tick == 0) + + //High toxins levels are dangerous + if(owner.getToxLoss() >= 30 && !owner.reagents.has_reagent("anti_toxin")) + //Healthy liver suffers on its own + if (src.damage < min_broken_damage) + src.damage += 0.2 * spleen_tick + //Damaged one shares the fun + else + var/obj/item/organ/internal/O = pick(owner.internal_organs) + if(O) + O.damage += 0.2 * spleen_tick + + else if(!src.is_broken()) // If the spleen isn't severely damaged, it can help fight infections. Key word, can. + var/obj/item/organ/external/OEx = pick(owner.organs) + OEx.adjust_germ_level(round(rand(0 * spleen_efficiency,-10 * spleen_efficiency))) + + if(!src.is_bruised() && owner.internal_organs_by_name[O_BRAIN]) // If it isn't bruised, it helps with brain infections. + var/obj/item/organ/internal/brain/B = owner.internal_organs_by_name[O_BRAIN] + B.adjust_germ_level(round(rand(-3 * spleen_efficiency, -10 * spleen_efficiency))) + + //Detox can heal small amounts of damage + if (src.damage && src.damage < src.min_bruised_damage && owner.reagents.has_reagent("anti_toxin")) + src.damage -= 0.2 * spleen_tick * spleen_efficiency + + if(src.damage < 0) + src.damage = 0 + +/obj/item/organ/internal/spleen/handle_germ_effects() + . = ..() //Up should return an infection level as an integer + if(!.) return + + // Low levels can cause pain and haemophilia, high levels can cause brain infections. + if (. >= 1) + if(prob(1)) + owner.custom_pain("There's a sharp pain in your [owner.get_organ(parent_organ)]!",1) + owner.add_modifier(/datum/modifier/trait/haemophilia, 2 MINUTES * spleen_efficiency) + if (. >= 2) + if(prob(1)) + if(owner.getToxLoss() < owner.getMaxHealth() * 0.2 * spleen_efficiency) + owner.adjustToxLoss(2 * spleen_efficiency) + else if(owner.internal_organs_by_name[O_BRAIN]) + var/obj/item/organ/internal/brain/Brain = owner.internal_organs_by_name[O_BRAIN] + Brain.adjust_germ_level(round(rand(5 * spleen_efficiency,20 * spleen_efficiency))) + +/obj/item/organ/internal/spleen/die() + ..() + if(owner) + owner.add_modifier(/datum/modifier/trait/haemophilia, round(15 MINUTES * spleen_efficiency)) + var/obj/item/organ/external/Target = owner.get_organ(parent_organ) + var/datum/wound/W = new /datum/wound/internal_bleeding(round(20 * spleen_efficiency)) + owner.adjustToxLoss(15 * spleen_efficiency) + Target.wounds += W + +/obj/item/organ/internal/spleen/skrell + name = "lymphatic hub" + icon_state = "spleen" + parent_organ = BP_HEAD + spleen_efficiency = 0.5 + +/obj/item/organ/internal/spleen/skrell/Initialize() + ..() + adjust_scale(0.8,0.7) + +/obj/item/organ/internal/spleen/minor + name = "vestigial spleen" + parent_organ = BP_GROIN + spleen_efficiency = 0.3 + spleen_tick = 15 + +/obj/item/organ/internal/spleen/minor/Initialize() + ..() + adjust_scale(0.7) diff --git a/code/modules/organs/internal/stomach.dm b/code/modules/organs/internal/stomach.dm new file mode 100644 index 00000000000..02cf7cb31d7 --- /dev/null +++ b/code/modules/organs/internal/stomach.dm @@ -0,0 +1,50 @@ +/obj/item/organ/internal/stomach + name = "stomach" + icon_state = "stomach" + organ_tag = O_STOMACH + parent_organ = BP_GROIN + + unacidable = TRUE // Don't melt when holding your acid, dangit. + + var/acidtype = "stomacid" // Incase you want some stomach organ with, say, polyacid instead, or sulphuric. + var/max_acid_volume = 30 + + var/deadly_hold = TRUE // Does the stomach do damage to mobs eaten by its owner? Xenos should probably have this FALSE. + +/obj/item/organ/internal/stomach/Initialize() + ..() + + if(reagents) + reagents.maximum_volume = 30 + else + create_reagents(30) + +/obj/item/organ/internal/stomach/handle_organ_proc_special() + if(owner && istype(owner, /mob/living/carbon/human)) + if(reagents) + if(reagents.total_volume + 2 < max_acid_volume && prob(20)) + reagents.add_reagent(acidtype, rand(1,2)) + + for(var/mob/living/L in owner.stomach_contents) // Splashes mobs inside with acid. Twice as effective as being splashed with the same acid outside the body. + reagents.trans_to(L, 2, 2, 0) + + if(is_broken() && prob(1)) + owner.custom_pain("There's a twisting pain in your abdomen!",1) + owner.vomit(FALSE, TRUE) + +/obj/item/organ/internal/stomach/handle_germ_effects() + . = ..() //Up should return an infection level as an integer + if(!.) return + + //Bacterial Gastroenteritis + if (. >= 1) + if(prob(1)) + owner.custom_pain("There's a twisting pain in your abdomen!",1) + owner.apply_effect(2, AGONY, 0) + if (. >= 2) + if(prob(1) && owner.getToxLoss() < owner.getMaxHealth()*0.2) + owner.adjustToxLoss(3) + owner.vomit(FALSE, TRUE) + +/obj/item/organ/internal/stomach/xeno + color = "#555555" diff --git a/code/modules/organs/internal/voicebox.dm b/code/modules/organs/internal/voicebox.dm index 4de69fe8f2b..2cf264f7805 100644 --- a/code/modules/organs/internal/voicebox.dm +++ b/code/modules/organs/internal/voicebox.dm @@ -1,7 +1,7 @@ /* * Voicebox/Vocal Synthesizers * TL;DR: Assists with speaking languages that a species doesn't normally have, - * such as EAL. Not standard or organic, because at the moment it's undesireable to completely mute characters. + * such as EAL. Not standard or organic, because at the moment it's undesireable to completely mute characters. - - Can now actually cause muting, if destroyed / removed. */ /obj/item/organ/internal/voicebox @@ -10,6 +10,7 @@ parent_organ = BP_TORSO // We don't have a neck area organ_tag = O_VOICE will_assist_languages = list(LANGUAGE_GALCOM) + var/mute = FALSE /obj/item/organ/internal/voicebox/New() ..() diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 579e7776b79..b9aecbe250d 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -14,6 +14,7 @@ var/list/organ_cache = list() var/vital // Lose a vital limb, die immediately. var/damage = 0 // Current damage to the organ var/robotic = 0 + var/stapled_nerves = FALSE // Reference data. var/mob/living/carbon/human/owner // Current mob owning the organ. @@ -78,6 +79,7 @@ var/list/organ_cache = list() if(E.internal_organs == null) E.internal_organs = list() E.internal_organs |= src + H.internal_organs_by_name[organ_tag] = src if(dna) if(!blood_DNA) blood_DNA = list() @@ -430,6 +432,8 @@ var/list/organ_cache = list() return 0 if(robotic && robotic < ORGAN_LIFELIKE) //Super fancy humanlike robotics probably have sensors, or something? return 0 + if(stapled_nerves) + return 0 return 1 /obj/item/organ/proc/handle_organ_mod_special(var/removed = FALSE) // Called when created, transplanted, and removed. diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index c8b02f02b82..433dfae84ea 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -25,6 +25,7 @@ var/burn_dam = 0 // Actual current burn damage. var/last_dam = -1 // used in healing/processing calculations. var/spread_dam = 0 + var/thick_skin = 0 // If a needle has a chance to fail to penetrate. // Appearance vars. var/nonsolid // Snowflake warning, reee. Used for slime limbs. diff --git a/code/modules/organs/organ_external_vr.dm b/code/modules/organs/organ_external_vr.dm index 0e3fb07d9ee..491cce94287 100644 --- a/code/modules/organs/organ_external_vr.dm +++ b/code/modules/organs/organ_external_vr.dm @@ -13,3 +13,7 @@ min_broken_damage = o_min_broken_damage else return ..() + +/obj/item/organ/external/proc/is_hidden_by_tail() + if(owner && owner.tail_style && owner.tail_style.hide_body_parts && (organ_tag in owner.tail_style.hide_body_parts)) + return 1 \ No newline at end of file diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 8f0ef8174c2..a2643f04d09 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -123,6 +123,12 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/cybersolutions/cybersolutions_alt1.dmi' unavailable_to_build = 1 +/datum/robolimb/einstein + company = "Einstein Engines" + desc = "This limb is lightweight with a sleek design." + icon = 'icons/mob/human_races/cyberlimbs/einstein/einstein_main.dmi' + unavailable_to_build = 1 + /datum/robolimb/grayson company = "Grayson" desc = "This limb has a sturdy and heavy build to it." diff --git a/code/modules/organs/subtypes/indestructible.dm b/code/modules/organs/subtypes/indestructible.dm index 2f2e13400f7..169b7f2c38a 100644 --- a/code/modules/organs/subtypes/indestructible.dm +++ b/code/modules/organs/subtypes/indestructible.dm @@ -63,3 +63,9 @@ cannot_amputate = 1 cannot_break = 1 dislocated = -1 + +/obj/item/organ/external/head/no_eyes/indestructible + cannot_gib = 1 + cannot_amputate = 1 + cannot_break = 1 + dislocated = -1 diff --git a/code/modules/organs/subtypes/slime.dm b/code/modules/organs/subtypes/slime.dm index f22b90caea2..5fb54a21b45 100644 --- a/code/modules/organs/subtypes/slime.dm +++ b/code/modules/organs/subtypes/slime.dm @@ -56,3 +56,89 @@ max_damage = 30 encased = 0 spread_dam = 1 + +/* + * Internal Slime organs. + */ + +/obj/item/organ/internal/heart/grey/colormatch/slime + name = "pneumatic network" + desc = "A disgusting sac of goo." + icon_state = "sac_slime" + dead_icon = null + standard_pulse_level = PULSE_NONE + +/obj/item/organ/internal/heart/grey/colormatch/slime/process() + ..() + if(!(QDELETED(src)) && src.loc != owner) + visible_message("\The [src] splatters!") + var/turf/T = get_turf(src) + var/obj/effect/decal/cleanable/blood/B = new (T) + + B.basecolor = src.color + B.update_icon() + qdel(src) + +/obj/item/organ/internal/regennetwork + name = "pneumoregenesis network" + parent_organ = BP_TORSO + organ_tag = O_REGBRUTE + + icon_state = "sac_slime" + + var/strain = 0 // The amount of stress this organ is under. Capped at min_broken_damage, usually half its max damage. + + var/last_strain_increase = 0 // World time of the last increase in strain. + var/strain_regen_cooldown = 5 MINUTES + +/obj/item/organ/internal/regennetwork/Initialize() + ..() + var/mob/living/carbon/human/H = null + spawn(15) + if(ishuman(owner)) + H = owner + color = H.species.get_blood_colour(H) + +/obj/item/organ/internal/regennetwork/proc/get_strain_percent(var/cost) + adjust_strain(cost) + + if((status & ORGAN_CUT_AWAY) || (status & ORGAN_BROKEN) || (status & ORGAN_DEAD)) + return 1 + + return round((strain / min_broken_damage) * 10) / 10 + +/obj/item/organ/internal/regennetwork/proc/adjust_strain(var/amount) + if(amount < 0 && world.time < (last_strain_increase + strain_regen_cooldown)) + return + + else if(amount > 0) + last_strain_increase = world.time + + strain = CLAMP(strain + amount, 0, min_broken_damage) + +/obj/item/organ/internal/regennetwork/process() + ..() + + if(!(QDELETED(src)) && src.loc != owner) + visible_message("\The [src] splatters!") + var/turf/T = get_turf(src) + var/obj/effect/decal/cleanable/blood/B = new (T) + + B.basecolor = src.color + B.update_icon() + qdel(src) + + if(src && !is_bruised()) + adjust_strain(-0.25 * max(0, (min_broken_damage - damage) / min_broken_damage)) // Decrease the current strain with respect to the current strain level. + +/obj/item/organ/internal/regennetwork/burn + name = "thermoregenesis network" + organ_tag = O_REGBURN + +/obj/item/organ/internal/regennetwork/oxy + name = "respiroregenesis network" + organ_tag = O_REGOXY + +/obj/item/organ/internal/regennetwork/tox + name = "toxoregenesis network" + organ_tag = O_REGTOX diff --git a/code/modules/organs/subtypes/standard_vr.dm b/code/modules/organs/subtypes/standard_vr.dm index 57e205466bd..8c123ed5ef4 100644 --- a/code/modules/organs/subtypes/standard_vr.dm +++ b/code/modules/organs/subtypes/standard_vr.dm @@ -37,7 +37,7 @@ var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(facial_hair_style.do_colouration) facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) - overlays |= facial_s + overlays |= image(facial_s, "pixel_y" = head_offset) if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR))) var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] @@ -45,14 +45,20 @@ var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3) hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY) - overlays |= hair_s + overlays |= image(hair_s, "pixel_y" = head_offset) return mob_icon /obj/item/organ/external/head/vr var/eye_icons_vr = 'icons/mob/human_face_vr.dmi' var/eye_icon_vr = "blank_eyes" + var/head_offset = 0 eye_icon = "blank_eyes" /obj/item/organ/external/head/vr/sergal eye_icon_vr = "eyes_sergal" + +/obj/item/organ/external/head/vr/werebeast + eye_icons_vr = 'icons/mob/werebeast_face_vr.dmi' + eye_icon_vr = "werebeast_eyes" + head_offset = 6 \ No newline at end of file diff --git a/code/modules/organs/subtypes/unathi.dm b/code/modules/organs/subtypes/unathi.dm index 212330577ce..03ff671b638 100644 --- a/code/modules/organs/subtypes/unathi.dm +++ b/code/modules/organs/subtypes/unathi.dm @@ -47,4 +47,11 @@ owner.adjustToxLoss(0.3 * PROCESS_ACCURACY) /obj/item/organ/internal/brain/unathi - color = "#b3cbc3" \ No newline at end of file + color = "#b3cbc3" + +/obj/item/organ/internal/stomach/unathi + color = "#b3cbc3" + max_acid_volume = 40 + +/obj/item/organ/internal/intestine/unathi + color = "#b3cbc3" diff --git a/code/modules/organs/subtypes/xenos.dm b/code/modules/organs/subtypes/xenos.dm index dd860ab2351..1c4cfa69078 100644 --- a/code/modules/organs/subtypes/xenos.dm +++ b/code/modules/organs/subtypes/xenos.dm @@ -137,3 +137,79 @@ if(ishuman(owner)) H = owner color = H.species.blood_color + + +// XENOMORPH EXTERNAL ORGANS + +/obj/item/organ/external/chest/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + thick_skin = TRUE + +/obj/item/organ/external/groin/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/arm/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/arm/right/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/leg/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/leg/right/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/foot/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/foot/right/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/hand/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/hand/right/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/head/unseverable/xeno + cannot_gib = 1 + cannot_amputate = 1 + thick_skin = TRUE + eye_icon = "blank_eyes" diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm index eada6f33cbe..921142812d3 100644 --- a/code/modules/planet/sif.dm +++ b/code/modules/planet/sif.dm @@ -555,4 +555,4 @@ var/datum/planet/sif/planet_sif = null if(!istype(T)) return if(T.outdoors) - radiation_repository.radiate(T, rand(fallout_rad_low, fallout_rad_high)) + SSradiation.radiate(T, rand(fallout_rad_low, fallout_rad_high)) diff --git a/maps/tether/tether_virgo3b.dm b/code/modules/planet/virgo3b_vr.dm similarity index 98% rename from maps/tether/tether_virgo3b.dm rename to code/modules/planet/virgo3b_vr.dm index 882e701abdf..791841aca71 100644 --- a/maps/tether/tether_virgo3b.dm +++ b/code/modules/planet/virgo3b_vr.dm @@ -9,14 +9,7 @@ var/datum/planet/virgo3b/planet_virgo3b = null amounts of both oxygen and nitrogen. Fortunately, the oxygen is not enough to be combustible in any meaningful way, however \ the phoron is desirable by many corporations, including NanoTrasen." current_time = new /datum/time/virgo3b() - expected_z_levels = list( - Z_LEVEL_SURFACE_LOW, - Z_LEVEL_SURFACE_MID, - Z_LEVEL_SURFACE_HIGH, - Z_LEVEL_SURFACE_MINE, - Z_LEVEL_SOLARS, - Z_LEVEL_PLAINS - ) +// expected_z_levels = list(1) // This is defined elsewhere. planetary_wall_type = /turf/unsimulated/wall/planetary/virgo3b /datum/planet/virgo3b/New() @@ -538,5 +531,5 @@ var/datum/planet/virgo3b/planet_virgo3b = null if(!istype(T)) return if(T.outdoors) - radiation_repository.radiate(T, rand(fallout_rad_low, fallout_rad_high)) + SSradiation.radiate(T, rand(fallout_rad_low, fallout_rad_high)) diff --git a/code/modules/power/apc_vr.dm b/code/modules/power/apc_vr.dm new file mode 100644 index 00000000000..c08c9b8db04 --- /dev/null +++ b/code/modules/power/apc_vr.dm @@ -0,0 +1,9 @@ +/obj/machinery/power/apc/proc/update_area() + var/area/NA = get_area(src) + if(!(NA == area)) + if(area.apc == src) + area.apc = null + NA.apc = src + area = NA + name = "[area.name] APC" + update() \ No newline at end of file diff --git a/code/modules/power/fusion/core/core_field.dm b/code/modules/power/fusion/core/core_field.dm index f0eca3add60..5444c46b037 100644 --- a/code/modules/power/fusion/core/core_field.dm +++ b/code/modules/power/fusion/core/core_field.dm @@ -313,7 +313,7 @@ radiation += plasma_temperature/2 plasma_temperature = 0 - radiation_repository.radiate(src, radiation) + SSradiation.radiate(src, radiation) Radiate() /obj/effect/fusion_em_field/proc/Radiate() @@ -522,7 +522,7 @@ //Reaction radiation is fairly buggy and there's at least three procs dealing with radiation here, this is to ensure constant radiation output. /obj/effect/fusion_em_field/proc/radiation_scale() - radiation_repository.radiate(src, 2 + plasma_temperature / PLASMA_TEMP_RADIATION_DIVISIOR) + SSradiation.radiate(src, 2 + plasma_temperature / PLASMA_TEMP_RADIATION_DIVISIOR) //Somehow fixing the radiation issue managed to break this, but moving it to it's own proc seemed to have fixed it. I don't know. /obj/effect/fusion_em_field/proc/temp_dump() diff --git a/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm b/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm index 41492743510..73543ead92b 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm @@ -46,7 +46,7 @@ return PROCESS_KILL if(istype(loc, /turf)) - radiation_repository.radiate(src, max(1,CEILING(radioactivity/30, 1))) + SSradiation.radiate(src, max(1,CEILING(radioactivity/30, 1))) /obj/item/weapon/fuel_assembly/Destroy() STOP_PROCESSING(SSobj, src) diff --git a/code/modules/power/fusion/fusion_reactions.dm b/code/modules/power/fusion/fusion_reactions.dm index 623f70bd6bd..88117f8164b 100644 --- a/code/modules/power/fusion/fusion_reactions.dm +++ b/code/modules/power/fusion/fusion_reactions.dm @@ -120,7 +120,7 @@ proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy) var/radiation_level = 200 // Copied from the SM for proof of concept. //Not any more --Cirra //Use the whole z proc --Leshana - radiation_repository.z_radiate(locate(1, 1, holder.z), radiation_level, 1) + SSradiation.z_radiate(locate(1, 1, holder.z), radiation_level, 1) for(var/mob/living/mob in living_mob_list) var/turf/T = get_turf(mob) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 542fe3153de..ba60c84d32d 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -9,7 +9,7 @@ #define LIGHT_BROKEN 2 #define LIGHT_BURNED 3 #define LIGHT_BULB_TEMPERATURE 400 //K - used value for a 60W bulb -#define LIGHTING_POWER_FACTOR 5 //5W per luminosity * range +#define LIGHTING_POWER_FACTOR 2 //5W per luminosity * range //VOREStation Edit: why the fuck are lights eating so much power, 2W per thing var/global/list/light_type_cache = list() /proc/get_light_type_instance(var/light_type) @@ -170,7 +170,7 @@ var/global/list/light_type_cache = list() layer = ABOVE_MOB_LAYER use_power = 2 idle_power_usage = 2 - active_power_usage = 20 // VOREStation Edit - Keep lights at 20 power + active_power_usage = 10 power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list var/on = 0 // 1 if on, 0 if off var/brightness_range diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 5e4c2e6207c..2443f3ea279 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -399,13 +399,13 @@ /obj/machinery/power/port_gen/pacman/super/UseFuel() //produces a tiny amount of radiation when in use if (prob(2*power_output)) - radiation_repository.radiate(src, 4) + SSradiation.radiate(src, 4) ..() /obj/machinery/power/port_gen/pacman/super/explode() //a nice burst of radiation var/rads = 50 + (sheets + sheet_left)*1.5 - radiation_repository.radiate(src, (max(20, rads))) + SSradiation.radiate(src, (max(20, rads))) explosion(src.loc, 3, 3, 5, 3) qdel(src) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 0bac07c2dc9..1dc29c7fd75 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -32,7 +32,7 @@ var/global/list/rad_collectors = list() if(P && active) - var/rads = radiation_repository.get_rads_at_turf(get_turf(src)) + var/rads = SSradiation.get_rads_at_turf(get_turf(src)) if(rads) receive_pulse(rads * 5) //Maths is hard diff --git a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm index b3a1556395f..921b0000781 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm @@ -142,13 +142,13 @@ /obj/machinery/particle_smasher/process() if(!src.anchored) // Rapidly loses focus. if(energy) - radiation_repository.radiate(src, round(((src.energy-150)/50)*5,1)) + SSradiation.radiate(src, round(((src.energy-150)/50)*5,1)) energy = max(0, energy - 30) update_icon() return if(energy) - radiation_repository.radiate(src, round(((src.energy-150)/50)*5,1)) + SSradiation.radiate(src, round(((src.energy-150)/50)*5,1)) energy = CLAMP(energy - 5, 0, max_energy) return @@ -178,7 +178,7 @@ if(successful_craft) visible_message("\The [src] fizzles.") if(prob(33)) // Why are you blasting it after it's already done! - radiation_repository.radiate(src, 10 + round(src.energy / 60, 1)) + SSradiation.radiate(src, 10 + round(src.energy / 60, 1)) energy = max(0, energy - 30) update_icon() return diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 3768ab95358..b75a81e1e4b 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -408,7 +408,7 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity) if (src.energy>200) toxdamage = round(((src.energy-150)/50)*4,1) radiation = round(((src.energy-150)/50)*5,1) - radiation_repository.radiate(src, radiation) //Always radiate at max, so a decent dose of radiation is applied + SSradiation.radiate(src, radiation) //Always radiate at max, so a decent dose of radiation is applied for(var/mob/living/M in view(toxrange, src.loc)) if(M.status_flags & GODMODE) continue @@ -451,7 +451,7 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity) M << "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat." M << "You don't even have a moment to react as you are reduced to ashes by the intense radiation." M.dust() - radiation_repository.radiate(src, rand(energy)) + SSradiation.radiate(src, rand(energy)) return /obj/singularity/proc/pulse() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index dae021e5cd4..c4c7d2ff02b 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -253,6 +253,7 @@ GLOBAL_LIST_EMPTY(solars_list) new /obj/machinery/power/tracker(get_turf(src), src) else new /obj/machinery/power/solar(get_turf(src), src) + qdel(src) else to_chat(user, "You need two sheets of glass to put them into a solar panel.") return diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index cbbd9e193d9..9e1f3f06c29 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -141,7 +141,7 @@ if(!TS) return for(var/z in GetConnectedZlevels(TS.z)) - radiation_repository.z_radiate(locate(1, 1, z), DETONATION_RADS, 1) + SSradiation.z_radiate(locate(1, 1, z), DETONATION_RADS, 1) for(var/mob/living/mob in living_mob_list) var/turf/T = get_turf(mob) if(T && (loc.z == T.z)) @@ -171,6 +171,7 @@ /obj/machinery/power/supermatter/proc/announce_warning() var/integrity = get_integrity() var/alert_msg = " Integrity at [integrity]%" + var/message_sound = 'sound/ambience/matteralarm.ogg' // VOREStation Edit - Rykka adds SM Delam alarm if(damage > emergency_point) alert_msg = emergency_alert + alert_msg @@ -191,6 +192,9 @@ //Public alerts if((damage > emergency_point) && !public_alert) global_announcer.autosay("WARNING: SUPERMATTER CRYSTAL DELAMINATION IMMINENT!", "Supermatter Monitor") + for(var/mob/M in player_list) // VOREStation Edit - Rykka adds SM Delam alarm + if(!istype(M,/mob/new_player) && !isdeaf(M)) // VOREStation Edit - Rykka adds SM Delam alarm + M << message_sound // VOREStation Edit - Rykka adds SM Delam alarm admin_chat_message(message = "SUPERMATTER DELAMINATING!", color = "#FF2222") //VOREStation Add public_alert = 1 log_game("SUPERMATTER([x],[y],[z]) Emergency PUBLIC announcement. Power:[power], Oxygen:[oxygen], Damage:[damage], Integrity:[get_integrity()]") @@ -307,7 +311,7 @@ if(!istype(l.glasses, /obj/item/clothing/glasses/meson)) // VOREStation Edit - Only mesons can protect you! l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) ) - radiation_repository.radiate(src, max(power * 1.5, 50) ) //Better close those shutters! + SSradiation.radiate(src, max(power * 1.5, 50) ) //Better close those shutters! power -= (power/DECAY_FACTOR)**3 //energy losses due to radiation @@ -420,7 +424,7 @@ else l.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 2) var/rads = 500 - radiation_repository.radiate(src, rads) + SSradiation.radiate(src, rads) /proc/supermatter_pull(var/atom/target, var/pull_range = 255, var/pull_power = STAGE_FIVE) for(var/atom/A in range(pull_range, target)) @@ -463,7 +467,7 @@ return ..() /obj/item/broken_sm/process() - radiation_repository.radiate(src, 50) + SSradiation.radiate(src, 50) /obj/item/broken_sm/Destroy() STOP_PROCESSING(SSobj, src) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 7d46fcd73f7..8f1c01be21e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -692,18 +692,18 @@ var/obj/item/projectile/in_chamber = consume_next_projectile() if (istype(in_chamber)) user.visible_message("[user] pulls the trigger.") - play_fire_sound() + play_fire_sound(M, in_chamber) if(istype(in_chamber, /obj/item/projectile/beam/lasertag)) user.show_message("You feel rather silly, trying to commit suicide with a toy.") mouthshoot = 0 return in_chamber.on_hit(M) - if (in_chamber.damage_type != HALLOSS) + if(in_chamber.damage_type != HALLOSS && !in_chamber.nodamage) log_and_message_admins("[key_name(user)] commited suicide using \a [src]") user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1) user.death() - else + else if(in_chamber.damage_type == HALLOSS) to_chat(user, "Ow...") user.apply_effect(110,AGONY,0) qdel(in_chamber) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index d69b7c7559e..c28e2b05882 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -1,208 +1,230 @@ -/obj/item/weapon/gun/energy - name = "energy gun" - desc = "A basic energy-based gun." - icon_state = "energy" - fire_sound_text = "laser blast" - - var/obj/item/weapon/cell/power_supply //What type of power cell this uses - var/charge_cost = 240 //How much energy is needed to fire. - - var/accept_cell_type = /obj/item/weapon/cell/device - var/cell_type = /obj/item/weapon/cell/device/weapon - projectile_type = /obj/item/projectile/beam/practice - - var/modifystate - var/charge_meter = 1 //if set, the icon state will be chosen based on the current charge - - //self-recharging - var/self_recharge = 0 //if set, the weapon will recharge itself - var/use_external_power = 0 //if set, the weapon will look for an external power source to draw from, otherwise it recharges magically - var/recharge_time = 4 - var/charge_tick = 0 - var/charge_delay = 75 //delay between firing and charging - - var/battery_lock = 0 //If set, weapon cannot switch batteries - -/obj/item/weapon/gun/energy/New() - ..() - if(self_recharge) - power_supply = new /obj/item/weapon/cell/device/weapon(src) - START_PROCESSING(SSobj, src) - else - if(cell_type) - power_supply = new cell_type(src) - else - power_supply = null - - update_icon() - -/obj/item/weapon/gun/energy/Destroy() - if(self_recharge) - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/weapon/gun/energy/get_cell() - return power_supply - -/obj/item/weapon/gun/energy/process() - if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the battery - if(world.time > last_shot + charge_delay) //Doesn't work if you've fired recently - if(!power_supply || power_supply.charge >= power_supply.maxcharge) - return 0 // check if we actually need to recharge - - charge_tick++ - if(charge_tick < recharge_time) return 0 - charge_tick = 0 - - var/rechargeamt = power_supply.maxcharge*0.2 - - if(use_external_power) - var/obj/item/weapon/cell/external = get_external_power_supply() - if(!external || !external.use(rechargeamt)) //Take power from the borg... - return 0 - - power_supply.give(rechargeamt) //... to recharge 1/5th the battery - update_icon() - else - charge_tick = 0 - return 1 - -/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob) - ..() - -/obj/item/weapon/gun/energy/switch_firemodes(mob/user) - if(..()) - update_icon() - -/obj/item/weapon/gun/energy/emp_act(severity) - ..() - update_icon() - -/obj/item/weapon/gun/energy/consume_next_projectile() - if(!power_supply) return null - if(!ispath(projectile_type)) return null - if(!power_supply.checked_use(charge_cost)) return null - return new projectile_type(src) - -/obj/item/weapon/gun/energy/proc/load_ammo(var/obj/item/C, mob/user) - if(istype(C, /obj/item/weapon/cell)) - if(self_recharge || battery_lock) - user << "[src] does not have a battery port." - return - if(istype(C, accept_cell_type)) - var/obj/item/weapon/cell/P = C - if(power_supply) - user << "[src] already has a power cell." - else - user.visible_message("[user] is reloading [src].", "You start to insert [P] into [src].") - if(do_after(user, 5 * P.w_class)) - user.remove_from_mob(P) - power_supply = P - P.loc = src - user.visible_message("[user] inserts [P] into [src].", "You insert [P] into [src].") - playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1) - update_icon() - update_held_icon() - else - user << "This cell is not fitted for [src]." - return - -/obj/item/weapon/gun/energy/proc/unload_ammo(mob/user) - if(self_recharge || battery_lock) - user << "[src] does not have a battery port." - return - if(power_supply) - user.put_in_hands(power_supply) - power_supply.update_icon() - user.visible_message("[user] removes [power_supply] from [src].", "You remove [power_supply] from [src].") - power_supply = null - playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) - update_icon() - update_held_icon() - else - user << "[src] does not have a power cell." - -/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob) - ..() - load_ammo(A, user) - -/obj/item/weapon/gun/energy/attack_hand(mob/user as mob) - if(user.get_inactive_hand() == src) - unload_ammo(user) - else - return ..() - -/obj/item/weapon/gun/energy/proc/get_external_power_supply() - if(isrobot(src.loc)) - var/mob/living/silicon/robot/R = src.loc - return R.cell - if(istype(src.loc, /obj/item/rig_module)) - var/obj/item/rig_module/module = src.loc - if(module.holder && module.holder.wearer) - var/mob/living/carbon/human/H = module.holder.wearer - if(istype(H) && H.back) - var/obj/item/weapon/rig/suit = H.back - if(istype(suit)) - return suit.cell - return null - -/obj/item/weapon/gun/energy/examine(mob/user) - . = ..() - if(power_supply) - if(charge_cost) - var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia - to_chat(user, "Has [shots_remaining] shot\s remaining.") - else - to_chat(user, "Has infinite shots remaining.") - else - to_chat(user, "Does not have a power cell.") - return - -/obj/item/weapon/gun/energy/update_icon(var/ignore_inhands) - if(power_supply == null) - if(modifystate) - icon_state = "[modifystate]_open" - else - icon_state = "[initial(icon_state)]_open" - return - else if(charge_meter) - var/ratio = power_supply.charge / power_supply.maxcharge - - //make sure that rounding down will not give us the empty state even if we have charge for a shot left. - if(power_supply.charge < charge_cost) - ratio = 0 - else - ratio = max(round(ratio, 0.25) * 100, 25) - - if(modifystate) - icon_state = "[modifystate][ratio]" - else - icon_state = "[initial(icon_state)][ratio]" - - else if(power_supply) - if(modifystate) - icon_state = "[modifystate]" - else - icon_state = "[initial(icon_state)]" - - if(!ignore_inhands) update_held_icon() - -/obj/item/weapon/gun/energy/proc/start_recharge() - if(power_supply == null) - power_supply = new /obj/item/weapon/cell/device/weapon(src) - self_recharge = 1 - START_PROCESSING(SSobj, src) - update_icon() - -/obj/item/weapon/gun/energy/get_description_interaction() - var/list/results = list() - - if(!battery_lock && !self_recharge) - if(power_supply) - results += "[desc_panel_image("offhand")]to remove the weapon cell." - else - results += "[desc_panel_image("weapon cell")]to add a new weapon cell." - - results += ..() - - return results \ No newline at end of file +/obj/item/weapon/gun/energy + name = "energy gun" + desc = "A basic energy-based gun." + icon_state = "energy" + fire_sound_text = "laser blast" + + var/obj/item/weapon/cell/power_supply //What type of power cell this uses + var/charge_cost = 240 //How much energy is needed to fire. + + var/accept_cell_type = /obj/item/weapon/cell/device + var/cell_type = /obj/item/weapon/cell/device/weapon + projectile_type = /obj/item/projectile/beam/practice + + var/modifystate + var/charge_meter = 1 //if set, the icon state will be chosen based on the current charge + + //self-recharging + var/self_recharge = 0 //if set, the weapon will recharge itself + var/use_external_power = 0 //if set, the weapon will look for an external power source to draw from, otherwise it recharges magically + var/use_organic_power = 0 // If set, the weapon will draw from nutrition or blood. + var/recharge_time = 4 + var/charge_tick = 0 + var/charge_delay = 75 //delay between firing and charging + + var/battery_lock = 0 //If set, weapon cannot switch batteries + +/obj/item/weapon/gun/energy/New() + ..() + if(self_recharge) + power_supply = new /obj/item/weapon/cell/device/weapon(src) + START_PROCESSING(SSobj, src) + else + if(cell_type) + power_supply = new cell_type(src) + else + power_supply = null + + update_icon() + +/obj/item/weapon/gun/energy/Destroy() + if(self_recharge) + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/weapon/gun/energy/get_cell() + return power_supply + +/obj/item/weapon/gun/energy/process() + if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the battery + if(world.time > last_shot + charge_delay) //Doesn't work if you've fired recently + if(!power_supply || power_supply.charge >= power_supply.maxcharge) + return 0 // check if we actually need to recharge + + charge_tick++ + if(charge_tick < recharge_time) return 0 + charge_tick = 0 + + var/rechargeamt = power_supply.maxcharge*0.2 + + if(use_external_power) + var/obj/item/weapon/cell/external = get_external_power_supply() + if(!external || !external.use(rechargeamt)) //Take power from the borg... + return 0 + + if(use_organic_power) + var/mob/living/carbon/human/H + if(ishuman(loc)) + H = loc + + if(istype(loc, /obj/item/organ)) + var/obj/item/organ/O = loc + if(O.owner) + H = O.owner + + if(istype(H)) + var/start_nutrition = H.nutrition + var/end_nutrition = 0 + + H.nutrition -= rechargeamt / 10 + + end_nutrition = H.nutrition + + if(start_nutrition - max(0, end_nutrition) < rechargeamt / 10) + H.remove_blood((rechargeamt / 10) - (start_nutrition - max(0, end_nutrition))) + + power_supply.give(rechargeamt) //... to recharge 1/5th the battery + update_icon() + else + charge_tick = 0 + return 1 + +/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob) + ..() + +/obj/item/weapon/gun/energy/switch_firemodes(mob/user) + if(..()) + update_icon() + +/obj/item/weapon/gun/energy/emp_act(severity) + ..() + update_icon() + +/obj/item/weapon/gun/energy/consume_next_projectile() + if(!power_supply) return null + if(!ispath(projectile_type)) return null + if(!power_supply.checked_use(charge_cost)) return null + return new projectile_type(src) + +/obj/item/weapon/gun/energy/proc/load_ammo(var/obj/item/C, mob/user) + if(istype(C, /obj/item/weapon/cell)) + if(self_recharge || battery_lock) + user << "[src] does not have a battery port." + return + if(istype(C, accept_cell_type)) + var/obj/item/weapon/cell/P = C + if(power_supply) + user << "[src] already has a power cell." + else + user.visible_message("[user] is reloading [src].", "You start to insert [P] into [src].") + if(do_after(user, 5 * P.w_class)) + user.remove_from_mob(P) + power_supply = P + P.loc = src + user.visible_message("[user] inserts [P] into [src].", "You insert [P] into [src].") + playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1) + update_icon() + update_held_icon() + else + user << "This cell is not fitted for [src]." + return + +/obj/item/weapon/gun/energy/proc/unload_ammo(mob/user) + if(self_recharge || battery_lock) + user << "[src] does not have a battery port." + return + if(power_supply) + user.put_in_hands(power_supply) + power_supply.update_icon() + user.visible_message("[user] removes [power_supply] from [src].", "You remove [power_supply] from [src].") + power_supply = null + playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + update_icon() + update_held_icon() + else + user << "[src] does not have a power cell." + +/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob) + ..() + load_ammo(A, user) + +/obj/item/weapon/gun/energy/attack_hand(mob/user as mob) + if(user.get_inactive_hand() == src) + unload_ammo(user) + else + return ..() + +/obj/item/weapon/gun/energy/proc/get_external_power_supply() + if(isrobot(src.loc)) + var/mob/living/silicon/robot/R = src.loc + return R.cell + if(istype(src.loc, /obj/item/rig_module)) + var/obj/item/rig_module/module = src.loc + if(module.holder && module.holder.wearer) + var/mob/living/carbon/human/H = module.holder.wearer + if(istype(H) && H.back) + var/obj/item/weapon/rig/suit = H.back + if(istype(suit)) + return suit.cell + return null + +/obj/item/weapon/gun/energy/examine(mob/user) + . = ..() + if(power_supply) + if(charge_cost) + var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia + to_chat(user, "Has [shots_remaining] shot\s remaining.") + else + to_chat(user, "Has infinite shots remaining.") + else + to_chat(user, "Does not have a power cell.") + return + +/obj/item/weapon/gun/energy/update_icon(var/ignore_inhands) + if(power_supply == null) + if(modifystate) + icon_state = "[modifystate]_open" + else + icon_state = "[initial(icon_state)]_open" + return + else if(charge_meter) + var/ratio = power_supply.charge / power_supply.maxcharge + + //make sure that rounding down will not give us the empty state even if we have charge for a shot left. + if(power_supply.charge < charge_cost) + ratio = 0 + else + ratio = max(round(ratio, 0.25) * 100, 25) + + if(modifystate) + icon_state = "[modifystate][ratio]" + else + icon_state = "[initial(icon_state)][ratio]" + + else if(power_supply) + if(modifystate) + icon_state = "[modifystate]" + else + icon_state = "[initial(icon_state)]" + + if(!ignore_inhands) update_held_icon() + +/obj/item/weapon/gun/energy/proc/start_recharge() + if(power_supply == null) + power_supply = new /obj/item/weapon/cell/device/weapon(src) + self_recharge = 1 + START_PROCESSING(SSobj, src) + update_icon() + +/obj/item/weapon/gun/energy/get_description_interaction() + var/list/results = list() + + if(!battery_lock && !self_recharge) + if(power_supply) + results += "[desc_panel_image("offhand")]to remove the weapon cell." + else + results += "[desc_panel_image("weapon cell")]to add a new weapon cell." + + results += ..() + + return results diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index eeb8d779d28..f6321947b2c 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -24,6 +24,11 @@ use_external_power = 1 one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry. +/obj/item/weapon/gun/energy/laser/mounted/augment + use_external_power = FALSE + use_organic_power = TRUE + canremove = FALSE + /obj/item/weapon/gun/energy/laser/practice name = "practice laser carbine" desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice." diff --git a/code/modules/projectiles/guns/energy/special_vr.dm b/code/modules/projectiles/guns/energy/special_vr.dm index e1cfcaf5c93..73e878eed6b 100644 --- a/code/modules/projectiles/guns/energy/special_vr.dm +++ b/code/modules/projectiles/guns/energy/special_vr.dm @@ -2,4 +2,26 @@ projectile_type = /obj/item/projectile/ion/pistol // still packs a punch but no AoE /obj/item/weapon/gun/energy/ionrifle/weak - projectile_type = /obj/item/projectile/ion/small \ No newline at end of file + projectile_type = /obj/item/projectile/ion/small + +/obj/item/weapon/gun/energy/medigun //Adminspawn/ERT etc + name = "directed restoration system" + desc = "The BL-3 'Phoenix' is an adaptation on the ML-3 'Medbeam' design that channels the power of the beam into a single healing laser. It is highly energy-inefficient, but its medical power cannot be denied." + force = 5 + icon_state = "medbeam" + item_state = "medbeam" + icon = 'icons/obj/gun_vr.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi', + ) + slot_flags = SLOT_BELT + accuracy = 100 + fire_delay = 12 + fire_sound = 'sound/weapons/eluger.ogg' + + projectile_type = /obj/item/projectile/beam/medigun + + accept_cell_type = /obj/item/weapon/cell + cell_type = /obj/item/weapon/cell/high + charge_cost = 2500 \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index a23cf5bb4b6..4240abe9e35 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -11,6 +11,12 @@ self_recharge = 1 use_external_power = 1 +/obj/item/weapon/gun/energy/taser/mounted/augment + self_recharge = 1 + use_external_power = 0 + use_organic_power = TRUE + canremove = FALSE + /obj/item/weapon/gun/energy/taser/mounted/cyborg name = "taser gun" charge_cost = 400 diff --git a/code/modules/projectiles/guns/magnetic/bore.dm b/code/modules/projectiles/guns/magnetic/bore.dm index e27fdc38d64..4cb86a6d31c 100644 --- a/code/modules/projectiles/guns/magnetic/bore.dm +++ b/code/modules/projectiles/guns/magnetic/bore.dm @@ -86,7 +86,17 @@ user.visible_message("\The [user] slots \the [cell] into \the [src].") update_icon() return - + if(thing.is_crowbar()) + if(!manipulator) + to_chat(user, "\The [src] has no manipulator installed.") + return + manipulator.forceMove(get_turf(src)) + user.put_in_hands(manipulator) + user.visible_message("\The [user] levers \the [manipulator] from \the [src].") + playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + manipulator = null + update_icon() + return if(thing.is_screwdriver()) if(!capacitor) to_chat(user, "\The [src] has no capacitor installed.") @@ -112,6 +122,20 @@ update_icon() return + if(istype(thing, /obj/item/weapon/stock_parts/manipulator)) + if(manipulator) + to_chat(user, "\The [src] already has \a [manipulator] installed.") + return + manipulator = thing + user.drop_from_inventory(manipulator) + manipulator.forceMove(src) + playsound(loc, 'sound/machines/click.ogg', 10,1) + mat_cost = initial(mat_cost) % (2*manipulator.rating) + user.visible_message("\The [user] slots \the [manipulator] into \the [src].") + update_icon() + return + + if(istype(thing, load_type)) loading = TRUE var/obj/item/stack/material/M = thing diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm index 20e0ea85121..c327a2b51e7 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -10,6 +10,7 @@ var/obj/item/weapon/cell/cell // Currently installed powercell. var/obj/item/weapon/stock_parts/capacitor/capacitor // Installed capacitor. Higher rating == faster charge between shots. + var/obj/item/weapon/stock_parts/manipulator/manipulator // Installed manipulator. Mostly for Phoron Bore, higher rating == less mats consumed upon firing var/removable_components = TRUE // Whether or not the gun can be dismantled. var/gun_unreliable = 15 // Percentage chance of detonating in your hands. diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 0eaf2d2f425..f3603a783d3 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -44,6 +44,7 @@ var/tracer_type var/muzzle_type var/impact_type + var/datum/beam_components_cache/beam_components //Fancy hitscan lighting effects! var/hitscan_light_intensity = 1.5 @@ -432,7 +433,6 @@ if(hitscan) finalize_hitscan_and_generate_tracers() STOP_PROCESSING(SSprojectiles, src) - cleanup_beam_segments() qdel(trajectory) return ..() @@ -456,10 +456,11 @@ /obj/item/projectile/proc/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE) if(!length(beam_segments)) return + beam_components = new if(tracer_type) var/tempref = "\ref[src]" for(var/datum/point/p in beam_segments) - generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration, hitscan_light_range, hitscan_light_color_override, hitscan_light_intensity, tempref) + generate_tracer_between_points(p, beam_segments[p], beam_components, tracer_type, color, duration, hitscan_light_range, hitscan_light_color_override, hitscan_light_intensity, tempref) if(muzzle_type && duration > 0) var/datum/point/p = beam_segments[1] var/atom/movable/thing = new muzzle_type @@ -469,7 +470,7 @@ thing.transform = M thing.color = color thing.set_light(muzzle_flash_range, muzzle_flash_intensity, muzzle_flash_color_override? muzzle_flash_color_override : color) - QDEL_IN(thing, duration) + beam_components.beam_components += thing if(impacting && impact_type && duration > 0) var/datum/point/p = beam_segments[beam_segments[beam_segments.len]] var/atom/movable/thing = new impact_type @@ -479,9 +480,8 @@ thing.transform = M thing.color = color thing.set_light(impact_light_range, impact_light_intensity, impact_light_color_override? impact_light_color_override : color) - QDEL_IN(thing, duration) - if(cleanup) - cleanup_beam_segments() + beam_components.beam_components += thing + QDEL_IN(beam_components, duration) //Returns true if the target atom is on our current turf and above the right layer //If direct target is true it's the originally clicked target. diff --git a/code/modules/projectiles/projectile/arc.dm b/code/modules/projectiles/projectile/arc.dm index 0c4c9f4caa9..1f19dc0242e 100644 --- a/code/modules/projectiles/projectile/arc.dm +++ b/code/modules/projectiles/projectile/arc.dm @@ -167,4 +167,4 @@ var/rad_power = 50 /obj/item/projectile/arc/radioactive/on_impact(turf/T) - radiation_repository.radiate(T, rad_power) + SSradiation.radiate(T, rad_power) diff --git a/code/modules/projectiles/projectile/beams_vr.dm b/code/modules/projectiles/projectile/beams_vr.dm index b6ec5cbe0b4..8930260e9e7 100644 --- a/code/modules/projectiles/projectile/beams_vr.dm +++ b/code/modules/projectiles/projectile/beams_vr.dm @@ -41,3 +41,37 @@ muzzle_type = /obj/effect/projectile/muzzle/laser_blue tracer_type = /obj/effect/projectile/tracer/laser_blue impact_type = /obj/effect/projectile/impact/laser_blue + +/obj/item/projectile/beam/medigun + name = "healing beam" + icon_state = "healbeam" + damage = 0 //stops it damaging walls + nodamage = TRUE + no_attack_log = TRUE + damage_type = BURN + check_armour = "laser" + light_color = "#80F5FF" + + combustion = FALSE + + muzzle_type = /obj/effect/projectile/muzzle/medigun + tracer_type = /obj/effect/projectile/tracer/medigun + impact_type = /obj/effect/projectile/impact/medigun + +/obj/item/projectile/beam/medigun/on_hit(var/atom/target, var/blocked = 0) + if(istype(target, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = target + if(M.health < M.maxHealth) + var/obj/effect/overlay/pulse = new /obj/effect/overlay(get_turf(M)) + pulse.icon = 'icons/effects/effects.dmi' + pulse.icon_state = "heal" + pulse.name = "heal" + pulse.anchored = 1 + spawn(20) + qdel(pulse) + to_chat(target, "As the beam strikes you, your injuries close up!") + M.adjustBruteLoss(-15) + M.adjustFireLoss(-15) + M.adjustToxLoss(-5) + M.adjustOxyLoss(-5) + return 1 \ No newline at end of file diff --git a/code/modules/projectiles/targeting/targeting_mob.dm b/code/modules/projectiles/targeting/targeting_mob.dm index 765b59b4782..1f2921354b8 100644 --- a/code/modules/projectiles/targeting/targeting_mob.dm +++ b/code/modules/projectiles/targeting/targeting_mob.dm @@ -12,7 +12,7 @@ M.aiming = new(src) M.aiming.toggle_active() else - src << "This verb may only be used by living mobs, sorry." + to_chat(src, "This verb may only be used by living mobs, sorry.") return /mob/living/proc/stop_aiming(var/obj/item/thing, var/no_message = 0) diff --git a/code/modules/radiation/radiation.dm b/code/modules/radiation/radiation.dm new file mode 100644 index 00000000000..d913ad7cab4 --- /dev/null +++ b/code/modules/radiation/radiation.dm @@ -0,0 +1,59 @@ +// Describes a point source of radiation. Created either in response to a pulse of radiation, or over an irradiated atom. +// Sources will decay over time, unless something is renewing their power! +/datum/radiation_source + var/turf/source_turf // Location of the radiation source. + var/rad_power // Strength of the radiation being emitted. + var/decay = TRUE // True for automatic decay. False if owner promises to handle it (i.e. supermatter) + var/respect_maint = FALSE // True for not affecting RAD_SHIELDED areas. + var/flat = FALSE // True for power falloff with distance. + var/range // Cached maximum range, used for quick checks against mobs. + +/datum/radiation_source/Destroy() + SSradiation.sources -= src + if(SSradiation.sources_assoc[src.source_turf] == src) + SSradiation.sources_assoc -= src.source_turf + src.source_turf = null + . = ..() + +/datum/radiation_source/proc/update_rad_power(var/new_power = null) + if(new_power == null || new_power == rad_power) + return // No change + else if(new_power <= config.radiation_lower_limit) + qdel(src) // Decayed to nothing + else + rad_power = new_power + if(!flat) + range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist + +/turf + var/cached_rad_resistance = 0 + +/turf/proc/calc_rad_resistance() + cached_rad_resistance = 0 + for(var/obj/O in src.contents) + if(O.rad_resistance) //Override + cached_rad_resistance += O.rad_resistance + + else if(O.density) //So open doors don't get counted + var/material/M = O.get_material() + if(!M) continue + cached_rad_resistance += M.weight + M.radiation_resistance + // Looks like storing the contents length is meant to be a basic check if the cache is stale due to items enter/exiting. Better than nothing so I'm leaving it as is. ~Leshana + SSradiation.resistance_cache[src] = (length(contents) + 1) + +/turf/simulated/wall/calc_rad_resistance() + SSradiation.resistance_cache[src] = (length(contents) + 1) + cached_rad_resistance = (density ? material.weight + material.radiation_resistance : 0) + +/obj + var/rad_resistance = 0 // Allow overriding rad resistance + +// If people expand the system, this may be useful. Here as a placeholder until then +/atom/proc/rad_act(var/severity) + return 1 + +/mob/living/rad_act(var/severity) + if(severity && !isbelly(loc)) //eaten mobs are made immune to radiation //VOREStation Edit + src.apply_effect(severity, IRRADIATE, src.getarmor(null, "rad")) + for(var/atom/I in src) + I.rad_act(severity) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index dee4cabfa69..a481cfaf337 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -281,6 +281,28 @@ var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc) reagents.trans_to_obj(P,50) + else if (href_list["createpatch"]) + if(reagents.total_volume < 1) //Sanity checking. + return + + var/name = sanitizeSafe(input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([round(reagents.total_volume)]u)") as null|text, MAX_NAME_LEN) + + if(!name) //Blank name (sanitized to nothing, or left empty) or cancel + return + + if(reagents.total_volume < 1) //Sanity checking. + return + var/obj/item/weapon/reagent_containers/pill/patch/P = new/obj/item/weapon/reagent_containers/pill/patch(src.loc) + if(!name) name = reagents.get_master_reagent_name() + P.name = "[name] patch" + P.pixel_x = rand(-7, 7) //random position + P.pixel_y = rand(-7, 7) + + reagents.trans_to_obj(P, 60) + if(src.loaded_pill_bottle) + if(loaded_pill_bottle.contents.len < loaded_pill_bottle.max_storage_space) + P.loc = loaded_pill_bottle + else if(href_list["pill_sprite"]) pillsprite = href_list["pill_sprite"] else if(href_list["bottle_sprite"]) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 8ad8b6486d6..0b010dc4f64 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -20,6 +20,7 @@ var/max_dose = 0 var/overdose = 0 //Amount at which overdose starts var/overdose_mod = 2 //Modifier to overdose damage + var/can_overdose_touch = FALSE // Can the chemical OD when processing on touch? var/scannable = 0 // Shows up on health analyzers. var/affects_dead = 0 var/cup_icon_state = null @@ -60,19 +61,25 @@ var/datum/reagents/metabolism/active_metab = location var/removed = metabolism + var/ingest_rem_mult = 1 + var/ingest_abs_mult = 1 + if(!mrate_static == TRUE) // Modifiers for(var/datum/modifier/mod in M.modifiers) if(!isnull(mod.metabolism_percent)) removed *= mod.metabolism_percent + ingest_rem_mult *= mod.metabolism_percent // Species removed *= M.species.metabolic_rate + ingest_rem_mult *= M.species.metabolic_rate // Metabolism removed *= active_metab.metabolism_speed + ingest_rem_mult *= active_metab.metabolism_speed if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.has_organ[O_HEART]) + if(H.species.has_organ[O_HEART] && (active_metab.metabolism_class == CHEM_BLOOD)) var/obj/item/organ/internal/heart/Pump = H.internal_organs_by_name[O_HEART] if(!Pump) removed *= 0.1 @@ -80,14 +87,31 @@ removed *= 0.8 else // Otherwise, chemicals process as per percentage of your current pulse, or, if you have no pulse but are alive, by a miniscule amount. removed *= max(0.1, H.pulse / Pump.standard_pulse_level) + + if(H.species.has_organ[O_STOMACH] && (active_metab.metabolism_class == CHEM_INGEST)) + var/obj/item/organ/internal/stomach/Chamber = H.internal_organs_by_name[O_STOMACH] + if(Chamber) + ingest_rem_mult *= max(0.1, 1 - (Chamber.damage / Chamber.max_damage)) + else + ingest_rem_mult = 0.1 + + if(H.species.has_organ[O_INTESTINE] && (active_metab.metabolism_class == CHEM_INGEST)) + var/obj/item/organ/internal/intestine/Tube = H.internal_organs_by_name[O_INTESTINE] + if(Tube) + ingest_abs_mult *= max(0.1, 1 - (Tube.damage / Tube.max_damage)) + else + ingest_abs_mult = 0.1 + if(filtered_organs && filtered_organs.len) for(var/organ_tag in filtered_organs) var/obj/item/organ/internal/O = H.internal_organs_by_name[organ_tag] if(O && !O.is_broken() && prob(max(0, O.max_damage - O.damage))) removed *= 0.8 + if(active_metab.metabolism_class == CHEM_INGEST) + ingest_rem_mult *= 0.8 if(ingest_met && (active_metab.metabolism_class == CHEM_INGEST)) - removed = ingest_met + removed = ingest_met * ingest_rem_mult if(touch_met && (active_metab.metabolism_class == CHEM_TOUCH)) removed = touch_met removed = min(removed, volume) @@ -98,10 +122,10 @@ if(CHEM_BLOOD) affect_blood(M, alien, removed) if(CHEM_INGEST) - affect_ingest(M, alien, removed) + affect_ingest(M, alien, removed * ingest_abs_mult) if(CHEM_TOUCH) affect_touch(M, alien, removed) - if(overdose && (volume > overdose) && (active_metab.metabolism_class != CHEM_TOUCH)) + if(overdose && (volume > overdose) && (active_metab.metabolism_class != CHEM_TOUCH && !can_overdose_touch)) overdose(M, alien, removed) remove_self(removed) return diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index f96d53aaac3..01715512261 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -7,6 +7,15 @@ reagent_state = SOLID color = "#A8A8A8" +/datum/reagent/calcium + name = "Calcium" + id = "calcium" + description = "A chemical element, the building block of bones." + taste_description = "metallic chalk" // Apparently, calcium tastes like calcium. + taste_mult = 1.3 + reagent_state = SOLID + color = "#e9e6e4" + /datum/reagent/carbon name = "Carbon" id = "carbon" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 0da87f2d0c1..b077dd52c16 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -68,17 +68,16 @@ switch(alien) if(IS_SKRELL) M.adjustToxLoss(0.5 * removed) - return if(IS_TESHARI) ..(M, alien, removed*1.2) // Teshari get a bit more nutrition from meat. - return if(IS_UNATHI) ..(M, alien, removed*2.25) //Unathi get most of their nutrition from meat. //VOREStation Edit Start if(IS_CHIMERA) ..(M, alien, removed*4) //Xenochimera are obligate carnivores. //VOREStation Edit End - ..() + else + ..() /datum/reagent/nutriment/protein/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien && alien == IS_SKRELL) @@ -148,6 +147,24 @@ if(!istype(T, /turf/space)) new /obj/effect/decal/cleanable/flour(T) +/datum/reagent/nutriment/coffee + name = "Coffee Powder" + id = "coffeepowder" + description = "A bitter powder made by grinding coffee beans." + taste_description = "bitterness" + taste_mult = 1.3 + nutriment_factor = 1 + color = "#482000" + +/datum/reagent/nutriment/tea + name = "Tea Powder" + id = "teapowder" + description = "A dark, tart powder made from black tea leaves." + taste_description = "tartness" + taste_mult = 1.3 + nutriment_factor = 1 + color = "#101000" + /datum/reagent/nutriment/coco name = "Coco Powder" id = "coco" @@ -158,6 +175,41 @@ nutriment_factor = 5 color = "#302000" +/datum/reagent/nutriment/instantjuice + name = "Juice Powder" + id = "instantjuice" + description = "Dehydrated, powdered juice of some kind." + taste_mult = 1.3 + nutriment_factor = 1 + +/datum/reagent/nutriment/instantjuice/grape + name = "Grape Juice Powder" + id = "instantgrape" + description = "Dehydrated, powdered grape juice." + taste_description = "dry grapes" + color = "#863333" + +/datum/reagent/nutriment/instantjuice/orange + name = "Orange Juice Powder" + id = "instantorange" + description = "Dehydrated, powdered orange juice." + taste_description = "dry oranges" + color = "#e78108" + +/datum/reagent/nutriment/instantjuice/watermelon + name = "Watermelon Juice Powder" + id = "instantwatermelon" + description = "Dehydrated, powdered watermelon juice." + taste_description = "dry sweet watermelon" + color = "#b83333" + +/datum/reagent/nutriment/instantjuice/apple + name = "Apple Juice Powder" + id = "instantapple" + description = "Dehydrated, powdered apple juice." + taste_description = "dry sweet apples" + color = "#c07c40" + /datum/reagent/nutriment/soysauce name = "Soysauce" id = "soysauce" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index e2724f06475..ac51ab7168d 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -16,6 +16,29 @@ M.add_chemical_effect(CE_STABLE, 15) M.add_chemical_effect(CE_PAINKILLER, 10) +/datum/reagent/inaprovaline/topical + name = "Inaprovalaze" + id = "inaprovalaze" + description = "Inaprovalaze is a topical variant of Inaprovaline." + taste_description = "bitterness" + reagent_state = LIQUID + color = "#00BFFF" + overdose = REAGENTS_OVERDOSE * 2 + metabolism = REM * 0.5 + scannable = 1 + touch_met = REM * 0.75 + can_overdose_touch = TRUE + +/datum/reagent/inaprovaline/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien != IS_DIONA) + ..() + M.adjustToxLoss(2 * removed) + +/datum/reagent/inaprovaline/topical/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + if(alien != IS_DIONA) + M.add_chemical_effect(CE_STABLE, 20) + M.add_chemical_effect(CE_PAINKILLER, 12) + /datum/reagent/bicaridine name = "Bicaridine" id = "bicaridine" @@ -51,6 +74,53 @@ if(W.damage <= 0) O.wounds -= W +/datum/reagent/bicaridine/topical + name = "Bicaridaze" + id = "bicaridaze" + description = "Bicaridaze is a topical variant of the chemical Bicaridine." + taste_description = "bitterness" + taste_mult = 3 + reagent_state = LIQUID + color = "#BF0000" + overdose = REAGENTS_OVERDOSE * 0.75 + scannable = 1 + touch_met = REM * 0.75 + can_overdose_touch = TRUE + +/datum/reagent/bicaridine/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.75 + if(alien != IS_DIONA) + ..(M, alien, removed * chem_effective) + M.adjustToxLoss(2 * removed) + +/datum/reagent/bicaridine/topical/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.75 + if(alien != IS_DIONA) + M.heal_organ_damage(6 * removed * chem_effective, 0) + +/datum/reagent/calciumcarbonate + name = "calcium carbonate" + id = "calciumcarbonate" + description = "Calcium carbonate is a calcium salt commonly used as an antacid." + taste_description = "chalk" + reagent_state = SOLID + color = "#eae6e3" + overdose = REAGENTS_OVERDOSE * 0.8 + metabolism = REM * 0.4 + scannable = 1 + +/datum/reagent/calciumcarbonate/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) // Why would you inject this. + if(alien != IS_DIONA) + M.adjustToxLoss(3 * removed) + +/datum/reagent/calciumcarbonate/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + if(alien != IS_DIONA) + M.add_chemical_effect(CE_ANTACID, 3) + /datum/reagent/kelotane name = "Kelotane" id = "kelotane" @@ -87,6 +157,34 @@ if(alien != IS_DIONA) M.heal_organ_damage(0, 8 * removed * chem_effective) //VOREStation edit +/datum/reagent/dermaline/topical + name = "Dermalaze" + id = "dermalaze" + description = "Dermalaze is a topical variant of the chemical Dermaline." + taste_description = "bitterness" + taste_mult = 1.5 + reagent_state = LIQUID + color = "#FF8000" + overdose = REAGENTS_OVERDOSE * 0.4 + scannable = 1 + touch_met = REM * 0.75 + can_overdose_touch = TRUE + +/datum/reagent/dermaline/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.75 + if(alien != IS_DIONA) + ..(M, alien, removed * chem_effective) + M.adjustToxLoss(2 * removed) + +/datum/reagent/dermaline/topical/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.75 + if(alien != IS_DIONA) + M.heal_organ_damage(0, 12 * removed * chem_effective) + /datum/reagent/dylovene name = "Dylovene" id = "anti_toxin" @@ -203,6 +301,46 @@ M.heal_organ_damage(1.5 * removed, 1.5 * removed * chem_effective) M.adjustToxLoss(-1.5 * removed * chem_effective) +/datum/reagent/tricordrazine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + if(alien != IS_DIONA) + affect_blood(M, alien, removed * 0.4) + +/datum/reagent/tricorlidaze + name = "Tricorlidaze" + id = "tricorlidaze" + description = "Tricorlidaze is a topical gel produced with tricordrazine and sterilizine." + taste_description = "bitterness" + reagent_state = SOLID + color = "#B060FF" + scannable = 1 + can_overdose_touch = TRUE + +/datum/reagent/tricorlidaze/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + if(alien != IS_DIONA) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.5 + M.adjustOxyLoss(-2 * removed * chem_effective) + M.heal_organ_damage(1 * removed, 1 * removed * chem_effective) + M.adjustToxLoss(-2 * removed * chem_effective) + +/datum/reagent/tricorlidaze/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien != IS_DIONA) + M.adjustToxLoss(3 * removed) + affect_blood(M, alien, removed * 0.4) + +/datum/reagent/tricorlidaze/touch_obj(var/obj/O) + if(istype(O, /obj/item/stack/medical/bruise_pack) && round(volume) >= 5) + var/obj/item/stack/medical/bruise_pack/C = O + var/packname = C.name + var/to_produce = min(C.amount, round(volume / 5)) + + var/obj/item/stack/medical/M = C.upgrade_stack(to_produce) + + if(M && M.amount) + holder.my_atom.visible_message("\The [packname] bubbles.") + remove_self(to_produce * 5) + /datum/reagent/cryoxadone name = "Cryoxadone" id = "cryoxadone" @@ -254,6 +392,40 @@ M.heal_organ_damage(30 * removed, 30 * removed * chem_effective) M.adjustToxLoss(-30 * removed * chem_effective) +/datum/reagent/necroxadone + name = "Necroxadone" + id = "necroxadone" + description = "A liquid compound based upon that which is used in the cloning process. Utilized primarily in severe cases of toxic shock." + taste_description = "meat" + reagent_state = LIQUID + color = "#94B21C" + metabolism = REM * 0.5 + mrate_static = TRUE + scannable = 1 + +/datum/reagent/necroxadone/on_mob_life(var/mob/living/carbon/M, var/alien, var/datum/reagents/metabolism/location) + if(M.stat == DEAD && M.has_modifier_of_type(/datum/modifier/bloodpump_corpse)) + affects_dead = TRUE + else + affects_dead = FALSE + + . = ..(M, alien, location) + +/datum/reagent/necroxadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(M.bodytemperature < 170 || (M.stat == DEAD && M.has_modifier_of_type(/datum/modifier/bloodpump_corpse))) + var/chem_effective = 1 + if(alien == IS_SLIME) + if(prob(10)) + to_chat(M, "It's so cold. Something causes your cellular mass to harden sporadically, resulting in seizure-like twitching.") + chem_effective = 0.5 + M.Weaken(20) + M.silent = max(M.silent, 20) + M.make_jittery(4) + if(M.stat != DEAD) + M.adjustCloneLoss(-5 * removed * chem_effective) + M.adjustOxyLoss(-20 * removed * chem_effective) + M.adjustToxLoss(-40 * removed * chem_effective) + /* Painkillers */ /datum/reagent/paracetamol @@ -557,7 +729,7 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M for(var/obj/item/organ/I in H.internal_organs) - if(I.robotic >= ORGAN_ROBOT || !(I.organ_tag in list(O_APPENDIX, O_NUTRIENT, O_PLASMA, O_POLYP))) + if(I.robotic >= ORGAN_ROBOT || !(I.organ_tag in list(O_APPENDIX, O_STOMACH, O_INTESTINE, O_NUTRIENT, O_PLASMA, O_POLYP))) continue if(I.damage > 0) I.damage = max(I.damage - 4 * removed * repair_strength, 0) @@ -621,7 +793,7 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M for(var/obj/item/organ/I in H.internal_organs) - if(I.robotic >= ORGAN_ROBOT || !(I.organ_tag in list(O_HEART, O_RESPONSE, O_ANCHOR, O_EGG))) + if(I.robotic >= ORGAN_ROBOT || !(I.organ_tag in list(O_HEART, O_SPLEEN, O_RESPONSE, O_ANCHOR, O_EGG))) continue if(I.damage > 0) I.damage = max(I.damage - 4 * removed * repair_strength, 0) @@ -798,11 +970,11 @@ if(M.ingested) for(var/datum/reagent/R in M.ingested.reagent_list) if(istype(R, /datum/reagent/ethanol)) - R.remove_self(removed * 5) + R.remove_self(removed * 30) if(M.bloodstr) for(var/datum/reagent/R in M.bloodstr.reagent_list) if(istype(R, /datum/reagent/ethanol)) - R.remove_self(removed * 15) + R.remove_self(removed * 20) /datum/reagent/hyronalin name = "Hyronalin" @@ -865,6 +1037,9 @@ to_chat(M, "Your senses feel unfocused, and divided.") M.add_chemical_effect(CE_ANTIBIOTIC, dose >= overdose ? ANTIBIO_OD : ANTIBIO_NORM) +/datum/reagent/spaceacillin/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + affect_blood(M, alien, removed * 0.8) // Not 100% as effective as injections, though still useful. + /datum/reagent/corophizine name = "Corophizine" id = "corophizine" @@ -932,6 +1107,54 @@ var/obj/item/organ/external/eo = pick(H.organs) //Misleading variable name, 'organs' is only external organs eo.fracture() +/datum/reagent/spacomycaze + name = "Spacomycaze" + id = "spacomycaze" + description = "An all-purpose painkilling antibiotic gel." + taste_description = "oil" + reagent_state = SOLID + color = "#C1C1C8" + metabolism = REM * 0.4 + mrate_static = TRUE + overdose = REAGENTS_OVERDOSE + scannable = 1 + data = 0 + can_overdose_touch = TRUE + +/datum/reagent/spacomycaze/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + M.add_chemical_effect(CE_PAINKILLER, 10) + M.adjustToxLoss(3 * removed) + +/datum/reagent/spacomycaze/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + affect_blood(M, alien, removed * 0.8) + +/datum/reagent/spacomycaze/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(alien == IS_SLIME) + if(volume <= 0.1 && data != -1) + data = -1 + to_chat(M, "The itching fades...") + else + var/delay = (2 MINUTES) + if(world.time > data + delay) + data = world.time + to_chat(M, "Your skin itches.") + + M.add_chemical_effect(CE_ANTIBIOTIC, dose >= overdose ? ANTIBIO_OD : ANTIBIO_NORM) + M.add_chemical_effect(CE_PAINKILLER, 20) // 5 less than paracetamol. + +/datum/reagent/spacomycaze/touch_obj(var/obj/O) + if(istype(O, /obj/item/stack/medical/crude_pack) && round(volume) >= 1) + var/obj/item/stack/medical/crude_pack/C = O + var/packname = C.name + var/to_produce = min(C.amount, round(volume)) + + var/obj/item/stack/medical/M = C.upgrade_stack(to_produce) + + if(M && M.amount) + holder.my_atom.visible_message("\The [packname] bubbles.") + remove_self(to_produce) + /datum/reagent/sterilizine name = "Sterilizine" id = "sterilizine" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Modifiers.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Modifiers.dm new file mode 100644 index 00000000000..d9a7483ec1e --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Modifiers.dm @@ -0,0 +1,58 @@ +/* + * Modifier-applying chemicals. + */ + +/datum/reagent/modapplying + name = "brute juice" + id = "berserkmed" + description = "A liquid that is capable of causing a prolonged state of heightened aggression and durability." + taste_description = "metal" + reagent_state = LIQUID + color = "#ff5555" + metabolism = REM + + var/modifier_to_add = /datum/modifier/berserk + var/modifier_duration = 2 SECONDS // How long, per unit dose, will this last? + +/datum/reagent/modapplying/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) + return + M.add_modifier(modifier_to_add, dose * modifier_duration) + +/datum/reagent/modapplying/cryofluid + name = "cryogenic slurry" + id = "cryoslurry" + description = "An incredibly strange liquid that rapidly absorbs thermal energy from materials it contacts." + taste_description = "siberian hellscape" + color = "#4CDBDB" + metabolism = REM * 0.5 + + modifier_to_add = /datum/modifier/cryogelled + modifier_duration = 3 SECONDS + +/datum/reagent/modapplying/cryofluid/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..(M, alien, removed) + M.bodytemperature -= removed * 20 + +/datum/reagent/modapplying/cryofluid/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + affect_blood(M, alien, removed * 2.5) + +/datum/reagent/modapplying/cryofluid/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + affect_blood(M, alien, removed * 0.6) + +/datum/reagent/modapplying/cryofluid/touch_mob(var/mob/M, var/amount) + if(isliving(M)) + var/mob/living/L = M + for(var/I = 1 to rand(1, round(amount + 1))) + L.add_modifier(modifier_to_add, amount * rand(modifier_duration / 2, modifier_duration * 2)) + return + +/datum/reagent/modapplying/cryofluid/touch_turf(var/turf/T, var/amount) + if(istype(T, /turf/simulated/floor/water) && prob(amount)) + T.visible_message("\The [T] crackles loudly as the cryogenic fluid causes it to boil away, leaving behind a hard layer of ice.") + T.ChangeTurf(/turf/simulated/floor/outdoors/ice, 1, 1, TRUE) + else + if(istype(T, /turf/simulated)) + var/turf/simulated/S = T + S.freeze_floor() + return diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 79304733dd8..971a54bff2e 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -11,6 +11,7 @@ metabolism = REM * 0.25 // 0.05 by default. Hopefully enough to get some help, or die horribly, whatever floats your boat filtered_organs = list(O_LIVER, O_KIDNEYS) var/strength = 4 // How much damage it deals per unit + var/skin_danger = 0.2 // The multiplier for how effective the toxin is when making skin contact. /datum/reagent/toxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(strength && alien != IS_DIONA) @@ -23,6 +24,9 @@ M.heal_organ_damage((10/strength) * removed, (10/strength) * removed) //Doses of toxins below 10 units, and 10 strength, are capable of providing useful compounds for repair. M.adjustToxLoss(strength * removed) +/datum/reagent/toxin/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + affect_blood(M, alien, removed * 0.2) + /datum/reagent/toxin/plasticide name = "Plasticide" id = "plasticide" @@ -58,6 +62,7 @@ reagent_state = LIQUID color = "#005555" strength = 8 + skin_danger = 0.4 /datum/reagent/toxin/neurotoxic_protein/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -121,6 +126,7 @@ color = "#9D14DB" strength = 30 touch_met = 5 + skin_danger = 1 /datum/reagent/toxin/phoron/touch_mob(var/mob/living/L, var/amount) if(istype(L)) @@ -185,6 +191,7 @@ taste_description = "bitterness" reagent_state = LIQUID strength = 5 + filtered_organs = list(O_SPLEEN) /datum/reagent/toxin/expired_medicine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -226,6 +233,7 @@ color = "#FFFFFF" strength = 0 overdose = REAGENTS_OVERDOSE + filtered_organs = list(O_SPLEEN, O_KIDNEYS) /datum/reagent/toxin/potassium_chloride/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -251,6 +259,7 @@ color = "#FFFFFF" strength = 10 overdose = 20 + filtered_organs = list(O_SPLEEN, O_KIDNEYS) /datum/reagent/toxin/potassium_chlorophoride/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -291,6 +300,35 @@ M.status_flags &= ~FAKEDEATH return ..() +/datum/reagent/toxin/lichpowder + name = "Lich Powder" + id = "lichpowder" + description = "A stablized nerve agent that puts the subject into a strange state of un-death." + reagent_state = SOLID + color = "#666666" + metabolism = REM * 0.75 + strength = 2 + mrate_static = TRUE + +/datum/reagent/toxin/lichpowder/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(alien == IS_DIONA) + return + M.status_flags |= FAKEDEATH + M.adjustOxyLoss(1 * removed) + M.silent = max(M.silent, 10) + M.tod = stationtime2text() + + if(prob(1)) + M.visible_message("[M] wheezes.", "You wheeze sharply... it's cold.") + M.bodytemperature = max(M.bodytemperature - 10 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C - 10) + +/datum/reagent/toxin/lichpowder/Destroy() + if(holder && holder.my_atom && ismob(holder.my_atom)) + var/mob/M = holder.my_atom + M.status_flags &= ~FAKEDEATH + return ..() + /datum/reagent/toxin/fertilizer //Reagents used for plant fertilizers. name = "fertilizer" id = "fertilizer" @@ -346,6 +384,36 @@ if(alien == IS_DIONA) M.adjustToxLoss(50 * removed) +/datum/reagent/toxin/sifslurry + name = "Sivian Sap" + id = "sifsap" + description = "A natural slurry comprised of fluorescent bacteria native to Sif, in the Vir system." + taste_description = "sour" + reagent_state = LIQUID + color = "#C6E2FF" + strength = 2 + overdose = 20 + +/datum/reagent/toxin/sifslurry/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) // Symbiotic bacteria. + M.nutrition += strength * removed + return + else + M.add_modifier(/datum/modifier/slow_pulse, 30 SECONDS) + ..() + +/datum/reagent/toxin/sifslurry/overdose(var/mob/living/carbon/M, var/alien, var/removed) // Overdose effect. + if(alien == IS_DIONA) + return + if(ishuman(M)) + var/mob/living/carbon/human/H = M + overdose_mod *= H.species.chemOD_mod + M.apply_effect(2 * removed,IRRADIATE, 0, 0) + M.apply_effect(5 * removed,DROWSY, 0, 0) + +/datum/reagent/toxin/sifslurry/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + affect_blood(M, alien, removed * 0.7) + /datum/reagent/acid/polyacid name = "Polytrinic acid" id = "pacid" @@ -356,6 +424,16 @@ power = 10 meltdose = 4 +/datum/reagent/acid/digestive + name = "Digestive acid" + id = "stomacid" + description = "Some form of digestive slurry." + taste_description = "vomit" + reagent_state = LIQUID + color = "#664330" + power = 2 + meltdose = 30 + /datum/reagent/thermite/venom name = "Pyrotoxin" id = "thermite_v" @@ -384,6 +462,7 @@ description = "A biological agent that acts similarly to pepperspray. This compound seems to be particularly cruel, however, capable of permeating the barriers of blood vessels." taste_description = "fire" color = "#B31008" + filtered_organs = list(O_SPLEEN) /datum/reagent/condensedcapsaicin/venom/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -682,6 +761,7 @@ id = "serotrotium_v" description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans. This appears to be a biologically produced form, resulting in a specifically toxic nature." taste_description = "chalky bitterness" + filtered_organs = list(O_SPLEEN) /datum/reagent/serotrotium/venom/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -724,6 +804,7 @@ reagent_state = LIQUID color = "#C8A5DC" overdose = REAGENTS_OVERDOSE + filtered_organs = list(O_SPLEEN) /datum/reagent/impedrezene/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -929,7 +1010,7 @@ datum/reagent/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/re metabolism = REM * 4 /datum/reagent/irradiated_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - radiation_repository.radiate(get_turf(M), 20) // Irradiate people around you. + SSradiation.radiate(get_turf(M), 20) // Irradiate people around you. M.radiation = max(M.radiation + 5 * removed, 0) // Irradiate you. Because it's inside you. /datum/reagent/neurophage_nanites @@ -940,6 +1021,7 @@ datum/reagent/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/re reagent_state = SOLID color = "#555555" metabolism = REM * 4 + filtered_organs = list(O_SPLEEN) /datum/reagent/neurophage_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) M.adjustBrainLoss(2 * removed) // Their job is to give you a bad time. diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 5b373356470..b2bb2ec8c33 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -34,6 +34,7 @@ var/reaction_sound = 'sound/effects/bubbles.ogg' var/log_is_important = 0 // If this reaction should be considered important for logging. Important recipes message admins when mixed, non-important ones just log to file. + /datum/chemical_reaction/proc/can_happen(var/datum/reagents/holder) //check that all the required reagents are present if(!holder.has_all_reagents(required_reagents)) @@ -149,18 +150,18 @@ catalysts = list("phoron" = 1) result_amount = 2 -/datum/chemical_reaction/tramadol - name = "Tramadol" - id = "tramadol" - result = "tramadol" - required_reagents = list("inaprovaline" = 1, "ethanol" = 1, "oxygen" = 1) - result_amount = 3 - /datum/chemical_reaction/paracetamol name = "Paracetamol" id = "paracetamol" result = "paracetamol" - required_reagents = list("tramadol" = 1, "sugar" = 1, "water" = 1) + required_reagents = list("inaprovaline" = 1, "nitrogen" = 1, "water" = 1) + result_amount = 2 + +/datum/chemical_reaction/tramadol + name = "Tramadol" + id = "tramadol" + result = "tramadol" + required_reagents = list("paracetamol" = 1, "ethanol" = 1, "oxygen" = 1) result_amount = 3 /datum/chemical_reaction/oxycodone @@ -464,6 +465,13 @@ required_reagents = list("oxygen" = 1, "anti_toxin" = 1, "carbon" = 1) result_amount = 3 +/datum/chemical_reaction/calciumcarbonate + name = "Calcium Carbonate" + id = "calciumcarbonate" + result = "calciumcarbonate" + required_reagents = list("oxygen" = 3, "calcium" = 1, "carbon" = 1) + result_amount = 2 + /datum/chemical_reaction/soporific name = "Soporific" id = "stoxin" @@ -500,6 +508,15 @@ required_reagents = list("carpotoxin" = 5, "stoxin" = 5, "copper" = 5) result_amount = 2 +/datum/chemical_reaction/carpotoxin + name = "Carpotoxin" + id = "carpotoxin" + result = "carpotoxin" + required_reagents = list("spidertoxin" = 2, "biomass" = 1, "sifsap" = 2) + catalysts = list("sifsap" = 10) + inhibitors = list("radium" = 1) + result_amount = 2 + /datum/chemical_reaction/mindbreaker name = "Mindbreaker Toxin" id = "mindbreaker" @@ -1190,6 +1207,20 @@ new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location) return +/datum/chemical_reaction/drinks/coffee + name = "Coffee" + id = "coffee" + result = "coffee" + required_reagents = list("water" = 5, "coffeepowder" = 1) + result_amount = 5 + +/datum/chemical_reaction/drinks/tea + name = "Black tea" + id = "tea" + result = "tea" + required_reagents = list("water" = 5, "teapowder" = 1) + result_amount = 5 + /datum/chemical_reaction/drinks/hot_coco name = "Hot Coco" id = "hot_coco" @@ -1204,6 +1235,34 @@ required_reagents = list("soymilk" = 4, "sacid" = 1) result_amount = 5 +/datum/chemical_reaction/drinks/grapejuice + name = "Grape Juice" + id = "grapejuice" + result = "grapejuice" + required_reagents = list("water" = 3, "instantgrape" = 1) + result_amount = 3 + +/datum/chemical_reaction/drinks/orangejuice + name = "Orange Juice" + id = "orangejuice" + result = "orangejuice" + required_reagents = list("water" = 3, "instantorange" = 1) + result_amount = 3 + +/datum/chemical_reaction/drinks/watermelonjuice + name = "Watermelon Juice" + id = "watermelonjuice" + result = "watermelonjuice" + required_reagents = list("water" = 3, "instantwatermelon" = 1) + result_amount = 3 + +/datum/chemical_reaction/drinks/applejuice + name = "Apple Juice" + id = "applejuice" + result = "applejuice" + required_reagents = list("water" = 3, "instantapple" = 1) + result_amount = 3 + /datum/chemical_reaction/food/ketchup name = "Ketchup" id = "ketchup" @@ -2523,3 +2582,19 @@ result = "protein" required_reagents = list("anti_toxin" = 1, "neurotoxic_protein" = 2) result_amount = 2 + +/datum/chemical_reaction/neutralize_carpotoxin + name = "Neutralize Carpotoxin" + id = "carpotoxin_neutral" + result = "protein" + required_reagents = list("radium" = 1, "carpotoxin" = 1, "sifsap" = 1) + catalysts = list("sifsap" = 10) + result_amount = 2 + +/datum/chemical_reaction/neutralize_spidertoxin + name = "Neutralize Spidertoxin" + id = "spidertoxin_neutral" + result = "protein" + required_reagents = list("radium" = 1, "spidertoxin" = 1, "sifsap" = 1) + catalysts = list("sifsap" = 10) + result_amount = 2 diff --git a/code/modules/reagents/Chemistry-Recipes_vr.dm b/code/modules/reagents/Chemistry-Recipes_vr.dm index ac8fa9a7f20..c6d948ac35c 100644 --- a/code/modules/reagents/Chemistry-Recipes_vr.dm +++ b/code/modules/reagents/Chemistry-Recipes_vr.dm @@ -59,6 +59,7 @@ if(H.stat == DEAD && (/mob/living/carbon/human/proc/reconstitute_form in H.verbs)) //no magical regen for non-regenners, and can't force the reaction on live ones if(H.hasnutriment()) // make sure it actually has the conditions to revive if(H.revive_ready >= 1) // if it's not reviving, start doing so + H.revive_ready = REVIVING_READY // overrides the normal cooldown H.visible_message("[H] shudders briefly, then relaxes, faint movements stirring within.") H.chimera_regenerate() else if (/mob/living/carbon/human/proc/hatch in H.verbs)// already reviving, check if they're ready to hatch diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index 40181b81c4b..9f7ddc071ef 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -30,6 +30,7 @@ ethanol spawn_reagent = "ethanol" sacid spawn_reagent = "sacid" tungsten spawn_reagent = "tungsten" + calcium spawn_reagent = "calcium" // Bar, alcoholic beer spawn_reagent = "beer" diff --git a/code/modules/reagents/dispenser/dispenser_presets.dm b/code/modules/reagents/dispenser/dispenser_presets.dm index 08741412f1f..d3aa3c01339 100644 --- a/code/modules/reagents/dispenser/dispenser_presets.dm +++ b/code/modules/reagents/dispenser/dispenser_presets.dm @@ -21,7 +21,8 @@ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ethanol, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sacid, - /obj/item/weapon/reagent_containers/chem_disp_cartridge/tungsten + /obj/item/weapon/reagent_containers/chem_disp_cartridge/tungsten, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/calcium ) /obj/machinery/chemical_dispenser/ert @@ -111,7 +112,7 @@ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tequila, /obj/item/weapon/reagent_containers/chem_disp_cartridge/vermouth, /obj/item/weapon/reagent_containers/chem_disp_cartridge/cognac, - /obj/item/weapon/reagent_containers/chem_disp_cartridge/cider, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/cider, /obj/item/weapon/reagent_containers/chem_disp_cartridge/ale, /obj/item/weapon/reagent_containers/chem_disp_cartridge/mead ) diff --git a/code/modules/reagents/dispenser/supply.dm b/code/modules/reagents/dispenser/supply.dm index e6488d9d7e5..228c5dfeeff 100644 --- a/code/modules/reagents/dispenser/supply.dm +++ b/code/modules/reagents/dispenser/supply.dm @@ -192,6 +192,7 @@ SEC_PACK(radium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/radi SEC_PACK(ethanol, /obj/item/weapon/reagent_containers/chem_disp_cartridge/ethanol, "Reagent refill - Ethanol", "ethanol reagent cartridge crate", 15, access_chemistry) SEC_PACK(sacid, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sacid, "Reagent refill - Sulfuric Acid", "sulfuric acid reagent cartridge crate", 15, access_chemistry) SEC_PACK(tungsten, /obj/item/weapon/reagent_containers/chem_disp_cartridge/tungsten, "Reagent refill - Tungsten", "tungsten reagent cartridge crate", 15, access_chemistry) +SEC_PACK(calcium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/calcium, "Reagent refill - Calcium", "calcium reagent cartridge crate", 15, access_chemistry) // Bar-restricted (alcoholic drinks) // Datum path Contents type Supply pack name Container name Cost Container access diff --git a/code/modules/reagents/distilling/Distilling-Recipes.dm b/code/modules/reagents/distilling/Distilling-Recipes.dm new file mode 100644 index 00000000000..d610e32e9b7 --- /dev/null +++ b/code/modules/reagents/distilling/Distilling-Recipes.dm @@ -0,0 +1,216 @@ +/datum/chemical_reaction/distilling +// name = null +// id = null +// result = null +// required_reagents = list() +// catalysts = list() +// inhibitors = list() +// result_amount = 0 + + //how far the reaction proceeds each time it is processed. Used with either REACTION_RATE or HALF_LIFE macros. + reaction_rate = HALF_LIFE(6) + + //if less than 1, the reaction will be inhibited if the ratio of products/reagents is too high. + //0.5 = 50% yield -> reaction will only proceed halfway until products are removed. +// yield = 1.0 + + //If limits on reaction rate would leave less than this amount of any reagent (adjusted by the reaction ratios), + //the reaction goes to completion. This is to prevent reactions from going on forever with tiny reagent amounts. +// min_reaction = 2 + + mix_message = "The solution churns." + reaction_sound = 'sound/effects/slosh.ogg' + +// log_is_important = 0 // If this reaction should be considered important for logging. Important recipes message admins when mixed, non-important ones just log to file. + + var/list/temp_range = list(T0C, T20C) + var/temp_shift = 0 // How much the temperature changes when the reaction occurs. + +/datum/chemical_reaction/distilling/can_happen(var/datum/reagents/holder) + //check that all the required reagents are present + if(!holder.has_all_reagents(required_reagents)) + return 0 + + //check that all the required catalysts are present in the required amount + if(!holder.has_all_reagents(catalysts)) + return 0 + + //check that none of the inhibitors are present in the required amount + if(holder.has_any_reagent(inhibitors)) + return 0 + + if(!istype(holder.my_atom, /obj/item/weapon/reagent_containers/glass/distilling)) + return 0 + + else // Super special temperature check. + var/obj/item/weapon/reagent_containers/glass/distilling/D = holder.my_atom + var/obj/machinery/portable_atmospherics/powered/reagent_distillery/RD = D.Master + if(RD.current_temp < temp_range[1] || RD.current_temp > temp_range[2]) + return 0 + + return 1 + +/datum/chemical_reaction/distilling/on_reaction(var/datum/reagents/holder, var/created_volume) + if(istype(holder.my_atom, /obj/item/weapon/reagent_containers/glass/distilling)) + var/obj/item/weapon/reagent_containers/glass/distilling/D = holder.my_atom + var/obj/machinery/portable_atmospherics/powered/reagent_distillery/RD = D.Master + RD.current_temp += temp_shift + return + +// Subtypes // + +// Biomass +/datum/chemical_reaction/distilling/biomass + name = "Distilling Biomass" + id = "distill_biomass" + result = "biomass" + required_reagents = list("blood" = 1, "sugar" = 1, "phoron" = 0.5) + result_amount = 1 // 40 units per sheet, requires actually using the machine, and having blood to spare. + + temp_range = list(T20C + 80, T20C + 130) + temp_shift = -2 + +// Medicinal +/datum/chemical_reaction/distilling/inaprovalaze + name = "Distilling Inaprovalaze" + id = "distill_inaprovalaze" + result = "inaprovalaze" + required_reagents = list("inaprovaline" = 2, "foaming_agent" = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(10) + + temp_range = list(T0C + 100, T0C + 120) + +/datum/chemical_reaction/distilling/bicaridaze + name = "Distilling Bicaridaze" + id = "distill_bicaridaze" + result = "bicaridaze" + required_reagents = list("bicaridine" = 2, "foaming_agent" = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(10) + + temp_range = list(T0C + 110, T0C + 130) + +/datum/chemical_reaction/distilling/dermalaze + name = "Distilling Dermalaze" + id = "distill_dermalaze" + result = "dermalaze" + required_reagents = list("dermaline" = 2, "foaming_agent" = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(10) + + temp_range = list(T0C + 115, T0C + 130) + +/datum/chemical_reaction/distilling/spacomycaze + name = "Distilling Spacomycaze" + id = "distill_spacomycaze" + result = "spacomycaze" + required_reagents = list("paracetamol" = 1, "spaceacillin" = 1, "foaming_agent" = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(10) + + temp_range = list(T0C + 100, T0C + 120) + +/datum/chemical_reaction/distilling/tricorlidaze + name = "Distilling Tricorlidaze" + id = "distill_tricorlidaze" + result = "tricorlidaze" + required_reagents = list("tricordrazine" = 1, "sterilizine" = 1, "foaming_agent" = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(10) + + temp_range = list(T0C + 100, T0C + 120) + +// Alcohol +/datum/chemical_reaction/distilling/beer + name = "Distilling Beer" + id = "distill_beer" + result = "beer" + required_reagents = list("nutriment" = 1, "water" = 1, "sugar" = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(30) + + temp_range = list(T20C, T20C + 2) + +/datum/chemical_reaction/distilling/ale + name = "Distilling Ale" + id = "distill_ale" + result = "ale" + required_reagents = list("nutriment" = 1, "beer" = 1) + inhibitors = list("water" = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(30) + + temp_shift = 0.5 + temp_range = list(T0C + 7, T0C + 13) + +// Unique +/datum/chemical_reaction/distilling/berserkjuice + name = "Distilling Brute Juice" + id = "distill_brutejuice" + result = "berserkmed" + required_reagents = list("biomass" = 1, "hyperzine" = 3, "synaptizine" = 2, "phoron" = 1) + result_amount = 3 + + temp_range = list(T0C + 600, T0C + 700) + temp_shift = 4 + +/datum/chemical_reaction/distilling/berserkjuice/on_reaction(var/datum/reagents/holder, var/created_volume) + ..() + + if(prob(1)) + var/turf/T = get_turf(holder.my_atom) + explosion(T, -1, rand(-1, 1), rand(1,2), rand(3,5)) + return + +/datum/chemical_reaction/distilling/cryogel + name = "Distilling Cryogellatin" + id = "distill_cryoslurry" + result = "cryoslurry" + required_reagents = list("frostoil" = 7, "enzyme" = 3, "plasticide" = 3, "foaming_agent" = 2) + inhibitors = list("water" = 5) + result_amount = 1 + + temp_range = list(0, 15) + temp_shift = 20 + +/datum/chemical_reaction/distilling/cryogel/on_reaction(var/datum/reagents/holder, var/created_volume) + ..() + + if(prob(1)) + var/turf/T = get_turf(holder.my_atom) + var/datum/effect/effect/system/smoke_spread/frost/F = new (holder.my_atom) + F.set_up(6, 0, T) + F.start() + return + +/datum/chemical_reaction/distilling/lichpowder + name = "Distilling Lichpowder" + id = "distill_lichpowder" + result = "lichpowder" + required_reagents = list("zombiepowder" = 2, "leporazine" = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(8) + + temp_range = list(T0C + 100, T0C + 150) + +/datum/chemical_reaction/distilling/necroxadone + name = "Distilling Necroxadone" + id = "distill_necroxadone" + result = "necroxadone" + required_reagents = list("lichpowder" = 1, "cryoxadone" = 1, "carthatoline" = 1) + result_amount = 2 + + catalysts = list("phoron" = 5) + + reaction_rate = HALF_LIFE(20) + + temp_range = list(T0C + 90, T0C + 95) diff --git a/code/modules/reagents/distilling/distilling.dm b/code/modules/reagents/distilling/distilling.dm new file mode 100644 index 00000000000..b86bcc74352 --- /dev/null +++ b/code/modules/reagents/distilling/distilling.dm @@ -0,0 +1,317 @@ + +/* + * Distillery, used for over-time temperature-based mixes. + */ + +/obj/machinery/portable_atmospherics/powered/reagent_distillery + name = "chemical distillery" + desc = "A complex machine utilizing state-of-the-art components to mix chemicals at different temperatures." + use_power = 1 + + icon = 'icons/obj/machines/reagent.dmi' + icon_state = "distiller" + var/base_state // The string var used in update icon for overlays, either set manually or initialized. + + power_rating = 3000 + power_losses = 240 + + var/on = FALSE + + var/target_temp = T20C + + var/max_temp = T20C + 300 + var/min_temp = T0C - 10 + + var/current_temp = T20C + + var/use_atmos = FALSE // If true, this machine will be connectable to ports, and use gas mixtures as the source of heat, rather than its internal controls. + + var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine") + var/static/radial_use = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_use") + + var/static/radial_pump = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_pump") + + var/static/radial_eject_input = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject_input") + var/static/radial_eject_output = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject_output") + + var/static/radial_adjust_temp = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_temp") + + var/static/radial_install_input = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_add") + var/static/radial_install_output = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_add") + + var/static/radial_inspectgauges = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_lookat") + + var/static/radial_mix = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_mix") + +// Overlay holders so we don't have to constantly remake them. + var/image/overlay_output_beaker + var/image/overlay_input_beaker + var/image/overlay_off + var/image/overlay_ready + var/image/overlay_cooling + var/image/overlay_heating + var/image/overlay_dumping + var/image/overlay_connected + +// Our unique beaker, used in its unique recipes to ensure things can only react inside this machine and minimize oddities from trying to transfer to a machine and back. + var/obj/item/weapon/reagent_containers/glass/distilling/Reservoir + + var/obj/item/weapon/reagent_containers/glass/InputBeaker + var/obj/item/weapon/reagent_containers/glass/OutputBeaker + +// A multiplier for the production amount. This should really only ever be lower than one, otherwise you end up with duping. + var/efficiency = 1 + +/obj/item/weapon/reagent_containers/glass/distilling + name = "distilling chamber" + desc = "You should not be seeing this." + volume = 600 + + var/obj/machinery/portable_atmospherics/powered/reagent_distillery/Master + +/obj/item/weapon/reagent_containers/glass/distilling/Destroy() + Master = null + ..() + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/Initialize() + ..() + + Reservoir = new (src) + Reservoir.Master = src + + if(!base_state) + base_state = icon_state + + setup_overlay_vars() + + update_icon() + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/proc/setup_overlay_vars() + overlay_output_beaker = image(icon = src.icon, icon_state = "[base_state]-output") + overlay_input_beaker = image(icon = src.icon, icon_state = "[base_state]-input") + overlay_off = image(icon = src.icon, icon_state = "[base_state]-bad") + overlay_ready = image(icon = src.icon, icon_state = "[base_state]-good") + overlay_cooling = image(icon = src.icon, icon_state = "[base_state]-cool") + overlay_heating = image(icon = src.icon, icon_state = "[base_state]-heat") + overlay_dumping = image(icon = src.icon, icon_state = "[base_state]-dump") + overlay_connected = image(icon = src.icon, icon_state = "[base_state]-connector") + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/Destroy() + qdel(Reservoir) + Reservoir = null + if(InputBeaker) + qdel(InputBeaker) + InputBeaker = null + if(OutputBeaker) + qdel(OutputBeaker) + OutputBeaker = null + + ..() + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/attack_hand(mob/user) + var/list/options = list() + options["examine"] = radial_examine + options["use"] = radial_use + options["inspect gauges"] = radial_inspectgauges + options["pulse agitator"] = radial_mix + + if(InputBeaker) + options["eject input"] = radial_eject_input + if(OutputBeaker) + options["eject output"] = radial_eject_output + + if(!use_atmos) + options["adjust temp"] = radial_adjust_temp + + if(length(options) < 1) + return + + var/list/choice = list() + if(length(options) == 1) + for(var/key in options) + choice = key + else + choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) + + switch(choice) + if("examine") + examine(user) + + if("use") + if(powered()) + on = !on + to_chat(user, "You turn \the [src] [on ? "on" : "off"].") + + if("inspect gauges") + to_chat(user, "\The [src]'s gauges read:") + if(!use_atmos) + to_chat(user, "- Target Temperature: [target_temp]") + to_chat(user, "- Temperature: [current_temp]") + + if("pulse agitator") + to_chat(user, "You press \the [src]'s chamber agitator button.") + if(on) + visible_message("\The [src] rattles to life.") + Reservoir.reagents.handle_reactions() + else + spawn(1 SECOND) + to_chat(user, "Nothing happens..") + + if("eject input") + if(InputBeaker) + InputBeaker.forceMove(get_turf(src)) + InputBeaker = null + + if("eject output") + if(OutputBeaker) + OutputBeaker.forceMove(get_turf(src)) + OutputBeaker = null + + if("adjust temp") + target_temp = input("Choose a target temperature.", "Temperature.", T20C) as num + target_temp = CLAMP(target_temp, min_temp, max_temp) + + update_icon() + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/attackby(obj/item/weapon/W as obj, mob/user as mob) + var/list/options = list() + if(istype(W, /obj/item/weapon/reagent_containers/glass)) + if(!InputBeaker) + options["install input"] = radial_install_input + if(!OutputBeaker) + options["install output"] = radial_install_output + + if(!options || !options.len) + update_icon() + return ..() + + var/list/choice = list() + if(length(options) == 1) + for(var/key in options) + choice = key + else + choice = show_radial_menu(user, src, options, require_near = TRUE) // No telekinetics. + + switch(choice) + if("install input") + if(!InputBeaker) + user.drop_from_inventory(W) + W.add_fingerprint(user) + W.forceMove(src) + InputBeaker = W + + if("install output") + if(!OutputBeaker) + user.drop_from_inventory(W) + W.add_fingerprint(user) + W.forceMove(src) + OutputBeaker = W + + update_icon() + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/use_power(var/amount, var/chan = -1) + last_power_draw = amount + if(use_cell && cell && cell.charge) + var/cellcharge = cell.charge + cell.use(amount) + + var/celldifference = max(0, cellcharge - cell.charge) + + amount = celldifference + + var/area/A = get_area(src) + if(!A || !isarea(A)) + return + if(chan == -1) + chan = power_channel + A.use_power(amount, chan) + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/process() + ..() + + var/run_pump = FALSE + + if(InputBeaker || OutputBeaker) + run_pump = TRUE + + var/avg_temp = 0 + var/avg_pressure = 0 + + if(connected_port && connected_port.network.line_members.len) + var/list/members = list() + var/datum/pipe_network/Net = connected_port.network + members = Net.line_members.Copy() + + for(var/datum/pipeline/Line in members) + avg_pressure += Line.air.return_pressure() + avg_temp += Line.air.temperature + + avg_temp /= members.len + avg_pressure /= members.len + + if(!powered()) + on = FALSE + + if(!on || (use_atmos && (!connected_port || avg_pressure < 1000))) + current_temp = round((current_temp + T20C) / 2) + + else if(on) + if(!use_atmos) + if(current_temp != round(target_temp)) + var/shift_mod = 0 + if(current_temp < target_temp) + shift_mod = 1 + else if(current_temp > target_temp) + shift_mod = -1 + current_temp = CLAMP(round((current_temp + 1 * shift_mod) + (rand(-5, 5) / 10)), min_temp, max_temp) + use_power(power_rating * CELLRATE) + else if(connected_port && avg_pressure > 1000) + current_temp = round((current_temp + avg_temp) / 2) + else if(!run_pump) + visible_message("\The [src]'s motors wind down.") + on = FALSE + + if(InputBeaker && Reservoir.reagents.total_volume < Reservoir.reagents.maximum_volume) + InputBeaker.reagents.trans_to_holder(Reservoir.reagents, amount = rand(10,20)) + + if(OutputBeaker && OutputBeaker.reagents.total_volume < OutputBeaker.reagents.maximum_volume) + use_power(power_rating * CELLRATE * 0.5) + Reservoir.reagents.trans_to_holder(OutputBeaker.reagents, amount = rand(1, 5)) + + update_icon() + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/update_icon() + ..() + cut_overlays() + + if(InputBeaker) + add_overlay(overlay_input_beaker) + + if(OutputBeaker) + add_overlay(overlay_output_beaker) + + if(on) + if(OutputBeaker && OutputBeaker.reagents.total_volume < OutputBeaker.reagents.maximum_volume) + add_overlay(overlay_dumping) + else if(current_temp == round(target_temp)) + add_overlay(overlay_ready) + else if(current_temp < target_temp) + add_overlay(overlay_heating) + else + add_overlay(overlay_cooling) + + else + add_overlay(overlay_off) + + if(connected_port) + add_overlay(overlay_connected) + +/* + * Subtypes + */ + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/industrial + name = "industrial chemical distillery" + desc = "A gas-operated variant of a chemical distillery. Able to reach much higher, and lower, temperatures through the use of treated gas." + + use_atmos = TRUE diff --git a/code/modules/reagents/reagent_containers/blood_pack_vr.dm b/code/modules/reagents/reagent_containers/blood_pack_vr.dm index e1d616aeca2..b4e27fb95ad 100644 --- a/code/modules/reagents/reagent_containers/blood_pack_vr.dm +++ b/code/modules/reagents/reagent_containers/blood_pack_vr.dm @@ -19,3 +19,40 @@ return else return + +/obj/item/weapon/reagent_containers/blood/prelabeled + name = "IV Pack" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted." + +/obj/item/weapon/reagent_containers/blood/prelabeled/update_iv_label() + return + +/obj/item/weapon/reagent_containers/blood/prelabeled/APlus + name = "IV Pack (A+)" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted. This one is labeled A+" + blood_type = "A+" + +/obj/item/weapon/reagent_containers/blood/prelabeled/AMinus + name = "IV Pack (A-)" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted. This one is labeled A_" + blood_type = "A-" + +/obj/item/weapon/reagent_containers/blood/prelabeled/BPlus + name = "IV Pack (B+)" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted. This one is labeled B+" + blood_type = "B+" + +/obj/item/weapon/reagent_containers/blood/prelabeled/BMinus + name = "IV Pack (B-)" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted. This one is labeled B-" + blood_type = "B-" + +/obj/item/weapon/reagent_containers/blood/prelabeled/OPlus + name = "IV Pack (O+)" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted. This one is labeled O+" + blood_type = "O+" + +/obj/item/weapon/reagent_containers/blood/prelabeled/OMinus + name = "IV Pack (O-)" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted. This one is labeled O-" + blood_type = "O-" \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 92e01c8edea..a22257a8e20 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -44,7 +44,8 @@ /obj/machinery/smartfridge/, /obj/machinery/biogenerator, /obj/structure/frame, - /obj/machinery/radiocarbon_spectrometer + /obj/machinery/radiocarbon_spectrometer, + /obj/machinery/portable_atmospherics/powered/reagent_distillery ) /obj/item/weapon/reagent_containers/glass/Initialize() @@ -131,6 +132,9 @@ update_name_label() if(istype(W,/obj/item/weapon/storage/bag)) ..() + if(W && W.w_class <= w_class && (flags & OPENCONTAINER)) + to_chat(user, "You dip \the [W] into \the [src].") + reagents.touch_obj(W, reagents.total_volume) /obj/item/weapon/reagent_containers/glass/proc/update_name_label() if(label_text == "") diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 4b5949595b7..6b7910fab3e 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -44,7 +44,14 @@ to_chat(user, "You cannot inject a robotic limb.") return - if(!H.stat) + //VOREStation Add Start - Adds Prototype Hypo functionality + if(H != user && prototype) + to_chat(user, "You begin injecting [H] with \the [src].") + to_chat(H, " [user] is trying to inject you with \the [src]!") + if(!do_after(user, 30, H)) + return + //VOREstation Add End + else if(!H.stat && !prototype) //VOREStation Edit if(H != user) if(H.a_intent != I_HELP) to_chat(user, "[H] is resisting your attempt to inject them with \the [src].") diff --git a/code/modules/reagents/reagent_containers/hypospray_vr.dm b/code/modules/reagents/reagent_containers/hypospray_vr.dm index 9f52d9f699f..526ae77fbaa 100644 --- a/code/modules/reagents/reagent_containers/hypospray_vr.dm +++ b/code/modules/reagents/reagent_containers/hypospray_vr.dm @@ -6,7 +6,7 @@ amount_per_transfer_from_this = 10 volume = 10 -/obj/item/weapon/reagent_containers/hypospray/autoinjector/miner/New() +/obj/item/weapon/reagent_containers/hypospray/autoinjector/miner/Initialize() ..() reagents.add_reagent("bicaridine", 5) reagents.add_reagent("tricordrazine", 3) @@ -18,7 +18,15 @@ desc = "Contains emergency trauma autoinjectors." icon_state = "syringe" -/obj/item/weapon/storage/box/traumainjectors/New() +/obj/item/weapon/storage/box/traumainjectors/Initialize() ..() for (var/i = 1 to 7) new /obj/item/weapon/reagent_containers/hypospray/autoinjector/miner(src) + +/obj/item/weapon/reagent_containers/hypospray + var/prototype = 0 + +/obj/item/weapon/reagent_containers/hypospray/science + name = "prototype hypospray" + desc = "This reproduction hypospray is nearly a perfect replica of the early model DeForest hyposprays, sharing many of the same features. However, there are additional safety measures installed to prevent unwanted injections." + prototype = 1 diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm new file mode 100644 index 00000000000..007669286e0 --- /dev/null +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -0,0 +1,82 @@ + +/* + * Patches. A subtype of pills, in order to inherit the possible future produceability within chem-masters, and dissolving. + */ + +/obj/item/weapon/reagent_containers/pill/patch + name = "patch" + desc = "A patch." + icon = 'icons/obj/chemical.dmi' + icon_state = null + item_state = "pill" + + base_state = "patch" + + possible_transfer_amounts = null + w_class = ITEMSIZE_TINY + slot_flags = SLOT_EARS + volume = 60 + + var/pierce_material = FALSE // If true, the patch can be used through thick material. + +/obj/item/weapon/reagent_containers/pill/patch/attack(mob/M as mob, mob/user as mob) + var/mob/living/L = user + + if(M == L) + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/external/affecting = H.get_organ(check_zone(L.zone_sel.selecting)) + if(!affecting) + to_chat(user, "The limb is missing!") + return + if(affecting.status >= ORGAN_ROBOT) + to_chat(user, "\The [src] won't work on a robotic limb!") + return + + if(!H.can_inject(user, FALSE, L.zone_sel.selecting, pierce_material)) + to_chat(user, "\The [src] can't be applied through such a thick material!") + return + + to_chat(H, "\The [src] is placed on your [affecting].") + M.drop_from_inventory(src) //icon update + if(reagents.total_volume) + reagents.trans_to_mob(M, reagents.total_volume, CHEM_TOUCH) + qdel(src) + return 1 + + else if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/external/affecting = H.get_organ(check_zone(L.zone_sel.selecting)) + if(!affecting) + to_chat(user, "The limb is missing!") + return + if(affecting.status >= ORGAN_ROBOT) + to_chat(user, "\The [src] won't work on a robotic limb!") + return + + if(!H.can_inject(user, FALSE, L.zone_sel.selecting, pierce_material)) + to_chat(user, "\The [src] can't be applied through such a thick material!") + return + + user.visible_message("[user] attempts to place \the [src] onto [H]`s [affecting].") + + user.setClickCooldown(user.get_attack_speed(src)) + if(!do_mob(user, M)) + return + + user.drop_from_inventory(src) //icon update + user.visible_message("[user] applies \the [src] to [H].") + + var/contained = reagentlist() + add_attack_logs(user,M,"Applied a patch containing [contained]") + + to_chat(H, "\The [src] is placed on your [affecting].") + M.drop_from_inventory(src) //icon update + + if(reagents.total_volume) + reagents.trans_to_mob(M, reagents.total_volume, CHEM_TOUCH) + qdel(src) + + return 1 + + return 0 \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index c0b647e53b7..5ca47a6d3be 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -7,6 +7,9 @@ icon = 'icons/obj/chemical.dmi' icon_state = null item_state = "pill" + + var/base_state = "pill" + possible_transfer_amounts = null w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS @@ -15,7 +18,7 @@ /obj/item/weapon/reagent_containers/pill/Initialize() . = ..() if(!icon_state) - icon_state = "pill[rand(1, 4)]" //preset pills only use colour changing or unique icons + icon_state = "[base_state][rand(1, 4)]" //preset pills only use colour changing or unique icons /obj/item/weapon/reagent_containers/pill/attack(mob/M as mob, mob/user as mob) if(M == user) diff --git a/code/modules/reagents/reagent_containers/pill_vr.dm b/code/modules/reagents/reagent_containers/pill_vr.dm index ad9663d0201..30d084570fc 100644 --- a/code/modules/reagents/reagent_containers/pill_vr.dm +++ b/code/modules/reagents/reagent_containers/pill_vr.dm @@ -1,7 +1,7 @@ /obj/item/weapon/reagent_containers/pill/nutriment name = "Nutriment pill" desc = "Used to feed people on the field. Contains 30 units of Nutriment." - icon_state = "pill6" + icon_state = "pill10" /obj/item/weapon/reagent_containers/pill/nutriment/Initialize() ..() @@ -10,7 +10,7 @@ /obj/item/weapon/reagent_containers/pill/protein name = "Meat pill" desc = "Used to feed carnivores on the field. Contains 30 units of Protein." - icon_state = "pill20" + icon_state = "pill24" /obj/item/weapon/reagent_containers/pill/protein/Initialize() ..() @@ -19,11 +19,12 @@ /obj/item/weapon/reagent_containers/pill/rezadone name = "Rezadone pill" desc = "A powder with almost magical properties, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects." - icon_state = "pill13" + icon_state = "pill2" /obj/item/weapon/reagent_containers/pill/rezadone/Initialize() ..() reagents.add_reagent("rezadone", 5) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/peridaxon name = "Peridaxon pill" @@ -37,38 +38,42 @@ /obj/item/weapon/reagent_containers/pill/carthatoline name = "Carthatoline pill" desc = "Carthatoline is strong evacuant used to treat severe poisoning." - icon_state = "pill17" + icon_state = "pill4" /obj/item/weapon/reagent_containers/pill/carthatoline/Initialize() ..() reagents.add_reagent("carthatoline", 10) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/alkysine name = "Alkysine pill" desc = "Alkysine is a drug used to lessen the damage to neurological tissue after a catastrophic injury. Can heal brain tissue." - icon_state = "pill7" + icon_state = "pill3" /obj/item/weapon/reagent_containers/pill/alkysine/Initialize() ..() reagents.add_reagent("alkysine", 10) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/imidazoline name = "Imidazoline pill" desc = "Heals eye damage." - icon_state = "pill9" + icon_state = "pill3" /obj/item/weapon/reagent_containers/pill/imidazoline/Initialize() ..() reagents.add_reagent("imidazoline", 15) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/osteodaxon name = "Osteodaxon pill" desc = "An experimental drug used to heal bone fractures." - icon_state = "pill19" + icon_state = "pill2" /obj/item/weapon/reagent_containers/pill/osteodaxon/Initialize() ..() reagents.add_reagent("osteodaxon", 10) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/myelamine name = "Myelamine pill" @@ -78,15 +83,17 @@ /obj/item/weapon/reagent_containers/pill/myelamine/Initialize() ..() reagents.add_reagent("myelamine", 10) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/hyronalin name = "Hyronalin pill" desc = "Hyronalin is a medicinal drug used to counter the effect of radiation poisoning." - icon_state = "pill17" + icon_state = "pill4" /obj/item/weapon/reagent_containers/pill/hyronalin/Initialize() ..() reagents.add_reagent("hyronalin", 15) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/arithrazine name = "Arithrazine pill" @@ -96,21 +103,24 @@ /obj/item/weapon/reagent_containers/pill/arithrazine/Initialize() ..() reagents.add_reagent("arithrazine", 5) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/corophizine name = "Corophizine pill" desc = "A wide-spectrum antibiotic drug. Powerful and uncomfortable in equal doses." - icon_state = "pill9" + icon_state = "pill2" /obj/item/weapon/reagent_containers/pill/corophizine/Initialize() ..() reagents.add_reagent("corophizine", 5) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/healing_nanites name = "Healing nanites capsule" desc = "Miniature medical robots that swiftly restore bodily damage." - icon_state = "pill5" + icon_state = "pill1" /obj/item/weapon/reagent_containers/pill/healing_nanites/Initialize() ..() reagents.add_reagent("healing_nanites", 30) + color = reagents.get_color() diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 092070e0a4c..c68cc402cf7 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -183,8 +183,8 @@ if(H.wear_suit) if(istype(H.wear_suit, /obj/item/clothing/suit/space)) injtime = injtime * 2 - else if(!H.can_inject(user, 1)) - return + if(!H.can_inject(user, 1)) + return else if(isliving(target)) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index b60b71cc4e4..69b9937158b 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -1,7 +1,7 @@ /obj/structure/bigDelivery desc = "A big wrapped package." name = "large parcel" - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit icon_state = "deliverycloset" var/obj/wrapped = null density = 1 @@ -109,7 +109,7 @@ /obj/item/smallDelivery desc = "A small wrapped package." name = "small parcel" - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit icon_state = "deliverycrate3" var/obj/item/wrapped = null var/sortTag = null diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 106c655ae25..938495b00f7 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -61,22 +61,4 @@ other types of metals and chemistry for reagents). return new build_path(newloc) /datum/design/item - build_type = PROTOLATHE - -/datum/design/item/design_disk - name = "Design Storage Disk" - desc = "Produce additional disks for storing device designs." - id = "design_disk" - req_tech = list(TECH_DATA = 1) - materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) - build_path = /obj/item/weapon/disk/design_disk - sort_string = "GAAAA" - -/datum/design/item/tech_disk - name = "Technology Data Storage Disk" - desc = "Produce additional disks for storing technology data." - id = "tech_disk" - req_tech = list(TECH_DATA = 1) - materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) - build_path = /obj/item/weapon/disk/tech_disk - sort_string = "GAAAB" \ No newline at end of file + build_type = PROTOLATHE \ No newline at end of file diff --git a/code/modules/research/designs/HUDs.dm b/code/modules/research/designs/HUDs.dm new file mode 100644 index 00000000000..4a6648f26a5 --- /dev/null +++ b/code/modules/research/designs/HUDs.dm @@ -0,0 +1,47 @@ +// HUDs + +/datum/design/item/hud + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + +/datum/design/item/hud/AssembleDesignName() + ..() + name = "HUD glasses prototype ([item_name])" + +/datum/design/item/hud/AssembleDesignDesc() + desc = "Allows for the construction of \a [item_name] HUD glasses." + +/datum/design/item/hud/health + name = "health scanner" + id = "health_hud" + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 3) + build_path = /obj/item/clothing/glasses/hud/health + sort_string = "EAAAA" + +/datum/design/item/hud/security + name = "security records" + id = "security_hud" + req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2) + build_path = /obj/item/clothing/glasses/hud/security + sort_string = "EAAAB" + +/datum/design/item/hud/mesons + name = "optical meson scanner" + id = "mesons" + req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/clothing/glasses/meson + sort_string = "EAAAC" + +/datum/design/item/hud/material + name = "optical material scanner" + id = "material" + req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3) + build_path = /obj/item/clothing/glasses/material + sort_string = "EAAAD" + +/datum/design/item/hud/graviton_visor + name = "graviton visor" + id = "graviton_goggles" + req_tech = list(TECH_MAGNET = 5, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3, TECH_PHORON = 3) + materials = list(MAT_PLASTEEL = 2000, "glass" = 3000, MAT_PHORON = 1500) + build_path = /obj/item/clothing/glasses/graviton + sort_string = "EAAAE" \ No newline at end of file diff --git a/code/modules/research/designs/HUDs_vr.dm b/code/modules/research/designs/HUDs_vr.dm new file mode 100644 index 00000000000..aef8b12b0ce --- /dev/null +++ b/code/modules/research/designs/HUDs_vr.dm @@ -0,0 +1,7 @@ +/datum/design/item/hud/omni + name = "AR glasses" + id = "omnihud" + req_tech = list(TECH_MAGNET = 4, TECH_COMBAT = 3, TECH_BIO = 3) + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 1000) + build_path = /obj/item/clothing/glasses/omnihud + sort_string = "EAAVA" \ No newline at end of file diff --git a/code/modules/research/designs/ai_holders.dm b/code/modules/research/designs/ai_holders.dm new file mode 100644 index 00000000000..8cdcafbd6c8 --- /dev/null +++ b/code/modules/research/designs/ai_holders.dm @@ -0,0 +1,51 @@ +// Various AI/mind holding device +/datum/design/item/ai_holder/AssembleDesignName() + ..() + name = "Mind storage device prototype ([item_name])" + +/datum/design/item/ai_holder/mmi + name = "Man-machine interface" + id = "mmi" + req_tech = list(TECH_DATA = 2, TECH_BIO = 3) + build_type = PROTOLATHE | PROSFAB + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500) + build_path = /obj/item/device/mmi + category = "Misc" + sort_string = "SAAAA" + +/datum/design/item/ai_holder/posibrain + name = "Positronic brain" + id = "posibrain" + req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4) + build_type = PROTOLATHE | PROSFAB + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100) + build_path = /obj/item/device/mmi/digital/posibrain + category = "Misc" + sort_string = "SAAAB" + +/datum/design/item/ai_holder/dronebrain + name = "Robotic intelligence circuit" + id = "dronebrain" + req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_DATA = 4) + build_type = PROTOLATHE | PROSFAB + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500) + build_path = /obj/item/device/mmi/digital/robot + category = "Misc" + sort_string = "SAAAC" + +/datum/design/item/ai_holder/paicard + name = "'pAI', personal artificial intelligence device" + id = "paicard" + req_tech = list(TECH_DATA = 2) + materials = list("glass" = 500, DEFAULT_WALL_MATERIAL = 500) + build_path = /obj/item/device/paicard + sort_string = "SBAAA" + +/datum/design/item/ai_holder/intellicard + name = "intelliCore" + desc = "Allows for the construction of an intelliCore." + id = "intellicore" + req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) + materials = list("glass" = 1000, "gold" = 200) + build_path = /obj/item/device/aicard + sort_string = "SCAAA" \ No newline at end of file diff --git a/code/modules/research/designs/bag_of_holding.dm b/code/modules/research/designs/bag_of_holding.dm new file mode 100644 index 00000000000..744bbca5a3d --- /dev/null +++ b/code/modules/research/designs/bag_of_holding.dm @@ -0,0 +1,23 @@ +// Bags of holding + +/datum/design/item/boh/AssembleDesignName() + ..() + name = "Infinite capacity storage prototype ([item_name])" + +/datum/design/item/boh/bag_holding + name = "Bag of Holding" + desc = "Using localized pockets of bluespace this bag prototype offers incredible storage capacity with the contents weighting nothing. It's a shame the bag itself is pretty heavy." + id = "bag_holding" + req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6) + materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250) + build_path = /obj/item/weapon/storage/backpack/holding + sort_string = "QAAAA" + +/datum/design/item/boh/dufflebag_holding + name = "DuffleBag of Holding" + desc = "A minaturized prototype of the popular Bag of Holding, the Dufflebag of Holding is, functionally, identical to the bag of holding, but comes in a more stylish and compact form." + id = "dufflebag_holding" + req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6) + materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250) + build_path = /obj/item/weapon/storage/backpack/holding/duffle + sort_string = "QAAAB" \ No newline at end of file diff --git a/code/modules/research/designs/beakers.dm b/code/modules/research/designs/beakers.dm new file mode 100644 index 00000000000..fe231699d59 --- /dev/null +++ b/code/modules/research/designs/beakers.dm @@ -0,0 +1,22 @@ +// Various beakers + +/datum/design/item/beaker/AssembleDesignName() + name = "Beaker prototype ([item_name])" + +/datum/design/item/beaker/noreact + name = "cryostasis" + desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units." + id = "splitbeaker" + req_tech = list(TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact + sort_string = "IAAAA" + +/datum/design/item/beaker/bluespace + name = TECH_BLUESPACE + desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." + id = "bluespacebeaker" + req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 6) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "phoron" = 3000, "diamond" = 500) + build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace + sort_string = "IAAAB" \ No newline at end of file diff --git a/code/modules/research/designs/bio_devices.dm b/code/modules/research/designs/bio_devices.dm new file mode 100644 index 00000000000..87623641057 --- /dev/null +++ b/code/modules/research/designs/bio_devices.dm @@ -0,0 +1,61 @@ +/datum/design/item/biotech + materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 20) + +/datum/design/item/biotech/AssembleDesignName() + ..() + name = "Biotech device prototype ([item_name])" + +// Biotech of various types + +/datum/design/item/biotech/mass_spectrometer + desc = "A device for analyzing chemicals in blood." + id = "mass_spectrometer" + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2) + build_path = /obj/item/device/mass_spectrometer + sort_string = "JAAAA" + +/datum/design/item/biotech/adv_mass_spectrometer + desc = "A device for analyzing chemicals in blood and their quantities." + id = "adv_mass_spectrometer" + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4) + build_path = /obj/item/device/mass_spectrometer/adv + sort_string = "JAAAB" + +/datum/design/item/biotech/reagent_scanner + desc = "A device for identifying chemicals." + id = "reagent_scanner" + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2) + build_path = /obj/item/device/reagent_scanner + sort_string = "JAABA" + +/datum/design/item/biotech/adv_reagent_scanner + desc = "A device for identifying chemicals and their proportions." + id = "adv_reagent_scanner" + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4) + build_path = /obj/item/device/reagent_scanner/adv + sort_string = "JAABB" + +/datum/design/item/biotech/robot_scanner + desc = "A hand-held scanner able to diagnose robotic injuries." + id = "robot_scanner" + req_tech = list(TECH_MAGNET = 3, TECH_BIO = 2, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200) + build_path = /obj/item/device/robotanalyzer + sort_string = "JAACA" + +/datum/design/item/biotech/nanopaste + desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery." + id = "nanopaste" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000) + build_path = /obj/item/stack/nanopaste + sort_string = "JAACB" + +/datum/design/item/biotech/plant_analyzer + desc = "A device capable of quickly scanning all relevant data about a plant." + id = "plant_analyzer" + req_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) + build_path = /obj/item/device/analyzer/plant_analyzer + sort_string = "JAADA" + diff --git a/code/modules/research/designs/bio_devices_vr.dm b/code/modules/research/designs/bio_devices_vr.dm new file mode 100644 index 00000000000..2deb1854f9e --- /dev/null +++ b/code/modules/research/designs/bio_devices_vr.dm @@ -0,0 +1,23 @@ +/datum/design/item/biotech/nif + name = "nanite implant framework" + id = "nif" + req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 8000, "uranium" = 6000, "diamond" = 6000) + build_path = /obj/item/device/nif + sort_string = "JVAAA" + +/datum/design/item/biotech/nifbio + name = "bioadaptive NIF" + id = "bioadapnif" + req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, "uranium" = 10000, "diamond" = 10000) + build_path = /obj/item/device/nif/bioadap + sort_string = "JVAAB" + +/datum/design/item/biotech/nifrepairtool + name = "adv. NIF repair tool" + id = "anrt" + req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5) + materials = list(DEFAULT_WALL_MATERIAL = 200, "glass" = 3000, "uranium" = 2000, "diamond" = 2000) + build_path = /obj/item/device/nifrepairer + sort_string = "JVABA" \ No newline at end of file diff --git a/code/modules/research/designs/circuit_assembly.dm b/code/modules/research/designs/circuit_assembly.dm index 9f20032445c..0ce5d0ca8a1 100644 --- a/code/modules/research/designs/circuit_assembly.dm +++ b/code/modules/research/designs/circuit_assembly.dm @@ -1,89 +1,99 @@ -/datum/design/item/wirer - name = "Custom wirer tool" - id = "wirer" - req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) - build_path = /obj/item/device/integrated_electronics/wirer - sort_string = "VBVAA" +// Integrated circuits stuff -/datum/design/item/debugger - name = "Custom circuit debugger tool" - id = "debugger" - req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) - build_path = /obj/item/device/integrated_electronics/debugger - sort_string = "VBVAB" +/datum/design/item/integrated_circuitry/AssembleDesignName() + ..() + name = "Circuitry device design ([item_name])" - - -/datum/design/item/custom_circuit_assembly - name = "Small custom assembly" - desc = "A customizable assembly for simple, small devices." - id = "assembly-small" - req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 10000) - build_path = /obj/item/device/electronic_assembly - sort_string = "VCAAA" - -/datum/design/item/custom_circuit_assembly/medium - name = "Medium custom assembly" - desc = "A customizable assembly suited for more ambitious mechanisms." - id = "assembly-medium" - req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 20000) - build_path = /obj/item/device/electronic_assembly/medium - sort_string = "VCAAB" - -/datum/design/item/custom_circuit_assembly/drone - name = "Drone custom assembly" - desc = "A customizable assembly optimized for autonomous devices." - id = "assembly-drone" - req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 4, TECH_POWER = 4) - materials = list(DEFAULT_WALL_MATERIAL = 30000) - build_path = /obj/item/device/electronic_assembly/drone - sort_string = "VCAAC" - -/datum/design/item/custom_circuit_assembly/large - name = "Large custom assembly" - desc = "A customizable assembly for large machines." - id = "assembly-large" - req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 4) - materials = list(DEFAULT_WALL_MATERIAL = 40000) - build_path = /obj/item/device/electronic_assembly/large - sort_string = "VCAAD" - -/datum/design/item/custom_circuit_assembly/implant - name = "Implant custom assembly" - desc = "An customizable assembly for very small devices, implanted into living entities." - id = "assembly-implant" - req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 3, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 2000) - build_path = /obj/item/weapon/implant/integrated_circuit - sort_string = "VCAAE" - -/datum/design/item/custom_circuit_assembly/device - name = "Device custom assembly" - desc = "An customizable assembly designed to interface with other devices." - id = "assembly-device" - req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000) - build_path = /obj/item/device/assembly/electronic_assembly - sort_string = "VCAAF" - -/datum/design/item/custom_circuit_printer +/datum/design/item/integrated_circuitry/custom_circuit_printer name = "Portable integrated circuit printer" desc = "A portable(ish) printer for modular machines." id = "ic_printer" req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 4, TECH_DATA = 5) materials = list(DEFAULT_WALL_MATERIAL = 10000) build_path = /obj/item/device/integrated_circuit_printer - sort_string = "VCAAG" + sort_string = "UAAAA" -/datum/design/item/custom_circuit_printer_upgrade +/datum/design/item/integrated_circuitry/custom_circuit_printer_upgrade name = "Integrated circuit printer upgrade - advanced designs" desc = "Allows the integrated circuit printer to create advanced circuits" id = "ic_printer_upgrade_adv" req_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 4) materials = list(DEFAULT_WALL_MATERIAL = 2000) build_path = /obj/item/weapon/disk/integrated_circuit/upgrade/advanced - sort_string = "VCAAH" \ No newline at end of file + sort_string = "UBAAA" + +/datum/design/item/integrated_circuitry/wirer + name = "Custom wirer tool" + id = "wirer" + req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) + build_path = /obj/item/device/integrated_electronics/wirer + sort_string = "UCAAA" + +/datum/design/item/integrated_circuitry/debugger + name = "Custom circuit debugger tool" + id = "debugger" + req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) + build_path = /obj/item/device/integrated_electronics/debugger + sort_string = "UCBBB" + +// Assemblies + +/datum/design/item/integrated_circuitry/assembly/AssembleDesignName() + ..() + name = "Circuitry assembly design ([item_name])" + +/datum/design/item/integrated_circuitry/assembly/custom_circuit_assembly_small + name = "Small custom assembly" + desc = "A customizable assembly for simple, small devices." + id = "assembly-small" + req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10000) + build_path = /obj/item/device/electronic_assembly + sort_string = "UDAAA" + +/datum/design/item/integrated_circuitry/assembly/custom_circuit_assembly_medium + name = "Medium custom assembly" + desc = "A customizable assembly suited for more ambitious mechanisms." + id = "assembly-medium" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 20000) + build_path = /obj/item/device/electronic_assembly/medium + sort_string = "UDAAB" + +/datum/design/item/integrated_circuitry/assembly/custom_circuit_assembly_large + name = "Large custom assembly" + desc = "A customizable assembly for large machines." + id = "assembly-large" + req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 4) + materials = list(DEFAULT_WALL_MATERIAL = 40000) + build_path = /obj/item/device/electronic_assembly/large + sort_string = "UDAAC" + +/datum/design/item/integrated_circuitry/assembly/custom_circuit_assembly_drone + name = "Drone custom assembly" + desc = "A customizable assembly optimized for autonomous devices." + id = "assembly-drone" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 4, TECH_POWER = 4) + materials = list(DEFAULT_WALL_MATERIAL = 30000) + build_path = /obj/item/device/electronic_assembly/drone + sort_string = "UDAAD" + +/datum/design/item/integrated_circuitry/assembly/custom_circuit_assembly_device + name = "Device custom assembly" + desc = "An customizable assembly designed to interface with other devices." + id = "assembly-device" + req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000) + build_path = /obj/item/device/assembly/electronic_assembly + sort_string = "UDAAE" + +/datum/design/item/integrated_circuitry/assembly/custom_circuit_assembly_implant + name = "Implant custom assembly" + desc = "An customizable assembly for very small devices, implanted into living entities." + id = "assembly-implant" + req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 3, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 2000) + build_path = /obj/item/weapon/implant/integrated_circuit + sort_string = "UDAAF" \ No newline at end of file diff --git a/code/modules/research/designs/ai_modules.dm b/code/modules/research/designs/circuits/ai_modules.dm similarity index 89% rename from code/modules/research/designs/ai_modules.dm rename to code/modules/research/designs/circuits/ai_modules.dm index eae26ea3865..378a4fde0d0 100644 --- a/code/modules/research/designs/ai_modules.dm +++ b/code/modules/research/designs/circuits/ai_modules.dm @@ -104,14 +104,4 @@ id = "tyrant" req_tech = list(TECH_DATA = 4, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) build_path = /obj/item/weapon/aiModule/tyrant - sort_string = "XACAD" - -// AI file, AI tool -/datum/design/item/intellicard - name = "'intelliCore', AI preservation and transportation system" - desc = "Allows for the construction of an intelliCore." - id = "intellicore" - req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) - materials = list("glass" = 1000, "gold" = 200) - build_path = /obj/item/device/aicard - sort_string = "VACAA" \ No newline at end of file + sort_string = "XACAD" \ No newline at end of file diff --git a/code/modules/research/designs/circuits.dm b/code/modules/research/designs/circuits/circuits.dm similarity index 100% rename from code/modules/research/designs/circuits.dm rename to code/modules/research/designs/circuits/circuits.dm diff --git a/code/modules/research/designs/circuits/circuits_vr.dm b/code/modules/research/designs/circuits/circuits_vr.dm new file mode 100644 index 00000000000..fefb2b2db38 --- /dev/null +++ b/code/modules/research/designs/circuits/circuits_vr.dm @@ -0,0 +1,149 @@ +/datum/design/circuit/algae_farm + name = "Algae Oxygen Generator" + id = "algae_farm" + req_tech = list(TECH_ENGINEERING = 3, TECH_BIO = 2) + build_path = /obj/item/weapon/circuitboard/algae_farm + sort_string = "HABAE" + +/datum/design/circuit/thermoregulator + name = "thermal regulator" + id = "thermoregulator" + req_tech = list(TECH_ENGINEERING = 4, TECH_POWER = 3) + build_path = /obj/item/weapon/circuitboard/thermoregulator + sort_string = "HABAF" + +/datum/design/circuit/bomb_tester + name = "Explosive Effect Simulator" + id = "bomb_tester" + req_tech = list(TECH_PHORON = 3, TECH_DATA = 2, TECH_MAGNET = 2) + build_path = /obj/item/weapon/circuitboard/bomb_tester + sort_string = "HABAG" + +/datum/design/circuit/quantum_pad + name = "Quantum Pad" + id = "quantum_pad" + req_tech = list(TECH_ENGINEERING = 4, TECH_POWER = 4, TECH_BLUESPACE = 4) + build_path = /obj/item/weapon/circuitboard/quantumpad + sort_string = "HABAH" + +//////Micro mech stuff +/datum/design/circuit/mecha/gopher_main + name = "'Gopher' central control" + id = "gopher_main" + build_path = /obj/item/weapon/circuitboard/mecha/gopher/main + sort_string = "NAAEA" + +/datum/design/circuit/mecha/gopher_peri + name = "'Gopher' peripherals control" + id = "gopher_peri" + build_path = /obj/item/weapon/circuitboard/mecha/gopher/peripherals + sort_string = "NAAEB" + +/datum/design/circuit/mecha/polecat_main + name = "'Polecat' central control" + id = "polecat_main" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/polecat/main + sort_string = "NAAFA" + +/datum/design/circuit/mecha/polecat_peri + name = "'Polecat' peripherals control" + id = "polecat_peri" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/polecat/peripherals + sort_string = "NAAFB" + +/datum/design/circuit/mecha/polecat_targ + name = "'Polecat' weapon control and targeting" + id = "polecat_targ" + req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) + build_path = /obj/item/weapon/circuitboard/mecha/polecat/targeting + sort_string = "NAAFC" + +/datum/design/circuit/mecha/weasel_main + name = "'Weasel' central control" + id = "weasel_main" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/weasel/main + sort_string = "NAAGA" + +/datum/design/circuit/mecha/weasel_peri + name = "'Weasel' peripherals control" + id = "weasel_peri" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/weasel/peripherals + sort_string = "NAAGB" + +/datum/design/circuit/mecha/weasel_targ + name = "'Weasel' weapon control and targeting" + id = "weasel_targ" + req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) + build_path = /obj/item/weapon/circuitboard/mecha/weasel/targeting + sort_string = "NAAGC" + +/datum/design/circuit/transhuman_clonepod + name = "grower pod" + id = "transhuman_clonepod" + req_tech = list(TECH_DATA = 3, TECH_BIO = 3) + build_path = /obj/item/weapon/circuitboard/transhuman_clonepod + sort_string = "HAADA" + +/datum/design/circuit/transhuman_synthprinter + name = "SynthFab 3000" + id = "transhuman_synthprinter" + req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) + build_path = /obj/item/weapon/circuitboard/transhuman_synthprinter + sort_string = "HAADB" + +/datum/design/circuit/transhuman_resleever + name = "Resleeving pod" + id = "transhuman_resleever" + req_tech = list(TECH_ENGINEERING = 4, TECH_BIO = 4) + build_path = /obj/item/weapon/circuitboard/transhuman_resleever + sort_string = "HAADC" + +// Resleeving + +/datum/design/circuit/resleeving_control + name = "Resleeving control console" + id = "resleeving_control" + req_tech = list(TECH_DATA = 5) + build_path = /obj/item/weapon/circuitboard/resleeving_control + sort_string = "HAADE" + +/datum/design/circuit/body_designer + name = "Body design console" + id = "body_designer" + req_tech = list(TECH_DATA = 5) + build_path = /obj/item/weapon/circuitboard/body_designer + sort_string = "HAADF" + +/datum/design/circuit/partslathe + name = "Parts lathe" + id = "partslathe" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/partslathe + sort_string = "HABAD" + +// Telesci stuff + +/datum/design/circuit/telesci_console + name = "Telepad Control Console" + id = "telesci_console" + req_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 3, TECH_PHORON = 4) + build_path = /obj/item/weapon/circuitboard/telesci_console + sort_string = "HAAEA" + +/datum/design/circuit/telesci_pad + name = "Telepad" + id = "telesci_pad" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) + build_path = /obj/item/weapon/circuitboard/telesci_pad + sort_string = "HAAEB" + +/datum/design/circuit/quantum_pad + name = "Quantum Pad" + id = "quantum_pad" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) + build_path = /obj/item/weapon/circuitboard/quantumpad + sort_string = "HAAC" \ No newline at end of file diff --git a/code/modules/research/designs/engineering.dm b/code/modules/research/designs/engineering.dm new file mode 100644 index 00000000000..f499a47a86c --- /dev/null +++ b/code/modules/research/designs/engineering.dm @@ -0,0 +1,74 @@ +// Tools + +/datum/design/item/tool/AssembleDesignName() + ..() + name = "Experimental tool prototype ([item_name])" + +/datum/design/item/tool/experimental_welder + name = "Experimental welding tool" + desc = "A welding tool that generate fuel for itself." + id = "expwelder" + req_tech = list(TECH_ENGINEERING = 4, TECH_PHORON = 3, TECH_MATERIAL = 4) + materials = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120, "phoron" = 100) + build_path = /obj/item/weapon/weldingtool/experimental + sort_string = "NAAAA" + +/datum/design/item/tool/hand_drill + name = "Hand drill" + desc = "A simple powered hand drill." + id = "handdrill" + req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100) + build_path = /obj/item/weapon/tool/screwdriver/power + sort_string = "NAAAB" + +/datum/design/item/tool/jaws_life + name = "Jaws of life" + desc = "A set of jaws of life, compressed through the magic of science." + id = "jawslife" + req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100) + build_path = /obj/item/weapon/tool/crowbar/power + sort_string = "NAAAC" + +// Other devices + +/datum/design/item/engineering/AssembleDesignName() + ..() + name = "Engineering device prototype ([item_name])" + +/datum/design/item/engineering/t_scanner + name = "T-ray Scanner" + desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." + id = "tscanner" + req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 200) + build_path = /obj/item/device/t_scanner + sort_string = "NBAAA" + +/datum/design/item/engineering/t_scanner_upg + name = "Upgraded T-ray Scanner" + desc = "An upgraded version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." + id = "upgradedtscanner" + req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 4, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "phoron" = 150) + build_path = /obj/item/device/t_scanner/upgraded + sort_string = "NBAAB" + +/datum/design/item/engineering/t_scanner_adv + name = "Advanced T-ray Scanner" + desc = "An advanced version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." + id = "advancedtscanner" + req_tech = list(TECH_MAGNET = 6, TECH_ENGINEERING = 6, TECH_MATERIAL = 6) + materials = list(DEFAULT_WALL_MATERIAL = 1250, "phoron" = 500, "silver" = 50) + build_path = /obj/item/device/t_scanner/advanced + sort_string = "NBAAC" + +/datum/design/item/engineering/atmosanalyzer + name = "Analyzer" + desc = "A hand-held environmental scanner which reports current gas levels." + id = "atmosanalyzer" + req_tech = list(TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 200, "glass" = 100) + build_path = /obj/item/device/analyzer + sort_string = "NBABA" \ No newline at end of file diff --git a/code/modules/research/designs/illegal.dm b/code/modules/research/designs/illegal.dm deleted file mode 100644 index 4e99fc8665a..00000000000 --- a/code/modules/research/designs/illegal.dm +++ /dev/null @@ -1,27 +0,0 @@ -// Yeah yeah, vague file name. Basically a misc folder for antag things that RnD can make. - -/datum/design/item/binaryencrypt - name = "Binary encryption key" - desc = "Allows for deciphering the binary channel on-the-fly." - id = "binaryencrypt" - req_tech = list(TECH_ILLEGAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 300, "glass" = 300) - build_path = /obj/item/device/encryptionkey/binary - sort_string = "VASAA" - -/datum/design/item/chameleon - name = "Holographic equipment kit" - desc = "A kit of dangerous, high-tech equipment with changeable looks." - id = "chameleon" - req_tech = list(TECH_ILLEGAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500) - build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon - sort_string = "VASBA" - -/datum/design/item/weapon/esword - name = "Portable Energy Blade" - id = "chargesword" - req_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 4, TECH_ENGINEERING = 5, TECH_ILLEGAL = 4, TECH_ARCANE = 1) - materials = list(MAT_PLASTEEL = 3500, "glass" = 1000, MAT_LEAD = 2250, MAT_METALHYDROGEN = 500) - build_path = /obj/item/weapon/melee/energy/sword/charge - sort_string = "VASCA" diff --git a/code/modules/research/designs/implants.dm b/code/modules/research/designs/implants.dm new file mode 100644 index 00000000000..4c4b5ba8016 --- /dev/null +++ b/code/modules/research/designs/implants.dm @@ -0,0 +1,22 @@ +// Implants + +/datum/design/item/implant + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + +/datum/design/item/implant/AssembleDesignName() + ..() + name = "Implantable biocircuit design ([item_name])" + +/datum/design/item/implant/chemical + name = "chemical" + id = "implant_chem" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3) + build_path = /obj/item/weapon/implantcase/chem + sort_string = "MFAAA" + +/datum/design/item/implant/freedom + name = "freedom" + id = "implant_free" + req_tech = list(TECH_ILLEGAL = 2, TECH_BIO = 3) + build_path = /obj/item/weapon/implantcase/freedom + sort_string = "MFAAB" \ No newline at end of file diff --git a/code/modules/research/designs/implants_vr.dm b/code/modules/research/designs/implants_vr.dm new file mode 100644 index 00000000000..07b4a37f05b --- /dev/null +++ b/code/modules/research/designs/implants_vr.dm @@ -0,0 +1,25 @@ +/datum/design/item/implant/backup + name = "Backup implant" + id = "implant_backup" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2, TECH_DATA = 4, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000) + build_path = /obj/item/weapon/implantcase/backup + sort_string = "MFAVA" + +/datum/design/item/implant/sizecontrol + name = "Size control implant" + id = "implant_size" + req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_DATA = 4, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000, "silver" = 3000) + build_path = /obj/item/weapon/implanter/sizecontrol + sort_string = "MFAVB" + +/* Make language great again +/datum/design/item/implant/language + name = "Language implant" + id = "implant_language" + req_tech = list(TECH_MATERIAL = 5, TECH_BIO = 5, TECH_DATA = 4, TECH_ENGINEERING = 4) //This is not an easy to make implant. + materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000, "gold" = 2000, "diamond" = 3000) + build_path = /obj/item/weapon/implantcase/vrlanguage + sort_string = "MFAVC" +*/ \ No newline at end of file diff --git a/code/modules/research/designs/locator_devices.dm b/code/modules/research/designs/locator_devices.dm new file mode 100644 index 00000000000..b6f149393c8 --- /dev/null +++ b/code/modules/research/designs/locator_devices.dm @@ -0,0 +1,80 @@ +// GPS + +/datum/design/item/gps + req_tech = list(TECH_MATERIAL = 2, TECH_DATA = 2, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500) + +/datum/design/item/gps/AssembleDesignName() + ..() + name = "Triangulating device design ([name])" + +/datum/design/item/gps/generic + name = "GEN" + id = "gps_gen" + build_path = /obj/item/device/gps + sort_string = "DAAAA" + +/datum/design/item/gps/command + name = "COM" + id = "gps_com" + build_path = /obj/item/device/gps/command + sort_string = "DAAAB" + +/datum/design/item/gps/security + name = "SEC" + id = "gps_sec" + build_path = /obj/item/device/gps/security + sort_string = "DAAAC" + +/datum/design/item/gps/medical + name = "MED" + id = "gps_med" + build_path = /obj/item/device/gps/medical + sort_string = "DAAAD" + +/datum/design/item/gps/engineering + name = "ENG" + id = "gps_eng" + build_path = /obj/item/device/gps/engineering + sort_string = "DAAAE" + +/datum/design/item/gps/science + name = "SCI" + id = "gps_sci" + build_path = /obj/item/device/gps/science + sort_string = "DAAAF" + +/datum/design/item/gps/mining + name = "MINE" + id = "gps_mine" + build_path = /obj/item/device/gps/mining + sort_string = "DAAAG" + +/datum/design/item/gps/explorer + name = "EXP" + id = "gps_exp" + build_path = /obj/item/device/gps/explorer + sort_string = "DAAAH" + +// Other locators + +/datum/design/item/locator/AssembleDesignName() + ..() + name = "Locator device design ([name])" + +/datum/design/item/locator/beacon_locator + name = "Tracking beacon pinpointer" + desc = "Used to scan and locate signals on a particular frequency." + id = "beacon_locator" + req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3) + materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 500) + build_path = /obj/item/device/beacon_locator + sort_string = "DBAAA" + +/datum/design/item/locator/beacon + name = "Bluespace tracking beacon" + id = "beacon" + req_tech = list(TECH_BLUESPACE = 1) + materials = list (DEFAULT_WALL_MATERIAL = 20, "glass" = 10) + build_path = /obj/item/device/radio/beacon + sort_string = "DBABA" \ No newline at end of file diff --git a/code/modules/research/designs/medical.dm b/code/modules/research/designs/medical.dm index 8e821fe0fe9..7fcc4ab1f65 100644 --- a/code/modules/research/designs/medical.dm +++ b/code/modules/research/designs/medical.dm @@ -3,72 +3,9 @@ /datum/design/item/medical/AssembleDesignName() ..() - name = "Biotech device prototype ([item_name])" + name = "Medical equipment prototype ([item_name])" -/datum/design/item/medical/robot_scanner - desc = "A hand-held scanner able to diagnose robotic injuries." - id = "robot_scanner" - req_tech = list(TECH_MAGNET = 3, TECH_BIO = 2, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200) - build_path = /obj/item/device/robotanalyzer - sort_string = "MACFA" - -/datum/design/item/medical/mass_spectrometer - desc = "A device for analyzing chemicals in blood." - id = "mass_spectrometer" - req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2) - build_path = /obj/item/device/mass_spectrometer - sort_string = "MACAA" - -/datum/design/item/medical/adv_mass_spectrometer - desc = "A device for analyzing chemicals in blood and their quantities." - id = "adv_mass_spectrometer" - req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4) - build_path = /obj/item/device/mass_spectrometer/adv - sort_string = "MACAB" - -/datum/design/item/medical/reagent_scanner - desc = "A device for identifying chemicals." - id = "reagent_scanner" - req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2) - build_path = /obj/item/device/reagent_scanner - sort_string = "MACBA" - -/datum/design/item/medical/adv_reagent_scanner - desc = "A device for identifying chemicals and their proportions." - id = "adv_reagent_scanner" - req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4) - build_path = /obj/item/device/reagent_scanner/adv - sort_string = "MACBB" - -/datum/design/item/beaker/AssembleDesignName() - name = "Beaker prototype ([item_name])" - -/datum/design/item/beaker/noreact - name = "cryostasis" - desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units." - id = "splitbeaker" - req_tech = list(TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 3000) - build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact - sort_string = "MADAA" - -/datum/design/item/beaker/bluespace - name = TECH_BLUESPACE - desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." - id = "bluespacebeaker" - req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 6) - materials = list(DEFAULT_WALL_MATERIAL = 3000, "phoron" = 3000, "diamond" = 500) - build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace - sort_string = "MADAB" - -/datum/design/item/medical/nanopaste - desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery." - id = "nanopaste" - req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000) - build_path = /obj/item/stack/nanopaste - sort_string = "MBAAA" +// Surgical devices /datum/design/item/medical/scalpel_laser1 name = "Basic Laser Scalpel" @@ -77,7 +14,7 @@ req_tech = list(TECH_BIO = 2, TECH_MATERIAL = 2, TECH_MAGNET = 2) materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500) build_path = /obj/item/weapon/surgical/scalpel/laser1 - sort_string = "MBBAA" + sort_string = "KAAAA" /datum/design/item/medical/scalpel_laser2 name = "Improved Laser Scalpel" @@ -86,7 +23,7 @@ req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 4, TECH_MAGNET = 4) materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500) build_path = /obj/item/weapon/surgical/scalpel/laser2 - sort_string = "MBBAB" + sort_string = "KAAAB" /datum/design/item/medical/scalpel_laser3 name = "Advanced Laser Scalpel" @@ -95,7 +32,7 @@ req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 5) materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2000, "gold" = 1500) build_path = /obj/item/weapon/surgical/scalpel/laser3 - sort_string = "MBBAC" + sort_string = "KAAAC" /datum/design/item/medical/scalpel_manager name = "Incision Management System" @@ -104,7 +41,25 @@ req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 7, TECH_MAGNET = 5, TECH_DATA = 4) materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 1500, "gold" = 1500, "diamond" = 750) build_path = /obj/item/weapon/surgical/scalpel/manager - sort_string = "MBBAD" + sort_string = "KAAAD" + +/datum/design/item/medical/saw_manager + name = "Energetic Bone Diverter" + desc = "A strange development following the I.M.S., this heavy tool can split and open, or close and shut, intentional holes in bones." + id = "advanced_saw" + req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_DATA = 5) + materials = list (DEFAULT_WALL_MATERIAL = 12500, MAT_PLASTIC = 800, "silver" = 1500, "gold" = 1500, MAT_OSMIUM = 1000) + build_path = /obj/item/weapon/surgical/circular_saw/manager + sort_string = "KAAAE" + +/datum/design/item/medical/organ_ripper + name = "Organ Ripper" + desc = "A modern and horrifying take on an ancient practice, this tool is capable of rapidly removing an organ from a hopefully willing patient, without damaging it." + id = "organ_ripper" + req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 5, TECH_MAGNET = 4, TECH_ILLEGAL = 3) + materials = list (DEFAULT_WALL_MATERIAL = 12500, MAT_PLASTIC = 8000, MAT_OSMIUM = 2500) + build_path = /obj/item/weapon/surgical/scalpel/ripper + sort_string = "KAAAF" /datum/design/item/medical/bone_clamp name = "Bone Clamp" @@ -113,16 +68,16 @@ req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 5, TECH_MAGNET = 4, TECH_DATA = 4) materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500) build_path = /obj/item/weapon/surgical/bone_clamp - sort_string = "MBBAE" + sort_string = "KAABA" -/datum/design/item/medical/advanced_roller - name = "advanced roller bed" - desc = "A more advanced version of the regular roller bed, with inbuilt surgical stabilisers and an improved folding system." - id = "roller_bed" - req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 3, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "phoron" = 2000) - build_path = /obj/item/roller/adv - sort_string = "MBBAF" +/datum/design/item/medical/medical_analyzer + name = "health analyzer" + desc = "A hand-held body scanner able to distinguish vital signs of the subject." + id = "medical_analyzer" + req_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) + build_path = /obj/item/device/healthanalyzer + sort_string = "KBAAA" /datum/design/item/medical/improved_analyzer name = "improved health analyzer" @@ -131,56 +86,13 @@ req_tech = list(TECH_MAGNET = 5, TECH_BIO = 6) materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 1500) build_path = /obj/item/device/healthanalyzer/improved - sort_string = "MBBAG" + sort_string = "KBAAB" -/datum/design/item/implant - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) - -/datum/design/item/implant/AssembleDesignName() - ..() - name = "Implantable biocircuit design ([item_name])" - -/datum/design/item/implant/chemical - name = "chemical" - id = "implant_chem" - req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3) - build_path = /obj/item/weapon/implantcase/chem - sort_string = "MFAAA" - -/datum/design/item/implant/freedom - name = "freedom" - id = "implant_free" - req_tech = list(TECH_ILLEGAL = 2, TECH_BIO = 3) - build_path = /obj/item/weapon/implantcase/freedom - sort_string = "MFAAB" - -// These are in here because Robotics is close enough to Medical and I don't want to make a new brains.dm file -/datum/design/item/dronebrain - name = "Robotic intelligence circuit" - id = "dronebrain" - req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_DATA = 4) - build_type = PROTOLATHE | PROSFAB - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500) - build_path = /obj/item/device/mmi/digital/robot - category = "Misc" - sort_string = "VACAC" - -/datum/design/item/posibrain - name = "Positronic brain" - id = "posibrain" - req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4) - build_type = PROTOLATHE | PROSFAB - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100) - build_path = /obj/item/device/mmi/digital/posibrain - category = "Misc" - sort_string = "VACAB" - -/datum/design/item/mmi - name = "Man-machine interface" - id = "mmi" - req_tech = list(TECH_DATA = 2, TECH_BIO = 3) - build_type = PROTOLATHE | PROSFAB - materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500) - build_path = /obj/item/device/mmi - category = "Misc" - sort_string = "VACBA" \ No newline at end of file +/datum/design/item/medical/advanced_roller + name = "advanced roller bed" + desc = "A more advanced version of the regular roller bed, with inbuilt surgical stabilisers and an improved folding system." + id = "roller_bed" + req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 3, TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "phoron" = 2000) + build_path = /obj/item/roller/adv + sort_string = "KCAAA" \ No newline at end of file diff --git a/code/modules/research/designs/medical_vr.dm b/code/modules/research/designs/medical_vr.dm new file mode 100644 index 00000000000..7a0b0aa5375 --- /dev/null +++ b/code/modules/research/designs/medical_vr.dm @@ -0,0 +1,244 @@ +/* + KV - ML3M stuff + KVA - gun + KVB - magazines + KVC - cells + KVCA - tier 0 + KVCB - tier 1 + KVCC - tier 2 + KVCD - tier 3 + KVCE - tier 4 + KVCO - tierless +*/ + +//General stuff + +/datum/design/item/medical/sleevemate + name = "SleeveMate 3700" + id = "sleevemate" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/device/sleevemate + sort_string = "KCAVA" + +/datum/design/item/medical/protohypospray + name = "prototype hypospray" + desc = "This prototype hypospray is a sterile, air-needle autoinjector for rapid administration of drugs to patients." + id = "protohypospray" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_POWER = 2, TECH_BIO = 4, TECH_ILLEGAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 1500, "silver" = 2000, "gold" = 1500, "uranium" = 1000) + build_path = /obj/item/weapon/reagent_containers/hypospray/science + sort_string = "KCAVB" + +// ML-3M medigun and cells +/datum/design/item/medical/cell_based/AssembleDesignName() + ..() + name = "Cell-based medical prototype ([item_name])" + +/datum/design/item/medical/cell_based/cell_medigun + name = "cell-loaded medigun" + id = "cell_medigun" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 4, TECH_POWER = 3, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "plastic" = 8000, "glass" = 5000, "silver" = 1000, "gold" = 1000, "uranium" = 1000) + build_path = /obj/item/weapon/gun/projectile/cell_loaded/medical + sort_string = "KVAAA" + +/datum/design/item/medical/cell_based/cell_medigun_mag + name = "medical cell magazine" + id = "cell_medigun_mag" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 4, TECH_POWER = 3, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "plastic" = 6000, "glass" = 3000, "silver" = 500, "gold" = 500) + build_path = /obj/item/ammo_magazine/cell_mag/medical + sort_string = "KVBAA" + +/datum/design/item/medical/cell_based/cell_medigun_mag_advanced + name = "advanced medical cell magazine" + id = "cell_medigun_mag_advanced" + req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 4, TECH_BIO = 7) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "plastic" = 10000, "glass" = 5000, "silver" = 1500, "gold" = 1500, "diamond" = 5000) + build_path = /obj/item/ammo_magazine/cell_mag/medical/advanced + sort_string = "KVBAB" + +/datum/design/item/ml3m_cell/AssembleDesignName() + ..() + name = "Nanite cell prototype ([name])" + +//Tier 0 + +/datum/design/item/ml3m_cell/brute + name = "BRUTE" + id = "ml3m_cell_brute" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + build_path = /obj/item/ammo_casing/microbattery/medical/brute + sort_string = "KVCAA" + +/datum/design/item/ml3m_cell/burn + name = "BURN" + id = "ml3m_cell_burn" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + build_path = /obj/item/ammo_casing/microbattery/medical/burn + sort_string = "KVCAB" + +/datum/design/item/ml3m_cell/stabilize + name = "STABILIZE" + id = "ml3m_cell_stabilize" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + build_path = /obj/item/ammo_casing/microbattery/medical/stabilize + sort_string = "KVCAC" + +//Tier 1 + +/datum/design/item/ml3m_cell/toxin + name = "TOXIN" + id = "ml3m_cell_toxin" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_BIO = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500) + build_path = /obj/item/ammo_casing/microbattery/medical/toxin + sort_string = "KVCBA" + +/datum/design/item/ml3m_cell/omni + name = "OMNI" + id = "ml3m_cell_omni" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_BIO = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500) + build_path = /obj/item/ammo_casing/microbattery/medical/omni + sort_string = "KVCBB" + +/datum/design/item/ml3m_cell/antirad + name = "ANTIRAD" + id = "ml3m_cell_antirad" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_BIO = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500) + build_path = /obj/item/ammo_casing/microbattery/medical/antirad + sort_string = "KVCBC" + +//Tier 2 + +/datum/design/item/ml3m_cell/brute2 + name = "BRUTE-II" + id = "ml3m_cell_brute2" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/brute2 + sort_string = "KVCCA" + +/datum/design/item/ml3m_cell/burn2 + name = "BURN-II" + id = "ml3m_cell_burn2" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/burn2 + sort_string = "KVCCB" + +/datum/design/item/ml3m_cell/stabilize2 + name = "STABILIZE-II" + id = "ml3m_cell_stabilize2" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "silver" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/stabilize2 + sort_string = "KVCCC" + +/datum/design/item/ml3m_cell/omni2 + name = "OMNI-II" + id = "ml3m_cell_omni2" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/omni2 + sort_string = "KVCCD" + +//Tier 3 + +/datum/design/item/ml3m_cell/toxin2 + name = "TOXIN-II" + id = "ml3m_cell_toxin2" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 1000, "silver" = 1000, "diamond" = 500) + build_path = /obj/item/ammo_casing/microbattery/medical/toxin2 + sort_string = "KVCDA" + +/datum/design/item/ml3m_cell/haste + name = "HASTE" + id = "ml3m_cell_haste" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000, "silver" = 1000, "diamond" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/haste + sort_string = "KVCDB" + +/datum/design/item/ml3m_cell/resist + name = "RESIST" + id = "ml3m_cell_resist" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000, "uranium" = 1000, "diamond" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/resist + sort_string = "KVCDC" + +/datum/design/item/ml3m_cell/corpse_mend + name = "CORPSE MEND" + id = "ml3m_cell_corpse_mend" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "phoron" = 3000, "diamond" = 3000) + build_path = /obj/item/ammo_casing/microbattery/medical/corpse_mend + sort_string = "KVCDD" + +//Tier 4 + +/datum/design/item/ml3m_cell/brute3 + name = "BRUTE-III" + id = "ml3m_cell_brute3" + req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_PRECURSOR = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/brute3 + sort_string = "KVCEA" + +/datum/design/item/ml3m_cell/burn3 + name = "BURN-III" + id = "ml3m_cell_burn3" + req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_PRECURSOR = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/burn3 + sort_string = "KVCEB" + +/datum/design/item/ml3m_cell/toxin3 + name = "TOXIN-III" + id = "ml3m_cell_toxin3" + req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_ARCANE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/toxin3 + sort_string = "KVCEC" + +/datum/design/item/ml3m_cell/omni3 + name = "OMNI-III" + id = "ml3m_cell_omni3" + req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_ARCANE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/omni3 + sort_string = "KVCED" + +//Tierless + +/datum/design/item/ml3m_cell/shrink + name = "SHRINK" + id = "ml3m_cell_shrink" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_BLUESPACE = 3, TECH_BIO = 5, TECH_ILLEGAL = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 2000) + build_path = /obj/item/ammo_casing/microbattery/medical/shrink + sort_string = "KVCOA" + +/datum/design/item/ml3m_cell/grow + name = "GROW" + id = "ml3m_cell_grow" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_BLUESPACE = 3, TECH_BIO = 5, TECH_ILLEGAL = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 2000) + build_path = /obj/item/ammo_casing/microbattery/medical/grow + sort_string = "KVCOB" + +/datum/design/item/ml3m_cell/normalsize + name = "NORMALSIZE" + id = "ml3m_cell_normalsize" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_BLUESPACE = 3, TECH_BIO = 5, TECH_ILLEGAL = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 2000) + build_path = /obj/item/ammo_casing/microbattery/medical/normalsize + sort_string = "KVCOC" \ No newline at end of file diff --git a/code/modules/research/designs/mining_toys.dm b/code/modules/research/designs/mining_toys.dm index f9b76032cbd..61be9cd8712 100644 --- a/code/modules/research/designs/mining_toys.dm +++ b/code/modules/research/designs/mining_toys.dm @@ -1,48 +1,50 @@ -// Assorted Mining-related items - /datum/design/item/weapon/mining/AssembleDesignName() ..() name = "Mining equipment design ([item_name])" -/datum/design/item/weapon/mining/jackhammer - id = "jackhammer" - req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "silver" = 500) - build_path = /obj/item/weapon/pickaxe/jackhammer - sort_string = "KAAAA" +// Mining digging devices /datum/design/item/weapon/mining/drill id = "drill" req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1000) //expensive, but no need for miners. build_path = /obj/item/weapon/pickaxe/drill - sort_string = "KAAAB" + sort_string = "FAAAA" + +/datum/design/item/weapon/mining/jackhammer + id = "jackhammer" + req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "silver" = 500) + build_path = /obj/item/weapon/pickaxe/jackhammer + sort_string = "FAAAB" /datum/design/item/weapon/mining/plasmacutter id = "plasmacutter" req_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3) materials = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 500, "gold" = 500, "phoron" = 500) build_path = /obj/item/weapon/pickaxe/plasmacutter - sort_string = "KAAAC" + sort_string = "FAAAC" /datum/design/item/weapon/mining/pick_diamond id = "pick_diamond" req_tech = list(TECH_MATERIAL = 6) materials = list("diamond" = 3000) build_path = /obj/item/weapon/pickaxe/diamond - sort_string = "KAAAD" + sort_string = "FAAAD" /datum/design/item/weapon/mining/drill_diamond id = "drill_diamond" req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 4) materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 1000, "diamond" = 2000) build_path = /obj/item/weapon/pickaxe/diamonddrill - sort_string = "KAAAE" + sort_string = "FAAAE" -/datum/design/item/device/depth_scanner +// Mining other equipment + +/datum/design/item/weapon/mining/depth_scanner desc = "Used to check spatial depth and density of rock outcroppings." id = "depth_scanner" req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 2) materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 1000) build_path = /obj/item/device/depth_scanner - sort_string = "KAAAF" \ No newline at end of file + sort_string = "FBAAA" diff --git a/code/modules/research/designs/misc.dm b/code/modules/research/designs/misc.dm index f14b73d2e68..8faf037136f 100644 --- a/code/modules/research/designs/misc.dm +++ b/code/modules/research/designs/misc.dm @@ -1,251 +1,65 @@ -/* -// -// THIS IS GOING TO GET REAL DAMN BLOATED, SO LET'S TRY TO AVOID THAT IF POSSIBLE -// -*/ +// Everything that didn't fit elsewhere -/datum/design/item/hud - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) - -/datum/design/item/hud/AssembleDesignName() +/datum/design/item/general/AssembleDesignName() ..() - name = "HUD glasses prototype ([item_name])" + name = "General purpose design ([item_name])" -/datum/design/item/hud/AssembleDesignDesc() - desc = "Allows for the construction of \a [item_name] HUD glasses." +/datum/design/item/general/communicator + name = "Communicator" + id = "communicator" + req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) + build_path = /obj/item/device/communicator + sort_string = "TAAAA" -/datum/design/item/hud/health - name = "health scanner" - id = "health_hud" - req_tech = list(TECH_BIO = 2, TECH_MAGNET = 3) - build_path = /obj/item/clothing/glasses/hud/health - sort_string = "GBAAA" - -/datum/design/item/hud/security - name = "security records" - id = "security_hud" - req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2) - build_path = /obj/item/clothing/glasses/hud/security - sort_string = "GBAAB" - -/datum/design/item/hud/mesons - name = "optical meson scanner" - id = "mesons" - req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) - build_path = /obj/item/clothing/glasses/meson - sort_string = "GBAAC" - -/datum/design/item/hud/material - name = "optical material scanner" - id = "material" - req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3) - build_path = /obj/item/clothing/glasses/material - sort_string = "GBAAD" - -/datum/design/item/device/ano_scanner - name = "Alden-Saraspova counter" - id = "ano_scanner" - desc = "Aids in triangulation of exotic particles." - req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000) - build_path = /obj/item/device/ano_scanner - sort_string = "UAAAH" - -/datum/design/item/light_replacer - name = "Light replacer" - desc = "A device to automatically replace lights. Refill with working lightbulbs." - id = "light_replacer" - req_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 4) - materials = list(DEFAULT_WALL_MATERIAL = 1500, "silver" = 150, "glass" = 3000) - build_path = /obj/item/device/lightreplacer - sort_string = "VAAAH" - -datum/design/item/laserpointer +datum/design/item/general/laserpointer name = "laser pointer" desc = "Don't shine it in your eyes!" id = "laser_pointer" req_tech = list(TECH_MAGNET = 3) materials = list(DEFAULT_WALL_MATERIAL = 100, "glass" = 50) build_path = /obj/item/device/laser_pointer - sort_string = "VAAAI" + sort_string = "TAABA" -/datum/design/item/paicard - name = "'pAI', personal artificial intelligence device" - id = "paicard" - req_tech = list(TECH_DATA = 2) - materials = list("glass" = 500, DEFAULT_WALL_MATERIAL = 500) - build_path = /obj/item/device/paicard - sort_string = "VABAI" - -/datum/design/item/communicator - name = "Communicator" - id = "communicator" - req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) - build_path = /obj/item/device/communicator - sort_string = "VABAJ" - -/datum/design/item/gps - req_tech = list(TECH_MATERIAL = 2, TECH_DATA = 2, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500) - -/datum/design/item/gps/generic - name = "Triangulating device design (GEN)" - id = "gps_gen" - build_path = /obj/item/device/gps - sort_string = "VADAA" - -/datum/design/item/gps/comand - name = "Triangulating device design (COM)" - id = "gps_com" - build_path = /obj/item/device/gps/command - sort_string = "VADAB" - -/datum/design/item/gps/security - name = "Triangulating device design (SEC)" - id = "gps_sec" - build_path = /obj/item/device/gps/security - sort_string = "VADAC" - -/datum/design/item/gps/medical - name = "Triangulating device design (MED)" - id = "gps_med" - build_path = /obj/item/device/gps/medical - sort_string = "VADAD" - -/datum/design/item/gps/engineering - name = "Triangulating device design (ENG)" - id = "gps_eng" - build_path = /obj/item/device/gps/engineering - sort_string = "VADAE" - -/datum/design/item/gps/science - name = "Triangulating device design (SCI)" - id = "gps_sci" - build_path = /obj/item/device/gps/science - sort_string = "VADAF" - -/datum/design/item/gps/mining - name = "Triangulating device design (MINE)" - id = "gps_mine" - build_path = /obj/item/device/gps/mining - sort_string = "VADAG" - -/datum/design/item/gps/explorer - name = "Triangulating device design (EXP)" - id = "gps_exp" - build_path = /obj/item/device/gps/explorer - sort_string = "VADAH" - -/datum/design/item/beacon - name = "Bluespace tracking beacon design" - id = "beacon" - req_tech = list(TECH_BLUESPACE = 1) - materials = list (DEFAULT_WALL_MATERIAL = 20, "glass" = 10) - build_path = /obj/item/device/radio/beacon - sort_string = "VADBA" - -/datum/design/item/beacon_locator - name = "Beacon tracking pinpointer" - desc = "Used to scan and locate signals on a particular frequency." - id = "beacon_locator" - req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3) - materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 500) - build_path = /obj/item/device/beacon_locator - sort_string = "VADBB" - -/datum/design/item/bag_holding - name = "'Bag of Holding', an infinite capacity bag prototype" - desc = "Using localized pockets of bluespace this bag prototype offers incredible storage capacity with the contents weighting nothing. It's a shame the bag itself is pretty heavy." - id = "bag_holding" - req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6) - materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250) - build_path = /obj/item/weapon/storage/backpack/holding - sort_string = "VAEAA" - -/datum/design/item/dufflebag_holding - name = "'DuffleBag of Holding', an infinite capacity dufflebag prototype" - desc = "A minaturized prototype of the popular Bag of Holding, the Dufflebag of Holding is, functionally, identical to the bag of holding, but comes in a more stylish and compact form." - id = "dufflebag_holding" - req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6) - materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250) - build_path = /obj/item/weapon/storage/backpack/holding/duffle - sort_string = "VAEAB" - -/datum/design/item/experimental_welder - name = "Experimental welding tool" - desc = "A welding tool that generate fuel for itself." - id = "expwelder" - req_tech = list(TECH_ENGINEERING = 4, TECH_PHORON = 3, TECH_MATERIAL = 4) - materials = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120, "phoron" = 100) - build_path = /obj/item/weapon/weldingtool/experimental - sort_string = "VASCA" - -/datum/design/item/hand_drill - name = "Hand drill" - desc = "A simple powered hand drill." - id = "handdrill" - req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100) - build_path = /obj/item/weapon/tool/screwdriver/power - sort_string = "VASDA" - -/datum/design/item/jaws_life - name = "Jaws of life" - desc = "A set of jaws of life, compressed through the magic of science." - id = "jawslife" - req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100) - build_path = /obj/item/weapon/tool/crowbar/power - sort_string = "VASEA" - -/datum/design/item/device/t_scanner_upg - name = "Upgraded T-ray Scanner" - desc = "An upgraded version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." - id = "upgradedtscanner" - req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 4, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500, "phoron" = 150) - build_path = /obj/item/device/t_scanner/upgraded - sort_string = "VASSA" - -/datum/design/item/device/t_scanner_adv - name = "Advanced T-ray Scanner" - desc = "An advanced version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." - id = "advancedtscanner" - req_tech = list(TECH_MAGNET = 6, TECH_ENGINEERING = 6, TECH_MATERIAL = 6) - materials = list(DEFAULT_WALL_MATERIAL = 1250, "phoron" = 500, "silver" = 50) - build_path = /obj/item/device/t_scanner/advanced - sort_string = "VASSB" - -/datum/design/item/translator +/datum/design/item/general/translator name = "handheld translator" id = "translator" req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000) build_path = /obj/item/device/universal_translator - sort_string = "HABQA" + sort_string = "TAACA" -/datum/design/item/ear_translator +/datum/design/item/general/ear_translator name = "earpiece translator" id = "ear_translator" req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5) //It's been hella miniaturized. materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000, "gold" = 1000) build_path = /obj/item/device/universal_translator/ear - sort_string = "HABQB" + sort_string = "TAACB" -/datum/design/item/xenoarch_multi_tool - name = "xenoarcheology multitool" - id = "xenoarch_multitool" - req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3) - build_path = /obj/item/device/xenoarch_multi_tool - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500, "phoron" = 500) - sort_string = "HABQC" +/datum/design/item/general/light_replacer + name = "Light replacer" + desc = "A device to automatically replace lights. Refill with working lightbulbs." + id = "light_replacer" + req_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 4) + materials = list(DEFAULT_WALL_MATERIAL = 1500, "silver" = 150, "glass" = 3000) + build_path = /obj/item/device/lightreplacer + sort_string = "TAADA" -/datum/design/item/excavationdrill - name = "Excavation Drill" - id = "excavationdrill" - req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3) - build_type = PROTOLATHE - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) - build_path = /obj/item/weapon/pickaxe/excavationdrill - sort_string = "HABQD" +/datum/design/item/general/binaryencrypt + name = "Binary encryption key" + desc = "Allows for deciphering the binary channel on-the-fly." + id = "binaryencrypt" + req_tech = list(TECH_ILLEGAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 300, "glass" = 300) + build_path = /obj/item/device/encryptionkey/binary + sort_string = "TBAAA" + +/datum/design/item/general/chameleon + name = "Holographic equipment kit" + desc = "A kit of dangerous, high-tech equipment with changeable looks." + id = "chameleon" + req_tech = list(TECH_ILLEGAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500) + build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon + sort_string = "TBAAB" diff --git a/code/modules/research/designs/misc_vr.dm b/code/modules/research/designs/misc_vr.dm new file mode 100644 index 00000000000..2b397185c36 --- /dev/null +++ b/code/modules/research/designs/misc_vr.dm @@ -0,0 +1,23 @@ +/datum/design/item/general/bluespace_jumpsuit + name = "Bluespace jumpsuit" + id = "bsjumpsuit" + req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 3, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/clothing/under/bluespace + sort_string = "TAVAA" + +/datum/design/item/general/sizegun + name = "Size gun" + id = "sizegun" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000, "uranium" = 2000) + build_path = /obj/item/weapon/gun/energy/sizegun + sort_string = "TAVAB" + +/datum/design/item/general/bodysnatcher + name = "Body Snatcher" + id = "bodysnatcher" + req_tech = list(TECH_MAGNET = 3, TECH_BIO = 3, TECH_ILLEGAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/device/bodysnatcher + sort_string = "TBVAA" \ No newline at end of file diff --git a/code/modules/research/designs/modular_computer.dm b/code/modules/research/designs/modular_computer.dm index 5bb19b0be66..e78a776c1c8 100644 --- a/code/modules/research/designs/modular_computer.dm +++ b/code/modules/research/designs/modular_computer.dm @@ -1,233 +1,219 @@ // Modular computer components +/datum/design/item/modularcomponent/AssembleDesignName() + ..() + name = "Computer part design ([item_name])" + // Hard drives + /datum/design/item/modularcomponent/disk/normal name = "basic hard drive" id = "hdd_basic" req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 100) build_path = /obj/item/weapon/computer_hardware/hard_drive/ - sort_string = "VBAAA" + sort_string = "VAAAA" /datum/design/item/modularcomponent/disk/advanced name = "advanced hard drive" id = "hdd_advanced" - req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 200) build_path = /obj/item/weapon/computer_hardware/hard_drive/advanced - sort_string = "VBAAB" + sort_string = "VAAAB" /datum/design/item/modularcomponent/disk/super name = "super hard drive" id = "hdd_super" req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 8000, "glass" = 400) build_path = /obj/item/weapon/computer_hardware/hard_drive/super - sort_string = "VBAAC" + sort_string = "VAAAC" /datum/design/item/modularcomponent/disk/cluster name = "cluster hard drive" id = "hdd_cluster" req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 16000, "glass" = 800) build_path = /obj/item/weapon/computer_hardware/hard_drive/cluster - sort_string = "VBAAD" + sort_string = "VAAAD" /datum/design/item/modularcomponent/disk/small name = "small hard drive" id = "hdd_small" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 200) build_path = /obj/item/weapon/computer_hardware/hard_drive/small - sort_string = "VBAAE" + sort_string = "VAAAE" /datum/design/item/modularcomponent/disk/micro name = "micro hard drive" id = "hdd_micro" req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 100) build_path = /obj/item/weapon/computer_hardware/hard_drive/micro - sort_string = "VBAAF" + sort_string = "VAAAF" // Network cards + /datum/design/item/modularcomponent/netcard/basic name = "basic network card" id = "netcard_basic" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 1) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 100) build_path = /obj/item/weapon/computer_hardware/network_card - sort_string = "VBAAG" + sort_string = "VBAAA" /datum/design/item/modularcomponent/netcard/advanced name = "advanced network card" id = "netcard_advanced" req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 2) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200) build_path = /obj/item/weapon/computer_hardware/network_card/advanced - sort_string = "VBAAH" + sort_string = "VBAAB" /datum/design/item/modularcomponent/netcard/wired name = "wired network card" id = "netcard_wired" req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 3) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 400) build_path = /obj/item/weapon/computer_hardware/network_card/wired - sort_string = "VBAAI" - -// Data crystals (USB flash drives) -/datum/design/item/modularcomponent/portabledrive/basic - name = "basic data crystal" - id = "portadrive_basic" - req_tech = list(TECH_DATA = 1) - build_type = IMPRINTER - materials = list("glass" = 8000) - build_path = /obj/item/weapon/computer_hardware/hard_drive/portable - sort_string = "VBAAJ" - -/datum/design/item/modularcomponent/portabledrive/advanced - name = "advanced data crystal" - id = "portadrive_advanced" - req_tech = list(TECH_DATA = 2) - build_type = IMPRINTER - materials = list("glass" = 16000) - build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/advanced - sort_string = "VBAAK" - -/datum/design/item/modularcomponent/portabledrive/super - name = "super data crystal" - id = "portadrive_super" - req_tech = list(TECH_DATA = 4) - build_type = IMPRINTER - materials = list("glass" = 32000) - build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/super - sort_string = "VBAAL" - -// Card slot -/datum/design/item/modularcomponent/cardslot - name = "RFID card slot" - id = "cardslot" - req_tech = list(TECH_DATA = 2) - build_type = PROTOLATHE - materials = list(DEFAULT_WALL_MATERIAL = 3000) - build_path = /obj/item/weapon/computer_hardware/card_slot - sort_string = "VBAAM" - -// Nano printer -/datum/design/item/modularcomponent/nanoprinter - name = "nano printer" - id = "nanoprinter" - req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) - build_type = PROTOLATHE - materials = list(DEFAULT_WALL_MATERIAL = 3000) - build_path = /obj/item/weapon/computer_hardware/nano_printer - sort_string = "VBAAN" - -// Tesla Link -/datum/design/item/modularcomponent/teslalink - name = "tesla link" - id = "teslalink" - req_tech = list(TECH_DATA = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) - build_type = PROTOLATHE - materials = list(DEFAULT_WALL_MATERIAL = 10000) - build_path = /obj/item/weapon/computer_hardware/tesla_link - sort_string = "VBAAO" + sort_string = "VBAAC" // Batteries + /datum/design/item/modularcomponent/battery/normal name = "standard battery module" id = "bat_normal" req_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 2000) build_path = /obj/item/weapon/computer_hardware/battery_module - sort_string = "VBAAP" + sort_string = "VCAAA" /datum/design/item/modularcomponent/battery/advanced name = "advanced battery module" id = "bat_advanced" req_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 4000) build_path = /obj/item/weapon/computer_hardware/battery_module/advanced - sort_string = "VBAAQ" + sort_string = "VCAAB" /datum/design/item/modularcomponent/battery/super name = "super battery module" id = "bat_super" req_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 8000) build_path = /obj/item/weapon/computer_hardware/battery_module/super - sort_string = "VBAAR" + sort_string = "VCAAC" /datum/design/item/modularcomponent/battery/ultra name = "ultra battery module" id = "bat_ultra" req_tech = list(TECH_POWER = 5, TECH_ENGINEERING = 4) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 16000) build_path = /obj/item/weapon/computer_hardware/battery_module/ultra - sort_string = "VBAAS" + sort_string = "VCAAD" /datum/design/item/modularcomponent/battery/nano name = "nano battery module" id = "bat_nano" req_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 2000) build_path = /obj/item/weapon/computer_hardware/battery_module/nano - sort_string = "VBAAT" + sort_string = "VCAAE" /datum/design/item/modularcomponent/battery/micro name = "micro battery module" id = "bat_micro" req_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 4000) build_path = /obj/item/weapon/computer_hardware/battery_module/micro - sort_string = "VBAAU" + sort_string = "VCAAF" // Processor unit + /datum/design/item/modularcomponent/cpu/ name = "computer processor unit" id = "cpu_normal" req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 8000) build_path = /obj/item/weapon/computer_hardware/processor_unit - sort_string = "VBAAV" + sort_string = "VDAAA" /datum/design/item/modularcomponent/cpu/small name = "computer microprocessor unit" id = "cpu_small" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 4000) build_path = /obj/item/weapon/computer_hardware/processor_unit/small - sort_string = "VBAAW" + sort_string = "VDAAB" /datum/design/item/modularcomponent/cpu/photonic name = "computer photonic processor unit" id = "pcpu_normal" req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 4) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 32000, glass = 8000) build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic - sort_string = "VBAAX" + sort_string = "VDAAC" /datum/design/item/modularcomponent/cpu/photonic/small name = "computer photonic microprocessor unit" id = "pcpu_small" req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 16000, glass = 4000) build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic/small - sort_string = "VBAAY" + sort_string = "VDAAD" + +// Other parts + +/datum/design/item/modularcomponent/cardslot + name = "RFID card slot" + id = "cardslot" + req_tech = list(TECH_DATA = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/weapon/computer_hardware/card_slot + sort_string = "VEAAA" + +/datum/design/item/modularcomponent/nanoprinter + name = "nano printer" + id = "nanoprinter" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/weapon/computer_hardware/nano_printer + sort_string = "VEAAB" + +/datum/design/item/modularcomponent/teslalink + name = "tesla link" + id = "teslalink" + req_tech = list(TECH_DATA = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10000) + build_path = /obj/item/weapon/computer_hardware/tesla_link + sort_string = "VEAAC" + +// Data crystals (USB flash drives) + +/datum/design/item/modularcomponent/portabledrive/AssembleDesignName() + ..() + name = "Portable data drive design ([item_name])" + +/datum/design/item/modularcomponent/portabledrive/basic + name = "basic data crystal" + id = "portadrive_basic" + req_tech = list(TECH_DATA = 1) + materials = list("glass" = 8000) + build_path = /obj/item/weapon/computer_hardware/hard_drive/portable + sort_string = "VFAAA" + +/datum/design/item/modularcomponent/portabledrive/advanced + name = "advanced data crystal" + id = "portadrive_advanced" + req_tech = list(TECH_DATA = 2) + materials = list("glass" = 16000) + build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/advanced + sort_string = "VFAAB" + +/datum/design/item/modularcomponent/portabledrive/super + name = "super data crystal" + id = "portadrive_super" + req_tech = list(TECH_DATA = 4) + materials = list("glass" = 32000) + build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/super + sort_string = "VFAAC" diff --git a/code/modules/research/designs/pdas.dm b/code/modules/research/designs/pdas.dm index d05ca12bcda..78fd01ec239 100644 --- a/code/modules/research/designs/pdas.dm +++ b/code/modules/research/designs/pdas.dm @@ -1,13 +1,16 @@ -/datum/design/item/pda - name = "PDA design" +// PDA + +/datum/design/item/general/pda + name = "PDA" desc = "Cheaper than whiny non-digital assistants." id = "pda" req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3) materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) build_path = /obj/item/device/pda - sort_string = "VAAAA" + sort_string = "WAAAA" // Cartridges + /datum/design/item/pda_cartridge req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3) materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) @@ -19,79 +22,79 @@ /datum/design/item/pda_cartridge/cart_basic id = "cart_basic" build_path = /obj/item/weapon/cartridge - sort_string = "VBAAA" + sort_string = "WBAAA" /datum/design/item/pda_cartridge/engineering id = "cart_engineering" build_path = /obj/item/weapon/cartridge/engineering - sort_string = "VBAAB" + sort_string = "WBAAB" /datum/design/item/pda_cartridge/atmos id = "cart_atmos" build_path = /obj/item/weapon/cartridge/atmos - sort_string = "VBAAC" + sort_string = "WBAAC" /datum/design/item/pda_cartridge/medical id = "cart_medical" build_path = /obj/item/weapon/cartridge/medical - sort_string = "VBAAD" + sort_string = "WBAAD" /datum/design/item/pda_cartridge/chemistry id = "cart_chemistry" build_path = /obj/item/weapon/cartridge/chemistry - sort_string = "VBAAE" + sort_string = "WBAAE" /datum/design/item/pda_cartridge/security id = "cart_security" build_path = /obj/item/weapon/cartridge/security - sort_string = "VBAAF" + sort_string = "WBAAF" /datum/design/item/pda_cartridge/janitor id = "cart_janitor" build_path = /obj/item/weapon/cartridge/janitor - sort_string = "VBAAG" + sort_string = "WBAAG" /datum/design/item/pda_cartridge/science id = "cart_science" build_path = /obj/item/weapon/cartridge/signal/science - sort_string = "VBAAH" + sort_string = "WBAAH" /datum/design/item/pda_cartridge/quartermaster id = "cart_quartermaster" build_path = /obj/item/weapon/cartridge/quartermaster - sort_string = "VBAAI" + sort_string = "WBAAI" /datum/design/item/pda_cartridge/head id = "cart_head" build_path = /obj/item/weapon/cartridge/head - sort_string = "VBAAJ" + sort_string = "WBAAJ" /datum/design/item/pda_cartridge/hop id = "cart_hop" build_path = /obj/item/weapon/cartridge/hop - sort_string = "VBAAK" + sort_string = "WBAAK" /datum/design/item/pda_cartridge/hos id = "cart_hos" build_path = /obj/item/weapon/cartridge/hos - sort_string = "VBAAL" + sort_string = "WBAAL" /datum/design/item/pda_cartridge/ce id = "cart_ce" build_path = /obj/item/weapon/cartridge/ce - sort_string = "VBAAM" + sort_string = "WBAAM" /datum/design/item/pda_cartridge/cmo id = "cart_cmo" build_path = /obj/item/weapon/cartridge/cmo - sort_string = "VBAAN" + sort_string = "WBAAN" /datum/design/item/pda_cartridge/rd id = "cart_rd" build_path = /obj/item/weapon/cartridge/rd - sort_string = "VBAAO" + sort_string = "WBAAO" /datum/design/item/pda_cartridge/captain id = "cart_captain" build_path = /obj/item/weapon/cartridge/captain - sort_string = "VBAAP" \ No newline at end of file + sort_string = "WBAAP" \ No newline at end of file diff --git a/code/modules/research/designs/powercells.dm b/code/modules/research/designs/power_cells.dm similarity index 93% rename from code/modules/research/designs/powercells.dm rename to code/modules/research/designs/power_cells.dm index 1ae3a3c3615..a387f7cc4c8 100644 --- a/code/modules/research/designs/powercells.dm +++ b/code/modules/research/designs/power_cells.dm @@ -22,7 +22,7 @@ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50) build_path = /obj/item/weapon/cell category = "Misc" - sort_string = "DAAAA" + sort_string = "BAAAA" /datum/design/item/powercell/high name = "high-capacity" @@ -32,7 +32,7 @@ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60) build_path = /obj/item/weapon/cell/high category = "Misc" - sort_string = "DAAAB" + sort_string = "BAAAB" /datum/design/item/powercell/super name = "super-capacity" @@ -41,7 +41,7 @@ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70) build_path = /obj/item/weapon/cell/super category = "Misc" - sort_string = "DAAAC" + sort_string = "BAAAC" /datum/design/item/powercell/hyper name = "hyper-capacity" @@ -50,7 +50,7 @@ materials = list(DEFAULT_WALL_MATERIAL = 400, "gold" = 150, "silver" = 150, "glass" = 70) build_path = /obj/item/weapon/cell/hyper category = "Misc" - sort_string = "DAAAD" + sort_string = "BAAAD" /datum/design/item/powercell/device name = "device" @@ -59,7 +59,7 @@ materials = list(DEFAULT_WALL_MATERIAL = 350, "glass" = 25) build_path = /obj/item/weapon/cell/device category = "Misc" - sort_string = "DAABA" + sort_string = "BAABA" /datum/design/item/powercell/weapon name = "weapon" @@ -68,4 +68,4 @@ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50) build_path = /obj/item/weapon/cell/device/weapon category = "Misc" - sort_string = "DAABB" \ No newline at end of file + sort_string = "BAABB" \ No newline at end of file diff --git a/code/modules/research/designs/precursor.dm b/code/modules/research/designs/precursor.dm index eaf7b3a923a..bb6e98353f8 100644 --- a/code/modules/research/designs/precursor.dm +++ b/code/modules/research/designs/precursor.dm @@ -1,6 +1,26 @@ -/* - * Contains Precursor and Anomalous designs for the Protolathe. - */ +//Anomaly + +/datum/design/item/anomaly/AssembleDesignName() + ..() + name = "Anomalous prototype ([item_name])" + +/datum/design/item/anomaly/AssembleDesignDesc() + if(!desc) + if(build_path) + var/obj/item/I = build_path + desc = initial(I.desc) + ..() + +/datum/design/item/anomaly/camotrap + name = "Chameleon Trap" + desc = "A self-miraging mechanical trap, capable of producing short bursts of electric current when triggered." + id = "hunt_trap" + materials = list(MAT_DURASTEEL = 3000, MAT_METALHYDROGEN = 1000, MAT_PHORON = 2000) + req_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_PHORON = 2, TECH_ARCANE = 2) + build_path = /obj/item/weapon/beartrap/hunting + sort_string = "ZAAAA" + +// Precursor /datum/design/item/precursor/AssembleDesignName() ..() @@ -20,7 +40,7 @@ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1) materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_GOLD = 250, MAT_URANIUM = 2500) build_path = /obj/item/weapon/tool/crowbar/hybrid - sort_string = "PATAC" + sort_string = "ZBAAA" /datum/design/item/precursor/wrench name = "Hybrid Wrench" @@ -29,7 +49,7 @@ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_PRECURSOR = 1) materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_SILVER = 300, MAT_URANIUM = 2000) build_path = /obj/item/weapon/tool/wrench/hybrid - sort_string = "PATAW" + sort_string = "ZBAAB" /datum/design/item/precursor/screwdriver name = "Hybrid Screwdriver" @@ -38,7 +58,7 @@ req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_PRECURSOR = 1) materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_PLASTIC = 8000, MAT_DIAMOND = 2000) build_path = /obj/item/weapon/tool/screwdriver/hybrid - sort_string = "PATAS" + sort_string = "ZBAAC" /datum/design/item/precursor/wirecutters name = "Hybrid Wirecutters" @@ -47,7 +67,7 @@ req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_PHORON = 2, TECH_PRECURSOR = 1) materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_PLASTIC = 8000, MAT_PHORON = 2750, MAT_DIAMOND = 2000) build_path = /obj/item/weapon/tool/wirecutters/hybrid - sort_string = "PATBW" + sort_string = "ZBAAD" /datum/design/item/precursor/welder name = "Hybrid Welding Tool" @@ -56,7 +76,8 @@ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PHORON = 3, TECH_MAGNET = 5, TECH_PRECURSOR = 1) materials = list(MAT_DURASTEEL = 2000, MAT_MORPHIUM = 3000, MAT_METALHYDROGEN = 4750, MAT_URANIUM = 6000) build_path = /obj/item/weapon/weldingtool/experimental/hybrid - sort_string = "PATCW" + sort_string = "ZBAAE" + /datum/design/item/precursor/janusmodule name = "Blackbox Circuit Datamass" @@ -65,15 +86,4 @@ materials = list(MAT_DURASTEEL = 3000, MAT_MORPHIUM = 2000, MAT_METALHYDROGEN = 6000, MAT_URANIUM = 6000, MAT_VERDANTIUM = 1500) req_tech = list(TECH_MATERIAL = 7, TECH_BLUESPACE = 5, TECH_MAGNET = 6, TECH_PHORON = 3, TECH_ARCANE = 1, TECH_PRECURSOR = 2) build_path = /obj/random/janusmodule - sort_string = "PAJAA" - -/datum/design/item/anomaly/AssembleDesignName() - ..() - name = "Anomalous prototype ([item_name])" - -/datum/design/item/anomaly/AssembleDesignDesc() - if(!desc) - if(build_path) - var/obj/item/I = build_path - desc = initial(I.desc) - ..() + sort_string = "ZBBAA" diff --git a/code/modules/research/designs/sort_string_readme.dm b/code/modules/research/designs/sort_string_readme.dm new file mode 100644 index 00000000000..11521522b8c --- /dev/null +++ b/code/modules/research/designs/sort_string_readme.dm @@ -0,0 +1,91 @@ +/* + This is a guide to sort strings and categorization of designs. + Its really helpful and neat-looking when items are sorted properly in general R&D list and not just haphazardly. + + sort_string basically sorts items in alphabetic order, using sort_string itself as reference. + + + A - stock parts all always go first, and above everything else + AA - parts themselves + AAAA - matter bins + AAAB - micro manipulators + AAAC - capacitors + AAAD - scanners + AAAE - micro-lasers + AB - part replacer(s) + B - power cells + BAAA - regular power cells + BAAB - small power cells + C - Tech disks + D - GPS/beacons/locators/etc + DA - GPSs + DB - beacon/locator + DBAA - locator + DBAB - beacon + E - HUDs + F - Mining equipment + FA - drills + FB - scanners and such + G - Xenoarch equipment + H - Xenobiology equipment + HA - weapons + HB - other + I - Beakers + J - Biotech scanners and such + JAAA - mass spectrometers + JAAB - reagent scanners + JAAC - borg stuff + JAAD - plant stuff + K - Medical equipment + KA - surgery equipment + KAAA - scalpels/IMS + KAAB - bone clamp + KB - health analyzers + KC - misc + L - Implants + M - Weapons + MA - Ranged weapon + MAA - Energy ranged weapons + MAB - Ballistic ranged weapons + MABB - Ballistic ammo + MAC - Phase weapons + MAD - Other ranged weapons (darts/sprayer/fuelrod) + MADB - misc ammo + MB - Melee weapons + MC - grenade casings + N - Engineering equipment + NA - tools + NB - scanners + O, P - placeholders in case new category is needed + Q - Bags of Holding + R - Telecomms stock parts + S - AI-holders + SA - brain holders + SB - pAI + SC - intellicore + T - Misc stuff + TA - general + TB - illegal + U - Integrated circuits stuff + UA - printer + UB - upgrade disks + UC - tools + UD - holders + V - Modular computer parts + VA - hard drives + VB - network cards + VC - batteries + VD - cpus + VE - accessories without upgrades + VF - data crystals + W - PDA stuff + WA - PDA + WB - PDA cartridges + X, Y - more placeholders + Z - anomaly/precursor items + ZA - anomaly + ZB - precursor + ZBA - precursor tools + ZBB - precursor other + +*/ \ No newline at end of file diff --git a/code/modules/research/designs/stock_parts.dm b/code/modules/research/designs/stock_parts.dm index b928c6bb992..18e3c016163 100644 --- a/code/modules/research/designs/stock_parts.dm +++ b/code/modules/research/designs/stock_parts.dm @@ -14,231 +14,194 @@ if(!desc) desc = "A stock part used in the construction of various devices." -/datum/design/item/stock_part/basic_capacitor - id = "basic_capacitor" - req_tech = list(TECH_POWER = 1) - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) - build_path = /obj/item/weapon/stock_parts/capacitor - sort_string = "CAAAA" - -/datum/design/item/stock_part/adv_capacitor - id = "adv_capacitor" - req_tech = list(TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) - build_path = /obj/item/weapon/stock_parts/capacitor/adv - sort_string = "CAAAB" - -/datum/design/item/stock_part/super_capacitor - id = "super_capacitor" - req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4) - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, "gold" = 20) - build_path = /obj/item/weapon/stock_parts/capacitor/super - sort_string = "CAAAC" - -/datum/design/item/stock_part/hyper_capacitor - id = "hyper_capacitor" - req_tech = list(TECH_POWER = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 1, TECH_ARCANE = 1) - materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 100, MAT_VERDANTIUM = 30, MAT_DURASTEEL = 25) - build_path = /obj/item/weapon/stock_parts/capacitor/hyper - sort_string = "CAAAD" - -/datum/design/item/stock_part/omni_capacitor - id = "omni_capacitor" - req_tech = list(TECH_POWER = 7, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1) - materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_DIAMOND = 1000, MAT_GLASS = 1000, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) - build_path = /obj/item/weapon/stock_parts/capacitor/omni - sort_string = "CAAAE" - -/datum/design/item/stock_part/micro_mani - id = "micro_mani" - req_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1) - materials = list(DEFAULT_WALL_MATERIAL = 30) - build_path = /obj/item/weapon/stock_parts/manipulator - sort_string = "CAABA" - -/datum/design/item/stock_part/nano_mani - id = "nano_mani" - req_tech = list(TECH_MATERIAL = 3, TECH_DATA = 2) - materials = list(DEFAULT_WALL_MATERIAL = 30) - build_path = /obj/item/weapon/stock_parts/manipulator/nano - sort_string = "CAABB" - -/datum/design/item/stock_part/pico_mani - id = "pico_mani" - req_tech = list(TECH_MATERIAL = 5, TECH_DATA = 2) - materials = list(DEFAULT_WALL_MATERIAL = 30) - build_path = /obj/item/weapon/stock_parts/manipulator/pico - sort_string = "CAABC" - -/datum/design/item/stock_part/hyper_mani - id = "hyper_mani" - req_tech = list(TECH_MATERIAL = 6, TECH_DATA = 3, TECH_ARCANE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 50) - build_path = /obj/item/weapon/stock_parts/manipulator/hyper - sort_string = "CAABD" - -/datum/design/item/stock_part/omni_mani - id = "omni_mani" - req_tech = list(TECH_MATERIAL = 7, TECH_DATA = 4, TECH_PRECURSOR = 2) - materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_PLASTEEL = 500, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) - build_path = /obj/item/weapon/stock_parts/manipulator/omni - sort_string = "CAABE" +// Matter Bins /datum/design/item/stock_part/basic_matter_bin id = "basic_matter_bin" req_tech = list(TECH_MATERIAL = 1) materials = list(DEFAULT_WALL_MATERIAL = 80) build_path = /obj/item/weapon/stock_parts/matter_bin - sort_string = "CAACA" + sort_string = "AAAAA" /datum/design/item/stock_part/adv_matter_bin id = "adv_matter_bin" req_tech = list(TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 80) build_path = /obj/item/weapon/stock_parts/matter_bin/adv - sort_string = "CAACB" + sort_string = "AAAAB" /datum/design/item/stock_part/super_matter_bin id = "super_matter_bin" req_tech = list(TECH_MATERIAL = 5) materials = list(DEFAULT_WALL_MATERIAL = 80) build_path = /obj/item/weapon/stock_parts/matter_bin/super - sort_string = "CAACC" + sort_string = "AAAAC" /datum/design/item/stock_part/hyper_matter_bin id = "hyper_matter_bin" req_tech = list(TECH_MATERIAL = 6, TECH_ARCANE = 2) materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_VERDANTIUM = 60, MAT_DURASTEEL = 75) build_path = /obj/item/weapon/stock_parts/matter_bin/hyper - sort_string = "CAACD" + sort_string = "AAAAD" /datum/design/item/stock_part/omni_matter_bin id = "omni_matter_bin" req_tech = list(TECH_MATERIAL = 7, TECH_PRECURSOR = 2) materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_PLASTEEL = 100, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) build_path = /obj/item/weapon/stock_parts/matter_bin/omni - sort_string = "CAACE" + sort_string = "AAAAE" -/datum/design/item/stock_part/basic_micro_laser - id = "basic_micro_laser" - req_tech = list(TECH_MAGNET = 1) - materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20) - build_path = /obj/item/weapon/stock_parts/micro_laser - sort_string = "CAADA" +// Micro-manipulators -/datum/design/item/stock_part/high_micro_laser - id = "high_micro_laser" - req_tech = list(TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20) - build_path = /obj/item/weapon/stock_parts/micro_laser/high - sort_string = "CAADB" +/datum/design/item/stock_part/micro_mani + id = "micro_mani" + req_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1) + materials = list(DEFAULT_WALL_MATERIAL = 30) + build_path = /obj/item/weapon/stock_parts/manipulator + sort_string = "AAABA" -/datum/design/item/stock_part/ultra_micro_laser - id = "ultra_micro_laser" - req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5) - materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20, "uranium" = 10) - build_path = /obj/item/weapon/stock_parts/micro_laser/ultra - sort_string = "CAADC" +/datum/design/item/stock_part/nano_mani + id = "nano_mani" + req_tech = list(TECH_MATERIAL = 3, TECH_DATA = 2) + materials = list(DEFAULT_WALL_MATERIAL = 30) + build_path = /obj/item/weapon/stock_parts/manipulator/nano + sort_string = "AAABB" -/datum/design/item/stock_part/hyper_micro_laser - id = "hyper_micro_laser" - req_tech = list(TECH_MAGNET = 6, TECH_MATERIAL = 6, TECH_ARCANE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 20, MAT_URANIUM = 30, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 100) - build_path = /obj/item/weapon/stock_parts/micro_laser/hyper - sort_string = "CAADD" +/datum/design/item/stock_part/pico_mani + id = "pico_mani" + req_tech = list(TECH_MATERIAL = 5, TECH_DATA = 2) + materials = list(DEFAULT_WALL_MATERIAL = 30) + build_path = /obj/item/weapon/stock_parts/manipulator/pico + sort_string = "AAABC" -/datum/design/item/stock_part/omni_micro_laser - id = "omni_micro_laser" - req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 7, TECH_PRECURSOR = 2) - materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_GLASS = 500, MAT_URANIUM = 2000, MAT_MORPHIUM = 50, MAT_DURASTEEL = 100) - build_path = /obj/item/weapon/stock_parts/micro_laser/omni - sort_string = "CAADE" +/datum/design/item/stock_part/hyper_mani + id = "hyper_mani" + req_tech = list(TECH_MATERIAL = 6, TECH_DATA = 3, TECH_ARCANE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 50) + build_path = /obj/item/weapon/stock_parts/manipulator/hyper + sort_string = "AAABD" + +/datum/design/item/stock_part/omni_mani + id = "omni_mani" + req_tech = list(TECH_MATERIAL = 7, TECH_DATA = 4, TECH_PRECURSOR = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_PLASTEEL = 500, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/manipulator/omni + sort_string = "AAABE" + +// Capacitors + +/datum/design/item/stock_part/basic_capacitor + id = "basic_capacitor" + req_tech = list(TECH_POWER = 1) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + build_path = /obj/item/weapon/stock_parts/capacitor + sort_string = "AAACA" + +/datum/design/item/stock_part/adv_capacitor + id = "adv_capacitor" + req_tech = list(TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + build_path = /obj/item/weapon/stock_parts/capacitor/adv + sort_string = "AAACB" + +/datum/design/item/stock_part/super_capacitor + id = "super_capacitor" + req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, "gold" = 20) + build_path = /obj/item/weapon/stock_parts/capacitor/super + sort_string = "AAACC" + +/datum/design/item/stock_part/hyper_capacitor + id = "hyper_capacitor" + req_tech = list(TECH_POWER = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 1, TECH_ARCANE = 1) + materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 100, MAT_VERDANTIUM = 30, MAT_DURASTEEL = 25) + build_path = /obj/item/weapon/stock_parts/capacitor/hyper + sort_string = "AAACD" + +/datum/design/item/stock_part/omni_capacitor + id = "omni_capacitor" + req_tech = list(TECH_POWER = 7, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_DIAMOND = 1000, MAT_GLASS = 1000, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/capacitor/omni + sort_string = "AAACE" + +// Sensors /datum/design/item/stock_part/basic_sensor id = "basic_sensor" req_tech = list(TECH_MAGNET = 1) materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20) build_path = /obj/item/weapon/stock_parts/scanning_module - sort_string = "CAAEA" + sort_string = "AAADA" /datum/design/item/stock_part/adv_sensor id = "adv_sensor" req_tech = list(TECH_MAGNET = 3) materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20) build_path = /obj/item/weapon/stock_parts/scanning_module/adv - sort_string = "CAAEB" + sort_string = "AAADB" /datum/design/item/stock_part/phasic_sensor id = "phasic_sensor" req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20, "silver" = 10) build_path = /obj/item/weapon/stock_parts/scanning_module/phasic - sort_string = "CAAEC" + sort_string = "AAADC" /datum/design/item/stock_part/hyper_sensor id = "hyper_sensor" req_tech = list(TECH_MAGNET = 6, TECH_MATERIAL = 4, TECH_ARCANE = 1) materials = list(DEFAULT_WALL_MATERIAL = 50, MAT_GLASS = 20, MAT_SILVER = 50, MAT_VERDANTIUM = 40, MAT_DURASTEEL = 50) build_path = /obj/item/weapon/stock_parts/scanning_module/hyper - sort_string = "CAAED" + sort_string = "AAADD" /datum/design/item/stock_part/omni_sensor id = "omni_sensor" req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1) materials = list(DEFAULT_WALL_MATERIAL = 1000, MAT_PLASTEEL = 500, MAT_GLASS = 750, MAT_SILVER = 500, MAT_MORPHIUM = 60, MAT_DURASTEEL = 100) build_path = /obj/item/weapon/stock_parts/scanning_module/omni - sort_string = "CAAEE" + sort_string = "AAADE" -/datum/design/item/stock_part/subspace_ansible - id = "s-ansible" - req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 80, "silver" = 20) - build_path = /obj/item/weapon/stock_parts/subspace/ansible - sort_string = "UAAAA" +// Micro-lasers -/datum/design/item/stock_part/hyperwave_filter - id = "s-filter" - req_tech = list(TECH_DATA = 3, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 40, "silver" = 10) - build_path = /obj/item/weapon/stock_parts/subspace/sub_filter - sort_string = "UAAAB" +/datum/design/item/stock_part/basic_micro_laser + id = "basic_micro_laser" + req_tech = list(TECH_MAGNET = 1) + materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20) + build_path = /obj/item/weapon/stock_parts/micro_laser + sort_string = "AAAEA" -/datum/design/item/stock_part/subspace_amplifier - id = "s-amplifier" - req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 30, "uranium" = 15) - build_path = /obj/item/weapon/stock_parts/subspace/amplifier - sort_string = "UAAAC" +/datum/design/item/stock_part/high_micro_laser + id = "high_micro_laser" + req_tech = list(TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20) + build_path = /obj/item/weapon/stock_parts/micro_laser/high + sort_string = "AAAEB" -/datum/design/item/stock_part/subspace_treatment - id = "s-treatment" - req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 10, "silver" = 20) - build_path = /obj/item/weapon/stock_parts/subspace/treatment - sort_string = "UAAAD" +/datum/design/item/stock_part/ultra_micro_laser + id = "ultra_micro_laser" + req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5) + materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20, "uranium" = 10) + build_path = /obj/item/weapon/stock_parts/micro_laser/ultra + sort_string = "AAAEC" -/datum/design/item/stock_part/subspace_analyzer - id = "s-analyzer" - req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 15) - build_path = /obj/item/weapon/stock_parts/subspace/analyzer - sort_string = "UAAAE" +/datum/design/item/stock_part/hyper_micro_laser + id = "hyper_micro_laser" + req_tech = list(TECH_MAGNET = 6, TECH_MATERIAL = 6, TECH_ARCANE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 20, MAT_URANIUM = 30, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/micro_laser/hyper + sort_string = "AAAED" -/datum/design/item/stock_part/subspace_crystal - id = "s-crystal" - req_tech = list(TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list("glass" = 1000, "silver" = 20, "gold" = 20) - build_path = /obj/item/weapon/stock_parts/subspace/crystal - sort_string = "UAAAF" +/datum/design/item/stock_part/omni_micro_laser + id = "omni_micro_laser" + req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 7, TECH_PRECURSOR = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_GLASS = 500, MAT_URANIUM = 2000, MAT_MORPHIUM = 50, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/micro_laser/omni + sort_string = "AAAEE" -/datum/design/item/stock_part/subspace_transmitter - id = "s-transmitter" - req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5, TECH_BLUESPACE = 3) - materials = list("glass" = 100, "silver" = 10, "uranium" = 15) - build_path = /obj/item/weapon/stock_parts/subspace/transmitter - sort_string = "UAAAG" -// RPEDs live here because they handle stock parts +// RPEDs + /datum/design/item/stock_part/RPED name = "Rapid Part Exchange Device" desc = "Special mechanical module made to store, sort, and apply standard machine parts." @@ -246,7 +209,7 @@ req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 5000) build_path = /obj/item/weapon/storage/part_replacer - sort_string = "CBAAA" + sort_string = "ABAAA" /datum/design/item/stock_part/ARPED name = "Advanced Rapid Part Exchange Device" @@ -255,4 +218,4 @@ req_tech = list(TECH_ENGINEERING = 5, TECH_MATERIAL = 5) materials = list(DEFAULT_WALL_MATERIAL = 30000, "glass" = 10000) build_path = /obj/item/weapon/storage/part_replacer/adv - sort_string = "CBAAB" \ No newline at end of file + sort_string = "ABAAB" \ No newline at end of file diff --git a/code/modules/research/designs/subspace_parts.dm b/code/modules/research/designs/subspace_parts.dm new file mode 100644 index 00000000000..0fcc0e20e0c --- /dev/null +++ b/code/modules/research/designs/subspace_parts.dm @@ -0,0 +1,54 @@ +// Telecomm parts + +/datum/design/item/stock_part/subspace/AssembleDesignName() + ..() + name = "Subspace component design ([item_name])" + +/datum/design/item/stock_part/subspace/subspace_ansible + id = "s-ansible" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 80, "silver" = 20) + build_path = /obj/item/weapon/stock_parts/subspace/ansible + sort_string = "RAAAA" + +/datum/design/item/stock_part/subspace/hyperwave_filter + id = "s-filter" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 40, "silver" = 10) + build_path = /obj/item/weapon/stock_parts/subspace/sub_filter + sort_string = "RAAAB" + +/datum/design/item/stock_part/subspace/subspace_amplifier + id = "s-amplifier" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 30, "uranium" = 15) + build_path = /obj/item/weapon/stock_parts/subspace/amplifier + sort_string = "RAAAC" + +/datum/design/item/stock_part/subspace/subspace_treatment + id = "s-treatment" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10, "silver" = 20) + build_path = /obj/item/weapon/stock_parts/subspace/treatment + sort_string = "RAAAD" + +/datum/design/item/stock_part/subspace/subspace_analyzer + id = "s-analyzer" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 15) + build_path = /obj/item/weapon/stock_parts/subspace/analyzer + sort_string = "RAAAE" + +/datum/design/item/stock_part/subspace/subspace_crystal + id = "s-crystal" + req_tech = list(TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list("glass" = 1000, "silver" = 20, "gold" = 20) + build_path = /obj/item/weapon/stock_parts/subspace/crystal + sort_string = "RAAAF" + +/datum/design/item/stock_part/subspace/subspace_transmitter + id = "s-transmitter" + req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5, TECH_BLUESPACE = 3) + materials = list("glass" = 100, "silver" = 10, "uranium" = 15) + build_path = /obj/item/weapon/stock_parts/subspace/transmitter + sort_string = "RAAAG" \ No newline at end of file diff --git a/code/modules/research/designs/tech_disks.dm b/code/modules/research/designs/tech_disks.dm new file mode 100644 index 00000000000..70f6ed0022f --- /dev/null +++ b/code/modules/research/designs/tech_disks.dm @@ -0,0 +1,21 @@ +/datum/design/item/disk/AssembleDesignName() + ..() + name = "Data storage design ([name])" + +/datum/design/item/disk/design_disk + name = "Design Storage Disk" + desc = "Produce additional disks for storing device designs." + id = "design_disk" + req_tech = list(TECH_DATA = 1) + materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) + build_path = /obj/item/weapon/disk/design_disk + sort_string = "CAAAA" + +/datum/design/item/disk/tech_disk + name = "Technology Data Storage Disk" + desc = "Produce additional disks for storing technology data." + id = "tech_disk" + req_tech = list(TECH_DATA = 1) + materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) + build_path = /obj/item/weapon/disk/tech_disk + sort_string = "CAAAB" \ No newline at end of file diff --git a/code/modules/research/designs/weapons.dm b/code/modules/research/designs/weapons.dm index d696b14b29a..81a2bd57d95 100644 --- a/code/modules/research/designs/weapons.dm +++ b/code/modules/research/designs/weapons.dm @@ -2,6 +2,10 @@ ..() name = "Weapon prototype ([item_name])" +/datum/design/item/weapon/ammo/AssembleDesignName() + ..() + name = "Weapon ammo prototype ([item_name])" + /datum/design/item/weapon/AssembleDesignDesc() if(!desc) if(build_path) @@ -9,95 +13,145 @@ desc = initial(I.desc) ..() -/datum/design/item/weapon/stunrevolver +// Energy weapons + +/datum/design/item/weapon/energy/AssembleDesignName() + ..() + name = "Energy weapon prototype ([item_name])" + +/datum/design/item/weapon/energy/stunrevolver id = "stunrevolver" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) materials = list(DEFAULT_WALL_MATERIAL = 4000) build_path = /obj/item/weapon/gun/energy/stunrevolver - sort_string = "TAAAA" + sort_string = "MAAAA" -/datum/design/item/weapon/nuclear_gun +/datum/design/item/weapon/energy/nuclear_gun id = "nuclear_gun" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3) materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "uranium" = 500) build_path = /obj/item/weapon/gun/energy/gun/nuclear - sort_string = "TAAAB" + sort_string = "MAAAB" -/datum/design/item/weapon/lasercannon +/datum/design/item/weapon/energy/phoronpistol + id = "ppistol" + req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "phoron" = 3000) + build_path = /obj/item/weapon/gun/energy/toxgun + sort_string = "MAAAC" + +/datum/design/item/weapon/energy/lasercannon desc = "The lasing medium of this prototype is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core." id = "lasercannon" req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1000, "diamond" = 2000) build_path = /obj/item/weapon/gun/energy/lasercannon - sort_string = "TAAAC" + sort_string = "MAAAD" -/datum/design/item/weapon/phoronpistol - id = "ppistol" - req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "phoron" = 3000) - build_path = /obj/item/weapon/gun/energy/toxgun - sort_string = "TAAAD" - -/datum/design/item/weapon/decloner +/datum/design/item/weapon/energy/decloner id = "decloner" req_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 7, TECH_BIO = 5, TECH_POWER = 6) materials = list("gold" = 5000,"uranium" = 10000) build_path = /obj/item/weapon/gun/energy/decloner - sort_string = "TAAAE" + sort_string = "MAAAE" -/datum/design/item/weapon/advanced_smg +/datum/design/item/weapon/energy/temp_gun + desc = "A gun that shoots high-powered glass-encased energy temperature bullets." + id = "temp_gun" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 500, "silver" = 3000) + build_path = /obj/item/weapon/gun/energy/temperature + sort_string = "MAAAF" + +/datum/design/item/weapon/energy/flora_gun + id = "flora_gun" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "uranium" = 500) + build_path = /obj/item/weapon/gun/energy/floragun + sort_string = "MAAAG" + +// Ballistic weapons + +/datum/design/item/weapon/ballistic/AssembleDesignName() + ..() + name = "Ballistic weapon prototype ([item_name])" + +/datum/design/item/weapon/ballistic/advanced_smg id = "smg" desc = "An advanced 9mm SMG with a reflective laser optic." req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 8000, "silver" = 2000, "diamond" = 1000) build_path = /obj/item/weapon/gun/projectile/automatic/advanced_smg - sort_string = "TAABA" + sort_string = "MABAA" -/datum/design/item/weapon/ammo_9mmAdvanced +// Ballistic ammo + +/datum/design/item/weapon/ballistic/ammo/AssembleDesignName() + ..() + name = "Ballistic weapon ammo prototype ([name])" + +/datum/design/item/weapon/ballistic/ammo/ammo_9mmAdvanced + name = "9mm magazine" id = "ammo_9mm" desc = "A 21 round magazine for an advanced 9mm SMG." req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 3750, "silver" = 100) // Requires silver for proprietary magazines! Or something. build_path = /obj/item/ammo_magazine/m9mmAdvanced - sort_string = "TAACA" + sort_string = "MABBA" -/datum/design/item/weapon/stunshell +/datum/design/item/weapon/ballistic/ammo/stunshell + name = "stun shell" desc = "A stunning shell for a shotgun." id = "stunshell" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 4000) build_path = /obj/item/ammo_casing/a12g/stunshell - sort_string = "TAACB" + sort_string = "MABBB" -/datum/design/item/weapon/chemsprayer - desc = "An advanced chem spraying device." - id = "chemsprayer" - req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) - build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer - sort_string = "TABAA" +// Phase weapons + +/datum/design/item/weapon/phase/AssembleDesignName() + ..() + name = "Phase weapon prototype ([item_name])" + +/* //VOREStation Removal Start +/datum/design/item/weapon/phase/phase_pistol + id = "phasepistol" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000) + build_path = /obj/item/weapon/gun/energy/phasegun/pistol + sort_string = "MACAA" + +/datum/design/item/weapon/phase/phase_carbine + id = "phasecarbine" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1500) + build_path = /obj/item/weapon/gun/energy/phasegun + sort_string = "MACAB" + +/datum/design/item/weapon/phase/phase_rifle + id = "phaserifle" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2000, "silver" = 500) + build_path = /obj/item/weapon/gun/energy/phasegun/rifle + sort_string = "MACAC" + +/datum/design/item/weapon/phase/phase_cannon + id = "phasecannon" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4, TECH_POWER = 4) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "silver" = 1000, "diamond" = 750) + build_path = /obj/item/weapon/gun/energy/phasegun/cannon + sort_string = "MACAD" +*/ //VOREStation Removal End + +// Other weapons /datum/design/item/weapon/rapidsyringe id = "rapidsyringe" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2) materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) build_path = /obj/item/weapon/gun/launcher/syringe/rapid - sort_string = "TABAB" - -/datum/design/item/weapon/temp_gun - desc = "A gun that shoots high-powered glass-encased energy temperature bullets." - id = "temp_gun" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 500, "silver" = 3000) - build_path = /obj/item/weapon/gun/energy/temperature - sort_string = "TABAC" - -/datum/design/item/weapon/large_grenade - id = "large_Grenade" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 3000) - build_path = /obj/item/weapon/grenade/chem_grenade/large - sort_string = "TACAA" + sort_string = "MADAA" /datum/design/item/weapon/dartgun desc = "A gun that fires small hollow chemical-payload darts." @@ -105,92 +159,83 @@ req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_BIO = 4, TECH_MAGNET = 3, TECH_ILLEGAL = 1) materials = list(DEFAULT_WALL_MATERIAL = 5000, "gold" = 5000, "silver" = 2500, "glass" = 750) build_path = /obj/item/weapon/gun/projectile/dartgun/research - sort_string = "TACAB" + sort_string = "MADAB" -/datum/design/item/weapon/dartgunmag_small - id = "dartgun_mag_s" - req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) - materials = list(DEFAULT_WALL_MATERIAL = 300, "gold" = 100, "silver" = 100, "glass" = 300) - build_path = /obj/item/ammo_magazine/chemdart/small - sort_string = "TACAC" - -/datum/design/item/weapon/dartgun_ammo_small - id = "dartgun_ammo_s" - req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) - materials = list(DEFAULT_WALL_MATERIAL = 50, "gold" = 30, "silver" = 30, "glass" = 50) - build_path = /obj/item/ammo_casing/chemdart/small - sort_string = "TACAD" - -/datum/design/item/weapon/dartgunmag_med - id = "dartgun_mag_m" - req_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) - materials = list(DEFAULT_WALL_MATERIAL = 500, "gold" = 150, "silver" = 150, "diamond" = 200, "glass" = 400) - build_path = /obj/item/ammo_magazine/chemdart - sort_string = "TACAE" - -/datum/design/item/weapon/dartgun_ammo_med - id = "dartgun_ammo_m" - req_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) - materials = list(DEFAULT_WALL_MATERIAL = 80, "gold" = 40, "silver" = 40, "glass" = 60) - build_path = /obj/item/ammo_casing/chemdart - sort_string = "TACAF" +/datum/design/item/weapon/chemsprayer + desc = "An advanced chem spraying device." + id = "chemsprayer" + req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) + build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer + sort_string = "MADAC" /datum/design/item/weapon/fuelrod id = "fuelrod_gun" req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_PHORON = 4, TECH_ILLEGAL = 5, TECH_MAGNET = 5) materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "gold" = 500, "silver" = 500, "uranium" = 1000, "phoron" = 3000, "diamond" = 1000) build_path = /obj/item/weapon/gun/magnetic/fuelrod - sort_string = "TACBA" + sort_string = "MADAD" -/datum/design/item/weapon/flora_gun - id = "flora_gun" - req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "uranium" = 500) - build_path = /obj/item/weapon/gun/energy/floragun - sort_string = "TBAAA" +// Ammo for those -// Xenobio Tools -/datum/design/item/weapon/slimebation - id = "slimebation" - req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2, TECH_POWER = 3, TECH_COMBAT = 3) - materials = list(DEFAULT_WALL_MATERIAL = 5000) - build_path = /obj/item/weapon/melee/baton/slime - sort_string = "TBAAB" +/datum/design/item/weapon/ammo/dartgunmag_small + id = "dartgun_mag_s" + req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 300, "gold" = 100, "silver" = 100, "glass" = 300) + build_path = /obj/item/ammo_magazine/chemdart/small + sort_string = "MADBA" -/datum/design/item/weapon/slimetaser - id = "slimetaser" - req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 3, TECH_POWER = 4, TECH_COMBAT = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000) - build_path = /obj/item/weapon/gun/energy/taser/xeno - sort_string = "TBAAC" +/datum/design/item/weapon/ammo/dartgun_ammo_small + id = "dartgun_ammo_s" + req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 50, "gold" = 30, "silver" = 30, "glass" = 50) + build_path = /obj/item/ammo_casing/chemdart/small + sort_string = "MADBB" -/* //VOREStation Edit -// Phase Weapons -/datum/design/item/weapon/phase_pistol - id = "phasepistol" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000) - build_path = /obj/item/weapon/gun/energy/phasegun/pistol - sort_string = "TPAAA" +/datum/design/item/weapon/ammo/dartgunmag_med + id = "dartgun_mag_m" + req_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 500, "gold" = 150, "silver" = 150, "diamond" = 200, "glass" = 400) + build_path = /obj/item/ammo_magazine/chemdart + sort_string = "MADBC" -/datum/design/item/weapon/phase_carbine - id = "phasecarbine" - req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1500) - build_path = /obj/item/weapon/gun/energy/phasegun - sort_string = "TPAAB" +/datum/design/item/weapon/ammo/dartgun_ammo_med + id = "dartgun_ammo_m" + req_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 80, "gold" = 40, "silver" = 40, "glass" = 60) + build_path = /obj/item/ammo_casing/chemdart + sort_string = "MADBD" -/datum/design/item/weapon/phase_rifle - id = "phaserifle" - req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2000, "silver" = 500) - build_path = /obj/item/weapon/gun/energy/phasegun/rifle - sort_string = "TPAAC" +// Melee weapons -/datum/design/item/weapon/phase_cannon - id = "phasecannon" - req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4, TECH_POWER = 4) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "silver" = 1000, "diamond" = 750) - build_path = /obj/item/weapon/gun/energy/phasegun/cannon - sort_string = "TPAAD" -*/ \ No newline at end of file +/datum/design/item/weapon/melee/AssembleDesignName() + ..() + name = "Melee weapon prototype ([item_name])" + +/datum/design/item/weapon/melee/esword + name = "Portable Energy Blade" + id = "chargesword" + req_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 4, TECH_ENGINEERING = 5, TECH_ILLEGAL = 4, TECH_ARCANE = 1) + materials = list(MAT_PLASTEEL = 3500, "glass" = 1000, MAT_LEAD = 2250, MAT_METALHYDROGEN = 500) + build_path = /obj/item/weapon/melee/energy/sword/charge + sort_string = "MBAAA" + +/datum/design/item/weapon/melee/eaxe + name = "Energy Axe" + id = "chargeaxe" + req_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 5, TECH_ENGINEERING = 4, TECH_ILLEGAL = 4) + materials = list(MAT_PLASTEEL = 3500, MAT_OSMIUM = 2000, MAT_LEAD = 2000, MAT_METALHYDROGEN = 500) + build_path = /obj/item/weapon/melee/energy/axe/charge + sort_string = "MBAAB" + +// Grenade stuff +/datum/design/item/weapon/grenade/AssembleDesignName() + ..() + name = "Grenade casing prototype ([item_name])" + +/datum/design/item/weapon/grenade/large_grenade + id = "large_Grenade" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/weapon/grenade/chem_grenade/large + sort_string = "MCAAA" diff --git a/code/modules/research/designs/weapons_vr.dm b/code/modules/research/designs/weapons_vr.dm new file mode 100644 index 00000000000..0cde7758c48 --- /dev/null +++ b/code/modules/research/designs/weapons_vr.dm @@ -0,0 +1,165 @@ +/* + MAU - AP weapons + MAV - cell-loaded weapons + MAVA - weapon + MAVB - cartridge + MAVC - cells +*/ + + +// Energy Weapons + +/datum/design/item/weapon/energy/protector + desc = "The 'Protector' is an advanced energy gun that cannot be fired in lethal mode on low security alert levels, but features DNA locking and a powerful stun." + id = "protector" + req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "silver" = 1000) + build_path = /obj/item/weapon/gun/energy/protector + sort_string = "MAAVA" + +/datum/design/item/weapon/energy/sickshot + desc = "A 'Sickshot' is a 4-shot energy revolver that causes nausea and confusion." + id = "sickshot" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000) + build_path = /obj/item/weapon/gun/energy/sickshot + sort_string = "MAAVB" + +/datum/design/item/weapon/energy/netgun + name = "\'Hunter\' capture gun" + id = "netgun" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 3000) + build_path = /obj/item/weapon/gun/energy/netgun + sort_string = "MAAVC" + +// Misc weapons + +/datum/design/item/weapon/pummeler + desc = "With the 'Pummeler', punt anyone you don't like out of the room!" + id = "pummeler" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 5) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000, "uranium" = 1000) + build_path = /obj/item/weapon/gun/energy/pummeler + sort_string = "MADVA" + +// Anti-particle stuff + +/datum/design/item/weapon/particle/AssembleDesignName() + ..() + name = "Anti-particle weapon prototype ([item_name])" + +/datum/design/item/weapon/particle/advparticle + name = "Advanced anti-particle rifle" + id = "advparticle" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 5, TECH_POWER = 3, TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "gold" = 1000, "uranium" = 750) + build_path = /obj/item/weapon/gun/energy/particle/advanced + sort_string = "MAAUA" + +/datum/design/item/weapon/particle/particlecannon + name = "Anti-particle cannon" + id = "particlecannon" + req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_POWER = 4, TECH_MAGNET = 4) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1500, "gold" = 2000, "uranium" = 1000, "diamond" = 2000) + build_path = /obj/item/weapon/gun/energy/particle/cannon + sort_string = "MAAUB" + +/datum/design/item/weapon/particle/pressureinterlock + name = "APP pressure interlock" + id = "pressureinterlock" + req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 250) + build_path = /obj/item/pressurelock + sort_string = "MAAUC" + +// NSFW gun and cells +/datum/design/item/weapon/cell_based/AssembleDesignName() + ..() + name = "Cell-based weapon prototype ([item_name])" + +/datum/design/item/weapon/cell_based/prototype_nsfw + name = "cell-loaded revolver" + id = "nsfw_prototype" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 4, TECH_POWER = 4, TECH_COMBAT = 7) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 6000, "phoron" = 8000, "uranium" = 4000) + build_path = /obj/item/weapon/gun/projectile/cell_loaded/combat/prototype + sort_string = "MAVAA" + +/datum/design/item/weapon/cell_based/prototype_nsfw_mag + name = "combat cell magazine" + id = "nsfw_mag_prototype" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 4, TECH_POWER = 4, TECH_COMBAT = 7) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "glass" = 4000, "phoron" = 4000) + build_path = /obj/item/ammo_magazine/cell_mag/combat/prototype + sort_string = "MAVBA" + +/datum/design/item/nsfw_cell/AssembleDesignName() + ..() + name = "Microbattery prototype ([name])" + +/datum/design/item/nsfw_cell/stun + name = "STUN" + id = "nsfw_cell_stun" + req_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 2, TECH_POWER = 3, TECH_COMBAT = 3) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + build_path = /obj/item/ammo_casing/microbattery/combat/stun + sort_string = "MAVCA" + +/datum/design/item/nsfw_cell/lethal + name = "LETHAL" + id = "nsfw_cell_lethal" + req_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_POWER = 3, TECH_COMBAT = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "phoron" = 3000) + build_path = /obj/item/ammo_casing/microbattery/combat/lethal + sort_string = "MAVCB" + +/datum/design/item/nsfw_cell/net + name = "NET" + id = "nsfw_cell_net" + req_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_POWER = 3, TECH_COMBAT = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "uranium" = 3000) + build_path = /obj/item/ammo_casing/microbattery/combat/net + sort_string = "MAVCC" + +/datum/design/item/nsfw_cell/ion + name = "ION" + id = "nsfw_cell_ion" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 5, TECH_COMBAT = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "silver" = 3000) + build_path = /obj/item/ammo_casing/microbattery/combat/ion + sort_string = "MAVCD" + +/datum/design/item/nsfw_cell/shotstun + name = "SCATTERSTUN" + id = "nsfw_cell_shotstun" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 6, TECH_COMBAT = 6) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "silver" = 2000, "gold" = 2000) + build_path = /obj/item/ammo_casing/microbattery/combat/shotstun + sort_string = "MAVCE" + +/datum/design/item/nsfw_cell/xray + name = "XRAY" + id = "nsfw_cell_xray" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 4, TECH_POWER = 5, TECH_COMBAT = 7) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "silver" = 1000, "gold" = 1000, "uranium" = 1000, "phoron" = 1000) + build_path = /obj/item/ammo_casing/microbattery/combat/xray + sort_string = "MAVCF" + +/datum/design/item/nsfw_cell/stripper + name = "STRIPPER" + id = "nsfw_cell_stripper" + req_tech = list(TECH_MATERIAL = 7, TECH_BIO = 4, TECH_POWER = 4, TECH_COMBAT = 4, TECH_ILLEGAL = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "uranium" = 2000, "phoron" = 2000, "diamond" = 500) + build_path = /obj/item/ammo_casing/microbattery/combat/stripper + sort_string = "MAVCG" + +/* +/datum/design/item/nsfw_cell/final + name = "FINAL OPTION" + id = "nsfw_cell_final" + req_tech = list(TECH_COMBAT = 69, TECH_ILLEGAL = 69, TECH_PRECURSOR = 1) + materials = list("unobtanium" = 9001) + build_path = /obj/item/ammo_casing/microbattery/combat/final + sort_string = "MAVCH" +*/ \ No newline at end of file diff --git a/code/modules/research/designs/xenoarch_toys.dm b/code/modules/research/designs/xenoarch_toys.dm new file mode 100644 index 00000000000..7c69090b1bd --- /dev/null +++ b/code/modules/research/designs/xenoarch_toys.dm @@ -0,0 +1,31 @@ +/datum/design/item/weapon/xenoarch/AssembleDesignName() + ..() + name = "Xenoarcheology equipment design ([item_name])" + +// Xenoarch tools + +/datum/design/item/weapon/xenoarch/ano_scanner + name = "Alden-Saraspova counter" + id = "ano_scanner" + desc = "Aids in triangulation of exotic particles." + req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000) + build_path = /obj/item/device/ano_scanner + sort_string = "GAAAA" + +/datum/design/item/weapon/xenoarch/xenoarch_multi_tool + name = "xenoarcheology multitool" + id = "xenoarch_multitool" + req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3) + build_path = /obj/item/device/xenoarch_multi_tool + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500, "phoron" = 500) + sort_string = "GAAAB" + +/datum/design/item/weapon/xenoarch/excavationdrill + name = "Excavation Drill" + id = "excavationdrill" + req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/weapon/pickaxe/excavationdrill + sort_string = "GAAAC" \ No newline at end of file diff --git a/code/modules/research/designs/xenobio_toys.dm b/code/modules/research/designs/xenobio_toys.dm new file mode 100644 index 00000000000..917f8ba6c31 --- /dev/null +++ b/code/modules/research/designs/xenobio_toys.dm @@ -0,0 +1,30 @@ +/datum/design/item/weapon/xenobio/AssembleDesignName() + ..() + name = "Xenobiology equipment design ([item_name])" + +// Xenobio Weapons + +/datum/design/item/weapon/xenobio/slimebaton + id = "slimebaton" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2, TECH_POWER = 3, TECH_COMBAT = 3) + materials = list(DEFAULT_WALL_MATERIAL = 5000) + build_path = /obj/item/weapon/melee/baton/slime + sort_string = "HAAAA" + +/datum/design/item/weapon/xenobio/slimetaser + id = "slimetaser" + req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 3, TECH_POWER = 4, TECH_COMBAT = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000) + build_path = /obj/item/weapon/gun/energy/taser/xeno + sort_string = "HAAAB" + +// Other + +/datum/design/item/weapon/xenobio/slime_scanner + name = "slime scanner" + desc = "A hand-held body scanner able to learn information about slimes." + id = "slime_scanner" + req_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) + build_path = /obj/item/device/slime_scanner + sort_string = "HBAAA" \ No newline at end of file diff --git a/code/modules/research/designs_vr.dm b/code/modules/research/designs_vr.dm deleted file mode 100644 index 518c77a504b..00000000000 --- a/code/modules/research/designs_vr.dm +++ /dev/null @@ -1,328 +0,0 @@ -/* Make language great again -/datum/design/item/implant/language - name = "Language implant" - id = "implant_language" - req_tech = list(TECH_MATERIAL = 5, TECH_BIO = 5, TECH_DATA = 4, TECH_ENGINEERING = 4) //This is not an easy to make implant. - materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000, "gold" = 2000, "diamond" = 3000) - build_path = /obj/item/weapon/implantcase/vrlanguage -*/ -/datum/design/item/implant/backup - name = "Backup implant" - id = "implant_backup" - req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2, TECH_DATA = 4, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000) - build_path = /obj/item/weapon/implantcase/backup - -/datum/design/item/implant/sizecontrol - name = "Size control implant" - id = "implant_size" - req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_DATA = 4, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000, "silver" = 3000) - build_path = /obj/item/weapon/implanter/sizecontrol - sort_string = "TAAAA" - -/datum/design/item/weapon/sizegun - name = "Size gun" - id = "sizegun" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000, "uranium" = 2000) - build_path = /obj/item/weapon/gun/energy/sizegun - sort_string = "TAAAB" - -/datum/design/item/bluespace_jumpsuit - name = "Bluespace jumpsuit" - id = "bsjumpsuit" - req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 3, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) - build_path = /obj/item/clothing/under/bluespace - sort_string = "TAAAC" - -/datum/design/item/sleevemate - name = "SleeveMate 3700" - id = "sleevemate" - req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) - build_path = /obj/item/device/sleevemate - sort_string = "TAAAD" - -/datum/design/item/bodysnatcher - name = "Body Snatcher" - id = "bodysnatcher" - req_tech = list(TECH_MAGNET = 3, TECH_BIO = 3, TECH_ILLEGAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) - build_path = /obj/item/device/bodysnatcher - -/datum/design/item/item/pressureinterlock - name = "APP pressure interlock" - id = "pressureinterlock" - req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 250) - build_path = /obj/item/pressurelock - sort_string = "TAADA" - -/datum/design/item/weapon/advparticle - name = "Advanced anti-particle rifle" - id = "advparticle" - req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 5, TECH_POWER = 3, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "gold" = 1000, "uranium" = 750) - build_path = /obj/item/weapon/gun/energy/particle/advanced - sort_string = "TAADB" - -/datum/design/item/weapon/particlecannon - name = "Anti-particle cannon" - id = "particlecannon" - req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_POWER = 4, TECH_MAGNET = 4) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1500, "gold" = 2000, "uranium" = 1000, "diamond" = 2000) - build_path = /obj/item/weapon/gun/energy/particle/cannon - sort_string = "TAADC" - -/datum/design/item/hud/omni - name = "AR glasses" - id = "omnihud" - req_tech = list(TECH_MAGNET = 4, TECH_COMBAT = 3, TECH_BIO = 3) - materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 1000) - build_path = /obj/item/clothing/glasses/omnihud - sort_string = "GAAFB" - -/datum/design/item/translocator - name = "Personal translocator" - id = "translocator" - req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_ILLEGAL = 6) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "uranium" = 4000, "diamond" = 2000) - build_path = /obj/item/device/perfect_tele - sort_string = "HABAF" - -/datum/design/item/nif - name = "nanite implant framework" - id = "nif" - req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 8000, "uranium" = 6000, "diamond" = 6000) - build_path = /obj/item/device/nif - sort_string = "HABBC" - -/datum/design/item/nifbio - name = "bioadaptive NIF" - id = "bioadapnif" - req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, "uranium" = 10000, "diamond" = 10000) - build_path = /obj/item/device/nif/bioadap - sort_string = "HABBD" //Changed String from HABBE to HABBD -//Addiing bioadaptive NIF to Protolathe - -/datum/design/item/nifrepairtool - name = "adv. NIF repair tool" - id = "anrt" - req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5) - materials = list(DEFAULT_WALL_MATERIAL = 200, "glass" = 3000, "uranium" = 2000, "diamond" = 2000) - build_path = /obj/item/device/nifrepairer - sort_string = "HABBE" //Changed String from HABBD to HABBE - -// Resleeving Circuitboards - -/datum/design/circuit/transhuman_clonepod - name = "grower pod" - id = "transhuman_clonepod" - req_tech = list(TECH_DATA = 3, TECH_BIO = 3) - build_path = /obj/item/weapon/circuitboard/transhuman_clonepod - sort_string = "HAADA" - -/datum/design/circuit/transhuman_synthprinter - name = "SynthFab 3000" - id = "transhuman_synthprinter" - req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) - build_path = /obj/item/weapon/circuitboard/transhuman_synthprinter - sort_string = "HAADB" - -/datum/design/circuit/transhuman_resleever - name = "Resleeving pod" - id = "transhuman_resleever" - req_tech = list(TECH_ENGINEERING = 4, TECH_BIO = 4) - build_path = /obj/item/weapon/circuitboard/transhuman_resleever - sort_string = "HAADC" - -/datum/design/circuit/resleeving_control - name = "Resleeving control console" - id = "resleeving_control" - req_tech = list(TECH_DATA = 5) - build_path = /obj/item/weapon/circuitboard/resleeving_control - sort_string = "HAADE" - -/datum/design/circuit/body_designer - name = "Body design console" - id = "body_designer" - req_tech = list(TECH_DATA = 5) - build_path = /obj/item/weapon/circuitboard/body_designer - sort_string = "HAADF" - -/datum/design/circuit/partslathe - name = "Parts lathe" - id = "partslathe" - req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) - build_path = /obj/item/weapon/circuitboard/partslathe - sort_string = "HABAD" - -/datum/design/item/weapon/netgun - name = "\'Hunter\' capture gun" - id = "netgun" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 3000) - build_path = /obj/item/weapon/gun/energy/netgun - sort_string = "TAADF" - -/datum/design/circuit/algae_farm - name = "Algae Oxygen Generator" - id = "algae_farm" - req_tech = list(TECH_ENGINEERING = 3, TECH_BIO = 2) - build_path = /obj/item/weapon/circuitboard/algae_farm - sort_string = "HABAE" - -/datum/design/circuit/thermoregulator - name = "thermal regulator" - id = "thermoregulator" - req_tech = list(TECH_ENGINEERING = 4, TECH_POWER = 3) - build_path = /obj/item/weapon/circuitboard/thermoregulator - sort_string = "HABAF" - -/datum/design/circuit/bomb_tester - name = "Explosive Effect Simulator" - id = "bomb_tester" - req_tech = list(TECH_PHORON = 3, TECH_DATA = 2, TECH_MAGNET = 2) - build_path = /obj/item/weapon/circuitboard/bomb_tester - sort_string = "HABAG" - -/datum/design/circuit/quantum_pad - name = "Quantum Pad" - id = "quantum_pad" - req_tech = list(TECH_ENGINEERING = 4, TECH_POWER = 4, TECH_BLUESPACE = 4) - build_path = /obj/item/weapon/circuitboard/quantumpad - sort_string = "HABAH" - -//////Micro mech stuff -/datum/design/circuit/mecha/gopher_main - name = "'Gopher' central control" - id = "gopher_main" - build_path = /obj/item/weapon/circuitboard/mecha/gopher/main - sort_string = "NAAEA" - -/datum/design/circuit/mecha/gopher_peri - name = "'Gopher' peripherals control" - id = "gopher_peri" - build_path = /obj/item/weapon/circuitboard/mecha/gopher/peripherals - sort_string = "NAAEB" - -/datum/design/circuit/mecha/polecat_main - name = "'Polecat' central control" - id = "polecat_main" - req_tech = list(TECH_DATA = 4) - build_path = /obj/item/weapon/circuitboard/mecha/polecat/main - sort_string = "NAAFA" - -/datum/design/circuit/mecha/polecat_peri - name = "'Polecat' peripherals control" - id = "polecat_peri" - req_tech = list(TECH_DATA = 4) - build_path = /obj/item/weapon/circuitboard/mecha/polecat/peripherals - sort_string = "NAAFB" - -/datum/design/circuit/mecha/polecat_targ - name = "'Polecat' weapon control and targeting" - id = "polecat_targ" - req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) - build_path = /obj/item/weapon/circuitboard/mecha/polecat/targeting - sort_string = "NAAFC" - -/datum/design/circuit/mecha/weasel_main - name = "'Weasel' central control" - id = "weasel_main" - req_tech = list(TECH_DATA = 4) - build_path = /obj/item/weapon/circuitboard/mecha/weasel/main - sort_string = "NAAGA" - -/datum/design/circuit/mecha/weasel_peri - name = "'Weasel' peripherals control" - id = "weasel_peri" - req_tech = list(TECH_DATA = 4) - build_path = /obj/item/weapon/circuitboard/mecha/weasel/peripherals - sort_string = "NAAGB" - -/datum/design/circuit/mecha/weasel_targ - name = "'Weasel' weapon control and targeting" - id = "weasel_targ" - req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) - build_path = /obj/item/weapon/circuitboard/mecha/weasel/targeting - sort_string = "NAAGC" - -////// RIGSuit Stuff -/* -/datum/design/item/rig - req_tech = list(TECH_MATERIAL = 5, TECH_POWER = 5, TECH_MAGNET = 5) - materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 6000, "uranium" = 4000) - -/datum/design/item/rig/eva - name = "eva hardsuit (empty)" - id = "eva_hardsuit" - build_path = /obj/item/weapon/rig/eva - sort_string = "HCAAA" - -/datum/design/item/rig/mining - name = "industrial hardsuit (empty)" - id = "ind_hardsuit" - build_path = /obj/item/weapon/rig/industrial - sort_string = "HCAAB" - -/datum/design/item/rig/research - name = "ami hardsuit (empty)" - id = "ami_hardsuit" - build_path = /obj/item/weapon/rig/hazmat - sort_string = "HCAAC" - -/datum/design/item/rig/medical - name = "medical hardsuit (empty)" - id = "med_hardsuit" - build_path = /obj/item/weapon/rig/medical - sort_string = "HCAAD" -*/ - -/datum/design/item/rig_module - req_tech = list(TECH_MATERIAL = 5, TECH_POWER = 5, TECH_MAGNET = 5) - materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 4000, "uranium" = 2000) - -/datum/design/item/rig_module/plasma_cutter - name = "rig module - plasma cutter" - id = "rigmod_plasmacutter" - build_path = /obj/item/rig_module/device/plasmacutter - sort_string = "HCAAE" - -/datum/design/item/rig_module/diamond_drill - name = "rig module - diamond drill" - id = "rigmod_diamonddrill" - build_path = /obj/item/rig_module/device/drill - sort_string = "HCAAF" - -/datum/design/item/rig_module/maneuvering_jets - name = "rig module - maneuvering jets" - id = "rigmod_maneuveringjets" - build_path = /obj/item/rig_module/maneuvering_jets - sort_string = "HCAAG" - -/datum/design/item/rig_module/anomaly_scanner - name = "rig module - anomaly scanner" - id = "rigmod_anomalyscanner" - build_path = /obj/item/rig_module/device/anomaly_scanner - sort_string = "HCAAH" - -/datum/design/item/rig_module/orescanner - name = "rig module - ore scanner" - id = "rigmod_orescanner" - build_path = /obj/item/rig_module/device/orescanner - sort_string = "HCAAI" - -//Prosfab stuff for borgs and such - -/datum/design/item/robot_upgrade/sizeshift - name = "Size Alteration Module" - desc = "Used to allow robot to freely alter their size." - id = "borg_sizeshift_module" - req_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) - build_path = /obj/item/borg/upgrade/sizeshift \ No newline at end of file diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm index 199acd42fbd..0fdd3df5bef 100644 --- a/code/modules/research/mechfab_designs.dm +++ b/code/modules/research/mechfab_designs.dm @@ -570,6 +570,30 @@ materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 2000, "silver" = 3000, "phoron" = 5000, "glass" = 3750) build_path = /obj/item/mecha_parts/mecha_equipment/combat_shield +/datum/design/item/mecha/crisis_drone + name = "Crisis Drone" + desc = "Deploys a small medical drone capable of patching small wounds in order to stabilize nearby patients." + id = "mech_med_droid" + req_tech = list(TECH_PHORON = 3, TECH_MAGNET = 6, TECH_BIO = 5, TECH_DATA = 4, TECH_ARCANE = 1) + materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_GOLD = 2000, MAT_SILVER = 3000, MAT_VERDANTIUM = 2500, MAT_GLASS = 3000) + build_path = /obj/item/mecha_parts/mecha_equipment/crisis_drone + +/datum/design/item/mecha/rad_drone + name = "Hazmat Drone" + desc = "Deploys a small hazmat drone capable of purging minor radiation damage in order to stabilize nearby patients." + id = "mech_rad_droid" + req_tech = list(TECH_PHORON = 4, TECH_MAGNET = 5, TECH_BIO = 6, TECH_DATA = 4, TECH_ARCANE = 1) + materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_GOLD = 2000, MAT_URANIUM = 3000, MAT_VERDANTIUM = 2500, MAT_GLASS = 3000) + build_path = /obj/item/mecha_parts/mecha_equipment/crisis_drone/rad + +/datum/design/item/mecha/medanalyzer + name = "Mounted Body Scanner" + desc = "An advanced mech-mounted device that is not quite as powerful as a stationary body scanner, though still suitably powerful." + id = "mech_med_analyzer" + req_tech = list(TECH_PHORON = 4, TECH_MAGNET = 5, TECH_BIO = 5, TECH_DATA = 4) + materials = list(MAT_PLASTEEL = 4500, MAT_GOLD = 2000, MAT_URANIUM = 3000, MAT_GLASS = 3000) + build_path = /obj/item/mecha_parts/mecha_equipment/tool/powertool/medanalyzer + /datum/design/item/mecha/jetpack name = "Ion Jetpack" desc = "Using directed ion bursts and cunning solar wind reflection technique, this device enables controlled space flight." diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm index 305bae7df2f..75c691dbd86 100644 --- a/code/modules/research/prosfab_designs.dm +++ b/code/modules/research/prosfab_designs.dm @@ -202,6 +202,21 @@ materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 1000) // req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2) +/datum/design/item/prosfab/pros/internal/spleen + name = "Prosthetic Spleen" + id = "pros_spleen" + build_path = /obj/item/organ/internal/spleen + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 3000, MAT_GLASS = 750) +// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2) + +/datum/design/item/prosfab/pros/internal/larynx + name = "Prosthetic Larynx" + id = "pros_larynx" + build_path = /obj/item/organ/internal/voicebox + time = 15 + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_GLASS = 750, MAT_PLASTIC = 500) + //////////////////// Cyborg Parts //////////////////// /datum/design/item/prosfab/cyborg category = "Cyborg Parts" diff --git a/code/modules/research/prosfab_designs_vr.dm b/code/modules/research/prosfab_designs_vr.dm new file mode 100644 index 00000000000..02f39bd3075 --- /dev/null +++ b/code/modules/research/prosfab_designs_vr.dm @@ -0,0 +1,8 @@ +//Prosfab stuff for borgs and such + +/datum/design/item/prosfab/robot_upgrade/sizeshift + name = "Size Alteration Module" + id = "borg_sizeshift_module" + req_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/borg/upgrade/sizeshift \ No newline at end of file diff --git a/code/modules/research/rigs_vr.dm b/code/modules/research/rigs_vr.dm new file mode 100644 index 00000000000..24c02d3fdd1 --- /dev/null +++ b/code/modules/research/rigs_vr.dm @@ -0,0 +1,123 @@ +/* + O - rigsuit stuff + OA - rigs themselves + OB - rig modules + OBAA - general purpose + OBAB - mining + OBAC - medical + OBAD - sec/combat + OBAE - engineering/maintenance/cleaning +*/ + + +////// RIGSuit Stuff +/* +/datum/design/item/rig + req_tech = list(TECH_MATERIAL = 5, TECH_POWER = 5, TECH_MAGNET = 5) + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 6000, "uranium" = 4000) + +/datum/design/item/rig/AssembleDesignName() + ..() + name = "hardsuit prototype ([name])" + +/datum/design/item/rig/eva + name = "eva hardsuit (empty)" + id = "eva_hardsuit" + build_path = /obj/item/weapon/rig/eva + sort_string = "OAAAA" + +/datum/design/item/rig/mining + name = "industrial hardsuit (empty)" + id = "ind_hardsuit" + build_path = /obj/item/weapon/rig/industrial + sort_string = "OAAAB" + +/datum/design/item/rig/research + name = "ami hardsuit (empty)" + id = "ami_hardsuit" + build_path = /obj/item/weapon/rig/hazmat + sort_string = "OAAAC" + +/datum/design/item/rig/medical + name = "medical hardsuit (empty)" + id = "med_hardsuit" + build_path = /obj/item/weapon/rig/medical + sort_string = "OAAAD" +*/ + +/datum/design/item/rig_module + req_tech = list(TECH_MATERIAL = 5, TECH_POWER = 5, TECH_MAGNET = 5) + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 4000, "uranium" = 2000) + +/datum/design/item/rig_module/AssembleDesignName() + ..() + name = "rig module prototype ([name])" + +/datum/design/item/rig_module/maneuvering_jets + name = "maneuvering jets" + id = "rigmod_maneuveringjets" + build_path = /obj/item/rig_module/maneuvering_jets + sort_string = "OBAAA" + +/datum/design/item/rig_module/sprinter + name = "sprinter" + id = "rigmod_sprinter" + build_path = /obj/item/rig_module/sprinter + sort_string = "OBAAB" + +/datum/design/item/rig_module/plasma_cutter + name = "plasma cutter" + id = "rigmod_plasmacutter" + build_path = /obj/item/rig_module/device/plasmacutter + sort_string = "OBABA" + +/datum/design/item/rig_module/diamond_drill + name = "diamond drill" + id = "rigmod_diamonddrill" + build_path = /obj/item/rig_module/device/drill + sort_string = "OBABB" + +/datum/design/item/rig_module/anomaly_scanner + name = "anomaly scanner" + id = "rigmod_anomalyscanner" + build_path = /obj/item/rig_module/device/anomaly_scanner + sort_string = "OBABC" + +/datum/design/item/rig_module/orescanner + name = "ore scanner" + id = "rigmod_orescanner" + build_path = /obj/item/rig_module/device/orescanner + sort_string = "OBABD" + +/datum/design/item/rig_module/rescue_pharm + name = "rescue pharm" + id = "rigmod_rescue_pharm" + build_path = /obj/item/rig_module/rescue_pharm + sort_string = "OBACA" + +/datum/design/item/rig_module/lasercannon + name = "laser cannon" + id = "rigmod_lasercannon" + build_path = /obj/item/rig_module/mounted + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 4000, "uranium" = 2000, "diamond" = 2000) + sort_string = "OBADA" + +/datum/design/item/rig_module/egun + name = "energy gun" + id = "rigmod_egun" + build_path = /obj/item/rig_module/mounted/egun + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 4000, "uranium" = 2000, "diamond" = 1000) + sort_string = "OBADB" + +/datum/design/item/rig_module/taser + name = "taser" + id = "rigmod_taser" + build_path = /obj/item/rig_module/mounted/taser + sort_string = "OBADC" + +/datum/design/item/rig_module/rcd + name = "rcd" + id = "rigmod_rcd" + build_path = /obj/item/rig_module/device/rcd + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 4000, "uranium" = 2000, "diamond" = 2000) + sort_string = "OBAEA" \ No newline at end of file diff --git a/code/modules/research/teleport_vr.dm b/code/modules/research/teleport_vr.dm new file mode 100644 index 00000000000..5437e96bdd1 --- /dev/null +++ b/code/modules/research/teleport_vr.dm @@ -0,0 +1,23 @@ +/* + P - teleporteing item stuff +*/ + +/datum/design/item/teleport/AssembleDesignName() + ..() + name = "Teleportation device prototype ([item_name])" + +/datum/design/item/teleport/translocator + name = "Personal translocator" + id = "translocator" + req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_ILLEGAL = 6) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "uranium" = 4000, "diamond" = 2000) + build_path = /obj/item/device/perfect_tele + sort_string = "PAAAA" + +/datum/design/item/teleport/bluespace_crystal + name = "Artificial Bluespace Crystal" + id = "bluespace_crystal" + req_tech = list(TECH_BLUESPACE = 3, TECH_PHORON = 4) + materials = list("diamond" = 1500, "phoron" = 1500) + build_path = /obj/item/weapon/ore/bluespace_crystal/artificial + sort_string = "PAAAB" \ No newline at end of file diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm index 501a8c86703..57bc50683ac 100644 --- a/code/modules/resleeving/machines.dm +++ b/code/modules/resleeving/machines.dm @@ -85,7 +85,7 @@ H.add_modifier(modifier_type) //Apply damage - H.adjustCloneLoss((H.getMaxHealth() - config.health_threshold_dead)*0.75) + H.adjustCloneLoss((H.getMaxHealth() - config.health_threshold_dead)*-0.75) H.Paralyse(4) H.updatehealth() diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm index 35136917064..4e03024a01c 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -134,7 +134,7 @@ if (!hasorgans(target)) return var/obj/item/organ/external/affected = target.get_organ(target_zone) - return ..() && affected && affected.open == 3 + return (..() && affected && affected.open == 3) /datum/surgery_step/open_encased/close/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if (!hasorgans(target)) @@ -214,4 +214,94 @@ var/self_msg = "You applied \the [tool] to [target]'s [affected.encased]." user.visible_message(msg, self_msg) - affected.open = 2 \ No newline at end of file + affected.open = 2 + +/////////////////////////////////////////////////////////////// +// Saw/Retractor/Gel Combi-open and close. +/////////////////////////////////////////////////////////////// +/datum/surgery_step/open_encased/advancedsaw_open + allowed_tools = list( + /obj/item/weapon/surgical/circular_saw/manager = 100 + ) + + priority = 3 + + min_duration = 60 + max_duration = 90 + +/datum/surgery_step/open_encased/advancedsaw_open/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return + var/obj/item/organ/external/affected = target.get_organ(target_zone) + return ..() && affected && affected.open >= 2 && affected.open < 3 + +/datum/surgery_step/open_encased/advancedsaw_open/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return + var/obj/item/organ/external/affected = target.get_organ(target_zone) + + user.visible_message("[user] begins to open [target]'s [affected.encased] with \the [tool].", \ + "You begin to open [target]'s [affected.encased] with \the [tool].") + target.custom_pain("Something hurts horribly in your [affected.name]!", 60) + ..() + +/datum/surgery_step/open_encased/advancedsaw_open/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return + var/obj/item/organ/external/affected = target.get_organ(target_zone) + + user.visible_message("[user] has cut [target]'s [affected.encased] wide open with \the [tool].", \ + "You have cut [target]'s [affected.encased] wide open with \the [tool].") + affected.open = 3 + +/datum/surgery_step/open_encased/advancedsaw_open/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return + var/obj/item/organ/external/affected = target.get_organ(target_zone) + + user.visible_message("[user]'s hand slips, searing [target]'s [affected.encased] with \the [tool]!" , \ + "Your hand slips, searing [target]'s [affected.encased] with \the [tool]!" ) + + affected.createwound(CUT, 20) + affected.createwound(BURN, 15) + if(prob(affected.damage)) + affected.fracture() + + +/datum/surgery_step/open_encased/advancedsaw_mend + allowed_tools = list( + /obj/item/weapon/surgical/circular_saw/manager = 100 + ) + + priority = 3 + + min_duration = 30 + max_duration = 60 + +/datum/surgery_step/open_encased/advancedsaw_mend/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return + var/obj/item/organ/external/affected = target.get_organ(target_zone) + return (..() && affected && affected.open == 3) + +/datum/surgery_step/open_encased/advancedsaw_mend/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return + var/obj/item/organ/external/affected = target.get_organ(target_zone) + + var/msg = "[user] starts sealing \the [target]'s [affected.encased] with \the [tool]." + var/self_msg = "You start sealing \the [target]'s [affected.encased] with \the [tool]." + user.visible_message(msg, self_msg) + target.custom_pain("Something hurts horribly in your [affected.name]!", 100) + ..() + +/datum/surgery_step/open_encased/advancedsaw_mend/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!hasorgans(target)) + return + var/obj/item/organ/external/affected = target.get_organ(target_zone) + + var/msg = "[user] sealed \the [target]'s [affected.encased] with \the [tool]." + var/self_msg = "You sealed \the [target]'s [affected.encased] with \the [tool]." + user.visible_message(msg, self_msg) + + affected.open = 2 diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 2f2e1cb44ac..8d261f75351 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -394,6 +394,65 @@ "Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!") affected.createwound(BRUISE, 20) +/////////////////////////////////////////////////////////////// +// Organ Ripping Surgery +/////////////////////////////////////////////////////////////// + +/datum/surgery_step/internal/rip_organ + + allowed_tools = list( + /obj/item/weapon/surgical/scalpel/ripper = 100 + ) + + priority = 3 + + blood_level = 3 + + min_duration = 60 + max_duration = 80 + +/datum/surgery_step/internal/rip_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!..()) + return 0 + + target.op_stage.current_organ = null + + var/list/removable_organs = list() + for(var/organ in target.internal_organs_by_name) + var/obj/item/organ/internal/I = target.internal_organs_by_name[organ] + if(istype(I) && I.parent_organ == target_zone) + removable_organs |= organ + + var/organ_to_remove = input(user, "Which organ do you want to remove?") as null|anything in removable_organs + if(!organ_to_remove) + return 0 + + target.op_stage.current_organ = organ_to_remove + return ..() + +/datum/surgery_step/internal/rip_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] starts ripping [target]'s [target.op_stage.current_organ] out with \the [tool].", \ + "You start ripping [target]'s [target.op_stage.current_organ] out with \the [tool].") + target.custom_pain("Someone's ripping out your [target.op_stage.current_organ]!", 100) + ..() + +/datum/surgery_step/internal/rip_organ/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] has ripped [target]'s [target.op_stage.current_organ] out with \the [tool].", \ + "You have ripped [target]'s [target.op_stage.current_organ] out with \the [tool].") + + // Extract the organ! + if(target.op_stage.current_organ) + var/obj/item/organ/O = target.internal_organs_by_name[target.op_stage.current_organ] + if(O && istype(O)) + O.removed(user) + target.op_stage.current_organ = null + +/datum/surgery_step/internal/rip_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("[user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!", \ + "Your hand slips, damaging [target]'s [affected.name] with \the [tool]!") + affected.createwound(BRUISE, 20) + ////////////////////////////////////////////////////////////////// // HEART SURGERY // ////////////////////////////////////////////////////////////////// diff --git a/code/modules/tables/presets.dm b/code/modules/tables/presets.dm index 5d568d440e9..085489b26a4 100644 --- a/code/modules/tables/presets.dm +++ b/code/modules/tables/presets.dm @@ -58,6 +58,23 @@ material = get_material_by_name("wood") ..() +/obj/structure/table/sifwoodentable + icon_state = "plain_preview" + color = "#824B28" + +/obj/structure/table/sifwoodentable/New() + material = get_material_by_name("alien wood") + ..() + +/obj/structure/table/sifwooden_reinforced + icon_state = "reinf_preview" + color = "#824B28" + +/obj/structure/table/sifwooden_reinforced/New() + material = get_material_by_name("alien wood") + reinforced = get_material_by_name(DEFAULT_WALL_MATERIAL) + ..() + /obj/structure/table/gamblingtable icon_state = "gamble_preview" @@ -177,6 +194,18 @@ material = get_material_by_name("wood") ..() +/obj/structure/table/bench/sifwooden + icon_state = "plain_preview" + color = "#824B28" + +/obj/structure/table/bench/sifwooden/New() + material = get_material_by_name("alien wood") + ..() + +/obj/structure/table/bench/sifwooden/padded + icon_state = "padded_preview" + carpeted = 1 + /obj/structure/table/bench/padded icon_state = "padded_preview" diff --git a/code/modules/telesci/construction.dm b/code/modules/telesci/construction.dm index 9fc487f0580..6fee75ab1b1 100644 --- a/code/modules/telesci/construction.dm +++ b/code/modules/telesci/construction.dm @@ -30,43 +30,4 @@ /obj/item/weapon/ore/bluespace_crystal = 1, /obj/item/weapon/stock_parts/capacitor = 1, /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/stack/cable_coil = 5) - -// The Designs - -/datum/design/circuit/telesci_console - name = "Telepad Control Console" - id = "telesci_console" - req_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 3, TECH_PHORON = 4) - build_path = /obj/item/weapon/circuitboard/telesci_console - sort_string = "HAAEA" - -/datum/design/circuit/telesci_pad - name = "Telepad" - id = "telesci_pad" - req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) - build_path = /obj/item/weapon/circuitboard/telesci_pad - sort_string = "HAAEB" -/* Normal GPS has all the fancy features now -/datum/design/item/telesci_gps - name = "GPS device" - id = "telesci_gps" - req_tech = list(TECH_MATERIAL = 2, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 1000) - build_path = /obj/item/device/gps/advanced - sort_string = "HAAEB" -*/ -/datum/design/circuit/quantum_pad - name = "Quantum Pad" - id = "quantum_pad" - req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) - build_path = /obj/item/weapon/circuitboard/quantumpad - sort_string = "HAAC" - -/datum/design/item/bluespace_crystal - name = "Artificial Bluespace Crystal" - id = "bluespace_crystal" - req_tech = list(TECH_BLUESPACE = 3, TECH_PHORON = 4) - materials = list("diamond" = 1500, "phoron" = 1500) - build_path = /obj/item/weapon/ore/bluespace_crystal/artificial - sort_string = "HAAED" \ No newline at end of file + /obj/item/stack/cable_coil = 5) \ No newline at end of file diff --git a/code/modules/tension/tension.dm b/code/modules/tension/tension.dm index 82151a7e78f..aa956628495 100644 --- a/code/modules/tension/tension.dm +++ b/code/modules/tension/tension.dm @@ -24,7 +24,7 @@ will_point_blank = ai_holder.pointblank var/potential_damage = 0 - if(!projectiletype || ( get_dist(src, threatened >= 1) && !will_point_blank ) ) // Melee damage. + if(!projectiletype || ( ( get_dist(src, threatened) >= 1) && !will_point_blank ) ) // Melee damage. potential_damage = (melee_damage_lower + melee_damage_upper) / 2 // Treat potential_damage as estimated DPS. If the enemy attacks twice as fast as usual, it will double the number. @@ -69,7 +69,7 @@ var/friendly = threatened.faction == faction - var/threat = guess_threat_level() + var/threat = guess_threat_level(threatened) // Hurt entities contribute less tension. threat *= health @@ -99,7 +99,120 @@ return threat +// Carbon / mostly Human threat check. +/mob/living/carbon/get_threat(var/mob/living/threatened) + . = ..() + if(has_AI()) + if(!ai_holder.hostile) + return 0 + + if(incapacitated(INCAPACITATION_DISABLED)) + return 0 + + var/friendly = (IIsAlly(threatened) && a_intent == I_HELP) + + var/threat = guess_threat_level(threatened) + + threat *= health + threat /= getMaxHealth() + + // Allies reduce tension instead of adding. + if(friendly) + threat = -threat + + else + if(threatened.invisibility > see_invisible) + threat /= 2 // Target cannot be seen by src. + if(invisibility > threatened.see_invisible) + threat *= 2 // Target cannot see src. + + // Handle statuses. + if(confused) + threat /= 2 + + if(has_modifier_of_type(/datum/modifier/berserk)) + threat *= 2 + + return threat + +/mob/living/carbon/guess_threat_level(var/mob/living/threatened) + var/threat_guess = 0 + + // First lets consider their attack ability. + var/will_point_blank = FALSE + if(has_AI()) + will_point_blank = ai_holder.pointblank + + . = ..() + + var/obj/item/I = get_active_hand() + if(!I || !istype(I)) + var/damage_guess = 0 + if(ishuman(src) && ishuman(threatened)) + var/mob/living/carbon/human/H = src + var/datum/unarmed_attack/attack = H.get_unarmed_attack(threatened, BP_TORSO) + if(!attack) + damage_guess += 5 + + var/punch_damage = attack.get_unarmed_damage(H) + if(H.gloves) + if(istype(H.gloves, /obj/item/clothing/gloves)) + var/obj/item/clothing/gloves/G = H.gloves + punch_damage += G.punch_force + + damage_guess += punch_damage + + else + damage_guess += 5 + + for(var/datum/modifier/M in modifiers) + if(!isnull(M.outgoing_melee_damage_percent)) + damage_guess *= M.outgoing_melee_damage_percent + + threat_guess += damage_guess + + else + var/weapon_attack_speed = get_attack_speed(I) / (1 SECOND) + var/weapon_damage = I.force + + for(var/datum/modifier/M in modifiers) + if(!isnull(M.outgoing_melee_damage_percent)) + weapon_damage *= M.outgoing_melee_damage_percent + + if(istype(I, /obj/item/weapon/gun)) + will_point_blank = TRUE + var/obj/item/weapon/gun/G = I + var/obj/item/projectile/P + + P = new G.projectile_type() + + if(P) // Does the gun even have a projectile type? + weapon_damage = P.damage + if(will_point_blank && a_intent == I_HURT) + weapon_damage *= 1.5 + weapon_attack_speed = G.fire_delay / (1 SECOND) + qdel(P) + + var/average_damage = weapon_damage / weapon_attack_speed + + threat_guess += average_damage + + // Consider intent. + switch(a_intent) + if(I_HELP) // Not likely to fight us. + threat_guess *= 0.4 + if(I_DISARM) // Might engage us, but unlikely to be with the intent to kill. + threat_guess *= 0.8 + if(I_GRAB) // May try to restrain us. This is here for reference, or later tweaking if needed. + threat_guess *= 1 + if(I_HURT) // May try to hurt us. + threat_guess *= 1.25 + + // Then consider their defense. + threat_guess += getMaxHealth() / 5 // 100 health translates to 20 threat. + + return threat_guess // Gives a rough idea of how much danger someone is in. Meant to be used for PvE things since PvP has too many unknown variables. /mob/living/proc/get_tension() diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 45cbcd7a13b..46e838d37a2 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -1,7 +1,7 @@ /obj/vehicle/train/engine name = "cargo train tug" desc = "A ridable electric car designed for pulling cargo trolleys." - icon = 'icons/obj/vehicles.dmi' + icon = 'icons/obj/vehicles_vr.dmi' //VOREStation Edit icon_state = "cargo_engine" on = 0 powered = 1 @@ -26,7 +26,7 @@ /obj/vehicle/train/trolley name = "cargo train trolley" - icon = 'icons/obj/vehicles.dmi' + icon = 'icons/obj/vehicles_vr.dmi' //VOREStation Edit icon_state = "cargo_trailer" anchored = 0 passenger_allowed = 0 @@ -34,7 +34,7 @@ load_item_visible = 1 load_offset_x = 0 - load_offset_y = 4 + load_offset_y = 7 //VOREStation Edit mob_offset_y = 8 //------------------------------------------- @@ -44,7 +44,7 @@ ..() cell = new /obj/item/weapon/cell/high(src) key = new key_type(src) - var/image/I = new(icon = 'icons/obj/vehicles.dmi', icon_state = "cargo_engine_overlay", layer = src.layer + 0.2) //over mobs + var/image/I = new(icon = 'icons/obj/vehicles_vr.dmi', icon_state = "cargo_engine_overlay", layer = src.layer + 0.2) //over mobs //VOREStation edit overlays += I turn_off() //so engine verbs are correctly set @@ -374,3 +374,17 @@ anchored = 0 else anchored = 1 + +// VOREStation Edit Start - Overlay stuff for the chair-like effect +/obj/vehicle/train/engine/update_icon() + ..() + overlays = null + var/image/O = image(icon = 'icons/obj/vehicles_vr.dmi', icon_state = "cargo_engine_overlay", dir = src.dir) + O.layer = FLY_LAYER + O.plane = MOB_PLANE + overlays += O + +/obj/vehicle/train/engine/set_dir() + ..() + update_icon() +// VOREStation Edit End - Overlay stuff for the chair-like effect diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm index 301d0841be6..d4fd1f13dcf 100644 --- a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm @@ -153,12 +153,18 @@ //Messages for smalls moving under larges var/msg_owner_stepunder = "%owner runs between your legs." //Weird becuase in the case this is used, %owner is the 'bumper' (src) var/msg_prey_stepunder = "You run between %prey's legs." //Same, inverse + hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. + clip_mask_icon = 'icons/mob/vore/taurs_vr.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. /datum/sprite_accessory/tail/taur/roiz_long_lizard // Not ACTUALLY a taur, but it uses 32x64 so it wouldn't fit in tails.dmi, and having it as a tail bugs up the sprite. name = "Long Lizard Tail (Roiz Lizden)" icon_state = "roiz_tail_s" do_colouration = 0 ckeys_allowed = list("spoopylizz") + hide_body_parts = null + clip_mask_icon = null + clip_mask_state = null /datum/sprite_accessory/tail/taur/wolf name = "Wolf (Taur)" @@ -438,6 +444,7 @@ ckeys_allowed = list("natje") do_colouration = 0 can_ride = 0 + clip_mask_state = "taur_clip_mask_alraune" msg_prey_stepunder = "You run between %prey's vines." @@ -468,4 +475,26 @@ ckeys_allowed = null do_colouration = 1 extra_overlay = "alraunecolor_markings" - extra_overlay_w = "alraunecolor_closed_markings" \ No newline at end of file + extra_overlay_w = "alraunecolor_closed_markings" + clip_mask_state = "taur_clip_mask_alraune" + +/datum/sprite_accessory/tail/taur/wasp + name = "Wasp (dual color)" + icon_state = "wasp_s" + extra_overlay = "wasp_markings" + clip_mask_state = "taur_clip_mask_wasp" + + msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!" + + msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor!" + msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor!" + + msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" + msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!" diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index 50b8d763a2f..efdb36d628a 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -653,6 +653,9 @@ var/desc = "You should not see this..." var/ani_state // State when wagging/animated var/extra_overlay_w // Wagging state for extra overlay + var/list/hide_body_parts = list() //Uses organ tag defines. Bodyparts in this list do not have their icons rendered, allowing for more spriter freedom when doing taur/digitigrade stuff. + var/icon/clip_mask_icon = null //Icon file used for clip mask. + var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits. /datum/sprite_accessory/tail/invisible name = "hide species-sprite tail" @@ -950,6 +953,9 @@ icon_state = "satyr" color_blend_mode = ICON_MULTIPLY do_colouration = 1 + hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. + clip_mask_icon = 'icons/mob/vore/taurs_vr.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. /datum/sprite_accessory/tail/tailmaw name = "tailmaw, colorable" @@ -976,6 +982,16 @@ do_colouration = 1 color_blend_mode = ICON_MULTIPLY +/datum/sprite_accessory/tail/sneptail + name = "Snep/Furry Tail (vwag)" + desc = "" + icon_state = "sneptail" + ani_state = "sneptail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sneptail_mark" + extra_overlay_w = "sneptail_mark_w" + /datum/sprite_accessory/tail/tiger_new name = "tiger tail (vwag)" desc = "" diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 6547aacd23f..0afa43f6494 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -1,4 +1,5 @@ #define VORE_SOUND_FALLOFF 0.1 +#define VORE_SOUND_RANGE 3 // // Belly system 2.0, now using objects instead of datums because EH at datums. @@ -20,25 +21,28 @@ var/emote_time = 60 SECONDS // How long between stomach emotes at prey var/digest_brute = 2 // Brute damage per tick in digestion mode var/digest_burn = 2 // Burn damage per tick in digestion mode - var/immutable = 0 // Prevents this belly from being deleted - var/escapable = 0 // Belly can be resisted out of at any time + var/immutable = FALSE // Prevents this belly from being deleted + var/escapable = FALSE // Belly can be resisted out of at any time var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles var/absorbchance = 0 // % Chance of stomach beginning to absorb if prey struggles var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles. var/transferchance = 0 // % Chance of prey being - var/can_taste = 0 // If this belly prints the flavor of prey when it eats someone. + var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone. var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine. var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to. var/transferlocation // Location that the prey is released if they struggle and get dropped off. - var/release_sound = TRUE // Boolean for now, maybe replace with something else later + var/release_sound = "Splatter" // Sound for letting someone out. Replaced from True/false var/mode_flags = 0 // Stripping, numbing, etc. + var/fancy_vore = FALSE // Using the new sounds? + var/is_wet = TRUE // Is this belly's insides made of slimy parts? + var/wet_loop = TRUE // Does the belly have a fleshy loop playing? //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. //Actual full digest modes var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL) //Digest mode addon flags - var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS) + var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS, "Muffles" = DM_FLAG_THICKBELLY) //Transformation modes var/tmp/static/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG) //Item related modes @@ -54,6 +58,7 @@ var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again. var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a belly controller tick # var/tmp/recent_sound = FALSE // Prevent audio spam + var/tmp/list/hearing_mobs // Don't forget to watch your commas at the end of each line if you change these. var/list/struggle_messages_outside = list( @@ -147,7 +152,11 @@ "item_digest_mode", "contaminates", "contamination_flavor", - "contamination_color" + "contamination_color", + "release_sound", + "fancy_vore", + "is_wet", + "wet_loop" ) /obj/belly/New(var/newloc) @@ -175,7 +184,11 @@ //Sound w/ antispam flag setting if(vore_sound && !recent_sound) - var/soundfile = vore_sounds[vore_sound] + var/soundfile + if(!fancy_vore) + soundfile = classic_vore_sounds[vore_sound] + else + soundfile = fancy_vore_sounds[vore_sound] if(soundfile) playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises) recent_sound = TRUE @@ -196,7 +209,7 @@ //Don't bother if we don't have contents if(!contents.len) - return 0 + return FALSE //Find where we should drop things into (certainly not the owner) var/count = 0 @@ -212,14 +225,19 @@ //Clean up our own business items_preserved.Cut() - if(isanimal(owner)) + if(!ishuman(owner)) owner.update_icons() //Print notifications/sound if necessary if(!silent) owner.visible_message("[owner] expels everything from their [lowertext(name)]!") - if(release_sound) - playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises) + var/soundfile + if(!fancy_vore) + soundfile = classic_release_sounds[release_sound] + else + soundfile = fancy_release_sounds[release_sound] + if(soundfile) + playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises) return count @@ -232,12 +250,17 @@ //Place them into our drop_location M.forceMove(drop_location()) + items_preserved -= M //Special treatment for absorbed prey - if(istype(M,/mob/living)) + if(isliving(M)) var/mob/living/ML = M var/mob/living/OW = owner + if(ML.client) + ML.stop_sound_channel(CHANNEL_PREYLOOP) //Stop the internal loop, it'll restart if the isbelly check on next tick anyway + if(ML.muffled) + ML.muffled = 0 if(ML.absorbed) ML.absorbed = FALSE if(ishuman(M) && ishuman(OW)) @@ -250,14 +273,19 @@ Pred.bloodstr.trans_to(Prey, Pred.reagents.total_volume / absorbed_count) //Clean up our own business - if(isanimal(owner)) + if(!ishuman(owner)) owner.update_icons() //Print notifications/sound if necessary if(!silent) owner.visible_message("[owner] expels [M] from their [lowertext(name)]!") - if(release_sound) - playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises) + var/soundfile + if(!fancy_vore) + soundfile = classic_release_sounds[release_sound] + else + soundfile = fancy_release_sounds[release_sound] + if(soundfile) + playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises) return 1 @@ -401,6 +429,8 @@ else if(M.reagents) M.reagents.trans_to_holder(Pred.bloodstr, M.reagents.total_volume, 0.5, TRUE) + //Incase they have the loop going, let's double check to stop it. + M.stop_sound_channel(CHANNEL_PREYLOOP) // Delete the digested mob qdel(M) @@ -513,9 +543,17 @@ M.show_message(struggle_outer_message, 2) // hearable to_chat(R,struggle_user_message) - var/strpick = pick(struggle_sounds) - var/strsound = struggle_sounds[strpick] - playsound(src, strsound, vary = 1, vol = 100, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises) + var/sound/struggle_snuggle + var/sound/struggle_rustle = sound(get_sfx("rustle")) + + if(is_wet) + if(!fancy_vore) + struggle_snuggle = sound(get_sfx("classic_struggle_sounds")) + else + struggle_snuggle = sound(get_sfx("fancy_prey_struggle")) + playsound(src, struggle_snuggle, vary = 1, vol = 75, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises) + else + playsound(src, struggle_rustle, vary = 1, vol = 75, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises) if(escapable) //If the stomach has escapable enabled. if(prob(escapechance)) //Let's have it check to see if the prey escapes first. @@ -599,7 +637,11 @@ I.gurgle_contaminate(target.contents, target.contamination_flavor, target.contamination_color) items_preserved -= content if(!silent && target.vore_sound && !recent_sound) - var/soundfile = vore_sounds[target.vore_sound] + var/soundfile + if(!fancy_vore) + soundfile = classic_vore_sounds[target.vore_sound] + else + soundfile = fancy_vore_sounds[target.vore_sound] if(soundfile) playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises) owner.updateVRPanel() @@ -637,6 +679,10 @@ dupe.contaminates = contaminates dupe.contamination_flavor = contamination_flavor dupe.contamination_color = contamination_color + dupe.release_sound = release_sound + dupe.fancy_vore = fancy_vore + dupe.is_wet = is_wet + dupe.wet_loop = wet_loop //// Object-holding variables //struggle_messages_outside - strings diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 886ca5830c0..39f480fda50 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -24,6 +24,35 @@ if(M.digestable || digest_mode != DM_DIGEST) // don't give digesty messages to indigestible people to_chat(M,"[pick(EL)]") +///////////////////// Prey Loop Refresh/hack ////////////////////// + for(var/mob/living/M in contents) + M.stop_sound_channel(CHANNEL_PREYLOOP) // sanity just in case, because byond is whack and you can't trust it + if(isbelly(M.loc)) //sanity check + if(world.time > M.next_preyloop) //We don't want it to overlap, but we also want it to replay. + if(is_wet && wet_loop) // Is it a fleshy environment, and does the pred have a fleshy heartbeat loop to play? + if(!M.client) + continue + if(M.is_preference_enabled(/datum/client_preference/digestion_noises)) //then we check if the mob has sounds enabled at all + var/sound/preyloop = sound('sound/vore/sunesound/prey/loop.ogg') + M.playsound_local(get_turf(src),preyloop, 80,0, channel = CHANNEL_PREYLOOP) + M.next_preyloop = (world.time + (52 SECONDS)) + +/////////////////////////// Sound Selections /////////////////////////// + var/sound/prey_digest + var/sound/prey_death + var/sound/pred_digest + var/sound/pred_death + if(!fancy_vore) + prey_digest = sound(get_sfx("classic_digestion_sounds")) + prey_death = sound(get_sfx("classic_death_sounds")) + pred_digest = sound(get_sfx("classic_digestion_sounds")) + pred_death = sound(get_sfx("classic_death_sounds")) + else + prey_digest = sound(get_sfx("fancy_digest_prey")) + prey_death = sound(get_sfx("fancy_death_prey")) + pred_digest = sound(get_sfx("fancy_digest_pred")) + pred_death = sound(get_sfx("fancy_death_pred")) + /////////////////////////// Exit Early //////////////////////////// var/list/touchable_atoms = contents - items_preserved if(!length(touchable_atoms)) @@ -47,7 +76,7 @@ else items_preserved |= I if(prob(25)) //Less often than with normal digestion - play_sound = pick(digestion_sounds) + play_sound = pick(pred_digest) else if(item_digest_mode == IM_DIGEST) if(I.digest_stage && I.digest_stage > 0) digest_item(I) @@ -56,7 +85,7 @@ did_an_item = TRUE to_update = TRUE if(prob(25)) //Less often than with normal digestion - play_sound = pick(digestion_sounds) + play_sound = pick(pred_digest) //Handle eaten mobs else if(isliving(A)) @@ -75,6 +104,11 @@ if(H.bloodstr.get_reagent_amount("numbenzyme") < 2) H.bloodstr.add_reagent("numbenzyme",4) + //Thickbelly flag + if(mode_flags & DM_FLAG_THICKBELLY) + if(!(H.muffled)) + H.muffled = 1 + //Stripping flag if(mode_flags & DM_FLAG_STRIPPING) for(var/slot in slots) @@ -91,11 +125,15 @@ else items_preserved |= I if(prob(25)) //Less often than with normal digestion - play_sound = pick(digestion_sounds) + if(L && L.client && L.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(L,prey_digest) + play_sound = pick(pred_digest) else if(item_digest_mode == IM_DIGEST) digest_item(I) if(prob(25)) //Less often than with normal digestion - play_sound = pick(digestion_sounds) + if(L && L.client && L.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(L,prey_digest) + play_sound = pick(pred_digest) to_update = TRUE break //get rid of things like blood drops and gibs that end up in there @@ -110,7 +148,10 @@ else if(digest_mode == DM_DIGEST) if(prob(50)) //Was SO OFTEN. AAAA. - play_sound = pick(digestion_sounds) + for(var/mob/M in contents) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) for (var/target in touchable_mobs) var/mob/living/M = target @@ -137,11 +178,14 @@ to_chat(owner,"" + digest_alert_owner + "") to_chat(M,"" + digest_alert_prey + "") - play_sound = pick(death_sounds) + play_sound = pick(pred_death) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_death) if((mode_flags & DM_FLAG_LEAVEREMAINS) && M.digest_leave_remains) handle_remains_leaving(M) digestion_death(M) - owner.update_icons() + if(!ishuman(owner)) + owner.update_icons() if(compensation > 0) if(isrobot(owner)) var/mob/living/silicon/robot/R = owner @@ -178,7 +222,9 @@ for (var/target in touchable_mobs) var/mob/living/M = target if(prob(10)) //Less often than gurgles. People might leave this on forever. - play_sound = pick(digestion_sounds) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) if(M.absorbed) continue @@ -211,7 +257,9 @@ var/mob/living/M = target if(prob(10)) //Less often than gurgles. People might leave this on forever. - play_sound = pick(digestion_sounds) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) if(M.nutrition >= 100) //Drain them until there's no nutrients left. var/oldnutrition = (M.nutrition * 0.05) @@ -225,7 +273,9 @@ var/mob/living/M = target if(prob(10)) //Infinite gurgles! - play_sound = pick(digestion_sounds) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) if(M.size_multiplier > shrink_grow_size) //Shrink until smol. M.resize(M.size_multiplier-0.01) //Shrink by 1% per tick. @@ -242,7 +292,9 @@ var/mob/living/M = target if(prob(10)) - play_sound = pick(digestion_sounds) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) if(M.size_multiplier < shrink_grow_size) //Grow until large. M.resize(M.size_multiplier+0.01) //Grow by 1% per tick. @@ -256,7 +308,9 @@ var/mob/living/M = target if(prob(10)) - play_sound = pick(digestion_sounds) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) if(M.size_multiplier > shrink_grow_size && owner.size_multiplier < 2) //Grow until either pred is large or prey is small. owner.resize(owner.size_multiplier+0.01) //Grow by 1% per tick. @@ -271,7 +325,10 @@ else if(digest_mode == DM_HEAL) if(prob(50)) //Wet heals! The secret is you can leave this on for gurgle noises for fun. - play_sound = pick(digestion_sounds) + for(var/mob/M in contents) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) for (var/target in touchable_mobs) var/mob/living/M = target @@ -298,7 +355,18 @@ /////////////////////////// Make any noise /////////////////////////// if(play_sound) - playsound(src, play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) + LAZYCLEARLIST(hearing_mobs) + for(var/mob/M in hearers(VORE_SOUND_RANGE, owner)) + if(!M.client || !(M.is_preference_enabled(/datum/client_preference/digestion_noises))) + continue + LAZYADD(hearing_mobs, M) + for(var/mob/M in hearing_mobs) //so we don't fill the whole room with the sound effect + if(M && M.client && (isturf(M.loc) || (M.loc != src.contents))) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check + if(fancy_vore) + M.playsound_local(owner.loc, play_sound, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF) + else + M.playsound_local(owner.loc, play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF) + //these are all external sound triggers now, so it's ok. if(to_update) for(var/mob/living/M in contents) if(M.client) diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm index 2467f5aaa29..e9cf239e665 100644 --- a/code/modules/vore/eating/digest_act_vr.dm +++ b/code/modules/vore/eating/digest_act_vr.dm @@ -108,9 +108,9 @@ if((. = ..())) if(isbelly(item_storage)) var/obj/belly/B = item_storage - . += 5 * (B.digest_brute + B.digest_burn) + . += 2 * (B.digest_brute + B.digest_burn) else - . += 70 //Organs give a little more + . += 30 //Organs give a little more /obj/item/weapon/storage/digest_act(var/atom/movable/item_storage = null) for(var/obj/item/I in contents) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index f372ebe37d1..fd361677cc0 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -1,12 +1,14 @@ ///////////////////// Mob Living ///////////////////// /mob/living - var/digestable = 1 // Can the mob be digested inside a belly? - var/digest_leave_remains = 0 // Will this mob leave bones/skull/etc after the melty demise? - var/allowmobvore = 1 // Will simplemobs attempt to eat the mob? - var/showvoreprefs = 1 // Determines if the mechanical vore preferences button will be displayed on the mob or not. + var/digestable = TRUE // Can the mob be digested inside a belly? + var/devourable = TRUE // Can the mob be devoured at all? + var/feeding = TRUE // Can the mob be vorishly force fed or fed to others? + var/digest_leave_remains = FALSE // Will this mob leave bones/skull/etc after the melty demise? + var/allowmobvore = TRUE // Will simplemobs attempt to eat the mob? + var/showvoreprefs = TRUE // Determines if the mechanical vore preferences button will be displayed on the mob or not. var/obj/belly/vore_selected // Default to no vore capability. var/list/vore_organs = list() // List of vore containers inside a mob - var/absorbed = 0 // If a mob is absorbed into another + var/absorbed = FALSE // If a mob is absorbed into another var/weight = 137 // Weight for mobs for weightgain system var/weight_gain = 1 // How fast you gain weight var/weight_loss = 0.5 // How fast you lose weight @@ -15,15 +17,18 @@ var/revive_ready = REVIVING_READY // Only used for creatures that have the xenochimera regen ability, so far. var/metabolism = 0.0015 var/vore_taste = null // What the character tastes like - var/no_vore = 0 // If the character/mob can vore. - var/openpanel = 0 // Is the vore panel open? - var/noisy = 0 // Toggle audible hunger. + var/no_vore = FALSE // If the character/mob can vore. + var/openpanel = FALSE // Is the vore panel open? + var/noisy = FALSE // Toggle audible hunger. var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr. var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time. var/fuzzy = 1 // Preference toggle for sharp/fuzzy icon. var/tail_alt = 0 // Tail layer toggle. - var/can_be_drop_prey = 0 - var/can_be_drop_pred = 1 // Mobs are pred by default. + var/permit_healbelly = TRUE + var/can_be_drop_prey = FALSE + var/can_be_drop_pred = TRUE // Mobs are pred by default. + var/next_preyloop // For Fancy sound internal loop + var/adminbus_trash = FALSE // For abusing trash eater for event shenanigans. // // Hook for generic creation of stuff on new creatures @@ -33,7 +38,7 @@ M.verbs += /mob/living/proc/lick M.verbs += /mob/living/proc/switch_scaling if(M.no_vore) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach. - return 1 + return TRUE M.verbs += /mob/living/proc/insidePanel //Tries to load prefs if a client is present otherwise gives freebie stomach @@ -41,8 +46,8 @@ if(M) M.init_vore() - //Return 1 to hook-caller - return 1 + //return TRUE to hook-caller + return TRUE /mob/living/proc/init_vore() //Something else made organs, meanwhile. @@ -63,10 +68,10 @@ LAZYINITLIST(vore_organs) var/obj/belly/B = new /obj/belly(src) vore_selected = B - B.immutable = 1 + B.immutable = TRUE B.name = "Stomach" B.desc = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [name]." - B.can_taste = 1 + B.can_taste = TRUE return TRUE // @@ -91,29 +96,45 @@ var/mob/living/attacker = user // Typecast to living - // src is the mob clicked on + // src is the mob clicked on and attempted predator - ///// If grab clicked on grabber + ///// If user clicked on themselves if((src == G.assailant) && (is_vore_predator(src))) - if (src.feed_grabbed_to_self(src, G.affecting)) + if(!(G.affecting.devourable)) + to_chat(user, "They aren't able to be devoured.") + return FALSE + if(src.feed_grabbed_to_self(src, G.affecting)) qdel(G) - return 1 + return TRUE else log_debug("[attacker] attempted to feed [G.affecting] to [user] ([user.type]) but it failed.") - ///// If grab clicked on grabbed + ///// If user clicked on their grabbed target else if((src == G.affecting) && (attacker.a_intent == I_GRAB) && (attacker.zone_sel.selecting == BP_TORSO) && (is_vore_predator(G.affecting))) + if(!(G.affecting.feeding)) + to_chat(user, "[G.affecting] isn't willing to be fed.") + return FALSE if (attacker.feed_self_to_grabbed(attacker, G.affecting)) qdel(G) - return 1 + return TRUE else log_debug("[attacker] attempted to feed [user] to [G.affecting] ([G.affecting.type]) but it failed.") - ///// If grab clicked on anyone else + ///// If user clicked on anyone else but their grabbed target else if((src != G.affecting) && (src != G.assailant) && (is_vore_predator(src))) + if(!(src.feeding)) + to_chat(user, "[src] isn't willing to be fed.") + return FALSE + if(!(G.affecting.devourable)) + to_chat(user, "[G.affecting] isn't able to be devoured.") + return FALSE + if(!(G.affecting.feeding)) + to_chat(user, "[src] isn't able to be fed to someone.") + return FALSE + if (attacker.feed_grabbed_to_other(attacker, G.affecting, src)) qdel(G) - return 1 + return TRUE else log_debug("[attacker] attempted to feed [G.affecting] to [src] ([src.type]) but it failed.") @@ -121,7 +142,7 @@ else if(istype(I,/obj/item/weapon/holder)) var/obj/item/weapon/holder/H = I - if(!isliving(user)) return 0 // Return 0 to continue upper procs + if(!isliving(user)) return FALSE // return FALSE to continue upper procs var/mob/living/attacker = user // Typecast to living if (is_vore_predator(src)) @@ -129,7 +150,7 @@ if (attacker.eat_held_mob(attacker, M, src)) if (H.held_mob == M) H.held_mob = null - return 1 //Return 1 to exit upper procs + return TRUE //return TRUE to exit upper procs else log_debug("[attacker] attempted to feed [H.contents] to [src] ([src.type]) but it failed.") @@ -139,16 +160,16 @@ if(confirm == "Yes!") var/obj/belly/B = input("Which belly?","Select A Belly") as null|anything in vore_organs if(!istype(B)) - return 1 + return TRUE visible_message("[user] is trying to stuff a beacon into [src]'s [lowertext(B.name)]!","[user] is trying to stuff a beacon into you!") if(do_after(user,30,src)) user.drop_item() I.forceMove(B) - return 1 + return TRUE else - return 1 //You don't get to hit someone 'later' + return TRUE //You don't get to hit someone 'later' - return 0 + return FALSE // // Our custom resist catches for /mob/living @@ -163,42 +184,45 @@ //Other overridden resists go here - return 0 + return FALSE // // Verb for saving vore preferences to save file // /mob/living/proc/save_vore_prefs() if(!client || !client.prefs_vr) - return 0 + return FALSE if(!copy_to_prefs_vr()) - return 0 + return FALSE if(!client.prefs_vr.save_vore()) - return 0 + return FALSE - return 1 + return TRUE /mob/living/proc/apply_vore_prefs() if(!client || !client.prefs_vr) - return 0 + return FALSE if(!client.prefs_vr.load_vore()) - return 0 + return FALSE if(!copy_from_prefs_vr()) - return 0 + return FALSE - return 1 + return TRUE /mob/living/proc/copy_to_prefs_vr() if(!client || !client.prefs_vr) to_chat(src,"You attempted to save your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.") - return 0 + return FALSE var/datum/vore_preferences/P = client.prefs_vr P.digestable = src.digestable + P.devourable = src.devourable + P.feeding = src.feeding P.digest_leave_remains = src.digest_leave_remains P.allowmobvore = src.allowmobvore P.vore_taste = src.vore_taste + P.permit_healbelly = src.permit_healbelly P.can_be_drop_prey = src.can_be_drop_prey P.can_be_drop_pred = src.can_be_drop_pred @@ -209,7 +233,7 @@ P.belly_prefs = serialized - return 1 + return TRUE // // Proc for applying vore preferences, given bellies @@ -217,14 +241,17 @@ /mob/living/proc/copy_from_prefs_vr() if(!client || !client.prefs_vr) to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.") - return 0 + return FALSE var/datum/vore_preferences/P = client.prefs_vr digestable = P.digestable + devourable = P.devourable + feeding = P.feeding digest_leave_remains = P.digest_leave_remains allowmobvore = P.allowmobvore vore_taste = P.vore_taste + permit_healbelly = P.permit_healbelly can_be_drop_prey = P.can_be_drop_prey can_be_drop_pred = P.can_be_drop_pred @@ -233,7 +260,7 @@ for(var/entry in P.belly_prefs) list_to_object(entry,src) - return 1 + return TRUE // // Release everything in every vore organ @@ -301,7 +328,7 @@ /mob/living/proc/get_taste_message(allow_generic = 1) if(!vore_taste && !allow_generic) - return 0 + return FALSE var/taste_message = "" if(vore_taste && (vore_taste != "")) @@ -334,14 +361,14 @@ return //Actual escaping absorbed = 0 //Make sure we're not absorbed + muffled = 0 //Removes Muffling forceMove(get_turf(src)) //Just move me up to the turf, let's not cascade through bellies, there's been a problem, let's just leave. for(var/mob/living/simple_mob/SA in range(10)) SA.prey_excludes[src] = world.time log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(B.owner)] ([B.owner ? "JMP" : "null"])") - if(isanimal(B.owner)) - var/mob/living/simple_mob/SA = B.owner - SA.update_icons() + if(!ishuman(B.owner)) + B.owner.update_icons() //You're in a dogborg! else if(istype(loc, /obj/item/device/dogborg/sleeper)) @@ -406,7 +433,7 @@ var/user_to_prey = get_dist(get_turf(user),get_turf(prey)) if(user_to_pred > 1 || user_to_prey > 1) - return 0 + return FALSE // Prepare messages if(user == pred) //Feeding someone to yourself @@ -428,14 +455,15 @@ //Timer and progress bar if(!do_after(user, swallow_time, prey)) - return 0 // Prey escpaed (or user disabled) before timer expired. + return FALSE // Prey escpaed (or user disabled) before timer expired. // If we got this far, nom successful! Announce it! user.visible_message(success_msg) // Actually shove prey into the belly. belly.nom_mob(prey, user) - user.update_icons() + if(!ishuman(user)) + user.update_icons() // Flavor handling if(belly.can_taste && prey.get_taste_message(FALSE)) @@ -446,7 +474,7 @@ add_attack_logs(pred,prey,"Eaten via [belly.name]") else add_attack_logs(user,pred,"Forced to eat [key_name(prey)]") - return 1 + return TRUE // // Magical pred-air breathing for inside preds @@ -561,7 +589,7 @@ to_chat(src, "You are not allowed to eat this.") return - if(is_type_in_list(I,edible_trash)) + if(is_type_in_list(I,edible_trash) | adminbus_trash) if(I.hidden_uplink) to_chat(src, "You really should not be eating this.") message_admins("[key_name(src)] has attempted to ingest an uplink item. ([src ? "JMP" : "null"])") @@ -658,7 +686,6 @@ set category = "Preferences" set desc = "Switch sharp/fuzzy scaling for current mob." appearance_flags ^= PIXEL_SCALE - appearance_flags ^= KEEP_TOGETHER /mob/living/examine(mob/user, distance, infix, suffix) . = ..(user, distance, infix, suffix) @@ -680,10 +707,13 @@ if("CHAT_LOOC" in client.prefs.preferences_disabled) dispvoreprefs += "LOOC DISABLED
    " dispvoreprefs += "Digestable: [digestable ? "Enabled" : "Disabled"]
    " + dispvoreprefs += "Devourable: [devourable ? "Enabled" : "Disabled"]
    " + dispvoreprefs += "Feedable: [feeding ? "Enabled" : "Disabled"]
    " dispvoreprefs += "Leaves Remains: [digest_leave_remains ? "Enabled" : "Disabled"]
    " dispvoreprefs += "Mob Vore: [allowmobvore ? "Enabled" : "Disabled"]
    " - dispvoreprefs += "Drop-nom prey: [can_be_drop_prey ? "Enabled" : "Disabled"]
    " - dispvoreprefs += "Drop-nom pred: [can_be_drop_pred ? "Enabled" : "Disabled"]
    " + dispvoreprefs += "Healbelly permission: [permit_healbelly ? "Allowed" : "Disallowed"]
    " + dispvoreprefs += "Spontaneous vore prey: [can_be_drop_prey ? "Enabled" : "Disabled"]
    " + dispvoreprefs += "Spontaneous vore pred: [can_be_drop_pred ? "Enabled" : "Disabled"]
    " user << browse("Vore prefs: [src]
    [dispvoreprefs]
    ", "window=[name];size=200x300;can_resize=0;can_minimize=0") onclose(user, "[name]") return diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/code/modules/vore/eating/simple_animal_vr.dm index d5eb653d995..11e50350991 100644 --- a/code/modules/vore/eating/simple_animal_vr.dm +++ b/code/modules/vore/eating/simple_animal_vr.dm @@ -1,6 +1,6 @@ ///////////////////// Simple Animal ///////////////////// /mob/living/simple_mob - var/swallowTime = 30 //How long it takes to eat its prey in 1/10 of a second. The default is 3 seconds. + var/swallowTime = (3 SECONDS) //How long it takes to eat its prey in 1/10 of a second. The default is 3 seconds. var/list/prey_excludes = list() //For excluding people from being eaten. // @@ -42,13 +42,24 @@ var/confirm = alert(user, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will reset after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel") if(confirm == "Enable") vore_selected.digest_mode = DM_DIGEST - spawn(12000) //12000=20 minutes + spawn(20 MINUTES) if(src) vore_selected.digest_mode = vore_default_mode else var/confirm = alert(user, "This mob is currently set to process all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", "Disable", "Cancel") if(confirm == "Disable") vore_selected.digest_mode = DM_HOLD +/mob/living/simple_mob/verb/toggle_fancygurgle() + set name = "Toggle Animal's Gurgle sounds" + set desc = "Switches between Fancy and Classic sounds on this mob." + set category = "OOC" + set src in oview(1) + + var/mob/living/user = usr //I mean, At least ghosts won't use it. + if(!istype(user) || user.stat) return + + vore_selected.fancy_vore = !vore_selected.fancy_vore + to_chat(user, "[src] is now using [vore_selected.fancy_vore ? "Fancy" : "Classic"] vore sounds.") /mob/living/simple_mob/attackby(var/obj/item/O, var/mob/user) if (istype(O, /obj/item/weapon/newspaper) && !(ckey || (ai_holder.hostile && faction != user.faction)) && isturf(user.loc)) @@ -70,7 +81,7 @@ for(var/mob/living/L in living_mobs(0)) //add everyone on the tile to the do-not-eat list for a while if(!(L in prey_excludes)) // Unless they're already on it, just to avoid fuckery. prey_excludes += L - spawn(3600) + spawn(5 MINUTES) if(src && L) prey_excludes -= L else diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm index f89462f23c6..168ec9ccfa6 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/code/modules/vore/eating/vore_vr.dm @@ -19,12 +19,14 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE -Aro <3 */ +#define VORE_VERSION 2 //This is a Define so you don't have to worry about magic numbers. + // // Overrides/additions to stock defines go here, as well as hooks. Sort them by // the object they are overriding. So all /mob/living together, etc. // /datum/configuration - var/items_survive_digestion = 1 //For configuring if the important_items survive digestion + var/items_survive_digestion = TRUE //For configuring if the important_items survive digestion // // The datum type bolted onto normal preferences datums for storing Virgo stuff @@ -35,17 +37,20 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE /hook/client_new/proc/add_prefs_vr(client/C) C.prefs_vr = new/datum/vore_preferences(C) if(C.prefs_vr) - return 1 + return TRUE - return 0 + return FALSE /datum/vore_preferences //Actual preferences var/digestable = TRUE + var/devourable = TRUE + var/feeding = TRUE var/digest_leave_remains = FALSE var/allowmobvore = TRUE var/list/belly_prefs = list() var/vore_taste = "nothing in particular" + var/permit_healbelly = TRUE var/can_be_drop_prey = FALSE var/can_be_drop_pred = FALSE @@ -67,9 +72,9 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE /proc/is_vore_predator(var/mob/living/O) if(istype(O,/mob/living)) if(O.vore_organs.len > 0) - return 1 + return TRUE - return 0 + return FALSE // // Belly searching for simplifying other procs @@ -88,30 +93,33 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE /datum/vore_preferences/proc/load_vore() if(!client || !client_ckey) - return 0 //No client, how can we save? + return FALSE //No client, how can we save? if(!client.prefs || !client.prefs.default_slot) - return 0 //Need to know what character to load! + return FALSE //Need to know what character to load! slot = client.prefs.default_slot load_path(client_ckey,slot) - if(!path) return 0 //Path couldn't be set? + if(!path) return FALSE //Path couldn't be set? if(!fexists(path)) //Never saved before save_vore() //Make the file first - return 1 + return TRUE var/list/json_from_file = json_decode(file2text(path)) if(!json_from_file) - return 0 //My concern grows + return FALSE //My concern grows var/version = json_from_file["version"] json_from_file = patch_version(json_from_file,version) digestable = json_from_file["digestable"] + devourable = json_from_file["devourable"] + feeding = json_from_file["feeding"] digest_leave_remains = json_from_file["digest_leave_remains"] allowmobvore = json_from_file["allowmobvore"] vore_taste = json_from_file["vore_taste"] + permit_healbelly = json_from_file["permit_healbelly"] can_be_drop_prey = json_from_file["can_be_drop_prey"] can_be_drop_pred = json_from_file["can_be_drop_pred"] belly_prefs = json_from_file["belly_prefs"] @@ -119,10 +127,16 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE //Quick sanitize if(isnull(digestable)) digestable = TRUE + if(isnull(devourable)) + devourable = TRUE + if(isnull(feeding)) + feeding = TRUE if(isnull(digest_leave_remains)) digest_leave_remains = FALSE if(isnull(allowmobvore)) allowmobvore = TRUE + if(isnull(permit_healbelly)) + permit_healbelly = TRUE if(isnull(can_be_drop_prey)) allowmobvore = FALSE if(isnull(can_be_drop_pred)) @@ -130,18 +144,21 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE if(isnull(belly_prefs)) belly_prefs = list() - return 1 + return TRUE /datum/vore_preferences/proc/save_vore() - if(!path) return 0 + if(!path) return FALSE - var/version = 1 //For "good times" use in the future + var/version = VORE_VERSION //For "good times" use in the future var/list/settings_list = list( "version" = version, "digestable" = digestable, + "devourable" = devourable, + "feeding" = feeding, "digest_leave_remains" = digest_leave_remains, "allowmobvore" = allowmobvore, "vore_taste" = vore_taste, + "permit_healbelly" = permit_healbelly, "can_be_drop_prey" = can_be_drop_prey, "can_be_drop_pred" = can_be_drop_pred, "belly_prefs" = belly_prefs, @@ -151,7 +168,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE var/json_to_file = json_encode(settings_list) if(!json_to_file) log_debug("Saving: [path] failed jsonencode") - return 0 + return FALSE //Write it out #ifdef RUST_G @@ -164,9 +181,9 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE #endif if(!fexists(path)) log_debug("Saving: [path] failed file write") - return 0 + return FALSE - return 1 + return TRUE //Can do conversions here /datum/vore_preferences/proc/patch_version(var/list/json_from_file,var/version) diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index c5e4391ef70..c9a212f2937 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -189,6 +189,13 @@ dat += "Name:" dat += " '[selected.name]'" + //Belly Type button + dat += "
    Is this belly fleshy:" + dat += "[selected.is_wet ? "Yes" : "No"]" + if(selected.is_wet) + dat += "
    Internal loop for prey?:" + dat += "[selected.wet_loop ? "Yes" : "No"]" + //Digest Mode Button dat += "
    Belly Mode:" var/mode = selected.digest_mode @@ -229,10 +236,18 @@ dat += "
    Flavor Text:" dat += " '[selected.desc]'" + //Belly Sound Fanciness + dat += "
    Use Fancy Sounds:" + dat += "[selected.fancy_vore ? "Yes" : "No"]" + //Belly sound - dat += "
    Set Vore Sound" + dat += "
    Vore Sound: [selected.vore_sound]" dat += "Test" + //Release sound + dat += "
    Release Sound: [selected.release_sound]" + dat += "Test" + //Belly messages dat += "
    Belly Messages" @@ -293,25 +308,48 @@ dat += "
    " switch(user.digestable) - if(1) - dat += "Toggle Digestable" - if(0) - dat += "Toggle Digestable" - + if(TRUE) + dat += "Toggle Digestable (Currently: ON)" + if(FALSE) + dat += "Toggle Digestable (Currently: OFF)" + switch(user.devourable) + if(TRUE) + dat += "Toggle Devourable (Currently: ON)" + if(FALSE) + dat += "Toggle Devourable (Currently: OFF)" + switch(user.feeding) + if(TRUE) + dat += "
    Toggle Feeding (Currently: ON)" + if(FALSE) + dat += "
    Toggle Feeding (Currently: OFF)" switch(user.digest_leave_remains) - if(1) - dat += "Toggle Leaving Remains" - if(0) - dat += "Toggle Leaving Remains" - + if(TRUE) + dat += "Toggle Leaving Remains (Currently: ON)" + if(FALSE) + dat += "Toggle Leaving Remains (Currently: OFF)" switch(user.allowmobvore) - if(1) - dat += "Toggle Mob Vore" - if(0) - dat += "Toggle Mob Vore" + if(TRUE) + dat += "
    Toggle Mob Vore (Currently: ON)" + if(FALSE) + dat += "
    Toggle Mob Vore (Currently: OFF)" + switch(user.permit_healbelly) + if(TRUE) + dat += "Toggle Healbelly Permission (Currently: ON)" + if(FALSE) + dat += "Toggle Healbelly Permission (Currently: OFF)" + + switch(user.can_be_drop_prey) + if(TRUE) + dat += "
    Toggle Prey Spontaneous Vore (Currently: ON)" + if(FALSE) + dat += "
    Toggle Prey Spontaneous Vore (Currently: OFF)" + + switch(user.can_be_drop_pred) + if(TRUE) + dat += "Toggle Pred Spontaneous Vore (Currently: ON)" + if(FALSE) + dat += "Toggle Pred Spontaneous Vore (Currently: OFF)" - dat += "
    Toggle Drop-nom Prey" //These two get their own, custom row, too. - dat += "Toggle Drop-nom Pred" dat += "
    Set Your Taste" dat += "Toggle Hunger Noises" @@ -336,7 +374,7 @@ if(href_list["show_int"]) show_interacts = !show_interacts - return 1 //Force update + return TRUE //Force update if(href_list["int_help"]) alert("These control how your belly responds to someone using 'resist' while inside you. The percent chance to trigger each is listed below, \ @@ -344,13 +382,13 @@ These only function as long as interactions are turned on in general. Keep in mind, the 'belly mode' interactions (digest/absorb) \ will affect all prey in that belly, if one resists and triggers digestion/absorption. If multiple trigger at the same time, \ only the first in the order of 'Escape > Transfer > Absorb > Digest' will occur.","Interactions Help") - return 0 //Force update + return FALSE //Force update if(href_list["outsidepick"]) var/atom/movable/tgt = locate(href_list["outsidepick"]) var/obj/belly/OB = locate(href_list["outsidebelly"]) if(!(tgt in OB)) //Aren't here anymore, need to update menu. - return 1 + return TRUE var/intent = "Examine" if(istype(tgt,/mob/living)) @@ -363,7 +401,7 @@ if("Help Out") //Help the inside-mob out if(user.stat || user.absorbed || M.absorbed) to_chat(user,"You can't do that in your state!") - return 1 + return TRUE to_chat(user,"You begin to push [M] to freedom!") to_chat(M,"[usr] begins to push you to freedom!") @@ -382,11 +420,11 @@ if("Devour") //Eat the inside mob if(user.absorbed || user.stat) to_chat(user,"You can't do that in your state!") - return 1 + return TRUE if(!user.vore_selected) to_chat(user,"Pick a belly on yourself first!") - return 1 + return TRUE var/obj/belly/TB = user.vore_selected to_chat(user,"You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") @@ -404,7 +442,7 @@ var/obj/item/T = tgt if(!(tgt in OB)) //Doesn't exist anymore, update. - return 1 + return TRUE intent = alert("What do you want to do to that?","Query","Examine","Use Hand") switch(intent) if("Examine") @@ -413,7 +451,7 @@ if("Use Hand") if(user.stat) to_chat(user,"You can't do that in your state!") - return 1 + return TRUE user.ClickOn(T) sleep(5) //Seems to exit too fast for the panel to update @@ -426,23 +464,23 @@ intent = alert("Eject all, Move all?","Query","Eject all","Cancel","Move all") switch(intent) if("Cancel") - return 0 + return FALSE if("Eject all") if(user.stat) to_chat(user,"You can't do that in your state!") - return 0 + return FALSE selected.release_all_contents() if("Move all") if(user.stat) to_chat(user,"You can't do that in your state!") - return 0 + return FALSE var/obj/belly/choice = input("Move all where?","Select Belly") as null|anything in user.vore_organs if(!choice) - return 0 + return FALSE for(var/atom/movable/tgt in selected) to_chat(tgt,"You're squished from [user]'s [lowertext(selected)] to their [lowertext(choice.name)]!") @@ -450,7 +488,7 @@ var/atom/movable/tgt = locate(href_list["insidepick"]) if(!(tgt in selected)) //Old menu, needs updating because they aren't really there. - return 1 //Forces update + return TRUE //Forces update intent = "Examine" intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move") switch(intent) @@ -460,25 +498,25 @@ if("Eject") if(user.stat) to_chat(user,"You can't do that in your state!") - return 0 + return FALSE selected.release_specific_contents(tgt) if("Move") if(user.stat) to_chat(user,"You can't do that in your state!") - return 0 + return FALSE var/obj/belly/choice = input("Move [tgt] where?","Select Belly") as null|anything in user.vore_organs if(!choice || !(tgt in selected)) - return 0 + return FALSE to_chat(tgt,"You're squished from [user]'s [lowertext(selected.name)] to their [lowertext(choice.name)]!") selected.transfer_contents(tgt, choice) if(href_list["newbelly"]) if(user.vore_organs.len >= BELLIES_MAX) - return 0 + return FALSE var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null) @@ -495,7 +533,7 @@ if(failure_msg) //Something went wrong. alert(user,failure_msg,"Error!") - return 0 + return FALSE var/obj/belly/NB = new(user) NB.name = new_name @@ -524,10 +562,16 @@ if(failure_msg) //Something went wrong. alert(user,failure_msg,"Error!") - return 0 + return FALSE selected.name = new_name + if(href_list["b_wetness"]) + selected.is_wet = !selected.is_wet + + if(href_list["b_wetloop"]) + selected.wet_loop = !selected.wet_loop + if(href_list["b_mode"]) var/list/menu_list = selected.digest_modes.Copy() if(istype(usr,/mob/living/carbon/human)) @@ -535,13 +579,13 @@ var/new_mode = input("Choose Mode (currently [selected.digest_mode])") as null|anything in menu_list if(!new_mode) - return 0 + return FALSE if(new_mode == DM_TRANSFORM) //Snowflek submenu var/list/tf_list = selected.transform_modes var/new_tf_mode = input("Choose TF Mode (currently [selected.tf_mode])") as null|anything in tf_list if(!new_tf_mode) - return 0 + return FALSE selected.tf_mode = new_tf_mode selected.digest_mode = new_mode @@ -551,7 +595,7 @@ var/list/menu_list = selected.mode_flag_list.Copy() var/toggle_addon = input("Toggle Addon") as null|anything in menu_list if(!toggle_addon) - return 0 + return FALSE selected.mode_flags ^= selected.mode_flag_list[toggle_addon] selected.items_preserved.Cut() //Re-evaltuate all items in belly on addon toggle @@ -560,7 +604,7 @@ var/new_mode = input("Choose Mode (currently [selected.item_digest_mode])") as null|anything in menu_list if(!new_mode) - return 0 + return FALSE selected.item_digest_mode = new_mode selected.items_preserved.Cut() //Re-evaltuate all items in belly on belly-mode change @@ -572,14 +616,14 @@ var/list/menu_list = contamination_flavors.Copy() var/new_flavor = input("Choose Contamination Flavor Text Type (currently [selected.contamination_flavor])") as null|anything in menu_list if(!new_flavor) - return 0 + return FALSE selected.contamination_flavor = new_flavor if(href_list["b_contamination_color"]) var/list/menu_list = contamination_colors.Copy() var/new_color = input("Choose Contamination Color (currently [selected.contamination_color])") as null|anything in menu_list if(!new_color) - return 0 + return FALSE selected.contamination_color = new_color selected.items_preserved.Cut() //To re-contaminate for new color @@ -590,10 +634,10 @@ new_desc = readd_quotes(new_desc) if(length(new_desc) > BELLIES_DESC_MAX) alert("Entered belly desc too long. [BELLIES_DESC_MAX] character limit.","Error") - return 0 + return FALSE selected.desc = new_desc else //Returned null - return 0 + return FALSE if(href_list["b_msgs"]) var/list/messages = list( @@ -648,21 +692,58 @@ if(length(new_verb) > BELLIES_NAME_MAX || length(new_verb) < BELLIES_NAME_MIN) alert("Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).","Error") - return 0 + return FALSE selected.vore_verb = new_verb - if(href_list["b_sound"]) - var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in vore_sounds + if(href_list["b_fancy_sound"]) + selected.fancy_vore = !selected.fancy_vore + selected.vore_sound = "Gulp" + selected.release_sound = "Splatter" + // defaults as to avoid potential bugs + + if(href_list["b_release"]) + var/choice + if(selected.fancy_vore) + choice = input(user,"Currently set to [selected.release_sound]","Select Sound") as null|anything in fancy_release_sounds + else + choice = input(user,"Currently set to [selected.release_sound]","Select Sound") as null|anything in classic_release_sounds + if(!choice) - return 0 + return FALSE + + selected.release_sound = choice + + if(href_list["b_releasesoundtest"]) + var/sound/releasetest + if(selected.fancy_vore) + releasetest = fancy_release_sounds[selected.release_sound] + else + releasetest = classic_release_sounds[selected.release_sound] + + if(releasetest) + SEND_SOUND(user, releasetest) + + if(href_list["b_sound"]) + var/choice + if(selected.fancy_vore) + choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in fancy_vore_sounds + else + choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in classic_vore_sounds + + if(!choice) + return FALSE selected.vore_sound = choice if(href_list["b_soundtest"]) - var/soundfile = vore_sounds[selected.vore_sound] - if(soundfile) - user << soundfile + var/sound/voretest + if(selected.fancy_vore) + voretest = fancy_vore_sounds[selected.vore_sound] + else + voretest = classic_vore_sounds[selected.vore_sound] + if(voretest) + SEND_SOUND(user, voretest) if(href_list["b_tastes"]) selected.can_taste = !selected.can_taste @@ -736,7 +817,7 @@ var/obj/belly/choice = input("Where do you want your [lowertext(selected.name)] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected) if(!choice) //They cancelled, no changes - return 0 + return FALSE else if(choice == "None - Remove") selected.transferlocation = null else @@ -754,8 +835,8 @@ if(href_list["b_del"]) var/alert = alert("Are you sure you want to delete your [lowertext(selected.name)]?","Confirmation","Delete","Cancel") - if(!alert == "Delete") - return 0 + if(!(alert == "Delete")) + return FALSE var/failure_msg = "" @@ -776,7 +857,7 @@ if(failure_msg) alert(user,failure_msg,"Error!") - return 0 + return FALSE qdel(selected) selected = user.vore_organs[1] @@ -791,7 +872,7 @@ if(href_list["applyprefs"]) var/alert = alert("Are you sure you want to reload character slot preferences? This will remove your current vore organs and eject their contents.","Confirmation","Reload","Cancel") if(!alert == "Reload") - return 0 + return FALSE if(!user.apply_vore_prefs()) alert("ERROR: Virgo-specific preferences failed to apply!","Error") else @@ -800,29 +881,29 @@ if(href_list["setflavor"]) var/new_flavor = html_encode(input(usr,"What your character tastes like (40ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",user.vore_taste) as text|null) if(!new_flavor) - return 0 + return FALSE new_flavor = readd_quotes(new_flavor) if(length(new_flavor) > FLAVOR_MAX) alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!") - return 0 + return FALSE user.vore_taste = new_flavor if(href_list["toggle_dropnom_pred"]) - var/choice = alert(user, "You are currently [user.can_be_drop_pred ? " able to eat prey that fall from above or that you fall onto" : "not able to eat prey that fall from above or that you fall onto."]", "", "Be Pred", "Cancel", "Don't be Pred") + var/choice = alert(user, "This toggle is for spontaneous, environment related vore as a predator, including drop-noms, teleporters, etc. You are currently [user.can_be_drop_pred ? " able to eat prey that you encounter by environmental actions." : "avoiding eating prey encountered in the environment."]", "", "Be Pred", "Cancel", "Don't be Pred") switch(choice) if("Cancel") - return 0 + return FALSE if("Be Pred") user.can_be_drop_pred = TRUE if("Don't be Pred") user.can_be_drop_pred = FALSE if(href_list["toggle_dropnom_prey"]) - var/choice = alert(user, "You are currently [user.can_be_drop_prey ? "able to be eaten." : "not able to be eaten."]", "", "Be Prey", "Cancel", "Don't Be Prey") + var/choice = alert(user, "This toggle is for spontaneous, environment related vore as a prey, including drop-noms, teleporters, etc. You are currently [user.can_be_drop_prey ? "able to be eaten by environmental actions." : "not able to be eaten by environmental actions."]", "", "Be Prey", "Cancel", "Don't Be Prey") switch(choice) if("Cancel") - return 0 + return FALSE if("Be Prey") user.can_be_drop_prey = TRUE if("Don't Be Prey") @@ -832,7 +913,7 @@ var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable. Messages admins when changed, so don't try to use it for mechanical benefit. Set it once and save it. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion") switch(choice) if("Cancel") - return 0 + return FALSE if("Allow Digestion") user.digestable = TRUE if("Prevent Digestion") @@ -843,11 +924,37 @@ if(user.client.prefs_vr) user.client.prefs_vr.digestable = user.digestable + if(href_list["toggleddevour"]) + var/choice = alert(user, "This button is to toggle your ability to be devoured by others. Devouring is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Be Devourable", "Cancel", "Prevent being Devoured") + switch(choice) + if("Cancel") + return FALSE + if("Be Devourable") + user.devourable = TRUE + if("Prevent being Devoured") + user.devourable = FALSE + + if(user.client.prefs_vr) + user.client.prefs_vr.devourable = user.devourable + + if(href_list["toggledfeed"]) + var/choice = alert(user, "This button is to toggle your ability to be fed to or by others vorishly. Force Feeding is currently: [user.feeding ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding") + switch(choice) + if("Cancel") + return FALSE + if("Allow Feeding") + user.feeding = TRUE + if("Prevent Feeding") + user.feeding = FALSE + + if(user.client.prefs_vr) + user.client.prefs_vr.feeding = user.feeding + if(href_list["toggledlm"]) var/choice = alert(user, "This button allows preds to have your remains be left in their belly after you are digested. This will only happen if pred sets their belly to do so. Remains consist of skeletal parts. Currently you are [user.digest_leave_remains? "" : "not"] leaving remains.", "", "Allow Post-digestion Remains", "Cancel", "Disallow Post-digestion Remains") switch(choice) if("Cancel") - return 0 + return FALSE if("Allow Post-digestion Remains") user.digest_leave_remains = TRUE if("Disallow Post-digestion Remains") @@ -860,7 +967,7 @@ var/choice = alert(user, "This button is for those who don't like being eaten by mobs. Messages admins when changed, so don't try to use it for mechanical benefit. Set it once and save it. Mobs are currently: [user.allowmobvore ? "Allowed to eat" : "Prevented from eating"] you.", "", "Allow Mob Predation", "Cancel", "Prevent Mob Predation") switch(choice) if("Cancel") - return 0 + return FALSE if("Allow Mob Predation") user.allowmobvore = TRUE if("Prevent Mob Predation") @@ -871,15 +978,28 @@ if(user.client.prefs_vr) user.client.prefs_vr.allowmobvore = user.allowmobvore + if(href_list["togglehealbelly"]) + var/choice = alert(user, "This button is for those who don't like healbelly used on them as a mechanic. It does not affect anything, but is displayed under mechanical prefs for ease of quick checks. You are currently: [user.allowmobvore ? "Okay" : "Not Okay"] with players using healbelly on you.", "", "Allow Healing Belly", "Cancel", "Disallow Healing Belly") + switch(choice) + if("Cancel") + return FALSE + if("Allow Healing Belly") + user.permit_healbelly = TRUE + if("Disallow Healing Belly") + user.permit_healbelly = FALSE + + if(user.client.prefs_vr) + user.client.prefs_vr.permit_healbelly = user.permit_healbelly + if(href_list["togglenoisy"]) var/choice = alert(user, "Toggle audible hunger noises. Currently: [user.noisy ? "Enabled" : "Disabled"]", "", "Enable audible hunger", "Cancel", "Disable audible hunger") switch(choice) if("Cancel") - return 0 + return FALSE if("Enable audible hunger") user.noisy = TRUE if("Disable audible hunger") user.noisy = FALSE //Refresh when interacted with, returning 1 makes vore_look.Topic update - return 1 + return TRUE diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index d22ba747b08..489cab17f55 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -60,9 +60,7 @@ desc = "A kit containing Tasald's equipment." has_items = list( /obj/item/clothing/suit/storage/det_suit/fluff/tasald, - /obj/item/clothing/suit/storage/det_suit/fluff/tas_coat, - /obj/item/clothing/under/det/fluff/tasald, - /obj/item/weapon/implanter/loyalty) + /obj/item/clothing/under/det/fluff/tasald) //bwoincognito:Octavious Ward /obj/item/weapon/storage/box/fluff/octavious @@ -147,7 +145,6 @@ new /obj/item/clothing/accessory/holster/hip(src) new /obj/item/clothing/suit/storage/fluff/modernfedcoat(src) new /obj/item/clothing/head/caphat/formal/fedcover(src) - new /obj/item/weapon/card/id/centcom/station/fluff/joanbadge(src) new /obj/item/clothing/suit/armor/det_suit(src) new /obj/item/weapon/flame/lighter/zippo/fluff/joan(src) new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src) diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 2dc626b801e..0b4e0b61106 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -502,22 +502,6 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0) -// bwoincognito:Tasald Corlethian -/obj/item/clothing/suit/storage/det_suit/fluff/tas_coat - name = "Armored Colony coat" - desc = "Dark green and grey colored sleeveless long coat with two thick metal shoulder pads. has seen some wear and tear, with noticeable patches in the fabric, scratches on the shoulder pads, but with a clean patch on the left upper chest. It has a red NT marked on the right shoulder pad and red Security on the left. " - allowed = list(/obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/flashlight/maglight,/obj/item/clothing/head/helmet) - - icon = 'icons/vore/custom_clothes_vr.dmi' - icon_state = "tasaldcoat" - - icon_override = 'icons/vore/custom_clothes_vr.dmi' - item_state = "tasaldcoat_mob" - - blood_overlay_type = "coat" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0) - //Event Costumes Below /obj/item/clothing/head/helmet/fluff/freddy name = "Animatronic Suit Helmet" @@ -693,9 +677,6 @@ icon_override = 'icons/vore/custom_clothes_vr.dmi' item_state = "rig-hos_mob" - //Slightly improved security voidsuit, which when made, was: - //armor = list(melee = 50, bullet = 25, laser = 25, energy = 5, bomb = 45, bio = 100, rad = 10) - armor = list("melee" = 60, "bullet" = 35, "laser" = 35, "energy" = 15, "bomb" = 50, "bio" = 100, "rad" = 10) species_restricted = null //HOS Hardsuit Helmet @@ -709,7 +690,6 @@ icon_override = 'icons/vore/custom_clothes_vr.dmi' item_state = "rig0-hos_mob" - armor = list("melee" = 60, "bullet" = 35, "laser" = 35, "energy" = 15, "bomb" = 50, "bio" = 100, "rad" = 10) species_restricted = null //adk09:Lethe @@ -1524,6 +1504,14 @@ Departamental Swimsuits, for general use icon_override = 'icons/vore/custom_clothes_vr.dmi' item_state = "gnshorts" +/obj/item/clothing/under/fluff/v_nanovest + name = "Varmacorp nanovest" + desc = "A nifty little vest optimized for nanite contact." + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "nanovest" + icon_override = 'icons/vore/custom_clothes_vr.dmi' + item_state = "nanovest" + //General use /obj/item/clothing/suit/storage/fluff/loincloth name = "Loincloth" @@ -1858,5 +1846,72 @@ Departamental Swimsuits, for general use icon_state = "aika_coat" icon_override = 'icons/vore/custom_clothes_vr.dmi' - item_state = "aika_coat" - flags_inv = HIDEJUMPSUIT | HIDETIE \ No newline at end of file + item_state = "aika_coat_mob" + flags_inv = HIDEJUMPSUIT | HIDETIE + + item_icons = list( + slot_l_hand_str = 'icons/vore/custom_clothes_vr.dmi', + slot_r_hand_str = 'icons/vore/custom_clothes_vr.dmi', + ) + item_state_slots = list(slot_r_hand_str = "aika_coat_mob_r", slot_l_hand_str = "aika_coat_mob_l") + +//Burrito Justice: Jayda Wilson +/obj/item/clothing/under/solgov/utility/sifguard/medical/fluff + desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This is an older issuing of the uniform, with integrated department markings." + + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_override = 'icons/vore/custom_clothes_vr.dmi' + + icon_state = "blackutility_med" + worn_state = "blackutility_med" + item_state = "blackutility_med" + + rolled_down = 0 + rolled_sleeves = 0 + starting_accessories = null + item_icons = list() + +//Vorrarkul: Melanie Farmer +/obj/item/clothing/under/fluff/slime_skeleton + name = "Melanie's Skeleton" + desc = "The skeleton of a promethean, still covered in residual slime. Upon closer inspection, they're not even real bones!" + + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_override = 'icons/vore/custom_clothes_vr.dmi' + + icon_state = "melanie_skeleton" + item_state = "melanie_skeleton_mob" + + body_parts_covered = 0 + + species_restricted = list("exclude", SPECIES_TESHARI) + +/obj/item/clothing/under/fluff/slime_skeleton/mob_can_equip(M as mob, slot) + if(!..()) + return 0 + + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(!(H.get_species() == SPECIES_PROMETHEAN)) //Only wearable by slimes, since species_restricted actually checks bodytype, not species + return 0 + + return 1 + +/obj/item/clothing/under/fluff/slime_skeleton/digest_act(var/atom/movable/item_storage = null) + return FALSE //Indigestible + +//Bacon12366:Elly Brown +/obj/item/clothing/accessory/sweater/fluff/star + name = "Star Sweater" + desc = "It's a white long sweater with a big yellow star at the chest. It seems like it's made of a soft material." + + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "star_sweater" + + icon_override = 'icons/vore/custom_clothes_vr.dmi' + item_state = "star_sweater" + + slot_flags = SLOT_OCLOTHING | SLOT_TIE + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + w_class = ITEMSIZE_NORMAL + slot = ACCESSORY_SLOT_OVER \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/custom_guns_vr.dm b/code/modules/vore/fluffstuff/custom_guns_vr.dm index 7a0b26d1767..f99910a1236 100644 --- a/code/modules/vore/fluffstuff/custom_guns_vr.dm +++ b/code/modules/vore/fluffstuff/custom_guns_vr.dm @@ -730,7 +730,7 @@ icon_state = "r357" ammo_type = /obj/item/ammo_casing/a44/rubber -//Expedition pistol +//Expedition Frontier Phaser /obj/item/weapon/gun/energy/frontier name = "frontier phaser" desc = "An extraordinarily rugged laser weapon, built to last and requiring effectively no maintenance. Includes a built-in crank charger for recharging away from civilization." @@ -746,6 +746,7 @@ unacidable = 1 var/recharging = 0 + var/phase_power = 75 projectile_type = /obj/item/projectile/beam firemodes = list( @@ -764,7 +765,7 @@ if(!do_after(user, 10, src)) break playsound(get_turf(src),'sound/items/change_drill.ogg',25,1) - if(power_supply.give(60) < 60) + if(power_supply.give(phase_power) < phase_power) break recharging = 0 @@ -835,13 +836,14 @@ return ..() -//Expeditionary Holdout Phaser +//Expeditionary Holdout Phaser Pistol /obj/item/weapon/gun/energy/frontier/locked/holdout name = "holdout frontier phaser" desc = "An minaturized weapon designed for the purpose of expeditionary support to defend themselves on the field. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility." icon = 'icons/obj/gun_vr.dmi' icon_state = "holdoutkill" item_state = null + phase_power = 100 w_class = ITEMSIZE_SMALL charge_cost = 600 diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index ff2c752e339..25dfc5d6c7e 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -151,7 +151,7 @@ icon_state = "pda-joan" //Vorrarkul:Lucina Dakarim -/obj/item/device/pda/heads/cmo/lucinapda +/obj/item/device/pda/heads/cmo/fluff/lucinapda icon = 'icons/vore/custom_items_vr.dmi' icon_state = "pda-lucina" @@ -250,7 +250,7 @@ name = "Mouse Plushie" desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend." slot_flags = SLOT_HEAD - icon_state = "mouse_brown" + icon_state = "mouse_brown" //TFF 12/11/19 - Change sprite to not look dead. Heck you for that choice! >:C item_state = "mouse_brown_head" icon = 'icons/vore/custom_items_vr.dmi' icon_override = 'icons/vore/custom_items_vr.dmi' @@ -1244,7 +1244,8 @@ w_class = ITEMSIZE_SMALL origin_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_ILLEGAL = 7) - var/obj/item/weapon/cell/device/weapon/power_source + var/cell_type = /obj/item/weapon/cell/device/weapon + var/obj/item/weapon/cell/power_source var/charge_cost = 800 // cell/device/weapon has 2400 var/list/beacons = list() @@ -1259,7 +1260,10 @@ /obj/item/device/perfect_tele/New() ..() flags |= NOBLUDGEON - power_source = new (src) + if(cell_type) + power_source = new cell_type(src) + else + power_source = new /obj/item/weapon/cell/device(src) spk = new(src) spk.set_up(5, 0, src) spk.attach(src) @@ -1276,7 +1280,7 @@ /obj/item/device/perfect_tele/update_icon() if(!power_source) icon_state = "[initial(icon_state)]_o" - else if(ready && power_source.check_charge(charge_cost)) + else if(ready && (power_source.check_charge(charge_cost) || power_source.fully_charged())) icon_state = "[initial(icon_state)]" else icon_state = "[initial(icon_state)]_w" @@ -1338,7 +1342,7 @@ return /obj/item/device/perfect_tele/attackby(obj/W, mob/user) - if(istype(W,/obj/item/weapon/cell/device/weapon) && !power_source) + if(istype(W,cell_type) && !power_source) power_source = W power_source.update_icon() //Why doesn't a cell do this already? :| user.unEquip(power_source) @@ -1367,7 +1371,7 @@ return FALSE //Check for charge - if(!power_source.check_charge(charge_cost)) + if((!power_source.check_charge(charge_cost)) && (!power_source.fully_charged())) to_chat(user,"\The [src] does not have enough power left!") return FALSE @@ -1398,10 +1402,13 @@ //No, you can't port to or from away missions. Stupidly complicated check. var/turf/uT = get_turf(user) var/turf/dT = get_turf(destination) + var/list/dat = list() + dat["z_level_detection"] = using_map.get_map_levels(uT.z) + if(!uT || !dT) return FALSE - if( (uT.z != dT.z) && ( (uT.z > max_default_z_level() ) || (dT.z > max_default_z_level()) ) ) + if( (uT.z != dT.z) && (!(dT.z in dat["z_level_detection"])) ) to_chat(user,"\The [src] can't teleport you that far!") return FALSE @@ -1562,14 +1569,59 @@ desc = "A more limited translocator with a single beacon, useful for some things, like setting the mining department on fire accidentally. Legal for use in the pursuit of NanoTrasen interests, namely mining and exploration." icon_state = "minitrans" beacons_left = 1 //Just one - charge_cost = 2400 //One per + cell_type = /obj/item/weapon/cell/device + origin_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5) +/* /obj/item/device/perfect_tele/one_beacon/teleport_checks(mob/living/target,mob/living/user) var/turf/T = get_turf(destination) if(T && user.z != T.z) to_chat(user,"\The [src] is too far away from the beacon. Try getting closer first!") return FALSE return ..() +*/ + +/obj/item/device/perfect_tele/admin + name = "alien translocator" + desc = "This strange device allows one to teleport people and objects across large distances." + + cell_type = /obj/item/weapon/cell/device/weapon/recharge/alien + charge_cost = 400 + beacons_left = 6 + failure_chance = 0 //Percent + +/obj/item/device/perfect_tele/admin/teleport_checks(mob/living/target,mob/living/user) + //Uhhuh, need that power source + if(!power_source) + to_chat(user,"\The [src] has no power source!") + return FALSE + + //Check for charge + if((!power_source.check_charge(charge_cost)) && (!power_source.fully_charged())) + to_chat(user,"\The [src] does not have enough power left!") + return FALSE + + //Only mob/living need apply. + if(!istype(user) || !istype(target)) + return FALSE + + //No, you can't teleport buckled people. + if(target.buckled) + to_chat(user,"The target appears to be attached to something...") + return FALSE + + //No, you can't teleport if it's not ready yet. + if(!ready) + to_chat(user,"\The [src] is still recharging!") + return FALSE + + //No, you can't teleport if there's no destination. + if(!destination) + to_chat(user,"\The [src] doesn't have a current valid destination set!") + return FALSE + + //Seems okay to me! + return TRUE //InterroLouis: Ruda Lizden /obj/item/clothing/accessory/badge/holo/detective/ruda @@ -2007,4 +2059,23 @@ /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask/fluff/viktor/Initialize() ..() - reagents.add_reagent("pwine", 60) \ No newline at end of file + reagents.add_reagent("pwine", 60) + +//RadiantAurora: Tiemli Kroto +/obj/item/clothing/glasses/welding/tiemgogs + name = "custom-fitted welding goggles" + desc = "A pair of thick, custom-fitted goggles with LEDs above the lenses. Ruggedly engraved below the lenses is the name 'Tiemli Kroto'." + + icon = 'icons/vore/custom_items_vr.dmi' + icon_state = "tiemgogs" + + icon_override = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "tiemgogs" + +/obj/item/clothing/glasses/welding/tiemgogs/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..()) + if(H.ckey != "radiantaurora") + to_chat(H, "These don't look like they were made to fit you...") + return 0 + else + return 1 diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm new file mode 100644 index 00000000000..8e9a5181e66 --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm @@ -0,0 +1,282 @@ +// The Gun // +/obj/item/weapon/gun/projectile/cell_loaded //this one can load both medical and security cells! for ERT/admin use. + name = "multipurpose cell-loaded revolver" + desc = "Variety is the spice of life! This weapon is a hybrid of the KHI-102b 'Nanotech Selectable-Fire Weapon' and the Vey-Med ML-3 'Medigun', dubbed the 'NSFW-ML3M'. \ + It can fire both harmful and healing cells with an internal nanite fabricator and energy weapon cell loader. Up to three combinations of \ + energy beams can be configured at once. Ammo not included." + catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) + + icon = 'icons/vore/custom_guns_vr.dmi' + icon_state = "nsfw" + + icon_override = 'icons/vore/custom_guns_vr.dmi' + item_state = "gun" + + caliber = "nsfw" + + origin_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 6, TECH_MAGNETS = 4) + + fire_sound = 'sound/weapons/Taser.ogg' + + load_method = MAGAZINE //Nyeh heh hehhh. + magazine_type = null + allowed_magazines = list(/obj/item/ammo_magazine/cell_mag) + handle_casings = HOLD_CASINGS //Don't eject batteries! + recoil = 0 + var/charge_left = 0 + var/max_charge = 0 + charge_sections = 5 + +/obj/item/weapon/gun/projectile/cell_loaded/consume_next_projectile() + if(chambered && ammo_magazine) + var/obj/item/ammo_casing/microbattery/batt = chambered + if(batt.shots_left) + return new chambered.projectile_type() + else + for(var/B in ammo_magazine.stored_ammo) + var/obj/item/ammo_casing/microbattery/other_batt = B + if(istype(other_batt,chambered.type) && other_batt.shots_left) + switch_to(other_batt) + return new chambered.projectile_type() + break + + return null + +/obj/item/weapon/gun/projectile/cell_loaded/proc/update_charge() + charge_left = 0 + max_charge = 0 + + if(!chambered) + return + + var/obj/item/ammo_casing/microbattery/batt = chambered + + charge_left = batt.shots_left + max_charge = initial(batt.shots_left) + if(ammo_magazine) //Crawl to find more + for(var/B in ammo_magazine.stored_ammo) + var/obj/item/ammo_casing/microbattery/bullet = B + if(istype(bullet,batt.type)) + charge_left += bullet.shots_left + max_charge += initial(bullet.shots_left) + +/obj/item/weapon/gun/projectile/cell_loaded/proc/switch_to(obj/item/ammo_casing/microbattery/new_batt) + if(ishuman(loc)) + if(chambered && new_batt.type == chambered.type) + to_chat(loc,"\The [src] is now using the next [new_batt.type_name] power cell.") + else + to_chat(loc,"\The [src] is now firing [new_batt.type_name].") + + chambered = new_batt + update_charge() + update_icon() + +/obj/item/weapon/gun/projectile/cell_loaded/attack_self(mob/user) + if(!chambered) + return + + var/list/stored_ammo = ammo_magazine.stored_ammo + + if(stored_ammo.len == 1) + return //silly you. + + //Find an ammotype that ISN'T the same, or exhaust the list and don't change. + var/our_slot = stored_ammo.Find(chambered) + + for(var/index in 1 to stored_ammo.len) + var/true_index = ((our_slot + index - 1) % stored_ammo.len) + 1 // Stupid ONE BASED lists! + var/obj/item/ammo_casing/microbattery/next_batt = stored_ammo[true_index] + if(chambered != next_batt && !istype(next_batt, chambered.type)) + switch_to(next_batt) + break +/* +/obj/item/weapon/gun/projectile/cell_loaded/special_check(mob/user) + if(!chambered) + return + + var/obj/item/ammo_casing/microbattery/batt = chambered + if(!batt.shots_left) + return FALSE + + return TRUE +*/ +/obj/item/weapon/gun/projectile/cell_loaded/load_ammo(var/obj/item/A, mob/user) + . = ..() + if(ammo_magazine && ammo_magazine.stored_ammo.len) + switch_to(ammo_magazine.stored_ammo[1]) + +/obj/item/weapon/gun/projectile/cell_loaded/unload_ammo(mob/user, var/allow_dump=1) + chambered = null + return ..() + +/obj/item/weapon/gun/projectile/cell_loaded/update_icon() + update_charge() + + cut_overlays() + if(!chambered) + return + + var/obj/item/ammo_casing/microbattery/batt = chambered + var/batt_color = batt.type_color //Used many times + + //Mode bar + var/image/mode_bar = image(icon, icon_state = "[initial(icon_state)]_type") + mode_bar.color = batt_color + add_overlay(mode_bar) + + //Barrel color + var/image/barrel_color = image(icon, icon_state = "[initial(icon_state)]_barrel") + barrel_color.alpha = 150 + barrel_color.color = batt_color + add_overlay(barrel_color) + + //Charge bar + var/ratio = CEILING(((charge_left / max_charge) * charge_sections), 1) + for(var/i = 0, i < ratio, i++) + var/image/charge_bar = image(icon, icon_state = "[initial(icon_state)]_charge") + charge_bar.pixel_x = i + charge_bar.color = batt_color + add_overlay(charge_bar) + + +// The Magazine // +/obj/item/ammo_magazine/cell_mag + name = "microbattery magazine" + desc = "A microbattery holder for a cell-based variable weapon." + icon = 'icons/obj/ammo_vr.dmi' + icon_state = "cell_mag" + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_MAGNETS = 3) + caliber = "nsfw" + ammo_type = /obj/item/ammo_casing/microbattery + initial_ammo = 0 + max_ammo = 3 + var/x_offset = 5 //for update_icon() shenanigans- moved here so it can be adjusted for bigger mags + var/capname = "nsfw_mag" //as above + var/chargename = "nsfw_mag" //as above + mag_type = MAGAZINE + + var/list/modes = list() + +/obj/item/ammo_magazine/cell_mag/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/ammo_casing/microbattery)) + var/obj/item/ammo_casing/microbattery/B = W + if(!istype(B, ammo_type)) + to_chat(user, "[B] does not fit into [src].") + return + if(stored_ammo.len >= max_ammo) + to_chat(user, "[src] is full!") + return + user.remove_from_mob(B) + B.loc = src + stored_ammo.Add(B) + update_icon() + playsound(user.loc, 'sound/weapons/flipblade.ogg', 50, 1) + update_icon() + +/obj/item/ammo_magazine/cell_mag/update_icon() + cut_overlays() + if(!stored_ammo.len) + return //Why bother + + var/current = 0 + for(var/B in stored_ammo) + var/obj/item/ammo_casing/microbattery/batt = B + var/image/cap = image(icon, icon_state = "[capname]_cap") + cap.color = batt.type_color + cap.pixel_x = current * x_offset //Caps don't need a pixel_y offset + add_overlay(cap) + + if(batt.shots_left) + var/ratio = CEILING(((batt.shots_left / initial(batt.shots_left)) * 4), 1) //4 is how many lights we have a sprite for + var/image/charge = image(icon, icon_state = "[chargename]_charge-[ratio]") + charge.color = "#29EAF4" //Could use battery color but eh. + charge.pixel_x = current * x_offset + add_overlay(charge) + + current++ //Increment for offsets + +/obj/item/ammo_magazine/cell_mag/advanced + name = "advanced microbattery magazine" + desc = "A microbattery holder for a cell-based variable weapon. This one has much more cell capacity!" + max_ammo = 6 + x_offset = 3 + icon_state = "cell_mag_extended" + + +// The Casing // +/obj/item/ammo_casing/microbattery + name = "\'NSFW\' microbattery - UNKNOWN" + desc = "A miniature battery for an energy weapon." + catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) + icon = 'icons/obj/ammo_vr.dmi' + icon_state = "nsfw_batt" + slot_flags = SLOT_BELT | SLOT_EARS + throwforce = 1 + w_class = ITEMSIZE_TINY + var/shots_left = 4 + + leaves_residue = 0 + caliber = "nsfw" + var/type_color = null + var/type_name = null + projectile_type = /obj/item/projectile/beam + +/obj/item/ammo_casing/microbattery/Initialize() + . = ..() + pixel_x = rand(-10, 10) + pixel_y = rand(-10, 10) + update_icon() + +/obj/item/ammo_casing/microbattery/update_icon() + cut_overlays() + + var/image/ends = image(icon, icon_state = "[initial(icon_state)]_ends") + ends.color = type_color + add_overlay(ends) + +/obj/item/ammo_casing/microbattery/expend() + shots_left-- + + +// The Pack // +/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hybrid + name = "hybrid cell-loaded gun kit" + desc = "A storage case for a multi-purpose handgun. Variety hour!" + w_class = ITEMSIZE_NORMAL + max_w_class = ITEMSIZE_NORMAL + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hybrid/New() + ..() + new /obj/item/weapon/gun/projectile/cell_loaded(src) + new /obj/item/ammo_magazine/cell_mag/advanced(src) + new /obj/item/ammo_casing/microbattery/combat/stun(src) + new /obj/item/ammo_casing/microbattery/combat/stun(src) + new /obj/item/ammo_casing/microbattery/combat/stun(src) + new /obj/item/ammo_casing/microbattery/combat/net(src) + new /obj/item/ammo_casing/microbattery/combat/net(src) + new /obj/item/ammo_casing/microbattery/medical/brute3(src) + new /obj/item/ammo_casing/microbattery/medical/burn3(src) + new /obj/item/ammo_casing/microbattery/medical/stabilize2(src) + new /obj/item/ammo_casing/microbattery/medical/toxin3(src) + new /obj/item/ammo_casing/microbattery/medical/omni3(src) + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hybrid_combat + name = "military cell-loaded gun kit" + desc = "A storage case for a multi-purpose handgun. Variety hour!" + w_class = ITEMSIZE_NORMAL + max_w_class = ITEMSIZE_NORMAL + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hybrid_combat/New() + ..() + new /obj/item/weapon/gun/projectile/cell_loaded(src) + new /obj/item/ammo_magazine/cell_mag/advanced(src) + new /obj/item/ammo_casing/microbattery/combat/shotstun(src) + new /obj/item/ammo_casing/microbattery/combat/shotstun(src) + new /obj/item/ammo_casing/microbattery/combat/lethal(src) + new /obj/item/ammo_casing/microbattery/combat/lethal(src) + new /obj/item/ammo_casing/microbattery/combat/lethal(src) + new /obj/item/ammo_casing/microbattery/combat/ion(src) + new /obj/item/ammo_casing/microbattery/combat/xray(src) + new /obj/item/ammo_casing/microbattery/medical/stabilize2(src) + new /obj/item/ammo_casing/microbattery/medical/haste(src) + new /obj/item/ammo_casing/microbattery/medical/resist(src) \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m.dm new file mode 100644 index 00000000000..6dbf09204f6 --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m.dm @@ -0,0 +1,72 @@ +// The Gun // +/obj/item/weapon/gun/projectile/cell_loaded/medical + name = "cell-loaded medigun" + desc = "The ML-3 'Medigun', or ML3M for short, is a powerful cell-based ranged healing device based on the KHI-102b NSFW. \ + It uses an internal nanite fabricator, powered and controlled by discrete cells, to deliver a variety of effects at range. Up to six combinations of \ + healing beams can be configured at once, depending on cartridge used. Ammo not included." + catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med) + + icon_state = "ml3m" + description_info = "This is a ranged healing device that uses interchangable nanite discharge cells in a magazine. Each cell is a different healing beam type, and up to three can be loaded in the magazine. Each battery usually provides four discharges of that beam type, and multiple from the same type may be loaded to increase the number of shots for that type." + description_fluff = "The Vey-Med ML-3 'Medigun' allows one to customize their loadout in the field, or before deploying, to allow emergency response personnel to deliver a variety of ranged healing options." + description_antag = "" + origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 2, TECH_BIO = 5) + allowed_magazines = list(/obj/item/ammo_magazine/cell_mag/medical) + +/obj/item/weapon/gun/projectile/cell_loaded/medical/cmo + name = "advanced cell-loaded medigun" + desc = "This is a variation on the ML-3 'Medigun', a powerful cell-based ranged healing device based on the KHI-102b NSFW. \ + It has an extended sight for increased accuracy, and much more comfortable grip. Ammo not included." + + icon_state = "ml3m_cmo" + + +// The Magazine // +/obj/item/ammo_magazine/cell_mag/medical //medical + name = "nanite magazine" + desc = "A nanite fabrication magazine for the \'ML-3/M\'" + catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med) + description_info = "This magazine holds self-charging nanite fabricators to power the ML-3 'Medigun'. Up to three can be loaded at once, and each provides four shots of their respective healing type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger." + ammo_type = /obj/item/ammo_casing/microbattery/medical + icon_state = "ml3m_mag" + origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 3) + +/obj/item/ammo_magazine/cell_mag/medical/advanced + name = "advanced nanite magazine" + desc = "A nanite discharge cell for the \'ML-3/M\'. This one is a more advanced version which can hold six individual nanite discharge cells." + max_ammo = 6 + x_offset = 3 + icon_state = "ml3m_mag_extended" + origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 5) + + +// The Pack // +/obj/item/weapon/storage/secure/briefcase/ml3m_pack_med + name = "\improper ML-3 \'Medigun\' kit" + desc = "A storage case for a multi-purpose healing gun. Variety hour!" + w_class = ITEMSIZE_NORMAL + max_w_class = ITEMSIZE_NORMAL + +/obj/item/weapon/storage/secure/briefcase/ml3m_pack_med/New() + ..() + new /obj/item/weapon/gun/projectile/cell_loaded/medical(src) + new /obj/item/ammo_magazine/cell_mag/medical(src) + new /obj/item/ammo_casing/microbattery/medical/brute(src) + new /obj/item/ammo_casing/microbattery/medical/burn(src) + new /obj/item/ammo_casing/microbattery/medical/stabilize(src) + +/obj/item/weapon/storage/secure/briefcase/ml3m_pack_cmo + name = "\improper Advanced ML-3 \'Medigun\' kit" + desc = "A storage case for a multi-purpose healing gun. Variety hour!" + w_class = ITEMSIZE_NORMAL + max_w_class = ITEMSIZE_NORMAL + +/obj/item/weapon/storage/secure/briefcase/ml3m_pack_cmo/New() + ..() + new /obj/item/weapon/gun/projectile/cell_loaded/medical/cmo(src) + new /obj/item/ammo_magazine/cell_mag/medical(src) + new /obj/item/ammo_casing/microbattery/medical/brute(src) + new /obj/item/ammo_casing/microbattery/medical/burn(src) + new /obj/item/ammo_casing/microbattery/medical/stabilize(src) + new /obj/item/ammo_casing/microbattery/medical/toxin(src) + new /obj/item/ammo_casing/microbattery/medical/omni(src) \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m_cells.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m_cells.dm new file mode 100644 index 00000000000..49f0a15e3f6 --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m_cells.dm @@ -0,0 +1,340 @@ +// The Casing // +/obj/item/ammo_casing/microbattery/medical + name = "\'ML-3/M\' nanite cell - UNKNOWN" + desc = "A miniature nanite fabricator for a medigun." + catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med) + icon_state = "ml3m_batt" + origin_tech = list(TECH_BIO = 2, TECH_MATERIAL = 1, TECH_MAGNETS = 2) + +/obj/item/projectile/beam/medical_cell + name = "\improper healing beam" + icon_state = "medbeam" + nodamage = 1 + damage = 0 + check_armour = "laser" + light_color = "#80F5FF" + + combustion = FALSE + + muzzle_type = /obj/effect/projectile/muzzle/medigun + tracer_type = /obj/effect/projectile/tracer/medigun + impact_type = /obj/effect/projectile/impact/medigun + +/obj/item/projectile/beam/medical_cell/on_hit(var/mob/living/carbon/human/target) //what does it do when it hits someone? + return + +/obj/item/ammo_casing/microbattery/medical/brute + name = "\'ML-3/M\' nanite cell - BRUTE" + type_color = "#BF0000" + type_name = "BRUTE" + projectile_type = /obj/item/projectile/beam/medical_cell/brute + +/obj/item/projectile/beam/medical_cell/brute/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustBruteLoss(-5) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/burn + name = "\'ML-3/M\' nanite cell - BURN" + type_color = "#FF8000" + type_name = "BURN" + projectile_type = /obj/item/projectile/beam/medical_cell/burn + +/obj/item/projectile/beam/medical_cell/burn/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustFireLoss(-5) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/stabilize + name = "\'ML-3/M\' nanite cell - STABILIZE" //Disinfects all open wounds, cures oxy damage + type_color = "#0080FF" + type_name = "STABILIZE" + projectile_type = /obj/item/projectile/beam/medical_cell/stabilize + +/obj/item/projectile/beam/medical_cell/stabilize/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustOxyLoss(-30) + for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO)) + var/obj/item/organ/external/O = target.organs_by_name[name] + for (var/datum/wound/W in O.wounds) + if (W.internal) + continue + W.disinfect() + target.add_modifier(/datum/modifier/stabilize, 20 SECONDS) + else + return 1 + +/datum/modifier/stabilize + name = "stabilize" + desc = "Your injuries are stabilized and your pain abates!" + mob_overlay_state = "cyan_sparkles" + stacks = MODIFIER_STACK_EXTEND + pain_immunity = TRUE + bleeding_rate_percent = 0.1 //only a little + incoming_oxy_damage_percent = 0 + +/obj/item/ammo_casing/microbattery/medical/toxin + name = "\'ML-3/M\' nanite cell - TOXIN" + type_color = "#00A000" + type_name = "TOXIN" + projectile_type = /obj/item/projectile/beam/medical_cell/toxin + +/obj/item/projectile/beam/medical_cell/toxin/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustToxLoss(-5) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/omni + name = "\'ML-3/M\' nanite cell - OMNI" + type_color = "#8040FF" + type_name = "OMNI" + projectile_type = /obj/item/projectile/beam/medical_cell/omni + +/obj/item/projectile/beam/medical_cell/omni/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustBruteLoss(-2.5) + target.adjustFireLoss(-2.5) + target.adjustToxLoss(-2.5) + target.adjustOxyLoss(-10) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/antirad + name = "\'ML-3/M\' nanite cell - ANTIRAD" + type_color = "#008000" + type_name = "ANTIRAD" + projectile_type = /obj/item/projectile/beam/medical_cell/antirad + +/obj/item/projectile/beam/medical_cell/antirad/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustToxLoss(-2.5) + target.radiation = max(target.radiation - 150, 0) //same as 5 units of arithrazine, sans the brute damage + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/brute2 + name = "\'ML-3/M\' nanite cell - BRUTE-II" + type_color = "#BF0000" + type_name = "BRUTE-II" + projectile_type = /obj/item/projectile/beam/medical_cell/brute2 + +/obj/item/projectile/beam/medical_cell/brute2/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustBruteLoss(-10) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/burn2 + name = "\'ML-3/M\' nanite cell - BURN-II" + type_color = "#FF8000" + type_name = "BURN-II" + projectile_type = /obj/item/projectile/beam/medical_cell/burn2 + +/obj/item/projectile/beam/medical_cell/burn2/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustFireLoss(-10) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/stabilize2 + name = "\'ML-3/M\' nanite cell - STABILIZE-II" //Disinfects and bandages all open wounds, cures all oxy damage + type_color = "#0080FF" + type_name = "STABILIZE-II" + projectile_type = /obj/item/projectile/beam/medical_cell/stabilize2 + +/obj/item/projectile/beam/medical_cell/stabilize2/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustOxyLoss(-200) + for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO)) + var/obj/item/organ/external/O = target.organs_by_name[name] + for (var/datum/wound/W in O.wounds) + if(W.internal) + continue + if(O.is_bandaged() == FALSE) + W.bandage() + if(O.is_salved() == FALSE) + W.salve() + W.disinfect() + target.add_modifier(/datum/modifier/stabilize, 20 SECONDS) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/omni2 + name = "\'ML-3/M\' nanite cell - OMNI-II" + type_color = "#8040FF" + type_name = "OMNI-II" + projectile_type = /obj/item/projectile/beam/medical_cell/omni2 + +/obj/item/projectile/beam/medical_cell/omni2/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustBruteLoss(-5) + target.adjustFireLoss(-5) + target.adjustToxLoss(-5) + target.adjustOxyLoss(-30) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/toxin2 + name = "\'ML-3/M\' nanite cell - TOXIN-II" + type_color = "#00A000" + type_name = "TOXIN-II" + projectile_type = /obj/item/projectile/beam/medical_cell/toxin2 + +/obj/item/projectile/beam/medical_cell/toxin2/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustToxLoss(-20) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/haste + name = "\'ML-3/M\' nanite cell - HASTE" + type_color = "#FF3300" + type_name = "HASTE" + projectile_type = /obj/item/projectile/beam/medical_cell/haste + +/obj/item/projectile/beam/medical_cell/haste/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.add_modifier(/datum/modifier/ml3mhaste, 20 SECONDS) + else + return 1 + +/datum/modifier/ml3mhaste + name = "haste" + desc = "You can move much faster!" + mob_overlay_state = "haste" + stacks = MODIFIER_STACK_EXTEND + slowdown = -0.5 //a little faster! + evasion = 1.15 //and a little harder to hit! + +/obj/item/ammo_casing/microbattery/medical/resist + name = "\'ML-3/M\' nanite cell - RESIST" + type_color = "#555555" + type_name = "RESIST" + projectile_type = /obj/item/projectile/beam/medical_cell/resist + +/obj/item/projectile/beam/medical_cell/resist/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.add_modifier(/datum/modifier/resistance, 20 SECONDS) + else + return 1 + +/datum/modifier/resistance + name = "resistance" + desc = "You resist 15% of all incoming damage and stuns!" + mob_overlay_state = "repel_missiles" + stacks = MODIFIER_STACK_EXTEND + disable_duration_percent = 0.85 + incoming_damage_percent = 0.85 + +/obj/item/ammo_casing/microbattery/medical/corpse_mend + name = "\'ML-3/M\' nanite cell - CORPSE MEND" + type_color = "#669900" + type_name = "CORPSE MEND" + projectile_type = /obj/item/projectile/beam/medical_cell/corpse_mend + +/obj/item/projectile/beam/medical_cell/corpse_mend/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + if(target.stat == DEAD) + target.adjustBruteLoss(-50) + target.adjustFireLoss(-50) + target.adjustToxLoss(-50) + target.adjustOxyLoss(-200) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/brute3 + name = "\'ML-3/M\' nanite cell - BRUTE-III" + type_color = "#BF0000" + type_name = "BRUTE-III" + projectile_type = /obj/item/projectile/beam/medical_cell/brute3 + +/obj/item/projectile/beam/medical_cell/brute3/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustBruteLoss(-20) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/burn3 + name = "\'ML-3/M\' nanite cell - BURN-III" + type_color = "#FF8000" + type_name = "BURN-III" + projectile_type = /obj/item/projectile/beam/medical_cell/burn3 + +/obj/item/projectile/beam/medical_cell/burn3/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustFireLoss(-20) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/toxin3 + name = "\'ML-3/M\' nanite cell - TOXIN-III" + type_color = "#00A000" + type_name = "TOXIN-III" + projectile_type = /obj/item/projectile/beam/medical_cell/toxin3 + +/obj/item/projectile/beam/medical_cell/toxin3/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustToxLoss(-20) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/omni3 + name = "\'ML-3/M\' nanite cell - OMNI-III" + type_color = "#8040FF" + type_name = "OMNI-III" + projectile_type = /obj/item/projectile/beam/medical_cell/omni3 + +/obj/item/projectile/beam/medical_cell/omni3/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustBruteLoss(-10) + target.adjustFireLoss(-10) + target.adjustToxLoss(-10) + target.adjustOxyLoss(-60) + else + return 1 + +// Illegal cells! +/obj/item/ammo_casing/microbattery/medical/shrink + name = "\'ML-3/M\' nanite cell - SHRINK" + type_color = "#910ffc" + type_name = "SHRINK" + projectile_type = /obj/item/projectile/beam/medical_cell/shrink + +/obj/item/projectile/beam/medical_cell/shrink/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.resize(0.5) + target.show_message("The beam fires into your body, changing your size!") + target.updateicon() + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/grow + name = "\'ML-3/M\' nanite cell - GROW" + type_color = "#fc0fdc" + type_name = "GROW" + projectile_type = /obj/item/projectile/beam/medical_cell/grow + +/obj/item/projectile/beam/medical_cell/grow/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.resize(2.0) + target.show_message("The beam fires into your body, changing your size!") + target.updateicon() + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/normalsize + name = "\'ML-3/M\' nanite cell - NORMALSIZE" + type_color = "#C70FEC" + type_name = "NORMALSIZE" + projectile_type = /obj/item/projectile/beam/medical_cell/normalsize + +/obj/item/projectile/beam/medical_cell/normalsize/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.resize(1) + target.show_message("The beam fires into your body, changing your size!") + target.updateicon() + else + return 1 \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/nsfw.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/nsfw.dm new file mode 100644 index 00000000000..241e2e2c1dc --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/nsfw.dm @@ -0,0 +1,75 @@ +// The Gun // +/obj/item/weapon/gun/projectile/cell_loaded/combat + name = "cell-loaded revolver" + desc = "Variety is the spice of life! The KHI-102b 'Nanotech Selectable-Fire Weapon', or NSFW for short, is an unholy hybrid of an ammo-driven \ + energy weapon that allows the user to mix and match their own fire modes. Up to four combinations of \ + energy beams can be configured at once. Ammo not included." + catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) + + description_fluff = "The Kitsuhana 'Nanotech Selectable Fire Weapon' allows one to customize their loadout in the field, or before deploying, to achieve various results in a weapon they are already familiar with wielding." + allowed_magazines = list(/obj/item/ammo_magazine/cell_mag/combat) + +/obj/item/weapon/gun/projectile/cell_loaded/combat/prototype + name = "prototype cell-loaded revolver" + desc = "Variety is the spice of life! A prototype based on KHI-102b 'Nanotech Selectable-Fire Weapon', or NSFW for short, is an unholy hybrid of an ammo-driven \ + energy weapon that allows the user to mix and match their own fire modes. Up to two combinations of \ + energy beams can be configured at once. Ammo not included." + + description_info = "This gun is an energy weapon that uses interchangable microbatteries in a magazine. Each battery is a different beam type, and up to three can be loaded in the magazine. Each battery usually provides four discharges of that beam type, and multiple from the same type may be loaded to increase the number of shots for that type." + description_antag = "" + allowed_magazines = list(/obj/item/ammo_magazine/cell_mag/combat/prototype) + + origin_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 4, TECH_MAGNETS = 3) + + +// The Magazine // +/obj/item/ammo_magazine/cell_mag/combat + name = "microbattery magazine" + desc = "A microbattery holder for the \'NSFW\'" + icon_state = "nsfw_mag" + max_ammo = 4 + x_offset = 4 + catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) + description_info = "This magazine holds NSFW microbatteries to power the NSFW handgun. Up to three can be loaded at once, and each provides four shots of their respective energy type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger." + ammo_type = /obj/item/ammo_casing/microbattery/combat + +/obj/item/ammo_magazine/cell_mag/combat/prototype + name = "prototype microbattery magazine" + icon_state = "nsfw_mag_prototype" + max_ammo = 2 + x_offset = 6 + catalogue_data = null + origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_MAGNETS = 2) + + +// The Pack // +/obj/item/weapon/storage/secure/briefcase/nsfw_pack + name = "\improper KHI-102b \'NSFW\' gun kit" + desc = "A storage case for a multi-purpose handgun. Variety hour!" + w_class = ITEMSIZE_NORMAL + max_w_class = ITEMSIZE_NORMAL + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack/New() + ..() + new /obj/item/weapon/gun/projectile/cell_loaded/combat(src) + new /obj/item/ammo_magazine/cell_mag/combat(src) + for(var/path in subtypesof(/obj/item/ammo_casing/microbattery/combat)) + new path(src) + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos + name = "\improper KHI-102b \'NSFW\' gun kit" + desc = "A storage case for a multi-purpose handgun. Variety hour!" + w_class = ITEMSIZE_NORMAL + max_w_class = ITEMSIZE_NORMAL + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos/New() + ..() + new /obj/item/weapon/gun/projectile/cell_loaded/combat(src) + new /obj/item/ammo_magazine/cell_mag/combat(src) + new /obj/item/ammo_casing/microbattery/combat/lethal(src) + new /obj/item/ammo_casing/microbattery/combat/lethal(src) + new /obj/item/ammo_casing/microbattery/combat/stun(src) + new /obj/item/ammo_casing/microbattery/combat/stun(src) + new /obj/item/ammo_casing/microbattery/combat/stun(src) + new /obj/item/ammo_casing/microbattery/combat/net(src) + new /obj/item/ammo_casing/microbattery/combat/ion(src) \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/nsfw_cells.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/nsfw_cells.dm new file mode 100644 index 00000000000..946368baadc --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/nsfw_cells.dm @@ -0,0 +1,115 @@ +// The Casing // +/obj/item/ammo_casing/microbattery/combat + name = "\'NSFW\' microbattery - UNKNOWN" + desc = "A miniature battery for an energy weapon." + catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 1, TECH_MAGNETS = 2) + +/obj/item/ammo_casing/microbattery/combat/lethal + name = "\'NSFW\' microbattery - LETHAL" + type_color = "#bf3d3d" + type_name = "LETHAL" + projectile_type = /obj/item/projectile/beam + +/obj/item/ammo_casing/microbattery/combat/stun + name = "\'NSFW\' microbattery - STUN" + type_color = "#0f81bc" + type_name = "STUN" + projectile_type = /obj/item/projectile/beam/stun/blue + +/obj/item/ammo_casing/microbattery/combat/net + name = "\'NSFW\' microbattery - NET" + type_color = "#43f136" + type_name = "NET" + projectile_type = /obj/item/projectile/beam/energy_net + +/obj/item/ammo_casing/microbattery/combat/xray + name = "\'NSFW\' microbattery - XRAY" + type_color = "#32c025" + type_name = "XRAY" + projectile_type = /obj/item/projectile/beam/xray + +/obj/item/ammo_casing/microbattery/combat/shotstun + name = "\'NSFW\' microbattery - SCATTERSTUN" + type_color = "#88ffff" + type_name = "SCATTERSTUN" + projectile_type = /obj/item/projectile/bullet/pellet/e_shot_stun + +/obj/item/projectile/bullet/pellet/e_shot_stun + icon_state = "spell" + damage = 2 + agony = 20 + pellets = 6 //number of pellets + range_step = 2 //projectile will lose a fragment each time it travels this distance. Can be a non-integer. + base_spread = 90 //lower means the pellets spread more across body parts. If zero then this is considered a shrapnel explosion instead of a shrapnel cone + spread_step = 10 + embed_chance = 0 + sharp = 0 + check_armour = "melee" + +/obj/item/ammo_casing/microbattery/combat/ion + name = "\'NSFW\' microbattery - ION" + type_color = "#d084d6" + type_name = "ION" + projectile_type = /obj/item/projectile/ion/small + +/obj/item/ammo_casing/microbattery/combat/stripper + name = "\'NSFW\' microbattery - STRIPPER" + type_color = "#fc8d0f" + type_name = "STRIPPER" + projectile_type = /obj/item/projectile/bullet/stripper + +/obj/item/projectile/bullet/stripper + icon_state = "magicm" + nodamage = 1 + agony = 5 + embed_chance = 0 + sharp = 0 + check_armour = "melee" + +/obj/item/projectile/bullet/stripper/on_hit(var/atom/stripped) + if(ishuman(stripped)) + var/mob/living/carbon/human/H = stripped + if(H.wear_suit) + H.unEquip(H.wear_suit) + if(H.w_uniform) + H.unEquip(H.w_uniform) + if(H.back) + H.unEquip(H.back) + if(H.shoes) + H.unEquip(H.shoes) + if(H.gloves) + H.unEquip(H.gloves) + //Hats can stay! Most other things fall off with removing these. + ..() + +/obj/item/ammo_casing/microbattery/combat/final + name = "\'NSFW\' microbattery - FINAL OPTION" + type_color = "#fcfc0f" + type_name = "FINAL OPTION" //Doesn't look good in yellow in chat + projectile_type = /obj/item/projectile/beam/final_option + +/obj/item/projectile/beam/final_option + name = "final option beam" + icon_state = "omnilaser" + nodamage = 1 + agony = 5 + damage_type = HALLOSS + light_color = "#00CC33" + + muzzle_type = /obj/effect/projectile/muzzle/laser_omni + tracer_type = /obj/effect/projectile/tracer/laser_omni + impact_type = /obj/effect/projectile/impact/laser_omni + +/obj/item/projectile/beam/final_option/on_hit(var/atom/impacted) + if(isliving(impacted)) + var/mob/living/L = impacted + if(L.mind) + var/nif + if(ishuman(L)) + var/mob/living/carbon/human/H = L + nif = H.nif + SStranscore.m_backup(L.mind,nif,one_time = TRUE) + L.gib() + + ..() \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/guns/nsfw.dm b/code/modules/vore/fluffstuff/guns/nsfw.dm deleted file mode 100644 index 78aa05de536..00000000000 --- a/code/modules/vore/fluffstuff/guns/nsfw.dm +++ /dev/null @@ -1,370 +0,0 @@ -// -------------- NSFW ------------- -/obj/item/weapon/gun/projectile/nsfw - name = "cell-loaded revolver" - desc = "Variety is the spice of life! The KHI-102b 'Nanotech Selectable-Fire Weapon', or NSFW for short, is an unholy hybrid of an ammo-driven \ - energy weapon that allows the user to mix and match their own fire modes. Up to three combinations of \ - energy beams can be configured at once. Ammo not included." - catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) - - description_info = "This gun is an energy weapon that uses interchangable microbatteries in a magazine. Each battery is a different beam type, and up to three can be loaded in the magazine. Each battery usually provides four discharges of that beam type, and multiple from the same type may be loaded to increase the number of shots for that type." - description_fluff = "The Kitsuhana 'Nanotech Selectable Fire Weapon' allows one to customize their loadout in the field, or before deploying, to achieve various results in a weapon they are already familiar with wielding." - description_antag = "" - - icon = 'icons/vore/custom_guns_vr.dmi' - icon_state = "nsfw" - - icon_override = 'icons/vore/custom_guns_vr.dmi' - item_state = "gun" - - caliber = "nsfw" - - origin_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 6, TECH_MAGNETS = 4) - - fire_sound = 'sound/weapons/Taser.ogg' - - load_method = MAGAZINE //Nyeh heh hehhh. - magazine_type = null - allowed_magazines = list(/obj/item/ammo_magazine/nsfw_mag) - handle_casings = HOLD_CASINGS //Don't eject batteries! - recoil = 0 - var/charge_left = 0 - var/max_charge = 0 - charge_sections = 5 - -/obj/item/weapon/gun/projectile/nsfw/consume_next_projectile() - if(chambered && ammo_magazine) - var/obj/item/ammo_casing/nsfw_batt/batt = chambered - if(batt.shots_left) - return new chambered.projectile_type() - else - for(var/B in ammo_magazine.stored_ammo) - var/obj/item/ammo_casing/nsfw_batt/other_batt = B - if(istype(other_batt,chambered.type) && other_batt.shots_left) - switch_to(other_batt) - return new chambered.projectile_type() - break - - return null - -/obj/item/weapon/gun/projectile/nsfw/proc/update_charge() - charge_left = 0 - max_charge = 0 - - if(!chambered) - return - - var/obj/item/ammo_casing/nsfw_batt/batt = chambered - - charge_left = batt.shots_left - max_charge = initial(batt.shots_left) - if(ammo_magazine) //Crawl to find more - for(var/B in ammo_magazine.stored_ammo) - var/obj/item/ammo_casing/nsfw_batt/bullet = B - if(istype(bullet,batt.type)) - charge_left += bullet.shots_left - max_charge += initial(bullet.shots_left) - -/obj/item/weapon/gun/projectile/nsfw/proc/switch_to(obj/item/ammo_casing/nsfw_batt/new_batt) - if(ishuman(loc)) - if(chambered && new_batt.type == chambered.type) - to_chat(loc,"\The [src] is now using the next [new_batt.type_name] power cell.") - else - to_chat(loc,"\The [src] is now firing [new_batt.type_name].") - - chambered = new_batt - update_charge() - update_icon() - -/obj/item/weapon/gun/projectile/nsfw/attack_self(mob/user) - if(!chambered) - return - - var/list/stored_ammo = ammo_magazine.stored_ammo - - if(stored_ammo.len == 1) - return //silly you. - - //Find an ammotype that ISN'T the same, or exhaust the list and don't change. - var/our_slot = stored_ammo.Find(chambered) - - for(var/index in 1 to stored_ammo.len) - var/true_index = ((our_slot + index - 1) % stored_ammo.len) + 1 // Stupid ONE BASED lists! - var/obj/item/ammo_casing/nsfw_batt/next_batt = stored_ammo[true_index] - if(chambered != next_batt && !istype(next_batt, chambered.type)) - switch_to(next_batt) - break -/* -/obj/item/weapon/gun/projectile/nsfw/special_check(mob/user) - if(!chambered) - return - - var/obj/item/ammo_casing/nsfw_batt/batt = chambered - if(!batt.shots_left) - return FALSE - - return TRUE -*/ -/obj/item/weapon/gun/projectile/nsfw/load_ammo(var/obj/item/A, mob/user) - . = ..() - if(ammo_magazine && ammo_magazine.stored_ammo.len) - switch_to(ammo_magazine.stored_ammo[1]) - -/obj/item/weapon/gun/projectile/nsfw/unload_ammo(mob/user, var/allow_dump=1) - chambered = null - return ..() - -/obj/item/weapon/gun/projectile/nsfw/update_icon() - update_charge() - - cut_overlays() - if(!chambered) - return - - var/obj/item/ammo_casing/nsfw_batt/batt = chambered - var/batt_color = batt.type_color //Used many times - - //Mode bar - var/image/mode_bar = image(icon, icon_state = "[initial(icon_state)]_type") - mode_bar.color = batt_color - add_overlay(mode_bar) - - //Barrel color - var/image/barrel_color = image(icon, icon_state = "[initial(icon_state)]_barrel") - barrel_color.alpha = 150 - barrel_color.color = batt_color - add_overlay(barrel_color) - - //Charge bar - var/ratio = CEILING(((charge_left / max_charge) * charge_sections), 1) - for(var/i = 0, i < ratio, i++) - var/image/charge_bar = image(icon, icon_state = "[initial(icon_state)]_charge") - charge_bar.pixel_x = i - charge_bar.color = batt_color - add_overlay(charge_bar) - -// The Magazine // -/obj/item/ammo_magazine/nsfw_mag - name = "microbattery magazine" - desc = "A microbattery holder for the \'NSFW\'" - catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) - - description_info = "This magazine holds NSFW microbatteries to power the NSFW handgun. Up to three can be loaded at once, and each provides four shots of their respective energy type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger." - - icon = 'icons/obj/ammo_vr.dmi' - icon_state = "nsfw_mag" - caliber = "nsfw" - matter = list(DEFAULT_WALL_MATERIAL = 1680, "glass" = 2000) - ammo_type = /obj/item/ammo_casing/nsfw_batt - initial_ammo = 0 - max_ammo = 3 - mag_type = MAGAZINE - - var/list/modes = list() - -/obj/item/ammo_magazine/nsfw_mag/update_icon() - cut_overlays() - if(!stored_ammo.len) - return //Why bother - - var/x_offset = 5 - var/current = 0 - for(var/B in stored_ammo) - var/obj/item/ammo_casing/nsfw_batt/batt = B - var/image/cap = image(icon, icon_state = "[initial(icon_state)]_cap") - cap.color = batt.type_color - cap.pixel_x = current * x_offset //Caps don't need a pixel_y offset - add_overlay(cap) - - if(batt.shots_left) - var/ratio = CEILING(((batt.shots_left / initial(batt.shots_left)) * 4), 1) //4 is how many lights we have a sprite for - var/image/charge = image(icon, icon_state = "[initial(icon_state)]_charge-[ratio]") - charge.color = "#29EAF4" //Could use battery color but eh. - charge.pixel_x = current * x_offset - add_overlay(charge) - - current++ //Increment for offsets - -// The Casing // -/obj/item/ammo_casing/nsfw_batt - name = "\'NSFW\' microbattery - UNKNOWN" - desc = "A miniature battery for an energy weapon." - catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) - icon = 'icons/obj/ammo_vr.dmi' - icon_state = "nsfw_batt" - slot_flags = SLOT_BELT | SLOT_EARS - throwforce = 1 - w_class = ITEMSIZE_TINY - - leaves_residue = 0 - caliber = "nsfw" - var/shots_left = 4 - var/type_color = null - var/type_name = null - projectile_type = /obj/item/projectile/beam - -/obj/item/ammo_casing/nsfw_batt/Initialize() - . = ..() - pixel_x = rand(-10, 10) - pixel_y = rand(-10, 10) - update_icon() - -/obj/item/ammo_casing/nsfw_batt/update_icon() - cut_overlays() - - var/image/ends = image(icon, icon_state = "[initial(icon_state)]_ends") - ends.color = type_color - add_overlay(ends) - -/obj/item/ammo_casing/nsfw_batt/expend() - shots_left-- - -// Specific batteries // -/obj/item/ammo_casing/nsfw_batt/lethal - name = "\'NSFW\' microbattery - LETHAL" - type_color = "#bf3d3d" - type_name = "LETHAL" - projectile_type = /obj/item/projectile/beam - -/obj/item/ammo_casing/nsfw_batt/stun - name = "\'NSFW\' microbattery - STUN" - type_color = "#0f81bc" - type_name = "STUN" - projectile_type = /obj/item/projectile/beam/stun/blue - -/obj/item/ammo_casing/nsfw_batt/net - name = "\'NSFW\' microbattery - NET" - type_color = "#43f136" - type_name = "NET" - projectile_type = /obj/item/projectile/beam/energy_net - -/obj/item/ammo_casing/nsfw_batt/xray - name = "\'NSFW\' microbattery - XRAY" - type_color = "#32c025" - type_name = "XRAY" - projectile_type = /obj/item/projectile/beam/xray - -/obj/item/ammo_casing/nsfw_batt/shotstun - name = "\'NSFW\' microbattery - SCATTERSTUN" - type_color = "#88ffff" - type_name = "SCATTERSTUN" - projectile_type = /obj/item/projectile/bullet/pellet/e_shot_stun - -/obj/item/projectile/bullet/pellet/e_shot_stun - icon_state = "spell" - damage = 2 - agony = 20 - pellets = 6 //number of pellets - range_step = 2 //projectile will lose a fragment each time it travels this distance. Can be a non-integer. - base_spread = 90 //lower means the pellets spread more across body parts. If zero then this is considered a shrapnel explosion instead of a shrapnel cone - spread_step = 10 - embed_chance = 0 - sharp = 0 - check_armour = "melee" - -/obj/item/ammo_casing/nsfw_batt/ion - name = "\'NSFW\' microbattery - ION" - type_color = "#d084d6" - type_name = "ION" - projectile_type = /obj/item/projectile/ion/small - -/obj/item/ammo_casing/nsfw_batt/stripper - name = "\'NSFW\' microbattery - STRIPPER" - type_color = "#fc8d0f" - type_name = "STRIPPER" - projectile_type = /obj/item/projectile/bullet/stripper - -/obj/item/projectile/bullet/stripper - icon_state = "magicm" - nodamage = 1 - agony = 5 - embed_chance = 0 - sharp = 0 - check_armour = "melee" - -/obj/item/projectile/bullet/stripper/on_hit(var/atom/stripped) - if(ishuman(stripped)) - var/mob/living/carbon/human/H = stripped - if(H.wear_suit) - H.unEquip(H.wear_suit) - if(H.w_uniform) - H.unEquip(H.w_uniform) - if(H.back) - H.unEquip(H.back) - if(H.shoes) - H.unEquip(H.shoes) - if(H.gloves) - H.unEquip(H.gloves) - //Hats can stay! Most other things fall off with removing these. - ..() - -/obj/item/ammo_casing/nsfw_batt/final - name = "\'NSFW\' microbattery - FINAL OPTION" - type_color = "#fcfc0f" - type_name = "FINAL OPTION" //Doesn't look good in yellow in chat - projectile_type = /obj/item/projectile/beam/final_option - -/obj/item/projectile/beam/final_option - name = "final option beam" - icon_state = "omnilaser" - nodamage = 1 - agony = 5 - damage_type = HALLOSS - light_color = "#00CC33" - - muzzle_type = /obj/effect/projectile/muzzle/laser_omni - tracer_type = /obj/effect/projectile/tracer/laser_omni - impact_type = /obj/effect/projectile/impact/laser_omni - -/obj/item/projectile/beam/final_option/on_hit(var/atom/impacted) - if(isliving(impacted)) - var/mob/living/L = impacted - if(L.mind) - var/nif - if(ishuman(L)) - var/mob/living/carbon/human/H = L - nif = H.nif - SStranscore.m_backup(L.mind,nif,one_time = TRUE) - L.gib() - - ..() -/* -/obj/item/ammo_casing/nsfw_batt/shrink - name = "\'NSFW\' microbattery - SHRINK" - type_color = "#910ffc" - type_name = "SHRINK" - projectile_type = /obj/item/projectile/beam/shrinklaser - -/obj/item/ammo_casing/nsfw_batt/grow - name = "\'NSFW\' microbattery - GROW" - type_color = "#fc0fdc" - type_name = "GROW" - projectile_type = /obj/item/projectile/beam/growlaser -*/ -/obj/item/weapon/storage/secure/briefcase/nsfw_pack - name = "\improper KHI-102b \'NSFW\' gun kit" - desc = "A storage case for a multi-purpose handgun. Variety hour!" - max_w_class = ITEMSIZE_NORMAL - -/obj/item/weapon/storage/secure/briefcase/nsfw_pack/New() - ..() - new /obj/item/weapon/gun/projectile/nsfw(src) - new /obj/item/ammo_magazine/nsfw_mag(src) - for(var/path in subtypesof(/obj/item/ammo_casing/nsfw_batt)) - new path(src) - -/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos - name = "\improper KHI-102b \'NSFW\' gun kit" - desc = "A storage case for a multi-purpose handgun. Variety hour!" - max_w_class = ITEMSIZE_NORMAL - -/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos/New() - ..() - new /obj/item/weapon/gun/projectile/nsfw(src) - new /obj/item/ammo_magazine/nsfw_mag(src) - new /obj/item/ammo_casing/nsfw_batt/lethal(src) - new /obj/item/ammo_casing/nsfw_batt/lethal(src) - new /obj/item/ammo_casing/nsfw_batt/stun(src) - new /obj/item/ammo_casing/nsfw_batt/stun(src) - new /obj/item/ammo_casing/nsfw_batt/net(src) - new /obj/item/ammo_casing/nsfw_batt/ion(src) - diff --git a/code/modules/vore/fluffstuff/guns/protector.dm b/code/modules/vore/fluffstuff/guns/protector.dm index c66a8fb7d2d..b090e963d68 100644 --- a/code/modules/vore/fluffstuff/guns/protector.dm +++ b/code/modules/vore/fluffstuff/guns/protector.dm @@ -108,12 +108,3 @@ muzzle_type = /obj/effect/projectile/muzzle/laser_omni tracer_type = /obj/effect/projectile/tracer/laser_omni impact_type = /obj/effect/projectile/impact/laser_omni - -//R&D Design -/datum/design/item/weapon/protector - desc = "The 'Protector' is an advanced energy gun that cannot be fired in lethal mode on low security alert levels, but features DNA locking and a powerful stun." - id = "protector" - req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "silver" = 1000) - build_path = /obj/item/weapon/gun/energy/protector - sort_string = "TAADA" diff --git a/code/modules/vore/fluffstuff/guns/pummeler.dm b/code/modules/vore/fluffstuff/guns/pummeler.dm index 082af9a9cfd..75563208f27 100644 --- a/code/modules/vore/fluffstuff/guns/pummeler.dm +++ b/code/modules/vore/fluffstuff/guns/pummeler.dm @@ -46,12 +46,3 @@ L.throw_at(get_edge_target_turf(L, throwdir), rand(3,6), 10) return 1 - -//R&D Design -/datum/design/item/weapon/pummeler - desc = "With the 'Pummeler', punt anyone you don't like out of the room!" - id = "pummeler" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 5) - materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000, "uranium" = 1000) - build_path = /obj/item/weapon/gun/energy/pummeler - sort_string = "TAADC" diff --git a/code/modules/vore/fluffstuff/guns/sickshot.dm b/code/modules/vore/fluffstuff/guns/sickshot.dm index 385a69efd6c..098db695979 100644 --- a/code/modules/vore/fluffstuff/guns/sickshot.dm +++ b/code/modules/vore/fluffstuff/guns/sickshot.dm @@ -46,12 +46,3 @@ H.Confuse(2) return 1 - -//R&D Design -/datum/design/item/weapon/sickshot - desc = "A 'Sickshot' is a 4-shot energy revolver that causes nausea and confusion." - id = "sickshot" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 2) - materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000) - build_path = /obj/item/weapon/gun/energy/sickshot - sort_string = "TAADB" diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm index 4e7e855ae81..d9db06118ff 100644 --- a/code/modules/vore/resizing/holder_micro_vr.dm +++ b/code/modules/vore/resizing/holder_micro_vr.dm @@ -4,6 +4,7 @@ name = "micro" desc = "Another crewmember, small enough to fit in your hand." icon_state = "micro" + icon_override = 'icons/mob/head_vr.dmi' slot_flags = SLOT_FEET | SLOT_HEAD | SLOT_ID w_class = ITEMSIZE_SMALL item_icons = list() // No in-hand sprites (for now, anyway, we could totally add some) @@ -34,4 +35,9 @@ var/turf/here = get_turf(src) for(var/atom/movable/A in src) A.forceMove(here) - return ..() \ No newline at end of file + return ..() + +/obj/item/weapon/holder/micro/sync(var/mob/living/M) + ..() + for(var/mob/living/carbon/human/I in contents) + item_state = lowertext(I.species.name) \ No newline at end of file diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index c92121da918..2073f499c1a 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -135,7 +135,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 var/mob/living/simple_mob/SA = M if(!SA.has_hands) return 0 - if(M.buckled) + if(buckled) to_chat(usr,"You have to unbuckle \the [M] before you pick them up.") return 0 if(size_diff >= 0.50) diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm index 705bf3538d7..984e05f8edf 100644 --- a/code/modules/vore/resizing/sizegun_vr.dm +++ b/code/modules/vore/resizing/sizegun_vr.dm @@ -82,3 +82,11 @@ H.updateicon() else return 1 + + +/obj/item/projectile/beam/sizelaser/shrink + set_size = 0.5 //50% of current size + + +/obj/item/projectile/beam/sizelaser/grow + set_size = 2.0 //200% of current size \ No newline at end of file diff --git a/code/modules/xenoarcheaology/effects/radiate.dm b/code/modules/xenoarcheaology/effects/radiate.dm index a083cdddbc4..e38540eb045 100644 --- a/code/modules/xenoarcheaology/effects/radiate.dm +++ b/code/modules/xenoarcheaology/effects/radiate.dm @@ -15,10 +15,10 @@ /datum/artifact_effect/radiate/DoEffectAura() if(holder) - radiation_repository.flat_radiate(holder, radiation_amount, src.effectrange) + SSradiation.flat_radiate(holder, radiation_amount, src.effectrange) return 1 /datum/artifact_effect/radiate/DoEffectPulse() if(holder) - radiation_repository.radiate(holder, ((radiation_amount * 3) * (sqrt(src.effectrange)))) //Need to get feedback on this //VOREStation Edit - Was too crazy-strong. + SSradiation.radiate(holder, ((radiation_amount * 3) * (sqrt(src.effectrange)))) //Need to get feedback on this //VOREStation Edit - Was too crazy-strong. return 1 diff --git a/code/modules/xenoarcheaology/finds/find_spawning.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm index 2c04d491d05..be86279b087 100644 --- a/code/modules/xenoarcheaology/finds/find_spawning.dm +++ b/code/modules/xenoarcheaology/finds/find_spawning.dm @@ -511,6 +511,16 @@ desc = new_item.desc item_type = new_item.name + if(39) + // Telecube. + if(prob(25)) + apply_prefix = FALSE + if(prob(75)) + apply_image_decorations = TRUE + if(prob(25)) + apply_material_decorations = FALSE + new_item = new /obj/item/weapon/telecube/randomized(src.loc) + if(istype(new_item, /obj/item/weapon/material)) var/new_item_mat = pickweight( DEFAULT_WALL_MATERIAL = 80, diff --git a/code/modules/xenoarcheaology/finds/finds.dm b/code/modules/xenoarcheaology/finds/finds.dm index ab5d00e7861..8e89dcd9478 100644 --- a/code/modules/xenoarcheaology/finds/finds.dm +++ b/code/modules/xenoarcheaology/finds/finds.dm @@ -14,20 +14,22 @@ clearance_range = rand(4, 12) dissonance_spread = rand(1500, 2500) / 100 -/obj/item/weapon/ore/strangerock +/obj/item/weapon/strangerock name = "Strange rock" desc = "Seems to have some unusal strata evident throughout it." icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "strange" + var/datum/geosample/geologic_data origin_tech = list(TECH_MATERIAL = 5) -/obj/item/weapon/ore/strangerock/New(loc, var/inside_item_type = 0) - ..(loc) +/obj/item/weapon/strangerock/New(loc, var/inside_item_type = 0) + pixel_x = rand(0,16)-8 + pixel_y = rand(0,8)-8 if(inside_item_type) new /obj/item/weapon/archaeological_find(src, new_item_type = inside_item_type) -/obj/item/weapon/ore/strangerock/attackby(var/obj/item/I, var/mob/user) +/obj/item/weapon/strangerock/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/weapon/pickaxe/brush)) var/obj/item/inside = locate() in src if(inside) diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm index b97a34e48fa..5b31f884001 100644 --- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm @@ -198,7 +198,7 @@ radiation = rand() * 15 + 85 if(!rad_shield) //irradiate nearby mobs - radiation_repository.radiate(src, radiation / 25) + SSradiation.radiate(src, radiation / 25) else t_left_radspike = pick(10,15,25) @@ -244,6 +244,7 @@ scanner_temperature = max(scanner_temperature - 5 - 10 * rand(), 0) if(prob(0.75)) src.visible_message("\icon[src] [pick("plinks","hisses")][pick(" quietly"," softly"," sadly"," plaintively")].", 2) + playsound(loc, 'sound/effects/ding.ogg', 25) last_process_worldtime = world.time /obj/machinery/radiocarbon_spectrometer/proc/stop_scanning() diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index e99648be6a3..f7de728072f 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -2,7 +2,8 @@ some~user - Species 911earlyarther - Xenomorph Hybrid admiraldragon - Vox -aether_elemental - Daemon +aetherelemental - Daemon +arandomalien - Xenochimera arokha - Protean aruis - Diona aruis - Xenochimera @@ -10,14 +11,18 @@ azmodan412 - Xenochimera azmodan412 - Xenomorph Hybrid bothnevarbackwards - Diona cameron653 - Xenomorph Hybrid +crossexonar - Protean funnyman2003 - Xenochimera hawkerthegreat - Vox +hollifex - Diona inuzari - Diona jademanique - Xenochimera jemli - Gutter +killerdragn - Xenomorph Hybrid ktccd - Diona mewchild - Diona mewchild - Vox +mrsebbi - Xenochimera natje - Xenochimera oreganovulgaris - Xenochimera paradoxspace - Xenochimera @@ -32,13 +37,15 @@ rykkastormheart - Xenochimera seiga - Vox sepulchre - Vox sepulchre - Xenomorph Hybrid -silverTalismen - Diona -silverTalismen - Vox +silvertalismen - Diona +silvertalismen - Vox silvertalismen - Xenochimera singo - Gutter tastypred - Xenochimera +timidvi - Diona varonis - Xenochimera verkister - Xenochimera +westfire - Xenomorph Hybrid wickedtemp - Shadekin Empathy wtfismyname - Xenomorph Hybrid xioen - Diona diff --git a/config/custom_items.txt b/config/custom_items.txt index a46362b3f94..16734abd704 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -75,7 +75,7 @@ item_path: /obj/item/device/flashlight/pen/fluff/lynn { ckey: arokha character_name: Aronai Kadigan -item_path: /obj/item/clothing/under/utility/sifguard/medical/command +item_path: /obj/item/clothing/under/solgov/utility/sifguard/medical/command item_name: centcom medical uniform item_desc: A medical uniform straight from Central Command. } @@ -148,7 +148,7 @@ item_path: /obj/item/weapon/storage/box/fluff/octavious { ckey: burritojustice character_name: Jayda Wilson -item_path: /obj/item/clothing/under/utility/sifguard/medical +item_path: /obj/item/clothing/under/solgov/utility/sifguard/medical/fluff } # ######## C CKEYS @@ -629,6 +629,13 @@ item_path: /obj/item/weapon/fluff/dragor_dot # ######## R CKEYS +{ +ckey: radiantaurora +character_name: Tiemli Kroto +item_path: /obj/item/clothing/glasses/welding/tiemgogs +req_titles: Roboticist +} + # ######## S CKEYS { ckey: samanthafyre diff --git a/config/jobwhitelist.txt b/config/jobwhitelist.txt index e615f5eafd7..859e8e2007d 100644 --- a/config/jobwhitelist.txt +++ b/config/jobwhitelist.txt @@ -8,3 +8,4 @@ tinybear16 - clown chargae - mime verkister - clown H0lySquirr3l - clown +sgtryder - mime \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index f122636ec5b..71ae05fb380 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,86 @@ -->
    +

    07 September 2019

    +

    Heroman3003 updated:

    +
      +
    • Desk bells can now be picked up like normal items.
    • +
    • Desk bells can now be deconstructed with a wrench while on the ground.
    • +
    • Desk bells can now only be made out of steel.
    • +
    +

    MisterLayne updated:

    +
      +
    • Material weapons that should not conduct, do not conduct.
    • +
    • Glass shards now do damage when you attack with them, based on the type of gloves you are wearing.
    • +
    +

    Novacat updated:

    +
      +
    • Ports MREs from Baystation, and adds a few supply crates with them to cargo.
    • +
    • Adds liquidprotein rations, currently only found in emergency MREs.
    • +
    +

    Woodrat updated:

    +
      +
    • Mining vendor added to cargo foyer.
    • +
    • Explorer vendor added to research foyer.
    • +
    • Handful of more pipe clamps added to engineering (atmos monitoring and EVA storage).
    • +
    • Adjustment to layout of chapel mass driver.
    • +
    +

    chaoko99 updated:

    +
      +
    • Ported Bay's stomach pump.
    • +
    + +

    21 August 2019

    +

    Atermonera updated:

    +
      +
    • Atmospherics is now bigger, with more room for fun and sanity-destroying spaghetti!
    • +
    +

    Mechoid updated:

    +
      +
    • Exosuits are now targetted by turrets again.
    • +
    • Mining charge strength lowered, price increased. Can be upgraded through R&D laser components.
    • +
    • Searing damage type added. Energy axe now uses searing damage.
    • +
    • Survey points added. Vendor added for explorer use. Costs are universally 'lower' compared to the mining vendor due to the rarity of points.
    • +
    • Swiping an ID card on a cataloguer will transfer the points to the card.
    • +
    • Any melee energy weapon can now be made to use a cell and charge.
    • +
    • Energy Axe prototype added to R&D.
    • +
    • Anomalous 'hunting trap' added to R&D. Useful for an initial stun on mobs for explorer scanning.
    • +
    • Beartraps now stun for a quarter of a second, so they are actually useful again, due to resistability.
    • +
    • Emergency welding pack added. Incredibly slow, but requires no protection.
    • +
    • Random turf modifier added for mapping use. Random humanoid remains spawner added for mapping use.
    • +
    • Plants under obj/structure/flora now can be made to be harvestable / forage-able.
    • +
    • Sif trees now occasionally have fruit containing useful microbes. Microbes slow blood flow resulting in slower chemical absorption and blood loss.
    • +
    • Flora by default are now under mobs, on the same layer as turf decals. Flora can now also randomize their size, previously only codified in Sivian trees.
    • +
    • Moss tendrils added to Sif, making eye-plants more rare.
    • +
    • Multiple PoIs added. 'Blue shuttle down' variant, 'UFO Frigate', multiple geysers, cliffs, and two variants of SFR which take drastically different approaches to the SFR standard. A vault was added, too.
    • +
    • Vault PoIs are now in a template group.
    • +
    • Generic AI-controlled humanoids added. Subtype made for use on Sif, clad in weak armor and temperature resistance, used as 'mindless clones'.
    • +
    • More artifice added.
    • +
    • Fultons made to be [somewhat] sane. Now only useable planetside.
    • +
    • Graviton Visor moved to R&D from the mining equipment vendor. Silver and Diamond pickaxes removed.
    • +
    • Added multiple new organs for Prometheans. Removing them will cause them to take large amounts of Toxloss untill they are Regenerated using the active regeneration verb.
    • +
    • Organ: pneumatic network, a series of skeletal tubes with high pressure used to move nutrients and waste.
    • +
    • Organs: -regenesis systems, different 'networks' of clumped cellular matter that allow Prometheans to recover rapidly from small injuries. Large or numerous injuries cause un-needed stress, and pain.
    • +
    • Internal organs now properly add themselves to the internal organ-by-name list, the one referenced 99.9% of the time.
    • +
    • Active regeneration will now replace internal organs if they are nonexistant, as it does for limbs.
    • +
    +

    Nalarac updated:

    +
      +
    • Mech cable layer works again.
    • +
    • Added setting for turrets to fire upon downed/laying targets.
    • +
    +

    TheFurryFeline updated:

    +
      +
    • New orange jumpsuit for loadout that doesn't get locked to tracking.
    • +
    • Prison jumpsuit filepath changed accordingly and closets with obj updated.
    • +
    +

    Woodrat updated:

    +
      +
    • Made the solgov uniforms use accessories for denoting department instead of having several different sprites in the uniform dmi folder.
    • +
    • Removed redundant solgov uniforms from uniform.dmi and moved the sprites for the solgov uniforms to their own dmi.
    • +
    • Fixed storage vests and drop pouches disappearing when one rolls down a uniform.
    • +
    +

    08 August 2019

    Mechoid updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 4b1d6be2b88..7c6b2ae448d 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -4680,3 +4680,87 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Updates the Supermatter Engine Operating Manual. mistyLuminescence: - tweak: Serenity mech can now be built by robotics. +2019-08-21: + Atermonera: + - tweak: Atmospherics is now bigger, with more room for fun and sanity-destroying + spaghetti! + Mechoid: + - bugfix: Exosuits are now targetted by turrets again. + - tweak: Mining charge strength lowered, price increased. Can be upgraded through + R&D laser components. + - rscadd: Searing damage type added. Energy axe now uses searing damage. + - rscadd: Survey points added. Vendor added for explorer use. Costs are universally + 'lower' compared to the mining vendor due to the rarity of points. + - rscadd: Swiping an ID card on a cataloguer will transfer the points to the card. + - tweak: Any melee energy weapon can now be made to use a cell and charge. + - rscadd: Energy Axe prototype added to R&D. + - rscadd: Anomalous 'hunting trap' added to R&D. Useful for an initial stun on mobs + for explorer scanning. + - tweak: Beartraps now stun for a quarter of a second, so they are actually useful + again, due to resistability. + - rscadd: Emergency welding pack added. Incredibly slow, but requires no protection. + - rscadd: Random turf modifier added for mapping use. Random humanoid remains spawner + added for mapping use. + - rscadd: Plants under obj/structure/flora now can be made to be harvestable / forage-able. + - rscadd: Sif trees now occasionally have fruit containing useful microbes. Microbes + slow blood flow resulting in slower chemical absorption and blood loss. + - tweak: Flora by default are now under mobs, on the same layer as turf decals. + Flora can now also randomize their size, previously only codified in Sivian + trees. + - rscadd: Moss tendrils added to Sif, making eye-plants more rare. + - rscadd: Multiple PoIs added. 'Blue shuttle down' variant, 'UFO Frigate', multiple + geysers, cliffs, and two variants of SFR which take drastically different approaches + to the SFR standard. A vault was added, too. + - tweak: Vault PoIs are now in a template group. + - rscadd: Generic AI-controlled humanoids added. Subtype made for use on Sif, clad + in weak armor and temperature resistance, used as 'mindless clones'. + - rscadd: More artifice added. + - tweak: Fultons made to be [somewhat] sane. Now only useable planetside. + - tweak: Graviton Visor moved to R&D from the mining equipment vendor. Silver and + Diamond pickaxes removed. + - rscadd: Added multiple new organs for Prometheans. Removing them will cause them + to take large amounts of Toxloss untill they are Regenerated using the active + regeneration verb. + - rscadd: 'Organ: pneumatic network, a series of skeletal tubes with high pressure + used to move nutrients and waste.' + - rscadd: 'Organs: -regenesis systems, different ''networks'' of clumped cellular + matter that allow Prometheans to recover rapidly from small injuries. Large + or numerous injuries cause un-needed stress, and pain.' + - bugfix: Internal organs now properly add themselves to the internal organ-by-name + list, the one referenced 99.9% of the time. + - tweak: Active regeneration will now replace internal organs if they are nonexistant, + as it does for limbs. + Nalarac: + - bugfix: Mech cable layer works again. + - rscadd: Added setting for turrets to fire upon downed/laying targets. + TheFurryFeline: + - rscadd: New orange jumpsuit for loadout that doesn't get locked to tracking. + - tweak: Prison jumpsuit filepath changed accordingly and closets with obj updated. + Woodrat: + - tweak: Made the solgov uniforms use accessories for denoting department instead + of having several different sprites in the uniform dmi folder. + - tweak: Removed redundant solgov uniforms from uniform.dmi and moved the sprites + for the solgov uniforms to their own dmi. + - bugfix: Fixed storage vests and drop pouches disappearing when one rolls down + a uniform. +2019-09-07: + Heroman3003: + - tweak: Desk bells can now be picked up like normal items. + - tweak: Desk bells can now be deconstructed with a wrench while on the ground. + - tweak: Desk bells can now only be made out of steel. + MisterLayne: + - tweak: Material weapons that should not conduct, do not conduct. + - tweak: Glass shards now do damage when you attack with them, based on the type + of gloves you are wearing. + Novacat: + - rscadd: Ports MREs from Baystation, and adds a few supply crates with them to + cargo. + - rscadd: Adds liquidprotein rations, currently only found in emergency MREs. + Woodrat: + - rscadd: Mining vendor added to cargo foyer. + - rscadd: Explorer vendor added to research foyer. + - rscadd: Handful of more pipe clamps added to engineering (atmos monitoring and + EVA storage). + - tweak: Adjustment to layout of chapel mass driver. + chaoko99: + - rscadd: Ported Bay's stomach pump. diff --git a/html/changelogs/Anewbe - Bloodloss.yml b/html/changelogs/Anewbe - Bloodloss.yml deleted file mode 100644 index 8ec14a38db5..00000000000 --- a/html/changelogs/Anewbe - Bloodloss.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# 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: - - bugfix: "You can no longer have ALL of your blood punched out." - - bugfix: "Haemophiliacs will no longer spontaneously have ALL of their blood go missing from ~90%." diff --git a/html/changelogs/Anewbe - Headgibs.yml b/html/changelogs/Anewbe - Headgibs.yml deleted file mode 100644 index 6aa097a1720..00000000000 --- a/html/changelogs/Anewbe - Headgibs.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# 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: "Headgibbing is now determined by config" diff --git a/html/changelogs/Anewbe - Languages.yml b/html/changelogs/Anewbe - Languages.yml deleted file mode 100644 index da9a2f7b42c..00000000000 --- a/html/changelogs/Anewbe - Languages.yml +++ /dev/null @@ -1,40 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# 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: "Certain languages now require assistance for a species to speak, but not understand, much like EAL." - - tweak: "Alai can only be `spoken` by Taj and Teshari." - - rscadd: "Adds a voicebox/larynx organ. Its only purpose at the moment is to assist in speaking certain langauges." - - tweak: "Language implants, like the EAL implant, now affect the voicebox organ, instead of being a freefloating implant." - - rscadd: "Adds a language implant for Common Skrellian." \ No newline at end of file diff --git a/html/changelogs/Anewbe - Pilots.yml b/html/changelogs/Anewbe - Pilots.yml deleted file mode 100644 index 51684ce1376..00000000000 --- a/html/changelogs/Anewbe - Pilots.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Anewbe -delete-after: True -changes - - tweak: "Pilot consoles now require pilot access to use." \ No newline at end of file diff --git a/html/changelogs/Anewbe - Voice Changers.yml b/html/changelogs/Anewbe - Voice Changers.yml deleted file mode 100644 index 93d09587bf9..00000000000 --- a/html/changelogs/Anewbe - Voice Changers.yml +++ /dev/null @@ -1,39 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# 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: - - bugfix: "Voice changing masks no longer give up when you put on a hardsuit." - - tweak: "Mask voice changers start on." - - tweak: "Mask voice changers that do not have a set voice will now default to your worn ID's name." - - tweak: "Mask voice changers now have a verb to reset their name." \ No newline at end of file diff --git a/html/changelogs/Anewbe - Yet More Gibberish.yml b/html/changelogs/Anewbe - Yet More Gibberish.yml deleted file mode 100644 index d7472af1c30..00000000000 --- a/html/changelogs/Anewbe - Yet More Gibberish.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# 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 hyphen (-) is no longer a default language key, as people use it to represent other things. If you are still having issues with Gibberish, reset your language keys, or at least make sure they don't include any characters you regularly start speech with." diff --git a/html/changelogs/Ater - stasisbags.yml b/html/changelogs/Ater - stasisbags.yml deleted file mode 100644 index 11023943e92..00000000000 --- a/html/changelogs/Ater - stasisbags.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Atermonera -delete-after: True -changes: - - bugfix: "Stasis bags don't squish organics with high pressure when organics try to seek shelter from flesh wounds." - - tweak: "Body- and stasis bags can be tread upon when open." diff --git a/html/changelogs/Atermonera - Ceilings.yml b/html/changelogs/Atermonera - Ceilings.yml deleted file mode 100644 index 760df592f50..00000000000 --- a/html/changelogs/Atermonera - Ceilings.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: Atermonera -delete-after: True -changes: - - rscadd: "Steel sheets can be used to construct Roofing Tiles" - - rscadd: "Roofing tiles can be used on tiles under open spaces or space tiles in multiZ maps to place a lattice and plating on the space above" - - rscadd: "Roofing tiles can be used on outdoor turfs to make them indoors" - - rscadd: "Both functions work together on multiZ maps with outdoor turfs, only one roofing tile is used per tile roofed." diff --git a/html/changelogs/Atermonera-pressure_protection.yml b/html/changelogs/Atermonera-pressure_protection.yml deleted file mode 100644 index b846aec6d85..00000000000 --- a/html/changelogs/Atermonera-pressure_protection.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: Atermonera -delete-after: True -changes: - - rscadd: "Clothing now has pressure protection variables, that set lower and upper pressure bounds within which they will protect you from pressure-based harm." - - rscadd: "Protection falls off when exceeding the pressure limits from 100% protection at the boundary to 0% at 10% in excess (above the max or below the min) boundary." - - tweak: "Currently, only hat and suit slots are checked for this protection (No change)." - - tweak: "Anomaly suits (The orange ones) now offer limited pressure protection in case anomalies start making or draining air." - - bugfix: "Firesuits are no longer spaceproof, but still offer protection against the high pressures of fire." diff --git a/html/changelogs/Cerebulon - Clothes.yml b/html/changelogs/Cerebulon - Clothes.yml deleted file mode 100644 index b05070efd1a..00000000000 --- a/html/changelogs/Cerebulon - Clothes.yml +++ /dev/null @@ -1,8 +0,0 @@ - - -author: Cerebulon - -delete-after: True - -changes: - - rscadd: "Added 12 new loadout items plus colour variants: Utility pants, sleek overalls, sari, modern wrap jacket, ascetic garb, asymmetrical jackets, cowled vest, kamishimo, jingasa, maang tikka, thin-frame glasses, rimless glasses." diff --git a/html/changelogs/Cerebulon - Namelists.yml b/html/changelogs/Cerebulon - Namelists.yml deleted file mode 100644 index 6fd79111319..00000000000 --- a/html/changelogs/Cerebulon - Namelists.yml +++ /dev/null @@ -1,7 +0,0 @@ - -author: Cerebulon - -delete-after: True - -changes: - - rscadd: "Added 1000+ surnames and 1200+ forenames from various world cultures to human namelists" diff --git a/html/changelogs/Cerebulon - ReligionUpdate.yml b/html/changelogs/Cerebulon - ReligionUpdate.yml deleted file mode 100644 index 50f402fae06..00000000000 --- a/html/changelogs/Cerebulon - ReligionUpdate.yml +++ /dev/null @@ -1,15 +0,0 @@ - -author: Cerebulon - -# 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: "Added customizable religious icons to the chaplain's office." - - rscadd: "Added black and white candles." - - tweak: "Updated religion lists in character setup to be lore friendly." diff --git a/html/changelogs/Cerebulon -Teshrigs.yml b/html/changelogs/Cerebulon -Teshrigs.yml deleted file mode 100644 index 1f4b499866e..00000000000 --- a/html/changelogs/Cerebulon -Teshrigs.yml +++ /dev/null @@ -1,7 +0,0 @@ - -author: Cerebulon - -delete-after: True - -changes: - - rscadd: "Added teshari hardsuit sprites." diff --git a/html/changelogs/Eguns - Anewbe.yml b/html/changelogs/Eguns - Anewbe.yml deleted file mode 100644 index 9454b66ccda..00000000000 --- a/html/changelogs/Eguns - Anewbe.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# 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: "Eguns take 4 shots to stun, rather than 3." diff --git a/html/changelogs/Hubblenaut - airlocks.yml b/html/changelogs/Hubblenaut - airlocks.yml deleted file mode 100644 index 2091ab65964..00000000000 --- a/html/changelogs/Hubblenaut - airlocks.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Hubblenaut - -# 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: "If a cycling airlock is already near the target pressure, pressing the buttons will toggle the doors instead of making it reenter the cycle process." diff --git a/html/changelogs/KasparoVv - PR - 4130.yml b/html/changelogs/KasparoVv - PR - 4130.yml deleted file mode 100644 index 6a46094651d..00000000000 --- a/html/changelogs/KasparoVv - PR - 4130.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: KasparoVy -delete-after: True -changes: - - rscadd: "Hiding mobs are now revealed when grabbed, buckled and/or killed." - - rscadd: "You cannot hide if you grab something, are grabbed yourself or are buckled." - - rscadd: "Adds some fluff messages for when hiding mobs are revealed." diff --git a/html/changelogs/KasparoVv - PR - 5429.yml b/html/changelogs/KasparoVv - PR - 5429.yml deleted file mode 100644 index 10bcc76fbbf..00000000000 --- a/html/changelogs/KasparoVv - PR - 5429.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: KasparoVv -delete-after: True -changes: - - rscadd: "You can now change the order of your body markings at character creation with the push of a button. Shift markings up or down layers at will to design the character you've always wanted, more easily than ever before." \ No newline at end of file diff --git a/html/changelogs/Kates - Hedgetrimmers.yml b/html/changelogs/Kates - Hedgetrimmers.yml deleted file mode 100644 index 142f879e401..00000000000 --- a/html/changelogs/Kates - Hedgetrimmers.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: LBnesquik - -# 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: "Remplaced the plant clippers with a reskinned pair of hedgetrimmers." diff --git a/html/changelogs/Lbnesquik - Botany improvements #5662.yml b/html/changelogs/Lbnesquik - Botany improvements #5662.yml deleted file mode 100644 index 980a8498501..00000000000 --- a/html/changelogs/Lbnesquik - Botany improvements #5662.yml +++ /dev/null @@ -1,44 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Lbnesquik - -# 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: "General biogenerator improvements:" - - rscadd: "Added feedback noise to the processing." - - rscadd: "Allow for cream dispensing." - - rscadd: "Allow for plant bag creation." - - rscadd: "Allow for 5 units of meat to be dispensed at once." - - rscadd: "Allow for 5 units of liquids to be dispensed at once totalling 50u." - - rscadd: "Add and allow the creation of larger plant bags for easier ferrying of plants.." - - rscadd: "Add a description to the machine itself." - - bugfix: "Fix a typo." diff --git a/html/changelogs/Leshana - vplk-airlocks-cycle-to-ext.yml b/html/changelogs/Leshana - vplk-airlocks-cycle-to-ext.yml deleted file mode 100644 index 3f59f30fea9..00000000000 --- a/html/changelogs/Leshana - vplk-airlocks-cycle-to-ext.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Leshana and mustafakalash -delete-after: True -changes: - - rscadd: "A new 'planetary' mode for airlocks which makes them purge the chamber contents to the exterior atmosphere before filling with clean air, and vice versa." diff --git a/html/changelogs/Leshana-vplk-persistence.yml b/html/changelogs/Leshana-vplk-persistence.yml deleted file mode 100644 index 3e396d66349..00000000000 --- a/html/changelogs/Leshana-vplk-persistence.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: Leshana -delete-after: True -changes: - - rscadd: "Enables round-to-round persistence of a few aspects of characters. More accurately, it automates updating your character setup. None of this code does anything you could not already do manually on the Character Setup screen, it simply does it automatically for you. ALL of these changes are optional, toggled on the VORE tab of character setup." - - rscadd: "Your late-join spawn location is determined by which cryo/elevator/etc you used to leave last time. Departing thru the elevators will set your spawn location to elevators etc." - - rscadd: "Your weight is saved (also any extra or deficient nutrition is resolved into weight gain/loss)" - - rscadd: "Your limbs settings are updated based on your status at end of round (whether limbs are normal, missing, robotic, etc)" - - rscadd: "Your markings are saved so they will be the same as when they were at end of round." - - tweak: "Replaced hard coded numbers for weight gain with constant defines." diff --git a/html/changelogs/Leshana-vplk-process-debug-verbs.yml b/html/changelogs/Leshana-vplk-process-debug-verbs.yml deleted file mode 100644 index af0ffd3f9d6..00000000000 --- a/html/changelogs/Leshana-vplk-process-debug-verbs.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Leshana -delete-after: True -changes: - - rscadd: "Added admin verbs for debugging the scheduled process controllers." diff --git a/html/changelogs/Mechoid - Custom Rigs.yml b/html/changelogs/Mechoid - Custom Rigs.yml deleted file mode 100644 index 54ce0704cc7..00000000000 --- a/html/changelogs/Mechoid - Custom Rigs.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Mechoid - -# 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: "Added a RIG customization kit." - - tweak: "RIGs now use a var called suit_state to determine the basis for their component icons, rather than the rig's icon state." diff --git a/html/changelogs/Mechoid - Flashes.yml b/html/changelogs/Mechoid - Flashes.yml deleted file mode 100644 index 9a027fc83f0..00000000000 --- a/html/changelogs/Mechoid - Flashes.yml +++ /dev/null @@ -1,39 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Mechoid - -# 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: "Flashes now actually run the risk of burning out." - - tweak: "Flashes that burn out can be repaired after approximately 40 seconds and with some luck, via a screwdriver." - - tweak: "Cyborg flashes use charge only, and do not have the 10 flash limit. They instead begin burning large amounts of charge." - - tweak: "Flashes use miniscule charge in addition to their capacitor burn-out, totalling 12 uses, taking 4 to down a human. They can be charged within a standard charger." \ No newline at end of file diff --git a/html/changelogs/Mechoid - Gigaphone.yml b/html/changelogs/Mechoid - Gigaphone.yml deleted file mode 100644 index 4b4822f36f9..00000000000 --- a/html/changelogs/Mechoid - Gigaphone.yml +++ /dev/null @@ -1,7 +0,0 @@ - -author: Mechoid - -delete-after: True - -changes: - - rscadd: "Added the Gigaphone. Currently unused in any PoIs or elsewhere." diff --git a/html/changelogs/Mechoid - Leaky Pipes.yml b/html/changelogs/Mechoid - Leaky Pipes.yml deleted file mode 100644 index 62c477edb79..00000000000 --- a/html/changelogs/Mechoid - Leaky Pipes.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Mechoid - -# 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: "Pipes will now leak if their ends are unsealed." - - rscadd: "Pipe clamps now exist." diff --git a/html/changelogs/Mechoid - LingJacket.yml b/html/changelogs/Mechoid - LingJacket.yml deleted file mode 100644 index 5aef776f8e8..00000000000 --- a/html/changelogs/Mechoid - LingJacket.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Mechoid - -# 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: - - bugfix: "Oversight regarding Changeling revive not removing restraints fixed." - - tweak: "Straight Jackets can now be resisted out of in 8 minutes, or as low as 5 depending on species attacks. Shredding or hulked humans will break out in 20 seconds, destroying the jacket." diff --git a/html/changelogs/Mechoid - Medical Expansion.yml b/html/changelogs/Mechoid - Medical Expansion.yml new file mode 100644 index 00000000000..5d9b3b6aede --- /dev/null +++ b/html/changelogs/Mechoid - Medical Expansion.yml @@ -0,0 +1,59 @@ +################################ +# 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: Mechoid + +# 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: "Multiple new organs added. Humans and Skrell received spleens, all species expected to have a stomach and intestine organ have them." + - tweak: "Augment 'slots' organized." + - rscadd: "Multiple augments added, currently only available in the Traitor / Mercenary uplinks as easy-to-install implants." + - rscadd: "Anesthetic / Oxygen pumps added. A mobile stabilizer has been added. All three are available in Cargo." + - rscadd: "Medical MRE rations added to Cargo." + - tweak: "Roundstart implants now become invisible until being handled." + - rscadd: "Neural implant added to loadout, makes the brain of the user count as an assisted organ. Does not affect MMIs or their subtypes." + - rscadd: "Bioprinters now unlock more organs upon being upgraded, once they pass the anomalous tier, they unlock quite probably illegal organs." + - rscadd: "Three medical exosuit components have been added. Crisis and Hazmat response drones, and a mounted advanced medical analyzer." + - tweak: "Medical analyzers now detect on-skin reagents." + - rscadd: "Multiple new chemicals added, two used for upgrading bandage kits." + - rscadd: "Brute-based medical stacks can be upgraded." + - rscadd: "Crude brute kits can be made with cloth." + - tweak: "Stacks can now pass their colors onto objects produced by them. (Colored cloth, painted wood, etcetera.)" + - rscadd: "Two combined surgical tools added, for opening / closing ribcages and skulls, and removing organs respectively." + - rscadd: "Two dud implants added to the loadout. They do literally nothing but hurt you if you're EMP'd." + - experiment: "The larynx now controls the ability to speak. Damage to it will stop you from being able to speak anything but non-verbal languages." + - tweak: "Damage to the brain can now affect the pulse." + - tweak: "Only the critical blood level causes toxin damage, meaning individuals who die of standard oxygen loss from bloodloss can possibly be saved, but exsanguinated persons are unlikely." + - tweak: "Bioaugment.dm is now just augment.dm" + - tweak: "Robotic hearts do not have a pulse." + - tweak: "Brain damage can now cause loss of breath." + - tweak: "Paracetamol is now the precursor to tramadol." + - rscadd: "Calcium is now in the chemical vendor." diff --git a/html/changelogs/Mechoid - Surgical.yml b/html/changelogs/Mechoid - Surgical.yml deleted file mode 100644 index 844f31e035a..00000000000 --- a/html/changelogs/Mechoid - Surgical.yml +++ /dev/null @@ -1,7 +0,0 @@ - -author: Mechoid - -delete-after: True - -changes: - - rscadd: "Adds a new surgical procedure for fixing brute and burn on limbs." diff --git a/html/changelogs/Mechoid - Virtual and Alien Reality.yml b/html/changelogs/Mechoid - Virtual and Alien Reality.yml deleted file mode 100644 index c1149647b59..00000000000 --- a/html/changelogs/Mechoid - Virtual and Alien Reality.yml +++ /dev/null @@ -1,43 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Mechoid - -# 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: "Organs can now add or remove verbs." - - rscadd: "Organs now can have special effects on processing." - - tweak: "Xenomorph plasma vessels now regenerate phoron passively, at an incredibly slow rate. Can be accelerated by consuming liquid phoron." - - tweak: "Xenomorph organs now give their respective abilities when implanted." - - tweak: "Virtual Reality pods cleaned up." - - rscadd: "Alien Realiy pod added for PoIs or admins to use. Functions similarly to a VR pod, except it will produce a living body on the pod's turf." - - rscadd: "Three replicant species added for event and PoI use. They are shape-shifters each with different abilities due to their organs." - - rscadd: "Replicant organs added, versions of many organs that do not reject in their host. Two currently exist that give special passives." diff --git a/html/changelogs/Mechoid-DAXONS.yml b/html/changelogs/Mechoid-DAXONS.yml deleted file mode 100644 index c45fc543225..00000000000 --- a/html/changelogs/Mechoid-DAXONS.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Mechoid - -# 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: "Tweaked Respiro- Cordra- Gastiro- and Hepanephro- Daxons to be more effective with dealing with the side-effects of damaged organs." diff --git a/html/changelogs/Mechoid-Grippers.yml b/html/changelogs/Mechoid-Grippers.yml deleted file mode 100644 index 1b4c6f69b36..00000000000 --- a/html/changelogs/Mechoid-Grippers.yml +++ /dev/null @@ -1,13 +0,0 @@ - -author: Mechoid - -delete-after: True - - -changes: - - rscadd: "Research and Engineering borgs now have 'Circuit Grippers', used for constructing and operating integrated circuit machinery." - - tweak: "Grippers now allow interaction with their contents, by attacking the gripper itself with an item when one is held. I.E., drawing from a beaker with a syringe." - - tweak: "Grippers now show their held item's examine information when examined. Tab information added." - - tweak: "Cyborgs can now interact with integrated circuit printers and machines when adjacent to them." - - tweak: "Multitools now have a menu to switch modes between standard use and integrated circuit reference scanning. Antag multi-tools untouched for now." - - bugfix: "Integrated circuit printer now respects adjacency, if it is not set to debug." diff --git a/html/changelogs/Mechoid-PromBlud.yml b/html/changelogs/Mechoid-PromBlud.yml deleted file mode 100644 index e08778ff4d3..00000000000 --- a/html/changelogs/Mechoid-PromBlud.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Mechoid - -# 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: "Prometheans are no longer murdered by blood, and instead process it like a weak nutrient. Will slow the regeneration of toxins due to water content." diff --git a/html/changelogs/Mechoid-RSFs.yml b/html/changelogs/Mechoid-RSFs.yml deleted file mode 100644 index 72c7ac0b09a..00000000000 --- a/html/changelogs/Mechoid-RSFs.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Mechoid - -# 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: "Ctrl clicking a Rapid Service Fabricator when held will allow you to choose the container it deploys." - - bugfix: "The Rapid Service Fabricator's icon is correctly set." diff --git a/html/changelogs/Mechoid-Slimefix.yml b/html/changelogs/Mechoid-Slimefix.yml deleted file mode 100644 index 10bb77d5bc5..00000000000 --- a/html/changelogs/Mechoid-Slimefix.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Mechoid - -# 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: - - bugfix: "Slimes now respect slime colors as their faction when dealing with other slimes." diff --git a/html/changelogs/Mechoid-Tasers.yml b/html/changelogs/Mechoid-Tasers.yml deleted file mode 100644 index 422d2569e37..00000000000 --- a/html/changelogs/Mechoid-Tasers.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Mechoid - -# 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: "Security taser shot count dropped from 10 to 5." diff --git a/html/changelogs/Mewchild - PR - 5396.yml b/html/changelogs/Mewchild - PR - 5396.yml deleted file mode 100644 index 75998b87c92..00000000000 --- a/html/changelogs/Mewchild - PR - 5396.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Mewchild -delete-after: True -changes: - - rscadd: "Ports several AI core sprites from ages and places past" diff --git a/html/changelogs/Nalarac - Combat Mech Punch.yml b/html/changelogs/Nalarac - Combat Mech Punch.yml deleted file mode 100644 index 6df8be6917d..00000000000 --- a/html/changelogs/Nalarac - Combat Mech Punch.yml +++ /dev/null @@ -1,40 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Nalarac - -# 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: "Combat mechs can punch more things. Mech punch sounds like juggernaut now" - - tweak: "Simple mobs can attack more things." - - bugfix: "Cult pylons take damage from bullets." - - bugfix: "Click delay added on attacking simple doors and security barricades." - - tweak: "Material doors and barricades have different attacked sounds depending if its metal, wood, or resin." \ No newline at end of file diff --git a/html/changelogs/Neerti-AI.yml b/html/changelogs/Neerti-AI.yml deleted file mode 100644 index 9b9f13674d3..00000000000 --- a/html/changelogs/Neerti-AI.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Neerti - -# 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: - - experiment: "Rewrites the AI system for mobs. It should be more responsive and robust. Some mobs have special AIs which can do certain things like kiting, following you on a lark, or telling you to go away before shooting you." - - tweak: "Rewrites literally every 'simple_animal' mob into new, shinier, and hopefully more interesting 'simple_mob' mobs, some with new mechanics, like spiders, fake mechas, and hivebots. There are so many changes that it wouldn't be possible to list them here." diff --git a/html/changelogs/Neerti-RCDs.yml b/html/changelogs/Neerti-RCDs.yml deleted file mode 100644 index 04c57789742..00000000000 --- a/html/changelogs/Neerti-RCDs.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Neerti - -# 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: "RCDs can now build grilles and windows, with a new mode. They can also finish walls when used on girders on floor/wall mode." - - rscadd: "Adds various new RCDs that are not obtainable at the moment." diff --git a/html/changelogs/Neerti-Wind.yml b/html/changelogs/Neerti-Wind.yml deleted file mode 100644 index 928cbbbd0d4..00000000000 --- a/html/changelogs/Neerti-Wind.yml +++ /dev/null @@ -1,38 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Neerti - -# 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: "During severe weather such as storms and blizzards, wind can cause you to move slower or faster in specific directions." - - rscadd: "Weather application in the communicator displays wind direction and severity." - - rscdel: "Holding umbrellas while in a storm no longer stuns you." diff --git a/html/changelogs/Anewbe - Graves.yml b/html/changelogs/Poojawa - Sunesoundsntoggles.yml similarity index 90% rename from html/changelogs/Anewbe - Graves.yml rename to html/changelogs/Poojawa - Sunesoundsntoggles.yml index fd7b71a6808..ed329d766eb 100644 --- a/html/changelogs/Anewbe - Graves.yml +++ b/html/changelogs/Poojawa - Sunesoundsntoggles.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Anewbe +author: Poojawa # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,4 +33,5 @@ delete-after: True # 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: "Graves are now a thing in the code, will need some testing and probably more work before they get more common." \ No newline at end of file + - soundadd: "Added my fancy vore sounds." + - rscadd: "Porting of a few QoL Citadel changes to vore menu related to sounds." \ No newline at end of file diff --git a/html/changelogs/Anewbe - Gibberish.yml b/html/changelogs/Poojawa - devourfeedprefs.yml similarity index 90% rename from html/changelogs/Anewbe - Gibberish.yml rename to html/changelogs/Poojawa - devourfeedprefs.yml index b78f38761e0..5fe418cc80a 100644 --- a/html/changelogs/Anewbe - Gibberish.yml +++ b/html/changelogs/Poojawa - devourfeedprefs.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Anewbe +author: Poojawa # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,4 +33,5 @@ delete-after: True # 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: "Adds a Gibberish language that gets used when you goof on a language key." + - rscadd: "Applies Feeding and Devourable prefs." + - bugfix: "Made VoreUI toggles a lot more clear of what mode they're in." \ No newline at end of file diff --git a/html/changelogs/PrismaticGynoid - crashedescapepods.yml b/html/changelogs/PrismaticGynoid - crashedescapepods.yml deleted file mode 100644 index 18d4d3bce2a..00000000000 --- a/html/changelogs/PrismaticGynoid - crashedescapepods.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: PrismaticGynoid - -delete-after: True - -changes: - - rscadd: "Adds three new crashed escape pod PoIs." diff --git a/html/changelogs/PrismaticGynoid-somemorepaifixes.yml b/html/changelogs/PrismaticGynoid-somemorepaifixes.yml deleted file mode 100644 index 2173f3cc59e..00000000000 --- a/html/changelogs/PrismaticGynoid-somemorepaifixes.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: PrismaticGynoid - -delete-after: True - -changes: - - tweak: "pAIs can now be picked up while unfolded, and can display more than 9 emotions." diff --git a/html/changelogs/TheFurryFeline - Orange_Is_The_New_Orange_Part_2.yml b/html/changelogs/TheFurryFeline - Orange_Is_The_New_Orange_Part_2.yml new file mode 100644 index 00000000000..7d7067ad9da --- /dev/null +++ b/html/changelogs/TheFurryFeline - Orange_Is_The_New_Orange_Part_2.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: TheFurryFeline + +# 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: + - imageadd: "Add a new sprite for the orange jumpsuit." + - tweak: "Refactors prison jumpsuits into its own thing, change a few files and dmis." \ No newline at end of file diff --git a/html/changelogs/__CHANGELOG_README.txt b/html/changelogs/__CHANGELOG_README.txt new file mode 100644 index 00000000000..166e2bea8b6 --- /dev/null +++ b/html/changelogs/__CHANGELOG_README.txt @@ -0,0 +1,19 @@ +Changelogs are included with commits as text .yml files created individually by the committer. If you want to create a changelog entry you create a .yml file in the /changelogs directory; nothing else needs to be touched unless you are a maintainer. + +####################################################### + +TO MAKE A CHANGELOG .YML ENTRRY + +1. Make a copy of the file example.yml in html/changelogs and rename it to [YOUR USERNAME]-PR-[YOUR PR NUMBER].yml or [YOUR USERNAME]-[YOUR BRANCH NAME]. Only the username is strictly required, anything else is organizational and can be ignored if you so wish. + +2. Change the author to yourself + +3. Replace the changes text with a description of the changes in your PR, keep the double quotes to avoid errors (your changelog can be written ICly or OOCly, it doesn't matter) + +4. (Optional) set the change prefix (rscadd) to a different one listed above in example.yml (this affects what icon is used for your changelog entry) + +5. When commiting make sure your .yml file is included in the commit (it will usually be unticked as an unversioned file) + +####################################################### + +If you have trouble ask for help in #codershuttle on irc.sorcery.net or read https://tgstation13.org/wiki/Guide_to_Changelogs diff --git a/html/changelogs/arokha - ssao.yml b/html/changelogs/arokha - ssao.yml deleted file mode 100644 index 9dd89cfcef7..00000000000 --- a/html/changelogs/arokha - ssao.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Arokha - -# 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: "Added a 'fake SSAO' toggle to Global in character setup, ported from /tg/. Looks like drop shadows on everything." diff --git a/html/changelogs/ater - rig pressurecooker.yml b/html/changelogs/ater - rig pressurecooker.yml deleted file mode 100644 index 696de0487ca..00000000000 --- a/html/changelogs/ater - rig pressurecooker.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Atermonera -delete-after: True -changes - - bugfix: "Rigsuits have been resupplied following a mass-recall after a number of suits were reported to have defective pressure-sealant mechanisms. The new sealant mechanisms have been thoroughly tested and should be less prone to failure." \ No newline at end of file diff --git a/html/changelogs/ater - sinks.yml b/html/changelogs/ater - sinks.yml deleted file mode 100644 index 771921c7600..00000000000 --- a/html/changelogs/ater - sinks.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Atermonera -delete-after: True -changes - - bugfix: "Powersink drains have been unclogged and work once more" \ No newline at end of file diff --git a/html/changelogs/ater_botspeak.yml b/html/changelogs/ater_botspeak.yml deleted file mode 100644 index a5ef574c50e..00000000000 --- a/html/changelogs/ater_botspeak.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Atermonera -delete-after: True -changes: - - bugfix: "Robot sound files have been decrypted following a bizarre ransomware attack by Boiling Point remnants." diff --git a/html/changelogs/ater_stairs.yml b/html/changelogs/ater_stairs.yml deleted file mode 100644 index fd313ac717d..00000000000 --- a/html/changelogs/ater_stairs.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Atermonera -delete-after: True -changes - - bugfix: "Stairs have been straightened and now connect to both the heavens and hells, formerly just the hells." \ No newline at end of file diff --git a/html/changelogs/atermonera_suit_cooling.yml b/html/changelogs/atermonera_suit_cooling.yml deleted file mode 100644 index fce9429e6e2..00000000000 --- a/html/changelogs/atermonera_suit_cooling.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: atermonera -delete-after: True -changes: - - bugfix: "Suit coolers and rigsuit coolers now protect FBPs against vacuum again." \ No newline at end of file diff --git a/html/changelogs/chao-chainsawsinmyeyes.yml b/html/changelogs/chao-chainsawsinmyeyes.yml deleted file mode 100644 index be5cc127896..00000000000 --- a/html/changelogs/chao-chainsawsinmyeyes.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# 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: "Added some shading to the trashpile sprrites. diff --git a/html/changelogs/chaoko99-OHGODHIDEYOURHUSBANDS.yml b/html/changelogs/chaoko99-OHGODHIDEYOURHUSBANDS.yml deleted file mode 100644 index 95ddeb51e6e..00000000000 --- a/html/changelogs/chaoko99-OHGODHIDEYOURHUSBANDS.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# 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: "Prometheans can now wear underwear." diff --git a/html/changelogs/chaoko99-mapmergepy.yml b/html/changelogs/chaoko99-mapmergepy.yml deleted file mode 100644 index 32e38564aaf..00000000000 --- a/html/changelogs/chaoko99-mapmergepy.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# 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: "Added mapmerge PY to the \tools directory of the Vorestation repository." - diff --git a/html/changelogs/kartagrafi-NewHairAndUnderwear.yml b/html/changelogs/kartagrafi-NewHairAndUnderwear.yml deleted file mode 100644 index f28a41c04ba..00000000000 --- a/html/changelogs/kartagrafi-NewHairAndUnderwear.yml +++ /dev/null @@ -1,39 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: kartagrafi - -# 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 new hairstyle ''Sharp Ponytail''" - - rscadd: "Adds several new underwear - ''Binder'', ''Strapless Binder'', ''Longsleeve Striped Shirt, Pink'', ''Pink Wing Shirt'', ''Pink and Black T-Shirt'', ''Leggings''" - - tweak: "Changes name of ''Supernova'' hairstyle to ''Glossy'', and makes the sprite somewhat neater" - - bugfix: "Fixes a hairstyle not appearing" \ No newline at end of file diff --git a/html/changelogs/kartagrafi-nockrobes.yml b/html/changelogs/kartagrafi-nockrobes.yml deleted file mode 100644 index 3023f38a40c..00000000000 --- a/html/changelogs/kartagrafi-nockrobes.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: kartagrafi - -# 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 several clothing items to loadout such as: Nock masks, cowls and robes." \ No newline at end of file diff --git a/html/changelogs/mistyLuminescence - Sayverbs.yml b/html/changelogs/mistyLuminescence - Sayverbs.yml deleted file mode 100644 index dc54f0712d2..00000000000 --- a/html/changelogs/mistyLuminescence - Sayverbs.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Novacat - -# 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: "You can now select customised say-verbs in the IC tab. You know how when you use a question mark, you always 'ask' something? You don't have to "ask" any more, you can "query" instead, for example." \ No newline at end of file diff --git a/html/changelogs/mistyLuminescence - Serenity Unlocked.yml b/html/changelogs/mistyLuminescence - Serenity Unlocked.yml deleted file mode 100644 index 1bdc1068ce1..00000000000 --- a/html/changelogs/mistyLuminescence - Serenity Unlocked.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: mistyLuminescence - -# 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: "Allows construction of serenity in robotics." \ No newline at end of file diff --git a/html/changelogs/mistyLuminescence - tetherz.yml b/html/changelogs/mistyLuminescence - tetherz.yml deleted file mode 100644 index ced0cb0a54e..00000000000 --- a/html/changelogs/mistyLuminescence - tetherz.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: mistyLuminescence - -# 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: - - bugfix: "Fixes runtimes caused when attempting to use the crew monitor console outside of the main six Z-levels. (As a result, the AR-M can now detect people in the Underdark, if the person wearing it is also in the Underdark.)" - - bugfix: "Fixes GPS signals not showing up outside of the main six Z-levels." \ No newline at end of file diff --git a/html/changelogs/neerti-looping_sounds.yml b/html/changelogs/neerti-looping_sounds.yml deleted file mode 100644 index 214ec43678e..00000000000 --- a/html/changelogs/neerti-looping_sounds.yml +++ /dev/null @@ -1,38 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Neerti - -# 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: - - soundadd: "Adds a lot of sounds, and the code to let them loop seemlessly. Things made audible now include the microwave, deep fryer, showers, the supermatter when it's active, the TEGs when active, geiger counters, and severe weather on Sif. The weather has different sounds for when indoors and when outdoors." - - tweak: "The weather sounds, and the supermatter hum can be disabled in your preferences." - - rscadd: "Adds a few more weather types that can only be activated by admin powers, such as ash storms and fallout." diff --git a/html/changelogs/Novacat-PR-5779.yml b/html/changelogs/novacat - teshariplush.yml similarity index 95% rename from html/changelogs/Novacat-PR-5779.yml rename to html/changelogs/novacat - teshariplush.yml index e4cc233b543..2e55ba5a83d 100644 --- a/html/changelogs/Novacat-PR-5779.yml +++ b/html/changelogs/novacat - teshariplush.yml @@ -33,4 +33,4 @@ delete-after: True # 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: "All emergency tanks now spawn at full capacity." + - rscadd: "Adds a teshari plush." \ No newline at end of file diff --git a/html/changelogs/Anewbe - Bugspeak.yml b/html/changelogs/woodrat - Barkitchenmerge.yml similarity index 92% rename from html/changelogs/Anewbe - Bugspeak.yml rename to html/changelogs/woodrat - Barkitchenmerge.yml index 4df4990bdf9..f5d874bff59 100644 --- a/html/changelogs/Anewbe - Bugspeak.yml +++ b/html/changelogs/woodrat - Barkitchenmerge.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Anewbe +author: Woodrat # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,4 +33,4 @@ delete-after: True # 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: - - bugfix: "Vedahq is now properly locked behind a whitelist." + - maptweak: "Rework of the civilian wing, merging the kitchen and the bar into one area." diff --git a/html/changelogs/Woodrat - XenoMove.yml b/html/changelogs/woodrat - mapbugfixes.yml similarity index 87% rename from html/changelogs/Woodrat - XenoMove.yml rename to html/changelogs/woodrat - mapbugfixes.yml index 1173591076c..1a27913216d 100644 --- a/html/changelogs/Woodrat - XenoMove.yml +++ b/html/changelogs/woodrat - mapbugfixes.yml @@ -33,5 +33,7 @@ delete-after: True # 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: "Xenoflora and Xenobio Addition to station, first deck." - - bugfix: "Minor bugfixes including mislabeled lockers in robotics and floor decals." + - maptweak: "Minor movement of the mining vendor." + - maptweak: "Adjustment of the kitchen and bar." + - bugfix: "Area in the coffee shop." + - bugfix: "Missing Ducky in the codelab." \ No newline at end of file diff --git a/html/changelogs/Anewbe - Emitters.yml b/html/changelogs/woodrat - mobsizeport.yml similarity index 89% rename from html/changelogs/Anewbe - Emitters.yml rename to html/changelogs/woodrat - mobsizeport.yml index 1400604d073..47acc87c408 100644 --- a/html/changelogs/Anewbe - Emitters.yml +++ b/html/changelogs/woodrat - mobsizeport.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Anewbe +author: Woodrat # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,4 +33,5 @@ delete-after: True # 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: "Emitters can be locked while off, too." + - rscdel: "Removed the old size modifier traits for mobs." + - rscadd: "Port and tweak of the size modifiers from World Server for mobs." \ No newline at end of file diff --git a/html/changelogs/zaddat.yml b/html/changelogs/zaddat.yml deleted file mode 100644 index 667854662e5..00000000000 --- a/html/changelogs/zaddat.yml +++ /dev/null @@ -1,41 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Elgeonmb - -# 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: "Added the Zaddat species, voidsuit-clad fragile bug people. Whitelist applications will be available at a later date." - - rscadd: "Added glucose hypos to the SWEATMAX vendors and a few other places thoughout the station." - - rscadd: "Zaddat equipment is now available through cargo." - - rscadd: "Some new, very very chuuni accessories to play with; the half cape, the full cape, and the sash" - - tweak: "Most accessories can now fit on suits." - - rscdel: "Dionaea and vox can no longer use station rigs." diff --git a/html/create_object.html b/html/create_object.html index f4e0aa8644c..7ed93d98180 100644 --- a/html/create_object.html +++ b/html/create_object.html @@ -26,6 +26,7 @@
      + Type
      Offset: @@ -35,7 +36,7 @@ Number: Dir: - Name:
      + Name:
      Where:

      -
      + Number of matches:
      +

      + +
      + +
      + +